~ubuntu-branches/ubuntu/trusty/jwchat/trusty

« back to all changes in this revision

Viewing changes to roster.js.it

  • Committer: Bazaar Package Importer
  • Author(s): Lincoln de Sousa, Lincoln de Sousa, Marcelo Jorge Vieira
  • Date: 2010-09-16 11:42:28 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20100916114228-5s5ne28n1w6wrfbl
Tags: 1.0+dfsg-1
[Lincoln de Sousa]

* Switch to dpkg-source 3.0 (quilt) format
* Migrating package from cdbs to debhelper 7.0.50~
* Changing the rule get-orig-source to generate a dfsg compatible
  package striping swf files from the orig (Closes: #591962)
* Updated Standards-Version to 3.9.1
* Removing po-debconf from the Build-Depends-Indep list.

[Marcelo Jorge Vieira]

* Fixing the default backend
* Fixing Debugger dependency
* Changing information about packaging from old maintainers to
  Debian XMPP Team.
* Removing sound support.
* Setting a port for apache VirtualHost.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
function RosterGroup(name) {
2
 
  this.name = htmlEnc(name);
3
 
  this.users = new Array();
4
 
  this.onlUserCount = 0;
5
 
  this.messagesPending = 0;
6
 
}
7
 
 
8
 
function RosterUserAdd2Group(group) {
9
 
  this.groups = this.groups.concat(group);
10
 
}
11
 
 
12
 
function RosterUser(jid,subscription,groups,name) {
13
 
 
14
 
  this.fulljid = jid;
15
 
  this.jid = cutResource(jid) || 'unknown';
16
 
  this.jid = this.jid.toLowerCase(); // jids are case insensitive
17
 
 
18
 
  this.subscription = subscription || 'none';
19
 
  this.groups = groups || [''];
20
 
 
21
 
  if (name)
22
 
    this.name = name;
23
 
  else if (this.jid == JABBERSERVER)
24
 
    this.name = "Sistema";
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('@'));
28
 
  else
29
 
    this.name = this.jid;
30
 
 
31
 
  this.name = htmlEnc(this.name);
32
 
 
33
 
  // initialise defaults
34
 
  this.status = (this.subscription == 'from' || this.subscription == 'none') ? 'stalker' : 'unavailable';
35
 
  this.statusMsg = null;
36
 
  this.lastsrc = null;
37
 
  this.messages = new Array();
38
 
  this.chatmsgs = new Array();
39
 
  this.chatW = null; // chat window
40
 
 
41
 
  // methods
42
 
  this.add2Group = RosterUserAdd2Group;
43
 
 
44
 
}
45
 
 
46
 
function getElFromArrByProp(arr,prop,str) {
47
 
  for (var i=0; i<arr.length; i++) {
48
 
    if (arr[i][prop] == str)
49
 
      return arr[i];
50
 
  }
51
 
  return null;
52
 
}
53
 
 
54
 
function getRosterGroupByName(groupName) {
55
 
  return getElFromArrByProp(this.groups,"name",groupName);
56
 
}
57
 
 
58
 
function getRosterUserByJID(jid) {
59
 
  return getElFromArrByProp(this.users,"jid",jid.toLowerCase());
60
 
}
61
 
 
62
 
function RosterUpdateStyleIE() {
63
 
  if(!is.ie)
64
 
    return;
65
 
  this.rosterW.getElementById("roster").style.width = this.rosterW.body.clientWidth;
66
 
}
67
 
 
68
 
function RosterGetUserIcons(from) {
69
 
  var images = new Array();
70
 
  
71
 
  for (var i=0; i<this.groups.length; i++) {
72
 
    var img = this.rosterW.images[from+"/"+this.groups[i].name];
73
 
    if (img) {
74
 
      images = images.concat(img);
75
 
      continue; // skip this group
76
 
    }
77
 
  }
78
 
  return images;
79
 
}
80
 
 
81
 
function RosterToggleHide() {
82
 
  this.usersHidden = !this.usersHidden;
83
 
  this.print();
84
 
  return;
85
 
}
86
 
        
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;
93
 
  } else {
94
 
    el.className = 'hidden';
95
 
    this.hiddenGroups[name] = true;
96
 
    this.rosterW.images[name+"Img"].src = grp_close_img.src;
97
 
  }
98
 
  this.updateStyleIE();
99
 
}
100
 
 
101
 
