
var rte_space_url = "http://us.i1.yimg.com/us.yimg.com/i/space.gif";
var rteFaces = null, rteSizes = null;
var rteMenus = null;
var rteToolOn = null;

var rte_menu_css = ".rte_btn { padding:0 2px; width:100%; border-width:0; background-color:transparent; padding:0 3px; font:12px Georgia; cursor:default; } .rte_btn img { padding-right:3px; } .rte_btn span { white-space:nowrap; float:left; vertical-align:middle; } .rte_sel { background-color:lightBlue; } img { border:0; vertical-align:middle; } td { padding:0; }";

function rteSetupSelects() {

  if(rteFaces && rteSizes) { return; }

  var f = [
    { v:"arial", l:rte_lang.arial },
    { v:"arial narrow", l:rte_lang.arial_narrow },
    { v:"arial black", l:rte_lang.arial_black },
    { v:"comic sans ms", l:rte_lang.comic_sans },
    { v:"courier new", l:rte_lang.courier },
    { v:"georgia", l:rte_lang.georgia },
    { v:"system", l:rte_lang.system },
    { v:"times new roman", l:rte_lang.times },
    { v:"verdana", l:rte_lang.verdana } ];

  rteFaces = [ { v:"", c:null, l:rte_lang.font_face } ];
  for(var x = 0, len = f.length; x < len; x++) {
    rteFaces.push({cmd:"FontName", v:f[x].v, c:"font-family:"+f[x].v, l:f[x].l });
  }

  var sz = [
   "xx-small", "x-small", "small", "medium", "large",
   "x-large", "xx-large" ];

  rteSizes = [ { v:"", c:null, l:rte_lang.font_size } ];
  for(var s, x = 0, len = sz.length; x < len; x++) {
    s = ""+(x+1);
    rteSizes.push({cmd:"FontSize", v:s, c:"font-size:"+sz[x], l:s });
  }

  rteMenus = {
    rte_emenu:{ createFn:rteCreateEmotMenu, css:"img { padding:2px; }" },
    rte_cmenu:{ createFn:rteCreateColorMenu, css:"td { font-size:1px; } img { border:1px solid white; } .rte_sel img { border-color:#ccc #aaa #aaa #ccc !important; }" },
    rte_amenu:{ createFn:rteCreateAlignMenu, css:"" },
    rte_lmenu:{ createFn:rteCreateListMenu, css:"" },
    rte_fmenu:{ createFn:rteCreateSelMenu, args:rteFaces, css:"" },
    rte_smenu:{ createFn:rteCreateSelMenu, args:rteSizes, css:"" }
  };
}
var rte_def_size = "2";
var rte_def_font = "georgia";

var rte_emot_alts = [
  ':)', ':(', ';)', ':D', ';;)',
  ':-/', ':x', ':&quot;&gt;', ':p', ':*',
  ':O', 'X-(', ':&gt;', 'B-)', ':-s',
  '&gt;:)', ':((', ':))', ':|', '/:)',
  'O:)', ':-B', '=;', 'I-)', '8-|',
  ':-&amp;', ':-$', '[-(', ':o)', '8-}', 
  '(:|', '=P~', ':-?', '#-o', '=D&gt;' ];

var rte_emots = [ 
  '01', '02', '03', '04', '05',
  '06', '07', '08', '09', '10',
  '11', '12', '13', '14', '15',
  '16', '17', '18', '19', '20',
  '21', '22', '23', '24', '25',
  '26', '27', '28', '29', '30',
  '31', '32', '33', '34', '35',
  '37', '39', '40', '47', '50' ];

