﻿// ********************************************************************** Общие *********************************************************************

// ID сессии
var currSessionID;
// Статус сессии (new | notNew)
var currSessionStatus;

// IP пользователя
var userIP;
// Имя пользователя (Guest для гостя)
var userName;

// Данные пользователя (имя для зарегистрированного и ID сессии для гостя)
function GetUserID() {
    return (isUser) ? userName : currSessionID;
}

var TRUE_VAL = "true";
var FALSE_VAL = "false";

// Статус пользователя
var User = "User";
// Статус гостя
var Guest = "Guest";

// Пользователь авторизирован
var isUser;
var isAdmin = false;
var isTeacher = false;
var isPupil = false;

// Зафиксирована ли активность пользователя
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";

// Допустимые расширения: SSM 9.07.11
var allExt = [".pas", ".cs", ".fs"];

// Секунда из мс
var sec = 1000;
// Минута из секунд
var min = 60 * sec;
// Период запроса, поддерживающего жизнь сессии
var sessionAlivePeriod = 3 * min;

// ------------------------------------------- сетевое

// Запущен ли какой-то процесс
var someProcessIsRunning = false;
// Запущен ли процесс компилятора
var someCompilerProcessIsRunning = false;

// Отправлен ли запрос на сервер
var queryToServer = false;
// Получен ли ответ с сервера
var answerFromServer = false;
// Связь с сервером была прервана
var connectionServerBroken = false;


function EndRequestHandler(sender, args) {
    AuthorizationButton_Click();
}

//Прерывает запросы на сервер
function BreakQueriesToServer(){
    someProcessIsRunning = false;
    someCompilerProcessIsRunning = false;
    ProgramIsCompiled = false;
    ProgramIsRunned = false;
    HideEnterString();
    SetStatusLineHidden();
}


// **************************************************************** Работа с 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 fileIsRenaming = "Переименование файла..." + 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 isBreaking = "Программа скоро будет завершена. "                    // программа завершается
    + "Пожалуйста, подождите...";
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 COMPILATION_SERVER_ERROR = "При компиляции произошла неизвестная ошибка на сервере";    
var EXECUTION_SERVER_ERROR = "При выполнении программы произошла неизвестная ошибка на сервере"; 
var STOP_PROGRAMM_SERVER_ERROR = "При попытке завершить программу произошла неизвестная ошибка на сервере";      
var LOADING_FIRST_SERVER_ERROR = "При попытке загрузить содержимое первого файла произошла неизвестная ошибка на сервере";  
var LOADING_SESSION_FILES_SERVER_ERROR = "При попытке загрузить список файлов произошла неизвестная ошибка на сервере"; 
var LOADING_USER_FILE_ITEMS_SERVER_ERROR = "При попытке загрузить список файлов пользователя произошла неизвестная ошибка на сервере";  
var LOADING_SAMPLE_LIST_SERVER_ERROR = "При попытке загрузить список примеров произошла неизвестная ошибка на сервере";
var CHECKING_NEW_FNAME_SERVER_ERROR = "При проверке имени файла произошла неизвестная ошибка на сервере";  
var RENAMING_FILE_SERVER_ERROR = "При переименовании файла произошла неизвестная ошибка на сервере";  
var CHECKING_PUBLIC_FNAME_SERVER_ERROR = "При проверке имени публичного файла произошла неизвестная ошибка на сервере";     
var SAVING_FILE_SERVER_ERROR = "При сохранении файла произошла неизвестная ошибка на сервере";      
var LOADING_SAMPLE_SOURCE_SERVER_ERROR = "При загрузке содержимого файла примера произошла неизвестная ошибка на сервере";      
var LOADING_USER_SOURCE_SERVER_ERROR = "При загрузке содержимого файла пользователя произошла неизвестная ошибка на сервере";  
var LOADING_GUEST_SOURCE_SERVER_ERROR = "При загрузке содержимого файла гостя произошла неизвестная ошибка на сервере";                           
var PUBLISHING_FILE_SERVER_ERROR = "При публикации файла произошла неизвестная ошибка на сервере";  
var LOADING_PUBLIC_SOURCE_SERVER_ERROR = "При загрузке содержимого публичного файла произошла неизвестная ошибка на сервере";    
var LOADING_FILE_SOURCES_SERVER_ERROR = "При скачивании файлов исходных кодов произошла неизвестная ошибка на сервере";  
var SHARING_SERVER_ERROR = "При открытии общего доступа произошла неизвестная ошибка на сервере"; 


