Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
converse.js
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
converse.js
Commits
083f76b7
Commit
083f76b7
authored
Feb 22, 2013
by
ichim-david
Browse files
Options
Browse Files
Download
Plain Diff
Fixed merge conflicts for converse.js
parents
32ebfe53
ffbacad9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
301 additions
and
245 deletions
+301
-245
Libraries/jarnxmpp.core.handlers.js
Libraries/jarnxmpp.core.handlers.js
+3
-3
converse.css
converse.css
+132
-123
converse.js
converse.js
+166
-119
No files found.
Libraries/jarnxmpp.core.handlers.js
View file @
083f76b7
...
...
@@ -2,7 +2,7 @@
$msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google:false, jarnxmpp:false, jQuery:false, sessionStorage:false, $iq:false, $pres:false, Image:false, */
(
function
(
jarnxmpp
,
$
,
portal_url
)
{
portal_url
=
portal_url
||
''
;
jarnxmpp
.
Storage
=
{
...
...
@@ -230,9 +230,9 @@ $msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google
data
=
{};
}
$
.
ajax
({
'
url
'
:
portal_url
+
'
/@@xmpp-loader
'
,
'
url
'
:
portal_url
+
'
/@@xmpp-loader
'
,
'
dataType
'
:
'
json
'
,
'
data
'
:
data
,
'
data
'
:
data
,
'
success
'
:
function
(
data
)
{
if
(
!
((
'
rid
'
in
data
)
&&
(
'
sid
'
in
data
)
&&
(
'
BOSH_SERVICE
'
in
data
)))
{
return
;
...
...
converse.css
View file @
083f76b7
...
...
@@ -3,44 +3,53 @@
}
#chatpanel
{
z-index
:
4
;
/*--Keeps the panel on top of all other elements--*/
position
:
fixed
;
bottom
:
0
;
right
:
0
;
z-index
:
4
;
/*--Keeps the panel on top of all other elements--*/
position
:
fixed
;
bottom
:
0
;
right
:
0
;
height
:
332px
;
width
:
auto
;
}
#toggle-controlbox
{
position
:
fixed
;
position
:
fixed
;
font-size
:
80%
;
bottom
:
0
;
bottom
:
0
;
right
:
0
;
border-top-right-radius
:
4px
;
border-top-left-radius
:
4px
;
background
:
#e3e2e2
;
border
:
1px
solid
#c3c3c3
;
border-bottom
:
none
;
background
:
#e3e2e2
;
border
:
1px
solid
#c3c3c3
;
border-bottom
:
none
;
padding
:
0.25em
0.5em
;
margin-right
:
1em
;
height
:
1.1em
;
}
#toggle-online-users
{
display
:
none
;
}
#connecting-to-chat
{
background
:
url('/spinner.gif')
no-repeat
;
padding-left
:
1.4em
;
}
.chat-head
{
color
:
#ffffff
;
color
:
#ffffff
;
margin
:
0
;
font-size
:
100%
;
font-size
:
100%
;
border-top-right-radius
:
4px
;
border-top-left-radius
:
4px
;
padding
:
3px
0
3px
7px
;
padding
:
3px
0
3px
7px
;
}
.chat-head-chatbox
{
background-color
:
rgb
(
89
,
106
,
114
);
background-color
:
rgba
(
89
,
106
,
114
,
1
);
background-color
:
rgb
(
89
,
106
,
114
);
background-color
:
rgba
(
89
,
106
,
114
,
1
);
}
.chat-head-chatroom
{
background-color
:
#2D617A
;
background-color
:
#2D617A
;
}
.chatroom
.chat-area
{
...
...
@@ -60,15 +69,15 @@
height
:
272px
;
background-color
:
white
;
overflow
:
auto
;
border-right
:
1px
solid
#999
;
border-bottom
:
1px
solid
#999
;
border-right
:
1px
solid
#999
;
border-bottom
:
1px
solid
#999
;
border-bottom-right-radius
:
4px
;
}
.participants
ul
.participant-list
li
{
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
display
:
block
;
font-size
:
12px
;
padding
:
0.5em
0
0
0.5em
;
...
...
@@ -89,58 +98,58 @@ input.new-chatroom-name {
}
.chat-blink
{
background-color
:
#176689
;
border-right
:
1px
solid
#176689
;
border-left
:
1px
solid
#176689
;
background-color
:
#176689
;
border-right
:
1px
solid
#176689
;
border-left
:
1px
solid
#176689
;
}
.chat-content
{
padding
:
0.3em
;
font-size
:
13px
;
color
:
#333333
;
height
:
193px
;
overflow-y
:
auto
;
border
:
1px
solid
#999
;
font-size
:
13px
;
color
:
#333333
;
height
:
193px
;
overflow-y
:
auto
;
border
:
1px
solid
#999
;
border-bottom
:
0
;
border-top
:
0
;
background-color
:
#ffffff
;
line-height
:
1.3em
;
background-color
:
#ffffff
;
line-height
:
1.3em
;
}
.chat-textarea
{
border
:
0
;
border
:
0
;
height
:
50px
;
width
:
100%
;
}
.chat-textarea-chatbox-selected
{
border
:
1px
solid
#578308
;
margin
:
0
;
border
:
1px
solid
#578308
;
margin
:
0
;
}
.chat-textarea-chatroom-selected
{
border
:
2px
solid
#2D617A
;
margin
:
0
;
border
:
2px
solid
#2D617A
;
margin
:
0
;
}
.chat-info
{
color
:
#666666
;
color
:
#666666
;
}
.chat-message-me
{
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#436976
;
}
.chat-message-room
{
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#4B7003
;
white-space
:
nowrap
;
}
.chat-message-them
{
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#F62817
;
white-space
:
nowrap
;
}
...
...
@@ -149,7 +158,7 @@ input.new-chatroom-name {
color
:
#808080
;
}
div
#settings
,
div
#settings
,
div
#chatrooms
{
height
:
279px
;
}
...
...
@@ -160,11 +169,11 @@ p.not-implemented {
color
:
#808080
;
}
div
.delayed
.chat-message-them
{
div
.delayed
.chat-message-them
{
color
:
#FB5D50
;
}
div
.delayed
.chat-message-me
{
div
.delayed
.chat-message-me
{
color
:
#7EABBB
;
}
...
...
@@ -175,30 +184,30 @@ div.delayed .chat-message-me {
}
.chat-head
.avatar
{
height
:
35px
;
float
:
left
;
margin-right
:
6px
;
height
:
35px
;
float
:
left
;
margin-right
:
6px
;
}
div
.chat-title
{
height
:
1.1em
;
color
:
white
;
font-weight
:
bold
;
line-height
:
15px
;
display
:
block
;
font-weight
:
bold
;
line-height
:
15px
;
display
:
block
;
margin-top
:
2px
;
margin-right
:
20px
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
text-shadow
:
rgba
(
0
,
0
,
0
,
0.51
)
0
-1px
0
;
margin-right
:
20px
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
text-shadow
:
rgba
(
0
,
0
,
0
,
0.51
)
0
-1px
0
;
}
.chat-head-chatbox
,
.chat-head-chatroom
{
background
:
linear-gradient
(
top
,
rgba
(
206
,
220
,
231
,
1
)
0%
,
rgba
(
89
,
106
,
114
,
1
)
100%
);
height
:
33px
;
position
:
relative
;
height
:
33px
;
position
:
relative
;
}
p
.user-custom-message
,
...
...
@@ -207,9 +216,9 @@ p.chatroom-topic {
font-style
:
italic
;
height
:
1.3em
;
clear
:
right
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
}
.activated
{
...
...
@@ -224,7 +233,7 @@ a.subscribe-to-user {
div
.add-xmpp-contact
{
display
:
block
;
border
:
1px
solid
#ddd
;
border
:
1px
solid
#ddd
;
padding
:
3px
3px
3px
3px
;
margin
:
0
0.5em
;
clear
:
both
;
...
...
@@ -233,12 +242,12 @@ div.add-xmpp-contact {
}
div
.add-xmpp-contact
a
.add-xmpp-contact
{
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
padding-left
:
1.5em
;
}
#fancy-xmpp-status-select
a
.change-xmpp-status-message
{
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
background
:
url('/pencil_icon.png')
no-repeat
right
top
;
float
:
right
;
clear
:
right
;
...
...
@@ -247,13 +256,13 @@ div.add-xmpp-contact a.add-xmpp-contact {
}
#fancy-xmpp-status-select
a
.choose-xmpp-status
{
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
padding-left
:
1.5em
;
width
:
140px
;
display
:
block
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
float
:
left
;
}
...
...
@@ -272,13 +281,13 @@ form.search-xmpp-contact input {
.oc-chat-head
{
margin
:
0
;
color
:
#FFF
;
color
:
#FFF
;
border-top-right-radius
:
4px
;
border-top-left-radius
:
4px
;
height
:
35px
;
clear
:
right
;
background-color
:
#5390C8
;
padding
:
3px
0
0
0
;
padding
:
3px
0
0
0
;
}
.close-chatbox-button
{
...
...
@@ -334,24 +343,24 @@ form.search-xmpp-contact input {
#xmppchat-roster
dd
.current-xmpp-contact
,
#xmppchat-roster
dd
.current-xmpp-contact
:hover
{
background
:
url(images/user_online_panel.png)
no-repeat
5px
2px
;
background
:
url(images/user_online_panel.png)
no-repeat
5px
2px
;
}
#xmppchat-roster
dd
.current-xmpp-contact.offline
:hover
,
#xmppchat-roster
dd
.current-xmpp-contact.unavailable
:hover
,
#xmppchat-roster
dd
.current-xmpp-contact.offline
,
#xmppchat-roster
dd
.current-xmpp-contact.unavailable
{
background
:
url(images/user_offline_panel.png)
no-repeat
5px
2px
;
background
:
url(images/user_offline_panel.png)
no-repeat
5px
2px
;
}
#xmppchat-roster
dd
.current-xmpp-contact.busy
,
#xmppchat-roster
dd
.current-xmpp-contact.busy
:hover
{
background
:
url(images/user_busy_panel.png)
no-repeat
5px
2px
;
background
:
url(images/user_busy_panel.png)
no-repeat
5px
2px
;
}
#xmppchat-roster
dd
.current-xmpp-contact.away
,
#xmppchat-roster
dd
.current-xmpp-contact.away
:hover
{
background
:
url(images/user_away_panel.png)
no-repeat
5px
2px
;
background
:
url(images/user_away_panel.png)
no-repeat
5px
2px
;
}
#xmppchat-roster
dd
.requesting-xmpp-contact
button
{
...
...
@@ -360,7 +369,7 @@ form.search-xmpp-contact input {
#xmppchat-roster
dd
a
{
margin-left
:
2em
;
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
}
.remove-xmpp-contact-dialog
.ui-dialog-buttonpane
{
...
...
@@ -386,7 +395,7 @@ form.search-xmpp-contact input {
color
:
#666
;
border
:
none
;
padding
:
0.3em
0.5em
0.3em
0.5em
;
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
}
#available-chatrooms
dt
{
...
...
@@ -404,8 +413,8 @@ dd.available-chatroom,
border
:
none
;
display
:
block
;
padding
:
0
0.5em
0
0.5em
;
color
:
#3f3f3f
;
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
color
:
#3f3f3f
;
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
}
#xmppchat-roster
dd
a
.remove-xmpp-contact
{
...
...
@@ -417,8 +426,8 @@ dd.available-chatroom,
.chatbox
,
.chatroom
{
box-shadow
:
1px
1px
5px
1px
rgba
(
0
,
0
,
0
,
0.4
);
display
:
none
;
box-shadow
:
1px
1px
5px
1px
rgba
(
0
,
0
,
0
,
0.4
);
display
:
none
;
float
:
right
;
margin-right
:
15px
;
z-index
:
3
;
/* So that it's higher than the content actions */
...
...
@@ -426,16 +435,16 @@ dd.available-chatroom,
}
.chatbox
{
width
:
200px
;
width
:
200px
;
}
.chatroom
{
width
:
300px
;
width
:
300px
;
height
:
311px
;
}
.oc-chat-content
{
height
:
272px
;
height
:
272px
;
width
:
199px
;
padding
:
0
;
}
...
...
@@ -456,12 +465,12 @@ dd.available-chatroom,
}
div
#controlbox-panes
{
background
:
-moz-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* FF3.6+ */
background
:
-ms-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* IE10+ */
background
:
-o-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* Opera 11.10+ */
background
:
-webkit-gradient
(
linear
,
left
top
,
left
bottom
,
color-stop
(
0%
,
rgba
(
255
,
255
,
255
,
1
)),
color-stop
(
100%
,
rgba
(
240
,
240
,
240
,
1
)));
/* Chrome,Safari4+ */
background
:
-webkit-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* Chrome10+,Safari5.1+ */
background
:
linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* W3C */
background
:
-moz-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* FF3.6+ */
background
:
-ms-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* IE10+ */
background
:
-o-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* Opera 11.10+ */
background
:
-webkit-gradient
(
linear
,
left
top
,
left
bottom
,
color-stop
(
0%
,
rgba
(
255
,
255
,
255
,
1
)),
color-stop
(
100%
,
rgba
(
240
,
240
,
240
,
1
)));
/* Chrome,Safari4+ */
background
:
-webkit-linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* Chrome10+,Safari5.1+ */
background
:
linear-gradient
(
top
,
rgba
(
255
,
255
,
255
,
1
)
0%
,
rgba
(
240
,
240
,
240
,
1
)
100%
);
/* W3C */
background-color
:
white
;
border-bottom-left-radius
:
4px
;
border-bottom-right-radius
:
4px
;
...
...
@@ -482,18 +491,18 @@ select#select-xmpp-status {
/* @group Tabs */
.chat-head
#controlbox-tabs
{
text-align
:
center
;
display
:
inline
;
overflow
:
hidden
;
font-size
:
12px
;
list-style-type
:
none
;
text-align
:
center
;
display
:
inline
;
overflow
:
hidden
;
font-size
:
12px
;
list-style-type
:
none
;
}
/* single tab */
.chat-head
#controlbox-tabs
li
{
width
:
40%
;
width
:
40%
;
float
:
left
;
text-shadow
:
white
0
1px
0
;
text-shadow
:
white
0
1px
0
;
}
ul
#controlbox-tabs
li
a
{
...
...
@@ -509,27 +518,27 @@ ul#controlbox-tabs li a {
border-top-left-radius
:
4px
;
color
:
#666
;
background-color
:
#EEE
;
background
:
-moz-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* FF3.6+ */
background
:
-ms-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* IE10+ */
background
:
-o-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* Opera 11.10+ */
background
:
-webkit-gradient
(
linear
,
left
top
,
left
bottom
,
color-stop
(
0%
,
rgba
(
255
,
255
,
255
,
1
)),
color-stop
(
100%
,
rgba
(
245
,
245
,
245
,
1
)));
/* Chrome,Safari4+ */
background
:
-webkit-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* Chrome10+,Safari5.1+ */
background
:
linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* W3C */
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
background
:
-moz-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* FF3.6+ */
background
:
-ms-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* IE10+ */
background
:
-o-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* Opera 11.10+ */
background
:
-webkit-gradient
(
linear
,
left
top
,
left
bottom
,
color-stop
(
0%
,
rgba
(
255
,
255
,
255
,
1
)),
color-stop
(
100%
,
rgba
(
245
,
245
,
245
,
1
)));
/* Chrome,Safari4+ */
background
:
-webkit-linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* Chrome10+,Safari5.1+ */
background
:
linear-gradient
(
top
,
rgba
(
245
,
245
,
245
,
1
)
0%
,
rgba
(
255
,
255
,
255
,
1
)
100%
);
/* W3C */
text-shadow
:
0
1px
0
rgba
(
250
,
250
,
250
,
1
);
}
.chat-head
#controlbox-tabs
li
a
:hover
{
color
:
black
;
color
:
black
;
}
.chat-head
#controlbox-tabs
li
a
{
background-color
:
rgba
(
240
,
240
,
240
,
1
);
box-shadow
:
inset
0
0
8px
rgba
(
0
,
0
,
0
,
0.2
);
background-color
:
rgba
(
240
,
240
,
240
,
1
);
box-shadow
:
inset
0
0
8px
rgba
(
0
,
0
,
0
,
0.2
);
}
ul
#controlbox-tabs
a
.current
,
ul
#controlbox-tabs
a
.current
:hover
{
box-shadow
:
none
;
color
:
#000
;
box-shadow
:
none
;
color
:
#000
;
border-bottom
:
0
;
height
:
35px
;
}
...
...
@@ -566,7 +575,7 @@ form.sendXMPPMessage {
padding
:
1px
2px
1px
1px
;
}
/* status dropdown styles */
/* status dropdown styles */
dl
.dropdown
{
margin-right
:
0.5em
;
}
...
...
@@ -582,7 +591,7 @@ input.custom-xmpp-status {
}
#fancy-xmpp-status-select
{
border
:
1px
solid
#ddd
;
border
:
1px
solid
#ddd
;
height
:
22px
;
}
...
...
@@ -590,43 +599,43 @@ input.custom-xmpp-status {
cursor
:
pointer
;
display
:
block
;
padding
:
5px
;
}
.dropdown
dd
ul
{
list-style
:
none
;
padding
:
5px
0
;
position
:
absolute
;
left
:
0
;
top
:
0
;
border
:
1px
solid
#ddd
;
.dropdown
dd
ul
{
list-style
:
none
;
padding
:
5px
0
;
position
:
absolute
;
left
:
0
;
top
:
0
;
border
:
1px
solid
#ddd
;
border-top
:
0
;
width
:
99%
;
background-color
:
#FFF
;
z-index
:
4
;
}
.dropdown
dd
ul
li
a
:hover
{
.dropdown
dd
ul
li
a
:hover
{
background-color
:
#bed6e5
;
}
.dropdown
span
.value
{
.dropdown
span
.value
{
display
:
none
;
}
.dropdown
dd
ul
li
a
{
padding
:
5px
5px
5px
30px
;
.dropdown
dd
ul
li
a
{
padding
:
5px
5px
5px
30px
;
display
:
block
;
}
.dropdown
a
.online
{
background
:
url(images/user_online_panel.png)
no-repeat
left
;
.dropdown
a
.online
{
background
:
url(images/user_online_panel.png)
no-repeat
left
;
}
.dropdown
a
.offline
{
background
:
url(images/user_offline_panel.png)
no-repeat
left
;
.dropdown
a
.offline
{
background
:
url(images/user_offline_panel.png)
no-repeat
left
;
}
.dropdown
a
.busy
{
background
:
url(images/user_busy_panel.png)
no-repeat
left
;
.dropdown
a
.busy
{
background
:
url(images/user_busy_panel.png)
no-repeat
left
;
}
.dropdown
a
.away
{
background
:
url(images/user_away_panel.png)
no-repeat
left
;
.dropdown
a
.away
{
background
:
url(images/user_away_panel.png)
no-repeat
left
;
}
converse.js
View file @
083f76b7
...
...
@@ -14,7 +14,7 @@
if
(
console
===
undefined
||
console
.
log
===
undefined
)
{
console
=
{
log
:
function
()
{},
error
:
function
()
{}
};
}
if
(
typeof
define
===
'
function
'
&&
define
.
amd
)
{
if
(
typeof
define
===
'
function
'
&&
define
.
amd
)
{
require
.
config
({
// paths: {
// "patterns": "Libraries/Patterns"
...
...
@@ -25,7 +25,7 @@
//These script dependencies should be loaded before loading
//backbone.js
deps
:
[
'
Libraries/underscore
'
,
'
Libraries/underscore
'
,
'
jquery
'
],
//Once loaded, use the global 'Backbone' as the
//module value.
...
...
@@ -44,7 +44,6 @@
define
([
"
Libraries/burry.js/burry
"
,
"
Libraries/underscore.string
"
,
"
Libraries/jquery.tinysort
"
,
"
Libraries/jquery-ui-1.9.1.custom
"
,
"
Libraries/sjcl
"
,
...
...
@@ -63,7 +62,7 @@
return
factory
(
jQuery
,
store
,
_
,
console
);
}
);
}
else
{
}
else
{
// Browser globals
var
store
=
new
Burry
.
Store
(
'
collective.xmpp.chat
'
);
_
.
templateSettings
=
{
...
...
@@ -85,15 +84,38 @@
pad
=
function
(
num
)
{
return
(
num
<
10
)
?
'
0
'
+
num
:
''
+
num
;
};
return
date
.
getUTCFullYear
()
+
'
-
'
+
pad
(
date
.
getUTCMonth
()
+
1
)
+
'
-
'
+
pad
(
date
.
getUTCDate
())
+
'
T
'
+
pad
(
date
.
getUTCHours
())
+
'
:
'
+
pad
(
date
.
getUTCMinutes
())
+
'
:
'
+
pad
(
date
.
getUTCSeconds
())
+
'
.000Z
'
;
return
date
.
getUTCFullYear
()
+
'
-
'
+
pad
(
date
.
getUTCMonth
()
+
1
)
+
'
-
'
+
pad
(
date
.
getUTCDate
())
+
'
T
'
+
pad
(
date
.
getUTCHours
())
+
'
:
'
+
pad
(
date
.
getUTCMinutes
())
+
'
:
'
+
pad
(
date
.
getUTCSeconds
())
+
'
.000Z
'
;
}
};
xmppchat
.
parseISO8601
=
function
(
datestr
)
{
/* Parses string formatted as 2013-02-14T11:27:08.268Z to a Date obj.
*/
var
numericKeys
=
[
1
,
4
,
5
,
6
,
7
,
10
,
11
],
struct
=
/^
\s
*
(\d{4})
-
(\d{2})
-
(\d{2})
T
(\d{2})
:
(\d{2})
:
(\d{2}\.?\d
*
)
Z
\s
*$/
.
exec
(
datestr
),
minutesOffset
=
0
;
for
(
var
i
=
0
,
k
;
(
k
=
numericKeys
[
i
]);
++
i
)
{
struct
[
k
]
=
+
struct
[
k
]
||
0
;
}
// allow undefined days and months
struct
[
2
]
=
(
+
struct
[
2
]
||
1
)
-
1
;
struct
[
3
]
=
+
struct
[
3
]
||
1
;
if
(
struct
[
8
]
!==
'
Z
'
&&
struct
[
9
]
!==
undefined
)
{
minutesOffset
=
struct
[
10
]
*
60
+
struct
[
11
];
if
(
struct
[
9
]
===
'
+
'
)
{
minutesOffset
=
0
-
minutesOffset
;
}
}
return
new
Date
(
Date
.
UTC
(
struct
[
1
],
struct
[
2
],
struct
[
3
],
struct
[
4
],
struct
[
5
]
+
minutesOffset
,
struct
[
6
],
struct
[
7
]));
};
xmppchat
.
updateMsgCounter
=
function
()
{
this
.
msg_counter
+=
1
;
if
(
this
.
msg_counter
>
0
)
{
...
...
@@ -110,7 +132,7 @@
};
xmppchat
.
collections
=
{
/* FIXME: XEP-0136 specifies 'urn:xmpp:archive' but the mod_archive_odbc
/* FIXME: XEP-0136 specifies 'urn:xmpp:archive' but the mod_archive_odbc
* add-on for ejabberd wants the URL below. This might break for other
* Jabber servers.
*/
...
...
@@ -128,17 +150,17 @@
.
c
(
'
max
'
)
.
t
(
'
1
'
);
xmppchat
.
connection
.
sendIQ
(
iq
,
xmppchat
.
connection
.
sendIQ
(
iq
,
callback
,
function
()
{
console
.
log
(
'
Error while retrieving collections
'
);
function
()
{
console
.
log
(
'
Error while retrieving collections
'
);
});
};
xmppchat
.
collections
.
getLastMessages
=
function
(
jid
,
callback
)
{
var
that
=
this
;
this
.
getLastCollection
(
jid
,
function
(
result
)
{
// Retrieve the last page of a collection (max 30 elements).
// Retrieve the last page of a collection (max 30 elements).
var
$collection
=
$
(
result
).
find
(
'
chat
'
),
jid
=
$collection
.
attr
(
'
with
'
),
start
=
$collection
.
attr
(
'
start
'
),
...
...
@@ -197,7 +219,7 @@
getOpenChats
:
function
()
{
var
key
=
hex_sha1
(
this
.
get
(
'
own_jid
'
)
+
'
-open-chats
'
),
chats
=
store
.
get
(
key
)
||
[],
chats
=
store
.
get
(
key
)
||
[],
decrypted_chats
=
[],
i
;
...
...
@@ -234,7 +256,7 @@
store
.
flush
();
}
});
xmppchat
.
ChatBox
=
Backbone
.
Model
.
extend
({
initialize
:
function
()
{
this
.
set
({
...
...
@@ -258,15 +280,15 @@
},
message_template
:
_
.
template
(
'
<div class="chat-message {{extra_classes}}">
'
+
'
<span class="chat-message-{{sender}}">{{time}} {{username}}: </span>
'
+
'
<span class="chat-message-content">{{message}}</span>
'
+
'
<div class="chat-message {{extra_classes}}">
'
+
'
<span class="chat-message-{{sender}}">{{time}} {{username}}: </span>
'
+
'
<span class="chat-message-content">{{message}}</span>
'
+
'
</div>
'
),
action_template
:
_
.
template
(
'
<div class="chat-message {{extra_classes}}">
'
+
'
<span class="chat-message-{{sender}}">{{time}}: </span>
'
+
'
<span class="chat-message-content">{{message}}</span>
'
+
'
<div class="chat-message {{extra_classes}}">
'
+
'
<span class="chat-message-{{sender}}">{{time}}: </span>
'
+
'
<span class="chat-message-content">{{message}}</span>
'
+
'
</div>
'
),
autoLink
:
function
(
text
)
{
...
...
@@ -279,7 +301,7 @@
var
now
=
new
Date
(),
time
=
now
.
toLocaleTimeString
().
substring
(
0
,
5
),
minutes
=
now
.
getMinutes
().
toString
(),
$chat_content
=
$
(
this
.
el
)
.
find
(
'
.chat-content
'
);
$chat_content
=
this
.
$el
.
find
(
'
.chat-content
'
);
var
msg
=
xmppchat
.
storage
.
getLastMessage
(
this
.
model
.
get
(
'
jid
'
));
if
(
typeof
msg
!==
'
undefined
'
)
{
...
...
@@ -293,9 +315,9 @@
if
(
minutes
.
length
==
1
)
{
minutes
=
'
0
'
+
minutes
;}
$chat_content
.
find
(
'
div.chat-event
'
).
remove
();
$chat_content
.
append
(
this
.
message_template
({
'
sender
'
:
'
me
'
,
'
time
'
:
time
,
'
message
'
:
message
,
'
sender
'
:
'
me
'
,
'
time
'
:
time
,
'
message
'
:
message
,
'
username
'
:
'
me
'
,
'
extra_classes
'
:
''
}));
...
...
@@ -310,14 +332,14 @@
},
messageReceived
:
function
(
message
)
{
/* XXX: event.mtype should be 'xhtml' for XHTML-IM messages,
but I only seem to get 'text'.
/* XXX: event.mtype should be 'xhtml' for XHTML-IM messages,
but I only seem to get 'text'.
*/
var
body
=
this
.
autoLink
(
$message
.
children
(
'
body
'
).
text
()),
from
=
Strophe
.
getBareJidFromJid
(
$message
.
attr
(
'
from
'
)),
to
=
$message
.
attr
(
'
to
'
),
composing
=
$message
.
find
(
'
composing
'
),
$chat_content
=
$
(
this
.
el
)
.
find
(
'
.chat-content
'
),
$chat_content
=
this
.
$el
.
find
(
'
.chat-content
'
),
delayed
=
$message
.
find
(
'
delay
'
).
length
>
0
,
fullname
=
this
.
model
.
get
(
'
fullname
'
),
time
,
stamp
,
username
,
sender
;
...
...
@@ -347,13 +369,13 @@
// XXX: Test properly (for really old messages we somehow need to show
// their date as well)
stamp
=
$message
.
find
(
'
delay
'
).
attr
(
'
stamp
'
);
time
=
(
new
Date
(
stamp
)).
toLocaleTimeString
().
substring
(
0
,
5
);
time
=
(
new
Date
(
stamp
)).
toLocaleTimeString
().
substring
(
0
,
5
);
}
else
{
time
=
(
new
Date
()).
toLocaleTimeString
().
substring
(
0
,
5
);
time
=
(
new
Date
()).
toLocaleTimeString
().
substring
(
0
,
5
);
}
$chat_content
.
append
(
this
.
message_template
({
'
sender
'
:
sender
,
'
sender
'
:
sender
,
'
time
'
:
time
,
'
message
'
:
body
,
'
username
'
:
username
,
...
...
@@ -370,11 +392,11 @@
insertClientStoredMessages
:
function
()
{
var
msgs
=
xmppchat
.
storage
.
getMessages
(
this
.
model
.
get
(
'
jid
'
)),
$content
=
this
.
$el
.
find
(
'
.chat-content
'
),
prev_date
,
this_date
,
now
,
separator
,
i
;
$content
=
this
.
$el
.
find
(
'
.chat-content
'
),
prev_date
,
this_date
,
now
,
separator
,
i
;
for
(
i
=
0
;
i
<
_
.
size
(
msgs
);
i
++
)
{
var
msg
=
msgs
[
i
],
var
msg
=
msgs
[
i
],
msg_array
=
msg
.
split
(
'
'
,
2
),
date
=
msg_array
[
0
];
...
...
@@ -395,16 +417,16 @@
if
(
msg_array
[
1
]
==
'
to
'
)
{
$content
.
append
(
this
.
message_template
({
'
sender
'
:
'
me
'
,
'
sender
'
:
'
me
'
,
'
time
'
:
this_date
.
toLocaleTimeString
().
substring
(
0
,
5
),
'
message
'
:
msg
,
'
message
'
:
msg
,
'
username
'
:
'
me
'
,
'
extra_classes
'
:
'
delayed
'
}));
}
else
{
$content
.
append
(
this
.
message_template
({
'
sender
'
:
'
them
'
,
'
sender
'
:
'
them
'
,
'
time
'
:
this_date
.
toLocaleTimeString
().
substring
(
0
,
5
),
'
message
'
:
msg
,
'
username
'
:
this
.
model
.
get
(
'
fullname
'
).
split
(
'
'
)[
0
],
...
...
@@ -414,25 +436,35 @@
}
},
addHelpMessages
:
function
(
msgs
)
{
var
$chat_content
=
this
.
$el
.
find
(
'
.chat-content
'
),
i
;
for
(
i
=
0
;
i
<
msgs
.
length
;
i
++
)
{
$chat_content
.
append
(
$
(
'
<div class="chat-help">
'
+
msgs
[
i
]
+
'
</div>
'
));
}
this
.
scrolldown
();
},
sendMessage
:
function
(
text
)
{
// TODO: Look in ChatPartners to see what resources we have for the recipient.
// if we have one resource, we sent to only that resources, if we have multiple
// we send to the bare jid.
var
timestamp
=
(
new
Date
()).
getTime
(),
bare_jid
=
this
.
model
.
get
(
'
jid
'
),
match
=
text
.
replace
(
/^
\s
*/
,
""
).
match
(
/^
\/(
.*
)\s
*$/
),
el
,
$chat_content
;
match
=
text
.
replace
(
/^
\s
*/
,
""
).
match
(
/^
\/(
.*
)\s
*$/
),
el
,
$chat_content
,
msgs
;
if
(
match
)
{
if
(
match
[
1
]
===
"
clear
"
)
{
$
(
this
.
el
)
.
find
(
'
.chat-content
'
).
empty
();
this
.
$el
.
find
(
'
.chat-content
'
).
empty
();
xmppchat
.
storage
.
clearMessages
(
bare_jid
);
return
;
}
else
if
(
match
[
1
]
===
"
help
"
)
{
$chat_content
=
$
(
this
.
el
).
find
(
'
.chat-content
'
);
$chat_content
.
append
(
$
(
'
<div class="chat-help"><strong>/help</strong>: Show this menu</div>
'
));
$chat_content
.
append
(
$
(
'
<div class="chat-help"><strong>/clear</strong>: Remove messages</div>
'
));
this
.
scrolldown
();
msgs
=
[
'
<strong>/help</strong>: Show this menu
'
,
'
<strong>/clear</strong>: Remove messages
'
];
this
.
addHelpMessages
(
msgs
);
return
;
}
}
...
...
@@ -467,14 +499,19 @@
if
(
message
!==
''
)
{
this
.
sendMessage
(
message
);
}
$
(
this
.
el
)
.
data
(
'
composing
'
,
false
);
this
.
$el
.
data
(
'
composing
'
,
false
);
}
else
{
composing
=
$
(
this
.
el
).
data
(
'
composing
'
);
if
(
!
composing
)
{
notify
=
$msg
({
'
to
'
:
this
.
model
.
get
(
'
jid
'
),
'
type
'
:
'
chat
'
})
.
c
(
'
composing
'
,
{
'
xmlns
'
:
'
http://jabber.org/protocol/chatstates
'
});
xmppchat
.
connection
.
send
(
notify
);
$
(
this
.
el
).
data
(
'
composing
'
,
true
);
composing
=
this
.
$el
.
data
(
'
composing
'
);
if
(
!
composing
)
{
if
(
ev
.
keyCode
!=
47
)
{
// We don't send composing messages if the message
// starts with forward-slash.
notify
=
$msg
({
'
to
'
:
this
.
model
.
get
(
'
jid
'
),
'
type
'
:
'
chat
'
})
.
c
(
'
composing
'
,
{
'
xmlns
'
:
'
http://jabber.org/protocol/chatstates
'
});
xmppchat
.
connection
.
send
(
notify
);
this
.
$el
.
data
(
'
composing
'
,
true
);
}
this
.
$el
.
data
(
'
composing
'
,
true
);
}
}
},
...
...
@@ -527,7 +564,7 @@
'
</a>
'
+
'
<p class="user-custom-message"><p/>
'
+
'
</div>
'
+
'
<div class="chat-content"></div>
'
+
'
<div class="chat-content"></div>
'
+
'
<form class="sendXMPPMessage" action="" method="post">
'
+
'
<textarea
'
+
'
type="text"
'
+
...
...
@@ -536,18 +573,18 @@
'
</form>
'
),
render
:
function
()
{
$
(
this
.
el
)
.
attr
(
'
id
'
,
this
.
model
.
get
(
'
box_id
'
));
$
(
this
.
el
)
.
html
(
this
.
template
(
this
.
model
.
toJSON
()));
this
.
$el
.
attr
(
'
id
'
,
this
.
model
.
get
(
'
box_id
'
));
this
.
$el
.
html
(
this
.
template
(
this
.
model
.
toJSON
()));
this
.
insertClientStoredMessages
();
return
this
;
},
isVisible
:
function
()
{
return
$
(
this
.
el
)
.
is
(
'
:visible
'
);
return
this
.
$el
.
is
(
'
:visible
'
);
},
focus
:
function
()
{
$
(
this
.
el
)
.
find
(
'
.chat-textarea
'
).
focus
();
this
.
$el
.
find
(
'
.chat-textarea
'
).
focus
();
return
this
;
},
...
...
@@ -614,7 +651,7 @@
$
.
getJSON
(
portal_url
+
"
/search-users?q=
"
+
$
(
ev
.
target
).
find
(
'
input.username
'
).
val
(),
function
(
data
)
{
var
$results_el
=
$
(
'
#found-users
'
);
$
(
data
).
each
(
function
(
idx
,
obj
)
{
if
(
$results_el
.
children
().
length
>
0
)
{
if
(
$results_el
.
children
().
length
>
0
)
{
$results_el
.
empty
();
}
$results_el
.
append
(
...
...
@@ -683,7 +720,7 @@
updateRoomsList
:
function
()
{
xmppchat
.
connection
.
muc
.
listRooms
(
xmppchat
.
connection
.
muc_domain
,
$
.
proxy
(
function
(
iq
)
{
var
room
,
name
,
jid
,
i
,
var
room
,
name
,
jid
,
i
,
rooms
=
$
(
iq
).
find
(
'
query
'
).
find
(
'
item
'
);
this
.
$el
.
find
(
'
#available-chatrooms
'
).
find
(
'
dd.available-chatroom
'
).
remove
();
if
(
rooms
.
length
)
{
...
...
@@ -706,7 +743,7 @@
if
(
ev
.
type
===
'
click
'
)
{
jid
=
$
(
ev
.
target
).
attr
(
'
data-room-jid
'
);
}
else
{
name
=
_
.
str
.
strip
(
$
(
ev
.
target
).
find
(
'
input.new-chatroom-name
'
).
val
()
).
toLowerCase
();
name
=
$
(
ev
.
target
).
find
(
'
input.new-chatroom-name
'
).
val
().
trim
(
).
toLowerCase
();
if
(
name
)
{
jid
=
Strophe
.
escapeNode
(
name
)
+
'
@
'
+
xmppchat
.
connection
.
muc_domain
;
}
else
{
...
...
@@ -761,7 +798,7 @@
$tab_panel
=
$
(
$tab
.
attr
(
'
href
'
)),
$sibling_panel
=
$
(
$sibling
.
attr
(
'
href
'
));
$sibling_panel
.
fadeOut
(
'
fast
'
,
function
()
{
$sibling_panel
.
fadeOut
(
'
fast
'
,
function
()
{
$sibling
.
removeClass
(
'
current
'
);
$tab
.
addClass
(
'
current
'
);
$tab_panel
.
fadeIn
(
'
fast
'
,
function
()
{
...
...
@@ -769,6 +806,11 @@
});
},
addHelpMessages
:
function
(
msgs
)
{
// Override addHelpMessages in ChatBoxView, for now do nothing.
return
;
},
render
:
function
()
{
var
that
=
this
;
this
.
$el
.
hide
(
'
fast
'
,
function
()
{
...
...
@@ -803,8 +845,8 @@
closeChatRoom
:
function
()
{
this
.
closeChat
();
xmppchat
.
connection
.
muc
.
leave
(
this
.
model
.
get
(
'
jid
'
),
this
.
model
.
get
(
'
nick
'
),
this
.
model
.
get
(
'
jid
'
),
this
.
model
.
get
(
'
nick
'
),
this
.
onLeave
,
undefined
);
delete
xmppchat
.
chatboxesview
.
views
[
this
.
model
.
get
(
'
jid
'
)];
...
...
@@ -824,12 +866,13 @@
message
=
message
.
replace
(
/^
\s
+|
\s
+jQuery/g
,
""
);
$textarea
.
val
(
''
).
focus
();
if
(
message
!==
''
)
{
this
.
send
Group
Message
(
message
);
this
.
send
ChatRoom
Message
(
message
);
}
}
}
},
sendGroupMessage
:
function
(
body
)
{
sendChatRoomMessage
:
function
(
body
)
{
this
.
appendMessage
(
body
);
var
match
=
body
.
replace
(
/^
\s
*/
,
""
).
match
(
/^
\/(
.*
?)(?:
(
.*
))?
$/
)
||
[
false
];
switch
(
match
[
1
])
{
case
'
msg
'
:
...
...
@@ -851,7 +894,7 @@
xmppchat
.
connection
.
muc
.
deop
(
this
.
model
.
get
(
'
jid
'
),
match
[
2
]);
break
;
case
'
help
'
:
$chat_content
=
$
(
this
.
el
)
.
find
(
'
.chat-content
'
);
$chat_content
=
this
.
$el
.
find
(
'
.chat-content
'
);
$chat_content
.
append
(
$
(
'
<div class="chat-help"><strong>/help</strong>: Show this menu</div>
'
));
$chat_content
.
append
(
$
(
'
<div class="chat-help"><strong>/topic</strong>: Set chatroom topic</div>
'
));
/* TODO:
...
...
@@ -893,9 +936,9 @@
xmppchat
.
connection
.
muc
.
join
(
this
.
model
.
get
(
'
jid
'
),
this
.
model
.
get
(
'
nick
'
),
$
.
proxy
(
this
.
onMessage
,
this
),
$
.
proxy
(
this
.
onPresence
,
this
),
$
.
proxy
(
this
.
onRoster
,
this
));
$
.
proxy
(
this
.
on
ChatRoom
Message
,
this
),
$
.
proxy
(
this
.
on
ChatRoom
Presence
,
this
),
$
.
proxy
(
this
.
on
ChatRoom
Roster
,
this
));
},
onLeave
:
function
()
{
...
...
@@ -905,7 +948,7 @@
}
},
onPresence
:
function
(
presence
,
room
)
{
on
ChatRoom
Presence
:
function
(
presence
,
room
)
{
var
nick
=
room
.
nick
,
from
=
$
(
presence
).
attr
(
'
from
'
);
if
(
$
(
presence
).
attr
(
'
type
'
)
!==
'
error
'
)
{
...
...
@@ -920,11 +963,11 @@
return
true
;
},
onMessage
:
function
(
message
)
{
on
ChatRoom
Message
:
function
(
message
)
{
var
body
=
$
(
message
).
children
(
'
body
'
).
text
(),
jid
=
$
(
message
).
attr
(
'
from
'
),
composing
=
$
(
message
).
find
(
'
composing
'
),
$chat_content
=
$
(
this
.
el
)
.
find
(
'
.chat-content
'
),
$chat_content
=
this
.
$el
.
find
(
'
.chat-content
'
),
sender
=
Strophe
.
unescapeNode
(
Strophe
.
getResourceFromJid
(
jid
)),
subject
=
$
(
message
).
children
(
'
subject
'
).
text
();
...
...
@@ -938,7 +981,8 @@
}
}
else
{
if
(
sender
===
this
.
model
.
get
(
'
nick
'
))
{
this
.
appendMessage
(
body
);
// Our own message which is already appended
return
true
;
}
else
{
$chat_content
.
find
(
'
div.chat-event
'
).
remove
();
...
...
@@ -947,16 +991,16 @@
body
=
body
.
replace
(
/^
\/
me/
,
'
*
'
+
sender
);
$chat_content
.
append
(
this
.
action_template
({
'
sender
'
:
'
room
'
,
'
sender
'
:
'
room
'
,
'
time
'
:
(
new
Date
()).
toLocaleTimeString
().
substring
(
0
,
5
),
'
message
'
:
body
,
'
message
'
:
body
,
'
username
'
:
sender
,
'
extra_classes
'
:
(
$
(
message
).
find
(
'
delay
'
).
length
>
0
)
&&
'
delayed
'
||
''
}));
}
else
{
$chat_content
.
append
(
this
.
message_template
({
'
sender
'
:
'
room
'
,
'
sender
'
:
'
room
'
,
'
time
'
:
(
new
Date
()).
toLocaleTimeString
().
substring
(
0
,
5
),
'
message
'
:
body
,
'
username
'
:
sender
,
...
...
@@ -969,7 +1013,7 @@
return
true
;
},
onRoster
:
function
(
roster
,
room
)
{
on
ChatRoom
Roster
:
function
(
roster
,
room
)
{
var
controlboxview
=
xmppchat
.
chatboxesview
.
views
.
controlbox
,
i
;
...
...
@@ -991,8 +1035,8 @@
},
render
:
function
()
{
$
(
this
.
el
)
.
attr
(
'
id
'
,
this
.
model
.
get
(
'
box_id
'
));
$
(
this
.
el
)
.
html
(
this
.
template
(
this
.
model
.
toJSON
()));
this
.
$el
.
attr
(
'
id
'
,
this
.
model
.
get
(
'
box_id
'
));
this
.
$el
.
html
(
this
.
template
(
this
.
model
.
toJSON
()));
return
this
;
}
});
...
...
@@ -1012,7 +1056,7 @@
}
_
.
each
(
open_chats
,
$
.
proxy
(
function
(
jid
)
{
if
(
jid
!=
'
controlbox
'
)
{
if
(
_
.
str
.
include
(
jid
,
xmppchat
.
connection
.
muc_domain
))
{
if
(
str
include
(
jid
,
xmppchat
.
connection
.
muc_domain
))
{
this
.
createChatBox
(
jid
);
}
else
{
this
.
openChat
(
jid
);
...
...
@@ -1020,11 +1064,11 @@
}
},
this
));
},
isChatRoom
:
function
(
jid
)
{
return
Strophe
.
getDomainFromJid
(
jid
)
===
xmppchat
.
connection
.
muc_domain
;
},
createChatBox
:
function
(
jid
,
data
)
{
var
box
,
view
;
if
(
this
.
isChatRoom
(
jid
))
{
...
...
@@ -1034,14 +1078,14 @@
});
}
else
{
box
=
new
xmppchat
.
ChatBox
({
'
id
'
:
jid
,
'
jid
'
:
jid
,
'
fullname
'
:
data
.
fullname
,
'
id
'
:
jid
,
'
jid
'
:
jid
,
'
fullname
'
:
data
.
fullname
,
'
portrait_url
'
:
data
.
portrait_url
,
'
user_profile_url
'
:
data
.
user_profile_url
});
view
=
new
xmppchat
.
ChatBoxView
({
model
:
box
model
:
box
});
}
this
.
views
[
jid
]
=
view
.
render
();
...
...
@@ -1068,7 +1112,7 @@
$
.
getJSON
(
portal_url
+
"
/xmpp-userinfo?user_id=
"
+
Strophe
.
getNodeFromJid
(
jid
),
$
.
proxy
(
function
(
data
)
{
view
=
this
.
createChatBox
(
jid
,
data
);
},
this
));
}
}
},
showChat
:
function
(
jid
)
{
...
...
@@ -1081,8 +1125,8 @@
view
.
scrolldown
();
view
.
focus
();
}
view
.
saveChatToStorage
();
}
view
.
saveChatToStorage
();
return
view
;
},
...
...
@@ -1172,7 +1216,7 @@
'
bare_jid
'
:
Strophe
.
getBareJidFromJid
(
jid
),
'
user_id
'
:
user_id
,
'
subscription
'
:
subscription
,
'
fullname
'
:
name
,
'
fullname
'
:
name
,
'
resources
'
:
[],
'
presence_type
'
:
'
offline
'
,
'
status
'
:
'
offline
'
...
...
@@ -1251,15 +1295,14 @@
ask
=
item
.
get
(
'
ask
'
),
that
=
this
,
subscription
=
item
.
get
(
'
subscription
'
);
$
(
this
.
el
).
addClass
(
item
.
get
(
'
presence_type
'
));
this
.
$el
.
addClass
(
item
.
get
(
'
presence_type
'
));
if
(
ask
===
'
subscribe
'
)
{
this
.
$el
.
addClass
(
'
pending-xmpp-contact
'
);
$
(
this
.
el
)
.
html
(
this
.
pending_template
(
item
.
toJSON
()));
this
.
$el
.
html
(
this
.
pending_template
(
item
.
toJSON
()));
}
else
if
(
ask
===
'
request
'
)
{
this
.
$el
.
addClass
(
'
requesting-xmpp-contact
'
);
$
(
this
.
el
)
.
html
(
this
.
request_template
(
item
.
toJSON
()));
this
.
$el
.
html
(
this
.
request_template
(
item
.
toJSON
()));
this
.
$el
.
delegate
(
'
button.accept-xmpp-request
'
,
'
click
'
,
function
(
ev
)
{
ev
.
preventDefault
();
that
.
acceptRequest
();
...
...
@@ -1277,7 +1320,7 @@
that
.
openChat
();
});
}
// Event handlers
this
.
$el
.
delegate
(
'
a.remove-xmpp-contact
'
,
'
click
'
,
function
(
ev
)
{
ev
.
preventDefault
();
...
...
@@ -1289,7 +1332,7 @@
initialize
:
function
()
{
this
.
options
.
model
.
on
(
'
change
'
,
function
(
item
,
changed
)
{
if
(
_
.
has
(
changed
.
changes
,
'
presence_type
'
))
{
$
(
this
.
el
)
.
attr
(
'
class
'
,
item
.
changed
.
presence_type
);
this
.
$el
.
attr
(
'
class
'
,
item
.
changed
.
presence_type
);
}
},
this
);
}
...
...
@@ -1305,7 +1348,7 @@
var
presence_type
=
rosteritem
.
get
(
'
presence_type
'
),
rank
=
4
;
switch
(
presence_type
)
{
case
'
offline
'
:
case
'
offline
'
:
rank
=
0
;
break
;
case
'
unavailable
'
:
...
...
@@ -1354,7 +1397,7 @@
model
.
options
=
options
||
{};
this
.
add
(
model
);
},
addResource
:
function
(
bare_jid
,
resource
)
{
var
item
=
this
.
getItem
(
bare_jid
),
resources
;
...
...
@@ -1446,13 +1489,13 @@
if
(
this
.
isSelf
(
bare_jid
))
{
if
(
xmppchat
.
connection
.
jid
!=
jid
)
{
// Another resource has changed it's status, we'll update ours as well.
// FIXME: We should ideally differentiate between converse.js using
// FIXME: We should ideally differentiate between converse.js using
// resources and other resources (i.e Pidgin etc.)
xmppchat
.
xmppstatus
.
set
({
'
status
'
:
presence_type
});
}
}
return
true
;
}
else
if
((
$
(
presence
).
find
(
'
x
'
).
attr
(
'
xmlns
'
)
||
''
).
indexOf
(
Strophe
.
NS
.
MUC
)
===
0
)
{
return
true
;
// Ignore MUC
return
true
;
// Ignore MUC
}
if
((
status_message
.
length
>
0
)
&&
(
status_message
.
text
()
&&
(
presence_type
!==
'
unavailable
'
)))
{
...
...
@@ -1497,10 +1540,10 @@
}
}
else
if
(
presence_type
===
'
unsubscribed
'
)
{
/* Upon receiving the presence stanza of type "unsubscribed",
* the user SHOULD acknowledge receipt of that subscription state
* notification by sending a presence stanza of type "unsubscribe"
* this step lets the user's server know that it MUST no longer
/* Upon receiving the presence stanza of type "unsubscribed",
* the user SHOULD acknowledge receipt of that subscription state
* notification by sending a presence stanza of type "unsubscribe"
* this step lets the user's server know that it MUST no longer
* send notification of the subscription state change to the user.
*/
xmppchat
.
xmppstatus
.
sendPresence
(
'
unsubscribe
'
);
...
...
@@ -1508,7 +1551,7 @@
xmppchat
.
chatboxesview
.
controlbox
.
roster
.
remove
(
bare_jid
);
xmppchat
.
connection
.
roster
.
remove
(
bare_jid
);
}
}
else
{
}
else
{
if
((
presence_type
===
undefined
)
&&
(
show
))
{
if
(
show
.
text
()
===
'
chat
'
)
{
presence_type
=
'
online
'
;
...
...
@@ -1742,7 +1785,7 @@
updateStatusUI
:
function
(
ev
)
{
var
stat
=
ev
.
get
(
'
status
'
),
status_message
=
ev
.
get
(
'
status_message
'
)
||
"
I am
"
+
stat
;
$
(
this
.
el
)
.
find
(
'
#fancy-xmpp-status-select
'
).
html
(
this
.
$el
.
find
(
'
#fancy-xmpp-status-select
'
).
html
(
this
.
status_template
({
'
presence_type
'
:
stat
,
'
status_message
'
:
status_message
...
...
@@ -1767,20 +1810,20 @@
initialize
:
function
()
{
// Replace the default dropdown with something nicer
// -------------------------------------------------
var
$select
=
$
(
this
.
el
)
.
find
(
'
select#select-xmpp-status
'
),
var
$select
=
this
.
$el
.
find
(
'
select#select-xmpp-status
'
),
presence_type
=
this
.
model
.
getStatus
()
||
'
offline
'
,
options
=
$
(
'
option
'
,
$select
),
that
=
this
;
$
(
this
.
el
)
.
html
(
this
.
choose_template
());
$
(
this
.
el
)
.
find
(
'
#fancy-xmpp-status-select
'
)
this
.
$el
.
html
(
this
.
choose_template
());
this
.
$el
.
find
(
'
#fancy-xmpp-status-select
'
)
.
html
(
this
.
status_template
({
'
status_message
'
:
"
I am
"
+
presence_type
,
'
presence_type
'
:
presence_type
'
presence_type
'
:
presence_type
}));
// iterate through all the <option> elements and create UL
options
.
each
(
function
(){
$
(
that
.
el
).
find
(
"
#target dd ul
"
).
append
(
that
.
option_template
({
'
value
'
:
$
(
this
).
val
(),
'
value
'
:
$
(
this
).
val
(),
'
text
'
:
$
(
this
).
text
()
})).
hide
();
});
...
...
@@ -1788,7 +1831,7 @@
// Listen for status change on the model and initialize
// ----------------------------------------------------
this
.
options
.
model
.
on
(
"
change
"
,
$
.
proxy
(
this
.
updateStatusUI
,
this
));
this
.
options
.
model
.
on
(
"
change
"
,
$
.
proxy
(
this
.
updateStatusUI
,
this
));
this
.
model
.
initStatus
();
}
});
...
...
@@ -1796,7 +1839,8 @@
// Event handlers
// --------------
$
(
document
).
ready
(
$
.
proxy
(
function
()
{
var
chatdata
=
jQuery
(
'
div#collective-xmpp-chat-data
'
),
var
chatdata
=
$
(
'
div#collective-xmpp-chat-data
'
),
$connecting
=
$
(
'
span#connecting-to-chat
'
),
$toggle
=
$
(
'
a#toggle-online-users
'
);
$toggle
.
unbind
(
'
click
'
);
...
...
@@ -1809,6 +1853,8 @@
}).
render
();
$
(
document
).
bind
(
'
jarnxmpp.disconnected
'
,
$
.
proxy
(
function
(
ev
,
conn
)
{
$connecting
.
show
();
$toggle
.
hide
();
console
.
log
(
"
Connection Failed :(
"
);
},
this
));
...
...
@@ -1825,13 +1871,12 @@
this
.
chatboxes
=
new
this
.
ChatBoxes
();
this
.
chatboxesview
=
new
this
.
ChatBoxesView
({
'
model
'
:
this
.
chatboxes
});
this
.
connection
.
addHandler
(
$
.
proxy
(
this
.
roster
.
subscribeToSuggestedItems
,
this
.
roster
),
$
.
proxy
(
this
.
roster
.
subscribeToSuggestedItems
,
this
.
roster
),
'
http://jabber.org/protocol/rosterx
'
,
'
message
'
,
null
);
this
.
connection
.
roster
.
registerCallback
(
$
.
proxy
(
this
.
roster
.
rosterHandler
,
this
.
roster
),
$
.
proxy
(
this
.
roster
.
rosterHandler
,
this
.
roster
),
null
,
'
presence
'
,
null
);
this
.
connection
.
roster
.
get
(
$
.
proxy
(
function
()
{
...
...
@@ -1842,12 +1887,12 @@
},
this
.
roster
),
null
,
'
presence
'
,
null
);
this
.
connection
.
addHandler
(
$
.
proxy
(
function
(
message
)
{
$
.
proxy
(
function
(
message
)
{
this
.
chatboxesview
.
messageReceived
(
message
);
return
true
;
},
this
),
null
,
'
message
'
,
'
chat
'
);
// XMPP Status
// XMPP Status
this
.
xmppstatus
=
new
this
.
XMPPStatus
();
this
.
xmppstatusview
=
new
this
.
XMPPStatusView
({
'
model
'
:
this
.
xmppstatus
...
...
@@ -1856,6 +1901,8 @@
// Controlbox toggler
if
(
$toggle
.
length
)
{
$connecting
.
hide
();
$toggle
.
show
();
$toggle
.
bind
(
'
click
'
,
$
.
proxy
(
function
(
e
)
{
e
.
preventDefault
();
if
(
$
(
"
div#controlbox
"
).
is
(
'
:visible
'
))
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment