function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToPos (input, pos) {
  setSelectionRange(input, pos, pos);
}

function addEmoticon(text, textareaid) {
    var ta = document.getElementById(textareaid);

    //compute selection start/end
    haveStartEnd = false;
    try {
        //IE support
        if (document.selection) {
            ta.focus();
            var sel1 = document.selection.createRange();
            var sel2 = sel1.duplicate();
            sel2.moveToElementText(ta); //Opera fails here
            sel2.setEndPoint('StartToEnd', sel1);

            var endPos = ta.value.length - sel2.text.length;
            sel2.setEndPoint('StartToStart', sel1);
            var startPos = ta.value.length - sel2.text.length

            prefix = ta.value.substring(0, startPos);
            var cursorFix = -1 * (prefix.split('\r').length - 1);
            haveStartEnd = true;
        }
    } catch (e) {}

    try {
        if (!haveStartEnd &&
            (ta.selectionStart || ta.selectionStart==0))
        {
            //Mozilla/Firefox/Netscape 7+ support
            var startPos = ta.selectionStart;
            var endPos = ta.selectionEnd;
            var cursorFix = 0;
            haveStartEnd = true;
        }
    } catch (e) {}

    if (!haveStartEnd) {
        //unknown browser
        ta.value += text;
        ta.focus();
        return;
    }

    //prepend space, if not already before
    if (startPos>0) { //do not insert space if cursor at beginning
        s = ta.value.substring(startPos, startPos-1);
        if (s!=' ' && s!='\n' && s!='\r') text = ' ' + text;
    }

    //append space, if not already after
    //if (endPos<ta.value.length) {
        s = ta.value.substring(endPos, endPos+1);
        if (s!=' ' && s!='\n' && s!='\r') text = text + ' ';
    //}

    //replace selection / insert text
    ta.value =
        ta.value.substring(0, startPos) +
        text +
        ta.value.substring(endPos, ta.value.length);

    cursorPos = startPos + text.length + cursorFix;
    setCaretToPos(ta, cursorPos);
}
