// Глобальные переменные

// Тут хранится id задачи, с которой сейчас выполняются действия
var globalTaskID;

// Дата завтра в формате YYYY-MM-DD
var d_next;

// глобальная переменная, в которой храню, открыто ли сейчас окно ввода задачи 
var addTaskOpen=0; 

// глобальная переменная, в которой храню, открыто ли сейчас окно редактирования задачи
// в переменной хранится id задачи
var editTaskOpen=0; 

// глобальная переменная, в которой храню, открыто ли сейчас окно перемещения задачи
var moveTaskOpen=0; 
    
// По этому флагу смотрю, нахожусь ли я в форме для ввода textarea или input
// если 1 - то нахожусь
// если 0 - то не нахожусь
var flagFocus=0;

document.onkeyup = KeyCheck;       

function KeyCheck(e)

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

    switch(KeyID)
    {
        // t
        case 84:
        if (flagFocus==0) {
            top.location.href="/";
        }
        break; 
        
        // a
        case 65:
        if (flagFocus==0) {
            addTask();
        }
        break;
        
        // esc
        case 27:
        if ( addTaskOpen == 1 )
        {
            flagFocus=0;
            closeAddTask ();
        } else if ( editTaskOpen != 0 ){
            editTaskCancel(editTaskOpen);
        } else if ( moveTaskOpen == 1) {
            closeMoveTask () ;
        }
        break; 
    }
}

// Получение координат мыши
var mouseX;
var mouseY;
function getcords(e){
    mouseX = Event.pointerX(e);
    mouseY = Event.pointerY(e);
}
Event.observe(document, 'mousemove', getcords);

function showNav(navID)
{
    var element = document.getElementById(navID);
    element.className = 'control_visible';
}

function hideNav(navID)
{
    var element = document.getElementById(navID);
    element.className = 'control_hidden';
}

function doneTask(taskID)
{
    var scripturl = '/cgi-bin/ajax_done.pl';
    var pars = 'id=' + taskID + '&dummy=' + new Date().getTime();

    // получаю текст задачи
    var text = $("t" + taskID).innerHTML;

    text = text.replace(/<a href=\".*">/, '');
    text = text.replace(/<\/a>/, '');

    clearInfoContent();
    document.getElementById('info_loader').style.display  = "inline";
    
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, fTaskID, fTaskText){
                            answerDoneTask(transport, taskID, text) 
                        }
        });
}

function answerDoneTask(originalRequest, taskID, text) {
    var scriptAnswer = originalRequest.responseText;

    if (scriptAnswer == 1) {
        // Тут несколько сложная логика
        // Если задача current, то убираю только содержимое одного td
        // Если же задача ordinary, то удаляю целый ряд
        // Так пришлось сделать, чтобы не изчезал блок с текущим временем

        if ($("t" + taskID).className == "current") {
            var td3 = $("t" + taskID).parentNode;

            var td2 = td3.parentNode.childNodes.item(3);

            // Очишаю элемент с чекбоксом
            td2.innerHTML = null;
            td2.className = null;

            // Очишаю элемент с текстом задачи и контролами
            td3.innerHTML = null;
            td3.className = null;
            td3.setAttribute("onmouseover","");
            td3.setAttribute("onmouseout","");

        } else {
            deleteRow(taskID);
        }

        // В том случае, если нахожусь в сегодня, то нужно добавлять задачу
        // в список сделанных
        if (curday==d) {
            addDoneRow(taskID, text);
        }

        setInfoContent("Задача решена");

    } else {
        setInfoErrorContent("При решении задачи все сломалось =(");
    }
    document.getElementById('info_loader').style.display  = "none";
}

