var js_cursorPos = new js_CursorPos(0, 0, 0, 0);

function js_CursorPos(start, end, scrollTop, scrollLeft) {
    this.start = start;
    this.end = end;
    this.scrollTop = scrollTop;
    this.scrollLeft = scrollLeft;
}

function js_getCursorPosition(textArea) {
    var start = 0;
    var end = 0;
    if (document.selection) { // IE...
	textArea.focus();
        var lengthBefore = textArea.value.length;
        var sel1 = document.selection.createRange();
        var sel2 = sel1.duplicate();
        sel2.moveToElementText(textArea);
        var selText = sel1.text;
        sel1.text = "\001";
        var index = sel2.text.indexOf("\001");
        if (index == -1) { // At end of textarea...
            index = sel2.text.length;
            // Hack to make it work when textarea ends with new lines:
            start = js_countNewLinesAtEnd(textArea);
        }
        start += js_countTextAreaChars(sel2.text.substring(0, index));
        end = js_countTextAreaChars(selText) + start;
        sel1.moveStart('character', -1);
        // Hack to prevent cursor from eating new lines at end of selection:
        var newLine = "";
        var diff = lengthBefore - (textArea.value.length + selText.length - 1);
        for (var i = 0; i < diff; i += 2) {
            newLine += "\r\n";
        }
        sel1.text = selText + newLine;
    } else if (textArea.selectionStart || (textArea.selectionStart == "0")) { // Mozilla/Netscape...
        start = textArea.selectionStart;
        end = textArea.selectionEnd;
    }
    return new js_CursorPos(start, end, textArea.scrollTop, textArea.scrollLeft);
}

function js_setCursorPosition(textArea, cursorPos) {
    textArea.focus();
    if (document.selection) { // IE...
        var sel = textArea.createTextRange();
        sel.collapse(true);
        sel.moveStart("character", cursorPos.start);
        sel.moveEnd("character", cursorPos.end - cursorPos.start);
        sel.select();
    } else if (textArea.selectionStart || (textArea.selectionStart == "0")) { // Mozilla/Netscape...
        textArea.selectionStart = cursorPos.start;
        textArea.selectionEnd = cursorPos.end;
    }
    textArea.scrollTop = cursorPos.scrollTop;
    textArea.scrollLeft = cursorPos.scrollLeft;
}

function js_insertAtCursor(textArea, text1, text2) {
    textArea.focus();

    var scrollTop = textArea.scrollTop;
    var scrollLeft = textArea.scrollLeft;

    if (document.selection) { // IE...
        var sel = document.selection.createRange();
        var selText = sel.text;
        sel.text = (text2 == "") ? text1 : text1 + selText + text2;
        sel.move("character", -1 * text2.length);
        sel.select();
    } else if (textArea.selectionStart || (textArea.selectionStart == "0")) { // Mozilla/Netscape...
        var startPos = textArea.selectionStart;
        var endPos = textArea.selectionEnd;
        var selectedText = textArea.value.substring(startPos, endPos);
        var text = (text2 == "") ? text1 : text1 + selectedText + text2;
        textArea.value = textArea.value.substring(0, startPos) + text + textArea.value.substring(endPos, textArea.value.length);
        textArea.selectionStart = startPos + text1.length  + ((text2 == "") ? 0 : selectedText.length);
        textArea.selectionEnd = textArea.selectionStart;
    } else {
        textArea.value += text1 + text2;
    }

    textArea.scrollTop = scrollTop;
    textArea .scrollLeft = scrollLeft;
}

function js_countTextAreaChars(text) {
    var n = 0;
    for (var i = 0; i < text.length; i++) {       
        if (text.charAt(i) != '\r') {
            n++;
        }
    }
    return n;
}

function js_countNewLinesAtEnd(textArea) {
    var n = 0;
    var text = textArea.value;
    for (var i = (text.length - 1); i >= 2; i -= 2) {
        if (text.substring(i - 2, i) == "\r\n") {
            n++;
        } else {
            break;
        }
    }
    return n;
}

function js_saveCursorPos(id) {
    var area = document.getElementById(id);
    js_cursorPos = js_getCursorPosition(area);
}

function js_addText(id, defaultText, textToAdd1, textToAdd2) {
    js_empty(id, defaultText);
    var area = document.getElementById(id);
    js_setCursorPosition(area, js_cursorPos);
    js_insertAtCursor(area, textToAdd1, textToAdd2);
    js_cursorPos = js_getCursorPosition(area);
}

function js_empty(id, defaultText) {
    var area = document.getElementById(id);
    if (area.value == defaultText) {
	area.value = "";
    }
    area.focus();
}

function js_isIE() {
    return (navigator.userAgent.toLowerCase().indexOf('msie') != -1);
}
