
var advancedModeEnabled = true;
var preferredMode = "";
var currentMode = "";
var currentHTML = "";
var retrieveHTML = true;
var editorEnabled = true;

var previousToPreviewMode = "";
var previousToPreviewText = "";

<!-- inline spell checker object -->
var oSpell;
// timeout for dwr calls
var DWRTimeout = 20000;

function doUpdateAdvancedEditor(str) {
    var newMode = "advanced";
    currentHTML = str;
    // showing the editor will cause the tiny mce setupcontent_callback to be called
    showEditor(newMode);
    retrieveHTML = false;
    currentMode = newMode;
}

function doUpdateTextEditor(str) {
    showEditor("text");
    retrieveHTML = true;
    setEditorContent("text", str);
}

function doUpdatePreview(str) {
    showEditor("preview");
    retrieveHTML = true;
    setEditorContent("preview", str);
}

function doInitialContentForAdvancedEditor(str) {
    tinyMCE.execInstanceCommand('GUIEditor', 'mceSetContent', false, str, true);
    currentHTML = str;
}

function setAdvancedEditorContent(editor_id, body, doc) {
    body.innerHTML = currentHTML;
}

// returns the current editor content in wiki format
function getEditorContent(callbackFunction) {
    if (currentMode == "" || currentMode == "text") {
        var textarea = $('textEditor');
        return textarea.value;
    }
    else if (currentMode == "advanced") {
        var c = tinyMCE.getContent('GUIEditor');
        // call our custom cleanup on the content coming from the editor
        c = jiveCustomCleanup("submit_content", c);

        if (callbackFunction == undefined) {
            callbackFunction = function(str) {return str;}
        }
        WikiTextConverter.convertToWiki(c,
            {
                callback: callbackFunction,
                timeout: DWRTimeout, // 20 seconds
                errorHandler: editorErrorHandler
            }
        );
    }
    else if (currentMode == "preview") {
        var textarea = $('textEditor');
        return textarea.value;
    }

    return "";
}

function setEditorContentFromDraft(draftContent) {
    // drafts are saved in wiki format, convert to gui editor compatible
    WikiTextConverter.convertFromWiki(draftContent,
        {
            callback: doUpdateFromDraft,
            timeout: DWRTimeout, // 20 seconds
            errorHandler: editorErrorHandler
        }
    );    
};

function doUpdateFromDraft(updatedHTML) {
    currentHTML = updatedHTML;
    retrieveHTML = true;
    tinyMCE.execInstanceCommand('GUIEditor', 'mceSetContent', false, currentHTML, true);
};

function setEditorContent(newMode, updatedHTML) {
    if (updatedHTML == null && retrieveHTML) {
        if (currentMode == "" || currentMode == "text") {
            var textarea = $('textEditor');
            currentHTML = textarea.value;
        }
        else if (currentMode == "advanced") {
            currentHTML = tinyMCE.getContent('GUIEditor');
            // call our custom cleanup on the content coming from the editor
            currentHTML = jiveCustomCleanup("submit_content", currentHTML);
        }
    }
    else if (retrieveHTML) {
        currentHTML = updatedHTML;
    }

    retrieveHTML = true;

    if (currentHTML != null) {
        if (newMode == "advanced") {
            tinyMCE.execInstanceCommand('GUIEditor', 'mceSetContent', false, currentHTML, true);
        }
        else if (newMode == "text") {
            var textarea = $('textEditor');
            textarea.value = currentHTML;
        }
        else if (newMode == "preview") {
            var previewDiv = $('preview-panel');
            previewDiv.innerHTML = currentHTML;

            // set the height of the preview panel to be the scrollHeight or the height of the
            // textarea, whichever is taller
            var height = previewDiv.scrollHeight;
            if (currentMode == "text") {
                var textarea = $('textEditor');
                height = (textarea.clientHeight > height) ? textarea.clientHeight : height;
            }
            else if (currentMode = "advanced") {
                var t = tinyMCE.settings['height'];
                if (t) {
                    var h = parseInt(t);
                    height = (h > height) ? h : height;
                }
            }

            var divHeight = previewDiv.style.height;
            if (!divHeight) {
                divHeight = 0;
            }

            if (parseInt(divHeight) < height) {
                previewDiv.style.height = (10 + height) + "px";
            }
        }
    }

    currentMode = newMode;
}