// Функция добавляет ряд в блоке done
function addDoneRow(taskID, text) {
    // Определяю позицию последнего done 
    // (буду добавлять задачу после этой строки)
    // Делаю это следующим образом - перебираю все tr в таблице
    // и смотрю на его класс
    
    // В этой переменной подсчитаю, сколько задач сделано
    // Полученое число - это как раз позиция на которую нужно вставлять строку
    var countDoneTasks=0;

    var rows = document.getElementById("main").rows;

    for (var i=0; i<rows.length; i++) {
        var row = rows[i];

        // Выясняю статус в котором находится задача
        var taskStatus = row.className;

        if (taskStatus == "done") {
            countDoneTasks++;
        }
    }

    // Добавляю задачу после последего сделаного дела
    var addedRow = document.getElementById("main").insertRow(countDoneTasks);
    addedRow.setAttribute("class","done"); 

    var td1 = addedRow.insertCell(0);

    var space1 = document.createTextNode(" ");
    addedRow.appendChild(space1); 

    var td2 = addedRow.insertCell(1);
    td2.innerHTML="&#10003;";
    td2.setAttribute("class","mid_done"); 

    var td3 = addedRow.insertCell(2);
    
    var tmpHTML;

    tmpHTML  = "<span class='done' id='t" + taskID + "'>" + text + "</span> ";
    tmpHTML += "<span class='control_hidden' id='control" + taskID + "'>";
    tmpHTML += " <span class='controllink' onClick='undoneTask(" + taskID + ")'>не сделано</span> ";
    tmpHTML += " <a href='/task/" + taskID + "'>информация</a>";
    tmpHTML += "</span>";
    
    td3.innerHTML=tmpHTML;;
    td3.setAttribute("onMouseover","showNav('control" + taskID + "')");
    td3.setAttribute("onMouseout","hideNav('control" + taskID + "')");
}

// Установка задачи в current - start 
function currentTask(taskID)
{
    var scripturl = '/cgi-bin/ajax_current.pl';
    var pars = 'id=' + taskID + '&dummy=' + new Date().getTime();
    
    clearInfoContent();
    document.getElementById('info_loader').style.display  = "inline";
    
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, fTaskID){
                            answerCurrentTask(transport, json, taskID) 
                        }
        });
}

function answerCurrentTask(originalRequest, json, taskID) {
    var scriptAnswer = originalRequest.responseText;
    if (scriptAnswer == 1) {
        // получаю текст задачи
        var text = $("t" + taskID).innerHTML;

        if (curday != d ) {
            // В том случае, если я не в сегодня, то просто удаляю ряд с задачей, которая
            // отмечается как текущаю
            deleteRow(taskID);
        } else {
            // Блок я нахожусь в сегодня - start

            // В том же случае, если я находусь в сегодн, то логика проверки что нужно делать
            // несколько сложнее

            // Выясняю, если ли сейчас current задача
            // значение переменной 0 - нет задачи
            // 1 - есть задача
            var flagThereIsCurrentTask = 0;
        
            if ( $("curtime").childNodes.item(5).innerHTML == '' ) {
                flagThereIsCurrentTask = 0;
            } else {
                flagThereIsCurrentTask = 1;
            }
        
            if ( flagThereIsCurrentTask == 1) {
                // Если есть current задача, то переношу ее из current в ordinary

                // Выясняю id и текст текущей задачи
                var tmpCurrentID = $("curtime").childNodes.item(5).childNodes.item(1).id;
                var tmpCurrentText = $("curtime").childNodes.item(5).childNodes.item(1).innerHTML;
            
                tmpCurrentID = tmpCurrentID.replace(new RegExp(/^t/),"");
            
                // Записываю задачу сразу после строки со временем
                // Третий параметр 1 означает, что нужно добавить эту задачу после current
                addRow(tmpCurrentID, tmpCurrentText, 1);

                // Удаляю строку, которую ставлю текущей
                deleteRow(taskID);
            } else {
                // Если сейчас нет current задачи то просто
                // убираю строку с задачей, которую ставлю текущей
                deleteRow(taskID);
            }
        
            // Пишу текст задачи рядом с часами
            var tmpHTML;

            tmpHTML  = " <span class='current' id='t" + taskID + "'>" + text + "</span> ";
            tmpHTML += " <span class='control_hidden' id='control" + taskID + "'>";
            tmpHTML += "  <span class='controllink' onClick='doneTask(" + taskID + ")'>сделано</span> ";
            tmpHTML += "  <span class='controllink' onClick='editTask(" + taskID + ")'>редактировать</span> ";
            tmpHTML += "  <span class='controllink' onClick='moveTask(" + taskID + ")'>переместить</span> ";
            tmpHTML += "  <span class='controllink' onClick='ordinaryTask(" + taskID + ")'>обычная</span>";
            tmpHTML += "  <a href='/task/" + taskID + "'>информация</a>";
            tmpHTML += " </span>";
    
            $("curtime").childNodes.item(5).innerHTML=tmpHTML;
        
            $("curtime").childNodes.item(5).setAttribute("onMouseover","showNav('control" + taskID + "')");
            $("curtime").childNodes.item(5).setAttribute("onMouseout","hideNav('control" + taskID + "')");
        
            // Добавляю чекбокс
            var td2 = $("curtime").childNodes.item(3);
            td2.innerHTML = "<input type='checkbox' name='cbox" + taskID + "' onClick='doneTask(" + taskID + ")'>";
            td2.setAttribute("class","mid_current");
            
            // Выставялю флаг, что есть текущая задача
            curflag = 1;

            // Блок я нахожусь в сегодня - end
        }

        // Уведомляю пользователя о том, что произошло
        document.getElementById('info_loader').style.display  = "none";
        setInfoContent("Задача стала текущей");
    } else {
        document.getElementById('info_loader').style.display  = "none";
        setInfoErrorContent("При изменении статуса задачи все сломалось =(");
    }
}
// Установка задачи в current - end

