function MultiplexHandler(aEvent)
{
    MultiplexHandlerEx(
        aEvent,
        function Browser_SelectDetector(event) {
            BrowserSetForcedDetector(true/*Reload from history*/);
            /* window.content.location.reload() will re-download everything */
            SelectDetector(event, null);
        },
        function Browser_SetForcedCharset(charset, isPredefined) {
            BrowserSetForcedCharacterSet(charset);
        }
    );
}

function MailMultiplexHandler(aEvent)
{
    MultiplexHandlerEx(
        aEvent,
        function Mail_SelectDetector(event) {
            SelectDetector(
                event,
                function Mail_Reload() {
                    messenger.setDocumentCharset(msgWindow.mailCharacterSet);
                }
            );
        },
        function Mail_SetForcedCharset(charset, isPredefined) {
            MessengerSetForcedCharacterSet(charset);
        }
    );
}

function ComposerMultiplexHandler(aEvent)
{
    MultiplexHandlerEx(
        aEvent,
        function Composer_SelectDetector(event) {
            SelectDetector(
                event,
                function Composer_Reload() {
                    EditorLoadUrl(GetDocumentUrl());
                }
            );
        },
        function Composer_SetForcedCharset(charset, isPredefined) {
            if ((!isPredefined) && charset.length > 0) {
                gCharsetMenu.SetCurrentComposerCharset(charset);
            }
            EditorSetDocumentCharacterSet(charset);
        }
    );
}

function MultiplexHandlerEx(aEvent, aSelectDetector, aSetForcedCharset)
{
    try {
        var node = aEvent.target;
        var name = node.getAttribute('name');

        if (name == 'detectorGroup') {
            aSelectDetector(aEvent);
        } else if (name == 'charsetGroup') {
            var charset = node.getAttribute('id');
            charset = charset.substring('charset.'.length, charset.length)
            aSetForcedCharset(charset, true);
        } else if (name == 'charsetCustomize') {
            //do nothing - please remove this else statement, once the charset prefs moves to the pref window
        } else {
            aSetForcedCharset(node.getAttribute('id'), false);
        }
    } catch(ex) {
        alert(ex);
    }
}

function SelectDetector(event, doReload)
{
    dump("Charset Detector menu item pressed: " + event.target.getAttribute('id') + "\n");

    var uri =  event.target.getAttribute("id");
    var prefvalue = uri.substring('chardet.'.length, uri.length);
    if ("off" == prefvalue) { // "off" is special value to turn off the detectors
        prefvalue = "";
    }

    try {
        var pref = Components.classes["@mozilla.org/preferences-service;1"]
                             .getService(Components.interfaces.nsIPrefBranch);
        var str =  Components.classes["@mozilla.org/supports-string;1"]
                             .createInstance(Components.interfaces.nsISupportsString);

        str.data = prefvalue;
        pref.setComplexValue("intl.charset.detector",
                             Components.interfaces.nsISupportsString, str);
        if (typeof doReload == "function") doReload();
    }
    catch (ex) {
        dump("Failed to set the intl.charset.detector preference.\n");
    }
}

var gPrevCharset = null;
function UpdateCurrentCharset()
{
    // extract the charset from DOM
    var wnd = document.commandDispatcher.focusedWindow;
    if ((window == wnd) || (wnd == null)) wnd = window.content;

    // Uncheck previous item
    if (gPrevCharset) {
        var pref_item = document.getElementById('charset.' + gPrevCharset);
        if (pref_item)
          pref_item.setAttribute('checked', 'false');
    }

    var menuitem = document.getElementById('charset.' + wnd.document.characterSet);
    if (menuitem) {
        menuitem.setAttribute('checked', 'true');
    }
}

function UpdateCurrentMailCharset()
{
    var charset = msgWindow.mailCharacterSet;
    var menuitem = document.getElementById('charset.' + charset);

    if (menuitem) {
        menuitem.setAttribute('checked', 'true');
    }
}

