social_stream 0.22.1 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/base/app/assets/javascripts/activities.js.erb +0 -85
  2. data/base/app/assets/javascripts/social_stream.comments.js +63 -0
  3. data/base/app/assets/javascripts/social_stream.objects.js +23 -0
  4. data/base/app/assets/javascripts/social_stream.timeline.js +37 -10
  5. data/base/app/assets/javascripts/social_stream.wall.js.erb +135 -118
  6. data/base/app/assets/stylesheets/cheesecake.css.scss +6 -3
  7. data/base/app/models/activity_object.rb +18 -0
  8. data/base/app/models/activity_object_property.rb +5 -0
  9. data/base/app/views/activities/_new.html.erb +1 -1
  10. data/base/app/views/activities/_wall.html.erb +1 -1
  11. data/base/app/views/cheesecake/_cheesecake.html.erb +44 -10
  12. data/base/app/views/cheesecake/_index.html.erb +18 -130
  13. data/base/app/views/cheesecake/_sector_form.html.erb +176 -17
  14. data/base/app/views/comments/_new.html.erb +0 -14
  15. data/base/app/views/objects/_show.html.erb +6 -0
  16. data/base/app/views/toolbar/_home.html.erb +1 -1
  17. data/base/app/views/toolbar/_messages.html.erb +1 -1
  18. data/base/app/views/toolbar/_profile.html.erb +1 -1
  19. data/base/config/locales/es.yml +7 -0
  20. data/base/db/migrate/20120302215722_activity_object_properties.rb +24 -0
  21. data/base/lib/social_stream/ability/base.rb +2 -2
  22. data/base/lib/social_stream/base/version.rb +1 -1
  23. data/documents/app/assets/javascripts/social_stream-documents.js +5 -1
  24. data/documents/app/models/document.rb +4 -3
  25. data/documents/app/models/picture.rb +4 -0
  26. data/documents/lib/social_stream/documents/version.rb +1 -1
  27. data/documents/social_stream-documents.gemspec +1 -1
  28. data/events/app/assets/images/poster.png +0 -0
  29. data/events/app/assets/javascripts/social_stream-events.js +7 -0
  30. data/events/app/assets/javascripts/social_stream.events.poster.js +21 -0
  31. data/events/app/assets/stylesheets/events.css.scss +25 -0
  32. data/events/app/helpers/events_helper.rb +9 -0
  33. data/events/app/models/activity_object_property/poster.rb +2 -0
  34. data/events/app/models/event.rb +18 -0
  35. data/events/app/views/events/_event.html.erb +39 -27
  36. data/events/app/views/events/_form_poster.html.erb +8 -0
  37. data/events/app/views/events/edit.js.erb +5 -0
  38. data/events/config/locales/en.yml +2 -0
  39. data/events/config/locales/es.yml +2 -0
  40. data/events/lib/social_stream-events.rb +2 -1
  41. data/events/lib/social_stream/events/engine.rb +6 -0
  42. data/events/lib/social_stream/events/models/document.rb +26 -0
  43. data/events/lib/social_stream/events/version.rb +1 -1
  44. data/events/social_stream-events.gemspec +1 -1
  45. data/lib/social_stream/version.rb +1 -1
  46. data/linkser/lib/social_stream/linkser/version.rb +1 -1
  47. data/linkser/social_stream-linkser.gemspec +1 -1
  48. data/presence/app/assets/images/games/ter/classic_aspa.png +0 -0
  49. data/presence/app/assets/images/games/ter/classic_board.png +0 -0
  50. data/presence/app/assets/images/games/ter/classic_circle.png +0 -0
  51. data/presence/app/assets/images/games/ter/modern_aspa.png +0 -0
  52. data/presence/app/assets/images/games/ter/modern_board.png +0 -0
  53. data/presence/app/assets/images/games/ter/modern_circle.png +0 -0
  54. data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +34 -3
  55. data/presence/app/assets/javascripts/presence.js.erb +4 -0
  56. data/presence/app/assets/javascripts/{xmpp_client_management.js.erb → presence_XmppClient.js.erb} +417 -49
  57. data/presence/app/assets/javascripts/{chat_audio.js.erb → presence_audio.js.erb} +0 -0
  58. data/presence/app/assets/javascripts/presence_game.js.erb +76 -0
  59. data/presence/app/assets/javascripts/presence_game_ter.js.erb +384 -0
  60. data/presence/app/assets/javascripts/presence_notifications.js +191 -0
  61. data/presence/app/assets/javascripts/{chat_parser.js → presence_parser.js} +0 -0
  62. data/presence/app/assets/javascripts/{chat_persistence.js → presence_persistence.js} +84 -70
  63. data/presence/app/assets/javascripts/{store.js → presence_store.js} +0 -0
  64. data/presence/app/assets/javascripts/{chat_interface_manager.js.erb → presence_uiManager.js.erb} +42 -132
  65. data/presence/app/assets/javascripts/{chat_utilities.js → presence_utilities.js} +10 -34
  66. data/presence/app/assets/javascripts/{videochat.js.erb → presence_videochat.js.erb} +4 -24
  67. data/presence/app/assets/javascripts/{chat_window_manager.js → presence_windowManager.js} +275 -217
  68. data/presence/app/assets/javascripts/social_stream-presence.js +0 -2
  69. data/presence/app/assets/stylesheets/chat.css.scss +12 -1
  70. data/presence/app/views/chat/_contacts.html.erb +5 -5
  71. data/presence/app/views/chat/_index.html.erb +10 -2
  72. data/presence/config/locales/en.yml +9 -1
  73. data/presence/config/locales/es.yml +9 -1
  74. data/presence/ejabberd/ejabberd_files.zip +0 -0
  75. data/presence/ejabberd/ejabberd_scripts/emanagement +132 -2
  76. data/presence/ejabberd/installer.sh +1 -0
  77. data/presence/ejabberd/mod_muc_admin/mod_muc_admin.beam +0 -0
  78. data/presence/ejabberd/mod_muc_admin/mod_muc_admin.erl +871 -0
  79. data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  80. data/presence/lib/social_stream/presence/models/buddy_manager.rb +32 -26
  81. data/presence/lib/social_stream/presence/models/group_manager.rb +12 -2
  82. data/presence/lib/social_stream/presence/version.rb +1 -1
  83. data/presence/lib/social_stream/presence/xmpp_server_order.rb +2 -2
  84. data/presence/social_stream-presence.gemspec +1 -1
  85. data/presence/vendor/assets/javascripts/strophe.muc.js +1 -1
  86. data/social_stream.gemspec +5 -5
  87. metadata +63 -41
  88. data/events/app/assets/javascripts/0_init.js +0 -4
