﻿// ******************************************************************** Загрузка ********************************************************************

// имя файла при первой загрузке
var defaultFileName = "Program1.pas";
// имя файла - параметра при первой загрузке (инициализируется позже)
var pFileName = "";
// имя расшаренного файла-параметра при первой загрузке (инициализируется позже)
var sharedFileName = ""; 

// вычленение параметра командной строки
function getParam(sParamName)
{
    var Params = location.search.substring(1).split("&"); // отсекаем "?" и вносим переменные и их значения в массив 
    var variable = ""; 
    for (var i = 0; i < Params.length; i++){ 
    // пробегаем весь массив 
        if (Params[i].split("=")[0] == sParamName)
        { 
        // если это искомая переменная
            // если значение параметра задано, то возвращаем его
            if (Params[i].split("=").length > 1)
                variable = Params[i].split("=")[1];
            return variable;
        }
    }
    return "";
}

// Вычленяет из полного имени файла только непосредственное
function CmdParam_GetOwnName(fileName){
    var lastSlashInd = fileName.lastIndexOf("/") + 1;
    return fileName.substr(lastSlashInd);
}                

// Действия, выполняемые при загрузке редактора
// edit_area
function editAreaLoaded() {
    loadingError = $get("LoadingErrorHiddenField").value;
    currSessionID = $get("SessionIDHiddenField").value;
    currSessionStatus = $get("SessionStatusHiddenField").value;
    
    if (loadingError == creationNewSessionDirectoryError)
        return;  
    
    // разбор параметров командной строки
    fname = getParam("file");
    sharedFileName = getParam("shared");
    if (fname != "") {
        InformAboutNetworkOperation(paramFileIsLoading);
        pFileName = fname;
        LoadCommandLineFileContent();
    }
    else if (sharedFileName != ""){
        InformAboutNetworkOperation(sharedFileIsLoading);
        LoadSharedFileContent();
    }
    else{
        var userDir = (isUser) ? userName : currSessionID;
        // получение первого файла в каталоге из имеющихся
        InformAboutNetworkOperation(areaIsLoading);
        PageMethods.LoadFirstFileContent(isUser, userDir, LoadFirstFileContent_CallBack);
    }
}

/*
// Обратный вызов загрузки первого файла
function LoadDefaultFileContent_CallBack(response) {
    if (ProcessError(response.ErrorCode))
        return;
    
    var fileContent = response.Result;
    OpenNewFile(defaultFileName, fileContent);
    
    SetStatusLineHidden();
}
*/

// Имя нового, еще не сохраненного файла
var notSavedNewFileName;
// Сохранен ли новый файл
var newFileIsSaved;

// Обратный вызов загрузки первого в каталоге файла
function LoadFirstFileContent_CallBack(response) {
    if (ProcessError(response.ErrorCode))
        return;
    
    var fileName = response.FileName; 
    var fileContent = response.Source;
    
    if (fileName == "") {
        InformAboutWarning(noFileInDirectory);
        return;
    }
    
    if (!restrictedMode){                       // версия полноценна
        var firstFile = File_GetFile(fileName);
        if (firstFile == null) {                // значит это каталог гостя и загружен дефолтный файл
            firstFile = new File(fileName, MAIN_PATH, userName, true, NEW_PHANTOM);
            EXISTING_FILES.push(firstFile);
            notSavedNewFileName = fileName;
            newFileIsSaved = false;
        }
        firstFile.open(fileContent);
    }
    else{                                       // в ограниченной версии просто меняем текст
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, fileContent);
    }
    
    SetStatusLineHidden();
}

// Загрузка файла из командной строки
function LoadCommandLineFileContent() {
    PublishFileButton_Click(commandLine);
}


// ***************************************************************** Новый документ *****************************************************************
/* определено выше
// Имя нового, еще не сохраненного файла
var notSavedNewFileName;
// Сохранен ли новый файл
var newFileIsSaved;
*/

// Нужно ли записать дефолтное содержание во вкладку
var defaultTabContentNeed = false;

