~ubuntu-branches/ubuntu/lucid/jwchat/lucid

« back to all changes in this revision

Viewing changes to jwchat.html.it

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2008-08-24 15:02:53 UTC
  • mfrom: (3.1.4 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080824150253-h0z39rzjmo4lc1k5
Tags: 1.0beta3-3
* Clean up README.Debian. (Closes: #481320)
* Add brazilian debconf messages translation. (Closes: #481522)
* Add swedish debconf messages translation. (Closes: #494887)
* Add italian debconf messages translation. (Closes: #495780)
* Add russian debconf messages translation. (Closes: #495573)
* Add finnish debconf messages translation. (Closes: #496227)

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
    <title>JWChat</title>
5
5
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
6
6
 
7
 
    <script src="config.js"></script>
8
 
    <script src="shared.js"></script>
9
 
    <script src="browsercheck.js"></script>
10
 
    <script src="sounds.js"></script>
11
 
    <script src="statusLed.js"></script>
 
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>
12
15
 
13
16
<!-- Debugger -->
14
 
    <script src="Debugger.js"></script>
15
 
 
16
 
<!-- JabberConnection -->
17
 
    <script src="sha1.js"></script>
18
 
    <script src="xmlextras.js"></script>
19
 
    <script src="JSJaCConnection.js"></script>
20
 
    <script src="JSJaCHttpPollingConnection.js"></script>
21
 
    <script src="JSJaCHttpBindingConnection.js"></script>
22
 
    <script src="JSJaCPacket.js"></script>
23
 
 
24
 
    <script>
 
17
    <script type="text/javascript" src="Debugger.js"></script>
 
18
 
 
19
    <script type="text/javascript">
25
20
<!--
26
21
 
27
22
 /* ***
28
23
  * JWChat, a web based jabber client
29
 
  * Copyright (C) 2003-2004 Stefan Strigler <steve@zeank.in-berlin.de>
 
24
  * Copyright (C) 2003-2007 Stefan Strigler <steve@zeank.in-berlin.de>
30
25
  *
31
26
  * This program is free software; you can redistribute it and/or
32
27
  * modify it under the terms of the GNU General Public License
57
52
var status = '';
58
53
var onlstat = '';
59
54
var onlmsg = '';
 
55
var onlprio = '8';
60
56
var autoPopup = true;
61
57
var autoPopupAway = false;
62
58
var playSounds = true;
69
65
/* some globals */
70
66
var roster;
71
67
var fmd; // frames.main.document
 
68
var disco; // holds information from service discovery
72
69
 
73
70
var statusLed;
74
71
var statusMsg;
89
86
 */
90
87
 
91
88
function openGroupchat(aJid,nick,pass) {
92
 
        pass = pass || '';
93
 
        nick = nick || '';
 
89
  pass = pass || '';
 
90
  nick = nick || '';
94
91
 
95
92
  var user = roster.getUserByJID(aJid);
96
93
  if(!user) {
97
94
    user = roster.addUser(new RosterUser(aJid,'',["Stanze"],aJid.substring(0,aJid.indexOf('@'))));
98
 
                user.type = 'groupchat';
 
95
    user.type = 'groupchat';
99
96
    roster.print();
100
97
  }
101
 
        if (!user.chatW || user.chatW.closed)
102
 
                user.chatW = open("groupchat.html?jid="+escape(aJid)+"&nick="+escape(nick)+"&pass="+escape(pass),"gchatW"+makeWindowName(aJid+"/"+nick),"width=520,height=390,resizable=yes");
103
 
        user.chatW.focus();
 
98
  if (!user.chatW || user.chatW.closed)
 
99
    user.chatW = open("groupchat.html?jid="+escape(aJid)+"&nick="+escape(nick)+"&pass="+escape(pass),"gchatW"+makeWindowName(aJid+"/"+nick),"width=520,height=390,resizable=yes");
 
100
  user.chatW.focus();
104
101
}
105
102
 
106
103
var subw;
107
104
function openSubscription(aJid) {
108
105
  var param = (aJid) ? "?jid="+escape(aJid) : "";
109
106
  subw = open("subscription.html"+param,"sub","width=320,height=240,resizable=yes");
110
 
        subw.focus();
 
107
  subw.focus();
111
108
  return false;
112
109
}
113
110
 
114
111
function openCustomPresence(aJid) {
115
 
        var user = roster.getUserByJID(aJid);
116
 
        if (!user)
117
 
                return;
 
112
  var user = roster.getUserByJID(aJid);
 
113
  if (!user)
 
114
    return;
118
115
  if (!user.onlStatW || user.onlStatW.closed)
119
116
    user.onlStatW = open("changestatus.html?jid="+escape(aJid),"onlStatW","width=330,height=240,resizable=yes");
120
117
  user.onlStatW.focus();
122
119
}
123
120
 
124
121
function sendCustomPresence(aJid,presence,msg) {
125
 
        var oPresence = new JSJaCPresence();
126
 
        oPresence.setTo(aJid);
127
 
        if (roster.getUserByJID(aJid).roster)
128
 
                oPresence.setXMLNS();
129
 
 
130
 
        switch (presence) {
131
 
        case 'offline':
132
 
                oPresence.setType('unavailable');
133
 
        case 'unavailable':
134
 
                oPresence.setType('unavailable');
135
 
                presence = "invisible";
136
 
        default:
137
 
                if (presence != 'available')
138
 
                        oPresence.setShow(presence);
139
 
        }
140
 
 
141
 
        if (typeof(msg) != 'undefined' && msg != '')
142
 
                oPresence.setStatus(msg);
143
 
 
144
 
        Debug.log(oPresence.getDoc().xml,2);
145
 
        con.send(oPresence);
 
122
  var oPresence = new JSJaCPresence();
 
123
  oPresence.setTo(aJid);
 
124
  if (roster.getUserByJID(aJid).roster)
 
125
    oPresence.setXMLNS();
 
126
 
 
127
  switch (presence) {
 
128
  case 'offline':
 
129
    oPresence.setType('unavailable');
 
130
  case 'unavailable':
 
131
    oPresence.setType('unavailable');
 
132
    presence = "invisible";
 
133
  default:
 
134
    if (presence != 'available')
 
135
      oPresence.setShow(presence);
 
136
  }
 
137
  
 
138
  if (typeof(msg) != 'undefined' && msg != '')
 
139
    oPresence.setStatus(msg);
 
140
  
 
141
  Debug.log(oPresence.getDoc().xml,2);
 
142
  con.send(oPresence);
146
143
}
147
144
 
148
145
function openUserProps(aJid) {
151
148
}
152
149
 
153
150
function removeUser(aJid) {
154
 
        // get fulljid
155
 
        var fulljid = roster.getUserByJID(aJid).fulljid;
156
 
 
157
 
        var iq = new JSJaCIQ();
158
 
        iq.setType('set');
159
 
        var query = iq.setQuery('jabber:iq:roster');
160
 
        var item = query.appendChild(iq.getDoc().createElement('item'));
161
 
        item.setAttribute('jid',fulljid);
162
 
        item.setAttribute('subscription','remove');
163
 
 
164
 
        con.send(iq);
 
151
  // get fulljid
 
152
  var fulljid = roster.getUserByJID(aJid).fulljid;
 
153
 
 
154
  var iq = new JSJaCIQ();
 
155
  iq.setType('set');
 
156
  var query = iq.setQuery('jabber:iq:roster');
 
157
  var item = query.appendChild(iq.getDoc().createElement('item'));
 
158
  item.setAttribute('jid',fulljid);
 
159
  item.setAttribute('subscription','remove');
 
160
 
 
161
  con.send(iq);
165
162
}
166
163
 
167
164
var vcardW; // my vcardW;
168
165
function openUserInfo(aJid) {
169
 
        var newin = open("vcard.html?jid="+escape(aJid),"vcardW"+makeWindowName(aJid),"width=400,height=580,scrollbars=yes");
170
 
 
171
 
        if (cutResource(aJid) == cutResource(jid))
172
 
                vcardW = newin;
173
 
        else {
174
 
                var user = roster.getUserByJID(cutResource(aJid));
175
 
                if (!user) {
176
 
                        user = new RosterUser(aJid);
177
 
                        roster.addUser(user);
178
 
                }
179
 
                if (user.roster) // groupchat(!)
180
 
                        user = user.roster.getUserByJID(aJid);
181
 
                user.vcardW = newin;
182
 
        }
183
 
 
184
 
        return false;
 
166
  var newin = open("vcard.html?jid="+escape(aJid),"vcardW"+makeWindowName(aJid),"width=400,height=580,scrollbars=yes");
 
167
 
 
168
  if (cutResource(aJid) == cutResource(jid))
 
169
    vcardW = newin;
 
170
  else {
 
171
    var user = roster.getUserByJID(cutResource(aJid));
 
172
    if (!user) {
 
173
      user = new RosterUser(aJid);
 
174
      roster.addUser(user);
 
175
    }
 
176
    if (user.roster) // groupchat(!)
 
177
      user = user.roster.getUserByJID(aJid);
 
178
    user.vcardW = newin;
 
179
  }
 
180
 
 
181
  return false;
185
182
}
186
183
 
187
184
function openUserHistory(aJid) {
188
185
 
189
 
        if (typeof(loghost) == 'undefined' || loghost == '')
190
 
                return;
191
 
 
192
 
        var user = roster.getUserByJID(aJid);
193
 
 
194
 
        if (user == null)
195
 
                return;
196
 
 
197
 
        if (!user.histW || user.histW.closed)
198
 
                user.histW = open("userhist.html?jid="+escape(aJid),"histW"+makeWindowName(aJid),"width=600,height=400,resizable=yes,scrollbars=no");
199
 
        user.histW.focus();
 
186
  if (typeof(loghost) == 'undefined' || loghost == '')
 
187
    return;
 
188
 
 
189
  var user = roster.getUserByJID(aJid);
 
190
 
 
191
  if (user == null)
 
192
    return;
 
193
 
 
194
  if (!user.histW || user.histW.closed)
 
195
    user.histW = open("userhist.html?jid="+escape(aJid),"histW"+makeWindowName(aJid),"width=600,height=400,resizable=yes,scrollbars=no");
 
196
  user.histW.focus();
200
197
}
201
198
 
202
199
function openUserNote(aJid) { /* store annotations to a user */
203
 
        var user = roster.getUserByJID(aJid);
204
 
 
205
 
        if (user == null)
206
 
                return; // unbelievable
207
 
 
208
 
        if (!user.noteW || user.noteW.closed)
209
 
                user.noteW = open("usernote.html?jid="+escape(aJid),"noteW"+makeWindowName(aJid),"width=300,height=200,resizable=yes,scrollbars=no");
210
 
        user.noteW.focus();
 
200
  var user = roster.getUserByJID(aJid);
 
201
  
 
202
  if (user == null)
 
203
    return; // unbelievable
 
204
  
 
205
  if (!user.noteW || user.noteW.closed)
 
206
    user.noteW = open("usernote.html?jid="+escape(aJid),"noteW"+makeWindowName(aJid),"width=300,height=200,resizable=yes,scrollbars=no");
 
207
  user.noteW.focus();
211
208
}
212
209
 
213
210
var searchW;
214
211
function openSearch() {
215
 
        if (!searchW || searchW.closed)
216
 
                searchW = open("search.html","searchW"+makeWindowName(jid),"width=480,height=260,resizable=yes,scrollbars=yes");
217
 
        searchW.focus();
218
 
        return false;
 
212
  if (!searchW || searchW.closed)
 
213
    searchW = open("search.html","searchW"+makeWindowName(jid),"width=480,height=260,resizable=yes,scrollbars=yes");
 
214
  searchW.focus();
 
215
  return false;
219
216
}
220
217
 
221
218
var ebW
222
219
function openEditBookmarks() {
223
 
        if (!ebW || ebW.closed)
224
 
                ebW = open("editbookmarks.html","ebw"+makeWindowName(jid),"width=330,height=290,resizable=yes");
225
 
        return false;
 
220
  if (!ebW || ebW.closed)
 
221
    ebW = open("editbookmarks.html","ebw"+makeWindowName(jid),"width=330,height=290,resizable=yes");
 
222
  return false;
226
223
}
227
224
 
228
225
 
268
265
    return;
269
266
  }
270
267
 
271
 
        if (onlstat != '' && onlstat != 'available' && onlstat != 'chat')
272
 
                return;
273
 
 
274
 
        if (soundPlaying)
275
 
                return;
276
 
 
277
 
        soundPlaying = true;
 
268
  if (onlstat != '' && onlstat != 'available' && onlstat != 'chat')
 
269
    return;
 
270
  
 
271
  if (soundPlaying)
 
272
    return;
 
273
  
 
274
  soundPlaying = true;
278
275
        
279
276
  var frameD = frames["jwc_sound"].document;
280
277
 
286
283
 
287
284
 
288
285
function isGateway(aJid) {
289
 
        aJid = cutResource(aJid);
290
 
        for (var i in disco)
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
 
function storeCID(iq,jid) {
301
 
        if (!iq || iq.getType() != 'result')
302
 
                return;
303
 
 
304
 
        Debug.log(iq.getDoc().xml,2);
305
 
        var user = roster.getUserByJID(jid);
306
 
        if (user == null) {
307
 
                Debug.log("user with jid " + jid + " not found",1);
308
 
                return;
309
 
        }
310
 
 
311
 
        if (user.chatW && !user.chatW.closed) // store cid
312
 
                user.chatW.cid = iq.getNode().firstChild.getAttribute('cid');
 
286
  aJid = cutResource(aJid);
 
287
  for (var i in disco) {
 
288
    if (!disco[i].getNode) continue;
 
289
    if (i == aJid)
 
290
      if (disco[i].getNode().getElementsByTagName('identity').item(0)) {
 
291
        if (disco[i].getNode().getElementsByTagName('identity').item(0).getAttribute('category') == 'gateway')
 
292
          return true;
 
293
      }
 
294
  }
 
295
  return false;
313
296
}
314
297
 
315
298
/************************************************************************
318
301
 */
319
302
 
320
303
function sendPresence2Groupchats(gc,val,away) {
321
 
        var aPresence;
322
 
        for (var i=0; i<gc.length; i++) {
323
 
                aPresence = new JSJaCPresence();
324
 
                //aPresence.setXMLNS();
325
 
                aPresence.setTo(gc[i]);
326
 
                if (away && away != '')
327
 
                        aPresence.setStatus(away);
328
 
                if (val != 'available')
329
 
                        aPresence.setShow(val);
330
 
                con.syncSend(aPresence);
331
 
        }
 
304
  var aPresence;
 
305
  for (var i=0; i<gc.length; i++) {
 
306
    aPresence = new JSJaCPresence();
 
307
    //aPresence.setXMLNS();
 
308
    aPresence.setTo(gc[i]);
 
309
    if (away && away != '')
 
310
      aPresence.setStatus(away);
 
311
    if (val != 'available')
 
312
      aPresence.setShow(val);
 
313
    con.send(aPresence);
 
314
  }
332
315
}
333
316
 
334
 
function changeStatus(val,away) {
335
 
  
336
 
  Debug.log("changeStatus: "+val+","+away, 2);
337
 
  
 
317
function changeStatus(val,away,prio) {
 
318
  
 
319
  Debug.log("changeStatus: "+val+","+away+","+prio, 2);
 
320
 
338
321
  onlstat = val;
339
 
        if (away)
340
 
                onlmsg = away;
341
 
 
342
 
        if (!con.connected() && val != 'offline') {
343
 
                init();
344
 
                return;
345
 
        }
346
 
                
347
 
 
348
 
        var aPresence = new JSJaCPresence();
 
322
  if (away)
 
323
    onlmsg = away;
 
324
  
 
325
  if (prio && !isNaN(prio))
 
326
    onlprio = prio;
 
327
  
 
328
  if (!con.connected() && val != 'offline') {
 
329
    init();
 
330
    return;
 
331
  }
 
332
  
 
333
  var aPresence = new JSJaCPresence();
349
334
  
350
335
  switch(val) {
351
336
  case "unavailable":
352
337
    val = "invisible";
353
 
                aPresence.setType('invisible');
 
338
      aPresence.setType('invisible');
354
339
    break;
355
340
  case "offline":
356
341
    val = "unavailable";
357
 
                aPresence.setType('unavailable');
358
 
                con.syncSend(aPresence);
359
 
                con.disconnect();
 
342
    aPresence.setType('unavailable');
 
343
    con.send(aPresence);
 
344
    con.disconnect();
360
345
    var img = eval(val+"Led");
361
346
    statusLed.src = img.src;
362
347
    if (away)
368
353
    break;
369
354
  case "available":
370
355
    val = 'available'; // needed for led in status bar
371
 
    if (away) {
372
 
                        aPresence.setStatus(away);
373
 
    }
374
 
                aPresence.setPriority(8);
375
 
                break;
376
 
        case "chat":
377
 
                aPresence.setPriority(8);
 
356
    if (away)
 
357
      aPresence.setStatus(away);
 
358
    if (prio && !isNaN(prio))
 
359
      aPresence.setPriority(prio);
 
360
    else
 
361
      aPresence.setPriority(onlprio);                   
 
362
    break;
 
363
  case "chat":
 
364
    if (prio && !isNaN(prio))
 
365
      aPresence.setPriority(prio);
 
366
    else
 
367
      aPresence.setPriority(onlprio);                   
378
368
  default:
379
 
    if (away) {
380
 
                        aPresence.setStatus(away);
381
 
    }
382
 
                aPresence.setShow(val);
 
369
    if (away)
 
370
      aPresence.setStatus(away);
 
371
    
 
372
    if (prio && !isNaN(prio))
 
373
      aPresence.setPriority(prio);
 
374
    else
 
375
      aPresence.setPriority('0');
 
376
    
 
377
    aPresence.setShow(val);
383
378
  }
384
 
 
385
 
        con.syncSend(aPresence);
386
 
 
 
379
  
 
380
  con.send(aPresence);
 
381
  
387
382
  /* send presence to chatrooms
388
383
   */
389
384
  if (typeof(roster) != 'undefined' && onlstat != 'invisible') {
390
 
                sendPresence2Groupchats(roster.getGroupchats(),onlstat,onlmsg);
 
385
    sendPresence2Groupchats(roster.getGroupchats(),onlstat,onlmsg);
391
386
  }
392
387
 
393
388
  var img = eval(val+"Led");
394
 
        statusLed.src = img.src;
395
 
        if (away)
396
 
                statusMsg.value = away;
397
 
        else
398
 
                statusMsg.value = onlstatus[val];
 
389
  statusLed.src = img.src;
 
390
  if (away)
 
391
    statusMsg.value = away;
 
392
  else
 
393
    statusMsg.value = onlstatus[val];
399
394
}
400
395
 
401
396
/************************************************************************
410
405
 */
411
406
function handleMessage(aMessage) {
412
407
 
413
 
        Debug.log(aMessage.getDoc().xml,2);
414
 
 
415
 
        if (aMessage.getType() == 'error')
416
 
                return;
417
 
 
418
 
        /* check if this is a groupchat invite */
419
 
        var x;
420
 
        for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
421
 
                if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
422
 
                        x = aMessage.getNode().getElementsByTagName('x').item(i);
423
 
                        break;
424
 
                }
425
 
 
426
 
        if (x) {
427
 
                var from, to, reason, pass;
428
 
                to = aMessage.getFrom();
429
 
                var aInvite = x.getElementsByTagName('invite').item(0);
430
 
                from = aInvite.getAttribute('from');
431
 
                if (aInvite.firstChild && aInvite.firstChild.nodeName == 'reason' && aInvite.firstChild.firstChild)
432
 
                        reason = aInvite.firstChild.firstChild.nodeValue;
433
 
                if (x.getElementsByTagName('password').item(0))
434
 
                        pass = x.getElementsByTagName('password').item(0).firstChild.nodeValue;
435
 
                Debug.log("You have been invited to " + jid + " pass " + pass + " by " + from + "\nreason:" + reason,2);
436
 
                var user = roster.getUserByJID(cutResource(from));
437
 
                if (!user) {// users not in roster (yet)
438
 
                        Debug.log("creating new user "+from,3);
439
 
                        user = roster.addUser(new RosterUser(cutResource(from)));
440
 
                        user.lastsrc = eval(user.status + "Led").src;
441
 
                        roster.print();
442
 
                }
443
 
 
444
 
                if (typeof(user.iwArr) == 'undefined')
445
 
                        user.iwArr = new Array();
446
 
 
447
 
                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");
448
 
                
449
 
                return;
450
 
        }
451
 
 
 
408
  Debug.log(aMessage.getDoc().xml,2);
 
409
 
 
410
  if (aMessage.getType() == 'error')
 
411
    return;
 
412
  
 
413
  /* check if this is a groupchat invite */
 
414
  var x;
 
415
  for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
 
416
    if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
 
417
      x = aMessage.getNode().getElementsByTagName('x').item(i);
 
418
      break;
 
419
    }
 
420
  
 
421
  if (x) {
 
422
    var from, to, reason, pass;
 
423
    to = aMessage.getFrom();
 
424
    var aInvite = x.getElementsByTagName('invite').item(0);
 
425
    from = aInvite.getAttribute('from');
 
426
    if (aInvite.firstChild && aInvite.firstChild.nodeName == 'reason' && aInvite.firstChild.firstChild)
 
427
      reason = aInvite.firstChild.firstChild.nodeValue;
 
428
    if (x.getElementsByTagName('password').item(0))
 
429
      pass = x.getElementsByTagName('password').item(0).firstChild.nodeValue;
 
430
    Debug.log("You have been invited to " + jid + " pass " + pass + " by " + from + "\nreason:" + reason,2);
 
431
    var user = roster.getUserByJID(cutResource(from));
 
432
    if (!user) {// users not in roster (yet)
 
433
      Debug.log("creating new user "+from,3);
 
434
      user = roster.addUser(new RosterUser(cutResource(from)));
 
435
      user.lastsrc = eval(user.status + "Led").src;
 
436
      roster.print();
 
437
    }
 
438
    
 
439
    if (typeof(user.iwArr) == 'undefined')
 
440
      user.iwArr = new Array();
 
441
    
 
442
    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");
 
443
    
 
444
    return;
 
445
  }
 
446
  
452
447
  var from = cutResource(aMessage.getFrom());
453
448
  var type = aMessage.getType();
454
449
  Debug.log("from: "+from+"\naMessage.getFrom(): "+aMessage.getFrom(),3);
483
478
    if (aRoster.usersHidden && user.status == 'unavailable')
484
479
      aRoster.print();
485
480
  }
486
 
 
487
 
        // set current timestamp
488
 
        var x;
489
 
        for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
490
 
                if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:delay') {
491
 
                        x = aMessage.getNode().getElementsByTagName('x').item(i);
492
 
                        break;
493
 
                }
494
 
 
495
 
        if (x) {
496
 
                        Debug.log("found offline message: "+x.getAttribute('stamp'),3);
497
 
                        var stamp = x.getAttribute('stamp');
498
 
                        aMessage.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)));
499
 
        } else
500
 
                aMessage.jwcTimestamp = new Date();
501
 
 
 
481
  
 
482
  // set current timestamp
 
483
  var x;
 
484
  for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
 
485
    if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:delay') {
 
486
      x = aMessage.getNode().getElementsByTagName('x').item(i);
 
487
      break;
 
488
    }
 
489
  
 
490
  if (x) {
 
491
    Debug.log("found offline message: "+x.getAttribute('stamp'),3);
 
492
    var stamp = x.getAttribute('stamp');
 
493
    aMessage.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)));
 
