﻿// ********************************************************************** Общие *********************************************************************

// ID сессии
var currSessionID;
// Статус сессии (new | notNew)
var currSessionStatus;

// IP пользователя
var userIP;
// Имя пользователя (Guest для гостя)
var userName;

// Статус пользователя
var User = "User";
// Статус гостя
var Guest = "Guest";

// Пользователь авторизирован
var isUser;

// Зафиксирована ли активность пользователя
var userActivityIsFixed;
// Имя cookie активности
var activityCookieName = "USER_ACTIVITY";
// Значение cookie активности
var userIsActiveCookieValue = "is_active";

// Имя куки для проверки корректности браузера
var isBrowserCorrectCookie = "IsBrowserForWDECorrect";
var restrictedMode = false;

// Ошибка загрузки
var loadingError;

// Пиксели
var px = "px";
// Кавычка
var quote = "\"";
// Расширение pas-файла
var pasExt = ".pas";

// Секунда из мс
var sec = 1000;
// Минута из секунд
var min = 60 * sec;
// Период запроса, поддерживающего жизнь сессии
var sessionAlivePeriod = 3 * min;


// Запущен ли какой-то процесс
var someProcessIsRunning = false;


function EndRequestHandler(sender, args) {
    AuthorizationButton_Click();
}


// **************************************************************** Работа с Cookie *****************************************************************
// Устанавливает cookies активности
function setActivityCookie(){
    var nowDateTime = new Date();           // получили текущую дату и время
    var nowDate = new Date(nowDateTime.getFullYear(), nowDateTime.getMonth(), nowDateTime.getDate(), 0, 0, 0);
    var msInDay = 1000 * 60 * 60 * 24;      // миллисекунд в одном дне (<мс в сек> * <сек в мин> * <мин в час> * <часов в сутках>)
    
    var expires = nowDate;
    expires.setMilliseconds(nowDate.getMilliseconds() + msInDay);
    
    setCookie(activityCookieName, userIsActiveCookieValue, expires);
}

// Возвращает истину, если куки уже установлено
function getActivityInformationFromCookie(){
    return (getCookie(activityCookieName) != null);
}
    
    /** Устанавливает cookie с именем name равным value */
    function setCookie(name, value, expires, path, domain, secure) {
        document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
    }   
    /** Возвращает cookie с именем name */
    function getCookie(name) {
	    var cookie = " " + document.cookie;
	    var search = " " + name + "=";
	    var setStr = null;
	    var offset = 0;
	    var end = 0;
	    if (cookie.length > 0) {
		    offset = cookie.indexOf(search);
		    if (offset != -1) {
			    offset += search.length;
			    end = cookie.indexOf(";", offset)
			    if (end == -1) {
				    end = cookie.length;
			    }
			    setStr = unescape(cookie.substring(offset, end));
		    }
	    }
	    return(setStr);
    }


// **************************************************************** Статус-сообщения ****************************************************************

var pleaseWait = "Пожалуйста, подождите";                               // просьба ожидания

// ------------------------------- Сетевые сообщения 

// Загрузка среды
var defaultFileIsLoading = "Загружается демонстрационный файл... " +    // первая загрузка
        pleaseWait;    
var paramFileIsLoading = "Загружается запрошенный файл... " +           // загрузка файла, заппрошенного из командной строки
        pleaseWait;
var sharedFileIsLoading = "Загружается файл общего доступа... " +       // загрузка общего файла, запрошенного из командной строки
        pleaseWait;
var areaIsLoading = "Инициализируется среда разработки..."  +           // загрузка среды (если старая сессия)        
        pleaseWait;
          
var newFileIsCreating = "Создание нового файла... " + pleaseWait;       // новый файл
var newFolderIsCreating = "Создание новой папки... " + pleaseWait;      // новый каталог
var folderIsRenaming = "Переименование папки..." + pleaseWait;          // переименование каталога
var fileIsSaving = "Сохранение файла... " + pleaseWait;                 // сохранение файла
var fileIsLoading = "Загрузка файла... " + pleaseWait;                  // загрузка файла

var filesAreDeleting = "Удаление файлов... " + pleaseWait;              // удаление всех файлов
var folderIsRemoving = "Удаление папки..." + pleaseWait;                // удаление каталога

