4 function doLogin(aForm) {
5 if (!aForm.nickname.value)
8 connection = new Strophe.Connection(BOSH_LOCATION);
9 connection.connect(jid, password, onConnect);
11 nickname = aForm.nickname.value;
19 function onConnect(status) {
20 if (status == Strophe.Status.CONNFAIL) {
21 handleError('Failed to connect');
22 } else if (status == Strophe.Status.DISCONNECTED) {
24 } else if (status == Strophe.Status.CONNECTED) {
25 // Add handlers connection.addHandler(callback, namespace, stanza_name, type, id, from)
26 connection.addHandler(handleMessage, null, 'message', null, null, null);
27 connection.addHandler(handlePresence, null, 'presence', null, null, null);
28 connection.addHandler(handleIQ, null, 'iq', null, null, null);
30 connection.addHandler(handleIqVersion, Strophe.NS.VERSION, 'iq', null, null, null);
31 connection.addHandler(handleIqVersion, 'urn:xmpp:time', 'iq', null, null, null);
33 connection.send($pres().tree());
34 connection.send($pres({to: room + '/' + nickname}).tree());
36 // Make things (in)visible
44 function handleError(error) {
45 alert("An error occured:" + error);
49 function handleDisconnected() {
50 // Make things (in)visible
57 function addBubble(nick) {
59 if (!document.getElementById(id)) {
61 div += '<div id="' + id + '" class="bubble" onmousedown="startDrag(this)" style="display: none">';
62 div += '<a href="#" onclick="' +"$('#" + id + "').hide('slow')" + '">Close</a>';
63 div += '<div id="' + id + 'Chat" class="bubbleChat"></div>';
64 div += '<form id="' + id + 'Form" class="bubbleForm" onsubmit="return sendChatMessage(this,' + "'" + nick + "');" + '" action="#">';
65 div += '<input type="text" name="text" id="' + id + 'Text" class="bubbleForm"/>';
68 $('body').append(div);
70 $('#'+id).show('slow');
73 function handleMessage(msg) {
75 var sender = Strophe.getResourceFromJid(msg.getAttribute('from'));
77 sender = Strophe.xmlescape(sender);
81 var type = msg.getAttribute('type');
82 var body = msg.getElementsByTagName('body')[0];
84 body = Strophe.xmlescape(Strophe.getText(body));
88 var subject = msg.getElementsByTagName('subject')[0];
90 subject = Strophe.xmlescape(Strophe.getText(subject));
95 html += '<div class="msg">';
98 if (body.search(/^\/me/) == 0) {
99 body = body.replace(/^\/me/, sender);
100 html += '<span class="sender">';
102 html += '</span></div>';
104 html += '<span class="sender">';
107 html += body + '</div>';
110 html += '<span class="server">';
111 html += body + '</span></div>';
113 } else if (subject) {
114 html += '<span class="server">';
115 html += "The subject is: " + subject + '</span></div>';
120 if (type == 'chat') {
122 $('#' + id + 'Chat').append(html);
123 document.getElementById(id + 'Chat').lastChild.scrollIntoView();
125 $('#chat').append(html);
126 document.getElementById('chat').lastChild.scrollIntoView();
132 function handlePresence(presence) {
133 if (Strophe.getBareJidFromJid(presence.getAttribute('from')) != room)
135 roster_list = document.getElementById('roster_list');
136 nick = Strophe.getResourceFromJid(presence.getAttribute('from'));
137 type = presence.getAttribute('type');
138 if (type == 'unavailable') {
139 element = document.getElementById(nick);
140 roster_list.removeChild(element);
141 $('#chat').append('<div class="msg"><span class="server">' + nick + ' left the groupchat</span></div>');
143 roster_list.innerHTML += '<li id="' + nick + '" onclick="addBubble(' + "'" + nick + "')" + '" >' + nick + '</li>';
144 $('#chat').append('<div class="msg"><span class="server">' + nick + ' joined the groupchat</span></div>');
150 function handleIQ(iq) {
151 var to = iq.getAttribute('to');
152 var from = iq.getAttribute('from');
153 var type = iq.getAttribute('type');
155 //FIXME: Clients SHOULD send the content of the original stanza back for analysis
157 var reply = $iq({to: from, from: to, type: 'error'}).c('error', {type: 'cancel'}).c('feature-not-implemented', {xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas'});
159 connection.send(reply.tree());
164 function handleIqVersion(iq) {
165 var to = iq.getAttribute('to');
166 var from = iq.getAttribute('from');
168 var reply = $iq({type: 'result', to: from, from: to}).c('query', {xmlns: Strophe.NS.VERSION}).c('name').t('XMPPChat').up().c('version').t('preAny').up().c('os').t(navigator.userAgent);
170 connection.send(reply.tree());
175 function handleIqTime(iq) {
176 var now = new Date();
177 var to = iq.getAttribute('to');
178 var from = iq.getAttribute('from');
180 var reply = $iq({type: 'result', from: to, to: from}).c('time', {xmlns: 'urn:xmpp:time'}).c('utc').t(now.getUTCFullYear() + '-' + now.getUTCMonth() + '-' + now.getUTCDate() + 'T' + now.getUTCHours() + ':' + now.getUTCMinutes() + ':' + now.getUTCSeconds + '.' + now.getUTCMilliseconds() + 'Z').up().c('tzo').t(now.getTimezoneOffset()/60 + ':' + now.getTimezoneOffset()%60);
182 connection.send(reply.tree());
187 function sendMessage(aForm) {
188 if (aForm.text.value) {
189 message = $msg({type: 'groupchat', to: room}).c('body').t(aForm.text.value);
190 connection.send(message.tree());
191 aForm.text.value = '';
196 function sendChatMessage(aForm, to) {
197 if (aForm.text.value) {
198 body = aForm.text.value
199 message = $msg({type: 'chat', to: room + '/' + to}).c('body').t(body);
200 connection.send(message.tree());
201 aForm.text.value = '';
203 html += '<div class="msg">';
204 html += '<span class="sender">';
207 html += body + '</div>';
208 document.getElementById(to + 'BubbleChat').innerHTML += html;
209 document.getElementById(to + 'BubbleChat').lastChild.scrollIntoView();
215 var dragElement = null;
221 function startDrag(element) {
222 dragElement = element;
223 offX = mouseX - dragElement.offsetLeft;
224 offY = mouseY - dragElement.offsetTop;
227 function doDrag(eve) {
232 dragElement.style.left = (mouseX - offX) + 'px';
233 dragElement.style.top = (mouseY - offY) + 'px';
237 function stopDrag(eve) {
241 onunload = function() {
243 connection.disconnect();
247 onmousemove = doDrag;
249 onmouseup = stopDrag;