/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is JSIRC Test Client #3
 *
 * The Initial Developer of the Original Code is New Dimensions Consulting,
 * Inc. Portions created by New Dimensions Consulting, Inc. are
 * Copyright (C) 1999 New Dimenstions Consulting, Inc. All
 * Rights Reserved.
 *
 * Contributor(s): 
 *
 *
 * Contributor(s):
 *  Robert Ginda, rginda@ndcico.com, original author
 */

/*
 * currently recognized prefs:
 * + extensions.irc.
 *   +- nickname (String)  initial nickname
 *   +- username (String)  initial username (ie: username@host.tld)
 *   +- desc     (String)  initial description (used in whois info)
 *   +- defaultNet (String) default network to use for irc:// urls
 *   +- initialURLs (String) irc:// urls to connect to on startup, semicolon
 *   |                       seperated
 *   +- initialScripts (String) urls for scripts to run at startup,
 *   |                          semicolon seperated
 *   +- newTabThreshold (Number) max number of tabs to have open before disabling
 *   |                           automatic tab creation for private messages.
 *   |                           use 0 for unlimited new tabs, or 1 to disable
 *   |                           automatic tab creation.
 *   +- focusNewTab (Boolean) bring new tabs created in response to a private
 *   |                        message to the front.
 *   +- munger   (Boolean) send output through text->html munger
 *   |  +- colorCodes (Boolean) enable color code handling
 *   |  +- <various>  (Boolean) enable specific munger entry
 *   |  +- smileyText (Boolean) true => display text (and graphic) when
 *   |                                  matching smileys
 *   |                          false => show only the smiley graphic
 *   +- nickCompleteStr (String) String to use when tab-completing nicknames
 *   |                           at the beginning of sentences
 *   +- stalkWords (String) List of words to add to the stalk victims list
 *   |                      semicolon seperated (see the /stalk command)
 *   +- deleteOnPart (Boolean) Delete channel window automatically after a /part
 *   |
 *   |  The following beep prefs can be set to the text "beep" to use the
 *   |  system beep, or "" to disable the beep.
 *   +- msgBeep   (String) url to sound to play when a /msg is recieved
 *   +- stalkBeep (String) url to sound to play when a /stalk matches
 *   +- queryBeep (String) url to sound to play for new msgs in a /query
 *   |
 *   +- notify
 *   |  +- aggressive (Boolean) flash trayicon/ bring window to top when
 *   |                          your nickname is mentioned.
 *   +- settings
 *   |  +- autoSave (Boolean) Save settings on exit
 *   +- style   
 *   |  +- default (String) url to default style sheet
 *   +- views
 *   |  +- collapseMsgs (Boolean) Collapse consecutive messages from same
 *   |  |                         user
 *   |  +- copyMessages (Boolean) Copy important messages to the network
 *   |  |                         window
 *   |  +- client
 *   |  |  +- maxlines  (Number) max lines to keep in *client* view
 *   |  +- network
 *   |  |  +- maxlines  (Number) max lines to keep in network views
 *   |  +- channel
 *   |  |  +- maxlines  (Number) max lines to keep in channel views
 *   |  +- chanuser
 *   |     +- maxlines  (Number) max lines to keep in /msg views
 *   +- debug
 *      +- tracer (Boolean) enable/disable debug message tracing
 */

