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

« back to all changes in this revision

Viewing changes to jwchat.html.fr

  • 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
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
 
<html>
3
 
  <head>
4
 
    <title>JWChat</title>
5
 
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
6
 
 
7
 
    <script type="text/javascript" src="config.js"></script>
8
 
    <script type="text/javascript" src="shared.js"></script>
9
 
    <script type="text/javascript" src="browsercheck.js"></script>
10
 
    <script type="text/javascript" src="sounds.js"></script>
11
 
    <script type="text/javascript" src="statusLed.js"></script>
12
 
 
13
 
<!-- JabberConnection -->
14
 
    <script type="text/javascript" src="jsjac.js"></script>
15
 
 
16
 
<!-- Debugger -->
17
 
    <script type="text/javascript" src="Debugger.js"></script>
18
 
 
19
 
    <script type="text/javascript">
20
 
<!--
21
 
 
22
 
 /* ***
23
 
  * JWChat, a web based jabber client
24
 
  * Copyright (C) 2003-2008 Stefan Strigler <steve@zeank.in-berlin.de>
25
 
  *
26
 
  * This program is free software; you can redistribute it and/or
27
 
  * modify it under the terms of the GNU General Public License
28
 
  * as published by the Free Software Foundation; either version 2
29
 
  * of the License, or (at your option) any later version.
30
 
  *
31
 
  * This program is distributed in the hope that it will be useful,
32
 
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
33
 
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34
 
  * GNU General Public License for more details.
35
 
  *
36
 
  * You should have received a copy of the GNU General Public License
37
 
  * along with this program; if not, write to the Free Software
38
 
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
39
 
  *
40
 
  * Please visit http://jwchat.sourceforge.net for more information!
41
 
  */
42
 
 
43
 
/************************************************************************
44
 
 *                       ******  GLOBAL WARS(tm) *******
45
 
 ************************************************************************
46
 
 */
47
 
var jid;
48
 
var pass;
49
 
var register = false; // whether to register new account
50
 
var nick;
51
 
var vcard;
52
 
var status = '';
53
 
var onlstat = '';
54
 
var onlmsg = '';
55
 
var onlprio = '8';
56
 
var autoPopup = true;
57
 
var autoPopupAway = false;
58
 
var playSounds = true;
59
 
var focusWindows = true;
60
 
var timestamps = false;
61
 
var usersHidden = false;
62
 
var enableLog = false;
63
 
var loghost;
64
 
 
65
 
/* some globals */
66
 
var roster;
67
 
var fmd; // frames.main.document
68
 
var disco; // holds information from service discovery
69
 
 
70
 
var statusLed;
71
 
var statusMsg;
72
 
 
73
 
var onlstatus = new Object();
74
 
onlstatus["available"] = "en ligne";
75
 
onlstatus["chat"] = "dispo pour le chat";
76
 
onlstatus["away"] = "absent";
77
 
onlstatus["xa"] = "pas disponible";
78
 
onlstatus["dnd"] = "Ne pas déranger";
79
 
onlstatus["invisible"] = "invisible";
80
 
onlstatus["unavailable"] = "hors ligne";
81
 
 
82
 
 
83
 
/************************************************************************
84
 
 *                         ****** Pop-Up's *******
85
 
 ************************************************************************
86
 
 */
87
 
 
88
 
function openGroupchat(aJid,nick,pass) {
89
 
  pass = pass || '';
90
 
  nick = nick || '';
91
 
 
92
 
  var user = roster.getUserByJID(aJid);
93
 
  try {
94
 
  if(!user) {
95
 
    user = roster.addUser(new RosterUser(aJid,'',["Salons de discussion"],aJid.substring(0,aJid.indexOf('@'))));
96
 
    user.type = 'groupchat';
97
 
    roster.print();
98
 
  }
99
 
  } catch(e) { Debug.log(e.message, 1); }
100
 
  if (!user.chatW || user.chatW.closed)
101
 
    user.chatW = open("groupchat.html?jid="+escape(aJid)+"&nick="+escape(nick)+"&pass="+escape(pass),"gchatW"+makeWindowName(aJid+"/"+nick),"width=520,height=390,resizable=yes");
102
 
  user.chatW.focus();
103
 
}
104
 
 
105
 
var subw;
106
 
function openSubscription(aJid) {
107
 
  var param = (aJid) ? "?jid="+escape(aJid) : "";
108
 
  subw = open("subscription.html"+param,"sub","width=320,height=240,resizable=yes");
109
 
  subw.focus();
110
 
  return false;
111
 
}
112
 
 
113
 
function openCustomPresence(aJid) {
114
 
  var user = roster.getUserByJID(aJid);
115
 
  if (!user)
116
 
    return;
117
 
  if (!user.onlStatW || user.onlStatW.closed)
118
 
    user.onlStatW = open("changestatus.html?jid="+escape(aJid),"onlStatW","width=330,height=240,resizable=yes");
119
 
  user.onlStatW.focus();
120
 
  return false;
121
 
}
122
 
 
123
 
function sendCustomPresence(aJid,presence,msg) {
124
 
  var oPresence = new JSJaCPresence();
125
 
  oPresence.setTo(aJid);
126
 
  if (roster.getUserByJID(aJid).roster)
127
 
    oPresence.setXMLNS();
128
 
 
129
 
  switch (presence) {
130
 
  case 'offline':
131
 
    oPresence.setType('unavailable');
132
 
  case 'unavailable':
133
 
    oPresence.setType('unavailable');
134
 
    presence = "invisible";
135
 
  default:
136
 
    if (presence != 'available')
137
 
      oPresence.setShow(presence);
138
 
  }
139
 
  
140
 
  if (typeof(msg) != 'undefined' && msg != '')
141
 
    oPresence.setStatus(msg);
142
 
  
143
 
  Debug.log(oPresence.xml(),2);
144
 
  con.send(oPresence);
145
 
}
146
 
 
147
 
function openUserProps(aJid) {
148
 
  open("userprops.html?jid="+escape(aJid),"uProps"+makeWindowName(aJid),"width=480,height=360,resizable=yes");
149
 
  return false;
150
 
}
151
 
 
152
 
function removeUser(aJid) {
153
 
  // get fulljid
154
 
  var fulljid = roster.getUserByJID(aJid).fulljid;
155
 
 
156
 
  var iq = new JSJaCIQ();
157
 
  iq.setType('set');
158
 
  var query = iq.setQuery('jabber:iq:roster');
159
 
  var item = query.appendChild(iq.getDoc().createElement('item'));
160
 
  item.setAttribute('jid',fulljid);
161
 
  item.setAttribute('subscription','remove');
162
 
 
163
 
  con.send(iq);
164
 
}
165
 
 
166
 
var vcardW; // my vcardW;
167
 
function openUserInfo(aJid) {
168
 
  var newin = open("vcard.html?jid="+escape(aJid),"vcardW"+makeWindowName(aJid),"width=400,height=580,scrollbars=yes");
169
 
 
170
 
  if (cutResource(aJid) == cutResource(jid))
171
 
    vcardW = newin;
172
 
  else {
173
 
    var user = roster.getUserByJID(cutResource(aJid));
174
 
    if (!user) {
175
 
      user = new RosterUser(aJid);
176
 
      roster.addUser(user);
177
 
    }
178
 
    if (user.roster) // groupchat(!)
179
 
      user = user.roster.getUserByJID(aJid);
180
 
    user.vcardW = newin;
181
 
  }
182
 
 
183
 
  return false;
184
 
}
185
 
 
186
 
function openUserHistory(aJid) {
187
 
 
188
 
  if (typeof(loghost) == 'undefined' || loghost == '')
189
 
    return;
190
 
 
191
 
  var user = roster.getUserByJID(aJid);
192
 
 
193
 
  if (user == null)
194
 
    return;
195
 
 
196
 
  if (!user.histW || user.histW.closed)
197
 
    user.histW = open("userhist.html?jid="+escape(aJid),"histW"+makeWindowName(aJid),"width=600,height=400,resizable=yes,scrollbars=no");
198
 
  user.histW.focus();
199
 
}
200
 
 
201
 