// Функция "Новый"
function NewDocument(need) {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    
    if (!restrictedMode){    
        if (newFileIsSaved == false){
            alert(notSavedNewFileExists);
            return;
        }
        
        //Page_Lock();
        someProcessIsRunning = true;
        fullProcessMessage = inProcess + ofNewFile;
        
        defaultTabContentNeed = (need) ? true : false;
        InformAboutNetworkOperation(newFileIsCreating);
        
        var userDir = (isUser) ? userName + ( (far.currentDir!=MAIN_PATH) ? "/"+far.currentDir+"/" : "" ) : currSessionID;
        if (!userActivityIsFixed){
            userActivityIsFixed = true;
            setActivityCookie();
            PageMethods.CreateNewFileWithUserFixing(isUser, userDir, userIP, CreateNewFile_CallBack);
        }
        else
            PageMethods.CreateNewFile(isUser, userDir, CreateNewFile_CallBack);
    }
    else{
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, "");
    }
}

// Обратный вызов создания нового файла
function CreateNewFile_CallBack(response) {
    //Page_Unlock();
    someProcessIsRunning = false;
    
    if (ProcessError(response.ErrorCode))
        return;
    
    var newFileName = response.Result;
    var newFullFileName = (isUser) ? (far.currentDir + ((far.currentDir!="") ? "/" : "") + newFileName) : newFileName;
    var newFile = File_GetFile(newFullFileName);
    if (newFile == null){
        newFile = new File(newFileName, (isUser) ? far.currentDir : MAIN_PATH, userName, true, NEW_PHANTOM);
        EXISTING_FILES.push(newFile);
    }
    
    newFile.open( (defaultTabContentNeed) ? defaultTabContent : "" );
    
    notSavedNewFileName = newFile.fullName;
    newFileIsSaved = false;
    
    SetStatusLineHidden();
}


// ******************************************************************* Сохранение *******************************************************************

// Текущий сохраняемый файл
var currentSavingFile;

// Сохранение документа
function SaveDocument() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }

    var currTitle = editAreaLoader.getCurrFileTitle(EDIT_AREA_SOURCE_ID);
    
    var currentTabID = editAreaLoader.getCurrentFile(EDIT_AREA_SOURCE_ID).id;
    currentSavingFile = File_GetFileByTabID(currentTabID);      // текущий файл
    
    // Для нового документа делаем сохранить как
    if (currentSavingFile.isPhantom && (currentSavingFile.phantomType == NEW_PHANTOM) && !newFileIsSaved){
        SaveAsDocument();
        return;
    }
        
    if (currTitle == "") {  // не открыто ни одного файла
        InformAboutWarning(noOpenedFile);
    }
    else {
        InformAboutNetworkOperation(fileIsSaving);
        //Page_Lock();
        someProcessIsRunning = true;
        fullProcessMessage = inProcess + ofSaving;
        
        var sourceCode = editAreaLoader.getValue(EDIT_AREA_SOURCE_ID);
        currentSavingFile.setSourceCode(sourceCode);
        
        if  ( currentSavingFile.isPhantom &&                        // файл является фантомным, т.е. ни разу не был
              (currentSavingFile.phantomType != NEW_PHANTOM) ){     // сохранен на сервере
            var correctedFileName = currentSavingFile.name.slice(   // корректируем имя (для примеров и публичных)
                FileApp_GetPrefixByPhantomType(currentSavingFile.phantomType).length);
            currentSavingFile.setName(correctedFileName);
            
            var callbackFunc;
            switch (currentSavingFile.phantomType){
                case SAMPLE_PHANTOM:    callbackFunc = CheckNewFileNameForSample_CallBack;  
                                        break;
                case PUBLIC_PHANTOM:    callbackFunc = CheckNewFileNameForPublic_CallBack;
                                        break;
            }
            
            // Проверяем, не был ли еще сохранен этот фантомный файл
            PageMethods.CheckNewFileName(currentSavingFile.fullName, 
                currentSavingFile.isByUser, currentSavingFile.ownerName, callbackFunc);
            return;
        }
        
        if (!userActivityIsFixed){
            userActivityIsFixed = true;
            setActivityCookie();
            PageMethods.SaveProgrammWithUserFixing(currentSavingFile.sourceCode, 
                currentSavingFile.fullName, currentSavingFile.isByUser, 
                currentSavingFile.ownerName, userIP, SaveProgramm_CallBack);
        }
        else {
            PageMethods.SaveProgramm(currentSavingFile.sourceCode, 
                currentSavingFile.fullName, currentSavingFile.isByUser, 
                currentSavingFile.ownerName, SaveProgramm_CallBack);
        }
    }
}

