///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//   Образовательный портал v2.0 // Функции на JavaScript                    //
//   ----------------------------------------------------------------------  //
//   Copyright (C) 1998-2007 web-studio "Cherry-Design"                      //
//   URL: http://www.cherry-design.spb.ru/                                   //
//   E-mail: cherry-design@mail.ru                                           //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

// Массив, проверяемых в форме полей
required = new Array(

    "user[login]",
    "user[new]",
    "user[new_confirm]",
    "user[password]",
    "user[password_confirm]",
    "user[name]",
    "user[email]",
    "user[company]",
    "user[job]",
    "user[request]",
    "user[subject]",
    "user[body]",

    "upload[file]",

    "index[text]",

    "news[title]",
    "news[text]",

    "entry[city]",
    "entry[title]",
    "entry[text]",

    "event[title]",
    "event[text]",

    "article[author]",
    "article[title]",
    "article[text]",

    "link[url]",
    "link[title]",
    "link[text]",

    "gallery[file]",
    "gallery[author]",
    "gallery[title]",

    "text[category_title]",
    "text[title]",
    "text[text]",

    "consultation[title]",
    "consultation[question]",

    "voting[title]",
    "voting[question]",
    "voting[answers]",

    "channel[category_title]",
    "channel[title]",
    "channel[url]",

    "message[title]",
    "message[text]"

);

// Массив сообщений при проверке соответствующих полей
required_show = new Array(

    "логин",
    "новый пароль",
    "новый пароль еще раз",
    "пароль",
    "пароль еще раз",
    "Ваше имя",
    "электронный адрес",
    "название организации",
    "Вашу должность",
    "текст заявки",
    "тему сообщения",
    "текст сообщения",

    "путь к файлу для загрузки",

    "текст первой страницы",

    "заголовок новости",
    "текст новости",

    "название города",
    "название учреждения",
    "описание учреждения",

    "заголовок события",
    "описание события",

    "имя автора",
    "название статьи",
    "текст статьи",

    "URL сайта",
    "название сайта",
    "краткое описание",

    "путь к фотографии для загрузки",
    "имя автора",
    "название фотографии",

    "название пункта меню",
    "заголовок страницы",
    "текст страницы",

    "тему вопроса",
    "текст вопроса",

    "название опроса",
    "текст вопроса",
    "варианты ответов",

    "название пункта меню",
    "название канала",
    "URL канала",

    "название темы",
    "текст сообщения"

);

// Массив, проверяемых в форме электронных адресов
required_email = new Array(
    "user[email]"
);

