// Функция показа дополнительных изменений
function recent_more(more) {
	if (more == '') more = 10;
	count = geByClass("recentItem").length;	
	t = 0;		
	for (n = 0; n < count; n++) {
		if (geByClass("recentItem")[n].style.display == 'none') {			
			geByClass("recentItem")[n].style.display = '';
			t++;	
		}		
		if (n == count-1) document.getElementById("recentMoreShow").style.display = 'none';
		if (t >= more) break;
	}
}

// Функция показа дополнительных комментариев
function comment_more(more) {
	if (more == '') more = 10;
	count = geByClass("commentItem").length;	
	t = 0;	
	for (n = 0; n < count; n++) {		
		if (geByClass("commentItem")[n].style.display == 'none') {
			geByClass("commentItem")[n].style.display = '';
			t++;	
		}
		if (n == count-1) document.getElementById("commentMoreShow").style.display = 'none';
		if (t >= more) break;
	}
}

// Функция показа всех подкомментариев
function subcomment_more(commentid) {	
	count = geByClass("subcommentItem" + commentid).length;	
	for (n = 0; n < count; n++) geByClass("subcommentItem" + commentid)[n].style.display = '';
	document.getElementById("subcommentMoreShow" + commentid).style.display = 'none';
}

// Функция проверки заполнения полей
function comment_post(userid, commentid) {	
	if (document.getElementById("f_comment" + commentid).value != "") {	
		if (userid > 0) {
			return true;
		} else if (document.getElementById("f_name" + commentid).value != "") {
			return true;
		}
	}
	return false;
}

// Функция проверки заполнения полей
function message_post(messageid) {	
	if (document.getElementById("f_message" + messageid).value != "") return true;
	return false;
}

// Функция показа дополнительных сообщений
function messages_more(more) {
	if (more == '') more = 10;
	count = geByClass("messageItem").length;	
	t = 0;	
	for (n = count-1; n >= 0; n--) {		
		if (geByClass("messageItem")[n].style.display == 'none') {
			geByClass("messageItem")[n].style.display = '';
			t++;	
		}
		if (n == 0) document.getElementById("messagesMoreShow").style.display = 'none';
		if (t >= more) break;
	}
}

// Функция проверки заполнения полей
function note_post(userid, noteid) {	
	if (document.getElementById("f_content" + noteid).value != "" && document.getElementById("f_title" + noteid).value != "") {	
		if (userid > 0) {
			return true;
		} else if (document.getElementById("f_name" + noteid).value != "") {
			return true;
		}
	}
	return false;
}
// Функция показа дополнительных комментариев
function note_more(more) {
	if (more == '') more = 10;
	count = geByClass("noteItem").length;	
	t = 0;	
	for (n = 0; n < count; n++) {		
		if (geByClass("noteItem")[n].style.display == 'none') {
			geByClass("noteItem")[n].style.display = '';
			t++;	
		}
		if (n == count-1) document.getElementById("noteMoreShow").style.display = 'none';
		if (t >= more) break;
	}
}

// Функция запроса подтверждения на удаление странички или файла
function confirm_delete(type) {
    // Обрабатываем запрос на удаление страницы
    if (type == "page") {
        // Если в форме редактирования удален весь текст
        if (document.getElementById("f_text").value == "") {    
            // Запрашиваем у пользователя подтверждение и возвращаем результат
            return confirm("Вы действительно хотите удалить данную страничку?");
        }
	// Обрабатываем запрос на удаление
    } else if (type == "pageitem") {
        return confirm("Вы действительно хотите удалить данную страничку?");
	// Обрабатываем запрос на удаление
    } else if (type == "fileitem") {
        return confirm("Вы действительно хотите удалить данный файл?");
	// Обрабатываем запрос на удаление
    } else if (type == "comment") {
        return confirm("Вы действительно хотите удалить комментарий?");
	// Обрабатываем запрос на удаление
    } else if (type == "note") {
        return confirm("Вы действительно хотите удалить заметку?");
    // Обрабатываем запрос на удаление файла
    } else {
        // Если новое имя файла указано, а сам файл для загрузки не выбран
        if (document.getElementById("f_file").value == "" && document.getElementById("f_filename").value != "") {    
            // Запрашиваем у пользователя подтверждение и возвращаем результат
            return confirm("Вы действительно хотите удалить этот файл?");
        }
    }
    return true;
}

