Проблема решилась!
var Handled;
// блокировать обработку, если уже поймали событие в OnKeyDown.
function OnKeyPress(ev)
{
if (Handled) return false;
}
function OnKeyDown(ev)
{
Handled = false;
if (!ev) ev = window.event;
if (ev.ctrlKey)
{
if (ev.keyCode==17) return;
var tag = "";
var tag_param = false;
// определяем тег в зависимости от нажатой клавиши
switch (key = String.fromCharCode(ev.keyCode).toUpperCase())
{
case "B":
case "U":
case "I": tag = key; break;
case "Q": tag = "SPOILER"; tag_param = true; break;
case "R": tag = "URL"; tag_param = true; break;
default: return;
}
Handled = true;
var edit = ev.target;
var opentag = (tag_param) ? ("["+tag+"=\"\"]") : ("["+tag+"]");
var closetag = "[/"+tag+"]";
// вставка тегов вокруг выделенного текста
edit.focus(); // ! ie?
if (edit.selectionStart==null) // некий неясный финт ушами
{
var rng=document.selection.createRange();
rng.text=opentag+rng.text+closetag;
}
else
{
var selStart = edit.selectionStart;
edit.value = edit.value.substring(0,selStart)+opentag+
edit.value.substring(selStart,edit.selectionEnd)+closetag+
edit.value.substring(edit.selectionEnd);
// поставить курсор после открывающего тега (или между кавычками, если они есть
edit.selectionStart = selStart + opentag.length - ((tag_param) ? 2 : 0);
edit.selectionEnd = edit.selectionStart;
}
// отменить дальнейшую обработку
ev.returnValue = false;
ev.stopPropagation();
ev.preventDefault();
return false;
} // if
}
function init()
{
document.getElementById("msgedit").onkeydown = MemoOnKeyDown;
document.getElementById("msgedit").onkeypress = MemoOnKeyPress;
}
Теперь еще осталось найти замену ev.target для осла...