﻿// Флаг открытия панели авторизации
var authorizationPanelIsOpened = false;
// Флаг открытия панели помощи
var helpPanelIsOpened = false;
// Флаг открытия панели управления файлами
var filesPanelIsOpened = false;
// Флаг открытия панели публикации
var publicationPanelIsOpened = false;
// Флаг открытия панели примеров
var samplesPanelIsOpened = false;

// Картинка для поддержки жизни сессии
var temp_img;
// Таймер
var keepSessionAliveTimerID;


// ***************************************************************** Поведение окна *****************************************************************

// Загрузка страницы
function windowLoad() {
    $get("ButtonRefreshSession").style.visibility = "hidden";               // прячем кнопку возобновления сессии
    enterBlockOn = false;                           // блок ввода выключен
    
    windowResize();                                 // Подгон размеров всех элементов
    
    currSessionID = $get("SessionIDHiddenField").value;
    currSessionStatus = $get("SessionStatusHiddenField").value;
    loadingError = $get("LoadingErrorHiddenField").value;
    
    userIP = $get("UserIPHiddenField").value;
    userName = $get("UserNameHiddenField").value;
    
    isUser = userName != Guest;
    if (!isUser)
        $get("GuestModeLabel").style.display = "block";
    
    userActivityIsFixed = getActivityInformationFromCookie();
    
    if (loadingError == creationNewSessionDirectoryErrorCode) { // не удалось создать каталог
        InformAboutError(creationNewSessionDirectoryError);
        return;
    }
        
    SetStatusLineHidden();
    
    // Определение пазмера развертывающегося блока
        var pageDisableDiv = $get("pageDisableDiv");
        pageDisableDiv.style.width = getDocumentWidth().toString() + px;
        pageDisableDiv.style.height = getDocumentHeight().toString() + px;
        
    // Всегда открываем по умолчанию панель помощи
    collapsePanelHeaderClick('helpHeaderDiv', 'helpBodyDiv'); 
    
    // Определяем ограниченность браузера
    restrictedMode = getCookie(isBrowserCorrectCookie) != "True";
    if (!restrictedMode){
        // Открываем по умолчанию панели авторизации и файлов сеанса:
        collapsePanelHeaderClick('authorizationHeaderDiv', 'authorizationBodyDiv');
        collapsePanelHeaderClick('filesHeaderDiv', 'filesBodyDiv');
        
        if (isUser)
            LoadUsersFilesTable();
        else
            LoadUsersFilesList();
    }
    else{                                           // если версия ограничена, то авторизацию и управление файлами убираем
        $get("authorizationHeaderDiv").style.display = "none";
        $get("filesHeaderDiv").style.display = "none";
        $get("RestrictedModeLabel").style.display = "block";
    }
    LoadSamplesList();
    
    temp_img = new Image();                         // Поддержание жизни сессии
    keepSessionAliveTimerID = setInterval(KeepSessionAlive, sessionAlivePeriod);
}

// Поддержание сессии
function KeepSessionAlive() {
    var curDate = new Date; 
    temp_img.src = curDate.valueOf();
}


// количество уровней расположения
// элементов на области ввода
var levelCount;

// минимальная допустимая ширина поля ввода
var minEnterEditWidth = 400;

// ширина рабочей панели
var workPanelWidth = 260;
// ширина панели ссылок
var linkPanelWidth = 0;//30;

// Возвращает ширину клиентской части окна
// IE5+, Mozilla 1.0+, Opera 7+
function getClientWidth() {
    return (document.compatMode == 'CSS1Compat' && !window.opera) ? document.documentElement.clientWidth : document.body.clientWidth;
}

// Возвращает высоту клиентской части окна
// IE5+, Mozilla 1.0+, Opera 7+
function getClientHeight() {
    return (document.compatMode == 'CSS1Compat' && !window.opera) ? document.documentElement.clientHeight : document.body.clientHeight;
}

//Размер документа по вертикали
function getDocumentHeight() {
    return (document.body.scrollHeight > document.body.offsetHeight)?document.body.scrollHeight:document.body.offsetHeight;
}

//Размер документа по горизонтали
function getDocumentWidth() {
    return (document.body.scrollWidth > document.body.offsetWidth)?document.body.scrollWidth:document.body.offsetWidth;
}


