// $Id: zorn_addons.js,v 1.9 2009/03/26 21:26:05 preston Exp $

DDObj.prototype.myPrevX = 0; // @see snapBack()
DDObj.prototype.myPrevY = 0; // @see snapBack()

function my_DropFunc()
{
    if (null == dd.obj)  {  return;  }
    var file = getPositionFile(dd.obj);
    var rank = getPositionRank(dd.obj);
    var piece = dd.obj.myPiece;
    
    if ((-1 == file) || (-1 == rank) || !piece ||
        ((file == piece.file) && (rank == piece.rank)))
    {
        snapBack();
        return;
    }
    
    if (piece.isLegalMove(file, rank))
    {
        var oldFile = piece.file;
        var oldRank = piece.rank;
        setPositionFR(dd.obj, file, rank);
        var capture = piece.setMove(file, rank);
        if (capture)
        {
            capture.element.hide();
        }
        var lastChar = "";
        if (((0 == rank) || (7 == rank)) && (piece instanceof Pawn))
        {
            lastChar = promptPromote(file, rank);
            setPromotion(piece, lastChar);
            piece = getPiece(file, rank);
        }
        postMove(piece.file, piece.rank, oldFile, oldRank, lastChar);
        return;
    }
    if (piece instanceof Pawn)
    {
        var passedPawn = piece.isEnPassant(file, rank);
        if (passedPawn)
        {
            var oldFile = piece.file;
            var oldRank = piece.rank;
            setPositionFR(dd.obj, file, rank);
            piece.setMove(file, rank);
            passedPawn.element.hide();
            postMove(piece.file, piece.rank, oldFile, oldRank, "");
            return;
        }
    }
    else if (piece instanceof King)
    {
        var castledRook = piece.isLegalCastle(file, rank);
        if (castledRook)
        {
            var oldFile = piece.file;
            var oldRank = piece.rank;
            setPositionFR(dd.obj, file, rank);
            piece.setMove(file, rank);

            var rookFile = (2 == file) ? 3 : 5;
            setPositionFR(castledRook.element, rookFile, rank);
            castledRook.setMove(rookFile, rank);

            postMove(piece.file, piece.rank, oldFile, oldRank, "");
            return;
        }
    }

    snapBack();
    return;
} // my_DropFunc

function snapBack()
{
    dd.obj.moveTo(dd.obj.myPrevX, dd.obj.myPrevY);
    return;
} // snapBack


function my_PickFunc()
{
    // non-draggable's are not my pieces
    if (null != dd.obj)
    {
        dd.obj.myPrevX = dd.obj.x; // @see snapBack()
        dd.obj.myPrevY = dd.obj.y; // @see snapBack()
    }
    return;
} // my_PickFunc

var promptPromoteArray = ["Queen?", "Knight?", "Rook?", "Bishop?"];
function promptPromote(file, rank)
{
    var msg = "Promote Pawn at  " +
              convertIndexToFile[file] + (rank+1) + "  to ";
    var k = 3; // start at bishop -> loops to queen
    var ok = false;
    do
    {
        k = (k + 1) % 4;
        ok = window.confirm(msg + promptPromoteArray[k]);
    } while (!ok);
    k = (promptPromoteArray[k].charAt(0).toLowerCase());
    return (k != "k") ? k : "n";
} // promptPromote