function RosterOpenMessage(jid) {
102
 
  var user = this.getUserByJID(jid);
103
 
  var wName = makeWindowName(user.jid); 
104
 
 
105
 
  if (user.messages.length > 0 && (!user.mW || user.mW.closed)) // display messages
106
 
    user.mW = open('message.html?jid='+escape(jid),
107
 
                   "mw"+wName,
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),
111
 
                   "sw"+wName,
112
 
                   'width=320,height=200,dependent=yes,resizable=yes');
113
 
  return false;
114
 
}
115
 
 
116
 
function RosterOpenChat(jid) {
117
 
 
118
 
  var user = this.getUserByJID(jid);
119
 
 
120
 
  if (!user)
121
 
    return;
122
 
 
123
 
  if (user.messages.length > 0 && (!user.mW || user.mW.closed)) // display messages
124
 
    this.openMessage(jid);
125
 
                
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();
132
 
}
133
 
 
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();
146
 
  }
147
 
}
148
 
 
149
 
function RosterUpdateGroupForUser(user) {
150
 
  for (var j=0; j<user.groups.length; j++) {
151
 
    if (user.groups.length > 1 && user.groups[j] == '')
152
 
      continue;
153
 
    var groupName = (user.groups[j] == '') ? "Non ordinato" : user.groups[j];
154
 
    var group = this.getGroupByName(groupName);
155
 
    if(group == null) {
156
 
      group = new RosterGroup(groupName);
157
 
      this.groups = this.groups.concat(group);
158
 
    }
159
 
    group.users = group.users.concat(user);
160
 
  }
161
 
}
162
 
        
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++) {
170
 
    var remove = true;
171
 
    for (var j=0; j<this.groups.length; j++) {
172
 
      if (oldGroups[i].name == this.groups[j].name) {
173
 
        remove = false;
174
 
        break;
175
 
}
176
 
    }
177
 
    if (remove) {
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);
183
 
    }
184
 
  }
185
 
}
186
 
 
187
 
function RosterUserAdd(user) {
188
 
  this.users = this.users.concat(user);
189
 
        
190
 
  // add to groups
191
 
  this.updateGroupsForUser(user);
192
 
  return user;
193
 
}
194
 
 
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); }
206
 
      }
207
 
      break;
208
 
    }
209
 
  }
210
 
  this.updateGroups();
211
 
}
212
 
 
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;
218
 
  return groupchats;
219
 
}
220
 
        
221
 
function Roster(items,targetW) {
222
 
  this.users = new Array();
223
 
  this.groups = new Array();
224
 
  this.hiddenGroups = new Array();
225
 
  this.name = 'Roster';
226
 
 
227
 
  this.rosterW = targetW;
228
 
  this.lastUserSelected = null; // moved into Roster from iRoster.html and groupchat_iroster.html - sam
229
 
 
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;
249
 
 
250
 
  /* setup groups */
251
 
  if (!items)
252
 
    return;
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')
256
 
      continue;
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));
264
 
  }
265
 
}
266
 
 
267
 
function rosterSort(a,b) {
268
 
//   if (typeof(a.name) != 'string' || typeof(b.name) != 'string')
269
 
//     return 0;
270
 
  return (a.name.toLowerCase()<b.name.toLowerCase())?-1:1;
271
 
}
272
 
 
273
 
function printRoster() {
274
 
        
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++;
284
 
    }
285
 
  }
286
 
 
287
 
  this.groups = this.groups.sort(rosterSort);
288
 
 
289
 
  if (this.rosterW.getElementById('roster').innerHTML.search(/\S/) > -1) {
290
 
    this.update(); // update dom, rather than redrawing roster
291
 
    return;
292
 
  }
293
 
 
294
 
  var A = new Array();
295
 
 
296
 
        /* ***
297
 
         * loop rostergroups 
298
 
         */
299
 
  for (var i=0; i<this.groups.length; i++) {
300
 
 
301
 
    var rosterGroupHeadClass = (this.usersHidden && 
302
 
                                this.groups[i].onlUserCount == 0 && 
303
 
                                this.groups[i].messagesPending == 0 && 
304
 
                                this.groups[i].name != "Gateways") 
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 != "Gateways") 
334
 
                            || this.hiddenGroups[this.groups[i].name])
335
 
      ? 'hidden':'rosterGroup';
336
 
 
337
 
    A[A.length] =  "<div id='";
338
 
                A[A.length] = this.groups[i].name;
339
 
                A[A.length] = "' class='";
340
 
                A[A.length] = rosterGroupClass;
341
 
                A[A.length] = "'>";