function getPreferredEditorMode() {
    if (preferredMode == "") {
        WikiTextConverter.getPreferredEditorMode(
            {
                callback: function(mode) {
                    preferredMode = mode;
                },
                timeout: DWRTimeout, // 20 seconds
                errorHandler: editorErrorHandler
            }
        );
    }

    if (preferredMode == "") {
        preferredMode = "text";
    }
    return preferredMode;
}

/*
* This function will not return until (at least)
* the specified number of milliseconds have passed.
* It uses a modal dialog for IE, busy loop for ff
*/
function pause(numberMillis) {
    if (window.showModalDialog) {
        var dialogScript =
           'window.setTimeout(' +
           ' function () { window.close(); }, ' + numberMillis + ');';
        var result =
         window.showModalDialog(
           'javascript:document.writeln(' +
            '"<script>' + dialogScript + '<' + '/script>")');
    }
    else {
        var now = new Date();
        var exitTime = now.getTime() + numberMillis;
        while (true) {
            now = new Date();
            if (now.getTime() > exitTime)
                return;
        }
    }
}

function setPreferredEditorMode(mode) {
    showEditorWaitImage(true);
    preferredMode = mode;
    WikiTextConverter.setPreferredEditorMode(mode,
        {
            callback: function() {
                showEditorWaitImage(false);
                // now hide the message
                var modeSelector = $('jivePreferredEditorModeLink');
                modeSelector.style.visibility = 'hidden';
            },
            timeout: DWRTimeout, // 20 seconds
            errorHandler: editorErrorHandler
        }
    );
}

function disableAdvancedMode() {
    advancedModeEnabled = false;
}

function getEditorMode() {
    return currentMode;
}