// Установка задачи в ordinary - start
function ordinaryTask(taskID)
{
    var scripturl = '/cgi-bin/ajax_ordinary.pl';
    var pars = 'id=' + taskID + '&dummy=' + new Date().getTime();
    
    clearInfoContent();
    document.getElementById('info_loader').style.display  = "inline";
    
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, fTaskID){
                            answerOrdinaryTask(transport, json, taskID) 
                        }
        });
}

function answerOrdinaryTask(originalRequest, json, taskID) {
    var scriptAnswer = originalRequest.responseText;
    if (scriptAnswer == 1) {
        // получаю текст задачи
        var text = $("t" + taskID).innerHTML;

        // Удаляю задачу из current
        $("curtime").childNodes.item(5).innerHTML = null;
        $("curtime").childNodes.item(5).setAttribute("onmouseover","");
        $("curtime").childNodes.item(5).setAttribute("onmouseout","");
        $("curtime").childNodes.item(3).className = null;
        
        // Удаляю чекбокс
        $("curtime").childNodes.item(3).innerHTML = null;
        $("curtime").childNodes.item(3).className = null;
        
        // Записываю задачу сразу после строки со временем
        // Третий параметр 1 означает, что нужно добавить эту задачу после current
        addRow(taskID, text, 1);

        // Уведомляю пользователя о том, что произошло
        document.getElementById('info_loader').style.display  = "none";
        setInfoContent("Задача стала обыкновенной");

        // Снимаю флаг что есть текущая задача
        curflag=0;
    } else {
        document.getElementById('info_loader').style.display  = "none";
        setInfoErrorContent("При изменении статуса задачи все сломалось =(");
    }
}
// Установка задачи в ordinary - end

// Undone task start
function undoneTask(taskID)
{
    // Убираю менюшку
    clearInfoContent();
    
    // Включаю ajax крутилку
    document.getElementById('info_loader').style.display  = "inline";
    
    var scripturl = '/cgi-bin/ajax_undone.pl';
    var pars = 'id=' + taskID + '&dummy=' + new Date().getTime();
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, answerTaskId){
                            answerUndoneTask(transport, json, taskID)
                        }
            
        });
}

function answerUndoneTask(originalRequest, json, answerTaskId) {
    var scriptAnswer = originalRequest.responseText;
    if (scriptAnswer == 1) {
        deleteRow(answerTaskId);
        setInfoContent("Задача отмечена как новая и помещена во <a href='/inbox/'>входящие</a>");
    } else {
        setInfoErrorContent("При изменении статуса задачи все сломалось =(");
    }
    document.getElementById('info_loader').style.display  = "none";
}

// Функция удаляет ряд в котором находиится задача с указанным id
function deleteRow(taskID) {
    // Нахожу номер ряда в котором находится span с id
    var tmpRow = document.getElementById('t' + taskID).parentNode.parentNode.rowIndex;

    // Удаляю ряд, который нашел
    document.getElementById('main').deleteRow(tmpRow);
}

// Undone task end