var rte_colors = [
  '#000000', '#111111', '#2d2d2d', '#434343', '#5b5b5b', '#737373',
  '#8b8b8b', '#a2a2a2', '#b9b9b9', '#d0d0d0', '#e6e6e6', '#ffffff',
  '#7f7f00', '#bfbf00', '#ffff00', '#ffff40', '#ffff80', '#ffffbf', 
  '#525330', '#898a49', '#aea945', '#c3be71', '#e0dcaa', '#fcfae1',
  '#407f00', '#60bf00', '#80ff00', '#a0ff40', '#c0ff80', '#dfffbf',
  '#3b5738', '#668f5a', '#7f9757', '#8a9b55', '#b7c296', '#e6ebd5',
  '#007f40', '#00bf60', '#00ff80', '#40ffa0', '#80ffc0', '#bfffdf',
  '#033d21', '#438059', '#7fa37c', '#8dae94', '#acc6b5', '#ddebe2',
  '#007f7f', '#00bfbf', '#00ffff', '#40ffff', '#80ffff', '#bfffff',
  '#033d3d', '#347d7e', '#609a9f', '#96bdc4', '#b5d1d7', '#e2f1f4',
  '#00407f', '#0060bf', '#0080ff', '#40a0ff', '#80c0ff', '#bfdfff',
  '#1b2c48', '#385376', '#57708f', '#7792ac', '#a8bed1', '#deebf6',
  '#00007f', '#0000bf', '#0000ff', '#4040ff', '#8080ff', '#bfbfff',
  '#212143', '#373e68', '#444f75', '#585e82', '#8687a4', '#d2d1e1',
  '#40007f', '#6000bf', '#8000ff', '#a040ff', '#c080ff', '#dfbfff',
  '#302449', '#54466f', '#655a7f', '#726284', '#9e8fa9', '#dcd1df',
  '#7f007f', '#bf00bf', '#ff00ff', '#ff40ff', '#ff80ff', '#ffbfff',
  '#4a234a', '#794a72', '#936386', '#9d7292', '#c0a0b6', '#ecdae5',
  '#7f003f', '#bf005f', '#ff007f', '#ff409f', '#ff80bf', '#ffbfdf',
  '#451528', '#823857', '#a94a76', '#bc6f95', '#d8a5bb', '#f7dde9',
  '#800000', '#c00000', '#ff0000', '#ff4040', '#ff8080', '#ffc0c0',
  '#441415', '#82393c', '#aa4d4e', '#bc6e6e', '#d8a3a4', '#f8dddd',
  '#7f3f00', '#bf5f00', '#ff7f00', '#ff9f40', '#ffbf80', '#ffdfbf',
  '#482c1b', '#855a40', '#b27c51', '#c49b71', '#e1c4a8', '#fdeee0' ];

var rteTO = 0;

function rteSetTO(fn, delay) {
  if(rteTO) { clearTimeout(rteTO); }
  rteTO = setTimeout(fn, delay);
}

function rteClearTO() {
  if(rteTO) { clearTimeout(rteTO); rteTO = 0; }
}

function rteEventPage() {

  rteEditToolDone();
}

var rteLastRTE = null;

function rteSyncToolbar(rte) {

  if(rte) { rteLastRTE = rte; }
  if(rteLastRTE) { rteSetTO(function() { rteLastRTE.updateToolbar(); }, 75); }
}

function rteEventDocUpdate() {

  rteEditToolDone();
  rteSyncToolbar(null);
}

function rteEventCancel(ev) {

  if(! ev) { return false; }

  if(document.all) {
    ev.cancelBubble = true;
    ev.returnValue = false;
  }
  else {
    ev.preventDefault();
    ev.stopPropagation();
  }

  return false;
};

function rteEventTarget(ev) {
  if(document.all) { return ev.srcElement; }
  return ev.target;
}

function rteFindTag(obj, tag) {

  while(obj && obj.tagName != tag) { obj = obj.parentNode; }
  return obj;
}

function rteFindMenu(td) {

  var div = rteFindTag(td, 'DIV');
  return rteMenus[div.id].menu;
}

function rteEventTD(ev) {

  var obj = rteEventTarget(ev);
  return rteFindTag(obj, 'TD');
}

function rteEventToolDown(ev) {

  var td = rteEventTD(ev);
  var tool = td._tool;
  if(! tool) { return; }

  if(rteToolOn && (rteToolOn != tool)) { rteToolOn.toolUp(0); }

  rteToolOn = tool;
  tool.toolDown(td, 1);

  return rteEventCancel(ev);
}

function rteEditToolDone(tool) {

  if(! rteToolOn) { return null; }

  var act = (tool == rteToolOn);

  if(! rteToolOn.toolUp(act)) { rteToolOn = null; }

  return act?tool:null;
}

function rteEventToolOver(ev) { 

  var td = rteEventTD(ev);
  var tool = td._tool;
  if(! tool) { return; }

  if(typeof rteToolOn == "undefined") { return; }
  if(! rteToolOn) { tool.setMode(td, "over"); }
  else if(rteToolOn == tool) { tool.toolDown(td, 0); }
  else { tool.setMode(td, "x"); }
}

function rteEventToolOut(ev) {

  var td = rteEventTD(ev);
  var tool = td._tool;
  if(! tool) { return; }
  
  if(typeof rteToolOn == "undefined") { return; }
  if(tool == rteToolOn) {
    if(! tool._menu) { tool.setMode(td, "over"); }
  }
  else {
    tool.setMode(td, "x");
  }
}

function rteEventToolUp(ev) {

  var td = rteEventTD(ev);
  if(td._tool) { td._tool.toolClick(td); }

  return rteEventCancel(ev);
}

function RTETool(rte, toolFn, tag, cmd, update, menu) {

  if(! rte) { return; }

  this.id = rte.id+"_"+tag; 
  this._rte = rte;
  this._toolFn = toolFn;
  this._tag = tag;
  this._cmd = cmd;
  this.update = update;

  this._menu = menu;
  this._curVal = null;
}