@@ -1,5 +1,5 @@
1
1
  module SocialStream
2
2
  module Events
3
- VERSION = "0.8.2".freeze
3
+ VERSION = "0.9.0".freeze
4
4
  end
5
5
  end
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.files = `git ls-files`.split("\n")
13
13
 
14
14
  # Gem dependencies
15
- s.add_runtime_dependency('social_stream-base', '~> 0.16.4')
15
+ s.add_runtime_dependency('social_stream-base', '~> 0.17.0')
16
16
  s.add_runtime_dependency('rails-scheduler', '~> 0.0.6')
17
17
  s.add_runtime_dependency('coffee-rails', '>= 3.1.0')
18
18
 
@@ -1,3 +1,3 @@
1
1
  module SocialStream
2
- VERSION = "0.22.1".freeze
2
+ VERSION = "0.23.1".freeze
3
3
  end
@@ -1,5 +1,5 @@
1
1
  module SocialStream
2
2
  module Linkser
3
- VERSION = "0.6.1".freeze
3
+ VERSION = "0.7.0".freeze
4
4
  end
5
5
  end
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.files = `git ls-files`.split("\n")
13
13
 
14
14
  # Gem dependencies
15
- s.add_runtime_dependency('social_stream-base', '~> 0.16.2')
15
+ s.add_runtime_dependency('social_stream-base', '~> 0.17.0')
16
16
  s.add_runtime_dependency('linkser', '~> 0.0.10')
17
17
  # Development Gem dependencies
18
18
  s.add_development_dependency('sqlite3-ruby')
@@ -23,6 +23,7 @@
23
23
  offset: 0, // relative to right edge of the browser window
24
24
  width: 230, // width of the chatbox
25
25
  height: 400, // height of the chatbox
26
+ groupBox: false, //if a group Chatbox?
26
27
  video: 0, // height of the videoBox