function setEditorMode(newMode) {
    if (!advancedModeEnabled) {
        // remove the advanced tab
        var advancedTab = $('wysiwyg-tab');
        if (advancedTab) {
            advancedTab.parentNode.removeChild(advancedTab);
        }

        if ("advanced" == newMode) {
            newMode = "text";
        }
    }
    else {
        var pMode = getPreferredEditorMode();
        if (pMode != newMode && newMode != 'preview') {
            modeSelectorText = $('jivePreferredEditorMode-' + newMode).innerHTML;
            $('jivePreferredEditorModeLinkHREF').innerHTML = modeSelectorText;
            var modeSelector = $('jivePreferredEditorModeLink');
            modeSelector.style.visibility = 'visible';
        }
        else {
            var modeSelector = $('jivePreferredEditorModeLink');
            modeSelector.style.visibility = 'hidden';
        }
    }

    if (currentMode == newMode) {
        return;
    }

    showEditorWaitImage(true);

    if (newMode == "advanced") {
        // show the attachment div
        if ($('jive-add-attachment')) {
            $('jive-add-attachment').style.display = "block";
        }

        if (currentMode == "" || currentMode == "text") {            
            var textarea = $('textEditor');
            WikiTextConverter.convertFromWiki(textarea.value,
                {
                    callback: doUpdateAdvancedEditor,
                    timeout: DWRTimeout, // 20 seconds
                    errorHandler: editorErrorHandler
                }
            );
        }
        else if (currentMode == "preview") {            
            // grab the context from the saved previous values
            if (previousToPreviewMode == "text") {
                WikiTextConverter.convertFromWiki(previousToPreviewText,
                    {
                        callback: doUpdateAdvancedEditor,
                        timeout: DWRTimeout, // 20 seconds
                        errorHandler: editorErrorHandler
                    }
                );
            }
            else if (previousToPreviewMode == "advanced") {
                // no conversion necessary, just display the text
                doUpdateAdvancedEditor(previousToPreviewText);
            }
            else {
                // fallback - something odd happened so just try to unrender the previewed html
                var previewDiv = $('preview-panel');
                WikiTextConverter.convertFromWiki(previewDiv.innerHTML,
                    {
                        callback: doUpdateAdvancedEditor,
                        timeout: DWRTimeout, // 20 seconds
                        errorHandler: editorErrorHandler
                    }
                );
            }
            
            // reset variables
            previousToPreviewMode = "";
            previousToPreviewText = "";
        }
    }
    else if (newMode == "text") {
        // show the attachment div
        if ($('jive-add-attachment')) {
            $('jive-add-attachment').style.display = "block";
        }

        if (currentMode == "advanced") {
            // we need to grab the html here otherwise it'll be gone once we
            // destroy the advanced editor
            currentHTML = tinyMCE.getContent('GUIEditor');
            // call our custom cleanup on the content coming from the editor
            currentHTML = jiveCustomCleanup("submit_content", currentHTML);

            WikiTextConverter.convertToWiki(currentHTML,
                {
                    callback: doUpdateTextEditor,
                    timeout: DWRTimeout, // 20 seconds
                    errorHandler: editorErrorHandler
                }
            );
        }
        else if (currentMode == "preview") {
            // grab the context from the saved previous values
            if (previousToPreviewMode == "text") {
                // no conversion necessary, just display the text
                doUpdateTextEditor(previousToPreviewText);
            }
            else if (previousToPreviewMode == "advanced") {
                WikiTextConverter.convertToWiki(previousToPreviewText,
                    {
                        callback: doUpdateTextEditor,
                        timeout: DWRTimeout, // 20 seconds
                        errorHandler: editorErrorHandler
                    }
                );                
            }
            else {
                // fallback - something odd happened so just try to unrender the previewed html
                var previewDiv = $('preview-panel');
                WikiTextConverter.convertFromWiki(previewDiv.innerHTML,
                    {
                        callback: doUpdateAdvancedEditor,
                        timeout: DWRTimeout, // 20 seconds
                        errorHandler: editorErrorHandler
                    }
                );
            }
            
            // reset variables
            previousToPreviewMode = "";
            previousToPreviewText = "";            
        }
        else {
            showEditor(newMode);
            setEditorContent(newMode);
        }

    }
    else if (newMode == "preview") {
        // hide the attachment div
        if ($('jive-add-attachment')) {
            $('jive-add-attachment').style.display = "none";
        }

        // can only come from one of the two editors
        if (currentMode == "advanced") {
            // we need to grab the html here otherwise it'll be gone once we
            // destroy the advanced editor
            currentHTML = tinyMCE.getContent('GUIEditor');
            // call our custom cleanup on the content coming from the editor
            currentHTML = jiveCustomCleanup("submit_content", currentHTML);

            // set previous mode values
            previousToPreviewMode = "advanced";
            previousToPreviewText = currentHTML;
            
            showEditor(newMode);
            WikiTextConverter.convertToPreviewFromXhtml(currentHTML,
                {
                    callback: doUpdatePreview,
                    timeout: DWRTimeout, // 20 seconds
                    errorHandler: editorErrorHandler
                }
            );
        }
        else if (currentMode == "text") {
            var textarea = $('textEditor');
            
            // set previous mode values
            previousToPreviewMode = "text";
            previousToPreviewText = textarea.value;
            
            WikiTextConverter.convertToPreviewFromWiki(textarea.value,
                {
                    callback: doUpdatePreview,
                    timeout: DWRTimeout, // 20 seconds
                    errorHandler: editorErrorHandler
                }
            );
        }
        else {
            showEditorWaitImage(false);
        }
    }
}

function showEditor(newMode) {
    showEditorWaitImage(false);

    if (!advancedModeEnabled) {
        // remove the advanced tab
        var advancedTab = $('wysiwyg-tab');
        if (advancedTab) {
            advancedTab.parentNode.removeChild(advancedTab);
        }

        if ("advanced" == newMode) {
            newMode = "text";
        }
    }

    var jivetabs = $('editor-tabs');

    if (newMode == "advanced") {
        if (currentMode == "") {
            // something wierd going on here that a timeout fixes
            currentMode = "advanced";
            setTimeout("showEditor('advanced')", 200);
        }
        else {
            jivetabs.style.display = 'block';
            editorTabs.displayTab('wysiwyg-tab','wysiwyg-panel');
            tinyMCE.addMCEControl($('wysiwyg-panel'), 'GUIEditor');
        }

        var wikiHelp = $("jive-markup-help-block");
        if (wikiHelp) {
            wikiHelp.style.display = 'none';
        }
    }
    else if (newMode == "text") {
        if (currentMode == "advanced") {
            tinyMCE.removeMCEControl('GUIEditor');
            // the gui editor dumps the text into the containing div, cleanup after it
            var advancedPanel = $("wysiwyg-panel");
            advancedPanel.innerHTML = '';
            advancedPanel.style.display = 'none';
        }

        try {
            var wikiHelp = $("jive-markup-help-block");
            if (wikiHelp) {
                wikiHelp.style.display = 'block';
                }
        }
        catch (e) {}

        // we do this after we remove the gui editor since it changes the style of the div
        jivetabs.style.display = 'block';
        editorTabs.displayTab('text-tab','text-panel');
    }
    else if (newMode == "preview") {
        if (currentMode == "advanced") {
            tinyMCE.removeMCEControl('GUIEditor');
            // the gui editor dumps the text into the containing div, cleanup after it
            var advancedPanel = $("wysiwyg-panel");
            advancedPanel.innerHTML = '';
            advancedPanel.style.display = 'none';
        }

        // we do this after we remove the gui editor since it changes the style of the div
        jivetabs.style.display = 'block';
        editorTabs.displayTab('preview-tab','preview-panel');

        try {
            var wikiHelp = $("jive-markup-help-block");
            if (wikiHelp) {
                wikiHelp.style.display = 'none';
            }
        }
        catch (e) {}
    }
}

