function serverCommand(rte, command, baseDoc, asynchronous) {
	updateRTE(rte);
    workForm = document.getElementById('workInProgressForm');
    workForm.action = '/protected/' + command;
    var req = postForm(workForm, asynchronous);
    return req;
}
function submitForm(rte, command) {
	updateRTE(rte);
    var workForm = document.getElementById('workInProgressForm');
    workForm.action = '/protected/' + command;
    workForm.submit();
}

var prevTextRange;
function findWord(rte)
{
    var word = document.getElementById('word2Find').value;
    if(word.length == 0 || word == null) return;
    var windw = document.getElementById(rte).contentWindow;
    var oRTE = document.getElementById(rte).contentWindow.document;
    if(document.all) {
        var textRange = oRTE.body.createTextRange();
        if(prevTextRange) {
            textRange.setEndPoint('StartToEnd', prevTextRange);
        }
        var found = textRange.findText(word);
        if (found) {
            textRange.select();
            prevTextRange = textRange;
        } else {
            if(prevTextRange) {
                prevTextRange =  null;
            }
        }
    } else {
        found = windw.find(word,false,false,true,false,false,false);
    }
}

function handleKeyEventOnWord(evt)
{
    evt = (evt) ? evt : ((window.event) ? window.event : null);
    if(evt.keyCode == 13) findWord();
}

var spellCheckShowing = false;

function isSpellCheckShowing()
{
    return spellCheckShowing;
}
function showSpellChecker(rte, spellCheckId)
{
    var spellCheckDiv = document.getElementById('spellCheckDiv');
    var rteFrm = document.getElementById(rte);
    spellCheckDiv.style.display = 'block';
    rteFrm.height = rteFrm.clientHeight - spellCheckDiv.scrollHeight;
    spellCheckShowing = true;
    spellChecker = new SpellChecker(rte, spellCheckId);
    spellChecker.getNextMistake();
}
function hideSpellCheck(rte, spellCheckId)
{
    var spellCheckDiv = document.getElementById('spellCheckDiv');
    var rteFrm = document.getElementById(rte);
    rteFrm.height = rteFrm.clientHeight + spellCheckDiv.scrollHeight;
    spellCheckDiv.style.display = 'none';
    if(document.all) rteFrm.disabled = false;
    spellCheckShowing = false;
    asyncGetUrl('/action/spellCheck.do?spellCheckId=' + spellCheckId + '&done=true', 'spellStatusDiv', spellCheckDone, 'block') ;
}

function spellCheckDone() {
}
function showHTML()
{
    workForm = document.getElementById('workInProgressForm');
    alert(workForm.work.value);
}


//spellchecker javascript

var spellChecker;
function SpellChecker(rte, spellCheckId) {
    var mistakeIndex = 0;
    var prevMistake;
    var prevColor;
    var prevUnderline;

    this.getNextMistake = getNextMistake;
    this.correctMistake = correctMistake;
    this.changeAll = changeAll;
    this.ignoreAll = ignoreAll;
    this.selectSuggestion = selectSuggestion;
    this.closeSpellCheck = closeSpellCheck;

    function clearPreviousMistake()
    {
        if(prevMistake)
        {
            prevMistake.style.color = prevColor;
            prevMistake.style.textDecoration = prevUnderline;
        }

    }
    function getNextMistake()
    {
        clearPreviousMistake();
        var workDoc = document.getElementById(rte).contentWindow.document;
        var mistakeId = 'spello_' + mistakeIndex;
        var mistakeElement = workDoc.getElementById(mistakeId);
        if(mistakeElement)
        {
            var savedWord = document.getElementById('word_' + mistakeElement.innerHTML);
            if(savedWord)
            {
                mistakeElement.innerHTML = savedWord.firstChild.nodeValue;
                mistakeIndex ++;
                getNextMistake();
            } else {
                prevMistake = mistakeElement;
                prevColor = mistakeElement.style.color;
                prevUnderline = mistakeElement.style.textDecoration;
                workDoc.body.scrollTop = mistakeElement.offsetTop;
                mistakeElement.style.textDecoration = 'underline';
                mistakeElement.style.color = 'red';
                document.getElementById('currentMistake').value = mistakeElement.innerHTML;
                loadSuggestions(mistakeId);
                mistakeIndex ++;
            }

        } else {
            closeSpellCheck();
        }

    }

    function correctMistake() {
        clearPreviousMistake();
        prevMistake.innerHTML = document.getElementById('currentMistake').value;
        getNextMistake();
        handleRteEdited();
    }

    function changeAll() {
        saveWord(prevMistake.innerHTML, document.getElementById('currentMistake').value);
        correctMistake();
    }

    function saveWord(key, val)
    {
        var word2save = document.createElement('span');
        word2save.id = 'word_' + key;
        word2save.style.visibility = 'hidden';
        word2save.appendChild(document.createTextNode(val));
        document.body.appendChild(word2save);
    }

    function ignoreAll() {
        saveWord(prevMistake.innerHTML, prevMistake.innerHTML);
        getNextMistake();
    }

    function loadSuggestions(mistakeId) {
        url = '/action/getSpellSuggestions.do?mistakeId=' + escape(mistakeId) + '&spellCheckId=' + spellCheckId;
        statusDiv = document.getElementById('spellStatusDiv');
        statusDiv.innerHTML = 'Getting spelling suggestions..';
        statusDiv.style.display = 'block';
        var req = createXMLHttpRequest();
        req.onreadystatechange = function(){
            if (req.readyState == 4) {
                if(req.responseText.match('<title>Login</title>')) {
                    signIn();
                } else if(req.status != 200) {
                    alert(req.responseText);
                    statusDiv.innerHTML = 'Error! Unable to get suggestions';
                } else {
                    buildSuggestionList(req)
                    statusDiv.innerHTML = 'Found spelling errors, see suggestions below';
                }
            } else {
                statusDiv.style.display = 'Getting spelling suggestions..';;
            }
        };
        req.open('GET', url, true);
        req.send(null);
    }

    function buildSuggestionList(req)
    {
        var select = document.getElementById("suggestions");
        while (select.length > 0) {
            select.remove(0);
        }
        var items = req.responseXML.getElementsByTagName("suggestion");
        // loop through <item> elements, and add each nested
        // <title> element to Topics select element
        for (var i = 0; i < items.length; i++) {
                appendToSelect(select, items[i].firstChild.nodeValue);
        }
    }
    function appendToSelect(select, value) {
        var opt;
        opt = document.createElement("option");
        opt.value = value;
        opt.appendChild(document.createTextNode(value));
        select.appendChild(opt);
    }
    function selectSuggestion(evt) {
        evt = (evt) ? evt : ((window.event) ? window.event : null);
        var item, content, div;
        if (evt) {
            var select = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
            if (select && select.options.length > 1) {
                document.getElementById('currentMistake').value = select.value;
            }
        }
    }
    function closeSpellCheck()
    {
        mistakeIndex = 0;
        clearPreviousMistake();
        hideSpellCheck(rte, spellCheckId);
    }

}