var newRenamingFileNameIsChecking = "Проверка имени файла... " +        // проверка имени файла
        pleaseWait;

// Примеры
var sampleIsLoading = "Пример загружается... " + pleaseWait;            // загрузка примера

// Публикация
var fileIsPublishing = "Публикация файла... " + pleaseWait;             // публикация файла 
var publishingFileIsCheking = "Проверка файла... " +                    // проверка публикуемого файла
        pleaseWait;
var publishedFileIsCheking = "Проверка существования файла... " +       // проверка существования опубликованного файла
        pleaseWait; 

// Sharing
var filesAreSharing = "Открытие общего доступа к файлам..." +           // расшаривание файлов
        pleaseWait; 
var filesAreUnsharing = "Закрытие общего доступа к файлам..." +         // закрытие доступа к файлам
        pleaseWait;  

// Загрузка
var filesAreDownloading = "Загрузка pas-файлов..." + pleaseWait;        // загрузка файлов на локальный компьютер    
// Закакчка
var fileIsUploading = "Загрузка файла. " + pleaseWait;                  // закачка выбранного файла 

// ------------------------------- Компиляция
var isCompiling = "Программа компилируется...";                         // программа компилируется
var hasCompiled = "";                                                   // программа успешно откомпилирована

// ------------------------------- Выполнение
var isRunning = "Программа выполняется...";                             // программа выполняется
var enterWaiting = "Ожидание ввода";                                    // программа выполняется, ожидается ввод
var hasFinished = "";                                                   // программа завершена
var hasBroken = "";                                                     // выполнение программы завершено досрочно     
        
// ------------------------------- Предупреждения
var noFileInDirectory = "В вашем каталоге нет файлов";                  // в каталоге пользователя не обнаружено файлов  
var noOpenedFile = "Нет открытых файлов";                               // предупреждение, нечего сохранять
var noPublishedFile = "Запрошенный файл не существует";                 // не существует такого файла
var noSharedFile = "Запрошенный файл общего доступа не существует";     // не существует файла общего доступа
var executionError = "Ошибка времени выполнения";                       // ошибка выполнения 
var invalidFileTypeForDownload = "Выбранный файл не является" +         // файл не подходит для скачивания
    " исполняемым или библиотекой";
var phantomFileForDownload = "Сначала нужно сохранить файл";            // попытка скачать фантомный файл 
var processExpiredError = "Период ожидания истек. " +                   // процесс завершен 
    "Пожалуйста, запустите программу снова."; 
    
// ------------------------------- Ошибки
var compilationErrors = "Обнаружены ошибки компиляции";                 // обнаружены ошибки компиляции    
var incorrectFileExt = "Недопустимый тип файла. " +                     // недопустимый тип файла                 
     "Вы можете загружать только pas-файлы.";
var incorrectPublishingFileSize = "Ошибка. " +                          // недопустимый размер файла
    "Размер текст не должен превышать 11000 символов.";
var incorrectPublishingFile = "Публикуемый файл должен компилироваться.";       // некомпилируемость файла

var deletingFilesError = "Не удалось удалить некоторые файлы.";         // ошибка удаления файлов
var renamingFilesError = "Не удалось переименовать файл.";              // ошибка переименования файла
var creatingNewFolder = "Не удалось создать папку.";                    // ошибка создания нового каталога
var renamingNewFolderError = "Не удалось переименовать папку.";         // ошибка переименования каталога
var deletingFolderError = "Не удалось удалить папку.";                  // ошибка удаления каталога

var notSavedNewFileExists = "Один новый файл уже открыт. " +            // есть несохраненный новый файл
    "Сохраните или закройте его.";
    
var sharingFilesError = "Не удалось открыть доступ к файлам.";          // ошибка расшаривания файлов
var unsharingFilesError = "Не удалось закрыть доступ к файлам.";        // ошибка расшаривания файлов


// ------------------------------- Информирование о процессах
var inProcess = "Пожалуйста, подождите. Запущен процесс ";              // процесс запущен