function openUserNote(aJid) { /* store annotations to a user */
202
 
  var user = roster.getUserByJID(aJid);
203
 
  
204
 
  if (user == null)
205
 
    return; // unbelievable
206
 
  
207
 
  if (!user.noteW || user.noteW.closed)
208
 
    user.noteW = open("usernote.html?jid="+escape(aJid),"noteW"+makeWindowName(aJid),"width=300,height=200,resizable=yes,scrollbars=no");
209
 
  user.noteW.focus();
210
 
}
211
 
 
212
 
var searchW;
213
 
function openSearch() {
214
 
  if (!searchW || searchW.closed)
215
 
    searchW = open("search.html","searchW"+makeWindowName(jid),"width=480,height=260,resizable=yes,scrollbars=yes");
216
 
  searchW.focus();
217
 
  return false;
218
 
}
219
 
 
220
 
var ebW
221
 
function openEditBookmarks() {
222
 
  if (!ebW || ebW.closed)
223
 
    ebW = open("editbookmarks.html","ebw"+makeWindowName(jid),"width=330,height=290,resizable=yes");
224
 
  return false;
225
 
}
226
 
 
227
 
 
228
 
/************************************************************************
229
 
 * nifty helpers - always there if you need 'em
230
 
 ************************************************************************
231
 
 */
232
 
 
233
 
/* command line history */
234
 
var messageHistory = new Array();
235
 
var historyIndex = 0;
236
 
function getHistory(key, message) {
237
 
  if ((key == "up") && (historyIndex > 0)) historyIndex--;
238
 
  if ((key == "down") && (historyIndex < messageHistory.length)) historyIndex++;
239
 
  if (historyIndex >= messageHistory.length) {
240
 
    if (historyIndex == messageHistory.length) return '';
241
 
    return message;
242
 
  } else {
243
 
    return messageHistory[historyIndex];
244
 
  }
245
 
}
246
 
 
247
 
function addtoHistory(message) {
248
 
  if (is.ie5)
249
 
    messageHistory = messageHistory.concat(message);
250
 
  else
251
 
    messageHistory.push(message);
252
 
  historyIndex = messageHistory.length;
253
 
}
254
 
 
255
 
/* system sounds */
256
 
var soundPlaying = false;
257
 
function soundLoaded() {
258
 
        soundPlaying = false;
259
 
}
260
 
 
261
 
function playSound(action) {
262
 
  if (!playSounds)
263
 
    return;
264
 
 
265
 
  if(!SOUNDS[action]) {
266
 
    Debug.log("no sound for '" + action + "'",1);
267
 
    return;
268
 
  }
269
 
 
270
 
  if (onlstat != '' && onlstat != 'available' && onlstat != 'chat')
271
 
    return;
272
 
  
273
 
  if (soundPlaying)
274
 
    return;
275
 
  
276
 
  soundPlaying = true;
277
 
        
278
 
  var frameD = frames["jwc_sound"].document;
279
 
 
280
 
  var html = "<embed src=\""+SOUNDS[action]+"\" width=\"1\" height=\"1\" quality=\"high\" pluginspage=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"application/x-shockwave-flash\">";
281
 
  frameD.open();
282
 
  frameD.write(html);
283
 
  frameD.close();
284
 
}
285
 
 
286
 
 
287
 
function isGateway(aJid) {
288
 
  aJid = cutResource(aJid);
289
 
  for (var i in disco) {
290
 
    if (!disco[i].getNode) continue;
291
 
    if (i == aJid)
292
 
      if (disco[i].getNode().getElementsByTagName('identity').item(0)) {
293
 
        if (disco[i].getNode().getElementsByTagName('identity').item(0).getAttribute('category') == 'gateway')
294
 
          return true;
295
 
      }
296
 
  }
297
 
  return false;
298
 
}
299
 
 
300
 
/************************************************************************
301
 
 *                       ******  CHANGESTATUS   *******
302
 
 ************************************************************************
303
 
 */
304
 
 
305
 
function sendPresence2Groupchats(gc,val,away) {
306
 
  var aPresence;
307
 
  for (var i=0; i<gc.length; i++) {
308
 
    aPresence = new JSJaCPresence();
309
 
    //aPresence.setXMLNS();
310
 
    aPresence.setTo(gc[i]);
311
 
    if (away && away != '')
312
 
      aPresence.setStatus(away);
313
 
    if (val != 'available')
314
 
      aPresence.setShow(val);
315
 
    con.send(aPresence);
316
 
  }
317
 
}
318
 
 
319
 
function changeStatus(val,away,prio) {
320
 
  
321
 
  Debug.log("changeStatus: "+val+","+away+","+prio, 2);
322
 
 
323
 
  onlstat = val;
324
 
  if (away)
325
 
    onlmsg = away;
326
 
  
327
 
  if (prio && !isNaN(prio))
328
 
    onlprio = prio;
329
 
  
330
 
  if (!con.connected() && val != 'offline') {
331
 
    init();
332
 
    return;
333
 
  }
334
 
  
335
 
  var aPresence = new JSJaCPresence();
336
 
  
337
 
  switch(val) {
338
 
  case "unavailable":
339
 
    val = "invisible";
340
 
      aPresence.setType('invisible');
341
 
    break;
342
 
  case "offline":
343
 
    val = "unavailable";
344
 
    aPresence.setType('unavailable');
345
 
    con.send(aPresence);
346
 
    con.disconnect();
347
 
    var img = eval(val+"Led");
348
 
    statusLed.src = img.src;
349
 
    if (away)
350
 
      statusMsg.value = away;
351
 
    else
352
 
      statusMsg.value = onlstatus[val];
353
 
    cleanUp();
354
 
    return;
355
 
    break;
356
 
  case "available":
357
 
    val = 'available'; // needed for led in status bar
358
 
    if (away)
359
 
      aPresence.setStatus(away);
360
 
    if (prio && !isNaN(prio))
361
 
      aPresence.setPriority(prio);
362
 
    else
363
 
      aPresence.setPriority(onlprio);                   
364
 
    break;
365
 
  case "chat":
366
 
    if (prio && !isNaN(prio))
367
 
      aPresence.setPriority(prio);
368
 
    else
369
 
      aPresence.setPriority(onlprio);                   
370
 
  default:
371
 
    if (away)
372
 
      aPresence.setStatus(away);
373
 
    
374
 
    if (prio && !isNaN(prio))
375
 
      aPresence.setPriority(prio);
376
 
    else
377
 
      aPresence.setPriority('0');
378
 
    
379
 
    aPresence.setShow(val);
380
 
  }
381
 
  
382
 
  con.send(aPresence);
383
 
  
384
 
  /* send presence to chatrooms
385
 
   */
386
 
  if (typeof(roster) != 'undefined' && onlstat != 'invisible') {
387
 
    sendPresence2Groupchats(roster.getGroupchats(),onlstat,onlmsg);
388
 
  }
389
 
 
390
 
  var img = eval(val+"Led");
391
 
  statusLed.src = img.src;
392
 
  if (away)
393
 
    statusMsg.value = away;
394
 
  else
395
 
    statusMsg.value = onlstatus[val];
396
 
}
397
 
 
398
 
/************************************************************************
399
 
 *                   ***** EVENT - HANDLER *****
400
 
 ************************************************************************
401
 
 */
402
 
 
403
 
 
404
 
/************************************************************************
405
 
 * handleMessage
406
 
 ************************************************************************
407
 
 */
408
 
