﻿/* Содержит вспомогательные функции 
 * управления файлами */
 
// Добавляет на блок [filesDiv] таблицу с id [tableID]
function AddFilesTableToDiv(tableID, filesDiv){
    var filesTable = document.createElement("table");
    filesTable.id = tableID;
    filesTable.style.borderStyle = "none";
    filesTable.style.borderCollapse = "collapse";
    filesTable.cellPadding = "0";
    
    filesDiv.appendChild(filesTable);
}

// Добавляет ссылку [newFileLink] на блок [filesDiv]
function AddLinkToDiv(newFileLink, filesTable, filesDiv) {
    /*var br = document.createElement("br");
    filesDiv.appendChild(newFileLink);
    filesDiv.appendChild(br);*/
    
    var tr = document.createElement("tr");
    var tdFile = document.createElement("td");
    
    tdFile.appendChild(newFileLink);
    tr.appendChild(tdFile);
    filesTable.appendChild(tr);
}

// Добавляет строку с ссылкой на файл [newFileLink] 
// и чекбоксом [newFileCheckBox] на блок [filesDiv] в таблицу [filesTable]
// [toInsert] вставлять ли файл перед каталогами, или добавлять в конец
function AddRowToDiv(newFileLink, newFileCheckBox, filesTable, filesDiv, toInsert) {
    var tr = document.createElement("tr");
    var tdFile = document.createElement("td");
        tdFile.style.width = "200px";
    var tdCheckBox = document.createElement("td");
        tdCheckBox.style.width = "40px";
    
    tdFile.appendChild(newFileLink);
    tdCheckBox.appendChild(newFileCheckBox);
    tr.appendChild(tdFile);
    tr.appendChild(tdCheckBox);
    
    // Добавить нужно в конец списка файлов
    var currDir = far.currentDir;
    if (currDir == "")
        currDir = MAIN_PATH_ID;
    var parCurrDir = "\"" + currDir + "\"";
    
    var firstDirLink = far.dirsHash[parCurrDir].firstDirLink; 
    if ((firstDirLink != null) && toInsert){
        var firstCol = firstDirLink.parentNode;
        var firstRow = firstCol.parentNode;
        filesTable.insertBefore(tr, firstRow);
    }
    else{
        filesTable.appendChild(tr);
    }
}

// Удаляет строку таблицы с файлом fileName
function removeUserFile(fileName, filesTable, filesDiv){
    var link = $get(userFileNameLinkIDPrefix + fileName);
    var col = link.parentNode;
    var row = col.parentNode;
    filesTable.removeChild(row);
}
// Удаляет строку таблицы с каталогом folderName
function RemoveUserFolder(folderName, filesTable, filesDiv){
    var link = $get(userDirectoryLinkIDPrefix + folderName);
    var col = link.parentNode;
    var row = col.parentNode;
    filesTable.removeChild(row);
}

// Добавляет файл для гостя
function AddGuestFileToDiv(newFileName, filesTable, filesDiv, appendingFile){
    var newFile;
    if (appendingFile == undefined){
        newFile = new File(newFileName, MAIN_PATH, Guest, false);       // Добавляем файл в список существующих
        EXISTING_FILES.push(newFile);
    }
    else
        newFile = appendingFile;
    
    var fileNameLink = GetNewUserFileNameLink(newFile);     // объект-ссылка на файл
    AddLinkToDiv(fileNameLink, filesTable, filesDiv);
}

// Добавляет файл для зарегистрированного пользователя
function AddUserFileToDiv(newFileName, filesTable, filesDiv, appendingFile){
    var newFile;
    if (appendingFile == undefined){
        newFile = new File(newFileName, far.currentDir, userName, false);       // Добавляем файл в список существующих
        EXISTING_FILES.push(newFile);
    }
    else
        newFile = appendingFile;
    
    var fileNameLink = GetNewUserFileNameLink(newFile);    // объект-ссылка на файл
    //fileNameLink.href = location.href + userName// + "\\" + appendingFile.fullName;
    var fileCheckBox = GetNewUserFileCheckBox(newFile);    // объект ссылка на чекбокс файла
    AddRowToDiv(fileNameLink, fileCheckBox, filesTable, filesDiv, true);
    AddNewFileCheckBox(fileCheckBox);
}