// Изменение размеров окна
function windowResize() {
    ResizeEditsWidth(); // Изменение ширины элементов на вкладках
                        // "вывод" и "ошибки"
    ResizeErrorsAndEditsTextBoxHeight();    // Изменение высоты табов
                                            // в соответствии с областью ввода
}
    
    // Изменяет ширину полей вывода соответственно клиентсокй ширине окна
    function ResizeEditsWidth() {
        // ширина всего окна
        var windowWidth = getClientWidth();
        
        // ширина пробела
        var spaceWidth = 9;
        // ширина пространства между элементами
        var delimWidth = 6;
        
            var enterButtonStrWidth = $get("EnterButton").style.width;  // строковая ширина кнопки "ввести"
            var stopButtonStrWidth = $get("StopButton").style.width;    // строковая ширина кнопки "завершить"
        
        // суммарная ширина кнопок
        var buttonsWidth = parseInt(enterButtonStrWidth.slice(0, enterButtonStrWidth.length-2)) + 
            parseInt(stopButtonStrWidth.slice(0, stopButtonStrWidth.length-2)) + 2*delimWidth;
        
            var enterLabelStrWidth = $get("EnterLabel").style.width;    // строковая ширина метки "Ввод"
        
        // ширина метки "Ввод"
        var enterLabelWidth = delimWidth + spaceWidth + 70;//parseInt(enterLabelStrWidth.slice(0, enterLabelStrWidth.length-2)) + spaceWidth;
        
        // ширина области вывода
        var outputAreaWidth = windowWidth - (workPanelWidth+4) - linkPanelWidth - 2*spaceWidth - 25;
            
        // возможная ширина поля ввода    
        var possibleEnterEditWidth = outputAreaWidth - buttonsWidth - enterLabelWidth;
        // возможная ширина без кнопок
        var possibleEnterEditWithoutButtonsWidth = outputAreaWidth - enterLabelWidth;
        
        // ширина поля ввода
        var enterEditWidth = 
            (possibleEnterEditWidth >= minEnterEditWidth) ? possibleEnterEditWidth :
            ((possibleEnterEditWithoutButtonsWidth >= minEnterEditWidth) ? possibleEnterEditWithoutButtonsWidth :
            ((outputAreaWidth < minEnterEditWidth) ? minEnterEditWidth : outputAreaWidth)); 
         
        // количество уровней расположений элементов ввода   
        levelCount = (enterEditWidth == possibleEnterEditWidth) ? 1 :
            ((enterEditWidth == possibleEnterEditWithoutButtonsWidth) ? 2 : 3);
        
        // изменение ширины поля ввода
        $get("EnterEdit").style.width = enterEditWidth.toString() + px;   
        
        // изменение ширины области вывода ошибок
        if (levelCount == 3)
            $get("ResultTabContainer_ErrorsTabPanel_ErrorsTextBox").style.width = (enterEditWidth-28).toString() + px; 
            // 28px — сдвиг вправо области ввода
        else
            $get("ResultTabContainer_ErrorsTabPanel_ErrorsTextBox").style.width = "100%"; 
    }
    
    // Изменение высоты табов
    function ResizeErrorsAndEditsTextBoxHeight() {
        var outputTextBox = $get("ResultTabContainer_OutputTabPanel_ResultTextBox");    // область вывода
        var errorsTextBox = $get("ResultTabContainer_ErrorsTabPanel_ErrorsTextBox");    // область ошибок
        
        var outputHeight;   // высота области вывода
        var errorsHeight;   // высота области ошибок
        
        errorsHeight = defaultStrOutputHeight;
            
        if (!enterBlockOn) {
            outputHeight = defaultStrOutputHeight;
        }
        else {
            //высота уровня
            var levelHeight = 18;
            // высота пространства между уровнями
            var delimHeight = 1;
            
            // Высота блока ввода
            var enterBlockHeight = 3 + levelHeight + delimHeight;   // при 1ом уровне
            enterBlockHeight += (levelCount == 1) ? 0 :
                ((levelCount == 2) ? levelHeight + delimHeight+3 : 2*levelHeight + 2*delimHeight);
                
            var defaultOutputHeight = parseInt(defaultStrOutputHeight.slice(0, defaultStrOutputHeight.length-2));  
            var newOutputHeight = defaultOutputHeight - enterBlockHeight;
            
            outputHeight = newOutputHeight.toString() + px;
        }
        
        outputTextBox.style.height = outputHeight;
        errorsTextBox.style.height = errorsHeight;
    }


// ******************************************************* Поведение элементов рабочей панели *******************************************************

// При наведении мыши на заголовок сворачивающейся панели
function collapsePanelHeaderMouseOver(headerID) {
    SetElementStyle(headerID, "collapse_panel__header_over");
}

