Bug 229545 Land ChatZilla 0.9.54 on trunk.

r=rginda@hacksrus.com
This commit is contained in:
silver%warwickcompsoc.co.uk 2004-01-03 22:21:35 +00:00
parent ce5088ba8f
commit 56cdfb949a
16 changed files with 888 additions and 296 deletions

View File

@ -1472,10 +1472,13 @@ CIRCServer.prototype.onPart =
function serv_part (e)
{
e.channel = new CIRCChannel (this, e.params[1]);
e.reason = (e.params.length > 1) ? e.decodeParam(2, e.channel) : "";
e.reason = (e.params.length > 2) ? e.decodeParam(2, e.channel) : "";
e.user = new CIRCChanUser (e.channel, e.user.nick);
if (userIsMe(e.user))
{
e.channel.active = false;
e.channel.joined = false;
}
e.channel.removeUser(e.user.nick);
e.destObject = e.channel;
e.set = "channel";
@ -1490,7 +1493,10 @@ function serv_kick (e)
e.lamer = new CIRCChanUser (e.channel, e.params[2]);
delete e.channel.users[e.lamer.nick];
if (userIsMe(e.lamer))
{
e.channel.active = false;
e.channel.joined = false;
}
e.reason = e.decodeParam(3, e.channel);
e.destObject = e.channel;
e.set = "channel";
@ -1507,7 +1513,10 @@ function serv_join (e)
"BANS " + e.channel.encodedName + "\n" */);
e.user = new CIRCChanUser (e.channel, e.user.nick);
if (userIsMe(e.user))
{
e.channel.active = true;
e.channel.joined = true;
}
e.destObject = e.channel;
e.set = "channel";
@ -1536,7 +1545,7 @@ function serv_pong (e)
if (this.lastPingSent)
this.lag = roundTo ((new Date() - this.lastPingSent) / 1000, 2);
delete this.lastPingSent;
this.lastPingSent = null;
e.destObject = this.parent;
e.set = "network";
@ -1830,7 +1839,15 @@ function CIRCChannel (parent, encodedName, unicodeName)
this.bans = new Object();
this.mode = new CIRCChanMode (this);
this.usersStable = true;
/* These next two flags represent a subtle difference in state:
* active - in the channel, from the server's point of view.
* joined - in the channel, from the user's point of view.
* e.g. parting the channel clears both, but being disconnected only
* clears |active| - the user still wants to be in the channel, even
* though they aren't physically able to until we've reconnected.
*/
this.active = false;
this.joined = false;
this.parent.channels[this.normalizedName] = this;
if ("onInit" in this)
@ -1915,8 +1932,14 @@ function chan_amop()
return this.users[this.parent.me.nick].isOp;
}
CIRCChannel.prototype.iAmHalfOp =
function chan_amhalfop()
{
return this.users[this.parent.me.nick].isHalfOp;
}
CIRCChannel.prototype.iAmVoice =
function chan_amop()
function chan_amvoice()
{
return this.parent.users[this.parent.parent.me.nick].isVoice;
}
@ -2038,9 +2061,6 @@ function chan_modestr (f)
CIRCChanMode.prototype.setMode =
function chanm_mode (modestr)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
this.parent.parent.sendData ("MODE " + this.parent.encodedName + " " +
modestr + "\n");
@ -2050,9 +2070,6 @@ function chanm_mode (modestr)
CIRCChanMode.prototype.setLimit =
function chanm_limit (n)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
if ((typeof n == "undefined") || (n <= 0))
{
this.parent.parent.sendData("MODE " + this.parent.encodedName +
@ -2070,9 +2087,6 @@ function chanm_limit (n)
CIRCChanMode.prototype.lock =
function chanm_lock (k)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
this.parent.parent.sendData("MODE " + this.parent.encodedName + " +k " +
k + "\n");
return true;
@ -2081,9 +2095,6 @@ function chanm_lock (k)
CIRCChanMode.prototype.unlock =
function chan_unlock (k)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
this.parent.parent.sendData("MODE " + this.parent.encodedName + " -k " +
k + "\n");
return true;
@ -2092,9 +2103,6 @@ function chan_unlock (k)
CIRCChanMode.prototype.setModerated =
function chan_moderate (f)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
var modifier = (f) ? "+" : "-";
this.parent.parent.sendData("MODE " + this.parent.encodedName + " " +
@ -2105,9 +2113,6 @@ function chan_moderate (f)
CIRCChanMode.prototype.setPublicMessages =
function chan_pmessages (f)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
var modifier = (f) ? "-" : "+";
this.parent.parent.sendData("MODE " + this.parent.encodedName + " " +
@ -2118,9 +2123,6 @@ function chan_pmessages (f)
CIRCChanMode.prototype.setPublicTopic =
function chan_ptopic (f)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
var modifier = (f) ? "-" : "+";
this.parent.parent.sendData("MODE " + this.parent.encodedName + " " +
@ -2131,9 +2133,6 @@ function chan_ptopic (f)
CIRCChanMode.prototype.setInvite =
function chan_invite (f)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
var modifier = (f) ? "+" : "-";
this.parent.parent.sendData("MODE " + this.parent.encodedName + " " +
@ -2144,9 +2143,6 @@ function chan_invite (f)
CIRCChanMode.prototype.setPvt =
function chan_pvt (f)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
var modifier = (f) ? "+" : "-";
this.parent.parent.sendData("MODE " + this.parent.encodedName + " " +
@ -2157,9 +2153,6 @@ function chan_pvt (f)
CIRCChanMode.prototype.setSecret =
function chan_secret (f)
{
if (!this.parent.users[this.parent.parent.me.nick].isOp)
return false;
var modifier = (f) ? "+" : "-";
this.parent.parent.sendData("MODE " + this.parent.encodedName + " " +
@ -2356,9 +2349,6 @@ function cusr_setop (f)
var server = this.parent.parent;
var me = server.me;
if (!this.parent.users[me.nick].isOp)
return false;
var modifier = (f) ? " +o " : " -o ";
server.sendData("MODE " + this.parent.name + modifier + this.nick + "\n");
@ -2370,9 +2360,6 @@ function cusr_sethalfop (f)
var server = this.parent.parent;
var me = server.me;
if (!this.parent.users[me.nick].isOp)
return false;
var modifier = (f) ? " +h " : " -h ";
server.sendData("MODE " + this.parent.name + modifier + this.nick + "\n");
@ -2384,9 +2371,6 @@ function cusr_setvoice (f)
var server = this.parent.parent;
var me = server.me;
if (!this.parent.users[me.nick].isOp)
return false;
var modifier = (f) ? " +v " : " -v ";
server.sendData("MODE " + this.parent.name + modifier + this.nick + "\n");
@ -2399,8 +2383,6 @@ function cusr_kick (reason)
var me = server.me;
reason = typeof reason == "string" ? reason : "";
if (!this.parent.users[me.nick].isOp)
return false;
server.sendData("KICK " + this.parent.encodedName + " " + this.nick + " :" +
fromUnicode(reason, this) + "\n");
@ -2413,9 +2395,6 @@ function cusr_setban (f)
var server = this.parent.parent;
var me = server.me;
if (!this.parent.users[me.nick].isOp)
return false;
if (!this.host)
return false;
@ -2432,9 +2411,6 @@ function cusr_kban (reason)
var server = this.parent.parent;
var me = server.me;
if (!this.parent.users[me.nick].isOp)
return false;
if (!this.host)
return false;

View File

@ -37,7 +37,16 @@ const PREF_RELOAD = true;
const PREF_WRITETHROUGH = true;
const PREF_CHARSET = "utf-8"; // string prefs stored in this charset
function PrefManager (branchName)
function PrefRecord (name, defaultValue, label, help)
{
this.name = name;
this.defaultValue = defaultValue;
this.help = help;
this.label = label ? label : name;
this.realValue = null;
}
function PrefManager (branchName, defaultBundle)
{
var prefManager = this;
@ -69,6 +78,8 @@ function PrefManager (branchName)
this.prefBranchInternal =
this.prefBranch.QueryInterface(nsIPrefBranchInternal);
this.prefBranchInternal.addObserver("", this.observer, false);
this.defaultBundle = defaultBundle;
this.valid = true;
}
@ -301,7 +312,12 @@ function pm_setpref(prefName, value)
if (!ASSERT(record, "Unknown pref: " + prefName))
return null;
if ((record.realValue == null && value == record.defaultValue) ||
var defaultValue = record.defaultValue;
if (typeof defaultValue == "function")
defaultValue = defaultValue(prefName);
if ((record.realValue == null && value == defaultValue) ||
record.realValue == value)
{
// no realvalue, and value is the same as default value ... OR ...
@ -309,17 +325,12 @@ function pm_setpref(prefName, value)
return record.realValue;
}
if (value == record.defaultValue)
if (value == defaultValue)
{
this.clearPref(prefName);
return value;
}
var defaultValue = record.defaultValue;
if (typeof defaultValue == "function")
defaultValue = defaultValue(prefName);
if (typeof defaultValue == "boolean")
{
this.prefBranch.setBoolPref(prefName, value);
@ -355,9 +366,11 @@ function pm_reset(prefName)
}
PrefManager.prototype.addPref =
function pm_addpref(prefName, defaultValue, setter)
function pm_addpref(prefName, defaultValue, setter, bundle)
{
var prefManager = this;
if (!bundle)
bundle = this.defaultBundle;
function updateArrayPref() { prefManager.updateArrayPref(prefName); };
function prefGetter() { return prefManager.getPref(prefName); };
@ -375,7 +388,12 @@ function pm_addpref(prefName, defaultValue, setter)
if (defaultValue instanceof Array)
defaultValue.update = updateArrayPref;
this.prefRecords[prefName] = {defaultValue: defaultValue, realValue: null};
var label = getMsgFrom(bundle, "pref." + prefName + ".label", null, name);
var help = getMsgFrom(bundle, "pref." + prefName + ".help", null,
MSG_NO_HELP);
this.prefRecords[prefName] = new PrefRecord (prefName, defaultValue,
label, help);
this.prefNames.push(prefName);
this.prefNames.sort();

View File

@ -897,7 +897,7 @@ function prompt(msg, initial, parent, title)
if (!ps.prompt (parent, title, msg, rv, null, {value: null}))
return null;
return rv.value
return rv.value;
}
function promptPassword(msg, initial, parent, title)
@ -914,5 +914,5 @@ function promptPassword(msg, initial, parent, title)
if (!ps.promptPassword (parent, title, msg, rv, null, {value: null}))
return null;
return rv.value
return rv.value;
}

View File

@ -31,6 +31,7 @@
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
<?xul-overlay href="chrome://chatzilla/content/scripts.xul"?>
<?xul-overlay href="chrome://chatzilla/content/popups.xul"?>
<?xul-overlay href="chrome://chatzilla/content/menus.xul"?>
<window id="chatzilla-window"
@ -41,6 +42,7 @@
persist="width height screenX screenY sizemode" windowtype="irc:chatzilla">
<overlaytarget id="scripts-overlay-target"/>
<overlaytarget id="popup-overlay-target"/>
<overlaytarget id="menu-overlay-target"/>
<vbox id="outer-box" flex="1">
@ -122,7 +124,8 @@
<text id="server-nick" value=""/>
<hbox id="multiline-box" flex="1" collapsed="true">
<textbox id="multiline-input" multiline="true" flex="1" height="100px"
class="multiline-input-widget" onfocus="onInputFocus();"/>
class="multiline-input-widget" onfocus="onInputFocus();"
onkeypress="onInputKeypress(this)"/>
<vbox>
<toolbarbutton id="button-input" flex="1"
oncommand="onMultilineSend(event);"
@ -134,7 +137,7 @@
</hbox>
<hbox id="singleline-box" flex="1" collapsed="true">
<textbox id="input" class="input-widget" flex="1" autostretch="true"
onfocus="onInputFocus();"/>
onfocus="onInputFocus();" onkeypress="onInputKeypress(this)"/>
<toolbarbutton id="button-multiline-expand"
oncommand="dispatch('pref multiline true');"
tooltiptext="&multiline-expand.tooltip;"/>

View File

@ -53,6 +53,9 @@ function initCommands()
["channel-charset", cmdCharset, CMD_NEED_CHAN | CMD_CONSOLE],
["channel-motif", cmdMotif, CMD_NEED_CHAN | CMD_CONSOLE],
["channel-pref", cmdPref, CMD_NEED_CHAN | CMD_CONSOLE],
["cmd-copy", cmdCopy, 0],
["cmd-copy-link-url", cmdCopyLinkURL, 0],
["cmd-selectall", cmdSelectAll, 0],
["op", cmdChanUserMode, CMD_NEED_CHAN | CMD_CONSOLE],
["deop", cmdChanUserMode, CMD_NEED_CHAN | CMD_CONSOLE],
["hop", cmdChanUserMode, CMD_NEED_CHAN | CMD_CONSOLE],
@ -112,8 +115,11 @@ function initCommands()
["sync-headers", cmdSync, 0],
["sync-logs", cmdSync, 0],
["sync-motifs", cmdSync, 0],
["sync-timestamps", cmdSync, 0],
["sync-windows", cmdSync, 0],
["testdisplay", cmdTestDisplay, CMD_CONSOLE],
["timestamps", cmdTimestamps, CMD_CONSOLE],
["timestamp-format", cmdTimestampFormat, CMD_CONSOLE],
["toggle-ui", cmdToggleUI, CMD_CONSOLE],
["toggle-pref", cmdTogglePref, 0],
["topic", cmdTopic, CMD_NEED_CHAN | CMD_CONSOLE],
@ -140,6 +146,7 @@ function initCommands()
["toggle-copy", "toggle-pref copyMessages", 0],
["toggle-usort", "toggle-pref sortUsersByMode", 0],
["toggle-umode", "toggle-pref showModeSymbols", 0],
["toggle-timestamps","timestamps toggle", 0],
["motif-dark", "motif dark", 0],
["motif-light", "motif light", 0],
["motif-default", "motif default", 0],
@ -642,6 +649,14 @@ function cmdSync(e)
};
break;
case "sync-timestamps":
fun = function ()
{
view.changeCSS(view.getTimestampCSS("data"),
"cz-timestamp-format");
};
break;
case "sync-windows":
fun = function ()
{
@ -1025,11 +1040,14 @@ function cmdHideView(e)
{
client.deck.removeChild(e.view.frame);
delete e.view.frame;
if (i >= client.viewsArray.length)
i = client.viewsArray.length - 1;
client.currentObject = null;
setCurrentObject (client.viewsArray[i].source);
if (client.currentObject == e.view)
{
if (i >= client.viewsArray.length)
i = client.viewsArray.length - 1;
client.currentObject = null;
setCurrentObject (client.viewsArray[i].source);
}
}
}
}
@ -1049,12 +1067,10 @@ function cmdClearView(e)
function cmdNames(e)
{
var name;
if (e.channelName)
{
var encodedName = fromUnicode(e.channelName, e.network);
name = encodedName;
e.channel = new CIRCChannel (e.server, encodedName, e.channelName);
}
else
{
@ -1063,12 +1079,10 @@ function cmdNames(e)
display(getMsg(MSG_ERR_REQUIRED_PARAM, "channel-name"), MT_ERROR);
return;
}
name = e.channel.encodedName;
}
e.channel.pendingNamesReply = true;
e.server.sendData ("NAMES " + name + "\n");
e.server.sendData ("NAMES " + e.channel.encodedName + "\n");
}
function cmdTogglePref (e)
@ -1423,6 +1437,22 @@ function cmdJoin(e)
return null;
}
if (e.channelName && (e.channelName.search(",") != -1))
{
// We can join multiple channels! Woo!
var chan;
var chans = e.channelName.split(",");
var keys = [];
if (e.key)
keys = e.key.split(",");
for (var c in chans)
{
chan = dispatch("join", { charset: e.charset,
channelName: chans[c],
key: keys.shift() });
}
return chan;
}
if (!e.channelName)
{
var channel = e.channel;
@ -1447,14 +1477,19 @@ function cmdJoin(e)
e.channel.join(e.key);
if (!("messages" in e.channel))
/* !-channels are "safe" channels, and get a server-generated prefix. For
* this reason, we shouldn't do anything client-side until the server
* replies (since the reply will have the appropriate prefix). */
if (e.channelName[0] != "!")
{
e.channel.displayHere(getMsg(MSG_CHANNEL_OPENED, e.channel.unicodeName),
MT_INFO);
}
if (!("messages" in e.channel))
{
e.channel.displayHere(getMsg(MSG_CHANNEL_OPENED,
e.channel.unicodeName), MT_INFO);
}
if (!e.isInteractive || client.prefs["focusChannelOnJoin"])
setCurrentObject(e.channel);
}
return e.channel;
}
@ -1490,14 +1525,25 @@ function cmdLeave(e)
e.channelName = e.channel.encodedName;
}
if (e.channel && e.noDelete)
e.channel.noDelete = true;
/* If it's not active, we're not actually in it, even though the view is
* still here.
*/
if (e.channel && e.channel.active)
{
if (e.noDelete)
e.channel.noDelete = true;
if (!e.reason)
e.reason = "";
e.server.sendData("PART " + e.channelName + " :" +
fromUnicode(e.reason, e.channel) + "\n");
if (!e.reason)
e.reason = "";
e.server.sendData("PART " + e.channelName + " :" +
fromUnicode(e.reason, e.channel) + "\n");
}
else
{
if (!e.noDelete && client.prefs["deleteOnPart"])
e.channel.dispatch("delete");
}
}
function cmdLoad (e)
@ -1898,7 +1944,7 @@ function cmdNotify(e)
if (!e.nickname)
{
if ("notifyList" in net && net.notifyList.length > 0)
if (net.prefs["notifyList"].length > 0)
{
/* delete the lists and force a ISON check, this will
* print the current online/offline status when the server
@ -1917,23 +1963,22 @@ function cmdNotify(e)
var adds = new Array();
var subs = new Array();
if (!("notifyList" in net))
net.notifyList = new Array();
for (var i in e.nicknameList)
{
var nickname = e.nicknameList[i];
var idx = arrayIndexOf (net.notifyList, nickname);
var nickname = e.nicknameList[i].toLowerCase();
var idx = arrayIndexOf (net.prefs["notifyList"], nickname);
if (idx == -1)
{
net.notifyList.push (nickname);
net.prefs["notifyList"].push (nickname);
adds.push(nickname);
}
else
{
arrayRemoveAt (net.notifyList, idx);
arrayRemoveAt (net.prefs["notifyList"], idx);
subs.push(nickname);
}
}
net.prefs["notifyList"].update();
var msgname;
@ -2099,3 +2144,49 @@ function cmdSupports(e)
display(getMsg(MSG_SUPPORTS_FLAGSOFF, listB2.join(MSG_COMMASP)));
display(getMsg(MSG_SUPPORTS_MISCOPTIONS, listN.join(MSG_COMMASP)));
}
function cmdCopy(e)
{
doCommand("cmd_copy");
}
function cmdSelectAll(e)
{
doCommand("cmd_selectAll");
}
function cmdCopyLinkURL(e)
{
doCommand("cmd_copyLink");
}
function cmdTimestamps(e)
{
var view = e.sourceObject;
if (e.toggle != null)
{
e.toggle = getToggle(e.toggle, view.prefs["timestamps"])
view.prefs["timestamps"] = e.toggle;
}
else
{
display(getMsg(MSG_FMT_PREF, ["timestamps",
view.prefs["timestamps"]]));
}
}
function cmdTimestampFormat(e)
{
var view = e.sourceObject;
if (e.format != null)
{
view.prefs["timestampFormat"] = e.format;
}
else
{
display(getMsg(MSG_FMT_PREF, ["timestampFormat",
view.prefs["timestampFormat"]]));
}
}

View File

@ -15,6 +15,7 @@
chrome:description="A simple, straightforward Internet Relay Chat (IRC) client."
chrome:localeVersion="@MOZILLA_LOCALE_VERSION@"
chrome:extension="true"
chrome:settingsURL=""
chrome:name="chatzilla">
</RDF:Description>

View File

@ -489,19 +489,15 @@ function onInputCompleteLine(e)
if (e.line[0] == client.COMMAND_CHAR)
{
if (client.prefs["outgoing.colorCodes"])
e.line = replaceColorCodes(e.line);
dispatch(e.line.substr(1), null, true);
}
else /* plain text */
{
/* color codes */
if (client.prefs["outgoing.colorCodes"])
{
e.line = e.line.replace(/%U/g, "\x1f");
e.line = e.line.replace(/%B/g, "\x02");
e.line = e.line.replace(/%O/g, "\x0f");
e.line = e.line.replace(/%C/g, "\x03");
e.line = e.line.replace(/%R/g, "\x16");
}
e.line = replaceColorCodes(e.line);
client.sayToCurrentTarget (e.line);
}
}
@ -512,10 +508,9 @@ function onNotifyTimeout ()
{
var net = client.networks[n];
if (net.isConnected()) {
if ("notifyList" in net && net.notifyList.length > 0) {
net.primServ.sendData ("ISON " +
client.networks[n].notifyList.join(" ")
+ "\n");
if (net.prefs["notifyList"].length > 0) {
var isonList = client.networks[n].prefs["notifyList"];
net.primServ.sendData ("ISON " + isonList.join(" ") + "\n");
} else {
/* if the notify list is empty, just send a ping to see if we're
* alive. */
@ -525,6 +520,48 @@ function onNotifyTimeout ()
}
}
function onInputKeypress (el)
{
if (client.prefs["outgoing.colorCodes"])
setTimeout(onInputKeypressCallback, 100, el);
}
function onInputKeypressCallback (el)
{
function doPopup(popup)
{
if (client.inputPopup && client.inputPopup != popup)
client.inputPopup.hidePopup();
client.inputPopup = popup;
if (popup)
{
var box = el.boxObject;
if (!box)
box = el.ownerDocument.getBoxObjectFor(el);
if (el.nodeName == "textbox")
pos = { x: box.screenX,
y: box.screenY - box.height - popup.boxObject.height };
else
pos = { x: box.screenX + 5,
y: box.screenY + box.height + 25 };
popup.moveTo(pos.x, pos.y);
popup.showPopup(el, 0, 0, "tooltip");
}
}
var text = " " + el.value.substr(0, el.selectionStart);
if (el.selectionStart != el.selectionEnd)
text = "";
if (text.match(/[^%]%C[0-9]{0,2},?[0-9]{0,2}$/))
doPopup(document.getElementById("colorTooltip"));
else if (text.match(/[^%]%$/))
doPopup(document.getElementById("percentTooltip"));
else
doPopup(null);
}
/* 'private' function, should only be used from inside */
CIRCChannel.prototype._addUserToGraph =
function my_addtograph (user)
@ -604,6 +641,8 @@ function my_showtonet (e)
break;
case "001":
// Welcome to history.
client.globalHistory.addPage(this.getURL());
updateTitle(this);
this.updateHeader();
client.updateHeader();
@ -613,15 +652,13 @@ function my_showtonet (e)
for (var i = 0; i < cmdary.length; ++i)
this.dispatch(cmdary[i])
for (var v in client.viewsArray)
if (("lastServer" in this) && this.lastServer)
{
// reconnect to any existing views
var source = client.viewsArray[v].source;
var details = getObjectDetails(client.viewsArray[v].source);
if (source.TYPE != "IRCUser" &&
"network" in details && details.network == this)
for (var c in this.lastServer.channels)
{
gotoIRCURL(source.getURL());
var chan = this.lastServer.channels[c];
if (chan.joined)
chan.join(chan.mode.key);
}
}
@ -677,7 +714,7 @@ function my_notice (e)
CIRCNetwork.prototype.on303 = /* ISON (aka notify) reply */
function my_303 (e)
{
var onList = stringTrim(e.params[1].toLowerCase()).split(/\s+/);
var onList = stringTrim(e.params[2].toLowerCase()).split(/\s+/);
var offList = new Array();
var newArrivals = new Array();
var newDepartures = new Array();
@ -688,10 +725,12 @@ function my_303 (e)
if ("network" in o && o.network == this && client.currentObject != this)
displayTab = client.currentObject;
for (i in this.notifyList)
if (!arrayContains(onList, this.notifyList[i]))
for (i = 0; i < this.prefs["notifyList"].length; i++)
{
if (!arrayContains(onList, this.prefs["notifyList"][i]))
/* user is not on */
offList.push (this.notifyList[i]);
offList.push (this.prefs["notifyList"][i]);
}
if ("onList" in this)
{
@ -958,6 +997,13 @@ function my_whoisreply (e)
e.server.parent.display(text, e.code);
}
CIRCNetwork.prototype.on330 = /* ircu's 330 numeric ("X is logged in as Y") */
function my_330 (e)
{
this.display (getMsg(MSG_FMT_LOGGED_ON, [e.params[2], e.params[3]]),
"330");
}
CIRCNetwork.prototype.on341 = /* invite reply */
function my_341 (e)
{
@ -1054,7 +1100,8 @@ function my_netdisconnect (e)
default:
msg = getMsg(MSG_CLOSE_STATUS,
[this.getURL(), e.server.getURL(), e.disconnectStatus]);
[this.getURL(), e.server.getURL(),
e.disconnectStatus]);
reconnect = true;
break;
}
@ -1084,6 +1131,13 @@ function my_netdisconnect (e)
channel.active = false;
}
if (!this.connecting)
{
/* Make a note of the server we were on, so that the reconnect will
* be able to find out what we were joined. */
this.lastServer = this.primServ;
}
this.connecting = false;
dispatch("sync-headers");
updateTitle();
@ -1143,6 +1197,7 @@ CIRCChannel.prototype.onInit =
function chan_oninit ()
{
this.logFile = null;
this.pendingNamesReply = false;
}
CIRCChannel.prototype.onPrivmsg =
@ -1208,11 +1263,12 @@ function my_366 (e)
/* redisplay the tree */
client.rdf.setTreeRoot("user-list", this.getGraphResource());
if ("pendingNamesReply" in client.currentObject)
if (this.pendingNamesReply)
{
display (e.channel.unicodeName + ": " + e.params[3], "366");
client.currentObject.pendingNamesReply = false;
this.parent.parent.display (e.channel.unicodeName + ": " +
e.params[3], "366");
}
this.pendingNamesReply = false;
}
CIRCChannel.prototype.onTopic = /* user changed topic */
@ -1253,8 +1309,11 @@ function my_topicinfo (e)
CIRCChannel.prototype.on353 = /* names reply */
function my_topic (e)
{
if ("pendingNamesReply" in client.currentObject)
display (e.channel.unicodeName + ": " + e.params[4], "NAMES");
if (this.pendingNamesReply)
{
this.parent.parent.display (e.channel.unicodeName + ": " +
e.params[4], "NAMES");
}
}
@ -1288,6 +1347,13 @@ function my_cjoin (e)
{
this.display (getMsg(MSG_YOU_JOINED, e.channel.unicodeName), "JOIN",
e.server.me, this);
client.globalHistory.addPage(this.getURL());
/* !-channels are "safe" channels, and get a server-generated prefix.
* For this reason, creating the channel is delayed until this point.
*/
if (e.channel.unicodeName[0] == "!")
setCurrentObject(e.channel);
}
else
{
@ -1299,7 +1365,7 @@ function my_cjoin (e)
this._addUserToGraph (e.user);
updateUserList()
e.channel.updateHeader();
this.updateHeader();
}
CIRCChannel.prototype.onPart =
@ -1344,7 +1410,7 @@ function my_cpart (e)
}
}
e.channel.updateHeader();
this.updateHeader();
}
CIRCChannel.prototype.onKick =
@ -1356,6 +1422,10 @@ function my_ckick (e)
[e.channel.unicodeName, e.user.properNick,
e.reason]),
"KICK", e.user, this);
/* Try 1 re-join attempt if allowed. */
if (this.prefs["autoRejoin"])
this.join(this.mode.key);
}
else
{
@ -1378,7 +1448,7 @@ function my_ckick (e)
this._removeUserFromGraph(e.lamer);
e.channel.updateHeader();
this.updateHeader();
}
CIRCChannel.prototype.onChanMode =
@ -1394,8 +1464,8 @@ function my_cmode (e)
for (var u in e.usersAffected)
e.usersAffected[u].updateGraphResource();
e.channel.updateHeader();
updateTitle(e.channel);
this.updateHeader();
updateTitle(this);
if (client.currentObject == this)
updateUserList();
}
@ -1441,7 +1511,7 @@ function my_cquit (e)
this._removeUserFromGraph(e.user);
e.channel.updateHeader();
this.updateHeader();
}
CIRCUser.prototype.onInit =

