﻿// -------------------------- Чекбоксы файлов

// Добавляет checkBox fileheckBox в список
function AddNewFileCheckBox(fileheckBox){
    filesCheckBoxList.push(fileheckBox);
}

// Удаляет checkBox fileheckBox из списка
function DeleteFileCheckBox(fileheckBox){
    var currInd = IndexOfFileName(fileheckBox);
    filesCheckBoxList.splice(currInd, 1);
}


// Возвращает полное имя файла по id checkbox'а
function GetFullFileNameByCheckBoxID(checkBoxID){
    fileNameBegin = userFileCheckBoxIDPrefix.length;
    return checkBoxID.slice(fileNameBegin);
}

// Возвращает имя файла по id checkbox'а
function GetFileNameByCheckBoxID(checkBoxID){
    var fileNameBegin = checkBoxID.lastIndexOf("/") + 1;
    if (fileNameBegin == 0)
        fileNameBegin = userFileCheckBoxIDPrefix.length;
    return checkBoxID.slice(fileNameBegin);
}

// -------------------------- Чекбоксы каталогов

// Добавляет checkBox folderCheckBox в список
function AddNewFolderCheckBox(folderCheckBox){
    foldersCheckBoxList.push(folderCheckBox);
}

// Удаляет checkBox folderCheckBox из списка
function DeleteFolderCheckBox(folderCheckBox){
    var currInd = 0;
    for (fcbi = 0; fcbi < foldersCheckBoxList.length; ++fcbi)
        if (foldersCheckBoxList[fcbi] == folderCheckBox){
            currInd = fcbi;
            break;
        }
    foldersCheckBoxList.splice(currInd, 1);
}

// Возвращает полное имя каталога по id checkbox'а
function GetFullFolderNameByCheckBoxID(folderCheckBoxID){
    folderNameBegin = userDirectoryCheckBoxIDPrefix.length;
    return folderCheckBoxID.slice(folderNameBegin);
}

// Возвращает имя каталога по id checkbox'а
function GetFolderNameByCheckBoxID(folderCheckBoxID){
    var folderNameBegin = folderCheckBoxID.lastIndexOf("/") + 1;
    if (folderNameBegin == 0)
        folderNameBegin = userDirectoryCheckBoxIDPrefix.length;
    return folderCheckBoxID.slice(folderNameBegin);
}

// *************************************************************** Открывающиеся панели *************************************************************

// Открытие справки
function PascalHelpLinkButton_Click() {
    $get("PascalHelpLinkButton").target = "pabcHelpWindow" + helpWindowIndex.toString();
    helpWindowIndex += 1;
}

// Открытие FAQ
function FAQLinkButton_Click() {
    $get("FAQLinkButton").target = "faqWindow" + faqWindowIndex.toString();
    faqWindowIndex += 1;
}

// Открытие wde справки
function WdeHelpLinkButton_Click() {
    $get("WdeHelpLinkButton").target = "wdeHelpWindow" + wdeHelpWindowIndex.toString();
    wdeHelpWindowIndex += 1;
}


// Индекс окна faq
var faqWindowIndex = 0;
// Индекс окна помощи
var helpWindowIndex = 0;
// Индекс окна wde помощи
var wdeHelpWindowIndex = 0;


// --------------------------------------- Вспомогательные функции

// Устанавливает стиль заголовка элемента
function SetElementStyle(elemID, styleName) {
    $get(elemID).className = styleName;
}



// ******************************************************************* Авторизация ******************************************************************

// Нажатие кнопки входа/выхода
function AuthorizationButton_Click(){
    $get("ButtonRefreshSession").style.visibility = "hidden";               // прячем кнопку возобновления сессии
    var authButton = $get("AuthorizationButton");
    var authButtonText = authButton.value;
    
    userName = $get("UserNameHiddenField").value;
    if (isUser == (userName != Guest)){     // если мы попали сюда в результате возобновления сессии, то ничего не надо делать
        SetStatusLineHidden();
        someProcessIsRunning = false;
        return;
    }
    isUser = userName != Guest;
    if (isUser) {
        isAdmin = $get('HiddenFieldIsAdmin').value == TRUE_VAL;
        isTeacher = $get('HiddenFieldIsTeacher').value == TRUE_VAL;
        isPupil = $get('HiddenFieldIsPupil').value == TRUE_VAL;
    }
    else {
        isAdmin = isTeacher = isPupil = false;
    }
    
    // учебная панель видна только тем, кто имеет отношение к обучению
    $get('DivLearningPanelLinkButton').style.display = (isPupil || isTeacher) ? "block" : "none";
    
    CloseAllTabs();
    
    /*
    EXISTING_FILES = new Array();           // создаем новый список файлов
    filesCheckBoxList = new Array();*/
    if (authButtonText == loginText)
        Logout();
    else // logoutText
        Login();
    
    LoadUserFilesBrowser();
    LoadSampleBrowser();
    
    // получение первого файла в каталоге из имеющихся
    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);
    SetStatusLineHidden();
}

// Выполнить вход
function Login() {
    $get("GuestModeLabel").style.display = "none";
    /*RemoveFileLinkes();
    EXISTING_FILES = new Array();
    LoadUsersFilesTable();*/
    //LoadSampleBrowser();
}
// Выполнить выход
function Logout(){
    $get("GuestModeLabel").style.display = "block";
    /*if (far != null)
        far.removeFarTable();
    $get("filesActionsDiv").style.display = "none";
    CloseRenameDiv();  
    CloseNewFolderDiv();
    CloseRenameFolderDiv(true);
    EXISTING_FILES = new Array();
    EXISTING_DIRS = new Array();
    LoadUsersFilesList();*/
    //LoadSampleBrowser();
}

// Удаление старого списка файлов
function RemoveFileLinkes(){
    /*var filesDiv = $get("filesListDiv");
    var filesTable = $get("filesTable");
    filesDiv.removeChild(filesTable);*/
    /* было до того, как список файло заменили на таблицу
    
    var allChilds = filesDiv.getElementsByTagName("*");
    // удаление начинаем с 1 элемента, т.к. 0 - это
    // метка "Файлы текущего сеанса"
    while (allChilds.length > 0){
        // ссылки на файлы имеют id, поэтому можно удалять по ним,
        // а остальные элементы (т.е. br) удаляем по индексу
        var elemID = filesDiv.childNodes[1].id;
        if ( (elemID != undefined) && (elemID != "") )
            filesDiv.removeChild($get(elemID));
        else   
            filesDiv.removeChild(filesDiv.childNodes[1]);
    }*/
}
/*
// Удаление таблицы файлов пользователя
function RemoveFileTables(){
    var filesDiv = $get("filesListDiv");
    var filesTable = $get("filesTable");
    filesDiv.removeChild(filesTable);
    $get("filesActionsDiv").style.display = "none";
    CloseRenameDiv();   
}*/



// *************************************************************** Управление файлами ***************************************************************

// Загружает браузер файлов пользователя
function LoadUserFilesBrowser() {
    ClearChilds("DivUserFiles");
    userVFB = new VirtualFileBrowser("DivUserFiles", userName, "userVFB");
    userVFB.BrowserTitle = (isTeacher || isPupil) ? "" : "Мои файлы";
    userVFB.DisplayEmptyBrowser();

    userVFB.OnFileClick = userVFB_OnFileClick;
    
    if (isUser) {
        userVFB.UsedActions = ["rename_file", "remove_file",				
		    "download_files", "remove_folder", "rename_folder",
		    "new_folder", "br", "br", "share_files", "get_shared_link",
		    "unshare_files"];
		userVFB.OnDirectoryClick = userVFB_OnDirectoryClick;
        userVFB.OnParentDirectoryClick = userVFB_OnParentDirectoryClick;
        
        userVFB.OnRenameFileButtonClick = userVFB_OnRenameFileButtonClick;
        userVFB.OnRemoveFileButtonClick = userVFB_OnRemoveFileButtonClick;
        userVFB.OnDownloadFilesButtonClick = userVFB_OnDownloadFilesButtonClick;
        userVFB.OnRenameFolderButtonClick = userVFB_OnRenameFolderButtonClick;
        userVFB.OnRemoveFolderButtonClick = userVFB_OnRemoveFolderButtonClick;
        userVFB.OnNewFolderButtonClick = userVFB_OnNewFolderButtonClick;
        userVFB.OnShareFilesButtonClick = userVFB_OnShareFilesButtonClick;
        userVFB.OnGetSharedLinkButtonClick = userVFB_OnGetSharedLinkButtonClick;
        userVFB.OnUnshareFilesButtonClick = userVFB_OnUnshareFilesButtonClick;
    }
    userVFB_StartLoading();
}