// Вспомогательная функция
// возвращает состояние открывающихся панелей
function takePanelOpenState(headerID) {
    switch (headerID) {
        case 'authorizationHeaderDiv':
            return authorizationPanelIsOpened;
            break;
        case 'helpHeaderDiv':
            return helpPanelIsOpened;
            break;
        case 'filesHeaderDiv':
            return filesPanelIsOpened;
            break;
        case 'samplesHeaderDiv':
            return samplesPanelIsOpened;
            break;
        case 'publicationHeaderDiv':
            return publicationPanelIsOpened;
            break;
    }
}

// При уходе мыши с заголовка сворачивающейся панели
function collapsePanelHeaderMouseOut(headerID) {
    var panelIsOpened = takePanelOpenState(headerID);
     
    if (!panelIsOpened)   
        SetElementStyle(headerID, "collapse_panel__header");
    else
        SetElementStyle(headerID, "collapse_panel__header_selected");
}

// При нажатии заголовка сворачивающейся панели
function collapsePanelHeaderClick(headerID, bodyID) {
    var panelIsOpened = takePanelOpenState(headerID);
    
    if (!panelIsOpened)   
        collapsePanelOpen(headerID, bodyID);
    else
        collapsePanelClose(headerID, bodyID);
}

// Открытие сворачивающейся панели
function collapsePanelOpen(headerID, bodyID) {
    SetElementStyle(headerID, "collapse_panel__header_selected");
    SetElementStyle(bodyID, "collapse_panel__body_opened");
    
    if (headerID == 'authorizationHeaderDiv')
        authorizationPanelIsOpened = true;
    else if (headerID == 'helpHeaderDiv')
        helpPanelIsOpened = true;
    else if (headerID == 'filesHeaderDiv')
        filesPanelIsOpened = true;
    else if (headerID == 'samplesHeaderDiv')
        samplesPanelIsOpened = true;
    else if (headerID == 'publicationHeaderDiv') {
        publicationPanelIsOpened = true;
        var tf = setTimeout("$get(\"PublishedFileNameEdit\").focus();", 100);   // иначе, пока неизвестно, почему,
                                                                                // фокус не устанавливается
    }
}

// Закрытие сворачивающейся панели
function collapsePanelClose(headerID, bodyID) {
    if (headerID == 'authorizationHeaderDiv')
        authorizationPanelIsOpened = false;
    else if (headerID == 'helpHeaderDiv')
        helpPanelIsOpened = false;
    else if (headerID == 'filesHeaderDiv')
        filesPanelIsOpened = false;
    else if (headerID == 'samplesHeaderDiv')
        samplesPanelIsOpened = false;
    else if (headerID == 'publicationHeaderDiv')
        publicationPanelIsOpened = false;
        
    SetElementStyle(bodyID, "collapse_panel__body_closed");
}


// При наведении курсора на кнопку операции с файлом
function FilesActionButtonDiv_Over(filesActionButtonDivID){
    $get(filesActionButtonDivID).className = "files_list__action_image_button_over";
}
// При снятии курсора с кнопки операции с файлом
function FilesActionButtonDiv_Out(filesActionButtonDivID){
    if (!isRenameDivOpen)
        $get(filesActionButtonDivID).className = "files_list__action_image_button";
    else
        $get(filesActionButtonDivID).className = "files_list__action_image_button_on";
}


// ****************************************************************** События окна ******************************************************************

// Обрабатывает нажатие клавиш
// (запуск компиляции[ctrl+F9], запуск выполнения программы[F9], завершение программы[shift+F9])
function CompilerKeyFunctions(e) {
    e = e || window.event;
    
    var enterEdit = $get("EnterButton");
    
    if (e.keyCode == 120) {     // 120 — код F9
        if (e.ctrlKey)
            compile_programm();
        else if (e.shiftKey)
            stop_programm();
        else 
            run_programm();
    }
    else if ((e.keyCode==107) && (enterEdit.style.display=="none"))    // 107 — код NumPad +
        SizeBiggerCallback();
    else if ((e.keyCode==109) && (enterEdit.style.display=="none"))    // 109 — код NumPad -
        SizeSmallerCallback();
    else if (e.keyCode == 27)   // 27 — код Esc
        CloseCanvasGraphDiv();
}

// Закрытие окна браузера
function ClosePage() {
    stop_programm();
}


// ******************************************************************* Окно Canvas ******************************************************************

// Закрывает графическое окно Canvas
function CloseCanvasGraphDiv(){
    $get("divGraphCanvas").style.visibility = "hidden";
}