1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
<title>JWChat - Groupchat</title>
5
<meta http-equiv="content-type" content="text/html; charset=utf-8">
7
// this one's needed to make roster.js work
8
var JABBERSERVER = opener.JABBERSERVER;
10
<script src="shared.js"></script>
11
<script src="browsercheck.js"></script>
12
<script src="emoticons.js"></script>
13
<script src="config.js"></script>
14
<script src="statusLed.js"></script>
15
<script src="jsjac.js"></script>
16
<script src="roster.js"></script>
17
<script language="JavaScript1.2">
19
var colors = new Array('maroon','green','olive','navy','purple','teal','red','blue');
22
function putMsgHTML(msg,mtime,user,usercolor,err) {
25
msgHTML += "<div><span class=time>["+mtime+"] </span>";
27
if (msg.match(/^\/me /)) {
29
msg = msg.replace(/^\/me /,"<span style=\"color:green;font-weight:bold;\" class=msgnick title='@ "+mtime+"'>* "+htmlEnc(user)+"</span> ");
30
} else if (user != group) {
32
msgHTML += "<span style=\"color:"+usercolor+";\" class=msgnick title='@ "+mtime+"'><" + htmlEnc(user) + "></span> ";
35
if (user == group) {/* channel status messages */
37
msgHTML += "<span style=\"font-weight:bold;color:red;\">"+msg+"</span>";
39
msgHTML += "<span style=\"font-weight:bold;\">"+msg+"</span>";
41
if (user != nick && meRegExp.test(msg) && !notHREFMeRegExp.test(msg))
42
msgHTML += " " + msg.replace(meRegExp,"<span class='highlighted'>$1</span>");
49
var scroll_bottom = false;
50
if (cFrame.body.scrollTop+cFrame.body.clientHeight >= cFrame.body.scrollHeight)
53
cFrame.body.innerHTML += msgHTML;
56
frames.groupchatChat.groupchatIChat.scrollTo(0,cFrame.body.scrollHeight);
62
user = srcW.roster.getUserByJID(group);
64
while (user.chatmsgs.length>0) {
67
msg = user.chatmsgs[0];
68
user.chatmsgs = user.chatmsgs.slice(1,user.chatmsgs.length);
70
msg = user.chatmsgs.shift();
72
var from = msg.getFrom();
73
if (msg.getFrom().indexOf('/') != -1)
74
from = msg.getFrom().substring(msg.getFrom().indexOf('/')+1);
79
timestamp = msg.jwcTimestamp;
81
timestamp = new Date();
84
if (new Date() - timestamp > 24*3600*1000)
85
mtime += timestamp.toLocaleDateString() + " ";
87
mtime += timestamp.toLocaleTimeString();
89
/* look for a subject */
90
if (msg.getSubject()) { // set topic
91
user.roster.subject = msg.getSubject();
92
frames.groupchatTop.document.forms[0].elements['subject'].value = msg.getSubject();
93
putMsgHTML("/me has set the topic to: "+msg.getSubject(), mtime, from);
97
if(!msg.getBody() || msg.getBody() == '')
100
/* calculate color */
102
for (var i=0; i<from.length; i++)
103
charSum += from.charCodeAt(i);
105
putMsgHTML(msg.getBody(),mtime,from,colors[charSum%(colors.length)]);
108
/* disabled: it's annoying */
109
// if (srcW.focusWindows) frames.groupchatBottom.document.forms[0].msgbox.focus();
112
function displayTimestamp() {
115
tstyle = cFrame.styleSheets('timestampstyle');
116
tstyle.disabled = opener.top.timestamps;
118
tstyle = cFrame.getElementById("timestampstyle");
119
tstyle.sheet.disabled = opener.top.timestamps;
123
function updateMe() {
124
frames.groupchatTop.document.forms[0].subject.disabled = (roster.me.role == 'none');
125
frames.groupchatBottom.document.forms[0].submit.disabled = (roster.me.role == 'none');
127
if (roster.me.affiliation == 'owner')
128
frames.groupchatBottom.document.getElementById('config_chan_button').style.display = '';
130
frames.groupchatBottom.document.getElementById('config_chan_button').style.display = 'none';
132
if (roster.me.role == 'none') {// seems we left
133
cFrame.body.innerHTML += "<span style='color:red';>"+"Disconnected."+"</span><br>";
134
frames.groupchatChat.groupchatIChat.scrollTo(0,cFrame.body.scrollHeight);
137
if (frames.groupchatRoster.updateMe)
138
frames.groupchatRoster.updateMe();
141
function changeUserStat(jid,stat,val,confirm,reason) {
142
var user = roster.getUserByJID(jid);
143
var iq = new JSJaCIQ();
147
var query = iq.setQuery('http://jabber.org/protocol/muc#admin');
148
var item = query.appendChild(iq.getDoc().createElement('item'));
149
item.setAttribute('nick',user.name);
151
item.setAttribute(stat,val);
153
if (reason || (confirm && (reason = prompt("Reason","")) != ''))
154
item.appendChild(iq.getDoc().createElement('reason')).appendChild(iq.getDoc().createTextNode(reason));
157
srcW.con.send(iq,me.handleError);
160
function handleError(iq) {
162
if (iq && iq.getType() == 'error') {
163
srcW.Debug.log(iq.xml(),1);
164
var error = iq.getNode().getElementsByTagName('error').item(0);
167
for (var i=0; i<error.childNodes.length; i++) {
168
switch (error.childNodes.item(i).nodeName) {
170
putMsgHTML("Not Allowed",new Date(),group,null,true);
173
putMsgHTML("Forbidden",new Date(),group,null,true);
175
case 'item-not-found':
176
putMsgHTML("Not Found",new Date(),group,null,true);
179
putMsgHTML(error.childNodes.item(i).nodeName,new Date(),group,null,true);
187
function changeRole(jid,role,confirm,reason) {
188
changeUserStat(jid,"role",role,confirm,reason);
191
function changeAffiliation(jid,affil,confirm,reason) {
192
changeUserStat(jid,"affiliation",affil,confirm);
196
function openConfig() {
197
if (!configW || configW.closed)
198
configW = open("groupchatconfig.html","gccW"+makeWindowName(jid),"width=480,height=380,resizable=yes,scrollbars=yes");
204
if (configW && !configW.closed)
212
var presence = new JSJaCPresence();
213
presence.setType('unavailable');
214
presence.setTo(group);
215
srcW.con.send(presence);
218
if (!user.messages.length && !user.chatmsgs.length && srcW && srcW.roster) {
219
srcW.roster.removeUser(user);
225
var srcW,user,roster,cFrame,jid,nick,pass,meRegExp,notHREFMeRegExp;
232
jid = passedArgs['jid'];
235
if (typeof(passedArgs['nick']) != 'undefined')
236
nick = passedArgs['nick'];
237
if(typeof(nick) == 'undefined' || nick == '')
238
nick = srcW.roster.nick; // guess a nick
240
meRegExp = new RegExp("\\b("+nick+")\\b","i");
241
notHREFMeRegExp = new RegExp("href=\"\\S*\\b"+nick+"\\b\\S*\"","i");
243
if (passedArgs['pass'] != 'undefined')
244
pass = passedArgs['pass'];
246
srcW.Debug.log("groupchat room: "+jid+", nick: "+nick + ", pass: "+pass ,2);
249
var aPresence = new JSJaCPresence();
250
aPresence.setTo(group+'/'+nick);
252
var x = aPresence.appendNode('x',
253
{'xmlns': 'http://jabber.org/protocol/muc'});
254
if (typeof(pass) != 'undefined' && pass != '')
255
x.appendChild(aPresence.buildNode('password' ,pass));
257
if (srcW.onlstat != 'available' && srcW.onlstat != 'invisible')
258
aPresence.setShow(srcW.onlstat);
260
if (srcW.onlmsg != '')
261
aPresence.setStatus(srcW.onlmsg);
263
srcW.Debug.log("sending muc presence:\n"+aPresence.xml(),3);
265
srcW.con.send(aPresence);
267
cFrame = frames.groupchatChat.groupchatIChat.document;
269
user = srcW.roster.getUserByJID(group);
271
user = srcW.roster.addUser(new RosterUser(group,'',["Chat Rooms"],group.substring(0,group.indexOf('@'))));
272
user.chatW = window.self;
274
user.status = 'available';
277
user.roster = new GroupchatRoster(window.self);
278
user.roster.nick = nick; // remember my nickname
279
roster = user.roster;
280
// user.roster.print();
282
// document.title += " - " + group;
283
document.title = group+'/'+nick;
289
function keyPressed(e) {
294
function updateStyleIE() {
296
if (user && user.roster)
297
user.roster.updateStyleIE();
301
onkeydown = keyPressed;
304
onresize = updateStyleIE;
308
<script for="document" event="onkeydown()" language="JScript">
310
if (window.event && window.event.keyCode == 27)
316
<frameset cols="75%,*" frameborder=2 framespacing=2 border=2 bordercolor=black>
317
<frameset rows="40,*,90" frameborder=2 framespacing=2 border=2 bordercolor=black>
318
<frame src="groupchat_top.html" name="groupchatTop" scrolling="no" />
319
<frame src="groupchat_chat.html" name="groupchatChat" scrolling="no" />
320
<frame src="groupchat_bottom.html" name="groupchatBottom" scrolling="no" />
322
<frame src="groupchat_roster.html" name="groupchatRoster" scrolling="no" />