
// глобальная переменная, с помощью которой запускается по таймеру проверка статуса партии
var interval;

// глобальная переменная, с помощью которой запускается по таймеру проверяка пошел ли противник
var intervalGetMove;

// глобальная переменная в которой содержится цвет игрока, который сейчас должен ходить
var playerMove;

// глобальная переменная в котрой содержится цвет игрока
var playerColor;

// глобальная пременная в которой содрежрится номер хода, который сечас будет сделан
// Например, как только партия началась (т.е. подключился второй игро) и еще не было сделано ни одного хода - то значение 
// этой переменной будет 1
var moveNumber;

// глобальная переменная код партии
var gameCode;

// глобальная переменная урл сайта
var siteUrl;

// глобальная переменная, куда сохраняю ход, в случае, если должно быть превращение
var promotionMove;

// глобальная переменная, куда сохраняю время таймера обратного отсчета
var countdownTimer=5;

// глобальная переменая, в ней храню setInterval чтобы можно было его остановить
var myInterval;

document.onkeyup = KeyCheck;       

function KeyCheck(e)

{
    var KeyID = (window.event) ? event.keyCode : e.keyCode;

    switch(KeyID)
    {
        // esc
        case 27:
        if ( myInterval )
        {
            // В том случае, если сейчас бежит таймер для отправки запроса
            // то останавливаю его
            window.location.reload();
        }
        break; 
    }
}

// Процедура возвращает стастус партии
function checkGameStatus() {

    var scripturl = siteUrl + '/cgi-bin/gamestarted.pl';
    var pars = 'code=' + gameCode + '&dummy=' + new Date().getTime();
        
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get', 
            parameters: pars, 
            onComplete: showResponse
        });

}

// Действия при получении ответа от сервера (скрипт gamestarted.pl)
// т.е. действия, которые выполняются на доске белых при подключении черных
function showResponse(originalRequest) {
    var gameStatus = originalRequest.responseText;
    gameStatus = gameStatus.substring(0,1);

    //Ждем пока партия не началась
    if ( gameStatus == 'c' ) {
        //Останавливаю таймер, так как он больше не нужен
        window.clearInterval(interval);

        //Скрываю текст
        $('desc').style.display = 'none';

        //Отображаю поле
        $('field').style.display = 'inline';

        //Отображаю список ходов
        $('moves').style.display = '';
        $('show-hide-moves').style.display = '';

        PrepareMoves();

        //Отображаем сообщение, что черные подключились
        $('message').update( 'Ваш ход.' );

        //Изменяем заголовок страницы
        document.title="Ваш ход — chess.bessarabov.ru";

        //Первый ход в партии делают белые
        playerMove = 'w';
        playerColor = 'w';
        moveNumber = 1;
    }
}



// Процедура по таймеру проверяет не началась ли партия
function startCheckingGame () {

    interval = window.setInterval( "checkGameStatus( '" + siteUrl + "', '" + gameCode + "' )", 2000 );

}

// Процедура получает ход пользователя, в случае необходимости запускает таймер
// обртного отсчета и отправляет таки ход на сервер
function sendMoveInfo (move) {
    if (cookies["SettingUndo"] == "yes" ) {
        $('message').update( 'Отправка хода на сервер. <a href="">Отмена (' + countdownTimer + ')</a>');
        myInterval = window.setInterval("ctimer('" + move + "')", 1000);
    } else {
        sendMoveInfoFire (move);
    }
}

// Процедура которая запускается по таймеру, она проверет не досчитали ли мы до нужного числа
// и если досчитали - запускает отправку хода на move.pl, а так же останавливает работу таймера
function ctimer(move) {
    if (countdownTimer == 1) {
        window.clearInterval(myInterval);
        sendMoveInfoFire (move);
    } else {
        countdownTimer--;
        $('message').update( 'Отправка хода на сервер. <a href="">Отмена (' + countdownTimer + ')</a>');
    }
}