// Обратный вызов проверки существования файла для примера
function CheckNewFileNameForSample_CallBack(fileExists) {
    //Page_Unlock();
    someProcessIsRunning = false;
    
    if (fileExists) {
        if (!confirm("Файл с таким именем уже существует. Хотите перезаписать файл?")) {
            currentSavingFile.setName(sampleLabel + currentSavingFile.name);
            SetStatusLineHidden();
            return;
        }
    }
    
    //Page_Lock();
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSaving;
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.SaveProgrammWithUserFixing(currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, userIP, SaveProgramm_CallBack);
    }
    else{
        PageMethods.SaveProgramm(currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, SaveProgramm_CallBack);
    }
}

// Обратный вызов проверки существования файла для опубликованного примера
function CheckNewFileNameForPublic_CallBack(fileExists) {
    //Page_Unlock();
    someProcessIsRunning = false;
    
    if (fileExists) {
        if (!confirm("Файл с таким именем уже существует. Хотите перезаписать файл?")) {
            currentSavingFile.setName(publicLabel + currentSavingFile.name);
            SetStatusLineHidden();
            return;
        }
    }
    
    //Page_Lock();
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSaving;
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.SaveProgrammWithUserFixing(currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, userIP, SaveProgramm_CallBack);
    }
    else{
        PageMethods.SaveProgramm(currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, SaveProgramm_CallBack);
    }
}

// Обратный вызов сохранения документа
function SaveProgramm_CallBack(response) {
    //Page_Unlock();
    someProcessIsRunning = false;
    
    if (ProcessError(response.ErrorCode))
        return;
    
    // если файл уже существовал, то найдется файл,
    // с тем же именем, что и сохраненный файл, но не равный ему
    var similiarExistingFile = File_GetFile(currentSavingFile.fullName);
    if ( (similiarExistingFile != null) &&              // такой файл уже существовал
         (similiarExistingFile != currentSavingFile) && (!similiarExistingFile.isPhantom) ){
        
        if (similiarExistingFile.isOpened){
            similiarExistingFile.save();                // на всякий случай делаем статус "не изменен", чтобы не спрашивать сохранение,
                                                        // т.к. файл все равно закрывается 
            similiarExistingFile.close();
        }
                                                        // меняем свзяанный с ссылкой файл, только если открыта нужная вкладка
        var forUser = (far != null) && (far != undefined) && (far.currentDir == currentSavingFile.path);
        if (!isUser || forUser)
            $get(userFileNameLinkIDPrefix + currentSavingFile.fullName).file = currentSavingFile;        
        File_DeleteFile(currentSavingFile.fullName);    // удалится первый из файлов, т.е. уже существующий
    }
    else if (similiarExistingFile.isPhantom){           // такого файла не было
        var filesDiv = $get("filesListDiv");
        var filesTable = $get("filesTable");
        if (currentSavingFile.isByUser){
            // Добавлять файл на панель надо только в том случае,
            // если открыта панель родителя файла
            if (far.currentDir == currentSavingFile.path)
                AddUserFileToDiv(currentSavingFile.name, filesTable, filesDiv, currentSavingFile);
            if (similiarExistingFile != currentSavingFile)
                File_DeleteFile(currentSavingFile.fullName);    // удалится первый из файлов, т.е. уже существующий
            far.addNewFile(currentSavingFile.path, currentSavingFile.name);                             // Добавляет в список браузера файлов
        }
        else
            AddGuestFileToDiv(currentSavingFile.name, filesTable, filesDiv, currentSavingFile);
    }
    currentSavingFile.setNotPhantom();
    currentSavingFile.save();
    currentSavingFile.updateTabTitle();
    
    SetStatusLineHidden();
    
    if ( (!newFileIsSaved) && (notSavedNewFileName == currentSavingFile.fullName))  
        newFileIsSaved = true;
}

