/* -*- 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 #2
 *
 * 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
 */

function onLoad()
{

    initStatic();
    init(client);

    var entry = document.getElementById("input");
    EntryHistory(20, entry, onInputLine);

    for (var a in client.INITIAL_ALIASES)
        client.addAlias (client.INITIAL_ALIASES[a].name,
                         client.INITIAL_ALIASES[a].value);
    
    client.lastListType = "networks";
    setCurrentNetwork ("efnet");
    updateListNow();
    updateStatus();
    //onListClick({target: document.getElementById ("lstQuickList")});
    mainstep();
    
}

function onUnload()
{

    client.quit ("re-load");
    
}

CIRCNetwork.prototype.onNotice = function my_notice (e)
{

    this.display (e.meat, "NOTICE");
    
}

CIRCChannel.prototype.onPrivmsg = function my_cprivmsg (e)
{
    
    e.user.display (e.meat, "PRIVMSG");
    
    if (e.meat.indexOf (client.prefix) == 0)
    {
        try
        {
            var v = eval(e.meat.substring (client.prefix.length,
                                           e.meat.length));
        }
        catch (ex)
        {
            this.say (e.user.nick + ": " + String(ex));
            return false;
        }
        
        if (typeof (v) != "undefined")
        {						
            if (v != null)                
                v = String(v);
            else
                v = "null";
            
            var rsp = e.user.nick + ", your result is,";
            
            if (v.indexOf ("\n") != -1)
                rsp += "\n";
            else
                rsp += " ";
            
            this.say (rsp + v);
        }
    }

    return true;
    
}

CIRCChannel.prototype.onNotice = function my_notice (e)
{

    e.user.display (e.meat, "NOTICE", e.user.nick);
    
}

CIRCChannel.prototype.onCTCPAction = function my_caction (e)
{

    e.user.display (e.CTCPData, "ACTION");

}

CIRCChannel.prototype.onJoin = function my_cjoin (e)
{

    this.display(e.user.nick + " has joined " + e.channel.name,
                 "JOIN");
    if (client.lastListType == "chan-users")
        updateList();
    
}

CIRCChannel.prototype.onPart = function my_cpart (e)
{

    this.display (e.user.nick + " has left " + e.channel.name, "PART");
    if (client.lastListType == "chan-users")
        updateList();
    
}

CIRCChannel.prototype.onKick = function my_ckick (e)
{

    this.display (e.lamer.nick + " was booted from " + e.channel.name +
                  " by " + e.user.nick + " (" + e.reason + ")", "KICK");
    if (client.lastListType == "chan-users")
        updateList();
    
}

CIRCUser.prototype.onPrivmsg = function my_cprivmsg (e)
{
    
    this.display (e.meat, "PRIVMSG");
    
}

CIRCUser.prototype.onNotice = function my_notice (e)
{

    this.display (e.meat, "NOTICE");
    
}    

CIRCUser.prototype.onNick = function my_unick (e)
{

    this.parent.parent.display (e.oldNick + " is now known as " +
                                e.user.nick, "NICK");
    if (client.lastListType.search ("users") != -1)
        updateList();
    
}

CIRCUser.prototype.onQuit = function my_quit (e)
{

    this.parent.parent.display (e.user.nick + " has left " +
                                e.server.parent.name + " (" + e.reason + ")",
                                "QUIT");
    if (client.lastListType.search ("users") != -1)
        updateList();
    
}

function onCommand()
{
    var btn = document.getElementById ("btnCommand");
    
    eval (btn.getAttribute("command"));
    
}

function onInputLine(line)
{

    if (line[0] == client.COMMAND_CHAR)
    {
        var ary = line.substr(1, line.length).match (/(\S+)? ?(.*)/);
        var cmd = ary[1];

        var destMethod = "onInput" + ary[1][0].toUpperCase() +
            ary[1].substr (1, ary[1].length).toLowerCase();
        var type = "input-" + ary[1].toLowerCase();
        var ev = new CEvent ("client", type, client, destMethod);

        ev.cmd = cmd;
        ev.inputData =  ary[2] ? ary[2] : "";

        ev.network = client.network;
        ev.server = client.network.primServ;
        ev.channel = client.channel;

        client.eventPump.addEvent (ev);
        
    }
    else
        if (client.channel)
        {
            client.channel.display (line, "PRIVMSG", "!ME");
            client.channel.say (line);
        }
    
}