// Добавляет каталог в список пользователя
function AddUserDirectoryToDiv(appendingDirectory, filesTable, filesDiv){
    var directoryLink = GetDirectoryLink(appendingDirectory);
    var directoryCheckBox = GetNewUserDirectoryCheckBox(appendingDirectory);
    AddRowToDiv(directoryLink, directoryCheckBox, filesTable, filesDiv, false);
    AddNewFolderCheckBox(directoryCheckBox);
}

// Изменяет строку таблицы с файлом зарегистрированного пользователя
function ReplaceUserFileInDiv(sourceFileName, destFile, filesTable, filesDiv){   
    var destLink = GetNewUserFileNameLink(destFile);        // объект-ссылка на файл
    var destCheckBox = GetNewUserFileCheckBox(destFile);    // объект ссылка на чекбокс файла
    
    var tr = document.createElement("tr");
    var tdFile = document.createElement("td");
        tdFile.style.width = "200px";
    var tdCheckBox = document.createElement("td");
        tdCheckBox.style.width = "40px";
    
    tdFile.appendChild(destLink);
    tdCheckBox.appendChild(destCheckBox);
    tr.appendChild(tdFile);
    tr.appendChild(tdCheckBox);
    
    var sourceLink = $get(userFileNameLinkIDPrefix + sourceFileName);
    var sourceCol = sourceLink.parentNode;
    var sourceRow = sourceCol.parentNode;
    
    filesTable.insertBefore(tr, sourceRow);
    filesTable.removeChild(sourceRow);
}

// Изменяет ссылку на расшаренный файл
// <fileName> - Имя файла
// <filesTable> - Ссылка на таблицу браузера
// <filesDiv> - Ссылка на блок таблицы
function ChangeFileLinkIntoShared(fileName, filesTable, filesDiv){
    var sourceLink = $get(userFileNameLinkIDPrefix + fileName);
    SetFileLinkShared(sourceLink);
    sourceLink.href = wdeHref + SHARED_FILE_PARAM + userName + "/" + fileName;
}
// Изменяет ссылку на обычный файл
// <fileName> - Имя файла
// <filesTable> - Ссылка на таблицу браузера
// <filesDiv> - Ссылка на блок таблицы
function ChangeFileLinkIntoPrivate(fileName, filesTable, filesDiv){
    var sourceLink = $get(userFileNameLinkIDPrefix + fileName);
    SetFileLinkPrivate(sourceLink);
}

// Задает для ссылки стиль расшаренного файла
// <fileLink> - объект-ссылка на файл
function SetFileLinkShared(fileLink){
    fileLink.style.fontStyle = "italic";
    fileLink.style.color = "navy";
    fileLink.title = "Файл открыт для общего доступа\n";
    //fileLink.href = wdeHref + SHARED_FILE_PARAM + userName + "/" + fileLink.file.fullName;
}
// Задает для ссылки стиль обычного файла
// <fileLink> - объект-ссылка на файл
function SetFileLinkPrivate(fileLink){
    fileLink.style.fontStyle = "normal";
    fileLink.style.color = "blue";
    fileLink.title = null;                  
    fileLink.href = null;
}

// Изменяет строку таблицы с каталогом зарегистрированного пользователя
function ReplaceUserFolderInDiv(sourceFolderName, destFolder, filesTable, filesDiv){   
    var destLink = GetDirectoryLink(destFolder);                      // объект-ссылка на каталог
    var destCheckBox = GetNewUserDirectoryCheckBox(destFolder);       // объект ссылка на чекбокс каталога
    
    var tr = document.createElement("tr");
    var tdDir = document.createElement("td");
        tdDir.style.width = "200px";
    var tdCheckBox = document.createElement("td");
        tdCheckBox.style.width = "40px";
    
    tdDir.appendChild(destLink);
    tdCheckBox.appendChild(destCheckBox);
    tr.appendChild(tdDir);
    tr.appendChild(tdCheckBox);
    
    var sourceLink = $get(userDirectoryLinkIDPrefix + sourceFolderName);
    var sourceCol = sourceLink.parentNode;
    var sourceRow = sourceCol.parentNode;
    
    filesTable.insertBefore(tr, sourceRow);
    filesTable.removeChild(sourceRow);
}

