social_stream-presence 0.13.1 → 0.13.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 (28) hide show
  1. data/app/assets/javascripts/jquery.flexselect.sstreampresence.js +2 -2
  2. data/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +5 -5
  3. data/app/assets/javascripts/presence.js.erb +6 -4
  4. data/app/assets/javascripts/presence_XmppClient.js.erb +1136 -996
  5. data/app/assets/javascripts/presence_audio.js.erb +74 -60
  6. data/app/assets/javascripts/presence_game.js.erb +35 -22
  7. data/app/assets/javascripts/presence_game_comunication.js.erb +22 -5
  8. data/app/assets/javascripts/presence_game_factory.js.erb +1 -1
  9. data/app/assets/javascripts/presence_game_interface.js.erb +33 -13
  10. data/app/assets/javascripts/presence_notifications.js +206 -183
  11. data/app/assets/javascripts/presence_parser.js +265 -247
  12. data/app/assets/javascripts/presence_persistence.js +199 -188
  13. data/app/assets/javascripts/presence_store.js +22 -11
  14. data/app/assets/javascripts/presence_uiManager.js.erb +553 -530
  15. data/app/assets/javascripts/presence_utilities.js +244 -219
  16. data/app/assets/javascripts/presence_videochat.js.erb +436 -409
  17. data/app/assets/javascripts/presence_windowManager.js +586 -532
  18. data/app/views/chat/_index.html.erb +7 -13
  19. data/config/locales/en.yml +2 -1
  20. data/config/locales/es.yml +2 -1
  21. data/ejabberd/ejabberd_files.zip +0 -0
  22. data/ejabberd/ejabberd_scripts/authentication_script +9 -2
  23. data/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  24. data/lib/generators/social_stream/presence/templates/initializer.rb +4 -0
  25. data/lib/social_stream/presence/version.rb +1 -1
  26. data/lib/social_stream/presence/xmpp_server_order.rb +1 -0
  27. data/lib/social_stream-presence.rb +3 -0
  28. metadata +68 -63
@@ -1,257 +1,275 @@
1
1
  ////////////////////
2
- //Hash table
2
+ //Social Stream Presence: Parser module
3
3
  ////////////////////
4
- var chatIcons = new Array();
5
- chatIcons[':)'] = "face-smile.png";
6
- chatIcons[':('] = "face-sad.png";
7
- chatIcons['(B)'] = "beer.png";
8
- chatIcons['(C)'] = "clock.png";
9
- chatIcons['(P)'] = "present.png";
10
- chatIcons[':P']= "face-raspberry.png";
11
- chatIcons[':Z']= "face-tired.png";
12
- chatIcons['(R)']= "rain.png";
13
- chatIcons['(S)']= "sun.png";
14
- chatIcons[';)']= "face-wink.png";
15
4
 
