1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
<title>JWChat - Einstellungen</title>
5
<meta http-equiv="content-type" content="text/html; charset=utf-8">
6
<script src="switchStyle.js"></script>
7
<script src="version.js"></script>
8
<script src="shared.js"></script>
9
<script src="jabber_x_data.js"></script>
10
<script src="jsjac.js"></script>
13
function savePrefs() {
14
var prefs = new Array('usersHidden','autoPopup','autoPopupAway','focusWindows','timestamps','playSounds','timerval','enableLog');
19
var iq = new JSJaCIQ();
21
var query = iq.setQuery('jabber:iq:private');
22
var jNode = query.appendChild(
23
iq.buildNode('jwchat', {'xmlns': 'jwchat:prefs'}));
25
for (var i=0; i<prefs.length; i++) {
26
if (prefs[i] == 'usersHidden')
27
jNode.appendChild(iq.buildNode(prefs[i], srcW.roster.usersHidden+""));
29
jNode.appendChild(iq.buildNode(prefs[i], srcW[prefs[i]]+""));
32
srcW.Debug.log(iq.xml(),2);
38
function displayTimestamps() {
39
srcW.timestamps = form.timestamps.checked;
40
/* set timestamp display in all open chat-windows */
41
for (var i=0; i<srcW.roster.users.length; i++) {
42
if ((srcW.roster.users[i].chatW) && (srcW.roster.users[i].chatW.closed == false)) {
43
srcW.roster.users[i].chatW.top.displayTimestamp();
45
if (srcW.roster.users[i].roster) {
46
for (var j=0; j<srcW.roster.users[i].roster.users.length; j++) {
47
if (srcW.roster.users[i].roster.users[j].chatW &&
48
!srcW.roster.users[i].roster.users[j].chatW.closed)
49
srcW.roster.users[i].roster.users[j].chatW.displayTimestamp();
55
function toggleAutoPopupAway(el) {
56
document.getElementById('autoPopupAway').disabled = !el.checked;
60
function getOptions() {
61
form = document.forms['options'];
62
if (srcW.roster.usersHidden)
63
form.usersHidden.checked = true;
65
form.autoPopup.checked = true;
66
if (srcW.autoPopupAway)
67
form.autoPopupAway.checked = true;
68
if (srcW.playSounds == true)
69
form.playSounds.checked = true;
70
if (srcW.timestamps == true)
71
form.timestamps.checked = true;
72
if (srcW.focusWindows == true)
73
form.focusWindows.checked = true;
75
form.enableLog.checked = srcW.enableLog;
77
if (typeof(srcW.loghost) == 'undefined')
78
document.getElementById('tr_enableLog').style.display = 'none';
80
if (srcW.con.isPolling()) {
81
for (var i=0; i<form.timerval.options.length; i++) {
82
if (form.timerval.options[i].value == srcW.timerval)
83
form.timerval.selectedIndex = i;
86
toggleAutoPopupAway(document.getElementById('autoPopup'));
90
function service_selected(el) {
91
pane = el.nextSibling;
92
if (el.options[el.selectedIndex].value == '') {
97
pane.innerHTML = "<div class='transport_pane'>"+"Dienst wird angefragt ...<br>Bitte warten!"+"</div>";
99
var iq = new JSJaCIQ();
101
iq.setTo(el.options[el.selectedIndex].value);
102
iq.setQuery('jabber:iq:register');
105
srcW.con.send(iq,me.getRegisterForm);
108
function getRegisterForm(iq) {
109
if (!iq || iq.getType() != 'result' || iq.getQueryXMLNS() != 'jabber:iq:register') {
110
pane.innerHTML = "<div class='transport_pane'>"+"Ein Fehler ist aufgetreten..."+"</div>";
113
srcW.Debug.log(iq.getDoc().xml,2);
115
var query = iq.getQuery();
117
// check if it's jabber:x:data
120
if (iq.getNode().getElementsByTagName('x').length && iq.getNode().getElementsByTagName('x').item(0).getAttribute('xmlns') == 'jabber:x:data') {
121
html += "<form>"+genJabberXDataTable(iq.getNode().getElementsByTagName('x').item(0))+"</form>";
123
if (query.getElementsByTagName('registered').item(0))
124
html += "<div class='pane_el'><b style='color:red;'>"+"Du bist bereits an diesem Dienst angemeldet"+"</b></div>";
125
if (query.getElementsByTagName('instructions').item(0))
126
html += "<div class='pane_el'>"+query.getElementsByTagName('instructions').item(0).firstChild.nodeValue+"</div>";
127
html += "<form name='transport'><table>";
128
for (var i=0; i<query.childNodes.length; i++) {
129
var aItem = query.childNodes.item(i);
130
switch (aItem.nodeName) {
134
case 'key': // hide key
135
html += "<tr><td colspan=2><input type=hidden name='"+aItem.nodeName+"' value='"+aItem.firstChild.nodeValue+"'></td></tr>";
138
if (aItem.firstChild)
139
html += "<tr><td>"+aItem.nodeName+"</td><td><input type='password' name='"+aItem.nodeName+"' value='"+aItem.firstChild.nodeValue+"'></td></tr>";
141
html += "<tr><td>"+aItem.nodeName+"</td><td><input type='password' name='"+aItem.nodeName+"'></td></tr>";
144
if (aItem.firstChild)
145
html += "<tr><td>"+aItem.nodeName+"</td><td><input type='text' name='"+aItem.nodeName+"' value='"+aItem.firstChild.nodeValue+"'></td></tr>";
147
html += "<tr><td>"+aItem.nodeName+"</td><td><input type='text' name='"+aItem.nodeName+"'></td></tr>";
150
html += "</table></form>";
152
html += "<div class='pane_el' align='right'>";
153
if (query.getElementsByTagName('registered').item(0)) {
154
html += "<button onClick=\"unregisterGateway('"+iq.getFrom()+"');\">"+"Entfernen"+"</button>";
156
html += "<button onClick=\"registerService('"+iq.getFrom()+"','"+pane.id+"');\">"+"Aktualisieren"+"</button>";
158
html += "<button onClick=\"registerService('"+iq.getFrom()+"','"+pane.id+"');\">"+"Registrieren"+"</button>";
160
pane.innerHTML = html;
164
var ie5=document.all&&document.getElementById;
165
var oldactiveindex = 0;
167
function tabclicked(e) {
168
// find index of clicked element
169
var firingobj=ie5? event.srcElement : e.target;
170
var tablabels = document.getElementById('tablabels');
171
for (var i=0; i<tablabels.childNodes.length; i++)
172
if (tablabels.childNodes[i] == firingobj) {
173
if (oldactiveindex == i)
175
var tabs = document.getElementById('tabs');
176
tabs.childNodes[oldactiveindex].className = 'tabinactive';
177
tabs.childNodes[i].className = 'tab';
178
hide_error(tabs.childNodes[i].id);
179
tablabels.childNodes[i].className = 'tablabelactive';
180
tablabels.childNodes[oldactiveindex].className = 'tablabel';
185
function hide_error(parent_id) {
186
var el = getChildByClassName(parent_id, 'error_wrap');
187
if (el) el.style.display = 'none';
190
function show_error(parent_id, text) {
191
var el = getChildByClassName(parent_id, 'error_wrap');
193
if (!el) return false; // well ... not our fault, stupid
196
el.style.display = '';
201
function getChildByClassName(parent, className) {
202
if (document.getElementById(parent))
203
var children = document.getElementById(parent).childNodes
205
for (var i in children)
206
if (children[i].className == className)
207
return children[i]; // first occurrence
208
return null; // nothing found
211
function changePassword(form) {
212
hide_error('password_tab');
214
if (form.password_new.value != form.password_repeat.value)
215
return show_error('password_tab', "Paßwörter stimmen nicht überein");
217
var aIQ = new JSJaCIQ();
220
var aQuery = aIQ.setQuery("jabber:iq:register");
222
aQuery.appendChild(aIQ.buildNode('username', srcW.nick));
223
aQuery.appendChild(aIQ.buildNode('password', form.password_new.value));
226
srcW.con.sendIQ(aIQ,{
229
me.show_error('password_tab', "Paßwort wurde geändert");
233
me.show_error("An error occured");
240
function registerService(sJid,paneid) {
243
var pane = document.getElementById(paneid);
245
for (var i=0; i<pane.childNodes.length; i++) {
246
if (pane.childNodes[i].tagName == 'FORM') {
247
aForm = pane.childNodes[i];
254
var jabberXData = (aForm.elements['jwchat_form_type'] && aForm.elements['jwchat_form_type'].value == 'jabber:x:data');
257
setxml = genJabberXDataReply(aForm);
259
for (var i=0; i<aForm.elements.length; i++) {
260
var el = aForm.elements[i];
261
setxml += "<"+el.name+">"+el.value+"</"+el.name+">";
265
var iq = new JSJaCIQ();
269
var query = iq.setQuery('jabber:iq:register');
271
var xmldoc = XmlDocument.create('body','foo');
272
xmldoc.loadXML('<body>'+setxml+'</body>');
274
for (var i=0; i<xmldoc.firstChild.childNodes.length; i++)
275
query.appendChild(xmldoc.firstChild.childNodes.item(i).cloneNode(true));
277
srcW.Debug.log(iq.getDoc().xml,2);
280
srcW.con.send(iq,me.handleRegisterService,sJid);
282
pane.innerHTML = "<strong>"+"Request sent to "+sJid+".."+"</strong><br>";
285
/* callback from registering a service */
286
function handleRegisterService(iq,sJid) {
287
if (iq.getType() == 'error') {
289
var html = "<strong style='color:red;'>"+"Fehler";
290
if (iq.getNode().getElementsByTagName('error').item(0)) {
291
var aErr = iq.getNode().getElementsByTagName('error').item(0);
292
if (aErr.getAttribute('code'))
293
html += " ("+aErr.getAttribute('code')+")";
295
if (aErr.firstChild && aErr.firstChild.nodeValue)
296
html += aErr.firstChild.nodeValue;
297
else if (aErr.firstChild) {
298
switch (aErr.firstChild.nodeName) {
299
case 'bad-request': html += "Bad Request";
301
default: html += aErr.firstChild.nodeName;
306
html += "</strong><br/>";
307
pane.innerHTML += html;
310
pane.innerHTML += "<strong>"+"Registration successful."+"</strong><br/>";
313
pane.innerHTML += "<strong>"+"Sending presence..."+"</strong><br />";
314
var aPresence = new JSJaCPresence();
315
aPresence.setTo(sJid);
316
aPresence.setShow(srcW.onlstat);
317
aPresence.setStatus(srcW.onlmsg);
318
srcW.con.send(aPresence);
319
pane.innerHTML += "<strong>"+"Done."+"</strong><br />";
322
function unregisterGateway(sJid) {
323
if (srcW.roster.getUserByJID(sJid) != null)
324
sJid = srcW.roster.getUserByJID(sJid).fulljid;
326
pane.innerHTML = "<strong>"+"Unregistering from service "+sJid+" ..."+"</strong><br />";
327
var iq = new JSJaCIQ();
330
var query = iq.setQuery('jabber:iq:register');
331
var item = query.appendChild(iq.getDoc().createElement('remove'));
333
srcW.con.send(iq,me.handleUnregisterService,sJid);
336
function handleUnregisterService(iq,sJid) {
337
if (iq.getType() == 'error') {
338
var html = "<strong style='color:red;'>"+"Fehler";
339
if (iq.getNode().getElementsByTagName('error').item(0)) {
340
var aErr = iq.getNode().getElementsByTagName('error').item(0);
341
if (aErr.getAttribute('code'))
342
html += " ("+aErr.getAttribute('code')+")";
344
if (aErr.firstChild && aErr.firstChild.nodeValue)
345
html += aErr.firstChild.nodeValue;
346
else if (aErr.firstChild) {
347
switch (aErr.firstChild.nodeName) {
348
case 'bad-request': html += "Bad Request";
350
default: html += aErr.firstChild.nodeName;
355
html += "</strong><br/>";
356
pane.innerHTML += html;
359
pane.innerHTML += "<strong>"+"Done."+"</strong><br />";
360
pane.innerHTML += "<strong>"+"Removing "+sJid+" from roster..."+"</strong><br />";
362
var iq = new JSJaCIQ();
364
var query = iq.setQuery('jabber:iq:roster');
365
var item = query.appendChild(iq.getDoc().createElement('item'));
366
item.setAttribute('jid',sJid);
367
item.setAttribute('subscription','remove');
371
if (confirm("Remove all associated contacts?")) {
372
pane.innerHTML += "<strong>"+"Removing contacts..."+"</strong><br />";
373
var iq = new JSJaCIQ();
375
var query = iq.setQuery('jabber:iq:roster');
376
for (var i=0; i<srcW.roster.users.length; i++) {
377
if (cutResource(srcW.roster.users[i].jid.substring(srcW.roster.users[i].jid.indexOf('@')+1)) == cutResource(sJid) &&
378
srcW.roster.users[i].jid != cutResource(sJid)) {
379
var item = query.appendChild(iq.getDoc().createElement('item'));
380
item.setAttribute('jid',srcW.roster.users[i].fulljid);
381
item.setAttribute('subscription','remove');
382
pane.innerHTML += srcW.roster.users[i].name+"<br />";
387
pane.innerHTML += "<strong>"+"Done."+"</strong><br />";
392
srcW = opener.parent;
396
// initialise handlers for tabs
397
var tablabels = document.getElementById('tablabels');
398
for (var i=0; i<tablabels.childNodes.length; i++)
399
tablabels.childNodes[i].onclick = tabclicked;
402
var jwchat_version = document.getElementById('jwchat_version');
403
jwchat_version.innerHTML = VERSION;
404
if (VERSION == "CVS")
405
jwchat_version.innerHTML += "<br>(" + document.lastModified + ")";
407
var transports_selector = document.getElementById('transports_selector');
408
var transport_optidx = 1;
409
var directory_selector = document.getElementById('directory_selector');
410
var directory_optidx = 1;
411
for (var i in srcW.disco) {
412
if (!srcW.disco[i].getNode) continue;
413
var item = srcW.disco[i];
414
if (item.getNode().getElementsByTagName('identity').item(0)) {
415
if (item.getNode().getElementsByTagName('identity').item(0).getAttribute('category') == 'gateway') {
416
for (var j=0; j<item.getNode().getElementsByTagName('feature').length; j++) {
417
if (item.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'jabber:iq:register') {
418
transports_selector.options[transport_optidx++] = new Option(item.getNode().getElementsByTagName('identity').item(0).getAttribute('name'),item.getFrom());
422
} else if (item.getNode().getElementsByTagName('identity').item(0).getAttribute('category') == 'directory') {
423
for (var j=0; j<item.getNode().getElementsByTagName('feature').length; j++) {
424
if (item.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'jabber:iq:register') {
425
directory_selector.options[directory_optidx++] = new Option(item.getNode().getElementsByTagName('identity').item(0).getAttribute('name'),item.getFrom());
433
if (directory_optidx == 1)
434
document.getElementById('dir_label').style.display = 'none';
435
if (transport_optidx == 1)
436
document.getElementById('gw_label').style.display = 'none';
440
onunload = savePrefs;
443
<style type="text/css">
444
th { font-size: 80%; text-align: right; font-weight: normal; }
445
#transport_pane input {
446
border: 1px solid black;
454
border: 1px solid black;
455
border-bottom: 0px solid white;
457
background-color: lightgrey;
460
border: 1px solid black;
461
border-bottom: 1px solid white;
464
background-color: white;
468
border: 1px solid black;
469
background-color: white;
471
.tab { display: block; }
472
.tabinactive { display: none; }
473
.pane_el { margin: 4px; }
478
background-color: #ffc2c2;
479
border: 1px solid red;
483
<body style="margin: 8px;">
485
<table border=0 cellpadding=0 cellspacing=0 height="100%" width="100%">
488
<div id="tablabels" class="tablabels"><span class="tablabelactive">Allgemein</span><span class='tablabel' id='pw_label'>Paßwort ändern</span><span class="tablabel" id='gw_label'>Gateways</span><span class="tablabel" id='dir_label'>Benutzerverzeichnis</span><span class="tablabel">Über</span></div>
490
<tr><td height="100%" class="tabs" valign="top">
491
<div id="tabs"><div id="tab1" class="tab">
492
<form name="options">
494
<legend>Einstellungen</legend>
497
<td><input id="usersHidden" type="checkbox" onChange="srcW.roster.toggleHide();"></td>
498
<td><label for="usersHidden">Verberge Offline-Kontakte</label></td>
501
<td><input id="autoPopup" type="checkbox" onChange="srcW.autoPopup=this.checked;toggleAutoPopupAway(this);"></td>
502
<td><label for="autoPopup">Öffne Chats und Nachrichten automatisch</label></td>
505
<td><input id="autoPopupAway" type="checkbox" onChange="srcW.autoPopupAway=this.checked"></td>
506
<td><label for="autoPopupAway">Auto-Popup falls abwesend</label></td>
509
<td><input id="playSounds" type="checkbox" onChange="srcW.playSounds=this.checked;"></td>
510
<td><label for="playSounds">Klangeffekte verwenden</label></td>
513
<td><input id="focusWindows" type="checkbox" onChange="srcW.focusWindows=this.checked;"></td>
514
<td><label for="focusWindows">Fenster in den Vordergrund bringen bei Nachrichteneingang</label></td>
517
<td><input id="timestamps" type="checkbox" onClick="displayTimestamps();"></td>
518
<td><label for="timestamps">Zeitstempel in Chat-Fenstern anzeigen</label></td>
520
<tr id='tr_enableLog'>
521
<td><input id="enableLog" type="checkbox" onChange="srcW.enableLog=this.checked;"></td>
522
<td><label for="enableLog">Chat-Protkoll aktivieren</label></td>
524
<script language="JavaScript">
525
if (opener.parent.con.isPolling())
529
Aktualisierungsintervall: \
530
<select name="timerval" onChange="srcW.con.setPollInterval(this.value);srcW.timerval=this.value;"> \
531
<option value="2000">2 sec.</option> \
532
<option value="5000">5 Sek.</option> \
533
<option value="10000">10 Sek.</option> \
534
<option value="30000">30 Sek.</option> \
542
</div><div class="tabinactive" id="password_tab">
543
<div class="error_wrap"></div>
544
<form name="password_form" onSubmit="return changePassword(this);">
546
<tr><th>New Password</th>
547
<td><input type="password" name="password_new" value=""></td></tr>
548
<tr><th>Retype Password</th>
549
<td><input type="password" name="password_repeat" value=""></td></tr>
550
<tr><td></td><td><input type="submit"></td></tr>
552
</div><div class="tabinactive" id="transports_tab">Registrieren an <select id="transports_selector" onchange="service_selected(this);"><option value=""> - auswählen - </option></select><div id="transport_pane"></div></div><div class="tabinactive" id="directory_tab">Registrieren an <select id="directory_selector" onchange="service_selected(this);"><option value=""> - auswählen - </option></select><div id="directory_pane"></div></div><div class="tabinactive" id="about_tab" align="center">
554
<img src="images/jwchat.jpg" style="border:1px solid black;">
555
<h1 style="margin-bottom: 0px;">JWChat</h1>
556
Version <span id="jwchat_version"></span>
558
<nobr>© 2003-2004 by <a href="mailto:steve@zeank.in-berlin.de">Stefan Strigler</a></nobr>
560
<img src="images/jumpto.gif" align="middle"><a href="http://jwchat.sourceforge.net" target="_new">http://jwchat.sourceforge.net</a>