function handleMessage(oMsg) {
409
 
 
410
 
  Debug.log(oMsg.xml(),2);
411
 
 
412
 
  if (oMsg.getType() == 'error')
413
 
    return;
414
 
  
415
 
  /* check if this is a groupchat invite */
416
 
  var x = oMsg.getChild('x','http://jabber.org/protocol/muc#user');
417
 
  
418
 
  if (x) {
419
 
    var from, to, reason, pass;
420
 
    to = oMsg.getFrom();
421
 
    var aInvite = x.getElementsByTagName('invite').item(0);
422
 
    from = aInvite.getAttribute('from');
423
 
    if (aInvite.firstChild && aInvite.firstChild.nodeName == 'reason' && aInvite.firstChild.firstChild)
424
 
      reason = aInvite.firstChild.firstChild.nodeValue;
425
 
    if (x.getElementsByTagName('password').item(0))
426
 
      pass = x.getElementsByTagName('password').item(0).firstChild.nodeValue;
427
 
    Debug.log("You have been invited to " + jid + " pass " + pass + " by " + from + "\nreason:" + reason,2);
428
 
    var user = roster.getUserByJID(cutResource(from));
429
 
    if (!user) {// users not in roster (yet)
430
 
      Debug.log("creating new user "+from,3);
431
 
      user = roster.addUser(new RosterUser(cutResource(from)));
432
 
      user.lastsrc = eval(user.status + "Led").src;
433
 
      roster.print();
434
 
    }
435
 
    
436
 
    if (typeof(user.iwArr) == 'undefined')
437
 
      user.iwArr = new Array();
438
 
    
439
 
    user.iwArr[to] = open("groupchat_invite.html?to="+escape(to)+"&from="+escape(from)+"&pass="+escape(pass)+"&reason="+escape(reason),"iw"+makeWindowName(to),"width=320,height=320,resizable=yes");
440
 
    
441
 
    return;
442
 
  }
443
 
  
444
 
  var from = cutResource(oMsg.getFrom());
445
 
  var type = oMsg.getType();
446
 
  Debug.log("from: "+from+"\noMsg.getFrom(): "+oMsg.getFrom(),3);
447
 
 
448
 
  var user = roster.getUserByJID(from);
449
 
  if (user == null) {// users not in roster (yet)
450
 
    Debug.log("creating new user "+from,3);
451
 
    user = roster.addUser(new RosterUser(from));
452
 
    user.lastsrc = eval(user.status + "Led").src;
453
 
    roster.print();
454
 
  }
455
 
 
456
 
  Debug.log("got user jid: "+user.jid,3);
457
 
 
458
 
  var aRoster = roster;
459
 
  if (type != 'groupchat' && user.roster && from != oMsg.getFrom()) { // private groupchat message
460
 
    aRoster = user.roster;
461
 
    from = oMsg.getFrom(); // use from with resource (had been cut off first)
462
 
    user = user.roster.getUserByJID(from);
463
 
  }
464
 
 
465
 
  /* change icon in roster - but not if it's a groupchat item */
466
 
  if (type != 'groupchat') {
467
 
    if (!user.lastsrc)
468
 
      user.lastsrc = eval(user.status + "Led").src;
469
 
      
470
 
    var images = aRoster.getUserIcons(from);
471
 
    for (var i=0; i<images.length; i++)
472
 
      images[i].src = messageImg.src;
473
 
 
474
 
    /* user is not visible right now - make him pop up (lastsrc changed!) */
475
 
    if (aRoster.usersHidden && user.status == 'unavailable')
476
 
      aRoster.print();
477
 
  }
478
 
  
479
 
  // set current timestamp
480
 
  var x;
481
 
  for (var i=0; i<oMsg.getNode().getElementsByTagName('x').length; i++)
482
 
    if (oMsg.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:delay') {
483
 
      x = oMsg.getNode().getElementsByTagName('x').item(i);
484
 
      break;
485
 
    }
486
 
  
487
 
  if (x) {
488
 
    Debug.log("found offline message: "+x.getAttribute('stamp'),3);
489
 
    var stamp = x.getAttribute('stamp');
490
 
    oMsg.jwcTimestamp = new Date(Date.UTC(stamp.substring(0,4),stamp.substring(4,6)-1,stamp.substring(6,8),stamp.substring(9,11),stamp.substring(12,14),stamp.substring(15,17)));
491
 
  } else
492
 
    oMsg.jwcTimestamp = new Date();
493
 
  
494
 
  if (type == 'chat') {
495
 
    
496
 
    user.chatmsgs = user.chatmsgs.concat(oMsg);
497
 
    
498
 
    if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) {
499
 
      user.chatW.popMsgs();
500
 
      playSound('chat_recv');
501
 
    } else if (autoPopup && (autoPopupAway || onlstat == "available" || onlstat == "chat")) {
502
 
      aRoster.openChat(from);
503
 
      playSound('chat_recv');
504
 
    } else {
505
 
      if (focusWindows) window.focus();
506
 
      playSound('chat_queue');
507
 
 
508
 
      // let arrow blink for toggled groups
509
 
      for (var i=0; i<user.groups.length; i++) {
510
 
        if (user.groups[i] != '') {
511
 
          if (roster.hiddenGroups[user.groups[i]])
512
 
            fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;
513
 
        }                                       
514
 
      }
515
 
    }
516
 
 
517
 
  } else if (type == 'groupchat') {
518
 
 
519
 
    /* handle groupchat message 
520
 
     */
521
 
 
522
 
    user.chatmsgs = user.chatmsgs.concat(oMsg);
523
 
    if (user.chatW && !user.chatW.closed && user.chatW.srcW && typeof(user.chatW.srcW.roster) != 'undefined' && user.chatW.popMsgs) {
524
 
      user.chatW.popMsgs();
525
 
    } 
526
 
    
527
 
    playSound('chat_recv');
528
 
    
529
 
  } else {
530
 
    if (oMsg.getBody() == '') // don't show empty messages like PEP message or stuff
531
 
      return;
532
 
    user.messages = user.messages.concat(oMsg);
533
 
    if (autoPopup && (autoPopupAway || onlstat == "available" || onlstat == "chat") && (!user.mW || user.mW.closed)) {
534
 
      aRoster.openMessage(from);
535
 
      playSound('message_recv');
536
 
    } else if (user.mW && !user.mW.closed && user.messages.length > 0 && user.mW.document.forms[0]) {
537
 
      user.mW.document.forms[0].nextButton.disabled = false;
538
 
      if (focusWindows) user.mW.focus();
539
 
      playSound('message_recv');
540
 
    }   else {
541
 
      if (focusWindows) window.focus();
542
 
      playSound('message_queue');
543
 
      // let arrow blink for toggled groups
544
 
      for (var i=0; i<user.groups.length; i++) {
545
 
        if (user.groups[i] != '') {
546
 
          if (roster.hiddenGroups[user.groups[i]])
547
 
            fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;
548
 
        }                                       
549
 
      }
550
 
      
551
 
    }
552
 
 
553
 
    // [TODO] zeank 2005-10-26
554
 
    // archiving of single/plain messages
555
 
  }
556
 
}
557
 
 
558
 
/************************************************************************
559
 
 * handleMessageError
560
 
 ************************************************************************
561
 
 */
562
 
var error_messages = new Array();
563
 
var errorW;
564
 
function handleMessageError(oMsg) {
565
 
 
566
 
  if (oMsg.getType() != 'error')
567
 
    return;
568
 
  
569
 
  Debug.log(oMsg.xml(),2);
570
 
  
571
 
  var user = roster.getUserByJID(cutResource(oMsg.getFrom()));
572
 
  
573
 
  if (user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
574
 
    var error = oMsg.getNode().getElementsByTagName('error').item(0);
575
 
    if (error) {
576
 
      if (error.getElementsByTagName('text').item(0)) {
577
 
        user.chatW.putMsgHTML(oMsg);
578
 
        playSound('error');
579
 
        return;
580
 
      }
581
 
    }
582
 
  }
583
 
  
584
 
  error_messages = error_messages.concat(oMsg);
585
 
  
586
 
  if (!errorW || errorW.closed)
587
 
    errorW = open("error_message.html","errorW"+makeWindowName(jid),"width=360,height=270,dependent=yes,resizable=yes");
588
 
  else if (error_messages.length > 0 && errorW.document.forms[0])
589
 
    errorW.document.forms[0].nextButton.disabled = false;
590
 
  
591
 
  playSound('error');
592
 
  
593
 
  errorW.focus();
594
 
}
595
 
 
596
 
/************************************************************************
597
 
 * handlePresence
598
 
 ************************************************************************
599
 
 */
600
 
 
601
 