494
  } else
 
495
    aMessage.jwcTimestamp = new Date();
 
496
  
502
497
  if (type == 'chat') {
503
498
    
504
499
    user.chatmsgs = user.chatmsgs.concat(aMessage);
513
508
      if (focusWindows) window.focus();
514
509
      playSound('chat_queue');
515
510
 
516
 
                        // let arrow blink for toggled groups
517
 
                        for (var i in user.groups) {
518
 
                                if (user.groups[i] != '') {
519
 
                                        if (roster.hiddenGroups[user.groups[i]])
520
 
                                                fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;
521
 
                                }                                       
522
 
                        }
 
511
      // let arrow blink for toggled groups
 
512
      for (var i=0; i<user.groups.length; i++) {
 
513
        if (user.groups[i] != '') {
 
514
          if (roster.hiddenGroups[user.groups[i]])
 
515
            fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;
 
516
        }                                       
 
517
      }
523
518
    }
524
519
 
525
 
                // send back to server - [TODO]
526
 
                if (enableLog && typeof(loghost) != 'undefined') {
527
 
                        var aIQ = new JSJaCIQ();
528
 
                        aIQ.setType('set');
529
 
                        aIQ.setTo(loghost);
530
 
                        var aNode = aIQ.getNode().appendChild(aIQ.getDoc().createElement('archive'));
531
 
                        aNode.setAttribute('xmlns','http://jabber.org/protocol/archive');
532
 
                        aNode.appendChild(aMessage.getNode().cloneNode(true));
533
 
                        if (user.chatW && !user.chatW.closed && typeof(user.chatW.cid)!='undefined') {
534
 
                                aNode.setAttribute('cid',user.chatW.cid);
535
 
                                con.send(aIQ);
536
 
                        } else
537
 
                                con.send(aIQ,storeCID,user.jid);
538
 
                }
