1
function RosterGroup(name) {
2
this.name = htmlEnc(name);
3
this.users = new Array();
5
this.messagesPending = 0;
8
function RosterUserAdd2Group(group) {
9
this.groups = this.groups.concat(group);
12
function RosterUser(jid,subscription,groups,name) {
15
this.jid = cutResource(jid) || 'unknown';
16
this.jid = this.jid.toLowerCase(); // jids are case insensitive
18
this.subscription = subscription || 'none';
19
this.groups = groups || [''];
23
else if (this.jid == JABBERSERVER)
24
this.name = "Система";
25
else if ((this.jid.indexOf('@') != -1) &&
26
this.jid.substring(this.jid.indexOf('@')+1) == JABBERSERVER) // we found a local user
27
this.name = this.jid.substring(0,jid.indexOf('@'));
31
this.name = htmlEnc(this.name);
33
// initialise defaults
34
this.status = (this.subscription == 'from' || this.subscription == 'none') ? 'stalker' : 'unavailable';
35
this.statusMsg = null;
37
this.messages = new Array();
38
this.chatmsgs = new Array();
39
this.chatW = null; // chat window
42
this.add2Group = RosterUserAdd2Group;
46
function getElFromArrByProp(arr,prop,str) {
47
for (var i=0; i<arr.length; i++) {
48
if (arr[i][prop] == str)
54
function getRosterGroupByName(groupName) {
55
return getElFromArrByProp(this.groups,"name",groupName);
58
function getRosterUserByJID(jid) {
59
return getElFromArrByProp(this.users,"jid",jid.toLowerCase());
62
function RosterUpdateStyleIE() {
65
this.rosterW.getElementById("roster").style.width = this.rosterW.body.clientWidth;
68
function RosterGetUserIcons(from) {
69
var images = new Array();
71
for (var i=0; i<this.groups.length; i++) {
72
var img = this.rosterW.images[from+"/"+this.groups[i].name];
74
images = images.concat(img);
75
continue; // skip this group
81
function RosterToggleHide() {
82
this.usersHidden = !this.usersHidden;
87
function RosterToggleGrp(name) {
88
var el = this.rosterW.getElementById(name);
89
if (el.className == 'hidden') {
90
el.className = 'rosterGroup';
91
this.hiddenGroups[name] = false;
92
this.rosterW.images[name+"Img"].src = grp_open_img.src;
94
el.className = 'hidden';
95
this.hiddenGroups[name] = true;
96
this.rosterW.images[name+"Img"].src = grp_close_img.src;
101
function RosterOpenMessage(jid) {
102
var user = this.getUserByJID(jid);
103
var wName = makeWindowName(user.jid);
105
if (user.messages.length > 0 && (!user.mW || user.mW.closed)) // display messages
106
user.mW = open('message.html?jid='+escape(jid),
108
'width=360,height=270,dependent=yes,resizable=yes');
109
else if (!user.sW || user.sW.closed) // open send dialog
110
user.sW = open("send.html?jid="+escape(jid),
112
'width=320,height=200,dependent=yes,resizable=yes');
116
function RosterOpenChat(jid) {
118
var user = this.getUserByJID(jid);
123
if (user.messages.length > 0 && (!user.mW || user.mW.closed)) // display messages
124
this.openMessage(jid);
126
if (!user.chatW || user.chatW.closed)
127
user.chatW = open("chat.html?jid="+escape(jid),
128
"chatW"+makeWindowName(user.jid),
129
"width=320,height=390,resizable=yes");
130
else if (user.chatW.popMsgs)
131
user.chatW.popMsgs();
134
function RosterCleanUp() {
135
for (var i=0; i<this.users.length; i++) {
136
if (this.users[i].roster)
137
this.users[i].roster.cleanUp();
138
if (this.users[i].sW)
139
this.users[i].sW.close();
140
if (this.users[i].mW)
141
this.users[i].mW.close();
142
if (this.users[i].chatW)
143
this.users[i].chatW.close();
144
if (this.users[i].histW)
145
this.users[i].histW.close();
149
function RosterUpdateGroupForUser(user) {
150
for (var j=0; j<user.groups.length; j++) {
151
if (user.groups.length > 1 && user.groups[j] == '')
153
var groupName = (user.groups[j] == '') ? "Не в группе" : user.groups[j];
154
var group = this.getGroupByName(groupName);
156
group = new RosterGroup(groupName);
157
this.groups = this.groups.concat(group);
159
group.users = group.users.concat(user);
163
function RosterUpdateGroups() {
164
var oldGroups = this.groups;
165
this.groups = new Array();
166
for (var i=0; i<this.users.length; i++)
167
this.updateGroupsForUser(this.users[i]);
168
// remove elements for groups that don't exist anymore
169
for (var i=0; i<oldGroups.length; i++) {
171
for (var j=0; j<this.groups.length; j++) {
172
if (oldGroups[i].name == this.groups[j].name) {
178
var rosterEl = this.rosterW.getElementById('roster');
179
var groupHeaderEl = this.rosterW.getElementById(oldGroups[i].name+'Head');
180
var groupEl = this.rosterW.getElementById(oldGroups[i].name);
181
rosterEl.removeChild(groupHeaderEl);
182
rosterEl.removeChild(groupEl);
187
function RosterUserAdd(user) {
188
this.users = this.users.concat(user);
191
this.updateGroupsForUser(user);
195
function RosterRemoveUser(user) {
196
var uLen = this.users.length;
197
for (var i=0; i<uLen; i++) {
198
if (user == this.users[i]) {
199
this.users = this.users.slice(0,i).concat(this.users.slice(i+1,uLen));
200
// remove user element
201
for (var j=0; j < user.groups.length; j++) {
202
var groupName = user.groups[j].name || 'Unfiled';
203
var groupEl = this.rosterW.getElementById(groupName);
204
var userEl = this.rosterW.getElementById(getUserElementId(user, user.groups[j]));
205
if (groupEl && userEl) { groupEl.removeChild(userEl); }
213
function RosterGetGroupchats() {
214
var groupchats = new Array();
215
for (var i=0; i<this.users.length; i++)
216
if (this.users[i].roster)
217
groupchats[groupchats.length] = this.users[i].jid+'/'+this.users[i].roster.nick;
221
function Roster(items,targetW) {
222
this.users = new Array();
223
this.groups = new Array();
224
this.hiddenGroups = new Array();
225
this.name = 'Roster';
227
this.rosterW = targetW;
228
this.lastUserSelected = null; // moved into Roster from iRoster.html and groupchat_iroster.html - sam
230
/* object's methods */
231
this.print = printRoster;
232
this.update = updateRoster;
233
this.getGroupByName = getRosterGroupByName;
234
this.getUserByJID = getRosterUserByJID;
235
this.addUser = RosterUserAdd;
236
this.removeUser = RosterRemoveUser;
237
this.updateGroupsForUser = RosterUpdateGroupForUser;
238
this.updateGroups = RosterUpdateGroups;
239
this.toggleGrp = RosterToggleGrp;
240
this.updateStyleIE = RosterUpdateStyleIE;
241
this.toggleHide = RosterToggleHide;
242
this.getUserIcons = RosterGetUserIcons;
243
this.openMessage = RosterOpenMessage;
244
this.openChat = RosterOpenChat;
245
this.cleanUp = RosterCleanUp;
246
this.getGroupchats = RosterGetGroupchats;
247
this.selectUser = RosterSelectUser; // moved into Roster from iRoster.html and groupchat_iroster.html - sam
248
this.userClicked = RosterUserClicked;
253
for (var i=0;i<items.length;i++) {
254
/* if (items[i].jid.indexOf("@") == -1) */ // no user - must be a transport
255
if (typeof(items.item(i).getAttribute('jid')) == 'undefined')
257
var name = items.item(i).getAttribute('name') || cutResource(items.item(i).getAttribute('jid'));
258
var groups = new Array('');
259
for (var j=0;j<items.item(i).childNodes.length;j++)
260
if (items.item(i).childNodes.item(j).nodeName == 'group')
261
if (items.item(i).childNodes.item(j).firstChild) //if stanza != <group/>
262
groups = groups.concat(items.item(i).childNodes.item(j).firstChild.nodeValue);
263
this.addUser(new RosterUser(items.item(i).getAttribute('jid'),items.item(i).getAttribute('subscription'),groups,name));
267
function rosterSort(a,b) {
268
// if (typeof(a.name) != 'string' || typeof(b.name) != 'string')
270
return (a.name.toLowerCase()<b.name.toLowerCase())?-1:1;
273
function printRoster() {
275
/* update user count for groups */
276
for (var i=0; i<this.groups.length; i++) {
277
this.groups[i].onlUserCount = 0;
278
this.groups[i].messagesPending = 0;
279
for (var j=0; j<this.groups[i].users.length; j++) {
280
if (this.groups[i].users[j].status != 'unavailable' && this.groups[i].users[j].status != 'stalker')
281
this.groups[i].onlUserCount++;
282
if (this.groups[i].users[j].lastsrc)
283
this.groups[i].messagesPending++;
287
this.groups = this.groups.sort(rosterSort);
289
if (this.rosterW.getElementById('roster').innerHTML.search(/\S/) > -1) {
290
this.update(); // update dom, rather than redrawing roster
299
for (var i=0; i<this.groups.length; i++) {
301
var rosterGroupHeadClass = (this.usersHidden &&
302
this.groups[i].onlUserCount == 0 &&
303
this.groups[i].messagesPending == 0 &&
304
this.groups[i].name != "Шлюзы")
305
? 'rosterGroupHeaderHidden':'rosterGroupHeader';
306
A[A.length] = "<div id='";
307
A[A.length] = this.groups[i].name;
308
A[A.length] = "Head' class='";
309
A[A.length] = rosterGroupHeadClass;
310
A[A.length] = "' onClick='toggleGrp(\"";
311
A[A.length] = this.groups[i].name;
312
A[A.length] = "\");'><nobr>";
313
var toggleImg = (this.hiddenGroups[this.groups[i].name])?'images/group_close.gif':'images/group_open.gif';
314
A[A.length] = "<img src='";
315
A[A.length] = toggleImg;
316
A[A.length] ="' name='";
317
A[A.length] = this.groups[i].name;
318
A[A.length] = "Img'> ";
319
A[A.length] = this.groups[i].name;
320
A[A.length] = " (<span id='";
321
A[A.length] = this.groups[i].name;
322
A[A.length] = "On'>";
323
A[A.length] = this.groups[i].onlUserCount;
324
A[A.length] = "</span>/<span id='";// put total number in span - sam
325
A[A.length] = this.groups[i].name;
326
A[A.length] = "All'>";
327
A[A.length] = this.groups[i].users.length;
328
A[A.length] = "</span>)";
329
A[A.length] = "</nobr></div>";
330
var rosterGroupClass = (
331
(this.usersHidden && this.groups[i].onlUserCount == 0 &&
332
this.groups[i].messagesPending == 0 &&
333
this.groups[i].name != "Шлюзы")
334
|| this.hiddenGroups[this.groups[i].name])
335
? 'hidden':'rosterGroup';
337
A[A.length] = "<div id='";
338
A[A.length] = this.groups[i].name;
339
A[A.length] = "' class='";
340
A[A.length] = rosterGroupClass;
343
this.groups[i].users = this.groups[i].users.sort(rosterSort);
346
* loop users in rostergroup
348
for (var j=0; j<this.groups[i].users.length; j++) {
349
var user = this.groups[i].users[j];
351
var rosterUserClass = (this.usersHidden &&
352
(user.status == 'unavailable' ||
353
user.status == 'stalker') &&
355
this.groups[i].name != "Шлюзы")
356
? "hidden":"rosterUser";
358
A[A.length] = "<div id=\"";
359
A[A.length] = htmlEnc(user.jid);
361
A[A.length] = this.groups[i].name;
362
A[A.length] = "Entry\" class=\"";
363
A[A.length] = rosterUserClass;
364
A[A.length] = "\" onClick=\"return userClicked(this,'";
365
A[A.length] = htmlEnc(user.jid);
366
A[A.length] = "');\" title=\"";
367
A[A.length] = user.name;
369
A[A.length] = " JID: ";
370
A[A.length] = htmlEnc(user.realjid);
372
A[A.length] = " JID: ";
373
A[A.length] = htmlEnc(user.jid);
375
A[A.length] = " ";
376
A[A.length] = "Статус";
378
A[A.length] = user.status;
379
if (user.statusMsg) {
380
A[A.length] = " ";
381
A[A.length] = "Сообщение";
383
A[A.length] = htmlEnc(user.statusMsg);
385
if ((user.messages.length + user.chatmsgs.length) > 0) {
386
A[A.length] = " ";
387
A[A.length] = "Сообщений в очереди: "+(user.messages.length + user.chatmsgs.length);
390
var userImg = (user.lastsrc) ? messageImg : eval(user.status + "Led");
391
A[A.length] = "<nobr><img src=\"";
392
A[A.length] = userImg.src;
393
A[A.length] = "\" name=\"";
394
A[A.length] = htmlEnc(user.jid);
396
A[A.length] = this.groups[i].name;
397
A[A.length] = "\" width='16' height='16' border='0' align='left'>";
398
A[A.length] = "<div><span class=\"nickName\">";
399
A[A.length] = user.name;
400
A[A.length] = "</span>";
402
if (user.statusMsg) {
403
A[A.length] = "<br clear=all><nobr><span class=\"statusMsg\">";
404
A[A.length] = htmlEnc(user.statusMsg);
405
A[A.length] = "</span></nobr>";
407
A[A.length] = "</div></nobr></div>";
408
} /* END inner loop */
409
A[A.length] = "</div>";
412
this.rosterW.getElementById("roster").innerHTML = A.join('');
413
this.updateStyleIE();
416
function getUserElementId(user, group) {
417
var groupName = group.name || 'Unfiled';
418
return htmlEnc(user.jid)+"/"+groupName+"Entry";
421
function getRosterUserClass(usersHidden, user, group) {
422
return (usersHidden && (user.status == 'unavailable' || user.status == 'stalker') && !user.lastsrc && group.name != "Шлюзы" ?
423
"hidden" : "rosterUser");
426
function getRosterGroupHeaderClass(usersHidden, group) {
427
return (usersHidden && group.onlUserCount == 0 && group.messagesPending == 0 && group.name != "Шлюзы" ?
428
'rosterGroupHeaderHidden':'rosterGroupHeader');
431
function getUserElementTitle(user) {
432
var elTitle = user.name
434
elTitle += " JID: ";
435
elTitle += htmlEnc(user.realjid);
437
elTitle += " JID: ";
438
elTitle += htmlEnc(user.jid);
443
elTitle += user.status;
444
if (user.statusMsg) {
446
elTitle += "Сообщение";
448
elTitle += htmlEnc(user.statusMsg);
450
if ((user.messages.length + user.chatmsgs.length) > 0) {
452
elTitle += "Сообщений в очереди: "+(user.messages.length + user.chatmsgs.length);
457
function getUserInnerHTML(user, group) {
458
var userImg = (user.lastsrc) ? messageImg : eval(user.status + "Led");
460
A[A.length] = "<nobr><img src=\"";
461
A[A.length] = userImg.src;
462
A[A.length] = "\" name=\"";
463
A[A.length] = htmlEnc(user.jid);
465
A[A.length] = group.name;
466
A[A.length] = "\" width='16' height='16' border='0' align='left'>";
467
A[A.length] = "<div><span class=\"nickName\">";
468
A[A.length] = user.name;
469
A[A.length] = "</span>";
471
if (user.statusMsg) {
472
A[A.length] = "<br clear=all><nobr><span class=\"statusMsg\">";
473
A[A.length] = htmlEnc(user.statusMsg);
474
A[A.length] = "</span></nobr>";
476
A[A.length] = "</div></nobr>";
480
function updateRoster() {
481
for (var i=0; i<this.groups.length; i++) {
482
var group = this.groups[i];
483
group.users = group.users.sort(rosterSort);
484
var groupEl = this.rosterW.getElementById(group.name);
485
if (groupEl) { // update group
486
for (var j=0; j<group.users.length; j++) {
487
var user = group.users[j];
488
var userElId = getUserElementId(user,group);
489
var userEl = this.rosterW.getElementById(userElId);
490
if (!userEl) { // add user
491
userEl = this.rosterW.createElement('div');
492
userEl.id = userElId;
493
userEl.className = getRosterUserClass(this.usersHidden, user, group);
494
var onclickHandler = function(el, user, roster) {
496
var jid = htmlEnc(user.jid);
498
var toggler = function() { r.userClicked(e, jid); };
501
userEl.onclick = onclickHandler(userEl, user, this);//"return userClicked(this,'"+htmlEnc(user.jid)+"');";
502
userEl.title = getUserElementTitle(user);
503
userEl.innerHTML = getUserInnerHTML(user, group);
506
while (!siblingEl && k<group.users.length) {
507
siblingEl = this.rosterW.getElementById(getUserElementId(group.users[k],group));
511
groupEl.appendChild(userEl)
513
groupEl.insertBefore(userEl,siblingEl);
515
} else { // update user
516
userEl.className = getRosterUserClass(this.usersHidden, user, group);
517
userEl.title = getUserElementTitle(user);
518
var userImg = (user.lastsrc) ? messageImg : eval(user.status + "Led");
519
userEl.getElementsByTagName('img')[0].src = userImg.src;
520
var spanEls = userEl.getElementsByTagName('span');
521
spanEls[0].innerHTML = user.name
522
if (user.statusMsg) {
524
spanEls[1].innerHTML = htmlEnc(user.statusMsg);
528
A[A.length] = "<br clear='all'><nobr><span class='statusMsg'>";
529
A[A.length] = htmlEnc(user.statusMsg);
530
A[A.length] = "</span></nobr>";
531
var html = A.join('');
532
var divEls = userEl.getElementsByTagName('div');
533
if (divEls && divEls[0])
534
divEls[0].innerHTML += html;
536
// qnd: somehow IE7 doesn't like the 'nobr' here - why?
542
var groupHeaderEl = this.rosterW.getElementById(group.name+'Head');
544
groupHeaderEl.className = getRosterGroupHeaderClass(this.usersHidden, group);
546
if (this.rosterW.getElementById(group.name+'On'))
547
this.rosterW.getElementById(group.name+'On').innerHTML = group.onlUserCount;
548
if (this.rosterW.getElementById(group.name+'All'))
549
this.rosterW.getElementById(group.name+'All').innerHTML = group.users.length;
551
} else { // add group
552
var groupHeaderEl = this.rosterW.createElement('div');
553
groupHeaderEl.id = group.name+"Head";
554
groupHeaderEl.className = getRosterGroupHeaderClass(this.usersHidden, group);
555
var onclickHandler = function(group) {
556
var groupName = group.name;
557
var toggler = function() { parent.top.roster.toggleGrp(groupName); };
560
groupHeaderEl.onclick = onclickHandler(group);
562
groupEl = this.rosterW.createElement('div');
563
groupEl.id = group.name;
564
var rosterGroupClass = (
565
(this.usersHidden && group.onlUserCount == 0 &&
566
group.messagesPending == 0 &&
567
group.name != "Шлюзы")
568
|| this.hiddenGroups[group.name])
569
? 'hidden':'rosterGroup';
570
groupEl.className = rosterGroupClass;
572
var rosterEl = this.rosterW.getElementById("roster");
576
while (!siblingEl && j < this.groups.length) {
577
siblingEl = this.rosterW.getElementById(this.groups[j].name+'Head');
581
rosterEl.appendChild(groupHeaderEl)
582
rosterEl.appendChild(groupEl);
584
rosterEl.insertBefore(groupHeaderEl, siblingEl);
585
rosterEl.insertBefore(groupEl, siblingEl);
589
A[A.length] = "<nobr>";
590
var toggleImg = (this.hiddenGroups[group.name])?'images/group_close.gif':'images/group_open.gif';
591
A[A.length] = "<img src='";
592
A[A.length] = toggleImg;
593
A[A.length] ="' name='";
594
A[A.length] = group.name;
595
A[A.length] = "Img'> ";
596
A[A.length] = group.name;
597
A[A.length] = " (<span id='";
598
A[A.length] = group.name;
599
A[A.length] = "On'>";
600
A[A.length] = group.onlUserCount;
601
A[A.length] = "</span>/<span id='";// put total number in span, also - sam
602
A[A.length] = group.name;
603
A[A.length] = "All'>";
604
A[A.length] = group.users.length;
605
A[A.length] = "</span>)";
606
A[A.length] = "</nobr>";
607
groupHeaderEl.innerHTML = A.join('');
611
for (var j=0; j<group.users.length; j++) {
612
var user = group.users[j];
614
A[A.length] = "<div id=\"";
615
A[A.length] = htmlEnc(user.jid);
617
A[A.length] = group.name;
618
A[A.length] = "Entry\" class=\"";
619
A[A.length] = getRosterUserClass(this.usersHidden, user, group);
620
A[A.length] = "\" onClick=\"return userClicked(this,'";
621
A[A.length] = htmlEnc(user.jid);
622
A[A.length] = "');\" title=\"";
623
A[A.length] = getUserElementTitle(user);
625
A[A.length] = getUserInnerHTML(user, group);
626
A[A.length] = "</div>";
627
} /* END inner loop */
628
groupEl.innerHTML = A.join('');
634
// moved into Roster from iRoster.html and groupchat_iroster.html - sam
635
function RosterSelectUser(el) {
636
if(this.lastUserSelected)
637
this.lastUserSelected.className = "rosterUser";
638
el.className = "rosterUserSelected";
639
this.lastUserSelected = el;
642
function RosterUserClicked(el,jid) {
645
if (this.name == 'GroupchatRoster') {
646
return parent.top.user.roster.openChat(jid);
649
var user = parent.top.roster.getUserByJID(parent.top.cutResource(jid));
651
if(user && typeof(user.type) != 'undefined' && user.type == 'groupchat')
652
return parent.top.openGroupchat(jid);
654
if (!parent.top.isGateway(jid))
655
return parent.top.roster.openChat(jid);
658
/***********************************************************************
660
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
662
function GCRosterSort(a,b) {
663
return (a.name.toLowerCase()<b.name.toLowerCase())?-1:1;
666
function GroupchatRosterPrint() {
669
this.groups = this.groups.sort(GCRosterSort);
674
for (var i=0; i<this.groups.length; i++) {
675
var rosterGroupHeadClass = (this.groups[i].users.length == 0) ? 'rosterGroupHeaderHidden':'rosterGroupHeader';
677
A[A.length] = "<div id='";
678
A[A.length] = this.groups[i].name;
679
A[A.length] = "Head' class='";
680
A[A.length] = rosterGroupHeadClass;
681
A[A.length] = "'><nobr> ";
682
A[A.length] = this.groups[i].users.length;
684
A[A.length] = this.groups[i].name;
685
A[A.length] = "</nobr></div>";
686
A[A.length] = "<div id='";
687
A[A.length] = this.groups[i].name;
688
A[A.length] = "' class='rosterGroup'>";
690
this.groups[i].users = this.groups[i].users.sort(rosterSort);
693
* loop users in rostergroup
695
for (var j=0; j<this.groups[i].users.length; j++) {
696
var user = this.groups[i].users[j];
697
var rosterUserClass = (this.usersHidden &&
698
(user.status == 'unavailable' ||
699
user.status == 'stalker') &&
701
? "hidden":"rosterUser";
703
A[A.length] = "<div id=\"";
704
A[A.length] = htmlEnc(user.jid);
706
A[A.length] = this.groups[i].name;
707
A[A.length] = "Entry\" class=\"";
708
A[A.length] = rosterUserClass;
709
A[A.length] = "\" onClick=\"return userClicked(this,'";
710
A[A.length] = htmlEnc(user.jid).replace(/\'/g,"\\\'")+"');\" title=\"";
711
A[A.length] = user.name;
713
A[A.length] = " JID: ";
714
A[A.length] = htmlEnc(user.realjid);
716
A[A.length] = " JID: ";
717
A[A.length] = htmlEnc(user.jid);
719
A[A.length] = " ";
720
A[A.length] = "Статус";
722
A[A.length] = user.status;
723
if (user.statusMsg) {
724
A[A.length] = " ";
725
A[A.length] = "Сообщение";
727
A[A.length] = htmlEnc(user.statusMsg);
729
if ((user.messages.length + user.chatmsgs.length) > 0) {
730
A[A.length] = " ";
731
A[A.length] = "Сообщений в очереди: "+(user.messages.length + user.chatmsgs.length);
733
A[A.length] = "\"><nobr>";
734
var userImg = (user.lastsrc) ? messageImg : eval(user.status + "Led");
735
A[A.length] = "<img src=\"";
736
A[A.length] = userImg.src;
737
A[A.length] = "\" name=\"";
738
A[A.length] = htmlEnc(user.jid);
740
A[A.length] = this.groups[i].name;
741
A[A.length] = "\" width=16 height=16 border=0 align=\"left\">";
742
A[A.length] = "<div><span class=\"nickName\">";
743
A[A.length] = user.name;
744
A[A.length] = "</span>";
745
if (user.statusMsg) {
746
A[A.length] = "<br clear=all><nobr><span class=\"statusMsg\">";
747
A[A.length] = htmlEnc(user.statusMsg);
748
A[A.length] = "</span></nobr>";
750
A[A.length] = "</div></nobr></div>";
751
} /* END inner loop */
752
A[A.length] = "</div>";
755
this.rosterW.getElementById("roster").innerHTML = A.join('');
756
this.updateStyleIE();
759
function GroupchatRosterUserAdd2Group(group) {
760
this.groups = [group];
763
function GroupchatRosterUser(jid,name) {
764
this.base = RosterUser;
765
this.base(jid,'',[''],name);
766
this.jid = this.fulljid; // always use fulljid
767
this.affiliation = 'none';
770
this.add2Group = GroupchatRosterUserAdd2Group;
773
GroupchatRosterUser.prototype = new RosterUser;
775
function getRosterGetRealJIDByNick(nick) {
776
for (var i=0; i<this.users.length; i++)
777
if (this.users[i].name == nick)
778
return this.users[i].realjid;
782
function getRosterGetFullJIDByNick(nick) {
783
for (var i=0; i<this.users.length; i++)
784
if (this.users[i].name == nick)
785
return this.users[i].fulljid;
789
function getGroupchatRosterUserByJID(jid) {
790
// need to search fulljid here
791
return getElFromArrByProp(this.users,"fulljid",jid);
794
function GroupchatRoster(targetW) {
798
this.usersHidden = true;
800
this.targetW = targetW.frames.groupchatRoster;
802
this.rosterW = this.targetW.groupchatIRoster.document;
804
this.name = 'GroupchatRoster';
806
this.print = GroupchatRosterPrint;
807
this.getUserByJID = getGroupchatRosterUserByJID;
808
this.getRealJIDByNick = getRosterGetRealJIDByNick;
809
this.getFullJIDByNick = getRosterGetFullJIDByNick;
812
GroupchatRoster.prototype = new Roster();
814
// some images - no idea why they are defined here
816
var messageImg = new Image();
817
messageImg.src = "images/message.gif";
818
var grp_open_img = new Image();
819
grp_open_img.src = 'images/group_open.gif';
820
var grp_close_img = new Image();
821
grp_close_img.src = 'images/group_close.gif';
822
var arrow_right_blinking = new Image();
823
arrow_right_blinking.src = 'images/arrow_right_blinking.gif';