// Нажатие клавиш в NewFileNameBySavingAsEdit
function SaveAsEdit_OnKeyPress(evt) {
    evt = evt || window.event;
    
    if (evt.keyCode == 13) {        // Нажат ввод
        SaveAsOkButton_Click();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        ClosePopup('SaveAsDiv');
        return false;
    }
    return true;
} 

// Сохранить документ как
function SaveAsDocument() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }

    var currTitle = editAreaLoader.getCurrFileTitle("SourceCodeTextBox");
    
    if (currTitle == "") {
        InformAboutWarning(noOpenedFile);
    }
    else {
        var currentTabID = editAreaLoader.getCurrentFile(EDIT_AREA_SOURCE_ID).id;
        var currentSavingAsFile = File_GetFileByTabID(currentTabID);      // текущий файл
    
        $get("pageDisableDiv").style.display = "block";
        $get("SaveAsDiv").style.display="block";    // открытие popup-окна сохранения
        $get("NewFileNameBySavingAsEdit").value = currentSavingAsFile.name;
        $get("NewFileNameBySavingAsEdit").focus();
        $get("NewFileNameBySavingAsEdit").select();
        $get("NewFileNameBySavingAsStatusLabel").innerHTML = "Введите имя файла";
    }
}

    // Проверка на то, что имя файла не содержит недопустимых символов
    // ( /, \, :, *, ?, ", <, >, | )
    // Возвращает истину, если все верно
    function CheckFileNameByIncorrectChars(fileName) {
        for (i = 0; i < incorrectChars.length; i++) {
            if (fileName.indexOf(incorrectChars[i]) != -1) {
                return false;
            }
        }
        return true;
    }

// Новое имя файла для сохранить как
var newFileName;

// Выбор сохранение в окне сохранить как
function SaveAsOkButton_Click() {
    newFileName = $get("NewFileNameBySavingAsEdit").value;
    
    if (newFileName == "") {
        alert("Необходимо ввести имя файла!");
        return;
    }
    
    var pointInd = newFileName.indexOf('.');
    if (pointInd == -1) {
        //alert("Имя файла должно содержать расширение!");
        newFileName += pasExt;
        $get("NewFileNameBySavingAsEdit").value = newFileName;
        //return;
    }
    else if (newFileName.slice(pointInd) != '.pas') {
        //alert("Файл должен иметь расширение \".pas\"!");
        newFileName += pasExt;
        $get("NewFileNameBySavingAsEdit").value = newFileName;
        //return;
    }
    else if (pointInd == 0) {
        alert("Имя файла не может состоять только из расширения!");
        return;
    }
    
    if (!CheckFileNameByIncorrectChars(newFileName)) {
        alert(incorrectCharInFileName);
        return;
    }
    
    //Page_Lock();
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofChecking;
    
    $get("NewFileNameBySavingAsStatusLabel").innerHTML = "Идет проверка имени файла...";
    var userDir = (isUser) ? userName + ( (far.currentDir!=MAIN_PATH) ? "/"+far.currentDir : "" ) : currSessionID;
    PageMethods.CheckNewFileName(newFileName, isUser, userDir, CheckNewFileName_CallBack);
}