342
 
    
343
 
    this.groups[i].users = this.groups[i].users.sort(rosterSort);
344
 
 
345
 
                /* ***
346
 
                 * loop users in rostergroup 
347
 
                 */
348
 
    for (var j=0; j<this.groups[i].users.length; j++) {
349
 
      var user = this.groups[i].users[j];
350
 
 
351
 
      var rosterUserClass = (this.usersHidden && 
352
 
                             (user.status == 'unavailable' || 
353
 
                              user.status == 'stalker') && 
354
 
                             !user.lastsrc && 
355
 
                             this.groups[i].name != "Gateways") 
356
 
        ? "hidden":"rosterUser";
357
 
 
358
 
      A[A.length] = "<div id=\"";
359
 
                        A[A.length] = htmlEnc(user.jid);
360
 
                        A[A.length] = "/";
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;
368
 
                        if (user.realjid) {
369
 
                                A[A.length] = "&#10;JID: ";
370
 
                                A[A.length] = htmlEnc(user.realjid);
371
 
                        } else {
372
 
                                A[A.length] = "&#10;JID: ";
373
 
                                A[A.length] = htmlEnc(user.jid);
374
 
                        }
375
 
                        A[A.length] = "&#10;";
376
 
                        A[A.length] = "Stato";
377
 
                        A[A.length] = ": ";
378
 
                        A[A.length] = user.status;
379
 
      if (user.statusMsg) {
380
 
        A[A.length] = "&#10;";
381
 
                                A[A.length] = "Messaggio";
382
 
                                A[A.length] = ": ";
383
 
                                A[A.length] = htmlEnc(user.statusMsg);
384
 
                        }
385
 
                        if ((user.messages.length + user.chatmsgs.length) > 0) {
386
 
                                A[A.length] = "&#10;";
387
 
                                A[A.length] = ""+(user.messages.length + user.chatmsgs.length)+" messaggio/i in sospeso";
388
 
                        }
389
 
      A[A.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);
395
 
                        A[A.length] = "/";
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>";
401
 
 
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>";
406
 
                        }
407
 
      A[A.length] =  "</div></nobr></div>";
408
 
    } /* END inner loop */
409
 
    A[A.length] =  "</div>";
410
 
  }
411
 
 
412
 
  this.rosterW.getElementById("roster").innerHTML = A.join('');
413
 
  this.updateStyleIE();
414
 
}
415
 
 
416
 
function getUserElementId(user, group) {
417
 
  var groupName = group.name || 'Unfiled';
418
 
  return htmlEnc(user.jid)+"/"+groupName+"Entry";
419
 
}
420
 
 
421
 
function getRosterUserClass(usersHidden, user, group) {
422
 
  return (usersHidden && (user.status == 'unavailable' || user.status == 'stalker') && !user.lastsrc && group.name != "Gateways" ?
423
 
          "hidden" : "rosterUser");
424
 
}
425
 
 
426
 
function getRosterGroupHeaderClass(usersHidden, group) {
427
 
  return (usersHidden && group.onlUserCount == 0 && group.messagesPending == 0 && group.name != "Gateways" ?
428
 
         'rosterGroupHeaderHidden':'rosterGroupHeader');
429
 
}
430
 
 
431
 
function getUserElementTitle(user) {
432
 
  var elTitle = user.name
433
 
  if (user.realjid) {
434
 
    elTitle += "&#10;JID: ";
435
 
    elTitle += htmlEnc(user.realjid);
436
 
  } else {
437
 
    elTitle += "&#10;JID: ";
438
 
    elTitle += htmlEnc(user.jid);
439
 
  }
440
 
  elTitle += "&#10;";
441
 
  elTitle += "Stato";
442
 
  elTitle += ": ";
443
 
  elTitle += user.status;
444
 
  if (user.statusMsg) {
445
 
    elTitle += "&#10;";
446
 
    elTitle += "Messaggio";
447
 
    elTitle += ": ";
448
 
    elTitle += htmlEnc(user.statusMsg);
449
 
  }
450
 
  if ((user.messages.length + user.chatmsgs.length) > 0) {
451
 
    elTitle += "&#10;";
452
 
    elTitle += ""+(user.messages.length + user.chatmsgs.length)+" messaggio/i in sospeso";
453
 
  }
454
 
  return elTitle;
455
 
}
456
 
 
457
 
function getUserInnerHTML(user, group) {
458
 
  var userImg = (user.lastsrc) ? messageImg : eval(user.status + "Led");
459
 
  var A = new Array();
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);
464
 
  A[A.length] = "/";
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>";
470
 
 
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>";
475
 
  }