// ------------------------------- Информирование о процессах
var inProcess = "Пожалуйста, подождите. Запущен процесс ";              // процесс запущен
var inCompilerProcess = "Пожалуйста, подождите. Компилятор занят. Запущен процесс ";

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 fullCompilerProcessMessage;
     

// ************************************************************* Константы скрытых полей ************************************************************

// ------------------------------- Статус сессии
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;
// Прервать запросы на сервер
BreakQueriesCallback = BreakQueriesToServer;

// Массив недопустимых при сохранении файла символов
incorrectChars = ["/", "|", ":", "*", "?", "\"", "<", ">", "|", "\\"];
// Массив недопустимых символов каталога
incorrectDirChars = ["|", ":", "*", "?", "\"", "<", ">", "|", "\\"];

// Максимальная длина имени файла, отображаемого на вкладках
var VIEW_EA_FILE_NAME_LEN = 25;


// Менеджер редактора, через него будем работать
var EAManager = new EditorManager();


// ------------------------------- Сообщения об ошибках сохранения как
var incorrectCharInFileName = "Имя файла не должно содержать" +     // имя файла содержит недопустимые символы
    " следующих знаков: \n" + 
    "/ \ : * ? \" < > |";
    
var incorrectCharInDirName = "Имя каталога не должно содержать" +   
    " следующих знаков: \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 UnitFileTypeEnum = {
    COMMON : 0,
    PT4_WEB : 1
}


// ***************************************************************** Рабочая панель *****************************************************************

// Тип ссылки-файла пользователя
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 publicFilesBrowser = { DivID: "PublishedFilesDiv", VarName: "publicFilesBrowser", 
    OnFileClick: publicFilesBrowser_OnPublishedFileClick, OnDirectoryClick: null };
 

// ******************************************************************** Sharing *********************************************************************

// Открытие общего файла
LoadSharedCallback = LoadSharedFile;

// **************************************************************** Командная строка ****************************************************************