// Обратный вызов проверки существования файла с заданным именем 
function CheckNewFileName_CallBack(fileExists) {
    //Page_Unlock();
    someProcessIsRunning = false;
    
    $get("NewFileNameBySavingAsStatusLabel").innerHTML = "";
    if (fileExists) {
        if (!confirm("Файл с таким именем уже существует. Хотите перезаписать файл?")) {
            ClosePopup('SaveAsDiv');
            return;
        }
    }
    
    var currTab = editAreaLoader.getCurrentFile(EDIT_AREA_SOURCE_ID);   // текущая вкладка редактора
    var currTabID = currTab.id;                                         // ID текущей вкладки
    var currentFile = File_GetFileByTabID(currTabID);                   // текущий файл
    
    if (currentFile.isPhantom && (currentFile.phantomType == NEW_PHANTOM))
        newFileIsSaved = true;
    
    var forGuest = !isUser && (newFileName == currentFile.fullName);
    var forUser = isUser;
    if (forUser){
        forUser = (far.currentDir + ( (far.currentDir!="") ? "/" : "" ) + newFileName) == currentFile.fullName;
    }
    if (forGuest || forUser){
        SaveDocument();
        ClosePopup("SaveAsDiv");
        return;
    }
    
    currentFile.setStatusClosed();
    if (fileExists){
        var fullNewFileName = (isUser) ? (far.currentDir + ( (far.currentDir!="") ? "/" : "" ) + newFileName) : newFileName;
        var thisFile = File_GetFile(fullNewFileName);
        thisFile.close();                               // если файл был закрыт, ничего страшного, это отслеживается в close
        thisFile.setStatusOpened(currTabID);            // представляем файл открытым в данной вкладке
        thisFile.updateTabTitle();
    }
    else{
        var filesDiv = $get("filesListDiv");
        var filesTable = $get("filesTable");
        
        var newFile = new File(newFileName, (isUser) ? far.currentDir : MAIN_PATH, userName, false);
        EXISTING_FILES.push(newFile);
        if (newFile.isByUser){
            AddUserFileToDiv(newFile.name, filesTable, filesDiv, newFile);
            far.addNewFile(far.currentDir, newFile.name);
        }
        else{
            AddGuestFileToDiv(newFile.name, filesTable, filesDiv, newFile);
            
        }
        newFile.setStatusOpened(currTabID);            // представляем файл открытым в данной вкладке
        newFile.updateTabTitle();
    }
    
    ClosePopup('SaveAsDiv');
    SaveDocument();
}

// Закрытие popup-окна сохранения как
function ClosePopup(popupName) {
    //document.mainForm.onsubmit = function(evt) { return false; }
    $get(popupName).style.display = "none";
    $get("pageDisableDiv").style.display = "none";
}


// ******************************************************************** Закрытие ********************************************************************

// Закрытие документа
function CloseDocument(fileInfo) {
    var currTabID = fileInfo["id"];
    var closingFile = File_GetFileByTabID(currTabID);   // закрываемый файл
    var fileIsEdited = fileInfo["edited"];              // изменен ли файл
    
    if (fileIsEdited) {
        if (confirm("Сохранить файл \"" + closingFile.name +"\" перед закрытием?")) {
            SaveDocument();
        }
    }
    if (closingFile.phantomType == NEW_PHANTOM){
        newFileIsSaved = true;
    }
    
    closingFile.setStatusClosed();
}

// Закрывает все вкладки
function CloseAllTabs(){
    for (cli = 0; cli < EXISTING_FILES.length; ++cli){
        EXISTING_FILES[cli].close();
    }
}


// ******************************************************************* Публикация *******************************************************************

// Краткая информация о публикуемом файле
function PublishingFileDescription(userIP, userName, fileSource, fileDescription){
    this.UserIP = userIP;
    this.UserName = userName;
    this.FileName = "";
    this.FileSource = fileSource;
    this.FileDescription = fileDescription;
}

var publishingFileSource;       // содержимое публикуемого файла

// Нажатие кнопки публикации
function PublishFile() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }

    if (!confirm("Вы уверены, что хотите опубликовать файл?")) {
        return;
    }
    else {
        publishingFileSource = editAreaLoader.getValue("SourceCodeTextBox");
        
        var sourceLength = publishingFileSource.length;
        if (sourceLength > maxPublishingFileSize) {
            InformAboutError(incorrectPublishingFileSize);
            alert(incorrectPublishingFileSize);
        }
        else {
            var curDate = new Date; 
            publishingFileName = curDate.valueOf().toString() + pasExt;
            
            InformAboutNetworkOperation(publishingFileIsCheking);
            var userDir = (isUser) ? userName : currSessionID;
            
            someProcessIsRunning = true;
            fullProcessMessage = inProcess + ofChecking;
            PageMethods.CompilePublishingProgramm(publishingFileSource, isUser, userDir, CompileProgrammForPublishing_CallBack);
        }
        
    }
}

