nn=''; ch='character'; tab='&nbsp;&nbsp;&nbsp;';


document.onkeypress = keypress; 
document.onmouseup = mouseup; 
document.onkeydown = keydown; 


function mouseup() 
{ xE=document.selection.createRange();
  here = xE.duplicate(); here.collapse(); 
  etype='mouse';
}


function keydown() 
{ var which = event.keyCode; 
  if (event.ctrlKey) 
  { switch(which) 
    { case 67: xE.execCommand("copy"); break 
      case 86: here.execCommand("paste"); break 
      case 88: xE.execCommand("cut"); break 
      case 66: xE.execCommand("bold"); break 
      case 73: xE.execCommand("italic"); break 
      case 85: xE.execCommand("underline"); break 
    }
    event.cancelBubble=true; event.returnValue=false; 
  }
  else 
  { switch(which) 
    { case 8: // BACKSPACE 
      if (xE.htmlText.length > 0) { xE.pasteHTML(nn) }
      else { here.moveStart(ch,-1); here.pasteHTML(nn) }
      event.returnValue=false; break 
      case 9: // TAB 
      for (var i=0;i<5;i++) here.pasteHTML(tab); break 
      case 37: // LEFT ARROW 
      here.moveStart(ch,-1); 
      here.select(); here.collapse(); break 
      case 39: // RIGHT ARROW 
      here.moveEnd(ch,1); 
      here.select(); here.collapse(false); break 
      case 46: // DELETE 
      if (xE.htmlText.length > 0) { xE.pasteHTML(nn) }
      else { here.expand(ch,1); here.pasteHTML(nn) }
      here.collapse(); break 
    }
  }
}


function keypress() 
{ var which = event.keyCode; 
  switch(which) 
  { case 13: kS="<br>"; break // CR/LF 
    case 32: kS="&nbsp;"; break // SPACE 
    case 38: kS="&amp;"; break // "&" 
    case 60: kS="&lt;"; break // "<" 
    default: kS=String.fromCharCode(which) 
  }
  if (etype=='mouse') here = xE.duplicate(); 
  here.pasteHTML(kS); etype='key'; 
  here.collapse(false); 
  event.cancelBubble=true; 
  event.returnValue=false; 
  xE=here.duplicate(); 
}