function handlePresence(presence) {
602
 
  Debug.log(presence.xml(),2);
603
 
 
604
 
  var from = cutResource(presence.getFrom());
605
 
  var type = presence.getType();
606
 
  var show = presence.getShow();
607
 
  var status = presence.getStatus();
608
 
 
609
 
  var aRoster = roster;
610
 
 
611
 
  // roster subscriptions synchronisation
612
 
  var x;
613
 
  if (isGateway(from.substring(from.indexOf('@')+1))) {
614
 
    var x = null;
615
 
    if (presence.getChild('x', 'http://jabber.org/protocol/roster-subsync'))
616
 
      x = presence.getChild('x', 'http://jabber.org/protocol/roster-subsync');
617
 
    else if (presence.getChild('x', 'http://delx.cjb.net/protocol/roster-subsync'))
618
 
      x = presence.getChild('x', 'http://delx.cjb.net/protocol/roster-subsync');
619
 
    
620
 
    if (x) {
621
 
 
622
 
      Debug.log("detected roster-subsync presence",2);
623
 
 
624
 
      var items = x.getElementsByTagName("item");
625
 
      for (var i=0; i<items.length; i++) {
626
 
        var aItem = items.item(i);
627
 
        if (type == 'subscribe' && aItem.getAttribute("subscription") == 'both') {
628
 
          // insert into roster
629
 
          var aIQ = new JSJaCIQ();
630
 
          aIQ.setType('set');
631
 
          var query = aIQ.setQuery('jabber:iq:roster');
632
 
          var bItem = query.appendChild(aIQ.getDoc().createElement('item'));
633
 
          bItem.setAttribute('jid',from);
634
 
          if (aItem.getAttribute('name') && aItem.getAttribute('name') != '')
635
 
            bItem.setAttribute('name',aItem.getAttribute('name'));
636
 
          else 
637
 
            bItem.setAttribute('name',from.substring(0,from.lastIndexOf('@')).replace(/%/,'@'));
638
 
          var itemGroups = aItem.getElementsByTagName("group");
639
 
          for (var j=0; j<itemGroups.length; j++)
640
 
            bItem.appendChild(itemGroups.item(j));
641
 
          
642
 
          Debug.log("roster-subsync setting roster:"+aIQ.xml(),2);
643
 
          
644
 
          con.send(aIQ);
645
 
          
646
 
          // Approve Subscription Request
647
 
          var aPresence = new JSJaCPresence();
648
 
          aPresence.setTo(from);
649
 
          aPresence.setType('subscribed');
650
 
          con.send(aPresence);
651
 
          
652
 
          // Subscribe to gateway contact's presence
653
 
          var bPresence = new JSJaCPresence();
654
 
          bPresence.setTo(from);
655
 
          bPresence.setType('subscribe');
656
 
          con.send(bPresence);    
657
 
        }
658
 
      }
659
 
      return;
660
 
    }
661
 
  }
662
 
  
663
 
  switch (type) {
664
 
  case null:
665
 
  case '':
666
 
    break;
667
 
  case 'subscribe':
668
 
    if (isGateway(from)) { // automatically subscribe gateways
669
 
      
670
 
      // Approve Subscription Request
671
 
      var aPresence = new JSJaCPresence();
672
 
      aPresence.setTo(presence.getFrom());
673
 
      aPresence.setType('subscribed');
674
 
      con.send(aPresence);
675
 
      
676
 
      // Subscribe to Gateway's Presence
677
 
      var bPresence = new JSJaCPresence();
678
 
      bPresence.setTo(presence.getFrom());
679
 
      bPresence.setType('subscribe');
680
 
      con.send(bPresence);
681
 
    }   else {
682
 
      if (status)
683
 
        window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240");
684
 
      else
685
 
        window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240");
686
 
    }
687
 
    return;
688
 
  case 'unsubscribe':
689
 
    if (!isGateway(from))
690
 
      alert("On t'a enlevé l'autorisation de "+presence.getFrom()+" ."); /* [TODO] don't use alert here */
691
 
    break;
692
 
  case 'error':
693
 
    var user = roster.getUserByJID(from);
694
 
    if (user && user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
695
 
      if (presence.getNode().getElementsByTagName('error').item(0)) {
696
 
        var error = presence.getNode().getElementsByTagName('error').item(0);
697
 
        if (error.getElementsByTagName('text').item(0))
698
 
          user.chatW.putMsgHTML(presence);
699
 
        else if (error.firstChild && error.firstChild.nodeValue)
700
 
          user.chatW.putMsgHTML(error.firstChild.nodeValue,new Date(),from,null,true);                                                          
701
 
      }
702
 
      
703
 
    }
704
 
  }
705
 
  
706
 
  var user = roster.getUserByJID(from);
707
 
  if (!user) { // presence from unsubscribed user
708
 
    Debug.log("presence from "+from+" not found on roster", 2);
709
 
    return;
710
 
  }
711
 
  
712
 
  /* handle presence for MUC */
713
 
  x = null; // reset
714
 
  for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
715
 
    if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
716
 
      x = presence.getNode().getElementsByTagName('x').item(i);
717
 
      break;
718
 
    }
719
 
  
720
 
  if (user.roster && x) {
721
 
    Debug.log("muc presence detected", 2);
722
 
    var ofrom = presence.getFrom().substring(presence.getFrom().indexOf('/')+1);
723
 
    
724
 
    Debug.log("jabber.from:"+presence.getFrom()+", ofrom:"+ofrom,3);
725
 
    
726
 
    var ouser = user.roster.getUserByJID(presence.getFrom());
727
 
    if (!ouser) // no user? create one!
728
 
      ouser = new GroupchatRosterUser(presence.getFrom(),ofrom);
729
 
    
730
 
    var item = x.getElementsByTagName('item').item(0);
731
 
    
732
 
    ouser.affiliation = item.getAttribute('affiliation');
733
 
    ouser.role = item.getAttribute('role');
734
 
    ouser.nick = item.getAttribute('nick');
735
 
    ouser.realjid = item.getAttribute('jid');
736
 
    if (item.getElementsByTagName('reason').item(0))
737
 
      ouser.reason = item.getElementsByTagName('reason').item(0).firstChild.nodeValue;
738
 
    if (actor = item.getElementsByTagName('actor').item(0)) {
739
 
      if (actor.getAttribute('jid') != null)
740
 
        ouser.actor = actor.getAttribute('jid');
741
 
      else if (item.getElementsByTagName('actor').item(0).firstChild != null)
742
 
                                ouser.actor = item.getElementsByTagName('actor').item(0).firstChild.nodeValue;
743
 
    }
744
 
    if (ouser.role != '') {
745
 
      ouser.add2Group(ouser.role+'s');
746
 
      
747
 
      /* check if it is our own presence
748
 
       * must be done here cause we want to be sure that role != ''
749
 
       */
750
 
      
751
 
      if (ouser.name == htmlEnc(user.roster.nick)) { // seems to be me
752
 
        user.roster.me = ouser; // store this reference
753
 
        if (user.chatW.updateMe)
754
 
          user.chatW.updateMe();
755
 
      }
756
 
    }
757
 
    
758
 
    Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3);
759
 
    
760
 
    
761
 
    var nickChanged = false;