476
 
  A[A.length] =  "</div></nobr>";
477
 
  return A.join('');
478
 
}
479
 
 
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) {
495
 
            var e = el;
496
 
            var jid = htmlEnc(user.jid);
497
 
            var r = roster;
498
 
            var toggler = function() { r.userClicked(e, jid); };
499
 
            return toggler;
500
 
          }
501
 
          userEl.onclick = onclickHandler(userEl, user, this);//"return userClicked(this,'"+htmlEnc(user.jid)+"');";
502
 
          userEl.title = getUserElementTitle(user);
503
 
          userEl.innerHTML = getUserInnerHTML(user, group);
504
 
          var siblingEl;
505
 
          var k = j+1;
506
 
          while (!siblingEl && k<group.users.length) {
507
 
            siblingEl = this.rosterW.getElementById(getUserElementId(group.users[k],group));
508
 
            k++;
509
 
          }
510
 
          if (!siblingEl) {
511
 
            groupEl.appendChild(userEl)
512
 
          } else {
513
 
            groupEl.insertBefore(userEl,siblingEl);
514
 
          }
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) {
523
 
            if (spanEls[1]) {
524
 
              spanEls[1].innerHTML = htmlEnc(user.statusMsg);
525
 
            } else {
526
 
              try {
527
 
                var A = new Array();
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;
535
 
              } catch(e) {
536
 
                // qnd: somehow IE7 doesn't like the 'nobr' here - why?
537
 
              }                
538
 
            }
539
 
          }
540
 
        }
541
 
      } // done with users
542
 
      var groupHeaderEl = this.rosterW.getElementById(group.name+'Head');
543
 
      if (groupHeaderEl) {
544
 
        groupHeaderEl.className = getRosterGroupHeaderClass(this.usersHidden, group);
545
 
 
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;
550
 
      }
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); };
558
 
        return toggler;
559
 
      }
560
 
      groupHeaderEl.onclick = onclickHandler(group);
561
 
 
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 != "Gateways")
568
 
            || this.hiddenGroups[group.name])
569
 
        ? 'hidden':'rosterGroup';
570
 
      groupEl.className = rosterGroupClass;
571
 
 
572
 
      var rosterEl = this.rosterW.getElementById("roster");  
573
 
 
574
 
      var siblingEl;
575
 
      var j = i + 1;
576
 
      while (!siblingEl && j < this.groups.length) {
577
 
        siblingEl = this.rosterW.getElementById(this.groups[j].name+'Head');
578
 
        j++;
579
 
      }
580
 
      if (!siblingEl) {
581
 
        rosterEl.appendChild(groupHeaderEl)
582
 
        rosterEl.appendChild(groupEl);
583
 
      } else {
584
 
        rosterEl.insertBefore(groupHeaderEl, siblingEl);
585
 
        rosterEl.insertBefore(groupEl, siblingEl);
586
 
      }
587
 
 
588
 
      var A = new Array();
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('');
608
 
 
609
 
 
610
 
      A = new Array();
611
 
      for (var j=0; j<group.users.length; j++) {
612
 
        var user = group.users[j];
613
 
 
614
 
        A[A.length] = "<div id=\"";
615
 
        A[A.length] = htmlEnc(user.jid);
616
 
        A[A.length] = "/";
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);
624
 
        A[A.length] = "\">";
625
 
        A[A.length] = getUserInnerHTML(user, group);
626
 
        A[A.length] =  "</div>";
627
 
      } /* END inner loop */
628
 
      groupEl.innerHTML = A.join('');
629
 
 
630
 
    }
631
 
  }
632
 
}
633
 
 
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;
640
 
}
641
 
 
642
 
function RosterUserClicked(el,jid) {
643
 
  this.selectUser(el);
644
 
 
645
 
  if (this.name == 'GroupchatRoster') {
646
 
    return parent.top.user.roster.openChat(jid);
647
 
  }
648
 
 
649
 
  var user = parent.top.roster.getUserByJID(parent.top.cutResource(jid));
650
 
 
651
 
        if(user && typeof(user.type) != 'undefined' && user.type == 'groupchat')
652
 
                return parent.top.openGroupchat(jid);
653
 
 
654
 
        if (!parent.top.isGateway(jid))
655
 
                return parent.top.roster.openChat(jid);
656
 
}
657
 
 
658
 