function userVFB_GetActionsAndCheckByRules(rules) {
    var actions = new Array();
    var filesRules = rules.FilesRules;
    var dirRules = rules.DirectoryRules;
    
    if (filesRules.Write) {
        actions.push("rename_file");
        actions.push("remove_file");
    }
    if (filesRules.Read && dirRules.Read) {
        actions.push("download_files");
    }
    if (dirRules.Write) {
        actions.push("remove_folder");
        actions.push("rename_folder");
        actions.push("new_folder");
    }
    if (filesRules.Share && dirRules.Share) {
        actions.push("br");
        actions.push("br");
        actions.push("share_files");
        actions.push("get_shared_link");
        actions.push("unshare_files");
    }
    return { Actions: actions, CanCheck: filesRules.CanCheck };
}

// Начало загрузки пользовательских файлов
function userVFB_StartLoading() {
    var currQueryID = GenerateGuid();
    var queryData;
    userVFB._a_dirName = (isTeacher || isPupil) ? "Личные файлы" : "";
    if (isUser) {
        var queryData = new LoadingUserFileItemsQueryData(userName);           
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.LOADING_USER_FILE_ITEMS_LIST, queryData));
        userVFB.SetStatusInfo("load...");
        PageMethods.GetUserItems(currQueryID, userName, userVFB._a_dirName, isTeacher, isPupil, GetUserItems_Callback);
    }
    else {
        var queryData = new LoadingSessionFileNamesQueryData();           
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.LOADING_SESSION_FILES_LIST, queryData));
        userVFB.SetStatusInfo("load...");
        PageMethods.GetGuestItems(currQueryID, currSessionID, GetGuestItems_Callback);
    }
}

// Обратный вызов получения списка файлов/каталогов пользователя
function GetUserItems_Callback(response) {
    userVFB.SetStatusInfo("");
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(LOADING_USER_FILE_ITEMS_SERVER_ERROR);
        return;
    }
    var result = GetServerQueryResponseData(response);       // собственно результат выполнения запроса
    var userItems = result.UserItems;
    var dirIsShared = result.DirIsShared;
    var rules = result.Rules;
    var actsCheck = userVFB_GetActionsAndCheckByRules(rules);
    userVFB.UsedActions = actsCheck.Actions;
    //userVFB.Load(userItems, userVFB._a_dirName, dirIsShared);
    //userVFB.Display(/*!actsCheck.CanCheck*/);
    
    userVFB.Load(userItems, userVFB._a_dirName, dirIsShared);
    userVFB.Display(!actsCheck.CanCheck);
}

// Обратный вызов получения списка файлов/каталогов гостя
function GetGuestItems_Callback(response) {
    userVFB.SetStatusInfo("");
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(LOADING_SESSION_FILES_SERVER_ERROR);
        return;
    }
    var userItems = GetServerQueryResponseData(response);       // собственно результат выполнения запроса
    userVFB.Load(userItems);
    userVFB.Display(true);
}

// Нажатие на файл пользователя/гостя
function userVFB_OnFileClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    var fullFileName = userVFB.GetFullFileName(target._itemInfo);
    userVFB_OnFullFileNameClick(fullFileName, target._itemInfo.Name);
}

// Вспомогательный метод открытия файла
function userVFB_OnFullFileNameClick(fullFileName, fileName) {
    userVFB._a_fileName = fullFileName;
    
    // Если файл открыт, то просто активируем его
    if (EAManager.FileIsOpened(FileOwnerTypeEnum.USERDATA, fullFileName)) {
        EAManager.ActiveFile(FileOwnerTypeEnum.USERDATA, fullFileName);
        return;
    }
    
    var queryData = new FileSourceLoadingQueryData(fileName, userVFB.CurrentDir);            
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.FILE_SOURCE_LOADING, queryData));
    userVFB.SetStatusInfo("load...");
    if (isUser) {
        PageMethods.GetRegUserFileSource(currQueryID, userName, fullFileName, isTeacher, isPupil, GetRegUserFileSource_Callback);
    }
    else {
        PageMethods.GetGuestFileSource(currQueryID, currSessionID, fullFileName, GetGuestFileSource_Callback);
    }
}

    // Обратный вызов загрузки содержимого файла зарегистрированного пользователя
    function GetRegUserFileSource_Callback(response) {
        userVFB.SetStatusInfo("");
        if (!ProcessServerQueryResponse(response)){                 
            InformAboutError(LOADING_USER_SOURCE_SERVER_ERROR);
            return;
        }
        var content = GetServerQueryResponseData(response);         
        EAManager.OpenFile(FileOwnerTypeEnum.USERDATA, userVFB._a_fileName, content);
    }
    
    // Обратный вызов загрузки содержимого файла гостя
    function GetGuestFileSource_Callback(response) {
        userVFB.SetStatusInfo("");
        if (!ProcessServerQueryResponse(response)){                 
            InformAboutError(LOADING_GUEST_SOURCE_SERVER_ERROR);
            return;
        }
        var content = GetServerQueryResponseData(response);         
        EAManager.OpenFile(FileOwnerTypeEnum.USERDATA, userVFB._a_fileName, content);
    }

// Нажатие на каталог в списке пользовательских файлов
function userVFB_OnDirectoryClick(e) {
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    var currDir = target._itemInfo;
    var fullCurrDirName = userVFB.GetFullDirectoryName(currDir);
    userVFB._a_dirName = currDir.Name;
    
    var currQueryID = GenerateGuid();
    var queryData = new LoadingUserFileItemsQueryData(userName);           
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.LOADING_USER_FILE_ITEMS_LIST, queryData));
    userVFB.SetStatusInfo("load...");
    PageMethods.GetUserItems(currQueryID, userName, fullCurrDirName, isTeacher, isPupil, GetUserItems_Callback);
}

// Нажатие на родительскую папку пользовательских файлов
function userVFB_OnParentDirectoryClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    /*if (userVFB.ParentDirectoryIsLoaded()) {
        userVFB.OpenParentDirectory();
        userVFB.Display();
    }
    else */{
        var currQueryID = GenerateGuid();
        var queryData = new LoadingUserFileItemsQueryData(userName);           
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.LOADING_USER_FILE_ITEMS_LIST, queryData));
        userVFB.SetStatusInfo("load...");/*alert(userVFB.getFullParentDirName());*/
        PageMethods.GetUserItems(currQueryID, userName, userVFB.getFullParentDirName(), isTeacher, isPupil, userVFB_GetParentDirUserItems_Callback);
    }
}

// Обратный вызов получения списка файлов/каталогов в надкаталоге пользовательского раздела
function userVFB_GetParentDirUserItems_Callback(response) {
    userVFB.SetStatusInfo("");
    if (!ProcessServerQueryResponse(response)){                 
        InformAboutError(LOADING_USER_FILE_ITEMS_SERVER_ERROR);
        return;
    }
    var result = GetServerQueryResponseData(response);       // собственно результат выполнения запроса
    var userItems = result.UserItems;
    var dirIsShared = result.DirIsShared;
    var rules = result.Rules;
    var actsCheck = userVFB_GetActionsAndCheckByRules(rules);
    userVFB.UsedActions = actsCheck.Actions;
    //userVFB.Load(userItems, dirIsShared);
    //userVFB.Display(/*!actsCheck.CanCheck*/);
 
    userVFB.LoadParent(userItems, dirIsShared);
    userVFB.Display(!actsCheck.CanCheck);
}


// **************************************************************** Тестовый браузер ****************************************************************

function TestFBF_OnFileClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    var fullName = testVFB.GetFullFileName(target._itemInfo);
    //alert("file::" + fullName/*target.innerHTML*/);
    var viewName = viewName_GetFileName(fullName, 20);
    //alert(viewName);
    var content = fullName + "\n" + viewName;
    //alert(content);
    if (EAManager.FileIsOpened(FileOwnerTypeEnum.USERDATA, fullName))
        EAManager.ActiveFile(FileOwnerTypeEnum.USERDATA, fullName);
    else
        EAManager.OpenFile(FileOwnerTypeEnum.USERDATA, fullName, content);
}

function TestFBF_OnDirectoryClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;alert(target._itemInfo.Name);
    //alert("dir::" + testVFB.GetFullDirectoryName(target._itemInfo)/*target.innerHTML*/);
    testVFB.OpenDirectory(target._itemInfo.Name);
    testVFB.Display();
}

function TestFBF_OnParentDirectoryClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    testVFB.OpenParentDirectory();
    testVFB.Display();
    //alert("parent");
}



// ************************************************************ Скачивание исходных-файлов **********************************************************