// Возвращает ссылку на каталог
// directory - объект-каталог
function GetDirectoryLink(directory){
    var directoryLink = document.createElement("a");
    directoryLink.id = userDirectoryLinkIDPrefix + directory.fullName;                  // id
    directoryLink.innerHTML = directory.viewName;                                       // текст ссылки 
    directoryLink.directory = directory;       
    directoryLink.className = GetDirectoryLinkStyleByAction(linkActionTypeNormal);      // стиль
    
    // Визуальные атрибуты
    SetLinkAttributeMouseOver(directoryLink, directory.fullName, userDirectoryLinkType);
    SetLinkAttributeMouseOut(directoryLink, directory.fullName, userDirectoryLinkType);
    
    // Нажатие на ссылку каталога
    var OnClickAttrDir = document.createAttribute("onclick");                   // установка действий события "нажата"
    OnClickAttrDir.value = "FarFunctions_LoadDirectory('" + directory.ownerName + "/" +
            directory.fullName + "')";         
    directoryLink.attributes.setNamedItem(OnClickAttrDir);
    
    return directoryLink;
}


// Возвращает префикс id ссылки в зависимости
// от нужного типа [linkType]
function GetLinkIDPrefixByType(linkType) {
    switch (linkType) {
        case userFileNameLinkType :
            return userFileNameLinkIDPrefix;
            break;
        case userDirectoryLinkType :
            return userDirectoryLinkIDPrefix;
        case sampleFileNameLinkType : 
            return sampleFileNameLinkIDPrefix;
            break;
        case publicFileLinkType :
            return publicFileLinkIDPrefix;
            break;
    }
}

// Возвращает стиль в зависимости от
// нужной операции [actionType]
function GetLinkStyleByAction(actionType) {
    switch (actionType) {
        case linkActionTypeNormal :
            return "files_list_item";
            break;
        case linkActionTypeMouseOver :
            return "files_list_item__over";
            break;
    }
}
// Возвращает стиль директории в зависимости от
// нужной операции [actionType]
function GetDirectoryLinkStyleByAction(actionType){
    switch (actionType) {
        case linkActionTypeNormal :
            return "directories_list_item";
            break;
        case linkActionTypeMouseOver :
            return "directories_list_item__over";
            break;
    }
}


// Возвращает id ссылки по имени [fileName]
// и типу [linkType]
function GetSomeFileNameLinkID(fileName, linkType) {
    return (GetLinkIDPrefixByType(linkType) + fileName);
}

// Возвращает тип файла по типу ссылки [linkType]
function GetSomeFileTypeByLinkType(linkType) {
    switch (linkType) {
        case userFileNameLinkType :
            return userFileType;
            break;
        case userDirectoryLinkType :
            return userDirectoryType;
        case sampleFileNameLinkType :
            return sampleFileType;
            break;
        case publicFileLinkType :
            return publicFileType;
            break;
    }
}

// Возвращает тип файла по типу префикса [prefixType]
function GetSomeFileTypeByPrefix(prefix) {
    switch (prefix) {
        case publicLabel :
            return publicFileType;
            break;
        case sampleLabel :
            return sampleFileType;
            break;
    }
}


// Возвращает приставку к имени в зависимости от типа
// примера
function PrefixNameBySampleType(sampleType) {
    switch (sampleType) {
        case userFileType :
            return userFileLabel;
            break;
        case sampleFileType :
            return sampleLabel;
            break;
        case publicFileType :
            return publicLabel;
            break;
        default :
            return userDirectoryLabel;
    }
}

// Возвращает полное имя вместе с приставкой
function FileNameWithPrefix(fileName, fileType) {
    return (PrefixNameBySampleType(fileType) + fileName);
}

// Возвращает параметр хэша по имени
function HashParamName(fileName, fileType) {
    var fullName = FileNameWithPrefix(fileName, fileType);
    return (quote + fullName + quote);
}