27
28
  messageSent: function(id, user, msg){
28
29
  // override this
@@ -39,7 +40,12 @@
39
40
  var self = this;
40
41
  var box = self.elem.uiChatboxLog;
41
42
  var e = document.createElement('div');
42
- $(e).html("<b>" + peer +":</b> " + msg)
43
+ if((peer==null)||($(peer).html()=="")){
44
+ var fContent = msg
45
+ } else {
46
+ var fContent = "<b>" + peer +":</b> " + msg
47
+ }
48
+ $(e).html(fContent)
43
49
  .addClass("ui-chatbox-msg");
44
50
  box.append(e);
45
51
  self._scrollToBottom();
@@ -208,6 +214,25 @@
208
214
  .appendTo(uiChatboxTitlebarVideoChange),
209
215
 
210
216
 
217
+ //Games Menu button
218
+ uiChatboxTitlebarGames = (self.uiChatboxTitlebarGames = $('<a href="#"></a>'))
219
+ .addClass('ui-corner-all ' +
220
+ 'ui-chatbox-icon' + ' ui-games-icon'
221
+ )
222
+ .attr('role', 'button')
223
+ .hover(function() {uiChatboxTitlebarGames.addClass('ui-state-hover');},
224
+ function() {uiChatboxTitlebarGames.removeClass('ui-state-hover');})
225
+ .click(function(event) {
226
+ pickGamesButton(self)
227
+ return false;
228
+ })
229
+ .appendTo(uiChatboxTitlebar),
230
+ uiChatboxTitlebarGamesText = $('<span></span>')
231
+ .addClass('ui-icon-star ' + 'chat-thick ' + ' chat-gamesthick' )
232
+ .text('')
233
+ .appendTo(uiChatboxTitlebarGames),
234
+
235
+
211
236
  // content
212
237
  uiChatboxContent = (self.uiChatboxContent = $('<div></div>'))
213
238
  .addClass('ui-widget-content ' +
@@ -222,8 +247,7 @@
222
247
  'ui-chatbox-notify'
223
248
  )
224
249
  .click(function(event) {
225
- // anything?
226
- self.uiChatboxNotify.fadeOut();
250
+ onClickChatNotification(self.uiChatboxNotify)
227
251
  })
228
252
  .appendTo(uiChatboxContent),
229
253
 
@@ -328,6 +352,9 @@
328
352
  break;
329
353
  case "video":
330
354
  this._setVideo(value);
355
+ break;
356
+ case "groupBox":
357
+ this._setGroupBox(value);
331
358
  break;
332
359
  }
333
360
  }
@@ -346,6 +373,10 @@
346
373
  this.uiChatboxLog.height(height + "px");
347
374
  },
348
375
 