RTETool.prototype.makeTD = function (r, title) {

  var obj = rteCreateE(r, 'td');
  obj._tool = this;
  if(this.update) { obj._update = this; }

  obj.id = this.id;
  obj.className = 'rte_tool';
  rteAddEvent(obj, "mouseover", rteEventToolOver);
  rteAddEvent(obj, "mouseout", rteEventToolOut);
  rteAddEvent(obj, "mousedown", rteEventToolDown);
  rteAddEvent(obj, "mouseup", rteEventToolUp);
  rteAddEvent(obj, "click", rteEventCancel);
  rteAddEvent(obj, "drag", rteEventCancel);

  var vobj = this._toolFn.call(this._rte, this._tag, title);
  obj.appendChild(vobj);

  return obj;
}

RTETool.prototype.obj = function () {
  return document.getElementById(this.id);
}

RTETool.prototype.setMode = function (obj, mode) {

  var c;

  if(mode) { this._mode = mode; }
  else { mode = this._mode; }

  if(mode == "down") { c = "rte_tool rte_down"; }
  else if(this._curVal) { c = "rte_tool rte_on"; }
  else if(mode == "over") { c = "rte_tool rte_over"; }
  else { c = "rte_tool"; }

  obj.className = c;
}

RTETool.prototype.posBottom = function (obj) {

  for(var t = obj.offsetHeight; obj; obj = obj.offsetParent) {
    t += obj.offsetTop;
  }

  return t;
}

RTETool.prototype.posLeft = function (obj) {

  for(var l = 0; obj; obj = obj.offsetParent) {
    l += obj.offsetLeft;
  }

  return l;
}

RTETool.prototype.toolDown = function (obj, clk) {

  if(this._menu && clk) {
    this._menu.menuShow(this, this._rte);
  }

  this.setMode(obj, "down");
}

RTETool.prototype.toolUp = function (act) {

  var obj = this.obj();

  if(this._menu) {

    if(this._menu.hot && act) { return true; }

    this._menu.menuHide();
  }

  this.setMode(obj, act?"over":"x");

  return false;
}

RTETool.prototype.toolClick = function (obj) {

  if(! rteEditToolDone(this)) { return; }

  if(! this._menu) {
    this.setMode(obj, "over");
    this.toolAction(null);
  }
}

RTETool.prototype.toolCmdAction = function (cmd, arg) {

  var rte = this._rte;

  if(cmd == "HiliteColor") {
    if(document.all) {
      cmd = "BackColor";
    } else if(rte.is_gecko) {
      rte.command('useCSS', false); // gecko tries bgcolor on font tag, :P
    }
  }
  rte.command(cmd, arg);
}

RTETool.prototype.toolAction = function (arg) {

  this.toolCmdAction(this._cmd, arg);
}

RTETool.prototype.updateState = function (obj, doc) {

  this._curVal = this._rte.queryCmdState(doc, this._cmd);

  this.setMode(obj);
}

function RTEMenu(id, specs) {

  this._curElem = null;
  this._tool = null;
  this.id = id;
  this._args = {};
  this._cnt = 0;
  this.specs = specs;
}

RTEMenu.prototype.makeTD = function (p) {

  if(p.tagName != 'TR') { p = rteCreateE(p, 'tr'); }
  return rteCreateE(p, 'td');
}

RTEMenu.prototype.obj = function () {

  var obj = document.getElementById(this.id);
  if(! obj) { obj = this.loadMenu(); }

  return obj;
}

RTEMenu.prototype.menuHide = function () {

  this.obj().style.visibility = 'hidden';
  rteClearTO();
  this._tool = null;
}

RTEMenu.prototype.loadMenu = function () {

  var css = rte_menu_css;
  if(this.specs.css) { css += " " + this.specs.css; }
  var fr = rteCreateIFrame(document.body, "rte_box", this.id, css, '', 1);

  var doc = fr.contentWindow.document;
  var div = rteCreateE(doc.body, 'div');
  div.id = this.id;
  div.className = 'rte_box';
  this.specs.createFn(this, rteCreateTable(div), this.specs.args);

  var st = fr.style;
  var obj = div.firstChild;
  st.width = (obj.clientWidth+6)+"px";
  st.height = (obj.clientHeight+6)+"px";
  st.padding = "0px";
  st.visibility = 'hidden';

  return fr;
}

RTEMenu.prototype.menuShow = function (tool, rte) {

  this._tool = tool;
  var obj = tool.obj();

  var st = this.obj().style;
  st.left = tool.posLeft(obj)+"px";
  st.top = tool.posBottom(obj)+"px";

  if(st.visibility != 'visible') {
    st.visibility = 'visible';
    this.hot = true;
    rteSetTO(function(){if(rteToolOn) { rteToolOn._menu.hot = false; } }, 250);
  }

}