// Обратный вызов компиляции для проверки публикуемогог файла
function CompileProgrammForPublishing_CallBack(response) {
    someProcessIsRunning = false;
    
    if (response.errors != null && response.errors != "") {
        InformAboutError(incorrectPublishingFile);
        alert(incorrectPublishingFile);
    }
    else {
        SetStatusLineHidden();
        //OpenFileDescriptionPopup();
        InformAboutNetworkOperation(fileIsPublishing);
        var publishingFile = new PublishingFileDescription(userIP, userName, 
            publishingFileSource, "");
            
        someProcessIsRunning = true;
        fullProcessMessage = inProcess + ofPublishing;
        if (!userActivityIsFixed){
            userActivityIsFixed = true;
            setActivityCookie();
            PageMethods.PublishProgrammWithUserFixing(publishingFile, userIP, PublishProgramm_CallBack);
        }
        else
            PageMethods.PublishProgramm(publishingFile, PublishProgramm_CallBack);
    }
}
    
    // Открытие окна для ввода описания файла
    function OpenFileDescriptionPopup(){
        $get("pageDisableDiv").style.display = "block";
        $get("ToPublicDiv").style.display="block";      // открытие popup-окна публикации
        $get("FileDescriptionTextarea").value = "";
        $get("NewFileNameBySavingAsEdit").focus();
    }

// Нажатие клавиши публикации
function ToPublicFileButton_Click(){
    var fileDescription = $get("FileDescriptionTextarea").value;
    
    if (fileDescription == "") {
        alert("Необходимо ввести описание файла!");
        return;
    }
    
    ClosePopup('ToPublicDiv');
    InformAboutNetworkOperation(fileIsPublishing);
    var publishingFile = new PublishingFileDescription(userIP, userName, 
        publishingFileSource, fileDescription);
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofPublishing;
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.PublishProgrammWithUserFixing(publishingFile, userIP, PublishProgramm_CallBack);
    }
    else
        PageMethods.PublishProgramm(publishingFile, PublishProgramm_CallBack);
}

// Обратный вызов публикации
function PublishProgramm_CallBack(response) {
    someProcessIsRunning = false;
        
    if (ProcessError(response.ErrorCode))
        return;
    
    var fileName = response.Result;
    var link = wdeHref + fileNameParam + fileName;
    var fileNum = fileName.slice(0, fileName.length-4);
    
    SetStatusLineHidden();

    var publicHyperLink = PublishedFileLink(fileNum);
    var publicLink = GetNewPublicLink(fileName);
    var publicsDiv = $get("PublishedFilesDiv");
    AddLinkToDiv(publicLink, publicsDiv);
    AddLinkToDiv(publicHyperLink, publicsDiv);
    
    collapsePanelOpen('publicationHeaderDiv', 'publicationBodyDiv');
}


// ********************************************************* Загрузка опубликованных файлов *********************************************************

// Нажатие кнопки скачки
function LoadPublishedFile() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    
    $get("pageDisableDiv").style.display = "block";
    $get("PublicationDiv").style.display="block";    // открытие popup-окна
    $get("PublishedFileNumberEdit").disabled = false;
    $get("PublishedFileNumberEdit").value = "";
    $get("PublishedFileNumberEdit").focus();
    $get("PublicationStatusLabel").innerHTML = "Введите номер файла";
}

// Отлов нажатий клавиш в поле ввода номера файла
function PublishedFileNumberEdit_KeyPress(evt) {
    evt = evt || window.event;
    
    if (evt.keyCode == 13) {    // Нажат ввод
        PublishFileButton_Click();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        ClosePopup('PublicationDiv');
        return false;
    }
}