376
+ _setGroupBox: function(groupBox) {
377
+ this.uiChatboxLog.groupBox(groupBox);
378
+ },
379
+
349
380
  _setVideo: function(videoHeight) {
350
381
  this.uiVideobox.height(videoHeight + "px");
351
382
  if (videoHeight==0){
@@ -0,0 +1,4 @@
1
+ var PRESENCE = PRESENCE || {};
2
+
3
+ PRESENCE.VERSION = '<%=SocialStream::Presence::VERSION%>';
4
+ PRESENCE.AUTHORS = 'Aldo Gordillo';
@@ -33,7 +33,7 @@ statusIcons['away'] = "away";
33
33
  statusIcons['xa'] = "away";
34
34
  statusIcons['dnd'] = "dnd";
35
35
 
36
- //Contact information
36
+ //Contacts information
37
37
  var contactsInfo = new Array();
38
38
  //contactsInfo['slug'] = "[Object chatContact]";
39
39
 
@@ -43,6 +43,8 @@ function chatContact(domain,resource,client,version) {
43
43
  this.resource=resource
44
44
  this.client=client;
45
45
  this.version=version;
46
+
47
+ //Videochat params
46
48
  //Sender: disconnected, negotiating , connecting , waiting, establishing, connected
47
49
  //Receiver: disconnected , pending , establishing, connected
48
50
  this.videoChatStatus = "disconnected";
@@ -53,6 +55,19 @@ function chatContact(domain,resource,client,version) {
53
55
  this.publisher=null;
54
56
  }
55
57
 
58
+ //Rooms information
59
+ var roomsInfo = new Array();
60
+ //roomsInfo['groupSlug'] = "[Object chatRoom]";
61
+
62
+ //Manage room information
63
+ function chatRoom() {
64
+ this.occupants=[];
65
+ this.joined = false;
66
+ this.affiliation = "none";
67
+ this.role = "none";
68
+ this.nick = getBaseNickFromUserName();
69
+ }
70
+
56
71
 
57
72
  //IQsIDs
58
73
  var iqStanzaID = new Array();
@@ -60,6 +75,8 @@ iqStanzaID['cinfo'] = "versionID";
60
75
  iqStanzaID['videochatRequest'] = "videochatRequestID";
61
76
  iqStanzaID['videochatRequestCancel'] = "videochatRequestCancelID";
62
77
 
78
+
79
+
63
80
  ////////////////////
64
81
  //Connect functions
65
82
  ////////////////////
@@ -67,7 +84,6 @@ iqStanzaID['videochatRequestCancel'] = "videochatRequestCancelID";
67
84
  function connectToChat(user_jid,cookie,password){
68
85
 
69
86
  if (isUserConnected()){
70
- log("USer already connected")
71
87
  return true;
72
88
  }
73
89
 
@@ -82,7 +98,6 @@ function connectToChat(user_jid,cookie,password){
82
98
  }
83
99
  }
84
100
 
85
-
86
101
  function isStropheConnected(){
87
102
  if((strophe_connection!=null)&&(strophe_connection.connected)){
88
103
  return true;
@@ -106,7 +121,6 @@ function connectToServerWithCookie(user_jid, cookie){
106
121
  return true;
107
122
  }
108
123
 
109
-
110
124
  //Password: Get from chatPassword param if exists, instead try to get from sessionStorage.
111
125
  function connectToServerWithPassword(user_jid, chatPassword){
112
126
 
@@ -224,7 +238,8 @@ function onConnect(status) {
224
238
  log('Strophe is disconnected.');
225
239
  disconnectionFlag = true;
226
240
  clearTimeout(awayTimer);
227
- updateInterfaceAfterUsersDisconnect();
241
+ updateInterfaceAfterUserDisconnect();
242
+ updateRoomsInfoAfterUserDisconnect();
228
243
  reconnectTimer = setTimeout ("onReconnect()", 5000);
229
244
  } else if (status == Strophe.Status.CONNECTED) {
230
245
  //AFTER CONNECT ACTIONS
@@ -234,7 +249,8 @@ function onConnect(status) {
234
249
  clearTimeout(reconnectTimer);
235
250
 
236
251
  //addHandler:(callback, namespace to match, stanza name, stanza type, stanza id , stanza from, options)
237
- strophe_connection.addHandler(onMessage, null, 'message', null, null, null);
252
+ strophe_connection.addHandler(onMessage, null, 'message', 'chat', null, null);
253
+ strophe_connection.addHandler(onRoomMessage, null, 'message', 'groupchat', null, null);
238
254
  strophe_connection.addHandler(onPresence, null, 'presence', null, null, null);
239
255
  strophe_connection.addHandler(onIQStanza,null, "iq", null, null);
240
256
 
@@ -274,7 +290,6 @@ function onReconnect(){
274
290
  }
275
291
  }
276
292
 
277
-
278
293
  function disconnectStrophe(){
279
294
  userStatus = "offline";
280
295
  setStatusWidgetTitle("offline");
@@ -289,18 +304,24 @@ function disconnectStrophe(){
289
304
  ////////
290
305
  //Manage Message stanzas
291
306
  ///////
307
+
308
+ //Chat messages handler
292
309
  function onMessage(msg) {
293
- var to = msg.getAttribute('to');
294
310
  var from = msg.getAttribute('from');
295
311
  var type = msg.getAttribute('type');
296
312
  var elems = msg.getElementsByTagName('body');
297
313
 
298
314
  if (type == "chat" && elems.length > 0) {
299
315
  var body = elems[0];
300
- var from_slug = from.split("@")[0];
301
- var from_jid = from_slug + "@" + domain;
302
-
303
- putReceivedMessageOnChatWindow(from_jid,from_slug,body,null)
316
+ var msg = Strophe.getText(body);
317
+ var from_slug = getSlugFromJid(from)
318
+
319
+ if(isChatRoomJid(from)){
320
+ return true
321
+ } else {
322
+ var from_slug = getSlugFromJid(from)
323
+ afterReceivedChatMessage(from_slug,msg,null)
324
+ }
304
325
  }
305
326
 
306
327
  // we must return true to keep the handler alive.
@@ -313,35 +334,38 @@ function onMessage(msg) {
313
334
  //Manage Presence stanzas
314
335
  ///////
315
336
  function onPresence(presence) {
316
-
317
- log(presence)
318
-
319
- //Check presence stanza type
320
- var ptype = $(presence).attr('type');
321
-
322
- switch (ptype){
323
- case undefined:
324
- processAvailablePresenceStanza(presence)
325
- break;
326
- case "available":
327
- processAvailablePresenceStanza(presence)
328
- break;
329
- case "unavailable":
330
- processUnavailablePresenceStanza(presence)
331
- break;
332
- default :
333
- //Stanza type not recognize
334
- processAvailablePresenceStanza(presence)
335
- }
336
-
337
- return true;
338
- }
337
+ if (isChatRoomJid($(presence).attr('from'))){
338
+ return onRoomPresence(presence);
339
+ } else {
340
+ return onBuddyPresence(presence);
341
+ }
342
+ }
339
343
 
344
+ function onBuddyPresence(presence){
345
+ var ptype = $(presence).attr('type');
346
+
347
+ switch (ptype){
348
+ case undefined:
349
+ processAvailablePresenceStanza(presence)
350
+ break;
351
+ case "available":
352
+ processAvailablePresenceStanza(presence)
353
+ break;
354
+ case "unavailable":
355
+ processUnavailablePresenceStanza(presence)
356
+ break;
357
+ default :
358
+ //Stanza type not recognize
359
+ processAvailablePresenceStanza(presence)
360
+ }
361
+
362
+ return true;
363
+ }
340
364
 
341
365
  function processAvailablePresenceStanza(presence){
342
366
  var from = $(presence).attr('from');
343
367
  var slug = from.split("@")[0];
344
-
368
+
345
369
  if (slug != user_slug) {
346
370
  storeContactInformation(presence);
347
371
  if (getConnectionBoxFromSlug(slug)!=null){
@@ -359,7 +383,7 @@ function processAvailablePresenceStanza(presence){
359
383
  function processUnavailablePresenceStanza(presence){
360
384
  var from = $(presence).attr('from');
361
385
  var slug = from.split("@")[0];
362
-
386
+
363
387
  if (slug != user_slug) {
364
388
  if (getConnectionBoxFromSlug(slug)!=null){
365
389
  updateInterfaceAfterPresenceStanza(slug,false)
@@ -383,6 +407,12 @@ function storeContactInformation(stanza){
383
407
  }
384
408
  }
385
409
 
410
+ function storeRoomInformation(roomName){
411
+ if (!(roomName in roomsInfo)) {
412
+ var room = new chatRoom();
413
+ roomsInfo[roomName]=room;
414
+ }
415
+ }
386
416
 
387
417
 
388
418
  ////////
@@ -404,7 +434,7 @@ function onIQStanza(iq){
404
434
  if(type=="get"){
405
435
  return handleGetIQStanza(iq,from,slug);
406
436
  } else if(type="result"){
407
- return handleResultIQStanza(iq,from,slug)
437
+ return handleResultIQStanza(iq,from,slug);
408
438
  }
409
439
 
410
440
  return true;
@@ -437,7 +467,7 @@ function handleGetIQStanza(iq,jid,slug){
437
467
 
438
468
  //Case 2: Request videochat
439
469
  if(iqID==iqStanzaID['videochatRequest']){
440
- handleGetVideochatIQStanza(jid,iqID,iq,slug)
470
+ handleGetVideochatIQStanza(jid,iqID,iq,slug);
441
471
  return true;
442
472
  }
443
473
 
@@ -447,8 +477,6 @@ function handleGetIQStanza(iq,jid,slug){
447
477
  return true;
448
478
  }
449
479
 
450
-
451
-
452
480
  function handleGetVideochatIQStanza(jid,iqID,iq,slug){
453
481
  storeContactInformation(iq);
454
482
  var queryTag = iq.getElementsByTagName('query');
@@ -477,7 +505,6 @@ function handleGetVideochatIQStanza(jid,iqID,iq,slug){
477
505
  function handleResultIQStanza(iq,jid,slug){
478
506
  var iqID = iq.getAttribute("id");
479
507
 
480
-
481
508
  if (iqID==iqStanzaID['cinfo']){
482
509
  return handleIQResultWithClientInfo(iq,slug);
483
510
  }
@@ -588,7 +615,6 @@ function sendIQStanzaToRequestVideochat(slug){
588
615
  }
589
616
 
590
617
 
591
-
592
618
  ///////
593
619
  //SEND STANZAS: RESULT
594
620
  ///////
@@ -636,11 +662,24 @@ function sendIQStanzaToCancelVideochat(slug){
636
662
  }
637
663
 
638
664
 
639
-
640
665
  ////////
641
666
  //Send Message stanzas
642
667
  ///////
643
- function sendChatMessage(from,to,text){
668
+ function sendChatMessage(guest_slug,msg){
669
+ rotatePriority(guest_slug);
670
+ if (isSlugGroup(guest_slug)){
671
+ var guest_jid = getRoomJidFromRoomName(guest_slug)
672
+ return sendGroupMessageToRoom(guest_jid,msg);
673
+ } else {
674
+ var headerMessage = getParsedName(user_name,true);
675
+ getChatBoxForSlug(guest_slug).chatbox("option", "boxManager").addMsg(headerMessage, getParsedContent(msg,true));
676
+ var guest_jid = getJidFromSlug(guest_slug)
677
+ return sendChatMessageToBuddy(guest_jid,msg);
678
+ }
679
+ }
680
+
681
+ function sendChatMessageToBuddy(to,text){
682
+ var from = user_jid
644
683
  var type = "chat";
645
684
  var body= $build("body");
646
685
  body.t(text);
@@ -673,13 +712,342 @@ function sendStatus(status){
673
712
  }
674
713
 
675
714
 
676
-
677
715
  ////////
678
716
  //MUC management
679
717
  ///////
680
718
 
719
+ var muc_host = "conference";
720
+
681
721
  function joinRoom(roomName){
682
- //domain
683
- //stropne_connection.muc.init(stropne_connection)
684
- //stropne_connection.muc.join(room, user_name, onMessage, onPresence, null, null)
722
+ return strophe_connection.muc.join(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null, null, null)
723
+ }
724
+
725
+ function leaveRoom(roomName){
726
+ return strophe_connection.muc.leave(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null)
727
+ }
728
+
729
+ function sendGroupMessageToRoomWithName(roomName,msg){
730
+ return sendMessageToRoom(getRoomJidFromRoomName(roomName),msg)
731
+ }
732
+
733
+ function sendGroupMessageToRoom(roomJid,msg){
734
+ return strophe_connection.muc.message(roomJid, null, msg, null, "groupchat")
735
+ }
736
+
737
+ function sendPrivateMessageToRoomUser(roomName,userNick,msg){
738
+ return strophe_connection.muc.message(getRoomJidFromRoomName(roomName), userNick, msg, null, "chat")
739
+ }
740
+
741
+ function queryChatRoomOccupants(roomName){
742
+ return strophe_connection.muc.queryOccupants(getRoomJidFromRoomName(roomName), queryChatRoomOccupantsSuccess, queryChatRoomOccupantsFail)
743
+ }
744
+
745
+ function queryChatRoomOccupantsSuccess(iqResponse){
746
+ handleIQResultFromMucOccupantsRequest(iqResponse);
747
+ return true;
748
+ }
749
+
750
+ function queryChatRoomOccupantsFail(){
751
+ return true;
752
+ }
753
+
754
+ function handleIQResultFromMucOccupantsRequest(iq){
755
+ var from = $(iq).attr('from');
756
+ var room_slug = getSlugFromJid(from)
757
+ var queryTag = iq.getElementsByTagName('query');
758
+
759
+ if (queryTag.length > 0) {
760
+ var queryElement = queryTag[0];
761
+ var occupants = queryElement.getElementsByTagName('item');
762
+ $.each(occupants, function(index, value) {
763
+ //List all occupants
764
+ var nick = $(value).attr("name");
765
+ if(roomsInfo[room_slug].occupants.indexOf(nick)==-1){
766
+ roomsInfo[room_slug].occupants.push(nick)
767
+ }
768
+ });
769
+ }
770
+ }
771
+
772
+ function accessRoom(roomName,open){
773
+ storeRoomInformation(roomName)
774
+ if(roomsInfo[roomName].joined==false){
775
+ joinRoom(roomName)
776
+ queryChatRoomOccupants(roomName)
777
+ }
778
+ if(!existsSlugChatBox(roomName)){
779
+ createGroupChatBox(roomName,open)
780
+ }
781
+ return true
782
+ }
783
+
784
+ function resetRoomConfig(roomName){
785
+ storeRoomInformation(roomName)
786
+ var room = new chatRoom()
787
+ roomsInfo[roomName]=room
788
+ }
789
+
790
+ function updateRoomsInfoAfterUserDisconnect(){
791
+ $.each(getAllSlugsWithVisibleGroupBoxes(), function(index, value) {
792
+ resetRoomConfig(value)
793
+ initialNotificationInGroup(value,I18n.t('chat.muc.offline'))
794
+ });
795
+ }
796
+
797
+ function getRoomJidFromRoomName(roomName){
798
+ return roomName + "@" + muc_host + "." + domain;
799
+ }
800
+
801
+ function getRoomNickForRoom(roomName){
802
+ if(roomName in roomsInfo){
803
+ return roomsInfo[roomName].nick;
804
+ } else {
805
+ return getBaseNickFromUserName();
806
+ }
807
+ }
808
+
809
+ function getBaseNickFromUserName(){
810
+ return user_name.split(" ")[0];
811
+ }
812
+
813
+ function changeRoomNickNameAndJoinAgain(roomName){
814
+ var old_nick = getRoomNickForRoom(roomName)
815
+
816
+ if(old_nick.split("_").length > 4){
817
+ //Bucle prevention...
818
+ return false;
819
+ }
820
+
821
+ storeRoomInformation(roomName)
822
+ roomsInfo[roomName].nick = old_nick + "_"
823
+ joinRoom(roomName)
824
+ return true;
825
+ }
826
+
827
+
828
+ ////////
829
+ //MUC Stanzas
830
+ ///////
831
+
832
+ //MUC Messages
833
+ function onRoomMessage(msg) {
834
+ //from=roomSlug@conference.domain/from_slug
835
+ var from = msg.getAttribute('from');
836
+ var type = msg.getAttribute('type');
837
+ var elems = msg.getElementsByTagName('body');
838
+
839
+ if (type == "groupchat" && elems.length > 0) {
840
+ var body = elems[0];
841
+ var user_nick = getNickFromChatRoomJid(from)
842
+ var msg = Strophe.getText(body);
843
+ afterReceivedGroupChatMessage(from,msg)
844
+ }
845
+ return true;
846
+ }
847
+
848
+
849
+ //MUC Presence stanzas
850
+ function onRoomPresence(presence) {
851
+ var from = $(presence).attr('from');
852
+ var to = $(presence).attr('to')
853
+ var room_slug = getSlugFromJid(from);
854
+ var nick = getNickFromChatRoomJid(from)
855
+ var ptype = $(presence).attr('type')
856
+
857
+ //Join or Leave room stanzas of self user
858
+ if((nick == getRoomNickForRoom(room_slug))&&(getSlugFromJid(to) == user_slug)){
859
+ switch (ptype){
860
+ case undefined:
861
+ processJoinRoomPresenceStanza(presence);
862
+ break;
863
+ case "available":
864
+ processJoinRoomPresenceStanza(presence);
865
+ break;
866
+ case "unavailable":
867
+ processLeaveRoomPresenceStanza(presence);
868
+ break;
869
+ case "error":
870
+ processJoinErrorRoomPresenceStanza(presence);
871
+ break;
872
+ }
873
+ return true;
874
+ }
875
+
876
+
877
+ //Rest of stanzas
878
+ switch (ptype){
879
+ case undefined:
880
+ processAvailableRoomPresenceStanza(presence)
881
+ break;
882
+ case "available":
883
+ processAvailableRoomPresenceStanza(presence)
884
+ break;
885
+ case "unavailable":
886
+ processUnavailableRoomPresenceStanza(presence)
887
+ break;
888
+ default :
889
+ //Stanza type not recognize
890
+ return true
891
+ }
892
+
893
+ return true
894
+ }
895
+
896
+
897
+ function processJoinRoomPresenceStanza(presence){
898
+ var from = $(presence).attr('from');
899
+ var room_slug = getSlugFromJid(from);
900
+ storeRoomInformation(room_slug);
901
+
902
+ var xElements = presence.getElementsByTagName('x');
903
+
904
+ if (xElements.length == 1) {
905
+ var xElement = xElements[0];
906
+ var items = xElement.getElementsByTagName('item');
907
+
908
+ $.each(items, function(index, value) {
909
+ var role = $(value).attr("role")
910
+ var affiliation = $(value).attr("affiliation")
911
+
912
+ roomsInfo[room_slug].affiliation = affiliation
913
+ roomsInfo[room_slug].role = role
914
+ if(roomsInfo[room_slug].joined == false){
915
+ roomsInfo[room_slug].joined = true
916
+ changeInitialNotificationInGroup(room_slug,I18n.t('chat.muc.occupants'))
917
+ }
918
+ });
919
+ }
920
+ }
921
+
922
+ function processLeaveRoomPresenceStanza(presence){
923
+ var from = $(presence).attr('from');
924
+ var room_slug = getSlugFromJid(from);
925
+ resetRoomConfig(room_slug)
926
+ changeInitialNotificationInGroup(room_slug,"")
927
+ }
928
+
929
+ function processJoinErrorRoomPresenceStanza(presence){
930
+ var from = $(presence).attr('from')
931
+ var room_slug = getSlugFromJid(from)
932
+ var errorMsg = "Error";
933
+
934
+ var eElements = presence.getElementsByTagName('error')
935
+ if (eElements.length == 1) {
936
+ var error = eElements[0];
937
+ var code = $(error).attr("code")
938
+ var type = $(error).attr("type")
939
+ errorMsg = errorMsg + " with code:" + code + " and type:" + type
940
+ var textElements = error.getElementsByTagName('text')
941
+ if (textElements.length == 1) {
942
+ var text = $(textElements[0]).text()
943
+ errorMsg = errorMsg + "\n" + text
944
+ }
945
+
946
+ //Try to fix errors!
947
+ if(code==409){
948
+ //Case: Nickname already in use
949
+ if (changeRoomNickNameAndJoinAgain(room_slug)){
950
+ return;
951
+ }
952
+ }
953
+ //if(code==403){
954
+ //Case: Auth Denied
955
+ //}
956
+
957
+ //[...]
958
+
959
+ }
960
+
961
+ resetRoomConfig(room_slug)
962
+ initialNotificationInGroup(room_slug,I18n.t("chat.muc.joinError", {errorMsg: errorMsg}))
963
+ }
964
+
965
+ function processAvailableRoomPresenceStanza(presence){
966
+ var from = $(presence).attr('from');
967
+ var nick = getNickFromChatRoomJid(from)
968
+ var room_slug = getSlugFromJid(from)
969
+ storeRoomInformation(room_slug);
970
+
971
+ if (roomsInfo[room_slug].occupants.indexOf(nick)==-1){
972
+ roomsInfo[room_slug].occupants.push(nick)
973
+ addNickToNotificationInGroup(room_slug,nick)
974
+ writeReceivedMessageOnChatWindow("",room_slug, I18n.t("chat.muc.join", {nick: nick}))
975
+ }
976
+ }
977
+
978
+ function processUnavailableRoomPresenceStanza(presence){
979
+ var from = $(presence).attr('from');
980
+ var nick = getNickFromChatRoomJid(from)
981
+ var room_slug = getSlugFromJid(from)
982
+ storeRoomInformation(room_slug);
983
+
984
+ if (roomsInfo[room_slug].occupants.indexOf(nick)!=-1){
985
+ roomsInfo[room_slug].occupants.splice(roomsInfo[room_slug].occupants.indexOf(nick),1)
986
+ removeNickFromNotificationInGroup(room_slug,nick)
987
+ writeReceivedMessageOnChatWindow("",room_slug,I18n.t("chat.muc.leave", {nick: nick}))
988
+ }
989
+ }
990
+
991
+
992
+
993
+ //////////////////
994
+ // Getters
995
+ //////////////////
996
+ function getSlugFromJid(jid){
997
+ return jid.split("@")[0];
998
+ }
999
+
1000
+ function getDomainFromJid(jid){
1001
+ return jid.split("@")[1].split("/")[0];
1002
+ }
1003
+
1004
+ function isChatRoomJid(jid){
1005
+ if ((getDomainFromJid(jid).split(".")[0])==muc_host){
1006
+ return true;
1007
+ }
1008
+ return false;
1009
+ }
1010
+
1011
+ function getNameFromSlug(slug){
1012
+ var connectionBox = getConnectionBoxFromSlug(slug);
1013
+
1014
+ if(connectionBox!=null){
1015
+ return $(connectionBox).attr("name");
1016
+ }
1017
+
1018
+ var chatBox = getChatBoxForSlug(slug)
1019
+ if(chatBox!=null){
1020
+ return chatBox.attr("name");
1021
+ }
1022
+
1023
+ //return rebuildNameFromSlug(slug)
1024
+ return slug;
1025
+ }
1026
+
1027
+ function rebuildNameFromSlug(slug){
1028
+ var cname = slug.split("-");
1029
+ var name = "";
1030
+ for(i=0; i<cname.length; i++){
1031
+ if (i!=0){
1032
+ name = name + " ";
1033
+ }
1034
+ name = name + cname[i][0].toUpperCase() + cname[i].substring(1,cname[i].length);
1035
+ }
1036
+ return name;
1037
+ }
1038
+
1039
+ function getNameFromJid(){
1040
+ return getNameFromSlug(getSlugFromJid(jid));
1041
+ }
1042
+
1043
+ function getJidFromSlug(slug){
1044
+ return slug + "@" + domain;
1045
+ }
1046
+
1047
+ function getNickFromChatRoomJid(jid){
1048
+ return jid.split("/")[1];
1049
+ }
1050
+
1051
+ function purgeNickFromChatRoomJid(jid){
1052
+ return jid.split("/")[0];
685
1053
  }