// Процедура отправляет на move.pl ход игрока
function sendMoveInfoFire (move) {
    writeDebug("start sendMoveInfoFire");
    // Процедура получает параметр move
    // Параметр типа e2e4♙ либо e2e4♙K
    // Т.е. начальная позиция фигуры (e2), конечная позиция (e4),
    // фигура которая ходит (♙) и, опционоально, фигура в которую хочет превратится

    // Если станартный ход, т.е. нет превращения, то тодгде ход вида e2e4♙
    if ( move.length == 5 ) {
        // В том случае, если белые ставят пешку на 8-ую линию (либо черные на 1-ую), тогда нужно позволить выбрать фигуру
        if ( 
             ( ( move.substr(3,1) == 8 ) && ( playerColor == "w" ) && ( move.substr(4.1) == "♙") )  ||
             ( ( move.substr(3,1) == 1 ) && ( playerColor == "b" ) && ( move.substr(4.1) == "♟") )  
            ) {
            promotionMove = move;
            showPromotion();
        } else {
            // Если же превращения нет, тогда отправлю запрос на сервер
            $('message').update( 'Отправка хода на сервер.' );
            var scripturl = siteUrl + '/cgi-bin/move.pl';
            var pars = 'code=' + gameCode + '&move=' + move.substr(0,4);

            var myAjax = new Ajax.Request(
                scripturl, {
                    method: 'get',
                    parameters: pars,
                    onComplete: showResponseMoveInfo
                });
        }
    } 

    // Если же ход с указанием фигуры, в которую пешха хочет прератится, то тогда отправляю эти данные на сервер
    if ( move.length == 6 ) {
        $('message').update( 'Отправка хода на сервер.' );
        var scripturl = siteUrl + '/cgi-bin/move.pl';
        var pars = 'code=' + gameCode + '&move=' + move.substr(0,4) + move.substr(5.1) + '&dummy=' + new Date().getTime();;

        var myAjax = new Ajax.Request(
            scripturl, {
                method: 'get',
                parameters: pars,
                onComplete: showResponseMoveInfo
            });

    }
}

// Действие при получении ответа от move.pl
function showResponseMoveInfo(originalRequest) {
    var moveStatus = originalRequest.responseText;

    // В том случае, если move.pl вернул 1, что означает, что это нормальный ход
    if (moveStatus != 0) {
        // Увеличивую номер хода
        moveNumber++;

        // Запускаю таймер для обращения к getmove.pl
        startCheckingGetMove (moveNumber);
    }

    // Перерисовываю доску
    redrawField();
    
}


// Ajax обращаение к getmove.pl
function askOnGetMove(mnumber ) {

    var scripturl = siteUrl + '/cgi-bin/getmove.pl';
    var pars = 'code=' + gameCode + '&move_number=' + mnumber + '&dummy=' + new Date().getTime();;

    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: answerOnGetMove
        });

}

// Действие при получении ответа от getmove.pl
function answerOnGetMove(originalRequest) {
    var scriptAnswer = originalRequest.responseText;

    if (scriptAnswer != 0) {
        //Останавливаю таймер, так как он больше не нужен
        window.clearInterval(intervalGetMove);

        // Перерисовываю поле
        redrawField();

        // Увеличивую номер хода
        moveNumber++;
    }

}

// Процедура по таймеру проверяет не пошел ли противник
function startCheckingGetMove ( mnumber ) {

    intervalGetMove = window.setInterval( "askOnGetMove( '" + mnumber + "' )", 2000 );

}

// Процедура перерисовые поле
function redrawField() {
    window.location.reload()
}


// Процедура отображает див с выбором фигуры для превращения
function showPromotion() {
    $('promotion_form').style.display = 'block';
}

// Процедура скрывает див с выбором фигуры для превращения
function hidePromotion() {
    $('promotion_form').style.display = 'none';
}

// Процедура, которая вызывается, при клике на фигуре для выбора фигуры для превращения
function promotionChoose(piece) {
    var tmpMove = promotionMove + piece;
    sendMoveInfo(tmpMove);
}



// js код для изчезающего-появляющегося поля с ходами - START
var field;
var moves;
var show;
var icon;
//ячейка последнего хода в списке ходов
var last;
//последний ход в формате e2e4
var lastMove;
var cookies = [];
var minWidth = 800;

function PrepareMoves()
{
//    document.cookie = "IsMovesShown=yes";
    ParseCookie();
    InitGlobalVars();
    CheckWindowWidth(minWidth);
    SetTopHeight();
    ScrollMoves();
 //   alert(cookies["IsMovesShown"]);
}

function ParseCookie()
{
    var rawCookies = document.cookie.split(/; /g);
    for(var i=0; i < rawCookies.length; i++)
    {
        var cookie = rawCookies[i];
        if(cookie.indexOf("=") == -1) continue;
        cookies[cookie.substring(0, cookie.indexOf("="))] = cookie.substring(cookie.indexOf("=") + 1);
    }
}

function InitGlobalVars()
{
    field = gid("field-table");
    moves = gid("moves");
    show = gid("show-hide-moves");
    icon = gid("show-hide-moves-icon");
    last = gid("last-move-in-moves");
    lastMove = lastMove.replace(/^\s+|\s+$/g,"");
}

