jarnxmpp.core.handlers.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*global $:false, document:false, window:false, portal_url:false,
  2. $msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google:false, jarnxmpp:false, jQuery:false, sessionStorage:false, $iq:false, $pres:false, Image:false, */
  3. (function (jarnxmpp, $, portal_url) {
  4. portal_url = portal_url || '';
  5. jarnxmpp.Storage = {
  6. storage: null,
  7. init: function () {
  8. try {
  9. if ('sessionStorage' in window && window.sessionStorage !== null && JSON in window && window.JSON !== null) {
  10. jarnxmpp.Storage.storage = sessionStorage;
  11. if (!('_user_info' in jarnxmpp.Storage.storage)) {
  12. jarnxmpp.Storage.set('_user_info', {});
  13. }
  14. if (!('_vCards' in jarnxmpp.Storage.storage)) {
  15. jarnxmpp.Storage.set('_vCards', {});
  16. }
  17. if (!('_subscriptions' in jarnxmpp.Storage.storage)) {
  18. jarnxmpp.Storage.set('_subscriptions', null);
  19. }
  20. }
  21. } catch (e) {}
  22. },
  23. get: function (key) {
  24. if (key in sessionStorage) {
  25. return JSON.parse(sessionStorage[key]);
  26. }
  27. return null;
  28. },
  29. set: function (key, value) {
  30. sessionStorage[key] = JSON.stringify(value);
  31. },
  32. xmppGet: function (key, callback) {
  33. var stanza = $iq({type: 'get'})
  34. .c('query', {xmlns: 'jabber:iq:private'})
  35. .c('jarnxmpp', {xmlns: 'http://jarn.com/ns/jarnxmpp:prefs:' + key})
  36. .tree();
  37. jarnxmpp.connection.sendIQ(stanza, function success(result) {
  38. callback($('jarnxmpp ' + 'value', result).first().text());
  39. });
  40. },
  41. xmppSet: function (key, value) {
  42. var stanza = $iq({type: 'set'})
  43. .c('query', {xmlns: 'jabber:iq:private'})
  44. .c('jarnxmpp', {xmlns: 'http://jarn.com/ns/jarnxmpp:prefs:' + key})
  45. .c('value', value)
  46. .tree();
  47. jarnxmpp.connection.sendIQ(stanza);
  48. }
  49. };
  50. jarnxmpp.Storage.init();
  51. jarnxmpp.Presence = {
  52. online: {},
  53. _user_info: {},
  54. onlineCount: function () {
  55. var me = Strophe.getNodeFromJid(jarnxmpp.connection.jid),
  56. counter = 0,
  57. user;
  58. for (user in jarnxmpp.Presence.online) {
  59. if ((jarnxmpp.Presence.online.hasOwnProperty(user)) && user !== me) {
  60. counter += 1;
  61. }
  62. }
  63. return counter;
  64. },
  65. getUserInfo: function (user_id, callback) {
  66. // User info on browsers without storage
  67. if (jarnxmpp.Storage.storage === null) {
  68. if (user_id in jarnxmpp.Presence._user_info) {
  69. callback(jarnxmpp.Presence._user_info[user_id]);
  70. } else {
  71. $.getJSON(portal_url + "/xmpp-userinfo?user_id=" + user_id, function (data) {
  72. jarnxmpp.Presence._user_info[user_id] = data;
  73. callback(data);
  74. });
  75. }
  76. } else {
  77. var _user_info = jarnxmpp.Storage.get('_user_info');
  78. if (user_id in _user_info) {
  79. callback(_user_info[user_id]);
  80. } else {
  81. $.getJSON(portal_url + "/xmpp-userinfo?user_id=" + user_id, function (data) {
  82. _user_info[user_id] = data;
  83. jarnxmpp.Storage.set('_user_info', _user_info);
  84. callback(data);
  85. });
  86. }
  87. }
  88. }
  89. };
  90. jarnxmpp.vCard = {
  91. _vCards: {},
  92. _getVCard: function (jid, callback) {
  93. var stanza =
  94. $iq({type: 'get', to: jid})
  95. .c('vCard', {xmlns: 'vcard-temp'}).tree();
  96. jarnxmpp.connection.sendIQ(stanza, function (data) {
  97. var result = {};
  98. $('vCard[xmlns="vcard-temp"]', data).children().each(function (idx, element) {
  99. result[element.nodeName] = element.textContent;
  100. });
  101. if (typeof (callback) !== 'undefined') {
  102. callback(result);
  103. }
  104. });
  105. },
  106. getVCard: function (jid, callback) {
  107. jid = Strophe.getBareJidFromJid(jid);
  108. if (jarnxmpp.Storage.storage === null) {
  109. if (jid in jarnxmpp.vCard._vCards) {
  110. callback(jarnxmpp.vCard._vCards[jid]);
  111. } else {
  112. jarnxmpp.vCard._getVCard(jid, function (result) {
  113. jarnxmpp.vCard._vCards[jid] = result;
  114. callback(result);
  115. });
  116. }
  117. } else {
  118. var _vCards = jarnxmpp.Storage.get('_vCards');
  119. if (jid in _vCards) {
  120. callback(_vCards[jid]);
  121. } else {
  122. jarnxmpp.vCard._getVCard(jid, function (result) {
  123. _vCards[jid] = result;
  124. jarnxmpp.Storage.set('_vCards', _vCards);
  125. callback(result);
  126. });
  127. }
  128. }
  129. },
  130. setVCard: function (params, photoUrl) {
  131. var key,
  132. vCard = Strophe.xmlElement('vCard', [['xmlns', 'vcard-temp'], ['version', '2.0']]);
  133. for (key in params) {
  134. if (params.hasOwnProperty(key)) {
  135. vCard.appendChild(Strophe.xmlElement(key, [], params[key]));
  136. }
  137. }
  138. var send = function () {
  139. var stanza = $iq({type: 'set'}).cnode(vCard).tree();
  140. jarnxmpp.connection.sendIQ(stanza);
  141. };
  142. if (typeof (photoUrl) === 'undefined') {
  143. send();
  144. } else {
  145. jarnxmpp.vCard.getBase64Image(photoUrl, function (base64img) {
  146. base64img = base64img.replace(/^data:image\/png;base64,/, "");
  147. var photo = Strophe.xmlElement('PHOTO');
  148. photo.appendChild(Strophe.xmlElement('TYPE', [], 'image/png'));
  149. photo.appendChild(Strophe.xmlElement('BINVAL', [], base64img));
  150. vCard.appendChild(photo);
  151. send();
  152. });
  153. }
  154. },
  155. getBase64Image: function (url, callback) {
  156. // Create the element, then draw it on a canvas to get the base64 data.
  157. var img = new Image();
  158. $(img).load(function () {
  159. var canvas = document.createElement('canvas');
  160. canvas.width = img.width;
  161. canvas.height = img.height;
  162. var ctx = canvas.getContext("2d");
  163. ctx.drawImage(img, 0, 0);
  164. callback(canvas.toDataURL('image/png'));
  165. }).attr('src', url);
  166. }
  167. };
  168. jarnxmpp.onConnect = function (status) {
  169. if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
  170. $(window).bind('beforeunload', function () {
  171. $(document).trigger('jarnxmpp.disconnecting');
  172. var presence = $pres({type: 'unavailable'});
  173. jarnxmpp.connection.send(presence);
  174. jarnxmpp.connection.disconnect();
  175. jarnxmpp.connection.flush();
  176. });
  177. $(document).trigger('jarnxmpp.connected');
  178. } else if (status === Strophe.Status.DISCONNECTED) {
  179. $(document).trigger('jarnxmpp.disconnected');
  180. }
  181. };
  182. jarnxmpp.rawInput = function (data) {
  183. var event = jQuery.Event('jarnxmpp.dataReceived');
  184. event.text = data;
  185. $(document).trigger(event);
  186. };
  187. jarnxmpp.rawOutput = function (data) {
  188. var event = jQuery.Event('jarnxmpp.dataSent');
  189. event.text = data;
  190. $(document).trigger(event);
  191. };
  192. $(document).bind('jarnxmpp.connected', function () {
  193. // Logging
  194. jarnxmpp.connection.rawInput = jarnxmpp.rawInput;
  195. jarnxmpp.connection.rawOutput = jarnxmpp.rawOutput;
  196. });
  197. $(document).bind('jarnxmpp.disconnecting', function () {
  198. if (jarnxmpp.Storage.storage !== null) {
  199. jarnxmpp.Storage.set('online-count', jarnxmpp.Presence.onlineCount());
  200. }
  201. });
  202. $(document).ready(function () {
  203. var resource = jarnxmpp.Storage.get('xmppresource');
  204. if (resource) {
  205. data = {'resource': resource};
  206. } else {
  207. data = {};
  208. }
  209. $.ajax({
  210. 'url':portal_url + '/@@xmpp-loader',
  211. 'dataType': 'json',
  212. 'data': data,
  213. 'success': function (data) {
  214. if (!(('rid' in data) && ('sid' in data) && ('BOSH_SERVICE' in data))) {
  215. return;
  216. }
  217. if (!resource) {
  218. jarnxmpp.Storage.set('xmppresource', Strophe.getResourceFromJid(data.jid));
  219. }
  220. jarnxmpp.BOSH_SERVICE = data.BOSH_SERVICE;
  221. jarnxmpp.jid = data.jid;
  222. jarnxmpp.connection = new Strophe.Connection(jarnxmpp.BOSH_SERVICE);
  223. jarnxmpp.connection.attach(jarnxmpp.jid, data.sid, data.rid, jarnxmpp.onConnect);
  224. }
  225. });
  226. });
  227. })(window.jarnxmpp = window.jarnxmpp || {}, jQuery, portal_url);