function saveEditorChanges() {
    showEditorWaitImage(true);

    var html = "";
    if (currentMode == "advanced") {
        html = tinyMCE.getContent('GUIEditor');
        // call our custom cleanup on the content coming from the editor
        html = jiveCustomCleanup("submit_content", html);
    }
    else if (currentMode == "text") {
        var textarea = $('textEditor');
        html = textarea.value;
    }
    else if (currentMode == "preview") {
        html = currentHTML;
    }
    var textarea = $('textEditor');
    textarea.value = html;
}

function showEditorWaitImage(flag) {
    var waitImage = $('jiveEditorWaitImage');
    waitImage.style.visibility = (flag ? 'visible' : 'hidden');
}

var errorHandlerMessage = "An error occurred:";

function editorErrorHandler(message, exception) {
    if (message.indexOf('Timeout') == -1) {
        $('dwr-error-text').innerHTML = errorHandlerMessage + ' Error Code: ' + message;
        Effect.Appear($('dwr-error-table'));
        Effect.Fade($('dwr-error-table'),{delay: 10});
    }
};

var spellCheckTimeout;

function enableInlineSpellCheck(inlineSpellEnabled) {
    if (!inlineSpellEnabled) {
        return spellForm('textEditor');
    }
    else if (typeof(oSpell) == 'undefined' || !oSpell.supported) {
        return spellForm('textEditor');
    }
    showEditorWaitImage(true);
//    pause(50);

    // hide the text links, show the result links
    var d = $("text-panel-links");
    var d2 = $("jive-resume-after-spell");
    d.style.display = "none";
    d2.style.display = "block"

    oSpell.resetMarkup();
    //oSpell.markup();

    showEditorWaitImage(false);

    return false;
}


function disableInlineSpellCheck(inlineSpellEnabled) {
    if (!inlineSpellEnabled) {
        return false;
    }
    else if (!oSpell.supported) {
        return false;
    }

    showEditorWaitImage(true);
//    pause(50);

    oSpell.reSyncScroll();
    oSpell.hideMarkup();

    // show the text links, hide the result links
    var d = $("text-panel-links");
    var d2 = $("jive-resume-after-spell");
    d.style.display = "block";
    d2.style.display = "none"

    showEditorWaitImage(false);

    return false;
}

function rescanInlineSpellCheck(inlineSpellEnabled) {
    if (!inlineSpellEnabled) {
        return;
    }
    else if (!oSpell.supported) {
        return;
    }

    showEditorWaitImage(true);
    oSpell.resetMarkup();
    showEditorWaitImage(false);
}

function resizeInlineSpellCheck() {
    if (typeof(oSpell) == 'undefined') {
        return;
    }

    var w = $('textEditor').offsetWidth;

    if (w > 0) {
        $('jive-spell-markup-div').style.width = w + "px";
    }
}

var insertLinkVisible = false;
function showInsertLink() {
    if (insertLinkVisible) {
        insertLinkVisible = false;
        new Effect.SlideUp('link-panel')
    } else {
        insertLinkVisible = true;
        $('linkTextID').value = getSelectionRangeText($('textEditor'));
        new Effect.SlideDown('link-panel')
    }
}

