  var lastSnappedElement = null;
  var sel = null;
  var selText = null;
  var padRight = "";

  function snap( element )
  {
    lastSnappedElement = null;
    lastSnappedElement = element
    if( lastSnappedElement == null )
    {
      return;
    }
    
    if( typeof(lastSnappedElement.selectionStart) != "undefined" && typeof(lastSnappedElement.selectionEnd) != "undefined" )
    {
      selText = lastSnappedElement.value.substring(lastSnappedElement.selectionStart, lastSnappedElement.selectionEnd);
    }
    else if( lastSnappedElement.createTextRange )
    {
      sel = window.document.selection.createRange().duplicate();
    }     
  }

  function wrapperTags( processName, tag )
  {
    if( lastSnappedElement == null )
    {
      return;
    }
    var subject = "";
    var output = "";

    subject = getSelectedText( processName );
    
    if( subject == null ) return;

    output = "[" + tag + "]" + subject + "[/" + tag + "]" + padRight;

    setSelectedText( output );
  }
  
  function uriTags()
  {
    if( lastSnappedElement == null )
    {
      return;
    }
    var subject = "";
    var output = "";
    var uri = prompt("Enter the address you wish to link to.\nPlease ensure the address starts with http://, https:// or ftp://", "http://");

    if( uri == null ) return;
    
    subject = getSelectedText("the highlighted link text");
    
    if( subject == null ) return;
    
    if( subject == "" )
    {
      output = "[url]" + uri + "[/url]";
    }
    else
    {
      output = "[url=" + uri + "]" + subject + "[/url]" + padRight;
    }

    setSelectedText( output );
  }

  function imageTags()
  {
    if( lastSnappedElement == null )
    {
      return;
    }
    var subject = "";
    var output = "";
    var uri = prompt("Enter the address the to image.\nPlease ensure the address starts with http://, https:// or ftp://", "http://");

    if( uri == null ) return;

    output = "[img]" + uri + "[/img]";

    setSelectedText( output );
  }
  
  function getSelectedText( processName )
  {
    var subject = "";
    padRight = "";
    if( (lastSnappedElement.createTextRange && sel && sel.text != "") || selText != "" )
    {
      if( lastSnappedElement.createTextRange && sel && sel.text != "" )
      {
        subject = sel.text;
      }
      else if( selText != "" )
      {
        subject = selText;
      }
     
      var i = 0;
      while( subject.charAt( subject.length-1 ) == " " )
      {
        subject = subject.substring(0, subject.length-1 );
        padRight = " ";
      }
      subject = (subject == null)?(""):(subject);
    }
    else if( processName )
    {
      subject = prompt("Enter text to be " + processName );
    }

    return subject;
  }
  
  
  function setSelectedText( setString )
  {
    if( lastSnappedElement.createTextRange && sel ) /*IE*/
    {
      sel.text = setString;
      snap( lastSnappedElement );
    }
    else if( lastSnappedElement.setSelectionRange ) /*Gecko*/
    {
      var scrollTop = lastSnappedElement.scrollTop
      var selectionStart = lastSnappedElement.selectionStart;
      var selectionEnd = lastSnappedElement.selectionEnd;
      var prefix = lastSnappedElement.value.substring(0,selectionStart);
      var suffix = lastSnappedElement.value.substring(selectionEnd, lastSnappedElement.value.length);
      
      lastSnappedElement.value = prefix + setString + suffix;
    
      lastSnappedElement.focus();
      lastSnappedElement.scrollTop = scrollTop
      lastSnappedElement.setSelectionRange(selectionStart + setString.length, selectionStart + setString.length);
      
      snap( lastSnappedElement );
    }
    else /*fallback*/
    {
      lastSnappedElement.value += setString;
    }
  }