var checkedForDownloadFiles;
var checkedForDownloadFolders;
var currForDownloadDir;

// При нажатии кнопки скачать pas-файлы
function userVFB_OnDownloadFilesButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    checkedForDownloadFiles = userVFB.GetCheckedFilesList();
    checkedForDownloadFolders = userVFB.GetCheckedDirsList();
    if (checkedForDownloadFolders.length == 0 && checkedForDownloadFiles.length == 0) {
        alert("Не выбраны файлы (или папки) для скачивания");
        return;
    }
    // формируем массивы имен файлов и папок
    var fileNames = new Array();
    var dirNames = new Array(); 
    var i = 0;
    for (i = 0; i < checkedForDownloadFiles.length; ++i)
        fileNames.push(checkedForDownloadFiles[i].Link._itemInfo.Name);
    for (i = 0; i < checkedForDownloadFolders.length; ++i)
        dirNames.push(checkedForDownloadFolders[i].Link._itemInfo.Name);    
    InformAboutNetworkOperation(filesAreDownloading);
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofDownloading;
    currForDownloadDir = userVFB.CurrentDir;
    PageMethods.DownloadUserFiles(userName, isTeacher, isPupil, userVFB.CurrentDir, fileNames, dirNames, DownloadUserFiles_Callback);
}

// Завершение загрузки файлов
function DownloadUserFiles_Callback(zipFileName){
    someProcessIsRunning = false;
    if (zipFileName == null) {
        InformAboutError(LOADING_FILE_SOURCES_SERVER_ERROR);
        return;
    }
    //zipFileName = fname_GetFullFileName(currForDownloadDir, zipFileName);
    linkBoxPairs_TurnOffCheckboxes(checkedForDownloadFiles);
    linkBoxPairs_TurnOffCheckboxes(checkedForDownloadFolders);
    SetStatusLineHidden();
    var href = location.href + "?download=" + userName + "/" + zipFileName;
    window.open(href);                                  // Откроем окно с загрузкой
}



// ******************************************************************* Расшаривание *****************************************************************

var checkedSharingFiles;
var checkedSharingFolders;
var currSharingDir;
var sharedFileNames;
var sharedDirNames;

// При нажатии кнопки расшарить файлы
function userVFB_OnShareFilesButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    checkedSharingFiles = userVFB.GetCheckedFilesList();
    checkedSharingFolders = userVFB.GetCheckedDirsList();
    if (checkedSharingFiles.length == 0 && checkedSharingFolders.length == 0) {
        alert("Не выбраны файлы (или папки) для  открытия общего доступа");
        return;
    }
    // формируем массивы имен файлов и папок
    var fileNames = new Array();
    var dirNames = new Array(); 
    var i = 0;
    for (i = 0; i < checkedSharingFiles.length; ++i)
        if (checkedSharingFiles[i].Link._itemInfo.AccessType == FileAccessTypeEnum.SHARED)
            checkedSharingFiles[i].Checkbox.checked = false;
        else 
            fileNames.push(checkedSharingFiles[i].Link._itemInfo.Name);
    for (i = 0; i < checkedSharingFolders.length; ++i)
        if (checkedSharingFolders[i].Link._itemInfo.AccessType == FileAccessTypeEnum.SHARED)
            checkedSharingFolders[i].Checkbox.checked = false;
        else
            dirNames.push(checkedSharingFolders[i].Link._itemInfo.Name); 
    if (fileNames.length == 0 && dirNames.length == 0) {
        alert("Не выбраны файлы (или папки) для  открытия общего доступа");
        return;
    } 
    if (!confirm("Вы уверены, что хотите открыть общий доступ к выбранным файлам (папкам)?")){
        linkBoxPairs_TurnOffCheckboxes(checkedSharingFiles);
        linkBoxPairs_TurnOffCheckboxes(checkedSharingFolders);
        return;
    }  
    sharedFileNames = fileNames;
    sharedDirNames = dirNames;
    currSharingDir = userVFB.CurrentDir;
    InformAboutNetworkOperation(filesAreSharing);
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSharing;
    PageMethods.ShareUserFiles(userName, isTeacher, isPupil, currSharingDir, fileNames, dirNames, ShareUserFiles_Callback);
}

// Обратный вызов удаления файлов
function ShareUserFiles_Callback(success){
    someProcessIsRunning = false;
    if (success == null){                   // Значит произошла ошибка при расшаривании
        InformAboutError(SHARING_SERVER_ERROR);
        return;
    }
    if (!success) {
        InformAboutError(sharingFilesError);
        return;
    }
    if (currSharingDir != userVFB.CurrentDir) {
        SetStatusLineHidden();
        return;
    }
    var i = 0;
    for (i = 0; i < sharedFileNames.length; ++i)
        userVFB.ShareFile(sharedFileNames[i]);
    for (i = 0; i < sharedDirNames.length; ++i) {
        userVFB.ShareFolder(sharedDirNames[i]); }
    linkBoxPairs_TurnOffCheckboxes(checkedSharingFiles);
    linkBoxPairs_TurnOffCheckboxes(checkedSharingFolders);
    SetStatusLineHidden();   
}

// При нажатии кнопки зашарить файлы
function userVFB_OnUnshareFilesButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    checkedSharingFiles = userVFB.GetCheckedFilesList();
    checkedSharingFolders = userVFB.GetCheckedDirsList();
    if (checkedSharingFiles.length == 0 && checkedSharingFolders.length == 0) {
        alert("Не выбраны файлы (или папки) для  закрытия общего доступа");
        return;
    }
    // формируем массивы имен файлов и папок
    var fileNames = new Array();
    var dirNames = new Array(); 
    var i = 0;
    for (i = 0; i < checkedSharingFiles.length; ++i)
        if (checkedSharingFiles[i].Link._itemInfo.AccessType != FileAccessTypeEnum.SHARED)
            checkedSharingFiles[i].Checkbox.checked = false;
        else 
            fileNames.push(checkedSharingFiles[i].Link._itemInfo.Name);
    for (i = 0; i < checkedSharingFolders.length; ++i) 
        if (checkedSharingFolders[i].Link._itemInfo.AccessType != FileAccessTypeEnum.SHARED)
            checkedSharingFolders[i].Checkbox.checked = false;
        else
            dirNames.push(checkedSharingFolders[i].Link._itemInfo.Name); 
    if (fileNames.length == 0 && dirNames.length == 0) {
        alert("Не выбраны файлы (или папки) для  закрытия общего доступа");
        return;
    } 
    if (!confirm("Вы уверены, что хотите закрыть общий доступ к выбранным файлам (папкам)?")){
        linkBoxPairs_TurnOffCheckboxes(checkedSharingFiles);
        linkBoxPairs_TurnOffCheckboxes(checkedSharingFolders);
        return;
    }  
    sharedFileNames = fileNames;
    sharedDirNames = dirNames;
    currSharingDir = userVFB.CurrentDir;
    InformAboutNetworkOperation(filesAreSharing);
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofSharing;
    PageMethods.UnshareUserFiles(userName, isTeacher, isPupil, currSharingDir, fileNames, dirNames, UnshareUserFiles_Callback);
}

// Обратный вызов удаления файлов
function UnshareUserFiles_Callback(success){
    someProcessIsRunning = false;
    if (success == null){                   // Значит произошла ошибка при расшаривании
        InformAboutError(unsharingFilesError);
        return;
    }
    if (!success) {
        InformAboutError(unsharingFilesError);
        return;
    }
    if (currSharingDir != userVFB.CurrentDir) {
        SetStatusLineHidden();
        return;
    }
    var i = 0;
    for (i = 0; i < sharedFileNames.length; ++i)
        userVFB.UnshareFile(sharedFileNames[i]);
    for (i = 0; i < sharedDirNames.length; ++i)
        userVFB.UnshareFolder(sharedDirNames[i]); 
    linkBoxPairs_TurnOffCheckboxes(checkedSharingFiles);
    linkBoxPairs_TurnOffCheckboxes(checkedSharingFolders);
    SetStatusLineHidden();   
}