// Регулярное выражение для проверки корректности электронного адреса
var regexp_email = /^[a-z0-9_-]+(\.[a-z0-9_-]+)*@([a-z0-9-]+\.)+[a-z]{2,4}$/i;

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                  Функция проверки формы, перед отправкой                  //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function send_form(form_id) {

    var i, j, email;

    // Проверяем, что заполнены все обязательные поля
    for(j=0; j<required.length; j++) {
        for (i=0; i<document.getElementById(form_id).length; i++) {
            if (document.getElementById(form_id).elements[i].name == required[j] && document.getElementById(form_id).elements[i].value == "" ) {
                alert('Пожалуйста, введите ' + required_show[j]);
                document.getElementById(form_id).elements[i].focus();
                return false;
            }
        }
    }

    // Проверяем корректность электронных адресов
    for(j=0; j<required_email.length; j++) {
        for (i=0; i<document.getElementById(form_id).length; i++) {
            if (document.getElementById(form_id).elements[i].name == required_email[j]) {
                if (!regexp_email.test(document.getElementById(form_id).elements[i].value)) {
                    alert('Введен некорректный электронный адрес');
                    document.getElementById(form_id).elements[i].focus();
                    return false;
                }
            }
        }
    }

    return true;
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//               Функция удаления начальных и конечных пробелов              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function trim(str) {

    // Удаляем начальные пробелы и символы табуляции
    while (str.substr(0,1) == " " || str.substr(0,1) == "\t") {
        str = str.substr(1, str.length-1);
    }

    // Удаляем конечные пробелы и символы табуляции
    while (str.substr(str.length-1,1) == " " || str.substr(str.length-1,1) == "\t") {
        str = str.substr(0, str.length-1);
    }

    return str;
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                    Функция чтения выделенного фрагмента                   //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function get_selection() {

    var selection = "";

    // Создаем объект, содержащий текстовую форму
    var textarea = document.getElementById("f_text"); 

    // Обрабатываем Internet Explorer и Opera
    if (document.selection) {

        // Находим выделенный фрагмент текста
        selection = document.selection.createRange().text;

    // Обрабатываем FireFox
    } else if (textarea.selectionStart || textarea.selectionStart == "0") {

        // Находим выделенный фрагмент текста
	    selection = (textarea.value).substring(textarea.selectionStart, textarea.selectionEnd); 
    }

    // Корректируем концы строк, преобразуя "\r\n" в "\n"
    selection = selection.replace(/\r/g, "");

    return selection;
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//            Функция записи строки на место выделенного фрагмента           //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function set_selection(selection) {

    // Создаем объект, содержащий текстовую форму
    var textarea = document.getElementById("f_text"); 

    // Обрабатываем Internet Explorer и Opera
    if (document.selection) {

        textarea.focus();

        // Вставляем обработанный фрагмент обратно в форму
        document.selection.createRange().text = selection;

        // Позиционируем курсор
        textarea.caretPos = document.selection.createRange().duplicate(); 

    // Обрабатываем FireFox
    } else if (textarea.selectionStart || textarea.selectionStart == "0") {

        textarea.focus();

        // Запоминуем текущую поизцию курсора
        var startPos = textarea.selectionStart;
        var endPos = textarea.selectionEnd;
        var scrollTop = textarea.scrollTop;

        // Вставляем обработанный фрагмент обратно в форму
        textarea.value = textarea.value.substring(0, textarea.selectionStart) + selection + textarea.value.substring(textarea.selectionEnd, textarea.value.length);

        // Позиционируем курсор
		var caretPos = startPos + selection.length;
		textarea.selectionStart = caretPos;
		textarea.selectionEnd = caretPos;
		textarea.scrollTop = scrollTop;
    }
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                          Функция печати списка                            //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function print_list(type) {

    // Находим выделенный фрагмент текста
    var selection = get_selection();
    if (selection == "") {

        // Формируем вспомогательный текст, если отсутствует выделение
        switch (type) {

            case "indent":
                selection = "Первый абзац с отступом\nВторой абзац с отступом";
                break
            case "definition":
                selection = "Первый термин\nОпределение первого термина\nВторой термин\nОпределение второго термина";
                break
            default:
                selection = "Первый элемент списка\nВторой элемент списка\nТретий элемент списка";
        }
    }

    // Разбираем выделенный фрагмент на строки
    var str_array = selection.split("\n");

    // Преобразуем каждую строку в массиве
    for (i=0; i<str_array.length; i++) {

        // Удаляем лишние пробелы
        str_array[i] = trim(str_array[i]);

        // Формируем нужный тип списка
        if (str_array[i] != "") {

            switch (type) {

                case "ordered":
                    str_array[i] = "# " + str_array[i];
                    break;
                case "unordered":
                    str_array[i] = "* " + str_array[i];
                    break;
                case "indent":
                    str_array[i] = ": " + str_array[i];
                    break;
                case "definition":

                    if (i%2 == 0) {
                        str_array[i] = "; " + str_array[i];
                    } else {
                        str_array[i-1] += " : " + str_array[i];
                        str_array[i] = "";
                    }

                    break;
            }
        }
    }
    
    // Объединяем массив в одну строку
    selection = "\n" + str_array.join("\n") + "\n";
    selection = selection.replace(/\n\n/g, "\n")

    // Вставляем обработанный фрагмент обратно в форму
    set_selection(selection);
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                          Функция печати таблицы                           //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function print_table() {

    // Находим выделенный фрагмент текста
    var selection = get_selection();

    if (selection == "") {

        selection  = "\n!Название столбца  ! Название столбца !  Название столбца!\n";
        selection += "|По левому краю    |    По центру     |   По правому краю|\n";
        selection += "|По левому краю    |    По центру     |   По правому краю|\n";

    } else {
    
        // Разбираем выделенный фрагмент на строки
        var str_array = selection.split("\n");
    
        // Удаляем лишние пробелы
        for (i=0; i<str_array.length; i++) {
            str_array[i] = trim(str_array[i]);
        }
    
        // Преобразуем каждую строку в заголовок таблицы
        selection = "\n" + "! " + str_array.join(" ! ") + " !" + "\n";
    }

    // Вставляем обработанный фрагмент обратно в форму
    set_selection(selection);
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//             Функция обработки команды вставки строчного тега              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function print_inline_tag(start, end, sample) {

    // Находим выделенный фрагмент текста
    var selection = get_selection();
    if (selection == "") {
        selection = sample;
    }

    // Обрабатываем выделенный фрагмент
    if (selection.charAt(selection.length-1) == " ") {
        selection = selection.substring(0, selection.length - 1); 
        selection = start + selection + end + " ";
    } else {
        selection = start + selection + end;
    }
        
    // Вставляем обработанный фрагмент обратно в форму
    set_selection(selection);
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//             Функция обработки команды вставки блочного тега               //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function print_block_tag(start, end, sample) {

    // Находим выделенный фрагмент текста
    var selection = get_selection();
    if (selection == "") {
        selection = sample;
    }

    // Обрабатываем выделенный фрагмент
    selection = "\n" + start + trim(selection) + end + "\n";

    // Вставляем обработанный фрагмент обратно в форму
    set_selection(selection);
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//           Функция обработки команд редактирования в редакторе             //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function edit_action(action) {

    switch (action) {

        case "strong":
            print_inline_tag("'''","'''","Полужирный шрифт");
            break;
        case "em":
            print_inline_tag("''","''","Наклонный шрифт");
            break;
        case "header":
            print_block_tag("== "," ==","Текст заголовка");
            break;
        case "link":
            print_inline_tag("[[Module:1.2|","]]","Текст ссылки");
            break;
        case "external":
            print_inline_tag("[http://www.example.com/ ","]","Текст ссылки");
            break;
        case "image":
            insert_image("picture.jpg");
            break;
        case "file":
            insert_file("archive.zip");
            break;
        case "ordered":
            print_list("ordered");
            break;
        case "unordered":
            print_list("unordered");
            break;
        case "indent":
            print_list("indent");
            break;
        case "definition":
            print_list("definition");
            break;
        case "table":
            print_table();
            break;
        case "line":
            print_block_tag("----","","");
            break;
    }
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//            Функция добавления в текст ссылки на изображение               //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function insert_image(image_id) {

    // Находим выделенный фрагмент текста и используем его в качестве подписи
    var selection = get_selection();
    if (selection) {
        image_id += "|";
    }

    print_block_tag("[[Image:" + image_id, "]]", "");

}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//           Функция добавления в текст ссылки на файл для загрузки          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function insert_file(file_id) {

    // Находим выделенный фрагмент текста и используем его в качестве подписи
    var selection = get_selection();
    if (selection) {
        file_id += "|";
    }

    print_inline_tag("[[File:" + file_id, "]]", "");

}

