﻿// ******************************************************************** Загрузка ********************************************************************

// имя файла при первой загрузке
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;
        var queryData = new LoadingFirstFileContentQueryData(userName);           // Данные запроса на загрузку первого файла
        // Добавляем информацию о запросе в список
        var currQueryID = GenerateGuid();
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.LOAD_FIRST_FILE, queryData));
        LoadCommandLineFileContent();
    }
    else if (sharedFileName != ""){
        InformAboutNetworkOperation(sharedFileIsLoading);
        var queryData = new LoadingFirstFileContentQueryData(userName);           // Данные запроса на загрузку первого файла
        // Добавляем информацию о запросе в список
        var currQueryID = GenerateGuid();
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.LOAD_FIRST_FILE, queryData));
        LoadSharedFileContent();
    }
    else {
        //if (!isTeacher && !isPupil) {
            // получение первого файла в каталоге из имеющихся
            InformAboutNetworkOperation(areaIsLoading);
            var queryData = new LoadingFirstFileContentQueryData(userName);           // Данные запроса на загрузку первого файла
            // Добавляем информацию о запросе в список
            var currQueryID = GenerateGuid();
            NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
                QueryTypeEnum.LOAD_FIRST_FILE, queryData));
            PageMethods.LoadFirstFileContent(currQueryID, isUser, GetUserID(), isTeacher, isPupil, LoadFirstFileContent_CallBack);
        //}
        //else {
        //    InformAboutWarning("В данном каталоге нет файлов");
        //}
    }
}

/*function testA1(){
    alert(1);
}
function testA2(){
    alert(2);
}

function TestNewBrowser(){
    testVFB = new VirtualFileBrowser("TestVBFDiv", "user", "testVFB");
    testVFB.BrowserTitle = "Тестовый бразуер";
    testVFB.DisplayEmptyBrowser();
    testVFB.OnFileClick = TestFBF_OnFileClick;
    testVFB.OnDirectoryClick = TestFBF_OnDirectoryClick;
    testVFB.OnParentDirectoryClick = TestFBF_OnParentDirectoryClick;
    
    testVFB.OnRenameFileButtonClick = testA1;
    testVFB.OnRemoveFolderButtonClick = testA2;
    
    testVFB.UsedActions = ["rename_file", "remove_file",				
		"download_files", "rename_folder", "remove_folder",
		"new_folder", "br", "br", "share_files", "get_shared_link",
		"unshare_files"];
    
    var ha = [];
    alert(ha["sfsf"]);
    alert(ha["sfsf"]);
    ha["sfsf"] = null;
    alert(ha["sfsf"]);
    var items = new Array();
    items.push(new ItemInfo("add.pas", FileItemTypeEnum.FILE, FileAccessTypeEnum.USUAL));
    items.push(new ItemInfo("summ.pas", FileItemTypeEnum.FILE, FileAccessTypeEnum.SHARED));
    items.push(new ItemInfo("arr.cs", FileItemTypeEnum.FILE, FileAccessTypeEnum.USUAL));
    items.push(new ItemInfo("test", FileItemTypeEnum.DIRECTORY, FileAccessTypeEnum.USUAL));
    testVFB.Load(items);
    //testVFB.Display();
    //alert(112);
    var dir = testVFB.DirsHash;
    //alert(dir["__MAIN_PATH__"].FilesList.length);
    //alert(dir.DirectoriesList.length);
    //alert(dir["test"]);
    var items1 = new Array();
    items1.push(new ItemInfo("add123456789123456.pas", FileItemTypeEnum.FILE, FileAccessTypeEnum.USUAL));
    items1.push(new ItemInfo("summ12345678456.pas", FileItemTypeEnum.FILE, FileAccessTypeEnum.SHARED));
    items1.push(new ItemInfo("arr123456789123456.cs", FileItemTypeEnum.FILE, FileAccessTypeEnum.USUAL));
    items1.push(new ItemInfo("111", FileItemTypeEnum.DIRECTORY, FileAccessTypeEnum.USUAL));
    
    
    //alert(3);
    testVFB.Load(items1, "test");
    //alert(dir["test"]);
    //var i;
    testVFB.Display();
    //alert(4);
    /*alert(testVFB.ParentDirectoryIsLoaded());
    testVFB.OpenParentDirectory();
    //testVFB.LoadParent(items);
    testVFB.Display();
    
    alert(5);
    alert(testVFB.DirectoryIsLoaded("5456"));
    alert(testVFB.DirectoryIsLoaded("test"));
    testVFB.OpenDirectory("test");
    testVFB.Display();
    alert(testVFB.filesCommonCount);
    alert(4);
    testVFB.CurrentDir = "111/222/333";
    testVFB.LoadParent();
    alert(5);
    testVFB.LoadParent();
    alert(6);
    testVFB.LoadParent();
}

function aaa(){
    alert("4");
}*/


/*
// Обратный вызов загрузки первого файла
function LoadDefaultFileContent_CallBack(response) {
    if (ProcessError(response.ErrorCode))
        return;
    
    var fileContent = response.Result;
    OpenNewFile(defaultFileName, fileContent);
    
    SetStatusLineHidden();
}
*/