// Нажатие кнопки получения ссылки на файл
function userVFB_OnGetSharedLinkButtonClick(){
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    var checkedFiles = userVFB.GetCheckedFilesList();
    var checkedDirs = userVFB.GetCheckedDirsList();
    linkBoxPairs_TurnOffCheckboxes(checkedDirs);
    if (checkedFiles.length == 0) {
        alert("Не выбран файл");
        return;
    }
    else if (checkedFiles.length > 1) {
        alert("Можно выбрать только один общий файл для получения ссылки на него");
        linkBoxPairs_TurnOffCheckboxes(checkedFiles);
        return;
    }
    var linkCheckboxPair = checkedFiles[0];
    var isShared = (linkCheckboxPair.Link._itemInfo.AccessType == FileAccessTypeEnum.SHARED) || (userVFB.CurrentDirectoryContent.IsShared);
    if (!isShared) {
        alert("Не открыт общий доступ к файлу");
        linkCheckboxPair.Checkbox.checked = false;
        return;
    }
    var linkFileName = linkCheckboxPair.Link._itemInfo.Name;
    var dir = userVFB.CurrentDir;
    if (isTeacher || isPupil) {
        if (dir == "Личные файлы")
            dir = "";
        else if (dir.indexOf("Личные файлы") != -1) 
            dir = dir.substr("Личные файлы".length + 1);
    }
    var fullLinkName = fname_GetFullFileName(dir, linkFileName);
    prompt("Ссылка на ваш файл:", location.href + SHARED_FILE_PARAM + userName + "/" + fullLinkName);
    linkCheckboxPair.Checkbox.checked = false;
}


// *************************************************************** Операции над файлами *************************************************************

// --------------------------------------- Удаление

// Массив выбранных для удаления пар
var removingLinkBoxPairs = null;
var removingFileNames = null;
var removingFullFileNames = null;

// При нажатии кнопки удалить файлы
function userVFB_OnRemoveFileButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    var checkedFiles = userVFB.GetCheckedFilesList();
    if (checkedFiles.length == 0) {
        alert("Не выбраны файлы для переименования");
        return;
    }
    else if (!confirm("Вы уверены, что хотите удалить выбранны файлы?")) {
        linkBoxPairs_TurnOffCheckboxes(checkedFiles);
        return;
    }
    
    removingLinkBoxPairs = new Array();
    removingFileNames = new Array();
    removingFullFileNames = new Array();
    var fi;
    for (fi = 0; fi < checkedFiles.length; ++fi) {
        if (checkedFiles[fi].Link._itemInfo.AccessType == FileAccessTypeEnum.SHARED)
            if (!confirm("Файл \"" + fname_GetFullFileName(userVFB.CurrentDir, oldRenamingFileName)
                    + "\" открыт для общего доступа.\n" 
                    + "После удаления ссылка на него станет недействительной.\n"
                    + "Вы уверены, что хотите удалить его?")) {
                checkedFiles[fi].Checkbox.checked = false;
                continue;
            }
        removingLinkBoxPairs.push(checkedFiles[fi]);
        removingFileNames.push(checkedFiles[fi].Link._itemInfo.Name);
        removingFullFileNames.push(fname_GetFullFileName(userVFB.CurrentDir, removingFileNames[fi]));
    }
    if (removingLinkBoxPairs.length == 0)
        return;
        
    // Закрываем файлы в редакторе
    for (fi = 0; fi < removingLinkBoxPairs.length; ++fi) {
        if (EAManager.FileIsOpened(FileOwnerTypeEnum.USERDATA, removingFullFileNames[fi])) {
            var currTabID = EAManager.UserFiles[removingFullFileNames[fi]].TabID;
            EAManager.SetFileEditStatusSaved(currTabID);
            EAManager.CloseFileInEditor(FileOwnerTypeEnum.USERDATA, removingFullFileNames[fi]);
        }
    }
    InformAboutNetworkOperation(filesAreDeleting);
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofRemoving;
    PageMethods.DeleteUserFiles(userName, isTeacher, isPupil, userVFB.CurrentDir, removingFileNames, DeleteUserFiles_Callback);  
} 

// Обратный вызов удаления файлов
function DeleteUserFiles_Callback(deletedFileNames){
    someProcessIsRunning = false;
    if (deletedFileNames == null) {
        InformAboutError(deletingFilesError);
        return;
    }
    if (deletedFileNames.length != removingFileNames.length)        // при удалении произошла ошибка
        InformAboutError(deletingFilesError);
    else    
        SetStatusLineHidden();
    var fi;
    for (fi = 0; fi < removingFileNames.length; ++fi) {
        // файл не был удален
        if (deletedFileNames.indexOf(removingFileNames[fi]) == -1)
            removingLinkBoxPairs[fi].Checkbox.checked = false;
        else
            userVFB.RemoveFile(removingFileNames[fi]);
    }
}


// --------------------------------------- Переименование

// Переименовываемая пара
var renamingLinkCheckboxPair;
// Имя файла, который нужно переименовать
var oldRenamingFileName = "";
// Новое имя файла
var newRenamingFileName = "";

// Нажатие кнопки "переименовать файл"
function userVFB_OnRenameFileButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    
    var checkedFiles = userVFB.GetCheckedFilesList();
    if (checkedFiles.length == 0) {
        alert("Не выбран файл для переименования");
        return;
    }
    else if (checkedFiles.length > 1) {
        alert("Можно выбрать только один файл для переименования");
        linkBoxPairs_TurnOffCheckboxes(checkedFiles);
        return;
    }
    renamingLinkCheckboxPair = checkedFiles[0];
    oldRenamingFileName = renamingLinkCheckboxPair.Link._itemInfo.Name;
    Page_Lock();
    $get("RenameFileDiv").style.display = "block";
    $get("NewFileNameEdit").value = oldRenamingFileName;
    $get("NewFileNameEdit").focus();
    $get("NewFileNameEdit").select();
}

// Нажатие в поле ввода имени файла при переименовании
function NewFileNameEdit_OnKeyPress(evt){
    evt = evt || window.event || Event;
    if (evt.keyCode == 13) {    // Нажат ввод
        RenameFileOkButton_Click();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        CloseRenameDiv();
        return false;
    }
    return true;
}

// Переименовать файл
function RenameFileOkButton_Click(){
    newRenamingFileName = $get("NewFileNameEdit").value;
    if (newRenamingFileName == "") {
        alert("Необходимо ввести новое имя файла!");
        return;
    }
    var pointInd = newRenamingFileName.indexOf('.');
    if (pointInd == -1) {
        newRenamingFileName += pasExt;
        $get("NewFileNameEdit").value = newRenamingFileName;
    }
    else if (allExt.indexOf(newRenamingFileName.slice(pointInd)) == -1) {
        alert("Файл должен иметь расширение одного из зарегистрированных типов (.pas, .cs, .fs)");
        return;
//        newRenamingFileName += pasExt;
//        $get("NewFileNameEdit").value = newRenamingFileName;
    }
    else if (pointInd == 0) {
        alert("Имя файла не может состоять только из расширения!");
        return;
    }
    if (!CheckFileNameByIncorrectChars(newRenamingFileName)) {
        alert(incorrectCharInFileName);
        return;
    }
    
    if (newRenamingFileName == oldRenamingFileName){        // если имя совпадает, то ничего не нужно делать
        CloseRenameDiv();
        return;
    }
    // в паре (ссылка, чекбокс) содержится ссылка на объект файла в браузере
    var currFile = renamingLinkCheckboxPair.Link._itemInfo;
    // файл расшарен
    if (currFile.AccessType == FileAccessTypeEnum.SHARED) {
        if (!confirm("Файл \"" + fname_GetFullFileName(userVFB.CurrentDir, oldRenamingFileName) + "\" открыт для общего доступа.\n" + 
                "После переименования ссылка на него станет недействительной.\n" +
                "Вы уверены, что хотите переименовать его?")){
            CloseRenameDiv();
            return;
        }
    }
    // проверяем новое имя файла
    var fullNewFileName = fname_GetFullFileName(userVFB.CurrentDir, newRenamingFileName);
    InformAboutNetworkOperation(newRenamingFileNameIsChecking);
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofChecking;
    var queryData = new CheckingNewFileNameQueryData(userName, fullNewFileName);           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.CHECKING_NEW_FNAME, queryData));
    PageMethods.CheckNewFileName(currQueryID, newRenamingFileName, true, userName, isTeacher, isPupil,
        userVFB.CurrentDir, CheckNewRenamingFileName_CallBack);
}

// Обратный вызов проверки нового имени файла
function CheckNewRenamingFileName_CallBack(response){
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(CHECKING_NEW_FNAME_SERVER_ERROR);
        return;
    }
    var fileExists = GetServerQueryResponseData(response);      // собственно результат выполнения запроса
    SetStatusLineHidden();
    
    if (fileExists) {
        alert("Невозможно переименовать файл.\nФайл с таким именем уже существует.");
        $get("NewFileNameEdit").select();
    }
    else {
        someProcessIsRunning = true;
        fullProcessMessage = inProcess + ofRenaming;
        InformAboutNetworkOperation(fileIsRenaming);
        var queryData = new RenamingQueryData(userName, oldRenamingFileName,
            newRenamingFileName, userVFB.CurrentDir);          
        // Добавляем информацию о запросе в список
        var currQueryID = GenerateGuid();
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.RENAMING_FILE, queryData));
        PageMethods.RenameUserFile(currQueryID, userName, isTeacher, isPupil, userVFB.CurrentDir, 
            oldRenamingFileName, newRenamingFileName, RenameUserFile_CallBack);
    }
}