function UpdateCharsetDetector()
{
    var prefvalue;

    try {
        var pref = Components.classes["@mozilla.org/preferences-service;1"]
                             .getService(Components.interfaces.nsIPrefBranch);
        prefvalue = pref.getComplexValue("intl.charset.detector",
                                         Components.interfaces.nsIPrefLocalizedString).data;
    }
    catch (ex) {
        prefvalue = "";
    }

    if (prefvalue == "") prefvalue = "off";
    dump("intl.charset.detector = "+ prefvalue + "\n");

    prefvalue = 'chardet.' + prefvalue;
    var menuitem = document.getElementById(prefvalue);

    if (menuitem) {
        menuitem.setAttribute('checked', 'true');
    }
}

function UpdateMenus(event)
{
    // use setTimeout workaround to delay checkmark the menu
    // when onmenucomplete is ready then use it instead of oncreate
    // see bug 78290 for the detail
    UpdateCurrentCharset();
    setTimeout(UpdateCurrentCharset, 0);
    UpdateCharsetDetector();
    setTimeout(UpdateCharsetDetector, 0);
}

function CreateMenu(node)
{
  var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  observerService.notifyObservers(null, "charsetmenu-selected", node);
}

function UpdateMailMenus(event)
{
    // use setTimeout workaround to delay checkmark the menu
    // when onmenucomplete is ready then use it instead of oncreate
    // see bug 78290 for the detail
    UpdateCurrentMailCharset();
    setTimeout(UpdateCurrentMailCharset, 0);
    UpdateCharsetDetector();
    setTimeout(UpdateCharsetDetector, 0);
}

var gCharsetMenu = Components.classes['@mozilla.org/rdf/datasource;1?name=charset-menu'].getService().QueryInterface(Components.interfaces.nsICurrentCharsetListener);
var gLastBrowserCharset = null;

function charsetLoadListener (event)
{
    var charset = window.content.document.characterSet;

    if (charset.length > 0 && (charset != gLastBrowserCharset)) {
        gCharsetMenu.SetCurrentCharset(charset);
        gPrevCharset = gLastBrowserCharset;
        gLastBrowserCharset = charset;
    }
}


function composercharsetLoadListener (event)
{
    var charset = window.content.document.characterSet;

 
    if (charset.length > 0 ) {
       gCharsetMenu.SetCurrentComposerCharset(charset);
    }
 }

function SetForcedEditorCharset(charset)
{
    if (charset.length > 0 ) {
       gCharsetMenu.SetCurrentComposerCharset(charset);
    }
    EditorSetDocumentCharacterSet(charset);
}


var gLastMailCharset = null;

function mailCharsetLoadListener (event)
{
    if (msgWindow) {
        var charset = msgWindow.mailCharacterSet;
        if (charset.length > 0 && (charset != gLastMailCharset)) {
            gCharsetMenu.SetCurrentMailCharset(charset);
            gLastMailCharset = charset;
        }
    }
}

function InitCharsetMenu()
{
    removeEventListener("load", InitCharsetMenu, true);

    var wintype = document.documentElement.getAttribute('windowtype');
    if (window && (wintype == "navigator:browser"))
    {
        var contentArea = window.document.getElementById("appcontent");
        if (contentArea)
            contentArea.addEventListener("pageshow", charsetLoadListener, true);
    }
    else
    {
        var arrayOfStrings = wintype.split(":");
        if (window && arrayOfStrings[0] == "mail")
        {
            var messageContent = window.document.getElementById("messagepane");
            if (messageContent)
                messageContent.addEventListener("pageshow", mailCharsetLoadListener, true);
        }
        else
        if (window && arrayOfStrings[0] == "composer")
        {
            contentArea = window.document.getElementById("appcontent");
            if (contentArea)
                contentArea.addEventListener("pageshow", composercharsetLoadListener, true);
        }
    }
}

addEventListener("load", InitCharsetMenu, true);