// edit task - start
function editTask(taskID)
{

    // В том случае, если уже какая-то задача открыта для редактирования, закрываю ее
    if ( editTaskOpen != 0 ){
        editTaskCancel(editTaskOpen);
    }

    var savedText = $("t" + taskID).innerHTML;
    
    savedText = savedText.replace(/<a href=\".*">/, '');
    savedText = savedText.replace(/<\/a>/, '');

    // Нужно куда-то сохранять оригинальный текст, чтобы в случае нажатия на cancel его можно было откуда-то достать
    // Я решил создавать hidden поле, это лучше чем глобальная переменная, возможно в будущем нужно будет иметь возможность
    // редактировать одновременно несколько задач

    $("t" + taskID).innerHTML="<input id='input" + taskID + "' name='taskText" + taskID + "' type='text' size='40' value='" + savedText + "'>&nbsp;<button onClick='saveTaskText(" + taskID + ")'>сохранить</button>";
    $("control" + taskID).innerHTML=
    " <span class='controllink' onclick='editTaskCancel(" + taskID + ");'>отмена</span><input type='hidden' id='original"+taskID+"' value='" + savedText+ "'>";

    document.getElementById("input" + taskID).focus(); 
    flagFocus=1;
    editTaskOpen=taskID;
}

function saveTaskText(taskID) {
    flagFocus=0;
    
    // Убираю менюшку
    clearInfoContent();
    
    // Включаю ajax крутилку
    document.getElementById('info_loader').style.display  = "inline";
    
    var scripturl = '/cgi-bin/ajax_edit.pl';
    var pars = 'id=' + taskID + '&text=' + encodeURIComponent($("input" + taskID).value) + '&dummy=' + new Date().getTime();
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, answerTaskId){
                            answerSaveTaskText(transport, json, taskID)
                        }
        });
}

function answerSaveTaskText(originalRequest, json, taskID) {
    var scriptAnswer = originalRequest.responseText;
    if (scriptAnswer == 1) {
        document.getElementById('info_loader').style.display  = "none";
        setInfoContent("Текст задачи сохранен");
        // window.location.reload();
    } else {
        document.getElementById('info_loader').style.display  = "none";
        setInfoErrorContent("При сохранинеии текста задачи все сломалось =(");
    }
    var savedText = $("input" + taskID).value;
    $("t" + taskID).innerHTML = savedText;
    
    var tmpHTML;

    tmpHTML =  " <span class='controllink' onClick='doneTask(" + taskID + ")'>сделано</span> ";
    tmpHTML += " <span class='controllink' onClick='editTask(" + taskID + ")'>редактировать</span> ";
    tmpHTML += " <span class='controllink' onClick='moveTask(" + taskID + ")'>переместить</span> ";

    // В том случае, если задача current, нужно создать контрол перевода в ordinary,
    // а если задача ordinary, то нужнол создать контрол перевода в current
    if ($("t" + taskID).className == "current") {
        tmpHTML += " <span class='controllink' onClick='ordinaryTask(" + taskID + ")'>обычная</span>";
    } else {
        tmpHTML += " <span class='controllink' onClick='currentTask(" + taskID + ")'>текущая</span>";
    }

    tmpHTML += " <a href='/task/" + taskID + "'>информация</a>";

    $("control" + taskID).innerHTML= tmpHTML;
    
    // Выставляю флаг, что сейчас ни одна задача не редактируется
    editTaskOpen = 0;
}

function editTaskCancel(taskID) {
    // Востанавливаю тот текст, который был сохранен в hidden элемент
    $("t" + taskID).innerHTML = $("original" + taskID).value;
    var tmpHTML;

    tmpHTML =  " <span class='controllink' onClick='doneTask(" + taskID + ")'>сделано</span> ";
    tmpHTML += " <span class='controllink' onClick='editTask(" + taskID + ")'>редактировать</span> ";
    tmpHTML += " <span class='controllink' onClick='moveTask(" + taskID + ")'>переместить</span> ";
    tmpHTML += " <span class='controllink' onClick='currentTask(" + taskID + ")'>текущая</span>";
    tmpHTML += " <a href='/task/" + taskID + "'>информация</a>";
    
    $("control" + taskID).innerHTML= tmpHTML;

    // Выставляю флаг, что сейчас ни одна задача не редактируется
    editTaskOpen = 0;
}
// edit task - end