539
520
  } else if (type == 'groupchat') {
540
521
 
541
 
      /* handle groupchat message 
542
 
       */
 
522
    /* handle groupchat message 
 
523
     */
543
524
 
544
525
    user.chatmsgs = user.chatmsgs.concat(aMessage);
545
526
    if (user.chatW && !user.chatW.closed && user.chatW.srcW && typeof(user.chatW.srcW.roster) != 'undefined' && user.chatW.popMsgs) {
546
527
      user.chatW.popMsgs();
547
528
    } 
548
 
 
 
529
    
549
530
    playSound('chat_recv');
550
531
    
551
532
  } else {
552
 
 
 
533
    
553
534
    user.messages = user.messages.concat(aMessage);
554
535
    if (autoPopup && (autoPopupAway || onlstat == "available" || onlstat == "chat") && (!user.mW || user.mW.closed)) {
555
536
      aRoster.openMessage(from);
561
542
    }   else {
562
543
      if (focusWindows) window.focus();
563
544
      playSound('message_queue');
564
 
                        // let arrow blink for toggled groups
565
 
                        for (var i in user.groups) {
566
 
                                if (user.groups[i] != '') {
567
 
                                        if (roster.hiddenGroups[user.groups[i]])
568
 
                                                fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;
569
 
                                }                                       
570
 
                        }
571
 
 
 
545
      // let arrow blink for toggled groups
 
546
      for (var i=0; i<user.groups.length; i++) {
 
547
        if (user.groups[i] != '') {
 
548
          if (roster.hiddenGroups[user.groups[i]])
 
549
            fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;
 
550
        }                                       
 
551
      }
 
552
      
572
553
    }
573
554
 
574
 
                // store message
575
 
                if (enableLog && typeof(loghost) != 'undefined') {
576
 
                        var aIQ = new JSJaCIQ();
577
 
                        aIQ.setType('set');
578
 
                        aIQ.setTo(loghost);
579
 
                        var aNode = aIQ.getNode().appendChild(aIQ.getDoc().createElement('archive'));
580
 
                        aNode.setAttribute('xmlns','http://jabber.org/protocol/archive');
581
 
                        aNode.appendChild(aMessage.getNode().cloneNode(true));
582
 
                        con.send(aIQ);
583
 
                }
 
555
    // [TODO] zeank 2005-10-26
 
556
    // archiving of single/plain messages
584
557
  }
585
558
}
586
559
 
592
565
var errorW;
593
566
function handleMessageError(aJSJaCPacket) {
594
567
 
595
 
        if (aJSJaCPacket.getType() != 'error')
596
 
                return;
597
 
 
598
 
        Debug.log(aJSJaCPacket.getDoc().xml,3);
599
 
 
600
 
        var user = roster.getUserByJID(cutResource(aJSJaCPacket.getFrom()));
601
 
 
602
 
        if (user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
603
 
                var error = aJSJaCPacket.getNode().getElementsByTagName('error').item(0);
604
 
                if (error) {
605
 
                        if (error.getElementsByTagName('text').item(0)) {
606
 
                                user.chatW.putMsgHTML(error.getElementsByTagName('text').item(0).firstChild.nodeValue,new Date(),aJSJaCPacket.getFrom(),null,true);
607
 
                                playSound('error');
608
 
                                return;
609
 
                        }
610
 
                }
611
 
        }
612
 
 
613
 
        error_messages = error_messages.concat(aJSJaCPacket);
614
 
 
615
 
        if (!errorW || errorW.closed)
616
 
                errorW = open("error_message.html","errorW"+makeWindowName(jid),"width=360,height=270,dependent=yes,resizable=yes");
617
 
        else if (error_messages.length > 0 && errorW.document.forms[0])
618
 
                errorW.document.forms[0].nextButton.disabled = false;
619
 
 
 
568
  if (aJSJaCPacket.getType() != 'error')
 
569
    return;
 
570
  
 
571
  Debug.log(aJSJaCPacket.getDoc().xml,2);
 
572
  
 
573
  var user = roster.getUserByJID(cutResource(aJSJaCPacket.getFrom()));
 
574
  
 
575
  if (user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
 
576
    var error = aJSJaCPacket.getNode().getElementsByTagName('error').item(0);
 
577
    if (error) {
 
578
      if (error.getElementsByTagName('text').item(0)) {
 
579
        user.chatW.putMsgHTML(aJSJaCPacket);
620
580
        playSound('error');
621
 
 
622
 
        errorW.focus();
 
581
        return;
 
582
      }
 
583
    }
 
584
  }
 
585
  
 
586
  error_messages = error_messages.concat(aJSJaCPacket);
 
587
  
 
588
  if (!errorW || errorW.closed)
 
589
    errorW = open("error_message.html","errorW"+makeWindowName(jid),"width=360,height=270,dependent=yes,resizable=yes");
 
590
  else if (error_messages.length > 0 && errorW.document.forms[0])
 
591
    errorW.document.forms[0].nextButton.disabled = false;
 
592
  
 
593
  playSound('error');
 
594
  
 
595
  errorW.focus();
623
596
}
624
597
 
625
598
/************************************************************************
628
601
 */
629
602
 