// Обратный вызов загрузки первого в каталоге файла
function LoadFirstFileContent_CallBack(response) {
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){             // Обрабатываем глобальный ответ
        InformAboutError(LOADING_FIRST_SERVER_ERROR);
        return;
    }
    
    var respData = GetServerQueryResponseData(response);    // собственно результат выполнения запроса
    if (ProcessError(respData.ErrorCode))
        return;
    
    var fileName = respData.FileName; 
    var fileContent = respData.Source;
    if (fileName == "") {
        InformAboutWarning(noFileInDirectory);
        return;
    }
    if (!restrictedMode){                       // версия полноценна
        /*var firstFile = File_GetFile(fileName);
        if (firstFile == null) {                // значит это каталог гостя и загружен дефолтный файл
            firstFile = new File(far, fileName, MAIN_PATH, userName, true, NEW_PHANTOM);
            EXISTING_FILES.push(firstFile);
        }
        firstFile.open(fileContent);*/
        // Это существующий файл
        if (fileName.indexOf("___NEW___") == -1) {     
            EAManager.OpenFile(FileOwnerTypeEnum.USERDATA, fileName, fileContent);
        }
        else {
            fileName = fileName.substr("___NEW___".length);
            EAManager.OpenFile(FileOwnerTypeEnum.NEWFILE, fileName, fileContent);
        }
    }
    else {                                       // в ограниченной версии просто меняем текст
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, fileContent);
    }
    
    SetStatusLineHidden();
}

// Загрузка файла из командной строки
function LoadCommandLineFileContent() {
    PublishFileButton_Click(commandLine);
}


// ***************************************************************** Новый документ *****************************************************************

var defaultTabContentNeed = false;              // Нужно ли записать дефолтное содержание во вкладку
var lastNewFileNumber = 0;                      // последний использованный номер нового файла

var afterNewDocCreatingMethod = null;

// Функция "Новый"
function NewDocument(need, someFuncInTheEnd) {
    afterNewDocCreatingMethod = someFuncInTheEnd;
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    
    if (!restrictedMode){    
        //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, lastNewFileNumber, userIP, CreateNewFile_CallBack);
        }
        else
            PageMethods.CreateNewFile(isUser, userDir, lastNewFileNumber, CreateNewFile_CallBack);*/
        var queryData = new GettingFreeNewFileNameQueryData();           
        var currQueryID = GenerateGuid();
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.GETTING_FREE_NEWFILE_NAME, queryData));
        PageMethods.GetFreeNewFileName(currQueryID, isUser, GetUserID(), isTeacher, isPupil, userVFB.CurrentDir, lastNewFileNumber, GetFreeNewFileName_Callback);
    }
    else{
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, "");
    }
}

// Обратный вызов создания нового файла
/*function CreateNewFile_CallBack(response) {
    //Page_Unlock();
    someProcessIsRunning = false;
    
    if (ProcessError(response.ErrorCode))
        return;
    
    lastNewFileNumber = response.Result.LastNumber;
    var newFileName = response.Result.NewFileName;
    var newFullFileName = (isUser) ? (far.currentDir + ((far.currentDir!="") ? "/" : "") + newFileName) : newFileName;
    var newFile = File_GetFile(newFullFileName);
    if (newFile == null){// TODO
        newFile = new File(far, newFileName, (isUser) ? far.currentDir : MAIN_PATH, userName, true, NEW_PHANTOM);
        EXISTING_FILES.push(newFile);
    }
    
    newFile.open( (defaultTabContentNeed) ? defaultTabContent : "" );
    
    SetStatusLineHidden();
}*/

// Обратный вызов поиска свободного имени файла
function GetFreeNewFileName_Callback(response) {
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 
        InformAboutError(CHECKING_NEW_FNAME_SERVER_ERROR);
        return;
    }
    var newFileData = GetServerQueryResponseData(response); 
    if (newFileData == null) {
        InformAboutError("Нельзя создать файл в этой области");
        return;
    }
    lastNewFileNumber = newFileData.LastNumber;
    var newFileName = newFileData.NewFileName; 
    
    // вызов нового файла был из загрузки шаблона задания
    var fromPT4 = (afterNewDocCreatingMethod != undefined) && (afterNewDocCreatingMethod != null); // PT4
    if (fromPT4)
        newFileName = loadingPT4TaskName + ".pas";
    
    var fullNewFileName = newFileName;
    if (userVFB.CurrentDir != "")
        fullNewFileName = userVFB.CurrentDir + "/" + fullNewFileName;
    EAManager.OpenFile(FileOwnerTypeEnum.NEWFILE, fullNewFileName, (defaultTabContentNeed) ? defaultTabContent : "");
    SetStatusLineHidden();
    
    if (fromPT4)
        afterNewDocCreatingMethod();
}


// ******************************************************************* Сохранение *******************************************************************