// имя скачиваемого опубликованного файла
var publishedFileName;
// откуда вызвано открытие опубликованного
var publishedOpeningSender;

// При нажатии кнопки загрузить
// sender — если "commandLine", значит имя надо брать
// из командной строки (pFileName)
function PublishFileButton_Click(sender) {
    publishedOpeningSender = sender;
    if (sender == commandLine) {
        InformAboutNetworkOperation(publishedFileIsCheking);
        publishedFileName = pFileName; 
    }
    else {
        $get("PublishedFileNumberEdit").disabled = true;
        $get("PublicationStatusLabel").innerHTML = publishedFileIsCheking;
        publishedFileName = $get("PublishedFileNumberEdit").value + pasExt; 
    }
    
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofChecking;
    PageMethods.CheckPublishedFileName(publishedFileName, CheckPublishedFileName_CallBack);
}

// Обратный вызов проверки существования файла
function CheckPublishedFileName_CallBack(fileExists) {
    someProcessIsRunning = false;
    
    if (!fileExists) {
        if (publishedOpeningSender == commandLine) {
            InformAboutWarning(noPublishedFile);
        }
        else {
            $get("PublishedFileNumberEdit").disabled = false;
            $get("PublishedFileNumberEdit").focus();
            $get("PublicationStatusLabel").innerHTML = noPublishedFile;
        }
    }
    else {
        if (!restrictedMode){       // это только в полноценном режиме
            var fullPublishedFileName = FileNameWithPrefix(CmdParam_GetOwnName(publishedFileName), publicFileType);
            if (isUser)
                fullPublishedFileName = far.currentDir + ((far.currentDir!="") ? "/" : "") + 
                    fullPublishedFileName;
            var publishedFile = File_GetFile(fullPublishedFileName);
            
            if ( (publishedFile != null) && publishedFile.isOpened) {
                ClosePopup("PublicationDiv");
                publishedFile.active();
                return;
            }
        }
        
        if (publishedOpeningSender == commandLine)
            InformAboutNetworkOperation(fileIsLoading);
        else{
            $get("PublicationStatusLabel").innerHTML = fileIsLoading;
        }
        
        someProcessIsRunning = true;
        fullProcessMessage = inProcess + ofLoading;
        PageMethods.GetPublishedFileSource(publishedFileName, GetPublishedFileSource_CallBack);
    }
}

// Обратный вызов загрузки содержимого опубликованного файла
function GetPublishedFileSource_CallBack(sourceFileInfo) {
    someProcessIsRunning = false;
    
    var source = sourceFileInfo.Source;         // содержимое файла
    if (!restrictedMode){                       
        var fileName = CmdParam_GetOwnName(sourceFileInfo.FileName);     // имя файла
        var prefixFileName = FileNameWithPrefix(fileName, publicFileType);
        var fullFileName = prefixFileName;
        if (isUser)
            fullFileName = far.currentDir + ( (far.currentDir!=MAIN_PATH) ? "/" : "" ) + fullFileName;
        
        var phantomFile;
        if (File_IndexOf(fullFileName) == -1){
            phantomFile = new File(prefixFileName, (isUser) ? far.currentDir : MAIN_PATH, userName, true, PUBLIC_PHANTOM);
            EXISTING_FILES.push(phantomFile);
        }
        else{
            phantomFile = File_GetFile(fullFileName);
        }
        phantomFile.open(source);
        
            var curFileNameLinkID = GetSomeFileNameLinkID(fileName, publicFileLinkType);
            var publicLink = $get(curFileNameLinkID);
            /*if (publicLink != "")
                publicLink.style.color = "Blue";*/
    }
    else{                                       // в обрезанном режиме
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, source);
    }
    
    SetStatusLineHidden();
    ClosePopup("PublicationDiv");
}


// ********************************************************** Загрузки расшаренного файла ***********************************************************

// Загрузка общего файла из командной строки
function LoadSharedFileContent() {
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSharedFileLoading;
    InformAboutNetworkOperation(fileIsLoading);
    PageMethods.LoadSharedFileContent(sharedFileName, LoadSharedFileContent_CallBack);
}