var ofNewFile = "создания нового файла";
var ofNewFolder = "создания новой папки";
var ofSaving = "сохранения файла";
var ofLoading = "загрузки файла";
var ofChecking = "проверки файла";
var ofSharedFileLoading = "загрузки файла общего доступа";
var ofRemoving = "удаления файлов";
var ofSharing = "открытия доступа к файлам";
var ofDownloading = "загрузки файлов на локальный компьютер";
var ofUnsharing = "закрытия доступа к файлам";
var ofRemovingFolder = "удаления папки";
var ofRenaming = "переименования файла";
var ofRenamingFolder = "переименования папки";
var ofCompiling = "компиляции файла";
var ofExecuting = "выполнения файла";
var ofPublishing = "публикации файла";
var ofFilesListLoading = "загрузки списка файлов";

var fullProcessMessage;                                                 // сообщение процесса
     

// ************************************************************* Константы скрытых полей ************************************************************

// ------------------------------- Статус сессии
var newSession = "new";                                                         // Новая сессия
var oldSession = "notNew";                                                      // Сессия не является новой

// ------------------------------- Ошибки загрузки
var creationNewSessionDirectoryErrorCode = "CreationNewSessionDirectoryError";  // Не удалось создать каталог пользователя
    


// *************************************************************** Глобальные события ***************************************************************

/* Регистрация обработчика события "завершено обновление UpdatePanel"
   Это нужно, чтобы производить ряд действий при входе/выходе пользователя */
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
    
// загрузка страницы
window.onload = windowLoad;
// закрытие страницы
window.onunload = ClosePage;

// изменение размеров окна
window.onresize = windowResize;

// нажатие клавиши
document.onkeydown = CompilerKeyFunctions;


// ******************************************************************** EditArea ********************************************************************

// ID элемента редактора
var EDIT_AREA_SOURCE_ID = "SourceCodeTextBox";

// Минимальный размер редактора
var minAreaHeight = 300;
// шаг высоты редакторы
var areaHeightStep = 50;

// последний использованный индекс вкладки панели
var lastID = new Number(0);
// новый индекс вкладки панели
var newID = (lastID+1).toString();

// Переход к параметрам следующего файла
function NextFileParams() {
    lastID += 1;
    newID = (lastID+1).toString();
}


// Функция, выполняемая при нажатии кнопки "Новый"
NewDocumentCallback = NewDocument;
// Сохранить как
SaveAsCallback = SaveAsDocument;

// Массив недопустимых при сохранении файла символов
incorrectChars = ["/", "|", ":", "*", "?", "\"", "<", ">", "|", "\\"];


// ------------------------------- Сообщения об ошибках сохранения как
var incorrectCharInFileName = "Имя файла не должно содержать" +     // имя файла содержит недопустимые символы
    " следующих знаков: \n" + 
    "/ \ : * ? \" < > |";
 
// Показан ли блок ввода
var enterBlockOn;

// Высота области вывода при скрытом блоке ввода
var defaultStrOutputHeight = "250px";

// Пометка о том, что файл не сохранен в папку пользователя,
// а является примером
var sampleLabel = "@ ";
// Пометка о том, что файл не сохранен в папку пользователя,
// а является опубликованным
var publicLabel = "P ";
// Пометка о том, что файл - пользовательский
var userFileLabel = "";
// Пометка о том, что это директория
var userDirectoryLabel = "";


// *************************************************************** Функции компилятора **************************************************************

CompileCallback = compile_programm;
RunCallback = run_programm;
StopCallback = stop_programm;

// ------------------------------- Типы файлов
var pascalCompiledUnit = "PascalCompiledUnit";              // модуль
var classLibrary = "ClassLibrary";                          // библиотека

// Начало сообщения об ошибке выполнения
var executionErrorBegining = "Ошибка времени выполнения";

// Ошибка компиляции/выполнения на сервере на сервере
var SERVER_COMPILE_ERROR = "Произошла внутренняя ошибка на сервере";

// Номер строки с ошибкой, на которую надо переходить
var executionErrorLineNumber;
// Наличие ошибки выполнения
var isExecutionError;


var CANVAS_UNIT = "Graph";                          // Имя модуля для работы с графикой Canvas
var CANVAS_TYPE = "GRAPH_CANVAS";                   // Тип графического файла - Canvas


// ***************************************************************** Рабочая панель *****************************************************************

// Тип ссылки-файла пользователя
var userFileNameLinkType = "userFileNameLinkType";
// Тип ссылки-примера
var sampleFileNameLinkType = "sampleFileNameLinkType";
// Тип ссылки-опубликованного файла
var publicFileLinkType = "publicFileLinkType";
// Тип ссылки-директории
var userDirectoryLinkType = "userDirectoryLinkType";