// Функция печати панели инструментов
function print_toolbar() {
    // Печатаем панель инструментов в виде HTML-кода
    document.write("<p class=\"toolbar\">");
    document.write("<a href=\"javascript:edit_action('strong');\" title=\"Полужирный шрифт\"><span>Полужирный шрифт</span></a> ");
    document.write("<a href=\"javascript:edit_action('em');\" title=\"Наклонный шрифт\" class=\"separator\"><span>Наклонный шрифт</span></a> ");
    document.write("<a href=\"javascript:edit_action('header');\" title=\"Заголовок 2-го уровня\" class=\"separator\"><span>Заголовок 2-го уровня</span></a> ");
    document.write("<a href=\"javascript:edit_action('link');\" title=\"Внутренняя ссылка\"><span>Внутренняя ссылка</span></a> ");
    document.write("<a href=\"javascript:edit_action('external');\" title=\"Внешняя ссылка\" class=\"separator\"><span>Внешняя ссылка</span></a> ");
    document.write("<a href=\"javascript:edit_action('image');\" title=\"Ссылка на изображение\"><span>Ссылка на изображение</span></a> ");
    document.write("<a href=\"javascript:edit_action('file');\" title=\"Ссылка на загружаемый файл\" class=\"separator\"><span>Ссылка на загружаемый файл</span></a> ");
    document.write("<a href=\"javascript:edit_action('ordered');\" title=\"Нумерованный список\"><span>Нумерованный список</span></a> ");
    document.write("<a href=\"javascript:edit_action('unordered');\" title=\"Маркированный список\" class=\"separator\"><span>Маркированный список</span></a> ");
    document.write("<a href=\"javascript:edit_action('indent');\" title=\"Текст с отступом\"><span>Текст с отступом</span></a> ");
    document.write("<a href=\"javascript:edit_action('definition');\" title=\"Список терминов\"><span>Список терминов</span></a> ");
    document.write("<a href=\"javascript:edit_action('pre');\" title=\"Неформатированный текст\" class=\"separator\"><span>Неформатированный текст</span></a> ");
    document.write("<a href=\"javascript:edit_action('table');\" title=\"Таблица\"><span>Таблица</span></a> ");
    document.write("<a href=\"javascript:edit_action('line');\" title=\"Разделительная линия\"><span>Разделительная линия</span></a>");
    document.write("</p>");
}

// Функция удаления начальных и конечных пробелов
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 и WebKit
    } 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 и WebKit
    } 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
            case "pre":
                selection = "Неформатированный текст\n   с сохранением\n      всех отступов";
                break
            default:
                selection = "Первый элемент списка\nВторой элемент списка\nТретий элемент списка";
        }
    }
    // Разбираем выделенный фрагмент на строки
    var str_array = selection.split("\n");
    // Преобразуем каждую строку в массиве
    for (i=0; i<str_array.length; i++) {
        // Удаляем лишние пробелы, но только в случае,
        // если не выбрана команда неформатированного текста
        if (type != "pre") {
            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;
                case "pre":
                    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("[[0|","]]","Текст ссылки");
            break;
        case "external":
            print_inline_tag("[http://www.example.com/ ","]","Текст ссылки");
            break;
        case "image":
            print_inline_tag("[[Image:0|","]]","Описание изображения");
            break;
        case "file":
            print_inline_tag("[[File:0|","]]","Описание файла для скачивания");
            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 "pre":
            print_list("pre");
            break;
        case "table":
            print_table();
            break;
        case "line":
            print_block_tag("----","","");
            break;
    }
}