// Текущий сохраняемый файл
var currentSavingFile;
// Обрабтан ли в SaveAs новый документ
var newDocumentInSaveAsProcessed = false;      

// ID сохраняемого файла
var currSaveFileTabID;
// Данные сохраняемого файла
var currSaveFileData;

// Новое имя файла для сохранить как
var newFileName;
// Каталог, в который сохраняется новый файл
var newFileDirectory;

var fromSaveAs = false;
// Происходит ли сохранение из сохранить как
var savingFromSaveAs;

// Сохранение документа
function SaveDocument() {
    savingFromSaveAs = fromSaveAs;
    fromSaveAs = false;
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }

    currSaveFileTabID = EAManager.GetCurrFileData().id;
    currSaveFileData = EAManager.TabIDsHash[currSaveFileTabID];
    // ни одного файла не открыто
    if ((currSaveFileData == undefined) || (currSaveFileData == null)) {
        InformAboutWarning(noOpenedFile);
        return;
    }
    // файл примеров, новый, публичный или расшаренный
    var fileIsNotSaved = currSaveFileData.FileOwnerType != FileOwnerTypeEnum.USERDATA;
    // ни разу не сохраненные файлы всегда сохраняем с помощью сохранить как,
    // если зашли сюда первый раз (иначе надо уже сохранять)
    if (fileIsNotSaved && !savingFromSaveAs) {
        SaveAsDocument();
        return;
    }
    
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSaving;
    InformAboutNetworkOperation(fileIsSaving);
    var sourceCode = editAreaLoader.getValue(EDIT_AREA_SOURCE_ID);
    // Данные запроса
    var queryData = new FileSavingQueryData(
        currSaveFileData.FullFileName, "", false);           
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.FILE_SAVING, queryData));
        
    var fname, fdir;
    // если попали сюда из сохранить как
    if (savingFromSaveAs) {       
        fname = newFileName;
        fdir = newFileDirectory;
    }
    else {
        fname = fname_GetShortFileName(currSaveFileData.FullFileName);
        fdir = fname_GetDirectory(currSaveFileData.FullFileName);
    }
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.SaveProgrammWithUserFixing(currQueryID, sourceCode, 
            fname, isUser, GetUserID(), isTeacher, isPupil, fdir, userIP, SaveProgramm_CallBack);
    }
    else {
        PageMethods.SaveProgramm(currQueryID, sourceCode, 
            fname, isUser, GetUserID(), isTeacher, isPupil, fdir, SaveProgramm_CallBack);
    }
    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) && !newDocumentInSaveAsProcessed){
        SaveAsDocument();
        return;
    }
    else    newDocumentInSaveAsProcessed = false;
        
    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;
            }
            
            var queryData = new CheckingNewFileNameQueryData(userName, currentSavingFile.fullName);           // Данные запроса
            // Добавляем информацию о запросе в список
            var currQueryID = GenerateGuid();
            NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
                QueryTypeEnum.CHECKING_NEW_FNAME, queryData));
            // Проверяем, не был ли еще сохранен этот фантомный файл
            PageMethods.CheckNewFileName(currQueryID, currentSavingFile.fullName, 
                currentSavingFile.isByUser, currentSavingFile.ownerName, callbackFunc);
            return;
        }
        
        // Данные запроса
        var queryData = new FileSavingQueryData(currentSavingFile.name, 
            currentSavingFile.path, currentSavingFile.isPhantom);           
        // Добавляем информацию о запросе в список
        var currQueryID = GenerateGuid();
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.FILE_SAVING, queryData));
        
        if (!userActivityIsFixed){
            userActivityIsFixed = true;
            setActivityCookie();
            PageMethods.SaveProgrammWithUserFixing(currQueryID, currentSavingFile.sourceCode, 
                currentSavingFile.fullName, currentSavingFile.isByUser, 
                currentSavingFile.ownerName, userIP, SaveProgramm_CallBack);
        }
        else {
            PageMethods.SaveProgramm(currQueryID, currentSavingFile.sourceCode, 
                currentSavingFile.fullName, currentSavingFile.isByUser, 
                currentSavingFile.ownerName, SaveProgramm_CallBack);
        }
    }*/
}

// Сохранить документ как
function SaveAsDocument() { 
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    currSaveFileTabID = EAManager.GetCurrFileData().id;
    currSaveFileData = EAManager.TabIDsHash[currSaveFileTabID];
    // ни одного файла не открыто
    if ((currSaveFileData == undefined) || (currSaveFileData == null)) {
        InformAboutWarning(noOpenedFile);
        return;
    }

    Page_Lock();
    //$get("pageDisableDiv").style.display = "block";
    $get("SaveAsDiv").style.display = "block";                  // открытие popup-окна сохранения
    $get("NewFileNameBySavingAsStatusLabel").innerHTML = "Введите новое имя файла";
    $get("NewFileNameBySavingAsEdit").value = fname_GetShortFileName(currSaveFileData.FullFileName);
    $get("NewFileNameBySavingAsEdit").focus();
    $get("NewFileNameBySavingAsEdit").select();
}