// Перемещение задачи start
function moveTask(taskID)
{
    globalTaskID=taskID;
    document.getElementById('move_task').style.position = 'absolute'; 
    document.getElementById('move_task').style.top      = mouseY+10 + "px";
    document.getElementById('move_task').style.left     = mouseX-120 + "px";
    document.getElementById('move_task').style.display  = "block"; 
    moveTaskOpen = 1;
}
function closeMoveTask () 
{ 
    document.getElementById('move_task').style.display = "none"; 
    moveTaskOpen = 0;
}

function buttonMoveToday () 
{ 
    ajaxMoveTask(globalTaskID,"today");
    closeMoveTask();
}

function buttonMoveInbox () 
{ 
    ajaxMoveTask(globalTaskID,"inbox");
    closeMoveTask();
}

function buttonMoveDeleted () 
{ 
    ajaxMoveTask(globalTaskID,"deleted");
    closeMoveTask();
}

function buttonMoveTomorrow () 
{ 
    ajaxMoveTask(globalTaskID,d_next);
    closeMoveTask();
}

function buttonMoveDate () 
{ 
    ajaxMoveTask(globalTaskID,$("d").value);
    closeMoveTask();
}

function ajaxMoveTask(taskID,where) {
    var scripturl = '/cgi-bin/ajax_move.pl';
    var pars = 'id=' + taskID + '&where=' + where + '&dummy=' + new Date().getTime();
    
    clearInfoContent();
    document.getElementById('info_loader').style.display  = "inline";

    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, fTaskID, fWhere){
                            answerAjaxMoveTask(transport, json, taskID, where) 
                        }
        });
}

function answerAjaxMoveTask(originalRequest, json, taskID, where) {
    var scriptAnswer = originalRequest.responseText;
    if (scriptAnswer == 1) {
        
        // Тут несколько сложная логика
        // Если задача current, то убираю только содержимое одного td
        // Если же задача ordinary, то удаляю целый ряд
        // Так пришлось сделать, чтобы не изчезал блок с текущим временем

        if ($("t" + taskID).className == "current") {
            var td3 = $("t" + taskID).parentNode;

            var td2 = td3.parentNode.childNodes.item(3);

            // Очишаю элемент с чекбоксом
            td2.innerHTML = null;
            td2.className = null;

            // Очишаю элемент с текстом задачи и контролами
            td3.innerHTML = null;
            td3.className = null;
            td3.setAttribute("onmouseover","");
            td3.setAttribute("onmouseout","");

        } else {
            deleteRow(taskID);
        }

        // В переменной соберу ссылку на ящик в который была добавлена задача
        var linkToTaskPlace;
        if (where == "inbox") {
            linkToTaskPlace = "<a href='/inbox/'>входящие</a>";
        } else if (where == "deleted") {
            linkToTaskPlace = "<a href='/deleted/'>удаленные</a>";
        } else if (where == "today" ) {
            linkToTaskPlace = "<a href='/'>сегодня</a>";
        } else {
            linkToTaskPlace = "<a href='/day/" + where + "'>" + where + "</a>";
        }
        
        document.getElementById('info_loader').style.display  = "none";
        setInfoContent("Задача перемещена в " + linkToTaskPlace);

    } else {
        document.getElementById('info_loader').style.display  = "none";
        setInfoErrorContent("При перемещении задачи все сломалось =(");
    }
    
}
// Перемещение задачи end

// Создание задачи start
function addTask ()  
{ 
    document.getElementById('add_task').style.display = "block"; 
    document.getElementById('task_text').focus(); 
    addTaskOpen = 1; 
} 
 
function closeAddTask () 
{ 
    document.getElementById('add_task').style.display = "none"; 
    addTaskOpen = 0; 
    document.getElementById('task_text').value="";
    document.getElementById('d_create').value="";
} 

function buttonCreateInbox ()
{
    ajaxAddTask(document.getElementById('task_text').value,"inbox");
}

function buttonCreateTomorrow ()
{
    ajaxAddTask(document.getElementById('task_text').value,curdate_next);
}

function buttonCreateDate (where)
{
    if (where) {
        ajaxAddTask(document.getElementById('task_text').value, where);
    } else {
        ajaxAddTask(document.getElementById('task_text').value, $("d_create").value);
    }
}