630
603
function handlePresence(presence) {
631
 
        Debug.log(presence.getDoc().xml,2);
 
604
  Debug.log(presence.getDoc().xml,2);
632
605
 
633
606
  var from = cutResource(presence.getFrom());
634
 
        var type = presence.getType();
635
 
        var show = presence.getShow();
636
 
        var status = presence.getStatus();
 
607
  var type = presence.getType();
 
608
  var show = presence.getShow();
 
609
  var status = presence.getStatus();
637
610
 
638
611
  var aRoster = roster;
639
612
 
640
 
  if (from == cutResource(jid)) // skip my own presence msgs
641
 
    return;
642
 
 
643
 
  if (type) {
644
 
    if (type == 'subscribe') {
645
 
                        if (isGateway(from)) { // automatically subscribe to gateways
646
 
                                var aPresence = new JSJaCPresence();
647
 
                                aPresence.setTo(from);
648
 
                                aPresence.setType('subscribed');
649
 
                                con.send(aPresence);
650
 
                        }
651
 
                        else
652
 
                                if (status)
653
 
                                        window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240");
654
 
                                else
655
 
                                        window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240");
656
 
 
 
613
  // roster subscriptions synchronisation
 
614
  var x;
 
615
  if (isGateway(from.substring(from.indexOf('@')+1))) {
 
616
    for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
 
617
      if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/roster-subsync' ||
 
618
          presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://delx.cjb.net/protocol/roster-subsync') {
 
619
        x = presence.getNode().getElementsByTagName('x').item(i);
 
620
        break;
 
621
      }
 
622
    
 
623
    if (x) {
 
624
 
 
625
      Debug.log("detected roster-subsync presence",2);
 
626
 
 
627
      var items = x.getElementsByTagName("item");
 
628
      for (var i=0; i<items.length; i++) {
 
629
        var aItem = items.item(i);
 
630
        if (type == 'subscribe' && aItem.getAttribute("subscription") == 'both') {
 
631
          // insert into roster
 
632
          var aIQ = new JSJaCIQ();
 
633
          aIQ.setType('set');
 
634
          var query = aIQ.setQuery('jabber:iq:roster');
 
635
          var bItem = query.appendChild(aIQ.getDoc().createElement('item'));
 
636
          bItem.setAttribute('jid',from);
 
637
          if (aItem.getAttribute('name') && aItem.getAttribute('name') != '')
 
638
            bItem.setAttribute('name',aItem.getAttribute('name'));
 
639
          else 
 
640
            bItem.setAttribute('name',from.substring(0,from.lastIndexOf('@')).replace(/%/,'@'));
 
641
          var itemGroups = aItem.getElementsByTagName("group");
 
642
          for (var j=0; j<itemGroups.length; j++)
 
643
            bItem.appendChild(itemGroups.item(j));
 
644
          
 
645
          Debug.log("roster-subsync setting roster:"+aIQ.xml(),2);
 
646
          
 
647
          con.send(aIQ);
 
648
          
 
649
          // Approve Subscription Request
 
650
          var aPresence = new JSJaCPresence();
 
651
          aPresence.setTo(from);
 
652
          aPresence.setType('subscribed');
 
653
          con.send(aPresence);
 
654
          
 
655
          // Subscribe to gateway contact's presence
 
656
          var bPresence = new JSJaCPresence();
 
657
          bPresence.setTo(from);
 
658
          bPresence.setType('subscribe');
 
659
          con.send(bPresence);    
 
660
        }
 
661
      }
657
662
      return;
658
663
    }
659
 
    if (type == 'unsubscribe')
 
664
  }
 
665
  
 
666
  switch (type) {
 
667
  case null:
 
668
  case '':
 
669
    break;
 
670
  case 'subscribe':
 
671
    if (isGateway(from)) { // automatically subscribe gateways
 
672
      
 
673
      // Approve Subscription Request
 
674
      var aPresence = new JSJaCPresence();
 
675
      aPresence.setTo(presence.getFrom());
 
676
      aPresence.setType('subscribed');
 
677
      con.send(aPresence);
 
678
      
 
679
      // Subscribe to Gateway's Presence
 
680
      var bPresence = new JSJaCPresence();
 
681
      bPresence.setTo(presence.getFrom());
 
682
      bPresence.setType('subscribe');
 
683
      con.send(bPresence);
 
684
    }   else {
 
685
      if (status)
 
686
        window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240");
 
687
      else
 
688
        window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240");
 
689
    }
 
690
    return;
 
691
  case 'unsubscribe':
 
692
    if (!isGateway(from))
660
693
      alert(""+presence.getFrom()+" ha cancellato la tua Sottoscrizione"); /* [TODO] don't use alert here */
661
 
 
662
 
                if (type == 'error') { // [TODO]
663
 
 
664
 
                        var user = roster.getUserByJID(from);
665
 
                        if (user && user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
666
 
                                if (presence.getNode().getElementsByTagName('error').item(0)) {
667
 
                                        var error = presence.getNode().getElementsByTagName('error').item(0);
668
 
                                        if (error.getElementsByTagName('text').item(0))
669
 
                                                user.chatW.putMsgHTML(error.getElementsByTagName('text').item(0).firstChild.nodeValue,new Date(),from,null,true);
670
 
                                        else if (error.firstChild && error.firstChild.nodeValue)
671
 
                                                user.chatW.putMsgHTML(error.firstChild.nodeValue,new Date(),from,null,true);                                                            
672
 
                                }
673
 
                                
674
 
                        }
675
 
//                      for (var i in jabber.o) {
676
 
//                              if (jabber.o[i].tagname == 'error' && jabber.o[i].data != '')
677
 
//                                      alert("From: "+from+"\nError (Code:"+jabber.o[i].code+")\n\n"+jabber.o[i].data);
678
 
//                      }
679
 
                        return;
680
 
                }
 
694
    break;
 
695
  case 'error':
 
696
    var user = roster.getUserByJID(from);
 
697
    if (user && user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
 
698
      if (presence.getNode().getElementsByTagName('error').item(0)) {
 
699
        var error = presence.getNode().getElementsByTagName('error').item(0);
 
700
        if (error.getElementsByTagName('text').item(0))
 
701
          user.chatW.putMsgHTML(presence);
 
702
        else if (error.firstChild && error.firstChild.nodeValue)
 
703
          user.chatW.putMsgHTML(error.firstChild.nodeValue,new Date(),from,null,true);                                                          
 
704
      }
 
705
      
 
706
    }
681
707
  }
682
 
 
 
708
  
683
709
  var user = roster.getUserByJID(from);
684
 
  if (!user) // presence from unsubscribed user
 
710
  if (!user) { // presence from unsubscribed user
 
711
    Debug.log("presence from "+from+" not found on roster", 2);
685
712
    return;
686
 
 
687
 
        /* handle presence for MUC */
688
 
        var x;
689
 
        for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
690
 
                if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
691
 
                        x = presence.getNode().getElementsByTagName('x').item(i);
692
 
                        break;
693
 
                }
694
 
 
695
 
  if (user.roster && x) { 
 
713
  }
 
714
  
 
715
  /* handle presence for MUC */
 
716
  x = null; // reset
 
717
  for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
 
718
    if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
 
719
      x = presence.getNode().getElementsByTagName('x').item(i);
 
720
      break;
 
721
    }
 
722
  
 
723
  if (user.roster && x) {
 
724
    Debug.log("muc presence detected", 2);
696
725
    var ofrom = presence.getFrom().substring(presence.getFrom().indexOf('/')+1);
697
 
 
 
726
    
698
727
    Debug.log("jabber.from:"+presence.getFrom()+", ofrom:"+ofrom,3);
699
 
 
 
728
    
700
729
    var ouser = user.roster.getUserByJID(presence.getFrom());
701
730
    if (!ouser) // no user? create one!
702
731
      ouser = new GroupchatRosterUser(presence.getFrom(),ofrom);
703
 
 
704
 
                var item = x.getElementsByTagName('item').item(0);
705
 
 
706
 
                ouser.affiliation = item.getAttribute('affiliation');
707
 
                ouser.role = item.getAttribute('role');
708
 
                ouser.nick = item.getAttribute('nick');
709
 
                ouser.realjid = item.getAttribute('jid');
710
 
                if (item.getElementsByTagName('reason').item(0))
711
 
                        ouser.reason = item.getElementsByTagName('reason').item(0).firstChild.nodeValue;
712
 
                if (actor = item.getElementsByTagName('actor').item(0)) {
713
 
                        if (actor.getAttribute('jid') != null)
714
 
                                ouser.actor = actor.getAttribute('jid');
715
 
                        else if (item.getElementsByTagName('actor').item(0).firstChild != null)
 
732
    
 
733
    var item = x.getElementsByTagName('item').item(0);
 
734
    
 
735
    ouser.affiliation = item.getAttribute('affiliation');
 
736
    ouser.role = item.getAttribute('role');
 
737
    ouser.nick = item.getAttribute('nick');
 
738
    ouser.realjid = item.getAttribute('jid');
 
739
    if (item.getElementsByTagName('reason').item(0))
 
740
      ouser.reason = item.getElementsByTagName('reason').item(0).firstChild.nodeValue;
 
741
    if (actor = item.getElementsByTagName('actor').item(0)) {
 
742
      if (actor.getAttribute('jid') != null)
 
743
        ouser.actor = actor.getAttribute('jid');
 
744
      else if (item.getElementsByTagName('actor').item(0).firstChild != null)
716
745
                                ouser.actor = item.getElementsByTagName('actor').item(0).firstChild.nodeValue;
717
 
                }
718
 
                if (ouser.role != '') {
719
 
                        ouser.add2Group(ouser.role+'s');
720
 
                        
721
 
                        /* check if it is our own presence
722
 
                         * must be done here cause we want to be sure that role != ''
723
 
                         */
724
 
            
725
 
                        if (ouser.name == user.roster.nick) { // seems to be me
726
 
                                user.roster.me = ouser; // store this reference
727
 
                                if (user.chatW.updateMe)
728
 
                                        user.chatW.updateMe();
729
 
                        }
730
 
                }
731
 
 
732
 
                Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3);
733
 
 
734
 
 
735
 
                var nickChanged = false;
736
 
                if (x.getElementsByTagName('status').item(0)) {
737
 
                        var code = x.getElementsByTagName('status').item(0).getAttribute('code');
738
 
                        switch (code) {
739
 
                        case '201': // room created
740
 
                                /* popup dialog to ask for whether to accept default
741
 
                                 * configuration or make a custom room 
742
 
                                 */
743
 
                                if (confirm("Una nuova Stanza e' stata creata, ma attende una configurazione da parte tua. Vuoi impostare una configurazione personalizzata ora?\nNote: clicca su 'Annulla' per iniziare con una configurazione di default!"))
744
 
                                        user.chatW.openConfig();
745
 
                                else {
746
 
                                        var iq = new JSJaCIQ();
747
 
                                        iq.setType('set');
748
 
                                        iq.setTo(user.jid);
749
 
                                        var query = iq.setQuery('http://jabber.org/protocol/muc#owner');
750
 
                                        var x = query.appendChild(iq.getDoc().createElement('x'));
751
 
                                        x.setAttribute('xmlns','jabber:x:data');
752
 
                                        x.setAttribute('type','submit');
753
 
                                        
754
 
                                        con.send(iq);
755
 
                                }
756
 
                                break;
757
 
                        case '303': // nick change
758
 
                                // display message
759
 
                                if (!ouser.nick)
760
 
                                        return;
761
 
 
762
 
                                var aMessage = new JSJaCMessage();
763
 
                                aMessage.setFrom(user.jid);
764
 
                                aMessage.setBody(""+ouser.name+" ora si fa chiamare "+ouser.nick);
765
 
                                user.chatmsgs = user.chatmsgs.concat(aMessage);
766
 
                                if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
767
 
                                        user.chatW.popMsgs();
768
 
 
769
 
                                // update nick if it's me
770
 
                                if (ouser.name == user.roster.nick)
771
 
                                        user.roster.nick = ouser.nick;
772
 
 
773
 
                                // remove old user
774
 
                                var aChatW = ouser.chatW;
775
 
                                user.roster.removeUser(ouser);
776
 
 
777
 
                                // add new user
778
 
                                ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick);
779
 
 
780
 
                                if (aChatW && !aChatW.closed) {
781
 
                                        ouser.chatW = aChatW;
782
 
                                        ouser.chatW.user = ouser;
783
 
                                }
784
 
                                user.roster.addUser(ouser);
785
 
                                nickChanged = true;
786
 
                                break;
787
 
                        case '301': // user has been kicked
788
 
                                var aMessage = new JSJaCMessage();
789
 
                                aMessage.setFrom(user.jid);
790
 
                                var body;
791
 
                                if (ouser.actor)
792
 
                                        body = ""+ouser.name+" e' stato bannato da "+ouser.actor;
793
 
                                else
794
 
                                        body = ""+ouser.name+" e' stato bannato";
795
 
                                if (ouser.reason)
796
 
                                        body += ": " + ouser.reason;
797
 
                                aMessage.setBody(body);
798
 
                                user.chatmsgs = user.chatmsgs.concat(aMessage);
799
 
                                if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
800
 
                                        user.chatW.popMsgs();                   
801
 
                                
802
 
                                playSound('chat_recv');
803
 
                                break;
804
 
                        case '307': // user has been kicked
805
 
                                var aMessage = new JSJaCMessage();
806
 
                                aMessage.setFrom(user.jid);
807
 
                                var body;
808
 
                                if (ouser.actor)
809
 
                                        body = ""+ouser.name+" e' stato ammonito da "+ouser.actor;
810
 
                                else
811
 
                                        body = ""+ouser.name+" e' stato ammonito";
812
 
                                if (ouser.reason)
813
 
                                        body += ": " + ouser.reason;
814
 
                                aMessage.setBody(body);
815
 
                                user.chatmsgs = user.chatmsgs.concat(aMessage);
816
 
                                if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
817
 
                                        user.chatW.popMsgs();   
818
 
                                                        
819
 
                                playSound('chat_recv');
820
 
                                break;
821
 
                        }
822
 
                }
823
 
 
 
746
    }
 
747
    if (ouser.role != '') {
 
748
      ouser.add2Group(ouser.role+'s');
 
749
      
 
750
      /* check if it is our own presence
 
751
       * must be done here cause we want to be sure that role != ''
 
752
       */
 
753
      
 
754
      if (ouser.name == htmlEnc(user.roster.nick)) { // seems to be me
 
755
        user.roster.me = ouser; // store this reference
 
756
        if (user.chatW.updateMe)
 
757
          user.chatW.updateMe();
 
758
      }
 
759
    }
 
760
    
 
761
    Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3);
 
762
    
 
763
    
 
764
    var nickChanged = false;
 
765
    if (x.getElementsByTagName('status').item(0)) {
 
766
      var code = x.getElementsByTagName('status').item(0).getAttribute('code');
 
767
      switch (code) {
 
768
      case '201': // room created
 
769
        /* popup dialog to ask for whether to accept default
 
770
         * configuration or make a custom room 
 
771
         */
 
772
        if (confirm("Una nuova Stanza e' stata creata, ma attende una configurazione da parte tua. Vuoi impostare una configurazione personalizzata ora?\nNote: clicca su 'Annulla' per iniziare con una configurazione di default!"))
 
773
          user.chatW.openConfig();
 
774
        else {
 
775
          var iq = new JSJaCIQ();
 
776
          iq.setType('set');
 
777
          iq.setTo(user.jid);
 
778
          var query = iq.setQuery('http://jabber.org/protocol/muc#owner');
 
779
          var x = query.appendChild(iq.getDoc().createElement('x'));
 
780
          x.setAttribute('xmlns','jabber:x:data');
 
781
          x.setAttribute('type','submit');
 
782
          
 
783
          con.send(iq);
 
784
        }
 
785
        break;
 
786
      case '303': // nick change
 
787
        // display message
 
788
        if (!ouser.nick)
 
789
          return;
 
790
        
 
791
        var aMessage = new JSJaCMessage();
 
792
        aMessage.setFrom(user.jid);
 
793
        aMessage.setBody(""+ouser.name+" ora si fa chiamare "+htmlEnc(ouser.nick));
 
794
        user.chatmsgs = user.chatmsgs.concat(aMessage);
 
795
        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
 
796
          user.chatW.popMsgs();
 
797
        
 
798
        // update nick if it's me
 
799
        if (ouser.name == htmlEnc(user.roster.nick))
 
800
          user.roster.nick = ouser.nick;
 
801
        
 
802
        // remove old user
 
803
        var aChatW = ouser.chatW;
 
804
        user.roster.removeUser(ouser);
 
805
        
 
806
        // add new user
 
807
        ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick);
 
808
        
 
809
        if (aChatW && !aChatW.closed) {
 
810
          ouser.chatW = aChatW;
 
811
          ouser.chatW.user = ouser;
 
812
        }
 
813
        user.roster.addUser(ouser);
 
814
        nickChanged = true;
 
815
        break;
 
816
      case '301': // user has been kicked
 
817
        var aMessage = new JSJaCMessage();
 
818
        aMessage.setFrom(user.jid);
 
819
        var body;
 
820
        if (ouser.actor)
 
821
          body = ""+ouser.name+" e' stato bannato da "+ouser.actor;
 
822
        else
 
823
          body = ""+ouser.name+" e' stato bannato";
 
824
        if (ouser.reason)
 
825
          body += ": " + ouser.reason;
 
826
        aMessage.setBody(body);
 
827
        user.chatmsgs = user.chatmsgs.concat(aMessage);
 
828
        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
 
829
          user.chatW.popMsgs();                 
 
830
        
 
831
        playSound('chat_recv');
 
832
        break;
 
833
      case '307': // user has been kicked
 
834
        var aMessage = new JSJaCMessage();
 
835
        aMessage.setFrom(user.jid);
 
836
        var body;
 
837
        if (ouser.actor)
 
838
          body = ""+ouser.name+" e' stato ammonito da "+ouser.actor;
 
839
        else
 
840
          body = ""+ouser.name+" e' stato ammonito";
 
841
        if (ouser.reason)
 
842
          body += ": " + ouser.reason;
 
843
        aMessage.setBody(body);
 
844
        user.chatmsgs = user.chatmsgs.concat(aMessage);
 
845
        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
 
846
          user.chatW.popMsgs(); 
 
847
        
 
848
        playSound('chat_recv');
 
849
        break;
 
850
      }
 