RTEMenu.prototype.menuBlink = function (start) {

  if(start) { this._blink = 0; }

  switch(this._blink) {

  case 0:
    this._curElem.className = "";
    break;

  case 1:
    this._curElem.className = "rte_sel";
    break;

  default:
    var tool = this._tool;

    rteEditToolDone();

    if(tool) {
      var arg = this._args[this._curElem.id];
      tool.toolCmdAction(arg.cmd, arg.v);
    }

    return;
  } 
  this._blink++;

  rteSetTO(function() { if(rteToolOn) { rteToolOn._menu.menuBlink(false); } }, 100);
}

function rteEventMenuOver(ev) {
  rteEventTD(ev).className = "rte_sel";
}

function rteEventMenuOut(ev) {
  rteEventTD(ev).className = "";
}

function rteEventMenuClick(ev) {

  var td = rteEventTD(ev);
  var menu = rteFindMenu(td);

  menu._curElem = td;
  menu.menuBlink(true);

  return rteEventCancel(ev);
}

RTEMenu.prototype.appendItem = function (p, bodyObj, fnClick, arg) {

  var td = this.makeTD(p);

  td.id = "arg"+menu._cnt++;
  rteAddEvent(td, "mousedown", rteEventCancel);
  rteAddEvent(td, "click", rteEventCancel);
  rteAddEvent(td, "mouseover", rteEventMenuOver);
  rteAddEvent(td, "mouseout", rteEventMenuOut);
  rteAddEvent(td, "mouseup", fnClick);
  td.appendChild(bodyObj);

  this._args[td.id] = arg;

  return td;
}

RTEMenu.prototype.appendButton = function (tb, tag, label, cmd) {

  var doc = tb.ownerDocument;
  var btn = doc.createElement('button');
  btn.className = "rte_btn";

  var span = rteCreateE(btn, 'span');
  var img = rteImgObj(doc, "http://us.i1.yimg.com/us.yimg.com/i/us/pim/el/tb_"+tag+"_1.gif", 22);
  span.appendChild(img);

  var txt = doc.createTextNode(" " + label);
  span.appendChild(txt);

  this.appendItem(tb, btn, rteEventMenuClick, { cmd:cmd });
}

function rteCreateE(p, tag) {

  var obj = p.ownerDocument.createElement(tag);
  p.appendChild(obj);

  return obj;
}

function rteCreateTable(p) {

  var t = rteCreateE(p, 'table');
  t.cellSpacing = 0;
  t.cellPadding = 0;

  return rteCreateE(t, 'tbody');
}

function rteCreateIFrame(p, className, id, css, txt, hide) {

  var fr = p.ownerDocument.createElement('iframe');
  fr.className = className;
  fr.id = id;

  if(hide) {
    var st = fr.style;
    st.left = "-800px";
    st.top = "0px";
    st.position = 'absolute';
    fr.scrolling = "no";
  }

  p.appendChild(fr);

  var win = fr.contentWindow;
  if(! win) { win = window.frames[id]; }
  var doc = win.document;

  doc.open("text/html");
  doc.write('<html><head><style type="text/css">'+css+' body { border-style:none; background:white; margin:3px; padding:0; }</style></head><body>'+txt+'</body></html>');
  doc.close();

  return fr;
}

function rteImgObj(doc, src, sz) {

  var img = doc.createElement('img');
  img.width = sz;
  img.height = sz;
  img.style.width = sz+"px";
  img.style.height = sz+"px";
  img.src = src;

  return img;
}

function rteEmotURL(index) {
  return "http://us.i1.yimg.com/us.yimg.com/i/mesg/tsmileys2/"+rte_emots[index]+".gif";
}

function rteEmotObj(doc, index) {
  return rteImgObj(doc, rteEmotURL(index), 18);
}

function rteCreateSelText(css, label) {

  if(css) { return '<span style="'+css+'">'+label+'</span>'; }
  return '<span>'+label+'</span>';
}

function rteCreateSelOption(doc, label) {

  var btn = doc.createElement('button');
  btn.className = "rte_btn";

  btn.innerHTML = label;

  return btn;
}

function rteCreateSelMenu(menu, tb, options) {

  var btn, label, opt;
  var doc = tb.ownerDocument;

  for(var x = 1, len = options.length; x < len; x++) {
    opt = options[x];
    label = rteCreateSelText(opt.c, opt.l);
    btn = rteCreateSelOption(doc, label);
    menu.appendItem(tb, btn, rteEventMenuClick, opt);
  }
}