// Приставка к ID ссылки на файл
var userFileNameLinkIDPrefix = "userFileNameLink_";
// Приставка к ID ссылки на пример
var sampleFileNameLinkIDPrefix = "sampleFileNameLink_";
// Приставка к ID ссылки на опубликованный файл
var publicFileLinkIDPrefix = "publicFileLink_";
// Приставка к ID ссылки на директорию
var userDirectoryLinkIDPrefix = "userDirectoryLink_";

// Приставка к ID чекбокса файла
var userFileCheckBoxIDPrefix = "userFileCheckBox_";
// Приставка к ID чекбокса каталога
var userDirectoryCheckBoxIDPrefix = "userDirectoryCheckBox_";

// Приставка к ID окна с файлом
var publicFileWindowIDPrefix = "publicFileWindowIDPrefix_";

// Тип действия - спокойствие
var linkActionTypeNormal = "linkActionTypeNormal";
// Тип действия - наведен курсор
var linkActionTypeMouseOver = "linkActionTypeMouseOver";
// Тип действия - нажата
var linkActionTypeClick = "linkActionTypeClick";

// Тип файла - файл пользователя
var userFileType = "userFileType";
// Тип файла - пример
var sampleFileType = "sampleFileType";
// Тип файла - опубликованный
var publicFileType = "publicFileType";
// Тип - каталог
var userDirectoryType = "userDirectoryType";


// Список чекбоксов файлов
var filesCheckBoxList = new Array();
// Список чекбоксов каталогов
var foldersCheckBoxList = new Array();

// Недопустимые символы каталога
var incorrectCharInFolderName = "Имя папки не должно содержать" + 
    " следующих знаков: \n" + 
    "/ \ : * ? \" < > |";
    
// Файл с таким именем уже существует
var suchNameAlreadyExists = "Файл с таким именем уже существует";


// ******************************************************************* Публикации *******************************************************************

// Хэш булевых значений — открыт опубликованный файл, или нет
var publishedFilesHash = [];

// Публикация       
PublishCallback = PublishFile;
// Скачивание опубликованного файла
LoadPublicCallback = LoadPublishedFile;

// Максимальный допустимый размер публикуемого
// файла в символах
var maxPublishingFileSize = 11000;
 

// **************************************************************** Командная строка ****************************************************************

// Командная строка
var commandLine = "commandLine";
 
// адрес компилятора
var wdeHref = "http://pascalabc.net/WDE/";

// разделитель параметра
var fileNameParam = "?file=";
// параметр расшаренного файла
var SHARED_FILE_PARAM = "?shared=";

// ******************************************************************* Авторизация ******************************************************************

// Текст входа
var loginText = "Войти";
// Текст выхода
var logoutText = "Выйти";


// ***************************************************************** Работа с файлами ***************************************************************

// Максимальная длина отображаемого имени файла
var MAX_VIEW_FILE_NAME_LENGTH = 22;

// Многоточие
var DOTS_STR = "...";

// Завершение отображаемого имени файла, если оное является
// слишком длинным для полного отображения
var VIEW_FILE_NAME_END = DOTS_STR + pasExt;

// Основной каталог
var MAIN_PATH = "";

// Список файлов
var EXISTING_FILES = new Array();

// Типы фантомных файлов    
var NEW_PHANTOM = "new";            // новый
var SAMPLE_PHANTOM = "sample";      // пример
var PUBLIC_PHANTOM = "public";      // публичный


// Возвращает файл по полному имени
function File_GetFile(fullFileName){
    for (fInd = 0; fInd < EXISTING_FILES.length; ++fInd)
        if (EXISTING_FILES[fInd].fullName == fullFileName)
            return EXISTING_FILES[fInd];
    return null;
}

// Возвращает индекс файла в списке по полному имени
function File_IndexOf(fullFileName){
    for (indF = 0; indF < EXISTING_FILES.length; ++indF)
        if (EXISTING_FILES[indF].fullName == fullFileName)
            return indF;
    return -1;
}

// Удаляет файл из списка по полному имени
function File_DeleteFile(fullFileName){
    var fileInd = File_IndexOf(fullFileName);
    EXISTING_FILES.splice(fileInd, 1);
}