View File

@ -129,7 +129,10 @@ function initMenus()
checkedif: "client.prefs['collapseMsgs']"}],
["toggle-copy",
{type: "checkbox",
checkedif: "client.prefs['copyMessages']"}]
checkedif: "client.prefs['copyMessages']"}],
["toggle-timestamps",
{type: "checkbox",
checkedif: "cx.sourceObject.prefs['timestamps']"}]
]
};
@ -163,18 +166,20 @@ function initMenus()
]
};
var isopish = "(cx.channel.iAmOp() || cx.channel.iAmHalfOp())";
client.menuSpecs["popup:opcommands"] = {
label: MSG_MNU_OPCOMMANDS,
items:
[
["op", {enabledif: "cx.channel.iAmOp() && !cx.user.isOp"}],
["deop", {enabledif: "cx.channel.iAmOp() && cx.user.isOp"}],
["voice", {enabledif: "cx.channel.iAmOp() && !cx.user.isVoice"}],
["devoice", {enabledif: "cx.channel.iAmOp() && cx.user.isVoice"}],
["op", {enabledif: isopish + " && !cx.user.isOp"}],
["deop", {enabledif: isopish + " && cx.user.isOp"}],
["voice", {enabledif: isopish + " && !cx.user.isVoice"}],
["devoice", {enabledif: isopish + " && cx.user.isVoice"}],
["-"],
["kick", {enabledif: "cx.channel.iAmOp()"}],
["kick-ban", {enabledif: "cx.channel.iAmOp()"}]
["kick", {enabledif: isopish}],
["kick-ban", {enabledif: isopish}]
]
};
@ -195,15 +200,20 @@ function initMenus()
]
};
var urlenabled = "has('url') && cx.url.search(/^irc:/i) == -1";
var urlenabled = "has('url')";
var urlexternal = "has('url') && cx.url.search(/^irc:/i) == -1";
var textselected = "getCommandEnabled('cmd_copy')";
client.menuSpecs["context:messages"] = {
getContext: getMessagesContext,
items:
[
["goto-url", {enabledif: urlenabled}],
["goto-url-newwin", {enabledif: urlenabled}],
["goto-url-newtab", {enabledif: urlenabled}],
["goto-url", {visibleif: urlenabled}],
["goto-url-newwin", {visibleif: urlexternal}],
["goto-url-newtab", {visibleif: urlexternal}],
["cmd-copy-link-url", {visibleif: urlenabled}],
["cmd-copy", {visibleif: "!" + urlenabled, enabledif: textselected }],
["cmd-selectall", {visibleif: "!" + urlenabled }],
["-"],
["leave",
{enabledif: "cx.TYPE == 'IRCChannel'"}],

View File

@ -83,6 +83,10 @@
* + .msg is used as the class for the surrounding <TR>. This means that
* any styles applied here will affect the entire message.
*
* + .msg-timestamp is used as the class for the <TD> that has all the time
* information on it. Styles on this class will affect the time stamps
* against messages (but not the format of the time).
*
* + .msg-type is used as the class for the <TD> surrounding the message type
* portion of messages. Styles applied here will only affect message
* types. ie. "-->|", or "[HELP]".
@ -397,6 +401,12 @@ a.chatzilla-link:hover {
font-size: 10pt;
}
.msg-timestamp { /* .msg-timestamp = timestamp for */
font-style: normal !important; /* the message, done using */
vertical-align: top; /* :before and content. */
white-space: nowrap;
}
.msg-type { /* .msg-type = message type */
font-variant: small-caps; /* indicator */
font-size: 9pt;

View File

@ -145,26 +145,31 @@ function onTopicKeypress(e)
switch (e.keyCode)
{
case 13: /* enter */
view.setTopic(header["topicinput"].value);
var topic = header["topicinput"].value;
topic = mainWindow.replaceColorCodes(topic);
view.setTopic(topic);
view.dispatch("focus-input");
break;
case 27: /* esc */
view.dispatch("focus-input");
break;
default:
client.mainWindow.onInputKeypress(header["topicinput"]);
}
}
function startTopicEdit()
{
var me = view.getUser(view.parent.me.nick);
if (!me || (!view.mode.publicTopic && !me.isOp) ||
if (!me || (!view.mode.publicTopic && !me.isOp && !me.isHalfOp) ||
!header["topicinput"].hasAttribute("hidden"))
{
return;
}
header["topicinput"].value = view.topic;
header["topicinput"].value = mainWindow.decodeColorCodes(view.topic);
header["topicnodes"].setAttribute("hidden", "true")
header["topicinput"].removeAttribute("hidden");

View File

@ -38,136 +38,117 @@
<!DOCTYPE overlay SYSTEM "chrome://chatzilla/locale/chatzilla.dtd" >
<?xml-stylesheet href="chrome://chatzilla/content/output-base.css" type="text/css"?>
<overlay id="chatzilla-popup-overlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<overlaytarget id="popup-overlay-target">
<commandset id="chatzillaPopupCommands">
<!-- Context menu commands -->
<command id="cmd_leaveview" oncommand="dispatch('part');"/>
<command id="cmd_clearview" oncommand="dispatch('clear-view');"/>
<command id="cmd_deleteview" oncommand="dispatch('delete-view');"/>
<command id="cmd_status" oncommand="dispatch('status')"/>
<command id="cmd_popup_query"
oncommand="onPopupSimulateCommand('/query $nick');"/>
<command id="cmd_popup_whois"
oncommand="onPopupSimulateCommand('/whois $nick');"/>
<command id="cmd_popup_ping"
oncommand="onPopupSimulateCommand('/ctcp $nick PING');"/>
<command id="cmd_popup_version"
oncommand="onPopupSimulateCommand('/ctcp $nick VERSION');"/>
<command id="cmd_popup_highlight"
oncommand="onPopupHighlight(true);"/>
<command id="cmd_popup_nohighlight"
oncommand="onPopupHighlight(false);"/>
<command id="cmd_popup_giveop"
oncommand="onPopupSimulateCommand('/op $nick');"/>
<command id="cmd_popup_takeop"
oncommand="onPopupSimulateCommand('/deop $nick');"/>
<command id="cmd_popup_givevoice"
oncommand="onPopupSimulateCommand('/voice $nick');"/>
<command id="cmd_popup_takevoice"
oncommand="onPopupSimulateCommand('/devoice $nick');"/>
<command id="cmd_popup_kick"
oncommand="onPopupSimulateCommand('/kick $nick');"/>
</commandset>
<tooltip id="percentTooltip">
<grid>
<columns>
<column />
<column />
</columns>
<rows>
<row>
<label value="%U"/>
<label value="&Underline.label;"/>
</row>
<row>
<label value="%B"/>
<label value="&Bold.label;"/>
</row>
<row>
<label value="%R"/>
<label value="&Reverse.label;"/>
</row>
<row>
<label value="%O"/>
<label value="&Normal.label;"/>
</row>
<row>
<label value="%C"/>
<label value="&Color.label;"/>
</row>
<row>
<label value="%%C"/>
<label value="%C"/>
</row>
</rows>
</grid>
</tooltip>
<tooltip id="colorTooltip" orient="vertical">
<label value="%Cxx[,yy] &ForeBack.label;"/>
<grid>
<columns>
<column />
<column />
<column />
<column />
<column />
<column />
<column />
<column />
</columns>
<rows>
<row>
<box class="colorGrid chatzilla-bg00 chatzilla-fg01">
<label value="0"/>
</box>
<box class="colorGrid chatzilla-bg01 chatzilla-fg00">
<label value="1"/>
</box>
<box class="colorGrid chatzilla-bg02 chatzilla-fg01">
<label value="2"/>
</box>
<box class="colorGrid chatzilla-bg03 chatzilla-fg01">
<label value="3"/>
</box>
<box class="colorGrid chatzilla-bg04 chatzilla-fg01">
<label value="4"/>
</box>
<box class="colorGrid chatzilla-bg05 chatzilla-fg00">
<label value="5"/>
</box>
<box class="colorGrid chatzilla-bg06 chatzilla-fg00">
<label value="6"/>
</box>
<box class="colorGrid chatzilla-bg07 chatzilla-fg00">
<label value="7"/>
</box>
</row>
<row>
<box class="colorGrid chatzilla-bg08 chatzilla-fg00">
<label value="8"/>
</box>
<box class="colorGrid chatzilla-bg09 chatzilla-fg00">
<label value="9"/>
</box>
<box class="colorGrid chatzilla-bg10 chatzilla-fg00">
<label value="10"/>
</box>
<box class="colorGrid chatzilla-bg11 chatzilla-fg00">
<label value="11"/>
</box>
<box class="colorGrid chatzilla-bg12 chatzilla-fg01">
<label value="12"/>
</box>
<box class="colorGrid chatzilla-bg13 chatzilla-fg01">
<label value="13"/>
</box>
<box class="colorGrid chatzilla-bg14 chatzilla-fg01">
<label value="14"/>
</box>
<box class="colorGrid chatzilla-bg15 chatzilla-fg01">
<label value="15"/>
</box>
</row>
</rows>
</grid>
</tooltip>
<!-- html tooltips -->
<tooltip id="aHTMLTooltip"
onpopupshowing="return fillInTooltip(document.tooltipNode,'aHTMLTooltip');"/>
<!--
tab tooltips, always show above the tab, so we don't draw over the input box
-->
<tooltip id="tabTT" position="end_after"
onpopupshowing="return fillInTooltip(document.tooltipNode,'tabTT');"/>
<popupset id="contextMenus">
<popup id="userlistPopup" oncommand="onUserListPopupClick(event)">
<menuitem label="&op.value;" accesskey="&op.accesskey;" code="/op" />
<menuitem label="&deop.value;" accesskey="&deop.accesskey;"
code="/deop" />
<menuitem label="&voice.value;" accesskey="&voice.accesskey;"
code="/voice" />
<menuitem label="&devoice.value;" accesskey="&devoice.accesskey;"
code="/devoice" />
<menuitem label="&kick.value;" accesskey="&kick.accesskey;"
code="/kick" />
<menuitem label="&whois.value;" accesskey="&whois.accesskey;"
code="/whois" />
</popup>
<popup id="outputContext"
onpopupshowing="if (event.originalTarget == this) return onOutputContextMenuCreate(event); else return true;"
onpopuphiding="if (event.originalTarget == this) delete client._popupContext;">
<menuitem format="&PopupQueryCmd.label;" accesskey="&PopupQueryCmd.aKey;"
observes="cmd_popup_query"
visibleif="targetUser"/>
<menuitem format="&PopupWhoisCmd.label;" accesskey="&PopupWhoisCmd.aKey;"
observes="cmd_popup_whois"
visibleif="targetUser"/>
<menuitem format="&PopupPingCmd.label;" accesskey="&PopupPingCmd.aKey;"
observes="cmd_popup_ping"
visibleif="targetUser"/>
<menuitem format="&PopupVersionCmd.label;"
accesskey="&PopupVersionCmd.aKey;"
observes="cmd_popup_version"
visibleif="targetUser"/>
<!--
<menu format="&PopupHighlightStyle.label;"
accesskey="&PopupHighlightStyle.aKey;"
visibleif="targetUser">
<menupopup id="highlightMenu">
<menuitem/>
</menupopup>
</menu>
-->
<menuseparator
visibleif="targetUser"/>
<menuitem label="&PopupGiveOp.label;" accesskey="&PopupGiveOp.aKey;"
observes="cmd_popup_giveop"
visibleif="iAmOp == 'yes' and targetIsOp == 'no'"/>
<menuitem label="&PopupTakeOp.label;" accesskey="&PopupTakeOp.aKey;"
observes="cmd_popup_takeop"
visibleif="iAmOp == 'yes' and targetIsOp == 'yes'"/>
<menuitem label="&PopupGiveVoice.label;"
accesskey="&PopupGiveVoice.aKey;"
observes="cmd_popup_givevoice"
visibleif="iAmOp == 'yes' and targetIsVoice == 'no'"/>
<menuitem label="&PopupTakeVoice.label;"
accesskey="&PopupTakeVoice.aKey;"
observes="cmd_popup_takevoice"
visibleif="iAmOp == 'yes' and targetIsVoice == 'yes'"/>
<menuitem format="&PopupKick.label;" accesskey="&PopupKick.aKey;"
observes="cmd_popup_kick"
visibleif="iAmOp == 'yes' and targetUser != 'undefined'"/>
<menuseparator
visibleif="targetUser != 'undefined' and iAmOp == 'yes'"/>
<menuitem label="&StartupVisitCmd.label;" type="checkbox"
accesskey="&StartupVisitCmd.aKey;" observes="cmd_toggle_startup_visit"
checkedif="isStartupURL(client.currentObject.getURL())"/>
<menuitem format="&LeaveViewCmd.label;" accesskey="&LeaveViewCmd.aKey;"
observes="cmd_leaveview" key="key_deleteview"
visibleif="client.currentObject.TYPE == 'IRCChannel'"/>
<menuitem label="&DeleteViewCmd.label;" accesskey="&DeleteViewCmd.aKey;"
observes="cmd_deleteview" key="key_deleteview"
visibleif="client.currentObject.TYPE != 'IRCChannel'"/>
<menuitem label="&ClearViewCmd.label;" accesskey="&ClearViewCmd.aKey;"
observes="cmd_clearview" key="key_clearview"/>
<menuseparator/>
<menuitem label="&StatusCmd.label;" accesskey="&StatusCmd.aKey;"
observes="cmd_status"/>
</popup>
</popupset>
</overlaytarget>
</overlay>

View File

@ -37,7 +37,8 @@ const DEFAULT_NICK = "IRCMonkey"
function initPrefs()
{
client.prefManager = new PrefManager("extensions.irc.");
client.prefManager = new PrefManager("extensions.irc.",
client.defaultBundle);
client.prefManagers = [client.prefManager];
client.prefs = client.prefManager.prefs;
@ -71,7 +72,9 @@ function initPrefs()
var prefs =
[
["activityFlashDelay", 200],
["aliases", []],
["autoRejoin", false],
["bugURL", "http://bugzilla.mozilla.org/show_bug.cgi?id=%s"],
["channelHeader", true],
["channelLog", false],
@ -79,13 +82,13 @@ function initPrefs()
["charset", "utf-8"],
["clientMaxLines", 200],
["collapseMsgs", false],
["connectTries", 5],
["copyMessages", true],
["debugMode", ""],
["desc", "New Now Know How"],
["deleteOnPart", true],
["displayHeader", true],
["guessCommands", true],
["focusChannelOnJoin", true],
["initialURLs", []],
["initialScripts", [getURLSpecFromFile(scriptPath.path)]],
["log", false],
@ -99,7 +102,20 @@ function initPrefs()
["motif.current", "chrome://chatzilla/skin/output-default.css"],
["msgBeep", "beep beep"],
["multiline", false],
["munger.bold", true],
["munger.bugzilla-link", true],
["munger.channel-link",true],
["munger.colorCodes", true],
["munger.ctrl-char", true],
["munger.ear", false],
["munger.face", true],
["munger.italic", true],
["munger.link", true],
["munger.mailto", true],
["munger.quote", true],
["munger.rheet", true],
["munger.underline", true],
["munger.word-hyphenator", true],
["networkHeader", true],
["networkLog", false],
["networkMaxLines", 200],
@ -111,12 +127,13 @@ function initPrefs()
["outputWindowURL", "chrome://chatzilla/content/output-window.html"],
["sortUsersByMode", true],
["queryBeep", "beep"],
["raiseNewTab", false],
["reconnect", true],
["showModeSymbols", false],
["stalkBeep", "beep"],
["stalkWholeWords", true],
["stalkWords", []],
["timestamps", false],
["timestampFormat", "[%h:%n]"],
["username", "chatzilla"],
["usermode", "+i"],
["userHeader", true],
@ -128,6 +145,7 @@ function initPrefs()
client.prefManager.onPrefChanged = onPrefChanged;
CIRCNetwork.prototype.stayingPower = client.prefs["reconnect"];
CIRCNetwork.prototype.MAX_CONNECT_ATTEMPTS = client.prefs["connectTries"];
CIRCNetwork.prototype.INITIAL_NICK = client.prefs["nickname"];
CIRCNetwork.prototype.INITIAL_NAME = client.prefs["username"];
CIRCNetwork.prototype.INITIAL_DESC = client.prefs["desc"];
@ -164,16 +182,21 @@ function getNetworkPrefManager(network)
var prefs =
[
["autoRejoin", defer],
["charset", defer],
["collapseMsgs", defer],
["connectTries", defer],
["desc", defer],
["displayHeader", client.prefs["networkHeader"]],
["log", client.prefs["networkLog"]],
["logFileName", logDefault.path],
["motif.current", defer],
["nickname", defer],
["notifyList", []],
["outputWindowURL", defer],
["reconnect", defer],
["timestamps", defer],
["timestampFormat", defer],
["username", defer],
["usermode", defer],
["autoperform", []]
@ -181,7 +204,7 @@ function getNetworkPrefManager(network)
var branch = "extensions.irc.networks." + pref_mungeName(network.name) +
".";
var prefManager = new PrefManager(branch);
var prefManager = new PrefManager(branch, client.defaultBundle);
prefManager.addPrefs(prefs);
prefManager.onPrefChanged = onPrefChanged;
@ -202,6 +225,7 @@ function getNetworkPrefManager(network)
network.INITIAL_UMODE = value;
network.stayingPower = prefManager.prefs["reconnect"];
network.MAX_CONNECT_ATTEMPTS = prefManager.prefs["connectTries"];
client.prefManagers.push(prefManager);
@ -230,18 +254,21 @@ function getChannelPrefManager(channel)
var prefs =
[
["autoRejoin", defer],
["charset", defer],
["collapseMsgs", defer],
["displayHeader", client.prefs["channelHeader"]],
["log", client.prefs["channelLog"]],
["logFileName", logDefault.path],
["motif.current", defer],
["timestamps", defer],
["timestampFormat", defer],
["outputWindowURL", defer]
];
var branch = "extensions.irc.networks." + pref_mungeName(network.name) +
".channels." + pref_mungeName(channel.normalizedName) + "."
var prefManager = new PrefManager(branch);
var prefManager = new PrefManager(branch, client.defaultBundle);
prefManager.addPrefs(prefs);
prefManager.onPrefChanged = onPrefChanged;
@ -277,12 +304,14 @@ function getUserPrefManager(user)
["motif.current", defer],
["outputWindowURL", defer],
["log", client.prefs["userLog"]],
["logFileName", logDefault.path]
["logFileName", logDefault.path],
["timestamps", defer],
["timestampFormat", defer]
];
var branch = "extensions.irc.networks." + pref_mungeName(network.name) +
".users." + pref_mungeName(user.nick) + ".";
var prefManager = new PrefManager(branch);
var prefManager = new PrefManager(branch, client.defaultBundle);
prefManager.addPrefs(prefs);
prefManager.onPrefChanged = onPrefChanged;
@ -316,6 +345,10 @@ function onPrefChanged(prefName, newValue, oldValue)
client.MAX_MESSAGES = newValue;
break;
case "connectTries":
CIRCNetwork.prototype.MAX_CONNECT_ATTEMPTS = newValue;
break;
case "showModeSymbols":
if (newValue)
setListMode("symbol");
@ -380,6 +413,11 @@ function onPrefChanged(prefName, newValue, oldValue)
dispatch("sync-headers");
break;
case "timestamps":
case "timestampFormat":
dispatch("sync-timestamps");
break;
case "log":
dispatch("sync-logs");
break;
@ -440,9 +478,18 @@ function onNetworkPrefChanged(network, prefName, newValue, oldValue)
dispatch("sync-headers");
break;
case "timestamps":
case "timestampFormat":
dispatch("sync-timestamps");
break;
case "log":
dispatch("sync-logs");
break;
case "connectTries":
network.MAX_CONNECT_ATTEMPTS = newValue;
break;
}
}
@ -474,6 +521,11 @@ function onChannelPrefChanged(channel, prefName, newValue, oldValue)
dispatch("sync-headers");
break;
case "timestamps":
case "timestampFormat":
dispatch("sync-timestamps");
break;
case "log":
dispatch("sync-logs");
break;
@ -508,6 +560,11 @@ function onUserPrefChanged(user, prefName, newValue, oldValue)
dispatch("sync-headers");
break;
case "timestamps":
case "timestampFormat":
dispatch("sync-timestamps");
break;
case "log":
dispatch("sync-logs");
break;

View File

@ -34,7 +34,7 @@
* Samuel Sieb, samuel@sieb.net, MIRC color codes, munger menu, and various
*/
const __cz_version = "0.9.52B";
const __cz_version = "0.9.54";
const __cz_condition = "green";
var warn;
@ -176,6 +176,11 @@ function initStatic()
client.sound =
Components.classes["@mozilla.org/sound;1"].createInstance(nsISound);
const nsIGlobalHistory = Components.interfaces.nsIGlobalHistory;
const GHIST_CONTRACTID = "@mozilla.org/browser/global-history;1";
client.globalHistory =
Components.classes[GHIST_CONTRACTID].getService(nsIGlobalHistory);
multilineInputMode(client.prefs["multiline"]);
if (client.prefs["showModeSymbols"])
setListMode("symbol");
@ -183,7 +188,7 @@ function initStatic()
setListMode("graphic");
setDebugMode(client.prefs["debugMode"]);
var ary = navigator.userAgent.match (/;\s*([^;\s]+\s*)\).*\/(\d+)/);
var ary = navigator.userAgent.match (/(rv:[^;)\s]+).*?Gecko\/(\d+)/);
if (ary)
{
client.userAgent = "ChatZilla " + __cz_version + " [Mozilla " +
@ -986,8 +991,37 @@ function mainStep()
function openQueryTab (server, nick)
{
var user = server.addUser(nick);
client.globalHistory.addPage(user.getURL());
if (!("messages" in user))
{
var value = "";
var same = true;
for (var c in server.channels)
{
var chan = server.channels[c];
if (!(user.nick in chan.users))
continue;
/* This takes a boolean value for each channel (true - channel has
* same value as first), and &&-s them all together. Thus, |same|
* will tell us, at the end, if all the channels found have the
* same value for charset.
*/
if (value)
same = same && (value == chan.prefs["charset"]);
else
value = chan.prefs["charset"];
}
/* If we've got a value, and it's the same accross all channels,
* we use it as the *default* for the charset pref. If not, it'll
* just keep the "defer" default which pulls it off the network.
*/
if (value && same)
{
user.prefManager.prefRecords["charset"].defaultValue = value;
}
user.displayHere (getMsg(MSG_QUERY_OPENED, user.properNick));
}
server.sendData ("WHOIS " + nick + "\n");
return user;
}
@ -1126,6 +1160,33 @@ function addDynamicRule (rule)
rules.insertRule (rule, pos);
}
function getCommandEnabled(command)
{
try {
var dispatcher = top.document.commandDispatcher;
var controller = dispatcher.getControllerForCommand(command);
return controller.isCommandEnabled(command);
}
catch (e)
{
return false;
}
}
function doCommand(command)
{
try {
var dispatcher = top.document.commandDispatcher;
var controller = dispatcher.getControllerForCommand(command);
if (controller && controller.isCommandEnabled(command))
controller.doCommand(command);
}
catch (e)
{
}
}
var testURLs =
["irc:", "irc://", "irc:///", "irc:///help", "irc:///help,needkey",
"irc://irc.foo.org", "irc://foo:6666",
@ -1484,7 +1545,8 @@ function updateNetwork()
function updateTitle (obj)
{
if (!("currentObject" in client) || (obj && obj != client.currentObject))
if (!(("currentObject" in client) && client.currentObject) ||
(obj && obj != client.currentObject))
return;
var tstring;
@ -1534,7 +1596,9 @@ function updateTitle (obj)
if (!mode)
mode = MSG_TITLE_NO_MODE;
topic = o.channel.topic ? o.channel.topic : MSG_TITLE_NO_TOPIC;
var re = /\x1f|\x02|\x0f|\x16|\x03([0-9]{1,2}(,[0-9]{1,2})?)?/g;
topic = topic.replace(re, "");
tstring = getMsg(MSG_TITLE_CHANNEL, [nick, chan, mode, topic]);
break;
@ -1775,7 +1839,12 @@ function scrollDown(frame, force)
function setTabState (source, what)
{
if (typeof source != "object")
{
if (!ASSERT(source in client.viewsArray,
"INVALID SOURCE passed to setTabState"))
return;
source = client.viewsArray[source].source;
}
var tb = getTabForObject (source, true);
var vk = Number(tb.getAttribute("viewKey"));
@ -1787,8 +1856,12 @@ function setTabState (source, what)
{
/* if the tab state has an equal priority to what we are setting
* then blink it */
tb.setAttribute ("state", "normal");
setTimeout (setTabState, 200, vk, what);
if (client.prefs["activityFlashDelay"] > 0)
{
tb.setAttribute ("state", "normal");
setTimeout (setTabState, client.prefs["activityFlashDelay"],
vk, what);
}
}
else
{
@ -1815,8 +1888,13 @@ function setTabState (source, what)
/* the current state of the tab has a higher priority than the
* new state.
* blink the new lower state quickly, then back to the old */
tb.setAttribute ("state", what);
setTimeout (setTabState, 200, vk, state);
if (client.prefs["activityFlashDelay"] > 0)
{
tb.setAttribute ("state", what);
setTimeout (setTabState,
client.prefs["activityFlashDelay"], vk,
state);
}
}
}
}
@ -1917,6 +1995,34 @@ function getFrameForDOMWindow(window)
return undefined;
}
function replaceColorCodes(msg)
{
// mIRC codes: underline, bold, Original (reset), colors, reverse colors.
msg = msg.replace(/(^|[^%])%U/g, "$1\x1f");
msg = msg.replace(/(^|[^%])%B/g, "$1\x02");
msg = msg.replace(/(^|[^%])%O/g, "$1\x0f");
msg = msg.replace(/(^|[^%])%C/g, "$1\x03");
msg = msg.replace(/(^|[^%])%R/g, "$1\x16");
// %%[UBOCR] --> %[UBOCR].
msg = msg.replace(/%(%[UBOCR])/g, "$1");
return msg;
}
function decodeColorCodes(msg)
{
// %[UBOCR] --> %%[UBOCR].
msg = msg.replace(/(%[UBOCR])/g, "%$1");
// Put %-codes back in place of special character codes.
msg = msg.replace(/\x1f/g, "%U");
msg = msg.replace(/\x02/g, "%B");
msg = msg.replace(/\x0f/g, "%O");
msg = msg.replace(/\x03/g, "%C");
msg = msg.replace(/\x16/g, "%R");
return msg;
}
client.progressListener = new Object();
client.progressListener.QueryInterface =
@ -1958,6 +2064,8 @@ function client_statechange (webProgress, request, stateFlags, status)
{
cwin.getMsg = getMsg;
cwin.initOutputWindow(client, frame.source, onMessageViewClick);
cwin.changeCSS(frame.source.getTimestampCSS("data"),
"cz-timestamp-format");
scrollDown(frame, true);
webProgress.removeProgressListener(this);
}
@ -2485,6 +2593,45 @@ function display (message, msgtype, sourceObj, destObj)
client.currentObject.display (message, msgtype, sourceObj, destObj);
}
client.getTimestampCSS =
CIRCNetwork.prototype.getTimestampCSS =
CIRCChannel.prototype.getTimestampCSS =
CIRCUser.prototype.getTimestampCSS =
function this_getTimestampCSS(format)
{
/* Wow, this is cool. We just put together a CSS-rule string based on the
* "timestampFormat" preferences. *This* is what CSS is all about. :)
* We also provide a "data: URL" format, to simplify other code.
*/
var css;
if (this.prefs["timestamps"])
{
/* Hack. To get around a Mozilla bug, we must force the display back
* to a displayed value.
*/
css = ".msg-timestamp { display: table-cell; } " +
".msg-timestamp:before { content: '" +
this.prefs["timestampFormat"] + "'; }";
var letters = new Array('y', 'm', 'd', 'h', 'n', 's');
for (var i = 0; i < letters.length; i++)
{
css = css.replace("%" + letters[i], "' attr(time-" +
letters[i] + ") '");
}
}
else
{
/* Completely remove the <td>s if they're off, neatens display. */
css = ".msg-timestamp { display: none; }";
}
if (format == "data")
return "data:text/css," + encodeURIComponent(css);
return css;
}
client.display =
client.displayHere =
CIRCNetwork.prototype.displayHere =
@ -2515,7 +2662,15 @@ function __display(message, msgtype, sourceObj, destObj)
else
obj.setAttribute ("msg-source", fromAttr);
}
}
};
function formatTimeNumber (num, digits)
{
var rv = num.toString();
while (rv.length < digits)
rv = "0" + rv;
return rv;
};
if (!msgtype)
msgtype = MT_INFO;
@ -2600,6 +2755,22 @@ function __display(message, msgtype, sourceObj, destObj)
d.getHours(), mins, name]);
}
var msgTimestamp = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
var atts = { statusText: statusString,
"time-y": formatTimeNumber(d.getFullYear(), 4),
"time-m": formatTimeNumber(d.getMonth() + 1, 2),
"time-d": formatTimeNumber(d.getDate(), 2),
"time-h": formatTimeNumber(d.getHours(), 2),
"time-n": formatTimeNumber(d.getMinutes(), 2),
"time-s": formatTimeNumber(d.getSeconds(), 2),
};
setAttribs (msgTimestamp, "msg-timestamp", atts);
if (isImportant)
msgTimestamp.setAttribute ("important", "true");
var msgSource, msgType, msgData;
if (fromType.search(/IRC.*User/) != -1 &&
msgtype.search(/PRIVMSG|ACTION|NOTICE/) != -1)
{
@ -2685,8 +2856,8 @@ function __display(message, msgtype, sourceObj, destObj)
this.mark = (this.mark == "even") ? "odd" : "even";
}
var msgSource = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
msgSource = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
setAttribs (msgSource, "msg-user", {statusText: statusString});
if (isImportant)
msgSource.setAttribute ("important", "true");
@ -2706,7 +2877,6 @@ function __display(message, msgtype, sourceObj, destObj)
{
msgSource.appendChild (newInlineText (nick));
}
msgRow.appendChild (msgSource);
canMergeData = this.prefs["collapseMsgs"];
}
else
@ -2725,19 +2895,18 @@ function __display(message, msgtype, sourceObj, destObj)
}
/* Display the message code */
var msgType = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
msgType = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
setAttribs (msgType, "msg-type", {statusText: statusString});
msgType.appendChild (newInlineText (code));
msgRow.appendChild (msgType);
logText += code + " ";
}
if (message)
{
var msgData = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
msgData = document.createElementNS("http://www.w3.org/1999/xhtml",
"html:td");
setAttribs(msgData, "msg-data", {statusText: statusString,
colspan: client.INITIAL_COLSPAN,
timeStamp: timeStamp});
@ -2757,13 +2926,18 @@ function __display(message, msgtype, sourceObj, destObj)
msgData.appendChild (message);
logText += message.innerHTML.replace(/<[^<]*>/g, "");
}
msgRow.appendChild (msgData);
}
if (isImportant)
msgRow.setAttribute ("important", "true");
if (msgSource)
msgRow.appendChild (msgSource);
else
msgRow.appendChild (msgType);
if (msgData)
msgRow.appendChild (msgData);
if (blockLevel)
{
/* putting a div here crashes mozilla, so fake it with nested tables
@ -2791,6 +2965,8 @@ function __display(message, msgtype, sourceObj, destObj)
msgRow = tr;
canMergeData = false;
}
msgRow.insertBefore (msgTimestamp, msgRow.firstChild);
addHistory (this, msgRow, canMergeData);
if (isImportant || getAttention)
@ -2871,7 +3047,7 @@ function addHistory (source, obj, mergeData)
}
/* message is from the same person as last time,
* strip the nick first... */
obj.removeChild(obj.firstChild);
obj.removeChild(obj.childNodes[1]);
/* Adjust height of previous cells, maybe. */
for (i = 0; i < rowExtents.length - 1; ++i)
{
@ -2952,13 +3128,13 @@ function findPreviousColumnInfo (table)
{
var extents = new Array();
var tr = table.firstChild.lastChild;
var className = tr ? tr.firstChild.getAttribute("class") : "";
var className = tr ? tr.childNodes[1].getAttribute("class") : "";
while (tr && className.search(/msg-user|msg-type|msg-nested-td/) == -1)
{
extents.push(tr);
tr = tr.previousSibling;
if (tr)
className = tr.firstChild.getAttribute("class");
className = tr.childNodes[1].getAttribute("class");
}
if (!tr || className != "msg-user")
@ -2971,7 +3147,7 @@ function findPreviousColumnInfo (table)
{
if (nickCol.getAttribute("class") == "msg-user")
nickCols.push (nickCol);
nickCol = nickCol.nextSibling.nextSibling;
nickCol = nickCol.nextSibling;
}
return {extents: extents, nickColumns: nickCols};

View File

@ -106,3 +106,10 @@
<!ENTITY PopupKick.aKey "K">
<!ENTITY StatusText.label "Welcome to ChatZilla!">
<!ENTITY Underline.label "Underline">
<!ENTITY Bold.label "Bold">
<!ENTITY Reverse.label "Reverse video">
<!ENTITY Normal.label "Normal">
<!ENTITY Color.label "Colour">
<!ENTITY ForeBack.label "xx=Fore yy=Back">

View File

@ -66,6 +66,18 @@ cmd.clear-view.help = Clear the current view, discarding *all* content.
cmd.client.help = Make the ``*client*'' view current. If the ``*client*'' view has been deleted, it will be recreated.
cmd.cmd-copy.label = Copy
cmd.cmd-copy.params =
cmd.cmd-copy.help = Copies the currently-selected text to clipboard.
cmd.cmd-selectall.label = Select All
cmd.cmd-selectall.params =
cmd.cmd-selectall.help = Selects all the text in the current view.
cmd.cmd-copy-link-url.label = Copy Link Location
cmd.cmd-copy-link-url.params = <url>
cmd.cmd-copy-link-url.help = Copies the URL of the current link to clipboard.
cmd.commands.params = [<pattern>]
cmd.commands.help = Lists all command names matching <pattern>, or all command names if pattern is not specified.
@ -73,6 +85,7 @@ cmd.sync-motifs.help = Syncronizes all views with their current motif setting.
cmd.sync-logs.help = Syncronizes all views with their current logging setting.
cmd.sync-windows.help = Syncronizes all views with their current output window setting.
cmd.sync-headers.help = Syncronizes all views with their current header display setting.
cmd.sync-timestamps.help = Syncronizes all views with their current timestamp display settings.
cmd.ctcp.params = <target> <code> [<params>]
cmd.ctcp.help = Sends the CTCP code <code> to the target (user or channel) <target>. If <params> are specified they are sent along as well.
@ -168,6 +181,7 @@ cmd.toggle-usort.label = Sort Users By Mode
cmd.toggle-ccm.label = Collapse Co&nsecutive Messages
cmd.toggle-copy.label = Copy &Important Messages
cmd.toggle-umode.label = Show Mode as Symbol
cmd.toggle-timestamps.label = Show &Timestamps
cmd.userlist.help = Toggles the visibility of the user list.
@ -262,6 +276,12 @@ cmd.op.help = Gives operator status to <nickname> on current channel. Requires
cmd.open-at-startup.params = [<toggle>]
cmd.open-at-startup.help = Used to add the current view to the list of views that will be automatically opened at startup. If <toggle> is not provided, the status of the current view will be displayed. <toggle> can be one of: yes, on, true, 1, no, off, false, 0, or toggle, to toggle the current state.
cmd.timestamps.params = [<toggle>]
cmd.timestamps.help = Sets the visibility of timestamps in the current view. If <toggle> is provided and is |true|, |on|, |yes|, or |1|, timestamps will be turned on. Values |false|, |off|, |no| and |0| will turn timestamps off, and |toggle| will toggle the state. Ommit <toggle> to see the current state.
cmd.timestamp-format.params = [<format>]
cmd.timestamp-format.help = Sets the timestamp format used in the current view. If <format> is provided, the format is updated and saved. Ommit <format> to see the current format for timestamps.
cmd.toggle-oas.format = Open This $viewType at Startup
cmd.toggle-oas.label = Open at Startup
@ -412,6 +432,7 @@ msg.fmt.seconds = %S seconds
msg.fmt.matchlist = %S matches for ``%S'': [%S]
msg.fmt.ctcpreply = CTCP %S reply ``%S'' from %S
msg.fmt.chanlist = %S %S %S
msg.fmt.logged.on = %S is logged in as %S
# 1: month, 2: dom, 3: hours, 4: minutes, 5: nick info
msg.fmt.status = %S/%S %S:%S, %S
@ -680,3 +701,154 @@ munger.italic=Italic
munger.teletype=Teletype
munger.underline=Underline
munger.ctrl-char=Control Chars
# Localised names for all the prefs and tooltip "help" messages.
# NOTE: "Bugzilla", "Chatzilla" and "mIRC" are product names.
pref.activityFlashDelay.label = Activity flash delay
pref.activityFlashDelay.help = When a tab that has already had activity on it gets more activity, the tab is flashed to indicate this. This preference is the length of the flash, 0 disables it.
pref.aliases.label = Command aliases
pref.aliases.help = Allows you to make short-cuts to various commands or sequences of commands. Each item is of the form "<name> = <command-list>", and the command-list is a list of commands (without the leading "/") and parameters, each separated by ";". The name of the alias will automatically be turned into a command when Chatzilla starts.
pref.autoperform.label = Auto-perform
pref.autoperform.help = When connecting to a server, you might want to send some commands each time, and don't want to type them out each time. Simply enter each command in this list (without the leading "/"), with parameters, and Chatzilla will do it all for you. The commands are run in the order listed.
pref.autoRejoin.label = Automatically rejoin
pref.autoRejoin.help = If this is turned on, Chatzilla will try (only once) to rejoin a channel if you get kicked from it. Note, some channels dislike auto-rejoin, and will ban you, so be careful. You can set this preference on channels, networks and globally.
pref.bugURL.label = Bugzilla URL
pref.bugURL.help = The URL used for links to bugs, with "%s" replaced with the bug number. The text "bug " followed by a number will get turned into a link using this URL.
pref.charset.label = Character set
pref.charset.help = For multiple clients to correctly read messages with non-ASCII characters on IRC, they need to use the same character set.
pref.collapseMsgs.label = Collapse messages
pref.collapseMsgs.help = Makes multiple messages from one person only show their nickname against the first, which can look cleaner than having the nickname repeated.
pref.connectTries.label = Connection attempts
pref.connectTries.help = The number of times Chatzilla attemps to connect to a server or network.
pref.copyMessages.label = Copy important messages
pref.copyMessages.help = Any message marked as "important" will also be copied to the network view with this turned on. It allows you do go away for a long time and still not miss any messages addressed to you.
pref.debugMode.label = Debug mode
pref.debugMode.help = This preferences is for deubgging Chatzilla and can generate a lot of debug output (usually to the console). It is a list of letters, signifying what you want you want debug messages about. "c" for context menus (dumps data when opening a context menu), "d" for dispatch (dumps data when dispatching commands), and "t" for trace/hook (dumps data about hooks and the event queue processing) debug.
pref.desc.label = Description
pref.desc.help = Sets the "description" (aka "real name") field shown in your /whois information. It is commonly used to include ones' real name, but you are not required to enter anything.
pref.deleteOnPart.label = Delete channel views on part
pref.deleteOnPart.help = Removes the channel view when you leave using /leave or /part.
pref.displayHeader.label = Show header
pref.displayHeader.help = Display the chat header on this view. This contains information like the URL of the current view, and the topic and modes for a channel view.
pref.guessCommands.label = Guess unknown commands
pref.guessCommands.help = If you enter a command (starts with "/") that Chatzilla doesn't understand, then it can try "guessing" by sending the command to the server. You can turn this off if you don't want Chatzilla to try this.
pref.initialURLs.label = Auto-connect URLs
pref.initialURLs.help = A list of IRC URLs that Chatzilla should connect to (load) when starting. These will not be loaded if Chatzilla is started because of a URL that goes somewhere (e.g. irc://moznet/).
pref.initialScripts.label = Auto-load scripts
pref.initialScripts.help = When Chatzilla starts, it loads all the scripts listed here. If an item is a directory, however, it loads "init.js" from that directory, and any subdirectory.
pref.logFileName.label = Log file name
pref.logFileName.help = This is the file which Chatzilla will log this view to. Generally, if the view is currently open and logging, changing this option won't take effect until it next starts logging.
pref.messages.click.label = Links: Normal click
pref.messages.click.help = The three link preferences define how Chatzilla reacts to different kinds of clicks on links. You can re-arrange these to suit your preferences.
pref.messages.ctrlClick.label = Links: Control-click
pref.messages.ctrlClick.help = The three link preferences define how Chatzilla reacts to different kinds of clicks on links. You can re-arrange these to suit your preferences.
pref.messages.metaClick.label = Links: Alt/Meta-click
pref.messages.metaClick.help = The three link preferences define how Chatzilla reacts to different kinds of clicks on links. You can re-arrange these to suit your preferences.
pref.motif.dark.label = Dark motif URL
pref.motif.dark.help = The dark motif selectable from the View > Color Scheme menu.
pref.motif.light.label = Light motif URL
pref.motif.light.help = The light motif selectable from the View > Color Scheme menu.
pref.motif.default.label = Default motif URL
pref.motif.default.help = The default motif selectable from the View > Color Scheme menu.
pref.motif.current.label = Current motif
pref.motif.current.help = The currently selected motif file. A Motif is a CSS file that describes how do display the chat view, and can be used to customize the display.
pref.msgBeep.label = Sounds: New query view
pref.msgBeep.help = The sound(s) to play when a new query view is created. This is a space separated list of either "beep" or file: URLs.
pref.multiline.label = Multiline input mode
pref.multiline.help = Sets whether Chatzilla is using the multiline input box or the normal single-line one.
pref.munger.bold.label = Display bold
pref.munger.bold.help = Makes Chatzilla display *bold* actually in bold face.
pref.munger.bugzilla-link.label = Display Bugzilla links
pref.munger.bugzilla-link.help = Makes Chatzilla convert "bug <number>" into a link, using the "Bugzilla URL" as the link.
pref.munger.channel-link.label = Display channel links
pref.munger.channel-link.help = Makes Chatzilla convert "#channel" into a link to the channel.
pref.munger.colorCodes.label = Display mIRC colors
pref.munger.colorCodes.help = Enables the display of colors on the chat text, as well as other mIRC codes (bold and underline). When disabled, Chatzilla understands the codes but doesn't do anything with the display (so you don't get the codes or the colors).
pref.munger.ctrl-char.label = Display control characters
pref.munger.ctrl-char.help = Makes Chatzilla display control characters it doesn't understand.
pref.munger.ear.label = Display ear
pref.munger.ear.help = Makes Chatzilla display an image of an ear for "(*".
pref.munger.face.label = Display faces (emoticons)
pref.munger.face.help = Makes Chatzilla display images for common smilies, such as :-) and ;-).
pref.munger.italic.label = Display italic
pref.munger.italic.help = Makes Chatzilla display /italic/ actually in italics.
pref.munger.link.label = Display web links
pref.munger.link.help = Makes Chatzilla convert text that looks like a web link into a link.
pref.munger.mailto.label = Display mail links
pref.munger.mailto.help = Makes Chatzilla convert text that looks like an e-mail address into a e-mail link.
pref.munger.quote.label = Display neater quotes
pref.munger.quote.help = Makes Chatzilla replace `` with \u201C and '' with \u201D.
pref.munger.rheet.label = Display rheet
pref.munger.rheet.help = Makes Chatzilla turn "rheet" into a link (a very Mozilla.org-centric feature).
pref.munger.underline.label = Display underline
pref.munger.underline.help = Makes Chatzilla display _underline_ actually with an underline.
pref.munger.word-hyphenator.label = Automaticall hyphenate long works
pref.munger.word-hyphenator.help = Makes Chatzilla automatically insert "hyphenation points" into long words and URLs so they can wrap to the screen size.
pref.newTabLimit.label = Max auto-created views
pref.newTabLimit.help = Sets the number of views (such as query views) that may be created automatically by Chatzilla. Once the limit is reached, private messages will show up on the current view instead. Set this to 0 for unlimited, or 1 to disallow all auto-created views.
pref.nickCompleteStr.label = Nickname completion string
pref.nickCompleteStr.help = This string is appended to a nickname when tab-completed at the start of a line.
pref.nickname.label = Nickname
pref.nickname.help = This is the name seen by everyone else when on IRC. You can use anything you like, but can't contain particularily "weird" characters, so keep to alpha-numeric characters.
pref.notify.aggressive.label = Aggressive notify
pref.notify.aggressive.help = When someone private messages you, says your nickname, or mentions one of your "stalk words", Chatzilla considers the message to be worth getting your attention. This preference sets whether it's allowed to flash the window or bring it to the front (varies by OS) in order to get your attention.
pref.notifyList.label = Notify list
pref.notifyList.help = A list of nicknames to periodically check to see if they are on-line or not. Every 5 minutes, Chatzilla will check this list, and inform you if anyone is now on-line or has gone off-line.
pref.outgoing.colorCodes.label = Enable sending color codes
pref.outgoing.colorCodes.help = Allows you to send color and other mIRC codes, such as bold and underline, using special %-sequences. When enabled, simply type "%" to see a popup of the various choices.
pref.outputWindowURL.label = Output Window URL
pref.outputWindowURL.help = You probably don't want to change this. The chat view loads this URL to display the actual messages, header, etc., and the file must correctly define certain items or you'll get JavaScript errors and a blank chat window!
pref.profilePath.label = Profile path
pref.profilePath.help = This is the base location for Chatzilla-related files. By default, Chatzilla loads scripts in the "scripts" subdirectory, and stores log files in the "logs" subdirectory.
pref.sortUsersByMode.label = Userlist: sort users by mode
pref.sortUsersByMode.help = Causes the userlist to sort users by their mode, op first, then half-op (if supported on the server), then voice, and then everyone else.
pref.queryBeep.label = Sounds: Query message
pref.queryBeep.help = The sound(s) to play when a message arrvies in a query view. This is a space separated list of either "beep" or file: URLs.
pref.reconnect.label = Automatically reconnect
pref.reconnect.help = When your connection is lost unexpectedly, Chatzilla can automatically reconnect to the server for you.
pref.showModeSymbols.label = Userlist: show user mode symbols
pref.showModeSymbols.help = The userlist can either show mode symbols ("@" for op, "%" for half-op, "+" for voice), or it can use lights (green for op, dark blue for half-op, light blue (cyan) for voice, and black/off for normal). Turn this preference on to use the mode symbols instead of the lights.
pref.stalkBeep.label = Sounds: Important message
pref.stalkBeep.help = The sound(s) to play when a message is found to be "important" (has your nickname in it, or a stalk word). This is a space separated list of either "beep" or file: URLs.
pref.stalkWholeWords.label = Stalk whole words only
pref.stalkWholeWords.help = This preferences toggles Chatzilla's handling of stalk words between finding matching words, or simple substrings. For example, "Chatzilla is cool" will match the stalk word "zilla" only if this preferences is off.
pref.stalkWords.label = Stalk words
pref.stalkWords.help = A list of words that, when a line contains one, make Chatzilla make the line as "important", and will try to get your attention if "Aggressive notify" is turned on.
pref.timestampFormat.label = Timestamps format
pref.timestampFormat.help = Sets the format used for timestamps in this view. Enter the string format to use for time stamps, with the following replacements: %y = 4-digit year, %m = month number (1-12), %d = day of month, %h = hour, %n = minutes, %s = seconds.
pref.timestamps.label = Timestamps enabled
pref.timestamps.help = Enables timestamps in this view. Timestamps display the time of each message in the chat view.
pref.username.label = Username
pref.username.help = Your username is used to construct your "host mask", which is a string representing you, by including your connection's host name and this username. It is sometimes used for setting auto-op, bans, and other things specific to one person.
pref.usermode.label = Usermode
pref.usermode.help = Your usermode determins how the IRC server treats you (it is a list of letters preceeded by "+") - for example, you can get the server to send to message about "behind the scenes"-like things but setting a different usermode. The most common option, "i", makes you not show up as a member of a channel unless the user making the query is already in the channel (it stands for "invisible").
# These are the prefs that get grouped
# Localisers should make sure each version has the same string, and that they
# don't include any indication of which pref it actually is - this will be
# provided by the dialog itself.
pref.networkHeader.label = Show header
pref.networkHeader.help = Sets the default visibility for headers of views. Each view can override this default if nessessary.
pref.channelHeader.label = Show header
pref.channelHeader.help = Sets the default visibility for headers of views. Each view can override this default if nessessary.
pref.userHeader.label = Show header
pref.userHeader.help = Sets the default visibility for headers of views. Each view can override this default if nessessary.
pref.log.label = Log this view
pref.log.help = Makes Chatzilla log this view. The log file is usually stored in your profile, which can be overriden with "Profile path" (for the base path) or "Log file name" for a specific view's log.
pref.networkLog.label = Log these view types
pref.networkLog.help = Sets the default loging state for views. Each view can override this default if nessessary.
pref.channelLog.label = Log these view types
pref.channelLog.help = Sets the default loging state for views. Each view can override this default if nessessary.
pref.userLog.label = Log these view types
pref.userLog.help = Sets the default loging state for views. Each view can override this default if nessessary.
pref.clientMaxLines.label = Scrollback size
pref.clientMaxLines.help = The number of lines of text to keep in this view type. Once the limit is reached, the oldest lines are removed as new lines are added.
pref.networkMaxLines.label = Scrollback size
pref.networkMaxLines.help = The number of lines of text to keep in this view type. Once the limit is reached, the oldest lines are removed as new lines are added.
pref.channelMaxLines.label = Scrollback size
pref.channelMaxLines.help = The number of lines of text to keep in this view type. Once the limit is reached, the oldest lines are removed as new lines are added.
pref.userMaxLines.label = Scrollback size
pref.userMaxLines.help = The number of lines of text to keep in this view type. Once the limit is reached, the oldest lines are removed as new lines are added.

View File

@ -71,7 +71,7 @@ window {
}
.view-button {
color: black;
/* do NOT set colour, at least not without background. :) */
}
.view-button[state="current"] {
@ -214,3 +214,18 @@ treechildren::-moz-tree-image(op-true) {
list-style-image: url(chrome://chatzilla/skin/images/op-graphic.png);
}
.colorGrid
{
width: 24px;
height: 16px;
border: 1px solid black;
-moz-box-align: center;
-moz-box-pack: center;
}
#colorTooltip
{
padding: 0px;
-moz-box-align: center;
-moz-box-pack: center;
}