/*function CheckWindowWidth(minWidth)
{
    if(GetWindowSize().width > minWidth)
    {
        if((cookies["IsMovesShown"] == "yes") && (moves.style.visibility == "hidden")) moves.style.visibility = "";
    }
    else
    {
        if(moves.style.visibility != "hidden") moves.style.visibility = "hidden";
    }
}
*/

function CheckWindowWidth(minWidth)
{

    if (cookies["IsMovesShown"] == "yes") 
    {
        moves.style.visibility = "";
//        icon.setAttribute("src", "/img/right.gif");
    }
    else
    {
        moves.style.visibility = "hidden";
//        icon.setAttribute("src", "/img/left.gif");
    }

}


function SetTopHeight()
{
    var fieldTop = getTop(field);
    with(moves.style)
    {
        top = fieldTop + "px";
        height = (field.offsetHeight - 2) + "px";
    }
    with(show.style)
    {
        top = fieldTop + "px";
        height = field.offsetHeight + "px";
    }
}

function MovesControlMouseOver()
{
    show.style.backgroundColor = "#CCCCFF";
    show.style.cursor = "pointer";
    if(cookies["IsMovesShown"] == "yes")
    {
        icon.setAttribute("src", "/img/right.gif");
    }
    else
    {
        icon.setAttribute("src", "/img/left.gif");
    }
}

function MovesControlMouseOut()
{
    show.style.backgroundColor = "#FEFEFF";
    show.style.cursor = "";
    if(cookies["IsMovesShown"] == "yes")
    {
        icon.setAttribute("src", "/img/right-inactive.gif");
    }
    else
    {
        icon.setAttribute("src", "/img/left-inactive.gif");
    }
}

function ShowHideMoves()
{
    if(cookies["IsMovesShown"] == "yes")
    {
        moves.style.visibility = "hidden";
        icon.setAttribute("src", "/img/left.gif");
    }
    else
    {
        moves.style.visibility = "";
        icon.setAttribute("src", "/img/right.gif");
    }
    document.cookie = "IsMovesShown=" + (cookies["IsMovesShown"] == "yes" ? "no" : "yes");
    ParseCookie();
}

function ScrollMoves()
{
    moves.scrollTop = moves.scrollHeight;
}

function LastMoveMouseOver()
{
    if(lastMove.length == 4)
    {
        var startEl = gid("square-" + lastMove.substring(0,2));
        var endEl = gid("square-" + lastMove.substring(2,4));
        startEl.style.backgroundColor = "#444466";
        endEl.style.backgroundColor = "#444466";
    }
    last.style.backgroundColor = "#444466";
}

function LastMoveMouseOut()
{
    if(lastMove.length == 4)
    {
        var startEl = gid("square-" + lastMove.substring(0,2));
        var endEl = gid("square-" + lastMove.substring(2,4));
        startEl.style.backgroundColor = "";
        endEl.style.backgroundColor = "";
    }
    last.style.backgroundColor = "";
}

function GetWindowSize()
{
    var myWidth = 0, myHeight = 0;
    if( typeof( window.innerWidth ) == 'number' )
    {
        //Non-IE
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
    }
    else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
    {
        //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth;
        myHeight = document.documentElement.clientHeight;
    }
    else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
    {
        //IE 4 compatible
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
    }
    return {width:myWidth, height:myHeight};
}

function getLeft(obj)
{
    if ('string' == typeof obj) obj = document.getElementById(obj);
    var x = 0;
    while (obj != null)
    {
        x += obj.offsetLeft;
        obj = obj.offsetParent;
    }
    return x;
}

function getTop(obj)
{
    if ('string' == typeof obj) obj = document.getElementById(obj);
    var y = 0;
    while (obj != null)
    {
        y += obj.offsetTop;
        obj = obj.offsetParent;
    }
    return y;
}

function gid(id)
{
    return document.getElementById(id);
}
// js код для изчезающего-появляющегося поля с ходами - END

// отображение/скрытие div с настройками
function ShowHideSettings()
{
    if(cookies["IsSettingsShown"] == "yes")
    {
        document.getElementById('settingsBox').style.display = 'none';
    }
    else
    {
        document.getElementById('settingsBox').style.display = 'inline';
    }
    document.cookie = "IsSettingsShown=" + (cookies["IsSettingsShown"] == "yes" ? "no" : "yes");
    ParseCookie();
}

// выставляет значение cookie в соответствие с настройкой пользователя
function changeSettingUndo()
{
    document.cookie = "SettingUndo=" + (document.getElementById('settingUndo').checked  == "" ? "no" : "yes");
    ParseCookie();
}

function writeDebug(text) {
    if (document.getElementById("debug")) {
        var dbgObj = document.getElementById("debug");
        dbgObj.innerHTML = dbgObj.innerHTML + text + "<br/>";
    }
}