// Обратный вызов переименования
function RenameUserFile_CallBack(response){
    someProcessIsRunning = false;
    if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(RENAMING_FILE_SERVER_ERROR);
        return;
    }
    var hasRenamed = GetServerQueryResponseData(response);      // собственно результат выполнения запроса
    SetStatusLineHidden();
    if (!hasRenamed){
        InformAboutError(renamingFilesError);
        CloseRenameDiv(true);       // не снимать отмеченность чекбоксов
        return;
    }
    // сначала меняем в редакторе
    var fullOldFileName = fname_GetFullFileName(userVFB.CurrentDir, oldRenamingFileName);
    var fullNewFileName = fname_GetFullFileName(userVFB.CurrentDir, newRenamingFileName);
    if (EAManager.FileIsOpened(FileOwnerTypeEnum.USERDATA, fullOldFileName)) {
        var renFileTabID = EAManager.UserFiles[fullOldFileName].TabID;
        EAManager.ChangeTabFileData(renFileTabID, FileOwnerTypeEnum.USERDATA, fullNewFileName);
    } 
    // переименовываем в браузере
    userVFB.RenameFile(oldRenamingFileName, newRenamingFileName);
    CloseRenameDiv();
}

// Закрытие блока переименования
function CloseRenameDiv(doNotTurnOffCheckBox){
    ClosePopup('RenameFileDiv');
    if (doNotTurnOffCheckBox != true)
        renamingLinkCheckboxPair.Checkbox.checked = false;
    oldRenamingFileName = "";
    newRenamingFileName = "";
    renamingLinkCheckboxPair = null;
}

// Снимает отмеченность всех чекбоксов
function TurnOffAllCheckBoxes(){
    for (cbi = 0; cbi < filesCheckBoxList.length; ++cbi){
        filesCheckBoxList[cbi].checked = false;
    }
}


// ************************************************************* Операции над каталогами ************************************************************

// --------------------------------------- Создание нового каталога

// Создать каталог
function userVFB_OnNewFolderButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    OpenNewFolderDiv(); 
}

// Нажатие в поле ввода имени нового каталога при переименовании
function NewFolderNameEdit_OnKeyPress(evt){
    evt = evt || window.event || Event;
    if (evt.keyCode == 13) {        // Нажат ввод
        CreateNewFolderOkButton_Click();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        CloseNewFolderDiv();
        return false;
    }
    return true;
}

// Открытие блока создания нового каталога
function OpenNewFolderDiv(){
    Page_Lock();
    $get("NewFolderDiv").style.display = "block";
    var newFileNameEdit = $get("NewFolderNameEdit");
    newFileNameEdit.value = "";
    newFileNameEdit.focus();
}

// Создать каталог
function CreateNewFolderOkButton_Click(){
    var newFolderName = $get("NewFolderNameEdit").value;
    if (newFolderName == "") {
        alert("Необходимо ввести имя новой папки!");
        return;
    }
    if (!CheckFileNameByIncorrectChars(newFolderName)) {
        alert(incorrectCharInFolderName);
        return;
    }
    // проверяем имя каталога на допустимость
    if (userVFB.ContainsFolder(newFolderName)){
        alert("Каталог с именем \"" + newFolderName + "\" уже существует");
        return;
    }
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofNewFolder;
    InformAboutNetworkOperation(newFolderIsCreating);
    if (!userActivityIsFixed){
        userActivityIsFixed = true;
        setActivityCookie();
        PageMethods.CreateNewUserFolderWithUserFixing(newFolderName, userName, isTeacher, isPupil, userVFB.CurrentDir, userIP, CreateNewFolder_CallBack);
    }
    else
        PageMethods.CreateNewUserFolder(newFolderName, userName, isTeacher, isPupil, userVFB.CurrentDir, CreateNewFolder_CallBack);
}

// Обратный вызов создания новой папки
function CreateNewFolder_CallBack(createdFolderName){
    someProcessIsRunning = false;
    if (createdFolderName == null)
        InformAboutError(creatingNewFolder);
    else if (createdFolderName == "")
        InformAboutError(creatingNewFolder);
    else {
        // Создание нового каталога в браузере 
        userVFB.AddNewFolder(createdFolderName);
        SetStatusLineHidden();
    }
    CloseNewFolderDiv();
}

// Закрытие блока создания нового каталога
function CloseNewFolderDiv(){
    ClosePopup('NewFolderDiv');
}


// --------------------------------------- Переименование каталога

// Переименовываемая пара
var renamingFolderLinkCheckboxPair;
// Имя каталога, который нужно переименовать
var oldRenamingFolderName = "";
// Новое имя каталога
var newRenamingFolderName = "";

// При нажатии кнопки переименовать каталог
function userVFB_OnRenameFolderButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    var checkedFolders = userVFB.GetCheckedDirsList();
    if (checkedFolders.length == 0) {
        alert("Не выбран каталог для переименования");
        return;
    }
    else if (checkedFolders.length > 1) {
        alert("Можно выбрать только один каталог для переименования");
        linkBoxPairs_TurnOffCheckboxes(checkedFolders);
        return;
    }
    renamingFolderLinkCheckboxPair = checkedFolders[0];
    oldRenamingFolderName = renamingFolderLinkCheckboxPair.Link._itemInfo.Name;
    var openedFileFromDir = EAManager.GetFileFromDirectory(oldRenamingFolderName);
    if (openedFileFromDir != null) {
        EAManager.ActiveFile(FileOwnerTypeEnum.USERDATA, openedFileFromDir.FullFileName);
        alert("Невозможно переименовать каталог, пока не " +
            "закрыты все файлы.");
        return;
    }
    // Каталог расшарен
    if (renamingFolderLinkCheckboxPair.Link._itemInfo.AccessType == FileAccessTypeEnum.SHARED) {
        if (!confirm("Каталог \"" + fname_GetFullFileName(userVFB.CurrentDir, oldRenamingFolderName) + "\" открыт для общего доступа.\n" + 
                "После переименования ссылки на все файлы на него станут недействительными.\n" +
                "Вы уверены, что хотите переименовать его?")){
            linkBoxPairs_TurnOffCheckboxes(checkedFolders);
            return;
        }
    }
    OpenRenameFolderDiv();
}

// Открытие блока переименования
function OpenRenameFolderDiv(){
    Page_Lock();
    $get("RenameFolderDiv").style.display = "block";
    var newFolderNameEdit = $get("NewNameInRenameFolderEdit");
    newFolderNameEdit.value = oldRenamingFolderName;
    newFolderNameEdit.focus();
    newFolderNameEdit.select();
}

// Нажатие в поле ввода имени каталога при переименовании
function NewNameInRenameFolderEdit_OnKeyPress(evt){
    evt = evt || window.event || Event;
    if (evt.keyCode == 13) {        // Нажат ввод
        RenameFolderOkButton_Click();
        return false;
    }
    else if (evt.keyCode == 27){    // Нажатие esc
        CloseRenameFolderDiv();
        return false;
    }
    return true;
}

// Переименовать каталог
function RenameFolderOkButton_Click(){
    newRenamingFolderName = $get("NewNameInRenameFolderEdit").value;
    if (newRenamingFolderName == "") {
        alert("Необходимо ввести новое имя папки!");
        return;
    }
    if (!CheckFileNameByIncorrectChars(newRenamingFolderName)) {
        alert(incorrectCharInFolderName);
        return;
    }
    // если имена совпадают, то ничего не надо делать
    if (oldRenamingFolderName == newRenamingFolderName) {
        CloseRenameFolderDiv();
        return;
    }
    // проверяем имя каталога на допустимость
    if (userVFB.ContainsFolder(newRenamingFolderName)){
        alert("Переименование невозможно.\nКаталог с именем \"" + newRenamingFolderName + "\" уже существует");
        return;
    }
    // пытаемся переименовать
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofRenamingFolder;
    InformAboutNetworkOperation(folderIsRenaming);
    PageMethods.RenameUserFolder(userName, isTeacher, isPupil, oldRenamingFolderName, newRenamingFolderName, 
        userVFB.CurrentDir, RenameUserFolder_CallBack);
}