762
 
    if (x.getElementsByTagName('status').item(0)) {
763
 
      var code = x.getElementsByTagName('status').item(0).getAttribute('code');
764
 
      switch (code) {
765
 
      case '201': // room created
766
 
        /* popup dialog to ask for whether to accept default
767
 
         * configuration or make a custom room 
768
 
         */
769
 
        if (confirm("Un nouveau salon est créé, mais attend que tu le configures. Veux-tu personnaliser la configuration maintenant ?\nNB: Clique 'Cancel' pour utiliser une configuration par défaut!"))
770
 
          user.chatW.openConfig();
771
 
        else {
772
 
          var iq = new JSJaCIQ();
773
 
          iq.setType('set');
774
 
          iq.setTo(user.jid);
775
 
          var query = iq.setQuery('http://jabber.org/protocol/muc#owner');
776
 
          query.appendChild(
777
 
                iq.buildNode('x', {'xmlns': NS_XDATA, 'type': 'submit'}));
778
 
          
779
 
          con.send(iq);
780
 
        }
781
 
        break;
782
 
      case '303': // nick change
783
 
        // display message
784
 
        if (!ouser.nick)
785
 
          return;
786
 
        
787
 
        var oMsg = new JSJaCMessage();
788
 
        oMsg.setFrom(user.jid);
789
 
        oMsg.setBody(""+ouser.name+" s'appelle désormais "+htmlEnc(ouser.nick));
790
 
        user.chatmsgs = user.chatmsgs.concat(oMsg);
791
 
        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
792
 
          user.chatW.popMsgs();
793
 
        
794
 
        // update nick if it's me
795
 
        if (ouser.name == htmlEnc(user.roster.nick))
796
 
          user.roster.nick = ouser.nick;
797
 
        
798
 
        // remove old user
799
 
        var aChatW = ouser.chatW;
800
 
        user.roster.removeUser(ouser);
801
 
        
802
 
        // add new user
803
 
        ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick);
804
 
        
805
 
        if (aChatW && !aChatW.closed) {
806
 
          ouser.chatW = aChatW;
807
 
          ouser.chatW.user = ouser;
808
 
        }
809
 
        user.roster.addUser(ouser);
810
 
        nickChanged = true;
811
 
        break;
812
 
      case '301': // user has been kicked
813
 
        var oMsg = new JSJaCMessage();
814
 
        oMsg.setFrom(user.jid);
815
 
        var body;
816
 
        if (ouser.actor)
817
 
          body = ""+ouser.name+" has been banned by "+ouser.actor;
818
 
        else
819
 
          body = ""+ouser.name+" has been banned";
820
 
        if (ouser.reason)
821
 
          body += ": " + ouser.reason;
822
 
        oMsg.setBody(body);
823
 
        user.chatmsgs = user.chatmsgs.concat(oMsg);
824
 
        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
825
 
          user.chatW.popMsgs();                 
826
 
        
827
 
        playSound('chat_recv');
828
 
        break;
829
 
      case '307': // user has been kicked
830
 
        var oMsg = new JSJaCMessage();
831
 
        oMsg.setFrom(user.jid);
832
 
        var body;
833
 
        if (ouser.actor)
834
 
          body = ""+ouser.name+" has been kicked by "+ouser.actor;
835
 
        else
836
 
          body = ""+ouser.name+" has been kicked";
837
 
        if (ouser.reason)
838
 
          body += ": " + ouser.reason;
839
 
        oMsg.setBody(body);
840
 
        user.chatmsgs = user.chatmsgs.concat(oMsg);
841
 
        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
842
 
          user.chatW.popMsgs(); 
843
 
        
844
 
        playSound('chat_recv');
845
 
        break;
846
 
      }
847
 
    }
848
 
    
849
 
    Debug.log("<"+ouser.name+"> affiliation:"+ouser.affiliation+", role:"+ouser.role,3);
850
 
 
851
 
    if (!user.roster.getUserByJID(presence.getFrom()) && !nickChanged) {
852
 
      // add user
853
 
      user.roster.addUser(ouser);
854
 
      
855
 
      // show join message
856
 
      var oMsg = new JSJaCMessage();
857
 
      oMsg.setFrom(user.jid);
858
 
      oMsg.setBody(""+ouser.name+" est en ligne");
859
 
      user.chatmsgs = user.chatmsgs.concat(oMsg);
860
 
      if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
861
 
        user.chatW.popMsgs();                   
862
 
      
863
 
      playSound('online');
864
 
      
865
 
    } else if (presence.getType() == 'unavailable' && !nickChanged) {
866
 
      // show part message
867
 
      var oMsg = new JSJaCMessage();
868
 
      oMsg.setFrom(user.jid);
869
 
      var body = ""+ouser.name+" est parti(e)";
870
 
      if (presence.getStatus())
871
 
        body += ": " + presence.getStatus();
872
 
      oMsg.setBody(body);
873
 
      user.chatmsgs = user.chatmsgs.concat(oMsg);
874
 
      if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
875
 
        user.chatW.popMsgs();                   
876
 
      
877
 
      playSound('offline');
878
 
      
879
 
    } else
880
 
      user.roster.updateGroups();
881
 
    
882
 
    // relink roster and user
883
 
    aRoster = user.roster;
884
 
    user = ouser;
885
 
  } 
886
 
 
887
 
  if (show) {
888
 
    if (user.status == 'unavailable')
889
 
      playSound('online');
890
 
    // fix broken pressenc status
891
 
    if (show != 'chat' && show != 'away' && show != 'xa' && show != 'dnd')
892
 
      show = 'available';
893
 
    user.status = show;
894
 
  } else if (type) {
895
 
    if (type == 'unsubscribe') {
896
 
      user.subscription = 'from';
897
 
      user.status = 'stalker';
898
 
    } else if (user.status != 'stalker')
899
 
      user.status = 'unavailable';
900
 
    if (aRoster.name == 'GroupchatRoster' && !nickChanged) { // it's a groupchat roster
901
 
      // remove user
902
 
      if (!user.chatW || user.chatW.closed)
903
 
        aRoster.removeUser(user); // we don't need offline users in there
904
 
    }
905
 
    playSound('offline');
906
 
  } else {
907
 
    if (user.status == 'unavailable') // user was offline before
908
 
      playSound('online');
909
 
    user.status = 'available';
910
 
  }
911
 
 
912
 
  var img = eval(user.status+"Led");
913
 
  
914
 
  if (user.lastsrc) // message is pending
915
 
    user.lastsrc = img.src;
916
 
  
917
 
  // show away message
918
 
  if (status)
919
 
    user.statusMsg = status;
920
 
  else
921
 
    user.statusMsg = null;
922
 
  
923
 
  // update presence indicator of chat window
924
 
  if (user.chatW && !user.chatW.closed && user.chatW.updateUserPresence) 
925
 
    user.chatW.updateUserPresence();
926
 
 
927
 
  aRoster.print(); // update roster
928
 
}
929
 
 
930
 
/************************************************************************
931
 
 * handleIQSet
932
 
 ************************************************************************
933
 
 */
934
 
 
935
 
function handleIQSet(iq) {
936
 
  if (iq.getType() != "set") {
937
 
    Debug.log("not handling iq:\n"+iq.xml(),3);
938
 
    return;
939
 
  }
940
 
  
941
 
  Debug.log("got iq type 'set':\n"+iq.xml(),2);
942
 
  
943
 
  if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far
944
 
    Debug.log("not handling iq:\n"+iq.xml(),1);
945
 
    return;
946
 
  }
947
 
  
948
 
  for (var i=0; i<iq.getQuery().childNodes.length; i++) {
949
 
    var item = iq.getQuery().childNodes.item(i);
950
 
    var user = roster.getUserByJID(cutResource(item.getAttribute('jid')));
951
 
    if (user) {
952
 
      user.subscription = item.getAttribute('subscription');
953
 
      if (item.getAttribute('subscription') == 'remove') {
954
 
        Debug.log("removing user " + user.jid,2);
955
 
        roster.removeUser(user);
956
 
      } else { // update user
957
 
        user.name = item.getAttribute('name')? htmlEnc(item.getAttribute('name')) : item.getAttribute('jid');
958
 
        user.groups = new Array('');
959
 
        for (var j=0; j<item.childNodes.length; j++)
960
 
          if (item.childNodes.item(j).nodeName == 'group')
961
 
            user.groups = user.groups.concat(item.childNodes.item(j).firstChild.nodeValue);
962
 
        roster.updateGroups();
963
 
      }
964
 
    } else {// got a new user
965
 
      if (isGateway(item.getAttribute('jid'))) { // auto add gateways
966
 
        // get name
967
 
        var name = cutResource(item.getAttribute('jid'));
968
 
        for (var i in disco) {
969
 
          if (typeof(disco[i]) != 'object') continue;
970
 
          if (i == cutResource(item.getAttribute('jid')))
971
 
            name = disco[i].getQuery().getElementsByTagName('identity').item(0).getAttribute('name');
972
 
        }
973
 
 
974
 
        // add to roster
975
 
        var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name);
976
 
        //aUser.fulljid = item.getAttribute('jid');
977
 
        roster.addUser(aUser);
978
 
        
979
 
        // set name and group
980
 
        var aIQ = new JSJaCIQ();
981
 
        aIQ.setType('set');
982
 
        var query = aIQ.setQuery('jabber:iq:roster');
983
 
        var aItem = query.appendChild(aIQ.getDoc().createElement('item'));
984
 
        aItem.setAttribute('jid',item.getAttribute('jid'));
985
 
        aItem.setAttribute('name',name);
986
 
        aItem.appendChild(iq.getDoc().createElement('group')).appendChild(iq.getDoc().createTextNode('Gateways'));
987
 
        
988
 
        con.send(aIQ);
989
 
      } else { // new but not a gateway
990
 
        var name = item.getAttribute('name')? item.getAttribute('name') : item.getAttribute('jid');
991
 
        if (name.indexOf('@') != -1)
992
 
          name = name.substring(0,name.indexOf('@'));
993
 
        
994
 
        item.setAttribute('name',name);
995
 
        var groups = new Array('');
996
 
        for (var j=0; j<item.childNodes.length; j++)
997
 
          if (item.childNodes.item(j).nodeName == 'group')
998
 
            groups = groups.concat(item.childNodes.item(j).firstChild.nodeValue);
999
 
        
1000
 
        roster.addUser(new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),groups,name));
