630
603
function handlePresence(presence) {
631
Debug.log(presence.getDoc().xml,2);
604
Debug.log(presence.getDoc().xml,2);
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();
638
611
var aRoster = roster;
640
if (from == cutResource(jid)) // skip my own presence msgs
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');
653
window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240");
655
window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240");
613
// roster subscriptions synchronisation
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);
625
Debug.log("detected roster-subsync presence",2);
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();
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'));
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));
645
Debug.log("roster-subsync setting roster:"+aIQ.xml(),2);
649
// Approve Subscription Request
650
var aPresence = new JSJaCPresence();
651
aPresence.setTo(from);
652
aPresence.setType('subscribed');
655
// Subscribe to gateway contact's presence
656
var bPresence = new JSJaCPresence();
657
bPresence.setTo(from);
658
bPresence.setType('subscribe');
659
if (type == 'unsubscribe')
671
if (isGateway(from)) { // automatically subscribe gateways
673
// Approve Subscription Request
674
var aPresence = new JSJaCPresence();
675
aPresence.setTo(presence.getFrom());
676
aPresence.setType('subscribed');
679
// Subscribe to Gateway's Presence
680
var bPresence = new JSJaCPresence();
681
bPresence.setTo(presence.getFrom());
682
bPresence.setType('subscribe');
686
window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240");
688
window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240");
692
if (!isGateway(from))
660
693
alert(""+presence.getFrom()+" ha cancellato la tua Sottoscrizione"); /* [TODO] don't use alert here */
662
if (type == 'error') { // [TODO]
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);
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);
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);
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);
687
/* handle presence for MUC */
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);
695
if (user.roster && x) {
715
/* handle presence for MUC */
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);
723
if (user.roster && x) {
724
Debug.log("muc presence detected", 2);
696
725
var ofrom = presence.getFrom().substring(presence.getFrom().indexOf('/')+1);
698
727
Debug.log("jabber.from:"+presence.getFrom()+", ofrom:"+ofrom,3);
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);
704
var item = x.getElementsByTagName('item').item(0);
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)
733
var item = x.getElementsByTagName('item').item(0);
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;
718
if (ouser.role != '') {
719
ouser.add2Group(ouser.role+'s');
721
/* check if it is our own presence
722
* must be done here cause we want to be sure that role != ''
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();
732
Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3);
735
var nickChanged = false;
736
if (x.getElementsByTagName('status').item(0)) {
737
var code = x.getElementsByTagName('status').item(0).getAttribute('code');
739
case '201': // room created
740
/* popup dialog to ask for whether to accept default
741
* configuration or make a custom room
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();
746
var iq = new JSJaCIQ();
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');
757
case '303': // nick change
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();
769
// update nick if it's me
770
if (ouser.name == user.roster.nick)
771
user.roster.nick = ouser.nick;
774
var aChatW = ouser.chatW;
775
user.roster.removeUser(ouser);
778
ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick);
780
if (aChatW && !aChatW.closed) {
781
ouser.chatW = aChatW;
782
ouser.chatW.user = ouser;
784
user.roster.addUser(ouser);
787
case '301': // user has been kicked
788
var aMessage = new JSJaCMessage();
789
aMessage.setFrom(user.jid);
792
body = ""+ouser.name+" e' stato bannato da "+ouser.actor;
794
body = ""+ouser.name+" e' stato bannato";
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();
802
playSound('chat_recv');
804
case '307': // user has been kicked
805
var aMessage = new JSJaCMessage();
806
aMessage.setFrom(user.jid);
809
body = ""+ouser.name+" e' stato ammonito da "+ouser.actor;
811
body = ""+ouser.name+" e' stato ammonito";
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();
819
playSound('chat_recv');
747
if (ouser.role != '') {
748
ouser.add2Group(ouser.role+'s');
750
/* check if it is our own presence
751
* must be done here cause we want to be sure that role != ''
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();
761
Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3);
764
var nickChanged = false;
765
if (x.getElementsByTagName('status').item(0)) {
766
var code = x.getElementsByTagName('status').item(0).getAttribute('code');
768
case '201': // room created
769
/* popup dialog to ask for whether to accept default
770
* configuration or make a custom room
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();
775
var iq = new JSJaCIQ();
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');
786
case '303': // nick change
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();
798
// update nick if it's me
799
if (ouser.name == htmlEnc(user.roster.nick))
800
user.roster.nick = ouser.nick;
803
var aChatW = ouser.chatW;
804
user.roster.removeUser(ouser);
807
ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick);
809
if (aChatW && !aChatW.closed) {
810
ouser.chatW = aChatW;
811
ouser.chatW.user = ouser;
813
user.roster.addUser(ouser);
816
case '301': // user has been kicked
817
var aMessage = new JSJaCMessage();
818
aMessage.setFrom(user.jid);
821
body = ""+ouser.name+" e' stato bannato da "+ouser.actor;
823
body = ""+ouser.name+" e' stato bannato";
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();
831
playSound('chat_recv');
833
case '307': // user has been kicked
834
var aMessage = new JSJaCMessage();
835
aMessage.setFrom(user.jid);
838
body = ""+ouser.name+" e' stato ammonito da "+ouser.actor;
840
body = ""+ouser.name+" e' stato ammonito";
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();
848
playSound('chat_recv');
824
853
Debug.log("<"+ouser.name+"> affiliation:"+ouser.affiliation+", role:"+ouser.role,3);
826
855
if (!user.roster.getUserByJID(presence.getFrom()) && !nickChanged) {
828
857
user.roster.addUser(ouser);
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();
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();
840
869
} else if (presence.getType() == 'unavailable' && !nickChanged) {
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();
852
playSound('offline');
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();
881
playSound('offline');
855
884
user.roster.updateGroups();
857
886
// relink roster and user
858
887
aRoster = user.roster;
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);
916
945
Debug.log("got iq type 'set':\n"+iq.getDoc().xml,2);
918
if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far
919
Debug.log("not handling iq:\n"+iq.getDoc().xml,1);
947
if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far
948
Debug.log("not handling iq:\n"+iq.getDoc().xml,1);
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')));
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();
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
944
var name = cutResource(item.getAttribute('jid'));
946
if (i == cutResource(item.getAttribute('jid')))
947
name = disco[i].getQuery().getElementsByTagName('identity').item(0).getAttribute('name');
950
var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name);
951
aUser.fulljid = item.getAttribute('jid');
952
roster.addUser(aUser);
954
// tell server about it
955
var aIQ = new JSJaCIQ();
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'));
969
if (isGateway(item.getAttribute('jid'))) { // auto add gateways
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');
979
var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name);
980
//aUser.fulljid = item.getAttribute('jid');
981
roster.addUser(aUser);
983
// set name and group
984
var aIQ = new JSJaCIQ();
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'));
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('@'));
969
item.setAttribute('name',name);
995
if (name.indexOf('@') != -1)
996
name = name.substring(0,name.indexOf('@'));
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);
975
roster.addUser(new RosterUser(item.getAttribute('jid'),item.getAttribute('subscription'),groups,name));
977
var aIQ = new JSJaCIQ();
979
var query = aIQ.setQuery('jabber:iq:roster');
981
var aItem = item.cloneNode(true);
982
aItem.removeAttribute('subscription');
983
query.appendChild(aItem);
985
con.send(aIQ); // set stripped name
987
if (item.getAttribute('subscription') == "from")
988
openSubscription(item.getAttribute('jid')); // subscribe to user
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);
1004
roster.addUser(new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),groups,name));
1006
var aIQ = new JSJaCIQ();
1008
var query = aIQ.setQuery('jabber:iq:roster');
1010
var aItem = item.cloneNode(true);
1011
aItem.removeAttribute('subscription');
1012
query.appendChild(aItem);
1014
con.send(aIQ); // set stripped name
1016
if (item.getAttribute('subscription') == "from" && item.getAttribute('ask') != 'subscribe')
1017
openSubscription(item.getAttribute('jid')); // subscribe to user
995
1024
function handleConError(e) {
996
switch (e.getAttribute('code')) {
998
alert("Autorizzazione fallita!");
999
if (!con.connected())
1003
alert("Registrazione fallita!\n\nProva con un altro nome Utente!");
1006
alert("Servizio Non Disponibile");
1009
if (!con.connected())
1010
if (confirm("Errore interno del server.\n\nDisconnesso.\n\nVuoi riconnetterti?"))
1011
changeStatus(onlstat,onlmsg);
1014
alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :)
1025
switch (e.getAttribute('code')) {
1027
alert("Autorizzazione fallita!");
1028
if (!con.connected())
1032
alert("Registrazione fallita!\n\nProva con un altro nome Utente!");
1035
alert("Servizio Non Disponibile");
1038
if (!con.connected() && !logoutCalled && onlstat != 'offline')
1039
if (confirm("Errore interno del server.\n\nDisconnesso.\n\nVuoi riconnetterti?"))
1040
changeStatus(onlstat,onlmsg);
1043
alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :)
1019
1048
function handleDisconnect() {
1020
if (logoutCalled || onlstat == 'offline')
1023
// disconnecting not with onunload handler triggered
1024
statusLed.src = unavailableLed.src; // offline icon
1025
statusMsg.value = '';
1049
if (logoutCalled || onlstat == 'offline')
1052
// disconnecting not with onunload handler triggered
1053
statusLed.src = unavailableLed.src; // offline icon
1054
statusMsg.value = '';
1027
1056
fmd.getElementById('roster').innerHTML = '';
1029
1058
// if (confirm("Disconnesso\n\nRiconnetti?"))
1030
1059
// changeStatus(onlstat,onlmsg);
1033
1062
function handleConnected() {
1035
Debug.log("Connected",0);
1037
if (register && opener && opener.document.forms[0] && opener.document.forms[0].register)
1038
opener.document.forms[0].register.checked = false;
1040
/* get/setup roster */
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);
1066
if (register && opener && opener.document.forms[0] && opener.document.forms[0].register)
1067
opener.document.forms[0].register.checked = false;
1069
/* get/setup roster */
1071
iq.setIQ(null,'get','roster_1');
1072
iq.setQuery('jabber:iq:roster');
1073
con.send(iq,getRoster); // cascading information retrieval
1047
1076
/* *** cascading onconnect handlers *** */
1048
1077
function getRoster(iq) {
1049
if (!iq || iq.getType() != 'result') {
1051
Debug.log("Error fetching roster:\n"+iq.getDoc().xml,1);
1053
Debug.log("Error fetching roster",1);
1057
Debug.log("got roster:\n"+iq.getDoc().xml,2);
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
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');
1069
con.send(iq,getSavedState);
1078
if (!iq || iq.getType() != 'result') {
1080
Debug.log("Error fetching roster:\n"+iq.getDoc().xml,1);
1082
Debug.log("Error fetching roster",1);
1086
Debug.log("got roster:\n"+iq.getDoc().xml,2);
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
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);
1072
1100
function getSavedState(iq) {
1073
if (!iq || iq.getType() != 'result')
1075
Debug.log("Error retrieving saved state:\n"+iq.getDoc().xml,1);
1077
Debug.log("Error retrieving saved state",1);
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;
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');
1101
con.send(iq,getPrefs);
1101
if (!iq || iq.getType() != 'result')
1103
Debug.log("Error retrieving saved state:\n"+iq.getDoc().xml,1);
1105
Debug.log("Error retrieving saved state",1);
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;
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');
1132
con.send(iq,getPrefs);
1104
1135
function getPrefs(iq) {
1105
if (!iq || iq.getType() != 'result')
1107
Debug.log("Error retrieving preferences:\n"+iq.getDoc().xml,1);
1109
Debug.log("Error retrieving preferences",1);
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) {
1118
if (eval(jNode.childNodes.item(i).firstChild.nodeValue))
1119
roster.toggleHide();
1122
timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1123
con.setPollInterval(timerval);
1126
autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1128
case 'autoPopupAway':
1129
autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1132
playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1134
case 'focusWindows':
1135
focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1138
timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1141
enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1136
if (!iq || iq.getType() != 'result')
1138
Debug.log("Error retrieving preferences:\n"+iq.getDoc().xml,1);
1140
Debug.log("Error retrieving preferences",1);
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) {
1149
if (eval(jNode.childNodes.item(i).firstChild.nodeValue) != usersHidden)
1150
roster.toggleHide();
1153
timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1154
con.setPollInterval(timerval);
1157
autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1159
case 'autoPopupAway':
1160
autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1163
playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1165
case 'focusWindows':
1166
focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1169
timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1172
enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue);
1153
onlstat = 'available';
1154
changeStatus(onlstat);
1156
playSound('connected');
1158
// Start Service Discovery
1160
iq.setIQ(con.server,null,'get','disco_item_1');
1161
iq.setQuery('http://jabber.org/protocol/disco#items');
1163
con.send(iq,getDiscoItems);
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');
1171
con.send(iq,getBookmarks);
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');
1179
con.send(iq,getAnnotations);
1183
onlprio = opener.prio;
1185
onlprio = DEFAULTPRIORITY;
1189
onlstat = 'available';
1190
changeStatus(onlstat,onlmsg,onlprio);
1192
playSound('connected');
1194
// Start Service Discovery
1196
iq.setIQ(con.domain,'get','disco_item_1');
1197
iq.setQuery('http://jabber.org/protocol/disco#items');
1199
con.send(iq,getDiscoItems);
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');
1207
con.send(iq,getBookmarks);
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');
1215
con.send(iq,getAnnotations);
1183
1218
function getDiscoItems(iq) {
1187
Debug.log(iq.getDoc().xml,2);
1189
disco = new Array();
1191
var items = iq.getNode().firstChild.childNodes;
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
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");
1201
con.send(aIQ,getDiscoInfo);
1222
Debug.log(iq.getDoc().xml,2);
1224
disco = new Object();
1226
var items = iq.getNode().firstChild.childNodes;
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
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");
1236
con.send(aIQ,getDiscoInfo);
1205
1240
function getDiscoInfo(iq) {
1206
if (!iq || iq.getType() != 'result')
1209
Debug.log(iq.getDoc().xml,2);
1210
if (iq.getType() == 'result') {
1211
disco[iq.getFrom()] = iq;
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());
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();
1241
if (!iq || iq.getType() != 'result')
1244
Debug.log(iq.getDoc().xml,2);
1245
if (iq.getType() == 'result') {
1246
disco[iq.getFrom()] = iq;
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());
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();
1232
1267
function getBookmarks(iq) {
1233
if (!iq || iq.getType() != 'result')
1236
Debug.log(iq.getDoc().xml,2);
1238
bookmarks = new Array();
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);
1268
if (!iq || iq.getType() != 'result')
1271
Debug.log(iq.getDoc().xml,2);
1273
bookmarks = new Array();
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);
1263
1298
var annotations;
1264
1299
function getAnnotations(iq) {
1265
if (!iq || iq.getType() != 'result')
1268
Debug.log(iq.getDoc().xml,2);
1270
annotations = new Array();
1300
if (!iq || iq.getType() != 'result')
1303
Debug.log(iq.getDoc().xml,2);
1305
annotations = new Object();
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;
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;