// Обратный вызов переименования каталога
function RenameUserFolder_CallBack(succes){
    someProcessIsRunning = false;
    if (!succes){
        InformAboutError(renamingNewFolderError);
        CloseRenameFolderDiv(true);       // не снимать отмеченность чекбоксов
        return;
    }
    // переименуем в браузере
    userVFB.RenameFolder(oldRenamingFolderName, newRenamingFolderName);
    SetStatusLineHidden();
    CloseRenameFolderDiv();
    $get("ButtonRefreshSession").click();               // для возобновления сессии через updatePanel
}

// Закрытие блока переименования
function CloseRenameFolderDiv(doNotTurnOffCheckBox){
    if (doNotTurnOffCheckBox != true){
        renamingFolderLinkCheckboxPair.Checkbox.checked = false;
    }
    ClosePopup("RenameFolderDiv");  
}


// --------------------------------------- Удаление каталога

// Имя удаляемого каталога
var removingFolderName;
// Пара (ссылка, чекбокс) удаляемого каталога
var removingFolderLinkCheckboxPair = null;

// При нажатии кнопки переименовать каталог
function userVFB_OnRemoveFolderButtonClick() {
    if (someProcessIsRunning){
        alert(fullProcessMessage);
        return;
    }
    var checkedFolders = userVFB.GetCheckedDirsList();
    if (checkedFolders.length == 0) {
        alert("Не выбран каталог для удаления");
        return;
    }
    else if (checkedFolders.length > 1) {
        alert("Можно выбрать только один каталог для удаления");
        linkBoxPairs_TurnOffCheckboxes(checkedFolders);
        return;
    }
    removingFolderLinkCheckboxPair = checkedFolders[0];
    removingFolderName = removingFolderLinkCheckboxPair.Link._itemInfo.Name;
    var openedFileFromDir = EAManager.GetFileFromDirectory(removingFolderName);
    if (openedFileFromDir != null) {
        EAManager.ActiveFile(FileOwnerTypeEnum.USERDATA, openedFileFromDir.FullFileName);
        alert("Невозможно удалить каталог, пока не " +
            "закрыты все файлы.");
        return;
    }
    if (!confirm("Вы уверены, что хотите удалить каталог вместе со всеми вложенными файлами?")){
        linkBoxPairs_TurnOffCheckboxes(checkedFolders);
        return;
    }
    // Каталог расшарен
    if (removingFolderLinkCheckboxPair.Link._itemInfo.AccessType == FileAccessTypeEnum.SHARED) {
        if (!confirm("Каталог \"" + fname_GetFullFileName(userVFB.CurrentDir, removingFolderName) + "\" открыт для общего доступа.\n" + 
                "После удаления ссылки на все файлы на него станут недействительными.\n" +
                "Вы уверены, что хотите переименовать его?")){
            linkBoxPairs_TurnOffCheckboxes(checkedFolders);
            return;
        }
    }
    // все, удаляем
    someProcessIsRunning = true;
    fullProcessMessage = inProcess + ofRemovingFolder;
    InformAboutNetworkOperation(folderIsRemoving);
    PageMethods.DeleteUserFolder(userName, isTeacher, isPupil, removingFolderName, userVFB.CurrentDir, DeleteUserFolder_CallBack);
} 

// Обратный вызов переименования каталога
function DeleteUserFolder_CallBack(succes){
    if (!succes){
        InformAboutError(deletingFolderError);
        someProcessIsRunning = false;
        return;
    }
    // удалим в браузере
    userVFB.RemoveFolder(removingFolderName);
    SetStatusLineHidden();
    removingFolderLinkCheckboxPair.Checkbox.checked = false;
    removingFolderLinkCheckboxPair = null;
    removingFolderName = "";
    $get("ButtonRefreshSession").click();                                // для возобновления сессии через updatePanel                             
}















// Загружает список файлов в рабочую панель
function LoadUsersFilesList() {
    /*filesDiv = $get(FAR_DIV);
    AddFilesTableToDiv(FAR_TABLE, filesDiv);
    var queryData = new LoadingSessionFileNamesQueryData();           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.LOADING_SESSION_FILES_LIST, queryData));
    PageMethods.GetSessionExistingFileNames(currQueryID, false, currSessionID, GetSessionExistingFileNames_CallBack);*/
}

// Загружает таблицу файлов в рабочую панель
function LoadUsersFilesTable() {
    /*$get("filesActionsDiv").style.display = "block";
    filesDiv = $get(FAR_DIV);
    delete far;
    far = new Far(FAR_DIV, userName, "far");
    var queryData = new LoadingUserFileItemsQueryData("");       // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.LOADING_USER_FILE_ITEMS_LIST, queryData));
    PageMethods.GetUserExistingFileItems(currQueryID, userName, GetUserExistingFileItems_CallBack);
    // -*-
    //PageMethods.GetSessionExistingFileNames(true, userName, GetSessionExistingFileNamesToTable_CallBack);*/
}
// Обратный вызов загрузки файлов и каталогов пользователя
function GetUserExistingFileItems_CallBack(response){
    /*if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(LOADING_USER_FILE_ITEMS_SERVER_ERROR);
        return;
    }
    var fileItems = GetServerQueryResponseData(response);       // собственно результат выполнения запроса
    far.load(fileItems);*/
}

// Обратный вызов получения списка файлов для таблицы
function GetSessionExistingFileNamesToTable_CallBack(fileNamesList){
    /*var filesNum = fileNamesList.length;
    var filesDiv = $get("filesListDiv");
    var filesTable = $get("filesTable");
    
    for (i = 0; i < filesNum; i++) {
        AddUserFileToDiv(fileNamesList[i], filesTable, filesDiv);
    }*/
}

// Загружает список примеров в рабочую панель
function LoadSamplesList() {
    /*var queryData = new LoadingSampleListQueryData(userName);           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.LOADING_SAMPLE_LIST, queryData));
    PageMethods.GetSamplesExistingFileNames(currQueryID, userName, GetSamplesExistingFileNames_CallBack);*/
}

// Обратный вызов получения списка файлов
// GetExistingFileNames
function GetSessionExistingFileNames_CallBack(response) {
    /*if (!ProcessServerQueryResponse(response)){             // Обрабатываем глобальный ответ
        InformAboutError(LOADING_SESSION_FILES_SERVER_ERROR);
        return;
    }
    var fileNamesList = GetServerQueryResponseData(response);    // собственно результат выполнения запроса
    
    var filesNum = fileNamesList.length;
    var filesDiv = $get("filesListDiv");
    var filesTable = $get("filesTable");
    for (i = 0; i < filesNum; i++) {
        AddGuestFileToDiv(fileNamesList[i], filesTable, filesDiv);
    }*/
}

// Обратный вызов получения списка файлов-примеров
function GetSamplesExistingFileNames_CallBack(response) {
    /*if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
        InformAboutError(LOADING_SAMPLE_LIST_SERVER_ERROR);
        return;
    }
    var fileNamesList = GetServerQueryResponseData(response);   // собственно результат выполнения запроса
    
    var filesNum = fileNamesList.length;
    var samplesDiv = $get("samplesListDiv");
    for (i = 0; i < filesNum; i++) {
        var sampleLink = GetNewSampleLink(fileNamesList[i]);    // объект-ссылка на файл
        AddLinkToDiv(sampleLink, samplesDiv);
    }*/
}


// Имя текущей кликнутой ссылки
var curFileNameLink;

// Возвращает объект-ссылку на файл пользователя
function GetNewUserFileNameLink(file) {
    var fileNameLink = GetSomeSimpleFileNameLink(file, userFileNameLinkType);
    if (file.isShared)
        SetFileLinkShared(fileNameLink);
    
    SetLinkAttributeClick(fileNameLink, file.fullName, userFileNameLinkType);
    SetLinkAttributeMouseOver(fileNameLink, file.fullName, userFileNameLinkType);
    SetLinkAttributeMouseOut(fileNameLink, file.fullName, userFileNameLinkType);
    
    return fileNameLink;
}
// Возвращает объект-ссылку на чекбокс файла пользователя
function GetNewUserFileCheckBox(file){
    var fileCheckBox = document.createElement("input");
    fileCheckBox.id = userFileCheckBoxIDPrefix + file.fullName;
    fileCheckBox.type = "checkbox";
    fileCheckBox.style.margin = "0px";
    
    return fileCheckBox;
}

// Возвращает объект-ссылку на чекбокс каталога пользователя
function GetNewUserDirectoryCheckBox(dir){
    var directoryCheckBox = document.createElement("input");
    directoryCheckBox.id = userDirectoryCheckBoxIDPrefix + dir.fullName;
    directoryCheckBox.type = "checkbox";
    
    directoryCheckBox.style.margin = "0px";
    
    return directoryCheckBox;
}