/***********************************************************************
659
 
 * GROUPCHAT ROSTER
660
 
 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
661
 
 */
662
 
function GCRosterSort(a,b) {
663
 
  return (a.name.toLowerCase()<b.name.toLowerCase())?-1:1;
664
 
}
665
 
 
666
 
function GroupchatRosterPrint() {
667
 
  var A = new Array();
668
 
  
669
 
  this.groups = this.groups.sort(GCRosterSort);
670
 
 
671
 
  /* ***
672
 
   * loop rostergroups 
673
 
   */
674
 
  for (var i=0; i<this.groups.length; i++) {
675
 
    var rosterGroupHeadClass = (this.groups[i].users.length == 0) ? 'rosterGroupHeaderHidden':'rosterGroupHeader';
676
 
 
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>&nbsp;";
682
 
    A[A.length] = this.groups[i].users.length;
683
 
                A[A.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'>";
689
 
    
690
 
    this.groups[i].users = this.groups[i].users.sort(rosterSort);
691
 
 
692
 
                /* ***
693
 
                 * loop users in rostergroup 
694
 
                 */
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') && 
700
 
                             !user.lastsrc) 
701
 
        ? "hidden":"rosterUser";
702
 
      
703
 
      A[A.length] = "<div id=\"";
704
 
                        A[A.length] = htmlEnc(user.jid);
705
 
                        A[A.length] = "/";
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;
712
 
                        if (user.realjid) {
713
 
                                A[A.length] = "&#10;JID: ";
714
 
                                A[A.length] = htmlEnc(user.realjid);
715
 
                        } else {
716
 
                                A[A.length] = "&#10;JID: ";
717
 
                                A[A.length] = htmlEnc(user.jid);
718
 
                        }
719
 
                        A[A.length] = "&#10;";
720
 
                        A[A.length] = "Stato";
721
 
                        A[A.length] = ": ";
722
 
                        A[A.length] = user.status;
723
 
      if (user.statusMsg) {
724
 
        A[A.length] = "&#10;";
725
 
                                A[A.length] = "Messaggio";
726
 
                                A[A.length] = ": ";
727
 
                                A[A.length] = htmlEnc(user.statusMsg);
728
 
                        }
729
 
                        if ((user.messages.length + user.chatmsgs.length) > 0) {
730
 
                                A[A.length] = "&#10;";
731
 
                                A[A.length] = ""+(user.messages.length + user.chatmsgs.length)+" messaggio/i in sospeso";
732
 
                        }
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);
739
 
                        A[A.length] = "/";
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>";
749
 
                        }
750
 
      A[A.length] = "</div></nobr></div>";
751
 
    } /* END inner loop */
752
 
    A[A.length] = "</div>";
753
 
  }
754
 
 
755
 
  this.rosterW.getElementById("roster").innerHTML = A.join('');
756
 
  this.updateStyleIE();
757
 
}
758
 
 
759
 
function GroupchatRosterUserAdd2Group(group) {
760
 
  this.groups = [group];
761
 
}
762
 
 
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';
768
 
  this.role = 'none';
769
 
 
770
 
  this.add2Group = GroupchatRosterUserAdd2Group;
771
 
}
772
 
 
773
 
GroupchatRosterUser.prototype = new RosterUser;
774
 
 
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;
779
 
  return null;
780
 
}
781
 
 
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;
786
 
  return null;
787
 
}
788
 
                        
789
 
function getGroupchatRosterUserByJID(jid) {
790
 
  // need to search fulljid here
791
 
  return getElFromArrByProp(this.users,"fulljid",jid);
792
 
}
793
 
 
794
 
function GroupchatRoster(targetW) {
795
 
 
796
 
  this.base = Roster;
797
 
  this.base(null);
798
 
  this.usersHidden = true;
799
 
 
800
 
  this.targetW = targetW.frames.groupchatRoster;
801
 
 
802
 
  this.rosterW = this.targetW.groupchatIRoster.document;
803
 
 
804
 
  this.name = 'GroupchatRoster';
805
 
 
806
 
  this.print = GroupchatRosterPrint;
807
 
  this.getUserByJID = getGroupchatRosterUserByJID;
808
 
  this.getRealJIDByNick = getRosterGetRealJIDByNick;
809
 
  this.getFullJIDByNick = getRosterGetFullJIDByNick;
810
 
}
811
 
 
812
 
GroupchatRoster.prototype = new Roster();
813
 
 
814
 
// some images - no idea why they are defined here
815
 
 
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';
824