function insertLinkCallback(win) {
    if ((!($('linkURLID').value) || trimString($('linkURLID').value) == '')) {
        new Effect.Appear('link_form_error_msg');
        new Effect.Shake('modal_dialog'); return false;
    }
    else {
        // insert the link
        var link = " [";
        if ($('linkTextID').value && trimString($('linkTextID').value) != '') {
            link += trimString($('linkTextID').value) + "|";
        }

        link +=  trimString($('linkURLID').value);
        link += "] ";

        replaceAtCursor(link, $('textEditor'));

        if (oSpell) {
            oSpell.resetMarkup();
        }

        $('linkURLID').value = '';
        $('linkTextID').value = '';
        insertLinkVisible = false;
        new Effect.SlideUp('link-panel');

        return true;
    }
}

function insertLinkCancelCallback(win) {
    $('link_form_error_msg').style.display = "none";
    insertLinkVisible = false;
    new Effect.SlideUp('link-panel')
    return true;
}

function trimString(s) {
    s.replace(/^\s*|\s*$/g, "");
    return s;
}

var __postSubmitted = false;
var cancelPost = false;

function validatePost() {
    if (cancelPost) {
        return true;
    }

    var hasError = false;

    // verify that a subject and body have been provided
    var sub = document.getElementById('subject01');
    if (typeof(sub) != "undefined" && trimString(sub.value) == '') {
        // display alert
        var t = document.getElementById('post-error-table');
        if (t) {
            t.style.display = "block";
            t = document.getElementById('post-error-subject');
            if (t) {
                t.style.display = "block";
            }
        }
        hasError = true;
    }
    else {
        var t = document.getElementById('post-error-subject');
        if (t) {
            t.style.display = "none";
        }
    }

    if (getEditorMode() == "preview" && previousToPreviewMode == "advanced") {
        // NOTE: currentHTML gets overwritten with the HTML from the preview, which will contain the rendered
        // HTML of macros, which we can't cleanup, instead of currentHTML, use previousToPreviewText, which
        // by my estimation will always be the original HTML from the rich text editor
        document.getElementById('textEditor').value = jiveCustomCleanup("submit_content", previousToPreviewText);
        
        // flag as coming from the gui editor so that we know to unformat it
        document.getElementById('postTypeFlag').value = "true";
        
        var t = document.getElementById('post-error-body');
        if (t) {
            t.style.display = "none";
        }
    }
    else if (getEditorMode() == "text" || getEditorMode() == "preview") {
        var body = document.getElementById('textEditor');
        if (typeof(body) != "undefined" && trimString(body.value) == '') {
            // display alert
            var t = document.getElementById('post-error-table');
            if (t) {
                t.style.display = "block";
                t = document.getElementById('post-error-body');
                if (t) {
                    t.style.display = "block";
                }
            }
            hasError = true;
        }
        else {
            var t = document.getElementById('post-error-body');
            if (t) {
                t.style.display = "none";
            }
        }
    }
    else {
        var body = tinyMCE.getContent('GUIEditor');
        // call our custom cleanup on the content coming from the editor
        body = jiveCustomCleanup("submit_content", body);

        if (body == null || trimString(body) == '') {
            // display alert
            var t = document.getElementById('post-error-table');
            if (t) {
                t.style.display = "block";
                t = document.getElementById('post-error-body');
                if (t) {
                    t.style.display = "block";
                }
            }
            hasError = true;
        }
        else {
            // put the body of the gui editor into the text area
            document.getElementById('textEditor').value = body;
            // flag as coming from the gui editor so that we know to unformat it
            document.getElementById('postTypeFlag').value = "true";
            
            var t = document.getElementById('post-error-body');
            if (t) {
                t.style.display = "none";
            }
        }
    }

    if (hasError) {
        return false;
    }

    // hide alert
    var t = document.getElementById('post-error-table');
    if (t) {
        t.style.display = "none";
    }

    if (arguments.length > 0) {
        window.onbeforeunload = null;
    }
    
    if (typeof(autoSave) != "undefined" && autosave != null) {
        Event.stopObserving(window, 'unload', autoSave.doDiscard, false);
    }

    if (!__postSubmitted) {
        __postSubmitted = true;
        return true;
    }
    return false;
}