я как то писал такое, то я там такой интерфейс использовал (но только под IE5, хотя вроде и в IE4 должен работать)
// файл editor.js
var anons= null;
var news = null;
var stat= null;
function initEditor()
{
anons = document.frames["anonsF"].document;
anons.designMode = "On";
news = document.frames["newsF"].document;
news.designMode = "On";
stat = \'anons\';
}
// делает элемент списка
function setList()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "InsertUnorderedList");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (ItalicButton.style.borderStyle == "inset")
{
ItalicButton.style.borderStyle = "outset";
}
else
{
ItalicButton.style.borderStyle = "inset";
}
}
function execIt(range, command, interf, value)
{
if (range.text.length > 0)
{
r = range.execCommand(command,interf,value);
range.select();
}
else
{
range.pasteHTML(" ");
range.moveStart("character", -1)
range.select();
r = range.execCommand(command,interf,value);
range.text = "";
}
return r;
}
// делает текст толстым
function setBold()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "Bold");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (boldButton.style.borderStyle == "inset")
{
boldButton.style.borderStyle = "outset";
}
else
{
boldButton.style.borderStyle = "inset";
}
}
// делает текст толстым
function setItalic()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "Italic");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (ItalicButton.style.borderStyle == "inset")
{
ItalicButton.style.borderStyle = "outset";
}
else
{
ItalicButton.style.borderStyle = "inset";
}
}
// вставляет тег BR
function setBR()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
range.pasteHTML("
");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
range.select();
}
function setColor()
{
// если цвет не был выбран - error
if (colorText.value == "")
{
alert("Вы не указали цвет !");
return 0;
}
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
if (redButton.style.borderStyle == "inset")
{
execIt(range,"RemoveFormat");
redButton.style.borderStyle = "outset";
}
else
{
execIt(range,"ForeColor",true,"#"+colorText.value);
redButton.style.borderStyle = "inset";
}
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
}
function getEditorHTML()
{
if (stat == "news")
{
alert(news.body.innerHTML);
}
else
{
alert(anons.body.innerHTML);
}
}
function insertHR()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
range.execCommand("InsertHorizontalRule");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
}
function AddLink()
{//Identify selected text
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
if (!range=="")
{
//Create link
range.execCommand("CreateLink",1);
}
}
function addImage()
{//Identify selected text
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
if (!range=="")
{
//Create image
range.execCommand("insertImage",1);
}
}
function addColor1(colorN)
{
colorText.value=colorN;
document.all[\'colors\'].style.visibility="hidden";
setColor();
}
function formSubmit()
{
document.forma.anonsFF.value=anons.body.innerHTML;
document.forma.newsFF.value =news.body.innerHTML;
document.forma.submit();
return true;
}
// выравнивание текста по левому краю
function alignL()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "JustifyLeft");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (justifyL.style.borderStyle == "inset")
{
justifyL.style.borderStyle = "outset";
}
else
{
justifyL.style.borderStyle = "inset";
}
}
// выравнивание по центру.
function alignC()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "JustifyCenter");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (justifyC.style.borderStyle == "inset")
{
justifyC.style.borderStyle = "outset";
}
else
{
justifyC.style.borderStyle = "inset";
}
}
// выравнивание по правому краю
function alignR()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "JustifyRight");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (justifyR.style.borderStyle == "inset")
{
justifyR.style.borderStyle = "outset";
}
else
{
justifyR.style.borderStyle = "inset";
}
}
// выравнивание по двум краям
function alignF()
{
if (stat == "news")
{
var range = news.selection.createRange();
}
else
{
var range = anons.selection.createRange();
}
execIt(range, "JustifyFull");
if (stat == "news")
{
newsF.focus();
}
else
{
anonsF.focus();
}
if (justifyF.style.borderStyle == "inset")
{
justifyF.style.borderStyle = "outset";
}
else
{
justifyF.style.borderStyle = "inset";
}
}