function getCursorPos (elm) {
    switch (elm.nodeName.toLowerCase ()) {
        case "textarea":
            return getCursorPosTextarea (elm);
        case "input":
            return getCursorPosInput (elm);
    }

    return {begin: null, end: null};
}

function getCursorPosInput (elm) {
    if (typeof elm.selectionStart != "undefined" && typeof elm.selectionEnd != "undefined")
        return {begin: elm.selectionStart, end: elm.selectionEnd};

    if (document.selection && document.selection.createRange) {
        elm.focus ();
        var selRange = document.selection.createRange ().duplicate ();

        // check if element contains selected text
        if (selRange.parentElement () != elm)
            return {begin: "n/a", end: "n/a"};

        var range = elm.createTextRange ().duplicate ();

        //if (!range.inRange (selRange))
        //  return {begin: "n/a", end: "n/a"};

        range.setEndPoint ("EndToStart", selRange);

        return {begin: range.text.length, end: range.text.length + selRange.text.length};
    }

    return {begin: null, end: null};
}

function getCursorPosTextarea (elm) {
    if (typeof elm.selectionStart != "undefined" && typeof elm.selectionEnd != "undefined")
        return {begin: elm.selectionStart, end: elm.selectionEnd};

    if (document.selection && document.selection.createRange) {
        elm.focus ();

        var selRange = document.selection.createRange ().duplicate ();

        // check if element contains selected text
        if (selRange.parentElement () != elm)
            return {begin: "n/a", end: "n/a"};

        var range = selRange.duplicate ();
        range.moveToElementText (elm);

        //if (!range.inRange (selRange))
        //  return {begin: "n/a", end: "n/a"};

        range.setEndPoint ("EndToStart", selRange);

        return {begin: range.text.length, end: range.text.length + selRange.text.length};
    }
    return {begin: null, end: null};
}

function getPos (el) {
    var cursor = getCursorPos (el);
    document.getElementById("pos").value = cursor.begin + ":" + cursor.end;
}

function setCursorPos (elm, begin, end) {
    if (typeof elm.selectionStart != "undefined" && typeof elm.selectionEnd != "undefined") {
        elm.setSelectionRange (begin, end);
        elm.focus ();
    }
    else if (document.selection && document.selection.createRange) {
        var range = elm.createTextRange ();
        range.move ("character", begin);
        range.moveEnd ("character", end - begin);
        range.select ();
    }
}

function setPos (el, begin, end) {
    setCursorPos (el, begin, end);
}