1001
 
        
1002
 
        var aIQ = new JSJaCIQ();
1003
 
        aIQ.setType('set');
1004
 
        var query = aIQ.setQuery('jabber:iq:roster');
1005
 
        
1006
 
        var aItem = item.cloneNode(true);
1007
 
        aItem.removeAttribute('subscription');
1008
 
        query.appendChild(aItem);
1009
 
        
1010
 
        con.send(aIQ); // set stripped name
1011
 
        
1012
 
        if (item.getAttribute('subscription') == "from" && item.getAttribute('ask') != 'subscribe')
1013
 
          openSubscription(item.getAttribute('jid')); // subscribe to user
1014
 
      }
1015
 
    }
1016
 
  }
1017
 
  roster.print();
1018
 
}
1019
 
 
1020
 
function handleConError(e) {
1021
 
  switch (e.getAttribute('code')) {
1022
 
  case '401':
1023
 
    alert("Authorization failed");
1024
 
    if (!con.connected())
1025
 
      window.close();
1026
 
    break;
1027
 
  case '409':
1028
 
    alert("Registration failed!\n\nPlease choose a different username!");
1029
 
    break;
1030
 
  case '503':
1031
 
    alert("Service unavailable");
1032
 
    break;
1033
 
  case '500':
1034
 
    if (!con.connected() && !logoutCalled && onlstat != 'offline')
1035
 
      if (confirm("Internal Server Error.\n\nDisconnected.\n\nReconnect?"))
1036
 
        changeStatus(onlstat,onlmsg);
1037
 
    break;
1038
 
  default:
1039
 
    alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :)
1040
 
    break;
1041
 
  }
1042
 
}
1043
 
 
1044
 
function handleDisconnect() {
1045
 
  if (logoutCalled || onlstat == 'offline')
1046
 
    return;
1047
 
  
1048
 
  // disconnecting not with onunload handler triggered
1049
 
  statusLed.src = unavailableLed.src; // offline icon
1050
 
  statusMsg.value = '';
1051
 
  
1052
 
  fmd.getElementById('roster').innerHTML = '';
1053
 
  
1054
 
//      if (confirm("Disconnected\n\nReconnect?"))
1055
 
//              changeStatus(onlstat,onlmsg);
1056
 
}
1057
 
 
1058
 
function handleConnected() {
1059
 
 
1060
 
  Debug.log("Connected",0);
1061
 
  
1062
 
  if (register && opener && opener.document.forms[0] && opener.document.forms[0].register)
1063
 
    opener.document.forms[0].register.checked = false; 
1064
 
  
1065
 
  /* get/setup roster */
1066
 
  iq = new JSJaCIQ();
1067
 
  iq.setIQ(null,'get','roster_1');
1068
 
  iq.setQuery('jabber:iq:roster');
1069
 
  con.send(iq,getRoster); // cascading information retrieval
1070
 
}
1071
 
 
1072
 
/* *** cascading onconnect handlers *** */
1073
 
function getRoster(iq) {
1074
 
  if (!iq || iq.getType() != 'result') {
1075
 
    if (iq)
1076
 
      Debug.log("Error fetching roster:\n"+iq.xml(),1);
1077
 
    else
1078
 
      Debug.log("Error fetching roster",1);
1079
 
    return;
1080
 
  }
1081
 
  
1082
 
  Debug.log("got roster:\n"+iq.xml(),2);
1083
 
  
1084
 
  roster = new Roster(iq.getQuery().childNodes,fmd);
1085
 
  roster.usersHidden = usersHidden;
1086
 
  roster.nick = jid.substring(0,jid.indexOf('@')); // remember nick for 1:1 Chats
1087
 
  
1088
 
  // get saved state
1089
 
  iq = new JSJaCIQ();
1090
 
  iq.setIQ(null,'get','jwchat_state');
1091
 
  var query = iq.setQuery('jabber:iq:private');
1092
 
  query.appendChild(
1093
 
        iq.buildNode('jwchat', {'xmlns': 'jwchat:state'}));
1094
 
 
1095
 
  con.send(iq,getSavedState);
1096
 
}
1097
 
 
1098
 
function getSavedState(iq) {
1099
 
  if (!iq || iq.getType() != 'result') {
1100
 
    if (iq)
1101
 
      Debug.log("Error retrieving saved state:\n"+iq.xml(),1);
1102
 
    else
1103
 
      Debug.log("Error retrieving saved state",1);
1104
 
  
1105
 
  } else {
1106
 
    Debug.log(iq.xml(), 2);
1107
 
    var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
1108
 
    for (var i=0; i<jNode.childNodes.length; i++) {
1109
 
      var item = jNode.childNodes.item(i);
1110
 
          try {
1111
 
                switch (item.nodeName) {
1112
 
                case 'presence': 
1113
 
                  if (onlstat == '' && item.firstChild.nodeValue != 'offline')
1114
 
                        onlstat = item.firstChild.nodeValue;
1115
 
                  break;
1116
 
                case 'onlmsg': 
1117
 
                  onlmsg = item.firstChild.nodeValue;
1118
 
                  break;
1119
 
                case 'hiddenGroups':
1120
 
                  var hiddenGroups = item.firstChild.nodeValue.split(',');
1121
 
                  for (var j=0; j<hiddenGroups.length; j++)
1122
 
                        if (hiddenGroups[j] != '')
1123
 
                          roster.hiddenGroups[hiddenGroups[j]] = true;
1124
 
                }
1125
 
          } catch(e) { Debug.log(e.toString(), 1); }
1126
 
    }
1127
 
  }
1128
 
  
1129
 
  // get prefs
1130
 
  iq = new JSJaCIQ();
1131
 
  iq.setIQ(null,'get','jwchat_prefs');
1132
 
  var query = iq.setQuery('jabber:iq:private');
1133
 
  query.appendChild(
1134
 
        iq.buildNode('jwchat', {'xmlns': 'jwchat:prefs'}));
1135
 
  
1136
 
  con.send(iq,getPrefs);
1137
 
}
1138
 
 
1139
 
