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.
- data/README.rdoc +10 -0
- data/base/lib/social_stream/base/version.rb +1 -1
- data/base/social_stream-base.gemspec +1 -1
- data/lib/social_stream/release/component.rb +5 -0
- data/lib/social_stream/release/global.rb +8 -7
- data/lib/social_stream/release/kernel.rb +24 -0
- data/lib/social_stream/version.rb +1 -1
- data/presence/app/assets/javascripts/jquery.flexselect.sstreampresence.js +2 -2
- data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +5 -5
- data/presence/app/assets/javascripts/presence.js.erb +6 -4
- data/presence/app/assets/javascripts/presence_XmppClient.js.erb +1146 -996
- data/presence/app/assets/javascripts/presence_audio.js.erb +74 -60
- data/presence/app/assets/javascripts/presence_game.js.erb +35 -22
- data/presence/app/assets/javascripts/presence_game_comunication.js.erb +22 -5
- data/presence/app/assets/javascripts/presence_game_factory.js.erb +1 -1
- data/presence/app/assets/javascripts/presence_game_interface.js.erb +33 -13
- data/presence/app/assets/javascripts/presence_notifications.js +206 -183
- data/presence/app/assets/javascripts/presence_parser.js +265 -247
- data/presence/app/assets/javascripts/presence_persistence.js +199 -188
- data/presence/app/assets/javascripts/presence_store.js +22 -11
- data/presence/app/assets/javascripts/presence_uiManager.js.erb +553 -530
- data/presence/app/assets/javascripts/presence_utilities.js +244 -219
- data/presence/app/assets/javascripts/presence_videochat.js.erb +436 -409
- data/presence/app/assets/javascripts/presence_windowManager.js +586 -532
- data/presence/app/views/chat/_index.html.erb +7 -13
- data/presence/config/locales/en.yml +2 -1
- data/presence/config/locales/es.yml +2 -1
- data/presence/ejabberd/ejabberd_files.zip +0 -0
- data/presence/ejabberd/ejabberd_scripts/authentication_script +9 -2
- data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
- data/presence/lib/generators/social_stream/presence/templates/initializer.rb +4 -0
- data/presence/lib/social_stream-presence.rb +3 -0
- data/presence/lib/social_stream/presence/version.rb +1 -1
- data/presence/lib/social_stream/presence/xmpp_server_order.rb +1 -0
- data/release.thor +33 -13
- data/social_stream.gemspec +2 -2
- metadata +90 -29
@@ -1,191 +1,214 @@
|
|
1
|
-
|
2
|
-
//Chat Boxes Notifications
|
3
|
-
////////////////////
|
1
|
+
PRESENCE.NOTIFICATIONS = (function(P,$,undefined){
|
4
2
|
|
5
|
-
function
|
6
|
-
if(notification!=null){
|
7
|
-
notification.css("display","block");
|
8
|
-
notification.css("visibility","visible");
|
9
|
-
notification.fadeIn();
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
function showChatNotification(notification,type,msg){
|
14
|
-
notification.html("<p notification_type=\"" + type + "\" class=\"ui-chatbox-notify-text\">" + msg + "</p>");
|
15
|
-
fadeInChatNotification(notification);
|
16
|
-
}
|
17
|
-
|
18
|
-
function showChatNotificationForSlug(slug,type,msg){
|
19
|
-
var notification = $("#" + slug).parent().find("div.ui-chatbox-notify");
|
20
|
-
if(notification.length==1){
|
21
|
-
showChatNotification(notification,type,msg);
|
22
|
-
}
|
23
|
-
}
|
24
|
-
|
25
|
-
function showOfflineChatNotificationForSlug(slug){
|
26
|
-
var msg = I18n.t("chat.notify.guestOffline", {name: getNameFromSlug(slug)});
|
27
|
-
showChatNotificationForSlug(slug,"guestOffline",msg);
|
28
|
-
}
|
3
|
+
var init = function(){ }
|
29
4
|
|
30
|
-
function showVideoChatNotificationForSlug(slug,msg){
|
31
|
-
showChatNotificationForSlug(slug,"videochat",msg);
|
32
|
-
}
|
33
5
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
function fadeOutChatNotification(notification){
|
45
|
-
if(notification!=null){
|
46
|
-
notification.fadeOut();
|
47
|
-
notification.css("display","none");
|
48
|
-
notification.css("visibility","hidden");
|
6
|
+
////////////////////
|
7
|
+
//Chat Boxes Notifications
|
8
|
+
////////////////////
|
9
|
+
|
10
|
+
var fadeInChatNotification = function(notification){
|
11
|
+
if(notification!=null){
|
12
|
+
notification.css("display","block");
|
13
|
+
notification.css("visibility","visible");
|
14
|
+
notification.fadeIn();
|
15
|
+
}
|
49
16
|
}
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
}
|
62
|
-
|
63
|
-
function hideAllNotifications(){
|
64
|
-
var notification = $("div.ui-chatbox-notify");
|
65
|
-
fadeOutChatNotification(notification);
|
66
|
-
}
|
67
|
-
|
68
|
-
function updateAllNotifications(){
|
69
|
-
hideAllNotifications();
|
70
|
-
if(disconnectionFlag){
|
71
|
-
updateNotificationsAfterUserDisconnect();
|
72
|
-
} else {
|
73
|
-
//Notification for offline contacts
|
74
|
-
$.each(getAllDisconnectedSlugsWithChatBoxes(), function(index, value) {
|
75
|
-
if(!isSlugGroup(value)){
|
76
|
-
showOfflineChatNotificationForSlug(value)
|
77
|
-
}
|
78
|
-
});
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
function getChatNotificationForSlug(slug){
|
83
|
-
var chatBox = getChatBoxForSlug(slug)
|
84
|
-
if(chatBox!=null){
|
85
|
-
var notification = chatBox.parent().find("div.ui-chatbox-notify");
|
86
|
-
if (notification.length == 1) {
|
87
|
-
return notification;
|
88
|
-
}
|
89
|
-
}
|
90
|
-
return null;
|
91
|
-
}
|
92
|
-
|
93
|
-
function getNotificationType(notification){
|
94
|
-
return $(notification).find("p").attr("notification_type");
|
95
|
-
}
|
96
|
-
|
97
|
-
function addTextToNotification(notification,txt,type,name){
|
98
|
-
var new_p = document.createElement('p')
|
99
|
-
$(new_p).attr("class","ui-chatbox-notify-text")
|
100
|
-
$(new_p).attr("notification_type",type)
|
101
|
-
$(new_p).html(txt)
|
102
|
-
if(name!=null){
|
103
|
-
$(new_p).attr("name",name)
|
104
|
-
}
|
105
|
-
$(notification).append(new_p)
|
106
|
-
fadeInChatNotification(notification)
|
107
|
-
}
|
108
|
-
|
109
|
-
function removeTextFromNotification(notification,name){
|
110
|
-
var p = $(notification).find("p.ui-chatbox-notify-text[name=" + name + "]")
|
111
|
-
if (p!=null){
|
112
|
-
p.remove()
|
113
|
-
var empty = ($(notification).find("p").length==0)
|
114
|
-
if (empty){
|
115
|
-
fadeOutChatNotification(notification)
|
116
|
-
}
|
117
|
-
}
|
118
|
-
}
|
119
|
-
|
120
|
-
function removeAllTextsFromNotification(notification){
|
121
|
-
var p = $(notification).find("p.ui-chatbox-notify-text")
|
122
|
-
if (p!=null){
|
123
|
-
p.remove()
|
124
|
-
var empty = ($(notification).find("p").length==0)
|
125
|
-
if (empty){
|
126
|
-
fadeOutChatNotification(notification)
|
127
|
-
}
|
128
|
-
}
|
129
|
-
}
|
130
|
-
|
131
|
-
function addTextToNotificationForSlug(slug,txt,type,name){
|
132
|
-
var notification = getChatNotificationForSlug(slug);
|
133
|
-
if(notification!=null){
|
134
|
-
addTextToNotification(notification,txt,type,name)
|
135
|
-
}
|
136
|
-
}
|
137
|
-
|
138
|
-
function removeTextFromNotificationForSlug(slug,name){
|
139
|
-
var notification = getChatNotificationForSlug(slug);
|
140
|
-
if(notification!=null){
|
141
|
-
removeTextFromNotification(notification,name)
|
142
|
-
}
|
143
|
-
}
|
144
|
-
|
145
|
-
function removeAllTextsFromNotificationForSlug(slug){
|
146
|
-
var notification = getChatNotificationForSlug(slug);
|
147
|
-
if(notification!=null){
|
148
|
-
removeAllTextsFromNotification(notification)
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
|
153
|
-
////////////////////////
|
154
|
-
// Group notifications
|
155
|
-
///////////////////////
|
156
|
-
|
157
|
-
function addNickToNotificationInGroup(roomName,nick){
|
158
|
-
if(isSlugGroup(roomName)){
|
159
|
-
addTextToNotificationForSlug(roomName,nick,"roomNotification",nick)
|
160
|
-
}
|
161
|
-
}
|
162
|
-
|
163
|
-
function removeNickFromNotificationInGroup(roomName,nick){
|
164
|
-
if(isSlugGroup(roomName)){
|
165
|
-
removeTextFromNotificationForSlug(roomName,nick)
|
166
|
-
}
|
167
|
-
}
|
168
|
-
|
169
|
-
function initialNotificationInGroup(roomName,msg){
|
170
|
-
removeAllTextsFromNotificationForSlug(roomName);
|
171
|
-
addTextToNotificationForSlug(roomName,msg,"roomNotification","Initial_Notification")
|
172
|
-
}
|
173
|
-
|
174
|
-
function changeInitialNotificationInGroup(roomName,msg){
|
175
|
-
var notification = getChatNotificationForSlug(roomName);
|
176
|
-
if(notification!=null){
|
177
|
-
$(notification).find("p.ui-chatbox-notify-text[name=" + "Initial_Notification" + "]").html(msg)
|
17
|
+
|
18
|
+
var showChatNotification = function(notification,type,msg){
|
19
|
+
notification.html("<p notification_type=\"" + type + "\" class=\"ui-chatbox-notify-text\">" + msg + "</p>");
|
20
|
+
fadeInChatNotification(notification);
|
21
|
+
}
|
22
|
+
|
23
|
+
var showChatNotificationForSlug = function(slug,type,msg){
|
24
|
+
var notification = $("#" + slug).parent().find("div.ui-chatbox-notify");
|
25
|
+
if(notification.length==1){
|
26
|
+
showChatNotification(notification,type,msg);
|
27
|
+
}
|
178
28
|
}
|
179
|
-
|
29
|
+
|
30
|
+
var showOfflineChatNotificationForSlug = function(slug){
|
31
|
+
var msg = I18n.t("chat.notify.guestOffline", {name: PRESENCE.XMPPClient.getNameFromSlug(slug)});
|
32
|
+
showChatNotificationForSlug(slug,"guestOffline",msg);
|
33
|
+
}
|
34
|
+
|
35
|
+
var showVideoChatNotificationForSlug = function(slug,msg){
|
36
|
+
showChatNotificationForSlug(slug,"videochat",msg);
|
37
|
+
}
|
38
|
+
|
39
|
+
var showVideoChatNotificationForSlugClientIssue = function(slug){
|
40
|
+
var msg = I18n.t("chat.notify.videochat.clientIssue", {name: PRESENCE.XMPPClient.getNameFromSlug(slug)});
|
41
|
+
showVideoChatNotificationForSlug(slug,msg);
|
42
|
+
}
|
43
|
+
|
44
|
+
var showVideoChatNotificationForSlugClientOffline = function(slug){
|
45
|
+
var msg = I18n.t("chat.notify.videochat.offline", {name: PRESENCE.XMPPClient.getNameFromSlug(slug)});
|
46
|
+
showVideoChatNotificationForSlug(slug,msg);
|
47
|
+
}
|
48
|
+
|
49
|
+
var fadeOutChatNotification = function(notification){
|
50
|
+
if(notification!=null){
|
51
|
+
notification.fadeOut();
|
52
|
+
notification.css("display","none");
|
53
|
+
notification.css("visibility","hidden");
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
var hideChatNotificationForSlug = function(slug){
|
58
|
+
var notification = getChatNotificationForSlug(slug);
|
59
|
+
fadeOutChatNotification(notification);
|
60
|
+
}
|
61
|
+
|
62
|
+
var updateNotificationsAfterUserDisconnect = function(){
|
63
|
+
var notification = $("div.ui-chatbox-notify");
|
64
|
+
var msg = I18n.t('chat.notify.offline');
|
65
|
+
showChatNotification(notification,"userOffline",msg);
|
66
|
+
}
|
67
|
+
|
68
|
+
var hideAllNotifications = function(){
|
69
|
+
var notification = $("div.ui-chatbox-notify");
|
70
|
+
fadeOutChatNotification(notification);
|
71
|
+
}
|
72
|
+
|
73
|
+
var updateAllNotifications = function(){
|
74
|
+
hideAllNotifications();
|
75
|
+
if(PRESENCE.XMPPClient.getDisconnectionFlag()){
|
76
|
+
updateNotificationsAfterUserDisconnect();
|
77
|
+
} else {
|
78
|
+
//Notification for offline contacts
|
79
|
+
$.each(PRESENCE.WINDOW.getAllDisconnectedSlugsWithChatBoxes(), function(index, value) {
|
80
|
+
if(!PRESENCE.WINDOW.isSlugGroup(value)){
|
81
|
+
showOfflineChatNotificationForSlug(value)
|
82
|
+
}
|
83
|
+
});
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
var getChatNotificationForSlug = function(slug){
|
88
|
+
var chatBox = PRESENCE.WINDOW.getChatBoxForSlug(slug)
|
89
|
+
if(chatBox!=null){
|
90
|
+
var notification = chatBox.parent().find("div.ui-chatbox-notify");
|
91
|
+
if (notification.length == 1) {
|
92
|
+
return notification;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
return null;
|
96
|
+
}
|
97
|
+
|
98
|
+
var getNotificationType = function(notification){
|
99
|
+
return $(notification).find("p").attr("notification_type");
|
100
|
+
}
|
101
|
+
|
102
|
+
var addTextToNotification = function(notification,txt,type,name){
|
103
|
+
var new_p = document.createElement('p')
|
104
|
+
$(new_p).attr("class","ui-chatbox-notify-text")
|
105
|
+
$(new_p).attr("notification_type",type)
|
106
|
+
$(new_p).html(txt)
|
107
|
+
if(name!=null){
|
108
|
+
$(new_p).attr("name",name)
|
109
|
+
}
|
110
|
+
$(notification).append(new_p)
|
111
|
+
fadeInChatNotification(notification)
|
112
|
+
}
|
113
|
+
|
114
|
+
var removeTextFromNotification = function(notification,name){
|
115
|
+
var p = $(notification).find("p.ui-chatbox-notify-text[name=" + name + "]")
|
116
|
+
if (p!=null){
|
117
|
+
p.remove()
|
118
|
+
var empty = ($(notification).find("p").length==0)
|
119
|
+
if (empty){
|
120
|
+
fadeOutChatNotification(notification)
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
var removeAllTextsFromNotification = function(notification){
|
126
|
+
var p = $(notification).find("p.ui-chatbox-notify-text")
|
127
|
+
if (p!=null){
|
128
|
+
p.remove()
|
129
|
+
var empty = ($(notification).find("p").length==0)
|
130
|
+
if (empty){
|
131
|
+
fadeOutChatNotification(notification)
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
var addTextToNotificationForSlug = function(slug,txt,type,name){
|
137
|
+
var notification = getChatNotificationForSlug(slug);
|
138
|
+
if(notification!=null){
|
139
|
+
addTextToNotification(notification,txt,type,name)
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
var removeTextFromNotificationForSlug = function(slug,name){
|
144
|
+
var notification = getChatNotificationForSlug(slug);
|
145
|
+
if(notification!=null){
|
146
|
+
removeTextFromNotification(notification,name)
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
var removeAllTextsFromNotificationForSlug = function(slug){
|
151
|
+
var notification = getChatNotificationForSlug(slug);
|
152
|
+
if(notification!=null){
|
153
|
+
removeAllTextsFromNotification(notification)
|
154
|
+
}
|
155
|
+
}
|
156
|
+
|
157
|
+
|
158
|
+
////////////////////////
|
159
|
+
// Group notifications
|
160
|
+
///////////////////////
|
161
|
+
|
162
|
+
var addNickToNotificationInGroup = function(roomName,nick){
|
163
|
+
if(PRESENCE.WINDOW.isSlugGroup(roomName)){
|
164
|
+
addTextToNotificationForSlug(roomName,nick,"roomNotification",nick)
|
165
|
+
}
|
166
|
+
}
|
167
|
+
|
168
|
+
var removeNickFromNotificationInGroup = function(roomName,nick){
|
169
|
+
if(PRESENCE.WINDOW.isSlugGroup(roomName)){
|
170
|
+
removeTextFromNotificationForSlug(roomName,nick)
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
var initialNotificationInGroup = function(roomName,msg){
|
175
|
+
removeAllTextsFromNotificationForSlug(roomName);
|
176
|
+
addTextToNotificationForSlug(roomName,msg,"roomNotification","Initial_Notification")
|
177
|
+
}
|
178
|
+
|
179
|
+
var changeInitialNotificationInGroup = function(roomName,msg){
|
180
|
+
var notification = getChatNotificationForSlug(roomName);
|
181
|
+
if(notification!=null){
|
182
|
+
$(notification).find("p.ui-chatbox-notify-text[name=" + "Initial_Notification" + "]").html(msg)
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
|
187
|
+
////////////////////
|
188
|
+
//Events
|
189
|
+
////////////////////
|
190
|
+
|
191
|
+
var onClickChatNotification = function(notification){
|
192
|
+
if (getNotificationType(notification)=="roomNotification"){
|
193
|
+
return;
|
194
|
+
}
|
195
|
+
fadeOutChatNotification(notification)
|
196
|
+
}
|
197
|
+
|
180
198
|
|
181
199
|
|
182
|
-
|
183
|
-
|
184
|
-
|
200
|
+
return {
|
201
|
+
init: init,
|
202
|
+
showOfflineChatNotificationForSlug : showOfflineChatNotificationForSlug,
|
203
|
+
hideChatNotificationForSlug : hideChatNotificationForSlug,
|
204
|
+
updateNotificationsAfterUserDisconnect : updateNotificationsAfterUserDisconnect,
|
205
|
+
updateAllNotifications : updateAllNotifications,
|
206
|
+
addNickToNotificationInGroup : addNickToNotificationInGroup,
|
207
|
+
removeNickFromNotificationInGroup : removeNickFromNotificationInGroup,
|
208
|
+
initialNotificationInGroup : initialNotificationInGroup,
|
209
|
+
changeInitialNotificationInGroup : changeInitialNotificationInGroup,
|
210
|
+
onClickChatNotification : onClickChatNotification
|
211
|
+
};
|
212
|
+
|
213
|
+
}) (PRESENCE, jQuery);
|
185
214
|
|
186
|
-
function onClickChatNotification(notification){
|
187
|
-
if (getNotificationType(notification)=="roomNotification"){
|
188
|
-
return;
|
189
|
-
}
|
190
|
-
fadeOutChatNotification(notification)
|
191
|
-
}
|
@@ -1,257 +1,275 @@
|
|
1
1
|
////////////////////
|
2
|
-
//
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
var
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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, ">");
|
45
|
-
content = content.replace(/</g, "<");
|
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
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
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, ">");
|
54
|
+
content = content.replace(/</g, "<");
|
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
|
-
|
248
|
-
|
269
|
+
return {
|
270
|
+
init: init,
|
271
|
+
getParsedContent : getParsedContent,
|
272
|
+
getParsedName : getParsedName
|
273
|
+
};
|
249
274
|
|
250
|
-
|
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);
|