// Возвращает файл по ID вкладки
function File_GetFileByTabID(tabID){
    for (fInd = 0; fInd < EXISTING_FILES.length; ++fInd)
        if ( EXISTING_FILES[fInd].isOpened && (EXISTING_FILES[fInd].tabID == tabID) )
            return EXISTING_FILES[fInd];
    return null;
}


// Возвращает приставку к имени файла по типу
function FileApp_GetPrefixByPhantomType(phantomFileType){
    switch (phantomFileType) {
        case SAMPLE_PHANTOM :
            return sampleLabel;
        case PUBLIC_PHANTOM :
            return publicLabel;
    }
}


// ****************************************************************** Браузер файлов ****************************************************************

// ------------------------------- Переменные
// браузер файлов
var far = null;

// Список директорий
var EXISTING_DIRS = new Array();

// ------------------------------- Константы
// ID блока файлов
var FAR_DIV = "filesListDiv";
// ID таблицы файлов
var FAR_TABLE = "filesTable";

// Файл
var IS_FILE = "FILE";
// Каталог
var IS_DIRECTORY = "DIRECTORY";

// Основной каталог
var MAIN_PATH_ID = "__MAIN_PATH__";

// Максимальное кол-во хранимых файлов
var MAX_FILES_COUNT = 200;

// ------------------------------- Методы
// Возвращает каталог по полному имени
function Directory_GetDirectory(fullDirectoryName){
    for (dInd = 0; dInd < EXISTING_DIRS.length; ++dInd)
        if (EXISTING_DIRS[dInd].fullName == fullDirectoryName)
            return EXISTING_DIRS[dInd];
    return null;
}

// Возвращает индекс файла в списке по полному имени
function Directory_IndexOf(fullDirectoryName){
    for (dInd = 0; dInd < EXISTING_DIRS.length; ++dInd)
        if (EXISTING_DIRS[dInd].fullName == fullDirectoryName)
            return dInd;
    return -1;
}

// Удаляет файл из списка по полному имени
function Directory_DeleteDirectory(fullDirectoryName){
    var directoryInd = Directory_IndexOf(fullDirectoryName);
    EXISTING_DIRS.splice(directoryInd, 1);
}


// ****************************************************************** Скачивание файлов ****************************************************************
DownloadCompiledCallback = DownloadFile;            // обработка нажатия скачивания файлов

// Тип файла
    var EXE_FILE = "EXE_FILE";              // выполняемый
    var DLL_FILE = "DLL_FILE";              // библиотека
    var PCU_FILE = "PCU_FILE";              // модуль
    
var currentWorkFile = null;                 // текущий рабочий файл

var usersPath = "Users_Data/RegUsers/";      // каталог пользователей


// ****************************************************************** Графика Canvas ****************************************************************

var CANVAS_WINDOW_TITLE = "Графическое окно";

// Окно для Canvas'а
var canvasWindow = new Window({className: "alphacube", 
    title: "Graph",
    top: 200,
    left: 200, 
    width: 502, 
    height: 302,
    resizable: true,
    draggable: true,
    maximizable: true,
    onResize: function () {CanvasWindowOnResize();},
    onMaximize: function () {CanvasWindowOnResize();},
    onClose: function() {stop_programm();}
});
canvasWindow.getContent().innerHTML = "<div id='canvasDiv' style='border:1px solid #999999'>" +
    "<canvas id='canvas' width='500' height='300'>" +
    "</canvas>" + 
    "</div>"; 
    
// Объект Canvas'а
var canvas = document.getElementById("canvas");

// Открывающий тег команды Canvas
var CANVAS_OPEN_TAG = "<cc>";
// Закрывающий тег команды Canvas
var CANVAS_CLOSE_TAG = "</cc>";

//  Формат команды
var OPEN_CANVAS_CMD = "var canvas = document.getElementById('canvas');\n" + 
    "if (canvas.getContext) {\n" + 
    "var ctx = canvas.getContext('2d');\n";
var CLOSE_CANVAS_CMD = "}";


// ******************************************************************* Silverlight ******************************************************************

var SILVERLIGHT_UNIT = "SilverlightABC";                    // Имя модуля Silverlight
var SILVERLIGHT_TYPE = "GRAPH_SILVERLIGHT";                 // Тип графического файла - Silverlight