function setBoardPieces()
{
    // set board up
    var a = 0;
    var b = 1;
    var c = 2;
    var d = 3;
    var e = 4;
    var f = 5;
    var g = 6;
    var h = 7;

    var wK = createKing(dd.elements.ewk, e, 0, true, null);
    dd.elements.awr.myPiece = new Rook(dd.elements.awr, a, 0, true, wK);
    dd.elements.bwn.myPiece = new Knight(dd.elements.bwn, b, 0, true, wK);
    dd.elements.cwb.myPiece = new Bishop(dd.elements.cwb, c, 0, true, wK)
    dd.elements.dwq.myPiece = new Queen(dd.elements.dwq, d, 0, true, wK)
    dd.elements.ewk.myPiece = wK;
    dd.elements.fwb.myPiece = new Bishop(dd.elements.fwb, f, 0, true, wK)
    dd.elements.gwn.myPiece = new Knight(dd.elements.gwn, g, 0, true, wK)
    dd.elements.hwr.myPiece = new Rook(dd.elements.hwr, h, 0, true, wK)

    dd.elements.awp.myPiece = new Pawn(dd.elements.awp, a, 1, true, wK);
    dd.elements.bwp.myPiece = new Pawn(dd.elements.bwp, b, 1, true, wK);
    dd.elements.cwp.myPiece = new Pawn(dd.elements.cwp, c, 1, true, wK);
    dd.elements.dwp.myPiece = new Pawn(dd.elements.dwp, d, 1, true, wK);
    dd.elements.ewp.myPiece = new Pawn(dd.elements.ewp, e, 1, true, wK);
    dd.elements.fwp.myPiece = new Pawn(dd.elements.fwp, f, 1, true, wK);
    dd.elements.gwp.myPiece = new Pawn(dd.elements.gwp, g, 1, true, wK);
    dd.elements.hwp.myPiece = new Pawn(dd.elements.hwp, h, 1, true, wK);

    var bK = createKing(dd.elements.ebk, e, 7, false, null);
    dd.elements.abr.myPiece = new Rook(dd.elements.abr, a, 7, false, bK);
    dd.elements.bbn.myPiece = new Knight(dd.elements.bbn, b, 7, false, bK);
    dd.elements.cbb.myPiece = new Bishop(dd.elements.cbb, c, 7, false, bK);
    dd.elements.dbq.myPiece = new Queen(dd.elements.dbq, d, 7, false, bK);
    dd.elements.ebk.myPiece = bK;
    dd.elements.fbb.myPiece = new Bishop(dd.elements.fbb, f, 7, false, bK);
    dd.elements.gbn.myPiece = new Knight(dd.elements.gbn, g, 7, false, bK);
    dd.elements.hbr.myPiece = new Rook(dd.elements.hbr, h, 7, false, bK);

    dd.elements.abp.myPiece = new Pawn(dd.elements.abp, a, 6, false, bK);
    dd.elements.bbp.myPiece = new Pawn(dd.elements.bbp, b, 6, false, bK);
    dd.elements.cbp.myPiece = new Pawn(dd.elements.cbp, c, 6, false, bK);
    dd.elements.dbp.myPiece = new Pawn(dd.elements.dbp, d, 6, false, bK);
    dd.elements.ebp.myPiece = new Pawn(dd.elements.ebp, e, 6, false, bK);
    dd.elements.fbp.myPiece = new Pawn(dd.elements.fbp, f, 6, false, bK);
    dd.elements.gbp.myPiece = new Pawn(dd.elements.gbp, g, 6, false, bK);
    dd.elements.hbp.myPiece = new Pawn(dd.elements.hbp, h, 6, false, bK);
} // setBoardPieces

function setTotalPosition(zornImage, file, rank)
{
    zornImage.myPiece.reset(file, rank)
    setPositionFR(zornImage, file, rank);
    zornImage.show();
    return;
} // setTotalPosition