client.onInputMe = function cli_ime (e)
{
    if (e.channel)
    {
        e.channel.act (e.inputData);
        client.channel.display (e.inputData, "ACTION", "!ME");
    }
}

client.onInputNick = function cli_inick (e)
{

    if (!e.inputData)
        return false;
    
    if (e.server) 
        e.server.sendData ('NICK ' + e.inputData + '\n');
    else
        CIRCNetwork.prototype.INITIAL_NICK = e.inputData;
    
}

client.onInputName = function cli_iname (e)
{

    if (!e.inputData)
        return false;
    
    CIRCNetwork.prototype.INITIAL_NAME = e.inputData;
    
}

client.onInputDesc = function cli_idesc (e)
{

    if (!e.inputData)
        return false;
    
    CIRCNetwork.prototype.INITIAL_DESC = e.inputData;
    
}
    
client.onInputAlias = function cli_ialias (e)
{
    var ary = e.inputData.match (/(\S+)? ?(.*)/);
    if (!ary)
        return false;

    if (!ary[2])
        client.removeAlias (ary[1]);
    else
        client.addAlias (ary[1], ary[2]);
    
}

client.onInputRaw = function cli_iraw (e)
{

    client.primNet.primServ.sendData (e.inputData + "\n");
    
}

client.onInputEval = function cli_ieval (e)
{

    try
    {
        rv = String(eval (e.inputData));
        if (rv.indexOf ("\n") == -1)
            client.display ("(" + e.inputData + ") " + rv, "EVAL");
        else
            client.display ("(" + e.inputData + ")\n" + rv, "EVAL");
    }
    catch (ex)
    {
        client.display (ex, "ERROR");
    }    
    
}
    
client.onInputJ = client.onInputJoin = function cli_ijoin (e)
{
    if (!e.network || !e.network.isConnected())
        return false;
    
    var name = e.inputData.match(/\S+/);
    if (!name)
        return false;

    e.channel = e.network.primServ.addChannel (String(name));
    setCurrentChannel (e.channel);
    client.lastListType = "chan-users";
    updateList();
    e.channel.join();
    
}

client.onInputP = client.onInputPart = client.onInputLeave =
function cli_ipart (e)
{
    if (!e.channel)
        return false;

    e.channel.part();    
    
}

function onListNetworks ()
{
    client.lastListType = "networks";
    updateListNow();
    
}

function onListUsers ()
{
    var quickList = document.getElementById("QuickList");

    if (!client.network || !client.network.isConnected())
    {
        listClear (quickList);
        client.lastListType = "none";
        return true;
    }

    client.lastListType = "users";
    updateListNow();
    
}

function onListChannels ()
{
    var quickList = document.getElementById("QuickList");
    
    if (!client.network || !client.network.isConnected())
    {
        listClear (quickList);
        client.lastListType = "none";
        return true;
    }

    client.lastListType = "channels";
    updateListNow();
    
}

function onListChanUsers ()
{
    var quickList = document.getElementById("QuickList");    
    
    if (!client.channel)
    {
        listClear (quickList);
        client.lastListType = "none";
        return true;
    }
    
    client.lastListType = "chan-users";    
    updateListNow();
    
}

function onListClick (e)
{
    var name = e.target.text;
    var ary = name.match(/\[.*\] (.*)/);
    var name = (ary) ? ary[1] : name;

    switch (client.lastListType)
    {
        case "networks":
            setCurrentNetwork (name);
            break;

        case "users":
            setCurrentUser (name);
            break;
            
        case "channels":
            setCurrentChannel (name);
            break;

        case "chan-users":
            setCurrentCUser (name);
            break;

        default:
            break;
            
    }
    
}

function onActListClick (e)
{
    var name = e.target.text;
    var ary = name.match(/\[.*\] (.*)/);
    var name = (ary) ? ary[1] : name;

    displayHistory (client.actList[name].source);
    
}


function onNickClick (e)
{

    dd (dumpObjectTree (e));
    
}