function getPrefs(iq) {
1140
 
  if (!iq || iq.getType() != 'result')
1141
 
    if (iq)
1142
 
      Debug.log("Error retrieving preferences:\n"+iq.xml(), 1);
1143
 
    else
1144
 
      Debug.log("Error retrieving preferences",1);
1145
 
  
1146
 
  if (iq && iq.getType() == 'result') {
1147
 
    Debug.log(iq.xml() ,2);
1148
 
    if (iq.getNode().getElementsByTagName('jwchat').item(0)) {
1149
 
      var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
1150
 
      for (var i=0; i<jNode.childNodes.length; i++) {
1151
 
                try {
1152
 
                  switch (jNode.childNodes.item(i).nodeName) {
1153
 
        case 'usersHidden':
1154
 
          if (eval(jNode.childNodes.item(i).firstChild.nodeValue) != usersHidden)
1155
 
            roster.toggleHide();
1156
 
          break;
1157
 
        case 'timerval':
1158
 
          timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1159
 
          con.setPollInterval(timerval);
1160
 
          break;
1161
 
        case 'autoPopup':
1162
 
          autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1163
 
          break;
1164
 
        case 'autoPopupAway':
1165
 
          autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1166
 
          break;
1167
 
        case 'playSounds':
1168
 
          playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1169
 
          break;
1170
 
        case 'focusWindows':
1171
 
          focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1172
 
          break;
1173
 
        case 'timestamps':
1174
 
          timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1175
 
          break;
1176
 
        case 'enableLog':
1177
 
          enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1178
 
          break;
1179
 
                  }
1180
 
                } catch(e) { Debug.log(e.toString(),1); }
1181
 
      }
1182
 
    }
1183
 
  }
1184
 
  
1185
 
  // print roster
1186
 
  roster.print();
1187
 
  
1188
 
  if (opener.prio)
1189
 
    onlprio = opener.prio;
1190
 
  else
1191
 
    onlprio = DEFAULTPRIORITY;
1192
 
  
1193
 
  // send presence
1194
 
  if (onlstat == '')
1195
 
    onlstat = 'available';
1196
 
  changeStatus(onlstat,onlmsg,onlprio);
1197
 
  
1198
 
  playSound('connected');
1199
 
  
1200
 
  // Start Service Discovery
1201
 
  iq = new JSJaCIQ();
1202
 
  iq.setIQ(con.domain,'get','disco_item_1');
1203
 
  iq.setQuery('http://jabber.org/protocol/disco#items');
1204
 
  
1205
 
  con.send(iq,getDiscoItems);
1206
 
  
1207
 
  // get bookmarks
1208
 
  iq = new JSJaCIQ();
1209
 
  iq.setIQ(null,'get','storage_bookmarks');
1210
 
  var query = iq.setQuery('jabber:iq:private');
1211
 
  query.appendChild(
1212
 
        iq.buildNode('storage', {'xmlns': 'storage:bookmarks'}));
1213
 
  
1214
 
  con.send(iq,getBookmarks);
1215
 
  
1216
 
  // get annotations
1217
 
  iq = new JSJaCIQ();
1218
 
  iq.setIQ(null,'get','jwchat_notes');
1219
 
  var query = iq.setQuery('jabber:iq:private');
1220
 
  query.appendChild(
1221
 
        iq.buildNode('storage', {'xmlns': 'storage:rosternotes'}));
1222
 
  
1223
 
  con.send(iq,getAnnotations);
1224
 
}
1225
 
 
1226
 
function getDiscoItems(iq) {
1227
 
  if (!iq)
1228
 
    return;
1229
 
  
1230
 
  Debug.log(iq.xml(),2);
1231
 
  
1232
 
  disco = new Object();
1233
 
  
1234
 
  var items = iq.getNode().firstChild.childNodes;
1235
 
  
1236
 
  /* query items */
1237
 
  for (var i=0; i<items.length; i++) {
1238
 
    if (items[i].nodeName != 'item' || !items[i].getAttribute('jid') || items[i].getAttribute('node')!=null) // skip those
1239
 
      continue;
1240
 
    var aIQ = new JSJaCIQ();
1241
 
    aIQ.setIQ(items[i].getAttribute('jid'),'get','disco_info_'+i);
1242
 
    aIQ.setQuery("http://jabber.org/protocol/disco#info");
1243
 
    
1244
 
    con.send(aIQ,getDiscoInfo);
1245
 
  }
1246
 
}
1247
 
 
1248
 
function getDiscoInfo(iq) {
1249
 
  if (!iq || iq.getType() != 'result')
1250
 
    return;
1251
 
  
1252
 
  Debug.log(iq.xml(),2);
1253
 
  if (iq.getType() == 'result') {
1254
 
    disco[iq.getFrom()] = iq;
1255
 
    
1256
 
    // If the identity does not have a name, set the name to jid
1257
 
    if(iq.getNode().getElementsByTagName('identity').item(0).getAttribute('name') == null)
1258
 
      iq.getNode().getElementsByTagName('identity').item(0).setAttribute('name', iq.getFrom());
1259
 
    
1260
 
    // set loghost
1261
 
    if (iq.getNode().getElementsByTagName('identity').item(0)) {
1262
 
      if (iq.getNode().getElementsByTagName('identity').item(0).getAttribute('type') == 'archive') {
1263
 
        for (var j=0; j<iq.getNode().getElementsByTagName('feature').length; j++) {
1264
 
          if (iq.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'http://jabber.org/protocol/archive') {
1265
 
            loghost = iq.getFrom();
1266
 
            break;
1267
 
          }
1268
 
        }
1269
 
      }
1270
 
    }
1271
 
  }
1272
 
}
1273
 
 
1274
 
var bookmarks;
1275
 
function getBookmarks(iq) {
1276
 
  if (!iq || iq.getType() != 'result')
1277
 
    return;
1278
 
  
1279
 
  Debug.log(iq.xml(),2);
1280
 
  
1281
 
  bookmarks = new Array();
1282
 
 
1283
 
  if (iq.getNode().getElementsByTagName('storage').item(0)) {
1284
 
    var jNode = iq.getNode().getElementsByTagName('storage').item(0);
1285
 
    for (var i=0; i<jNode.childNodes.length; i++) {
1286
 
      var item = jNode.childNodes.item(i);
1287
 
      if (item.nodeName == 'conference') {
1288
 
        var bookmark = new Object();
1289
 
        bookmark.jid = item.getAttribute('jid');
1290
 
        bookmark.name = item.getAttribute('name');
1291
 
        if (item.getAttribute('autojoin') == '1')
1292
 
          bookmark.autojoin = '1';
1293
 
        if (item.getElementsByTagName('nick').item(0))
1294
 
          bookmark.nick = item.getElementsByTagName('nick').item(0).firstChild.nodeValue;
1295
 
        if (item.getElementsByTagName('pass').item(0))
1296
 
          bookmark.pass = item.getElementsByTagName('pass').item(0).firstChild.nodeValue;
1297
 
        bookmarks[bookmarks.length] = bookmark;
1298
 
        if (bookmark.autojoin == '1') {
1299
 
          openGroupchat(bookmark.jid, bookmark.nick, bookmark.pass);
1300
 
        }
1301
 
      }
1302
 
    }
1303
 
  }
1304
 
}
1305
 
 
1306
 
var annotations;
1307
 
function getAnnotations(iq) {
1308
 
  if (!iq || iq.getType() != 'result')
1309
 
    return;
1310
 
        
1311
 
  Debug.log(iq.xml(),2);
1312
 
        
1313
 
  annotations = new Object();
1314
 
 
1315
 
  if (iq.getType() == 'result') {
1316
 
    if (iq.getNode().getElementsByTagName('storage').item(0)) {
1317
 
      var jNode = iq.getNode().getElementsByTagName('storage').item(0);
1318
 
      for (var i=0; i<jNode.childNodes.length; i++)
1319
 
        if (jNode.childNodes.item(i).nodeName == 'note' && jNode.childNodes.item(i).firstChild)
1320
 
          annotations[jNode.childNodes.item(i).getAttribute('jid')] = jNode.childNodes.item(i).firstChild.nodeValue;
1321
 
    }
1322
 
  }
1323
 
}
1324
 
 
1325
 
 
1326
 
/************************************************************************
1327
 
 *                       ******  END HANDLERS  ******* 
1328
 
 ************************************************************************
1329
 
 */
1330
 
 
1331
 
 
1332
 
/************************************************************************
1333
 
 *                           ******  INIT  *******
1334
 
 ************************************************************************
1335
 
 */
1336
 
var con, Debug, srcW;
1337
 