function ajaxAddTask(text,where) {

    var scripturl = '/cgi-bin/ajax_add.pl';
    var pars = 'text=' + encodeURIComponent(text) + '&where=' + where + '&dummy=' + new Date().getTime();
    if (!( /add\/$/.test(location.href))) {
        closeAddTask();
    }
    clearInfoContent();
    document.getElementById('info_loader').style.display  = "inline";
    document.getElementById('task_text').value = "";
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, fText, fWhere){
                            answerAjaxAddTask(transport, json, text, where) 
                        }
        });
}

function answerAjaxAddTask(originalRequest, json, text, where) {

    var scriptAnswer = originalRequest.responseText;

    if (scriptAnswer > 0) {
        // В переменной соберу ссылку на ящик в который была добавлена задача
        var linkToTaskPlace;
        if (where == "inbox") {
            linkToTaskPlace = "<a href='/inbox/'>входящие</a>";
        } else if (where == d ) {
            // В том случаее, если d = where, то добавляю задачу в главную таблицу
            
            // Удаляю перевод строки из ajax ответа
            var tmpTaskID = scriptAnswer.replace(/\n/g, "");
            addRow(tmpTaskID, text);
            linkToTaskPlace = where;
        } else {
            linkToTaskPlace = "<a href='/day/" + where + "'>" + where + "</a>";
        }
        setInfoContent("Задача помещена в " + linkToTaskPlace);
    } else {
        setInfoErrorContent("При добавлении задачи все сломалось =(");
    }
    
    document.getElementById('info_loader').style.display  = "none";

}
// Создание задачи end

// Создание задачи в сегодня start

function buttonCreateToday ()
{
    ajaxAddTaskToday(document.getElementById('task_text').value,"today");
}

function ajaxAddTaskToday(text,where) {
    var scripturl = '/cgi-bin/ajax_add.pl';
    var pars = 'text=' + encodeURIComponent(text) + '&where=' + where;
    if (!( /add\/$/.test(location.href))) {
        closeAddTask();
    }
    document.getElementById('info_loader').style.display  = "inline";
    document.getElementById('task_text').value = "";
    clearInfoContent();
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: function(transport, json, fText, fWhere){
                            answerAjaxAddTaskToday(transport, json, text, where)
                        }
            
        });
}

function answerAjaxAddTaskToday(originalRequest, json, text, where) {
    var scriptAnswer = originalRequest.responseText;
    scriptAnswer = scriptAnswer.replace(/\n/g, "");

    if (scriptAnswer > 0) {
            if (curday == d) {
                setInfoContent("Задача помещена в сегодня");
                addRow(scriptAnswer, text);
            } else {
                setInfoContent("Задача помещена в <a href='/'>сегодня</a>");
            }
    } else {
        setInfoErrorContent("При добавлении задачи все сломалось =(");
    }
    
    document.getElementById('info_loader').style.display  = "none";
}

// Создание задачи в сегодня end


// Процедура помещает текст в информационный блок
function setInfoContent(text) {
    document.getElementById('info_content').update( text );
    document.getElementById('info_content').style.backgroundColor="#0095b6";
}

// Процедура помещает текст в информационный блок ошибки
function setInfoErrorContent(text) {
    document.getElementById('info_content').update( text );
    document.getElementById('info_content').style.backgroundColor="red";
}


// Процедура убирает информационный блок
function clearInfoContent() {
    document.getElementById('info_content').update( "");
    document.getElementById('info_content').style.backgroundColor="white";
}