// Возвращает объект-ссылку на пример
function GetNewSampleLink(fileName) {
    var sampleLink = GetSomeSimpleFileNameLink(fileName, sampleFileNameLinkType);
    
    SetLinkAttributeClick(sampleLink, fileName, sampleFileNameLinkType);
    SetLinkAttributeMouseOver(sampleLink, fileName, sampleFileNameLinkType);
    SetLinkAttributeMouseOut(sampleLink, fileName, sampleFileNameLinkType);
    
    return sampleLink;
}  

// Возвращает объект-ссылку на опубликованный файл
function GetNewPublicLink(fileName) {
    var publicLink = GetSomeSimpleFileNameLink(fileName, publicFileLinkType);
    
    SetLinkAttributeClick(publicLink, fileName, publicFileLinkType);
    SetLinkAttributeMouseOver(publicLink, fileName, publicFileLinkType);
    SetLinkAttributeMouseOut(publicLink, fileName, publicFileLinkType);
    
    return publicLink;
}  
    
    // Возвращает ссылку без действий
    function GetSomeSimpleFileNameLink(file, linkType) {
        var linkIDPrefix = GetLinkIDPrefixByType(linkType);
        
        var someFileNameLink = document.createElement("a");
        if (linkType == userFileNameLinkType){          // пользовательский файл
            someFileNameLink.id = linkIDPrefix + file.fullName;         // id
            someFileNameLink.innerHTML = file.viewName;                 // текст ссылки 
            someFileNameLink.file = file;       
        }
        else{
            var fileName = file;
            someFileNameLink.id = linkIDPrefix + fileName;         // id
            someFileNameLink.innerHTML = fileName;                 // текст ссылки
        }
        someFileNameLink.className = GetLinkStyleByAction(linkActionTypeNormal);    // стиль
        
        return someFileNameLink;
    }
    
    // Устанавливает для ссылки действие "курсор наведен"
    function SetLinkAttributeMouseOver(someFileNameLink, fileName, linkType) {
        var OnMouseOverAttrObj = document.createAttribute("onmouseover");           // установка действий события "курсор наведен"
        OnMouseOverAttrObj.value = "OnFileNameLinkMouseOver('" + fileName + "', '" + linkType + "')";
        someFileNameLink.attributes.setNamedItem(OnMouseOverAttrObj);
    }
    
    // Устанавливает для ссылки действие "курсор убран"
    function SetLinkAttributeMouseOut(someFileNameLink, fileName, linkType) {
        var OnMouseOutAttrObj = document.createAttribute("onmouseout");             // установка действий события "курсор убран"
        OnMouseOutAttrObj.value = "OnFileNameLinkMouseOut('" + fileName + "', '" + linkType + "')";
        someFileNameLink.attributes.setNamedItem(OnMouseOutAttrObj);
    }
    
    // Устанавливает для ссылки действие "ссылка нажата"
    function SetLinkAttributeClick(someFileNameLink, fileName, linkType) {
        var OnClickAttrObg = document.createAttribute("onclick");                   // установка действий события "нажата"
        OnClickAttrObg.value = "OnFileNameLink_Click('" + fileName + "', '" + linkType + "')";
        someFileNameLink.attributes.setNamedItem(OnClickAttrObg);
    }
    
    // Цвет ссылки
    var initLinkColor;
    
    // Вспомогательная функция "начать загрузку файла"
    function StartFileLoading(fileName, linkType) {
        var curFileNameLinkID = GetSomeFileNameLinkID(fileName, linkType);
        initLinkColor = $get(curFileNameLinkID).style.color;
        $get(curFileNameLinkID).style.color = "Green";
        
        var loadingMessage;         // сообщение о загрузке
        switch (linkType) {
            case userFileNameLinkType :
                loadingMessage = fileIsLoading;
                break;
            case sampleFileNameLinkType :
                loadingMessage = sampleIsLoading;
                break;    
        }
        
        InformAboutNetworkOperation(loadingMessage);
    }
    
    // Вспомогательная функция "закончить загрузку файла"
    function FinishFileLoading(fileName, linkType) {
        if (isExecutionError) {             // открытие файла для перехода к строке с ошибкой
            editAreaLoader.goToPosition(EDIT_AREA_SOURCE_ID, executionErrorLineNumber, "0");
            InformAboutWarning(executionError);
        }
        else
            SetStatusLineHidden();
        
        var curFileNameLinkID = GetSomeFileNameLinkID(fileName, linkType);
        $get(curFileNameLinkID).style.color = initLinkColor;
        
        //var fileType = GetSomeFileTypeByLinkType(linkType);
        //SetSampleOpened(fileName, fileType);
    }
 
// Ссылка файла нажата
function OnFileNameLink_Click(fileName, linkType, fromError) {
    if ((someProcessIsRunning) && (fromError != true)){
        alert(fullProcessMessage);
        return;
    }

    var fileType = GetSomeFileTypeByLinkType(linkType);             // тип файла
    var prefixFileName = FileNameWithPrefix(fileName, fileType);    // имя с префиксом
    
    if (fileType == userFileType){
        var currFile = File_GetFile(fileName);
        if (currFile.isOpened){
            currFile.active();
            return;
        }
    }
    else if (fileType == userDirectoryType){
        var currDir = Directory_GetDirectory(fileName);
        far.display(currDir.fullName);
        return;
    }
    else if (!restrictedMode){
        var fullFileName = prefixFileName;
        if (isUser)
            fullFileName = far.currentDir + ( (far.currentDir!="") ? "/" : "") + fullFileName;
        if ( (File_IndexOf(fullFileName) != -1) &&              // фантомный файл открыт
                (File_GetFile(fullFileName).isOpened) ){                  
            var phantomFile = File_GetFile(fullFileName);
            phantomFile.active();
            return;
        }
    }
    
    StartFileLoading(fileName, linkType);
    
    var userDir = (isUser) ? userName : currSessionID;
    switch (fileType) {
        case userFileType :
            var slashInd = userDir.indexOf("/");
            var filePath = (slashInd == -1) ? "" : userDir.substr(slashInd+1);
            var queryData = new FileSourceLoadingQueryData(fileName, filePath);            // Данные запроса
            // Добавляем информацию о запросе в список
            var currQueryID = GenerateGuid();
            NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
                QueryTypeEnum.FILE_SOURCE_LOADING, queryData));
            PageMethods.GetUserFileSource(currQueryID, isUser, userDir, fileName, GetUserFileSource_CallBack);
            break;
        case sampleFileType :
            PageMethods.GetSampleFileSource(fileName, GetSampleFileSource_CallBack);
            break;    
        case publicFileType :
            PageMethods.GetPublishedFileSource(fileName, GetPublishedFileSource_CallBack);
            break;    
    }
}

// Обратный вызов получения содержимого файла
function GetUserFileSource_CallBack(response) {
    if (!ProcessServerQueryResponse(response)){                     // Обрабатываем глобальный ответ
        InformAboutError(CHECKING_NEW_FNAME_SERVER_ERROR);
        return;
    }
    var sourceFileInfo = GetServerQueryResponseData(response);      // собственно результат выполнения запроса 
    
    var fileName = sourceFileInfo.FileName;   // имя файла
    var source = sourceFileInfo.Source;       // содержимое файла
    
    var currFile = File_GetFile(fileName);
    currFile.open(source);
    
    FinishFileLoading(fileName, userFileNameLinkType);
}

// Обратный вызов получения содержимого примера
function GetSampleFileSource_CallBack(sourceFileInfo) {
    var fileName = sourceFileInfo.FileName;   // имя файла
    var source = sourceFileInfo.Source;       // содержимое файла
    
    if (!restrictedMode){
        var prefixFileName = FileNameWithPrefix(fileName, sampleFileType);  // имя с префиксом
        var fullFileName = prefixFileName;
        if (isUser)
            fullFileName = far.currentDir + ( (far.currentDir!=MAIN_PATH) ? "/" : "" ) + fullFileName;
        var phantomFile;
        if (File_IndexOf(fullFileName) == -1){
            phantomFile = new File(null, prefixFileName, (isUser) ? far.currentDir : MAIN_PATH, userName, true, SAMPLE_PHANTOM);
            EXISTING_FILES.push(phantomFile);
        }
        else{
            phantomFile = File_GetFile(fullFileName);
        }
        phantomFile.open(source);
    }
    else{
        editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, source);
    }
    FinishFileLoading(fileName, sampleFileNameLinkType);
}