function resetBoardPieces()
{
    var a = convertFileToIndex("a");
    var b = convertFileToIndex("b");
    var c = convertFileToIndex("c");
    var d = convertFileToIndex("d");
    var e = convertFileToIndex("e");
    var f = convertFileToIndex("f");
    var g = convertFileToIndex("g");
    var h = convertFileToIndex("h");
    setTotalPosition(dd.elements.awr, a, 0);
    setTotalPosition(dd.elements.bwn, b, 0);
    setTotalPosition(dd.elements.cwb, c, 0);
    setTotalPosition(dd.elements.dwq, d, 0);
    setTotalPosition(dd.elements.ewk, e, 0);
    setTotalPosition(dd.elements.fwb, f, 0);
    setTotalPosition(dd.elements.gwn, g, 0);
    setTotalPosition(dd.elements.hwr, h, 0);

    setTotalPosition(dd.elements.awp, a, 1);
    setTotalPosition(dd.elements.bwp, b, 1);
    setTotalPosition(dd.elements.cwp, c, 1);
    setTotalPosition(dd.elements.dwp, d, 1);
    setTotalPosition(dd.elements.ewp, e, 1);
    setTotalPosition(dd.elements.fwp, f, 1);
    setTotalPosition(dd.elements.gwp, g, 1);
    setTotalPosition(dd.elements.hwp, h, 1);

    setTotalPosition(dd.elements.abr, a, 7);
    setTotalPosition(dd.elements.bbn, b, 7);
    setTotalPosition(dd.elements.cbb, c, 7);
    setTotalPosition(dd.elements.dbq, d, 7);
    setTotalPosition(dd.elements.ebk, e, 7);
    setTotalPosition(dd.elements.fbb, f, 7);
    setTotalPosition(dd.elements.gbn, g, 7);
    setTotalPosition(dd.elements.hbr, h, 7);

    setTotalPosition(dd.elements.abp, a, 6);
    setTotalPosition(dd.elements.bbp, b, 6);
    setTotalPosition(dd.elements.cbp, c, 6);
    setTotalPosition(dd.elements.dbp, d, 6);
    setTotalPosition(dd.elements.ebp, e, 6);
    setTotalPosition(dd.elements.fbp, f, 6);
    setTotalPosition(dd.elements.gbp, g, 6);
    setTotalPosition(dd.elements.hbp, h, 6);
} // resetBoardPieces

/**
 * @param draggableFlag
 */
function enableBlackPlayer(draggableFlag)
{
    dd.elements.abr.setDraggable(draggableFlag);
    dd.elements.bbn.setDraggable(draggableFlag);
    dd.elements.cbb.setDraggable(draggableFlag);
    dd.elements.dbq.setDraggable(draggableFlag);
    dd.elements.ebk.setDraggable(draggableFlag);
    dd.elements.fbb.setDraggable(draggableFlag);
    dd.elements.gbn.setDraggable(draggableFlag);
    dd.elements.hbr.setDraggable(draggableFlag);

    dd.elements.abp.setDraggable(draggableFlag);
    dd.elements.bbp.setDraggable(draggableFlag);
    dd.elements.cbp.setDraggable(draggableFlag);
    dd.elements.dbp.setDraggable(draggableFlag);
    dd.elements.ebp.setDraggable(draggableFlag);
    dd.elements.fbp.setDraggable(draggableFlag);
    dd.elements.gbp.setDraggable(draggableFlag);
    dd.elements.hbp.setDraggable(draggableFlag);
} // enableBlackPlayer

function enableWhitePlayer(draggableFlag)
{
    dd.elements.awr.setDraggable(draggableFlag);
    dd.elements.bwn.setDraggable(draggableFlag);
    dd.elements.cwb.setDraggable(draggableFlag);
    dd.elements.dwq.setDraggable(draggableFlag);
    dd.elements.ewk.setDraggable(draggableFlag);
    dd.elements.fwb.setDraggable(draggableFlag);
    dd.elements.gwn.setDraggable(draggableFlag);
    dd.elements.hwr.setDraggable(draggableFlag);

    dd.elements.awp.setDraggable(draggableFlag);
    dd.elements.bwp.setDraggable(draggableFlag);
    dd.elements.cwp.setDraggable(draggableFlag);
    dd.elements.dwp.setDraggable(draggableFlag);
    dd.elements.ewp.setDraggable(draggableFlag);
    dd.elements.fwp.setDraggable(draggableFlag);
    dd.elements.gwp.setDraggable(draggableFlag);
    dd.elements.hwp.setDraggable(draggableFlag);
} // enableWhitePlayer

/*
function my_DragFunc()
{
}

function my_ResizeFunc()
{
}
*/

