/* За основу взят объект, написанный автором Sardar */ // Массив экземпляров объекта var textAreaSelectionObjects = []; // Получаем экземпляр объекта function getTextAreaSelection(id) { // Получаем объект synhe 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; } }, getText : function() { return this.target.value; }, setText : function(text) { this.target.value = text; } } 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 setStrikethrough(id) { getTextAreaSelection(id).setSelectedText('[s]','[/s]'); } /* function setUnderline(id) { getTextAreaSelection(id).setSelectedText('[u]','[/u]'); } */ function setAlignLeft(id) { getTextAreaSelection(id).setSelectedText('[align=left]','[/align]'); } function setAlignCenter(id) { getTextAreaSelection(id).setSelectedText('[align=center]','[/align]'); } function setAlignRight(id) { getTextAreaSelection(id).setSelectedText('[align=right]','[/align]'); } function setLink(id) { getTextAreaSelection(id).setSelectedText('[url]','[/url]'); } function setImage(id) { getTextAreaSelection(id).setSelectedText('[img]','[/img]'); } function setQuote(id) { getTextAreaSelection(id).setSelectedText('[quote]','[/quote]'); } /* function setUser(id) { getTextAreaSelection(id).setSelectedText('[user]','[/user]'); } */