851
    }
 
852
    
824
853
    Debug.log("<"+ouser.name+"> affiliation:"+ouser.affiliation+", role:"+ouser.role,3);
825
854
 
826
855
    if (!user.roster.getUserByJID(presence.getFrom()) && !nickChanged) {
827
 
                        // add user
 
856
      // add user
828
857
      user.roster.addUser(ouser);
829
 
 
830
 
                        // show join message
831
 
                        var aMessage = new JSJaCMessage();
832
 
                        aMessage.setFrom(user.jid);
833
 
                        aMessage.setBody(""+ouser.name+" e' disponibile");
834
 
                        user.chatmsgs = user.chatmsgs.concat(aMessage);
835
 
                        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
836
 
                                user.chatW.popMsgs();                   
837
 
 
838
 
                        playSound('online');
839
 
 
 
858
      
 
859
      // show join message
 
860
      var aMessage = new JSJaCMessage();
 
861
      aMessage.setFrom(user.jid);
 
862
      aMessage.setBody(""+ouser.name+" e' disponibile");
 
863
      user.chatmsgs = user.chatmsgs.concat(aMessage);
 
864
      if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
 
865
        user.chatW.popMsgs();                   
 
866
      
 
867
      playSound('online');
 
868
      
840
869
    } else if (presence.getType() == 'unavailable' && !nickChanged) {
841
 
                        // show part message
842
 
                        var aMessage = new JSJaCMessage();
843
 
                        aMessage.setFrom(user.jid);
844
 
                        var body = ""+ouser.name+" e' andato via";
845
 
                        if (presence.getStatus())
846
 
                                body += ": " + presence.getStatus();
847
 
                        aMessage.setBody(body);
848
 
                        user.chatmsgs = user.chatmsgs.concat(aMessage);
849
 
                        if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
850
 
                                user.chatW.popMsgs();                   
851
 
 
852
 
                        playSound('offline');
853
 
 
854
 
                } else
 
870
      // show part message
 
871
      var aMessage = new JSJaCMessage();
 
872
      aMessage.setFrom(user.jid);
 
873
      var body = ""+ouser.name+" e' andato via";
 
874
      if (presence.getStatus())
 
875
        body += ": " + presence.getStatus();
 
876
      aMessage.setBody(body);
 
877
      user.chatmsgs = user.chatmsgs.concat(aMessage);
 
878
      if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
 
879
        user.chatW.popMsgs();                   
 
880
      
 
881
      playSound('offline');
 
882
      
 
883
    } else
855
884
      user.roster.updateGroups();
856
 
 
 
885
    
857
886
    // relink roster and user
858
887
    aRoster = user.roster;
859
888
    user = ouser;
862
891
  if (show) {
863
892
    if (user.status == 'unavailable')
864
893
      playSound('online');
865
 
                // fix broken pressenc status
866
 
                if (show != 'chat' && show != 'away' && show != 'xa' && show != 'dnd')
867
 
                        show = 'available';
 
894
    // fix broken pressenc status
 
895
    if (show != 'chat' && show != 'away' && show != 'xa' && show != 'dnd')
 
896
      show = 'available';
868
897
    user.status = show;
869
898
  } else if (type) {
870
899
    if (type == 'unsubscribe') {
873
902
    } else if (user.status != 'stalker')
874
903
      user.status = 'unavailable';
875
904
    if (aRoster.name == 'GroupchatRoster' && !nickChanged) { // it's a groupchat roster
876
 
                        // remove user
877
 
                        if (!user.chatW || user.chatW.closed)
878
 
                                aRoster.removeUser(user); // we don't need offline users in there
879
 
                }
 
905
      // remove user
 
906
      if (!user.chatW || user.chatW.closed)
 
907
        aRoster.removeUser(user); // we don't need offline users in there
 
908
    }
880
909
    playSound('offline');
881
910
  } else {
882
911
    if (user.status == 'unavailable') // user was offline before
884
913
    user.status = 'available';
885
914
  }
886
915
 
887
 
        var img = eval(user.status+"Led");
 
916
  var img = eval(user.status+"Led");
888
917
  
889
918
  if (user.lastsrc) // message is pending
890
919
    user.lastsrc = img.src;
895
924
  else
896
925
    user.statusMsg = null;
897
926
  
898
 
        // update presence indicator of chat window
899
 
        if (user.chatW && !user.chatW.closed && user.chatW.updateUserPresence) 
900
 
                user.chatW.updateUserPresence();
 
927
  // update presence indicator of chat window
 
928
  if (user.chatW && !user.chatW.closed && user.chatW.updateUserPresence) 
 
929
    user.chatW.updateUserPresence();
901
930
 
902
931
  aRoster.print(); // update roster
903
932
}
909
938
 
910
939
function handleIQSet(iq) {
911
940
  if (iq.getType() != "set") {
912
 
                Debug.log("not handling iq:\n"+iq.getDoc().xml,3);
 
941
    Debug.log("not handling iq:\n"+iq.getDoc().xml,3);
913
942
    return;
914
 
        }
915
 
 
 
943
  }
 
944
  
916
945
  Debug.log("got iq type 'set':\n"+iq.getDoc().xml,2);
917
 
 
918
 
        if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far
919
 
                Debug.log("not handling iq:\n"+iq.getDoc().xml,1);
920
 
                return;
921
 
        }
922
 
 
 
946
  
 
947
  if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far
 
948
    Debug.log("not handling iq:\n"+iq.getDoc().xml,1);
 
949
    return;
 
950
  }
 
951
  
923
952
  for (var i=0; i<iq.getQuery().childNodes.length; i++) {
924
953
    var item = iq.getQuery().childNodes.item(i);
925
954
    var user = roster.getUserByJID(cutResource(item.getAttribute('jid')));
926
955
    if (user) {
927
956
      user.subscription = item.getAttribute('subscription');
928
957
      if (item.getAttribute('subscription') == 'remove') {
929
 
                                Debug.log("removing user " + user.jid,2);
 
958
        Debug.log("removing user " + user.jid,2);
930
959
        roster.removeUser(user);
931
960
      } else { // update user
932
 
        user.name = item.getAttribute('name')? item.getAttribute('name') : item.getAttribute('jid');
 
961
        user.name = item.getAttribute('name')? htmlEnc(item.getAttribute('name')) : item.getAttribute('jid');
933
962
        user.groups = new Array('');
934
 
                                for (var j=0; j<item.childNodes.length; j++)
935
 
                                        if (item.childNodes.item(j).nodeName == 'group')
936
 
                                                user.groups = user.groups.concat(item.childNodes.item(j).firstChild.nodeValue);
 
963
        for (var j=0; j<item.childNodes.length; j++)
 
964
          if (item.childNodes.item(j).nodeName == 'group')
 
965
            user.groups = user.groups.concat(item.childNodes.item(j).firstChild.nodeValue);
937
966
        roster.updateGroups();
938
967
      }
939
 
                        if (item.getAttribute('subscription') == "from")
940
 
                                openSubscription(item.getAttribute('jid')); // subscribe to user
941
968
    } else {// got a new user
942
 
                        if (isGateway(cutResource(item.getAttribute('jid')))) { // auto add
943
 
                                // get name
944
 
                                var name = cutResource(item.getAttribute('jid'));
945
 
                                for (var i in disco)
946
 
                                        if (i == cutResource(item.getAttribute('jid')))
947
 
                                                name = disco[i].getQuery().getElementsByTagName('identity').item(0).getAttribute('name');
948
 
 
949
 
                                // add to roster
950
 
                                var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name);
951
 
                                aUser.fulljid = item.getAttribute('jid');
952
 
                                roster.addUser(aUser);
953
 
 
954
 
                                // tell server about it
955
 
                                var aIQ = new JSJaCIQ();
956
 
                                aIQ.setType('set');
957
 
                                var query = aIQ.setQuery('jabber:iq:roster');
958
 
                                var aItem = query.appendChild(aIQ.getDoc().createElement('item'));
959
 
                                aItem.setAttribute('jid',cutResource(item.getAttribute('jid')));
960
 
                                aItem.setAttribute('name',name);
961
 
                                aItem.appendChild(iq.getDoc().createElement('group')).appendChild(iq.getDoc().createTextNode('Gateways'));
962
 
 
963
 
                                con.send(aIQ);
964
 
                        } else {
 
969
      if (isGateway(item.getAttribute('jid'))) { // auto add gateways
 
970
        // get name
 
971
        var name = cutResource(item.getAttribute('jid'));
 
972
        for (var i in disco) {
 
973
          if (typeof(disco[i]) != 'object') continue;
 
974
          if (i == cutResource(item.getAttribute('jid')))
 
975
            name = disco[i].getQuery().getElementsByTagName('identity').item(0).getAttribute('name');
 
976
        }
 
977
 
 
978
        // add to roster
 
979
        var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name);
 
980
        //aUser.fulljid = item.getAttribute('jid');
 
981
        roster.addUser(aUser);
 
982
        
 
983
        // set name and group
 
984
        var aIQ = new JSJaCIQ();
 
985
        aIQ.setType('set');
 
986
        var query = aIQ.setQuery('jabber:iq:roster');
 
987
        var aItem = query.appendChild(aIQ.getDoc().createElement('item'));
 
988
        aItem.setAttribute('jid',item.getAttribute('jid'));
 
989
        aItem.setAttribute('name',name);
 
990
        aItem.appendChild(iq.getDoc().createElement('group')).appendChild(iq.getDoc().createTextNode('Gateways'));
 
991
        
 
992
        con.send(aIQ);
 
993
      } else { // new but not a gateway
965
994
        var name = item.getAttribute('name')? item.getAttribute('name') : item.getAttribute('jid');
966
 
                                if (name.indexOf('@') != -1)
967
 
                                        name = name.substring(0,name.indexOf('@'));
968
 
 
969
 
                                item.setAttribute('name',name);
 
995
        if (name.indexOf('@') != -1)
 
996
          name = name.substring(0,name.indexOf('@'));
 
997
        
 
998
        item.setAttribute('name',name);
970
999
        var groups = new Array('');
971
 
                                for (var j=0; j<item.childNodes.length; j++)
972
 
                                        if (item.childNodes.item(j).nodeName == 'group')
973
 
                                                groups = groups.concat(item.childNodes.item(j).firstChild.nodeValue);
974
 
                                
975
 
                                roster.addUser(new RosterUser(item.getAttribute('jid'),item.getAttribute('subscription'),groups,name));
976
 
 
977
 
                                var aIQ = new JSJaCIQ();
978
 
                                aIQ.setType('set');
979
 
                                var query = aIQ.setQuery('jabber:iq:roster');
980
 
 
981
 
                                var aItem = item.cloneNode(true);
982
 
                                aItem.removeAttribute('subscription');
983
 
                                query.appendChild(aItem);
984
 
 
985
 
                                con.send(aIQ); // set stripped name
986
 
 
987
 
                                if (item.getAttribute('subscription') == "from")
988
 
                                        openSubscription(item.getAttribute('jid')); // subscribe to user
989
 
                        }
 
1000
        for (var j=0; j<item.childNodes.length; j++)
 
1001
          if (item.childNodes.item(j).nodeName == 'group')
 
1002
            groups = groups.concat(item.childNodes.item(j).firstChild.nodeValue);
 
1003
        
 
1004
        roster.addUser(new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),groups,name));
 