// Процедура добавляет строку в таблицу с задачами
// Параметр whereToPlace определет, где будет расположена задача
// Если не указан, то задача добавляется последней, если же значение
// параметра 1, то задача будет добавлена после current
function addRow(taskID, text, whereToPlace)
{
   
    var tmpHTML;

    tmpHTML  = " <span class='ordinary' id='t" + taskID + "'" + " onmousedown='startRowMove(event); return false;'>" + text + "</span> ";
    tmpHTML += " <span class='control_hidden' id='control" + taskID + "'>";
    tmpHTML += "  <span class='controllink' onClick='doneTask(" + taskID + ")'>сделано</span> ";
    tmpHTML += "  <span class='controllink' onClick='editTask(" + taskID + ")'>редактировать</span> ";
    tmpHTML += "  <span class='controllink' onClick='moveTask(" + taskID + ")'>переместить</span> ";
    tmpHTML += "  <span class='controllink' onClick='currentTask(" + taskID + ")'>текущая</span>";
    tmpHTML += "  <a href='/task/" + taskID + "'>информация</a>";
    tmpHTML += " </span>";

    var td1 = document.createElement("TD");
    td1.setAttribute("class","tdtime");

    var td2 = document.createElement("TD");
    td2.innerHTML = "<input type='checkbox' name='cbox" + taskID + "' onClick='doneTask(" + taskID + ")'>";
    td2.setAttribute("class","mid_undone");

    var td3 = document.createElement("TD");
    td3.innerHTML = tmpHTML;
    td3.setAttribute("class","tdtask");
    td3.setAttribute("onMouseover","showNav('control" + taskID + "')");
    td3.setAttribute("onMouseout","hideNav('control" + taskID + "')");

    if (whereToPlace == 1) {
        // Добавляю задачу после последего сделаного дела
        
        // Выясняю позицию на которую нужно вставлять задачу
        var positionToPlaceTask = $("curtime").rowIndex;

        // Ставить нужно на следующую после current ряда
        positionToPlaceTask++;

        var addedRow = document.getElementById("main").insertRow(positionToPlaceTask);
        addedRow.setAttribute("class","ordinary");
    
        var space1 = document.createTextNode(" ");
        var space2 = document.createTextNode(" ");
        var space3 = document.createTextNode(" ");
        var space4 = document.createTextNode(" ");

        addedRow.appendChild(space1);
        addedRow.appendChild(td1);
        addedRow.appendChild(space2);
        addedRow.appendChild(td2);
        addedRow.appendChild(space3);
        addedRow.appendChild(td3);
        addedRow.appendChild(space4);

    } else {
        // Добавляю задачу в самый конец таблицы
        var tbody = document.getElementById("main").getElementsByTagName("TBODY")[0];
        var row = document.createElement("TR");
        row.setAttribute("class","ordinary");
        
        var space1 = document.createTextNode(" ");
        var space2 = document.createTextNode(" ");
        var space3 = document.createTextNode(" ");
        var space4 = document.createTextNode(" ");
        
        row.appendChild(space1);
        row.appendChild(td1);
        row.appendChild(space2);
        row.appendChild(td2);
        row.appendChild(space3);
        row.appendChild(td3);
        row.appendChild(space4);

        tbody.appendChild(row);
    }
    
}

// Блок кода для перемещения задач с помощью drag&drop-а start

// Глобальная переменная в которой храню статус, перетаскиваем ли мы сейчас что-нибудь или нет
var flagIsDraggin = 0;

// Глобальная переменная по которой определюя, куда двигаюсь вверх или вниз
var flagMovingUp = 0;

// Глобальная переменная в которой сохраняю предудущее положение Y мыши
var oldMouseY = 0;

// Глобальная переменная в которой хранится ряд в таблице который перемещаетс
var movingRow = 0;

// Глобальная переменная в которой хранится ряд в таблице над которым сейчас находится курсор мыши
var currentRow = 0;

// Глобальная переменная, в которой храню начальную позицию ряда (до перемещения)
var rowOriginalPosition = 0;

// Глобальная переменная, в которой храню позицию ряда на который его
var rowDonePosition = 0;

function startRowMove(ev) {
    // Узнаю id задачи, которую схватили для перемещения
    flagIsDraggin = getEventSource(ev).id;
    flagIsDraggin = flagIsDraggin.replace(new RegExp(/^t/),"");

    // Сохрняю ряд таблицы на котором кликнули
    movingRow = getEventSource(ev).parentNode.parentNode;

    // Сохрняя начальную позицию
    rowOriginalPosition = movingRow.rowIndex + 1;

    // Конечная позиция пока так же равно текущей позиции
    rowDonePosition = rowOriginalPosition;

    // Меняю стиль
    setMovingRowStyle(flagIsDraggin);
}

document.onmouseup = function(ev) {
    if (flagIsDraggin != 0 ) {
        delMovingRowStyle(flagIsDraggin);

        // В том случае, если ряд был перемещен, выполняю нужное мне действие
        if (rowOriginalPosition != rowDonePosition) {
            if (curflag == 1) {
                resortTask(flagIsDraggin, d, rowDonePosition);
            } else {
                resortTask(flagIsDraggin, d, rowDonePosition-1);
            }
        }
        
        flagIsDraggin = 0;
        movingRow = null;
        rowOriginalPosition = 0;
        rowDonePosition = 0;
    }
}

