social_stream 0.26.1 → 0.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. data/README.rdoc +10 -0
  2. data/base/lib/social_stream/base/version.rb +1 -1
  3. data/base/social_stream-base.gemspec +1 -1
  4. data/lib/social_stream/release/component.rb +5 -0
  5. data/lib/social_stream/release/global.rb +8 -7
  6. data/lib/social_stream/release/kernel.rb +24 -0
  7. data/lib/social_stream/version.rb +1 -1
  8. data/presence/app/assets/javascripts/jquery.flexselect.sstreampresence.js +2 -2
  9. data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +5 -5
  10. data/presence/app/assets/javascripts/presence.js.erb +6 -4
  11. data/presence/app/assets/javascripts/presence_XmppClient.js.erb +1146 -996
  12. data/presence/app/assets/javascripts/presence_audio.js.erb +74 -60
  13. data/presence/app/assets/javascripts/presence_game.js.erb +35 -22
  14. data/presence/app/assets/javascripts/presence_game_comunication.js.erb +22 -5
  15. data/presence/app/assets/javascripts/presence_game_factory.js.erb +1 -1
  16. data/presence/app/assets/javascripts/presence_game_interface.js.erb +33 -13
  17. data/presence/app/assets/javascripts/presence_notifications.js +206 -183
  18. data/presence/app/assets/javascripts/presence_parser.js +265 -247
  19. data/presence/app/assets/javascripts/presence_persistence.js +199 -188
  20. data/presence/app/assets/javascripts/presence_store.js +22 -11
  21. data/presence/app/assets/javascripts/presence_uiManager.js.erb +553 -530
  22. data/presence/app/assets/javascripts/presence_utilities.js +244 -219
  23. data/presence/app/assets/javascripts/presence_videochat.js.erb +436 -409
  24. data/presence/app/assets/javascripts/presence_windowManager.js +586 -532
  25. data/presence/app/views/chat/_index.html.erb +7 -13
  26. data/presence/config/locales/en.yml +2 -1
  27. data/presence/config/locales/es.yml +2 -1
  28. data/presence/ejabberd/ejabberd_files.zip +0 -0
  29. data/presence/ejabberd/ejabberd_scripts/authentication_script +9 -2
  30. data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  31. data/presence/lib/generators/social_stream/presence/templates/initializer.rb +4 -0
  32. data/presence/lib/social_stream-presence.rb +3 -0
  33. data/presence/lib/social_stream/presence/version.rb +1 -1
  34. data/presence/lib/social_stream/presence/xmpp_server_order.rb +1 -0
  35. data/release.thor +33 -13
  36. data/social_stream.gemspec +2 -2
  37. metadata +90 -29