16
- ///////////////////////////////////////////////////////
17
- // Parser functions
18
- // Allow new features in chat msg like links, images, emoticons, ...
19
- ///////////////////////////////////////////////////////
5
+ PRESENCE.PARSER = (function(P,$,undefined){
20
6
 
21
- //Patterns
22
- var html_tag_pattern=/.*\<[^>]+>.*/g
23
- var simple_word_pattern=/^[aA-zZ0-9]+$/g
24
- var http_urls_pattern=/(http(s)?:\/\/)([aA-zZ0-9%=_&+?])+([./-][aA-zZ0-9%=_&+?]+)*[/]?/g
25
- var www_urls_pattern = /(www[.])([aA-zZ0-9%=_&+?])+([./-][aA-zZ0-9%=_&+?]+)*[/]?/g
26
- var icons_a_pattern=/\([A-Z]\)/g
27
- var icons_b_pattern=/((:|;)([()A-Z]))/g
28
- var youtube_video_pattern=/(http(s)?:\/\/)?(((youtu.be\/)([aA-zZ0-9]+))|((www.youtube.com\/watch\?v=)([aA-z0-9Z&=.])+))/g
7
+ ////////////////////
8
+ //Hash table
9
+ ////////////////////
10
+ var chatIcons = new Array();
11
+ chatIcons[':)'] = "face-smile.png";
12
+ chatIcons[':('] = "face-sad.png";
13
+ chatIcons['(B)'] = "beer.png";
14
+ chatIcons['(C)'] = "clock.png";
15
+ chatIcons['(P)'] = "present.png";
16
+ chatIcons[':P']= "face-raspberry.png";
17
+ chatIcons[':Z']= "face-tired.png";
18
+ chatIcons['(R)']= "rain.png";
19
+ chatIcons['(S)']= "sun.png";
20
+ chatIcons[';)']= "face-wink.png";
29
21
 
22
+ var init = function(){ }
30
23
 
31
- function getParsedContent(content,fromUser){
32
- if (fromUser){
33
- var chatTextclass = "ownChatText"
34
- } else {
35
- var chatTextclass = "guestChatText"
36
- }
37
- return ("<span class=\"" + chatTextclass + "\">" + parseContent(content) + "</span>");
38
- }
39
-
40
-
41
- function parseContent(content){
42
-
43
- if (content.match(html_tag_pattern)!=null){
44
- content = content.replace(/>/g, "&gt;");
45
- content = content.replace(/</g, "&lt;");
46
- return "<pre>" + content + "</pre>"
47
- }
48
-
49
- var words = content.split(" ");
50
- for(i=0; i<words.length; i++){
51
- words[i] = parseWord(words[i]);
52
- }
53
-
54
- return words.join(" ");
55
- }
56
-
57
- function parseWord(word){
58
-
59
- //Look for empty or simple words
60
- if ((word.trim()=="")||(word.match(simple_word_pattern)!=null)){
61
- return word
62
- }
63
-
64
- //Look for http urls
65
- var http_urls = word.match(http_urls_pattern)
66
- if (http_urls!=null){
67
- var url = http_urls[0]
68
- var type = getUrlType(url);
69
-
70
- switch(type){
71
- case "link":
72
- var link = buildUrlLink(url,url)
73
- var subwords = splitFirst(word,url)
74
- return parseWord(subwords[0]) + link + parseWord(subwords[1])
75
- case "image":
76
- var imageLink = buildImageLink(url);
77
- var subwords = splitFirst(word,url)
78
- return parseWord(subwords[0]) + imageLink + parseWord(subwords[1])
79
- case "video-youtube":
80
- var youtubeLink = buildYoutubeVideoLink(url);
81
- var subwords = splitFirst(word,url)
82
- return parseWord(subwords[0]) + youtubeLink + parseWord(subwords[1])
83
- default:
84
- return word
85
- }
86
- }
87
-
88
-
89
- //Look for www urls
90
- var www_urls = word.match(www_urls_pattern)
91
- if (www_urls!=null){
92
- var url = www_urls[0]
93
- var type = getUrlType(url);
94
-
95
- switch(type){
96
- case "link":
97
- var link = buildUrlLink("http://" + url,url)
98
- var subwords = splitFirst(word,url)
99
- return parseWord(subwords[0]) + link + parseWord(subwords[1])
100
- case "image":
101
- var imageLink = buildImageLink("http://" + url);
102
- var subwords = splitFirst(word,url)
103
- return parseWord(subwords[0]) + imageLink + parseWord(subwords[1])
104
- case "video-youtube":
105
- var youtubeLink = buildYoutubeVideoLink("http://" + url);
106
- var subwords = splitFirst(word,url)
107
- return parseWord(subwords[0]) + youtubeLink + parseWord(subwords[1])
108
- default:
109
- return word
110
- }
111
- }
112
-
113
- //Look for icons: Regex
114
- var icons_a = word.match(icons_a_pattern)
115
- if(icons_a!=null){
116
- for(g=0; g<icons_a.length; g++){
117
- word = word.replace(buildRegex(icons_a[g]), buildIconImage(icons_a[g]))
118
- }
119
- }
120
-
121
- var icons_b = word.match(icons_b_pattern)
122
- if(icons_b!=null){
123
- for(h=0; h<icons_b.length; h++){
124
- word = word.replace(buildRegex(icons_b[h]), buildIconImage(icons_b[h]))
125
- }
126
- }
127
-
128
-
129
- //No special content detected (maybe emoticons but not special pattern like urls)
130
- return word
131
- }
132
-
133
- function splitFirst(word,key){
134
- var split=[]
135
- var cut = word.split(key);
136
- split[0]=cut[0]
137
- cut.shift()
138
- var paste = cut.join(key)
139
- split[1]=paste
140
- return split
141
- }
142
-
143
- function buildIconImage(icon){
144
- if (icon in chatIcons){
145
- var image_file = chatIcons[icon]
146
- return "<img class=\"chatEmoticon\" src=\"/assets/emoticons/" + image_file + "\"/>";
147
- }
148
- return icon
149
- }
150
-
151
- function buildUrlLink(url,name){
152
- return "<a target=\"_blank\" class=\"chatLink\" href=\"" + url + "\">" + name + "</a>";
153
- }
154
-
155
- function buildImageLink(url){
156
- return "<a target=\"_blank\" class=\"chatImageLink\" href=\"" + url + "\">" + "<img class=\"chatImage\" src=\"" + url + "\"/>" + "</a>";
157
- }
158
-
159
- function buildYoutubeVideoLink(url){
160
- //Get youtube video id
161
- var youtube_video_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
162
- var youtube_api_url = "http://gdata.youtube.com/feeds/api/videos/" + youtube_video_id
163
-
164
- //Get info from the video
165
- $.ajax({
166
- type: "GET",
167
- url: youtube_api_url,
168
- cache: false,
169
- dataType:'jsonp',
170
- success: function(data){
171
- var url_name = url;
172
- var youtube_video_thumbnail = "";
173
-
174
- //Video title
175
- var video_title = $(data).find("media\\:title")
176
- if (video_title.length > 0) {
177
- //url_name = url + " (" + $(video_title).text() + ")";
178
- url_name = $(video_title).text()
179
- }
180
-
181
- //Thumbnails
182
- var thumbnails = $(data).find("media\\:thumbnail")
183
- if (thumbnails.length>0){
184
- var thumbnail_url = $(thumbnails[0]).attr("url")
185
- if (thumbnail_url!=null){
186
- youtube_video_thumbnail = "<p><img class=\"chatVideoImage\" src=\"" + thumbnail_url + "\"/></p>";
187
- }
188
- }
189
-
190
- //Replace video link
191
- $("a[youtube_id=" + youtube_video_id + "]").html(buildUrlLink(url,url_name)+youtube_video_thumbnail);
192
- },
193
- error: function(xOptions, textStatus){
194
- //Handle errors
195
- }
196
- });
197
-
198
- return "<a target=\"_blank\" youtube_id=\"" + youtube_video_id + "\" class=\"chatLink\" href=\"" + url + "\">" + url + "</a>";
199
- }
200
-
201
- function buildRegex(word){
202
- word = word.replace(")","\\)")
203
- word = word.replace("(","\\(")
204
- var pattern = "(" + word + ")";
205
- pattern = buildPattern(pattern)
206
- return (new RegExp(pattern,'g'));
207
- }
208
24
 
209
- function buildPattern(pattern){
210
- //Escape pattern special characters
211
- pattern = pattern.replace("+","\\+")
212
- pattern = pattern.replace("?","\\?")
213
- return pattern
214
- }
215
-
216
-
217
- function getUrlType(url){
218
-
219
- if (url.match(youtube_video_pattern)!=null){
220
- return "video-youtube"
221
- }
222
-
223
- var urlArray = url.split(".");
224
- if (urlArray!=null && urlArray.length>0){
225
- var extension= urlArray[urlArray.length-1]
226
- } else {
227
- var extension = null;
228
- }
229
-
230
- switch(extension){
231
- case "jpg":
232
- return "image"
233
- break;
234
- case "png":
235
- return "image"
236
- break;
237
- case "gif":
238
- return "image"
239
- break;
240
- default:
241
- return "link"
242
- }
243
- }
25
+ ///////////////////////////////////////////////////////
26
+ // Parser functions
27
+ // Allow new features in chat msg like links, images, emoticons, ...
28
+ ///////////////////////////////////////////////////////
29
+
30
+ //Patterns
31
+ var html_tag_pattern=/.*\<[^>]+>.*/g
32
+ var simple_word_pattern=/^[aA-zZ0-9]+$/g
33
+ var http_urls_pattern=/(http(s)?:\/\/)([aA-zZ0-9%=_&+?])+([./-][aA-zZ0-9%=_&+?]+)*[/]?/g
34
+ var www_urls_pattern = /(www[.])([aA-zZ0-9%=_&+?])+([./-][aA-zZ0-9%=_&+?]+)*[/]?/g
35
+ var icons_a_pattern=/\([A-Z]\)/g
36
+ var icons_b_pattern=/((:|;)([()A-Z]))/g
37
+ var youtube_video_pattern=/(http(s)?:\/\/)?(((youtu.be\/)([aA-zZ0-9]+))|((www.youtube.com\/watch\?v=)([aA-z0-9Z&=.])+))/g
38
+
39
+
40
+ function getParsedContent(content,fromUser){
41
+ if (fromUser){
42
+ var chatTextclass = "ownChatText"
43
+ } else {
44
+ var chatTextclass = "guestChatText"
45
+ }
46
+ return ("<span class=\"" + chatTextclass + "\">" + parseContent(content) + "</span>");
47
+ }
48
+
49
+
50
+ function parseContent(content){
51
+
52
+ if (content.match(html_tag_pattern)!=null){
53
+ content = content.replace(/>/g, "&gt;");
54
+ content = content.replace(/</g, "&lt;");
55
+ return "<pre>" + content + "</pre>"
56
+ }
57
+
58
+ var words = content.split(" ");
59
+ for(i=0; i<words.length; i++){
60
+ words[i] = parseWord(words[i]);
61
+ }
62
+
63
+ return words.join(" ");
64
+ }
65
+
66
+ function parseWord(word){
67
+
68
+ //Look for empty or simple words
69
+ if ((word.trim()=="")||(word.match(simple_word_pattern)!=null)){
70
+ return word
71
+ }
72
+
73
+ //Look for http urls
74
+ var http_urls = word.match(http_urls_pattern)
75
+ if (http_urls!=null){
76
+ var url = http_urls[0]
77
+ var type = getUrlType(url);
78
+
79
+ switch(type){
80
+ case "link":
81
+ var link = buildUrlLink(url,url)
82
+ var subwords = splitFirst(word,url)
83
+ return parseWord(subwords[0]) + link + parseWord(subwords[1])
84
+ case "image":
85
+ var imageLink = buildImageLink(url);
86
+ var subwords = splitFirst(word,url)
87
+ return parseWord(subwords[0]) + imageLink + parseWord(subwords[1])
88
+ case "video-youtube":
89
+ var youtubeLink = buildYoutubeVideoLink(url);
90
+ var subwords = splitFirst(word,url)
91
+ return parseWord(subwords[0]) + youtubeLink + parseWord(subwords[1])
92
+ default:
93
+ return word
94
+ }
95
+ }
96
+
97
+
98
+ //Look for www urls
99
+ var www_urls = word.match(www_urls_pattern)
100
+ if (www_urls!=null){
101
+ var url = www_urls[0]
102
+ var type = getUrlType(url);
103
+
104
+ switch(type){
105
+ case "link":
106
+ var link = buildUrlLink("http://" + url,url)
107
+ var subwords = splitFirst(word,url)
108
+ return parseWord(subwords[0]) + link + parseWord(subwords[1])
109
+ case "image":
110
+ var imageLink = buildImageLink("http://" + url);
111
+ var subwords = splitFirst(word,url)
112
+ return parseWord(subwords[0]) + imageLink + parseWord(subwords[1])
113
+ case "video-youtube":
114
+ var youtubeLink = buildYoutubeVideoLink("http://" + url);
115
+ var subwords = splitFirst(word,url)
116
+ return parseWord(subwords[0]) + youtubeLink + parseWord(subwords[1])
117
+ default:
118
+ return word
119
+ }
120
+ }
121
+
122
+ //Look for icons: Regex
123
+ var icons_a = word.match(icons_a_pattern)
124
+ if(icons_a!=null){
125
+ for(g=0; g<icons_a.length; g++){
126
+ word = word.replace(buildRegex(icons_a[g]), buildIconImage(icons_a[g]))
127
+ }
128
+ }
129
+
130
+ var icons_b = word.match(icons_b_pattern)
131
+ if(icons_b!=null){
132
+ for(h=0; h<icons_b.length; h++){
133
+ word = word.replace(buildRegex(icons_b[h]), buildIconImage(icons_b[h]))
134
+ }
135
+ }
136
+
137
+
138
+ //No special content detected (maybe emoticons but not special pattern like urls)
139
+ return word
140
+ }
141
+
142
+ function splitFirst(word,key){
143
+ var split=[]
144
+ var cut = word.split(key);
145
+ split[0]=cut[0]
146
+ cut.shift()
147
+ var paste = cut.join(key)
148
+ split[1]=paste
149
+ return split
150
+ }
151
+
152
+ function buildIconImage(icon){
153
+ if (icon in chatIcons){
154
+ var image_file = chatIcons[icon]
155
+ return "<img class=\"chatEmoticon\" src=\"/assets/emoticons/" + image_file + "\"/>";
156
+ }
157
+ return icon
158
+ }
159
+
160
+ function buildUrlLink(url,name){
161
+ return "<a target=\"_blank\" class=\"chatLink\" href=\"" + url + "\">" + name + "</a>";
162
+ }
163
+
164
+ function buildImageLink(url){
165
+ return "<a target=\"_blank\" class=\"chatImageLink\" href=\"" + url + "\">" + "<img class=\"chatImage\" src=\"" + url + "\"/>" + "</a>";
166
+ }
167
+
168
+ function buildYoutubeVideoLink(url){
169
+ //Get youtube video id
170
+ var youtube_video_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
171
+ var youtube_api_url = "http://gdata.youtube.com/feeds/api/videos/" + youtube_video_id
172
+
173
+ //Get info from the video
174
+ $.ajax({
175
+ type: "GET",
176
+ url: youtube_api_url,
177
+ cache: false,
178
+ dataType:'jsonp',
179
+ success: function(data){
180
+ var url_name = url;
181
+ var youtube_video_thumbnail = "";
182
+
183
+ //Video title
184
+ var video_title = $(data).find("media\\:title")
185
+ if (video_title.length > 0) {
186
+ //url_name = url + " (" + $(video_title).text() + ")";
187
+ url_name = $(video_title).text()
188
+ }
189
+
190
+ //Thumbnails
191
+ var thumbnails = $(data).find("media\\:thumbnail")
192
+ if (thumbnails.length>0){
193
+ var thumbnail_url = $(thumbnails[0]).attr("url")
194
+ if (thumbnail_url!=null){
195
+ youtube_video_thumbnail = "<p><img class=\"chatVideoImage\" src=\"" + thumbnail_url + "\"/></p>";
196
+ }
197
+ }
198
+
199
+ //Replace video link
200
+ $("a[youtube_id=" + youtube_video_id + "]").html(buildUrlLink(url,url_name)+youtube_video_thumbnail);
201
+ },
202
+ error: function(xOptions, textStatus){
203
+ //Handle errors
204
+ }
205
+ });
206
+
207
+ return "<a target=\"_blank\" youtube_id=\"" + youtube_video_id + "\" class=\"chatLink\" href=\"" + url + "\">" + url + "</a>";
208
+ }
209
+
210
+ function buildRegex(word){
211
+ word = word.replace(")","\\)")
212
+ word = word.replace("(","\\(")
213
+ var pattern = "(" + word + ")";
214
+ pattern = buildPattern(pattern)
215
+ return (new RegExp(pattern,'g'));
216
+ }
217
+
218
+ function buildPattern(pattern){
219
+ //Escape pattern special characters
220
+ pattern = pattern.replace("+","\\+")
221
+ pattern = pattern.replace("?","\\?")
222
+ return pattern
223
+ }
224
+
225
+
226
+ function getUrlType(url){
227
+
228
+ if (url.match(youtube_video_pattern)!=null){
229
+ return "video-youtube"
230
+ }
231
+
232
+ var urlArray = url.split(".");
233
+ if (urlArray!=null && urlArray.length>0){
234
+ var extension= urlArray[urlArray.length-1]
235
+ } else {
236
+ var extension = null;
237
+ }
238
+
239
+ switch(extension){
240
+ case "jpg":
241
+ return "image"
242
+ break;
243
+ case "png":
244
+ return "image"
245
+ break;
246
+ case "gif":
247
+ return "image"
248
+ break;
249
+ default:
250
+ return "link"
251
+ }
252
+ }
253
+
254
+
255
+ ///////////////////////////////////////////////////////
256
+ // Parsing user titles
257
+ ///////////////////////////////////////////////////////
258
+
259
+ function getParsedName(name, fromUser){
260
+ if (fromUser){
261
+ var chatTextclass = "ownName"
262
+ } else {
263
+ var chatTextclass = "guestName"
264
+ }
265
+ return ("<span class=\"" + chatTextclass + "\">" + name + "</span>");
266
+ }
244
267
 
245
268
 
246
- ///////////////////////////////////////////////////////
247
- // Parsing user titles
248
- ///////////////////////////////////////////////////////
269
+ return {
270
+ init: init,
271
+ getParsedContent : getParsedContent,
272
+ getParsedName : getParsedName
273
+ };
249
274
 
250
- function getParsedName(name, fromUser){
251
- if (fromUser){
252
- var chatTextclass = "ownName"
253
- } else {
254
- var chatTextclass = "guestName"
255
- }
256
- return ("<span class=\"" + chatTextclass + "\">" + name + "</span>");
257
- }
275
+ }) (PRESENCE, jQuery);