
function encloseSelection(textarea, prefix, suffix, fn){
    textarea.focus();
    var start, end, sel, scrollPos, subst;
    if (typeof(document["selection"]) != "undefined") {
        sel = document.selection.createRange().text;
    }
    else 
        if (typeof(textarea["setSelectionRange"]) != "undefined") {
            start = textarea.selectionStart;
            end = textarea.selectionEnd;
            scrollPos = textarea.scrollTop;
            sel = textarea.value.substring(start, end);
        }
    if (sel.match(/ $/)) {
        sel = sel.substring(0, sel.length - 1);
        suffix = suffix + " ";
    }
    if (typeof(fn) == 'function') {
        var res = (sel) ? fn(sel) : fn('');
    }
    else {
        var res = (sel) ? sel : '';
    }
    subst = prefix + res + suffix;
    if (typeof(document["selection"]) != "undefined") {
        var range = document.selection.createRange().text = subst;
        textarea.caretPos -= suffix.length;
    }
    else 
        if (typeof(textarea["setSelectionRange"]) != "undefined") {
            textarea.value = textarea.value.substring(0, start) + subst +
            textarea.value.substring(end);
            if (sel) {
                textarea.setSelectionRange(start + subst.length, start + subst.length);
            }
            else {
                textarea.setSelectionRange(start + prefix.length, start + prefix.length);
            }
            textarea.scrollTop = scrollPos;
        }
}