1005
        
 
1006
        var aIQ = new JSJaCIQ();
 
1007
        aIQ.setType('set');
 
1008
        var query = aIQ.setQuery('jabber:iq:roster');
 
1009
        
 
1010
        var aItem = item.cloneNode(true);
 
1011
        aItem.removeAttribute('subscription');
 
1012
        query.appendChild(aItem);
 
1013
        
 
1014
        con.send(aIQ); // set stripped name
 
1015
        
 
1016
        if (item.getAttribute('subscription') == "from" && item.getAttribute('ask') != 'subscribe')
 
1017
          openSubscription(item.getAttribute('jid')); // subscribe to user
 
1018
      }
990
1019
    }
991
1020
  }
992
1021
  roster.print();
993
1022
}
994
1023
 
995
1024
function handleConError(e) {
996
 
        switch (e.getAttribute('code')) {
997
 
        case '401':
998
 
                alert("Autorizzazione fallita!");
999
 
                if (!con.connected())
1000
 
                        window.close();
1001
 
                break;
1002
 
        case '409':
1003
 
                alert("Registrazione fallita!\n\nProva con un altro nome Utente!");
1004
 
                break;
1005
 
        case '503':
1006
 
                alert("Servizio Non Disponibile");
1007
 
                break;
1008
 
        case '500':
1009
 
                if (!con.connected())
1010
 
                        if (confirm("Errore interno del server.\n\nDisconnesso.\n\nVuoi riconnetterti?"))
1011
 
                                changeStatus(onlstat,onlmsg);
1012
 
                break;
1013
 
        default:
1014
 
                alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :)
1015
 
                break;
1016
 
        }
 
1025
  switch (e.getAttribute('code')) {
 
1026
  case '401':
 
1027
    alert("Autorizzazione fallita!");
 
1028
    if (!con.connected())
 
1029
      window.close();
 
1030
    break;
 
1031
  case '409':
 
1032
    alert("Registrazione fallita!\n\nProva con un altro nome Utente!");
 
1033
    break;
 
1034
  case '503':
 
1035
    alert("Servizio Non Disponibile");
 
1036
    break;
 
1037
  case '500':
 
1038
    if (!con.connected() && !logoutCalled && onlstat != 'offline')
 
1039
      if (confirm("Errore interno del server.\n\nDisconnesso.\n\nVuoi riconnetterti?"))
 
1040
        changeStatus(onlstat,onlmsg);
 
1041
    break;
 
1042
  default:
 
1043
    alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :)
 
1044
    break;
 
1045
  }
1017
1046
}
1018
1047
 
1019
1048
function handleDisconnect() {
1020
 
        if (logoutCalled || onlstat == 'offline')
1021
 
                return;
1022
 
 
1023
 
        // disconnecting not with onunload handler triggered
1024
 
        statusLed.src = unavailableLed.src; // offline icon
1025
 
        statusMsg.value = '';
1026
 
 
 
1049
  if (logoutCalled || onlstat == 'offline')
 
1050
    return;
 
1051
  
 
1052
  // disconnecting not with onunload handler triggered
 
1053
  statusLed.src = unavailableLed.src; // offline icon
 
1054
  statusMsg.value = '';
 
1055
  
1027
1056
  fmd.getElementById('roster').innerHTML = '';
1028
 
 
 
1057
  
1029
1058
//      if (confirm("Disconnesso\n\nRiconnetti?"))
1030
1059
//              changeStatus(onlstat,onlmsg);
1031
1060
}
1032
1061
 
1033
1062
function handleConnected() {
1034
1063
 
1035
 
        Debug.log("Connected",0);
1036
 
 
1037
 
        if (register && opener && opener.document.forms[0] && opener.document.forms[0].register)
1038
 
                opener.document.forms[0].register.checked = false; 
1039
 
 
1040
 
        /* get/setup roster */
1041
 
        iq = new JSJaCIQ();
1042
 
        iq.setIQ(null,null,'get','roster_1');
1043
 
        iq.setQuery('jabber:iq:roster');
1044
 
        con.send(iq,getRoster); // cascading information retrieval
 
1064
  Debug.log("Connected",0);
 
1065
  
 
1066
  if (register && opener && opener.document.forms[0] && opener.document.forms[0].register)
 
1067
    opener.document.forms[0].register.checked = false; 
 
1068
  
 
1069
  /* get/setup roster */
 
1070
  iq = new JSJaCIQ();
 
1071
  iq.setIQ(null,'get','roster_1');
 
1072
  iq.setQuery('jabber:iq:roster');
 
1073
  con.send(iq,getRoster); // cascading information retrieval
1045
1074
}
1046
1075
 
1047
1076
/* *** cascading onconnect handlers *** */
1048
1077
function getRoster(iq) {
1049
 
        if (!iq || iq.getType() != 'result') {
1050
 
                if (iq)
1051
 
                        Debug.log("Error fetching roster:\n"+iq.getDoc().xml,1);
1052
 
                else
1053
 
                        Debug.log("Error fetching roster",1);
1054
 
                return;
1055
 
        }
1056
 
 
1057
 
        Debug.log("got roster:\n"+iq.getDoc().xml,2);
1058
 
        
1059
 
        roster = new Roster(iq.getQuery().childNodes,fmd);
1060
 
        roster.usersHidden = usersHidden;
1061
 
        roster.nick = jid.substring(0,jid.indexOf('@')); // remember nick for 1:1 Chats
1062
 
 
1063
 
        // get saved state
1064
 
        iq = new JSJaCIQ();
1065
 
        iq.setIQ(null,null,'get','jwchat_state');
1066
 
        var query = iq.setQuery('jabber:iq:private');
1067
 
        query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:state');
1068
 
 
1069
 
        con.send(iq,getSavedState);
 
1078
  if (!iq || iq.getType() != 'result') {
 
1079
    if (iq)
 
1080
      Debug.log("Error fetching roster:\n"+iq.getDoc().xml,1);
 
1081
    else
 
1082
      Debug.log("Error fetching roster",1);
 
1083
    return;
 
1084
  }
 
1085
  
 
1086
  Debug.log("got roster:\n"+iq.getDoc().xml,2);
 
1087
  
 
1088
  roster = new Roster(iq.getQuery().childNodes,fmd);
 
1089
  roster.usersHidden = usersHidden;
 
1090
  roster.nick = jid.substring(0,jid.indexOf('@')); // remember nick for 1:1 Chats
 
1091
  
 
1092
  // get saved state
 
1093
  iq = new JSJaCIQ();
 
1094
  iq.setIQ(null,'get','jwchat_state');
 
1095
  var query = iq.setQuery('jabber:iq:private');
 
1096
  query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:state');
 
1097
  con.send(iq,getSavedState);
1070
1098
}
1071
1099
 
1072
1100
function getSavedState(iq) {
1073
 
        if (!iq || iq.getType() != 'result')
1074
 
                if (iq)
1075
 
                        Debug.log("Error retrieving saved state:\n"+iq.getDoc().xml,1);
1076
 
                else
1077
 
                        Debug.log("Error retrieving saved state",1);
1078
 
                        
1079
 
        if (iq && iq.getType() == 'result') {
1080
 
                Debug.log(iq.getDoc().xml,3);
1081
 
                var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
1082
 
                for (var i=0; i<jNode.childNodes.length; i++) {
1083
 
                        var item = jNode.childNodes.item(i);
1084
 
                        if (item.nodeName == 'presence' && item.firstChild && onlstat == '')
1085
 
                                onlstat = item.firstChild.nodeValue;
1086
 
                        if (item.nodeName == 'hiddenGroups' && item.firstChild) {
1087
 
                                var hiddenGroups = item.firstChild.nodeValue.split(',');
1088
 
                                for (var j in hiddenGroups)
1089
 
                                        if (hiddenGroups[j] != '')
1090
 
                                                roster.hiddenGroups[hiddenGroups[j]] = true;
1091
 
                        }
1092
 
                }
1093
 
        }
1094
 
 
1095
 
        // get prefs
1096
 
        iq = new JSJaCIQ();
1097
 
        iq.setIQ(null,null,'get','jwchat_prefs');
1098
 
        var query = iq.setQuery('jabber:iq:private');
1099
 
        query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:prefs');
1100
 
 
1101
 
        con.send(iq,getPrefs);
 
1101
  if (!iq || iq.getType() != 'result')
 
1102
    if (iq)
 
1103
      Debug.log("Error retrieving saved state:\n"+iq.getDoc().xml,1);
 
1104
    else
 
1105
      Debug.log("Error retrieving saved state",1);
 
1106
  
 
1107
  if (iq && iq.getType() == 'result') {
 
1108
    Debug.log(iq.getDoc().xml,3);
 
1109
    var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
 
1110
    for (var i=0; i<jNode.childNodes.length; i++) {
 
1111
      var item = jNode.childNodes.item(i);
 
1112
      if (item.nodeName == 'presence' && item.firstChild && onlstat == '' && 
 
1113
      item.firstChild.nodeValue != 'offline')
 
1114
        onlstat = item.firstChild.nodeValue;
 
1115
      if (item.nodeName == 'onlmsg' && item.firstChild && onlmsg == '')
 
1116
        onlmsg = item.firstChild.nodeValue;
 
1117
      if (item.nodeName == 'hiddenGroups' && item.firstChild) {
 
1118
        var hiddenGroups = item.firstChild.nodeValue.split(',');
 
1119
        for (var j=0; j<hiddenGroups.length; j++)
 
1120
          if (hiddenGroups[j] != '')
 
1121
            roster.hiddenGroups[hiddenGroups[j]] = true;
 
1122
      }
 
1123
    }
 
1124
  }
 
1125
  
 
1126
  // get prefs
 
1127
  iq = new JSJaCIQ();
 
1128
  iq.setIQ(null,'get','jwchat_prefs');
 
1129
  var query = iq.setQuery('jabber:iq:private');
 
1130
  query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:prefs');
 
1131
  
 
1132
  con.send(iq,getPrefs);
1102
1133
}
1103
1134
 
