mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 22:32:46 +00:00
parent
ce5088ba8f
commit
56cdfb949a
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;"/>
|
||||
|
@ -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"]]));
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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 =
|
||||
|
@ -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'"}],
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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};
|
||||
|
@ -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">
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user