function rteCreateEmotMenu(menu, tb) {

  var doc = tb.ownerDocument;

  for(var tr, i = 0, len = rte_emots.length; i < len;) {

    tr = rteCreateE(tb, 'tr');

    for(var j = 0; j < 5; j++) {

      menu.appendItem(tr, rteEmotObj(doc, i), rteEventSelectEmot, i);

      if(++i == len)
        break;
    }
  }
}

function rteCreateAlignMenu(menu, tb) {

  menu.appendButton(tb, "justleft", rte_lang.align_left, "JustifyLeft");
  menu.appendButton(tb, "justctr", rte_lang.align_center, "JustifyCenter");
  menu.appendButton(tb, "justright", rte_lang.align_right, "JustifyRight");
}

function rteCreateListMenu(menu, tb) {

  menu.appendButton(tb, "listnum", rte_lang.numbered, "InsertOrderedList");
  menu.appendButton(tb, "listblt", rte_lang.bulleted, "InsertUnorderedList");
}

function rteCreateColorMenu(menu, tb) {

  var doc = tb.ownerDocument;

  for(var td, tr, j, i = 0, len = rte_colors.length; i < len;) {

    tr = rteCreateE(tb, 'tr');

    for(j = 0; j < 12; j++) {

      var color = rte_colors[i];
      td = menu.appendItem(tr, rteImgObj(doc, rte_space_url, 9), rteEventSelectColor, color);
      td.style.backgroundColor = color;
      td.style.borderColor = color;
      
      if(++i == len)
        break;
    }
  }
}

RTEPopup.prototype = new RTETool();

function RTEPopup(rte, toolFn, tag, cmd, update, menuTag) {

  if(! rte) { return; }

  menu = this.createMenu(menuTag);
  RTETool.call(this, rte, toolFn, tag, cmd, update, menu);
}

RTEPopup.prototype.createMenu = function (tag) {

  var id = "rte_"+tag;

  if(! rteMenus[id].menu) { 
    rteMenus[id].menu = new RTEMenu(id, rteMenus[id]);
  }

  return rteMenus[id].menu;
}

function RTESelect(rte, toolFn, useCSS, tag, cmd, defVal) {

  RTEPopup.call(this, rte, toolFn, tag, cmd, 1, tag);
  this._useCSS = useCSS;
  this._defVal = defVal;
}

RTESelect.prototype = new RTEPopup();

RTESelect.prototype.updateState = function (obj, doc) {

  if(this._rte.queryCmdIndeterm(doc, this._cmd)) {
    this._curVal = "0";
  }
  else {
    this._curVal = this._rte.queryCmdValue(doc, this._cmd);
    if(! this._curVal) { this._curVal = this._defVal; }
  }

  this.setMode(obj);
}

RTESelect.prototype.setLabel = function (l) {

  var td = document.getElementById(this.id+'_lbl');
  td.innerHTML = l;
}

RTESelect.prototype.setMode = function (obj, mode) {
  
  if(! this._curVal) { return; }

  var l = this.getLabel(this._curVal);
  if(l) { this.setLabel(l); }
}

RTESelect.prototype.getOption = function (val) {

  var options = this._menu.specs.args;

  for(var x = options.length; --x > 0; ) {
    if(val == options[x].v) { break; }
  }

  return options[x];
}

RTESelect.prototype.getLabel = function (val) {

  var op = this.getOption(val);

  if(op == this.curOption) { return null; }
  this.curOption = op;

  return rteCreateSelText(this._useCSS?op.c:null, op.l);
}

RTESelect.prototype.makeTD = function (r, w) {

  var l = this.getLabel(this._defVal);
  var txt = '<table cellpadding="0" cellspacing="0"><tr><td style="width:'+w+'em; white-space:nowrap" id="'+this.id+'_lbl">'+l+'</td><td><img src="http://us.i1.yimg.com/us.yimg.com/i/yg/img/ui/down.gif" width="12" height="11"></td></tr></table>';

  return RTEPopup.prototype.makeTD.call(this, r, txt);
}

function rteID(id) {
  return document.getElementById(id);
}
function rteIDE(id) {
  return document.getElementById(id)._rte;
}

function rteAddEvent(obj, evType, fn) {

  if(obj.addEventListener){
    obj.addEventListener(evType, fn, false);
  }
  else if(obj.attachEvent) {
    obj.attachEvent("on"+evType, fn);
  }
  else {
    alert("Handler could not be attached");
  }
}


function rteEventEditUnload(ev) {
  if(typeof rteClearTO != "undefined") { rteClearTO(); }
  if((typeof rteLastRTE != "undefined") && rteLastRTE) { rteLastRTE.unload(); }
}