function init() {
1338
 
 
1339
 
  /* initialise debugger */
1340
 
  if (!Debug || typeof(Debug) == 'undefined' || !Debug.start) {
1341
 
    if (typeof(Debugger) != 'undefined')
1342
 
      Debug = new Debugger(DEBUG_LVL,'JWChat ' + cutResource(jid));
1343
 
    else {
1344
 
      Debug = new Object();
1345
 
      Debug.log = function() {};
1346
 
      Debug.start = function() {};
1347
 
    }
1348
 
  }
1349
 
  if (DEBUG &&  (!USE_DEBUGJID || DEBUGJID == cutResource(jid)))
1350
 
    Debug.start();
1351
 
  
1352
 
  Debug.log("jid: "+jid+"\npass: "+pass,2);
1353
 
 
1354
 
  /* get some refs to static elements */
1355
 
  statusLed = frames["jwc_main"].document.getElementById('statusLed');
1356
 
  statusMsg = frames["jwc_main"].document.getElementById('statusMsg');
1357
 
  fmd = frames["jwc_main"].iRoster.document;
1358
 
  
1359
 
  /* set title */
1360
 
  document.title = "JWChat - " + nick;
1361
 
 
1362
 
  /* set nick */
1363
 
  frames["jwc_main"].document.getElementById('myNickname').innerHTML = nick;  
1364
 
 
1365
 
  /* init empty roster */
1366
 
  roster = new Roster();
1367
 
  
1368
 
  /* ***
1369
 
   * create new connection
1370
 
   */
1371
 
  var oArg = {oDbg: Debug, httpbase: HTTPBASE, timerval: timerval};
1372
 
  
1373
 
  if (BACKEND_TYPE == 'binding')
1374
 
    con = new JSJaCHttpBindingConnection(oArg);
1375
 
  else
1376
 
    con = new JSJaCHttpPollingConnection(oArg);
1377
 
  
1378
 
  /* register handlers */
1379
 
  con.registerHandler('iq',handleIQSet);
1380
 
  con.registerHandler('presence',handlePresence);
1381
 
  con.registerHandler('message',handleMessage);
1382
 
  con.registerHandler('message',handleMessageError);
1383
 
  con.registerHandler('ondisconnect',handleDisconnect);
1384
 
  con.registerHandler('onconnect',handleConnected);
1385
 
  con.registerHandler('onerror',handleConError);
1386
 
  
1387
 
  /* connect to remote */
1388
 
  oArg = {domain:JABBERSERVER,username:jid.substring(0,jid.indexOf('@')),resource:jid.substring(jid.indexOf('/')+1),pass:pass,register:register}
1389
 
  
1390
 
  if (BACKEND_TYPE == 'binding') {
1391
 
    if (opener.connect_port && !isNaN(opener.connect_port))
1392
 
      oArg.port = opener.connect_port;
1393
 
    if (opener.connect_host && opener.connect_host != '')
1394
 
      oArg.host = opener.connect_host;
1395
 
    if (opener && opener.connect_secure)
1396
 
      oArg.secure = true;
1397
 
  }
1398
 
  con.connect(oArg);
1399
 
}
1400
 
 
1401
 
/************************************************************************
1402
 
 *                       ******  LOGOUT  *******
1403
 
 ************************************************************************
1404
 
 */
1405
 
 
1406
 
function cleanUp() {
1407
 
  /* close dependent windows */
1408
 
  if (roster)
1409
 
    roster.cleanUp();
1410
 
  
1411
 
  if (subw && !subw.closed)
1412
 
    subw.close();
1413
 
  
1414
 
  if (typeof(ow) != 'undefined' && ow && !ow.closed)
1415
 
    ow.close();
1416
 
  
1417
 
  if (searchW && !searchW.closed)
1418
 
    searchW.close();
1419
 
  
1420
 
  if (ebW && !ebW.closed)
1421
 
    ebW.close();
1422
 
  
1423
 
  fmd.getElementById('roster').innerHTML = '';
1424
 
 
1425
 
  // clear frames
1426
 
  frames["jwc_sound"].document.open();
1427
 
  frames["jwc_sound"].document.write();
1428
 
  frames["jwc_sound"].document.close();
1429
 
}
1430
 
 
1431
 
var logoutCalled = false;
1432
 
function logout() {
1433
 
  logoutCalled = true;
1434
 
  cleanUp();
1435
 
  
1436
 
  if (!con.connected())
1437
 
    return;
1438
 
  
1439
 
  /* save state */
1440
 
  var iq = new JSJaCIQ();
1441
 
  iq.setIQ(null,'set');
1442
 
  var query = iq.setQuery('jabber:iq:private');
1443
 
  var aNode = query.appendChild(
1444
 
        iq.buildNode('jwchat', {'xmlns': 'jwchat:state'}));
1445
 
  
1446
 
  // save presence
1447
 
  if (onlstat != 'offline')
1448
 
    aNode.appendChild(iq.buildNode('presence', onlstat));
1449
 
 
1450
 
  if (onlmsg != '')
1451
 
    aNode.appendChild(iq.buildNode('onlmsg', onlmsg));
1452
 
  
1453
 
  var hiddengroups = '';
1454
 
  if (typeof(roster) != 'undefined') {
1455
 
    for (var i in roster.hiddenGroups)
1456
 
          hiddengroups += i+",";
1457
 
  } 
1458
 
  
1459
 
  if (hiddengroups != '')
1460
 
    aNode.appendChild(iq.buildNode('hiddenGroups', hiddengroups));
1461
 
  
1462
 
  Debug.log(iq.xml(), 2);
1463
 
  con.send(iq);
1464
 
  
1465
 
  var aPresence = new JSJaCPresence();
1466
 
  aPresence.setType('unavailable');
1467
 
  con.send(aPresence);
1468
 
 
1469
 
  con.disconnect();
1470
 
}
1471
 
 
1472
 
/************************************************************************
1473
 
 *                     ******  INITIALISE VARS  *******
1474
 
 ************************************************************************
1475
 
 */
1476
 
 
1477
 
/* get args */
1478
 
getArgs();
1479
 
 
1480
 
var JABBERSERVER;
1481
 
var BACKEND_TYPE;
1482
 
var HTTPBASE;
1483
 
 
1484
 
if (opener && opener.JABBERSERVER)
1485
 
        JABBERSERVER = opener.JABBERSERVER;
1486
 
else if (passedArgs['server'])
1487
 
        JABBERSERVER = passedArgs['server'];
1488
 
 
1489
 
if (opener && opener.BACKEND_TYPE)
1490
 
        BACKEND_TYPE = opener.BACKEND_TYPE;
1491
 
else if (passedArgs['btype'])
1492
 
        BACKEND_TYPE = passedArgs['btype'];
1493
 
 
1494
 
if (opener && opener.HTTPBASE)
1495
 
        HTTPBASE = opener.HTTPBASE;
1496
 
else if (passedArgs['base'])
1497
 
        HTTPBASE = passedArgs['base'];
1498
 
 
1499
 
if (opener && opener.pass)
1500
 
        pass = opener.pass;
1501
 
else if (passedArgs['pass'])
1502
 
        pass = passedArgs['pass'];
1503
 
 
1504
 
if (opener && opener.jid)
1505
 
        jid = opener.jid;
1506
 
else if (passedArgs['jid'])
1507
 
        jid = passedArgs['jid'];
1508
 
 
1509
 
if (opener && opener.register)
1510
 
        register = opener.register
1511
 
else if (passedArgs['register'])
1512
 
        register = eval(passedArgs['register']);
1513
 
 
1514
 
if (!jid) {
1515
 
        alert("JID manquant.\nAbandon...");
1516
 
  window.close();
1517
 
}
1518
 
if (!pass) {
1519
 
        alert("Mot de passe manquant.\nAbandon...");
1520
 
        window.close();
1521
 
}
1522
 
 
1523
 
if (!isValidJID(jid))
1524
 
  window.close();
1525
 
 
1526
 
nick = jid.substring(0,jid.indexOf('@'));
1527
 
 
1528
 
/* get style */
1529
 
if (opener && opener.myStyle)
1530
 
  stylesheet = THEMESDIR + "/" + opener.myStyle + "/" + stylesheet;
1531
 
else if (passedArgs['myStyle']) 
1532
 
  stylesheet = THEMESDIR + "/" + passedArgs['myStyle'] + "/" + stylesheet;
1533
 
 
1534
 
function updateStyleIE() {
1535
 
  if (roster)
1536
 
    roster.updateStyleIE();
1537
 
}
1538
 
 
1539
 
onload = init;
1540
 
onunload = logout;
1541
 
onresize = updateStyleIE;
1542
 
 
1543
 
//-->
1544
 
    </script>
1545
 
    <script src="roster.js"></script>
1546
 
  </head>
1547
 
  <frameset rows="100%,0,0,0,0" border="0">
1548
 
    <frame src="roster.html" name="jwc_main" marginwidth="0" marginheight="0" scrolling="no">
1549
 
    <frame src="empty.html" name="jwc_sound" marginwidth="0" marginheight="0" onLoad="soundLoaded();">
1550
 
  </frameset>
1551
 
  <body>
1552
 
    Ton navigateur doit supporter les frames. STP, réfère-toi à notre <a href="help.html">manuel en ligne</a> pour la liste des navigateurs supportés
1553
 
  </body>
1554
 
</html>