1104
1135
function getPrefs(iq) {
1105
 
        if (!iq || iq.getType() != 'result')
1106
 
                if (iq)
1107
 
                        Debug.log("Error retrieving preferences:\n"+iq.getDoc().xml,1);
1108
 
                else
1109
 
                        Debug.log("Error retrieving preferences",1);
1110
 
 
1111
 
        if (iq && iq.getType() == 'result') {
1112
 
                Debug.log(iq.getDoc().xml,3);
1113
 
                if (iq.getNode().getElementsByTagName('jwchat').item(0)) {
1114
 
                        var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
1115
 
                        for (var i=0; i<jNode.childNodes.length; i++) {
1116
 
                                switch (jNode.childNodes.item(i).nodeName) {
1117
 
                                case 'usersHidden':
1118
 
                                        if (eval(jNode.childNodes.item(i).firstChild.nodeValue))
1119
 
                                                roster.toggleHide();
1120
 
                                        break;
1121
 
                                case 'timerval':
1122
 
                                        timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1123
 
                                        con.setPollInterval(timerval);
1124
 
                                        break;
1125
 
                                case 'autoPopup':
1126
 
                                        autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1127
 
                                        break;
1128
 
                                case 'autoPopupAway':
1129
 
                                        autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1130
 
                                        break;
1131
 
                                case 'playSounds':
1132
 
                                        playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1133
 
                                        break;
1134
 
                                case 'focusWindows':
1135
 
                                        focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1136
 
                                        break;
1137
 
                                case 'timestamps':
1138
 
                                        timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1139
 
                                        break;
1140
 
                                case 'enableLog':
1141
 
                                        enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1142
 
                                        break;
1143
 
                                }
1144
 
                        }
1145
 
                }
 
1136
  if (!iq || iq.getType() != 'result')
 
1137
    if (iq)
 
1138
      Debug.log("Error retrieving preferences:\n"+iq.getDoc().xml,1);
 
1139
    else
 
1140
      Debug.log("Error retrieving preferences",1);
 
1141
  
 
1142
  if (iq && iq.getType() == 'result') {
 
1143
    Debug.log(iq.getDoc().xml,3);
 
1144
    if (iq.getNode().getElementsByTagName('jwchat').item(0)) {
 
1145
      var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
 
1146
      for (var i=0; i<jNode.childNodes.length; i++) {
 
1147
        switch (jNode.childNodes.item(i).nodeName) {
 
1148
        case 'usersHidden':
 
1149
          if (eval(jNode.childNodes.item(i).firstChild.nodeValue) != usersHidden)
 
1150
            roster.toggleHide();
 
1151
          break;
 
1152
        case 'timerval':
 
1153
          timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1154
          con.setPollInterval(timerval);
 
1155
          break;
 
1156
        case 'autoPopup':
 
1157
          autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1158
          break;
 
1159
        case 'autoPopupAway':
 
1160
          autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1161
          break;
 
1162
        case 'playSounds':
 
1163
          playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1164
          break;
 
1165
        case 'focusWindows':
 
1166
          focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1167
          break;
 
1168
        case 'timestamps':
 
1169
          timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1170
          break;
 
1171
        case 'enableLog':
 
1172
          enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue);
 
1173
          break;
1146
1174
        }
1147
 
 
1148
 
        // print roster
1149
 
        roster.print();
1150
 
 
1151
 
        // send presence
1152
 
        if (onlstat == '')
1153
 
                onlstat = 'available';
1154
 
        changeStatus(onlstat);
1155
 
 
1156
 
        playSound('connected');
1157
 
 
1158
 
        // Start Service Discovery
1159
 
        iq = new JSJaCIQ();
1160
 
        iq.setIQ(con.server,null,'get','disco_item_1');
1161
 
        iq.setQuery('http://jabber.org/protocol/disco#items');
1162
 
 
1163
 
        con.send(iq,getDiscoItems);
1164
 
 
1165
 
        // get bookmarks
1166
 
        iq = new JSJaCIQ();
1167
 
        iq.setIQ(null,null,'get','storage_bookmarks');
1168
 
        var query = iq.setQuery('jabber:iq:private');
1169
 
        query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:bookmarks');
1170
 
 
1171
 
        con.send(iq,getBookmarks);
1172
 
 
1173
 
        // get annotations
1174
 
        iq = new JSJaCIQ();
1175
 
        iq.setIQ(null,null,'get','jwchat_notes');
1176
 
        var query = iq.setQuery('jabber:iq:private');
1177
 
        query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:notes');
1178
 
 
1179
 
        con.send(iq,getAnnotations);
 
1175
      }
 
1176
    }
 
1177
  }
 
1178
  
 
1179
  // print roster
 
1180
  roster.print();
 
1181
  
 
1182
  if (opener.prio)
 
1183
    onlprio = opener.prio;
 
1184
  else
 
1185
    onlprio = DEFAULTPRIORITY;
 
1186
  
 
1187
  // send presence
 
1188
  if (onlstat == '')
 
1189
    onlstat = 'available';
 
1190
  changeStatus(onlstat,onlmsg,onlprio);
 
1191
  
 
1192
  playSound('connected');
 
1193
  
 
1194
  // Start Service Discovery
 
1195
  iq = new JSJaCIQ();
 
1196
  iq.setIQ(con.domain,'get','disco_item_1');
 
1197
  iq.setQuery('http://jabber.org/protocol/disco#items');
 
1198
  
 
1199
  con.send(iq,getDiscoItems);
 
1200
  
 
1201
  // get bookmarks
 
1202
  iq = new JSJaCIQ();
 
1203
  iq.setIQ(null,'get','storage_bookmarks');
 
1204
  var query = iq.setQuery('jabber:iq:private');
 
1205
  query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:bookmarks');
 
1206
  
 
1207
  con.send(iq,getBookmarks);
 
1208
  
 
1209
  // get annotations
 
1210
  iq = new JSJaCIQ();
 
1211
  iq.setIQ(null,'get','jwchat_notes');
 
1212
  var query = iq.setQuery('jabber:iq:private');
 
1213
  query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:rosternotes');
 
1214
  
 
1215
  con.send(iq,getAnnotations);
1180
1216
}
1181
1217
 
1182
 
var disco;
1183
1218
function getDiscoItems(iq) {
1184
 
        if (!iq)
1185
 
                return;
1186
 
        
1187
 
        Debug.log(iq.getDoc().xml,2);
1188
 
 
1189
 
        disco = new Array();
1190
 
 
1191
 
        var items = iq.getNode().firstChild.childNodes;
1192
 
 
1193
 
        /* query items */
1194
 
        for (var i=0; i<items.length; i++) {
1195
 
                if (items[i].nodeName != 'item' || !items[i].getAttribute('jid') || items[i].getAttribute('node')!=null) // skip those
1196
 
                        continue;
1197
 
                var aIQ = new JSJaCIQ();
1198
 
                aIQ.setIQ(items[i].getAttribute('jid'),null,'get','disco_info_'+i);
1199
 
                aIQ.setQuery("http://jabber.org/protocol/disco#info");
1200
 
                
1201
 
                con.send(aIQ,getDiscoInfo);
1202
 
        }
 
1219
  if (!iq)
 
1220
    return;
 
1221
  
 
1222
  Debug.log(iq.getDoc().xml,2);
 
1223
  
 
1224
  disco = new Object();
 
1225
  
 
1226
  var items = iq.getNode().firstChild.childNodes;
 
1227
  
 
1228
  /* query items */
 
1229
  for (var i=0; i<items.length; i++) {
 
1230
    if (items[i].nodeName != 'item' || !items[i].getAttribute('jid') || items[i].getAttribute('node')!=null) // skip those
 
1231
      continue;
 
1232
    var aIQ = new JSJaCIQ();
 
1233
    aIQ.setIQ(items[i].getAttribute('jid'),'get','disco_info_'+i);
 
1234
    aIQ.setQuery("http://jabber.org/protocol/disco#info");
 
1235
    
 
1236
    con.send(aIQ,getDiscoInfo);
 
1237
  }
1203
1238
}
1204
1239
 