function rteMakeEH(id, txt) {
  return new Function("event", "if(typeof rteIDE != 'undefined') { var obj = rteIDE('"+id+"'); if(obj) { obj."+txt+"; } }");
}

function RTE(tv) {

  this._tvid = tv.id;
  this.id = this._tvid+"e";
  this._frid = this._tvid+"_fr";
  this._tbid = this.id+"_tb";
  this._vsid = this.id+"_vs";
  this.is_gecko = (navigator.product == "Gecko");
  this.is_saf = (navigator.userAgent.toLowerCase().indexOf("safari") != -1);

  rteSetupSelects();

  var div = document.createElement('div');
  div.className = "rte_edit";
  div.id = this.id;
  div._rte = this;

  var tvo = tv.offsetTop + tv.offsetHeight;

  tv._rte = this;
  tv.style.display = "none";
  tv.style.visibility = "visible";
  tv.parentNode.insertBefore(div, tv);

  var tb = rteCreateE(div, 'div');
  var fr = this.initEditor(div, tv.value);
  var doc = this.doc();

  this.createToolbar(doc, tb);

  fr.style.height = Math.max(tvo - fr.offsetTop - 2, 50)+"px";

  var leg = document.createElement('div');
  tv.parentNode.insertBefore(leg, tv.nextSibling);
  this.createLegend(leg);

  var events = [ "keydown", "keypress", "mousedown", "mouseup", "drag" ];
  for(var x in events) { 
    rteAddEvent(doc, events[x], rteEventDocUpdate);
  }
  events = [ "keypress", "mousedown", "mouseup" ];
  for(var x in events) { 
    rteAddEvent(document, events[x], rteEventPage);
  }

  if(doc.parentWindow) {
    rteAddEvent(doc.parentWindow, "blur", rteMakeEH(tv.id, "unload()"));
    rteAddEvent(doc.parentWindow, "focus", rteMakeEH(tv.id, "load()"));
  }
  else {
    rteAddEvent(doc, "blur", rteMakeEH(tv.id, "unload()"));
    rteAddEvent(doc, "focus", rteMakeEH(tv.id, "load()"));
  }
  rteAddEvent(tv, "focus", rteMakeEH(tv.id, "src_edit()"));
  
  if(document.all) { window.onbeforeunload = rteEventEditUnload; }
  else { window.onunload = rteEventEditUnload; }

  rteLastRTE = this;
  this.updateToolbar();

  if(this.is_saf || ! this.is_gecko) { return; }

  for(var x in rteMenus) { 
    if(rteMenus[x].menu) { rteMenus[x].menu.obj(); }
  }
}

function rteBrowserOK() {
	//set browser vars
	var ua = navigator.userAgent.toLowerCase();
	// isSafari = (ua.indexOf("safari") != -1);
	isKonqueror = (ua.indexOf("konqueror") != -1);

	//check to see if designMode mode is available
	if (document.getElementById && document.designMode && !isKonqueror) {
		return true;
	} else {
		return false;
	}
}

RTE.prototype.getHTML = function (doc) {

 return doc.body.innerHTML;
}

RTE.prototype.setHTML = function (doc, val) {

  doc.body.innerHTML = val;
}

RTE.prototype.win = function() {
  return rteID(this._frid).contentWindow;
}

RTE.prototype.doc = function() {
  return this.win().document;
}

RTE.prototype.src_edit = function () {
  this._src_edit = 1;
}

RTE.prototype.unload = function () {

  if(this._src_edit) { return; }

  var tv = rteID(this._tvid);
  if(tv) { tv.value = this.getHTML(this.doc()); }
}

RTE.prototype.load = function () {

  rteLastRTE = this;
  if(! this._src_edit) { return; }

  var tv = rteID(this._tvid);
  if(tv) { this.setHTML(this.doc(), tv.value); }

  this._src_edit = 0;
}

RTE.prototype.command = function (command, arg) {

  var win = this.win();
  if(command == "rtc_link") {

    var szURL = prompt(rte_lang.enter_url+":", "http://");
    if(szURL && (szURL != "")) {
      var range = this.sel2Range(this.selection(win));
      var szSel = this.rangeHTML(range);
      if(szSel == "") { szSel = prompt(rte_lang.enter_link+":"); }
      if(szSel && (szSel != "")) {
	var html = '<a href="' + szURL + '">' + szSel + '</a>&nbsp;';
        this.insertHTML(html);
      }
    }
  }
  else {
  // alert(command);
    win.focus();
    try {
      win.document.execCommand(command, false, arg);
    }
    catch(e) {
      alert("ID: "+this.id + " CMD(" + command + ") " + e);
    }
    win.focus();
  }

  rteSyncToolbar(this);
}

RTE.prototype.queryCmdState = function (doc, cmd) {

  try { return doc.queryCommandState(cmd); } catch(e) {}

 return null;
}