// Нажатие клавиш в NewFileNameBySavingAsEdit
function SaveAsEdit_OnKeyPress(evt) {
    evt = evt || window.event || Event;
    
    if (evt.keyCode == 13) {        // Нажат ввод
        SaveAsOkButton_Click();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        ClosePopup('SaveAsDiv');
        return false;
    }
    return true;
} 

    // Проверка на то, что имя файла не содержит недопустимых символов
    // ( /, \, :, *, ?, ", <, >, | )
    // Возвращает истину, если все верно
    function CheckFileNameByIncorrectChars(fileName) {
        for (i = 0; i < incorrectChars.length; i++) {
            if (fileName.indexOf(incorrectChars[i]) != -1) {
                return false;
            }
        }
        return true;
    }

// Выбор сохранение в окне сохранить как
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 (allExt.indexOf(newFileName.slice(pointInd)) == -1) 
    { // SSM 9.07.11 хочется компилировать и C#
        alert("Файл должен иметь расширение одного из зарегистрированных типов (.pas, .cs, .fs)");
        //newFileName += pasExt;
        //$get("NewFileNameBySavingAsEdit").value = newFileName;
        return;
    }
    else if (pointInd == 0) {
        alert("Имя файла не может состоять только из расширения!");
        return;
    }
    if (!CheckFileNameByIncorrectChars(newFileName)) {
        alert(incorrectCharInFileName);
        return;
    }
    
    newFileDirectory = userVFB.CurrentDir;
    // Если сохраняем файл с тем же именем и туда же, то как просто вызвали сохранить как
    var oldFDir = fname_GetDirectory(currSaveFileData.FullFileName);
    var oldFName = fname_GetShortFileName(currSaveFileData.FullFileName);
    // файл пользователя
    var fileIsUsered = currSaveFileData.FileOwnerType == FileOwnerTypeEnum.USERDATA;
    if (fileIsUsered && (oldFName == newFileName) && (oldFDir == newFileDirectory)) {
        ClosePopup('SaveAsDiv');
        SaveDocument();
        return;
    }
    
    //Page_Lock();
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofChecking;
    
    var queryData = new CheckingNewFileNameQueryData(userName, newFileName);           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.CHECKING_NEW_FNAME, queryData));
    $get("NewFileNameBySavingAsStatusLabel").innerHTML = "Идет проверка имени файла...";
    PageMethods.CheckNewFileName(currQueryID, newFileName, isUser, GetUserID(), isTeacher, isPupil, newFileDirectory, CheckNewFileName_CallBack);
}

// Обратный вызов проверки существования файла с заданным именем 
function CheckNewFileName_CallBack(response) {
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(CHECKING_NEW_FNAME_SERVER_ERROR);
        ClosePopup('SaveAsDiv');
        return;
    }
    var fileExists = GetServerQueryResponseData(response);      // собственно результат выполнения запроса
    if (fileExists == null) {
        InformAboutError("Нельзя создать файл в этой области");
        return;
    }
    $get("NewFileNameBySavingAsStatusLabel").innerHTML = "";
    if (fileExists) {
        if (!confirm("Файл с таким именем уже существует. Хотите перезаписать файл?"))
            return;
    }

    ClosePopup('SaveAsDiv');
    fromSaveAs = true;
    SaveDocument();
    return;

    /*var currTab = editAreaLoader.getCurrentFile(EDIT_AREA_SOURCE_ID);   // текущая вкладка редактора
    var currTabID = currTab.id;                                         // ID текущей вкладки

    var currentFile = File_GetFileByTabID(currTabID);                   // текущий файл
    
    var forGuest = !isUser && (newFileName == currentFile.fullName);
    var forUser = isUser;
    if (forUser)
        forUser = (far.currentDir + ( (far.currentDir!="") ? "/" : "" ) + newFileName) == currentFile.fullName;
    
    if (forGuest || forUser){
        newDocumentInSaveAsProcessed = true;
        SaveDocument();
        ClosePopup("SaveAsDiv");
        return;
    }

    
    if (fileExists){
        var fullNewFileName = (isUser) ? (far.currentDir + ((far.currentDir != "") ? "/" : "") + newFileName) : newFileName;
        var thisFile = File_GetFile(fullNewFileName);
        if (thisFile == null) { // SSM если сохраняю с расширением, отличным от отображаемого
            alert("Файл не может быть сохранен под именем " + fullNewFileName);
            ClosePopup('SaveAsDiv');
            return;
        }
        currentFile.setStatusClosed();
        thisFile.close();                               // если файл был закрыт, ничего страшного, это отслеживается в close
        thisFile.setStatusOpened(currTabID);            // представляем файл открытым в данной вкладке
        thisFile.updateTabTitle();
    }
    else{
        currentFile.setStatusClosed();
        var filesDiv = $get("filesListDiv");
        var filesTable = $get("filesTable");
        // TODO
        var newFile = new File(far, 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();*/
}