1205
1240
function getDiscoInfo(iq) {
1206
 
        if (!iq || iq.getType() != 'result')
1207
 
                return;
1208
 
 
1209
 
        Debug.log(iq.getDoc().xml,2);
1210
 
        if (iq.getType() == 'result') {
1211
 
                disco[iq.getFrom()] = iq;
1212
 
                
1213
 
                // If the identity does not have a name, set the name to jid
1214
 
                if(iq.getNode().getElementsByTagName('identity').item(0).getAttribute('name') == null)
1215
 
                        iq.getNode().getElementsByTagName('identity').item(0).setAttribute('name', iq.getFrom());
1216
 
 
1217
 
                // set loghost
1218
 
                if (iq.getNode().getElementsByTagName('identity').item(0)) {
1219
 
                        if (iq.getNode().getElementsByTagName('identity').item(0).getAttribute('category') == 'store') {
1220
 
                                for (var j=0; j<iq.getNode().getElementsByTagName('feature').length; j++) {
1221
 
                                        if (iq.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'http://jabber.org/protocol/archive') {
1222
 
                                                loghost = iq.getFrom();
1223
 
                                                break;
1224
 
                                        }
1225
 
                                }
1226
 
                        }
1227
 
                }
 
1241
  if (!iq || iq.getType() != 'result')
 
1242
    return;
 
1243
  
 
1244
  Debug.log(iq.getDoc().xml,2);
 
1245
  if (iq.getType() == 'result') {
 
1246
    disco[iq.getFrom()] = iq;
 
1247
    
 
1248
    // If the identity does not have a name, set the name to jid
 
1249
    if(iq.getNode().getElementsByTagName('identity').item(0).getAttribute('name') == null)
 
1250
      iq.getNode().getElementsByTagName('identity').item(0).setAttribute('name', iq.getFrom());
 
1251
    
 
1252
    // set loghost
 
1253
    if (iq.getNode().getElementsByTagName('identity').item(0)) {
 
1254
      if (iq.getNode().getElementsByTagName('identity').item(0).getAttribute('type') == 'archive') {
 
1255
        for (var j=0; j<iq.getNode().getElementsByTagName('feature').length; j++) {
 
1256
          if (iq.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'http://jabber.org/protocol/archive') {
 
1257
            loghost = iq.getFrom();
 
1258
            break;
 
1259
          }
1228
1260
        }
 
1261
      }
 
1262
    }
 
1263
  }
1229
1264
}
1230
1265
 
1231
1266
var bookmarks;
1232
1267
function getBookmarks(iq) {
1233
 
        if (!iq || iq.getType() != 'result')
1234
 
                return;
1235
 
 
1236
 
        Debug.log(iq.getDoc().xml,2);
1237
 
 
1238
 
        bookmarks = new Array();
1239
 
 
1240
 
        if (iq.getNode().getElementsByTagName('storage').item(0)) {
1241
 
                var jNode = iq.getNode().getElementsByTagName('storage').item(0);
1242
 
                for (var i=0; i<jNode.childNodes.length; i++) {
1243
 
                        var item = jNode.childNodes.item(i);
1244
 
                        if (item.nodeName == 'conference') {
1245
 
                                var bookmark = new Object();
1246
 
                                bookmark.jid = item.getAttribute('jid');
1247
 
                                bookmark.name = item.getAttribute('name');
1248
 
                                if (item.getAttribute('autojoin') == '1')
1249
 
                                        bookmark.autojoin = '1';
1250
 
                                if (item.getElementsByTagName('nick').item(0))
1251
 
                                        bookmark.nick = item.getElementsByTagName('nick').item(0).firstChild.nodeValue;
1252
 
                                if (item.getElementsByTagName('pass').item(0))
1253
 
                                        bookmark.pass = item.getElementsByTagName('pass').item(0).firstChild.nodeValue;
1254
 
                                bookmarks[bookmarks.length] = bookmark;
1255
 
                                if (bookmark.autojoin == '1') {
1256
 
                                        openGroupchat(bookmark.jid, bookmark.nick, bookmark.pass);
1257
 
                                }
1258
 
                        }
1259
 
                }
 
1268
  if (!iq || iq.getType() != 'result')
 
1269
    return;
 
1270
  
 
1271
  Debug.log(iq.getDoc().xml,2);
 
1272
  
 
1273
  bookmarks = new Array();
 
1274
 
 
1275
  if (iq.getNode().getElementsByTagName('storage').item(0)) {
 
1276
    var jNode = iq.getNode().getElementsByTagName('storage').item(0);
 
1277
    for (var i=0; i<jNode.childNodes.length; i++) {
 
1278
      var item = jNode.childNodes.item(i);
 
1279
      if (item.nodeName == 'conference') {
 
1280
        var bookmark = new Object();
 
1281
        bookmark.jid = item.getAttribute('jid');
 
1282
        bookmark.name = item.getAttribute('name');
 
1283
        if (item.getAttribute('autojoin') == '1')
 
1284
          bookmark.autojoin = '1';
 
1285
        if (item.getElementsByTagName('nick').item(0))
 
1286
          bookmark.nick = item.getElementsByTagName('nick').item(0).firstChild.nodeValue;
 
1287
        if (item.getElementsByTagName('pass').item(0))
 
1288
          bookmark.pass = item.getElementsByTagName('pass').item(0).firstChild.nodeValue;
 
1289
        bookmarks[bookmarks.length] = bookmark;
 
1290
        if (bookmark.autojoin == '1') {
 
1291
          openGroupchat(bookmark.jid, bookmark.nick, bookmark.pass);
1260
1292
        }
 
1293
      }
 
1294
    }
 
1295
  }
1261
1296
}
1262
1297
 
1263
1298
var annotations;
1264
1299
function getAnnotations(iq) {
1265
 
        if (!iq || iq.getType() != 'result')
1266
 
                return;
1267
 
        
1268
 
        Debug.log(iq.getDoc().xml,2);
1269
 
        
1270
 
        annotations = new Array();
 
1300
  if (!iq || iq.getType() != 'result')
 
1301
    return;
 
1302
        
 
1303
  Debug.log(iq.getDoc().xml,2);
 
1304
        
 
1305
  annotations = new Object();
1271
1306
 
1272
 
        if (iq.getType() == 'result') {
1273
 
                if (iq.getNode().getElementsByTagName('jwchat').item(0)) {
1274
 
                        var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
1275
 
                        for (var i=0; i<jNode.childNodes.length; i++)
1276
 
                                if (jNode.childNodes.item(i).nodeName == 'item' && jNode.childNodes.item(i).firstChild)
1277
 
                                        annotations[jNode.childNodes.item(i).getAttribute('jid')] = jNode.childNodes.item(i).firstChild.nodeValue;
1278
 
                }
1279
 
        }
 
1307
  if (iq.getType() == 'result') {
 
1308
    if (iq.getNode().getElementsByTagName('storage').item(0)) {
 
1309
      var jNode = iq.getNode().getElementsByTagName('storage').item(0);
 
1310
      for (var i=0; i<jNode.childNodes.length; i++)
 
1311
        if (jNode.childNodes.item(i).nodeName == 'note' && jNode.childNodes.item(i).firstChild)
 
1312
          annotations[jNode.childNodes.item(i).getAttribute('jid')] = jNode.childNodes.item(i).firstChild.nodeValue;
 
1313
    }
 
1314
  }
1280
1315
}
1281
1316
 
1282
1317
 
1293
1328
var con, Debug, srcW;
1294
1329
function init() {
1295
1330
 
1296
 
        /* initialise debugger */
1297
 
        if (!Debug || typeof(Debug) == 'undefined' || !Debug.start) {
1298
 
                if (typeof(Debugger) != 'undefined')
1299
 
                        Debug = new Debugger(DEBUG_LVL,'JWChat ' + cutResource(jid));
1300
 
                else {
1301
 
                        Debug = new Object();
1302
 
                        Debug.log = function() {};
1303
 
                        Debug.start = function() {};
1304
 
                }
1305
 
        }
1306
 
        if (DEBUG &&  (!USE_DEBUGJID || DEBUGJID == cutResource(jid)))
1307
 
                Debug.start();
1308
 
 
 
1331
  /* initialise debugger */
 
1332
  if (!Debug || typeof(Debug) == 'undefined' || !Debug.start) {
 
1333
    if (typeof(Debugger) != 'undefined')
 
1334
      Debug = new Debugger(DEBUG_LVL,'JWChat ' + cutResource(jid));
 
1335
    else {
 
1336
      Debug = new Object();
 
1337
      Debug.log = function() {};
 
1338
      Debug.start = function() {};
 
1339
    }
 
1340
  }
 
1341
  if (DEBUG &&  (!USE_DEBUGJID || DEBUGJID == cutResource(jid)))
 
1342
    Debug.start();
 
1343
  
1309
1344
  Debug.log("jid: "+jid+"\npass: "+pass,2);
1310
1345
 
1311
1346
  /* get some refs to static elements */
1319
1354
  /* set nick */
1320
1355
  frames["jwc_main"].document.getElementById('myNickname').innerHTML = nick;  
1321
1356
 
1322
 
        /* ***
1323
 
         * create new connection
1324
 
         */
1325
 
        if (BACKEND_TYPE == 'binding')
1326
 
                con = new JSJaCHttpBindingConnection(Debug);
1327
 
        else
1328
 
                con = new JSJaCHttpPollingConnection(Debug);
1329
 
 
1330
 
        /* register handlers */
1331
 
        con.registerHandler('iq',handleIQSet);
1332
 
        con.registerHandler('presence',handlePresence);
1333
 
        con.registerHandler('message',handleMessage);
1334
 
        con.registerHandler('message',handleMessageError);
1335
 
        con.registerHandler('ondisconnect',handleDisconnect);
1336
 
        con.registerHandler('onconnect',handleConnected);
1337
 
        con.registerHandler('onerror',handleConError);
1338
 
 
1339
 
        /* connect to remote */
1340
 
        con.connect(HTTPBASE,JABBERSERVER,jid.substring(0,jid.indexOf('@')),jid.substring(jid.indexOf('/')+1),pass,timerval,register);
 
1357
  /* init empty roster */
 
1358
  roster = new Roster();
 
1359
  
 
1360
  /* ***
 
1361
   * create new connection
 
1362
   */
 
1363
  var oArg = {oDbg: Debug, httpbase: HTTPBASE, timerval: timerval};
 
1364
  
 
1365
  if (BACKEND_TYPE == 'binding')
 
1366
    con = new JSJaCHttpBindingConnection(oArg);
 
1367
  else
 
1368
    con = new JSJaCHttpPollingConnection(oArg);
 
1369
  
 
1370
  /* register handlers */
 
1371
  con.registerHandler('iq',handleIQSet);
 
1372
  con.registerHandler('presence',handlePresence);
 
1373
  con.registerHandler('message',handleMessage);
 
1374
  con.registerHandler('message',handleMessageError);
 
1375
  con.registerHandler('ondisconnect',handleDisconnect);
 
1376
  con.registerHandler('onconnect',handleConnected);
 
1377
  con.registerHandler('onerror',handleConError);
 
1378
  
 
1379
  /* connect to remote */
 
1380
  oArg = {domain:JABBERSERVER,username:jid.substring(0,jid.indexOf('@')),resource:jid.substring(jid.indexOf('/')+1),pass:pass,register:register}
 
1381
  
 
1382
  if (BACKEND_TYPE == 'binding') {
 
1383
    if (opener.connect_port && !isNaN(opener.connect_port))
 
1384
      oArg.port = opener.connect_port;
 
1385
    if (opener.connect_host && opener.connect_host != '')
 
1386
      oArg.host = opener.connect_host;
 
1387
    if (opener && opener.connect_secure)
 
1388
      oArg.secure = true;
 
1389
  }
 
1390
  con.connect(oArg);
1341
1391
}
1342
1392
 
1343
1393
/************************************************************************
1347
1397
 
1348
1398
function cleanUp() {
1349
1399
  /* close dependent windows */
1350
 
        if (roster)
1351
 
                roster.cleanUp();
1352
 
 
 
1400
  if (roster)
 
1401
    roster.cleanUp();
 
1402
  
1353
1403
  if (subw && !subw.closed)
1354
1404
    subw.close();
1355
 
 
1356
 
        if (typeof(ow) != 'undefined' && ow && !ow.closed)
1357
 
                ow.close();
1358
 
 
1359
 
        if (searchW && !searchW.closed)
1360
 
                searchW.close();
1361
 
 
1362
 
        if (ebW && !ebW.closed)
1363
 
                ebW.close();
1364
 
 
 
1405
  
 
1406
  if (typeof(ow) != 'undefined' && ow && !ow.closed)
 
1407
    ow.close();
 
1408
  
 
1409
  if (searchW && !searchW.closed)
 
1410
    searchW.close();
 
1411
  
 
1412
  if (ebW && !ebW.closed)
 
1413
    ebW.close();
 
1414
  
1365
1415
  fmd.getElementById('roster').innerHTML = '';
1366
1416
 
1367
1417
  // clear frames
1372
1422
 
1373
1423
var logoutCalled = false;
1374
1424
function logout() {
1375
 
        logoutCalled = true;
1376
 
        cleanUp();
1377
 
 
1378
 
        if (!con.connected())
1379
 
                return;
1380
 
 
1381
 
        /* save state */
1382
 
        var iq = new JSJaCIQ();
1383
 
        iq.setIQ(null,null,'set');
1384
 
        var query = iq.setQuery('jabber:iq:private');
1385
 
        var aNode = query.appendChild(iq.getDoc().createElement('jwchat'));
1386
 
        aNode.setAttribute('xmlns','jwchat:state');
1387
 
 
1388
 
        // save presence
1389
 
        aNode.appendChild(iq.getDoc().createElement('presence')).appendChild(iq.getDoc().createTextNode(onlstat));
1390
 
        
1391
 
        var hiddengroups = '';
1392
 
        if (typeof(roster) != 'undefined') {
1393
 
                for (var i in roster.hiddenGroups)
1394
 
                        if (roster.hiddenGroups[i])
1395
 
                                hiddengroups += i+",";
1396
 
        }
1397
 
 
1398
 
        if (hiddengroups != '')
1399
 
                aNode.appendChild(iq.getDoc().createElement('hiddenGroups')).appendChild(iq.getDoc().createTextNode(hiddengroups));
1400
 
 
1401
 
        con.syncSend(iq);
1402
 
 
1403
 
        var aPresence = new JSJaCPresence();
1404
 
        aPresence.setType('unavailable');
1405
 
        con.syncSend(aPresence);
1406
 
 
1407
 
        con.disconnect();
 
1425
  logoutCalled = true;
 
1426
  cleanUp();
 
1427
  
 
1428
  if (!con.connected())
 
1429
    return;
 
1430
  
 
1431
  /* save state */
 
1432
  var iq = new JSJaCIQ();
 
1433
  iq.setIQ(null,'set');
 
1434
  var query = iq.setQuery('jabber:iq:private');
 
1435
  var aNode = query.appendChild(iq.getDoc().createElement('jwchat'));
 
1436
  aNode.setAttribute('xmlns','jwchat:state');
 
1437
  
 
1438
  // save presence
 
1439
  if (onlstat != 'offline')
 
1440
    aNode.appendChild(iq.getDoc().createElement('presence')).appendChild(iq.getDoc().createTextNode(onlstat));
 
1441
  if (onlmsg != '')
 
1442
    aNode.appendChild(iq.getDoc().createElement('onlmsg')).appendChild(iq.getDoc().createTextNode(onlmsg));
 
1443
  
 
1444
  var hiddengroups = '';
 
1445
  if (typeof(roster) != 'undefined') {
 
1446
    for (var i=0; i<roster.hiddenGroups.length; i++)
 
1447
      if (roster.hiddenGroups[i])
 
1448
        hiddengroups += i+",";
 
1449
  }
 
1450
  
 
1451
  if (hiddengroups != '')
 
1452
    aNode.appendChild(iq.getDoc().createElement('hiddenGroups')).appendChild(iq.getDoc().createTextNode(hiddengroups));
 
1453
  
 
1454
  con.send(iq);
 
1455
  
 
1456
  var aPresence = new JSJaCPresence();
 
1457
  aPresence.setType('unavailable');
 
1458
  con.send(aPresence);
 
1459
 
 
1460
  con.disconnect();
1408
1461
}
1409
1462
 
1410
1463
/************************************************************************
1415
1468
/* check for unsupported browsers */
1416
1469
if (is.b == 'op' || 
1417
1470
    is.b == 'Konqueror' || 
1418
 
    navigator.userAgent.indexOf('Safari') != -1 ||
1419
1471
    (is.b == 'ns' && is.v < '5') ||
1420
1472
    (is.ie && is.mac) ||
1421
1473
    is.ie4