RTE.prototype.queryCmdValue = function (doc, cmd) {

  var v = "";

  try {
    v = ""+doc.queryCommandValue(cmd);
    v = v.toLowerCase();
  } catch(e) {}

  return v;
}

RTE.prototype.queryCmdIndeterm = function (doc, cmd) {

  try { return doc.queryCommandIndeterm(cmd);
  } catch(e) { return true; }
}

RTE.prototype.postLoad = function () {

  var doc = this.doc();
  doc.designMode = "on";

  if(! this.is_gecko) { return; }

  setTimeout(new Function("", "var ed = rteID('"+this.id+"'); if(ed) { try { var rte = ed._rte; rte.doc().designMode = 'on'; rte.command('useCSS', true); rte.updateToolbar(); } catch(e) {} }"), 50);
}

RTE.prototype.initEditor = function (p, txt) {

  var def_size = "x-small";
  if(! document.all) { def_size = "small"; }

  var css = "body { font:"+def_size+" "+rte_def_font+";}";

  var fr = rteCreateIFrame(p, "rte_ifr", this._frid, css, txt, 0);

  var doc = this.doc();
  doc._rte = this;

  this.postLoad();

  return fr;
}

RTE.prototype.emotImg = function (index) {

  var txt = [];
  txt.push('<img src="'+rteEmotURL(index)+'" width="18" height="18"');
  if(index < rte_emot_alts.length) { 
    txt.push(' alt="'+rte_emot_alts[index]+'"');
  }
  txt.push('>');
  return txt.join('');
}

function rteEventSelectEmot(ev) {

  var td = rteEventTD(ev);
  var menu = rteFindMenu(td);
  var tool = menu._tool;

  rteEditToolDone();

  tool._rte.insertHTML(tool._rte.emotImg(menu._args[td.id]));

  return rteEventCancel(ev);
}

RTE.prototype.selection = function (win) {

  var doc = win.document;

  if(doc.selection) { return doc.selection; }

  return win.getSelection();
}

RTE.prototype.sel2Range = function (sel) {

  if(sel.createRange) { return sel.createRange(); }

  return sel.getRangeAt(sel.rangeCount - 1).cloneRange();
}

RTE.prototype.rangeHTML = function (range) {

  if(! range)
    return "";

  if(typeof range.htmlText != "undefined") { return range.htmlText; }

  if(range.cloneContents) {
    var obj = document.createElement('div');
    obj.appendChild(range.cloneContents());
    return obj.innerHTML;
  }

  return range.valueOf();
}

RTE.prototype.positionBefore = function (win, node) {

  var doc = win.document;

  if(doc.all) {
    var range = doc.body.createTextRange();
    range.moveToElementText(node);
    range.collapse(true);
    range.select();
  }
  else {
    var sel = this.selection(win);
    var range = doc.createRange();
    range.selectNodeContents(node);
    range.collapse(true);
    sel.addRange(range);
  }
}

RTE.prototype.viewSrc = function () {

  var vs = rteID(this._vsid);
  if(vs) { return vs.checked; }

  return false;
}

RTE.prototype.insertHTML = function (html) {

  var win = this.win();
  var doc = win.document;

  win.focus();
  var sel = this.selection(win), range = this.sel2Range(sel);

  if(document.all) {
    range.pasteHTML(html);
    range.collapse(false);
    range.select();
  }
  else {
    var f = doc.createDocumentFragment();
    var div = doc.createElement('div');
    div.innerHTML = html;
    while(div.firstChild) { f.appendChild(div.firstChild); }
    sel.removeAllRanges();
    range.deleteContents();
    var so = range.startOffset, node = range.startContainer;
    if(node.nodeType == 3) { // TEXT
      node = node.splitText(so);
      node.parentNode.insertBefore(f, node);
    }
    else { // ELEMENT
      node.insertBefore(f, node.childNodes[so]);
      noe = node.childNodes[so];
    }
    this.positionBefore(win, node);
  }
  win.focus();

  rteSyncToolbar(this);
}

function rteEventSelectColor(ev) {

  var td = rteEventTD(ev);
  var menu = rteFindMenu(td);
  var tool = menu._tool;

  rteEditToolDone();

  tool.toolAction(menu._args[td.id]);

  return rteEventCancel(ev);
}

function rteEventViewSrc(ev) {

  var rte = this._rte;
  var tv = rteID(rte._tvid);
  var ed = rteID(rte.id);

  if(rte.viewSrc()) {

    ed.style.display = 'none';
    tv.style.display = 'block';
    tv.focus();
  }
  else {

    tv.style.display = 'none';
    ed.style.display = 'block';
    var win = rte.win();
    rte.postLoad();
    win.focus();
  }
}

