// ************ Обрамление выделеного фрагмента тегами bbcode ************
// см http://test.webew.ru/articles/259.webew и function bbcode($str)
// >>> За основу взят объект, написанный автором Sardar <Sardar@vingrad.ru>
// Массив экземпляров объекта
var textAreaSelectionObjects = [];
// Получаем экземпляр объекта
function getTextAreaSelection(id) {
    if (typeof(textAreaSelectionObjects[id]) == "undefined") {
        textAreaSelectionObjects[id] = new textAreaSelectionHelper(id);
    }
    return textAreaSelectionObjects[id];
}
// Конструктор, принимает в качестве аргумента ID текстарии
function textAreaSelectionHelper(id) {
    var obj = document.getElementById(id);
    this.target = obj;
    // Создаем свойства carretHandler для доступа к объекту в контексте узла
    // из обработчиков событий
    this.target.carretHandler = this;
    // Добавляем обработчик событий
    this.target.onchange = _textareaSaver;
    this.target.onclick = _textareaSaver;
    this.target.onkeyup = _textareaSaver;
    this.target.onfocus = _textareaSaver;
    if(!document.selection) this.target.onSelect = _textareaSaver;
    // Свойства для запоминания позиции выделения
    this.start=-1;
    this.end=-1;
    this.scroll=-1;
    this.iesel=null;
}
// В прототип записываем методы
textAreaSelectionHelper.prototype = {
    // Получим выделение
    getSelectedText : function() {
        return this.iesel? this.iesel.text: (this.start>=0&&this.end>this.start)? this.target.value.substring(this.start,this.end): "";
    },
    // Установим текстовые фрагменты до выделения - text
    // и после него, если нужно - secondtag
    setSelectedText : function(text, secondtag) {
        if (this.iesel) {
            if (typeof(secondtag) == "string") {
                var l = this.iesel.text.length;
                this.iesel.text = text + this.iesel.text + secondtag;
                this.iesel.moveEnd("character", -secondtag.length);
                this.iesel.moveStart("character", -l);
            } else {
                this.iesel.text = text;
            }
            this.iesel.select();
        } else if (this.start >= 0 && this.end >= this.start) {
            var left = this.target.value.substring(0, this.start);
            var right = this.target.value.substr(this.end);
            var scont = this.target.value.substring(this.start, this.end);
            if (typeof(secondtag) == "string") {
                this.target.value = left + text + scont + secondtag + right;
                this.end = this.target.selectionEnd=this.start+text.length+scont.length;
                this.start = this.target.selectionStart = this.start + text.length;
            } else {
                this.target.value = left + text + right;
                this.end = this.target.selectionEnd = this.start + text.length;
                this.start = this.target.selectionStart = this.start + text.length;
            }
            this.target.scrollTop = this.scroll;
            this.target.focus();
        } else {
            this.target.value += text + ((typeof(secondtag) == "string") ? secondtag: "");
            if (this.scroll >= 0) this.target.scrollTop = this.scroll;
        }
    }
}
// Обработчик событий. Занимается сохранением информации о выделении и позиции скролла
function _textareaSaver() {
    if(document.selection) {
        this.carretHandler.iesel = document.selection.createRange().duplicate();
    } else if(typeof(this.selectionStart) != "undefined") {
        this.carretHandler.start = this.selectionStart;
        this.carretHandler.end = this.selectionEnd;
        this.carretHandler.scroll = this.scrollTop;
    } else {
        this.carretHandler.start = this.carretHandler.end = -1;
    }
}
// Клиентские функции, хотя можно обойтись и без них
function setBold(id) { // Жирность
    getTextAreaSelection(id).setSelectedText('[b]', '[/b]');
}
function setItalic(id) { // Курсив
    getTextAreaSelection(id).setSelectedText('[i]', '[/i]');
}
function setUnderline(id) { // Подчеркивание
    getTextAreaSelection(id).setSelectedText('[u]', '[/u]');
}
function setLink(id, url) {
	var url = prompt("Введите URL", (url ? url : "http://"));
	if (!url || url == "") return;
	if (checkURL(url)) {
		getTextAreaSelection(id).setSelectedText("[url="+url+"]", "[/url]");
	} else {
		alert("Ссылка в неверном формате");
		setLink(id, url);
	}
}
function setSyntax(id, button, evt) {
	var div;
	if (typeof id == "undefined") {
		if (div = gebi("syntaxId")) div.style.display = "none";
		return;
	}
	evt = evt || window.event;
	evt.cancelBubble = true;
	var typeArray = [
		["html","HTML"],
		["js","JavaScript"],
		["css","CSS"],
		["php","PHP"],
		["mysql","MySQL"],
		["xml", "XML"],
		["bash", "bash"],
		["diff", "diff"],
		["perl", "Perl"],
		["python", "Python"],
		["ruby", "Ruby"],
		["java", "Java"],
		["cpp", "C++"]
	];
	if (!(body = document.body)) return;
	if (!gebi("syntaxId")) {
		div = ce("div");
		div.id = "syntaxId";
		div.className = "syntaxList";
		div.style.display = "none";
		body.appendChild(div);
	}
	div = gebi("syntaxId");
	div.style.top = (absPosition(button).y + button.offsetHeight) + "px";
	div.style.left = absPosition(button).x + "px";
	div.innerHTML = "";
	for (var i = 0; i < typeArray.length; i++) div.innerHTML += "<a onclick=\"getTextAreaSelection('" + id + "').setSelectedText('[syntax="+typeArray[i][0]+"]', '[/syntax]'); return false;\" href=\"#\">"+typeArray[i][1]+"<\/a>"
	div.style.display = "";
}
addHandler(
	document,
	"click",
	function () {setSyntax();}
);
function setQuote(id) {
	var source = prompt("Источник цитаты", "");
	if (!source) source = false;
	getTextAreaSelection(id).setSelectedText("[quote" + (source ? "="+source : "") + "]", "[/quote]");
}
function setImg(id, url) {
	var url = prompt("Введите URL изображения", (url ? url : "http://"));
	if (!url || url == "") return;
	if (checkURL(url)) {
		getTextAreaSelection(id).setSelectedText("[img=", "]"+url+"[/img]");
	} else {
		alert("Ссылка в неверном формате");
		setImg(id, url);
	}
}