// Командная строка
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){
    var fInd = 0;
    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 userVFB;


// браузер файлов
var far = null;

// браузер учебных файлов
var learnFar = null;
var testVFB = null;

// Список директорий
var EXISTING_DIRS = new Array();

// ------------------------------- Константы
// ID блока файлов
var FAR_DIV = "filesListDiv";
// ID таблицы файлов
var FAR_TABLE = "filesTable";

// ID тестового блока
var LEARN_FAR_DIV = "learningFilesListDiv";

// Файл
var IS_FILE = "FILE";
// Каталог
var IS_DIRECTORY = "DIRECTORY";

// Основной каталог
var MAIN_PATH_ID = "__MAIN_PATH__";

// Максимальное кол-во хранимых файлов
var MAX_FILES_COUNT = 200;

// Разделитель частей в ссылках
var LINK_ID_PART_DELIM = "::";

var fileItemLink_linkPrefix = "link";                   // означает ссылку
var fileItemLink_checkboxPrefix = "checkbox";           // означает чекбокс

var fileItemLink_filePrefix = "file";                   // означает ссылку на файл
var fileItemLink_directoryPrefix = "directory";         // означает ссылку на каталог

// ------------------------------- Методы
// Возвращает каталог по полному имени
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;
// Объект Canvas'а
var canvas;

// Окно для 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'" +
        "style='overflow:scroll'" + 
        "onmousedown='canvasMouseDownHandler(event);'" + 
        "onmouseup='canvasMouseUpHandler(event);'" + */
        /*"onmousemove='canvasMouseMoveHandler(event);'>" + */
    /*"</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 = "}";

// ------------------------------ События

var BUFF_MAX_SIZE = 150;            // Максимальный размер буфера
var SEND_EVTS_INTERVAL = 250;       // Период отправлений команд на сервер

var PROCESS_CMD_INTERVAL = 50;      // Период обработки буфера графических команд

var SECRETLY = "__2767_JS_EVT_76_72__";

var JS_EVT_BLOCK_O = '<evtb>';      // Открывающий тег блока событий
var JS_EVT_BLOCK_C = '</evtb>';     // Закрывающий тег блока событий
var JS_EVT_DELIM = '&';             // Разделитель событий           
var JS_EVT_O = '<ev>';              // Открывающий тег события
var JS_EVT_C = '</ev>';             // Закрывающий тег события
var JS_EVT_NAME_O = '<en>';         // Открывающий тег имени события
var JS_EVT_NAME_C = '</en>';        // Закрывающий тег имени события
var JS_PAR_DELIM = ';';             // Разделитель параметров события
var JS_PAR_BLOCK_DELIM = '|';       // Резделитель блоков параметров события

var JS_SLEEP_O = '<slp>';
var JS_SLEEP_C = '</slp>';

//  КОДЫ СОБЫТИЙ
var E_ALL_CLOSED_CODE = 0;
var E_MOUSE_DOWN_CODE = 1;
var E_MOUSE_UP_CODE = 2;
var E_MOUSE_MOVE_CODE = 3;


// ******************************************************************* Задачник PT4 *****************************************************************

var PT4_WINDOW_TITLE = "Задачник PT4";

// Окно для задачника
var pt4WebWindow;

LoadPT4TaskCallback = OpenPT4TaskLoadingPanel;
ViewPT4ResultsCallback = ViewPT4ResultsWindow;

// Окно для задачника
/*var pt4WebWindow = new Window({className: "alphacube", 
    title: "PT4",
    top: 200,
    left: 200, 
    width: 702, 
    height: 502,
    resizable: true,
    draggable: true,
    maximizable: true,
    onClose: function() {stop_programm();}
});*/
/*pt4WebWindow.getContent().innerHTML = ;*/

// ========================================== Статистика выполнения заданий ==========================================

// Имя блока с учебной статистикой
var DIV_LEARN_PT4_STAT = "divLearningPT4Statistics";

// Есть ли подкаталоги
var currentDirHasSubDirs = false;    

var PT4_SUMMARY_STAT_TITLE = "Сводная статистика PT4";
// Окно для сводной статистики
var PT4SummaryStatisticsWindow = new Window({className: "alphacube", 
    title: PT4_SUMMARY_STAT_TITLE,
    top: 250,
    left: 200, 
    resizable: true,
    draggable: true,
    maximizable: false,
    minimizable: false,
    onHide: function() {
        if (PT4DirStatIsShown == PT4DirStatisticsStateEnum.CURR) 
            PT4LearnStatSummaryClose();
        else 
            PT4LearnStatSubDirsSummaryClose();
    },
    onShow: function() {
        PT4SummaryStatisticsWindow.updateWidth();
        PT4SummaryStatisticsWindow.updateHeight();
    },
    onResize: function() {
        DIVPT4SummaryStatisticsWindow.style.width = PT4SummaryStatisticsWindow.width.toString() + "px";
        DIVPT4SummaryStatisticsWindow.style.height = PT4SummaryStatisticsWindow.height.toString() + "px";
    },
    onClose: function() {
        PT4SummaryStatisticsWindow.hide();
        return false;
    }
});
PT4SummaryStatisticsWindow.getContent().innerHTML = "<div id='PT4SummaryStatisticsWindowDIV' style='overflow:scroll; width:600px; height: 400px;'></div>";
var DIVPT4SummaryStatisticsWindow = $get("PT4SummaryStatisticsWindowDIV");

var PT4_FULL_STAT_TITLE = "Полная статистика PT4";
// Окно для полной статистики
var pt4FullStatisticsWindow = new Window({className: "alphacube", 
    title: PT4_FULL_STAT_TITLE,
    top: 270,
    left: 250, 
    resizable: true,
    draggable: true,
    maximizable: false,
    minimizable: false,
    onHide: function() {
        if (PT4DirStatIsShown == PT4DirStatisticsStateEnum.CURR) 
            PT4LearnStatFullClose();
        else 
            PT4LearnStatSubDirsFullClose();
    },
    onShow: function() {
        pt4FullStatisticsWindow.updateWidth();
        pt4FullStatisticsWindow.updateHeight();
        
    },
    onResize: function() {
        DIVpt4FullStatisticsWindow.style.width = pt4FullStatisticsWindow.width.toString() + "px";
        DIVpt4FullStatisticsWindow.style.height = pt4FullStatisticsWindow.height.toString() + "px";
    },
    onClose: function() {
        pt4FullStatisticsWindow.hide();
        return false;
    }
});
pt4FullStatisticsWindow.getContent().innerHTML = "<div id='pt4FullStatisticsWindowDIV' style='overflow:scroll; width:600px; height: 400px;'></div>";
var DIVpt4FullStatisticsWindow = $get("pt4FullStatisticsWindowDIV");


var PT4_RESULTS_WINDOW_TITLE = "Статистика выполнения заданий PT4";
// Окно для сводной статистики
var PT4ResultsWindow = new Window({className: "alphacube", 
    title: PT4_RESULTS_WINDOW_TITLE,
    top: 250,
    left: 200, 
    resizable: true,
    draggable: true,
    maximizable: false,
    minimizable: false,
    onHide: function() {
        
    },
    onShow: function() {
        PT4ResultsWindow.updateWidth();
        PT4ResultsWindow.updateHeight();
    },
    onResize: function() {
        DIVPT4ResultsWindow.style.width = PT4ResultsWindow.width.toString() + "px";
        DIVPT4ResultsWindow.style.height = PT4ResultsWindow.height.toString() + "px";
    },
    onClose: function() {
        PT4ResultsWindow.hide();
        return false;
    }
});
PT4ResultsWindow.getContent().innerHTML = "<div>"
    + "<input type='checkbox' onchange='checkboxViewSubDirsPT4Results_onchange();' />"
    + "<label>Загружать статистику выполнения заданий в подкаталогах</label>"
    + "<br/><br/>"
    + "<label id='labelPT4ResultsLoadingStatus'></label>"
    + "<div id='PT4ResultsWindowDIV' onclick='ChangePT4ResultsContent();' style='overflow:scroll; width:600px; height: 400px;'></div>"
    + "</div>";
var DIVPT4ResultsWindow = $get("PT4ResultsWindowDIV");  



// ************************************************************** Вьюер сетевых операций ************************************************************

var QUERY_VIEWER_WINDOW_TITLE = "Монитор сетевых операций";

// Окно для вьюера'а
var networkQueryViewerWindow;
// Объект вьюера'а
var networkQueryViewerContent;

// Окно для вьюера'а
/*var networkQueryViewerWindow = new Window({className: "alphacube", 
    title: QUERY_VIEWER_WINDOW_TITLE,
    top: 300,
    left: 400, 
    width: 350, 
    height: 400,
    resizable: true,
    draggable: true,
    maximizable: false,
    closable: false
});
networkQueryViewerWindow.getContent().innerHTML = "<div id='networkQueryViewerContentDiv'"
    + "style='border:0px solid #999999;'"
    + "padding-top:6px>"
    + "</div>"; 
    
// Объект вьюера'а
var networkQueryViewerContent = document.getElementById("networkQueryViewerContentDiv");*/


// ****************************************************************** Учебная панель ****************************************************************

var learningPanelWindow = new Window({className: "alphacube", 
    title: "Учебная панель", 
    top:100, 
    left:100, 
    width:600, 
    height:400, 
    resizable: true,
    draggable: true,
    minimizable: false,
    maximizable: true,
    closable: true,
    onClose: function() {
        Page_Unlock();
        var table = $get('TableTeachersCourses');
        var cnt = table.childNodes.length;
        var i = 0;
        for (i = 0; i < cnt; ++i)
            table.removeChild(table.childNodes[0]);
        table = $get('TablePupilsCourses');
        cnt = table.childNodes.length;
        for (i = 0; i < cnt; ++i)
            table.removeChild(table.childNodes[0]);
        learningPanelWindow.hide();
        return false;
    }
});
learningPanelWindow.getContent().innerHTML = 
    '<div id="DivLearningPanel" runat="server" style="padding:10px; ">'
    +    '<table border="0">'
    +    '<tr>'
    +        '<td width="300px">'
    +            '<label style="font-size:18px; font-weight:bold;">Учебная панель</label>'
    +        '</td>'
    +        '<td valign="top" align="right" >'
    +            '<pre style="padding:0px; margin:0px;">'
    +            '<input id="CheckboxLearnPanelStatus" type="checkbox" runat="server" style="display:none" onchange="LearnPanel_Hide();" />'
    +            '</pre>'
    +        '</td>'
    +        '<td valign="top" align="left">'  
    +            '<div id="DivLearnPanelStatus" style="background-color:#EEEEEE; font-size:14px"><pre style="padding:0px; margin:0px"></pre></div>'
    +        '</td>'
    +    '</tr>'
    +    '</table>'
    +    '<a href="LearnCourses.aspx" target="learn_courses_window" style="font-size:11px; padding-left:100px">список курсов</a>'
    +    '<div id="DivTeacherPartLearningPanel" runat="server">'
    +        '<div style="height:5px"></div>'
    +        '<div style="background-color:#EFEFEF; font-size:17px; padding-left:5px">Я — преподаватель</div>'
    +        '<div style="height:5px"></div>'
    +        '<label id="LabelNoTeacherCourses" runat="server" style="font-style:italic; font-size:13px">Курсов не найдено</label>'
    +        '<table id="TableTeachersCourses" runat="server" border="1" cellpadding="3"'
    +           'style="margin: 0px 0px 0px 0px; padding: 0px" ></table>'
    +    '</div>'
    +    '<div id="DivPupilPartLearningPanel" runat="server">'
    +        '<div style="height:5px"></div>'
    +        '<div style="background-color:#EFEFEF; font-size:17px; padding-left:5px">Я — ученик</div>'
    +        '<div style="height:5px"></div>'
    +        '<label id="LabelNoPupilCourses" runat="server" style="font-style:italic; font-size:13px">Курсов не найдено</label>'
    +        '<table id="TablePupilsCourses" runat="server" border="1" cellpadding="3" cellspacing="3" '
    +           'style="margin: 0px; padding: 0px" ></table>'
    +    '</div>'
    +'</div>';


// ***************************************************************** Браузер примеров ***************************************************************

// Браузер примеров
var samplesVFB; // = new VirtualFileBrowser("DivSamplesBrowser", userName, "samplesVFB");

/*  Это делается при создании в методе LoadSampleBrowser
samplesVFB.BrowserTitle = "Примеры";
samplesVFB.DisplayEmptyBrowser();

samplesVFB.OnFileClick = samplesVFB_OnFileClick;
samplesVFB.OnDirectoryClick = samplesVFB_OnDirectoryClick;
samplesVFB.OnParentDirectoryClick = samplesVFB_OnParentDirectoryClick;*/


// ******************************************************************* Silverlight ******************************************************************

var SILVERLIGHT_UNIT = "SilverlightABC";                    // Имя модуля Silverlight
var SILVERLIGHT_TYPE = "GRAPH_SILVERLIGHT";                 // Тип графического файла - Silverlight

// Инициализация окон монитора операций, графики и задачника
function LoadWindows(){
    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'" +
            "style='overflow:scroll'" + 
            "onmousedown='canvasMouseDownHandler(event);'" + 
            "onmouseup='canvasMouseUpHandler(event);'" + 
        "</canvas>" + 
        "</div>";
    canvas = document.getElementById("canvas");   
    
    pt4WebWindow = new Window({className: "alphacube", 
        title: "PT4",
        top: 200,
        left: 200, 
        width: 702, 
        height: 502,
        resizable: true,
        draggable: true,
        maximizable: true,
        onClose: function() {stop_programm();}
    });

    networkQueryViewerWindow = new Window({className: "alphacube", 
        title: QUERY_VIEWER_WINDOW_TITLE,
        top: 300,
        left: 400, 
        width: 350, 
        height: 400,
        resizable: true,
        draggable: true,
        maximizable: false,
        closable: false
    });
    networkQueryViewerWindow.getContent().innerHTML = "<div id='networkQueryViewerContentDiv'"
        + "style='border:0px solid #999999;'"
        + "padding-top:6px>"
        + "</div>"; 
        
   networkQueryViewerContent = document.getElementById("networkQueryViewerContentDiv");
}