RTE.prototype.createLegend = function (div) {

  div.innerHTML = '<span class="rte_vs"><input id="'+this._vsid+'" type="checkbox" /> <label for="'+this._vsid+'">'+rte_lang.view_source+'</label></span>';

  var vs = rteID(this._vsid);
  vs._rte = this;
  vs.onclick = rteEventViewSrc;
}

RTE.prototype.iconTool = function (tag, title) {

  var img = rteImgObj(document, "http://us.i1.yimg.com/us.yimg.com/i/us/pim/el/tb_"+tag+"_1.gif", 22);
  img.title = title;

  return img;
}

RTE.prototype.cmdSupported = function (doc, cmd) {

  if(! cmd.indexOf("rtc_")) { return 1; }

  try {

    if(! doc.queryCommandSupported(cmd)) { return 0; }

  } catch(e) {

    if(! this.is_gecko) { return 1; }

    switch(cmd) {
    case "Cut":
    case "Copy":
    case "Paste":
      return 0;
    }
  }

  return 1;
}

RTE.prototype.createTool = function (doc, r, tag, title, cmd, qstate, menu) {

  if(! this.cmdSupported(doc, cmd)) { return; }

  var tool = new RTETool(this, this.iconTool, tag, cmd, qstate, menu)

  tool.makeTD(r, title);
}

RTE.prototype.selectTool = function (tag, label) {

  var div = document.createElement('div');
  div.className = "rte_pop";

  var btn = rteCreateSelOption(document, label);
  btn.tabIndex = -1;
  div.appendChild(btn);

  return div;
}

RTE.prototype.createPopup = function (doc, r, tag, title, cmd, menuTag) {

  var tool = new RTEPopup(this, this.iconTool, tag, cmd, 0, menuTag)

  tool.makeTD(r, title);
}

RTE.prototype.createSelect = function (doc, r, useCSS, tag, cmd, defVal) {

  var tool = new RTESelect(this, this.selectTool, useCSS, tag, cmd, defVal)

  var ops = tool._menu.specs.args;
  for(var w = 0, x = ops.length; --x >= 0; ) {
    w = Math.max(w, ops[x].l.length);
  }

  tool.makeTD(r, Math.round(w*.65));
}

RTE.prototype.createToolbar = function (doc, div) {

  div.className = 'rte_tb';
  div.id = this._tbid;

  var r = rteCreateE(rteCreateTable(div), 'tr');
  this.createSelect(doc, r, 1, "fmenu", "FontName", rte_def_font);
  this.createSelect(doc, r, 0, "smenu", "FontSize", rte_def_size);

  //r = rteCreateE(rteCreateTable(div), 'tr');
  this.createTool(doc, r, "bold", rte_lang.bold, "Bold", 1);
  this.createTool(doc, r, "italic", rte_lang.italic, "Italic", 1);
  this.createTool(doc, r, "uline", rte_lang.underline, "Underline", 1);
  this.createTool(doc, r, "cut", rte_lang.cut, "Cut", 1);
  this.createTool(doc, r, "copy", rte_lang.copy, "Copy", 1);
  this.createTool(doc, r, "paste", rte_lang.paste, "Paste", 1);
  this.createTool(doc, r, "link", rte_lang.add_link, "rtc_link");
  this.createPopup(doc, r, "smiley", rte_lang.emoticon, "InsertImage", "emenu");
  this.createPopup(doc, r, "coltext", rte_lang.text_color, "ForeColor", "cmenu");
  this.createPopup(doc, r, "colhilite", rte_lang.hl_color, "HiliteColor", "cmenu");
  this.createPopup(doc, r, "justpd", rte_lang.align_text, "rtc_align", "amenu");
  this.createPopup(doc, r, "listpd", rte_lang.list, "rtc_list", "lmenu");
  this.createTool(doc, r, "ileft", rte_lang.dec_indent, "Outdent");
  this.createTool(doc, r, "iright", rte_lang.inc_indent, "Indent");
}

RTE.prototype.updateToolbar = function () {

  var tb = rteID(this._tbid);
  var tds = tb.getElementsByTagName('td');

  var obj, doc = this.doc();

  for(var x = tds.length; --x >= 0; ) {
    obj = tds[x];
    if(obj._update) { obj._update.updateState(obj, doc); }
  }
}

function rte_setup(id) {

  try {

    if(! rteBrowserOK()) { throw "unsupported browser"; }

    var tv = rteID(id);
    if(! tv) { throw "can't find "+id; }

    new RTE(tv);
  } catch(e) {
    var rte = rteID(id+"e");
    if(rte) { rte.style.display = 'none'; }
    var st = tv.style;
    st.display = 'block';
    throw "failed to setup "+id;
  }
}