function readIRCPrefs (rootNode)
{
    const PREF_CTRID = "@mozilla.org/preferences-service;1";
    const nsIPrefBranch = Components.interfaces.nsIPrefBranch
    var pref = Components.classes[PREF_CTRID].getService(nsIPrefBranch);
    if(!pref)
        throw ("Can't find pref component.");

    if (!rootNode)
        rootNode = "extensions.irc.";

    if (!rootNode.match(/\.$/))
        rootNode += ".";
    
    CIRCNetwork.prototype.INITIAL_NICK =
        getCharPref (pref, rootNode + "nickname",
                     CIRCNetwork.prototype.INITIAL_NICK);
    CIRCNetwork.prototype.INITIAL_NAME =
        getCharPref (pref, rootNode + "username",
                     CIRCNetwork.prototype.INITIAL_NAME);
    CIRCNetwork.prototype.INITIAL_DESC =
        getCharPref (pref, rootNode + "desc",
                     CIRCNetwork.prototype.INITIAL_DESC);
    client.DEFAULT_NETWORK =
        getCharPref (pref, rootNode + "defaultNet", "moznet");
    client.CHARSET = getCharPref (pref, rootNode + "charset", "");
    client.INITIAL_URLS =
        getCharPref (pref, rootNode + "initialURLs", "irc://");
    if (!client.INITIAL_URLS)
        client.INITIAL_URLS = "irc://";
    client.INITIAL_SCRIPTS =
        getCharPref (pref, rootNode + "initialScripts", "");
    client.NEW_TAB_THRESHOLD =
        getIntPref (pref, rootNode + "newTabThreshold", 15);
    client.FOCUS_NEW_TAB =
        getIntPref (pref, rootNode + "focusNewTab", false);
    client.ADDRESSED_NICK_SEP =
        getCharPref (pref, rootNode + "nickCompleteStr",
                     client.ADDRESSED_NICK_SEP).replace(/\s*$/, "");
    client.INITIAL_VICTIMS =
        getCharPref (pref, rootNode + "stalkWords", "");
    
    client.DELETE_ON_PART =
        getCharPref (pref, rootNode + "deleteOnPart", true);

    client.STALK_BEEP =
        getCharPref (pref, rootNode + "stalkBeep", "beep");
    client.MSG_BEEP =
        getCharPref (pref, rootNode + "msgBeep", "beep beep");
    client.QUERY_BEEP =
        getCharPref (pref, rootNode + "queryBeep", "beep");
    
    client.munger.enabled =
        getBoolPref (pref, rootNode + "munger", client.munger.enabled);

    client.enableColors =
        getBoolPref (pref, rootNode + "munger.colorCodes", true);

    client.smileyText =
        getBoolPref (pref, rootNode + "munger.smileyText", false);

    for (var entry in client.munger.entries)
    {
        if (entry[0] != ".")
        {
            client.munger.entries[entry].enabled =
                getBoolPref (pref, rootNode + "munger." + entry,
                             client.munger.entries[entry].enabled);
        }
    }

    client.FLASH_WINDOW =
        getBoolPref (pref, rootNode + "notify.aggressive", true);

    client.SAVE_SETTINGS =
        getBoolPref (pref, rootNode + "settings.autoSave", true);

    client.DEFAULT_STYLE =
        getCharPref (pref, rootNode + "style.default",
                     "chrome://chatzilla/skin/output-default.css");
    
    client.COLLAPSE_MSGS = 
        getBoolPref (pref, rootNode + "views.collapseMsgs", false);

    client.COPY_MESSAGES = 
        getBoolPref (pref, rootNode + "views.copyMessages", true);

    client.MAX_MESSAGES = 
        getIntPref (pref, rootNode + "views.client.maxlines",
                    client.MAX_MESSAGES);

    CIRCNetwork.prototype.MAX_MESSAGES =
        getIntPref (pref, rootNode + "views.network.maxlines",
                    CIRCChanUser.prototype.MAX_MESSAGES);

    CIRCChannel.prototype.MAX_MESSAGES =
        getIntPref (pref, rootNode + "views.channel.maxlines",
                    CIRCChannel.prototype.MAX_MESSAGES);

    CIRCUser.prototype.MAX_MESSAGES =
        getIntPref (pref, rootNode + "views.chanuser.maxlines",
                    CIRCChanUser.prototype.MAX_MESSAGES);
    
    var h = client.eventPump.getHook ("event-tracer");
    h.enabled = client.debugMode =
        getBoolPref (pref, rootNode + "debug.tracer", h.enabled);
    
}