// Обратный вызов сохранения документа
function SaveProgramm_CallBack(response) {
    //Page_Unlock();
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){         // Обрабатываем глобальный ответ
        InformAboutError(SAVING_FILE_SERVER_ERROR);
        return;
    }
    response = GetServerQueryResponseData(response);    // собственно результат выполнения запроса
    if (response == null) {
        InformAboutError("Нельзя создать файл в этой области");
        return;
    }
    if (ProcessError(response.ErrorCode))
        return;
    
    // Если это было обычное сохранение существовавшего файла
    if (!savingFromSaveAs) {
        EAManager.SetFileEditStatusSaved(currSaveFileTabID);  
        currSaveFileTabID = null;
        currSaveFileData = null;
        SetStatusLineHidden();
        return;
    }
    
    var newFullFName = fname_GetFullFileName(newFileDirectory, newFileName);                // новое полное имя файла
    // если файл уже был открыт в редакторе, такой файл надо закрыть (это случится в случае перезаписи)
    if (EAManager.FileIsOpened(FileOwnerTypeEnum.USERDATA, newFullFName)) {
        EAManager.CloseFileInEditor(FileOwnerTypeEnum.USERDATA, newFullFName);
    }
    // надо сначала поменять данные файла в редакторе
    EAManager.ChangeTabFileData(currSaveFileTabID, FileOwnerTypeEnum.USERDATA, newFullFName);
    
    // активен именно тот каталог, в который сохраняем
    if (userVFB.CurrentDir == newFileDirectory) {
        var fileExistsInBrowser = userVFB.ContainsFile(newFileName);
        // если файл уже обозначен в редакторе, ничего не надо делать
        // иначе надо добавить в браузер ссылку на новый файл
        if (!fileExistsInBrowser)
            userVFB.AddNewFile(newFileName);
    }
    
    currSaveFileTabID = null;
    currSaveFileData = null;
    SetStatusLineHidden();
        
    /*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();*/
}

// Обратный вызов проверки существования файла для примера
function CheckNewFileNameForSample_CallBack(response) {
    //Page_Unlock();
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(CHECKING_NEW_FNAME_SERVER_ERROR);
        return;
    }
    var fileExists = GetServerQueryResponseData(response);      // собственно результат выполнения запроса 
    
    if (fileExists) {
        if (!confirm("Файл с таким именем уже существует. Хотите перезаписать файл?")) {
            currentSavingFile.setName(sampleLabel + currentSavingFile.name);
            SetStatusLineHidden();
            return;
        }
    }
    
    //Page_Lock();
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSaving;
    
    // Данные запроса
    var queryData = new FileSavingQueryData(currentSavingFile.name, 
        currentSavingFile.path, true);           
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.FILE_SAVING, queryData));
            
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.SaveProgrammWithUserFixing(currQueryID, currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, userIP, SaveProgramm_CallBack);
    }
    else{
        PageMethods.SaveProgramm(currQueryID, currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, SaveProgramm_CallBack);
    }
}

// Обратный вызов проверки существования файла для опубликованного примера
function CheckNewFileNameForPublic_CallBack(response) {
    //Page_Unlock();
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(CHECKING_NEW_FNAME_SERVER_ERROR);
        return;
    }
    var fileExists = GetServerQueryResponseData(response);      // собственно результат выполнения запроса 
    
    if (fileExists) {
        if (!confirm("Файл с таким именем уже существует. Хотите перезаписать файл?")) {
            currentSavingFile.setName(publicLabel + currentSavingFile.name);
            SetStatusLineHidden();
            return;
        }
    }
    
    //Page_Lock();
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSaving;
    
    // Данные запроса
    var queryData = new FileSavingQueryData(currentSavingFile.name, 
        currentSavingFile.path, true);           
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.FILE_SAVING, queryData));
        
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.SaveProgrammWithUserFixing(currQueryID, currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, userIP, SaveProgramm_CallBack);
    }
    else{
        PageMethods.SaveProgramm(currQueryID, currentSavingFile.sourceCode, 
            currentSavingFile.fullName, currentSavingFile.isByUser, 
            currentSavingFile.ownerName, SaveProgramm_CallBack);
    }
}

// Закрытие popup-окна сохранения как
function ClosePopup(popupName) {
    //document.mainForm.onsubmit = function(evt) { return false; }
    $get(popupName).style.display = "none";
    Page_Unlock();
    //$get("pageDisableDiv").style.display = "none";
}


// ******************************************************************** Закрытие ********************************************************************

// Закрытие документа
function CloseDocument(fileInfo) {
    var currTabID = fileInfo["id"];
    var fileIsEdited = fileInfo["edited"];              // изменен ли файл
    if (fileIsEdited) {
        if (confirm("Сохранить файл \"" + EAManager.TabIDsHash[currTabID].FullFileName + "\" перед закрытием?")) {
            SaveDocument();
        }
    }
    EAManager.CloseFile(currTabID);
    
    /*var closingFile = File_GetFileByTabID(currTabID);   // закрываемый файл
    
    if ((closingFile == undefined) || (closingFile == null)) {
        // тест
        if (fileIsEdited) {
            alert("save");
        }
        EAManager.CloseFile(currTabID);
        return;
    }
    
    if (fileIsEdited) {
        if (confirm("Сохранить файл \"" + closingFile.name +"\" перед закрытием?")) {
            SaveDocument();
        }
    }
    closingFile.setStatusClosed();*/
}