document.onmousemove = function(ev){
    flagMovingUp = mouseY < oldMouseY;
    oldMouseY = mouseY;
    currentRow = findDropTargetRow(mouseY);
    
    
    if (flagIsDraggin != 0 && currentRow ) {
        // Сохрняя позицию на которую перемещаю задачу
        rowDonePosition = currentRow.rowIndex + 1;

        if (flagMovingUp) {
            movingRow.parentNode.insertBefore(movingRow, currentRow);
        } else if (! flagMovingUp) {
            movingRow.parentNode.insertBefore(movingRow, currentRow.nextSibling);
        }
    }
}

// ajax для перемещения задачи
function resortTask(taskID, where, position)
{
    // Убираю менюшку
    clearInfoContent();
    
    // Включаю ajax крутилку
    document.getElementById('info_loader').style.display  = "inline";
    
    var scripturl = '/cgi-bin/ajax_move.pl';
    var pars = 'id=' + taskID + '&where=' + where + '&position=' + position + '&dummy=' + new Date().getTime();
    var myAjax = new Ajax.Request(
        scripturl, {
            method: 'get',
            parameters: pars,
            onComplete: answerResortTask
        });
}

function answerResortTask(originalRequest) {
    var scriptAnswer = originalRequest.responseText;
    if (scriptAnswer == 1) {
        setInfoContent("Задача перемещена");
    } else {
        setInfoErrorContent("При перемещении задачи все сломалось =(");
    }

    document.getElementById('info_loader').style.display  = "none";
}

function getEventSource(evt) {
    if (window.event) {
        evt = window.event; // For IE
        return evt.srcElement;
    } else {
        return evt.target; // For Firefox
    }
}

function findDropTargetRow(y) {
    // Эта штука запускается и на тех страницах, где нет главной таблице
    // Так вот, чтобы не было ошибок js нужно сначала проверить, а есть ли main
    if (document.getElementById("main")) {    
        var rows = document.getElementById("main").rows;

        for (var i=0; i<rows.length; i++) {
            var row = rows[i];
        
            // Выясняю статус в котором находится задача
            var taskStatus = row.className;

            // Задачи можно переставлять только на место ordinary
            if (taskStatus == "ordinary") {
                var rowY = getPosition(row).y;
                var rowHeight = row.offsetHeight;
                
                // Because we always have to insert before, we need to offset the height a bit
                if ((mouseY > rowY - rowHeight) && (mouseY < (rowY + rowHeight))) {
                    // that’s the row we’re over
                    return row;
                }
            }
        }
    }
    return null;
}

function getPosition(e){
    var left = 0;
    var top  = 0;

    while (e.offsetParent){
        left += e.offsetLeft;
        top  += e.offsetTop;
        e     = e.offsetParent;
    }

    left += e.offsetLeft;
    top  += e.offsetTop;

    return {x:left, y:top};
}

function setMovingRowStyle(taskID) {
    document.getElementById('t' + taskID).parentNode.parentNode.style.backgroundColor = "#eee"; 

    // Перебираю все ряды в таблице и выключаю все контролы
    var rows = document.getElementById("main").rows;
    
    for (var i=0; i<rows.length; i++) {
        var row = rows[i];

        if( row.childNodes.item(3).className != "" ) {
            row.childNodes.item(5).childNodes.item(3).style.display = "none";
        }
    }
}

function delMovingRowStyle(taskID) {
    document.getElementById('t' + taskID).parentNode.parentNode.style.backgroundColor = "white"; 

    // Перебираю все ряды в таблице и вклюючаю все контролы
    var rows = document.getElementById("main").rows;
    
    for (var i=0; i<rows.length; i++) {
        var row = rows[i];
    
        if( row.childNodes.item(3).className != "" ) {
            row.childNodes.item(5).childNodes.item(3).style.display = "inline";
        }
    }
}

// Блок кода для перемещения задач с помощью drag&drop-а end

// Функция для записи дебаг сообщений
function writeDebug(text) {
    if (document.getElementById("debug")) {
        var dbgObj = document.getElementById("debug");
        dbgObj.innerHTML = dbgObj.innerHTML + text + "<br/>";
    }
}