// Добавляет информацию о том,
// что пример открыт, в соответствующий хэш
function SetSampleOpened(fileName, sampleType) {
    var parTitle = HashParamName(fileName, sampleType);
    
    switch (sampleType) {
        case sampleFileType :
            samplesHash[parTitle] = true;
            break;
        case publicFileType :
            publishedFilesHash[parTitle] = true;
            break;
        default:
            break;
    }
}

// Информирует о том,
// что пример закрыт, в соответствующий хэш
function SetSampleClosed(fileName, sampleType) {
    var parTitle = HashParamName(fileName, sampleType);
    
    switch (sampleType) {
        case sampleFileType :
            samplesHash[parTitle] = false;
            break;
        case publicFileType :
            publishedFilesHash[parTitle] = false;
            break;
        default:
            break;
    }
}


// Открытие файла в редакторе
function OpenNewFile(fileName, source) {
    var newFile = {id: newID, title: fileName, text: source};
    
    openedTabsList.push(fileName);
    parFileName = "\"" + fileName + "\"";
    tabsIDHash[parFileName] = newID;
    
    NextFileParams();       // файтически, происходит открытие новой вкладки
    
    editAreaLoader.openFile("SourceCodeTextBox", newFile);
}

// Изменение файла в редакторе
function ChangeFile(fileName, source, currID) {
    AddTabToOpened(fileName, currID);                          // вкладка не меняется, поэтому ID оставляем прежним 
    
    var newFile = {title: fileName, text: source};
    editAreaLoader.changeFile("SourceCodeTextBox", newFile);
}


// -------------------------------------------------------------------- Для управления каталогами

// Загрузка содержимого подкаталога
function FarFunctions_LoadDirectory(directoryName){
    // Уходя, очищаем ссылку на каталог
    far.clearFirstDirLink();
    
    // каталог без имени пользователя
    far.lastChosenDir = directoryName.substr(directoryName.indexOf("/")+1);
    if (far.directoryIsLoaded(far.lastChosenDir)){
        far.currentDir = far.lastChosenDir;
        far.display();
    }
    else{
        if (someProcessIsRunning){
            alert(fullProcessMessage);
            return;
        }
        someProcessIsRunning = true;
        fullProcessMessage = inProcess + ofFilesListLoading;
        InformAboutNetworkOperation(inProcess + ofFilesListLoading);
        PageMethods.GetUserExistingFileItems(directoryName, GetUserDirectoryExistingFileItems_CallBack);
    }
}

// Обратный вызов загрузки содержимого подкаталога
function GetUserDirectoryExistingFileItems_CallBack(fileItems){
    someProcessIsRunning = false;
    SetStatusLineHidden();

    far.load(fileItems, far.lastChosenDir);  
}

// Проверяет наличие открытых файлов каталога [clearingDirectory]
// возвращает ссылку на первый таковой, если он имеется
function File_FindOpened(clearingDirectory){
    for (cdffi = 0; cdffi < EXISTING_FILES.length; ++cdffi){
        if (EXISTING_FILES[cdffi].fullName.indexOf(clearingDirectory) == 0)
            if (EXISTING_FILES[cdffi].isOpened)
                return EXISTING_FILES[cdffi];
    }
    return null;
}

// Удаляет из списка файлов все файлы каталога [clearingDirectory]
function File_ClearDirectory(clearingDirectory){
    var newExistingFiles = new Array();
    for (cdcfi = 0; cdcfi < EXISTING_FILES.length; ++cdcfi){
        if (!(EXISTING_FILES[cdcfi].fullName.indexOf(clearingDirectory) == 0))
            newExistingFiles.push(EXISTING_FILES[cdcfi]);
    }
    EXISTING_FILES = newExistingFiles;
}

// Удаляет из списка каталогов все подкаталоги каталога [clearingDirectory]
function Directory_ClearDirectory(clearingDirectory){
    var newExistingDirs = new Array();
    for (cdcfli = 0; cdcfli < EXISTING_DIRS.length; ++cdcfli){
        if (!(EXISTING_DIRS[cdcfli].fullName.indexOf(clearingDirectory) == 0) || (EXISTING_DIRS[cdcfli].fullName == clearingDirectory))
            newExistingDirs.push(EXISTING_DIRS[cdcfli]);
    }
    EXISTING_DIRS = newExistingDirs;
}