// Закрывает все вкладки
function CloseAllTabs(){
//    for (cli = 0; cli < EXISTING_FILES.length; ++cli){
//        EXISTING_FILES[cli].close();
//    }
    for (var tabID in EAManager.TabIDsHash) {
        if ((EAManager.TabIDsHash[tabID] != undefined) && (EAManager.TabIDsHash[tabID] != null)) {
            var fname = EAManager.TabIDsHash[tabID].FullFileName;
            if (fname == undefined)
                break;
            editAreaLoader.closeFile(EDIT_AREA_SOURCE_ID, tabID);
        }
    }
}


// ******************************************************************* Публикация *******************************************************************

// Краткая информация о публикуемом файле
function PublishingFileDescription(userIP, userName, fileSource, fileExt, fileDescription){
    this.UserIP = userIP;
    this.UserName = userName;
    this.FileName = "";
    this.Ext = fileExt;
    this.FileSource = fileSource;
    this.FileDescription = fileDescription;
}

var publishingFileSource;       // содержимое публикуемого файла
var publishingFileExt;          // расширение

// Нажатие кнопки публикации
function PublishFile() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    var currFileTabID = EAManager.GetCurrFileData().id;
    var currFileData = EAManager.TabIDsHash[currFileTabID];
    // ни одного файла не открыто
    if ((currFileData == undefined) || (currFileData == null)) {
        InformAboutWarning(noOpenedFile);
        return;
    }
    if (!confirm("Вы уверены, что хотите опубликовать файл?")) {
        return;
    }
    else {
        publishingFileSource = editAreaLoader.getValue("SourceCodeTextBox");
        
        var sourceLength = publishingFileSource.length;
        if (sourceLength > maxPublishingFileSize) {
            InformAboutError(incorrectPublishingFileSize);
            alert(incorrectPublishingFileSize);
        }
        else {
            var fullFileName = currFileData.FullFileName;
            var lastPointInd = fullFileName.lastIndexOf(".");
            var ext = fullFileName.substr(lastPointInd); 
            publishingFileExt = ext;
            InformAboutNetworkOperation(publishingFileIsCheking);
            someProcessIsRunning = true;
            fullProcessMessage = inProcess + ofChecking;
            PageMethods.CompilePublishingProgramm(publishingFileSource, ext, isUser, GetUserID(), isTeacher, isPupil, CompileProgrammForPublishing_CallBack);
        }
    }
}

// Обратный вызов компиляции для проверки публикуемогог файла
function CompileProgrammForPublishing_CallBack(response) {
    someProcessIsRunning = false;
    if (response == null) {
        InformAboutError(PUBLISHING_FILE_SERVER_ERROR);
        return;
    }
    if (response.errors != null && response.errors != "") {
        InformAboutError(incorrectPublishingFile);
        alert(incorrectPublishingFile);
    }
    else {
        SetStatusLineHidden();
        //OpenFileDescriptionPopup();
        InformAboutNetworkOperation(fileIsPublishing);
        var publishingFile = new PublishingFileDescription(userIP, userName, 
            publishingFileSource, publishingFileExt, "");
            
        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, publishingFileExt, 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 (response == null) {
        InformAboutError(PUBLISHING_FILE_SERVER_ERROR);
        return;
    }
    if (ProcessError(response.ErrorCode))
        return;
    var fileName = response.Result;
    var link = location.href + fileNameParam + fileName;
    //var fileNum = fileName.slice(0, fileName.length-4);
    SetStatusLineHidden();
    
    var publicHyperLink = publicLink_GetHyperLink(fileName);
    var virtualPublicFile = { Name: fileName, ViewName: fileName, AccessType: FileAccessTypeEnum.USUAL };
    var publicLink = fileItemLink_GetTemplate( publicFilesBrowser, FileItemTypeEnum.FILE, 
        virtualPublicFile ); 
    var publicsDiv = $get("PublishedFilesDiv");
    publicsDiv.appendChild(publicLink);
    publicsDiv.appendChild(document.createElement("br"));
    publicsDiv.appendChild(publicHyperLink);
    collapsePanelOpen('publicationHeaderDiv', 'publicationBodyDiv');
}

function publicLink_GetHyperLink(fileName) {
    var publicHyperLink = document.createElement("a");
    publicHyperLink.href = wdeHref + fileNameParam + fileName;
    publicHyperLink.target = publicFileWindowIDPrefix + fileName;
    publicHyperLink.innerHTML = "(Ссылка на " + fileName + ")";
    publicHyperLink.id = "PUBLISHED_FILE::" + fileName;
    publicHyperLink.style.fontSize = "10px";
    publicHyperLink.style.marginLeft = "20px";
    return publicHyperLink;
}

// Нажатие на кнопку опубликованного файла
function publicFilesBrowser_OnPublishedFileClick(e) {
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    var fullName = target._itemInfo.Name;
    pFileName = fullName;
    PublishFileButton_Click(commandLine);
    /*if (EAManager.FileIsOpened(FileOwnerTypeEnum.PUBLIC, fullName))
        EAManager.ActiveFile(FileOwnerTypeEnum.PUBLIC, fullName);
    else
        EAManager.OpenFile(FileOwnerTypeEnum.PUBLIC, fullName, content);*/
}


// ********************************************************* Загрузка опубликованных файлов *********************************************************

// Нажатие кнопки скачки
function LoadPublishedFile() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    
    Page_Lock();
    $get("PublicationDiv").style.display="block";    // открытие popup-окна
    $get("PublishedFileNumberEdit").disabled = false;
    $get("PublishedFileNumberEdit").value = "";
    $get("PublishedFileNumberEdit").focus();
    $get("PublicationStatusLabel").innerHTML = "Введите имя публичного файла";
}