data/README.rdoc CHANGED
@@ -50,6 +50,16 @@ Since {Social Stream}[http://github.com/ging/social_stream] depends on {Devise}[
50
50
 
51
51
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
52
52
 
53
+ Social Stream is not compatible with default mass attributes protection shipped with Rails 3.2.3
54
+ http://weblog.rubyonrails.org/2012/3/30/ann-rails-3-2-3-has-been-released/
55
+
56
+ You must set
57
+
58
+ config.active_record.whitelist_attributes = false in config/application.rb
59
+
60
+
61
+
62
+
53
63
  = Social Stream components
54
64
 
55
65
  Social Stream is divided into components. Developers can customize their social
@@ -1,5 +1,5 @@
1
1
  module SocialStream
2
2
  module Base
3
- VERSION = "0.20.1".freeze
3
+ VERSION = "0.20.2".freeze
4
4
  end
5
5
  end
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
58
58
  # Autolink text blocks
59
59
  s.add_runtime_dependency('rails_autolink', '~> 1.0.4')
60
60
  # SocialCheesecake
61
- s.add_runtime_dependency('social_cheesecake','~> 0.4.0')
61
+ s.add_runtime_dependency('social_cheesecake','~> 0.5.0')
62
62
  # I18n-js
63
63
  s.add_runtime_dependency('i18n-js','~>2.1.2')
64
64
 
@@ -9,6 +9,11 @@ module SocialStream
9
9
  @name, @options = name, options
10
10
  end
11
11
 
12
+ # Has this component changes since the last release
13
+ def dirty?
14
+ `git log #{ last_tag }.. #{ name } | wc -l`.to_i > 0
15
+ end
16
+
12
17
  protected
13
18
 
14
19
  def version_file
@@ -1,3 +1,4 @@
1
+ require File.expand_path('../kernel', __FILE__)
1
2
  require File.expand_path('../dependency_update', __FILE__)
2
3
  require File.expand_path('../global/version_file', __FILE__)
3
4
 
@@ -10,8 +11,8 @@ module SocialStream
10
11
 
11
12
  attr_reader :name, :version
12
13
 
13
- def initialize(target = nil, options = {})
14
- @target, @options = target, options
14
+ def initialize(target = nil)
15
+ @target = target
15
16
  end
16
17
 
17
18
  def bump
@@ -21,11 +22,7 @@ module SocialStream
21
22
  end
22
23
 
23
24
  def publish
24
- if @options[:test]
25
- puts rake_release_command
26
- else
27
- system(rake_release_command) || raise(RuntimeError.new)
28
- end
25
+ release_cmd rake_release_command
29
26
  end
30
27
 
31
28
  def dependencies
@@ -37,6 +34,10 @@ module SocialStream
37
34
  "#{ @version_file.filename } #{ gemspec }"
38
35
  end
39
36
 
37
+ def last_tag
38
+ `git describe`.split('-').first
39
+ end
40
+
40
41
  protected
41
42
 
42
43
  def bump_version
@@ -0,0 +1,24 @@
1
+ module SocialStream
2
+ module Release
3
+ module Kernel
4
+ class << self
5
+ attr_accessor :release_action
6
+ end
7
+
8
+ @release_action = :system
9
+ end
10
+ end
11
+ end
12
+
13
+ module Kernel
14
+ def release_cmd(cmd)
15
+ case SocialStream::Release::Kernel.release_action
16
+ when :system
17
+ system(cmd) || raise(RuntimeError.new)
18
+ when :test
19
+ puts "* release_cmd * #{ cmd }"
20
+ else
21
+ raise "Unknown release_action #{ SocialStream::Release::Kernel.release_action }"
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module SocialStream
2
- VERSION = "0.26.1".freeze
2
+ VERSION = "0.26.2".freeze
3
3
  end
@@ -257,8 +257,8 @@
257
257
  //this.picked = true;
258
258
  this.hidden.val(selected.value);
259
259
  this.input.val("");
260
- if(typeof changeSelectContactValue == "function"){
261
- return changeSelectContactValue(selected.name,selected.value);
260
+ if(typeof PRESENCE.UIMANAGER.changeSelectContactValue == "function"){
261
+ return PRESENCE.UIMANAGER.changeSelectContactValue(selected.name,selected.value);
262
262
  }
263
263
  } else if (this.settings.allowMismatch) {
264
264
  this.hidden.val("");
@@ -66,7 +66,7 @@
66
66
  self.elem.uiChatboxTitlebar.effect("highlight", options, 300);
67
67
 
68
68
 
69
- if (((typeof mustBounceBoxForChatWindow == 'function')&&(mustBounceBoxForChatWindow(self)))||((typeof mustBounceBoxForChatWindow != 'function'))) {
69
+ if (((typeof PRESENCE.UTILITIES.mustBounceBoxForChatWindow == 'function')&&(PRESENCE.UTILITIES.mustBounceBoxForChatWindow(self)))||((typeof PRESENCE.UTILITIES.mustBounceBoxForChatWindow != 'function'))) {
70
70
  self.elem.uiChatbox.effect("bounce", {times:3}, 300, function(){
71
71
  self.highlightLock = false;
72
72
  self._scrollToBottom();
@@ -185,7 +185,7 @@
185
185
  .hover(function() {uiChatboxTitlebarVideo.addClass('ui-state-hover');},
186
186
  function() {uiChatboxTitlebarVideo.removeClass('ui-state-hover');})
187
187
  .click(function(event) {
188
- toggleVideoBox(self)
188
+ PRESENCE.WINDOW.toggleVideoBox(self)
189
189
  return false;
190
190
  })
191
191
  .appendTo(uiChatboxTitlebar),
@@ -204,7 +204,7 @@
204
204
  .hover(function() {uiChatboxTitlebarVideoChange.addClass('ui-state-hover');},
205
205
  function() {uiChatboxTitlebarVideoChange.removeClass('ui-state-hover');})
206
206
  .click(function(event) {
207
- toggleVideoBoxChange(self)
207
+ PRESENCE.WINDOW.toggleVideoBoxChange(self)
208
208
  return false;
209
209
  })
210
210
  .appendTo(uiChatboxTitlebar),
@@ -247,7 +247,7 @@
247
247
  'ui-chatbox-notify'
248
248
  )
249
249
  .click(function(event) {
250
- onClickChatNotification(self.uiChatboxNotify)
250
+ PRESENCE.NOTIFICATIONS.onClickChatNotification(self.uiChatboxNotify)
251
251
  })
252
252
  .appendTo(uiChatboxContent),
253
253
 
@@ -289,7 +289,7 @@
289
289
  .appendTo(uiChatboxInput)
290
290
  .keydown(function(event) {
291
291
  if(event.keyCode && event.keyCode == $.ui.keyCode.ENTER) {
292
- var userChatDataInputControlBoolean = (((typeof userChatDataInputControl == 'function')&&(userChatDataInputControl()))||((typeof userChatDataInputControl != 'function')));
292
+ var userChatDataInputControlBoolean = (((typeof PRESENCE.UTILITIES.userChatDataInputControl == 'function')&&(PRESENCE.UTILITIES.userChatDataInputControl()))||((typeof PRESENCE.UTILITIES.userChatDataInputControl != 'function')));
293
293
  if (userChatDataInputControlBoolean) {
294
294
  msg = $.trim($(this).val());
295
295
  if (msg.length > 0) {
@@ -7,10 +7,12 @@ PRESENCE.AUTHORS = 'Aldo Gordillo';
7
7
  PRESENCE.CORE = (function(P,$,undefined){
8
8
 
9
9
  var init = function(){
10
- initFocusListeners();
11
- checkVideocallFeature();
12
- PRESENCE.GAME.init(strophe_connection);
13
- initAudio();
10
+ PRESENCE.UIMANAGER.init();
11
+ PRESENCE.UTILITIES.init();
12
+ PRESENCE.XMPPClient.init();
13
+ PRESENCE.VIDEOCHAT.init();
14
+ PRESENCE.GAME.init();
15
+ PRESENCE.AUDIO.init();
14
16
  };
15
17
 
16
18
  return {
@@ -1,1062 +1,1212 @@
1
1
  ////////////////////
2
- //Global constants
2
+ //XMPP Client Module
3
3
  ////////////////////
4
- var domain = '<%=SocialStream::Presence.domain%>';
5
4
 
6
- ////////////////////
7
- //Hash tables
8
- ////////////////////
9
-
10
- //Keys: Social Stream Chat Status
11
- //Value: Xmpp status
12
- var sstreamChatStatus = new Array();
13
- sstreamChatStatus['available'] = "chat";
14
- sstreamChatStatus['away'] = "away";
15
- sstreamChatStatus['autoaway'] = "away";
16
- sstreamChatStatus['dnd'] = "dnd";
17
-
18
- //Keys: Xmpp status
19
- //Value: Message associated with Xmpp Status
20
- var statusMessage = new Array();
21
- statusMessage[''] = "";
22
- statusMessage['chat'] = "";
23
- statusMessage['away'] = "Away";
24
- statusMessage['xa'] = "Away";
25
- statusMessage['dnd'] = "Busy";
26
5
 
27
- //Keys: Xmpp status
28
- //Value: Icon name (Same as Social Stream Status)
29
- var statusIcons = new Array();
30
- statusIcons[''] = "available";
31
- statusIcons['chat'] = "available";
32
- statusIcons['away'] = "away";
33
- statusIcons['xa'] = "away";
34
- statusIcons['dnd'] = "dnd";
35
-
36
- //Contacts information
6
+ //Global variable: Contacts information
37
7
  var contactsInfo = new Array();
38
8
  //contactsInfo['slug'] = "[Object chatContact]";
39
9
 
40
- //Manage contact information
41
- function chatContact(domain,resource,client,version) {
42
- this.domain=domain
43
- this.resource=resource
44
- this.client=client;
45
- this.version=version;
46
-
47
- //Videochat params
48
- //Sender: disconnected, negotiating , connecting , waiting, establishing, connected
49
- //Receiver: disconnected , pending , establishing, connected
50
- this.videoChatStatus = "disconnected";
51
- this.session_id=null;
52
- this.user_token=null;
53
- this.guest_token=null;
54
- this.session=null;
55
- this.publisher=null;
56
-
57
- //Game params
58
- //Sender: disconnected, waiting, playing
59
- //Receiver: disconnected , pending , playing
60
- this.gameStatus="disconnected";
61
- this.game=null;
62
- }
63
-
64
- //Rooms information
65
- var roomsInfo = new Array();
66
- //roomsInfo['groupSlug'] = "[Object chatRoom]";
67
-
68
- //Manage room information
69
- function chatRoom() {
70
- this.occupants=[];
71
- this.joined = false;
72
- this.affiliation = "none";
73
- this.role = "none";
74
- this.nick = getBaseNickFromUserName();
75
- }
76
10
 
11
+ PRESENCE.XMPPClient = (function(P,$,undefined){
77
12
 
78
- //IQsIDs
79
- var iqStanzaID = new Array();
80
- iqStanzaID['cinfo'] = "versionID";
81
- iqStanzaID['videochatRequest'] = "videochatRequestID";
82
- iqStanzaID['videochatRequestCancel'] = "videochatRequestCancelID";
83
-
84
-
85
-
86
- ////////////////////
87
- //Connect functions
88
- ////////////////////
13
+ //XMPP Client Variables
14
+ var domain = '<%=SocialStream::Presence.domain%>';
15
+
16
+ ////////////////////
17
+ //Hash tables
18
+ ////////////////////
19
+
20
+ //Keys: Social Stream Chat Status
21
+ //Value: Xmpp status
22
+ var sstreamChatStatus = new Array();
23
+ sstreamChatStatus['available'] = "chat";
24
+ sstreamChatStatus['away'] = "away";
25
+ sstreamChatStatus['autoaway'] = "away";
26
+ sstreamChatStatus['dnd'] = "dnd";
27
+
28
+ //Keys: Xmpp status
29
+ //Value: Message associated with Xmpp Status
30
+ var statusMessage = new Array();
31
+ statusMessage[''] = "";
32
+ statusMessage['chat'] = "";
33
+ statusMessage['away'] = "Away";
34
+ statusMessage['xa'] = "Away";
35
+ statusMessage['dnd'] = "Busy";
36
+
37
+ //Manage contact information
38
+ function chatContact(domain,resource,client,version) {
39
+ this.domain=domain
40
+ this.resource=resource
41
+ this.client=client;
42
+ this.version=version;
43
+
44
+ //Videochat params
45
+ //Sender: disconnected, negotiating , connecting , waiting, establishing, connected
46
+ //Receiver: disconnected , pending , establishing, connected
47
+ this.videoChatStatus = "disconnected";
48
+ this.session_id=null;
49
+ this.user_token=null;
50
+ this.guest_token=null;
51
+ this.session=null;
52
+ this.publisher=null;
53
+
54
+ //Game params
55
+ //Sender: disconnected, waiting, playing
56
+ //Receiver: disconnected , pending , playing
57
+ this.gameStatus="disconnected";
58
+ this.game=null;
59
+ }
60
+
61
+ //Rooms information
62
+ var roomsInfo = new Array();
63
+ //roomsInfo['groupSlug'] = "[Object chatRoom]";
64
+
65
+ //Manage room information
66
+ function chatRoom() {
67
+ this.occupants=[];
68
+ this.joined = false;
69
+ this.affiliation = "none";
70
+ this.role = "none";
71
+ this.nick = getBaseNickFromUserName();
72
+ this.lastMessageId = null;
73
+ }
74
+
89
75
 
90
- function connectToChat(user_jid,cookie,password){
76
+ //IQsIDs
77
+ var iqStanzaID = new Array();
78
+ iqStanzaID['cinfo'] = "versionID";
79
+ iqStanzaID['videochatRequest'] = "videochatRequestID";
80
+ iqStanzaID['videochatRequestCancel'] = "videochatRequestCancelID";
81
+
82
+
83
+ var init = function(){
84
+ getConnection();
85
+ }
86
+
87
+
88
+ ////////////////////
89
+ //Connect functions
90
+ ////////////////////
91
+
92
+ var connectToChat = function(user_jid,credential){
93
+
94
+ if (isUserConnected()){
95
+ return true;
96
+ }
97
+
98
+ if (authByCookie()){
99
+ if (connectToServerWithCookie(user_jid, credential)==false){
100
+ PRESENCE.UIMANAGER.updateChatWindow();
101
+ }
102
+ } else {
103
+ if (connectToServerWithPassword(user_jid,credential)==false){
104
+ PRESENCE.UIMANAGER.updateChatWindow();
105
+ }
106
+ }
107
+ }
108
+
109
+ var isStropheConnected = function(){
110
+ if((strophe_connection!=null)&&(strophe_connection.connected)){
111
+ return true;
112
+ } else {
113
+ return false;
114
+ }
115
+ }
116
+
117
+ var isUserConnected = function(){
118
+ return ((isStropheConnected()) && (userStatus!="offline") && (!disconnectionFlag));
119
+ }
120
+
121
+ var connectToServerWithCookie = function(user_jid, cookie){
122
+ try {
123
+ strophe_connection = getConnection();
124
+ strophe_connection.connect(user_jid, cookie, onConnect);
125
+ } catch (err) {
126
+ //"Handle errors"
127
+ return false;
128
+ }
129
+ return true;
130
+ }
131
+
132
+ //Password: Get from chatPassword param if exists, instead try to get from sessionStorage.
133
+ var connectToServerWithPassword = function(user_jid, chatPassword){
134
+
135
+ //Get Password
136
+ if ((chatPassword!=null)&&(chatPassword!="")){
137
+ var password = chatPassword;
138
+ } else if ((window.sessionStorage)&&(sessionStorage.getItem("ss_user_pass") != null)) {
139
+ var password = sessionStorage.getItem("ss_user_pass");
140
+ } else {
141
+ return false;
142
+ }
143
+
144
+ try {
145
+ //Connect actual user to the chat
146
+ strophe_connection = getConnection();
147
+ strophe_connection.connect(user_jid, password, onConnect);
148
+ } catch (err) {
149
+ //"Handle errors"
150
+ return false;
151
+ }
152
+
153
+ return true;
154
+ }
155
+
156
+
157
+ ////////
158
+ //Auth Methods
159
+ ///////
160
+ var authByCookie = function(){
161
+ var authMethod = '<%= SocialStream::Presence.auth_method %>';
162
+ return authMethod=="cookie";
163
+ }
164
+
165
+ var authByPassword = function(){
166
+ var authMethod = '<%= SocialStream::Presence.auth_method %>';
167
+ return authMethod=="password";
168
+ }
169
+
170
+
171
+ ////////////////////
172
+ //Stanza management using Strophe
173
+ ////////////////////
174
+
175
+ //Global variables
176
+ var userStatus;
177
+ var awayTimerPeriod = 60000;
178
+ var awayTime = 10*60000; //10 minutes
179
+ var awayCounter = 0;
180
+ var strophe_connection = null;
181
+ var reconnectAttempts = 3;
182
+ var awayTimer;
183
+ var reconnectTimer;
184
+ var disconnectionFlag = false;
185
+ var afterNewConnectionFlag = false;
186
+ var afterFirstConnectionFlag = true;
187
+
188
+
189
+ var onConnect = function(status) {
190
+
191
+ //Status.ERROR An error has occurred
192
+ //Status.CONNECTING The connection is currently being made
193
+ //Status.CONNFAIL The connection attempt failed
194
+ //Status.AUTHENTICATING The connection is authenticating
195
+ //Status.AUTHFAIL The authentication attempt failed
196
+ //Status.CONNECTED The connection has succeeded
197
+ //Status.DISCONNECTED The connection has been terminated
198
+ //Status.DISCONNECTING The connection is currently being terminated
199
+ //Status.ATTACHED The connection has been attached
200
+
201
+ PRESENCE.UTILITIES.log('Strophe onConnect callback call with status ' + status);
202
+
203
+ if (status == Strophe.Status.ERROR){
204
+ PRESENCE.UTILITIES.log('Strophe connection error');
205
+ return;
206
+ }
207
+
208
+ if (status == Strophe.Status.ATTACHED){
209
+ PRESENCE.UTILITIES.log('Strophe connection attached');
210
+ return;
211
+ }
212
+
213
+ if (status == Strophe.Status.AUTHENTICATING ){
214
+ PRESENCE.UTILITIES.log('Strophe connection AUTHENTICATING');
215
+ return;
216
+ }
217
+
218
+ if (status == Strophe.Status.CONNECTING) {
219
+ PRESENCE.UTILITIES.log('Strophe is connecting.');
220
+ return;
221
+ }
222
+
223
+ if (status == Strophe.Status.DISCONNECTING) {
224
+ PRESENCE.UTILITIES.log('Strophe is disconnecting.');
225
+ return;
226
+ }
227
+
228
+ if(typeof initialTimer != 'undefined'){
229
+ clearTimeout(initialTimer);
230
+ }
231
+
232
+ if (status == Strophe.Status.CONNFAIL) {
233
+ PRESENCE.UTILITIES.log('Strophe failed to connect.');
234
+ reconnectTimer = setTimeout ("PRESENCE.XMPPClient.onReconnect()", 5000);
235
+ disconnectionFlag = true;
236
+ } else if (status == Strophe.Status.AUTHFAIL) {
237
+ PRESENCE.UTILITIES.log('Strophe authentication fail.');
238
+ if ((window.sessionStorage)&&(sessionStorage.getItem("ss_user_pass") != null)){
239
+ sessionStorage.setItem("ss_user_pass",null);
240
+ }
241
+ disconnectionFlag = true;
242
+ } else if (status == Strophe.Status.ERROR) {
243
+ PRESENCE.UTILITIES.log('Strophe error.');
244
+ disconnectionFlag = true;
245
+ } else if (status == Strophe.Status.DISCONNECTED) {
246
+ PRESENCE.UTILITIES.log('Strophe is disconnected.');
247
+ disconnectionFlag = true;
248
+ clearTimeout(awayTimer);
249
+ PRESENCE.UIMANAGER.updateInterfaceAfterUserDisconnect();
250
+ updateRoomsInfoAfterUserDisconnect();
251
+ reconnectTimer = setTimeout ("PRESENCE.XMPPClient.onReconnect()", 5000);
252
+ } else if (status == Strophe.Status.CONNECTED) {
253
+ //AFTER CONNECT ACTIONS
254
+
255
+ PRESENCE.UTILITIES.log('Strophe is connected.');
256
+
257
+ clearTimeout(reconnectTimer);
258
+
259
+ //addHandler:(callback, namespace to match, stanza name, stanza type, stanza id , stanza from, options)
260
+ strophe_connection.addHandler(onMessage, null, 'message', 'chat', null, null);
261
+ strophe_connection.addHandler(onRoomMessage, null, 'message', 'groupchat', null, null);
262
+ strophe_connection.addHandler(onPresence, null, 'presence', null, null, null);
263
+ strophe_connection.addHandler(onIQStanza,null, "iq", null, null);
264
+
265
+ disconnectionFlag = false;
266
+ afterNewConnectionFlag = true;
267
+
268
+ if(! userStatus){
269
+ userStatus = PRESENCE.PERSISTENCE.getRestoreUserChatStatus();
270
+ }
271
+ if(userStatus=="offline"){
272
+ userStatus="chat";
273
+ }
274
+ sendStatus(userStatus);
275
+
276
+ awayTimer = setInterval("PRESENCE.XMPPClient.awayTimerFunction()", awayTimerPeriod);
277
+ }
278
+
279
+ PRESENCE.UIMANAGER.updateChatWindow();
280
+ }
91
281
 
92
- if (isUserConnected()){
93
- return true;
94
- }
282
+ var onReconnect = function(){
283
+
284
+ return
95
285
 
96
- if (authByCookie()){
97
- if (connectToServerWithCookie(user_jid, cookie)==false){
98
- updateChatWindow();
99
- }
100
- } else {
101
- if (connectToServerWithPassword(user_jid,password)==false){
102
- updateChatWindow();
103
- }
104
- }
105
- }
106
-
107
- function isStropheConnected(){
108
- if((strophe_connection!=null)&&(strophe_connection.connected)){
286
+ if ((!isStropheConnected())&&(userStatus!="offline")) {
287
+
288
+ if (reconnectAttempts>0) {
289
+ reconnectAttempts--;
290
+
291
+ PRESENCE.UIMANAGER.changeChatHeaderTitle(I18n.t('chat.reconnecting'))
292
+
293
+ connectToChat(user_jid,cookie,null);
294
+
295
+ reconnectTimer = setTimeout ("PRESENCE.XMPPClient.onReconnect()", 9000);
296
+
297
+ } else {
298
+ PRESENCE.UIMANAGER.changeChatHeaderTitle(I18n.t('chat.unableconnect'))
299
+ //Notify issue to Rails App Server?
300
+ }
301
+
302
+ }
303
+ }
304
+
305
+ var disconnect = function(){
306
+ userStatus = "offline";
307
+ PRESENCE.UIMANAGER.setStatusWidgetTitle("offline");
308
+
309
+ if(isStropheConnected()){
310
+
311
+ //Leave from rooms before disconnect
312
+ if(roomsInfo){
313
+ for(var roomName in roomsInfo){
314
+ if(roomsInfo[roomName].joined){
315
+ leaveRoom(roomName);
316
+ }
317
+ }
318
+ }
319
+
320
+ strophe_connection.send($pres({type: "unavailable"}).tree());
321
+ strophe_connection.disconnect();
322
+ }
323
+ }
324
+
325
+
326
+
327
+ ////////////////////
328
+ //Away Timer Management
329
+ ////////////////////
330
+
331
+ var awayTimerFunction = function(){
332
+ awayCounter++;
333
+ if (awayCounter > (awayTime/awayTimerPeriod)){
334
+ if ((userStatus != "dnd")&&(userStatus != "away")) {
335
+ userStatus = "autoaway";
336
+ sendStatus(userStatus);
337
+ }
338
+ clearTimeout(awayTimer);
339
+ }
340
+ }
341
+
342
+ var autochangeStatusIfAutoAway = function(){
343
+ if (userStatus == "autoaway"){
344
+ userStatus = "available";
345
+ sendStatus(userStatus);
346
+ }
347
+ }
348
+
349
+ var restartAwayTimer = function(){
350
+ if (awayCounter > (awayTime/awayTimerPeriod)){
351
+ awayTimer = setInterval("PRESENCE.XMPPClient.awayTimerFunction()", awayTimerPeriod);
352
+ autochangeStatusIfAutoAway();
353
+ }
354
+ awayCounter = 0;
355
+ }
356
+
357
+
358
+ ////////
359
+ //Manage Message stanzas
360
+ ///////
361
+
362
+ //Chat messages handler
363
+ var onMessage = function(msg) {
364
+ var from = msg.getAttribute('from');
365
+ var type = msg.getAttribute('type');
366
+ var elems = msg.getElementsByTagName('body');
367
+
368
+ if (type == "chat" && elems.length > 0) {
369
+ var body = elems[0];
370
+ var msg = Strophe.getText(body);
371
+ var from_slug = getSlugFromJid(from)
372
+
373
+ if(isChatRoomJid(from)){
374
+ return true
375
+ } else {
376
+ var from_slug = getSlugFromJid(from)
377
+ PRESENCE.UIMANAGER.afterReceivedChatMessage(from_slug,msg,null)
378
+ }
379
+ }
380
+
381
+ // we must return true to keep the handler alive.
382
+ // returning false would remove it after it finishes.
383
+ return true;
384
+ }
385
+
386
+
387
+ ////////
388
+ //Manage Presence stanzas
389
+ ///////
390
+ var onPresence = function(presence) {
391
+ if (isChatRoomJid($(presence).attr('from'))){
392
+ return onRoomPresence(presence);
393
+ } else {
394
+ return onBuddyPresence(presence);
395
+ }
396
+ }
397
+
398
+ var onBuddyPresence = function(presence){
399
+ var ptype = $(presence).attr('type');
400
+
401
+ switch (ptype){
402
+ case undefined:
403
+ processAvailablePresenceStanza(presence)
404
+ break;
405
+ case "available":
406
+ processAvailablePresenceStanza(presence)
407
+ break;
408
+ case "unavailable":
409
+ processUnavailablePresenceStanza(presence)
410
+ break;
411
+ default :
412
+ //Stanza type not recognize
413
+ processAvailablePresenceStanza(presence)
414
+ }
415
+
416
+ return true;
417
+ }
418
+
419
+ var processAvailablePresenceStanza = function(presence){
420
+ var from = $(presence).attr('from');
421
+ var slug = from.split("@")[0];
422
+
423
+ if (slug != user_slug) {
424
+ storeContactInformation(presence);
425
+ if (PRESENCE.UIMANAGER.getConnectionBoxFromSlug(slug)!=null){
426
+ var status = $(presence).find('show').text();
427
+ PRESENCE.UIMANAGER.setUserIconStatus(slug,status);
428
+ PRESENCE.UIMANAGER.updateInterfaceAfterPresenceStanza(slug,true);
429
+ } else {
430
+ if(! PRESENCE.UTILITIES.isAdminSlug(slug)){
431
+ PRESENCE.UIMANAGER.updateChatWindow();
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ var processUnavailablePresenceStanza = function(presence){
438
+ var from = $(presence).attr('from');
439
+ var slug = from.split("@")[0];
440
+
441
+ if (slug != user_slug) {
442
+ if (PRESENCE.UIMANAGER.getConnectionBoxFromSlug(slug)!=null){
443
+ PRESENCE.UIMANAGER.updateInterfaceAfterPresenceStanza(slug,false)
444
+ PRESENCE.GAME.userDisconnected(slug)
445
+ }
446
+ }
447
+ }
448
+
449
+ var storeContactInformation = function(stanza){
450
+ var from = $(stanza).attr('from');
451
+ var split = from.split("@");
452
+ var slug = split[0];
453
+ var domain = split[1].split("/")[0];
454
+ var resource = split[1].split("/")[1];
455
+
456
+ if (!(slug in contactsInfo)) {
457
+ var contact = new chatContact(domain,resource,null,null);
458
+ contactsInfo[slug]=contact;
459
+ } else {
460
+ contactsInfo[slug].domain = domain;
461
+ contactsInfo[slug].resource = resource;
462
+ }
463
+ }
464
+
465
+ var storeRoomInformation = function(roomName){
466
+ if (!(roomName in roomsInfo)) {
467
+ var room = new chatRoom();
468
+ roomsInfo[roomName]=room;
469
+ }
470
+ }
471
+
472
+
473
+ ////////
474
+ //Manage IQ stanzas
475
+ ///////
476
+
477
+ ///////
478
+ //RECEIVED STANZAS
479
+ ///////
480
+ var onIQStanza = function(iq){
481
+ var type = iq.getAttribute("type");
482
+ var from = iq.getAttribute("from");
483
+ var slug = from.split("@")[0];
484
+
485
+ if (slug == user_slug) {
486
+ return true;
487
+ }
488
+
489
+ if(type=="get"){
490
+ return handleGetIQStanza(iq,from,slug);
491
+ } else if(type="result"){
492
+ return handleResultIQStanza(iq,from,slug);
493
+ }
494
+
495
+ return true;
496
+ }
497
+
498
+ ///////
499
+ //RECEIVED STANZAS: GET
500
+ ///////
501
+ var handleGetIQStanza = function(iq,jid,slug){
502
+
503
+ var iqID = iq.getAttribute("id");
504
+
505
+ //Case 1: Request client info
506
+ var queryElements = iq.getElementsByTagName('query');
507
+
508
+ if (queryElements.length > 0) {
509
+ var query = queryElements[0];
510
+ var xmlns_type = query.getAttribute("xmlns");
511
+
512
+ if( xmlns_type == "jabber:iq:version"){
513
+ sendIQStanzaWithClientInfo(jid,iqID);
514
+ return true;
515
+ }
516
+
517
+ if (xmlns_type == "jabber:iq:last") {
518
+ sendIQStanzaLast(jid,iqID);
519
+ return true;
520
+ }
521
+ }
522
+
523
+ //Case 2: Request videochat
524
+ if(iqID==iqStanzaID['videochatRequest']){
525
+ handleGetVideochatIQStanza(jid,iqID,iq,slug);
526
+ return true;
527
+ }
528
+
529
+ //Case 3: Request game
530
+ if(iqID==PRESENCE.GAME.COMUNICATION.getIQStanzaID()['gameRequest']){
531
+ //Do nothing
109
532
  return true;
110
- } else {
111
- return false;
112
533
  }
113
- }
114
-
115
- function isUserConnected(){
116
- return ((isStropheConnected()) && (userStatus!="offline") && (!disconnectionFlag));
117
- }
118
-
119
- function connectToServerWithCookie(user_jid, cookie){
120
- try {
121
- strophe_connection = new Strophe.Connection(BOSH_SERVICE);
122
- strophe_connection.connect(user_jid, cookie, onConnect);
123
- } catch (err) {
124
- //"Handle errors"
125
- return false;
126
- }
127
- return true;
128
- }
129
-
130
- //Password: Get from chatPassword param if exists, instead try to get from sessionStorage.
131
- function connectToServerWithPassword(user_jid, chatPassword){
132
-
133
- //Get Password
134
- if ((chatPassword!=null)&&(chatPassword!="")){
135
- var password = chatPassword;
136
- } else if ((window.sessionStorage)&&(sessionStorage.getItem("ss_user_pass") != null)) {
137
- var password = sessionStorage.getItem("ss_user_pass");
138
- } else {
139
- return false;
140
- }
141
-
142
- try {
143
- //Connect actual user to the chat
144
- strophe_connection = new Strophe.Connection(BOSH_SERVICE);
145
- strophe_connection.connect(user_jid, password, onConnect);
146
- } catch (err) {
147
- //"Handle errors"
148
- return false;
149
- }
150
-
151
- return true;
152
- }
153
-
154
-
155
- ////////
156
- //Auth Methods
157
- ///////
158
- function authByCookie(){
159
- var authMethod = '<%= SocialStream::Presence.auth_method %>';
160
- return authMethod=="cookie";
161
- }
162
-
163
- function authByPassword(){
164
- var authMethod = '<%= SocialStream::Presence.auth_method %>';
165
- return authMethod=="password";
166
- }
167
-
168
-
169
- ////////////////////
170
- //Stanza management using Strophe
171
- ////////////////////
172
-
173
- //Global variables
174
- var userStatus;
175
- var awayTimerPeriod = 60000;
176
- var awayTime = 10*60000; //10 minutes
177
- var awayCounter = 0;
178
- var strophe_connection = null;
179
- var reconnectAttempts = 3;
180
- var awayTimer;
181
- var reconnectTimer;
182
- var disconnectionFlag = false;
183
- var afterNewConnectionFlag = false;
184
- var afterFirstConnectionFlag = true;
185
-
186
-
187
- function onConnect(status) {
188
-
189
- //Status.ERROR An error has occurred
190
- //Status.CONNECTING The connection is currently being made
191
- //Status.CONNFAIL The connection attempt failed
192
- //Status.AUTHENTICATING The connection is authenticating
193
- //Status.AUTHFAIL The authentication attempt failed
194
- //Status.CONNECTED The connection has succeeded
195
- //Status.DISCONNECTED The connection has been terminated
196
- //Status.DISCONNECTING The connection is currently being terminated
197
- //Status.ATTACHED The connection has been attached
198
-
199
- log('Strophe onConnect callback call with status ' + status);
200
-
201
- if (status == Strophe.Status.ERROR){
202
- log('Strophe connection error');
203
- return;
204
- }
205
-
206
- if (status == Strophe.Status.ATTACHED){
207
- log('Strophe connection attached');
208
- return;
209
- }
210
-
211
- if (status == Strophe.Status.AUTHENTICATING ){
212
- log('Strophe connection AUTHENTICATING');
213
- return;
214
- }
215
-
216
- if (status == Strophe.Status.CONNECTING) {
217
- log('Strophe is connecting.');
218
- return;
219
- }
220
-
221
- if (status == Strophe.Status.DISCONNECTING) {
222
- log('Strophe is disconnecting.');
223
- return;
224
- }
225
-
226
- if(typeof initialTimer != 'undefined'){
227
- clearTimeout(initialTimer);
228
- }
229
-
230
- if (status == Strophe.Status.CONNFAIL) {
231
- log('Strophe failed to connect.');
232
- reconnectTimer = setTimeout ("onReconnect()", 5000);
233
- disconnectionFlag = true;
234
- } else if (status == Strophe.Status.AUTHFAIL) {
235
- log('Strophe authentication fail.');
236
- if ((window.sessionStorage)&&(sessionStorage.getItem("ss_user_pass") != null)){
237
- sessionStorage.setItem("ss_user_pass",null);
238
- }
239
- disconnectionFlag = true;
240
- } else if (status == Strophe.Status.ERROR) {
241
- log('Strophe error.');
242
- disconnectionFlag = true;
243
- } else if (status == Strophe.Status.DISCONNECTED) {
244
- log('Strophe is disconnected.');
245
- disconnectionFlag = true;
246
- clearTimeout(awayTimer);
247
- updateInterfaceAfterUserDisconnect();
248
- updateRoomsInfoAfterUserDisconnect();
249
- reconnectTimer = setTimeout ("onReconnect()", 5000);
250
- } else if (status == Strophe.Status.CONNECTED) {
251
- //AFTER CONNECT ACTIONS
252
-
253
- log('Strophe is connected.');
254
-
255
- clearTimeout(reconnectTimer);
256
-
257
- //addHandler:(callback, namespace to match, stanza name, stanza type, stanza id , stanza from, options)
258
- strophe_connection.addHandler(onMessage, null, 'message', 'chat', null, null);
259
- strophe_connection.addHandler(onRoomMessage, null, 'message', 'groupchat', null, null);
260
- strophe_connection.addHandler(onPresence, null, 'presence', null, null, null);
261
- strophe_connection.addHandler(onIQStanza,null, "iq", null, null);
262
-
263
- disconnectionFlag = false;
264
- afterNewConnectionFlag = true;
265
534
 
266
- if(! userStatus){
267
- userStatus = getRestoreUserChatStatus();
268
- }
269
- if(userStatus=="offline"){
270
- userStatus="chat";
271
- }
272
- sendStatus(userStatus);
273
-
274
- awayTimer = setInterval("awayTimerFunction()", awayTimerPeriod);
275
- }
276
-
277
- updateChatWindow();
278
- }
279
-
280
- function onReconnect(){
281
-
282
- if ((!isStropheConnected())&&(userStatus!="offline")) {
283
-
284
- if (reconnectAttempts>0) {
285
- reconnectAttempts--;
286
-
287
- changeChatHeaderTitle(I18n.t('chat.reconnecting'))
288
-
289
- connectToChat(user_jid,cookie,null);
290
-
291
- reconnectTimer = setTimeout ("onReconnect()", 9000);
292
-
293
- } else {
294
- changeChatHeaderTitle(I18n.t('chat.unableconnect'))
295
- //Notify issue to Rails App Server?
296
- }
297
-
298
- }
299
- }
300
-
301
- function disconnectStrophe(){
302
- userStatus = "offline";
303
- setStatusWidgetTitle("offline");
304
-
305
- if(isStropheConnected()){
306
- strophe_connection.send($pres({type: "unavailable"}).tree());
307
- strophe_connection.disconnect();
308
- }
309
- }
310
-
311
-
312
- ////////
313
- //Manage Message stanzas
314
- ///////
315
-
316
- //Chat messages handler
317
- function onMessage(msg) {
318
- var from = msg.getAttribute('from');
319
- var type = msg.getAttribute('type');
320
- var elems = msg.getElementsByTagName('body');
321
-
322
- if (type == "chat" && elems.length > 0) {
323
- var body = elems[0];
324
- var msg = Strophe.getText(body);
325
- var from_slug = getSlugFromJid(from)
326
-
327
- if(isChatRoomJid(from)){
328
- return true
329
- } else {
330
- var from_slug = getSlugFromJid(from)
331
- afterReceivedChatMessage(from_slug,msg,null)
332
- }
333
- }
334
-
335
- // we must return true to keep the handler alive.
336
- // returning false would remove it after it finishes.
337
- return true;
338
- }
339
-
340
-
341
- ////////
342
- //Manage Presence stanzas
343
- ///////
344
- function onPresence(presence) {
345
- if (isChatRoomJid($(presence).attr('from'))){
346
- return onRoomPresence(presence);
347
- } else {
348
- return onBuddyPresence(presence);
349
- }
350
- }
351
-
352
- function onBuddyPresence(presence){
353
- var ptype = $(presence).attr('type');
354
-
355
- switch (ptype){
356
- case undefined:
357
- processAvailablePresenceStanza(presence)
358
- break;
359
- case "available":
360
- processAvailablePresenceStanza(presence)
361
- break;
362
- case "unavailable":
363
- processUnavailablePresenceStanza(presence)
364
- break;
365
- default :
366
- //Stanza type not recognize
367
- processAvailablePresenceStanza(presence)
368
- }
535
+ //Case 4: Default behaviour
536
+ sendIQEmpty(jid,iqID);
369
537
 
370
- return true;
371
- }
372
-
373
- function processAvailablePresenceStanza(presence){
374
- var from = $(presence).attr('from');
375
- var slug = from.split("@")[0];
376
-
377
- if (slug != user_slug) {
378
- storeContactInformation(presence);
379
- if (getConnectionBoxFromSlug(slug)!=null){
380
- var status = $(presence).find('show').text();
381
- setUserIconStatus(slug,status);
382
- updateInterfaceAfterPresenceStanza(slug,true);
383
- } else {
384
- if(! isAdminSlug(slug)){
385
- updateChatWindow();
386
- }
387
- }
388
- }
389
- }
390
-
391
- function processUnavailablePresenceStanza(presence){
392
- var from = $(presence).attr('from');
393
- var slug = from.split("@")[0];
394
-
395
- if (slug != user_slug) {
396
- if (getConnectionBoxFromSlug(slug)!=null){
397
- updateInterfaceAfterPresenceStanza(slug,false)
398
- PRESENCE.GAME.userDisconnected(slug)
399
- }
400
- }
401
- }
402
-
403
- function storeContactInformation(stanza){
404
- var from = $(stanza).attr('from');
405
- var split = from.split("@");
406
- var slug = split[0];
407
- var domain = split[1].split("/")[0];
408
- var resource = split[1].split("/")[1];
409
-
410
- if (!(slug in contactsInfo)) {
411
- var contact = new chatContact(domain,resource,null,null);
412
- contactsInfo[slug]=contact;
413
- } else {
414
- contactsInfo[slug].domain = domain;
415
- contactsInfo[slug].resource = resource;
416
- }
417
- }
418
-
419
- function storeRoomInformation(roomName){
420
- if (!(roomName in roomsInfo)) {
421
- var room = new chatRoom();
422
- roomsInfo[roomName]=room;
423
- }
424
- }
425
-
426
-
427
- ////////
428
- //Manage IQ stanzas
429
- ///////
430
-
431
- ///////
432
- //RECEIVED STANZAS
433
- ///////
434
- function onIQStanza(iq){
435
- var type = iq.getAttribute("type");
436
- var from = iq.getAttribute("from");
437
- var slug = from.split("@")[0];
438
-
439
- if (slug == user_slug) {
440
- return true;
441
- }
538
+ return true;
539
+ }
442
540
 
443
- if(type=="get"){
444
- return handleGetIQStanza(iq,from,slug);
445
- } else if(type="result"){
446
- return handleResultIQStanza(iq,from,slug);
541
+ var handleGetVideochatIQStanza = function(jid,iqID,iq,slug){
542
+ storeContactInformation(iq);
543
+ var queryTag = iq.getElementsByTagName('query');
544
+
545
+ if (queryTag.length > 0) {
546
+ var queryElement = queryTag[0];
547
+ var session_id = queryElement.getElementsByTagName('session_id');
548
+ var token = queryElement.getElementsByTagName('token');
549
+
550
+ if((session_id.length == 1)&&(token.length == 1)){
551
+ contactsInfo[slug].session_id = $(session_id).text();
552
+ contactsInfo[slug].user_token = $(token).text();
553
+ PRESENCE.VIDEOCHAT.updateInterfaceAfterVideoRequestReceived(slug);
554
+ return;
555
+ }
556
+ }
557
+
558
+ //Send empty stanza
559
+ sendIQEmpty(jid,iqID);
447
560
  }
448
561
 
449
- return true;
450
- }
451
-
452
- ///////
453
- //RECEIVED STANZAS: GET
454
- ///////
455
- function handleGetIQStanza(iq,jid,slug){
456
562
 
457
- var iqID = iq.getAttribute("id");
563
+ ///////
564
+ //RECEIVED STANZAS: RESULT
565
+ ///////
566
+ var handleResultIQStanza = function(iq,jid,slug){
567
+ var iqID = iq.getAttribute("id");
568
+
569
+ if (iqID==iqStanzaID['cinfo']){
570
+ return handleIQResultWithClientInfo(iq,slug);
571
+ }
572
+
573
+ if (iqID==iqStanzaID['videochatRequest']){
574
+ return handleIQResultFromVideochatRequest(iq,slug);
575
+ }
576
+
577
+ if(iqID==iqStanzaID['videochatRequestCancel']){
578
+ return handleIQResultFromVideochatRequestCancel(iq,slug);
579
+ }
580
+
581
+ //Case: Default behaviour
582
+ return true;
583
+ }
458
584
 
459
- //Case 1: Request client info
460
- var queryElements = iq.getElementsByTagName('query');
461
-
462
- if (queryElements.length > 0) {
463
- var query = queryElements[0];
464
- var xmlns_type = query.getAttribute("xmlns");
465
-
466
- if( xmlns_type == "jabber:iq:version"){
467
- sendIQStanzaWithClientInfo(jid,iqID);
468
- return true;
469
- }
470
-
471
- if (xmlns_type == "jabber:iq:last") {
472
- sendIQStanzaLast(jid,iqID);
473
- return true;
474
- }
475
- }
476
585
 
477
- //Case 2: Request videochat
478
- if(iqID==iqStanzaID['videochatRequest']){
479
- handleGetVideochatIQStanza(jid,iqID,iq,slug);
480
- return true;
586
+ var handleIQResultWithClientInfo = function(iq,slug){
587
+ var queryTag = iq.getElementsByTagName('query');
588
+
589
+ if (queryTag.length > 0) {
590
+ var queryElement = queryTag[0];
591
+ var name = queryElement.getElementsByTagName('name');
592
+ var version = queryElement.getElementsByTagName('version');
593
+
594
+ if((name.length == 1)&&(version.length == 1)){
595
+ var clientValue = $(name).text();
596
+ var versionValue = $(version).text();
597
+
598
+ if (!(slug in contactsInfo)) {
599
+ var contact = new chatContact(null,null,clientValue,versionValue);
600
+ contactsInfo[slug]=contact;
601
+ } else {
602
+ contactsInfo[slug].client = clientValue;
603
+ contactsInfo[slug].version = versionValue;
604
+ }
605
+ PRESENCE.VIDEOCHAT.clientInfoReceivedTrigger(slug);
606
+ }
607
+ }
608
+
609
+ return true;
481
610
  }
482
611
 
483
- //Case 3: Default behaviour
484
- sendIQEmpty(jid,iqID);
485
-
486
- return true;
487
- }
488
-
489
- function handleGetVideochatIQStanza(jid,iqID,iq,slug){
490
- storeContactInformation(iq);
491
- var queryTag = iq.getElementsByTagName('query');
492
-
493
- if (queryTag.length > 0) {
494
- var queryElement = queryTag[0];
495
- var session_id = queryElement.getElementsByTagName('session_id');
496
- var token = queryElement.getElementsByTagName('token');
497
-
498
- if((session_id.length == 1)&&(token.length == 1)){
499
- contactsInfo[slug].session_id = $(session_id).text();
500
- contactsInfo[slug].user_token = $(token).text();
501
- updateInterfaceAfterVideoRequestReceived(slug);
502
- return;
503
- }
504
- }
505
612
 
506
- //Send empty stanza
507
- sendIQEmpty(jid,iqID);
508
- }
509
-
510
-
511
- ///////
512
- //RECEIVED STANZAS: RESULT
513
- ///////
514
- function handleResultIQStanza(iq,jid,slug){
515
- var iqID = iq.getAttribute("id");
613
+ var handleIQResultFromVideochatRequest = function(iq,slug){
614
+
615
+ var queryTag = iq.getElementsByTagName('query');
616
+
617
+ if (queryTag.length > 0) {
618
+ var queryElement = queryTag[0];
619
+ var response = queryElement.getElementsByTagName('response');
620
+
621
+ if(response.length == 1){
622
+ PRESENCE.VIDEOCHAT.receiveVideoChatResponseFromUser(slug,$(response).text());
623
+ return true;
624
+ }
625
+ }
626
+
627
+ PRESENCE.VIDEOCHAT.receiveVideoChatResponseFromUser(slug,"Bad response");
628
+ return true;
629
+ }
630
+
516
631
 
517
- if (iqID==iqStanzaID['cinfo']){
518
- return handleIQResultWithClientInfo(iq,slug);
632
+ var handleIQResultFromVideochatRequestCancel = function(iq,slug){
633
+
634
+ var queryTag = iq.getElementsByTagName('query');
635
+
636
+ if (queryTag.length > 0) {
637
+ var queryElement = queryTag[0];
638
+ var response = queryElement.getElementsByTagName('response');
639
+
640
+ if(response.length == 1){
641
+ PRESENCE.VIDEOCHAT.receiveVideoChatCancelationFromUser(slug);
642
+ return true;
643
+ }
644
+ }
645
+
646
+ return true;
519
647
  }
520
648
 
521
- if (iqID==iqStanzaID['videochatRequest']){
522
- return handleIQResultFromVideochatRequest(iq,slug);
523
- }
524
649
 
525
- if(iqID==iqStanzaID['videochatRequestCancel']){
526
- return handleIQResultFromVideochatRequestCancel(iq,slug);
527
- }
650
+ ///////
651
+ //SEND STANZAS: GET
652
+ ///////
653
+ var sendIQStanzaForRequestClientInfo = function(slug){
654
+ if (slug in contactsInfo) {
655
+ var domain = contactsInfo[slug].domain;
656
+ var resource = contactsInfo[slug].resource;
657
+ var jid=slug+"@"+domain+"/"+resource
658
+
659
+ var iq = $iq({to: jid, type: "get", id: iqStanzaID['cinfo'], xmlns: "jabber:iq:version"})
660
+ .c("query", {xmlns: "jabber:iq:version"});
661
+ strophe_connection.sendIQ(iq);
662
+ }
663
+ }
528
664
 
529
- //Case: Default behaviour
530
- return true;
531
- }
532
-
533
-
534
- function handleIQResultWithClientInfo(iq,slug){
535
- var queryTag = iq.getElementsByTagName('query');
536
-
537
- if (queryTag.length > 0) {
538
- var queryElement = queryTag[0];
539
- var name = queryElement.getElementsByTagName('name');
540
- var version = queryElement.getElementsByTagName('version');
541
-
542
- if((name.length == 1)&&(version.length == 1)){
543
- var clientValue = $(name).text();
544
- var versionValue = $(version).text();
545
-
546
- if (!(slug in contactsInfo)) {
547
- var contact = new chatContact(null,null,clientValue,versionValue);
548
- contactsInfo[slug]=contact;
549
- } else {
550
- contactsInfo[slug].client = clientValue;
551
- contactsInfo[slug].version = versionValue;
552
- }
553
- clientInfoReceivedTrigger(slug);
554
- }
555
- }
665
+ var sendIQStanzaToRequestVideochat = function(slug){
666
+ if (slug in contactsInfo) {
667
+ var jid=slug+"@"+contactsInfo[slug].domain+"/"+contactsInfo[slug].resource;
668
+
669
+ var iq = $iq({to: jid, type: "get", id: iqStanzaID['videochatRequest']})
670
+ .c("query", {xmlns: "urn:ietf:params:xml:ns:xmpp-stanzas"})
671
+ .c("session_id").t(contactsInfo[slug].session_id).up()
672
+ .c("token").t(contactsInfo[slug].guest_token);
673
+ strophe_connection.sendIQ(iq);
674
+ }
675
+ }
556
676
 
557
- return true;
558
- }
559
-
560
-
561
- function handleIQResultFromVideochatRequest(iq,slug){
562
677
 
563
- var queryTag = iq.getElementsByTagName('query');
564
-
565
- if (queryTag.length > 0) {
566
- var queryElement = queryTag[0];
567
- var response = queryElement.getElementsByTagName('response');
568
-
569
- if(response.length == 1){
570
- receiveVideoChatResponseFromUser(slug,$(response).text());
571
- return true;
572
- }
573
- }
678
+ ///////
679
+ //SEND STANZAS: RESULT
680
+ ///////
681
+ var sendIQStanzaWithClientInfo = function(jid,iqID){
682
+ var client = "Social Stream XMPP Client"
683
+ var version = getJavascriptXMPPClientName();
684
+ var iq = $iq({to: jid, type: "result", id: iqID})
685
+ .c("query", {xmlns: "jabber:iq:version"}).c("name").t(client).up().c("version").t(version);
686
+ strophe_connection.sendIQ(iq);
687
+ }
574
688
 
575
- receiveVideoChatResponseFromUser(slug,"Bad response");
576
- return true;
577
- }
578
-
579
-
580
- function handleIQResultFromVideochatRequestCancel(iq,slug){
581
-
582
- var queryTag = iq.getElementsByTagName('query');
583
-
584
- if (queryTag.length > 0) {
585
- var queryElement = queryTag[0];
586
- var response = queryElement.getElementsByTagName('response');
587
-
588
- if(response.length == 1){
589
- receiveVideoChatCancelationFromUser(slug);
590
- return true;
591
- }
592
- }
593
-
594
- return true;
595
- }
596
-
597
-
598
- ///////
599
- //SEND STANZAS: GET
600
- ///////
601
- function sendIQStanzaForRequestClientInfo(slug){
602
- if (slug in contactsInfo) {
603
- var domain = contactsInfo[slug].domain;
604
- var resource = contactsInfo[slug].resource;
605
- var jid=slug+"@"+domain+"/"+resource
606
-
607
- var iq = $iq({to: jid, type: "get", id: iqStanzaID['cinfo'], xmlns: "jabber:iq:version"})
608
- .c("query", {xmlns: "jabber:iq:version"});
609
- strophe_connection.sendIQ(iq);
610
- }
611
- }
612
-
613
- function sendIQStanzaToRequestVideochat(slug){
614
- if (slug in contactsInfo) {
615
- var jid=slug+"@"+contactsInfo[slug].domain+"/"+contactsInfo[slug].resource;
616
-
617
- var iq = $iq({to: jid, type: "get", id: iqStanzaID['videochatRequest']})
618
- .c("query", {xmlns: "urn:ietf:params:xml:ns:xmpp-stanzas"})
619
- .c("session_id").t(contactsInfo[slug].session_id).up()
620
- .c("token").t(contactsInfo[slug].guest_token);
621
- strophe_connection.sendIQ(iq);
622
- }
623
- }
624
-
625
-
626
- ///////
627
- //SEND STANZAS: RESULT
628
- ///////
629
- function sendIQStanzaWithClientInfo(jid,iqID){
630
- var client = "Social Stream XMPP Client"
631
- var version = getJavascriptXMPPClientName();
632
- var iq = $iq({to: jid, type: "result", id: iqID})
633
- .c("query", {xmlns: "jabber:iq:version"}).c("name").t(client).up().c("version").t(version);
634
- strophe_connection.sendIQ(iq);
635
- }
636
-
637
- function getJavascriptXMPPClientName(){
638
- return '<%=SocialStream::Presence::VERSION%>';
639
- }
640
-
641
- function sendIQStanzaLast(jid,iqID){
642
- var iq = $iq({to: jid, type: "result", id: iqID})
643
- .c("query", {xmlns: "jabber:iq:last", seconds: "0"});
644
- strophe_connection.sendIQ(iq);
645
- }
646
-
647
- function sendIQEmpty(jid,iqID){
648
- var iq = $iq({to: jid, type: "result", id: iqID})
649
- strophe_connection.sendIQ(iq);
650
- }
651
-
652
- function sendIQStanzaToResponseVideochat(slug,result){
653
- if (slug in contactsInfo) {
654
- var jid=slug+"@"+contactsInfo[slug].domain+"/"+contactsInfo[slug].resource;
655
- var iq = $iq({to: jid, type: "result", id: iqStanzaID['videochatRequest']})
656
- .c("query", {xmlns: "urn:ietf:params:xml:ns:xmpp-stanzas"})
657
- .c("response").t(result);
658
- strophe_connection.sendIQ(iq);
659
- }
660
- }
661
-
662
- function sendIQStanzaToCancelVideochat(slug){
663
- if (slug in contactsInfo) {
664
- var jid=slug+"@"+contactsInfo[slug].domain+"/"+contactsInfo[slug].resource;
665
- var iq = $iq({to: jid, type: "result", id: iqStanzaID['videochatRequestCancel']})
666
- .c("query", {xmlns: "urn:ietf:params:xml:ns:xmpp-stanzas"})
667
- .c("response").t("cancel");
668
- strophe_connection.sendIQ(iq);
669
- }
670
- }
671
-
672
-
673
- ////////
674
- //Send Message stanzas
675
- ///////
676
- function sendChatMessage(guest_slug,msg){
677
- rotatePriority(guest_slug);
678
- if (isSlugGroup(guest_slug)){
679
- var guest_jid = getRoomJidFromRoomName(guest_slug)
680
- return sendGroupMessageToRoom(guest_jid,msg);
681
- } else {
682
- var headerMessage = getParsedName(user_name,true);
683
- getChatBoxForSlug(guest_slug).chatbox("option", "boxManager").addMsg(headerMessage, getParsedContent(msg,true));
684
- var guest_jid = getJidFromSlug(guest_slug)
685
- return sendChatMessageToBuddy(guest_jid,msg);
686
- }
687
- }
688
-
689
- function sendChatMessageToBuddy(to,text){
690
- var from = user_jid
691
- var type = "chat";
692
- var body= $build("body");
693
- body.t(text);
694
- var message = $msg({to: to, from: from, type: 'chat'}).cnode(body.tree());
695
- strophe_connection.send(message.tree());
696
- restartAwayTimer();
697
- return true;
698
- }
699
-
700
-
701
- ////////
702
- //Send Presence stanzas with status
703
- ///////
704
- function sendStatus(status){
689
+ var getJavascriptXMPPClientName = function(){
690
+ return '<%=SocialStream::Presence::VERSION%>';
691
+ }
705
692
 
706
- if((status in sstreamChatStatus)){
707
- status = sstreamChatStatus[status];
708
- }
693
+ var sendIQStanzaLast = function(jid,iqID){
694
+ var iq = $iq({to: jid, type: "result", id: iqID})
695
+ .c("query", {xmlns: "jabber:iq:last", seconds: "0"});
696
+ strophe_connection.sendIQ(iq);
697
+ }
709
698
 
710
- if (status in statusMessage){
711
- //Send status to the XMPP Server
712
- var pres = $pres()
713
- .c('status')
714
- .t(statusMessage[status]).up() //Status message
715
- .c('show')
716
- .t(status);
717
- strophe_connection.send(pres.tree());
718
- setStatusWidgetTitle(status);
719
- }
720
- }
721
-
722
-
723
- ////////
724
- //MUC management
725
- ///////
726
-
727
- var muc_host = "conference";
728
-
729
- function joinRoom(roomName){
730
- return strophe_connection.muc.join(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null, null, null)
731
- }
732
-
733
- function leaveRoom(roomName){
734
- return strophe_connection.muc.leave(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null)
735
- }
736
-
737
- function sendGroupMessageToRoomWithName(roomName,msg){
738
- return sendMessageToRoom(getRoomJidFromRoomName(roomName),msg)
739
- }
740
-
741
- function sendGroupMessageToRoom(roomJid,msg){
742
- return strophe_connection.muc.message(roomJid, null, msg, null, "groupchat")
743
- }
744
-
745
- function sendPrivateMessageToRoomUser(roomName,userNick,msg){
746
- return strophe_connection.muc.message(getRoomJidFromRoomName(roomName), userNick, msg, null, "chat")
747
- }
748
-
749
- function queryChatRoomOccupants(roomName){
750
- return strophe_connection.muc.queryOccupants(getRoomJidFromRoomName(roomName), queryChatRoomOccupantsSuccess, queryChatRoomOccupantsFail)
751
- }
752
-
753
- function queryChatRoomOccupantsSuccess(iqResponse){
754
- handleIQResultFromMucOccupantsRequest(iqResponse);
755
- return true;
756
- }
757
-
758
- function queryChatRoomOccupantsFail(){
759
- return true;
760
- }
761
-
762
- function handleIQResultFromMucOccupantsRequest(iq){
763
- var from = $(iq).attr('from');
764
- var room_slug = getSlugFromJid(from)
765
- var queryTag = iq.getElementsByTagName('query');
766
-
767
- if (queryTag.length > 0) {
768
- var queryElement = queryTag[0];
769
- var occupants = queryElement.getElementsByTagName('item');
770
- $.each(occupants, function(index, value) {
771
- //List all occupants
772
- var nick = $(value).attr("name");
773
- if(roomsInfo[room_slug].occupants.indexOf(nick)==-1){
774
- roomsInfo[room_slug].occupants.push(nick)
775
- addNickToNotificationInGroup(room_slug,nick)
699
+ var sendIQEmpty = function(jid,iqID){
700
+ var iq = $iq({to: jid, type: "result", id: iqID})
701
+ strophe_connection.sendIQ(iq);
702
+ }
703
+
704
+ var sendIQStanzaToResponseVideochat = function(slug,result){
705
+ if (slug in contactsInfo) {
706
+ var jid=slug+"@"+contactsInfo[slug].domain+"/"+contactsInfo[slug].resource;
707
+ var iq = $iq({to: jid, type: "result", id: iqStanzaID['videochatRequest']})
708
+ .c("query", {xmlns: "urn:ietf:params:xml:ns:xmpp-stanzas"})
709
+ .c("response").t(result);
710
+ strophe_connection.sendIQ(iq);
711
+ }
712
+ }
713
+
714
+ var sendIQStanzaToCancelVideochat = function(slug){
715
+ if (slug in contactsInfo) {
716
+ var jid=slug+"@"+contactsInfo[slug].domain+"/"+contactsInfo[slug].resource;
717
+ var iq = $iq({to: jid, type: "result", id: iqStanzaID['videochatRequestCancel']})
718
+ .c("query", {xmlns: "urn:ietf:params:xml:ns:xmpp-stanzas"})
719
+ .c("response").t("cancel");
720
+ strophe_connection.sendIQ(iq);
721
+ }
722
+ }
723
+
724
+
725
+ ////////
726
+ //Send Message stanzas
727
+ ///////
728
+ var sendChatMessage = function(guest_slug,msg){
729
+ PRESENCE.WINDOW.rotatePriority(guest_slug);
730
+ if (PRESENCE.WINDOW.isSlugGroup(guest_slug)){
731
+ var guest_jid = getRoomJidFromRoomName(guest_slug)
732
+ return sendGroupMessageToRoom(guest_jid,msg);
733
+ } else {
734
+ var headerMessage = PRESENCE.PARSER.getParsedName(user_name,true);
735
+ PRESENCE.WINDOW.getChatBoxForSlug(guest_slug).chatbox("option", "boxManager").addMsg(headerMessage, PRESENCE.PARSER.getParsedContent(msg,true));
736
+ var guest_jid = getJidFromSlug(guest_slug)
737
+ return sendChatMessageToBuddy(guest_jid,msg);
738
+ }
739
+ }
740
+
741
+ var sendChatMessageToBuddy = function(to,text){
742
+ var from = user_jid
743
+ var type = "chat";
744
+ var body= $build("body");
745
+ body.t(text);
746
+ var message = $msg({to: to, from: from, type: 'chat'}).cnode(body.tree());
747
+ strophe_connection.send(message.tree());
748
+ restartAwayTimer();
749
+ return true;
750
+ }
751
+
752
+
753
+ ////////
754
+ //Send Presence stanzas with status
755
+ ///////
756
+ var sendStatus = function(status){
757
+
758
+ if(! status){
759
+ status = userStatus;
776
760
  }
777
- });
778
- }
779
- }
780
-
781
- function accessRoom(roomName,open){
782
- storeRoomInformation(roomName)
783
- if(roomsInfo[roomName].joined==false){
784
- joinRoom(roomName)
785
- queryChatRoomOccupants(roomName)
761
+
762
+ if((status in sstreamChatStatus)){
763
+ status = sstreamChatStatus[status];
764
+ }
765
+
766
+ if (status in statusMessage){
767
+ //Send status to the XMPP Server
768
+ var pres = $pres()
769
+ .c('status')
770
+ .t(statusMessage[status]).up() //Status message
771
+ .c('show')
772
+ .t(status);
773
+ strophe_connection.send(pres.tree());
774
+ PRESENCE.UIMANAGER.setStatusWidgetTitle(status);
775
+ }
786
776
  }
787
- if(!existsSlugChatBox(roomName)){
788
- createGroupChatBox(roomName,open)
777
+
778
+
779
+ ////////
780
+ //MUC management
781
+ ///////
782
+
783
+ var muc_host = "conference";
784
+
785
+ var joinRoom = function(roomName){
786
+ return strophe_connection.muc.join(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null, null, null)
789
787
  }
790
- return true
791
- }
792
-
793
- function resetRoomConfig(roomName){
794
- storeRoomInformation(roomName)
795
- var room = new chatRoom()
796
- roomsInfo[roomName]=room
797
- }
798
-
799
- function updateRoomsInfoAfterUserDisconnect(){
800
- $.each(getAllSlugsWithVisibleGroupBoxes(), function(index, value) {
801
- resetRoomConfig(value)
802
- initialNotificationInGroup(value,I18n.t('chat.muc.offline'))
803
- });
804
- }
805
-
806
- function getRoomJidFromRoomName(roomName){
807
- return roomName + "@" + muc_host + "." + domain;
808
- }
809
-
810
- function getRoomNickForRoom(roomName){
811
- if(roomName in roomsInfo){
812
- return roomsInfo[roomName].nick;
813
- } else {
814
- return getBaseNickFromUserName();
788
+
789
+ var leaveRoom = function(roomName){
790
+ return strophe_connection.muc.leave(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null)
815
791
  }
816
- }
817
-
818
- function getBaseNickFromUserName(){
819
- return user_name.split(" ")[0];
820
- }
821
-
822
- function changeRoomNickNameAndJoinAgain(roomName){
823
- var old_nick = getRoomNickForRoom(roomName)
824
792
 
825
- if(old_nick.split("_").length > 4){
826
- //Bucle prevention...
827
- return false;
793
+ var sendGroupMessageToRoomWithName = function(roomName,msg){
794
+ return sendMessageToRoom(getRoomJidFromRoomName(roomName),msg)
828
795
  }
829
796
 
830
- storeRoomInformation(roomName)
831
- roomsInfo[roomName].nick = old_nick + "_"
832
- joinRoom(roomName)
833
- return true;
834
- }
835
-
836
-
837
- ////////
838
- //MUC Stanzas
839
- ///////
840
-
841
- //MUC Messages
842
- function onRoomMessage(msg) {
843
- //from=roomSlug@conference.domain/from_slug
844
- var from = msg.getAttribute('from');
845
- var type = msg.getAttribute('type');
846
- var elems = msg.getElementsByTagName('body');
847
-
848
- if (type == "groupchat" && elems.length > 0) {
849
- var body = elems[0];
850
- var user_nick = getNickFromChatRoomJid(from)
851
- var msg = Strophe.getText(body);
852
- afterReceivedGroupChatMessage(from,msg)
853
- }
854
- return true;
855
- }
856
-
857
-
858
- //MUC Presence stanzas
859
- function onRoomPresence(presence) {
860
- var from = $(presence).attr('from');
861
- var to = $(presence).attr('to')
862
- var room_slug = getSlugFromJid(from);
863
- var nick = getNickFromChatRoomJid(from)
864
- var ptype = $(presence).attr('type')
797
+ var sendGroupMessageToRoom = function(roomJid,msg){
798
+ return strophe_connection.muc.message(roomJid, null, msg, null, "groupchat")
799
+ }
800
+
801
+ var sendPrivateMessageToRoomUser = function(roomName,userNick,msg){
802
+ return strophe_connection.muc.message(getRoomJidFromRoomName(roomName), userNick, msg, null, "chat")
803
+ }
804
+
805
+ var queryChatRoomOccupants = function(roomName){
806
+ return strophe_connection.muc.queryOccupants(getRoomJidFromRoomName(roomName), queryChatRoomOccupantsSuccess, queryChatRoomOccupantsFail)
807
+ }
808
+
809
+ var queryChatRoomOccupantsSuccess = function(iqResponse){
810
+ handleIQResultFromMucOccupantsRequest(iqResponse);
811
+ return true;
812
+ }
813
+
814
+ var queryChatRoomOccupantsFail = function(){
815
+ return true;
816
+ }
817
+
818
+ var handleIQResultFromMucOccupantsRequest = function(iq){
819
+ var from = $(iq).attr('from');
820
+ var room_slug = getSlugFromJid(from)
821
+ var queryTag = iq.getElementsByTagName('query');
822
+
823
+ if (queryTag.length > 0) {
824
+ var queryElement = queryTag[0];
825
+ var occupants = queryElement.getElementsByTagName('item');
826
+ $.each(occupants, function(index, value) {
827
+ //List all occupants
828
+ var nick = $(value).attr("name");
829
+ if(roomsInfo[room_slug].occupants.indexOf(nick)==-1){
830
+ roomsInfo[room_slug].occupants.push(nick)
831
+ PRESENCE.NOTIFICATIONS.addNickToNotificationInGroup(room_slug,nick)
832
+ }
833
+ });
834
+ }
835
+ }
836
+
837
+ var accessRoom = function(roomName,open){
838
+ storeRoomInformation(roomName)
839
+ if(roomsInfo[roomName].joined==false){
840
+ joinRoom(roomName)
841
+ queryChatRoomOccupants(roomName)
842
+ }
843
+ if(!PRESENCE.UIMANAGER.existsSlugChatBox(roomName)){
844
+ PRESENCE.WINDOW.createGroupChatBox(roomName,open)
845
+ }
846
+ return true
847
+ }
848
+
849
+ var resetRoomConfig = function(roomName){
850
+ storeRoomInformation(roomName)
851
+ var room = new chatRoom()
852
+ roomsInfo[roomName]=room
853
+ }
854
+
855
+ var updateRoomsInfoAfterUserDisconnect = function(){
856
+ $.each(PRESENCE.WINDOW.getAllSlugsWithVisibleGroupBoxes(), function(index, value) {
857
+ resetRoomConfig(value)
858
+ PRESENCE.NOTIFICATIONS.initialNotificationInGroup(value,I18n.t('chat.muc.offline'))
859
+ });
860
+ }
861
+
862
+ var getRoomJidFromRoomName = function(roomName){
863
+ return roomName + "@" + muc_host + "." + domain;
864
+ }
865
+
866
+ var getRoomNickForRoom = function(roomName){
867
+ if(roomName in roomsInfo){
868
+ return roomsInfo[roomName].nick;
869
+ } else {
870
+ return getBaseNickFromUserName();
871
+ }
872
+ }
873
+
874
+ var getBaseNickFromUserName = function(){
875
+ return user_name.split(" ")[0];
876
+ }
877
+
878
+ var changeRoomNickNameAndJoinAgain = function(roomName){
879
+ var old_nick = getRoomNickForRoom(roomName)
880
+
881
+ if(old_nick.split("_").length > 4){
882
+ //Bucle prevention...
883
+ return false;
884
+ }
885
+
886
+ storeRoomInformation(roomName)
887
+ roomsInfo[roomName].nick = old_nick + "_"
888
+ joinRoom(roomName)
889
+ return true;
890
+ }
891
+
892
+
893
+ ////////
894
+ //MUC Stanzas
895
+ ///////
896
+
897
+ //MUC Messages
898
+ var onRoomMessage = function(roomMsg) {
865
899
 
866
- //Join or Leave room stanzas of self user
867
- if((nick == getRoomNickForRoom(room_slug))&&(getSlugFromJid(to) == user_slug)){
900
+ //from=roomSlug@conference.domain/from_slug
901
+ var from = roomMsg.getAttribute('from');
902
+ var type = roomMsg.getAttribute('type');
903
+ var elems = roomMsg.getElementsByTagName('body');
904
+
905
+ if (type == "groupchat" && elems.length > 0) {
906
+ var body = elems[0];
907
+ var user_nick = getNickFromChatRoomJid(from)
908
+ var msg = Strophe.getText(body);
909
+
910
+ //Prevent repeated messages
911
+ var roomSlug = getSlugFromJid(from);
912
+ var id = roomMsg.getAttribute('id');
913
+ if((roomSlug in roomsInfo)&&(roomsInfo[roomSlug].lastMessageId != null)&&(roomsInfo[roomSlug].lastMessageId == id)){
914
+ return true;
915
+ }
916
+ roomsInfo[roomSlug].lastMessageId = id;
917
+
918
+ PRESENCE.UIMANAGER.afterReceivedGroupChatMessage(from,msg)
919
+ }
920
+ return true;
921
+ }
922
+
923
+
924
+ //MUC Presence stanzas
925
+ var onRoomPresence = function(presence) {
926
+ var from = $(presence).attr('from');
927
+ var to = $(presence).attr('to')
928
+ var room_slug = getSlugFromJid(from);
929
+ var nick = getNickFromChatRoomJid(from)
930
+ var ptype = $(presence).attr('type')
931
+
932
+ //Join or Leave room stanzas of self user
933
+ if((nick == getRoomNickForRoom(room_slug))&&(getSlugFromJid(to) == user_slug)){
934
+ switch (ptype){
935
+ case undefined:
936
+ processJoinRoomPresenceStanza(presence);
937
+ break;
938
+ case "available":
939
+ processJoinRoomPresenceStanza(presence);
940
+ break;
941
+ case "unavailable":
942
+ processLeaveRoomPresenceStanza(presence);
943
+ break;
944
+ case "error":
945
+ processJoinErrorRoomPresenceStanza(presence);
946
+ break;
947
+ }
948
+ return true;
949
+ }
950
+
951
+
952
+ //Rest of stanzas
868
953
  switch (ptype){
869
954
  case undefined:
870
- processJoinRoomPresenceStanza(presence);
955
+ processAvailableRoomPresenceStanza(presence)
871
956
  break;
872
957
  case "available":
873
- processJoinRoomPresenceStanza(presence);
958
+ processAvailableRoomPresenceStanza(presence)
874
959
  break;
875
960
  case "unavailable":
876
- processLeaveRoomPresenceStanza(presence);
961
+ processUnavailableRoomPresenceStanza(presence)
877
962
  break;
878
- case "error":
879
- processJoinErrorRoomPresenceStanza(presence);
880
- break;
881
- }
882
- return true;
883
- }
963
+ default :
964
+ //Stanza type not recognize
965
+ return true
966
+ }
967
+
968
+ return true
969
+ }
884
970
 
885
971
 
886
- //Rest of stanzas
887
- switch (ptype){
888
- case undefined:
889
- processAvailableRoomPresenceStanza(presence)
890
- break;
891
- case "available":
892
- processAvailableRoomPresenceStanza(presence)
893
- break;
894
- case "unavailable":
895
- processUnavailableRoomPresenceStanza(presence)
896
- break;
897
- default :
898
- //Stanza type not recognize
899
- return true
900
- }
972
+ var processJoinRoomPresenceStanza = function(presence){
973
+ var from = $(presence).attr('from');
974
+ var room_slug = getSlugFromJid(from);
975
+ storeRoomInformation(room_slug);
976
+
977
+ var xElements = presence.getElementsByTagName('x');
901
978
 
902
- return true
903
- }
904
-
905
-
906
- function processJoinRoomPresenceStanza(presence){
907
- var from = $(presence).attr('from');
908
- var room_slug = getSlugFromJid(from);
909
- storeRoomInformation(room_slug);
979
+ if (xElements.length == 1) {
980
+ var xElement = xElements[0];
981
+ var items = xElement.getElementsByTagName('item');
982
+
983
+ $.each(items, function(index, value) {
984
+ var role = $(value).attr("role")
985
+ var affiliation = $(value).attr("affiliation")
986
+
987
+ roomsInfo[room_slug].affiliation = affiliation
988
+ roomsInfo[room_slug].role = role
989
+ if(roomsInfo[room_slug].joined == false){
990
+ roomsInfo[room_slug].joined = true
991
+ PRESENCE.NOTIFICATIONS.changeInitialNotificationInGroup(room_slug,I18n.t('chat.muc.occupants'))
992
+ }
993
+ });
994
+ }
995
+ }
910
996
 
911
- var xElements = presence.getElementsByTagName('x');
912
-
913
- if (xElements.length == 1) {
914
- var xElement = xElements[0];
915
- var items = xElement.getElementsByTagName('item');
916
-
917
- $.each(items, function(index, value) {
918
- var role = $(value).attr("role")
919
- var affiliation = $(value).attr("affiliation")
920
-
921
- roomsInfo[room_slug].affiliation = affiliation
922
- roomsInfo[room_slug].role = role
923
- if(roomsInfo[room_slug].joined == false){
924
- roomsInfo[room_slug].joined = true
925
- changeInitialNotificationInGroup(room_slug,I18n.t('chat.muc.occupants'))
926
- }
927
- });
928
- }
929
- }
930
-
931
- function processLeaveRoomPresenceStanza(presence){
932
- var from = $(presence).attr('from');
933
- var room_slug = getSlugFromJid(from);
934
- resetRoomConfig(room_slug)
935
- changeInitialNotificationInGroup(room_slug,"")
936
- }
937
-
938
- function processJoinErrorRoomPresenceStanza(presence){
939
- var from = $(presence).attr('from')
940
- var room_slug = getSlugFromJid(from)
941
- var errorMsg = "Error";
942
-
943
- var eElements = presence.getElementsByTagName('error')
944
- if (eElements.length == 1) {
945
- var error = eElements[0];
946
- var code = $(error).attr("code")
947
- var type = $(error).attr("type")
948
- errorMsg = errorMsg + " with code:" + code + " and type:" + type
949
- var textElements = error.getElementsByTagName('text')
950
- if (textElements.length == 1) {
951
- var text = $(textElements[0]).text()
952
- errorMsg = errorMsg + "\n" + text
997
+ var processLeaveRoomPresenceStanza = function(presence){
998
+ var from = $(presence).attr('from');
999
+ var room_slug = getSlugFromJid(from);
1000
+ resetRoomConfig(room_slug)
1001
+ PRESENCE.NOTIFICATIONS.changeInitialNotificationInGroup(room_slug,"")
1002
+ }
1003
+
1004
+ var processJoinErrorRoomPresenceStanza = function(presence){
1005
+ var from = $(presence).attr('from')
1006
+ var room_slug = getSlugFromJid(from)
1007
+ var errorMsg = "Error";
1008
+
1009
+ var eElements = presence.getElementsByTagName('error')
1010
+ if (eElements.length == 1) {
1011
+ var error = eElements[0];
1012
+ var code = $(error).attr("code")
1013
+ var type = $(error).attr("type")
1014
+ errorMsg = errorMsg + " with code:" + code + " and type:" + type
1015
+ var textElements = error.getElementsByTagName('text')
1016
+ if (textElements.length == 1) {
1017
+ var text = $(textElements[0]).text()
1018
+ errorMsg = errorMsg + "\n" + text
1019
+ }
1020
+
1021
+ //Try to fix errors!
1022
+ if(code==409){
1023
+ //Case: Nickname already in use
1024
+ if (changeRoomNickNameAndJoinAgain(room_slug)){
1025
+ return;
1026
+ }
1027
+ }
1028
+ //if(code==403){
1029
+ //Case: Auth Denied
1030
+ //}
1031
+
1032
+ //[...]
1033
+
953
1034
  }
954
-
955
- //Try to fix errors!
956
- if(code==409){
957
- //Case: Nickname already in use
958
- if (changeRoomNickNameAndJoinAgain(room_slug)){
959
- return;
960
- }
1035
+
1036
+ resetRoomConfig(room_slug)
1037
+ PRESENCE.NOTIFICATIONS.initialNotificationInGroup(room_slug,I18n.t("chat.muc.joinError", {errorMsg: errorMsg}))
1038
+ }
1039
+
1040
+ var processAvailableRoomPresenceStanza = function(presence){
1041
+ var from = $(presence).attr('from');
1042
+ var nick = getNickFromChatRoomJid(from)
1043
+ var room_slug = getSlugFromJid(from)
1044
+ storeRoomInformation(room_slug);
1045
+
1046
+ if (roomsInfo[room_slug].occupants.indexOf(nick)==-1){
1047
+ roomsInfo[room_slug].occupants.push(nick)
1048
+ PRESENCE.NOTIFICATIONS.addNickToNotificationInGroup(room_slug,nick)
1049
+ PRESENCE.UIMANAGER.writeReceivedMessageOnChatWindow("",room_slug, I18n.t("chat.muc.join", {nick: nick}))
1050
+ }
1051
+ }
1052
+
1053
+ var processUnavailableRoomPresenceStanza = function(presence){
1054
+ var from = $(presence).attr('from');
1055
+ var nick = getNickFromChatRoomJid(from)
1056
+ var room_slug = getSlugFromJid(from)
1057
+ storeRoomInformation(room_slug);
1058
+
1059
+ if (roomsInfo[room_slug].occupants.indexOf(nick)!=-1){
1060
+ roomsInfo[room_slug].occupants.splice(roomsInfo[room_slug].occupants.indexOf(nick),1)
1061
+ PRESENCE.NOTIFICATIONS.removeNickFromNotificationInGroup(room_slug,nick)
1062
+ PRESENCE.UIMANAGER.writeReceivedMessageOnChatWindow("",room_slug,I18n.t("chat.muc.leave", {nick: nick}))
1063
+ }
1064
+ }
1065
+
1066
+
1067
+
1068
+ //////////////////
1069
+ // Getters
1070
+ //////////////////
1071
+ var getSlugFromJid = function(jid){
1072
+ return jid.split("@")[0];
1073
+ }
1074
+
1075
+ var getDomainFromJid = function(jid){
1076
+ return jid.split("@")[1].split("/")[0];
1077
+ }
1078
+
1079
+ var isChatRoomJid = function(jid){
1080
+ if ((getDomainFromJid(jid).split(".")[0])==muc_host){
1081
+ return true;
1082
+ }
1083
+ return false;
1084
+ }
1085
+
1086
+ var getNameFromSlug = function(slug){
1087
+ var connectionBox = PRESENCE.UIMANAGER.getConnectionBoxFromSlug(slug);
1088
+
1089
+ if(connectionBox!=null){
1090
+ return $(connectionBox).attr("name");
1091
+ }
1092
+
1093
+ var chatBox = PRESENCE.WINDOW.getChatBoxForSlug(slug)
1094
+ if(chatBox!=null){
1095
+ return chatBox.attr("name");
1096
+ }
1097
+
1098
+ //return rebuildNameFromSlug(slug)
1099
+ return slug;
1100
+ }
1101
+
1102
+ var rebuildNameFromSlug = function(slug){
1103
+ var cname = slug.split("-");
1104
+ var name = "";
1105
+ for(i=0; i<cname.length; i++){
1106
+ if (i!=0){
1107
+ name = name + " ";
1108
+ }
1109
+ name = name + cname[i][0].toUpperCase() + cname[i].substring(1,cname[i].length);
1110
+ }
1111
+ return name;
1112
+ }
1113
+
1114
+ var getNameFromJid = function(){
1115
+ return getNameFromSlug(getSlugFromJid(jid));
1116
+ }
1117
+
1118
+ var getJidFromSlug = function(slug){
1119
+ return slug + "@" + domain;
1120
+ }
1121
+
1122
+ var getNickFromChatRoomJid = function(jid){
1123
+ return jid.split("/")[1];
1124
+ }
1125
+
1126
+ var purgeNickFromChatRoomJid = function(jid){
1127
+ return jid.split("/")[0];
1128
+ }
1129
+
1130
+ var getSStreamChatStatus = function(){
1131
+ return sstreamChatStatus;
1132
+ }
1133
+
1134
+ var getConnection = function(){
1135
+ if(! strophe_connection){
1136
+ strophe_connection = new Strophe.Connection(BOSH_SERVICE);
961
1137
  }
962
- //if(code==403){
963
- //Case: Auth Denied
964
- //}
965
-
966
- //[...]
967
-
1138
+ return strophe_connection;
1139
+ }
1140
+
1141
+ var isNewConnection = function(){
1142
+ return afterNewConnectionFlag
1143
+ }
1144
+
1145
+ var setNewConnection = function(bol){
1146
+ afterNewConnectionFlag = bol;
968
1147
  }
969
1148
 
970
- resetRoomConfig(room_slug)
971
- initialNotificationInGroup(room_slug,I18n.t("chat.muc.joinError", {errorMsg: errorMsg}))
972
- }
973
-
974
- function processAvailableRoomPresenceStanza(presence){
975
- var from = $(presence).attr('from');
976
- var nick = getNickFromChatRoomJid(from)
977
- var room_slug = getSlugFromJid(from)
978
- storeRoomInformation(room_slug);
979
-
980
- if (roomsInfo[room_slug].occupants.indexOf(nick)==-1){
981
- roomsInfo[room_slug].occupants.push(nick)
982
- addNickToNotificationInGroup(room_slug,nick)
983
- writeReceivedMessageOnChatWindow("",room_slug, I18n.t("chat.muc.join", {nick: nick}))
984
- }
985
- }
986
-
987
- function processUnavailableRoomPresenceStanza(presence){
988
- var from = $(presence).attr('from');
989
- var nick = getNickFromChatRoomJid(from)
990
- var room_slug = getSlugFromJid(from)
991
- storeRoomInformation(room_slug);
992
-
993
- if (roomsInfo[room_slug].occupants.indexOf(nick)!=-1){
994
- roomsInfo[room_slug].occupants.splice(roomsInfo[room_slug].occupants.indexOf(nick),1)
995
- removeNickFromNotificationInGroup(room_slug,nick)
996
- writeReceivedMessageOnChatWindow("",room_slug,I18n.t("chat.muc.leave", {nick: nick}))
1149
+ var isFirstConnection = function(){
1150
+ return afterFirstConnectionFlag;
997
1151
  }
998
- }
999
-
1000
-
1001
-
1002
- //////////////////
1003
- // Getters
1004
- //////////////////
1005
- function getSlugFromJid(jid){
1006
- return jid.split("@")[0];
1007
- }
1008
-
1009
- function getDomainFromJid(jid){
1010
- return jid.split("@")[1].split("/")[0];
1011
- }
1012
-
1013
- function isChatRoomJid(jid){
1014
- if ((getDomainFromJid(jid).split(".")[0])==muc_host){
1015
- return true;
1152
+
1153
+ var setFirstConnection = function(bol){
1154
+ afterFirstConnectionFlag = bol;
1016
1155
  }
1017
- return false;
1018
- }
1019
-
1020
- function getNameFromSlug(slug){
1021
- var connectionBox = getConnectionBoxFromSlug(slug);
1022
1156
 
1023
- if(connectionBox!=null){
1024
- return $(connectionBox).attr("name");
1157
+ var getUserStatus = function(){
1158
+ return userStatus;
1025
1159
  }
1026
1160
 
1027
- var chatBox = getChatBoxForSlug(slug)
1028
- if(chatBox!=null){
1029
- return chatBox.attr("name");
1030
- }
1161
+ var setUserStatus = function(status){
1162
+ userStatus = status;
1163
+ }
1031
1164
 
1032
- //return rebuildNameFromSlug(slug)
1033
- return slug;
1034
- }
1035
-
1036
- function rebuildNameFromSlug(slug){
1037
- var cname = slug.split("-");
1038
- var name = "";
1039
- for(i=0; i<cname.length; i++){
1040
- if (i!=0){
1041
- name = name + " ";
1042
- }
1043
- name = name + cname[i][0].toUpperCase() + cname[i].substring(1,cname[i].length);
1044
- }
1045
- return name;
1046
- }
1047
-
1048
- function getNameFromJid(){
1049
- return getNameFromSlug(getSlugFromJid(jid));
1050
- }
1051
-
1052
- function getJidFromSlug(slug){
1053
- return slug + "@" + domain;
1054
- }
1165
+ var getDisconnectionFlag = function(){
1166
+ return disconnectionFlag;
1167
+ }
1168
+
1169
+ var getRoomsInfo = function(){
1170
+ return roomsInfo;
1171
+ }
1172
+
1173
+ return {
1174
+ init: init,
1175
+ connectToChat : connectToChat,
1176
+ onReconnect : onReconnect,
1177
+ isStropheConnected : isStropheConnected,
1178
+ isUserConnected : isUserConnected,
1179
+ authByCookie : authByCookie,
1180
+ authByPassword : authByPassword,
1181
+ disconnect : disconnect,
1182
+ awayTimerFunction : awayTimerFunction,
1183
+ restartAwayTimer : restartAwayTimer,
1184
+ sendIQStanzaForRequestClientInfo : sendIQStanzaForRequestClientInfo,
1185
+ sendIQStanzaToRequestVideochat : sendIQStanzaToRequestVideochat,
1186
+ sendIQStanzaToResponseVideochat : sendIQStanzaToResponseVideochat,
1187
+ sendIQStanzaToCancelVideochat : sendIQStanzaToCancelVideochat,
1188
+ getJavascriptXMPPClientName : getJavascriptXMPPClientName,
1189
+ sendChatMessage : sendChatMessage,
1190
+ sendStatus : sendStatus,
1191
+ accessRoom : accessRoom,
1192
+ joinRoom : joinRoom,
1193
+ leaveRoom : leaveRoom,
1194
+ getSlugFromJid : getSlugFromJid,
1195
+ getJidFromSlug : getJidFromSlug,
1196
+ getNameFromSlug : getNameFromSlug,
1197
+ getNickFromChatRoomJid : getNickFromChatRoomJid,
1198
+ getConnection : getConnection,
1199
+ isNewConnection : isNewConnection,
1200
+ setNewConnection : setNewConnection,
1201
+ isFirstConnection : isFirstConnection,
1202
+ setFirstConnection : setFirstConnection,
1203
+ getUserStatus : getUserStatus,
1204
+ setUserStatus : setUserStatus,
1205
+ getDisconnectionFlag : getDisconnectionFlag,
1206
+ getRoomsInfo : getRoomsInfo,
1207
+ getSStreamChatStatus: getSStreamChatStatus
1208
+ };
1209
+
1210
+ }) (PRESENCE, jQuery);
1055
1211
 
1056
- function getNickFromChatRoomJid(jid){
1057
- return jid.split("/")[1];
1058
- }
1059
1212
 
1060
- function purgeNickFromChatRoomJid(jid){
1061
- return jid.split("/")[0];
1062
- }