// На ссылку файла наведен курсор
function OnFileNameLinkMouseOver(fileName, linkType) {
    var curFileNameLinkID = GetSomeFileNameLinkID(fileName, linkType);
    if (linkType != userDirectoryLinkType)
        SetElementStyle(curFileNameLinkID, "files_list_item__over");
    else
        SetElementStyle(curFileNameLinkID, "directories_list_item__over");
}

// С ссылки файла убран курсор
function OnFileNameLinkMouseOut(fileName, linkType) {
    var curFileNameLinkID = GetSomeFileNameLinkID(fileName, linkType);
    if (linkType != userDirectoryLinkType)
        SetElementStyle(curFileNameLinkID, "files_list_item");
    else
        SetElementStyle(curFileNameLinkID, "directories_list_item");
}


// ******************************************************************** Публикация ******************************************************************

// Возвращает ссылку на опубликованный файл с номером [fileNumber]
function PublishedFileLink(fileNumber) {
    var linkIDPrefix = publicFileLinkIDPrefix;
        
    var fileName = fileNumber + pasExt;
    var publicFileLink = document.createElement("a");
    
    publicFileLink.href = wdeHref + fileNameParam + fileName;
    publicFileLink.target = publicFileWindowIDPrefix + fileName;
    publicFileLink.innerHTML = "(Ссылка на " + fileNumber + ")";
    publicFileLink.id = publicFileLinkIDPrefix + fileName;
    
    publicFileLink.style.fontSize = "10px";
    publicFileLink.style.marginLeft = "20px";
    //publicFileLink.style.fontStyle = "italic";
    
    return publicFileLink;
}


// ***************************************************************** Загрузка файлов ****************************************************************

// Если выбран файл
function FileUpload() {
    var pasFileUpload = $get("PasFileUpload");
    var fileName = pasFileUpload.value;
    
    if (fileName != "") {
        var pointInd = fileName.indexOf(".");
        var ext = fileName.slice(pointInd+1, fileName.length);
        
        var statusImage = $get("StatusImage");
        var statusLabel = $get("StatusLabel");
        if (ext != "pas") {
            statusImage.src = "images/warning.png";
            statusImage.style.visibility = "visible";
            statusLabel.style.color = "#DF6C1C";
            statusLabel.innerHTML = incorrectFileExt;
            statusLabel.style.visibility = "visible";
        }
        else {
            /*statusImage.src = "images/waiting.gif";
            statusImage.style.visibility = "visible";
            statusLabel.style.color = "#555555";
            statusLabel.innerHTML = fileIsUploading;
            statusLabel.style.visibility = "visible";*/
        }
    }
}



// ********************************************************************* Примеры ********************************************************************

// Загружает браузер примеров
function LoadSampleBrowser() {
    ClearChilds("DivSamplesBrowser");
    samplesVFB = new VirtualFileBrowser("DivSamplesBrowser", userName, "samplesVFB");
    samplesVFB.BrowserTitle = "Примеры";
    samplesVFB.DisplayEmptyBrowser();

    samplesVFB.OnFileClick = samplesVFB_OnFileClick;
    samplesVFB.OnDirectoryClick = samplesVFB_OnDirectoryClick;
    samplesVFB.OnParentDirectoryClick = samplesVFB_OnParentDirectoryClick;
    
    /*samplesVFB.UsedActions = ["rename_file", "remove_file",				
		"remove_folder", "rename_folder", "new_folder"];*/

    samplesVFB_StartLoading();
}

//  Инициирует процедуру загрузки списка файлов и папок в каталоге примеров 
function samplesVFB_StartLoading() {
    var queryData = new LoadingSampleListQueryData(userName);           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.LOADING_SAMPLE_LIST, queryData));
    samplesVFB.SetStatusInfo("load...");
    PageMethods.GetSampleItems(currQueryID, isUser, GetUserID(), "", samplesVFB_GetSampleItems_Callback);
}

    // Обратный вызов получения списка файлов/каталогов в разделе примеров
    function samplesVFB_GetSampleItems_Callback(response) {
        samplesVFB.SetStatusInfo("");
        if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
            InformAboutError(LOADING_SAMPLE_LIST_SERVER_ERROR);
            return;
        }
        var sampleItems = GetServerQueryResponseData(response);     // собственно результат выполнения запроса
        samplesVFB.Load(sampleItems);
        samplesVFB.Display(true);
    }

// Нажатие на файл примера
function samplesVFB_OnFileClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    var fullFileName = samplesVFB.GetFullFileName(target._itemInfo);
    samplesVFB._a_fileName = fullFileName;
    
    // Если файл открыт, то просто активируем его
    if (EAManager.FileIsOpened(FileOwnerTypeEnum.SAMPLE, fullFileName)) {
        EAManager.ActiveFile(FileOwnerTypeEnum.SAMPLE, samplesVFB._a_fileName);
        return;
    }
    
    var queryData = new FileSourceLoadingQueryData(target._itemInfo.Name, samplesVFB.CurrentDir);            // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.FILE_SOURCE_LOADING, queryData));
    samplesVFB.SetStatusInfo("load...");
    PageMethods.GetSampleFileSource(currQueryID, fullFileName, samplesVFB_GetSampleFileSource_Callback);
}

    // Обратный вызов загрузки содержимого файла примера
    function samplesVFB_GetSampleFileSource_Callback(response) {
        samplesVFB.SetStatusInfo("");
        if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
            InformAboutError(LOADING_SAMPLE_SOURCE_SERVER_ERROR);
            return;
        }
        var content = GetServerQueryResponseData(response);     // собственно результат выполнения запроса
        if (!restrictedMode)
            EAManager.OpenFile(FileOwnerTypeEnum.SAMPLE, samplesVFB._a_fileName, content);
        else {
            editAreaLoader.setValue(EDIT_AREA_SOURCE_ID, content);             
        }
    }

// Нажатие на каталог в списке примеров
function samplesVFB_OnDirectoryClick(e) {
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    var currDir = target._itemInfo;
    var fullCurrDirName = samplesVFB.GetFullDirectoryName(currDir);
    samplesVFB._a_dirName = currDir.Name;
    
    var queryData = new LoadingSampleListQueryData(userName);           // Данные запроса
    // Добавляем информацию о запросе в список
    var currQueryID = GenerateGuid();
    NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
        QueryTypeEnum.LOADING_SAMPLE_LIST, queryData));
    samplesVFB.SetStatusInfo("load...");
    PageMethods.GetSampleItems(currQueryID, isUser, GetUserID(), fullCurrDirName, samplesVFB_GetSubdirSampleItems_Callback);
}

    // Обратный вызов получения списка файлов/каталогов в подкаталоге разделе примеров
    function samplesVFB_GetSubdirSampleItems_Callback(response) {
        samplesVFB.SetStatusInfo("");
        if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
            InformAboutError(LOADING_SAMPLE_LIST_SERVER_ERROR);
            return;
        }
        var sampleItems = GetServerQueryResponseData(response);     // собственно результат выполнения запроса
        samplesVFB.Load(sampleItems, samplesVFB._a_dirName);
        samplesVFB.Display(true);
    }

// Нажатие на родительскую папку
function samplesVFB_OnParentDirectoryClick(e){
    var evt = e || window.event || Event;
    var target = evt.target || evt.srcElement;
    /*if (samplesVFB.ParentDirectoryIsLoaded()) {
        samplesVFB.OpenParentDirectory();
        samplesVFB.Display(true);
    }
    else */{
        var queryData = new LoadingSampleListQueryData(userName);           // Данные запроса
        // Добавляем информацию о запросе в список
        var currQueryID = GenerateGuid();
        NetworkQueryViewer.AddQuery(currQueryID, new QueryInfo(
            QueryTypeEnum.LOADING_SAMPLE_LIST, queryData));
        samplesVFB.SetStatusInfo("load...");
        PageMethods.GetSampleItems(currQueryID, isUser, GetUserID(), samplesVFB.getFullParentDirName(), samplesVFB_GetParentDirSampleItems_Callback);
    }
}

    // Обратный вызов получения списка файлов/каталогов в надкаталоге раздела примеров
    function samplesVFB_GetParentDirSampleItems_Callback(response) {
        samplesVFB.SetStatusInfo("");
        if (!ProcessServerQueryResponse(response)){                 // Обрабатываем глобальный ответ
            InformAboutError(LOADING_SAMPLE_LIST_SERVER_ERROR);
            return;
        }
        var sampleItems = GetServerQueryResponseData(response);     // собственно результат выполнения запроса
        samplesVFB.LoadParent(sampleItems);
        samplesVFB.Display(true);
    }