// Отлов нажатий клавиш в поле ввода номера файла
function PublishedFileNumberEdit_KeyPress(e) {
    evt = e || window.event || 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) {
        publishedFileName = pFileName; 
        InformAboutNetworkOperation(publishedFileIsCheking);
    }
    else {
        publishedFileName = $get("PublishedFileNumberEdit").value; 
        if (publishedFileName == "") {
            alert("Необходимо ввести имя публичного файла!");
            return;
        }
        var pointInd = publishedFileName.indexOf('.');
        if (pointInd == -1) {
            publishedFileName += pasExt;
            $get("PublishedFileNumberEdit").value = publishedFileName;
        }
        else if (allExt.indexOf(publishedFileName.slice(pointInd)) == -1) {
            alert("Файл должен иметь расширение одного из зарегистрированных типов (.pas, .cs, .fs)");
            return;
        }
        else if (pointInd == 0) {
            alert("Имя файла не может состоять только из расширения!");
            return;
        }
        if (!CheckFileNameByIncorrectChars(publishedFileName)) {
            alert(incorrectCharInFileName);
            return;
        }
        $get("PublishedFileNumberEdit").disabled = true;
        $get("PublicationStatusLabel").innerHTML = publishedFileIsCheking;
    }
    
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofChecking;
    var queryData = new CheckingPublicFileNameQueryData(userName, publishedFileName);           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.CHECKING_PUBLIC_FNAME, queryData));
    PageMethods.CheckPublishedFileName(currQueryID, userName, publishedFileName, CheckPublishedFileName_CallBack);
}

// Обратный вызов проверки существования файла
function CheckPublishedFileName_CallBack(response) {
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(CHECKING_PUBLIC_FNAME_SERVER_ERROR);
        return;
    }
    var fileExists = GetServerQueryResponseData(response);      // собственно результат выполнения запроса 
    
    if (!fileExists) {
        if (publishedOpeningSender == commandLine) {
            InformAboutWarning(noPublishedFile);
        }
        else {
            $get("PublishedFileNumberEdit").disabled = false;
            $get("PublishedFileNumberEdit").focus();
            $get("PublicationStatusLabel").innerHTML = noPublishedFile;
        }
    }
    else {
        if (!restrictedMode){       // это только в полноценном режиме
            if (EAManager.FileIsOpened(FileOwnerTypeEnum.PUBLIC, publishedFileName)) {
                EAManager.ActiveFile(FileOwnerTypeEnum.PUBLIC, publishedFileName);
                ClosePopup("PublicationDiv");
                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;
    if (sourceFileInfo == null) {
        InformAboutError(LOADING_PUBLIC_SOURCE_SERVER_ERROR);
        return;
    }
    var source = sourceFileInfo.Source;         // содержимое файла
    if (!restrictedMode){                       
        EAManager.OpenFile(FileOwnerTypeEnum.PUBLIC, publishedFileName, source);
    }
    else {                                       // в обрезанном режиме
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, source);
    }
    SetStatusLineHidden();
    ClosePopup("PublicationDiv");
}


// ********************************************************** Загрузки расшаренного файла ***********************************************************

// Нажатие кнопочки загрузки общего файла
function LoadSharedFile() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    Page_Lock();
    $get("DivLoadShared").style.display="block";    // открытие popup-окна
    $get("TextSharedUserName").value = "";
    $get("TextSharedDirName").value = "";
    $get("TextSharedFileName").value = "";
    $get("TextSharedUserName").focus();
    $get("LabelLoadSharedStatus").innerHTML = "введите данные общего файла файла";
}

    // Проверка на то, что имя Каталога не содержит недопустимых символов
    // ( \, :, *, ?, ", <, >, | )
    // Возвращает истину, если все верно
    function CheckDirNameByIncorrectChars(dirName) {
        for (i = 0; i < incorrectDirChars.length; i++) {
            if (dirName.indexOf(incorrectDirChars[i]) != -1) {
                return false;
            }
        }
        return true;
    }