// Обратный вызов загрузки содержимого общего файла
function LoadSharedFileContent_CallBack(content){
    someProcessIsRunning = false;
    
    if (content == null) {
        InformAboutWarning(noSharedFile);
    }
    else {
        if (!restrictedMode){
            var lastSlashInd = sharedFileName.lastIndexOf("/");         
            var fileName = (lastSlashInd == -1) ? sharedFileName : sharedFileName.substr(lastSlashInd + 1);
            var prefixFileName = FileNameWithPrefix(fileName, publicFileType);
            var fullFileName = prefixFileName;
            if (isUser)
                fullFileName = far.currentDir + ( (far.currentDir!=MAIN_PATH) ? "/" : "" ) + fullFileName;
            
            var phantomFile;
            if (File_IndexOf(fullFileName) == -1){
                phantomFile = new File(prefixFileName, (isUser) ? far.currentDir : MAIN_PATH, userName, true, PUBLIC_PHANTOM);
                EXISTING_FILES.push(phantomFile);
            }
            else{
                phantomFile = File_GetFile(fullFileName);
            }
            phantomFile.open(content);
            
            var curFileNameLinkID = GetSomeFileNameLinkID(fileName, publicFileLinkType);
            var publicLink = $get(curFileNameLinkID);
        }
        else{                                           // в обрезанном режиме
            editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, content);
        }
        SetStatusLineHidden();
    }
}

// ************************************************************** Управление размером ***************************************************************

// функция "Увеличить размер редактора"
function SizeBiggerCallback() {
    var area = $get("SourceCodeTextBox");
    
    var currHeightStr = area.style.height;
    var currHeight = currHeightStr.slice(0, currHeightStr.length-2);
    
    var newHeight = parseInt(currHeight) + areaHeightStep;
    var newHeightStr = newHeight.toString() + "px"; 
    
    area.style.height = newHeightStr;
    editAreaLoader.changeHeight("SourceCodeTextBox", newHeightStr);
}

// функция "Уменьшить размер редактора"
function SizeSmallerCallback() {
    var area = $get("SourceCodeTextBox");
    
    var currHeightStr = area.style.height;
    var currHeight = currHeightStr.slice(0, currHeightStr.length-2);
    
    var newHeight = parseInt(currHeight) - areaHeightStep;
    if (newHeight < minAreaHeight)
        return;
    var newHeightStr = newHeight.toString() + "px"; 
    
    area.style.height = newHeightStr;
    editAreaLoader.changeHeight("SourceCodeTextBox", newHeightStr);
}


// ****************************************************************** Скачивание файлов ****************************************************************

// Нажатие кнопки скачать откомпилированный файл
function DownloadFile(){
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    
    var currTitle = editAreaLoader.getCurrFileTitle(EDIT_AREA_SOURCE_ID);
    if (currTitle == "") {  // не открыто ни одного файла
        InformAboutWarning(noOpenedFile);
    }
    else{
        var currentTabID = editAreaLoader.getCurrentFile(EDIT_AREA_SOURCE_ID).id;
        var currentWorkFile = File_GetFileByTabID(currentTabID);        // текущий файл
        if (currentWorkFile.isPhantom == true){
            InformAboutWarning(phantomFileForDownload);
            return;
        }
        compile_programm(true);                                         // чтобы после компиляции перейти к процессу скачивания файлв
    }
}

// Скачать уже точно откомпилированный файл
function DownloadCompiledFile(){
    if (currentWorkFile.type == PCU_FILE)
        InformAboutWarning(invalidFileTypeForDownload);
    else{
        var fullRightName = currentWorkFile.fullName;
        fullRightName = fullRightName.substr(0, fullRightName.length - 3) + 
            (currentWorkFile.type == EXE_FILE ? "exe" : "dll");
        var href = location.href + /*usersPath*/ "?download=" + (isUser ? userName : currSessionID) + "/" + fullRightName;
        window.open(href);
    }
}   