function writeIRCPrefs (rootNode)
{
    const PREF_CTRID = "@mozilla.org/preferences-service;1";
    const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
    var pref = Components.classes[PREF_CTRID].getService(nsIPrefBranch);
    if(!pref)
        throw ("Can't find pref component.");

    if (!rootNode)
        rootNode = "extensions.irc.";

    if (!rootNode.match(/\.$/))
        rootNode += ".";
    
    pref.setCharPref (rootNode + "nickname",
                      CIRCNetwork.prototype.INITIAL_NICK);
    pref.setCharPref (rootNode + "username",
                      CIRCNetwork.prototype.INITIAL_NAME);
    pref.setCharPref (rootNode + "desc", CIRCNetwork.prototype.INITIAL_DESC);
    pref.setCharPref (rootNode + "charset", client.CHARSET);
    pref.setCharPref (rootNode + "nickCompleteStr", client.ADDRESSED_NICK_SEP);
    pref.setCharPref (rootNode + "initialURLs", client.INITIAL_URLS);
    pref.setCharPref (rootNode + "initialScripts", client.INITIAL_SCRIPTS);
    pref.setCharPref (rootNode + "newTabThreshold", client.NEW_TAB_THRESHOLD);
    pref.setCharPref (rootNode + "focusNewTab", client.FOCUS_NEW_TAB);
    pref.setCharPref (rootNode + "style.default", client.DEFAULT_STYLE);
    pref.setCharPref (rootNode + "stalkWords",
                      client.stalkingVictims.join ("; "));
    pref.setCharPref (rootNode + "stalkBeep", client.STALK_BEEP);
    pref.setCharPref (rootNode + "msgBeep", client.MSG_BEEP);
    pref.setCharPref (rootNode + "queryBeep", client.QUERY_BEEP);    
    pref.setBoolPref (rootNode + "munger", client.munger.enabled);
    pref.setBoolPref (rootNode + "munger.colorCodes", client.enableColors);
    pref.setBoolPref (rootNode + "munger.smileyText", client.smileyText);

    for (var entry in client.munger.entries)
    {
        if (entry[0] != ".")
        {
            pref.setBoolPref (rootNode + "munger." + entry,
                              client.munger.entries[entry].enabled);
        }
    }
    pref.setBoolPref (rootNode + "notify.aggressive", client.FLASH_WINDOW);
    pref.setBoolPref (rootNode + "views.collapseMsgs", client.COLLAPSE_MSGS);
    pref.setBoolPref (rootNode + "views.copyMessages", client.COPY_MESSAGES);
    pref.setIntPref (rootNode + "views.client.maxlines", client.MAX_MESSAGES);
    pref.setIntPref (rootNode + "views.network.maxlines",
                     CIRCChanUser.prototype.MAX_MESSAGES);
    pref.setIntPref (rootNode + "views.channel.maxlines",
                     CIRCChannel.prototype.MAX_MESSAGES);
    pref.setIntPref (rootNode + "views.chanuser.maxlines",
                     CIRCChanUser.prototype.MAX_MESSAGES);
    
    var h = client.eventPump.getHook ("event-tracer");
    pref.setBoolPref (rootNode + "debug.tracer", h.enabled);
    
}

function getCharPref (prefObj, prefName, defaultValue)
{
    var e, rv;
    
    try
    {
        rv = prefObj.getCharPref (prefName);
    }
    catch (e)
    {
        rv = defaultValue;
    }

    //dd ("getCharPref: returning '" + rv + "' for " + prefName);
    return rv;
    
}

function getIntPref (prefObj, prefName, defaultValue)
{
    var e;

    try
    {
        return prefObj.getIntPref (prefName);
    }
    catch (e)
    {
        return defaultValue;
    }
    
}

function getBoolPref (prefObj, prefName, defaultValue)
{
    var e;

    try
    {
        return prefObj.getBoolPref (prefName);
    }
    catch (e)
    {
        return defaultValue;
    }
    
}