function SharedFileData_KeyPress(e) {
    evt = e || window.event || Event;
    if (evt.keyCode == 13) {        // Нажат ввод
        EnterSharedFileData();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        ClosePopup('DivLoadShared');
        return false;
    }
}

// Ввести данные общего файла
function EnterSharedFileData() {
    var uname = $get("TextSharedUserName").value; 
    var dname = $get("TextSharedDirName").value; 
    var fname = $get("TextSharedFileName").value; 
    if (uname == "") {
        alert("Необходимо ввести имя пользователя!");
        return;
    }
    else {
        if (!CheckFileNameByIncorrectChars(uname)) {
            alert("Недопустимые символы в имени пользователя!");
            return;
        }
    }
    if (dname != "") {
        if (!CheckDirNameByIncorrectChars(dname)) {
            alert(incorrectCharInDirName);
            return;
        }
        if (dname[dname.length-1] == "/") {
            dname = dname.substr(0, dname.length-1);
            $get("TextSharedDirName").value = dname;
        }
    }
    if (fname == "") {
        alert("Необходимо ввести имя общего файла!");
        return;
    }
    var pointInd = fname.indexOf('.');
    if (pointInd == -1) {
        fname += pasExt;
        $get("TextSharedFileName").value = fname;
    }
    else if (allExt.indexOf(fname.slice(pointInd)) == -1) {
        alert("Файл должен иметь расширение одного из зарегистрированных типов (.pas, .cs, .fs)");
        return;
    }
    else if (pointInd == 0) {
        alert("Имя файла не может состоять только из расширения!");
        return;
    }
    if (!CheckFileNameByIncorrectChars(fname)) {
        alert(incorrectCharInFileName);
        return;
    }
    $get("LabelLoadSharedStatus").innerHTML = "загрузка общего файла...";
    // может файл уже открыт
    var fullSharedName = (dname != "") ? (dname + "/" + fname) : fname;
    // заменим ///// на / везде в строке
    var slashReg = new RegExp('\/+', 'g');
    fullSharedName = fullSharedName.replace(slashReg, "/");
    // Если файл открыт, то просто активируем его
    if (EAManager.FileIsOpened(FileOwnerTypeEnum.SHARED, fullSharedName)) {
        EAManager.ActiveFile(FileOwnerTypeEnum.SHARED, fullSharedName);
        ClosePopup('DivLoadShared');
        return;
    }
    sharedFileName = uname + "/";
    sharedFileName += fullSharedName;
    LoadSharedFileContent();
}

// Загрузка общего файла из командной строки
function LoadSharedFileContent() {
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSharedFileLoading;
    InformAboutNetworkOperation(fileIsLoading);
    // заменим ///// на / везде в строке
    var slashReg = new RegExp('\/+', 'g');
    sharedFileName = sharedFileName.replace(slashReg, "/");
    PageMethods.LoadSharedFileContent(sharedFileName, LoadSharedFileContent_CallBack);
}

// Обратный вызов загрузки содержимого общего файла
function LoadSharedFileContent_CallBack(content){
    someProcessIsRunning = false;
    if (content == null) {
        InformAboutWarning(noSharedFile);
        $get("LabelLoadSharedStatus").innerHTML = "файл общего доступа не найден";
    }
    else {
        var ind = content.indexOf("*");
        sharedFileName = content.substr(0, ind);
        content = content.substr(ind + 1);
        if (!restrictedMode){       
            var ind = sharedFileName.indexOf("/");
            var fName = sharedFileName.substr(ind + 1);           
            EAManager.OpenFile(FileOwnerTypeEnum.SHARED, fName, content);
        }
        else {                                       // в обрезанном режиме
            editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, content);
        }
        SetStatusLineHidden();
        ClosePopup('DivLoadShared');
    }
}

// ************************************************************** Управление размером ***************************************************************

// функция "Увеличить размер редактора"
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 currFileTabID = EAManager.GetCurrFileData().id;
    var currFileData = EAManager.TabIDsHash[currFileTabID];
    // ни одного файла не открыто
    if ((currFileData == undefined) || (currFileData == null)) {
        InformAboutWarning(noOpenedFile);
        return;
    }
    compile_programm(true);                                         // чтобы после компиляции перейти к процессу скачивания файла
}

// Скачать уже точно откомпилированный файл
function DownloadCompiledFile() {
    if (currentWorkFile.type == PCU_FILE)
        InformAboutWarning(invalidFileTypeForDownload);
    else {
        var fullRightName;
        // если файл наш, то он расположен по полному пути, иначе в основном каталоге
        if (currentWorkFile.IsOwn)
            fullRightName = currentWorkFile.FullName;
        else
            fullRightName = currentWorkFile.ShortName;
        var lastPointInd = fullRightName.lastIndexOf(".");
        var ext = fullRightName.substr(lastPointInd + 1);
        fullRightName = fullRightName.substr(0, fullRightName.length - ext.length) + 
            (currentWorkFile.type == EXE_FILE ? "exe" : "dll");
        var href = location.href + /*usersPath*/ "?download=" + GetUserID() + "/" + fullRightName;
        window.open(href);
    }
}   

