Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/jsxc.nextcloud.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
authorsualko <klaus@jsxc.org>2015-04-29 14:27:28 +0300
committersualko <klaus@jsxc.org>2015-04-29 14:27:28 +0300
commit309bda3fe1924eccaaecc9e23d04ef1139a0a182 (patch)
treeee35359247d365c48b05a724c49ff4da3888c308 /build
parent59bbf68e8c722a15b74b1587aa9d8a96920dec01 (diff)
build v2.0.0-beta1
Diffstat (limited to 'build')
-rw-r--r--build/ajax/getUsers.php11
-rw-r--r--build/appinfo/app.php39
-rw-r--r--build/appinfo/routes.php5
-rw-r--r--build/css/jquery.colorbox.css43
-rw-r--r--build/css/jquery.mCustomScrollbar.css12
-rw-r--r--build/css/jsxc.oc.css179
-rw-r--r--build/css/jsxc.oc.lte6.css62
-rw-r--r--build/css/log.css95
-rw-r--r--build/css/muc.css43
-rw-r--r--build/js/admin.js2
-rw-r--r--build/js/eof.js2
-rw-r--r--build/js/jsxc/css/jsxc.css102
-rw-r--r--build/js/jsxc/css/jsxc.webrtc.css6
-rw-r--r--build/js/jsxc/img/group_grey.svg59
-rw-r--r--build/js/jsxc/img/group_white.svg58
-rw-r--r--build/js/jsxc/img/resize_gray.svg76
-rw-r--r--build/js/jsxc/jsxc.js10352
-rw-r--r--build/js/jsxc/jsxc.lib.js6243
-rw-r--r--build/js/jsxc/jsxc.lib.webrtc.js1056
-rw-r--r--build/js/jsxc/jsxc.min.js27
-rw-r--r--build/js/jsxc/jsxc.min.js.map2
-rw-r--r--build/js/jsxc/lib/i18next/release/i18next-latest.min.js5
-rw-r--r--build/js/jsxc/lib/jsxc.dep.js38
-rw-r--r--build/js/jsxc/lib/jsxc.dep.min.js35
-rw-r--r--build/js/jsxc/lib/jsxc.dep.min.js.map2
-rw-r--r--build/js/jsxc/lib/translation.js1
-rw-r--r--build/js/ojsxc.js19
27 files changed, 6104 insertions, 12470 deletions
diff --git a/build/ajax/getUsers.php b/build/ajax/getUsers.php
new file mode 100644
index 0000000..f1f1a79
--- /dev/null
+++ b/build/ajax/getUsers.php
@@ -0,0 +1,11 @@
+<?php
+OCP\User::checkLoggedIn ();
+OCP\JSON::callCheck ();
+
+$limit = 10;
+$offset = 0;$users = OC_User::getDisplayNames((string)$_GET['search'], $limit, $offset);
+
+$users = OC_User::getDisplayNames((string)$_GET['search'], $limit, $offset);
+
+OCP\JSON::encodedPrint ( $users );
+?>
diff --git a/build/appinfo/app.php b/build/appinfo/app.php
index 394b85f..5c6d7ed 100644
--- a/build/appinfo/app.php
+++ b/build/appinfo/app.php
@@ -10,38 +10,13 @@
*/
OCP\App::registerAdmin ( 'ojsxc', 'settings' );
-if(defined('DEBUG') && DEBUG === true) {
- // ############# Javascript #############
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jquery.colorbox-min' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jquery.slimscroll' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jquery.fullscreen' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe' );
-
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.muc' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.disco' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.caps' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.vcard' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.jingle/strophe.jingle' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.jingle/strophe.jingle.session' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.jingle/strophe.jingle.sdp' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/strophe.jingle/strophe.jingle.adapter' );
-
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/otr/build/dep/salsa20' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/otr/build/dep/bigint' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/otr/build/dep/crypto' );
- OCP\Util::addScript ( 'ojsxc', 'eof' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/otr/build/dep/eventemitter' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/otr/build/otr' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/jsxc.lib' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/jsxc.lib.webrtc' );
- //OCP\Util::addScript ( 'ojsxc', 'jsxc/jsxc.lib.muc' );
-} else {
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jquery.colorbox-min' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jquery.slimscroll' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jquery.fullscreen' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/lib/jsxc.dep.min' );
- OCP\Util::addScript ( 'ojsxc', 'jsxc/jsxc.min' );
-}
+$jsxc_root = (defined('JSXC_ENV') && JSXC_ENV === 'dev')? 'jsxc/dev/' : 'jsxc/';
+
+OCP\Util::addScript ( 'ojsxc', $jsxc_root.'lib/jquery.colorbox-min' );
+OCP\Util::addScript ( 'ojsxc', $jsxc_root.'lib/jquery.slimscroll' );
+OCP\Util::addScript ( 'ojsxc', $jsxc_root.'lib/jquery.fullscreen' );
+OCP\Util::addScript ( 'ojsxc', $jsxc_root.'lib/jsxc.dep' );
+OCP\Util::addScript ( 'ojsxc', $jsxc_root.'jsxc' );
OCP\Util::addScript ( 'ojsxc', 'ojsxc' );
diff --git a/build/appinfo/routes.php b/build/appinfo/routes.php
index 7d4c523..70b63bf 100644
--- a/build/appinfo/routes.php
+++ b/build/appinfo/routes.php
@@ -18,5 +18,8 @@ $this->create('ojsxc_ajax_setsettings', 'ajax/setsettings.php')
$this->create('ojsxc_ajax_setUserSettings', 'ajax/setUserSettings.php')
->actionInclude('ojsxc/ajax/setUserSettings.php');
+
+$this->create('ojsxc_ajax_getUsers', 'ajax/getUsers.php')
+ ->actionInclude('ojsxc/ajax/getUsers.php');
-?> \ No newline at end of file
+?>
diff --git a/build/css/jquery.colorbox.css b/build/css/jquery.colorbox.css
index 1e25d27..77c1504 100644
--- a/build/css/jquery.colorbox.css
+++ b/build/css/jquery.colorbox.css
@@ -142,38 +142,39 @@
}
#cboxClose {
- position: absolute;
- top: 5px;
- right: 5px;
- display: block;
- opacity: 0.5;
- width: 19px !important;
- height: 19px;
- border: 0px;
- text-indent: -9999px;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ display: block;
+ opacity: 0.5;
+ width: 19px !important;
+ height: 19px;
+ border: 0px;
+ text-indent: -9999px;
+ background-color: #fff;
}
#cboxClose:before {
- content: '×';
- position: absolute;
- top: 0px;
- left: 0px;
- display: block;
- width: 19px;
- height: 19px;
- opacity: 0.5;
- text-indent: 0;
+ content: '×';
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ display: block;
+ width: 19px;
+ height: 19px;
+ opacity: 0.5;
+ text-indent: 0;
text-align: center;
line-height: 19px;
font-size: 19px;
}
#cboxClose:before:hover {
- opacity: 1;
+ opacity: 1;
}
#cboxClose:hover {
- background-position: right center !important;
- opacity: 1.0;
+ background-position: right center !important;
+ opacity: 1.0;
}
/*
diff --git a/build/css/jquery.mCustomScrollbar.css b/build/css/jquery.mCustomScrollbar.css
index 5500776..67d7ab8 100644
--- a/build/css/jquery.mCustomScrollbar.css
+++ b/build/css/jquery.mCustomScrollbar.css
@@ -24,6 +24,8 @@
.mCSB_scrollTools .mCSB_draggerContainer {
height: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
box-sizing: border-box;
}
@@ -35,6 +37,8 @@
width: 2px;
height: 100%;
margin: 0 auto;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
border-radius: 10px;
}
@@ -48,6 +52,8 @@
width: 4px;
height: 100%;
margin: 0 auto;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
border-radius: 10px;
text-align: center;
}
@@ -94,6 +100,8 @@
.mCSB_horizontal .mCSB_scrollTools .mCSB_draggerContainer {
height: 100%;
width: auto;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
}
@@ -108,6 +116,8 @@
width: 100%;
height: 2px;
margin: 7px 0;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
border-radius: 10px;
}
@@ -120,6 +130,8 @@
width: 100%;
height: 4px;
margin: 6px auto;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
border-radius: 10px;
}
diff --git a/build/css/jsxc.oc.css b/build/css/jsxc.oc.css
index 8a5570e..3542b52 100644
--- a/build/css/jsxc.oc.css
+++ b/build/css/jsxc.oc.css
@@ -1,5 +1,5 @@
/*!
- * ojsxc v1.1.0 - 2015-02-16
+ * ojsxc v1.1.0 - 2015-04-29
*
* Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
* Released under the MIT license
@@ -209,6 +209,7 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
border: 2px solid #f00 !important; }
.jsxc_emoticon {
+ display: inline-block;
width: 19px;
height: 19px;
background-size: 19px 19px !important;
@@ -235,8 +236,8 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
.jsxc_tonguesmile {
background: url("data:image/png;base64,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"); }
-.jsxc_surprised {
- background: url("data:image/png;base64,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"); }
+.jsxc_surpised {
+ background: url("../js/jsxc/img/emotions/surpised.png"); }
.jsxc_kiss {
background: url("data:image/png;base64,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"); }
@@ -280,6 +281,9 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
.jsxc_tired {
background: url("../js/jsxc/img/emotions/tired.png"); }
+.jsxc_surprised {
+ background: url("data:image/png;base64,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"); }
+
#jsxc_roster {
position: fixed;
top: 0px;
@@ -407,6 +411,81 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
#jsxc_roster > .jsxc_bottom > div:hover {
color: #fff; }
+.jsxc_windowItem.jsxc_groupchat .jsxc_bar .jsxc_avatar, li[data-type="groupchat"] .jsxc_avatar {
+ text-indent: 999px;
+ background-image: url("../js/jsxc/img/group_white.svg");
+ background-size: 70% 70% !important;
+ background-repeat: no-repeat; }
+
+.jsxc_windowItem.jsxc_groupchat .jsxc_fade {
+ padding-top: 30px; }
+.jsxc_windowItem.jsxc_groupchat .jsxc_video {
+ display: none; }
+.jsxc_windowItem.jsxc_groupchat .jsxc_transfer {
+ display: none; }
+.jsxc_windowItem.jsxc_groupchat .jsxc_fingerprints, .jsxc_windowItem.jsxc_groupchat jsxc_verification, .jsxc_windowItem.jsxc_groupchat jsxc_transfer {
+ display: none; }
+.jsxc_windowItem.jsxc_groupchat .jsxc_members {
+ background-image: url("../js/jsxc/img/group_grey.svg");
+ background-size: 90%;
+ background-repeat: no-repeat;
+ background-position: center; }
+ .jsxc_windowItem.jsxc_groupchat .jsxc_members:hover {
+ background-image: url("../js/jsxc/img/group_white.svg"); }
+.jsxc_windowItem.jsxc_groupchat .jsxc_chatmessage.jsxc_in {
+ margin-left: 40px; }
+ .jsxc_windowItem.jsxc_groupchat .jsxc_chatmessage.jsxc_in .jsxc_avatar {
+ display: block;
+ position: absolute;
+ bottom: 0px;
+ left: -37px;
+ background-color: #777; }
+.jsxc_windowItem .jsxc_memberlist {
+ height: 30px;
+ width: 100%;
+ background-color: #1a1a1a;
+ overflow: hidden;
+ position: absolute;
+ top: 0px;
+ -webkit-transition: height 400ms;
+ transition: height 400ms;
+ z-index: 100; }
+ .jsxc_windowItem .jsxc_memberlist ul {
+ white-space: nowrap;
+ position: absolute;
+ background-color: #1a1a1a;
+ color: gray;
+ overflow: hidden;
+ -webkit-transition: left 400ms;
+ transition: left 400ms; }
+ .jsxc_windowItem .jsxc_memberlist ul > li {
+ display: inline-block;
+ white-space: normal; }
+ .jsxc_windowItem .jsxc_memberlist ul > li:last-child {
+ margin-right: 2px; }
+ .jsxc_windowItem .jsxc_memberlist ul > li .jsxc_name {
+ display: none; }
+ .jsxc_windowItem .jsxc_memberlist ul > li .jsxc_avatar {
+ margin-left: 2px;
+ margin-right: 0px; }
+ .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul {
+ white-space: normal; }
+ .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li {
+ display: block;
+ width: 100%;
+ height: 27px;
+ line-height: 27px; }
+ .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li .jsxc_name {
+ display: block;
+ cursor: default; }
+ .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li .jsxc_name:hover {
+ color: inherit; }
+ .jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li .jsxc_avatar {
+ margin-right: 4px; }
+
+li[data-type="groupchat"] .jsxc_video {
+ display: none; }
+
.jsxc_right {
text-align: right; }
@@ -430,7 +509,8 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
#jsxc_dialog {
padding: 10px;
- min-width: 300px; }
+ min-width: 300px;
+ display: inline-block; }
#jsxc_dialog ul {
list-style: none;
margin: 0;
@@ -479,6 +559,18 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
width: 50px; }
#jsxc_dialog input[readonly] {
background-color: #e6e6e6; }
+ #jsxc_dialog .jsxc_inputinfo {
+ padding-left: 30%;
+ font-style: italic;
+ margin-top: -1em; }
+ #jsxc_dialog .jsxc_waiting:before {
+ content: " ";
+ width: 1em;
+ height: 1em;
+ display: inline-block;
+ background-size: 100%;
+ margin: 0 3px 0 0;
+ background-image: url("../js/jsxc/img/loading.gif"); }
.jsxc_avatar img {
display: block;
@@ -561,33 +653,28 @@ ul.jsxc_vCard {
background-repeat: no-repeat;
background-position: center center; }
-@-webkit-keyframes bounce {
- 0% {
+@-webkit-keyframes bounce{
+ 0%{
bottom: 0;
-webkit-animation-timing-function: ease-in;
animation-timing-function: ease-in; }
-
- 12% {
+ 12%{
bottom: 5px;
-webkit-animation-timing-function: ease-out;
animation-timing-function: ease-out; }
-
- 25% {
+ 25%{
bottom: 0;
-webkit-animation-timing-function: ease-in;
animation-timing-function: ease-in; }
-
- 37% {
+ 37%{
bottom: 5px;
-webkit-animation-timing-function: ease-out;
animation-timing-function: ease-out; }
-
- 50% {
+ 50%{
bottom: 0;
-webkit-animation-timing-function: ease-in;
animation-timing-function: ease-in; }
-
- 100% {
+ 100%{
bottom: 0; } }
@keyframes bounce {
@@ -803,15 +890,15 @@ ul.jsxc_vCard {
border-radius: 0;
box-sizing: border-box;
text-align: right; }
- .jsxc_window input::-webkit-input-placeholder {
- color: #000;
- opacity: 0.3; }
- .jsxc_window input::-moz-placeholder {
- color: #000;
- opacity: 0.3; }
- .jsxc_window input:-ms-input-placeholder {
- color: #000;
- opacity: 0.3; }
+ .jsxc_window input::-webkit-input-placeholder{
+ color: #000;
+ opacity: 0.3; }
+ .jsxc_window input::-moz-placeholder{
+ color: #000;
+ opacity: 0.3; }
+ .jsxc_window input:-ms-input-placeholder{
+ color: #000;
+ opacity: 0.3; }
.jsxc_window input::placeholder {
color: #000;
opacity: 0.3; }
@@ -839,7 +926,8 @@ ul.jsxc_vCard {
left: 0;
width: 15px;
height: 15px;
- z-index: 95 !important; }
+ z-index: 95 !important;
+ background-image: url("../js/jsxc/img/resize_gray.svg"); }
.jsxc_window .ui-resizable-n {
position: absolute;
top: 0;
@@ -868,11 +956,17 @@ ul.jsxc_vCard {
width: 19px;
height: 19px;
background-size: 19px 19px; }
+ .jsxc_chatmessage .jsxc_avatar {
+ display: none; }
.jsxc_timestamp {
font-size: 8px;
color: #999999;
- line-height: 8px; }
+ line-height: 8px;
+ overflow: hidden;
+ white-space: nowrap;
+ max-width: 100%;
+ text-overflow: ellipsis; }
.jsxc_in {
float: left;
@@ -1128,15 +1222,15 @@ div:full-screen {
background-color: #000; }
div:full-screen.jsxc_localvideo {
border: 1px solid #fff; }
-div:-webkit-full-screen {
+div:-webkit-full-screen{
width: 100%;
height: 100%;
background-color: #000; }
-div:-moz-full-screen {
+div:-moz-full-screen{
width: 100%;
height: 100%;
background-color: #000; }
-div:-ms-fullscreen {
+div:-ms-fullscreen{
width: 100%;
height: 100%;
background-color: #000; }
@@ -1144,12 +1238,12 @@ div:fullscreen {
width: 100%;
height: 100%;
background-color: #000; }
- div:-webkit-full-screen.jsxc_localvideo {
- border: 1px solid #fff; }
- div:-moz-full-screen.jsxc_localvideo {
- border: 1px solid #fff; }
- div:-ms-fullscreen.jsxc_localvideo {
- border: 1px solid #fff; }
+ div:-webkit-full-screen.jsxc_localvideo{
+ border: 1px solid #fff; }
+ div:-moz-full-screen.jsxc_localvideo{
+ border: 1px solid #fff; }
+ div:-ms-fullscreen.jsxc_localvideo{
+ border: 1px solid #fff; }
div:fullscreen.jsxc_localvideo {
border: 1px solid #fff; }
div.jsxc_video {
@@ -1237,15 +1331,14 @@ div.jsxc_video {
-webkit-animation-delay: 0.78s;
animation-delay: 0.78s; }
-@-webkit-keyframes bubblingG {
- 0% {
+@-webkit-keyframes bubblingG{
+ 0%{
width: 16px;
height: 16px;
background-color: #000;
-webkit-transform: translateY(0);
transform: translateY(0); }
-
- 100% {
+ 100%{
width: 39px;
height: 39px;
background-color: #fff;
@@ -1280,10 +1373,11 @@ div.jsxc_video {
#jsxc_roster {
top: 45px;
+ z-index: 160;
background-color: #383C43; }
#jsxc_windowList, #jsxc_windowListSB {
- z-index: 80; }
+ z-index: 150; }
#jsxc {
padding: 20px; }
@@ -1301,7 +1395,8 @@ div.jsxc_video {
margin: 15px;
opacity: 0.5;
font-style: italic;
- padding-top: 5px; }
+ padding-top: 5px;
+ clear: both; }
#jsxc_alt:hover {
opacity: 0.8; }
diff --git a/build/css/jsxc.oc.lte6.css b/build/css/jsxc.oc.lte6.css
deleted file mode 100644
index 2abf39b..0000000
--- a/build/css/jsxc.oc.lte6.css
+++ /dev/null
@@ -1,62 +0,0 @@
-div#jsxc_roster {
- background: url("%webroot%/core/img/noise.png") #383C43;
-}
-
-#jsxc_menu>span {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/gear_grey.svg');
-}
-
-div.jsxc_settings {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/gear_grey.svg');
-}
-
-div.jsxc_settings:hover,div.jsxc_settings.hover {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/gear_white.svg');
-}
-
-div.jsxc_transfer {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/padlock_open_grey.svg');
-}
-
-div.jsxc_transfer:hover {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/padlock_open_white.svg');
-}
-
-div.jsxc_transfer.jsxc_fin {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/padlock_close_grey.svg');
-}
-
-div.jsxc_transfer.jsxc_enc {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/padlock_close_orange.svg');
-}
-
-div.jsxc_transfer.jsxc_enc.jsxc_trust {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/padlock_close_green.svg');
-}
-
-#jsxc_buddylist .jsxc_chaticon {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/speech_balloon_white.svg');
-}
-#jsxc_buddylist .jsxc_videoicon {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/camera_icon_white.svg');
-}
-
-div.jsxc_window .jsxc_emoticons:after {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/smiley.png');
-}
-
-div.jsxc_video {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/camera_icon_grey.svg');
-}
-
-div.jsxc_video:not(.jsxc_disabled):hover, #jsxc_buddylist .jsxc_options .jsxc_video {
- background-image: url('%appswebroot%/ojsxc/js/jsxc/img/camera_icon_white.svg');
-}
-
-.jsxc_success {
- background-image: url('%appswebroot%/ojsxc/img/pass-icon.png');
-}
-
-.jsxc_fail {
- background-image: url('%appswebroot%/ojsxc/img/fail-icon.png');
-} \ No newline at end of file
diff --git a/build/css/log.css b/build/css/log.css
deleted file mode 100644
index f30c98c..0000000
--- a/build/css/log.css
+++ /dev/null
@@ -1,95 +0,0 @@
-#log {
- font-family: Helvetica;
- padding: 10px;
- height: 550px;
- width: 700px;
- border: solid 1px #aaa;
- background-color: #000;
- color: #eee;
- font-family: monospace;
- overflow-y: auto;
- overflow-x: hidden;
- display: block;
- position: absolute;
- bottom: 0px;
- left: 0px;
- opacity: 0.3;
-}
-
-#log:hover {
- opacity: 0.9;
-}
-
-#log div {
- width: 1000px;
- word-wrap: break-word;
-}
-
-.outgoing,.incoming {
-
-}
-
-.incoming {
- background-color: #fff;
-}
-
-/* xml styles */
-.xml_punc {
- color: #888;
-}
-
-.xml_tag {
- color: #e77;
-}
-
-.xml_aname {
- color: #55d;
-}
-
-.xml_avalue {
- color: #77f;
-}
-
-.xml_text {
- color: #aaa
-}
-
-.xml_level0 {
- padding-left: 0;
-}
-
-.xml_level1 {
- padding-left: 1em;
-}
-
-.xml_level2 {
- padding-left: 2em;
-}
-
-.xml_level3 {
- padding-left: 3em;
-}
-
-.xml_level4 {
- padding-left: 4em;
-}
-
-.xml_level5 {
- padding-left: 5em;
-}
-
-.xml_level6 {
- padding-left: 6em;
-}
-
-.xml_level7 {
- padding-left: 7em;
-}
-
-.xml_level8 {
- padding-left: 8em;
-}
-
-.xml_level9 {
- padding-left: 9em;
-} \ No newline at end of file
diff --git a/build/css/muc.css b/build/css/muc.css
deleted file mode 100644
index 3d6bd64..0000000
--- a/build/css/muc.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.jsxc_members {
- padding: 3px;
- width: 17px;
- height: 17px;
- cursor: pointer;
- float: left;
- text-transform: uppercase;
- color: #939393;
- font-family: Arial;
- font-weight: bold;
- line-height: 17px;
-}
-
-.jsxc_memberlist {
- display: none;
- position: absolute;
- bottom: 30px;
- left: 0px;
- width: 200px;
- height: 255px;
- /* background-color: #a9a9a9;*/
- background: url("%webroot%/core/img/noise.png") #383C43;
- z-index: 70;
- box-shadow: 0px 0px 5px #000;
-}
-
-.jsxc_memberlist li {
- border-bottom: 1px solid #939393;
- color: #939393;
- font-family: Arial;
- line-height: 30px;
- padding-left: 3px;
- cursor: auto !important;
-}
-
-.jsxc_memberlist li.online:before {
- content: "• ";
- color: green;
-}
-
-.jsxc_groupchat .jsxc_transfer,.jsxc_groupchat .jsxc_verification {
- display: none;
-} \ No newline at end of file
diff --git a/build/js/admin.js b/build/js/admin.js
index 77f6874..e2a3f8c 100644
--- a/build/js/admin.js
+++ b/build/js/admin.js
@@ -1,5 +1,5 @@
/*!
- * ojsxc v1.1.0 - 2015-02-16
+ * ojsxc v1.1.0 - 2015-04-29
*
* Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
* Released under the MIT license
diff --git a/build/js/eof.js b/build/js/eof.js
index 9998c25..3cd832d 100644
--- a/build/js/eof.js
+++ b/build/js/eof.js
@@ -1,5 +1,5 @@
/*!
- * ojsxc v1.1.0 - 2015-02-16
+ * ojsxc v1.1.0 - 2015-04-29
*
* Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
* Released under the MIT license
diff --git a/build/js/jsxc/css/jsxc.css b/build/js/jsxc/css/jsxc.css
index d907fd8..61ffd7f 100644
--- a/build/js/jsxc/css/jsxc.css
+++ b/build/js/jsxc/css/jsxc.css
@@ -18,7 +18,7 @@
background-position: center center; }
div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
- background-image: url("../../../img/padlock_open_grey.svg");
+ background-image: url("../img/padlock_open_grey.svg");
background-repeat: no-repeat;
background-position: center center;
background-size: 12px 12px; }
@@ -43,7 +43,7 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
background-position: center center; }
div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
- background-image: url("../../../img/padlock_open_grey.svg");
+ background-image: url("../img/padlock_open_grey.svg");
background-repeat: no-repeat;
background-position: center center;
background-size: 12px 12px; }
@@ -151,10 +151,10 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
#jsxc_buddylist .jsxc_options > div:hover {
opacity: 1; }
#jsxc_buddylist .jsxc_chaticon {
- background-image: url("../../../img/speech_balloon_white.svg");
+ background-image: url("../img/speech_balloon_white.svg");
background-size: 15px 15px; }
#jsxc_buddylist .jsxc_videoicon {
- background-image: url("../../../img/camera_icon_white.svg");
+ background-image: url("../img/camera_icon_white.svg");
background-size: 13px 13px; }
#jsxc_buddylist .jsxc_vcardicon {
font-size: 15px;
@@ -195,76 +195,80 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
border: 2px solid #f00 !important; }
.jsxc_emoticon {
+ display: inline-block;
width: 19px;
height: 19px;
background-size: 19px 19px !important;
border: 0; }
.jsxc_angel {
- background: url("../../../img/emotions/angel.png"); }
+ background: url("../img/emotions/angel.png"); }
.jsxc_angry {
- background: url("../../../img/emotions/angry.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_smile {
- background: url("../../../img/emotions/smile.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_grin {
- background: url("../../../img//emotions/grin.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_sad {
- background: url("../../../img/emotions/sad.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_wink {
- background: url("../../../img/emotions/wink.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_tonguesmile {
- background: url("../../../img/emotions/tonguesmile.png"); }
+ background: url("data:image/png;base64,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"); }
-.jsxc_surprised {
- background: url("../../../img/emotions/surprised.png"); }
+.jsxc_surpised {
+ background: url("../img/emotions/surpised.png"); }
.jsxc_kiss {
- background: url("../../../img/emotions/kiss.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_sunglassess {
- background: url("../../../img/emotions/sunglassess.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_crysad {
- background: url("../../../img/emotions/crysad.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_doubt {
- background: url("../../../img/emotions/doubt.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_zip {
- background: url("../../../img/emotions/zip.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_thumbsup {
- background: url("../../../img/emotions/thumbsup.png"); }
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAXEQAAFxEByibzPwAAACR0RVh0Q29tbWVudABMRUFEIFRlY2hub2xvZ2llcyBJbmMuIFYxLjAxftCDDQAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIwWZ92UQAABYdJREFUSEvFl3tMU2cYxk/LTYyXGWWMMMSRTWWLBnXJNtF5S1ZNRnRGtxnj3CXLppE/9s+Yy6aRLV4ScYumBhYRkCgX5SJyVaTcL6OUS0tbCoVCgVLoBVoo0J7TZ+9hcZkOsxUla/LmJOf0vL/veb7ve9/vCAAw/8uPBz8Zng6krznH/1bcdlFyTKjI1lYponx+f88xK+NZwQ3Zxy8XX9uEjqJoyMuPoSpzC5R1vwzOKxioiFZJPgfcfXDaKuEYjMdY+3GUXFz/2Pw9d8UNGYdbAQPcY1KM6n+DRXMC5oYtqEn/RDqvihsz96RiUgaXMRlWTTRM8iioCoIwUpt4YF7BykJRKuwFYPWxsGn2wdLyOjrvLURK7MuPrc/nbrU066109+hZuPu/wLj6bZiaFkNX6AezXLJzXhVras60YvgIXPp34GwPwWQrA3PdUsjyxGfmFdyt7mas0q1wd4WB1fhgSsFgUumD0sQPK+YVzCevy/7hM3uLN1wab0ypGThVQjSkvmYqTPkp8BF8TnMM2PZ2Vclq02KDxemnfMR3z/uKH15fKa5IFYnlBefEt658vd/YuBwuLcFVBFYLYaz2Q3GCKH5OYGN377t5v0ZaCq8uRlkCg7ZcBv01DCxtDFxDC4GhUNi1QRhu8sF0jxAunRBclwDODgG4dgaKvPDpspsJ4TzcI8VFcZED4837wPWdxqQ2BiNN76O/bB16S4JgqArFROcmTHa8ieGa9egtCAFLcLabobmm6PAiy5eiPPHTXI/BNQnraKCDAFsDp/kiWMOXYPvXwGkIBDceAScXBdZ9iJ5vhqNrHXSly8D1kBsEdpLlbJs3qm/sZj0Gy27vJnAf3KMZ4IzR4Aa2kZ3+4AwBcDu2Adwxeh4NN/bAbY6AKnvlX2CWwBMKARqTIqC1INQjq3PidlLxvwNu5DKmjR/B2bsWLrKSGwiAy74RTtcHlO8QWNc2Kh5r0Zm1ZAbMW80rnlQKochcA4Oyi7rILK33aW2xsSTjbPudPdOTmoNw9GwF20VqeSv7KYZXwTm0EY72SBiKNkGW+iIGpb60n/lVTXAKh8IL7VmvoCTnFG/dP3v+08CDnQNM7a3vpB35O2Ct/xh2yWaYHoRg7MGrsORHwFwYDkvFShjuB0NXEACdZBlcHeQIBUtbyqHwhjx7NQpzYzwDp4svR8qzd9C4yHFHGTj9AUxpF86ocvHKewmiJ4XkAHQ+0GaEwU6Vi+0QwtkqwBiVT9mNYAxJa094pPjisV37JlRn/wSP3YG79z04Nb4zNrKdBKbgrxwNAN1eZHkYRpsF4BeWg/a6VeqF4qsBE7QxhB6Bq+6l7FLc5Y9PVnC2RExrN2NaQXtVRcln7CQ4H/wAVIugywuCTS7AlJygTQIY671Qfe3IzEnEIzD/wv3rh7stNUdpQX0Ph3oVplpotbaTlQScVlKRoIZgqlyO+vhgqPL9MSJjMC73gvV3bwxUCVBy9au7cwLrWtULytN+TC8XL4Bduh/W8g2wVIfDXh+I0aoQ2BoCMdHsD3P9ErRlBGCgUgh7MyluFKAyfjW0ddq9cwLzL6XFRZ20KS+A43SY0F+CRfEGzE1C2FoEsDV706nDewY21uALde4ijNcJ0JD0CiQpP7fNqUk8ekl+c6+Dr2DOKSmsPScwUr8CI9XU8GtJGV1HaoUwNzIYLFsATZEfpGlhkCSd6qF5DXkmMJTfJJsqvgUcubAoo2CQLIFRwsBYLsTQQyH0+V5ksx+qkxk8uBQISWKsnqArnvkgAFOKT+qFo9klyQfRfHsDyuMFKL6yCDkXXkDayZcgjgnHzUv71Y2ZSaVlSec3zvYV4vGqfjIJJdheVJAhKs06JypOOy1qlchEQxrTv37x/GfwbH983vf+AOK2puLI/Ru2AAAAAElFTkSuQmCC"); }
.jsxc_thumbsdown {
- background: url("../../../img/emotions/thumbsdown.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_beer {
- background: url("../../../img/emotions/beer.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_devil {
- background: url("../../../img/emotions/devil.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_kissing {
- background: url("../../../img/emotions/kissing.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_rose {
- background: url("../../../img/emotions/rose.png"); }
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAACXZwQWcAAAAeAAAAHgD4T+E9AAAFwElEQVRIx+WXWWxcVxmAv3PmLjOe8SzeYrt24nhLTR2laZ2ShlJC1BKWRl2itkRCRGVJk6I+IIRAVGpVJB4KSmWKkAhUqAgVpEptRVogoo0qta4al5DYtCSNHROHGTuOM97uzHju3O3wMFMRQZzYkd/4X46O7q//O/+uC/9vIlagGwM+HYe7b4vFtsYTichcLudkLGt8HqxLsB/wVxOsN2naoXpd3/jNzZv77ti9m/U7dhBSCk8p5sfHef7pp1WmUEi/PDb2Qh6eWi2w+WBLy8Xn+vsTUimK6TQlx8FsayO8sIBMpVDhMLZl8eX9+//5Xj7fsRxwaBk6/keWVdqs1M5kQwO+phE3TfyzZ9FiMeYWFylaFn966SV+dfr0o8Cp5YC15SgF8MKJoaFneru6dA8oKkWjUkxmMigApTg5OloC/rgce8sGAyJu26ImnWYciANZoABlMFAdBDrQCpxZTfCOPk3TZCZDAMgKuHSZwrZ4XP4avpuHb1TeJoH5pQzKqz2qJxp9585k8sMUPNbjeSxmMkSFQI9EqIlEaIxEqA2HIZvFKBb5nGl+RcK399XWTn+nvj7bUg59dKUei8LionZA129qgZvIZikJQT6TwaLcDgHgCMG0UoSAbt83nxDiYEM+L37hOCftssdXdO5a7RS9Hc5+HRq3AKaUKMqtcAaYrSgVgbBSFJWiFvglzL9Zznf+enNcGISf3Qs/Glu3jvWxGHWVD2v4z5iqAlxAT6exLIv34fDVoMsBE8BPn4dv9ff0NEeamjBlOXLJCuxjcYA51+X3luVZ8Oy17F5rgFTrbRxe93jnxoadW8TF8CVyc2laEh0cCz5gdHGG9rW9HC+e4NQai3M3Jrm0vU1kJjKb3Lngd4B3veBN5gZ+mH5l9tDw+EhT6q7eePClW/lL1TDyC9sZsuc5tjiI3XcrJ6en1etvHB9Pn53I1/cleueGC68DE0sZvlZxCSBFuY6iSL4W6Q491HhLzZZPPNxuzvw9h2OXuDCc9afeXHhO2XwPMIBdwGuUZ8yqyqdS+3Cr76EgovQDnasNWEoiyUewzU2cvF4Dyx2ZS8l/p+oerZndeivdoVqa/BkKxUH2AidWCr4t1MABs5MbvRlmnRFeRvEi4Oqe6fvVflOpXLghmeDnrY9X74v0SlH0C5RmPdwJKA7St1LwZ1N75ZHuXa1GndaIDEmyF2a+eOrF8ScX3nF+gCWtVEusLsdMvUzyk60Hu/c2NjXiLHho8RBjI+OMHElPAX++kvGl2kmP3ay/uueJB5o7oz00VDeS0uqoDTXQu31DMro59MDk+amqrpvbtfTA9Podz96yZ+vGbULPRVi7thU3A5fOzZL5w+yjwLsryfENzZvqN2benQY1Tduadtp72qjeUM1irkhLb7u4o/czoaIoMPnQ1O77tj0oFi7kaO/sxnN88gWPfNr2gTeWCudSHs/PDOcGRo+ef2306Pm3z2fP3V5VVRXpqO2mOdXC5MUJXv3NYT/ZkJAP37tHpJwGutZ3U2PWkUsXWJi3OPrKWye8uaB/uVW5lDQJk8equyK7EjXx5IUPp9/3ZtWTXfe3Dvz4+wdrP0qfplSySU/8i5EzI2po4IPTuTP2V4G/rQhsGIYMh8OaYRhhwzAiUsqIpmlhKaUppdQNwwgJIeSUPfHUI8/s2XnowG//kYyljuEzqQL1XhAEQ47jFBzHsW3b9hzHCa6a41gspnd0dHzeMIxPCiFaKC+hKsAQQoQoL/WPF7uo89Yk/zpwXEVrInXNyeYeYINS6k7Ky2oRmFdKZRzHGRwbGzuSz+fdK4KDIFCu61q6rs8JIWKX1UAA6JW7rERKJBKJ7MUjlt0YuaFIeUv6ldMGchXwnOu6VhAE6nLWFUMdCoUwDCNkmqau67oppTQ0TTOllIaUUquEWgAopZTjOH4QBF4QBI7neaUgCBzXdUulUsl1HMf3/f/9s/k3XaBaVHBIGvoAAAAmelRYdENvbW1lbnQAAHjacy5KTSxJTVEozyzJUAjJSFVw9/QNAABS5wcjkMtlcAAAAABJRU5ErkJggg=="); }
.jsxc_music {
- background: url("../../../img/emotions/music.png"); }
+ background: url("../img/emotions/music.png"); }
.jsxc_love {
- background: url("../../../img/emotions/love.png"); }
+ background: url("data:image/png;base64,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"); }
.jsxc_tired {
- background: url("../../../img/emotions/tired.png"); }
+ background: url("../img/emotions/tired.png"); }
+
+.jsxc_surprised {
+ background: url("data:image/png;base64,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"); }
#jsxc_roster {
position: fixed;
@@ -416,7 +420,8 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
#jsxc_dialog {
padding: 10px;
- min-width: 300px; }
+ min-width: 300px;
+ display: inline-block; }
#jsxc_dialog ul {
list-style: none;
margin: 0;
@@ -465,6 +470,18 @@ div.jsxc_transfer, div.jsxc_transfer.jsxc_disabled:hover {
width: 50px; }
#jsxc_dialog input[readonly] {
background-color: #e6e6e6; }
+ #jsxc_dialog .jsxc_inputinfo {
+ padding-left: 30%;
+ font-style: italic;
+ margin-top: -1em; }
+ #jsxc_dialog .jsxc_waiting:before {
+ content: " ";
+ width: 1em;
+ height: 1em;
+ display: inline-block;
+ background-size: 100%;
+ margin: 0 3px 0 0;
+ background-image: url("../img/loading.gif"); }
.jsxc_avatar img {
display: block;
@@ -542,7 +559,7 @@ ul.jsxc_vCard {
display: block;
width: 25px;
height: 30px;
- background-image: url("../../../img/gear_white.svg");
+ background-image: url("../img/gear_white.svg");
background-size: 18px 18px;
background-repeat: no-repeat;
background-position: center center; }
@@ -713,7 +730,7 @@ ul.jsxc_vCard {
cursor: pointer; }
.jsxc_window .jsxc_emoticons:after {
content: ' ';
- background-image: url("../../../img/smiley.png");
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALHQAACx0BpBPQ5gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGtSURBVDiNrdS7a1RBFAbw3+7KKlYKamGI6D9gBGsfCFoogijia0k6LRURG0ufaAjE/Qds1CKFlTZaWUgIQgo7kfhCJVhYqEUUvBZzbhzu3l1Z8YOBmW++890zc8+Zhnqsxinsx1asDf4LXuAR7uJ7NbBRY3YSNzGC13iKz7G3DruwBR9xMYxr0cB1FJjFjn7C2JsN7Y0+ibkSgkm0BpiVaIW2wNXq5hH8CsGwmIrYwyWxSrqruSyzDbiM0zUGnchoNNYr8BwLWAnjkfbeLOhOcAX2ZPy2jH+Y8fuC6zRxAB/wJBP8yOZL2fxnBFb5x/gUXl7p/fVrcB5H9eIgLmB9hb+Pl/ANt2oCh8Ukvjb1qaF/RROL2PgfvEaw2MQ8dvqT6aj05/+GcWyKeUPqnvlyo5B6FKalQj03wOxsaLqx3h0eHVJhv5N6s4U2HoTgGSawPcZEcEVo2lJhz+FteBHOZR+XRzgjVX9RGQtSB5VXNJVnl6Or/nEYw6EYYxmfPw5dNWjhtuGfr24ce/loVZzANWw2+IF9g0u4N+DDy2jjGGbwXurbpZjP4HhoevAb11xtRVQWs+YAAAAASUVORK5CYII=");
background-position: center center;
background-repeat: no-repeat;
height: 30px;
@@ -826,7 +843,8 @@ ul.jsxc_vCard {
left: 0;
width: 15px;
height: 15px;
- z-index: 95 !important; }
+ z-index: 95 !important;
+ background-image: url("../img/resize_gray.svg"); }
.jsxc_window .ui-resizable-n {
position: absolute;
top: 0;
@@ -855,11 +873,17 @@ ul.jsxc_vCard {
width: 19px;
height: 19px;
background-size: 19px 19px; }
+ .jsxc_chatmessage .jsxc_avatar {
+ display: none; }
.jsxc_timestamp {
font-size: 8px;
color: #999999;
- line-height: 8px; }
+ line-height: 8px;
+ overflow: hidden;
+ white-space: nowrap;
+ max-width: 100%;
+ text-overflow: ellipsis; }
.jsxc_in {
float: left;
@@ -922,13 +946,13 @@ ul.jsxc_vCard {
border-radius: 3px; }
div.jsxc_settings {
- background-image: url("../../../img/gear_grey.svg");
+ background-image: url("../img/gear_grey.svg");
background-size: 15px 15px;
background-repeat: no-repeat;
background-position: center center;
overflow: visible; }
div.jsxc_settings:hover, div.jsxc_settings .hover {
- background-image: url("../../../img/gear_white.svg"); }
+ background-image: url("../img/gear_white.svg"); }
div.jsxc_settings ul {
list-style: none;
padding: 0;
@@ -959,13 +983,13 @@ div.jsxc_settings {
background-color: #3f8fba; }
div.jsxc_transfer:hover {
- background-image: url("../../../img/padlock_open_white.svg"); }
+ background-image: url("../img/padlock_open_white.svg"); }
div.jsxc_transfer.jsxc_fin {
- background-image: url("../../../img/padlock_close_grey.svg"); }
+ background-image: url("../img/padlock_close_grey.svg"); }
div.jsxc_transfer.jsxc_enc {
- background-image: url("../../../img/padlock_close_orange.svg"); }
+ background-image: url("../img/padlock_close_orange.svg"); }
div.jsxc_transfer.jsxc_enc.jsxc_trust {
- background-image: url("../../../img/padlock_close_green.svg"); }
+ background-image: url("../img/padlock_close_green.svg"); }
#colorbox {
outline: none; }
@@ -979,7 +1003,7 @@ div.jsxc_transfer.jsxc_enc {
height: 32px;
border: 0;
background-size: 32px 32px !important;
- background: url("../../../img/loading.gif"); }
+ background: url("../img/loading.gif"); }
/* @TODO: check */
#jsxc_loginForm input[type="submit"] {
diff --git a/build/js/jsxc/css/jsxc.webrtc.css b/build/js/jsxc/css/jsxc.webrtc.css
index ac43ca0..ec6c174 100644
--- a/build/js/jsxc/css/jsxc.webrtc.css
+++ b/build/js/jsxc/css/jsxc.webrtc.css
@@ -113,12 +113,12 @@ div:fullscreen {
div:fullscreen.jsxc_localvideo {
border: 1px solid #fff; }
div.jsxc_video {
- background-image: url("../../../img/camera_icon_grey.svg");
+ background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgd2lkdGg9IjIwIgogICBoZWlnaHQ9IjIwIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMDM3ODg1OTQsMCwwLDAuMDM3ODg1OTQsLTAuNDEzNDA3OTMsLTIuNjMxMDcxNikiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzkwNiIKICAgICAgIHN0eWxlPSJmaWxsOiM4MDgwODA7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDM2MS42NTE0OCwzMTMuNTE3NjggMTc3LjE2MDc0LC0xMzEuNzg1MTYgMCwzMDIuMjI5OTkgTCAzNTguOTczMzgsMzUwLjE4NTE3IFogTSAxMC45MTE5MjIsMTgyLjQwNjM0IGwgMzc4LjM3MjY3OCwwIDAsMzAyLjY1NTgyIC0zNzguMzcyNjc4LDAgeiIgLz4KICA8L2c+Cjwvc3ZnPgo=");
background-repeat: no-repeat;
background-position: center center;
background-size: 15px 15px; }
div.jsxc_video:not(.jsxc_disabled):hover {
- background-image: url("../../../img/camera_icon_white.svg"); }
+ background-image: url("../img/camera_icon_white.svg"); }
.jsxc_controlbar {
width: 640px; }
@@ -235,6 +235,6 @@ div.jsxc_video {
font-style: italic; }
#jsxc_buddylist .jsxc_options .jsxc_video {
- background-image: url("../../../img/camera_icon_white.svg"); }
+ background-image: url("../img/camera_icon_white.svg"); }
#jsxc_buddylist .jsxc_options .jsxc_video.jsxc_disabled {
opacity: 0.2; }
diff --git a/build/js/jsxc/img/group_grey.svg b/build/js/jsxc/img/group_grey.svg
new file mode 100644
index 0000000..e43f479
--- /dev/null
+++ b/build/js/jsxc/img/group_grey.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ viewBox="0 0 1000 1000"
+ preserveAspectRatio="xMinYMin meet"
+ width="100%"
+ height="100%"
+ style="width: 512px; height: 512px;"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91+devel r"
+ sodipodi:docname="group_grey.svg">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="980"
+ inkscape:window-height="888"
+ id="namedview6"
+ showgrid="false"
+ inkscape:zoom="0.6675088"
+ inkscape:cx="512.17823"
+ inkscape:cy="480.21903"
+ inkscape:window-x="889"
+ inkscape:window-y="85"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <path
+ d="m 0.94630456,763.0963 c 0,22.21203 9.08673644,33.31804 27.26020844,33.31804 l 112.069747,0 0,-142.35887 c 0,-18.17347 4.54363,-34.83222 13.63088,-49.97627 9.08724,-15.14405 21.70797,-26.75512 37.86216,-34.83326 l 115.09866,-54.52042 c 10.09637,-6.05782 18.17347,-13.12528 24.23129,-21.20238 -12.11564,-18.17347 -22.21202,-39.37586 -30.28912,-63.60715 -8.0771,-24.2313 -12.11564,-49.47223 -12.11564,-75.7228 0,-16.1542 2.01927,-32.3084 6.05782,-48.46259 4.03855,-16.1542 9.08674,-31.29876 15.14456,-45.43368 -20.19275,-14.13493 -41.39513,-21.20239 -63.60715,-21.20239 -38.36622,2.01928 -68.65534,17.66839 -90.86736,46.94736 -22.21201,29.27897 -33.31803,62.09244 -33.31803,98.44042 2.01928,62.59751 24.2313,107.02155 66.63606,133.27212 L 16.092416,596.50615 C 5.9960421,602.56397 0.94785546,612.66034 0.94785546,626.79527 l 0,136.30103 z M 191.76775,796.41434 c -2.01927,42.40476 10.09637,64.61678 36.34695,66.63606 l 542.17524,0 c 12.11565,-4.03855 20.69783,-10.09637 25.74653,-18.17347 5.04869,-8.0771 7.57305,-14.63948 7.57305,-19.68716 l 0,-171.13275 c 0,-18.17347 -7.06746,-30.28912 -21.20238,-36.34694 L 637.01936,545.01619 573.41221,514.72707 c 38.36622,-22.21202 63.60715,-60.57824 75.7228,-115.09865 8.0771,-30.28912 8.0771,-61.58788 0,-93.89627 -10.09637,-36.34695 -28.7744,-67.14115 -56.0341,-92.38259 -27.25969,-25.24145 -59.06352,-38.87182 -95.4115,-40.89109 -36.34694,2.01927 -67.6457,15.64964 -93.89627,40.89109 -26.25057,25.24144 -44.42404,55.02601 -54.52042,89.35368 -12.11564,46.44331 -8.07709,93.89627 12.11565,142.35886 16.1542,30.28912 37.35658,54.52041 63.60715,72.69389 l -57.54932,27.2602 -151.4456,69.66498 c -16.1542,8.0771 -24.2313,21.20238 -24.2313,39.37585 l 0,142.35887 z m 475.53918,-302.8912 c 8.0771,8.0771 18.17347,16.1542 30.28912,24.23129 12.11565,8.0771 23.22166,14.13493 33.31803,18.17348 10.09638,4.03855 23.22166,9.59181 39.37586,16.65979 16.1542,7.06797 28.26984,12.62124 36.34694,16.65979 16.1542,8.0771 28.77493,19.68819 37.86218,34.83326 9.08724,15.14507 13.63088,31.80384 13.63088,49.97627 l 0,142.35887 115.09865,0 c 18.17347,-2.01928 27.26021,-13.12529 27.26021,-33.31803 l 0,-136.30104 c 0,-14.13493 -5.04819,-24.2313 -15.14456,-30.28912 L 815.72517,514.72707 c 42.40477,-30.28912 63.60715,-73.70352 63.60715,-130.24321 0,-38.36622 -12.11565,-72.18881 -36.34694,-101.46778 -24.2313,-29.27897 -53.51078,-43.91896 -87.83845,-43.92 -22.21202,0 -44.42404,7.06747 -66.63606,21.20239 12.11564,30.28912 18.17347,61.58787 18.17347,93.89627 0,50.48187 -13.12529,96.92518 -39.37586,139.32995 z"
+ id="path4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsscccsssccscccscccccssscccccscscccccscccssssssccssccssccscc"
+ style="fill:#999999;stroke-width:1.55090213;fill-opacity:1" />
+</svg>
diff --git a/build/js/jsxc/img/group_white.svg b/build/js/jsxc/img/group_white.svg
new file mode 100644
index 0000000..ae16525
--- /dev/null
+++ b/build/js/jsxc/img/group_white.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ viewBox="0 0 1000 1000"
+ preserveAspectRatio="xMinYMin meet"
+ width="100%"
+ height="100%"
+ style="width: 512px; height: 512px;"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91+devel r"
+ sodipodi:docname="group_white.svg">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1855"
+ inkscape:window-height="1056"
+ id="namedview6"
+ showgrid="false"
+ inkscape:zoom="0.6675088"
+ inkscape:cx="538.39511"
+ inkscape:cy="480.21903"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <path
+ d="m 0.94630456,763.0963 c 0,22.21203 9.08673644,33.31804 27.26020844,33.31804 l 112.069747,0 0,-142.35887 c 0,-18.17347 4.54363,-34.83222 13.63088,-49.97627 9.08724,-15.14405 21.70797,-26.75512 37.86216,-34.83326 l 115.09866,-54.52042 c 10.09637,-6.05782 18.17347,-13.12528 24.23129,-21.20238 -12.11564,-18.17347 -22.21202,-39.37586 -30.28912,-63.60715 -8.0771,-24.2313 -12.11564,-49.47223 -12.11564,-75.7228 0,-16.1542 2.01927,-32.3084 6.05782,-48.46259 4.03855,-16.1542 9.08674,-31.29876 15.14456,-45.43368 -20.19275,-14.13493 -41.39513,-21.20239 -63.60715,-21.20239 -38.36622,2.01928 -68.65534,17.66839 -90.86736,46.94736 -22.21201,29.27897 -33.31803,62.09244 -33.31803,98.44042 2.01928,62.59751 24.2313,107.02155 66.63606,133.27212 L 16.092416,596.50615 C 5.9960421,602.56397 0.94785546,612.66034 0.94785546,626.79527 l 0,136.30103 z M 191.76775,796.41434 c -2.01927,42.40476 10.09637,64.61678 36.34695,66.63606 l 542.17524,0 c 12.11565,-4.03855 20.69783,-10.09637 25.74653,-18.17347 5.04869,-8.0771 7.57305,-14.63948 7.57305,-19.68716 l 0,-171.13275 c 0,-18.17347 -7.06746,-30.28912 -21.20238,-36.34694 L 637.01936,545.01619 573.41221,514.72707 c 38.36622,-22.21202 63.60715,-60.57824 75.7228,-115.09865 8.0771,-30.28912 8.0771,-61.58788 0,-93.89627 -10.09637,-36.34695 -28.7744,-67.14115 -56.0341,-92.38259 -27.25969,-25.24145 -59.06352,-38.87182 -95.4115,-40.89109 -36.34694,2.01927 -67.6457,15.64964 -93.89627,40.89109 -26.25057,25.24144 -44.42404,55.02601 -54.52042,89.35368 -12.11564,46.44331 -8.07709,93.89627 12.11565,142.35886 16.1542,30.28912 37.35658,54.52041 63.60715,72.69389 l -57.54932,27.2602 -151.4456,69.66498 c -16.1542,8.0771 -24.2313,21.20238 -24.2313,39.37585 l 0,142.35887 z m 475.53918,-302.8912 c 8.0771,8.0771 18.17347,16.1542 30.28912,24.23129 12.11565,8.0771 23.22166,14.13493 33.31803,18.17348 10.09638,4.03855 23.22166,9.59181 39.37586,16.65979 16.1542,7.06797 28.26984,12.62124 36.34694,16.65979 16.1542,8.0771 28.77493,19.68819 37.86218,34.83326 9.08724,15.14507 13.63088,31.80384 13.63088,49.97627 l 0,142.35887 115.09865,0 c 18.17347,-2.01928 27.26021,-13.12529 27.26021,-33.31803 l 0,-136.30104 c 0,-14.13493 -5.04819,-24.2313 -15.14456,-30.28912 L 815.72517,514.72707 c 42.40477,-30.28912 63.60715,-73.70352 63.60715,-130.24321 0,-38.36622 -12.11565,-72.18881 -36.34694,-101.46778 -24.2313,-29.27897 -53.51078,-43.91896 -87.83845,-43.92 -22.21202,0 -44.42404,7.06747 -66.63606,21.20239 12.11564,30.28912 18.17347,61.58787 18.17347,93.89627 0,50.48187 -13.12529,96.92518 -39.37586,139.32995 z"
+ id="path4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsscccsssccscccscccccssscccccscscccccscccssssssccssccssccscc"
+ style="fill:#ffffff;stroke-width:1.55090213" />
+</svg>
diff --git a/build/js/jsxc/img/resize_gray.svg b/build/js/jsxc/img/resize_gray.svg
new file mode 100644
index 0000000..1faca03
--- /dev/null
+++ b/build/js/jsxc/img/resize_gray.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="15"
+ height="15"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="resize_gray.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3803">
+ <rect
+ style="stroke:none"
+ id="rect3805"
+ width="16.09375"
+ height="14.71875"
+ x="0.84375"
+ y="1038.1434" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.9909088"
+ inkscape:cy="6.5564812"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1865"
+ inkscape:window-height="1056"
+ inkscape:window-x="55"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1037.3622)">
+ <path
+ style="fill:none;stroke:#bfbfbf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 10.46875,1032.1747 -14.5,14.2813 z m 3.5,1.2501 -17.3125,17.3124 z"
+ id="path2985"
+ inkscape:connector-curvature="0"
+ clip-path="url(#clipPath3803)"
+ transform="translate(0.8125,0.6875)"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/build/js/jsxc/jsxc.js b/build/js/jsxc/jsxc.js
index 7c43dfa..f0cba7a 100644
--- a/build/js/jsxc/jsxc.js
+++ b/build/js/jsxc/jsxc.js
@@ -1,7 +1,5 @@
-/*! This file is concatenated for the browser. */
-
/*!
- * jsxc v1.1.0 - 2015-02-08
+ * jsxc v2.0.0-beta1 - 2015-04-29
*
* Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
* Released under the MIT license
@@ -9,3118 +7,3134 @@
* Please see http://www.jsxc.org/
*
* @author Klaus Herberth <klaus@jsxc.org>
- * @version 1.1.0
+ * @version 2.0.0-beta1
* @license MIT
*/
-var jsxc;
+/*! This file is concatenated for the browser. */
+
+var jsxc = null, RTC = null, RTCPeerconnection = null;
(function($) {
"use strict";
- /**
- * JavaScript Xmpp Chat namespace
- *
- * @namespace jsxc
- */
- jsxc = {
- /** Version of jsxc */
- version: '1.1.0',
+/**
+ * JavaScript Xmpp Chat namespace
+ *
+ * @namespace jsxc
+ */
+jsxc = {
+ /** Version of jsxc */
+ version: '2.0.0-beta1',
- /** True if i'm the master */
- master: false,
+ /** True if i'm the master */
+ master: false,
- /** True if the role allocation is finished */
- role_allocation: false,
+ /** True if the role allocation is finished */
+ role_allocation: false,
- /** Timeout for keepalive */
- to: null,
+ /** Timeout for keepalive */
+ to: null,
- /** Timeout after normal keepalive starts */
- toBusy: null,
+ /** Timeout after normal keepalive starts */
+ toBusy: null,
- /** Timeout for notification */
- toNotification: null,
+ /** Timeout for notification */
+ toNotification: null,
- /** Timeout delay for notification */
- toNotificationDelay: 500,
+ /** Timeout delay for notification */
+ toNotificationDelay: 500,
- /** Interval for keep-alive */
- keepalive: null,
+ /** Interval for keep-alive */
+ keepalive: null,
- /** True if last activity was 10 min ago */
- restore: false,
+ /** True if last activity was 10 min ago */
+ restore: false,
- /** True if restore is complete */
- restoreCompleted: false,
+ /** True if restore is complete */
+ restoreCompleted: false,
- /** True if login through box */
- triggeredFromBox: false,
+ /** True if login through box */
+ triggeredFromBox: false,
- /** True if logout through element click */
- triggeredFromElement: false,
+ /** True if logout through element click */
+ triggeredFromElement: false,
- /** True if logout through logout click */
- triggeredFromLogout: false,
+ /** True if logout through logout click */
+ triggeredFromLogout: false,
- /** last values which we wrote into localstorage (IE workaround) */
- ls: [],
+ /** last values which we wrote into localstorage (IE workaround) */
+ ls: [],
- /**
- * storage event is even fired if I write something into storage (IE
- * workaround) 0: conform, 1: not conform, 2: not shure
- */
- storageNotConform: null,
-
- /** Timeout for storageNotConform test */
- toSNC: null,
-
- /** My bar id */
- bid: null,
-
- /** Some constants */
- CONST: {
- NOTIFICATION_DEFAULT: 'default',
- NOTIFICATION_GRANTED: 'granted',
- NOTIFICATION_DENIED: 'denied',
- STATUS: [ 'offline', 'dnd', 'xa', 'away', 'chat', 'online' ],
- SOUNDS: {
- MSG: 'incomingMessage.wav',
- CALL: 'Rotary-Phone6.mp3',
- NOTICE: 'Ping1.mp3'
- },
- REGEX: {
- JID: new RegExp('\\b[^"&\'\\/:<>@\\s]+@[\\w-_.]+\\b', 'ig'),
- URL: new RegExp(/((?:https?:\/\/|www\.|([\w\-]+\.[a-zA-Z]{2,3})(?=\b))(?:(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\)([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|])?)|(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]))?)/gi)
- },
- NS: {
- CARBONS: 'urn:xmpp:carbons:2',
- FORWARD: 'urn:xmpp:forward:0'
- }
- },
+ /**
+ * storage event is even fired if I write something into storage (IE
+ * workaround) 0: conform, 1: not conform, 2: not shure
+ */
+ storageNotConform: null,
+
+ /** Timeout for storageNotConform test */
+ toSNC: null,
+
+ /** My bar id */
+ bid: null,
+
+ /** Some constants */
+ CONST: {
+ NOTIFICATION_DEFAULT: 'default',
+ NOTIFICATION_GRANTED: 'granted',
+ NOTIFICATION_DENIED: 'denied',
+ STATUS: [ 'offline', 'dnd', 'xa', 'away', 'chat', 'online' ],
+ SOUNDS: {
+ MSG: 'incomingMessage.wav',
+ CALL: 'Rotary-Phone6.mp3',
+ NOTICE: 'Ping1.mp3'
+ },
+ REGEX: {
+ JID: new RegExp('\\b[^"&\'\\/:<>@\\s]+@[\\w-_.]+\\b', 'ig'),
+ URL: new RegExp(/((?:https?:\/\/|www\.|([\w\-]+\.[a-zA-Z]{2,3})(?=\b))(?:(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\)([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|])?)|(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]))?)/gi)
+ },
+ NS: {
+ CARBONS: 'urn:xmpp:carbons:2',
+ FORWARD: 'urn:xmpp:forward:0'
+ }
+ },
- /**
- * Parse a unix timestamp and return a formatted time string
- *
- * @memberOf jsxc
- * @param {Object} unixtime
- * @returns time of day and/or date
- */
- getFormattedTime: function(unixtime) {
- var msgDate = new Date(parseInt(unixtime));
- var date = ('0' + msgDate.getDate()).slice(-2);
- var month = ('0' + (msgDate.getMonth() + 1)).slice(-2);
- var year = msgDate.getFullYear();
- var hours = ('0' + msgDate.getHours()).slice(-2);
- var minutes = ('0' + msgDate.getMinutes()).slice(-2);
- var dateNow = new Date(), time = hours + ':' + minutes;
-
- // compare dates only
- dateNow.setHours(0, 0, 0, 0);
- msgDate.setHours(0, 0, 0, 0);
-
- if (dateNow.getTime() !== msgDate.getTime()) {
- return date + '.' + month + '.' + year + ' ' + time;
- }
- return time;
- },
+ /**
+ * Parse a unix timestamp and return a formatted time string
+ *
+ * @memberOf jsxc
+ * @param {Object} unixtime
+ * @returns time of day and/or date
+ */
+ getFormattedTime: function(unixtime) {
+ var msgDate = new Date(parseInt(unixtime));
+ var date = ('0' + msgDate.getDate()).slice(-2);
+ var month = ('0' + (msgDate.getMonth() + 1)).slice(-2);
+ var year = msgDate.getFullYear();
+ var hours = ('0' + msgDate.getHours()).slice(-2);
+ var minutes = ('0' + msgDate.getMinutes()).slice(-2);
+ var dateNow = new Date(), time = hours + ':' + minutes;
+
+ // compare dates only
+ dateNow.setHours(0, 0, 0, 0);
+ msgDate.setHours(0, 0, 0, 0);
+
+ if (dateNow.getTime() !== msgDate.getTime()) {
+ return date + '.' + month + '.' + year + ' ' + time;
+ }
+ return time;
+ },
- /**
- * Write debug message to console and to log.
- *
- * @memberOf jsxc
- * @param {String} msg Debug message
- * @param {Object} data
- * @param {String} Could be warn|error|null
- */
- debug: function(msg, data, level) {
- if (level) {
- msg = '[' + level + '] ' + msg;
- }
+ /**
+ * Write debug message to console and to log.
+ *
+ * @memberOf jsxc
+ * @param {String} msg Debug message
+ * @param {Object} data
+ * @param {String} Could be warn|error|null
+ */
+ debug: function(msg, data, level) {
+ if (level) {
+ msg = '[' + level + '] ' + msg;
+ }
- if (data) {
- if (jsxc.storage.getItem('debug') === true) {
- console.log(msg, data);
- }
+ if (data) {
+ if (jsxc.storage.getItem('debug') === true) {
+ console.log(msg, data);
+ }
- // try to convert data to string
- var d;
+ // try to convert data to string
+ var d;
+ try {
+ // clone html snippet
+ d = $("<span>").prepend($(data).clone()).html();
+ } catch (err) {
try {
- // clone html snippet
- d = $("<span>").prepend($(data).clone()).html();
- } catch (err) {
- try {
- d = JSON.stringify(data);
- } catch (err2) {
- d = 'see js console';
- }
+ d = JSON.stringify(data);
+ } catch (err2) {
+ d = 'see js console';
}
-
- jsxc.log = jsxc.log + msg + ': ' + d + '\n';
- } else {
- console.log(msg);
- jsxc.log = jsxc.log + msg + '\n';
}
- },
- /**
- * Write warn message.
- *
- * @memberOf jsxc
- * @param {String} msg Warn message
- * @param {Object} data
- */
- warn: function(msg, data) {
- jsxc.debug(msg, data, 'WARN');
- },
+ jsxc.log = jsxc.log + msg + ': ' + d + '\n';
+ } else {
+ console.log(msg);
+ jsxc.log = jsxc.log + msg + '\n';
+ }
+ },
+
+ /**
+ * Write warn message.
+ *
+ * @memberOf jsxc
+ * @param {String} msg Warn message
+ * @param {Object} data
+ */
+ warn: function(msg, data) {
+ jsxc.debug(msg, data, 'WARN');
+ },
+
+ /**
+ * Write error message.
+ *
+ * @memberOf jsxc
+ * @param {String} msg Error message
+ * @param {Object} data
+ */
+ error: function(msg, data) {
+ jsxc.debug(msg, data, 'ERROR');
+ },
+
+ /** debug log */
+ log: '',
+
+ /**
+ * Starts the action
+ *
+ * @memberOf jsxc
+ * @param {object} options
+ */
+ init: function(options) {
+
+ if (options) {
+ // override default options
+ $.extend(true, jsxc.options, options);
+ }
/**
- * Write error message.
+ * Getter method for options. Saved options will override default one.
*
- * @memberOf jsxc
- * @param {String} msg Error message
- * @param {Object} data
+ * @param {string} key option key
+ * @returns default or saved option value
*/
- error: function(msg, data) {
- jsxc.debug(msg, data, 'ERROR');
- },
+ jsxc.options.get = function(key) {
+ var local = jsxc.storage.getUserItem('options') || {};
- /** debug log */
- log: '',
+ return local[key] || jsxc.options[key];
+ };
/**
- * Starts the action
+ * Setter method for options. Will write into localstorage.
*
- * @memberOf jsxc
- * @param {object} options
+ * @param {string} key option key
+ * @param {object} value option value
*/
- init: function(options) {
+ jsxc.options.set = function(key, value) {
+ jsxc.storage.updateItem('options', key, value, true);
+ };
- if (options) {
- // override default options
- $.extend(true, jsxc.options, options);
- }
+ jsxc.storageNotConform = jsxc.storage.getItem('storageNotConform');
+ if (jsxc.storageNotConform === null) {
+ jsxc.storageNotConform = 2;
+ }
- /**
- * Getter method for options. Saved options will override default one.
- *
- * @param {string} key option key
- * @returns default or saved option value
- */
- jsxc.options.get = function(key) {
- var local = jsxc.storage.getUserItem('options') || {};
+ // detect language
+ var lang;
+ if (jsxc.storage.getItem('lang') !== null) {
+ lang = jsxc.storage.getItem('lang');
+ } else if (jsxc.options.autoLang && navigator.language) {
+ lang = navigator.language.substr(0, 2);
+ } else {
+ lang = jsxc.options.defaultLang;
+ }
- return local[key] || jsxc.options[key];
- };
+ // initialize i18n translator
+ $.i18n.init({
+ lng: lang,
+ fallbackLng: 'en',
+ resStore: I18next,
+ // use localStorage and set expiration to a day
+ useLocalStorage: true,
+ localStorageExpirationTime: 60 * 60 * 24 * 1000,
+ });
- /**
- * Setter method for options. Will write into localstorage.
- *
- * @param {string} key option key
- * @param {object} value option value
- */
- jsxc.options.set = function(key, value) {
- jsxc.storage.updateItem('options', key, value, true);
- };
+ // Check localStorage
+ if (typeof (localStorage) === 'undefined') {
+ jsxc.debug("Browser doesn't support localStorage.");
+ return;
+ }
- jsxc.storageNotConform = jsxc.storage.getItem('storageNotConform');
- if (jsxc.storageNotConform === null) {
- jsxc.storageNotConform = 2;
- }
+ if (jsxc.storage.getItem('debug') === true) {
+ jsxc.options.otr.debug = true;
+ }
- // detect language
- var lang;
- if (jsxc.storage.getItem('lang') !== null) {
- lang = jsxc.storage.getItem('lang');
- } else if (jsxc.options.autoLang && navigator.language) {
- lang = navigator.language.substr(0, 2);
- } else {
- lang = jsxc.options.defaultLang;
- }
+ // Register event listener for the storage event
+ window.addEventListener('storage', jsxc.storage.onStorage, false);
+
+ var lastActivity = jsxc.storage.getItem('lastActivity') || 0;
+
+ if ((new Date()).getTime() - lastActivity < jsxc.options.loginTimeout) {
+ jsxc.restore = true;
+ }
+
+ $(document).on('connectionReady.jsxc', function() {
+ // Looking for logout element
+ if (jsxc.options.logoutElement !== null && jsxc.options.logoutElement.length > 0) {
+ var logout = function() {
+ jsxc.options.logoutElement = $(this);
+ jsxc.triggeredFromLogout = true;
+ return jsxc.xmpp.logout();
+ };
+
+ jsxc.options.logoutElement.off('click', null, logout).one('click', logout);
+ }
+ });
+
+ // Check if we have to establish a new connection
+ if (!jsxc.storage.getItem('rid') || !jsxc.storage.getItem('sid') || !jsxc.restore) {
- // set language
- jsxc.l = jsxc.l10n.en;
- $.extend(jsxc.l, jsxc.l10n[lang]);
+ // Looking for a login form
+ if (!jsxc.options.loginForm.form || !(jsxc.el_exists(jsxc.options.loginForm.form) && jsxc.el_exists(jsxc.options.loginForm.jid) && jsxc.el_exists(jsxc.options.loginForm.pass))) {
+
+ if (jsxc.options.displayRosterMinimized()) {
+ // Show minimized roster
+ jsxc.storage.setUserItem('roster', 'hidden');
+ jsxc.gui.roster.init();
+ jsxc.gui.roster.noConnection();
+ }
- // Check localStorage
- if (typeof (localStorage) === 'undefined') {
- jsxc.debug("Browser doesn't support localStorage.");
return;
}
- if (jsxc.storage.getItem('debug') === true) {
- jsxc.options.otr.debug = true;
+ if (typeof jsxc.options.formFound === 'function') {
+ jsxc.options.formFound.call();
}
- // Register event listener for the storage event
- window.addEventListener('storage', jsxc.storage.onStorage, false);
+ // create jquery object
+ var form = jsxc.options.loginForm.form = $(jsxc.options.loginForm.form);
+ var events = form.data('events') || {
+ submit: []
+ };
+ var submits = [];
- var lastActivity = jsxc.storage.getItem('lastActivity') || 0;
+ // save attached submit events and remove them. Will be reattached
+ // in jsxc.submitLoginForm
+ $.each(events.submit, function(index, val) {
+ submits.push(val.handler);
+ });
- if ((new Date()).getTime() - lastActivity < jsxc.options.loginTimeout) {
- jsxc.restore = true;
- }
+ form.data('submits', submits);
+ form.off('submit');
- // Check if we have to establish a new connection
- if (!jsxc.storage.getItem('rid') || !jsxc.storage.getItem('sid') || !jsxc.restore) {
+ // Add jsxc login action to form
+ form.submit(function() {
- // Looking for a login form
- if (!jsxc.options.loginForm.form || !(jsxc.el_exists(jsxc.options.loginForm.form) && jsxc.el_exists(jsxc.options.loginForm.jid) && jsxc.el_exists(jsxc.options.loginForm.pass))) {
+ var settings = jsxc.prepareLogin();
- if (jsxc.options.displayRosterMinimized()) {
- // Show minimized roster
- jsxc.storage.setUserItem('roster', 'hidden');
- jsxc.gui.roster.init();
- jsxc.gui.roster.noConnection();
- }
+ if (settings !== false && (settings.xmpp.onlogin === "true" || settings.xmpp.onlogin === true)) {
+ jsxc.options.loginForm.triggered = true;
- return;
- }
+ jsxc.xmpp.login();
- if (typeof jsxc.options.formFound === 'function') {
- jsxc.options.formFound.call();
+ // Trigger submit in jsxc.xmpp.connected()
+ return false;
}
- // create jquery object
- var form = jsxc.options.loginForm.form = $(jsxc.options.loginForm.form);
- var events = form.data('events') || {
- submit: []
- };
- var submits = [];
+ return true;
+ });
- // save attached submit events and remove them. Will be reattached
- // in jsxc.submitLoginForm
- $.each(events.submit, function(index, val) {
- submits.push(val.handler);
- });
+ } else {
- form.data('submits', submits);
- form.off('submit');
+ // Restore old connection
- // Add jsxc login action to form
- form.submit(function() {
+ jsxc.bid = jsxc.jidToBid(jsxc.storage.getItem('jid'));
- var settings = jsxc.prepareLogin();
+ jsxc.gui.init();
- if (settings !== false && (settings.xmpp.onlogin === "true" || settings.xmpp.onlogin === true)) {
- jsxc.options.loginForm.triggered = true;
+ if (typeof (jsxc.storage.getItem('alive')) === 'undefined' || !jsxc.restore) {
+ jsxc.onMaster();
+ } else {
+ jsxc.checkMaster();
+ }
+ }
+ },
- jsxc.xmpp.login();
+ /**
+ * Load settings and prepare jid.
+ *
+ * @memberOf jsxc
+ * @returns Loaded settings
+ */
+ prepareLogin: function() {
+ var username = $(jsxc.options.loginForm.jid).val();
+ var password = $(jsxc.options.loginForm.pass).val();
- // Trigger submit in jsxc.xmpp.connected()
- return false;
- }
+ if (typeof jsxc.options.loadSettings !== 'function') {
+ jsxc.error('No loadSettings function given. Abort.');
+ return;
+ }
- return true;
- });
+ jsxc.gui.showWaitAlert($.t('Logging_in'));
- } else {
+ var settings = jsxc.options.loadSettings.call(this, username, password);
- // Restore old connection
+ if (settings === false || settings === null || typeof settings === 'undefined') {
+ jsxc.warn('No settings provided');
- jsxc.bid = jsxc.jidToBid(jsxc.storage.getItem('jid'));
+ return false;
+ }
- jsxc.gui.init();
+ if (typeof settings.xmpp.username === 'string') {
+ username = settings.xmpp.username;
+ }
- // Looking for logout element
- if (jsxc.options.logoutElement !== null && jsxc.options.logoutElement.length > 0) {
- jsxc.options.logoutElement.one('click', function() {
- jsxc.options.logoutElement = $(this);
- jsxc.triggeredFromLogout = true;
- return jsxc.xmpp.logout();
- });
- }
+ var resource = (settings.xmpp.resource) ? '/' + settings.xmpp.resource : '';
+ var domain = settings.xmpp.domain;
+ var jid;
- if (typeof (jsxc.storage.getItem('alive')) === 'undefined' || !jsxc.restore) {
- jsxc.onMaster();
- } else {
- jsxc.checkMaster();
- }
- }
- },
+ if (username.match(/@(.*)$/)) {
+ jid = (username.match(/\/(.*)$/)) ? username : username + resource;
+ } else {
+ jid = username + '@' + domain + resource;
+ }
- /**
- * Load settings and prepare jid.
- *
- * @memberOf jsxc
- * @returns Loaded settings
- */
- prepareLogin: function() {
- var username = $(jsxc.options.loginForm.jid).val();
- var password = $(jsxc.options.loginForm.pass).val();
+ if (typeof jsxc.options.loginForm.preJid === 'function') {
+ jid = jsxc.options.loginForm.preJid(jid);
+ }
- if (typeof jsxc.options.loadSettings !== 'function') {
- jsxc.error('No loadSettings function given. Abort.');
- return;
- }
+ jsxc.bid = jsxc.jidToBid(jid);
- jsxc.gui.showWaitAlert(jsxc.l.Logging_in);
+ settings.xmpp.username = jid.split('@')[0];
+ settings.xmpp.domain = jid.split('@')[1].split('/')[0];
+ settings.xmpp.resource = jid.split('@')[1].split('/')[1] || "";
- var settings = jsxc.options.loadSettings.call(this, username, password);
+ $.each(settings, function(key, val) {
+ jsxc.options.set(key, val);
+ });
- if (settings === false || settings === null || typeof settings === 'undefined') {
- jsxc.warn('No settings provided');
+ jsxc.options.xmpp.jid = jid;
+ jsxc.options.xmpp.password = password;
- return false;
- }
+ return settings;
+ },
- if (typeof settings.xmpp.username === 'string') {
- username = settings.xmpp.username;
- }
+ /**
+ * Called if the script is a slave
+ */
+ onSlave: function() {
+ jsxc.debug('I am the slave.');
- var resource = (settings.xmpp.resource) ? '/' + settings.xmpp.resource : '';
- var domain = settings.xmpp.domain;
- var jid;
+ jsxc.role_allocation = true;
- if (username.match(/@(.*)$/)) {
- jid = (username.match(/\/(.*)$/)) ? username : username + resource;
- } else {
- jid = username + '@' + domain + resource;
- }
+ jsxc.restoreRoster();
+ jsxc.restoreWindows();
+ jsxc.restoreCompleted = true;
- if (typeof jsxc.options.loginForm.preJid === 'function') {
- jid = jsxc.options.loginForm.preJid(jid);
- }
+ $(document).trigger('restoreCompleted.jsxc');
+ },
- jsxc.bid = jsxc.jidToBid(jid);
+ /**
+ * Called if the script is the master
+ */
+ onMaster: function() {
+ jsxc.debug('I am master.');
- settings.xmpp.username = jid.split('@')[0];
- settings.xmpp.domain = jid.split('@')[1].split('/')[0];
- settings.xmpp.resource = jid.split('@')[1].split('/')[1] || "";
+ jsxc.master = true;
- $.each(settings, function(key, val) {
- jsxc.options.set(key, val);
- });
+ // Init local storage
+ jsxc.storage.setItem('alive', 0);
+ jsxc.storage.setItem('alive_busy', 0);
+ if (!jsxc.storage.getUserItem('windowlist')) {
+ jsxc.storage.setUserItem('windowlist', []);
+ }
- jsxc.options.xmpp.jid = jid;
- jsxc.options.xmpp.password = password;
+ // Sending keepalive signal
+ jsxc.startKeepAlive();
- return settings;
- },
+ if (jsxc.options.get('otr').enable) {
+ // create or load DSA key and call _onMaster
+ jsxc.otr.createDSA();
+ } else {
+ jsxc._onMaster();
+ }
+ },
- /**
- * Called if the script is a slave
- */
- onSlave: function() {
- jsxc.debug('I am the slave.');
+ /**
+ * Second half of the onMaster routine
+ */
+ _onMaster: function() {
+
+ // create otr objects, if we lost the master
+ if (jsxc.role_allocation) {
+ $.each(jsxc.storage.getUserItem('windowlist'), function(index, val) {
+ jsxc.otr.create(val);
+ });
+ }
- jsxc.role_allocation = true;
+ jsxc.role_allocation = true;
+ if (jsxc.restore && !jsxc.restoreCompleted) {
jsxc.restoreRoster();
jsxc.restoreWindows();
jsxc.restoreCompleted = true;
$(document).trigger('restoreCompleted.jsxc');
- },
-
- /**
- * Called if the script is the master
- */
- onMaster: function() {
- jsxc.debug('I am master.');
-
- jsxc.master = true;
+ }
- // Init local storage
- jsxc.storage.setItem('alive', 0);
- jsxc.storage.setItem('alive_busy', 0);
- if (!jsxc.storage.getUserItem('windowlist')) {
- jsxc.storage.setUserItem('windowlist', []);
+ // Prepare notifications
+ if (jsxc.restore) {
+ var noti = jsxc.storage.getUserItem('notification');
+ noti = (typeof noti === 'number')? noti : 2;
+ if (jsxc.options.notification && noti > 0 && jsxc.notification.hasSupport()) {
+ if (jsxc.notification.hasPermission()) {
+ jsxc.notification.init();
+ } else {
+ jsxc.notification.prepareRequest();
+ }
+ } else {
+ // No support => disable
+ jsxc.options.notification = false;
}
+ }
- // Sending keepalive signal
- jsxc.startKeepAlive();
+ $(document).on('connectionReady.jsxc', function() {
+ jsxc.gui.updateAvatar($('#jsxc_avatar'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
+ });
- if (jsxc.options.get('otr').enable) {
- // create or load DSA key and call _onMaster
- jsxc.otr.createDSA();
- } else {
- jsxc._onMaster();
- }
- },
+ jsxc.xmpp.login();
+ },
- /**
- * Second half of the onMaster routine
- */
- _onMaster: function() {
+ /**
+ * Checks if there is a master
+ */
+ checkMaster: function() {
+ jsxc.debug('check master');
- // create otr objects, if we lost the master
- if (jsxc.role_allocation) {
- $.each(jsxc.storage.getUserItem('windowlist'), function(index, val) {
- jsxc.otr.create(val);
- });
- }
+ jsxc.to = window.setTimeout(jsxc.onMaster, 1000);
+ jsxc.storage.ink('alive');
+ },
- jsxc.role_allocation = true;
+ /**
+ * Start sending keep-alive signal
+ */
+ startKeepAlive: function() {
+ jsxc.keepalive = window.setInterval(jsxc.keepAlive, jsxc.options.timeout - 1000);
+ },
- if (jsxc.restore && !jsxc.restoreCompleted) {
- jsxc.restoreRoster();
- jsxc.restoreWindows();
- jsxc.restoreCompleted = true;
+ /**
+ * Sends the keep-alive signal to signal that the master is still there.
+ */
+ keepAlive: function() {
+ jsxc.storage.ink('alive');
- $(document).trigger('restoreCompleted.jsxc');
- }
+ if (jsxc.role_allocation) {
+ jsxc.storage.setItem('lastActivity', (new Date()).getTime());
+ }
+ },
- // Prepare notifications
- if (jsxc.restore) {
- var noti = jsxc.storage.getUserItem('notification') || 2;
- if (jsxc.options.notification && noti > 0 && jsxc.notification.hasSupport()) {
- if (jsxc.notification.hasPermission()) {
- jsxc.notification.init();
- } else {
- jsxc.notification.prepareRequest();
- }
- } else {
- // No support => disable
- jsxc.options.notification = false;
- }
- }
+ /**
+ * Send one keep-alive signal with higher timeout, and than resume with
+ * normal signal
+ */
+ keepBusyAlive: function() {
+ if (jsxc.toBusy) {
+ window.clearTimeout(jsxc.toBusy);
+ }
- $(document).on('connectionReady.jsxc', function() {
- jsxc.gui.updateAvatar($('#jsxc_avatar'), jsxc.storage.getItem('jid'), 'own');
- });
+ if (jsxc.keepalive) {
+ window.clearInterval(jsxc.keepalive);
+ }
- jsxc.xmpp.login();
- },
+ jsxc.storage.ink('alive_busy');
+ jsxc.toBusy = window.setTimeout(jsxc.startKeepAlive, jsxc.options.busyTimeout - 1000);
+ },
- /**
- * Checks if there is a master
- */
- checkMaster: function() {
- jsxc.debug('check master');
+ /**
+ * Generates a random integer number between 0 and max
+ *
+ * @param {Integer} max
+ * @return {Integer} random integer between 0 and max
+ */
+ random: function(max) {
+ return Math.floor(Math.random() * max);
+ },
- jsxc.to = window.setTimeout(jsxc.onMaster, 1000);
- jsxc.storage.ink('alive');
- },
+ /**
+ * Checks if there is a element with the given selector
+ *
+ * @param {String} selector jQuery selector
+ * @return {Boolean}
+ */
+ el_exists: function(selector) {
+ return $(selector).length > 0;
+ },
- /**
- * Start sending keep-alive signal
- */
- startKeepAlive: function() {
- jsxc.keepalive = window.setInterval(jsxc.keepAlive, jsxc.options.timeout - 1000);
- },
+ /**
+ * Creates a CSS compatible string from a JID
+ *
+ * @param {type} jid Valid Jabber ID
+ * @returns {String} css Compatible string
+ */
+ jidToCid: function(jid) {
+ jsxc.warn('jsxc.jidToCid is deprecated!');
- /**
- * Sends the keep-alive signal to signal that the master is still there.
- */
- keepAlive: function() {
- jsxc.storage.ink('alive');
+ var cid = Strophe.getBareJidFromJid(jid).replace('@', '-').replace(/\./g, '-').toLowerCase();
- if (jsxc.role_allocation) {
- jsxc.storage.setItem('lastActivity', (new Date()).getTime());
- }
- },
+ return cid;
+ },
- /**
- * Send one keep-alive signal with higher timeout, and than resume with
- * normal signal
- */
- keepBusyAlive: function() {
- if (jsxc.toBusy) {
- window.clearTimeout(jsxc.toBusy);
- }
+ /**
+ * Create comparable bar jid.
+ *
+ * @memberOf jsxc
+ * @param jid
+ * @returns comparable bar jid
+ */
+ jidToBid: function(jid) {
+ return Strophe.getBareJidFromJid(jid).toLowerCase();
+ },
- if (jsxc.keepalive) {
- window.clearInterval(jsxc.keepalive);
- }
+ /**
+ * Restore roster
+ */
+ restoreRoster: function() {
+ var buddies = jsxc.storage.getUserItem('buddylist');
- jsxc.storage.ink('alive_busy');
- jsxc.toBusy = window.setTimeout(jsxc.startKeepAlive, jsxc.options.busyTimeout - 1000);
- },
+ if (!buddies || buddies.length === 0) {
+ jsxc.debug('No saved buddylist.');
- /**
- * Generates a random integer number between 0 and max
- *
- * @param {Integer} max
- * @return {Integer} random integer between 0 and max
- */
- random: function(max) {
- return Math.floor(Math.random() * max);
- },
+ jsxc.gui.roster.empty();
- /**
- * Checks if there is a element with the given selector
- *
- * @param {String} selector jQuery selector
- * @return {Boolean}
- */
- el_exists: function(selector) {
- return $(selector).length > 0;
- },
+ return;
+ }
- /**
- * Creates a CSS compatible string from a JID
- *
- * @param {type} jid Valid Jabber ID
- * @returns {String} css Compatible string
- */
- jidToCid: function(jid) {
- jsxc.warn('jsxc.jidToCid is deprecated!');
+ $.each(buddies, function(index, value) {
+ jsxc.gui.roster.add(value);
+ });
- var cid = Strophe.getBareJidFromJid(jid).replace('@', '-').replace(/\./g, '-').toLowerCase();
+ $(document).trigger('cloaded.roster.jsxc');
+ },
- return cid;
- },
+ /**
+ * Restore all windows
+ */
+ restoreWindows: function() {
+ var windows = jsxc.storage.getUserItem('windowlist');
- /**
- * Create comparable bar jid.
- *
- * @memberOf jsxc
- * @param jid
- * @returns comparable bar jid
- */
- jidToBid: function(jid) {
- return Strophe.getBareJidFromJid(jid).toLowerCase();
- },
+ if (windows === null) {
+ return;
+ }
- /**
- * Restore roster
- */
- restoreRoster: function() {
- var buddies = jsxc.storage.getUserItem('buddylist');
+ $.each(windows, function(index, bid) {
+ var window = jsxc.storage.getUserItem('window', bid);
- if (!buddies || buddies.length === 0) {
- jsxc.debug('No saved buddylist.');
+ if (!window) {
+ jsxc.debug('Associated window-element is missing: ' + bid);
+ return true;
+ }
- jsxc.gui.roster.empty();
+ jsxc.gui.window.init(bid);
- return;
+ if (!window.minimize) {
+ jsxc.gui.window.show(bid);
+ } else {
+ jsxc.gui.window.hide(bid);
}
- $.each(buddies, function(index, value) {
- jsxc.gui.roster.add(value);
- });
+ jsxc.gui.window.setText(bid, window.text);
+ });
+ },
- $(document).trigger('cloaded.roster.jsxc');
- },
+ /**
+ * This method submits the specified login form.
+ */
+ submitLoginForm: function() {
+ var form = jsxc.options.loginForm.form.off('submit');
- /**
- * Restore all windows
- */
- restoreWindows: function() {
- var windows = jsxc.storage.getUserItem('windowlist');
+ // Attach original events
+ var submits = form.data('submits') || [];
+ $.each(submits, function(index, val) {
+ form.submit(val);
+ });
- if (windows === null) {
- return;
- }
+ if (form.find('#submit').length > 0) {
+ form.find('#submit').click();
+ } else {
+ form.submit();
+ }
+ },
- $.each(windows, function(index, bid) {
- var window = jsxc.storage.getUserItem('window', bid);
+ /**
+ * Escapes some characters to HTML character
+ */
+ escapeHTML: function(text) {
+ text = text.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+ },
- if (!window) {
- jsxc.debug('Associated window-element is missing: ' + bid);
- return true;
- }
+ /**
+ * Removes all html tags.
+ *
+ * @memberOf jsxc
+ * @param text
+ * @returns stripped text
+ */
+ removeHTML: function(text) {
+ return $('<span>').html(text).text();
+ },
- jsxc.gui.window.init(bid);
+ /**
+ * Executes only one of the given events
+ *
+ * @param {string} obj.key event name
+ * @param {function} obj.value function to execute
+ * @returns {string} namespace of all events
+ */
+ switchEvents: function(obj) {
+ var ns = Math.random().toString(36).substr(2, 12);
+ var self = this;
- if (!window.minimize) {
- jsxc.gui.window.show(bid);
- } else {
- jsxc.gui.window.hide(bid);
- }
+ $.each(obj, function(key, val) {
+ $(document).one(key + '.' + ns, function() {
+ $(document).off('.' + ns);
- jsxc.gui.window.setText(bid, window.text);
+ val.apply(self, arguments);
});
- },
+ });
- /**
- * This method submits the specified login form.
- */
- submitLoginForm: function() {
- var form = jsxc.options.loginForm.form.off('submit');
+ return ns;
+ },
- // Attach original events
- var submits = form.data('submits') || [];
- $.each(submits, function(index, val) {
- form.submit(val);
- });
+ /**
+ * Checks if tab is hidden.
+ *
+ * @returns {boolean} True if tab is hidden
+ */
+ isHidden: function() {
+ var hidden = false;
+
+ if (typeof document.hidden !== 'undefined') {
+ hidden = document.hidden;
+ } else if (typeof document.webkitHidden !== 'undefined') {
+ hidden = document.webkitHidden;
+ } else if (typeof document.mozHidden !== 'undefined') {
+ hidden = document.mozHidden;
+ } else if (typeof document.msHidden !== 'undefined') {
+ hidden = document.msHidden;
+ }
- if (form.find('#submit').length > 0) {
- form.find('#submit').click();
- } else {
- form.submit();
- }
- },
+ // handle multiple tabs
+ if (hidden && jsxc.master) {
+ jsxc.storage.ink('hidden', 0);
+ } else if (!hidden && !jsxc.master) {
+ jsxc.storage.ink('hidden');
+ }
- /**
- * Escapes some characters to HTML character
- */
- escapeHTML: function(text) {
- text = text.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
- return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
- },
+ return hidden;
+ },
- /**
- * Removes all html tags.
- *
- * @memberOf jsxc
- * @param text
- * @returns stripped text
- */
- removeHTML: function(text) {
- return $('<span>').html(text).text();
- },
+ /**
+ * Checks if tab has focus.
+ *
+ * @returns {boolean} True if tabs has focus
+ */
+ hasFocus: function() {
+ var focus = true;
- /**
- * Executes only one of the given events
- *
- * @param {string} obj.key event name
- * @param {function} obj.value function to execute
- * @returns {string} namespace of all events
- */
- switchEvents: function(obj) {
- var ns = Math.random().toString(36).substr(2, 12);
- var self = this;
+ if (typeof document.hasFocus === 'function') {
+ focus = document.hasFocus();
+ }
- $.each(obj, function(key, val) {
- $(document).one(key + '.' + ns, function() {
- $(document).off('.' + ns);
+ if (!focus && jsxc.master) {
+ jsxc.storage.ink('focus', 0);
+ } else if (focus && !jsxc.master) {
+ jsxc.storage.ink('focus');
+ }
- val.apply(self, arguments);
- });
- });
+ return focus;
+ },
- return ns;
- },
+ /**
+ * Executes the given function in jsxc namespace.
+ *
+ * @memberOf jsxc
+ * @param {string} fnName Function name
+ * @param {array} fnParams Function parameters
+ * @returns Function return value
+ */
+ exec: function(fnName, fnParams) {
+ var fnList = fnName.split('.');
+ var fn = jsxc[fnList[0]];
+ var i;
+ for (i = 1; i < fnList.length; i++) {
+ fn = fn[fnList[i]];
+ }
- /**
- * Checks if tab is hidden.
- *
- * @returns {boolean} True if tab is hidden
- */
- isHidden: function() {
- var hidden = false;
+ if (typeof fn === 'function') {
+ return fn.apply(null, fnParams);
+ }
+ },
+
+ /**
+ * Hash string into 32-bit signed integer.
+ *
+ * @memberOf jsxc
+ * @param {string} str input string
+ * @returns {integer} 32-bit signed integer
+ */
+ hashStr: function(str) {
+ var hash = 0, i;
- if (typeof document.hidden !== 'undefined') {
- hidden = document.hidden;
- } else if (typeof document.webkitHidden !== 'undefined') {
- hidden = document.webkitHidden;
- } else if (typeof document.mozHidden !== 'undefined') {
- hidden = document.mozHidden;
- } else if (typeof document.msHidden !== 'undefined') {
- hidden = document.msHidden;
- }
+ if (str.length === 0) {
+ return hash;
+ }
+
+ for (i = 0; i < str.length; i++) {
+ hash = ((hash << 5) - hash) + str.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
- // handle multiple tabs
- if (hidden && jsxc.master) {
- jsxc.storage.ink('hidden', 0);
- } else if (!hidden && !jsxc.master) {
- jsxc.storage.ink('hidden');
- }
+ return hash;
+ }
+};
- return hidden;
- },
+/**
+ * Handle functions for chat window's and buddylist
+ *
+ * @namespace jsxc.gui
+ */
+jsxc.gui = {
+ /** Smilie token to file mapping */
+ emotions: [ [ 'O:-) O:)', 'angel' ], [ '>:-( >:( &gt;:-( &gt;:(', 'angry' ], [ ':-) :)', 'smile' ], [ ':-D :D', 'grin' ], [ ':-( :(', 'sad' ], [ ';-) ;)', 'wink' ], [ ':-P :P', 'tonguesmile' ], [ '=-O', 'surprised' ], [ ':kiss: :-*', 'kiss' ], [ '8-) :cool:', 'sunglassess' ], [ ':\'-( :\'( :&amp;apos;-(', 'crysad' ], [ ':-/', 'doubt' ], [ ':-X :X', 'zip' ], [ ':yes:', 'thumbsup' ], [ ':no:', 'thumbsdown' ], [ ':beer:', 'beer' ], [ ':devil:', 'devil' ], [ ':kiss: :kissing:', 'kissing' ], [ '@->-- :rose: @-&gt;--', 'rose' ], [ ':music:', 'music' ], [ ':love:', 'love' ], [ ':zzz:', 'tired' ] ],
- /**
- * Replace %%tokens%% with correct translation.
- *
- * @param {String} text Given text
- * @returns {String} Translated string
- */
- translate: function(text) {
- return text.replace(/%%([a-zA-Z0-9_-}{ .!,?/'@]+)%%/g, function(s, key) {
- var k = key.replace(/ /gi, '_').replace(/[.!,?/'@]/g, '');
+ /**
+ * Different uri query actions as defined in XEP-0147.
+ *
+ * @namespace jsxc.gui.queryActions
+ */
+ queryActions: {
+ /** xmpp:JID?message[;body=TEXT] */
+ message: function(jid, params) {
+ var win = jsxc.gui.window.open(jsxc.jidToBid(jid));
- if (!jsxc.l[k]) {
- jsxc.warn('No translation for: ' + k);
- }
+ if (params && typeof params.body === 'string') {
+ win.find('.jsxc_textinput').val(params.body);
+ }
+ },
- return jsxc.l[k] || key.replace(/_/g, ' ');
- });
+ /** xmpp:JID?remove */
+ remove: function(jid) {
+ jsxc.gui.showRemoveDialog(jsxc.jidToBid(jid));
},
- /**
- * Executes the given function in jsxc namespace.
- *
- * @memberOf jsxc
- * @param {string} fnName Function name
- * @param {array} fnParams Function parameters
- * @returns Function return value
- */
- exec: function(fnName, fnParams) {
- var fnList = fnName.split('.');
- var fn = jsxc[fnList[0]];
- var i;
- for (i = 1; i < fnList.length; i++) {
- fn = fn[fnList[i]];
- }
+ /** xmpp:JID?subscribe[;name=NAME] */
+ subscribe: function(jid, params) {
+ jsxc.gui.showContactDialog(jid);
- if (typeof fn === 'function') {
- return fn.apply(null, fnParams);
+ if (params && typeof params.name) {
+ $('#jsxc_alias').val(params.name);
}
+ },
+
+ /** xmpp:JID?vcard */
+ vcard: function(jid) {
+ jsxc.gui.showVcard(jid);
}
- };
+ },
/**
- * Set some options for the chat.
+ * Creates application skeleton.
*
- * @namespace jsxc.options
+ * @memberOf jsxc.gui
*/
- jsxc.options = {
-
- /** name of container application (e.g. owncloud or SOGo) */
- app_name: 'web applications',
-
- /** Timeout for the keepalive signal */
- timeout: 3000,
+ init: function() {
+ // Prevent duplicate windowList
+ if ($('#jsxc_windowList').length > 0) {
+ return;
+ }
- /** Timeout for the keepalive signal if the master is busy */
- busyTimeout: 15000,
+ $('body').append($(jsxc.gui.template.get('windowList')));
- /** OTR options */
- otr: {
- enable: true,
- ERROR_START_AKE: false,
- debug: false,
- SEND_WHITESPACE_TAG: true,
- WHITESPACE_START_AKE: true
- },
+ $(window).resize(jsxc.gui.updateWindowListSB);
+ $('#jsxc_windowList').resize(jsxc.gui.updateWindowListSB);
- /** xmpp options */
- xmpp: {
- url: null,
- jid: null,
- domain: null,
- password: null,
- overwrite: false,
- onlogin: true
- },
+ $('#jsxc_windowListSB .jsxc_scrollLeft').click(function() {
+ jsxc.gui.scrollWindowListBy(-200);
+ });
+ $('#jsxc_windowListSB .jsxc_scrollRight').click(function() {
+ jsxc.gui.scrollWindowListBy(200);
+ });
+ $('#jsxc_windowList').on('wheel', function(ev) {
+ if ($('#jsxc_windowList').data('isOver')) {
+ jsxc.gui.scrollWindowListBy((ev.originalEvent.wheelDelta > 0) ? 200 : -200);
+ }
+ });
- /** default xmpp priorities */
- priority: {
- online: 0,
- chat: 0,
- away: 0,
- xa: 0,
- dnd: 0
- },
+ jsxc.gui.tooltip('#jsxc_windowList');
- /** If all 3 properties are set, the login form is used */
- loginForm: {
- /** jquery object from form */
- form: null,
+ if (!jsxc.el_exists('#jsxc_roster')) {
+ jsxc.gui.roster.init();
+ }
- /** jquery object from input element which contains the jid */
- jid: null,
+ // prepare regexp for emotions
+ $.each(jsxc.gui.emotions, function(i, val) {
+ // escape characters
+ var reg = val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g, '\\$1');
+ reg = '(' + reg.split(' ').join('|') + ')';
+ jsxc.gui.emotions[i][2] = new RegExp(reg, 'g');
+ });
- /** jquery object from input element which contains the password */
- pass: null,
+ // We need this often, so we creates some template jquery objects
+ jsxc.gui.windowTemplate = $(jsxc.gui.template.get('chatWindow'));
+ jsxc.gui.buddyTemplate = $(jsxc.gui.template.get('rosterBuddy'));
+ },
- /** manipulate JID from input element */
- preJid: function(jid) {
- return jid;
+ /**
+ * Init tooltip plugin for given jQuery selector.
+ *
+ * @param {String} selector jQuery selector
+ * @memberOf jsxc.gui
+ */
+ tooltip: function(selector) {
+ $(selector).tooltip({
+ show: {
+ delay: 600
},
+ content: function() {
+ return $(this).attr('title').replace(/\n/g, '<br />');
+ }
+ });
+ },
- /**
- * Action after connected: submit [String] Submit form, false [boolean]
- * Do nothing, continue [String] Start chat
- */
- onConnected: 'submit',
-
- /**
- * Action after auth fail: submit [String] Submit form, false [boolean]
- * Do nothing, ask [String] Show auth fail dialog
- */
- onAuthFail: 'submit'
- },
-
- /** jquery object from logout element */
- logoutElement: null,
-
- /** How many messages should be logged? */
- numberOfMsg: 10,
-
- /** Default language */
- defaultLang: 'en',
+ /**
+ * Updates Information in roster and chatbar
+ *
+ * @param {String} bid bar jid
+ */
+ update: function(bid) {
+ var data = jsxc.storage.getUserItem('buddy', bid);
- /** auto language detection */
- autoLang: true,
+ if (!data) {
+ jsxc.debug('No data for ' + bid);
+ return;
+ }
- /** Place for roster */
- rosterAppend: 'body',
+ var ri = jsxc.gui.roster.getItem(bid); // roster item from user
+ var we = jsxc.gui.window.get(bid); // window element from user
+ var ue = ri.add(we); // both
+ var spot = $('.jsxc_spot[data-bid="' + bid + '"]');
+
+ // Attach data to corresponding roster item
+ ri.data(data);
+
+ // Add online status
+ ue.add(spot).removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + jsxc.CONST.STATUS[data.status]);
+
+ // Change name and add title
+ ue.find('.jsxc_name:first').add(spot).text(data.name).attr('title', $.t('is') + ' ' + jsxc.CONST.STATUS[data.status]);
+
+ // Update gui according to encryption state
+ switch (data.msgstate) {
+ case 0:
+ we.find('.jsxc_transfer').removeClass('jsxc_enc jsxc_fin').attr('title', $.t('your_connection_is_unencrypted'));
+ we.find('.jsxc_settings .jsxc_verification').addClass('jsxc_disabled');
+ we.find('.jsxc_settings .jsxc_transfer').text($.t('start_private'));
+ break;
+ case 1:
+ we.find('.jsxc_transfer').addClass('jsxc_enc').attr('title', $.t('your_connection_is_encrypted'));
+ we.find('.jsxc_settings .jsxc_verification').removeClass('jsxc_disabled');
+ we.find('.jsxc_settings .jsxc_transfer').text($.t('close_private'));
+ break;
+ case 2:
+ we.find('.jsxc_settings .jsxc_verification').addClass('jsxc_disabled');
+ we.find('.jsxc_transfer').removeClass('jsxc_enc').addClass('jsxc_fin').attr('title', $.t('your_buddy_closed_the_private_connection'));
+ we.find('.jsxc_settings .jsxc_transfer').text($.t('close_private'));
+ break;
+ }
- /** Should we use the HTML5 notification API? */
- notification: true,
+ // update gui according to verification state
+ if (data.trust) {
+ we.find('.jsxc_transfer').addClass('jsxc_trust').attr('title', $.t('your_buddy_is_verificated'));
+ } else {
+ we.find('.jsxc_transfer').removeClass('jsxc_trust');
+ }
- /** duration for notification */
- popupDuration: 6000,
+ // update gui according to subscription state
+ if (data.sub && data.sub !== 'both') {
+ ue.addClass('jsxc_oneway');
+ } else {
+ ue.removeClass('jsxc_oneway');
+ }
- /** Absolute path root of JSXC installation */
- root: '',
+ var info = '<b>' + Strophe.getBareJidFromJid(data.jid) + '</b>\n';
+ info += $.t('Subscription') + ': ' + $.t(data.sub) + '\n';
+ info += $.t('Status') + ': ' + $.t(jsxc.CONST.STATUS[data.status]);
- /** Timeout for restore in ms */
- loginTimeout: 1000 * 60 * 10,
+ ri.find('.jsxc_name').attr('title', info);
- /**
- * This function decides wether the roster will be displayed or not if no
- * connection is found.
- */
- displayRosterMinimized: function() {
- return false;
- },
+ jsxc.gui.updateAvatar(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar);
+ },
- /** Set to true if you want to hide offline buddies. */
- hideOffline: false,
+ /**
+ * Update avatar on all given elements.
+ *
+ * @memberOf jsxc.gui
+ * @param {jQuery} el Elements with subelement .jsxc_avatar
+ * @param {string} jid Jid
+ * @param {string} aid Avatar id (sha1 hash of image)
+ */
+ updateAvatar: function(el, jid, aid) {
- /** Mute notification sound? */
- muteNotification: false,
+ var setAvatar = function(src) {
+ if (src === 0 || src === '0') {
+ if (typeof jsxc.options.defaultAvatar === 'function') {
+ jsxc.options.defaultAvatar.call(el, jid);
+ return;
+ }
+ jsxc.gui.avatarPlaceholder(el.find('.jsxc_avatar'), jid);
+ return;
+ }
- /**
- * If no avatar is found, this function is called.
- *
- * @param jid Jid of that user.
- * @this {jQuery} Elements to update with probable .jsxc_avatar elements
- */
- defaultAvatar: function() {
+ el.find('.jsxc_avatar').removeAttr('style');
- },
+ el.find('.jsxc_avatar').css({
+ 'background-image': 'url(' + src + ')',
+ 'text-indent': '999px'
+ });
+ };
+
+ if (typeof aid === 'undefined') {
+ setAvatar(0);
+ return;
+ }
+
+ var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
+
+ if (avatarSrc !== null) {
+ setAvatar(avatarSrc);
+ } else {
+ jsxc.xmpp.conn.vcard.get(function(stanza) {
+ jsxc.debug('vCard', stanza);
+
+ var vCard = $(stanza).find("vCard > PHOTO");
+ var src;
+
+ if (vCard.length === 0) {
+ jsxc.debug('No photo provided');
+ src = '0';
+ } else if (vCard.find('EXTVAL').length > 0) {
+ src = vCard.find('EXTVAL').text();
+ } else {
+ var img = vCard.find('BINVAL').text();
+ var type = vCard.find('TYPE').text();
+ src = 'data:' + type + ';base64,' + img;
+ }
- /**
- * Returns permanent saved settings and overwrite default jsxc.options.
- *
- * @memberOf jsxc.options
- * @param username String username
- * @param password String password
- * @returns {object} at least xmpp.url
- */
- loadSettings: function() {
+ // concat chunks
+ src = src.replace(/[\t\r\n\f]/gi, '');
- },
+ jsxc.storage.setUserItem('avatar', aid, src);
+ setAvatar(src);
+ }, Strophe.getBareJidFromJid(jid), function(msg) {
+ jsxc.warn('Could not load vcard.', msg);
- /**
- * Call this function to save user settings permanent.
- *
- * @memberOf jsxc.options
- * @param data Holds all data as key/value
- * @returns {boolean} false if function failes
- */
- saveSettinsPermanent: function() {
+ jsxc.storage.setUserItem('avatar', aid, 0);
+ setAvatar(0);
+ });
+ }
+ },
- },
+ /**
+ * Updates scrollbar handlers.
+ *
+ * @memberOf jsxc.gui
+ */
+ updateWindowListSB: function() {
- carbons: {
- /** Enable carbon copies? */
- enable: false
+ if ($('#jsxc_windowList>ul').width() > $('#jsxc_windowList').width()) {
+ $('#jsxc_windowListSB > div').removeClass('jsxc_disabled');
+ } else {
+ $('#jsxc_windowListSB > div').addClass('jsxc_disabled');
+ $('#jsxc_windowList>ul').css('right', '0px');
}
- };
+ },
/**
- * Handle functions for chat window's and buddylist
+ * Scroll window list by offset.
*
- * @namespace jsxc.gui
+ * @memberOf jsxc.gui
+ * @param offset
*/
- jsxc.gui = {
- /** Smilie token to file mapping */
- emotions: [ [ 'O:-) O:)', 'angel' ], [ '>:-( >:( &gt;:-( &gt;:(', 'angry' ], [ ':-) :)', 'smile' ], [ ':-D :D', 'grin' ], [ ':-( :(', 'sad' ], [ ';-) ;)', 'wink' ], [ ':-P :P', 'tonguesmile' ], [ '=-O', 'surprised' ], [ ':kiss: :-*', 'kiss' ], [ '8-) :cool:', 'sunglassess' ], [ ':\'-( :\'( :&amp;apos;-(', 'crysad' ], [ ':-/', 'doubt' ], [ ':-X :X', 'zip' ], [ ':yes:', 'thumbsup' ], [ ':no:', 'thumbsdown' ], [ ':beer:', 'beer' ], [ ':devil:', 'devil' ], [ ':kiss: :kissing:', 'kissing' ], [ '@->-- :rose: @-&gt;--', 'rose' ], [ ':music:', 'music' ], [ ':love:', 'love' ], [ ':zzz:', 'tired' ] ],
+ scrollWindowListBy: function(offset) {
- /**
- * Different uri query actions as defined in XEP-0147.
- *
- * @namespace jsxc.gui.queryActions
- */
- queryActions: {
- /** xmpp:JID?message[;body=TEXT] */
- message: function(jid, params) {
- var win = jsxc.gui.window.open(jsxc.jidToBid(jid));
+ var scrollWidth = $('#jsxc_windowList>ul').width();
+ var width = $('#jsxc_windowList').width();
+ var el = $('#jsxc_windowList>ul');
+ var right = parseInt(el.css('right')) - offset;
+ var padding = $("#jsxc_windowListSB").width();
- if (params && typeof params.body === 'string') {
- win.find('.jsxc_textinput').val(params.body);
- }
- },
+ if (scrollWidth < width) {
+ return;
+ }
- /** xmpp:JID?remove */
- remove: function(jid) {
- jsxc.gui.showRemoveDialog(jsxc.jidToBid(jid));
- },
+ if (right > 0) {
+ right = 0;
+ }
- /** xmpp:JID?subscribe[;name=NAME] */
- subscribe: function(jid, params) {
- jsxc.gui.showContactDialog(jid);
+ if (right < width - scrollWidth - padding) {
+ right = width - scrollWidth - padding;
+ }
- if (params && typeof params.name) {
- $('#jsxc_alias').val(params.name);
- }
- },
+ el.css('right', right + 'px');
+ },
- /** xmpp:JID?vcard */
- vcard: function(jid) {
- jsxc.gui.showVcard(jid);
- }
- },
+ /**
+ * Returns the window element
+ *
+ * @param {String} bid
+ * @returns {jquery} jQuery object of the window element
+ */
+ getWindow: function(bid) {
+ jsxc.warn('jsxc.gui.getWindow is deprecated!');
- /**
- * Creates application skeleton.
- *
- * @memberOf jsxc.gui
- */
- init: function() {
- //Prevent duplicate windowList
- if ($('#jsxc_windowList').length > 0) {
- return;
- }
+ return jsxc.gui.window.get(bid);
+ },
+
+ /**
+ * Toggle list with timeout, like menu or settings
+ *
+ * @memberof jsxc.gui
+ */
+ toggleList: function() {
+ var self = $(this);
- $('body').append($(jsxc.gui.template.get('windowList')));
+ self.disableSelection();
- $(window).resize(jsxc.gui.updateWindowListSB);
- $('#jsxc_windowList').resize(jsxc.gui.updateWindowListSB);
+ var ul = self.find('ul');
+ var slideUp = null;
- $('#jsxc_windowListSB .jsxc_scrollLeft').click(function() {
- jsxc.gui.scrollWindowListBy(-200);
- });
- $('#jsxc_windowListSB .jsxc_scrollRight').click(function() {
- jsxc.gui.scrollWindowListBy(200);
- });
- $('#jsxc_windowList').on('wheel', function(ev) {
- if ($('#jsxc_windowList').data('isOver')) {
- jsxc.gui.scrollWindowListBy((ev.originalEvent.wheelDelta > 0) ? 200 : -200);
+ slideUp = function() {
+ ul.slideUp({
+ complete: function() {
+ self.removeClass('jsxc_opened');
}
});
- jsxc.gui.tooltip('#jsxc_windowList');
+ $('body').off('click', null, slideUp);
+ };
+
+ $(this).click(function() {
- if (!jsxc.el_exists('#jsxc_roster')) {
- jsxc.gui.roster.init();
+ if (ul.is(":hidden")) {
+ // hide other lists
+ $('body').click();
+ $('body').one('click', slideUp);
+ } else {
+ $('body').off('click', null, slideUp);
}
- // prepare regexp for emotions
- $.each(jsxc.gui.emotions, function(i, val) {
- // escape characters
- var reg = val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g, '\\$1');
- reg = '(' + reg.split(' ').join('|') + ')';
- jsxc.gui.emotions[i][2] = new RegExp(reg, 'g');
- });
+ ul.slideToggle();
- // We need this often, so we creates some template jquery objects
- jsxc.gui.windowTemplate = $(jsxc.gui.template.get('chatWindow'));
- jsxc.gui.buddyTemplate = $(jsxc.gui.template.get('rosterBuddy'));
- },
+ window.clearTimeout(ul.data('timer'));
- /**
- * Init tooltip plugin for given jQuery selector.
- *
- * @param {String} selector jQuery selector
- * @memberOf jsxc.gui
- */
- tooltip: function(selector) {
- $(selector).tooltip({
- show: {
- delay: 600
- },
- content: function() {
- return $(this).attr('title').replace(/\n/g, '<br />');
- }
- });
- },
+ self.toggleClass('jsxc_opened');
- /**
- * Updates Information in roster and chatbar
- *
- * @param {String} bid bar jid
- */
- update: function(bid) {
- var data = jsxc.storage.getUserItem('buddy', bid);
+ return false;
+ }).mouseleave(function() {
+ ul.data('timer', window.setTimeout(slideUp, 2000));
+ }).mouseenter(function() {
+ window.clearTimeout(ul.data('timer'));
+ });
+ },
- if (!data) {
- jsxc.debug('No data for ' + bid);
- return;
- }
+ /**
+ * Creates and show loginbox
+ */
+ showLoginBox: function() {
+ // Set focus to password field
+ $(document).on("complete.dialog.jsxc", function() {
+ $('#jsxc_password').focus();
+ });
- var ri = jsxc.gui.roster.getItem(bid); // roster item from user
- var we = jsxc.gui.window.get(bid); // window element from user
- var ue = ri.add(we); // both
- var spot = $('.jsxc_spot[data-bid="' + bid + '"]');
+ jsxc.gui.dialog.open(jsxc.gui.template.get('loginBox'));
- // Attach data to corresponding roster item
- ri.data(data);
+ $('#jsxc_dialog').find('form').submit(function() {
- // Add online status
- ue.add(spot).removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + jsxc.CONST.STATUS[data.status]);
+ $(this).find('input[type=submit]').prop('disabled', true);
- // Change name and add title
- ue.find('.jsxc_name').add(spot).text(data.name).attr('title', jsxc.l.is + ' ' + jsxc.CONST.STATUS[data.status]);
+ jsxc.options.loginForm.form = $(this);
+ jsxc.options.loginForm.jid = $(this).find('#jsxc_username');
+ jsxc.options.loginForm.pass = $(this).find('#jsxc_password');
- // Update gui according to encryption state
- switch (data.msgstate) {
- case 0:
- we.find('.jsxc_transfer').removeClass('jsxc_enc jsxc_fin').attr('title', jsxc.l.your_connection_is_unencrypted);
- we.find('.jsxc_settings .jsxc_verification').addClass('jsxc_disabled');
- we.find('.jsxc_settings .jsxc_transfer').text(jsxc.l.start_private);
- break;
- case 1:
- we.find('.jsxc_transfer').addClass('jsxc_enc').attr('title', jsxc.l.your_connection_is_encrypted);
- we.find('.jsxc_settings .jsxc_verification').removeClass('jsxc_disabled');
- we.find('.jsxc_settings .jsxc_transfer').text(jsxc.l.close_private);
- break;
- case 2:
- we.find('.jsxc_settings .jsxc_verification').addClass('jsxc_disabled');
- we.find('.jsxc_transfer').removeClass('jsxc_enc').addClass('jsxc_fin').attr('title', jsxc.l.your_buddy_closed_the_private_connection);
- we.find('.jsxc_settings .jsxc_transfer').text(jsxc.l.close_private);
- break;
- }
+ var settings = jsxc.prepareLogin();
- // update gui according to verification state
- if (data.trust) {
- we.find('.jsxc_transfer').addClass('jsxc_trust').attr('title', jsxc.l.your_buddy_is_verificated);
- } else {
- we.find('.jsxc_transfer').removeClass('jsxc_trust');
- }
+ jsxc.triggeredFromBox = true;
+ jsxc.options.loginForm.triggered = false;
- // update gui according to subscription state
- if (data.sub && data.sub !== 'both') {
- ue.addClass('jsxc_oneway');
+ if (settings === false) {
+ jsxc.gui.showAuthFail();
} else {
- ue.removeClass('jsxc_oneway');
+ jsxc.xmpp.login();
}
- var info = '<b>' + Strophe.getBareJidFromJid(data.jid) + '</b>\n';
- info += jsxc.translate('%%Subscription%%: %%' + data.sub + '%%\n');
- info += jsxc.translate('%%Status%%: %%' + jsxc.CONST.STATUS[data.status] + '%%');
+ return false;
+ });
+ },
- ri.find('.jsxc_name').attr('title', info);
+ /**
+ * Creates and show the fingerprint dialog
+ *
+ * @param {String} bid
+ */
+ showFingerprints: function(bid) {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('fingerprintsDialog', bid));
+ },
- if (data.avatar && data.avatar.length > 0) {
- jsxc.gui.updateAvatar(ue, data.jid, data.avatar);
- } else {
- jsxc.options.defaultAvatar.call(ue, data.jid);
- }
- },
+ /**
+ * Creates and show the verification dialog
+ *
+ * @param {String} bid
+ */
+ showVerification: function(bid) {
- /**
- * Update avatar on all given elements.
- *
- * @memberOf jsxc.gui
- * @param {jQuery} el Elements with subelement .jsxc_avatar
- * @param {string} jid Jid
- * @param {string} aid Avatar id (sha1 hash of image)
- */
- updateAvatar: function(el, jid, aid) {
+ // Check if there is a open dialog
+ if ($('#jsxc_dialog').length > 0) {
+ setTimeout(function() {
+ jsxc.gui.showVerification(bid);
+ }, 3000);
+ return;
+ }
- if (typeof aid === 'undefined') {
- if (typeof jsxc.options.defaultAvatar === 'function') {
- jsxc.options.defaultAvatar.call(el, jid);
- }
- return;
- }
+ // verification only possible if the connection is encrypted
+ if (jsxc.storage.getUserItem('buddy', bid).msgstate !== OTR.CONST.MSGSTATE_ENCRYPTED) {
+ jsxc.warn('Connection not encrypted');
+ return;
+ }
- var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
+ jsxc.gui.dialog.open(jsxc.gui.template.get('authenticationDialog', bid));
- var setAvatar = function(src) {
- if (src === 0 || src === '0') {
- jsxc.options.defaultAvatar.call(el, jid);
- return;
+ // Add handler
+
+ $('#jsxc_dialog > div:gt(0)').hide();
+ $('#jsxc_dialog select').change(function() {
+ $('#jsxc_dialog > div:gt(0)').hide();
+ $('#jsxc_dialog > div:eq(' + $(this).prop('selectedIndex') + ')').slideDown({
+ complete: function() {
+ jsxc.gui.dialog.resize();
}
+ });
+ });
- el.find('.jsxc_avatar').removeAttr('style');
+ // Manual
+ $('#jsxc_dialog > div:eq(1) a.creation').click(function() {
+ if (jsxc.master) {
+ jsxc.otr.objects[bid].trust = true;
+ }
- el.find('.jsxc_avatar').css({
- 'background-image': 'url(' + src + ')',
- 'text-indent': '999px'
- });
- };
+ jsxc.storage.updateUserItem('buddy', bid, 'trust', true);
- if (avatarSrc !== null) {
- setAvatar(avatarSrc);
- } else {
- jsxc.xmpp.conn.vcard.get(function(stanza) {
- jsxc.debug('vCard', stanza);
+ jsxc.gui.dialog.close();
- var vCard = $(stanza).find("vCard > PHOTO");
- var src;
+ jsxc.storage.updateUserItem('buddy', bid, 'trust', true);
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('conversation_is_now_verified'));
+ jsxc.gui.update(bid);
+ });
- if (vCard.length === 0) {
- jsxc.debug('No photo provided');
- src = '0';
- } else if (vCard.find('EXTVAL').length > 0) {
- src = vCard.find('EXTVAL').text();
- } else {
- var img = vCard.find('BINVAL').text();
- var type = vCard.find('TYPE').text();
- src = 'data:' + type + ';base64,' + img;
+ // Question
+ $('#jsxc_dialog > div:eq(2) a.creation').click(function() {
+ var div = $('#jsxc_dialog > div:eq(2)');
+ var sec = div.find('#jsxc_secret2').val();
+ var quest = div.find('#jsxc_quest').val();
+
+ if (sec === '' || quest === '') {
+ // Add information for the user which form is missing
+ div.find('input[value=""]').addClass('jsxc_invalid').keyup(function() {
+ if ($(this).val().match(/.*/)) {
+ $(this).removeClass('jsxc_invalid');
}
-
- // concat chunks
- src = src.replace(/[\t\r\n\f]/gi, '');
-
- jsxc.storage.setUserItem('avatar', aid, src);
- setAvatar(src);
- }, Strophe.getBareJidFromJid(jid), function(msg) {
- jsxc.warn('Could not load vcard.', msg);
-
- jsxc.storage.setUserItem('avatar', aid, 0);
- setAvatar(0);
});
+ return;
}
- },
-
- /**
- * Updates scrollbar handlers.
- *
- * @memberOf jsxc.gui
- */
- updateWindowListSB: function() {
- if ($('#jsxc_windowList>ul').width() > $('#jsxc_windowList').width()) {
- $('#jsxc_windowListSB > div').removeClass('jsxc_disabled');
+ if (jsxc.master) {
+ jsxc.otr.sendSmpReq(bid, sec, quest);
} else {
- $('#jsxc_windowListSB > div').addClass('jsxc_disabled');
- $('#jsxc_windowList>ul').css('right', '0px');
+ jsxc.storage.setUserItem('smp_' + bid, {
+ sec: sec,
+ quest: quest
+ });
}
- },
-
- /**
- * Scroll window list by offset.
- *
- * @memberOf jsxc.gui
- * @param offset
- */
- scrollWindowListBy: function(offset) {
- var scrollWidth = $('#jsxc_windowList>ul').width();
- var width = $('#jsxc_windowList').width();
- var el = $('#jsxc_windowList>ul');
- var right = parseInt(el.css('right')) - offset;
- var padding = $("#jsxc_windowListSB").width();
+ jsxc.gui.dialog.close();
- if (scrollWidth < width) {
- return;
- }
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('authentication_query_sent'));
+ });
- if (right > 0) {
- right = 0;
- }
+ // Secret
+ $('#jsxc_dialog > div:eq(3) .creation').click(function() {
+ var div = $('#jsxc_dialog > div:eq(3)');
+ var sec = div.find('#jsxc_secret').val();
- if (right < width - scrollWidth - padding) {
- right = width - scrollWidth - padding;
+ if (sec === '') {
+ // Add information for the user which form is missing
+ div.find('#jsxc_secret').addClass('jsxc_invalid').keyup(function() {
+ if ($(this).val().match(/.*/)) {
+ $(this).removeClass('jsxc_invalid');
+ }
+ });
+ return;
}
- el.css('right', right + 'px');
- },
-
- /**
- * Returns the window element
- *
- * @param {String} bid
- * @returns {jquery} jQuery object of the window element
- */
- getWindow: function(bid) {
- jsxc.warn('jsxc.gui.getWindow is deprecated!');
-
- return jsxc.gui.window.get(bid);
- },
-
- /**
- * Toggle list with timeout, like menu or settings
- *
- * @memberof jsxc.gui
- */
- toggleList: function() {
- var self = $(this);
-
- self.disableSelection();
-
- var ul = self.find('ul');
- var slideUp = null;
-
- slideUp = function() {
- ul.slideUp({
- complete: function() {
- self.removeClass('jsxc_opened');
- }
+ if (jsxc.master) {
+ jsxc.otr.sendSmpReq(bid, sec);
+ } else {
+ jsxc.storage.setUserItem('smp_' + bid, {
+ sec: sec,
+ quest: null
});
+ }
- $('body').off('click', null, slideUp);
- };
+ jsxc.gui.dialog.close();
- $(this).click(function() {
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('authentication_query_sent'));
+ });
+ },
- if (ul.is(":hidden")) {
- // hide other lists
- $('body').click();
- $('body').one('click', slideUp);
- } else {
- $('body').off('click', null, slideUp);
- }
+ /**
+ * Create and show approve dialog
+ *
+ * @param {type} from valid jid
+ */
+ showApproveDialog: function(from) {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('approveDialog'), {
+ 'noClose': true
+ });
- ul.slideToggle();
+ $('#jsxc_dialog .jsxc_their_jid').text(Strophe.getBareJidFromJid(from));
- window.clearTimeout(ul.data('timer'));
+ $('#jsxc_dialog .jsxc_deny').click(function(ev) {
+ ev.stopPropagation();
- self.toggleClass('jsxc_opened');
+ jsxc.xmpp.resFriendReq(from, false);
- return false;
- }).mouseleave(function() {
- ul.data('timer', window.setTimeout(slideUp, 2000));
- }).mouseenter(function() {
- window.clearTimeout(ul.data('timer'));
- });
- },
+ jsxc.gui.dialog.close();
+ });
- /**
- * Creates and show loginbox
- */
- showLoginBox: function() {
- // Set focus to password field
- $(document).on("complete.dialog.jsxc", function() {
- $('#jsxc_password').focus();
- });
+ $('#jsxc_dialog .jsxc_approve').click(function(ev) {
+ ev.stopPropagation();
- jsxc.gui.dialog.open(jsxc.gui.template.get('loginBox'));
+ var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(from));
- $('#jsxc_dialog').find('form').submit(function() {
+ jsxc.xmpp.resFriendReq(from, true);
- $(this).find('input[type=submit]').prop('disabled', true);
+ // If friendship is not mutual show contact dialog
+ if (!data || data.sub === 'from') {
+ $(document).one('close.dialog.jsxc', function() {
+ jsxc.gui.showContactDialog(from);
+ });
+ }
- jsxc.options.loginForm.form = $(this);
- jsxc.options.loginForm.jid = $(this).find('#jsxc_username');
- jsxc.options.loginForm.pass = $(this).find('#jsxc_password');
+ jsxc.gui.dialog.close();
+ });
+ },
- var settings = jsxc.prepareLogin();
+ /**
+ * Create and show dialog to add a buddy
+ *
+ * @param {string} [username] jabber id
+ */
+ showContactDialog: function(username) {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('contactDialog'));
- jsxc.triggeredFromBox = true;
- jsxc.options.loginForm.triggered = false;
+ // If we got a friendship request, we would display the username in our
+ // response
+ if (username) {
+ $('#jsxc_username').val(username);
+ }
- if (settings === false) {
- jsxc.gui.showAuthFail();
- } else {
- jsxc.xmpp.login();
+ $('#jsxc_username').keyup(function() {
+ if (typeof jsxc.options.getUsers === 'function') {
+ var val = $(this).val();
+ $('#jsxc_userlist').empty();
+
+ if (val !== '') {
+ jsxc.options.getUsers.call(this, val, function(list) {
+ $.each(list || {}, function(uid, displayname) {
+ var option = $('<option>');
+ option.attr('data-username', uid);
+ option.attr('data-alias', displayname);
+
+ option.attr('value', uid).appendTo('#jsxc_userlist');
+
+ if (uid !== displayname) {
+ option.clone().attr('value', displayname).appendTo('#jsxc_userlist');
+ }
+ });
+ });
}
-
- return false;
- });
- },
-
- /**
- * Creates and show the fingerprint dialog
- *
- * @param {String} bid
- */
- showFingerprints: function(bid) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('fingerprintsDialog', bid));
- },
-
- /**
- * Creates and show the verification dialog
- *
- * @param {String} bid
- */
- showVerification: function(bid) {
-
- // Check if there is a open dialog
- if ($('#jsxc_dialog').length > 0) {
- setTimeout(function() {
- jsxc.gui.showVerification(bid);
- }, 3000);
- return;
}
+ });
- // verification only possible if the connection is encrypted
- if (jsxc.storage.getUserItem('buddy', bid).msgstate !== OTR.CONST.MSGSTATE_ENCRYPTED) {
- jsxc.warn('Connection not encrypted');
- return;
+ $('#jsxc_username').on('input', function() {
+ var val = $(this).val();
+ var option = $('#jsxc_userlist').find('option[data-username="' + val + '"], option[data-alias="' + val + '"]');
+
+ if (option.length > 0) {
+ $('#jsxc_username').val(option.attr('data-username'));
+ $('#jsxc_alias').val(option.attr('data-alias'));
}
+ });
- jsxc.gui.dialog.open(jsxc.gui.template.get('authenticationDialog', bid));
+ $('#jsxc_dialog form').submit(function() {
+ var username = $('#jsxc_username').val();
+ var alias = $('#jsxc_alias').val();
- // Add handler
+ if (!username.match(/@(.*)$/)) {
+ username += '@' + Strophe.getDomainFromJid(jsxc.storage.getItem('jid'));
+ }
- $('#jsxc_dialog > div:gt(0)').hide();
- $('#jsxc_dialog select').change(function() {
- $('#jsxc_dialog > div:gt(0)').hide();
- $('#jsxc_dialog > div:eq(' + $(this).prop('selectedIndex') + ')').slideDown({
- complete: function() {
- jsxc.gui.dialog.resize();
+ // Check if the username is valid
+ if (!username || !username.match(jsxc.CONST.REGEX.JID)) {
+ // Add notification
+ $('#jsxc_username').addClass('jsxc_invalid').keyup(function() {
+ if ($(this).val().match(jsxc.CONST.REGEX.JID)) {
+ $(this).removeClass('jsxc_invalid');
}
});
- });
-
- // Manual
- $('#jsxc_dialog > div:eq(1) a.creation').click(function() {
- if (jsxc.master) {
- jsxc.otr.objects[bid].trust = true;
- }
-
- jsxc.storage.updateUserItem('buddy', bid, 'trust', true);
+ return false;
+ }
+ jsxc.xmpp.addBuddy(username, alias);
- jsxc.gui.dialog.close();
+ jsxc.gui.dialog.close();
- jsxc.storage.updateUserItem('buddy', bid, 'trust', true);
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.conversation_is_now_verified);
- jsxc.gui.update(bid);
- });
+ return false;
+ });
+ },
- // Question
- $('#jsxc_dialog > div:eq(2) a.creation').click(function() {
- var div = $('#jsxc_dialog > div:eq(2)');
- var sec = div.find('#jsxc_secret2').val();
- var quest = div.find('#jsxc_quest').val();
-
- if (sec === '' || quest === '') {
- // Add information for the user which form is missing
- div.find('input[value=""]').addClass('jsxc_invalid').keyup(function() {
- if ($(this).val().match(/.*/)) {
- $(this).removeClass('jsxc_invalid');
- }
- });
- return;
- }
+ /**
+ * Create and show dialog to remove a buddy
+ *
+ * @param {type} bid
+ * @returns {undefined}
+ */
+ showRemoveDialog: function(bid) {
- if (jsxc.master) {
- jsxc.otr.sendSmpReq(bid, sec, quest);
- } else {
- jsxc.storage.setUserItem('smp_' + bid, {
- sec: sec,
- quest: quest
- });
- }
+ jsxc.gui.dialog.open(jsxc.gui.template.get('removeDialog', bid));
- jsxc.gui.dialog.close();
+ var data = jsxc.storage.getUserItem('buddy', bid);
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.authentication_query_sent);
- });
+ $('#jsxc_dialog .creation').click(function(ev) {
+ ev.stopPropagation();
- // Secret
- $('#jsxc_dialog > div:eq(3) .creation').click(function() {
- var div = $('#jsxc_dialog > div:eq(3)');
- var sec = div.find('#jsxc_secret').val();
+ if (jsxc.master) {
+ jsxc.xmpp.removeBuddy(data.jid);
+ } else {
+ // inform master
+ jsxc.storage.setUserItem('deletebuddy', bid, {
+ jid: data.jid
+ });
+ }
- if (sec === '') {
- // Add information for the user which form is missing
- div.find('#jsxc_secret').addClass('jsxc_invalid').keyup(function() {
- if ($(this).val().match(/.*/)) {
- $(this).removeClass('jsxc_invalid');
- }
- });
- return;
- }
+ jsxc.gui.dialog.close();
+ });
+ },
- if (jsxc.master) {
- jsxc.otr.sendSmpReq(bid, sec);
- } else {
- jsxc.storage.setUserItem('smp_' + bid, {
- sec: sec,
- quest: null
- });
- }
+ /**
+ * Create and show a wait dialog
+ *
+ * @param {type} msg message to display to the user
+ * @returns {undefined}
+ */
+ showWaitAlert: function(msg) {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('waitAlert', null, msg), {
+ 'noClose': true
+ });
+ },
- jsxc.gui.dialog.close();
+ /**
+ * Create and show a wait dialog
+ *
+ * @param {type} msg message to display to the user
+ * @returns {undefined}
+ */
+ showAlert: function(msg) {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('alert', null, msg));
+ },
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.authentication_query_sent);
- });
- },
+ /**
+ * Create and show a auth fail dialog
+ *
+ * @returns {undefined}
+ */
+ showAuthFail: function() {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('authFailDialog'));
- /**
- * Create and show approve dialog
- *
- * @param {type} from valid jid
- */
- showApproveDialog: function(from) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('approveDialog'), {
- 'noClose': true
- });
+ if (jsxc.options.loginForm.triggered !== false) {
+ $('#jsxc_dialog .jsxc_cancel').hide();
+ }
- $('#jsxc_dialog .jsxc_their_jid').text(Strophe.getBareJidFromJid(from));
+ $('#jsxc_dialog .creation').click(function() {
+ jsxc.gui.dialog.close();
+ });
- $('#jsxc_dialog .jsxc_deny').click(function(ev) {
- ev.stopPropagation();
+ $('#jsxc_dialog .jsxc_cancel').click(function() {
+ jsxc.submitLoginForm();
+ });
+ },
- jsxc.xmpp.resFriendReq(from, false);
+ /**
+ * Create and show a confirm dialog
+ *
+ * @param {String} msg Message
+ * @param {function} confirm
+ * @param {function} dismiss
+ * @returns {undefined}
+ */
+ showConfirmDialog: function(msg, confirm, dismiss) {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('confirmDialog', null, msg), {
+ noClose: true
+ });
- jsxc.gui.dialog.close();
- });
+ if (confirm) {
+ $('#jsxc_dialog .creation').click(confirm);
+ }
- $('#jsxc_dialog .jsxc_approve').click(function(ev) {
- ev.stopPropagation();
+ if (dismiss) {
+ $('#jsxc_dialog .jsxc_cancel').click(dismiss);
+ }
+ },
- var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(from));
+ /**
+ * Show about dialog.
+ *
+ * @memberOf jsxc.gui
+ */
+ showAboutDialog: function() {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('aboutDialog'));
- jsxc.xmpp.resFriendReq(from, true);
+ $('#jsxc_dialog .jsxc_debuglog').click(function() {
+ jsxc.gui.showDebugLog();
+ });
+ },
- // If friendship is not mutual show contact dialog
- if (!data || data.sub === 'from') {
- $(document).one('close.dialog.jsxc', function() {
- jsxc.gui.showContactDialog(from);
- });
+ /**
+ * Show debug log.
+ *
+ * @memberOf jsxc.gui
+ */
+ showDebugLog: function() {
+ var userInfo = '<h3>User information</h3>';
+
+ if (navigator) {
+ var key;
+ for (key in navigator) {
+ if (navigator.hasOwnProperty(key) && typeof navigator[key] === 'string') {
+ userInfo += '<b>' + key + ':</b> ' + navigator[key] + '<br />';
}
-
- jsxc.gui.dialog.close();
- });
- },
-
- /**
- * Create and show dialog to add a buddy
- *
- * @param {string} [username] jabber id
- */
- showContactDialog: function(username) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('contactDialog'));
-
- // If we got a friendship request, we would display the username in our
- // response
- if (username) {
- $('#jsxc_username').val(username);
}
+ }
- $('#jsxc_dialog form').submit(function() {
- var username = $('#jsxc_username').val();
- var alias = $('#jsxc_alias').val();
-
- if (!username.match(/@(.*)$/)) {
- username += '@' + Strophe.getDomainFromJid(jsxc.storage.getItem('jid'));
- }
-
- // Check if the username is valid
- if (!username || !username.match(jsxc.CONST.REGEX.JID)) {
- // Add notification
- $('#jsxc_username').addClass('jsxc_invalid').keyup(function() {
- if ($(this).val().match(jsxc.CONST.REGEX.JID)) {
- $(this).removeClass('jsxc_invalid');
- }
- });
- return false;
- }
- jsxc.xmpp.addBuddy(username, alias);
+ if (window.screen) {
+ userInfo += '<b>Height:</b> ' + window.screen.height + '<br />';
+ userInfo += '<b>Width:</b> ' + window.screen.width + '<br />';
+ }
- jsxc.gui.dialog.close();
+ userInfo += '<b>jsxc version:</b> ' + jsxc.version + '<br />';
- return false;
- });
- },
+ jsxc.gui.dialog.open('<div class="jsxc_log">' + userInfo + '<h3>Log</h3><pre>' + jsxc.escapeHTML(jsxc.log) + '</pre></div>');
+ },
- /**
- * Create and show dialog to remove a buddy
- *
- * @param {type} bid
- * @returns {undefined}
- */
- showRemoveDialog: function(bid) {
+ /**
+ * Show vCard of user with the given bar jid.
+ *
+ * @memberOf jsxc.gui
+ * @param {String} jid
+ */
+ showVcard: function(jid) {
+ var bid = jsxc.jidToBid(jid);
+ jsxc.gui.dialog.open(jsxc.gui.template.get('vCard', bid));
- jsxc.gui.dialog.open(jsxc.gui.template.get('removeDialog', bid));
+ var data = jsxc.storage.getUserItem('buddy', bid);
- var data = jsxc.storage.getUserItem('buddy', bid);
+ if (data) {
+ // Display resources and corresponding information
+ var i, j, res, identities, identity = null, cap, client;
+ for (i = 0; i < data.res.length; i++) {
+ res = data.res[i];
- $('#jsxc_dialog .creation').click(function(ev) {
- ev.stopPropagation();
+ identities = [];
+ cap = jsxc.xmpp.getCapabilitiesByJid(bid + '/' + res);
- if (jsxc.master) {
- jsxc.xmpp.removeBuddy(data.jid);
- } else {
- // inform master
- jsxc.storage.setUserItem('deletebuddy', bid, {
- jid: data.jid
- });
+ if (cap !== null && cap.identities !== null) {
+ identities = cap.identities;
}
- jsxc.gui.dialog.close();
- });
- },
-
- /**
- * Create and show a wait dialog
- *
- * @param {type} msg message to display to the user
- * @returns {undefined}
- */
- showWaitAlert: function(msg) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('waitAlert', null, msg), {
- 'noClose': true
- });
- },
+ client = '';
+ for (j = 0; j < identities.length; j++) {
+ identity = identities[j];
+ if (identity.category === 'client') {
+ if (client !== '') {
+ client += ',\n';
+ }
- /**
- * Create and show a wait dialog
- *
- * @param {type} msg message to display to the user
- * @returns {undefined}
- */
- showAlert: function(msg) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('alert', null, msg));
- },
+ client += identity.name + ' (' + identity.type + ')';
+ }
+ }
- /**
- * Create and show a auth fail dialog
- *
- * @returns {undefined}
- */
- showAuthFail: function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('authFailDialog'));
+ var status = jsxc.storage.getUserItem('res', bid)[res];
- if (jsxc.options.loginForm.triggered !== false) {
- $('#jsxc_dialog .jsxc_cancel').hide();
+ $('#jsxc_dialog ul.jsxc_vCard').append('<li class="jsxc_sep"><strong>' + $.t('Resource') + ':</strong> ' + res + '</li>');
+ $('#jsxc_dialog ul.jsxc_vCard').append('<li><strong>' + $.t('Client') + ':</strong> ' + client + '</li>');
+ $('#jsxc_dialog ul.jsxc_vCard').append('<li><strong>' + $.t('Status') + ':</strong> ' + $.t(jsxc.CONST.STATUS[status]) + '</li>');
}
+ }
- $('#jsxc_dialog .creation').click(function() {
- jsxc.gui.dialog.close();
- });
+ var printProp = function(el, depth) {
+ var content = '';
- $('#jsxc_dialog .jsxc_cancel').click(function() {
- jsxc.submitLoginForm();
- });
- },
+ el.each(function() {
+ var item = $(this);
+ var children = $(this).children();
- /**
- * Create and show a confirm dialog
- *
- * @param {String} msg Message
- * @param {function} confirm
- * @param {function} dismiss
- * @returns {undefined}
- */
- showConfirmDialog: function(msg, confirm, dismiss) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('confirmDialog', null, msg), {
- noClose: true
- });
+ content += '<li>';
- if (confirm) {
- $('#jsxc_dialog .creation').click(confirm);
- }
+ var prop = $.t(item[0].tagName);
- if (dismiss) {
- $('#jsxc_dialog .jsxc_cancel').click(dismiss);
- }
- },
+ if (prop !== ' ') {
+ content += '<strong>' + prop + ':</strong> ';
+ }
- /**
- * Show about dialog.
- *
- * @memberOf jsxc.gui
- */
- showAboutDialog: function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('aboutDialog'));
+ if (item[0].tagName === 'PHOTO') {
- $('#jsxc_dialog .jsxc_debuglog').click(function() {
- jsxc.gui.showDebugLog();
- });
- },
+ } else if (children.length > 0) {
+ content += '<ul>';
+ content += printProp(children, depth + 1);
+ content += '</ul>';
+ } else if (item.text() !== '') {
+ content += jsxc.escapeHTML(item.text());
+ }
- /**
- * Show debug log.
- *
- * @memberOf jsxc.gui
- */
- showDebugLog: function() {
- var userInfo = '<h3>User information</h3>';
-
- if (navigator) {
- var key;
- for (key in navigator) {
- if (navigator.hasOwnProperty(key) && typeof navigator[key] === 'string') {
- userInfo += '<b>' + key + ':</b> ' + navigator[key] + '<br />';
+ content += '</li>';
+
+ if (depth === 0 && $('#jsxc_dialog ul.jsxc_vCard').length > 0) {
+ if ($('#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first').length > 0) {
+ $('#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first').before(content);
+ } else {
+ $('#jsxc_dialog ul.jsxc_vCard').append(content);
}
+ content = '';
}
+ });
+
+ if (depth > 0) {
+ return content;
}
+ };
- if (window.screen) {
- userInfo += '<b>Height:</b> ' + window.screen.height + '<br />';
- userInfo += '<b>Width:</b> ' + window.screen.width + '<br />';
+ var failedToLoad = function() {
+ if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) {
+ return;
}
- userInfo += '<b>jsxc version:</b> ' + jsxc.version + '<br />';
+ $('#jsxc_dialog p').remove();
- jsxc.gui.dialog.open('<div class="jsxc_log">' + userInfo + '<h3>Log</h3><pre>' + jsxc.escapeHTML(jsxc.log) + '</pre></div>');
- },
+ var content = '<p>';
+ content += $.t('Sorry_your_buddy_doesnt_provide_any_information');
+ content += '</p>';
- /**
- * Show vCard of user with the given bar jid.
- *
- * @memberOf jsxc.gui
- * @param {String} jid
- */
- showVcard: function(jid) {
- var bid = jsxc.jidToBid(jid);
- jsxc.gui.dialog.open(jsxc.gui.template.get('vCard', bid));
+ $('#jsxc_dialog').append(content);
+ };
- var data = jsxc.storage.getUserItem('buddy', bid);
+ jsxc.xmpp.loadVcard(bid, function(stanza) {
- if (data) {
- // Display resources and corresponding information
- var i, j, res, identities, identity = null, cap, client;
- for (i = 0; i < data.res.length; i++) {
- res = data.res[i];
+ if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) {
+ return;
+ }
- identities = [];
- cap = jsxc.xmpp.getCapabilitiesByJid(bid + '/' + res);
+ $('#jsxc_dialog p').remove();
- if (cap !== null && cap.identities !== null) {
- identities = cap.identities;
- }
+ var photo = $(stanza).find("vCard > PHOTO");
- client = '';
- for (j = 0; j < identities.length; j++) {
- identity = identities[j];
- if (identity.category === 'client') {
- if (client !== '') {
- client += ',\n';
- }
+ if (photo.length > 0) {
+ var img = photo.find('BINVAL').text();
+ var type = photo.find('TYPE').text();
+ var src = 'data:' + type + ';base64,' + img;
- client += identity.name + ' (' + identity.type + ')';
- }
- }
+ if (photo.find('EXTVAL').length > 0) {
+ src = photo.find('EXTVAL').text();
+ }
- var status = jsxc.storage.getUserItem('res', bid)[res];
+ // concat chunks
+ src = src.replace(/[\t\r\n\f]/gi, '');
- $('#jsxc_dialog ul.jsxc_vCard').append('<li class="jsxc_sep"><strong>' + jsxc.translate('%%Resource%%') + ':</strong> ' + res + '</li>');
- $('#jsxc_dialog ul.jsxc_vCard').append('<li><strong>' + jsxc.translate('%%Client%%') + ':</strong> ' + client + '</li>');
- $('#jsxc_dialog ul.jsxc_vCard').append('<li>' + jsxc.translate('<strong>%%Status%%:</strong> %%' + jsxc.CONST.STATUS[status] + '%%') + '</li>');
- }
+ var img_el = $('<img class="jsxc_vCard" alt="avatar" />');
+ img_el.attr('src', src);
+
+ $('#jsxc_dialog h3').before(img_el);
}
- var printProp = function(el, depth) {
- var content = '';
+ if ($(stanza).find('vCard').length === 0 || ($(stanza).find('vcard > *').length === 1 && photo.length === 1)) {
+ failedToLoad();
+ return;
+ }
- el.each(function() {
- var item = $(this);
- var children = $(this).children();
+ printProp($(stanza).find('vcard > *'), 0);
- content += '<li>';
+ }, failedToLoad);
+ },
- var prop = jsxc.translate('%%' + item[0].tagName + '%%');
+ showSettings: function() {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('settings'));
- if (prop !== ' ') {
- content += '<strong>' + prop + ':</strong> ';
- }
+ if (jsxc.options.get('xmpp').overwrite === 'false' || jsxc.options.get('xmpp').overwrite === false) {
+ $('.jsxc_fieldsetXmpp').hide();
+ }
- if (item[0].tagName === 'PHOTO') {
+ $('#jsxc_dialog form').each(function() {
+ var self = $(this);
- } else if (children.length > 0) {
- content += '<ul>';
- content += printProp(children, depth + 1);
- content += '</ul>';
- } else if (item.text() !== '') {
- content += jsxc.escapeHTML(item.text());
- }
+ self.find('input[type!="submit"]').each(function() {
+ var id = this.id.split("-");
+ var prop = id[0];
+ var key = id[1];
+ var type = this.type;
- content += '</li>';
+ var data = jsxc.options.get(prop);
- if (depth === 0 && $('#jsxc_dialog ul.jsxc_vCard').length > 0) {
- if ($('#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first').length > 0) {
- $('#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first').before(content);
- } else {
- $('#jsxc_dialog ul.jsxc_vCard').append(content);
+ if (data && typeof data[key] !== 'undefined') {
+ if (type === 'checkbox') {
+ if (data[key] !== 'false' && data[key] !== false) {
+ this.checked = 'checked';
}
- content = '';
+ } else {
+ $(this).val(data[key]);
}
- });
-
- if (depth > 0) {
- return content;
}
- };
-
- var failedToLoad = function() {
- if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) {
- return;
- }
-
- $('#jsxc_dialog p').remove();
-
- var content = '<p>';
- content += jsxc.translate('%%Sorry, your buddy doesn\'t provide any information.%%');
- content += '</p>';
-
- $('#jsxc_dialog').append(content);
- };
-
- jsxc.xmpp.loadVcard(bid, function(stanza) {
-
- if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) {
- return;
- }
-
- $('#jsxc_dialog p').remove();
-
- var photo = $(stanza).find("vCard > PHOTO");
-
- if (photo.length > 0) {
- var img = photo.find('BINVAL').text();
- var type = photo.find('TYPE').text();
- var src = 'data:' + type + ';base64,' + img;
+ });
+ });
- if (photo.find('EXTVAL').length > 0) {
- src = photo.find('EXTVAL').text();
- }
+ $('#jsxc_dialog form').submit(function() {
- // concat chunks
- src = src.replace(/[\t\r\n\f]/gi, '');
+ var self = $(this);
+ var data = {};
- var img_el = $('<img class="jsxc_vCard" alt="avatar" />');
- img_el.attr('src', src);
+ self.find('input[type!="submit"]').each(function() {
+ var id = this.id.split("-");
+ var prop = id[0];
+ var key = id[1];
+ var val;
+ var type = this.type;
- $('#jsxc_dialog h3').before(img_el);
+ if (type === 'checkbox') {
+ val = this.checked;
+ } else {
+ val = $(this).val();
}
- if ($(stanza).find('vCard').length === 0 || ($(stanza).find('vcard > *').length === 1 && photo.length === 1)) {
- failedToLoad();
- return;
+ if (!data[prop]) {
+ data[prop] = {};
}
- printProp($(stanza).find('vcard > *'), 0);
+ data[prop][key] = val;
+ });
- }, failedToLoad);
- },
+ $.each(data, function(key, val) {
+ jsxc.options.set(key, val);
+ });
- showSettings: function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('settings'));
+ var err = jsxc.options.saveSettinsPermanent.call(this, data);
- if (jsxc.options.get('xmpp').overwrite === 'false' || jsxc.options.get('xmpp').overwrite === false) {
- $('.jsxc_fieldsetXmpp').hide();
+ if (typeof self.attr('data-onsubmit') === 'string') {
+ jsxc.exec(self.attr('data-onsubmit'), [ err ]);
}
- $('#jsxc_dialog form').each(function() {
- var self = $(this);
+ setTimeout(function() {
+ self.find('input[type="submit"]').effect('highlight', {
+ color: (err) ? 'green' : 'red'
+ }, 4000);
+ }, 200);
- self.find('input[type!="submit"]').each(function() {
- var id = this.id.split("-");
- var prop = id[0];
- var key = id[1];
- var type = this.type;
+ return false;
+ });
+ },
- var data = jsxc.options.get(prop);
+ /**
+ * Show prompt for notification permission.
+ *
+ * @memberOf jsxc.gui
+ */
+ showRequestNotification: function() {
- if (data && typeof data[key] !== 'undefined') {
- if (type === 'checkbox') {
- if (data[key] !== 'false' && data[key] !== false) {
- this.checked = 'checked';
- }
- } else {
- $(this).val(data[key]);
- }
- }
- });
- });
+ jsxc.switchEvents({
+ 'notificationready.jsxc': function() {
+ jsxc.gui.dialog.close();
+ jsxc.notification.init();
+ jsxc.storage.setUserItem('notification', 1);
+ },
+ 'notificationfailure.jsxc': function() {
+ jsxc.gui.dialog.close();
+ jsxc.options.notification = false;
+ jsxc.storage.setUserItem('notification', 0);
+ }
+ });
- $('#jsxc_dialog form').submit(function() {
+ jsxc.gui.showConfirmDialog($.t('Should_we_notify_you_'), function() {
+ jsxc.gui.dialog.open(jsxc.gui.template.get('pleaseAccept'), {
+ noClose: true
+ });
- var self = $(this);
- var data = {};
+ jsxc.notification.requestPermission();
+ }, function() {
+ $(document).trigger('notificationfailure.jsxc');
+ });
+ },
- self.find('input[type!="submit"]').each(function() {
- var id = this.id.split("-");
- var prop = id[0];
- var key = id[1];
- var val;
- var type = this.type;
+ showUnknownSender: function(bid) {
+ var confirmationText = $.t('You_received_a_message_from_an_unknown_sender') + ' (' + bid + '). ' + $.t('Do_you_want_to_display_them');
+ jsxc.gui.showConfirmDialog(confirmationText, function() {
- if (type === 'checkbox') {
- val = this.checked;
- } else {
- val = $(this).val();
- }
+ jsxc.gui.dialog.close();
- if (!data[prop]) {
- data[prop] = {};
- }
+ jsxc.storage.saveBuddy(bid, {
+ jid: bid,
+ name: bid,
+ status: 0,
+ sub: 'none',
+ res: []
+ });
- data[prop][key] = val;
- });
+ jsxc.gui.window.open(bid);
- $.each(data, function(key, val) {
- jsxc.options.set(key, val);
- });
+ }, function() {
+ // reset state
+ jsxc.storage.removeUserItem('chat', bid);
+ });
+ },
- var err = jsxc.options.saveSettinsPermanent.call(this, data);
+ /**
+ * Change own presence to pres.
+ *
+ * @memberOf jsxc.gui
+ * @param pres {CONST.STATUS} New presence state
+ * @param external {boolean} True if triggered from other tab.
+ */
+ changePresence: function(pres, external) {
- if (typeof self.attr('data-onsubmit') === 'string') {
- jsxc.exec(self.attr('data-onsubmit'), [ err ]);
- }
+ if (external !== true) {
+ jsxc.storage.setUserItem('presence', pres);
+ }
- setTimeout(function() {
- self.find('input[type="submit"]').effect('highlight', {
- color: (err) ? 'green' : 'red'
- }, 4000);
- }, 200);
+ if (jsxc.master) {
+ jsxc.xmpp.sendPres();
+ }
- return false;
- });
- },
+ $('#jsxc_presence > span').text($('#jsxc_presence > ul .jsxc_' + pres).text());
- /**
- * Show prompt for notification permission.
- *
- * @memberOf jsxc.gui
- */
- showRequestNotification: function() {
- jsxc.gui.showConfirmDialog(jsxc.translate("%%Should we notify you_%%"), function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('pleaseAccept'), {
- noClose: true
- });
+ jsxc.gui.updatePresence('own', pres);
+ },
- jsxc.notification.requestPermission();
- }, function() {
- $(document).trigger('notificationfailure.jsxc');
- });
- },
+ /**
+ * Update all presence objects for given user.
+ *
+ * @memberOf jsxc.gui
+ * @param bid bar jid of user.
+ * @param {CONST.STATUS} pres New presence state.
+ */
+ updatePresence: function(bid, pres) {
- showUnknownSender: function(bid) {
- jsxc.gui.showConfirmDialog(jsxc.translate('%%You_received_a_message_from_an_unknown_sender%% (' + bid + '). %%Do_you_want_to_display_them%%'), function() {
+ if (bid === 'own') {
+ if (pres === 'dnd') {
+ $('#jsxc_menu .jsxc_muteNotification').addClass('jsxc_disabled');
+ jsxc.notification.muteSound(true);
+ } else {
+ $('#jsxc_menu .jsxc_muteNotification').removeClass('jsxc_disabled');
- jsxc.gui.dialog.close();
+ if (!jsxc.options.get('muteNotification')) {
+ jsxc.notification.unmuteSound(true);
+ }
+ }
+ }
- jsxc.storage.saveBuddy(bid, {
- jid: bid,
- name: bid,
- status: 0,
- sub: 'none',
- res: []
- });
+ $('.jsxc_presence[data-bid="' + bid + '"]').removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + pres);
+ },
- jsxc.gui.window.open(bid);
+ /**
+ * Switch read state to UNread.
+ *
+ * @memberOf jsxc.gui
+ * @param bid
+ */
+ unreadMsg: function(bid) {
+ var win = jsxc.gui.window.get(bid);
- }, function() {
- // reset state
- jsxc.storage.removeUserItem('chat', bid);
- });
- },
+ jsxc.gui.roster.getItem(bid).add(win).addClass('jsxc_unreadMsg');
+ jsxc.storage.updateUserItem('window', bid, 'unread', true);
+ },
- /**
- * Change own presence to pres.
- *
- * @memberOf jsxc.gui
- * @param pres {CONST.STATUS} New presence state
- * @param external {boolean} True if triggered from other tab.
- */
- changePresence: function(pres, external) {
+ /**
+ * Switch read state to read.
+ *
+ * @memberOf jsxc.gui
+ * @param bid
+ */
+ readMsg: function(bid) {
+ var win = jsxc.gui.window.get(bid);
- if (external !== true) {
- jsxc.storage.setUserItem('presence', pres);
- }
+ if (win.hasClass('jsxc_unreadMsg')) {
+ jsxc.gui.roster.getItem(bid).add(win).removeClass('jsxc_unreadMsg');
+ jsxc.storage.updateUserItem('window', bid, 'unread', false);
+ }
+ },
- if (jsxc.master) {
- jsxc.xmpp.sendPres();
- }
+ /**
+ * This function searches for URI scheme according to XEP-0147.
+ *
+ * @memberOf jsxc.gui
+ * @param container In which element should we search?
+ */
+ detectUriScheme: function(container) {
+ container = (container) ? $(container) : $('body');
- $('#jsxc_presence > span').text($('#jsxc_presence > ul .jsxc_' + pres).text());
+ container.find("a[href^='xmpp:']").each(function() {
- jsxc.gui.updatePresence('own', pres);
- },
+ var element = $(this);
+ var href = element.attr('href').replace(/^xmpp:/, '');
+ var jid = href.split('?')[0];
+ var action, params = {};
- /**
- * Update all presence objects for given user.
- *
- * @memberOf jsxc.gui
- * @param bid bar jid of user.
- * @param {CONST.STATUS} pres New presence state.
- */
- updatePresence: function(bid, pres) {
+ if (href.indexOf('?') < 0) {
+ action = 'message';
+ } else {
+ var pairs = href.substring(href.indexOf('?') + 1).split(';');
+ action = pairs[0];
- if (bid === 'own') {
- if (pres === 'dnd') {
- $('#jsxc_menu .jsxc_muteNotification').addClass('jsxc_disabled');
- jsxc.notification.muteSound(true);
- } else {
- $('#jsxc_menu .jsxc_muteNotification').removeClass('jsxc_disabled');
+ var i, key, value;
+ for (i = 1; i < pairs.length; i++) {
+ key = pairs[i].split('=')[0];
+ value = (pairs[i].indexOf('=') > 0) ? pairs[i].substring(pairs[i].indexOf('=') + 1) : null;
- if (!jsxc.options.get('muteNotification')) {
- jsxc.notification.unmuteSound(true);
- }
+ params[decodeURIComponent(key)] = decodeURIComponent(value);
}
}
- $('.jsxc_presence[data-bid="' + bid + '"]').removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + pres);
- },
+ if (typeof jsxc.gui.queryActions[action] === 'function') {
+ element.addClass('jsxc_uriScheme jsxc_uriScheme_' + action);
- /**
- * Switch read state to UNread.
- *
- * @memberOf jsxc.gui
- * @param bid
- */
- unreadMsg: function(bid) {
- var win = jsxc.gui.window.get(bid);
+ element.off('click').click(function(ev) {
+ ev.stopPropagation();
- jsxc.gui.roster.getItem(bid).add(win).addClass('jsxc_unreadMsg');
- jsxc.storage.updateUserItem('window', bid, 'unread', true);
- },
+ jsxc.gui.queryActions[action].call(jsxc, jid, params);
- /**
- * Switch read state to read.
- *
- * @memberOf jsxc.gui
- * @param bid
- */
- readMsg: function(bid) {
- var win = jsxc.gui.window.get(bid);
-
- if (win.hasClass('jsxc_unreadMsg')) {
- jsxc.gui.roster.getItem(bid).add(win).removeClass('jsxc_unreadMsg');
- jsxc.storage.updateUserItem('window', bid, 'unread', false);
+ return false;
+ });
}
- },
-
- /**
- * This function searches for URI scheme according to XEP-0147.
- *
- * @memberOf jsxc.gui
- * @param container In which element should we search?
- */
- detectUriScheme: function(container) {
- container = (container) ? $(container) : $('body');
+ });
+ },
- container.find("a[href^='xmpp:']").each(function() {
+ detectEmail: function(container) {
+ container = (container) ? $(container) : $('body');
- var element = $(this);
- var href = element.attr('href').replace(/^xmpp:/, '');
- var jid = href.split('?')[0];
- var action, params = {};
+ container.find('a[href^="mailto:"]').each(function() {
+ var spot = $("<span>X</span>").addClass("jsxc_spot");
+ var href = $(this).attr("href").replace(/^ *mailto:/, "").trim();
- if (href.indexOf('?') < 0) {
- action = 'message';
- } else {
- var pairs = href.substring(href.indexOf('?') + 1).split(';');
- action = pairs[0];
+ if (href !== '' && href !== Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))) {
+ var bid = jsxc.jidToBid(href);
+ var self = $(this);
+ var s = self.prev();
- var i, key, value;
- for (i = 1; i < pairs.length; i++) {
- key = pairs[i].split('=')[0];
- value = (pairs[i].indexOf('=') > 0) ? pairs[i].substring(pairs[i].indexOf('=') + 1) : null;
+ if (!s.hasClass('jsxc_spot')) {
+ s = spot.clone().attr('data-bid', bid);
- params[decodeURIComponent(key)] = decodeURIComponent(value);
- }
+ self.before(s);
}
- if (typeof jsxc.gui.queryActions[action] === 'function') {
- element.addClass('jsxc_uriScheme jsxc_uriScheme_' + action);
+ s.off('click');
- element.off('click').click(function(ev) {
- ev.stopPropagation();
+ if (jsxc.storage.getUserItem('buddy', bid)) {
+ jsxc.gui.update(bid);
+ s.click(function() {
+ jsxc.gui.window.open(bid);
- jsxc.gui.queryActions[action].call(jsxc, jid, params);
+ return false;
+ });
+ } else {
+ s.click(function() {
+ jsxc.gui.showContactDialog(href);
return false;
});
}
- });
- },
-
- detectEmail: function(container) {
- container = (container) ? $(container) : $('body');
-
- container.find('a[href^="mailto:"]').each(function() {
- var spot = $("<span>X</span>").addClass("jsxc_spot");
- var href = $(this).attr("href").replace(/^ *mailto:/, "").trim();
-
- if (href !== '' && href !== Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))) {
- var bid = jsxc.jidToBid(href);
- var self = $(this);
- var s = self.prev();
-
- if (!s.hasClass('jsxc_spot')) {
- s = spot.clone().attr('data-bid', bid);
-
- self.before(s);
- }
-
- s.off('click');
+ }
+ });
+ },
+
+ avatarPlaceholder: function(el, seed, text) {
+ text = text || seed;
+
+ var options = jsxc.options.get('avatarplaceholder') || {};
+ var hash = jsxc.hashStr(seed);
+
+ var hue = Math.abs(hash) % 360;
+ var saturation = options.saturation || 90;
+ var lightness = options.lightness || 65;
+
+ el.css({
+ 'background-color': 'hsl(' + hue + ', ' + saturation + '%, ' + lightness + '%)',
+ 'color': '#fff',
+ 'font-weight': 'bold',
+ 'text-align': 'center',
+ 'line-height': el.height() + 'px',
+ 'font-size': el.height() * 0.6 + 'px'
+ });
+
+ if (typeof text === 'string' && text.length > 0) {
+ el.text(text[0].toUpperCase());
+ }
+ }
+};
- if (jsxc.storage.getUserItem('buddy', bid)) {
- jsxc.gui.update(bid);
- s.click(function() {
- jsxc.gui.window.open(bid);
+/**
+ * Handle functions related to the gui of the roster
+ *
+ * @namespace jsxc.gui.roster
+ */
+jsxc.gui.roster = {
- return false;
- });
- } else {
- s.click(function() {
- jsxc.gui.showContactDialog(href);
-
- return false;
- });
- }
- }
- });
- }
- };
+ /** True if roster is initialised */
+ ready: false,
/**
- * Handle functions related to the gui of the roster
+ * Init the roster skeleton
*
- * @namespace jsxc.gui.roster
+ * @memberOf jsxc.gui.roster
+ * @returns {undefined}
*/
- jsxc.gui.roster = {
+ init: function() {
+ $(jsxc.options.rosterAppend + ':first').append($(jsxc.gui.template.get('roster')));
- /**
- * Init the roster skeleton
- *
- * @memberOf jsxc.gui.roster
- * @returns {undefined}
- */
- init: function() {
- $(jsxc.options.rosterAppend + ':first').append($(jsxc.gui.template.get('roster')));
+ if (jsxc.options.get('hideOffline')) {
+ $('#jsxc_menu .jsxc_hideOffline').text($.t('Show_offline'));
+ $('#jsxc_buddylist').addClass('jsxc_hideOffline');
+ }
+
+ $('#jsxc_menu .jsxc_settings').click(function() {
+ jsxc.gui.showSettings();
+ });
+
+ $('#jsxc_menu .jsxc_hideOffline').click(function() {
+ var hideOffline = !jsxc.options.get('hideOffline');
- if (jsxc.options.get('hideOffline')) {
- $('#jsxc_menu .jsxc_hideOffline').text(jsxc.translate('%%Show offline%%'));
+ if (hideOffline) {
$('#jsxc_buddylist').addClass('jsxc_hideOffline');
+ } else {
+ $('#jsxc_buddylist').removeClass('jsxc_hideOffline');
}
- $('#jsxc_menu .jsxc_settings').click(function() {
- jsxc.gui.showSettings();
- });
+ $(this).text(hideOffline ? $.t('Show_offline') : $.t('Hide_offline'));
- $('#jsxc_menu .jsxc_hideOffline').click(function() {
- var hideOffline = !jsxc.options.get('hideOffline');
+ jsxc.options.set('hideOffline', hideOffline);
+ });
- if (hideOffline) {
- $('#jsxc_buddylist').addClass('jsxc_hideOffline');
- } else {
- $('#jsxc_buddylist').removeClass('jsxc_hideOffline');
- }
+ if (jsxc.options.get('muteNotification')) {
+ jsxc.notification.muteSound();
+ }
- $(this).text(hideOffline ? jsxc.translate('%%Show offline%%') : jsxc.translate('%%Hide offline%%'));
+ $('#jsxc_menu .jsxc_muteNotification').click(function() {
- jsxc.options.set('hideOffline', hideOffline);
- });
+ if (jsxc.storage.getUserItem('presence') === 'dnd') {
+ return;
+ }
+
+ // invert current choice
+ var mute = !jsxc.options.get('muteNotification');
- if (jsxc.options.get('muteNotification')) {
+ if (mute) {
jsxc.notification.muteSound();
+ } else {
+ jsxc.notification.unmuteSound();
}
+ });
- $('#jsxc_menu .jsxc_muteNotification').click(function() {
+ $('#jsxc_roster .jsxc_addBuddy').click(function() {
+ jsxc.gui.showContactDialog();
+ });
- if (jsxc.storage.getUserItem('presence') === 'dnd') {
- return;
- }
+ $('#jsxc_roster .jsxc_onlineHelp').click(function() {
+ window.open("http://www.jsxc.org/manual.html", "onlineHelp");
+ });
- // invert current choice
- var mute = !jsxc.options.get('muteNotification');
+ $('#jsxc_roster .jsxc_about').click(function() {
+ jsxc.gui.showAboutDialog();
+ });
- if (mute) {
- jsxc.notification.muteSound();
- } else {
- jsxc.notification.unmuteSound();
- }
- });
+ $('#jsxc_toggleRoster').click(function() {
+ jsxc.gui.roster.toggle();
+ });
- $('#jsxc_roster .jsxc_addBuddy').click(function() {
- jsxc.gui.showContactDialog();
- });
+ $('#jsxc_presence > ul > li').click(function() {
+ var self = $(this);
+ var pres = self.data('pres');
- $('#jsxc_roster .jsxc_onlineHelp').click(function() {
- window.open("http://www.jsxc.org/manual.html", "onlineHelp");
- });
+ if (pres === 'offline') {
+ jsxc.xmpp.logout(false);
+ } else {
+ jsxc.gui.changePresence(pres);
+ }
+ });
- $('#jsxc_roster .jsxc_about').click(function() {
- jsxc.gui.showAboutDialog();
- });
+ $('#jsxc_buddylist').slimScroll({
+ distance: '3px',
+ height: ($('#jsxc_roster').height() - 31) + 'px',
+ width: $('#jsxc_buddylist').width() + 'px',
+ color: '#fff',
+ opacity: '0.5'
+ });
- $('#jsxc_toggleRoster').click(function() {
- jsxc.gui.roster.toggle();
- });
+ $('#jsxc_roster > .jsxc_bottom > div').each(function() {
+ jsxc.gui.toggleList.call($(this));
+ });
- $('#jsxc_presence > ul > li').click(function() {
- var self = $(this);
+ if (jsxc.storage.getUserItem('roster') === 'hidden') {
+ $('#jsxc_roster').css('right', '-200px');
+ $('#jsxc_windowList > ul').css('paddingRight', '10px');
+ }
- jsxc.gui.changePresence(self.data('pres'));
- });
+ var pres = jsxc.storage.getUserItem('presence') || 'online';
+ $('#jsxc_presence > span').text($('#jsxc_presence > ul .jsxc_' + pres).text());
+ jsxc.gui.updatePresence('own', pres);
- $('#jsxc_buddylist').slimScroll({
- distance: '3px',
- height: ($('#jsxc_roster').height() - 31) + 'px',
- width: $('#jsxc_buddylist').width() + 'px',
- color: '#fff',
- opacity: '0.5'
- });
+ jsxc.gui.tooltip('#jsxc_roster');
- $('#jsxc_roster > .jsxc_bottom > div').each(function() {
- jsxc.gui.toggleList.call($(this));
- });
+ jsxc.notice.load();
- if (jsxc.storage.getUserItem('roster') === 'hidden') {
- $('#jsxc_roster').css('right', '-200px');
- $('#jsxc_windowList > ul').css('paddingRight', '10px');
- }
+ jsxc.gui.roster.ready = true;
+ $(document).trigger('ready.roster.jsxc');
+ },
- var pres = jsxc.storage.getUserItem('presence') || 'online';
- $('#jsxc_presence > span').text($('#jsxc_presence > ul .jsxc_' + pres).text());
- jsxc.gui.updatePresence('own', pres);
+ /**
+ * Create roster item and add it to the roster
+ *
+ * @param {String} bid bar jid
+ */
+ add: function(bid) {
+ var data = jsxc.storage.getUserItem('buddy', bid);
+ var bud = jsxc.gui.buddyTemplate.clone().attr('data-bid', bid).attr('data-type', data.type || 'chat');
- jsxc.gui.tooltip('#jsxc_roster');
+ jsxc.gui.roster.insert(bid, bud);
- jsxc.notice.load();
+ bud.click(function() {
+ jsxc.gui.window.open(bid);
+ });
- $(document).trigger('ready.roster.jsxc');
- },
+ bud.find('.jsxc_chaticon').click(function() {
+ jsxc.gui.window.open(bid);
+ });
- /**
- * Create roster item and add it to the roster
- *
- * @param {String} bid bar jid
- */
- add: function(bid) {
- var data = jsxc.storage.getUserItem('buddy', bid);
- var bud = jsxc.gui.buddyTemplate.clone().attr('data-bid', bid).attr('data-type', data.type || 'chat');
+ bud.find('.jsxc_rename').click(function() {
+ jsxc.gui.roster.rename(bid);
+ return false;
+ });
- jsxc.gui.roster.insert(bid, bud);
+ bud.find('.jsxc_delete').click(function() {
+ jsxc.gui.showRemoveDialog(bid);
+ return false;
+ });
- bud.click(function() {
- jsxc.gui.window.open(bid);
- });
+ var expandClick = function() {
+ bud.trigger('extra.jsxc');
- bud.find('.jsxc_chaticon').click(function() {
- jsxc.gui.window.open(bid);
- });
+ bud.toggleClass('jsxc_expand');
- bud.find('.jsxc_rename').click(function() {
- jsxc.gui.roster.rename(bid);
- return false;
- });
+ jsxc.gui.updateAvatar(bud, data.jid, data.avatar);
+ return false;
+ };
- bud.find('.jsxc_delete').click(function() {
- jsxc.gui.showRemoveDialog(bid);
- return false;
- });
+ bud.find('.jsxc_control').click(expandClick);
+ bud.dblclick(expandClick);
- var expandClick = function() {
- bud.trigger('extra.jsxc');
+ bud.find('.jsxc_vcardicon').click(function() {
+ jsxc.gui.showVcard(data.jid);
+ return false;
+ });
- bud.toggleClass('jsxc_expand');
+ jsxc.gui.update(bid);
- jsxc.gui.updateAvatar(bud, data.jid, data.avatar);
- return false;
- };
+ // update scrollbar
+ $('#jsxc_buddylist').slimScroll({
+ scrollTo: '0px'
+ });
- bud.find('.jsxc_control').click(expandClick);
- bud.dblclick(expandClick);
+ $(document).trigger('add.roster.jsxc', [ bid, data, bud ]);
+ },
- bud.find('.jsxc_vcardicon').click(function() {
- jsxc.gui.showVcard(data.jid);
- return false;
- });
+ getItem: function(bid) {
+ return $("#jsxc_buddylist > li[data-bid='" + bid + "']");
+ },
- jsxc.gui.update(bid);
+ /**
+ * Insert roster item. First order: online > away > offline. Second order:
+ * alphabetical of the name
+ *
+ * @param {type} bid
+ * @param {jquery} li roster item which should be insert
+ * @returns {undefined}
+ */
+ insert: function(bid, li) {
- // update scrollbar
- $('#jsxc_buddylist').slimScroll({
- scrollTo: '0px'
- });
+ var data = jsxc.storage.getUserItem('buddy', bid);
+ var listElements = $('#jsxc_buddylist > li');
+ var insert = false;
- $(document).trigger('add.roster.jsxc', [ bid, data, bud ]);
- },
+ // Insert buddy with no mutual friendship to the end
+ var status = (data.sub === 'both') ? data.status : -1;
- getItem: function(bid) {
- return $("#jsxc_buddylist > li[data-bid='" + bid + "']");
- },
+ listElements.each(function() {
- /**
- * Insert roster item. First order: online > away > offline. Second order:
- * alphabetical of the name
- *
- * @param {type} bid
- * @param {jquery} li roster item which should be insert
- * @returns {undefined}
- */
- insert: function(bid, li) {
+ var thisStatus = ($(this).data('sub') === 'both') ? $(this).data('status') : -1;
- var data = jsxc.storage.getUserItem('buddy', bid);
- var listElements = $('#jsxc_buddylist > li');
- var insert = false;
+ if (($(this).data('name').toLowerCase() > data.name.toLowerCase() && thisStatus === status) || thisStatus < status) {
- // Insert buddy with no mutual friendship to the end
- var status = (data.sub === 'both') ? data.status : -1;
+ $(this).before(li);
+ insert = true;
- listElements.each(function() {
+ return false;
+ }
+ });
- var thisStatus = ($(this).data('sub') === 'both') ? $(this).data('status') : -1;
+ if (!insert) {
+ li.appendTo('#jsxc_buddylist');
+ }
+ },
- if (($(this).data('name').toLowerCase() > data.name.toLowerCase() && thisStatus === status) || thisStatus < status) {
+ /**
+ * Initiate reorder of roster item
+ *
+ * @param {type} bid
+ * @returns {undefined}
+ */
+ reorder: function(bid) {
+ jsxc.gui.roster.insert(bid, jsxc.gui.roster.remove(bid));
+ },
- $(this).before(li);
- insert = true;
+ /**
+ * Removes buddy from roster
+ *
+ * @param {String} bid bar jid
+ * @return {JQueryObject} Roster list element
+ */
+ remove: function(bid) {
+ return jsxc.gui.roster.getItem(bid).detach();
+ },
- return false;
- }
- });
+ /**
+ * Removes buddy from roster and clean up
+ *
+ * @param {String} bid bar compatible jid
+ */
+ purge: function(bid) {
+ if (jsxc.master) {
+ jsxc.storage.removeUserItem('buddy', bid);
+ jsxc.storage.removeUserItem('otr', bid);
+ jsxc.storage.removeUserItem('otr_version_' + bid);
+ jsxc.storage.removeUserItem('chat', bid);
+ jsxc.storage.removeUserItem('window', bid);
+ jsxc.storage.removeUserElement('buddylist', bid);
+ jsxc.storage.removeUserElement('windowlist', bid);
+ }
- if (!insert) {
- li.appendTo('#jsxc_buddylist');
- }
- },
+ jsxc.gui.window._close(bid);
+ jsxc.gui.roster.remove(bid);
+ },
- /**
- * Initiate reorder of roster item
- *
- * @param {type} bid
- * @returns {undefined}
- */
- reorder: function(bid) {
- jsxc.gui.roster.insert(bid, jsxc.gui.roster.remove(bid));
- },
+ /**
+ * Create input element for rename action
+ *
+ * @param {type} bid
+ * @returns {undefined}
+ */
+ rename: function(bid) {
+ var name = jsxc.gui.roster.getItem(bid).find('.jsxc_name');
+ var options = jsxc.gui.roster.getItem(bid).find('.jsxc_options, .jsxc_control');
+ var input = $('<input type="text" name="name"/>');
- /**
- * Removes buddy from roster
- *
- * @param {String} bid bar jid
- * @return {JQueryObject} Roster list element
- */
- remove: function(bid) {
- return jsxc.gui.roster.getItem(bid).detach();
- },
+ options.hide();
+ name = name.replaceWith(input);
- /**
- * Removes buddy from roster and clean up
- *
- * @param {String} bid bar compatible jid
- */
- purge: function(bid) {
- if (jsxc.master) {
- jsxc.storage.removeUserItem('buddy', bid);
- jsxc.storage.removeUserItem('otr', bid);
- jsxc.storage.removeUserItem('otr_version_' + bid);
- jsxc.storage.removeUserItem('chat', bid);
- jsxc.storage.removeUserItem('window', bid);
- jsxc.storage.removeUserElement('buddylist', bid);
- jsxc.storage.removeUserElement('windowlist', bid);
+ input.val(name.text());
+ input.keypress(function(ev) {
+ if (ev.which !== 13) {
+ return;
}
- jsxc.gui.window._close(bid);
- jsxc.gui.roster.remove(bid);
- },
-
- /**
- * Create input element for rename action
- *
- * @param {type} bid
- * @returns {undefined}
- */
- rename: function(bid) {
- var name = jsxc.gui.roster.getItem(bid).find('.jsxc_name');
- var options = jsxc.gui.roster.getItem(bid).find('.jsxc_options, .jsxc_control');
- var input = $('<input type="text" name="name"/>');
+ options.show();
+ input.replaceWith(name);
+ jsxc.gui.roster._rename(bid, $(this).val());
- options.hide();
- name = name.replaceWith(input);
-
- input.val(name.text());
- input.keypress(function(ev) {
- if (ev.which !== 13) {
- return;
- }
-
- options.show();
- input.replaceWith(name);
- jsxc.gui.roster._rename(bid, $(this).val());
-
- $('html').off('click');
- });
+ $('html').off('click');
+ });
- // Disable html click event, if click on input
- input.click(function() {
- return false;
- });
+ // Disable html click event, if click on input
+ input.click(function() {
+ return false;
+ });
- $('html').one('click', function() {
- options.show();
- input.replaceWith(name);
- jsxc.gui.roster._rename(bid, input.val());
- });
- },
+ $('html').one('click', function() {
+ options.show();
+ input.replaceWith(name);
+ jsxc.gui.roster._rename(bid, input.val());
+ });
+ },
- /**
- * Rename buddy
- *
- * @param {type} bid
- * @param {type} newname new name of buddy
- * @returns {undefined}
- */
- _rename: function(bid, newname) {
- if (jsxc.master) {
- var d = jsxc.storage.getUserItem('buddy', bid);
- var iq = $iq({
- type: 'set'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- }).c('item', {
- jid: Strophe.getBareJidFromJid(d.jid),
- name: newname
- });
- jsxc.xmpp.conn.sendIQ(iq);
+ /**
+ * Rename buddy
+ *
+ * @param {type} bid
+ * @param {type} newname new name of buddy
+ * @returns {undefined}
+ */
+ _rename: function(bid, newname) {
+ if (jsxc.master) {
+ var d = jsxc.storage.getUserItem('buddy', bid);
+
+ if (d.type === 'chat') {
+ var iq = $iq({
+ type: 'set'
+ }).c('query', {
+ xmlns: 'jabber:iq:roster'
+ }).c('item', {
+ jid: Strophe.getBareJidFromJid(d.jid),
+ name: newname
+ });
+ jsxc.xmpp.conn.sendIQ(iq);
}
+ }
- jsxc.storage.updateUserItem('buddy', bid, 'name', newname);
- jsxc.gui.update(bid);
- },
-
- /**
- * Toogle complete roster
- *
- * @param {Integer} d Duration in ms
- */
- toggle: function(d) {
- var duration = d || 500;
-
- var roster = $('#jsxc_roster');
- var wl = $('#jsxc_windowList');
+ jsxc.storage.updateUserItem('buddy', bid, 'name', newname);
+ jsxc.gui.update(bid);
+ },
- var roster_width = roster.innerWidth();
- var roster_right = parseFloat($('#jsxc_roster').css('right'));
- var state = (roster_right < 0) ? 'shown' : 'hidden';
+ /**
+ * Toogle complete roster
+ *
+ * @param {Integer} d Duration in ms
+ */
+ toggle: function(d) {
+ var duration = d || 500;
- jsxc.storage.setUserItem('roster', state);
+ var roster = $('#jsxc_roster');
+ var wl = $('#jsxc_windowList');
- roster.animate({
- right: ((roster_width + roster_right) * -1) + 'px'
- }, duration);
- wl.animate({
- right: (10 - roster_right) + 'px'
- }, duration);
+ var roster_width = roster.innerWidth();
+ var roster_right = parseFloat($('#jsxc_roster').css('right'));
+ var state = (roster_right < 0) ? 'shown' : 'hidden';
- $(document).trigger('toggle.roster.jsxc', [ state, duration ]);
- },
+ jsxc.storage.setUserItem('roster', state);
- /**
- * Shows a text with link to a login box that no connection exists.
- */
- noConnection: function() {
- $('#jsxc_roster').addClass('jsxc_noConnection');
+ roster.animate({
+ right: ((roster_width + roster_right) * -1) + 'px'
+ }, duration);
+ wl.animate({
+ right: (10 - roster_right) + 'px'
+ }, duration);
- $('#jsxc_roster').append($('<p>' + jsxc.l.no_connection + '</p>').append(' <a>' + jsxc.l.relogin + '</a>').click(function() {
- jsxc.gui.showLoginBox();
- }));
- },
+ $(document).trigger('toggle.roster.jsxc', [ state, duration ]);
+ },
- /**
- * Shows a text with link to add a new buddy.
- *
- * @memberOf jsxc.gui.roster
- */
- empty: function() {
- var text = $('<p>' + jsxc.l.Your_roster_is_empty_add_a + '</p>');
- var link = $('<a>' + jsxc.l.new_buddy + '</a>');
+ /**
+ * Shows a text with link to a login box that no connection exists.
+ */
+ noConnection: function() {
+ $('#jsxc_roster').addClass('jsxc_noConnection');
- link.click(function() {
- jsxc.gui.showContactDialog();
- });
- text.append(link);
- text.append('.');
+ $('#jsxc_buddylist').empty();
- $('#jsxc_roster').prepend(text);
- }
- };
+ $('#jsxc_roster').append($('<p>' + $.t('no_connection') + '</p>').append(' <a>' + $.t('relogin') + '</a>').click(function() {
+ jsxc.gui.showLoginBox();
+ }));
+ },
/**
- * Wrapper for dialog
+ * Shows a text with link to add a new buddy.
*
- * @namespace jsxc.gui.dialog
+ * @memberOf jsxc.gui.roster
*/
- jsxc.gui.dialog = {
- /**
- * Open a Dialog.
- *
- * @memberOf jsxc.gui.dialog
- * @param {String} data Data of the dialog
- * @param {Object} [o] Options for the dialog
- * @param {Boolean} [o.noClose] If true, hide all default close options
- * @returns {jQuery} Dialog object
- */
- open: function(data, o) {
+ empty: function() {
+ var text = $('<p>' + $.t('Your_roster_is_empty_add_a') + '</p>');
+ var link = $('<a>' + $.t('new_buddy') + '</a>');
- var opt = o || {};
+ link.click(function() {
+ jsxc.gui.showContactDialog();
+ });
+ text.append(link);
+ text.append('.');
- // default options
- var options = {};
- options = {
- onComplete: function() {
- $('#jsxc_dialog .jsxc_close').click(function(ev) {
- ev.preventDefault();
+ $('#jsxc_roster').prepend(text);
+ }
+};
- jsxc.gui.dialog.close();
- });
+/**
+ * Wrapper for dialog
+ *
+ * @namespace jsxc.gui.dialog
+ */
+jsxc.gui.dialog = {
+ /**
+ * Open a Dialog.
+ *
+ * @memberOf jsxc.gui.dialog
+ * @param {String} data Data of the dialog
+ * @param {Object} [o] Options for the dialog
+ * @param {Boolean} [o.noClose] If true, hide all default close options
+ * @returns {jQuery} Dialog object
+ */
+ open: function(data, o) {
- // workaround for old colorbox version (used by firstrunwizard)
- if (options.closeButton === false) {
- $('#cboxClose').hide();
- }
+ var opt = o || {};
- $.colorbox.resize();
+ // default options
+ var options = {};
+ options = {
+ onComplete: function() {
+ $('#jsxc_dialog .jsxc_close').click(function(ev) {
+ ev.preventDefault();
- $(document).trigger('complete.dialog.jsxc');
- },
- onClosed: function() {
- $(document).trigger('close.dialog.jsxc');
- },
- onCleanup: function() {
- $(document).trigger('cleanup.dialog.jsxc');
- },
- opacity: 0.5
- };
+ jsxc.gui.dialog.close();
+ });
- if (opt.noClose) {
- options.overlayClose = false;
- options.escKey = false;
- options.closeButton = false;
- delete opt.noClose;
- }
+ // workaround for old colorbox version (used by firstrunwizard)
+ if (options.closeButton === false) {
+ $('#cboxClose').hide();
+ }
+
+ jsxc.gui.dialog.resize();
- $.extend(options, opt);
+ $(document).trigger('complete.dialog.jsxc');
+ },
+ onClosed: function() {
+ $(document).trigger('close.dialog.jsxc');
+ },
+ onCleanup: function() {
+ $(document).trigger('cleanup.dialog.jsxc');
+ },
+ opacity: 0.5
+ };
+
+ if (opt.noClose) {
+ options.overlayClose = false;
+ options.escKey = false;
+ options.closeButton = false;
+ delete opt.noClose;
+ }
- options.html = '<div id="jsxc_dialog">' + data + '</div>';
+ $.extend(options, opt);
- $.colorbox(options);
+ options.html = '<div id="jsxc_dialog">' + data + '</div>';
- return $('#jsxc_dialog');
- },
+ $.colorbox(options);
- /**
- * Close current dialog.
- */
- close: function() {
- jsxc.debug('close dialog');
- $.colorbox.close();
- },
+ return $('#jsxc_dialog');
+ },
- /**
- * Resizes current dialog.
- *
- * @param {Object} options e.g. width and height
- */
- resize: function(options) {
- $.colorbox.resize(options);
- }
- };
+ /**
+ * Close current dialog.
+ */
+ close: function() {
+ jsxc.debug('close dialog');
+ $.colorbox.close();
+ },
/**
- * Handle functions related to the gui of the window
+ * Resizes current dialog.
*
- * @namespace jsxc.gui.window
+ * @param {Object} options e.g. width and height
*/
- jsxc.gui.window = {
- /**
- * Init a window skeleton
- *
- * @memberOf jsxc.gui.window
- * @param {String} bid
- * @returns {jQuery} Window object
- */
- init: function(bid) {
- if (jsxc.gui.window.get(bid).length > 0) {
- return jsxc.gui.window.get(bid);
- }
+ resize: function(options) {
+ options = $.extend({
+ innerWidth: $('#jsxc_dialog').outerWidth(),
+ innerHeight: $('#jsxc_dialog').outerHeight()
+ }, options || {});
+
+ $('#cboxLoadedContent').css('overflow', 'hidden');
+
+ $.colorbox.resize(options);
+ }
+};
+
+/**
+ * Handle functions related to the gui of the window
+ *
+ * @namespace jsxc.gui.window
+ */
+jsxc.gui.window = {
+ /**
+ * Init a window skeleton
+ *
+ * @memberOf jsxc.gui.window
+ * @param {String} bid
+ * @returns {jQuery} Window object
+ */
+ init: function(bid) {
+ if (jsxc.gui.window.get(bid).length > 0) {
+ return jsxc.gui.window.get(bid);
+ }
- var win = jsxc.gui.windowTemplate.clone().attr('data-bid', bid).hide().appendTo('#jsxc_windowList > ul').show('slow');
- var data = jsxc.storage.getUserItem('buddy', bid);
+ var win = jsxc.gui.windowTemplate.clone().attr('data-bid', bid).hide().appendTo('#jsxc_windowList > ul').show('slow');
+ var data = jsxc.storage.getUserItem('buddy', bid);
- // Attach jid to window
- win.data('jid', data.jid);
+ // Attach jid to window
+ win.data('jid', data.jid);
- // Add handler
+ // Add handler
- jsxc.gui.toggleList.call(win.find('.jsxc_settings'));
+ jsxc.gui.toggleList.call(win.find('.jsxc_settings'));
- win.find('.jsxc_verification').click(function() {
- jsxc.gui.showVerification(bid);
- });
+ win.find('.jsxc_verification').click(function() {
+ jsxc.gui.showVerification(bid);
+ });
- win.find('.jsxc_fingerprints').click(function() {
- jsxc.gui.showFingerprints(bid);
- });
+ win.find('.jsxc_fingerprints').click(function() {
+ jsxc.gui.showFingerprints(bid);
+ });
- win.find('.jsxc_transfer').click(function() {
- jsxc.otr.toggleTransfer(bid);
- });
+ win.find('.jsxc_transfer').click(function() {
+ jsxc.otr.toggleTransfer(bid);
+ });
- win.find('.jsxc_bar').click(function() {
- jsxc.gui.window.toggle(bid);
- });
+ win.find('.jsxc_bar').click(function() {
+ jsxc.gui.window.toggle(bid);
+ });
- win.find('.jsxc_close').click(function() {
- jsxc.gui.window.close(bid);
- });
+ win.find('.jsxc_close').click(function() {
+ jsxc.gui.window.close(bid);
+ });
- win.find('.jsxc_clear').click(function() {
- jsxc.gui.window.clear(bid);
- });
+ win.find('.jsxc_clear').click(function() {
+ jsxc.gui.window.clear(bid);
+ });
- win.find('.jsxc_tools').click(function() {
- return false;
- });
+ win.find('.jsxc_tools').click(function() {
+ return false;
+ });
- win.find('.jsxc_textinput').keyup(function(ev) {
- var body = $(this).val();
+ win.find('.jsxc_textinput').keyup(function(ev) {
+ var body = $(this).val();
- if (ev.which === 13) {
- body = '';
- }
+ if (ev.which === 13) {
+ body = '';
+ }
- jsxc.storage.updateUserItem('window', bid, 'text', body);
+ jsxc.storage.updateUserItem('window', bid, 'text', body);
- if (ev.which === 27) {
- jsxc.gui.window.close(bid);
- }
- }).keypress(function(ev) {
- if (ev.which !== 13 || !$(this).val()) {
- return;
- }
+ if (ev.which === 27) {
+ jsxc.gui.window.close(bid);
+ }
+ }).keypress(function(ev) {
+ if (ev.which !== 13 || !$(this).val()) {
+ return;
+ }
- jsxc.gui.window.postMessage(bid, 'out', $(this).val());
+ jsxc.gui.window.postMessage(bid, 'out', $(this).val());
- $(this).val('');
- }).focus(function() {
- // remove unread flag
- jsxc.gui.readMsg(bid);
- }).mouseenter(function() {
- $('#jsxc_windowList').data('isOver', true);
- }).mouseleave(function() {
- $('#jsxc_windowList').data('isOver', false);
- });
+ $(this).val('');
+ }).focus(function() {
+ // remove unread flag
+ jsxc.gui.readMsg(bid);
+ }).mouseenter(function() {
+ $('#jsxc_windowList').data('isOver', true);
+ }).mouseleave(function() {
+ $('#jsxc_windowList').data('isOver', false);
+ });
- win.find('.jsxc_textarea').click(function() {
+ win.find('.jsxc_textarea').click(function() {
+ // check if user clicks element or selects text
+ if (typeof getSelection === 'function' && !getSelection().toString()) {
win.find('.jsxc_textinput').focus();
- });
+ }
+ });
- win.find('.jsxc_textarea').slimScroll({
- height: '234px',
- distance: '3px'
- });
+ win.find('.jsxc_textarea').slimScroll({
+ height: '234px',
+ distance: '3px'
+ });
- win.find('.jsxc_fade').hide();
+ win.find('.jsxc_fade').hide();
- win.find('.jsxc_name').disableSelection();
+ win.find('.jsxc_name').disableSelection();
- win.find('.slimScrollDiv').resizable({
- handles: 'w, nw, n',
- minHeight: 234,
- minWidth: 250,
- resize: function(event, ui) {
- win.width(ui.size.width);
- win.find('.jsxc_textarea').slimScroll({
- height: ui.size.height
- });
- win.find('.jsxc_emoticons').css('top', (ui.size.height + 6) + 'px');
- }
- });
+ win.find('.slimScrollDiv').resizable({
+ handles: 'w, nw, n',
+ minHeight: 234,
+ minWidth: 250,
+ resize: function(event, ui) {
+ win.width(ui.size.width);
+ win.find('.jsxc_textarea').slimScroll({
+ height: ui.size.height
+ });
+ var offset = win.find('.slimScrollDiv').position().top;
+ win.find('.jsxc_emoticons').css('top', (ui.size.height + offset + 6) + 'px');
- if ($.inArray(bid, jsxc.storage.getUserItem('windowlist')) < 0) {
+ $(document).trigger('resize.window.jsxc', [ win, bid, ui.size ]);
+ }
+ });
- // add window to windowlist
- var wl = jsxc.storage.getUserItem('windowlist');
- wl.push(bid);
- jsxc.storage.setUserItem('windowlist', wl);
+ if ($.inArray(bid, jsxc.storage.getUserItem('windowlist')) < 0) {
- // init window element in storage
- jsxc.storage.setUserItem('window', bid, {
- minimize: true,
- text: '',
- unread: false
- });
- } else {
+ // add window to windowlist
+ var wl = jsxc.storage.getUserItem('windowlist');
+ wl.push(bid);
+ jsxc.storage.setUserItem('windowlist', wl);
- if (jsxc.storage.getUserItem('window', bid).unread) {
- jsxc.gui.unreadMsg(bid);
- }
+ // init window element in storage
+ jsxc.storage.setUserItem('window', bid, {
+ minimize: true,
+ text: '',
+ unread: false
+ });
+ } else {
+
+ if (jsxc.storage.getUserItem('window', bid).unread) {
+ jsxc.gui.unreadMsg(bid);
}
+ }
- $.each(jsxc.gui.emotions, function(i, val) {
- var ins = val[0].split(' ')[0];
- var li = $('<li><div title="' + ins + '" class="jsxc_' + val[1] + '"/></li>');
- li.click(function() {
- win.find('input').val(win.find('input').val() + ins);
- win.find('input').focus();
- });
- win.find('.jsxc_emoticons ul').append(li);
+ $.each(jsxc.gui.emotions, function(i, val) {
+ var ins = val[0].split(' ')[0];
+ var li = $('<li><div title="' + ins + '" class="jsxc_' + val[1] + '"/></li>');
+ li.click(function() {
+ win.find('input').val(win.find('input').val() + ins);
+ win.find('input').focus();
});
+ win.find('.jsxc_emoticons ul').append(li);
+ });
- jsxc.gui.toggleList.call(win.find('.jsxc_emoticons'));
-
- jsxc.gui.window.restoreChat(bid);
+ jsxc.gui.toggleList.call(win.find('.jsxc_emoticons'));
- jsxc.gui.update(bid);
+ jsxc.gui.window.restoreChat(bid);
- jsxc.gui.updateWindowListSB();
+ jsxc.gui.update(bid);
- // create related otr object
- if (jsxc.master && !jsxc.otr.objects[bid]) {
- jsxc.otr.create(bid);
- } else {
- jsxc.otr.enable(bid);
- }
+ jsxc.gui.updateWindowListSB();
- $(document).trigger('init.window.jsxc', [ win ]);
+ // create related otr object
+ if (jsxc.master && !jsxc.otr.objects[bid]) {
+ jsxc.otr.create(bid);
+ } else {
+ jsxc.otr.enable(bid);
+ }
- return win;
- },
+ $(document).trigger('init.window.jsxc', [ win ]);
- /**
- * Returns the window element
- *
- * @param {String} bid
- * @returns {jquery} jQuery object of the window element
- */
- get: function(id) {
- return $("li.jsxc_windowItem[data-bid='" + jsxc.jidToBid(id) + "']");
- },
+ return win;
+ },
- /**
- * Open a window, related to the bid. If the window doesn't exist, it will
- * be created.
- *
- * @param {String} bid
- * @returns {jQuery} Window object
- */
- open: function(bid) {
- var win = jsxc.gui.window.init(bid);
- jsxc.gui.window.show(bid);
- jsxc.gui.window.highlight(bid);
+ /**
+ * Returns the window element
+ *
+ * @param {String} bid
+ * @returns {jquery} jQuery object of the window element
+ */
+ get: function(id) {
+ return $("li.jsxc_windowItem[data-bid='" + jsxc.jidToBid(id) + "']");
+ },
- var padding = $("#jsxc_windowListSB").width();
- var innerWidth = $('#jsxc_windowList>ul').width();
- var outerWidth = $('#jsxc_windowList').width() - padding;
+ /**
+ * Open a window, related to the bid. If the window doesn't exist, it will be
+ * created.
+ *
+ * @param {String} bid
+ * @returns {jQuery} Window object
+ */
+ open: function(bid) {
+ var win = jsxc.gui.window.init(bid);
+ jsxc.gui.window.show(bid);
+ jsxc.gui.window.highlight(bid);
- if (innerWidth > outerWidth) {
- var offset = parseInt($('#jsxc_windowList>ul').css('right'));
- var width = win.outerWidth(true);
+ var padding = $("#jsxc_windowListSB").width();
+ var innerWidth = $('#jsxc_windowList>ul').width();
+ var outerWidth = $('#jsxc_windowList').width() - padding;
- var right = innerWidth - win.position().left - width + offset;
- var left = outerWidth - (innerWidth - win.position().left) - offset;
+ if (innerWidth > outerWidth) {
+ var offset = parseInt($('#jsxc_windowList>ul').css('right'));
+ var width = win.outerWidth(true);
- if (left < 0) {
- jsxc.gui.scrollWindowListBy(left * -1);
- }
+ var right = innerWidth - win.position().left - width + offset;
+ var left = outerWidth - (innerWidth - win.position().left) - offset;
- if (right < 0) {
- jsxc.gui.scrollWindowListBy(right);
- }
+ if (left < 0) {
+ jsxc.gui.scrollWindowListBy(left * -1);
}
- return win;
- },
+ if (right < 0) {
+ jsxc.gui.scrollWindowListBy(right);
+ }
+ }
- /**
- * Close chatwindow and clean up
- *
- * @param {String} bid bar jid
- */
- close: function(bid) {
+ return win;
+ },
- if (jsxc.gui.window.get(bid).length === 0) {
- jsxc.warn('Want to close a window, that is not open.');
- return;
- }
+ /**
+ * Close chatwindow and clean up
+ *
+ * @param {String} bid bar jid
+ */
+ close: function(bid) {
- jsxc.storage.removeUserElement('windowlist', bid);
- jsxc.storage.removeUserItem('window', bid);
+ if (jsxc.gui.window.get(bid).length === 0) {
+ jsxc.warn('Want to close a window, that is not open.');
+ return;
+ }
- if (jsxc.storage.getUserItem('buddylist').indexOf(bid) < 0) {
- // delete data from unknown sender
+ jsxc.storage.removeUserElement('windowlist', bid);
+ jsxc.storage.removeUserItem('window', bid);
- jsxc.storage.removeUserItem('buddy', bid);
- jsxc.storage.removeUserItem('chat', bid);
- }
+ if (jsxc.storage.getUserItem('buddylist').indexOf(bid) < 0) {
+ // delete data from unknown sender
- jsxc.gui.window._close(bid);
- },
+ jsxc.storage.removeUserItem('buddy', bid);
+ jsxc.storage.removeUserItem('chat', bid);
+ }
- /**
- * Close chatwindow
- *
- * @param {String} bid
- */
- _close: function(bid) {
- jsxc.gui.window.get(bid).hide('slow', function() {
- $(this).remove();
+ jsxc.gui.window._close(bid);
+ },
- jsxc.gui.updateWindowListSB();
- });
- },
+ /**
+ * Close chatwindow
+ *
+ * @param {String} bid
+ */
+ _close: function(bid) {
+ jsxc.gui.window.get(bid).hide('slow', function() {
+ $(this).remove();
- /**
- * Toggle between minimize and maximize of the text area
- *
- * @param {String} bid bar jid
- */
- toggle: function(bid) {
+ jsxc.gui.updateWindowListSB();
+ });
+ },
- var win = jsxc.gui.window.get(bid);
+ /**
+ * Toggle between minimize and maximize of the text area
+ *
+ * @param {String} bid bar jid
+ */
+ toggle: function(bid) {
- if (win.parents("#jsxc_windowList").length === 0) {
- return;
- }
+ var win = jsxc.gui.window.get(bid);
- if (win.find('.jsxc_fade').is(':hidden')) {
- jsxc.gui.window.show(bid);
- } else {
- jsxc.gui.window.hide(bid);
- }
+ if (win.parents("#jsxc_windowList").length === 0) {
+ return;
+ }
- jsxc.gui.updateWindowListSB();
- },
+ if (win.find('.jsxc_fade').is(':hidden')) {
+ jsxc.gui.window.show(bid);
+ } else {
+ jsxc.gui.window.hide(bid);
+ }
- /**
- * Maximize text area and save
- *
- * @param {String} bid
- */
- show: function(bid) {
+ jsxc.gui.updateWindowListSB();
+ },
- jsxc.storage.updateUserItem('window', bid, 'minimize', false);
+ /**
+ * Maximize text area and save
+ *
+ * @param {String} bid
+ */
+ show: function(bid) {
- jsxc.gui.window._show(bid);
- },
+ jsxc.storage.updateUserItem('window', bid, 'minimize', false);
- /**
- * Maximize text area
- *
- * @param {String} bid
- * @returns {undefined}
- */
- _show: function(bid) {
- var win = jsxc.gui.window.get(bid);
- jsxc.gui.window.get(bid).find('.jsxc_fade').slideDown();
- win.removeClass('jsxc_min');
+ jsxc.gui.window._show(bid);
+ },
- // If the area is hidden, the scrolldown function doesn't work. So we
- // call it here.
- jsxc.gui.window.scrollDown(bid);
+ /**
+ * Maximize text area
+ *
+ * @param {String} bid
+ * @returns {undefined}
+ */
+ _show: function(bid) {
+ var win = jsxc.gui.window.get(bid);
+ jsxc.gui.window.get(bid).find('.jsxc_fade').slideDown();
+ win.removeClass('jsxc_min');
- if (jsxc.restoreCompleted) {
- win.find('.jsxc_textinput').focus();
- }
+ // If the area is hidden, the scrolldown function doesn't work. So we
+ // call it here.
+ jsxc.gui.window.scrollDown(bid);
- win.trigger('show.window.jsxc');
- },
+ if (jsxc.restoreCompleted) {
+ win.find('.jsxc_textinput').focus();
+ }
- /**
- * Minimize text area and save
- *
- * @param {String} bid
- */
- hide: function(bid) {
- jsxc.storage.updateUserItem('window', bid, 'minimize', true);
+ win.trigger('show.window.jsxc');
+ },
- jsxc.gui.window._hide(bid);
- },
+ /**
+ * Minimize text area and save
+ *
+ * @param {String} bid
+ */
+ hide: function(bid) {
+ jsxc.storage.updateUserItem('window', bid, 'minimize', true);
- /**
- * Minimize text area
- *
- * @param {String} bid
- */
- _hide: function(bid) {
- jsxc.gui.window.get(bid).addClass('jsxc_min').find(' .jsxc_fade').slideUp();
+ jsxc.gui.window._hide(bid);
+ },
- jsxc.gui.window.get(bid).trigger('hidden.window.jsxc');
- },
+ /**
+ * Minimize text area
+ *
+ * @param {String} bid
+ */
+ _hide: function(bid) {
+ jsxc.gui.window.get(bid).addClass('jsxc_min').find(' .jsxc_fade').slideUp();
- /**
- * Highlight window
- *
- * @param {type} bid
- */
- highlight: function(bid) {
- var el = jsxc.gui.window.get(bid).find(' .jsxc_bar');
+ jsxc.gui.window.get(bid).trigger('hidden.window.jsxc');
+ },
- if (!el.is(':animated')) {
- el.effect('highlight', {
- color: 'orange'
- }, 2000);
- }
- },
+ /**
+ * Highlight window
+ *
+ * @param {type} bid
+ */
+ highlight: function(bid) {
+ var el = jsxc.gui.window.get(bid).find(' .jsxc_bar');
- /**
- * Scroll chat area to the bottom
- *
- * @param {String} bid bar jid
- */
- scrollDown: function(bid) {
- var chat = jsxc.gui.window.get(bid).find('.jsxc_textarea');
+ if (!el.is(':animated')) {
+ el.effect('highlight', {
+ color: 'orange'
+ }, 2000);
+ }
+ },
- // check if chat exist
- if (chat.length === 0) {
- return;
- }
+ /**
+ * Scroll chat area to the bottom
+ *
+ * @param {String} bid bar jid
+ */
+ scrollDown: function(bid) {
+ var chat = jsxc.gui.window.get(bid).find('.jsxc_textarea');
- chat.slimScroll({
- scrollTo: (chat.get(0).scrollHeight + 'px')
- });
- },
+ // check if chat exist
+ if (chat.length === 0) {
+ return;
+ }
- /**
- * Write Message to chat area and save
- *
- * @param {String} bid bar jid
- * @param {String} direction 'in' message is received or 'out' message is
- * send
- * @param {String} msg Message to display
- * @param {boolean} encrypted Was this message encrypted? Default: false
- * @param {boolean} forwarded Was this message forwarded? Default: false
- * @param {integer} stamp Timestamp
- */
- postMessage: function(bid, direction, msg, encrypted, forwarded, stamp) {
- var data = jsxc.storage.getUserItem('buddy', bid);
- var html_msg = msg;
+ chat.slimScroll({
+ scrollTo: (chat.get(0).scrollHeight + 'px')
+ });
+ },
- // remove html tags and reencode html tags
- msg = jsxc.removeHTML(msg);
- msg = jsxc.escapeHTML(msg);
+ /**
+ * Write Message to chat area and save
+ *
+ * @param {String} bid bar jid
+ * @param {String} direction 'in' message is received or 'out' message is
+ * send
+ * @param {String} msg Message to display
+ * @param {boolean} encrypted Was this message encrypted? Default: false
+ * @param {boolean} forwarded Was this message forwarded? Default: false
+ * @param {integer} stamp Timestamp
+ * @param {object} sender Information about sender
+ * @property {string} sender.jid Sender Jid
+ * @property {string} sender.name Sender name or nickname
+ */
+ postMessage: function(bid, direction, msg, encrypted, forwarded, stamp, sender) {
+ var data = jsxc.storage.getUserItem('buddy', bid);
+ var html_msg = msg;
- // exceptions:
+ // remove html tags and reencode html tags
+ msg = jsxc.removeHTML(msg);
+ msg = jsxc.escapeHTML(msg);
- if (direction === 'out' && data.msgstate === OTR.CONST.MSGSTATE_FINISHED && forwarded !== true) {
- direction = 'sys';
- msg = jsxc.l.your_message_wasnt_send_please_end_your_private_conversation;
- }
+ // exceptions:
- if (direction === 'in' && data.msgstate === OTR.CONST.MSGSTATE_FINISHED) {
- direction = 'sys';
- msg = jsxc.l.unencrypted_message_received + ' ' + msg;
- }
+ if (direction === 'out' && data.msgstate === OTR.CONST.MSGSTATE_FINISHED && forwarded !== true) {
+ direction = 'sys';
+ msg = $.t('your_message_wasnt_send_please_end_your_private_conversation');
+ }
- if (direction === 'out' && data.sub === 'from') {
- direction = 'sys';
- msg = jsxc.l.your_message_wasnt_send_because_you_have_no_valid_subscription;
- }
+ if (direction === 'in' && data.msgstate === OTR.CONST.MSGSTATE_FINISHED) {
+ direction = 'sys';
+ msg = $.t('unencrypted_message_received') + ' ' + msg;
+ }
- encrypted = encrypted || data.msgstate === OTR.CONST.MSGSTATE_ENCRYPTED;
- var post = jsxc.storage.saveMessage(bid, direction, msg, encrypted, forwarded, stamp);
+ if (direction === 'out' && data.sub === 'from') {
+ direction = 'sys';
+ msg = $.t('your_message_wasnt_send_because_you_have_no_valid_subscription');
+ }
- if (direction === 'in') {
- $(document).trigger('postmessagein.jsxc', [ bid, html_msg ]);
- }
+ encrypted = encrypted || data.msgstate === OTR.CONST.MSGSTATE_ENCRYPTED;
+ var post = jsxc.storage.saveMessage(bid, direction, msg, encrypted, forwarded, stamp, sender);
- if (direction === 'out' && jsxc.master && forwarded !== true) {
- jsxc.xmpp.sendMessage(bid, html_msg, post.uid);
- }
+ if (direction === 'in') {
+ $(document).trigger('postmessagein.jsxc', [ bid, html_msg ]);
+ }
- jsxc.gui.window._postMessage(bid, post);
+ if (direction === 'out' && jsxc.master && forwarded !== true) {
+ jsxc.xmpp.sendMessage(bid, html_msg, post.uid);
+ }
- if (direction === 'out' && msg === '?') {
- jsxc.gui.window.postMessage(bid, 'sys', '42');
- }
- },
+ jsxc.gui.window._postMessage(bid, post);
- /**
- * Write Message to chat area
- *
- * @param {String} bid bar jid
- * @param {Object} post Post object with direction, msg, uid, received
- * @param {Bool} restore If true no highlights are used and so unread flag
- * set
- */
- _postMessage: function(bid, post, restore) {
- var win = jsxc.gui.window.get(bid);
- var msg = post.msg;
- var direction = post.direction;
- var uid = post.uid;
+ if (direction === 'out' && msg === '?') {
+ jsxc.gui.window.postMessage(bid, 'sys', '42');
+ }
+ },
- if (win.find('.jsxc_textinput').is(':not(:focus)') && jsxc.restoreCompleted && direction === 'in' && !restore) {
- jsxc.gui.window.highlight(bid);
- }
+ /**
+ * Write Message to chat area
+ *
+ * @param {String} bid bar jid
+ * @param {Object} post Post object with direction, msg, uid, received
+ * @param {Bool} restore If true no highlights are used and so unread flag
+ * set
+ */
+ _postMessage: function(bid, post, restore) {
+ var win = jsxc.gui.window.get(bid);
+ var msg = post.msg;
+ var direction = post.direction;
+ var uid = post.uid;
- msg = msg.replace(jsxc.CONST.REGEX.URL, function(url) {
+ if (win.find('.jsxc_textinput').is(':not(:focus)') && jsxc.restoreCompleted && direction === 'in' && !restore) {
+ jsxc.gui.window.highlight(bid);
+ }
- var href = (url.match(/^https?:\/\//i)) ? url : 'http://' + url;
+ msg = msg.replace(jsxc.CONST.REGEX.URL, function(url) {
- return '<a href="' + href + '" target="_blank">' + url + '</a>';
- });
+ var href = (url.match(/^https?:\/\//i)) ? url : 'http://' + url;
- msg = msg.replace(new RegExp('(xmpp:)?(' + jsxc.CONST.REGEX.JID.source + ')(\\?[^\\s]+\\b)?', 'i'), function(match, protocol, jid, action) {
- if (protocol === 'xmpp:') {
- if (typeof action === 'string') {
- jid += action;
- }
+ return '<a href="' + href + '" target="_blank">' + url + '</a>';
+ });
- return '<a href="xmpp:' + jid + '">' + jid + '</a>';
+ msg = msg.replace(new RegExp('(xmpp:)?(' + jsxc.CONST.REGEX.JID.source + ')(\\?[^\\s]+\\b)?', 'i'), function(match, protocol, jid, action) {
+ if (protocol === 'xmpp:') {
+ if (typeof action === 'string') {
+ jid += action;
}
- return '<a href="mailto:' + jid + '" target="_blank">' + jid + '</a>';
- });
+ return '<a href="xmpp:' + jid + '">' + jid + '</a>';
+ }
- $.each(jsxc.gui.emotions, function(i, val) {
- msg = msg.replace(val[2], function(match, p1) {
+ return '<a href="mailto:' + jid + '" target="_blank">' + jid + '</a>';
+ });
- // escape value for alt and title, this prevents double
- // replacement
- var esc = '', i;
- for (i = 0; i < p1.length; i++) {
- esc += '&#' + p1.charCodeAt(i) + ';';
- }
+ $.each(jsxc.gui.emotions, function(i, val) {
+ msg = msg.replace(val[2], function(match, p1) {
- return '<div title="' + esc + '" class="jsxc_emoticon jsxc_' + val[1] + '"/>';
- });
+ // escape value for alt and title, this prevents double
+ // replacement
+ var esc = '', i;
+ for (i = 0; i < p1.length; i++) {
+ esc += '&#' + p1.charCodeAt(i) + ';';
+ }
+
+ return '<div title="' + esc + '" class="jsxc_emoticon jsxc_' + val[1] + '"/>';
});
+ });
- var msgDiv = $("<div>"), msgTsDiv = $("<div>");
- msgDiv.addClass('jsxc_chatmessage jsxc_' + direction);
- msgDiv.attr('id', uid);
- msgDiv.html('<div>' + msg + '</div>');
- msgTsDiv.addClass('jsxc_timestamp');
- msgTsDiv.html(jsxc.getFormattedTime(post.stamp));
+ var msgDiv = $("<div>"), msgTsDiv = $("<div>");
+ msgDiv.addClass('jsxc_chatmessage jsxc_' + direction);
+ msgDiv.attr('id', uid);
+ msgDiv.html('<div>' + msg + '</div>');
+ msgTsDiv.addClass('jsxc_timestamp');
+ msgTsDiv.text(jsxc.getFormattedTime(post.stamp));
- if (post.received || false) {
- msgDiv.addClass('jsxc_received');
- }
+ if (post.received || false) {
+ msgDiv.addClass('jsxc_received');
+ }
- if (post.forwarded) {
- msgDiv.addClass('jsxc_forwarded');
- }
+ if (post.forwarded) {
+ msgDiv.addClass('jsxc_forwarded');
+ }
- if (post.encrypted) {
- msgDiv.addClass('jsxc_encrypted');
- }
+ if (post.encrypted) {
+ msgDiv.addClass('jsxc_encrypted');
+ }
- if (direction === 'sys') {
- jsxc.gui.window.get(bid).find('.jsxc_textarea').append('<div style="clear:both"/>');
- } else if (typeof post.stamp !== 'undefined') {
- msgDiv.append(msgTsDiv);
+ if (direction === 'sys') {
+ jsxc.gui.window.get(bid).find('.jsxc_textarea').append('<div style="clear:both"/>');
+ } else if (typeof post.stamp !== 'undefined') {
+ msgDiv.append(msgTsDiv);
+ }
+
+ win.find('.jsxc_textarea').append(msgDiv);
+
+ if (typeof post.sender === 'object' && post.sender !== null) {
+ var title = '';
+ var avatarDiv = $('<div>');
+ avatarDiv.addClass('jsxc_avatar').prependTo(msgDiv);
+
+ if (typeof post.sender.jid === 'string') {
+ msgDiv.attr('data-bid', jsxc.jidToBid(post.sender.jid));
+
+ var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(post.sender.jid)) || {};
+ jsxc.gui.updateAvatar(msgDiv, jsxc.jidToBid(post.sender.jid), data.avatar);
+
+ title = jsxc.jidToBid(post.sender.jid);
+ }
+
+ if (typeof post.sender.name === 'string') {
+ msgDiv.attr('data-name', post.sender.name);
+
+ if (typeof post.sender.jid !== 'string') {
+ jsxc.gui.avatarPlaceholder(avatarDiv, post.sender.name);
+ }
+
+ if (title !== '') {
+ title = '\n' + title;
+ }
+
+ title = post.sender.name + title;
+
+ msgTsDiv.text(msgTsDiv.text() + ' ' + post.sender.name);
}
+
+ avatarDiv.attr('title', jsxc.escapeHTML(title));
+ }
- win.find('.jsxc_textarea').append(msgDiv);
-
- jsxc.gui.detectUriScheme(win);
- jsxc.gui.detectEmail(win);
-
- jsxc.gui.window.scrollDown(bid);
+ jsxc.gui.detectUriScheme(win);
+ jsxc.gui.detectEmail(win);
- // if window has no focus set unread flag
- if (!win.find('.jsxc_textinput').is(':focus') && jsxc.restoreCompleted && !restore) {
- jsxc.gui.unreadMsg(bid);
- }
- },
+ jsxc.gui.window.scrollDown(bid);
- /**
- * Set text into input area
- *
- * @param {type} bid
- * @param {type} text
- * @returns {undefined}
- */
- setText: function(bid, text) {
- jsxc.gui.window.get(bid).find('.jsxc_textinput').val(text);
- },
+ // if window has no focus set unread flag
+ if (!win.find('.jsxc_textinput').is(':focus') && jsxc.restoreCompleted && !restore) {
+ jsxc.gui.unreadMsg(bid);
+ }
+ },
- /**
- * Load old log into chat area
- *
- * @param {type} bid
- * @returns {undefined}
- */
- restoreChat: function(bid) {
- var chat = jsxc.storage.getUserItem('chat', bid);
+ /**
+ * Set text into input area
+ *
+ * @param {type} bid
+ * @param {type} text
+ * @returns {undefined}
+ */
+ setText: function(bid, text) {
+ jsxc.gui.window.get(bid).find('.jsxc_textinput').val(text);
+ },
- while (chat !== null && chat.length > 0) {
- var c = chat.pop();
- jsxc.gui.window._postMessage(bid, c, true);
- }
- },
+ /**
+ * Load old log into chat area
+ *
+ * @param {type} bid
+ * @returns {undefined}
+ */
+ restoreChat: function(bid) {
+ var chat = jsxc.storage.getUserItem('chat', bid);
- /**
- * Clear chat history
- *
- * @param {type} bid
- * @returns {undefined}
- */
- clear: function(bid) {
- jsxc.storage.setUserItem('chat', bid, []);
- jsxc.gui.window.get(bid).find('.jsxc_textarea').empty();
+ while (chat !== null && chat.length > 0) {
+ var c = chat.pop();
+ jsxc.gui.window._postMessage(bid, c, true);
}
- };
+ },
/**
- * Hold all HTML templates.
+ * Clear chat history
*
- * @namespace jsxc.gui.template
+ * @param {type} bid
+ * @returns {undefined}
*/
- jsxc.gui.template = {
- /**
- * Return requested template and replace all placeholder
- *
- * @memberOf jsxc.gui.template;
- * @param {type} name template name
- * @param {type} bid
- * @param {type} msg
- * @returns {String} HTML Template
- */
- get: function(name, bid, msg) {
-
- // common placeholder
- var ph = {
- my_priv_fingerprint: jsxc.storage.getUserItem('priv_fingerprint') ? jsxc.storage.getUserItem('priv_fingerprint').replace(/(.{8})/g, '$1 ') : jsxc.l.not_available,
- my_jid: jsxc.storage.getItem('jid') || '',
- my_node: Strophe.getNodeFromJid(jsxc.storage.getItem('jid') || '') || '',
- root: jsxc.options.root,
- app_name: jsxc.options.app_name
- };
-
- // placeholder depending on bid
- if (bid) {
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- $.extend(ph, {
- bid_priv_fingerprint: (data && data.fingerprint) ? data.fingerprint.replace(/(.{8})/g, '$1 ') : jsxc.l.not_available,
- bid_jid: bid,
- bid_name: (data && data.name) ? data.name : bid
- });
- }
+ clear: function(bid) {
+ jsxc.storage.setUserItem('chat', bid, []);
+ jsxc.gui.window.get(bid).find('.jsxc_textarea').empty();
+ }
+};
+
+/**
+ * Hold all HTML templates.
+ *
+ * @namespace jsxc.gui.template
+ */
+jsxc.gui.template = {
+ /**
+ * Return requested template and replace all placeholder
+ *
+ * @memberOf jsxc.gui.template;
+ * @param {type} name template name
+ * @param {type} bid
+ * @param {type} msg
+ * @returns {String} HTML Template
+ */
+ get: function(name, bid, msg) {
+
+ // common placeholder
+ var ph = {
+ my_priv_fingerprint: jsxc.storage.getUserItem('priv_fingerprint') ? jsxc.storage.getUserItem('priv_fingerprint').replace(/(.{8})/g, '$1 ') : $.t('not_available'),
+ my_jid: jsxc.storage.getItem('jid') || '',
+ my_node: Strophe.getNodeFromJid(jsxc.storage.getItem('jid') || '') || '',
+ root: jsxc.options.root,
+ app_name: jsxc.options.app_name
+ };
+
+ // placeholder depending on bid
+ if (bid) {
+ var data = jsxc.storage.getUserItem('buddy', bid);
- // placeholder depending on msg
- if (msg) {
- $.extend(ph, {
- msg: msg
- });
- }
+ $.extend(ph, {
+ bid_priv_fingerprint: (data && data.fingerprint) ? data.fingerprint.replace(/(.{8})/g, '$1 ') : $.t('not_available'),
+ bid_jid: bid,
+ bid_name: (data && data.name) ? data.name : bid
+ });
+ }
- var ret = jsxc.gui.template[name];
+ // placeholder depending on msg
+ if (msg) {
+ $.extend(ph, {
+ msg: msg
+ });
+ }
- if (typeof (ret) === 'string') {
- ret = jsxc.translate(ret);
+ var ret = jsxc.gui.template[name];
- ret = ret.replace(/\{\{([a-zA-Z0-9_\-]+)\}\}/g, function(s, key) {
- return (typeof ph[key] === 'string') ? ph[key] : s;
- });
+ if (typeof (ret) === 'string') {
+ ret = ret.replace(/\{\{([a-zA-Z0-9_\-]+)\}\}/g, function(s, key) {
+ return (typeof ph[key] === 'string') ? ph[key] : s;
+ });
- return ret;
- }
+ return $('<div>').append($(ret).i18n()).html();
+ }
- jsxc.debug('Template not available: ' + name);
- return name;
- },
- authenticationDialog: '<h3>Verification</h3>\
- <p>%%Authenticating_a_buddy_helps_%%</p>\
+ jsxc.debug('Template not available: ' + name);
+ return name;
+ },
+ authenticationDialog: '<h3>Verification</h3>\
+ <p data-i18n="Authenticating_a_buddy_helps_"></p>\
<div>\
- <p style="margin:0px;">%%How_do_you_want_to_authenticate_your_buddy%%</p>\
+ <p data-i18n="How_do_you_want_to_authenticate_your_buddy" style="margin:0px;"></p>\
<select size="1">\
- <option>%%Select_method%%</option>\
- <option>%%Manual%%</option>\
- <option>%%Question%%</option>\
- <option>%%Secret%%</option>\
+ <option data-i18n="Select_method"></option>\
+ <option data-i18n="Manual"></option>\
+ <option data-i18n="Question"></option>\
+ <option data-i18n="Secret"></option>\
</select>\
</div>\
<div style="display:none">\
- <p class=".jsxc_explanation">%%To_verify_the_fingerprint_%%</p>\
- <p><strong>%%Your_fingerprint%%</strong><br />\
+ <p data-i18n="To_verify_the_fingerprint_" class=".jsxc_explanation"></p>\
+ <p><strong data-i18n="Your_fingerprint"></strong><br />\
<span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p>\
- <p><strong>%%Buddy_fingerprint%%</strong><br />\
+ <p><strong data-i18n="Buddy_fingerprint"></strong><br />\
<span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br />\
- <p class="jsxc_right"><a href="#" class="jsxc_close button">%%Close%%</a> <a href="#" class="button creation">%%Compared%%</a></p>\
+ <p class="jsxc_right"><a href="#" data-i18n="Close" class="jsxc_close button"></a> <a href="#" data-i18n="Compared" class="button creation"></a></p>\
</div>\
<div style="display:none">\
- <p class=".jsxc_explanation">%%To_authenticate_using_a_question_%%</p>\
- <p><label for="jsxc_quest">%%Question%%:</label><input type="text" name="quest" id="jsxc_quest" /></p>\
- <p><label for="jsxc_secret2">%%Secret%%:</label><input type="text" name="secret2" id="jsxc_secret2" /></p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Ask%%</a></p>\
+ <p data-i18n="To_authenticate_using_a_question_" class=".jsxc_explanation"></p>\
+ <p><label for="jsxc_quest" data-i18n="Question"></label><input type="text" name="quest" id="jsxc_quest" /></p>\
+ <p><label for="jsxc_secret2" data-i18n="Secret"></label><input type="text" name="secret2" id="jsxc_secret2" /></p>\
+ <p class="jsxc_right"><a href="#" class="button jsxc_close" data-i18n="Close"></a> <a href="#" class="button creation" data-i18n="Ask"></a></p>\
</div>\
<div style="display:none">\
- <p class=".jsxc_explanation">%%To_authenticate_pick_a_secret_%%</p>\
- <p><label for="jsxc_secret">%%Secret%%:</label><input type="text" name="secret" id="jsxc_secret" /></p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Compare%%</a></p>\
+ <p class=".jsxc_explanation" data-i18n="To_authenticate_pick_a_secret_"></p>\
+ <p><label for="jsxc_secret" data-i18n="Secret"></label><input type="text" name="secret" id="jsxc_secret" /></p>\
+ <p class="jsxc_right"><a href="#" class="button jsxc_close" data-i18n="Close"></a> <a href="#" class="button creation" data-i18n="Compare"></a></p>\
</div>',
- fingerprintsDialog: '<div>\
- <p class="jsxc_maxWidth">%%A_fingerprint_%%</p>\
- <p><strong>%%Your_fingerprint%%</strong><br />\
+ fingerprintsDialog: '<div>\
+ <p class="jsxc_maxWidth" data-i18n="A_fingerprint_"></p>\
+ <p><strong data-i18n="Your_fingerprint"></strong><br />\
<span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p>\
- <p><strong>%%Buddy_fingerprint%%</strong><br />\
+ <p><strong data-i18n="Buddy_fingerprint"></strong><br />\
<span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br />\
- <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a></p>\
+ <p class="jsxc_right"><a href="#" class="button jsxc_close" data-i18n="Close"></a></p>\
</div>',
- chatWindow: '<li class="jsxc_min jsxc_windowItem">\
+ chatWindow: '<li class="jsxc_min jsxc_windowItem">\
<div class="jsxc_window">\
<div class="jsxc_bar">\
<div class="jsxc_avatar">☺</div>\
<div class="jsxc_tools">\
<div class="jsxc_settings">\
<ul>\
- <li class="jsxc_fingerprints jsxc_otr jsxc_disabled">%%Fingerprints%%</li>\
- <li class="jsxc_verification">%%Authentication%%</li>\
- <li class="jsxc_transfer jsxc_otr jsxc_disabled">%%start_private%%</li>\
- <li class="jsxc_clear">%%clear_history%%</li>\
+ <li class="jsxc_fingerprints jsxc_otr jsxc_disabled" data-i18n="Fingerprints"></li>\
+ <li class="jsxc_verification" data-i18n="Authentication"></li>\
+ <li class="jsxc_transfer jsxc_otr jsxc_disabled" data-i18n="start_private"></li>\
+ <li class="jsxc_clear" data-i18n="clear_history"></li>\
</ul>\
</div>\
<div class="jsxc_transfer jsxc_otr jsxc_disabled"/>\
@@ -3133,11 +3147,11 @@ var jsxc;
<div class="jsxc_gradient"/>\
<div class="jsxc_textarea"/>\
<div class="jsxc_emoticons"><ul/></div>\
- <input type="text" class="jsxc_textinput" placeholder="...%%Message%%" />\
+ <input type="text" class="jsxc_textinput" data-i18n="[placeholder]Message"/>\
</div>\
</div>\
</li>',
- roster: '<div id="jsxc_roster">\
+ roster: '<div id="jsxc_roster">\
<ul id="jsxc_buddylist"></ul>\
<div class="jsxc_bottom jsxc_presence" data-bid="own">\
<div id="jsxc_avatar">\
@@ -3146,12 +3160,12 @@ var jsxc;
<div id="jsxc_menu">\
<span></span>\
<ul>\
- <li class="jsxc_settings">%%Settings%%</li>\
- <li class="jsxc_muteNotification">%%Mute%%</li>\
- <li class="jsxc_addBuddy">%%Add_buddy%%</li>\
- <li class="jsxc_hideOffline">%%Hide offline%%</li>\
- <li class="jsxc_onlineHelp">%%Online help%%</li>\
- <li class="jsxc_about">%%About%%</li>\
+ <li class="jsxc_settings" data-i18n="Settings"></li>\
+ <li class="jsxc_muteNotification" data-i18n="Mute"></li>\
+ <li class="jsxc_addBuddy" data-i18n="Add_buddy"></li>\
+ <li class="jsxc_hideOffline" data-i18n="Hide_offline"></li>\
+ <li class="jsxc_onlineHelp" data-i18n="Online_help"></li>\
+ <li class="jsxc_about" data-i18n="About"></li>\
</ul>\
</div>\
<div id="jsxc_notice">\
@@ -3159,86 +3173,87 @@ var jsxc;
<ul></ul>\
</div>\
<div id="jsxc_presence">\
- <span>%%Online%%</span>\
+ <span data-i18n="Online"></span>\
<ul>\
- <li data-pres="online" class="jsxc_online">%%Online%%</li>\
- <li data-pres="chat" class="jsxc_chat">%%Chatty%%</li>\
- <li data-pres="away" class="jsxc_away">%%Away%%</li>\
- <li data-pres="xa" class="jsxc_xa">%%Extended away%%</li>\
- <li data-pres="dnd" class="jsxc_dnd">%%dnd%%</li>\
- <!-- <li data-pres="offline" class="jsxc_offline">%%Offline%%</li> -->\
+ <li data-pres="online" class="jsxc_online" data-i18n="Online"></li>\
+ <li data-pres="chat" class="jsxc_chat" data-i18n="Chatty"></li>\
+ <li data-pres="away" class="jsxc_away" data-i18n="Away"></li>\
+ <li data-pres="xa" class="jsxc_xa" data-i18n="Extended_away"></li>\
+ <li data-pres="dnd" class="jsxc_dnd" data-i18n="dnd"></li>\
+ <li data-pres="offline" class="jsxc_offline" data-i18n="Offline"></li>\
</ul>\
</div>\
</div>\
<div id="jsxc_toggleRoster"></div>\
</div>',
- windowList: '<div id="jsxc_windowList">\
+ windowList: '<div id="jsxc_windowList">\
<ul></ul>\
</div>\
<div id="jsxc_windowListSB">\
<div class="jsxc_scrollLeft jsxc_disabled">&lt;</div>\
<div class="jsxc_scrollRight jsxc_disabled">&gt;</div>\
</div>',
- rosterBuddy: '<li>\
+ rosterBuddy: '<li>\
<div class="jsxc_avatar">☺</div>\
<div class="jsxc_control"></div>\
<div class="jsxc_name"/>\
<div class="jsxc_options jsxc_right">\
- <div class="jsxc_rename" title="%%rename_buddy%%">✎</div>\
- <div class="jsxc_delete" title="%%delete_buddy%%">✘</div>\
+ <div class="jsxc_rename" data-i18n="[title]rename_buddy">✎</div>\
+ <div class="jsxc_delete" data-i18n="[title]delete_buddy">✘</div>\
</div>\
<div class="jsxc_options jsxc_left">\
- <div class="jsxc_chaticon" title="%%send_message%%"/>\
- <div class="jsxc_vcardicon" title="%%get_info%%">i</div>\
+ <div class="jsxc_chaticon" data-i18n="[title]send_message"/>\
+ <div class="jsxc_vcardicon" data-i18n="[title]get_info">i</div>\
</div>\
</li>',
- loginBox: '<h3>%%Login%%</h3>\
+ loginBox: '<h3 data-i18n="Login"></h3>\
<form>\
- <p><label for="jsxc_username">%%Username%%:</label>\
+ <p><label for="jsxc_username" data-i18n="Username"></label>\
<input type="text" name="username" id="jsxc_username" required="required" value="{{my_node}}"/></p>\
- <p><label for="jsxc_password">%%Password%%:</label>\
+ <p><label for="jsxc_password" data-i18n="Password"></label>\
<input type="password" name="password" required="required" id="jsxc_password" /></p>\
<div class="bottom_submit_section">\
- <input type="reset" class="button jsxc_close" name="clear" value="%%Cancel%%"/>\
- <input type="submit" class="button creation" name="commit" value="%%Connect%%"/>\
+ <input type="reset" class="button jsxc_close" name="clear" data-i18n="[value]Cancel"/>\
+ <input type="submit" class="button creation" name="commit" data-i18n="[value]Connect"/>\
</div>\
</form>',
- contactDialog: '<h3>%%Add_buddy%%</h3>\
- <p class=".jsxc_explanation">%%Type_in_the_full_username_%%</p>\
+ contactDialog: '<h3 data-i18n="Add_buddy"></h3>\
+ <p class=".jsxc_explanation" data-i18n="Type_in_the_full_username_"></p>\
<form>\
- <p><label for="jsxc_username">* %%Username%%:</label>\
- <input type="text" name="username" id="jsxc_username" pattern="^[^\\x22&\'\\/:<>@\\s]+(@[.\\-_\\w]+)?" required="required" /></p>\
- <p><label for="jsxc_alias">%%Alias%%:</label>\
+ <p><label for="jsxc_username" data-i18n="Username"></label>\
+ <input type="text" name="username" id="jsxc_username" list="jsxc_userlist" pattern="^[^\\x22&\'\\/:<>@\\s]+(@[.\\-_\\w]+)?" required="required" /></p>\
+ <datalist id="jsxc_userlist"></datalist>\
+ <p><label for="jsxc_alias" data-i18n="Alias"></label>\
<input type="text" name="alias" id="jsxc_alias" /></p>\
<p class="jsxc_right">\
- <input class="button" type="submit" value="%%Add%%" />\
+ <input class="button" type="submit" data-i18n="[value]Add" />\
</p>\
<form>',
- approveDialog: '<h3>%%Subscription_request%%</h3>\
- <p>%%You_have_a_request_from%% <b class="jsxc_their_jid"></b>.</p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_deny">%%Deny%%</a> <a href="#" class="button creation jsxc_approve">%%Approve%%</a></p>',
- removeDialog: '<h3>%%Remove buddy%%</h3>\
- <p class="jsxc_maxWidth">%%You_are_about_to_remove_%%</p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_cancel jsxc_close">%%Cancel%%</a> <a href="#" class="button creation">%%Remove%%</a></p>',
- waitAlert: '<h3>{{msg}}</h3>\
- <p>%%Please_wait%%</p>\
+ approveDialog: '<h3 data-i18n="Subscription_request"></h3>\
+ <p><span data-i18n="You_have_a_request_from"></span><b class="jsxc_their_jid"></b>.</p>\
+ <p class="jsxc_right"><a href="#" class="button jsxc_deny" data-i18n="Deny"></a> <a href="#" class="button creation jsxc_approve" data-i18n="Approve"></a></p>',
+ removeDialog: '<h3 data-i18n="Remove_buddy"></h3>\
+ <p class="jsxc_maxWidth" data-i18n="You_are_about_to_remove_"></p>\
+ <p class="jsxc_right"><a href="#" class="button jsxc_cancel jsxc_close" data-i18n="Cancel"></a> <a href="#" class="button creation" data-i18n="Remove"></a></p>',
+ waitAlert: '<h3>{{msg}}</h3>\
+ <p data-i18n="Please_wait"></p>\
<p class="jsxc_center"><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /></p>',
- alert: '<h3>%%Alert%%</h3>\
+ alert: '<h3 data-i18n="Alert"></h3>\
<p>{{msg}}</p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_close jsxc_cancel">%%Ok%%</a></p>',
- authFailDialog: '<h3>%%Login_failed%%</h3>\
- <p>%%Sorry_we_cant_authentikate_%%</p>\
+ <p class="jsxc_right"><a href="#" data-i18n="Ok" class="button jsxc_close jsxc_cancel"></a></p>',
+ authFailDialog: '<h3 data-i18n="Login_failed"></h3>\
+ <p data-i18n="Sorry_we_cant_authentikate_"></p>\
<p class="jsxc_right">\
- <a class="button jsxc_cancel">%%Continue_without_chat%%</a>\
- <a class="button creation">%%Retry%%</a>\
+ <a class="button jsxc_cancel" data-i18n="Continue_without_chat"></a>\
+ <a class="button creation" data-i18n="Retry"></a>\
</p>',
- confirmDialog: '<p>{{msg}}</p>\
+ confirmDialog: '<p>{{msg}}</p>\
<p class="jsxc_right">\
- <a class="button jsxc_cancel jsxc_close">%%Dismiss%%</a>\
- <a class="button creation">%%Confirm%%</a>\
+ <a class="button jsxc_cancel jsxc_close" data-i18n="Dismiss"></a>\
+ <a class="button creation" data-i18n="Confirm"></a>\
</p>',
- pleaseAccept: '<p>%%Please_accept_%%</p>',
- aboutDialog: '<h3>JavaScript XMPP Chat</h3>\
+ pleaseAccept: '<p data-i18n="Please_accept_"></p>',
+ aboutDialog: '<h3>JavaScript XMPP Chat</h3>\
<p><b>Version: </b>' + jsxc.version + '<br />\
<a href="http://jsxc.org/" target="_blank">www.jsxc.org</a><br />\
<br />\
@@ -3250,1137 +3265,2181 @@ var jsxc;
<b>Credits: </b> <a href="http://www.beepzoid.com/old-phones/" target="_blank">David English (Ringtone)</a>,\
<a href="https://soundcloud.com/freefilmandgamemusic/ping-1?in=freefilmandgamemusic/sets/free-notification-sounds-and" target="_blank">CameronMusic (Ping)</a></p>\
<p class="jsxc_right"><a class="button jsxc_debuglog" href="#">Show debug log</a></p>',
- vCard: '<h3>%%Info_about%% {{bid_name}}</h3>\
+ vCard: '<h3><span data-i18n="Info_about"></span> <span>{{bid_name}}</span></h3>\
<ul class="jsxc_vCard"></ul>\
- <p><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /> %%Please_wait%%...</p>',
- settings: '<h3>%%User_settings%%</h3>\
+ <p><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /> <span data-i18n="Please_wait"></span>...</p>',
+ settings: '<h3 data-i18n="User_settings"></h3>\
<p></p>\
<form>\
<fieldset class="jsxc_fieldsetXmpp jsxc_fieldset">\
- <legend>%%Login options%%</legend>\
- <label for="xmpp-url">%%BOSH url%%</label><input type="text" id="xmpp-url" readonly="readonly"/><br />\
- <label for="xmpp-username">%%Username%%</label><input type="text" id="xmpp-username"/><br />\
- <label for="xmpp-domain">%%Domain%%</label><input type="text" id="xmpp-domain"/><br />\
- <label for="xmpp-resource">%%Resource%%</label><input type="text" id="xmpp-resource"/><br />\
- <label for="xmpp-onlogin">%%On login%%</label><input type="checkbox" id="xmpp-onlogin" /><br />\
- <input type="submit" value="%%Save%%"/>\
+ <legend data-i18n="Login_options"></legend>\
+ <label for="xmpp-url" data-i18n="BOSH_url"></label><input type="text" id="xmpp-url" readonly="readonly"/><br />\
+ <label for="xmpp-username" data-i18n="Username"></label><input type="text" id="xmpp-username"/><br />\
+ <label for="xmpp-domain" data-i18n="Domain"></label><input type="text" id="xmpp-domain"/><br />\
+ <label for="xmpp-resource" data-i18n="Resource"></label><input type="text" id="xmpp-resource"/><br />\
+ <label for="xmpp-onlogin" data-i18n="On_login"></label><input type="checkbox" id="xmpp-onlogin" /><br />\
+ <input type="submit" data-i18n="[value]Save"/>\
</fieldset>\
</form>\
<p></p>\
<form>\
<fieldset class="jsxc_fieldsetPriority jsxc_fieldset">\
- <legend>%%Priority%%</legend>\
- <label for="priority-online">%%Online%%</label><input type="number" value="0" id="priority-online" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-chat">%%Chatty%%</label><input type="number" value="0" id="priority-chat" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-away">%%Away%%</label><input type="number" value="0" id="priority-away" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-xa">%%Extended_away%%</label><input type="number" value="0" id="priority-xa" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-dnd">%%dnd%%</label><input type="number" value="0" id="priority-dnd" min="-128" max="127" step="1" required="required"/><br />\
- <input type="submit" value="%%Save%%"/>\
+ <legend data-i18n="Priority"></legend>\
+ <label for="priority-online" data-i18n="Online"></label><input type="number" value="0" id="priority-online" min="-128" max="127" step="1" required="required"/><br />\
+ <label for="priority-chat" data-i18n="Chatty"></label><input type="number" value="0" id="priority-chat" min="-128" max="127" step="1" required="required"/><br />\
+ <label for="priority-away" data-i18n="Away"></label><input type="number" value="0" id="priority-away" min="-128" max="127" step="1" required="required"/><br />\
+ <label for="priority-xa" data-i18n="Extended_away"></label><input type="number" value="0" id="priority-xa" min="-128" max="127" step="1" required="required"/><br />\
+ <label for="priority-dnd" data-i18n="dnd"></label><input type="number" value="0" id="priority-dnd" min="-128" max="127" step="1" required="required"/><br />\
+ <input type="submit" data-i18n="[value]Save"/>\
</fieldset>\
</form>\
<p></p>\
<form data-onsubmit="xmpp.carbons.refresh">\
<fieldset class="jsxc_fieldsetCarbons jsxc_fieldset">\
- <legend>%%Carbon copy%%</legend>\
- <label for="carbons-enable">%%Enable%%</label><input type="checkbox" id="carbons-enable" /><br />\
- <input type="submit" value="%%Save%%"/>\
+ <legend data-i18n="Carbon_copy"></legend>\
+ <label for="carbons-enable" data-i18n="Enable"></label><input type="checkbox" id="carbons-enable" /><br />\
+ <input type="submit" data-i18n="[value]Save"/>\
</fieldset>\
</form>'
- };
+};
+
+jsxc.gui.template.joinChat = '<h3 data-i18n="Join_chat"></h3>\
+ <p class=".jsxc_explanation" data-i18n="muc_explanation"></p>\
+ <p><label for="jsxc_server" data-i18n="Server"></label>\
+ <input type="text" name="server" id="jsxc_server" required="required" readonly="readonly" /></p>\
+ <p><label for="jsxc_room" data-i18n="Room"></label>\
+ <input type="text" name="room" id="jsxc_room" autocomplete="off" list="jsxc_roomlist" required="required" pattern="^[^\\x22&\'\\/:<>@\\s]+" /></p>\
+ <p class="jsxc_inputinfo jsxc_waiting jsxc_room" data-i18n="Rooms_are_loaded"></p>\
+ <datalist id="jsxc_roomlist">\
+ <p><label for="jsxc_roomlist_select"></label><select id="jsxc_roomlist_select"><option></option><option>workaround</option></select></p>\
+ </datalist>\
+ <p><label for="jsxc_nickname" data-i18n="Nickname"></label>\
+ <input type="text" name="nickname" id="jsxc_nickname" /></p>\
+ <p><label for="jsxc_password" data-i18n="Password"></label>\
+ <input type="text" name="password" id="jsxc_password" /></p>\
+ <div class="jsxc_msg"></div>\
+ <p class="jsxc_right">\
+ <span class="jsxc_warning"></span> <a href="#" class="button jsxc_close" data-i18n="Close"></a> <a href="#" class="button jsxc_continue" data-i18n="Continue"> <a href="#" class="button jsxc_join" data-i18n="Join"></a>\
+ </p>';
+
+/**
+ * Implements Multi-User Chat (XEP-0045).
+ *
+ * @namespace jsxc.muc
+ */
+jsxc.muc = {
+ /** strophe connection */
+ conn: null,
+
+ /** some constants */
+ CONST: {
+ AFFILIATION: {
+ ADMIN: 'admin',
+ MEMBER: 'member',
+ OUTCAST: 'outcast',
+ OWNER: 'owner',
+ NONE: 'none'
+ },
+ ROLE: {
+ MODERATOR: 'moderator',
+ PARTICIPANT: 'participant',
+ VISITOR: 'visitor',
+ NONE: 'none'
+ },
+ ROOMSTATE: {
+ INIT: 0,
+ ENTERED: 1,
+ EXITED: 2,
+ AWAIT_DESTRUCTION: 3,
+ DESTROYED: 4
+ }
+ },
/**
- * Handle XMPP stuff.
+ * Initialize muc plugin.
*
- * @namespace jsxc.xmpp
+ * @private
+ * @memberof jsxc.muc
+ * @param {object} o Options
*/
- jsxc.xmpp = {
- conn: null, // connection
+ init: function(o) {
+ var self = jsxc.muc;
+ self.conn = jsxc.xmpp.conn;
- /**
- * Create new connection or attach to old
- *
- * @name login
- * @memberOf jsxc.xmpp
- */
- /**
- * Create new connection with given parameters.
- *
- * @name login^2
- * @param {string} jid
- * @param {string} password
- * @memberOf jsxc.xmpp
- */
- /**
- * Attach connection with given parameters.
- *
- * @name login^3
- * @param {string} jid
- * @param {string} sid
- * @param {string} rid
- * @memberOf jsxc.xmpp
- */
- login: function() {
+ var options = o || jsxc.options.get('muc');
- if (jsxc.xmpp.conn && jsxc.xmpp.conn.connected) {
- return;
- }
+ if (!options || typeof options.server !== 'string') {
+ jsxc.debug('Discover muc service');
- var jid = null, password = null, sid = null, rid = null;
+ // prosody does not response, if we send query before initial presence was send
+ setTimeout(function() {
+ self.conn.disco.items(Strophe.getDomainFromJid(self.conn.jid), null, function(items) {
+ $(items).find('item').each(function() {
+ var jid = $(this).attr('jid');
+ var discovered = false;
- switch (arguments.length) {
- case 2:
- jid = arguments[0];
- password = arguments[1];
+ self.conn.disco.info(jid, null, function(info) {
+ if ($(info).find('feature[var="' + Strophe.NS.MUC + '"]').length > 0) {
+ jsxc.debug('muc service found', jid);
+
+ jsxc.options.set('muc', {
+ server: jid,
+ name: $(info).find('identity').attr('name')
+ });
+
+ discovered = true;
+
+ self.init();
+ }
+ });
+
+ return !discovered;
+ });
+ });
+ }, 1000);
+
+ return;
+ }
+
+ if (jsxc.gui.roster.ready) {
+ self.initMenu();
+ } else {
+ $(document).one('ready.roster.jsxc', jsxc.muc.initMenu);
+ }
+
+ $(document).on('presence.jsxc', jsxc.muc.onPresence);
+ $(document).on('error.presence.jsxc', jsxc.muc.onPresenceError);
+
+ self.conn.addHandler(self.onGroupchatMessage, null, 'message', 'groupchat');
+ self.conn.addHandler(self.onErrorMessage, null, 'message', 'error');
+ self.conn.muc.roomNames = jsxc.storage.getUserItem('roomNames') || [];
+ },
+
+ /**
+ * Add entry to menu.
+ *
+ * @memberOf jsxc.muc
+ */
+ initMenu: function() {
+ var li = $('<li>').attr('class', 'jsxc_joinChat').text($.t('Join_chat'));
+
+ li.click(jsxc.muc.showJoinChat);
+
+ $('#jsxc_menu ul').append(li);
+ },
+
+ /**
+ * Open join dialog.
+ *
+ * @memberOf jsxc.muc
+ */
+ showJoinChat: function() {
+ var self = jsxc.muc;
+ var dialog = jsxc.gui.dialog.open(jsxc.gui.template.get('joinChat'));
+
+ // hide second step button
+ dialog.find('.jsxc_join').hide();
+
+ // display conference server
+ dialog.find('#jsxc_server').val(jsxc.options.get('muc').server);
+
+ // handle error response
+ var error_handler = function(event, condition, room) {
+ var msg;
+
+ switch (condition) {
+ case 'not-authorized':
+ // password-protected room
+ msg = $.t('A_password_is_required');
+ break;
+ case 'registration-required':
+ // members-only room
+ msg = $.t('You_are_not_on_the_member_list');
+ break;
+ case 'forbidden':
+ // banned users
+ msg = $.t('You_are_banned_from_this_room');
+ break;
+ case 'conflict':
+ // nickname conflict
+ msg = $.t('Your_desired_nickname_');
+ break;
+ case 'service-unavailable':
+ // max users
+ msg = $.t('The_maximum_number_');
break;
- case 3:
- jid = arguments[0];
- sid = arguments[1];
- rid = arguments[2];
+ case 'item-not-found':
+ // locked or non-existing room
+ msg = $.t('This_room_is_locked_');
+ break;
+ case 'not-allowed':
+ // room creation is restricted
+ msg = $.t('You_are_not_allowed_to_create_');
break;
default:
- jid = jsxc.storage.getItem('jid');
- sid = jsxc.storage.getItem('sid');
- rid = jsxc.storage.getItem('rid');
+ jsxc.warn('Unknown muc error condition: ' + condition);
+ msg = $.t('Error') + ': ' + condition;
}
- var url = jsxc.options.get('xmpp').url;
+ // clean up strophe.muc rooms
+ var roomIndex = self.conn.muc.roomNames.indexOf(room);
- // Register eventlistener
- $(document).on('connected.jsxc', jsxc.xmpp.connected);
- $(document).on('attached.jsxc', jsxc.xmpp.attached);
- $(document).on('disconnected.jsxc', jsxc.xmpp.disconnected);
- $(document).on('ridChange', jsxc.xmpp.onRidChange);
- $(document).on('connfail.jsxc', jsxc.xmpp.onConnfail);
- $(document).on('authfail.jsxc', jsxc.xmpp.onAuthFail);
+ if (roomIndex > -1) {
+ self.conn.muc.roomNames.splice(roomIndex, 1);
+ delete self.conn.muc.rooms[room];
+ }
- Strophe.addNamespace('RECEIPTS', 'urn:xmpp:receipts');
+ dialog.find('.jsxc_warning').text(msg);
+ };
- // Create new connection (no login)
- jsxc.xmpp.conn = new Strophe.Connection(url);
+ $(document).on('error.muc.jsxc', error_handler);
- // Override default function to preserve unique id
- var stropheGetUniqueId = jsxc.xmpp.conn.getUniqueId;
- jsxc.xmpp.conn.getUniqueId = function(suffix) {
- var uid = stropheGetUniqueId.call(jsxc.xmpp.conn, suffix);
- jsxc.storage.setItem('_uniqueId', jsxc.xmpp.conn._uniqueId);
+ $(document).on('close.dialog.jsxc', function() {
+ $(document).off('error.muc.jsxc', error_handler);
+ });
- return uid;
- };
+ // load room list
+ self.conn.muc.listRooms(jsxc.options.get('muc').server, function(stanza) {
+ // workaround: chrome does not display dropdown arrow for dynamically filled datalists
+ $('#jsxc_roomlist option:last').remove();
- if (jsxc.storage.getItem('debug') === true) {
- jsxc.xmpp.conn.xmlInput = function(data) {
- console.log('<', data);
- };
- jsxc.xmpp.conn.xmlOutput = function(data) {
- console.log('>', data);
- };
+ $(stanza).find('item').each(function() {
+ var r = $('<option>');
+ var rjid = $(this).attr('jid').toLowerCase();
+ var rnode = Strophe.getNodeFromJid(rjid);
+ var rname = $(this).attr('name') || rnode;
+
+ r.text(rname);
+ r.attr('data-jid', rjid);
+ r.attr('value', rnode);
+
+ $('#jsxc_roomlist select').append(r);
+ });
+
+ var set = $(stanza).find('set[xmlns="http://jabber.org/protocol/rsm"]');
+
+ if (set.length > 0) {
+ var count = set.find('count').text() || '?';
+
+ dialog.find('.jsxc_inputinfo').removeClass('jsxc_waiting').text($.t('Could_load_only', {
+ count: count
+ }));
+ } else {
+ dialog.find('.jsxc_inputinfo').hide();
}
+ }, function() {
+ jsxc.warn('Could not load rooms');
- var callback = function(status, condition) {
+ // room autocompletion is a comfort feature, so it is not necessary to inform the user
+ dialog.find('.jsxc_inputinfo').hide();
+ });
- jsxc.debug(Object.getOwnPropertyNames(Strophe.Status)[status] + ': ' + condition);
+ dialog.find('#jsxc_nickname').attr('placeholder', Strophe.getNodeFromJid(self.conn.jid));
- switch (status) {
- case Strophe.Status.CONNECTED:
- jsxc.bid = jsxc.jidToBid(jsxc.xmpp.conn.jid.toLowerCase());
- $(document).trigger('connected.jsxc');
- break;
- case Strophe.Status.ATTACHED:
- $(document).trigger('attached.jsxc');
- break;
- case Strophe.Status.DISCONNECTED:
- $(document).trigger('disconnected.jsxc');
- break;
- case Strophe.Status.CONNFAIL:
- $(document).trigger('connfail.jsxc');
- break;
- case Strophe.Status.AUTHFAIL:
- $(document).trigger('authfail.jsxc');
- break;
- }
- };
+ dialog.find('.jsxc_continue').click(function(ev) {
+ ev.preventDefault();
- if (jsxc.xmpp.conn.caps) {
- jsxc.xmpp.conn.caps.node = 'http://jsxc.org/';
+ var room = ($('#jsxc_room').val()) ? jsxc.jidToBid($('#jsxc_room').val()) : null;
+ var nickname = $('#jsxc_nickname').val() || Strophe.getNodeFromJid(self.conn.jid);
+ var password = $('#jsxc_password').val() || null;
+
+ if (!room || !room.match(/^[^"&\'\/:<>@\s]+$/i)) {
+ $('#jsxc_room').addClass('jsxc_invalid').keyup(function() {
+ if ($(this).val()) {
+ $(this).removeClass('jsxc_invalid');
+ }
+ });
+ return false;
}
- if (jsxc.restore && sid && rid) {
- jsxc.debug('Try to attach');
- jsxc.debug('SID: ' + sid);
- jsxc.xmpp.conn.attach(jid, sid, rid, callback);
- } else {
- jsxc.debug('New connection');
+ if (!room.match(/@(.*)$/)) {
+ room += '@' + jsxc.options.get('muc').server;
+ }
- if (jsxc.xmpp.conn.caps) {
- // Add system handler, because user handler isn't called before
- // we are authenticated
- jsxc.xmpp.conn._addSysHandler(function(stanza) {
- var from = jsxc.xmpp.conn.domain, c = stanza.querySelector('c'), ver = c.getAttribute('ver'), node = c.getAttribute('node');
+ if (jsxc.xmpp.conn.muc.roomNames.indexOf(room) < 0) {
+ // not already joined
- var _jidNodeIndex = JSON.parse(localStorage.getItem('strophe.caps._jidNodeIndex')) || {};
+ var discoReceived = function(roomName, subject) {
+ // we received the room information
- jsxc.xmpp.conn.caps._jidVerIndex[from] = ver;
- _jidNodeIndex[from] = node;
+ jsxc.gui.dialog.resize();
- localStorage.setItem('strophe.caps._jidVerIndex', JSON.stringify(jsxc.xmpp.conn.caps._jidVerIndex));
- localStorage.setItem('strophe.caps._jidNodeIndex', JSON.stringify(_jidNodeIndex));
- }, Strophe.NS.CAPS);
- }
+ dialog.find('.jsxc_continue').hide();
+
+ dialog.find('.jsxc_join').show().effect('highlight', {
+ color: 'green'
+ }, 4000);
+
+ dialog.find('.jsxc_join').click(function(ev) {
+ ev.preventDefault();
+
+ self.join(room, nickname, password, roomName, subject);
+
+ return false;
+ });
+ };
+
+ dialog.find('.jsxc_msg').append($('<p>').text($.t('Loading_room_information')).addClass('jsxc_waiting'));
+ jsxc.gui.dialog.resize();
+
+ self.conn.disco.info(room, null, function(stanza) {
+ dialog.find('.jsxc_msg').html('<p>' + $.t('This_room_is') + '</p>');
+
+ var table = $('<table>');
+
+ $(stanza).find('feature').each(function() {
+ var feature = $(this).attr('var');
+
+ if (feature !== '' && i18n.exists(feature)) {
+ var tr = $('<tr>');
+ $('<td>').text($.t(feature + '.keyword')).appendTo(tr);
+ $('<td>').text($.t(feature + '.description')).appendTo(tr);
+ tr.appendTo(table);
+ }
+ });
+
+ dialog.find('.jsxc_msg').append(table);
- jsxc.xmpp.conn.connect(jid || jsxc.options.xmpp.jid, password || jsxc.options.xmpp.password, callback);
+ var roomName = $(stanza).find('identity').attr('name');
+ var subject = $(stanza).find('field[var="muc#roominfo_subject"]').attr('label');
+
+ //@TODO display subject, number of occupants, etc.
+
+ discoReceived(roomName, subject);
+ }, function() {
+ dialog.find('.jsxc_msg').empty();
+ $('<p>').text($.t('Room_not_found_')).appendTo(dialog.find('.jsxc_msg'));
+
+ discoReceived();
+ });
+ } else {
+ dialog.find('.jsxc_warning').text($.t('You_already_joined_this_room'));
}
- },
- /**
- * Logs user out of his xmpp session and does some clean up.
- *
- * @returns {Boolean}
- */
- logout: function() {
+ return false;
+ });
- // instruct all tabs
- jsxc.storage.removeItem('sid');
+ dialog.find('input').keydown(function(ev) {
- // clean up
- jsxc.storage.removeUserItem('buddylist');
- jsxc.storage.removeUserItem('windowlist');
- jsxc.storage.removeItem('_uniqueId');
+ if (ev.which !== 13) {
+ // reset messages and room information
- if (!jsxc.master) {
- $('#jsxc_roster').remove();
- $('#jsxc_windowlist').remove();
- return true;
+ dialog.find('.jsxc_warning').empty();
+
+ if (dialog.find('.jsxc_continue').is(":hidden")) {
+ dialog.find('.jsxc_continue').show();
+ dialog.find('.jsxc_join').hide().off('click');
+ dialog.find('.jsxc_msg').empty();
+ jsxc.gui.dialog.resize();
+ }
+
+ return;
}
- if (jsxc.xmpp.conn === null) {
- return true;
+ if (!dialog.find('.jsxc_continue').is(":hidden")) {
+ dialog.find('.jsxc_continue').click();
+ } else {
+ dialog.find('.jsxc_join').click();
}
+ });
+ },
- // Hide dropdown menu
- $('body').click();
+ /**
+ * Join the given room.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ * @param {string} nickname Desired nickname
+ * @param {string} [password] Password
+ * @param {string} [roomName] Room alias
+ * @param {string} [subject] Current subject
+ */
+ join: function(room, nickname, password, roomName, subject) {
+ var self = jsxc.muc;
+
+ jsxc.storage.setUserItem('buddy', room, {
+ jid: room,
+ name: roomName || room,
+ sub: 'both',
+ type: 'groupchat',
+ state: self.CONST.ROOMSTATE.INIT,
+ subject: subject
+ });
- jsxc.triggeredFromElement = true;
+ jsxc.xmpp.conn.muc.join(room, nickname, null, null, null, password);
+ },
- // restore all otr objects
- $.each(jsxc.storage.getUserItem('otrlist') || {}, function(i, val) {
- jsxc.otr.create(val);
+ /**
+ * Leave given room.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ */
+ leave: function(room) {
+ var self = jsxc.muc;
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
+ var data = jsxc.storage.getUserItem('buddy', room) || {};
+
+ if (data.state === self.CONST.ROOMSTATE.ENTERED) {
+ self.conn.muc.leave(room, own[room], function() {
+ self.onExited(room);
});
+ } else {
+ self.onExited(room);
+ }
+ },
- var numOtr = Object.keys(jsxc.otr.objects || {}).length + 1;
- var disReady = function() {
- if (--numOtr <= 0) {
- jsxc.xmpp.conn.flush();
+ /**
+ * Clean up after we exited a room.
+ *
+ * @private
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ */
+ onExited: function(room) {
+ var self = jsxc.muc;
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
- setTimeout(function() {
- jsxc.xmpp.conn.disconnect();
- }, 600);
- }
- };
+ jsxc.storage.setUserItem('roomNames', self.conn.muc.roomNames);
- // end all private conversations
- $.each(jsxc.otr.objects || {}, function(key, obj) {
- if (obj.msgstate === OTR.CONST.MSGSTATE_ENCRYPTED) {
- obj.endOtr.call(obj, function() {
- obj.init.call(obj);
- jsxc.otr.backup(key);
+ delete own[room];
+ jsxc.storage.setUserItem('ownNicknames', own);
+ jsxc.storage.removeUserItem('member', room);
+ jsxc.storage.removeUserItem('chat', room);
- disReady();
- });
- } else {
- disReady();
- }
+ jsxc.gui.window.close(room);
+ jsxc.gui.roster.purge(room);
+ },
+
+ /**
+ * Destroy the given room.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ * @param {function} handler_cb Function to handle the successful destruction
+ * @param {function} error_cb Function to handle an error
+ */
+ destroy: function(room, handler_cb, error_cb) {
+ var self = jsxc.muc;
+
+ jsxc.storage.updateUserItem('buddy', room, 'state', self.CONST.ROOMSTATE.AWAIT_DESTRUCTION);
+ jsxc.gui.window.postMessage(room, 'sys', $.t('This_room_will_be_closed'));
+
+ var iq = $iq({
+ to: room,
+ type: "set"
+ }).c("query", {
+ xmlns: Strophe.NS.MUC_OWNER
+ }).c("destroy");
+
+ jsxc.muc.conn.sendIQ(iq.tree(), handler_cb, error_cb);
+ },
+
+ /**
+ * Close the given room.
+ *
+ * @memberOf jsxc.muc
+ * @param room Room jid
+ */
+ close: function(room) {
+ var self = jsxc.muc;
+ var roomdata = jsxc.storage.getUserItem('buddy', room) || {};
+
+ self.emptyMembers(room);
+
+ var roomIndex = self.conn.muc.roomNames.indexOf(room);
+
+ if (roomIndex > -1) {
+ self.conn.muc.roomNames.splice(roomIndex, 1);
+ delete self.conn.muc.rooms[room];
+ }
+
+ jsxc.storage.setUserItem('roomNames', self.conn.muc.roomNames);
+
+ if (roomdata.state === self.CONST.ROOMSTATE.AWAIT_DESTRUCTION) {
+ self.onExited(room);
+ }
+
+ roomdata.state = self.CONST.ROOMSTATE.DESTROYED;
+
+ jsxc.storage.setUserItem('buddy', room, roomdata);
+ },
+
+ /**
+ * Init group chat window.
+ *
+ * @private
+ * @memberOf jsxc.muc
+ * @param event Event
+ * @param {jQuery} win Window object
+ */
+ initWindow: function(event, win) {
+ var self = jsxc.muc;
+ var data = win.data();
+ var bid = jsxc.jidToBid(data.jid);
+ var roomdata = jsxc.storage.getUserItem('buddy', bid);
+
+ if (!jsxc.xmpp.conn) {
+ $(document).one('connectionReady.jsxc', function() {
+ self.initWindow(null, win);
});
+ return;
+ }
+
+ if (self.conn.muc.roomNames.indexOf(data.jid) < 0) {
+ return;
+ }
+
+ win.addClass('jsxc_groupchat');
+
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
+ var ownNickname = own[bid];
+ var mlIcon = $('<div class="jsxc_members"></div>');
+
+ win.find('.jsxc_tools > .jsxc_transfer').after(mlIcon);
+
+ var ml = $('<div class="jsxc_memberlist"><ul></ul></div>');
+ win.find('.jsxc_fade').prepend(ml);
+
+ ml.on('wheel', function(ev) {
+ jsxc.muc.scrollMemberListBy(bid, (ev.originalEvent.wheelDelta > 0) ? 50 : -50);
+ });
+
+ // toggle member list
+ var toggleMl = function(ev) {
+ if (ev) {
+ ev.preventDefault();
+ }
+
+ var slimOptions = {};
+ var ul = ml.find('ul:first');
+ var slimHeight = null;
- disReady();
+ ml.toggleClass('jsxc_expand');
+
+ if (ml.hasClass('jsxc_expand')) {
+ $('body').click();
+ $('body').one('click', toggleMl);
+
+ ul.mouseleave(function() {
+ ul.data('timer', window.setTimeout(toggleMl, 2000));
+ }).mouseenter(function() {
+ window.clearTimeout(ul.data('timer'));
+ }).css('left', '0px');
+
+ var maxHeight = win.find(".jsxc_textarea").height() * 0.8;
+ var innerHeight = ml.find('ul').height() + 3;
+ slimHeight = (innerHeight > maxHeight) ? maxHeight : innerHeight;
+
+ slimOptions = {
+ distance: '3px',
+ height: slimHeight + 'px',
+ width: '100%',
+ color: '#fff',
+ opacity: '0.5'
+ };
+
+ ml.css('height', slimHeight + 'px');
+ } else {
+ slimOptions = {
+ destroy: true
+ };
+
+ ul.attr('style', '');
+ ml.css('height', '');
+
+ window.clearTimeout(ul.data('timer'));
+ $('body').off('click', null, toggleMl);
+ ul.off('mouseleave mouseenter');
+ }
+
+ ul.slimscroll(slimOptions);
- // Trigger real logout in jsxc.xmpp.disconnected()
return false;
- },
+ };
- /**
- * Triggered if connection is established
- *
- * @private
- */
- connected: function() {
+ mlIcon.click(toggleMl);
- jsxc.xmpp.conn.pause();
+ win.on('resize', function() {
+ // update member list position
+ jsxc.muc.scrollMemberListBy(bid, 0);
+ });
- var nomJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid).toLowerCase() + '/' + Strophe.getResourceFromJid(jsxc.xmpp.conn.jid);
+ // update emoticon button
+ setTimeout(function() {
+ var top = win.find('.jsxc_emoticons').position().top + win.find('.slimScrollDiv').position().top;
+ win.find('.jsxc_emoticons').css('top', top + 'px');
+ }, 400);
+
+ var destroy = $('<li>');
+ destroy.text($.t('Destroy'));
+ destroy.addClass('jsxc_destroy');
+ destroy.hide();
+ destroy.click(function() {
+ self.destroy(bid);
+ });
- // Save sid and jid
- jsxc.storage.setItem('sid', jsxc.xmpp.conn._proto.sid);
- jsxc.storage.setItem('jid', nomJid);
+ win.find('.jsxc_settings ul').append(destroy);
- jsxc.storage.setItem('lastActivity', (new Date()).getTime());
+ if (roomdata.state > self.CONST.ROOMSTATE.INIT) {
+ var member = jsxc.storage.getUserItem('member', bid) || {};
- // make shure roster will be reloaded
- jsxc.storage.removeUserItem('buddylist');
-
- jsxc.storage.removeUserItem('windowlist');
- jsxc.storage.removeUserItem('own');
- jsxc.storage.removeUserItem('avatar', 'own');
- jsxc.storage.removeUserItem('otrlist');
-
- if (jsxc.options.loginForm.triggered) {
- switch (jsxc.options.loginForm.onConnected || 'submit') {
- case 'submit':
- jsxc.submitLoginForm();
- /* falls through */
- case false:
- jsxc.xmpp.connectionReady();
- return;
+ $.each(member, function(nickname, val) {
+ self.insertMember(bid, nickname, val);
+
+ if (nickname === ownNickname && val.affiliation === self.CONST.AFFILIATION.OWNER) {
+ destroy.show();
}
- }
+ });
+ }
- // start chat
+ var leave = $('<li>');
+ leave.text($.t('Leave'));
+ leave.addClass('jsxc_leave');
+ leave.click(function() {
+ self.leave(bid);
+ });
- jsxc.gui.init();
- $('#jsxc_roster').removeClass('jsxc_noConnection');
- jsxc.onMaster();
- jsxc.xmpp.conn.resume();
+ win.find('.jsxc_settings ul').append(leave);
+ },
+
+ /**
+ * Triggered on incoming presence stanzas.
+ *
+ * @private
+ * @memberOf jsxc.muc
+ * @param event
+ * @param {string} from Jid
+ * @param {integer} status Online status between 0 and 5
+ * @param {string} presence Presence stanza
+ */
+ onPresence: function(event, from, status, presence) {
+ var self = jsxc.muc;
+ var room = jsxc.jidToBid(from);
+ var xdata = $(presence).find('x[xmlns^="' + Strophe.NS.MUC + '"]');
+
+ if (self.conn.muc.roomNames.indexOf(room) < 0 || xdata.length === 0) {
+ return true;
+ }
+
+ var res = Strophe.getResourceFromJid(from) || '';
+ var nickname = Strophe.unescapeNode(res);
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
+ var member = jsxc.storage.getUserItem('member', room) || {};
+ var codes = [];
+
+ xdata.find('status').each(function() {
+ var code = $(this).attr('code');
+
+ jsxc.debug('[muc][code]', code);
+
+ codes.push(code);
+ });
+
+ if (jsxc.gui.roster.getItem(room).length === 0) {
+ // successfully joined
+
+ jsxc.storage.setUserItem('roomNames', jsxc.xmpp.conn.muc.roomNames);
+
+ // clean up
+ jsxc.storage.removeUserItem('chat', room);
+ member = {};
+
+ var bl = jsxc.storage.getUserItem('buddylist');
+ bl.push(room);
+ jsxc.storage.setUserItem('buddylist', bl);
+
+ jsxc.gui.roster.add(room);
+
+ jsxc.gui.window.open(room);
jsxc.gui.dialog.close();
- $(document).trigger('attached.jsxc');
- },
+ }
- /**
- * Triggered if connection is attached
- *
- * @private
- */
- attached: function() {
+ var jid = xdata.find('item').attr('jid') || null;
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged, 'jabber:iq:roster', 'iq', 'set');
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onMessage, null, 'message', 'chat');
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived, null, 'message');
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence, null, 'presence');
+ if (status === 0) {
+ if (xdata.find('destroy').length > 0) {
+ // room has been destroyed
+ member = {};
- var caps = jsxc.xmpp.conn.caps;
- var domain = jsxc.xmpp.conn.domain;
+ jsxc.gui.window.postMessage(room, 'sys', $.t('This_room_has_been_closed'));
- if (caps && jsxc.options.get('carbons').enable) {
- var conditionalEnable = function() {
- if (jsxc.xmpp.conn.caps.hasFeatureByJid(domain, jsxc.CONST.NS.CARBONS)) {
- jsxc.xmpp.carbons.enable();
- }
- };
+ self.close(room);
+ } else {
+ delete member[nickname];
- if (typeof caps._knownCapabilities[caps._jidVerIndex[domain]] === 'undefined') {
- var _jidNodeIndex = JSON.parse(localStorage.getItem('strophe.caps._jidNodeIndex')) || {};
+ self.removeMember(room, nickname);
- $(document).on('caps.strophe', function onCaps(ev, from) {
+ var newNickname = xdata.find('item').attr('nick');
- if (from !== domain) {
- return;
- }
+ if (codes.indexOf('303') > -1 && newNickname) {
+ // user changed his nickname
- conditionalEnable();
+ newNickname = Strophe.unescapeNode(newNickname);
- $(document).off('caps.strophe', onCaps);
- });
+ // prevent to display enter message
+ member[newNickname] = {};
- caps._requestCapabilities(jsxc.xmpp.conn.domain, _jidNodeIndex[domain], caps._jidVerIndex[domain]);
- } else {
- // We know server caps
- conditionalEnable();
+ jsxc.gui.window.postMessage(room, 'sys', $.t('is_now_known_as', {
+ oldNickname: nickname,
+ newNickname: newNickname,
+ escapeInterpolation: true
+ }));
+ } else if (codes.length === 0 || (codes.length === 1 && codes.indexOf('110') > -1)) {
+ // normal user exit
+ jsxc.gui.window.postMessage(room, 'sys', $.t('left_the_building', {
+ nickname: nickname,
+ escapeInterpolation: true
+ }));
}
}
+ } else {
+ // new member joined
- // Only load roaster if necessary
- if (!jsxc.restore || !jsxc.storage.getUserItem('buddylist')) {
- // in order to not overide existing presence information, we send
- // pres first after roster is ready
- $(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres);
+ if (!member[nickname] && own[room]) {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('entered_the_room', {
+ nickname: nickname,
+ escapeInterpolation: true
+ }));
+ }
- $('#jsxc_roster > p:first').remove();
+ member[nickname] = {
+ jid: jid,
+ status: status,
+ roomJid: from,
+ affiliation: xdata.find('item').attr('affiliation'),
+ role: xdata.find('item').attr('role')
+ };
- var iq = $iq({
- type: 'get'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- });
+ self.insertMember(room, nickname, member[nickname]);
+ }
- jsxc.xmpp.conn.sendIQ(iq, jsxc.xmpp.onRoster);
- } else {
- jsxc.xmpp.sendPres();
+ jsxc.storage.setUserItem('member', room, member);
+
+ $.each(codes, function(index, code) {
+ // call code functions and trigger event
+
+ if (typeof self.onStatus[code] === 'function') {
+ self.onStatus[code].call(this, room, nickname, member[nickname] || {}, xdata);
}
- jsxc.xmpp.connectionReady();
- },
+ $(document).trigger('status.muc.jsxc', [code, room, nickname, member[nickname] || {}, presence]);
+ });
- /**
- * Triggered if the connection is ready
- */
- connectionReady: function() {
+ return true;
+ },
- // Load saved unique id
- jsxc.xmpp.conn._uniqueId = jsxc.storage.getItem('_uniqueId') || new Date().getTime();
+ /**
+ * Handle group chat presence errors.
+ *
+ * @memberOf jsxc.muc
+ * @param event
+ * @param {string} from Jid
+ * @param {string} presence Presence stanza
+ * @returns {Boolean} Returns true on success
+ */
+ onPresenceError: function(event, from, presence) {
+ var self = jsxc.muc;
+ var xdata = $(presence).find('x[xmlns="' + Strophe.NS.MUC + '"]');
+ var room = jsxc.jidToBid(from);
- $(document).trigger('connectionReady.jsxc');
- },
+ if (xdata.length === 0 || self.conn.muc.roomNames.indexOf(room) < 0) {
+ return true;
+ }
- /**
- * Sends presence stanza to server.
- */
- sendPres: function() {
- // disco stuff
- if (jsxc.xmpp.conn.disco) {
- jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC');
- jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO);
- jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS);
- }
+ var error = $(presence).find('error');
+ var condition = error.children()[0].tagName;
- // create presence stanza
- var pres = $pres();
+ jsxc.debug('[muc][error]', condition);
- if (jsxc.xmpp.conn.caps) {
- // attach caps
- pres.c('c', jsxc.xmpp.conn.caps.generateCapsAttrs()).up();
- }
+ $(document).trigger('error.muc.jsxc', [condition, room]);
- var presState = jsxc.storage.getUserItem('presence') || 'online';
- if (presState !== 'online') {
- pres.c('show').t(presState).up();
- }
+ return true;
+ },
- var priority = jsxc.options.get('priority');
- if (priority && typeof priority[presState] !== 'undefined' && parseInt(priority[presState]) !== 0) {
- pres.c('priority').t(priority[presState]).up();
- }
+ /**
+ * Handle status codes. Every function gets room jid, nickname, member data and xdata.
+ *
+ * @memberOf jsxc.muc
+ */
+ onStatus: {
+ /** Inform user that presence refers to itself */
+ 110: function(room, nickname, data) {
+ var self = jsxc.muc;
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
- jsxc.debug('Send presence', pres.toString());
- jsxc.xmpp.conn.send(pres);
- },
+ own[room] = nickname;
+ jsxc.storage.setUserItem('ownNicknames', own);
- /**
- * Triggered if lost connection
- *
- * @private
- */
- disconnected: function() {
- jsxc.debug('disconnected');
+ if (data.affiliation === self.CONST.AFFILIATION.OWNER) {
+ jsxc.gui.window.get(room).find('.jsxc_destroy').show();
+ }
- jsxc.storage.removeItem('sid');
- jsxc.storage.removeItem('rid');
- jsxc.storage.removeItem('lastActivity');
- jsxc.storage.removeItem('hidden');
- jsxc.storage.removeUserItem('avatar', 'own');
- jsxc.storage.removeUserItem('otrlist');
+ var roomdata = jsxc.storage.getUserItem('buddy', room);
- $(document).off('connected.jsxc', jsxc.xmpp.connected);
- $(document).off('attached.jsxc', jsxc.xmpp.attached);
- $(document).off('disconnected.jsxc', jsxc.xmpp.disconnected);
- $(document).off('ridChange', jsxc.xmpp.onRidChange);
- $(document).off('connfail.jsxc', jsxc.xmpp.onConnfail);
- $(document).off('authfail.jsxc', jsxc.xmpp.onAuthFail);
+ if (roomdata.state === self.CONST.ROOMSTATE.INIT) {
+ roomdata.state = self.CONST.ROOMSTATE.ENTERED;
- jsxc.xmpp.conn = null;
+ jsxc.storage.setUserItem('buddy', room, roomdata);
+ }
+ },
+ /** Inform occupants that room logging is now enabled */
+ 170: function(room) {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('Room_logging_is_enabled'));
+ },
+ /** Inform user that a new room has been created */
+ 201: function(room) {
+ var self = jsxc.muc;
+ //@TODO let user choose between instant and reserved room
- $('#jsxc_windowList').remove();
+ self.conn.muc.createInstantRoom(room);
+ },
+ /** Inform user that he or she has been banned */
+ 301: function(room, nickname, data, xdata) {
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
- if (jsxc.triggeredFromElement) {
- $('#jsxc_roster').remove();
+ if (own[room] === nickname) {
+ jsxc.muc.close(room);
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_banned'));
- if (jsxc.triggeredFromLogout) {
- window.location = jsxc.options.logoutElement.attr('href');
- }
+ jsxc.muc.postReason(room, xdata);
} else {
- jsxc.gui.roster.noConnection();
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_info_banned', {
+ nickname: nickname,
+ escapeInterpolation: true
+ }));
}
-
- window.clearInterval(jsxc.keepalive);
},
+ /** Inform user that he or she has been kicked */
+ 307: function(room, nickname, data, xdata) {
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
- /**
- * Triggered on connection fault
- *
- * @param {String} condition information why we lost the connection
- * @private
- */
- onConnfail: function(ev, condition) {
- jsxc.debug('XMPP connection failed: ' + condition);
+ if (own[room] === nickname) {
+ jsxc.muc.close(room);
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_kicked'));
- if (jsxc.options.loginForm.triggered) {
- jsxc.submitLoginForm();
+ jsxc.muc.postReason(room, xdata);
+ } else {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_info_kicked', {
+ nickname: nickname,
+ escapeInterpolation: true
+ }));
}
},
+ /** Inform user that he or she is beeing removed from the room because of an affiliation change */
+ 321: function(room, nickname) {
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
- /**
- * Triggered on auth fail.
- *
- * @private
- */
- onAuthFail: function() {
- if (jsxc.options.loginForm.triggered) {
- switch (jsxc.options.loginForm.onAuthFail || 'ask') {
- case 'ask':
- jsxc.gui.showAuthFail();
- break;
- case 'submit':
- jsxc.submitLoginForm();
- break;
- }
+ if (own[room] === nickname) {
+ jsxc.muc.close(room);
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_affiliation'));
+ } else {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_info_affiliation', {
+ nickname: nickname,
+ escapeInterpolation: true
+ }));
}
},
+ /**
+ * Inform user that he or she is beeing removed from the room because the room has been
+ * changed to members-only and the user is not a member
+ */
+ 322: function(room, nickname) {
+ var own = jsxc.storage.getUserItem('ownNicknames') || {};
+ if (own[room] === nickname) {
+ jsxc.muc.close(room);
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_membersonly'));
+ } else {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_info_membersonly', {
+ nickname: nickname,
+ escapeInterpolation: true
+ }));
+ }
+ },
/**
- * Triggered on initial roster load
- *
- * @param {dom} iq
- * @private
+ * Inform user that he or she is beeing removed from the room because the MUC service
+ * is being shut down
*/
- onRoster: function(iq) {
- /*
- * <iq from='' type='get' id=''> <query xmlns='jabber:iq:roster'> <item
- * jid='' name='' subscription='' /> ... </query> </iq>
- */
+ 332: function(room) {
+ jsxc.muc.close(room);
+ jsxc.gui.window.postMessage(room, 'sys', $.t('muc_removed_shutdown'));
+ }
+ },
- jsxc.debug('Load roster', iq);
+ /**
+ * Extract reason from xdata and if available post it to room.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ * @param {jQuery} xdata Xdata
+ */
+ postReason: function(room, xdata) {
+ var actor = {
+ name: xdata.find('actor').attr('nick'),
+ jid: xdata.find('actor').attr('jid')
+ };
+ var reason = xdata.find('reason').text();
+
+ if (reason !== '') {
+ reason = $.t('Reason') + ': ' + reason;
+
+ if (typeof actor.name === 'string' || typeof actor.jid === 'string') {
+ jsxc.gui.window.postMessage(room, 'in', reason, false, false, null, actor);
+ } else {
+ jsxc.gui.window.postMessage(room, 'sys', reason);
+ }
+ }
+ },
- var buddies = [];
+ /**
+ * Insert member to room member list.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ * @param {string} nickname Nickname
+ * @param {string} memberdata Member data
+ */
+ insertMember: function(room, nickname, memberdata) {
+ var self = jsxc.muc;
+ var win = jsxc.gui.window.get(room);
+ var jid = memberdata.jid;
+ var m = win.find('.jsxc_memberlist li[data-nickname="' + nickname + '"]');
- $(iq).find('item').each(function() {
- var jid = $(this).attr('jid');
- var name = $(this).attr('name') || jid;
- var bid = jsxc.jidToBid(jid);
- var sub = $(this).attr('subscription');
+ if (m.length === 0) {
+ var title = jsxc.escapeHTML(nickname);
- buddies.push(bid);
+ m = $('<li><div class="jsxc_avatar"></div><div class="jsxc_name"/></li>');
+ m.attr('data-nickname', nickname);
- jsxc.storage.removeUserItem('res', bid);
+ win.find('.jsxc_memberlist ul').append(m);
- jsxc.storage.saveBuddy(bid, {
- jid: jid,
- name: name,
- status: 0,
- sub: sub,
- res: []
- });
+ if (typeof jid === 'string') {
+ m.find('.jsxc_name').text(jsxc.jidToBid(jid));
+ m.attr('data-bid', jsxc.jidToBid(jid));
+ title = title + '\n' + jsxc.jidToBid(jid);
- jsxc.gui.roster.add(bid);
- });
+ var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid));
+
+ if (data !== null && typeof data === 'object') {
+ jsxc.gui.updateAvatar(m, jsxc.jidToBid(jid), data.avatar);
+ } else if (jsxc.jidToBid(jid) === jsxc.jidToBid(self.conn.jid)) {
+ jsxc.gui.updateAvatar(m, jsxc.jidToBid(jid), 'own');
+ }
+ } else {
+ m.find('.jsxc_name').text(nickname);
- if (buddies.length === 0) {
- jsxc.gui.roster.empty();
+ jsxc.gui.avatarPlaceholder(m.find('.jsxc_avatar'), nickname);
}
- jsxc.storage.setUserItem('buddylist', buddies);
+ m.attr('title', title);
+ }
+ },
- jsxc.debug('Roster loaded');
- $(document).trigger('cloaded.roster.jsxc');
- },
+ /**
+ * Remove member from room member list.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ * @param {string} nickname Nickname
+ */
+ removeMember: function(room, nickname) {
+ var win = jsxc.gui.window.get(room);
+ var m = win.find('.jsxc_memberlist li[data-nickname="' + nickname + '"]');
- /**
- * Triggerd on roster changes
- *
- * @param {dom} iq
- * @returns {Boolean} True to preserve handler
- * @private
- */
- onRosterChanged: function(iq) {
- /*
- * <iq from='' type='set' id=''> <query xmlns='jabber:iq:roster'> <item
- * jid='' name='' subscription='' /> </query> </iq>
- */
-
- jsxc.debug('onRosterChanged', iq);
-
- $(iq).find('item').each(function() {
- var jid = $(this).attr('jid');
- var name = $(this).attr('name') || jid;
- var bid = jsxc.jidToBid(jid);
- var sub = $(this).attr('subscription');
- // var ask = $(this).attr('ask');
-
- if (sub === 'remove') {
- jsxc.gui.roster.purge(bid);
- } else {
- var bl = jsxc.storage.getUserItem('buddylist');
+ if (m.length > 0) {
+ m.remove();
+ }
+ },
- if (bl.indexOf(bid) < 0) {
- bl.push(bid); // (INFO) push returns the new length
- jsxc.storage.setUserItem('buddylist', bl);
- }
+ /**
+ * Scroll or update member list position.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ * @param {integer} offset =0: update position; >0: Scroll to left; <0: Scroll to right
+ */
+ scrollMemberListBy: function(room, offset) {
+ var win = jsxc.gui.window.get(room);
- var temp = jsxc.storage.saveBuddy(bid, {
- jid: jid,
- name: name,
- sub: sub
- });
+ if (win.find('.jsxc_memberlist').hasClass('jsxc_expand')) {
+ return;
+ }
- if (temp === 'updated') {
+ var el = win.find('.jsxc_memberlist ul:first');
+ var scrollWidth = el.width();
+ var width = win.find('.jsxc_memberlist').width();
+ var left = parseInt(el.css('left'));
- jsxc.gui.update(bid);
- jsxc.gui.roster.reorder(bid);
- } else {
- jsxc.gui.roster.add(bid);
- }
- }
+ left = (isNaN(left)) ? 0 - offset : left - offset;
- // Remove pending friendship request from notice list
- if (sub === 'from' || sub === 'both') {
- var notices = jsxc.storage.getUserItem('notices');
- var noticeKey = null, notice;
+ if (scrollWidth < width || left > 0) {
+ left = 0;
+ } else if (left < width - scrollWidth) {
+ left = width - scrollWidth;
+ }
- for (noticeKey in notices) {
- notice = notices[noticeKey];
+ el.css('left', left + 'px');
+ },
- if (notice.fnName === 'gui.showApproveDialog' && notice.fnParams[0] === jid) {
- jsxc.debug('Remove notice with key ' + noticeKey);
+ /**
+ * Empty member list.
+ *
+ * @memberOf jsxc.muc
+ * @param {string} room Room jid
+ */
+ emptyMembers: function(room) {
+ var win = jsxc.gui.window.get(room);
- jsxc.notice.remove(noticeKey);
- }
- }
- }
- });
+ win.find('.jsxc_memberlist').empty();
- if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) {
- jsxc.gui.roster.empty();
- } else {
- $('#jsxc_roster > p:first').remove();
- }
+ jsxc.storage.setUserItem('member', room, {});
+ },
- // preserve handler
+ /**
+ * Handle incoming group chat message.
+ *
+ * @private
+ * @memberOf jsxc.muc
+ * @param {string} message Message stanza
+ * @returns {boolean} True on success
+ */
+ onGroupchatMessage: function(message) {
+ var id = $(message).attr('id');
+
+ if (jsxc.el_exists($('#' + id))) {
+ // ignore own incoming messages
return true;
- },
+ }
- /**
- * Triggered on incoming presence stanzas
- *
- * @param {dom} presence
- * @private
- */
- onPresence: function(presence) {
- /*
- * <presence xmlns='jabber:client' type='unavailable' from='' to=''/>
- *
- * <presence xmlns='jabber:client' from='' to=''> <priority>5</priority>
- * <c xmlns='http://jabber.org/protocol/caps'
- * node='http://psi-im.org/caps' ver='caps-b75d8d2b25' ext='ca cs
- * ep-notify-2 html'/> </presence>
- *
- * <presence xmlns='jabber:client' from='' to=''> <show>chat</show>
- * <status></status> <priority>5</priority> <c
- * xmlns='http://jabber.org/protocol/caps'
- * node='http://psi-im.org/caps' ver='caps-b75d8d2b25' ext='ca cs
- * ep-notify-2 html'/> </presence>
- */
- jsxc.debug('onPresence', presence);
-
- var ptype = $(presence).attr('type');
- var from = $(presence).attr('from');
- var jid = Strophe.getBareJidFromJid(from).toLowerCase();
- var r = Strophe.getResourceFromJid(from);
- var bid = jsxc.jidToBid(jid);
- var data = jsxc.storage.getUserItem('buddy', bid);
- var res = jsxc.storage.getUserItem('res', bid) || {};
- var status = null;
- var xVCard = $(presence).find('x[xmlns="vcard-temp:x:update"]');
+ var from = $(message).attr('from');
+ var body = $(message).find('body:first').text();
+ var room = jsxc.jidToBid(from);
+ var nickname = Strophe.unescapeNode(Strophe.getResourceFromJid(from));
- if (jid === Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))) {
- return true;
- }
+ if (body !== '') {
+ var delay = $(message).find('delay[xmlns="urn:xmpp:delay"]');
+ var stamp = (delay.length > 0) ? new Date(delay.attr('stamp')) : new Date();
+ stamp = stamp.getTime();
- if (ptype === 'error') {
- jsxc.error('[XMPP] ' + $(presence).attr('code'));
- return true;
- }
+ var member = jsxc.storage.getUserItem('member', room) || {};
- // incoming friendship request
- if (ptype === 'subscribe') {
- jsxc.storage.setUserItem('friendReq', {
- jid: jid,
- approve: -1
- });
- jsxc.notice.add('%%Friendship request%%', '%%from%% ' + jid, 'gui.showApproveDialog', [ jid ]);
+ var sender = {};
+ sender.name = nickname;
- return true;
- } else if (ptype === 'unavailable' || ptype === 'unsubscribed') {
- status = jsxc.CONST.STATUS.indexOf('offline');
- } else {
- var show = $(presence).find('show').text();
- if (show === '') {
- status = jsxc.CONST.STATUS.indexOf('online');
- } else {
- status = jsxc.CONST.STATUS.indexOf(show);
- }
+ if (member[nickname] && typeof member[nickname].jid === 'string') {
+ sender.jid = member[nickname].jid;
}
- if (status === 0) {
- delete res[r];
- } else {
- res[r] = status;
- }
+ jsxc.gui.window.postMessage(room, 'in', body, false, false, stamp, sender);
+ }
- var maxVal = [];
- var max = 0, prop = null;
- for (prop in res) {
- if (res.hasOwnProperty(prop)) {
- if (max <= res[prop]) {
- if (max !== res[prop]) {
- maxVal = [];
- max = res[prop];
- }
- maxVal.push(prop);
- }
- }
- }
+ var subject = $(message).find('subject');
- if (data.status === 0 && max > 0) {
- // buddy has come online
- jsxc.notification.notify(data.name, jsxc.translate('%%has come online%%.'));
- }
+ if (subject.length > 0) {
+ var roomdata = jsxc.storage.getUserItem('buddy', room);
- data.status = max;
- data.res = maxVal;
- data.jid = jid;
+ roomdata.subject = subject.text();
- // Looking for avatar
- if (xVCard.length > 0) {
- var photo = xVCard.find('photo');
+ jsxc.storage.setUserItem('buddy', room, roomdata);
- if (photo.length > 0 && photo.text() !== data.avatar) {
- jsxc.storage.removeUserItem('avatar', data.avatar);
- data.avatar = photo.text();
- }
- }
+ jsxc.gui.window.postMessage(room, 'sys', $.t('changed_subject_to', {
+ nickname: nickname,
+ subject: subject.text()
+ }));
+ }
- // Reset jid
- if (jsxc.gui.window.get(bid).length > 0) {
- jsxc.gui.window.get(bid).data('jid', jid);
- }
+ return true;
+ },
- jsxc.storage.setUserItem('buddy', bid, data);
- jsxc.storage.setUserItem('res', bid, res);
+ /**
+ * Handle group chat error message.
+ *
+ * @private
+ * @memberOf jsxc.muc
+ * @param {string} message Message stanza
+ */
+ onErrorMessage: function(message) {
+ var room = jsxc.jidToBid($(message).attr('from'));
- jsxc.debug('Presence (' + from + '): ' + status);
+ if (jsxc.gui.window.get(room).length === 0) {
+ return true;
+ }
- jsxc.gui.update(bid);
- jsxc.gui.roster.reorder(bid);
+ if ($(message).find('item-not-found').length > 0) {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('message_not_send_item-not-found'));
+ } else if ($(message).find('forbidden').length > 0) {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('message_not_send_forbidden'));
+ } else if ($(message).find('not-acceptable').length > 0) {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('message_not_send_not-acceptable'));
+ } else {
+ jsxc.gui.window.postMessage(room, 'sys', $.t('message_not_send'));
+ }
- $(document).trigger('presence.jsxc', [ from, status, presence ]);
+ jsxc.debug('[muc] error message for ' + room, $(message).find('error')[0]);
- // preserve handler
- return true;
- },
+ return true;
+ },
- /**
- * Triggered on incoming message stanzas
- *
- * @param {dom} presence
- * @returns {Boolean}
- * @private
- */
- onMessage: function(stanza) {
+ /**
+ * Prepare group chat roster item.
+ *
+ * @private
+ * @memberOf jsxc.muc
+ * @param event
+ * @param {string} room Room jid
+ * @param {object} data Room data
+ * @param {jQuery} bud Roster item
+ */
+ onAddRoster: function(event, room, data, bud) {
+ var self = jsxc.muc;
- var forwarded = $(stanza).find('forwarded[xmlns="' + jsxc.CONST.NS.FORWARD + '"]');
- var message, carbon;
+ if (data.type !== 'groupchat') {
+ return;
+ }
- if (forwarded.length > 0) {
- message = forwarded.find('> message');
- forwarded = true;
- carbon = $(stanza).find('> [xmlns="' + jsxc.CONST.NS.CARBONS + '"]');
+ bud.find('.jsxc_delete').off('click').click(function() {
+ self.leave(room);
+ return false;
+ });
+ }
+};
- if (carbon.length === 0) {
- carbon = false;
- }
+$(document).on('init.window.jsxc', jsxc.muc.initWindow);
+$(document).on('add.roster.jsxc', jsxc.muc.onAddRoster);
- jsxc.debug('Incoming forwarded message', message);
- } else {
- message = stanza;
- forwarded = false;
- carbon = false;
+$(document).one('attached.jsxc', function() {
+ jsxc.muc.init();
+});
- jsxc.debug('Incoming message', message);
- }
+$(document).one('connected.jsxc', function() {
+ jsxc.storage.removeUserItem('roomNames');
+ jsxc.storage.removeUserItem('ownNicknames');
+});
- var body = $(message).find('body:first').text();
+/**
+ * This namespace handle the notice system.
+ *
+ * @namspace jsxc.notice
+ * @memberOf jsxc
+ */
+jsxc.notice = {
+ /** Number of notices. */
+ _num: 0,
- if (!body || (body.match(/\?OTR/i) && forwarded)) {
- return true;
+ /**
+ * Loads the saved notices.
+ *
+ * @memberOf jsxc.notice
+ */
+ load: function() {
+ // reset list
+ $('#jsxc_notice ul li').remove();
+ $('#jsxc_notice > span').text('');
+ jsxc.notice._num = 0;
+
+ var saved = jsxc.storage.getUserItem('notices') || [];
+ var key = null;
+
+ for (key in saved) {
+ if (saved.hasOwnProperty(key)) {
+ var val = saved[key];
+
+ jsxc.notice.add(val.msg, val.description, val.fnName, val.fnParams, key);
}
+ }
+ },
- var type = $(message).attr('type');
- var from = $(message).attr('from');
- var mid = $(message).attr('id');
- var bid;
+ /**
+ * Add a new notice to the stack;
+ *
+ * @memberOf jsxc.notice
+ * @param msg Header message
+ * @param description Notice description
+ * @param fnName Function name to be called if you open the notice
+ * @param fnParams Array of params for function
+ * @param id Notice id
+ */
+ add: function(msg, description, fnName, fnParams, id) {
+ var nid = id || Date.now();
+ var list = $('#jsxc_notice ul');
+ var notice = $('<li/>');
- var delay = $(message).find('delay[xmlns="urn:xmpp:delay"]');
+ notice.click(function() {
+ jsxc.notice.remove(nid);
- var stamp = (delay.length > 0) ? new Date(delay.attr('stamp')) : new Date();
- stamp = stamp.getTime();
+ jsxc.exec(fnName, fnParams);
+
+ return false;
+ });
- if (carbon) {
- var direction = (carbon.prop("tagName") === 'sent') ? 'out' : 'in';
- bid = jsxc.jidToBid((direction === 'out') ? $(message).attr('to') : from);
+ notice.text(msg);
+ notice.attr('title', description || '');
+ notice.attr('data-nid', nid);
+ list.append(notice);
- jsxc.gui.window.postMessage(bid, direction, body, false, forwarded, stamp);
+ $('#jsxc_notice > span').text(++jsxc.notice._num);
- return true;
+ if (!id) {
+ var saved = jsxc.storage.getUserItem('notices') || {};
+ saved[nid] = {
+ msg: msg,
+ description: description,
+ fnName: fnName,
+ fnParams: fnParams
+ };
+ jsxc.storage.setUserItem('notices', saved);
+
+ jsxc.notification.notify(msg, description || '', null, true, jsxc.CONST.SOUNDS.NOTICE);
+ }
+ },
+
+ /**
+ * Removes notice from stack
+ *
+ * @memberOf jsxc.notice
+ * @param nid The notice id
+ */
+ remove: function(nid) {
+ var el = $('#jsxc_notice li[data-nid=' + nid + ']');
+
+ el.remove();
+ $('#jsxc_notice > span').text(--jsxc.notice._num || '');
- } else if (forwarded) {
- // Someone forwarded a message to us
+ var s = jsxc.storage.getUserItem('notices');
+ delete s[nid];
+ jsxc.storage.setUserItem('notices', s);
+ },
- body = from + jsxc.translate(' %%to%% ') + $(stanza).attr('to') + '"' + body + '"';
+ /**
+ * Check if there is already a notice for the given function name.
+ *
+ * @memberOf jsxc.notice
+ * @param {string} fnName Function name
+ * @returns {boolean} True if there is >0 functions with the given name
+ */
+ has: function(fnName) {
+ var saved = jsxc.storage.getUserItem('notices') || [];
+ var has = false;
- from = $(stanza).attr('from');
+ $.each(saved, function(index, val){
+ if (val.fnName === fnName) {
+ has = true;
+
+ return false;
}
+ });
- var jid = Strophe.getBareJidFromJid(from);
- bid = jsxc.jidToBid(jid);
+ return has;
+ }
+};
+
+/**
+ * This namespace handles the Notification API.
+ *
+ * @namespace jsxc.notification
+ */
+jsxc.notification = {
+
+ /** Current audio file. */
+ audio: null,
+
+ /**
+ * Register notification on incoming messages.
+ *
+ * @memberOf jsxc.notification
+ */
+ init: function() {
+ $(document).on('postmessagein.jsxc', function(event, bid, msg) {
+ msg = (msg.match(/^\?OTR/)) ? $.t('Encrypted_message') : msg;
var data = jsxc.storage.getUserItem('buddy', bid);
- var request = $(message).find("request[xmlns='urn:xmpp:receipts']");
- if (data === null) {
- // jid not in roster
+ jsxc.notification.notify({
+ title: $.t('New_message_from') + ' ' + data.name,
+ msg: msg,
+ soundFile: jsxc.CONST.SOUNDS.MSG,
+ source: bid
+ });
+ });
- var chat = jsxc.storage.getUserItem('chat', bid) || [];
+ $(document).on('callincoming.jingle', function() {
+ jsxc.notification.playSound(jsxc.CONST.SOUNDS.CALL, true, true);
+ });
- if (chat.length === 0) {
- jsxc.notice.add('%%Unknown sender%%', '%%You received a message from an unknown sender%% (' + bid + ').', 'gui.showUnknownSender', [ bid ]);
- }
+ $(document).on('accept.call.jsxc reject.call.jsxc', function() {
+ jsxc.notification.stopSound();
+ });
+ },
- var msg = jsxc.removeHTML(body);
- msg = jsxc.escapeHTML(msg);
+ /**
+ * Shows a pop up notification and optional play sound.
+ *
+ * @param title Title
+ * @param msg Message
+ * @param d Duration
+ * @param force Should message also shown, if tab is visible?
+ * @param soundFile Playing given sound file
+ * @param loop Loop sound file?
+ * @param source Bid which triggered this notification
+ */
+ notify: function(title, msg, d, force, soundFile, loop, source) {
+ if (!jsxc.options.notification || !jsxc.notification.hasPermission()) {
+ return; // notifications disabled
+ }
- jsxc.storage.saveMessage(bid, 'in', msg, false, forwarded, stamp);
+ var o;
- return true;
- }
+ if (title !== null && typeof title === 'object') {
+ o = title;
+ } else {
+ o = {
+ title: title,
+ msg: msg,
+ duration: d,
+ force: force,
+ soundFile: soundFile,
+ loop: loop,
+ source: source
+ };
+ }
- var win = jsxc.gui.window.init(bid);
+ if (jsxc.hasFocus() && !o.force) {
+ return; // Tab is visible
+ }
- // If we now the full jid, we use it
- if (type === 'chat') {
- win.data('jid', from);
- jsxc.storage.updateUserItem('buddy', bid, {
- jid: from
- });
+ var icon = o.icon || jsxc.options.root + '/img/XMPP_logo.png';
+
+ if (typeof o.source === 'string') {
+ var data = jsxc.storage.getUserItem('buddy', o.source);
+ var src = jsxc.storage.getUserItem('avatar', data.avatar);
+
+ if (typeof src === 'string' && src !== '0') {
+ icon = src;
}
+ }
- $(document).trigger('message.jsxc', [ from, body ]);
+ jsxc.toNotification = setTimeout(function() {
- // create related otr object
- if (jsxc.master && !jsxc.otr.objects[bid]) {
- jsxc.otr.create(bid);
+ if (typeof o.soundFile === 'string') {
+ jsxc.notification.playSound(o.soundFile, o.loop, o.force);
}
- if (!forwarded && mid !== null && request.length && data !== null && (data.sub === 'both' || data.sub === 'from') && type === 'chat') {
- // Send received according to XEP-0184
- jsxc.xmpp.conn.send($msg({
- to: from
- }).c('received', {
- xmlns: 'urn:xmpp:receipts',
- id: mid
- }));
+ var popup = new Notification($.t(o.title), {
+ body: $.t(o.msg),
+ icon: icon
+ });
+
+ var duration = o.duration || jsxc.options.popupDuration;
+
+ if (duration > 0) {
+ setTimeout(function() {
+ popup.close();
+ }, duration);
}
+ }, jsxc.toNotificationDelay);
+ },
- if (jsxc.otr.objects.hasOwnProperty(bid)) {
- jsxc.otr.objects[bid].receiveMsg(body, {
- stamp: stamp,
- forwarded: forwarded
- });
- } else {
- jsxc.gui.window.postMessage(bid, 'in', body, false, forwarded, stamp);
+ /**
+ * Checks if browser has support for notifications and add on chrome to the
+ * default api.
+ *
+ * @returns {Boolean} True if the browser has support.
+ */
+ hasSupport: function() {
+ if (window.webkitNotifications) {
+ // prepare chrome
+
+ window.Notification = function(title, opt) {
+ var popup = window.webkitNotifications.createNotification(null, title, opt.body);
+ popup.show();
+
+ popup.close = function() {
+ popup.cancel();
+ };
+
+ return popup;
+ };
+
+ var permission;
+ switch (window.webkitNotifications.checkPermission()) {
+ case 0:
+ permission = jsxc.CONST.NOTIFICATION_GRANTED;
+ break;
+ case 2:
+ permission = jsxc.CONST.NOTIFICATION_DENIED;
+ break;
+ default: // 1
+ permission = jsxc.CONST.NOTIFICATION_DEFAULT;
}
+ window.Notification.permission = permission;
+
+ window.Notification.requestPermission = function(func) {
+ window.webkitNotifications.requestPermission(func);
+ };
- // preserve handler
return true;
- },
+ } else if (window.Notification) {
+ return true;
+ } else {
+ return false;
+ }
+ },
- /**
- * Triggerd if the rid changed
- *
- * @param {event} ev
- * @param {obejct} data
- * @private
- */
- onRidChange: function(ev, data) {
- jsxc.storage.setItem('rid', data.rid);
- },
+ /**
+ * Ask user on first incoming message if we should inform him about new
+ * messages.
+ */
+ prepareRequest: function() {
- /**
- * response to friendship request
- *
- * @param {string} from jid from original friendship req
- * @param {boolean} approve
- */
- resFriendReq: function(from, approve) {
- if (jsxc.master) {
- jsxc.xmpp.conn.send($pres({
- to: from,
- type: (approve) ? 'subscribed' : 'unsubscribed'
- }));
+ if (jsxc.notice.has('gui.showRequestNotification')) {
+ return;
+ }
- jsxc.storage.removeUserItem('friendReq');
- jsxc.gui.dialog.close();
+ $(document).one('postmessagein.jsxc', function() {
+ setTimeout(function() {
+ jsxc.notice.add($.t('Notifications') + '?', $.t('Should_we_notify_you_'), 'gui.showRequestNotification');
+ }, 1000);
+ });
+ },
+
+ /**
+ * Request notification permission.
+ */
+ requestPermission: function() {
+ window.Notification.requestPermission(function(status) {
+ if (window.Notification.permission !== status) {
+ window.Notification.permission = status;
+ }
+ if (jsxc.notification.hasPermission()) {
+ $(document).trigger('notificationready.jsxc');
} else {
- jsxc.storage.updateUserItem('friendReq', 'approve', approve);
+ $(document).trigger('notificationfailure.jsxc');
}
- },
+ });
+ },
- /**
- * Add buddy to my friends
- *
- * @param {string} username jid
- * @param {string} alias
- */
- addBuddy: function(username, alias) {
- var bid = jsxc.jidToBid(username);
+ /**
+ * Check permission.
+ *
+ * @returns {Boolean} True if we have the permission
+ */
+ hasPermission: function() {
+ return window.Notification.permission === jsxc.CONST.NOTIFICATION_GRANTED;
+ },
- if (jsxc.master) {
- // add buddy to roster (trigger onRosterChanged)
- var iq = $iq({
- type: 'set'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- }).c('item', {
- jid: username,
- name: alias || ''
- });
- jsxc.xmpp.conn.sendIQ(iq);
+ /**
+ * Plays the given file.
+ *
+ * @memberOf jsxc.notification
+ * @param {string} soundFile File relative to the sound directory
+ * @param {boolean} loop True for loop
+ * @param {boolean} force Play even if a tab is visible. Default: false.
+ */
+ playSound: function(soundFile, loop, force) {
+ if (!jsxc.master) {
+ // only master plays sound
+ return;
+ }
- // send subscription request to buddy (trigger onRosterChanged)
- jsxc.xmpp.conn.send($pres({
- to: username,
- type: 'subscribe'
- }));
+ if (jsxc.options.get('muteNotification') || jsxc.storage.getUserItem('presence') === 'dnd') {
+ // sound mute or own presence is dnd
+ return;
+ }
- jsxc.storage.removeUserItem('add_' + bid);
- } else {
- jsxc.storage.setUserItem('add_' + bid, {
- username: username,
- alias: alias || null
- });
- }
- },
+ if (jsxc.hasFocus() && !force) {
+ // tab is visible
+ return;
+ }
- /**
- * Remove buddy from my friends
- *
- * @param {type} jid
- */
- removeBuddy: function(jid) {
- var bid = jsxc.jidToBid(jid);
+ // stop current audio file
+ jsxc.notification.stopSound();
- // Shortcut to remove buddy from roster and cancle all subscriptions
- var iq = $iq({
- type: 'set'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- }).c('item', {
- jid: Strophe.getBareJidFromJid(jid),
- subscription: 'remove'
- });
- jsxc.xmpp.conn.sendIQ(iq);
+ var audio = new Audio(jsxc.options.root + '/sound/' + soundFile);
+ audio.loop = loop || false;
+ audio.play();
- jsxc.gui.roster.purge(bid);
- },
+ jsxc.notification.audio = audio;
+ },
- onReceived: function(message) {
- var from = $(message).attr('from');
- var jid = Strophe.getBareJidFromJid(from);
- var bid = jsxc.jidToBid(jid);
- var received = $(message).find("received[xmlns='urn:xmpp:receipts']");
+ /**
+ * Stop/remove current sound.
+ *
+ * @memberOf jsxc.notification
+ */
+ stopSound: function() {
+ var audio = jsxc.notification.audio;
- if (received.length) {
- var receivedId = received.attr('id').replace(/:/, '-');
- var chat = jsxc.storage.getUserItem('chat', bid);
- var i;
+ if (typeof audio !== 'undefined' && audio !== null) {
+ audio.pause();
+ jsxc.notification.audio = null;
+ }
+ },
- for (i = chat.length - 1; i >= 0; i--) {
- if (chat[i].uid === receivedId) {
- chat[i].received = true;
+ /**
+ * Mute sound.
+ *
+ * @memberOf jsxc.notification
+ * @param {boolean} external True if triggered from external tab. Default:
+ * false.
+ */
+ muteSound: function(external) {
+ $('#jsxc_menu .jsxc_muteNotification').text($.t('Unmute'));
- $('#' + receivedId).addClass('jsxc_received');
+ if (external !== true) {
+ jsxc.options.set('muteNotification', true);
+ }
+ },
- jsxc.storage.setUserItem('chat', bid, chat);
- break;
- }
- }
- }
+ /**
+ * Unmute sound.
+ *
+ * @memberOf jsxc.notification
+ * @param {boolean} external True if triggered from external tab. Default:
+ * false.
+ */
+ unmuteSound: function(external) {
+ $('#jsxc_menu .jsxc_muteNotification').text($.t('Mute'));
- return true;
+ if (external !== true) {
+ jsxc.options.set('muteNotification', false);
+ }
+ }
+};
+
+/**
+ * Set some options for the chat.
+ *
+ * @namespace jsxc.options
+ */
+jsxc.options = {
+
+ /** name of container application (e.g. owncloud or SOGo) */
+ app_name: 'web applications',
+
+ /** Timeout for the keepalive signal */
+ timeout: 3000,
+
+ /** Timeout for the keepalive signal if the master is busy */
+ busyTimeout: 15000,
+
+ /** OTR options */
+ otr: {
+ enable: true,
+ ERROR_START_AKE: false,
+ debug: false,
+ SEND_WHITESPACE_TAG: true,
+ WHITESPACE_START_AKE: true
+ },
+
+ /** xmpp options */
+ xmpp: {
+ url: null,
+ jid: null,
+ domain: null,
+ password: null,
+ overwrite: false,
+ onlogin: true
+ },
+
+ /** default xmpp priorities */
+ priority: {
+ online: 0,
+ chat: 0,
+ away: 0,
+ xa: 0,
+ dnd: 0
+ },
+
+ /** If all 3 properties are set, the login form is used */
+ loginForm: {
+ /** jquery object from form */
+ form: null,
+
+ /** jquery object from input element which contains the jid */
+ jid: null,
+
+ /** jquery object from input element which contains the password */
+ pass: null,
+
+ /** manipulate JID from input element */
+ preJid: function(jid) {
+ return jid;
},
/**
- * Public function to send message.
- *
- * @memberOf jsxc.xmpp
- * @param bid css jid of user
- * @param msg message
- * @param uid unique id
+ * Action after connected: submit [String] Submit form, false [boolean] Do
+ * nothing, continue [String] Start chat
*/
- sendMessage: function(bid, msg, uid) {
- if (jsxc.otr.objects.hasOwnProperty(bid)) {
- jsxc.otr.objects[bid].sendMsg(msg, uid);
- } else {
- jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data('jid'), msg, uid);
- }
- },
+ onConnected: 'submit',
/**
- * Create message stanza and send it.
- *
- * @memberOf jsxc.xmpp
- * @param jid Jabber id
- * @param msg Message
- * @param uid unique id
- * @private
+ * Action after auth fail: submit [String] Submit form, false [boolean] Do
+ * nothing, ask [String] Show auth fail dialog
*/
- _sendMessage: function(jid, msg, uid) {
- var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid)) || {};
- var isBar = (Strophe.getBareJidFromJid(jid) === jid);
- var type = data.type || 'chat';
-
- var xmlMsg = $msg({
- to: jid,
- type: type,
- id: uid
- }).c('body').t(msg);
-
- if (jsxc.xmpp.carbons.enabled && msg.match(/^\?OTR/)) {
- xmlMsg.up().c("private", {
- xmlns: jsxc.CONST.NS.CARBONS
- });
+ onAuthFail: 'submit'
+ },
+
+ /** jquery object from logout element */
+ logoutElement: null,
+
+ /** How many messages should be logged? */
+ numberOfMsg: 10,
+
+ /** Default language */
+ defaultLang: 'en',
+
+ /** auto language detection */
+ autoLang: true,
+
+ /** Place for roster */
+ rosterAppend: 'body',
+
+ /** Should we use the HTML5 notification API? */
+ notification: true,
+
+ /** duration for notification */
+ popupDuration: 6000,
+
+ /** Absolute path root of JSXC installation */
+ root: '',
+
+ /** Timeout for restore in ms */
+ loginTimeout: 1000 * 60 * 10,
+
+ /**
+ * This function decides wether the roster will be displayed or not if no
+ * connection is found.
+ */
+ displayRosterMinimized: function() {
+ return false;
+ },
+
+ /** Set to true if you want to hide offline buddies. */
+ hideOffline: false,
+
+ /** Mute notification sound? */
+ muteNotification: false,
+
+ /**
+ * If no avatar is found, this function is called.
+ *
+ * @param jid Jid of that user.
+ * @this {jQuery} Elements to update with probable .jsxc_avatar elements
+ */
+ defaultAvatar: function(jid) {
+ jsxc.gui.avatarPlaceholder($(this).find('.jsxc_avatar'), jid);
+ },
+
+ /**
+ * Returns permanent saved settings and overwrite default jsxc.options.
+ *
+ * @memberOf jsxc.options
+ * @param username String username
+ * @param password String password
+ * @returns {object} at least xmpp.url
+ */
+ loadSettings: function() {
+
+ },
+
+ /**
+ * Call this function to save user settings permanent.
+ *
+ * @memberOf jsxc.options
+ * @param data Holds all data as key/value
+ * @returns {boolean} false if function failes
+ */
+ saveSettinsPermanent: function() {
+
+ },
+
+ carbons: {
+ /** Enable carbon copies? */
+ enable: false
+ },
+
+ /**
+ * Processes user list.
+ *
+ * @callback getUsers-cb
+ * @param {object} list List of users, key: username, value: alias
+ */
+
+ /**
+ * Returns a list of usernames and aliases
+ *
+ * @function getUsers
+ * @memberOf jsxc.options
+ * @param {string} search Search token (start with)
+ * @param {getUsers-cb} cb Called with list of users
+ */
+ getUsers: null
+};
+
+/**
+ * @namespace jsxc.otr
+ */
+jsxc.otr = {
+ /** list of otr objects */
+ objects: {},
+
+ dsaFallback: null,
+ /**
+ * Handler for otr receive event
+ *
+ * @memberOf jsxc.otr
+ * @param {Object} d
+ * @param {string} d.bid
+ * @param {string} d.msg received message
+ * @param {boolean} d.encrypted True, if msg was encrypted.
+ * @param {boolean} d.forwarded
+ * @param {string} d.stamp timestamp
+ */
+ receiveMessage: function(d) {
+ var bid = d.bid;
+
+ if (jsxc.otr.objects[bid].msgstate !== OTR.CONST.MSGSTATE_PLAINTEXT) {
+ jsxc.otr.backup(bid);
+ }
+
+ if (jsxc.otr.objects[bid].msgstate !== OTR.CONST.MSGSTATE_PLAINTEXT && !d.encrypted) {
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('Received_an_unencrypted_message') + '. [' + d.msg + ']', d.encrypted, d.forwarded, d.stamp);
+ } else {
+ jsxc.gui.window.postMessage(bid, 'in', d.msg, d.encrypted, d.forwarded, d.stamp);
+ }
+ },
+
+ /**
+ * Handler for otr send event
+ *
+ * @param {string} jid
+ * @param {string} msg message to be send
+ */
+ sendMessage: function(jid, msg, uid) {
+ if (jsxc.otr.objects[jsxc.jidToBid(jid)].msgstate !== 0) {
+ jsxc.otr.backup(jsxc.jidToBid(jid));
+ }
+
+ jsxc.xmpp._sendMessage(jid, msg, uid);
+ },
+
+ /**
+ * Create new otr instance
+ *
+ * @param {type} bid
+ * @returns {undefined}
+ */
+ create: function(bid) {
+
+ if (jsxc.otr.objects.hasOwnProperty(bid)) {
+ return;
+ }
+
+ if (!jsxc.options.otr.priv) {
+ return;
+ }
+
+ // save list of otr objects
+ var ol = jsxc.storage.getUserItem('otrlist') || [];
+ if (ol.indexOf(bid) < 0) {
+ ol.push(bid);
+ jsxc.storage.setUserItem('otrlist', ol);
+ }
+
+ jsxc.otr.objects[bid] = new OTR(jsxc.options.otr);
+
+ if (jsxc.options.otr.SEND_WHITESPACE_TAG) {
+ jsxc.otr.objects[bid].SEND_WHITESPACE_TAG = true;
+ }
+
+ if (jsxc.options.otr.WHITESPACE_START_AKE) {
+ jsxc.otr.objects[bid].WHITESPACE_START_AKE = true;
+ }
+
+ jsxc.otr.objects[bid].on('status', function(status) {
+ var data = jsxc.storage.getUserItem('buddy', bid);
+
+ if (data === null) {
+ return;
}
- if (type === 'chat' && (isBar || jsxc.xmpp.conn.caps.hasFeatureByJid(jid, Strophe.NS.RECEIPTS))) {
- // Add request according to XEP-0184
- xmlMsg.up().c('request', {
- xmlns: 'urn:xmpp:receipts'
- });
+ switch (status) {
+ case OTR.CONST.STATUS_SEND_QUERY:
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('trying_to_start_private_conversation'));
+ break;
+ case OTR.CONST.STATUS_AKE_SUCCESS:
+ data.fingerprint = jsxc.otr.objects[bid].their_priv_pk.fingerprint();
+ data.msgstate = OTR.CONST.MSGSTATE_ENCRYPTED;
+
+ var msg = (jsxc.otr.objects[bid].trust ? $.t('Verified') : $.t('Unverified')) + ' ' + $.t('private_conversation_started');
+ jsxc.gui.window.postMessage(bid, 'sys', msg);
+ break;
+ case OTR.CONST.STATUS_END_OTR:
+ data.fingerprint = null;
+
+ if (jsxc.otr.objects[bid].msgstate === OTR.CONST.MSGSTATE_PLAINTEXT) {
+ // we abort the private conversation
+
+ data.msgstate = OTR.CONST.MSGSTATE_PLAINTEXT;
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('private_conversation_aborted'));
+
+ } else {
+ // the buddy abort the private conversation
+
+ data.msgstate = OTR.CONST.MSGSTATE_FINISHED;
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('your_buddy_closed_the_private_conversation_you_should_do_the_same'));
+ }
+ break;
+ case OTR.CONST.STATUS_SMP_HANDLE:
+ jsxc.keepBusyAlive();
+ break;
}
- jsxc.xmpp.conn.send(xmlMsg);
- },
+ jsxc.storage.setUserItem('buddy', bid, data);
- /**
- * This function loads a vcard.
- *
- * @memberOf jsxc.xmpp
- * @param bid
- * @param cb
- * @param error_cb
- */
- loadVcard: function(bid, cb, error_cb) {
- if (jsxc.master) {
- jsxc.xmpp.conn.vcard.get(cb, bid, error_cb);
- } else {
- jsxc.storage.setUserItem('vcard', bid, 'request:' + (new Date()).getTime());
+ // for encryption and verification state
+ jsxc.gui.update(bid);
+ });
+
+ jsxc.otr.objects[bid].on('smp', function(type, data) {
+ switch (type) {
+ case 'question': // verification request received
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('Authentication_request_received'));
+
+ if ($('#jsxc_dialog').length > 0) {
+ jsxc.otr.objects[bid].sm.abort();
+ break;
+ }
+
+ jsxc.otr.onSmpQuestion(bid, data);
+ jsxc.storage.setUserItem('smp_' + bid, {
+ data: data || null
+ });
- $(document).one('loaded.vcard.jsxc', function(ev, result) {
- if (result && result.state === 'success') {
- cb($(result.data).get(0));
+ break;
+ case 'trust': // verification completed
+ jsxc.otr.objects[bid].trust = data;
+ jsxc.storage.updateUserItem('buddy', bid, 'trust', data);
+ jsxc.otr.backup(bid);
+ jsxc.gui.update(bid);
+
+ if (data) {
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('conversation_is_now_verified'));
} else {
- error_cb();
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('authentication_failed'));
}
- });
+ jsxc.storage.removeUserItem('smp_' + bid);
+ jsxc.gui.dialog.close();
+ break;
+ case 'abort':
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('Authentication_aborted'));
+ break;
+ default:
+ jsxc.debug('[OTR] sm callback: Unknown type: ' + type);
}
- },
+ });
- /**
- * Retrieves capabilities.
- *
- * @memberOf jsxc.xmpp
- * @param jid
- * @returns List of known capabilities
- */
- getCapabilitiesByJid: function(jid) {
- if (jsxc.xmpp.conn) {
- return jsxc.xmpp.conn.caps.getCapabilitiesByJid(jid);
+ // Receive message
+ jsxc.otr.objects[bid].on('ui', function(msg, encrypted, meta) {
+ jsxc.otr.receiveMessage({
+ bid: bid,
+ msg: msg,
+ encrypted: encrypted === true,
+ stamp: meta.stamp,
+ forwarded: meta.forwarded
+ });
+ });
+
+ // Send message
+ jsxc.otr.objects[bid].on('io', function(msg, uid) {
+ var jid = jsxc.gui.window.get(bid).data('jid') || jsxc.otr.objects[bid].jid;
+
+ jsxc.otr.objects[bid].jid = jid;
+
+ jsxc.otr.sendMessage(jid, msg, uid);
+ });
+
+ jsxc.otr.objects[bid].on('error', function(err) {
+ // Handle this case in jsxc.otr.receiveMessage
+ if (err !== 'Received an unencrypted message.') {
+ jsxc.gui.window.postMessage(bid, 'sys', '[OTR] ' + $.t(err));
}
- var jidVerIndex = JSON.parse(localStorage.getItem('strophe.caps._jidVerIndex')) || {};
- var knownCapabilities = JSON.parse(localStorage.getItem('strophe.caps._knownCapabilities')) || {};
+ jsxc.error('[OTR] ' + err);
+ });
+
+ jsxc.otr.restore(bid);
+ },
+
+ /**
+ * show verification dialog with related part (secret or question)
+ *
+ * @param {type} bid
+ * @param {string} [data]
+ * @returns {undefined}
+ */
+ onSmpQuestion: function(bid, data) {
+ jsxc.gui.showVerification(bid);
+
+ $('#jsxc_dialog select').prop('selectedIndex', (data ? 2 : 3)).change();
+ $('#jsxc_dialog > div:eq(0)').hide();
+
+ if (data) {
+ $('#jsxc_dialog > div:eq(2)').find('#jsxc_quest').val(data).prop('disabled', true);
+ $('#jsxc_dialog > div:eq(2)').find('.creation').text('Answer');
+ $('#jsxc_dialog > div:eq(2)').find('.jsxc_explanation').text($.t('your_buddy_is_attempting_to_determine_') + ' ' + $.t('to_authenticate_to_your_buddy') + $.t('enter_the_answer_and_click_answer'));
+ } else {
+ $('#jsxc_dialog > div:eq(3)').find('.jsxc_explanation').text($.t('your_buddy_is_attempting_to_determine_') + ' ' + $.t('to_authenticate_to_your_buddy') + $.t('enter_the_secret'));
+ }
+
+ $('#jsxc_dialog .jsxc_close').click(function() {
+ jsxc.storage.removeUserItem('smp_' + bid);
- if (jidVerIndex[jid]) {
- return knownCapabilities[jidVerIndex[jid]];
+ if (jsxc.master) {
+ jsxc.otr.objects[bid].sm.abort();
}
+ });
+ },
+
+ /**
+ * Send verification request to buddy
+ *
+ * @param {string} bid
+ * @param {string} sec secret
+ * @param {string} [quest] question
+ * @returns {undefined}
+ */
+ sendSmpReq: function(bid, sec, quest) {
+ jsxc.keepBusyAlive();
- return null;
+ jsxc.otr.objects[bid].smpSecret(sec, quest || '');
+ },
+
+ /**
+ * Toggle encryption state
+ *
+ * @param {type} bid
+ * @returns {undefined}
+ */
+ toggleTransfer: function(bid) {
+ if (jsxc.storage.getUserItem('buddy', bid).msgstate === 0) {
+ jsxc.otr.goEncrypt(bid);
+ } else {
+ jsxc.otr.goPlain(bid);
}
- };
+ },
/**
- * Handle carbons (XEP-0280);
+ * Send request to encrypt the session
*
- * @namespace jsxc.xmpp.carbons
+ * @param {type} bid
+ * @returns {undefined}
*/
- jsxc.xmpp.carbons = {
- enabled: false,
+ goEncrypt: function(bid) {
+ if (jsxc.master) {
+ jsxc.otr.objects[bid].sendQueryMsg();
+ } else {
+ jsxc.storage.updateUserItem('buddy', bid, 'transferReq', 1);
+ }
+ },
- /**
- * Enable carbons.
- *
- * @memberOf jsxc.xmpp.carbons
- * @param cb callback
- */
- enable: function(cb) {
- var iq = $iq({
- type: 'set'
- }).c('enable', {
- xmlns: jsxc.CONST.NS.CARBONS
- });
+ /**
+ * Abort encryptet session
+ *
+ * @param {type} bid
+ * @param cb callback
+ * @returns {undefined}
+ */
+ goPlain: function(bid, cb) {
+ if (jsxc.master) {
+ jsxc.otr.objects[bid].endOtr.call(jsxc.otr.objects[bid], cb);
+ jsxc.otr.objects[bid].init.call(jsxc.otr.objects[bid]);
+
+ jsxc.otr.backup(bid);
+ } else {
+ jsxc.storage.updateUserItem('buddy', bid, 'transferReq', 0);
+ }
+ },
- jsxc.xmpp.conn.sendIQ(iq, function() {
- jsxc.xmpp.carbons.enabled = true;
+ /**
+ * Backups otr session
+ *
+ * @param {string} bid
+ */
+ backup: function(bid) {
+ var o = jsxc.otr.objects[bid]; // otr object
+ var r = {}; // return value
- jsxc.debug('Carbons enabled');
+ if (o === null) {
+ return;
+ }
- if (cb) {
- cb.call(this);
- }
- }, function(stanza) {
- jsxc.warn('Could not enable carbons', stanza);
- });
- },
+ // all variables which should be saved
+ var savekey = [ 'jid', 'our_instance_tag', 'msgstate', 'authstate', 'fragment', 'their_y', 'their_old_y', 'their_keyid', 'their_instance_tag', 'our_dh', 'our_old_dh', 'our_keyid', 'sessKeys', 'storedMgs', 'oldMacKeys', 'trust', 'transmittedRS', 'ssid', 'receivedPlaintext', 'authstate', 'send_interval' ];
- /**
- * Disable carbons.
- *
- * @memberOf jsxc.xmpp.carbons
- * @param cb callback
- */
- disable: function(cb) {
- var iq = $iq({
- type: 'set'
- }).c('disable', {
- xmlns: jsxc.CONST.NS.CARBONS
- });
+ var i;
+ for (i = 0; i < savekey.length; i++) {
+ r[savekey[i]] = JSON.stringify(o[savekey[i]]);
+ }
+
+ if (o.their_priv_pk !== null) {
+ r.their_priv_pk = JSON.stringify(o.their_priv_pk.packPublic());
+ }
- jsxc.xmpp.conn.sendIQ(iq, function() {
- jsxc.xmpp.carbons.enabled = false;
+ if (o.ake.otr_version && o.ake.otr_version !== '') {
+ r.otr_version = JSON.stringify(o.ake.otr_version);
+ }
- jsxc.debug('Carbons disabled');
+ jsxc.storage.setUserItem('otr', bid, r);
+ },
- if (cb) {
- cb.call(this);
+ /**
+ * Restore old otr session
+ *
+ * @param {string} bid
+ */
+ restore: function(bid) {
+ var o = jsxc.otr.objects[bid];
+ var d = jsxc.storage.getUserItem('otr', bid);
+
+ if (o !== null || d !== null) {
+ var key;
+ for (key in d) {
+ if (d.hasOwnProperty(key)) {
+ var val = JSON.parse(d[key]);
+ if (key === 'their_priv_pk' && val !== null) {
+ val = DSA.parsePublic(val);
+ }
+ if (key === 'otr_version' && val !== null) {
+ o.ake.otr_version = val;
+ } else {
+ o[key] = val;
+ }
}
- }, function(stanza) {
- jsxc.warn('Could not disable carbons', stanza);
- });
- },
+ }
- /**
- * Enable/Disable carbons depending on options key.
- *
- * @memberOf jsxc.xmpp.carbons
- * @param err error message
- */
- refresh: function(err) {
- if (err === false) {
- return;
+ jsxc.otr.objects[bid] = o;
+
+ if (o.msgstate === 1 && o.their_priv_pk !== null) {
+ o._smInit.call(jsxc.otr.objects[bid]);
}
+ }
+
+ jsxc.otr.enable(bid);
+ },
+
+ /**
+ * Create or load DSA key
+ *
+ * @returns {unresolved}
+ */
+ createDSA: function() {
+ if (jsxc.options.otr.priv) {
+ return;
+ }
+
+ if (jsxc.storage.getUserItem('key') === null) {
+ var msg = $.t('Creating_your_private_key_');
+ var worker = null;
+
+ if (Worker) {
+ // try to create web-worker
- if (jsxc.options.get('carbons').enable) {
- return jsxc.xmpp.carbons.enable();
+ try {
+ worker = new Worker(jsxc.options.root + '/lib/otr/build/dsa-webworker.js');
+ } catch (err) {
+ jsxc.warn('Couldn\'t create web-worker.', err);
+ }
}
- return jsxc.xmpp.carbons.disable();
+ jsxc.otr.dsaFallback = (worker === null);
+
+ if (!jsxc.otr.dsaFallback) {
+ // create DSA key in background
+
+ jsxc._onMaster();
+
+ worker.onmessage = function(e) {
+ var type = e.data.type;
+ var val = e.data.val;
+
+ if (type === 'debug') {
+ jsxc.debug(val);
+ } else if (type === 'data') {
+ jsxc.otr.DSAready(DSA.parsePrivate(val));
+ }
+ };
+
+ // start worker
+ worker.postMessage({
+ imports: [ jsxc.options.root + '/lib/otr/vendor/salsa20.js', jsxc.options.root + '/lib/otr/vendor/bigint.js', jsxc.options.root + '/lib/otr/vendor/crypto.js', jsxc.options.root + '/lib/otr/vendor/eventemitter.js', jsxc.options.root + '/lib/otr/lib/const.js', jsxc.options.root + '/lib/otr/lib/helpers.js', jsxc.options.root + '/lib/otr/lib/dsa.js' ],
+ seed: BigInt.getSeed(),
+ debug: true
+ });
+
+ } else {
+ // fallback
+
+ jsxc.gui.dialog.open(jsxc.gui.template.get('waitAlert', null, msg), {
+ noClose: true
+ });
+
+ jsxc.debug('DSA key creation started.');
+
+ // wait until the wait alert is opened
+ setTimeout(function() {
+ var dsa = new DSA();
+ jsxc.otr.DSAready(dsa);
+ }, 500);
+ }
+ } else {
+ jsxc.debug('DSA key loaded');
+ jsxc.options.otr.priv = DSA.parsePrivate(jsxc.storage.getUserItem('key'));
+
+ jsxc.otr._createDSA();
}
- };
+ },
+
+ /**
+ * Ending of createDSA().
+ */
+ _createDSA: function() {
+
+ jsxc.storage.setUserItem('priv_fingerprint', jsxc.options.otr.priv.fingerprint());
+
+ if (jsxc.otr.dsaFallback !== false) {
+ jsxc._onMaster();
+ }
+ },
+
+ /**
+ * Ending of DSA key generation.
+ *
+ * @param {DSA} dsa DSA object
+ */
+ DSAready: function(dsa) {
+ jsxc.storage.setUserItem('key', dsa.packPrivate());
+ jsxc.options.otr.priv = dsa;
+
+ // close wait alert
+ if (jsxc.otr.dsaFallback) {
+ jsxc.gui.dialog.close();
+ } else {
+ $.each(jsxc.storage.getUserItem('windowlist'), function(index, val) {
+ jsxc.otr.create(val);
+ });
+ }
+
+ jsxc.otr._createDSA();
+ },
+
+ enable: function(bid) {
+ jsxc.gui.window.get(bid).find('.jsxc_otr').removeClass('jsxc_disabled');
+ }
+};
+
+
/**
* Handle long-live data
@@ -4736,6 +5795,14 @@ var jsxc;
}
}
+ if (key.match(/^focus/)) {
+ if (jsxc.master) {
+ clearTimeout(jsxc.toNotification);
+ } else {
+ jsxc.hasFocus();
+ }
+ }
+
if (key.match(new RegExp('^chat' + jsxc.storage.SEP))) {
var posts = JSON.parse(e.newValue);
@@ -4923,9 +5990,10 @@ var jsxc;
* @param msg
* @param encrypted
* @param forwarded
+ * @param sender
* @return post
*/
- saveMessage: function(bid, direction, msg, encrypted, forwarded, stamp) {
+ saveMessage: function(bid, direction, msg, encrypted, forwarded, stamp, sender) {
var chat = jsxc.storage.getUserItem('chat', bid) || [];
var uid = new Date().getTime() + ':msg';
@@ -4941,7 +6009,8 @@ var jsxc;
received: false,
encrypted: encrypted || false,
forwarded: forwarded || false,
- stamp: stamp || new Date().getTime()
+ stamp: stamp || new Date().getTime(),
+ sender: sender
};
chat.unshift(post);
@@ -4983,1291 +6052,16 @@ var jsxc;
}
};
- /**
- * @namespace jsxc.otr
- */
- jsxc.otr = {
- /** list of otr objects */
- objects: {},
-
- dsaFallback: null,
- /**
- * Handler for otr receive event
- *
- * @memberOf jsxc.otr
- * @param {Object} d
- * @param {string} d.bid
- * @param {string} d.msg received message
- * @param {boolean} d.encrypted True, if msg was encrypted.
- * @param {boolean} d.forwarded
- * @param {string} d.stamp timestamp
- */
- receiveMessage: function(d) {
- var bid = d.bid;
+/* global SDPUtil, getUserMediaWithConstraints, setupRTC, MediaStreamTrack, RTC, RTCPeerconnection */
+/* jshint -W020 */
- if (jsxc.otr.objects[bid].msgstate !== OTR.CONST.MSGSTATE_PLAINTEXT) {
- jsxc.otr.backup(bid);
- }
-
- if (jsxc.otr.objects[bid].msgstate !== OTR.CONST.MSGSTATE_PLAINTEXT && !d.encrypted) {
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.translate('%%Received an unencrypted message.%% [') + d.msg + ']', d.encrypted, d.forwarded, d.stamp);
- } else {
- jsxc.gui.window.postMessage(bid, 'in', d.msg, d.encrypted, d.forwarded, d.stamp);
- }
- },
-
- /**
- * Handler for otr send event
- *
- * @param {string} jid
- * @param {string} msg message to be send
- */
- sendMessage: function(jid, msg, uid) {
- if (jsxc.otr.objects[jsxc.jidToBid(jid)].msgstate !== 0) {
- jsxc.otr.backup(jsxc.jidToBid(jid));
- }
-
- jsxc.xmpp._sendMessage(jid, msg, uid);
- },
-
- /**
- * Create new otr instance
- *
- * @param {type} bid
- * @returns {undefined}
- */
- create: function(bid) {
-
- if (jsxc.otr.objects.hasOwnProperty(bid)) {
- return;
- }
-
- if (!jsxc.options.otr.priv) {
- return;
- }
-
- // save list of otr objects
- var ol = jsxc.storage.getUserItem('otrlist') || [];
- if (ol.indexOf(bid) < 0) {
- ol.push(bid);
- jsxc.storage.setUserItem('otrlist', ol);
- }
-
- jsxc.otr.objects[bid] = new OTR(jsxc.options.otr);
-
- if (jsxc.options.otr.SEND_WHITESPACE_TAG) {
- jsxc.otr.objects[bid].SEND_WHITESPACE_TAG = true;
- }
-
- if (jsxc.options.otr.WHITESPACE_START_AKE) {
- jsxc.otr.objects[bid].WHITESPACE_START_AKE = true;
- }
-
- jsxc.otr.objects[bid].on('status', function(status) {
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- if (data === null) {
- return;
- }
-
- switch (status) {
- case OTR.CONST.STATUS_SEND_QUERY:
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.trying_to_start_private_conversation);
- break;
- case OTR.CONST.STATUS_AKE_SUCCESS:
- data.fingerprint = jsxc.otr.objects[bid].their_priv_pk.fingerprint();
- data.msgstate = OTR.CONST.MSGSTATE_ENCRYPTED;
-
- var msg = (jsxc.otr.objects[bid].trust ? jsxc.l.Verified : jsxc.l.Unverified) + ' ' + jsxc.l.private_conversation_started;
- jsxc.gui.window.postMessage(bid, 'sys', msg);
- break;
- case OTR.CONST.STATUS_END_OTR:
- data.fingerprint = null;
-
- if (jsxc.otr.objects[bid].msgstate === OTR.CONST.MSGSTATE_PLAINTEXT) {
- // we abort the private conversation
-
- data.msgstate = OTR.CONST.MSGSTATE_PLAINTEXT;
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.private_conversation_aborted);
-
- } else {
- // the buddy abort the private conversation
-
- data.msgstate = OTR.CONST.MSGSTATE_FINISHED;
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.your_buddy_closed_the_private_conversation_you_should_do_the_same);
- }
- break;
- case OTR.CONST.STATUS_SMP_HANDLE:
- jsxc.keepBusyAlive();
- break;
- }
-
- jsxc.storage.setUserItem('buddy', bid, data);
-
- // for encryption and verification state
- jsxc.gui.update(bid);
- });
-
- jsxc.otr.objects[bid].on('smp', function(type, data) {
- switch (type) {
- case 'question': // verification request received
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.Authentication_request_received);
-
- if ($('#jsxc_dialog').length > 0) {
- jsxc.otr.objects[bid].sm.abort();
- break;
- }
-
- jsxc.otr.onSmpQuestion(bid, data);
- jsxc.storage.setUserItem('smp_' + bid, {
- data: data || null
- });
-
- break;
- case 'trust': // verification completed
- jsxc.otr.objects[bid].trust = data;
- jsxc.storage.updateUserItem('buddy', bid, 'trust', data);
- jsxc.otr.backup(bid);
- jsxc.gui.update(bid);
-
- if (data) {
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.conversation_is_now_verified);
- } else {
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.authentication_failed);
- }
- jsxc.storage.removeUserItem('smp_' + bid);
- jsxc.gui.dialog.close();
- break;
- case 'abort':
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.Authentication_aborted);
- break;
- default:
- jsxc.debug('[OTR] sm callback: Unknown type: ' + type);
- }
- });
-
- // Receive message
- jsxc.otr.objects[bid].on('ui', function(msg, encrypted, meta) {
- jsxc.otr.receiveMessage({
- bid: bid,
- msg: msg,
- encrypted: encrypted === true,
- stamp: meta.stamp,
- forwarded: meta.forwarded
- });
- });
-
- // Send message
- jsxc.otr.objects[bid].on('io', function(msg, uid) {
- var jid = jsxc.gui.window.get(bid).data('jid') || jsxc.otr.objects[bid].jid;
-
- jsxc.otr.objects[bid].jid = jid;
-
- jsxc.otr.sendMessage(jid, msg, uid);
- });
-
- jsxc.otr.objects[bid].on('error', function(err) {
- // Handle this case in jsxc.otr.receiveMessage
- if (err !== 'Received an unencrypted message.') {
- jsxc.gui.window.postMessage(bid, 'sys', '[OTR] ' + jsxc.translate('%%' + err + '%%'));
- }
-
- jsxc.error('[OTR] ' + err);
- });
-
- jsxc.otr.restore(bid);
- },
-
- /**
- * show verification dialog with related part (secret or question)
- *
- * @param {type} bid
- * @param {string} [data]
- * @returns {undefined}
- */
- onSmpQuestion: function(bid, data) {
- jsxc.gui.showVerification(bid);
-
- $('#jsxc_dialog select').prop('selectedIndex', (data ? 2 : 3)).change();
- $('#jsxc_dialog > div:eq(0)').hide();
-
- if (data) {
- $('#jsxc_dialog > div:eq(2)').find('#jsxc_quest').val(data).prop('disabled', true);
- $('#jsxc_dialog > div:eq(2)').find('.creation').text('Answer');
- $('#jsxc_dialog > div:eq(2)').find('.jsxc_explanation').text(jsxc.l.your_buddy_is_attempting_to_determine_ + ' ' + jsxc.l.to_authenticate_to_your_buddy + jsxc.l.enter_the_answer_and_click_answer);
- } else {
- $('#jsxc_dialog > div:eq(3)').find('.jsxc_explanation').text(jsxc.l.your_buddy_is_attempting_to_determine_ + ' ' + jsxc.l.to_authenticate_to_your_buddy + jsxc.l.enter_the_secret);
- }
-
- $('#jsxc_dialog .jsxc_close').click(function() {
- jsxc.storage.removeUserItem('smp_' + bid);
-
- if (jsxc.master) {
- jsxc.otr.objects[bid].sm.abort();
- }
- });
- },
-
- /**
- * Send verification request to buddy
- *
- * @param {string} bid
- * @param {string} sec secret
- * @param {string} [quest] question
- * @returns {undefined}
- */
- sendSmpReq: function(bid, sec, quest) {
- jsxc.keepBusyAlive();
-
- jsxc.otr.objects[bid].smpSecret(sec, quest || '');
- },
-
- /**
- * Toggle encryption state
- *
- * @param {type} bid
- * @returns {undefined}
- */
- toggleTransfer: function(bid) {
- if (jsxc.storage.getUserItem('buddy', bid).msgstate === 0) {
- jsxc.otr.goEncrypt(bid);
- } else {
- jsxc.otr.goPlain(bid);
- }
- },
-
- /**
- * Send request to encrypt the session
- *
- * @param {type} bid
- * @returns {undefined}
- */
- goEncrypt: function(bid) {
- if (jsxc.master) {
- jsxc.otr.objects[bid].sendQueryMsg();
- } else {
- jsxc.storage.updateUserItem('buddy', bid, 'transferReq', 1);
- }
- },
-
- /**
- * Abort encryptet session
- *
- * @param {type} bid
- * @param cb callback
- * @returns {undefined}
- */
- goPlain: function(bid, cb) {
- if (jsxc.master) {
- jsxc.otr.objects[bid].endOtr.call(jsxc.otr.objects[bid], cb);
- jsxc.otr.objects[bid].init.call(jsxc.otr.objects[bid]);
-
- jsxc.otr.backup(bid);
- } else {
- jsxc.storage.updateUserItem('buddy', bid, 'transferReq', 0);
- }
- },
-
- /**
- * Backups otr session
- *
- * @param {string} bid
- */
- backup: function(bid) {
- var o = jsxc.otr.objects[bid]; // otr object
- var r = {}; // return value
-
- if (o === null) {
- return;
- }
-
- // all variables which should be saved
- var savekey = [ 'jid', 'our_instance_tag', 'msgstate', 'authstate', 'fragment', 'their_y', 'their_old_y', 'their_keyid', 'their_instance_tag', 'our_dh', 'our_old_dh', 'our_keyid', 'sessKeys', 'storedMgs', 'oldMacKeys', 'trust', 'transmittedRS', 'ssid', 'receivedPlaintext', 'authstate', 'send_interval' ];
-
- var i;
- for (i = 0; i < savekey.length; i++) {
- r[savekey[i]] = JSON.stringify(o[savekey[i]]);
- }
-
- if (o.their_priv_pk !== null) {
- r.their_priv_pk = JSON.stringify(o.their_priv_pk.packPublic());
- }
-
- if (o.ake.otr_version && o.ake.otr_version !== '') {
- r.otr_version = JSON.stringify(o.ake.otr_version);
- }
-
- jsxc.storage.setUserItem('otr', bid, r);
- },
-
- /**
- * Restore old otr session
- *
- * @param {string} bid
- */
- restore: function(bid) {
- var o = jsxc.otr.objects[bid];
- var d = jsxc.storage.getUserItem('otr', bid);
-
- if (o !== null || d !== null) {
- var key;
- for (key in d) {
- if (d.hasOwnProperty(key)) {
- var val = JSON.parse(d[key]);
- if (key === 'their_priv_pk' && val !== null) {
- val = DSA.parsePublic(val);
- }
- if (key === 'otr_version' && val !== null) {
- o.ake.otr_version = val;
- } else {
- o[key] = val;
- }
- }
- }
-
- jsxc.otr.objects[bid] = o;
-
- if (o.msgstate === 1 && o.their_priv_pk !== null) {
- o._smInit.call(jsxc.otr.objects[bid]);
- }
- }
-
- jsxc.otr.enable(bid);
- },
-
- /**
- * Create or load DSA key
- *
- * @returns {unresolved}
- */
- createDSA: function() {
- if (jsxc.options.otr.priv) {
- return;
- }
-
- if (jsxc.storage.getUserItem('key') === null) {
- var msg = jsxc.l.Creating_your_private_key_;
- var worker = null;
-
- if (Worker) {
- // try to create web-worker
-
- try {
- worker = new Worker(jsxc.options.root + '/lib/otr/build/dsa-webworker.js');
- } catch (err) {
- jsxc.warn('Couldn\'t create web-worker.', err);
- }
- }
-
- jsxc.otr.dsaFallback = (worker === null);
-
- if (!jsxc.otr.dsaFallback) {
- // create DSA key in background
-
- jsxc._onMaster();
-
- worker.onmessage = function(e) {
- var type = e.data.type;
- var val = e.data.val;
-
- if (type === 'debug') {
- jsxc.debug(val);
- } else if (type === 'data') {
- jsxc.otr.DSAready(DSA.parsePrivate(val));
- }
- };
-
- // start worker
- worker.postMessage({
- imports: [ jsxc.options.root + '/lib/otr/vendor/salsa20.js', jsxc.options.root + '/lib/otr/vendor/bigint.js', jsxc.options.root + '/lib/otr/vendor/crypto.js', jsxc.options.root + '/lib/otr/vendor/eventemitter.js', jsxc.options.root + '/lib/otr/lib/const.js', jsxc.options.root + '/lib/otr/lib/helpers.js', jsxc.options.root + '/lib/otr/lib/dsa.js' ],
- seed: BigInt.getSeed(),
- debug: true
- });
-
- } else {
- // fallback
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('waitAlert', null, msg), {
- noClose: true
- });
-
- jsxc.debug('DSA key creation started.');
-
- // wait until the wait alert is opened
- setTimeout(function() {
- var dsa = new DSA();
- jsxc.otr.DSAready(dsa);
- }, 500);
- }
- } else {
- jsxc.debug('DSA key loaded');
- jsxc.options.otr.priv = DSA.parsePrivate(jsxc.storage.getUserItem('key'));
-
- jsxc.otr._createDSA();
- }
- },
-
- /**
- * Ending of createDSA().
- */
- _createDSA: function() {
-
- jsxc.storage.setUserItem('priv_fingerprint', jsxc.options.otr.priv.fingerprint());
-
- if (jsxc.otr.dsaFallback !== false) {
- jsxc._onMaster();
- }
- },
-
- /**
- * Ending of DSA key generation.
- *
- * @param {DSA} dsa DSA object
- */
- DSAready: function(dsa) {
- jsxc.storage.setUserItem('key', dsa.packPrivate());
- jsxc.options.otr.priv = dsa;
-
- // close wait alert
- if (jsxc.otr.dsaFallback) {
- jsxc.gui.dialog.close();
- } else {
- $.each(jsxc.storage.getUserItem('windowlist'), function(index, val) {
- jsxc.otr.create(val);
- });
- }
-
- jsxc.otr._createDSA();
- },
-
- enable: function(bid) {
- jsxc.gui.window.get(bid).find('.jsxc_otr').removeClass('jsxc_disabled');
- }
- };
-
- /**
- * This namespace handles the Notification API.
- *
- * @namespace jsxc.notification
- */
- jsxc.notification = {
-
- /** Current audio file. */
- audio: null,
-
- /**
- * Register notification on incoming messages.
- *
- * @memberOf jsxc.notification
- */
- init: function() {
- $(document).on('postmessagein.jsxc', function(event, bid, msg) {
- msg = (msg.match(/^\?OTR/)) ? jsxc.translate('%%Encrypted message%%') : msg;
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- jsxc.notification.notify(jsxc.translate('%%New message from%% ') + data.name, msg, undefined, undefined, jsxc.CONST.SOUNDS.MSG);
- });
-
- $(document).on('callincoming.jingle', function() {
- jsxc.notification.playSound(jsxc.CONST.SOUNDS.CALL, true, true);
- });
-
- $(document).on('accept.call.jsxc reject.call.jsxc', function() {
- jsxc.notification.stopSound();
- });
- },
-
- /**
- * Shows a pop up notification and optional play sound.
- *
- * @param title Title
- * @param msg Message
- * @param d Duration
- * @param force Should message also shown, if tab is visible?
- * @param soundFile Playing given sound file
- * @param loop Loop sound file?
- */
- notify: function(title, msg, d, force, soundFile, loop) {
- if (!jsxc.options.notification || !jsxc.notification.hasPermission()) {
- return; // notifications disabled
- }
-
- if (!jsxc.isHidden() && !force) {
- return; // Tab is visible
- }
-
- jsxc.toNotification = setTimeout(function() {
-
- if (typeof soundFile === 'string') {
- jsxc.notification.playSound(soundFile, loop, force);
- }
-
- var popup = new Notification(jsxc.translate(title), {
- body: jsxc.translate(msg),
- icon: jsxc.options.root + '/img/XMPP_logo.png'
- });
-
- var duration = d || jsxc.options.popupDuration;
-
- if (duration > 0) {
- setTimeout(function() {
- popup.close();
- }, duration);
- }
- }, jsxc.toNotificationDelay);
- },
-
- /**
- * Checks if browser has support for notifications and add on chrome to
- * the default api.
- *
- * @returns {Boolean} True if the browser has support.
- */
- hasSupport: function() {
- if (window.webkitNotifications) {
- // prepare chrome
-
- window.Notification = function(title, opt) {
- var popup = window.webkitNotifications.createNotification(null, title, opt.body);
- popup.show();
-
- popup.close = function() {
- popup.cancel();
- };
-
- return popup;
- };
-
- var permission;
- switch (window.webkitNotifications.checkPermission()) {
- case 0:
- permission = jsxc.CONST.NOTIFICATION_GRANTED;
- break;
- case 2:
- permission = jsxc.CONST.NOTIFICATION_DENIED;
- break;
- default: // 1
- permission = jsxc.CONST.NOTIFICATION_DEFAULT;
- }
- window.Notification.permission = permission;
-
- window.Notification.requestPermission = function(func) {
- window.webkitNotifications.requestPermission(func);
- };
-
- return true;
- } else if (window.Notification) {
- return true;
- } else {
- return false;
- }
- },
-
- /**
- * Ask user on first incoming message if we should inform him about new
- * messages.
- */
- prepareRequest: function() {
-
- $(document).one('postmessagein.jsxc', function() {
- jsxc.switchEvents({
- 'notificationready.jsxc': function() {
- jsxc.gui.dialog.close();
- jsxc.notification.init();
- jsxc.storage.setUserItem('notification', true);
- },
- 'notificationfailure.jsxc': function() {
- jsxc.gui.dialog.close();
- jsxc.options.notification = false;
- jsxc.storage.setUserItem('notification', false);
- }
- });
-
- setTimeout(function() {
- jsxc.notice.add('%%Notifications%%?', '%%Should_we_notify_you_%%', 'gui.showRequestNotification');
- }, 1000);
- });
- },
-
- /**
- * Request notification permission.
- */
- requestPermission: function() {
- window.Notification.requestPermission(function(status) {
- if (window.Notification.permission !== status) {
- window.Notification.permission = status;
- }
-
- if (jsxc.notification.hasPermission()) {
- $(document).trigger('notificationready.jsxc');
- } else {
- $(document).trigger('notificationfailure.jsxc');
- }
- });
- },
-
- /**
- * Check permission.
- *
- * @returns {Boolean} True if we have the permission
- */
- hasPermission: function() {
- return window.Notification.permission === jsxc.CONST.NOTIFICATION_GRANTED;
- },
-
- /**
- * Plays the given file.
- *
- * @memberOf jsxc.notification
- * @param {string} soundFile File relative to the sound directory
- * @param {boolean} loop True for loop
- * @param {boolean} force Play even if a tab is visible. Default: false.
- */
- playSound: function(soundFile, loop, force) {
- if (!jsxc.master) {
- // only master plays sound
- return;
- }
-
- if (jsxc.options.get('muteNotification') || jsxc.storage.getUserItem('presence') === 'dnd') {
- // sound mute or own presence is dnd
- return;
- }
-
- if (!jsxc.isHidden() && !force) {
- // tab is visible
- return;
- }
-
- // stop current audio file
- jsxc.notification.stopSound();
-
- var audio = new Audio(jsxc.options.root + '/sound/' + soundFile);
- audio.loop = loop || false;
- audio.play();
-
- jsxc.notification.audio = audio;
- },
-
- /**
- * Stop/remove current sound.
- *
- * @memberOf jsxc.notification
- */
- stopSound: function() {
- var audio = jsxc.notification.audio;
-
- if (typeof audio !== 'undefined' && audio !== null) {
- audio.pause();
- jsxc.notification.audio = null;
- }
- },
-
- /**
- * Mute sound.
- *
- * @memberOf jsxc.notification
- * @param {boolean} external True if triggered from external tab. Default:
- * false.
- */
- muteSound: function(external) {
- $('#jsxc_menu .jsxc_muteNotification').text(jsxc.translate('%%Unmute%%'));
-
- if (external !== true) {
- jsxc.options.set('muteNotification', true);
- }
- },
-
- /**
- * Unmute sound.
- *
- * @memberOf jsxc.notification
- * @param {boolean} external True if triggered from external tab. Default:
- * false.
- */
- unmuteSound: function(external) {
- $('#jsxc_menu .jsxc_muteNotification').text(jsxc.translate('%%Mute%%'));
-
- if (external !== true) {
- jsxc.options.set('muteNotification', false);
- }
- }
- };
-
- /**
- * This namespace handle the notice system.
- *
- * @namspace jsxc.notice
- * @memberOf jsxc
- */
- jsxc.notice = {
- /** Number of notices. */
- _num: 0,
-
- /**
- * Loads the saved notices.
- *
- * @memberOf jsxc.notice
- */
- load: function() {
- // reset list
- $('#jsxc_notice ul li').remove();
- $('#jsxc_notice > span').text('');
- jsxc.notice._num = 0;
-
- var saved = jsxc.storage.getUserItem('notices') || [];
- var key = null;
-
- for (key in saved) {
- if (saved.hasOwnProperty(key)) {
- var val = saved[key];
-
- jsxc.notice.add(val.msg, val.description, val.fnName, val.fnParams, key);
- }
- }
- },
-
- /**
- * Add a new notice to the stack;
- *
- * @memberOf jsxc.notice
- * @param msg Header message
- * @param description Notice description
- * @param fnName Function name to be called if you open the notice
- * @param fnParams Array of params for function
- * @param id Notice id
- */
- add: function(msg, description, fnName, fnParams, id) {
- var nid = id || Date.now();
- var list = $('#jsxc_notice ul');
- var notice = $('<li/>');
-
- notice.click(function() {
- jsxc.notice.remove(nid);
-
- jsxc.exec(fnName, fnParams);
-
- return false;
- });
-
- notice.text(jsxc.translate(msg));
- notice.attr('title', jsxc.translate(description) || '');
- notice.attr('data-nid', nid);
- list.append(notice);
-
- $('#jsxc_notice > span').text(++jsxc.notice._num);
-
- if (!id) {
- var saved = jsxc.storage.getUserItem('notices') || {};
- saved[nid] = {
- msg: msg,
- description: description,
- fnName: fnName,
- fnParams: fnParams
- };
- jsxc.storage.setUserItem('notices', saved);
-
- jsxc.notification.notify(msg, description || '', null, true, jsxc.CONST.SOUNDS.NOTICE);
- }
- },
-
- /**
- * Removes notice from stack
- *
- * @memberOf jsxc.notice
- * @param nid The notice id
- */
- remove: function(nid) {
- var el = $('#jsxc_notice li[data-nid=' + nid + ']');
-
- el.remove();
- $('#jsxc_notice > span').text(--jsxc.notice._num || '');
-
- var s = jsxc.storage.getUserItem('notices');
- delete s[nid];
- jsxc.storage.setUserItem('notices', s);
- }
- };
-
- /**
- * Contains all available translations
- *
- * @namespace jsxc.l10n
- * @memberOf jsxc
- */
- jsxc.l10n = {
- en: {
- Logging_in: 'Logging in…',
- your_connection_is_unencrypted: 'Your connection is unencrypted.',
- your_connection_is_encrypted: 'Your connection is encrypted.',
- your_buddy_closed_the_private_connection: 'Your buddy closed the private connection.',
- start_private: 'Start private',
- close_private: 'Close private',
- your_buddy_is_verificated: 'Your buddy is verified.',
- you_have_only_a_subscription_in_one_way: 'You only have a one-way subscription.',
- authentication_query_sent: 'Authentication query sent.',
- your_message_wasnt_send_please_end_your_private_conversation: 'Your message was not sent. Please end your private conversation.',
- unencrypted_message_received: 'Unencrypted message received:',
- your_message_wasnt_send_because_you_have_no_valid_subscription: 'Your message was not sent because you have no valid subscription.',
- not_available: 'Not available',
- no_connection: 'No connection!',
- relogin: 'relogin',
- trying_to_start_private_conversation: 'Trying to start private conversation!',
- Verified: 'Verified',
- Unverified: 'Unverified',
- private_conversation_started: 'Private conversation started.',
- private_conversation_aborted: 'Private conversation aborted!',
- your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Your buddy closed the private conversation! You should do the same.',
- conversation_is_now_verified: 'Conversation is now verified.',
- authentication_failed: 'Authentication failed.',
- your_buddy_is_attempting_to_determine_: 'You buddy is attempting to determine if he or she is really talking to you.',
- to_authenticate_to_your_buddy: 'To authenticate to your buddy, ',
- enter_the_answer_and_click_answer: 'enter the answer and click Answer.',
- enter_the_secret: 'enter the secret.',
- Creating_your_private_key_: 'Creating your private key; this may take a while.',
- Authenticating_a_buddy_helps_: 'Authenticating a buddy helps ensure that the person you are talking to is really the one he or she claims to be.',
- How_do_you_want_to_authenticate_your_buddy: 'How do you want to authenticate {{bid_name}} (<b>{{bid_jid}}</b>)?',
- Select_method: 'Select method...',
- Manual: 'Manual',
- Question: 'Question',
- Secret: 'Secret',
- To_verify_the_fingerprint_: 'To verify the fingerprint, contact your buddy via some other trustworthy channel, such as the telephone.',
- Your_fingerprint: 'Your fingerprint',
- Buddy_fingerprint: 'Buddy fingerprint',
- Close: 'Close',
- Compared: 'Compared',
- To_authenticate_using_a_question_: 'To authenticate using a question, pick a question whose answer is known only you and your buddy.',
- Ask: 'Ask',
- To_authenticate_pick_a_secret_: 'To authenticate, pick a secret known only to you and your buddy.',
- Compare: 'Compare',
- Fingerprints: 'Fingerprints',
- Authentication: 'Authentication',
- Message: 'Message',
- Add_buddy: 'Add buddy',
- rename_buddy: 'rename buddy',
- delete_buddy: 'delete buddy',
- Login: 'Login',
- Username: 'Username',
- Password: 'Password',
- Cancel: 'Cancel',
- Connect: 'Connect',
- Type_in_the_full_username_: 'Type in the full username and an optional alias.',
- Alias: 'Alias',
- Add: 'Add',
- Subscription_request: 'Subscription request',
- You_have_a_request_from: 'You have a request from',
- Deny: 'Deny',
- Approve: 'Approve',
- Remove_buddy: 'Remove buddy',
- You_are_about_to_remove_: 'You are about to remove {{bid_name}} (<b>{{bid_jid}}</b>) from your buddy list. All related chats will be closed.',
- Continue_without_chat: 'Continue without chat',
- Please_wait: 'Please wait',
- Login_failed: 'Chat login failed',
- Sorry_we_cant_authentikate_: 'Authentication failed with the chat server. Maybe the password is wrong?',
- Retry: 'Back',
- clear_history: 'Clear history',
- New_message_from: 'New message from',
- Should_we_notify_you_: 'Should we notify you about new messages in the future?',
- Please_accept_: 'Please click the "Allow" button at the top.',
- Hide_offline: 'Hide offline contacts',
- Show_offline: 'Show offline contacts',
- About: 'About',
- dnd: 'Do Not Disturb',
- Mute: 'Mute',
- Unmute: 'Unmute',
- Subscription: 'Subscription',
- both: 'both',
- Status: 'Status',
- online: 'online',
- chat: 'chat',
- away: 'away',
- xa: 'extended away',
- offline: 'offline',
- none: 'none',
- Unknown_instance_tag: 'Unknown instance tag.',
- Not_one_of_our_latest_keys: 'Not one of our latest keys.',
- Received_an_unreadable_encrypted_message: 'Received an unreadable encrypted message.',
- Online: 'Online',
- Chatty: 'Chatty',
- Away: 'Away',
- Extended_away: 'Extended away',
- Offline: 'Offline',
- Friendship_request: 'Friendship request',
- Confirm: 'Confirm',
- Dismiss: 'Dismiss',
- Remove: 'Remove',
- Online_help: 'Online help',
- FN: 'Full name',
- N: ' ',
- FAMILY: 'Family name',
- GIVEN: 'Given name',
- NICKNAME: 'Nickname',
- URL: 'URL',
- ADR: 'Address',
- STREET: 'Street Address',
- EXTADD: 'Extended Address',
- LOCALITY: 'Locality',
- REGION: 'Region',
- PCODE: 'Postal Code',
- CTRY: 'Country',
- TEL: 'Telephone',
- NUMBER: 'Number',
- EMAIL: 'Email',
- USERID: ' ',
- ORG: 'Organization',
- ORGNAME: 'Name',
- ORGUNIT: 'Unit',
- TITLE: 'Job title',
- ROLE: 'Role',
- BDAY: 'Birthday',
- DESC: 'Description',
- PHOTO: ' ',
- send_message: 'Send message',
- get_info: 'Show information',
- Settings: 'Settings',
- Priority: 'Priority',
- Save: 'Save',
- User_settings: 'User settings',
- A_fingerprint_: 'A fingerprint is used to make sure that the person you are talking to is who he or she is saying.',
- Your_roster_is_empty_add_a: 'Your roster is empty, add a ',
- new_buddy: 'new buddy',
- is: 'is',
- Login_options: 'Login options',
- BOSH_url: 'BOSH URL',
- Domain: 'Domain',
- Resource: 'Resource',
- On_login: 'On login',
- Received_an_unencrypted_message: 'Received an unencrypted message',
- Sorry_your_buddy_doesnt_provide_any_information: 'Sorry, your buddy does not provide any information.',
- Info_about: 'Info about',
- Authentication_aborted: 'Authentication aborted.',
- Authentication_request_received: 'Authentication request received.',
- Do_you_want_to_display_them: 'Do you want to display them?',
- Log_in_without_chat: 'Log in without chat',
- has_come_online: 'has come online',
- Unknown_sender: 'Unknown sender',
- You_received_a_message_from_an_unknown_sender: 'You received a message from an unknown sender'
- },
- de: {
- Logging_in: 'Login läuft…',
- your_connection_is_unencrypted: 'Deine Verbindung ist UNverschlüsselt.',
- your_connection_is_encrypted: 'Deine Verbindung ist verschlüsselt.',
- your_buddy_closed_the_private_connection: 'Dein Freund hat die private Verbindung getrennt.',
- start_private: 'Privat starten',
- close_private: 'Privat abbrechen',
- your_buddy_is_verificated: 'Dein Freund ist verifiziert.',
- you_have_only_a_subscription_in_one_way: 'Die Freundschaft ist nur einseitig.',
- authentication_query_sent: 'Authentifizierungsanfrage gesendet.',
- your_message_wasnt_send_please_end_your_private_conversation: 'Deine Nachricht wurde nicht gesendet. Bitte beende die private Konversation.',
- unencrypted_message_received: 'Unverschlüsselte Nachricht erhalten.',
- your_message_wasnt_send_because_you_have_no_valid_subscription: 'Deine Nachricht wurde nicht gesandt, da die Freundschaft einseitig ist.',
- not_available: 'Nicht verfügbar.',
- no_connection: 'Keine Verbindung.',
- relogin: 'Neu anmelden.',
- trying_to_start_private_conversation: 'Versuche private Konversation zu starten.',
- Verified: 'Verifiziert',
- Unverified: 'Unverifiziert',
- private_conversation_started: 'Private Konversation gestartet.',
- private_conversation_aborted: 'Private Konversation abgebrochen.',
- your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Dein Freund hat die private Konversation beendet. Das solltest du auch tun!',
- conversation_is_now_verified: 'Konversation ist jetzt verifiziert',
- authentication_failed: 'Authentifizierung fehlgeschlagen.',
- your_buddy_is_attempting_to_determine_: 'Dein Freund versucht herauszufinden ob er wirklich mit dir redet.',
- to_authenticate_to_your_buddy: 'Um dich gegenüber deinem Freund zu verifizieren ',
- enter_the_answer_and_click_answer: 'gib die Antwort ein und klick auf Antworten.',
- enter_the_secret: 'gib das Geheimnis ein.',
- Creating_your_private_key_: 'Wir werden jetzt deinen privaten Schlüssel generieren. Das kann einige Zeit in Anspruch nehmen.',
- Authenticating_a_buddy_helps_: 'Einen Freund zu authentifizieren hilft sicher zustellen, dass die Person mit der du sprichst auch die ist die sie sagt.',
- How_do_you_want_to_authenticate_your_buddy: 'Wie willst du {{bid_name}} (<b>{{bid_jid}}</b>) authentifizieren?',
- Select_method: 'Wähle...',
- Manual: 'Manual',
- Question: 'Frage',
- Secret: 'Geheimnis',
- To_verify_the_fingerprint_: 'Um den Fingerprint zu verifizieren kontaktiere dein Freund über einen anderen Kommunikationsweg. Zum Beispiel per Telefonanruf.',
- Your_fingerprint: 'Dein Fingerprint',
- Buddy_fingerprint: 'Sein/Ihr Fingerprint',
- Close: 'Schließen',
- Compared: 'Verglichen',
- To_authenticate_using_a_question_: 'Um die Authentifizierung per Frage durchzuführen, wähle eine Frage bei welcher nur dein Freund die Antwort weiß.',
- Ask: 'Frage',
- To_authenticate_pick_a_secret_: 'Um deinen Freund zu authentifizieren, wähle ein Geheimnis welches nur deinem Freund und dir bekannt ist.',
- Compare: 'Vergleiche',
- Fingerprints: 'Fingerprints',
- Authentication: 'Authentifizierung',
- Message: 'Nachricht',
- Add_buddy: 'Freund hinzufügen',
- rename_buddy: 'Freund umbenennen',
- delete_buddy: 'Freund löschen',
- Login: 'Anmeldung',
- Username: 'Benutzername',
- Password: 'Passwort',
- Cancel: 'Abbrechen',
- Connect: 'Verbinden',
- Type_in_the_full_username_: 'Gib bitte den vollen Benutzernamen und optional ein Alias an.',
- Alias: 'Alias',
- Add: 'Hinzufügen',
- Subscription_request: 'Freundschaftsanfrage',
- You_have_a_request_from: 'Du hast eine Anfrage von',
- Deny: 'Ablehnen',
- Approve: 'Bestätigen',
- Remove_buddy: 'Freund entfernen',
- You_are_about_to_remove_: 'Du bist gerade dabei {{bid_name}} (<b>{{bid_jid}}</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.',
- Continue_without_chat: 'Weiter ohne Chat',
- Please_wait: 'Bitte warten',
- Login_failed: 'Chat-Anmeldung fehlgeschlagen',
- Sorry_we_cant_authentikate_: 'Der Chatserver hat die Anmeldung abgelehnt. Falsches Passwort?',
- Retry: 'Zurück',
- clear_history: 'Lösche Verlauf',
- New_message_from: 'Neue Nachricht von',
- Should_we_notify_you_: 'Sollen wir dich in Zukunft über eingehende Nachrichten informieren, auch wenn dieser Tab nicht im Vordergrund ist?',
- Please_accept_: 'Bitte klick auf den "Zulassen" Button oben.',
- Menu: 'Menü',
- Hide_offline: 'Offline ausblenden',
- Show_offline: 'Offline einblenden',
- About: 'Über',
- dnd: 'Beschäftigt',
- Mute: 'Ton aus',
- Unmute: 'Ton an',
- Subscription: 'Bezug',
- both: 'beidseitig',
- Status: 'Status',
- online: 'online',
- chat: 'chat',
- away: 'abwesend',
- xa: 'länger abwesend',
- offline: 'offline',
- none: 'keine',
- Unknown_instance_tag: 'Unbekannter instance tag.',
- Not_one_of_our_latest_keys: 'Nicht einer unserer letzten Schlüssel.',
- Received_an_unreadable_encrypted_message: 'Eine unlesbare verschlüsselte Nachricht erhalten.',
- Online: 'Online',
- Chatty: 'Gesprächig',
- Away: 'Abwesend',
- Extended_away: 'Länger abwesend',
- Offline: 'Offline',
- Friendship_request: 'Freundschaftsanfrage',
- Confirm: 'Bestätigen',
- Dismiss: 'Ablehnen',
- Remove: 'Löschen',
- Online_help: 'Online Hilfe',
- FN: 'Name',
- N: ' ',
- FAMILY: 'Familienname',
- GIVEN: 'Vorname',
- NICKNAME: 'Spitzname',
- URL: 'URL',
- ADR: 'Adresse',
- STREET: 'Straße',
- EXTADD: 'Zusätzliche Adresse',
- LOCALITY: 'Ortschaft',
- REGION: 'Region',
- PCODE: 'Postleitzahl',
- CTRY: 'Land',
- TEL: 'Telefon',
- NUMBER: 'Nummer',
- EMAIL: 'E-Mail',
- USERID: ' ',
- ORG: 'Organisation',
- ORGNAME: 'Name',
- ORGUNIT: 'Abteilung',
- TITLE: 'Titel',
- ROLE: 'Rolle',
- BDAY: 'Geburtstag',
- DESC: 'Beschreibung',
- PHOTO: ' ',
- send_message: 'Sende Nachricht',
- get_info: 'Benutzerinformationen',
- Settings: 'Einstellungen',
- Priority: 'Priorität',
- Save: 'Speichern',
- User_settings: 'Benutzereinstellungen',
- A_fingerprint_: 'Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.',
- Your_roster_is_empty_add_a: 'Deine Freundesliste ist leer, füge einen neuen Freund ',
- new_buddy: 'hinzu',
- is: 'ist',
- Login_options: 'Anmeldeoptionen',
- BOSH_url: 'BOSH url',
- Domain: 'Domain',
- Resource: 'Ressource',
- On_login: 'Beim Anmelden',
- Received_an_unencrypted_message: 'Unverschlüsselte Nachricht empfangen',
- Sorry_your_buddy_doesnt_provide_any_information: 'Dein Freund stellt leider keine Informationen bereit.',
- Info_about: 'Info über',
- Authentication_aborted: 'Authentifizierung abgebrochen.',
- Authentication_request_received: 'Authentifizierunganfrage empfangen.',
- Log_in_without_chat: 'Anmelden ohne Chat',
- Do_you_want_to_display_them: 'Möchtest du sie sehen?',
- has_come_online: 'ist online gekommen',
- Unknown_sender: 'Unbekannter Sender',
- You_received_a_message_from_an_unknown_sender: 'Du hast eine Nachricht von einem unbekannten Sender erhalten'
- },
- es: {
- Logging_in: 'Por favor, espere...',
- your_connection_is_unencrypted: 'Su conexión no está cifrada.',
- your_connection_is_encrypted: 'Su conexión está cifrada.',
- your_buddy_closed_the_private_connection: 'Su amigo ha cerrado la conexión privada.',
- start_private: 'Iniciar privado',
- close_private: 'Cerrar privado',
- your_buddy_is_verificated: 'Tu amigo está verificado.',
- you_have_only_a_subscription_in_one_way: 'Sólo tienes una suscripción de un modo.',
- authentication_query_sent: 'Consulta de verificación enviada.',
- your_message_wasnt_send_please_end_your_private_conversation: 'Su mensaje no fue enviado. Por favor, termine su conversación privada.',
- unencrypted_message_received: 'Mensaje no cifrado recibido:',
- your_message_wasnt_send_because_you_have_no_valid_subscription: 'Su mensaje no se ha enviado, porque usted no tiene suscripción válida.',
- not_available: 'No disponible',
- no_connection: 'Sin conexión!',
- relogin: 'iniciar sesión nuevamente',
- trying_to_start_private_conversation: 'Intentando iniciar una conversación privada!',
- Verified: 'Verificado',
- Unverified: 'No verificado',
- private_conversation_started: 'se inició una conversación privada.',
- private_conversation_aborted: 'Conversación privada abortada!',
- your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Su amigo cerró la conversación privada! Usted debería hacer lo mismo.',
- conversation_is_now_verified: 'La conversación es ahora verificada.',
- authentication_failed: 'Fallo la verificación.',
- your_buddy_is_attempting_to_determine_: 'Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.',
- to_authenticate_to_your_buddy: 'Para autenticar a su amigo, ',
- enter_the_answer_and_click_answer: 'introduce la respuesta y haga clic en Contestar.',
- enter_the_secret: 'especifique el secreto.',
- Creating_your_private_key_: 'Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.',
- Authenticating_a_buddy_helps_: 'Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.',
- How_do_you_want_to_authenticate_your_buddy: '¿Cómo desea autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?',
- Select_method: 'Escoja un método...',
- Manual: 'Manual',
- Question: 'Pregunta',
- Secret: 'Secreto',
- To_verify_the_fingerprint_: 'Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.',
- Your_fingerprint: 'Tu firma digital',
- Buddy_fingerprint: 'firma digital de tu amigo',
- Close: 'Cerrar',
- Compared: 'Comparado',
- To_authenticate_using_a_question_: 'Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.',
- Ask: 'Preguntar',
- To_authenticate_pick_a_secret_: 'Para autenticar, elija un secreto conocido sólo por usted y su amigo.',
- Compare: 'Comparar',
- Fingerprints: 'Firmas digitales',
- Authentication: 'Autenticación',
- Message: 'Mensaje',
- Add_buddy: 'Añadir amigo',
- rename_buddy: 'renombrar amigo',
- delete_buddy: 'eliminar amigo',
- Login: 'Iniciar Sesión',
- Username: 'Usuario',
- Password: 'Contraseña',
- Cancel: 'Cancelar',
- Connect: 'Conectar',
- Type_in_the_full_username_: 'Escriba el usuario completo y un alias opcional.',
- Alias: 'Alias',
- Add: 'Añadir',
- Subscription_request: 'Solicitud de suscripción',
- You_have_a_request_from: 'Tienes una petición de',
- Deny: 'Rechazar',
- Approve: 'Aprobar',
- Remove_buddy: 'Eliminar amigo',
- You_are_about_to_remove_: 'Vas a eliminar a {{bid_name}} (<b>{{bid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.',
- Continue_without_chat: 'Continuar',
- Please_wait: 'Espere por favor',
- Login_failed: 'Fallo el inicio de sesión',
- Sorry_we_cant_authentikate_: 'Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?',
- Retry: 'Reintentar',
- clear_history: 'Borrar el historial',
- New_message_from: 'Nuevo mensaje de',
- Should_we_notify_you_: '¿Debemos notificarle sobre nuevos mensajes en el futuro?',
- Please_accept_: 'Por favor, haga clic en el botón "Permitir" en la parte superior.',
- dnd: 'No Molestar',
- Mute: 'Desactivar sonido',
- Unmute: 'Activar sonido',
- Subscription: 'Suscripción',
- both: 'ambos',
- Status: 'Estado',
- online: 'en línea',
- chat: 'chat',
- away: 'ausente',
- xa: 'mas ausente',
- offline: 'desconectado',
- none: 'nadie',
- Unknown_instance_tag: 'Etiqueta de instancia desconocida.',
- Not_one_of_our_latest_keys: 'No de nuestra ultima tecla.',
- Received_an_unreadable_encrypted_message: 'Se recibió un mensaje cifrado ilegible.',
- Online: 'En linea',
- Chatty: 'Hablador',
- Away: 'Ausente',
- Extended_away: 'Mas ausente',
- Offline: 'Desconectado',
- Friendship_request: 'Solicitud de amistad',
- Confirm: 'Confirmar',
- Dismiss: 'Rechazar',
- Remove: 'Eliminar',
- Online_help: 'Ayuda en línea',
- FN: 'Nombre completo ',
- N: ' ',
- FAMILY: 'Apellido',
- GIVEN: 'Nombre',
- NICKNAME: 'Apodar',
- URL: 'URL',
- ADR: 'Dirección',
- STREET: 'Calle',
- EXTADD: 'Extendido dirección',
- LOCALITY: 'Población',
- REGION: 'Región',
- PCODE: 'Código postal',
- CTRY: 'País',
- TEL: 'Teléfono',
- NUMBER: 'Número',
- EMAIL: 'Emilio',
- USERID: ' ',
- ORG: 'Organización',
- ORGNAME: 'Nombre',
- ORGUNIT: 'Departamento',
- TITLE: 'Título',
- ROLE: 'Rol',
- BDAY: 'Cumpleaños',
- DESC: 'Descripción',
- PHOTO: ' ',
- send_message: 'mandar un texto',
- get_info: 'obtener información',
- Settings: 'Ajustes',
- Priority: 'Prioridad',
- Save: 'Guardar',
- User_settings: 'Configuración de usuario',
- A_fingerprint_: 'La huella digital se utiliza para que puedas estar seguro que la persona con la que estas hablando es quien realmente dice ser',
- Your_roster_is_empty_add_a: 'Tu lista de amigos esta vacia',
- new_buddy: 'Nuevo amigo',
- is: 'es',
- Login_options: 'Opciones de login',
- BOSH_url: 'BOSH url',
- Domain: 'Dominio',
- Resource: 'Recurso',
- On_login: 'Iniciar sesión',
- Received_an_unencrypted_message: 'Recibe un mensaje no cifrado'
- }
- };
-}(jQuery));
-
-/*!
- * jsxc v1.1.0 - 2015-02-08
- *
- * Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
- * Released under the MIT license
- *
- * Please see http://www.jsxc.org/
- *
- * @author Klaus Herberth <klaus@jsxc.org>
- * @version 1.1.0
- * @license MIT
- */
-
-/* global jsxc, Strophe, SDPUtil, getUserMediaWithConstraints, setupRTC, jQuery, MediaStreamTrack */
-
-var RTC = null, RTCPeerconnection = null;
-
-jsxc.gui.template.incomingCall = '<h3>%%Incoming_call%%</h3>\
- <p>%%Do_you_want_to_accept_the_call_from%% {{bid_name}}?</p>\
+jsxc.gui.template.incomingCall = '<h3 data-i18n="Incoming_call"></h3>\
+ <p><span data-i18n="Do_you_want_to_accept_the_call_from"></span> {{bid_name}}?</p>\
<p class="jsxc_right">\
- <a href="#" class="button jsxc_reject">%%Reject%%</a> <a href="#" class="button creation jsxc_accept">%%Accept%%</a>\
+ <a href="#" class="button jsxc_reject" data-i18n="Reject"></a> <a href="#" class="button creation jsxc_accept" data-i18n="Accept"></a>\
</p>';
-jsxc.gui.template.allowMediaAccess = '<p>%%Please_allow_access_to_microphone_and_camera%%</p>';
+jsxc.gui.template.allowMediaAccess = '<p data-i18n="Please_allow_access_to_microphone_and_camera"></p>';
jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
<div class="jsxc_chatarea">\
@@ -6288,22 +6082,22 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
<div class="jsxc_noRemoteVideo">\
<div>\
<div></div>\
- <p>%%No_video_signal%%</p>\
+ <p data-i18n="No_video_signal"></p>\
<div></div>\
</div>\
</div>\
</div>\
<div class="jsxc_controlbar">\
- <button type="button" class="jsxc_hangUp">%%hang_up%%</button>\
+ <button type="button" class="jsxc_hangUp" data-i18n="hang_up"></button>\
<input type="range" class="jsxc_volume" min="0.0" max="1.0" step="0.05" value="0.5" />\
<div class="jsxc_buttongroup">\
- <button type="button" class="jsxc_snapshot">%%snapshot%%</button><button type="button" class="jsxc_snapshots">&#9660;</button>\
+ <button type="button" class="jsxc_snapshot" data-i18n="snapshot"></button><button type="button" class="jsxc_snapshots">&#9660;</button>\
</div>\
- <!-- <button type="button" class="jsxc_mute_local">%%mute_my_audio%%</button>\
- <button type="button" class="jsxc_pause_local">%%pause_my_video%%</button> --> \
- <button type="button" class="jsxc_showchat">%%chat%%</button>\
- <button type="button" class="jsxc_fullscreen">%%fullscreen%%</button>\
- <button type="button" class="jsxc_info">%%Info%%</button>\
+ <!-- <button type="button" class="jsxc_mute_local" data-i18n="mute_my_audio"></button>\
+ <button type="button" class="jsxc_pause_local" data-i18n="pause_my_video"></button> --> \
+ <button type="button" class="jsxc_showchat" data-i18n="chat"></button>\
+ <button type="button" class="jsxc_fullscreen" data-i18n="fullscreen"></button>\
+ <button type="button" class="jsxc_info" data-i18n="Info"></button>\
</div>\
<div class="jsxc_multi">\
<div class="jsxc_snapshotbar">\
@@ -6316,9 +6110,6 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
</div>\
</div>';
-(function($) {
- "use strict";
-
/**
* WebRTC namespace for jsxc.
*
@@ -6484,7 +6275,7 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
return;
}
- var videoIcon = $('<div class="jsxc_video jsxc_disabled" title="' + jsxc.l.Start_video_call + '"></div>');
+ var videoIcon = $('<div class="jsxc_video jsxc_disabled" title="' + $.t("Start_video_call") + '"></div>');
videoIcon.click(function() {
self.startCall(data.jid);
@@ -6509,6 +6300,10 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
initWindow: function(event, win) {
var self = jsxc.webrtc;
+ if (win.hasClass('jsxc_groupchat')) {
+ return;
+ }
+
jsxc.debug('webrtc.initWindow');
if (!self.conn) {
@@ -6548,28 +6343,30 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
var targetRes = Strophe.getResourceFromJid(jid);
if (targetRes === null) {
- $.each(jsxc.storage.getUserItem('buddy', bid).res, function(index, val) {
+ $.each(jsxc.storage.getUserItem('buddy', bid).res || [], function(index, val) {
if (capableRes.indexOf(val) > -1) {
targetRes = val;
return false;
}
});
+
+ jid = jid + '/' + targetRes;
}
el.off('click');
if (capableRes.indexOf(targetRes) > -1) {
el.click(function() {
- self.startCall(jid + '/' + targetRes);
+ self.startCall(jid);
});
el.removeClass('jsxc_disabled');
- el.attr('title', jsxc.translate('%%Start video call%%'));
+ el.attr('title', $.t('Start_video_call'));
} else {
el.addClass('jsxc_disabled');
- el.attr('title', jsxc.translate('%%Video call not possible.%%'));
+ el.attr('title', $.t('Video_call_not_possible'));
}
},
@@ -6714,7 +6511,7 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
onMediaFailure: function(ev, err) {
this.setStatus('media failure');
- jsxc.gui.window.postMessage(jsxc.jidToBid(jsxc.webrtc.last_caller), 'sys', jsxc.translate('%%Media failure%%: ') + err.name);
+ jsxc.gui.window.postMessage(jsxc.jidToBid(jsxc.webrtc.last_caller), 'sys', $.t('Media_failure') + err.name);
jsxc.debug('media failure: ' + err.name);
},
@@ -6733,10 +6530,10 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
var sess = this.conn.jingle.sessions[sid];
var bid = jsxc.jidToBid(sess.peerjid);
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.translate('%%Incoming call.%%'));
+ jsxc.gui.window.postMessage(bid, 'sys', $.t('Incoming_call'));
// display notification
- jsxc.notification.notify(jsxc.translate('%%Incoming call%%'), jsxc.translate('%%from%% ' + bid));
+ jsxc.notification.notify($.t('Incoming_call'), $.t('from') + ' ' + bid);
// send signal to partner
sess.sendRinging();
@@ -6819,7 +6616,7 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
$(document).off('error.jingle');
jsxc.gui.dialog.close();
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.translate('%%Call terminated%%' + (reason ? (': %%' + reason + '%%') : '') + '.'));
+ jsxc.gui.window.postMessage(bid, 'sys', ($.t('Call_terminated') + (reason ? (': ' + $.t(reason)) : '') + '.'));
},
/**
@@ -6923,15 +6720,15 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
}
var text = '<p>';
- text += '<b>' + jsxc.translate('%%Local IP%%: ') + '</b>' + sess.local_ip + '<br />';
- text += '<b>' + jsxc.translate('%%Remote IP%%: ') + '</b>' + sess.remote_ip + '<br />';
- text += '<b>' + jsxc.translate('%%Local Fingerprint%%: ') + '</b>' + sess.local_fp + '<br />';
- text += '<b>' + jsxc.translate('%%Remote Fingerprint%%: ') + '</b>' + sess.remote_fp;
+ text += '<b>' + $.t('Local_IP') + ': </b>' + sess.local_ip + '<br />';
+ text += '<b>' + $.t('Remote_IP') + ': </b>' + sess.remote_ip + '<br />';
+ text += '<b>' + $.t('Local_Fingerprint') + ': </b>' + sess.local_fp + '<br />';
+ text += '<b>' + $.t('Remote_Fingerprint') + ': </b>' + sess.remote_fp;
text += '</p>';
$('#jsxc_dialog .jsxc_infobar').html(text);
} else if (iceCon === 'failed') {
- jsxc.gui.window.postMessage(jsxc.jidToBid(sess.peerjid), 'sys', jsxc.translate('%%ICE connection failure%%.'));
+ jsxc.gui.window.postMessage(jsxc.jidToBid(sess.peerjid), 'sys', $.t('ICE_connection_failure'));
$(document).off('cleanup.dialog.jsxc');
@@ -6973,7 +6770,7 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
'finish.mediaready.jsxc': function() {
self.setStatus('Initiate call');
- jsxc.gui.window.postMessage(jsxc.jidToBid(jid), 'sys', jsxc.translate('%%Call started.%%'));
+ jsxc.gui.window.postMessage(jsxc.jidToBid(jid), 'sys', $.t('Call_started'));
$(document).one('error.jingle', function(e, sid, error) {
if (error.source !== 'offer') {
@@ -7237,66 +7034,1117 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
}
});
- $.extend(jsxc.l10n.en, {
- Please_allow_access_to_microphone_and_camera: 'Please click the "Allow" button at the top, to allow access to microphone and camera.',
- Incoming_call: 'Incoming call',
- from: 'from',
- Do_you_want_to_accept_the_call_from: 'Do you want to accept the call from',
- Reject: 'Reject',
- Accept: 'Accept',
- hang_up: 'hang up',
- snapshot: 'snapshot',
- mute_my_audio: 'mute my audio',
- pause_my_video: 'pause my video',
- fullscreen: 'fullscreen',
- Info: 'Info',
- Local_IP: 'Local IP',
- Remote_IP: 'Remote IP',
- Local_Fingerprint: 'Local fingerprint',
- Remote_Fingerprint: 'Remote fingerprint',
- Video_call_not_possible: 'Video call not possible. Your buddy does not support video calls.',
- Start_video_call: 'Start video call'
- });
- $.extend(jsxc.l10n.de, {
- Please_allow_access_to_microphone_and_camera: 'Bitte klick auf den "Zulassen" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.',
- Incoming_call: 'Eingehender Anruf',
- from: 'von',
- Do_you_want_to_accept_the_call_from: 'Möchtest Du den Anruf annehmen von',
- Reject: 'Ablehnen',
- Accept: 'Annehmen',
- hang_up: 'Auflegen',
- snapshot: 'Schnappschuss',
- mute_my_audio: 'Mein Ton aus',
- pause_my_video: 'Mein Video pausieren',
- fullscreen: 'Vollbild',
- Info: 'Info',
- Local_IP: 'Lokale IP',
- Remote_IP: 'Remote IP',
- Local_Fingerprint: 'Lokaler Fingerprint',
- Remote_Fingerprint: 'Remote Fingerprint',
- Video_call_not_possible: 'Videoanruf nicht verfügbar. Dein Gesprächspartner unterstützt keine Videotelefonie.',
- Start_video_call: 'Starte Videoanruf'
- });
+/**
+ * Handle XMPP stuff.
+ *
+ * @namespace jsxc.xmpp
+ */
+jsxc.xmpp = {
+ conn: null, // connection
- $.extend(jsxc.l10n.es, {
- Please_allow_access_to_microphone_and_camera: 'Por favor, permitir el acceso al micrófono y la cámara.',
- Incoming_call: 'Llamada entrante',
- from: 'de',
- Do_you_want_to_accept_the_call_from: 'Desea aceptar la llamada de',
- Reject: 'Rechazar',
- Accept: 'Aceptar',
- hang_up: 'colgar',
- snapshot: 'instantánea',
- mute_my_audio: 'silenciar mi audio',
- pause_my_video: 'pausar mi vídeo',
- fullscreen: 'pantalla completa',
- Info: 'Info',
- Local_IP: 'IP local',
- Remote_IP: 'IP remota',
- Local_Fingerprint: 'Firma digital local',
- Remote_Fingerprint: 'Firma digital remota',
- Video_call_not_possible: 'Llamada de vídeo no es posible',
- Start_video_call: 'Iniciar llamada de vídeo'
- });
-}(jQuery));
+ /**
+ * Create new connection or attach to old
+ *
+ * @name login
+ * @memberOf jsxc.xmpp
+ */
+ /**
+ * Create new connection with given parameters.
+ *
+ * @name login^2
+ * @param {string} jid
+ * @param {string} password
+ * @memberOf jsxc.xmpp
+ */
+ /**
+ * Attach connection with given parameters.
+ *
+ * @name login^3
+ * @param {string} jid
+ * @param {string} sid
+ * @param {string} rid
+ * @memberOf jsxc.xmpp
+ */
+ login: function() {
+
+ if (jsxc.xmpp.conn && jsxc.xmpp.conn.connected) {
+ return;
+ }
+
+ var jid = null, password = null, sid = null, rid = null;
+
+ switch (arguments.length) {
+ case 2:
+ jid = arguments[0];
+ password = arguments[1];
+ break;
+ case 3:
+ jid = arguments[0];
+ sid = arguments[1];
+ rid = arguments[2];
+ break;
+ default:
+ sid = jsxc.storage.getItem('sid');
+ rid = jsxc.storage.getItem('rid');
+
+ if (sid !== null && rid !== null) {
+ jid = jsxc.storage.getItem('jid');
+ } else {
+ sid = null;
+ rid = null;
+ jid = jsxc.options.xmpp.jid;
+ }
+ }
+
+ var url = jsxc.options.get('xmpp').url;
+
+ // Register eventlistener
+ $(document).on('connected.jsxc', jsxc.xmpp.connected);
+ $(document).on('attached.jsxc', jsxc.xmpp.attached);
+ $(document).on('disconnected.jsxc', jsxc.xmpp.disconnected);
+ $(document).on('ridChange', jsxc.xmpp.onRidChange);
+ $(document).on('connfail.jsxc', jsxc.xmpp.onConnfail);
+ $(document).on('authfail.jsxc', jsxc.xmpp.onAuthFail);
+
+ Strophe.addNamespace('RECEIPTS', 'urn:xmpp:receipts');
+
+ // Create new connection (no login)
+ jsxc.xmpp.conn = new Strophe.Connection(url);
+
+ // Override default function to preserve unique id
+ var stropheGetUniqueId = jsxc.xmpp.conn.getUniqueId;
+ jsxc.xmpp.conn.getUniqueId = function(suffix) {
+ var uid = stropheGetUniqueId.call(jsxc.xmpp.conn, suffix);
+ jsxc.storage.setItem('_uniqueId', jsxc.xmpp.conn._uniqueId);
+
+ return uid;
+ };
+
+ if (jsxc.storage.getItem('debug') === true) {
+ jsxc.xmpp.conn.xmlInput = function(data) {
+ console.log('<', data);
+ };
+ jsxc.xmpp.conn.xmlOutput = function(data) {
+ console.log('>', data);
+ };
+ }
+
+ var callback = function(status, condition) {
+
+ jsxc.debug(Object.getOwnPropertyNames(Strophe.Status)[status] + ': ' + condition);
+
+ switch (status) {
+ case Strophe.Status.CONNECTED:
+ jsxc.bid = jsxc.jidToBid(jsxc.xmpp.conn.jid.toLowerCase());
+ $(document).trigger('connected.jsxc');
+ break;
+ case Strophe.Status.ATTACHED:
+ $(document).trigger('attached.jsxc');
+ break;
+ case Strophe.Status.DISCONNECTED:
+ $(document).trigger('disconnected.jsxc');
+ break;
+ case Strophe.Status.CONNFAIL:
+ $(document).trigger('connfail.jsxc');
+ break;
+ case Strophe.Status.AUTHFAIL:
+ $(document).trigger('authfail.jsxc');
+ break;
+ }
+ };
+
+ if (jsxc.xmpp.conn.caps) {
+ jsxc.xmpp.conn.caps.node = 'http://jsxc.org/';
+ }
+
+ if (jsxc.restore && sid && rid) {
+ jsxc.debug('Try to attach');
+ jsxc.debug('SID: ' + sid);
+ jsxc.xmpp.conn.attach(jid, sid, rid, callback);
+ } else {
+ jsxc.debug('New connection');
+
+ if (jsxc.xmpp.conn.caps) {
+ // Add system handler, because user handler isn't called before
+ // we are authenticated
+ jsxc.xmpp.conn._addSysHandler(function(stanza) {
+ var from = jsxc.xmpp.conn.domain, c = stanza.querySelector('c'), ver = c.getAttribute('ver'), node = c.getAttribute('node');
+
+ var _jidNodeIndex = JSON.parse(localStorage.getItem('strophe.caps._jidNodeIndex')) || {};
+
+ jsxc.xmpp.conn.caps._jidVerIndex[from] = ver;
+ _jidNodeIndex[from] = node;
+
+ localStorage.setItem('strophe.caps._jidVerIndex', JSON.stringify(jsxc.xmpp.conn.caps._jidVerIndex));
+ localStorage.setItem('strophe.caps._jidNodeIndex', JSON.stringify(_jidNodeIndex));
+ }, Strophe.NS.CAPS);
+ }
+
+ jsxc.xmpp.conn.connect(jid || jsxc.options.xmpp.jid, password || jsxc.options.xmpp.password, callback);
+ }
+ },
+
+ /**
+ * Logs user out of his xmpp session and does some clean up.
+ *
+ * @param {boolean} complete If set to false, roster will not be removed
+ * @returns {Boolean}
+ */
+ logout: function(complete) {
+
+ // instruct all tabs
+ jsxc.storage.removeItem('sid');
+
+ // clean up
+ jsxc.storage.removeUserItem('buddylist');
+ jsxc.storage.removeUserItem('windowlist');
+ jsxc.storage.removeItem('_uniqueId');
+
+ if (!jsxc.master) {
+ $('#jsxc_roster').remove();
+ $('#jsxc_windowlist').remove();
+ return true;
+ }
+
+ if (jsxc.xmpp.conn === null) {
+ return true;
+ }
+
+ // Hide dropdown menu
+ $('body').click();
+
+ jsxc.triggeredFromElement = (typeof complete === 'boolean')? complete : true;
+
+ // restore all otr objects
+ $.each(jsxc.storage.getUserItem('otrlist') || {}, function(i, val) {
+ jsxc.otr.create(val);
+ });
+
+ var numOtr = Object.keys(jsxc.otr.objects || {}).length + 1;
+ var disReady = function() {
+ if (--numOtr <= 0) {
+ jsxc.xmpp.conn.flush();
+
+ setTimeout(function() {
+ jsxc.xmpp.conn.disconnect();
+ }, 600);
+ }
+ };
+
+ // end all private conversations
+ $.each(jsxc.otr.objects || {}, function(key, obj) {
+ if (obj.msgstate === OTR.CONST.MSGSTATE_ENCRYPTED) {
+ obj.endOtr.call(obj, function() {
+ obj.init.call(obj);
+ jsxc.otr.backup(key);
+
+ disReady();
+ });
+ } else {
+ disReady();
+ }
+ });
+
+ disReady();
+
+ // Trigger real logout in jsxc.xmpp.disconnected()
+ return false;
+ },
+
+ /**
+ * Triggered if connection is established
+ *
+ * @private
+ */
+ connected: function() {
+
+ jsxc.xmpp.conn.pause();
+
+ var nomJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid).toLowerCase() + '/' + Strophe.getResourceFromJid(jsxc.xmpp.conn.jid);
+
+ // Save sid and jid
+ jsxc.storage.setItem('sid', jsxc.xmpp.conn._proto.sid);
+ jsxc.storage.setItem('jid', nomJid);
+
+ jsxc.storage.setItem('lastActivity', (new Date()).getTime());
+
+ // make shure roster will be reloaded
+ jsxc.storage.removeUserItem('buddylist');
+
+ jsxc.storage.removeUserItem('windowlist');
+ jsxc.storage.removeUserItem('own');
+ jsxc.storage.removeUserItem('avatar', 'own');
+ jsxc.storage.removeUserItem('otrlist');
+
+ if (jsxc.options.loginForm.triggered) {
+ switch (jsxc.options.loginForm.onConnected || 'submit') {
+ case 'submit':
+ jsxc.submitLoginForm();
+ /* falls through */
+ case false:
+ jsxc.xmpp.connectionReady();
+ return;
+ }
+ }
+
+ // start chat
+
+ jsxc.gui.init();
+ $('#jsxc_roster').removeClass('jsxc_noConnection');
+ jsxc.onMaster();
+ jsxc.xmpp.conn.resume();
+ jsxc.gui.dialog.close();
+ $(document).trigger('attached.jsxc');
+ },
+
+ /**
+ * Triggered if connection is attached
+ *
+ * @private
+ */
+ attached: function() {
+
+ jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged, 'jabber:iq:roster', 'iq', 'set');
+ jsxc.xmpp.conn.addHandler(jsxc.xmpp.onMessage, null, 'message', 'chat');
+ jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived, null, 'message');
+ jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence, null, 'presence');
+
+ var caps = jsxc.xmpp.conn.caps;
+ var domain = jsxc.xmpp.conn.domain;
+
+ if (caps && jsxc.options.get('carbons').enable) {
+ var conditionalEnable = function() {
+ if (jsxc.xmpp.conn.caps.hasFeatureByJid(domain, jsxc.CONST.NS.CARBONS)) {
+ jsxc.xmpp.carbons.enable();
+ }
+ };
+
+ if (typeof caps._knownCapabilities[caps._jidVerIndex[domain]] === 'undefined') {
+ var _jidNodeIndex = JSON.parse(localStorage.getItem('strophe.caps._jidNodeIndex')) || {};
+
+ $(document).on('caps.strophe', function onCaps(ev, from) {
+
+ if (from !== domain) {
+ return;
+ }
+
+ conditionalEnable();
+
+ $(document).off('caps.strophe', onCaps);
+ });
+
+ caps._requestCapabilities(jsxc.xmpp.conn.domain, _jidNodeIndex[domain], caps._jidVerIndex[domain]);
+ } else {
+ // We know server caps
+ conditionalEnable();
+ }
+ }
+
+ // Only load roaster if necessary
+ if (!jsxc.restore || !jsxc.storage.getUserItem('buddylist')) {
+ // in order to not overide existing presence information, we send
+ // pres first after roster is ready
+ $(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres);
+
+ $('#jsxc_roster > p:first').remove();
+
+ var iq = $iq({
+ type: 'get'
+ }).c('query', {
+ xmlns: 'jabber:iq:roster'
+ });
+
+ jsxc.xmpp.conn.sendIQ(iq, jsxc.xmpp.onRoster);
+ } else {
+ jsxc.xmpp.sendPres();
+ }
+
+ jsxc.xmpp.connectionReady();
+ },
+
+ /**
+ * Triggered if the connection is ready
+ */
+ connectionReady: function() {
+
+ // Load saved unique id
+ jsxc.xmpp.conn._uniqueId = jsxc.storage.getItem('_uniqueId') || new Date().getTime();
+
+ $(document).trigger('connectionReady.jsxc');
+ },
+
+ /**
+ * Sends presence stanza to server.
+ */
+ sendPres: function() {
+ // disco stuff
+ if (jsxc.xmpp.conn.disco) {
+ jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC');
+ jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO);
+ jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS);
+ }
+
+ // create presence stanza
+ var pres = $pres();
+
+ if (jsxc.xmpp.conn.caps) {
+ // attach caps
+ pres.c('c', jsxc.xmpp.conn.caps.generateCapsAttrs()).up();
+ }
+
+ var presState = jsxc.storage.getUserItem('presence') || 'online';
+ if (presState !== 'online') {
+ pres.c('show').t(presState).up();
+ }
+
+ var priority = jsxc.options.get('priority');
+ if (priority && typeof priority[presState] !== 'undefined' && parseInt(priority[presState]) !== 0) {
+ pres.c('priority').t(priority[presState]).up();
+ }
+
+ jsxc.debug('Send presence', pres.toString());
+ jsxc.xmpp.conn.send(pres);
+ },
+
+ /**
+ * Triggered if lost connection
+ *
+ * @private
+ */
+ disconnected: function() {
+ jsxc.debug('disconnected');
+
+ jsxc.storage.removeItem('sid');
+ jsxc.storage.removeItem('rid');
+ jsxc.storage.removeItem('lastActivity');
+ jsxc.storage.removeItem('hidden');
+ jsxc.storage.removeUserItem('avatar', 'own');
+ jsxc.storage.removeUserItem('otrlist');
+
+ $(document).off('connected.jsxc', jsxc.xmpp.connected);
+ $(document).off('attached.jsxc', jsxc.xmpp.attached);
+ $(document).off('disconnected.jsxc', jsxc.xmpp.disconnected);
+ $(document).off('ridChange', jsxc.xmpp.onRidChange);
+ $(document).off('connfail.jsxc', jsxc.xmpp.onConnfail);
+ $(document).off('authfail.jsxc', jsxc.xmpp.onAuthFail);
+
+ jsxc.xmpp.conn = null;
+
+ $('#jsxc_windowList').remove();
+
+ if (jsxc.triggeredFromElement) {
+ $(document).trigger('toggle.roster.jsxc', [ 'hidden', 0 ]);
+ $('#jsxc_roster').remove();
+
+ if (jsxc.triggeredFromLogout) {
+ window.location = jsxc.options.logoutElement.attr('href');
+ }
+ } else {
+ jsxc.gui.roster.noConnection();
+ }
+
+ window.clearInterval(jsxc.keepalive);
+ },
+
+ /**
+ * Triggered on connection fault
+ *
+ * @param {String} condition information why we lost the connection
+ * @private
+ */
+ onConnfail: function(ev, condition) {
+ jsxc.debug('XMPP connection failed: ' + condition);
+
+ if (jsxc.options.loginForm.triggered) {
+ jsxc.submitLoginForm();
+ }
+ },
+
+ /**
+ * Triggered on auth fail.
+ *
+ * @private
+ */
+ onAuthFail: function() {
+ if (jsxc.options.loginForm.triggered) {
+ switch (jsxc.options.loginForm.onAuthFail || 'ask') {
+ case 'ask':
+ jsxc.gui.showAuthFail();
+ break;
+ case 'submit':
+ jsxc.submitLoginForm();
+ break;
+ }
+ }
+
+ if (jsxc.triggeredFromBox) {
+ jsxc.gui.showAuthFail();
+ }
+ },
+
+ /**
+ * Triggered on initial roster load
+ *
+ * @param {dom} iq
+ * @private
+ */
+ onRoster: function(iq) {
+ /*
+ * <iq from='' type='get' id=''> <query xmlns='jabber:iq:roster'> <item
+ * jid='' name='' subscription='' /> ... </query> </iq>
+ */
+
+ jsxc.debug('Load roster', iq);
+
+ var buddies = [];
+
+ $(iq).find('item').each(function() {
+ var jid = $(this).attr('jid');
+ var name = $(this).attr('name') || jid;
+ var bid = jsxc.jidToBid(jid);
+ var sub = $(this).attr('subscription');
+
+ buddies.push(bid);
+
+ jsxc.storage.removeUserItem('res', bid);
+
+ jsxc.storage.saveBuddy(bid, {
+ jid: jid,
+ name: name,
+ status: 0,
+ sub: sub,
+ res: []
+ });
+
+ jsxc.gui.roster.add(bid);
+ });
+
+ if (buddies.length === 0) {
+ jsxc.gui.roster.empty();
+ }
+
+ jsxc.storage.setUserItem('buddylist', buddies);
+
+ jsxc.debug('Roster loaded');
+ $(document).trigger('cloaded.roster.jsxc');
+ },
+
+ /**
+ * Triggerd on roster changes
+ *
+ * @param {dom} iq
+ * @returns {Boolean} True to preserve handler
+ * @private
+ */
+ onRosterChanged: function(iq) {
+ /*
+ * <iq from='' type='set' id=''> <query xmlns='jabber:iq:roster'> <item
+ * jid='' name='' subscription='' /> </query> </iq>
+ */
+
+ jsxc.debug('onRosterChanged', iq);
+
+ $(iq).find('item').each(function() {
+ var jid = $(this).attr('jid');
+ var name = $(this).attr('name') || jid;
+ var bid = jsxc.jidToBid(jid);
+ var sub = $(this).attr('subscription');
+ // var ask = $(this).attr('ask');
+
+ if (sub === 'remove') {
+ jsxc.gui.roster.purge(bid);
+ } else {
+ var bl = jsxc.storage.getUserItem('buddylist');
+
+ if (bl.indexOf(bid) < 0) {
+ bl.push(bid); // (INFO) push returns the new length
+ jsxc.storage.setUserItem('buddylist', bl);
+ }
+
+ var temp = jsxc.storage.saveBuddy(bid, {
+ jid: jid,
+ name: name,
+ sub: sub
+ });
+
+ if (temp === 'updated') {
+
+ jsxc.gui.update(bid);
+ jsxc.gui.roster.reorder(bid);
+ } else {
+ jsxc.gui.roster.add(bid);
+ }
+ }
+
+ // Remove pending friendship request from notice list
+ if (sub === 'from' || sub === 'both') {
+ var notices = jsxc.storage.getUserItem('notices');
+ var noticeKey = null, notice;
+
+ for (noticeKey in notices) {
+ notice = notices[noticeKey];
+
+ if (notice.fnName === 'gui.showApproveDialog' && notice.fnParams[0] === jid) {
+ jsxc.debug('Remove notice with key ' + noticeKey);
+
+ jsxc.notice.remove(noticeKey);
+ }
+ }
+ }
+ });
+
+ if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) {
+ jsxc.gui.roster.empty();
+ } else {
+ $('#jsxc_roster > p:first').remove();
+ }
+
+ // preserve handler
+ return true;
+ },
+
+ /**
+ * Triggered on incoming presence stanzas
+ *
+ * @param {dom} presence
+ * @private
+ */
+ onPresence: function(presence) {
+ /*
+ * <presence xmlns='jabber:client' type='unavailable' from='' to=''/>
+ *
+ * <presence xmlns='jabber:client' from='' to=''> <priority>5</priority>
+ * <c xmlns='http://jabber.org/protocol/caps'
+ * node='http://psi-im.org/caps' ver='caps-b75d8d2b25' ext='ca cs
+ * ep-notify-2 html'/> </presence>
+ *
+ * <presence xmlns='jabber:client' from='' to=''> <show>chat</show>
+ * <status></status> <priority>5</priority> <c
+ * xmlns='http://jabber.org/protocol/caps' node='http://psi-im.org/caps'
+ * ver='caps-b75d8d2b25' ext='ca cs ep-notify-2 html'/> </presence>
+ */
+ jsxc.debug('onPresence', presence);
+
+ var ptype = $(presence).attr('type');
+ var from = $(presence).attr('from');
+ var jid = Strophe.getBareJidFromJid(from).toLowerCase();
+ var r = Strophe.getResourceFromJid(from);
+ var bid = jsxc.jidToBid(jid);
+ var data = jsxc.storage.getUserItem('buddy', bid);
+ var res = jsxc.storage.getUserItem('res', bid) || {};
+ var status = null;
+ var xVCard = $(presence).find('x[xmlns="vcard-temp:x:update"]');
+
+ if (jid === Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))) {
+ return true;
+ }
+
+ if (ptype === 'error') {
+ $(document).trigger('error.presence.jsxc', [ from, presence ]);
+
+ jsxc.error('[XMPP] ' + $(presence).attr('code'));
+ return true;
+ }
+
+ // incoming friendship request
+ if (ptype === 'subscribe') {
+ jsxc.storage.setUserItem('friendReq', {
+ jid: jid,
+ approve: -1
+ });
+ jsxc.notice.add($.t('Friendship_request'), $.t('from') + ' ' + jid, 'gui.showApproveDialog', [ jid ]);
+
+ return true;
+ } else if (ptype === 'unavailable' || ptype === 'unsubscribed') {
+ status = jsxc.CONST.STATUS.indexOf('offline');
+ } else {
+ var show = $(presence).find('show').text();
+ if (show === '') {
+ status = jsxc.CONST.STATUS.indexOf('online');
+ } else {
+ status = jsxc.CONST.STATUS.indexOf(show);
+ }
+ }
+
+ if (status === 0) {
+ delete res[r];
+ } else {
+ res[r] = status;
+ }
+
+ var maxVal = [];
+ var max = 0, prop = null;
+ for (prop in res) {
+ if (res.hasOwnProperty(prop)) {
+ if (max <= res[prop]) {
+ if (max !== res[prop]) {
+ maxVal = [];
+ max = res[prop];
+ }
+ maxVal.push(prop);
+ }
+ }
+ }
+
+ if (data.status === 0 && max > 0) {
+ // buddy has come online
+ jsxc.notification.notify({
+ title: data.name,
+ msg: $.t('has_come_online'),
+ source: bid
+ });
+ }
+
+ data.status = max;
+ data.res = maxVal;
+ data.jid = jid;
+
+ // Looking for avatar
+ if (xVCard.length > 0) {
+ var photo = xVCard.find('photo');
+
+ if (photo.length > 0 && photo.text() !== data.avatar) {
+ jsxc.storage.removeUserItem('avatar', data.avatar);
+ data.avatar = photo.text();
+ }
+ }
+
+ // Reset jid
+ if (jsxc.gui.window.get(bid).length > 0) {
+ jsxc.gui.window.get(bid).data('jid', jid);
+ }
+
+ jsxc.storage.setUserItem('buddy', bid, data);
+ jsxc.storage.setUserItem('res', bid, res);
+
+ jsxc.debug('Presence (' + from + '): ' + status);
+
+ jsxc.gui.update(bid);
+ jsxc.gui.roster.reorder(bid);
+
+ $(document).trigger('presence.jsxc', [ from, status, presence ]);
+
+ // preserve handler
+ return true;
+ },
+
+ /**
+ * Triggered on incoming message stanzas
+ *
+ * @param {dom} presence
+ * @returns {Boolean}
+ * @private
+ */
+ onMessage: function(stanza) {
+
+ var forwarded = $(stanza).find('forwarded[xmlns="' + jsxc.CONST.NS.FORWARD + '"]');
+ var message, carbon;
+
+ if (forwarded.length > 0) {
+ message = forwarded.find('> message');
+ forwarded = true;
+ carbon = $(stanza).find('> [xmlns="' + jsxc.CONST.NS.CARBONS + '"]');
+
+ if (carbon.length === 0) {
+ carbon = false;
+ }
+
+ jsxc.debug('Incoming forwarded message', message);
+ } else {
+ message = stanza;
+ forwarded = false;
+ carbon = false;
+
+ jsxc.debug('Incoming message', message);
+ }
+
+ var body = $(message).find('body:first').text();
+
+ if (!body || (body.match(/\?OTR/i) && forwarded)) {
+ return true;
+ }
+
+ var type = $(message).attr('type');
+ var from = $(message).attr('from');
+ var mid = $(message).attr('id');
+ var bid;
+
+ var delay = $(message).find('delay[xmlns="urn:xmpp:delay"]');
+
+ var stamp = (delay.length > 0) ? new Date(delay.attr('stamp')) : new Date();
+ stamp = stamp.getTime();
+
+ if (carbon) {
+ var direction = (carbon.prop("tagName") === 'sent') ? 'out' : 'in';
+ bid = jsxc.jidToBid((direction === 'out') ? $(message).attr('to') : from);
+
+ jsxc.gui.window.postMessage(bid, direction, body, false, forwarded, stamp);
+
+ return true;
+
+ } else if (forwarded) {
+ // Someone forwarded a message to us
+
+ body = from + ' ' + $.t('to') + ' ' + $(stanza).attr('to') + '"' + body + '"';
+
+ from = $(stanza).attr('from');
+ }
+
+ var jid = Strophe.getBareJidFromJid(from);
+ bid = jsxc.jidToBid(jid);
+ var data = jsxc.storage.getUserItem('buddy', bid);
+ var request = $(message).find("request[xmlns='urn:xmpp:receipts']");
+
+ if (data === null) {
+ // jid not in roster
+
+ var chat = jsxc.storage.getUserItem('chat', bid) || [];
+
+ if (chat.length === 0) {
+ jsxc.notice.add($.t('Unknown_sender'), $.t('You_received_a_message_from_an_unknown_sender') + ' (' + bid + ').', 'gui.showUnknownSender', [ bid ]);
+ }
+
+ var msg = jsxc.removeHTML(body);
+ msg = jsxc.escapeHTML(msg);
+
+ jsxc.storage.saveMessage(bid, 'in', msg, false, forwarded, stamp);
+
+ return true;
+ }
+
+ var win = jsxc.gui.window.init(bid);
+
+ // If we now the full jid, we use it
+ if (type === 'chat') {
+ win.data('jid', from);
+ jsxc.storage.updateUserItem('buddy', bid, {
+ jid: from
+ });
+ }
+
+ $(document).trigger('message.jsxc', [ from, body ]);
+
+ // create related otr object
+ if (jsxc.master && !jsxc.otr.objects[bid]) {
+ jsxc.otr.create(bid);
+ }
+
+ if (!forwarded && mid !== null && request.length && data !== null && (data.sub === 'both' || data.sub === 'from') && type === 'chat') {
+ // Send received according to XEP-0184
+ jsxc.xmpp.conn.send($msg({
+ to: from
+ }).c('received', {
+ xmlns: 'urn:xmpp:receipts',
+ id: mid
+ }));
+ }
+
+ if (jsxc.otr.objects.hasOwnProperty(bid)) {
+ jsxc.otr.objects[bid].receiveMsg(body, {
+ stamp: stamp,
+ forwarded: forwarded
+ });
+ } else {
+ jsxc.gui.window.postMessage(bid, 'in', body, false, forwarded, stamp);
+ }
+
+ // preserve handler
+ return true;
+ },
+
+ /**
+ * Triggerd if the rid changed
+ *
+ * @param {event} ev
+ * @param {obejct} data
+ * @private
+ */
+ onRidChange: function(ev, data) {
+ jsxc.storage.setItem('rid', data.rid);
+ },
+
+ /**
+ * response to friendship request
+ *
+ * @param {string} from jid from original friendship req
+ * @param {boolean} approve
+ */
+ resFriendReq: function(from, approve) {
+ if (jsxc.master) {
+ jsxc.xmpp.conn.send($pres({
+ to: from,
+ type: (approve) ? 'subscribed' : 'unsubscribed'
+ }));
+
+ jsxc.storage.removeUserItem('friendReq');
+ jsxc.gui.dialog.close();
+
+ } else {
+ jsxc.storage.updateUserItem('friendReq', 'approve', approve);
+ }
+ },
+
+ /**
+ * Add buddy to my friends
+ *
+ * @param {string} username jid
+ * @param {string} alias
+ */
+ addBuddy: function(username, alias) {
+ var bid = jsxc.jidToBid(username);
+
+ if (jsxc.master) {
+ // add buddy to roster (trigger onRosterChanged)
+ var iq = $iq({
+ type: 'set'
+ }).c('query', {
+ xmlns: 'jabber:iq:roster'
+ }).c('item', {
+ jid: username,
+ name: alias || ''
+ });
+ jsxc.xmpp.conn.sendIQ(iq);
+
+ // send subscription request to buddy (trigger onRosterChanged)
+ jsxc.xmpp.conn.send($pres({
+ to: username,
+ type: 'subscribe'
+ }));
+
+ jsxc.storage.removeUserItem('add_' + bid);
+ } else {
+ jsxc.storage.setUserItem('add_' + bid, {
+ username: username,
+ alias: alias || null
+ });
+ }
+ },
+
+ /**
+ * Remove buddy from my friends
+ *
+ * @param {type} jid
+ */
+ removeBuddy: function(jid) {
+ var bid = jsxc.jidToBid(jid);
+
+ // Shortcut to remove buddy from roster and cancle all subscriptions
+ var iq = $iq({
+ type: 'set'
+ }).c('query', {
+ xmlns: 'jabber:iq:roster'
+ }).c('item', {
+ jid: Strophe.getBareJidFromJid(jid),
+ subscription: 'remove'
+ });
+ jsxc.xmpp.conn.sendIQ(iq);
+
+ jsxc.gui.roster.purge(bid);
+ },
+
+ onReceived: function(message) {
+ var from = $(message).attr('from');
+ var jid = Strophe.getBareJidFromJid(from);
+ var bid = jsxc.jidToBid(jid);
+ var received = $(message).find("received[xmlns='urn:xmpp:receipts']");
+
+ if (received.length) {
+ var receivedId = received.attr('id').replace(/:/, '-');
+ var chat = jsxc.storage.getUserItem('chat', bid);
+ var i;
+
+ for (i = chat.length - 1; i >= 0; i--) {
+ if (chat[i].uid === receivedId) {
+ chat[i].received = true;
+
+ $('#' + receivedId).addClass('jsxc_received');
+
+ jsxc.storage.setUserItem('chat', bid, chat);
+ break;
+ }
+ }
+ }
+
+ return true;
+ },
+
+ /**
+ * Public function to send message.
+ *
+ * @memberOf jsxc.xmpp
+ * @param bid css jid of user
+ * @param msg message
+ * @param uid unique id
+ */
+ sendMessage: function(bid, msg, uid) {
+ if (jsxc.otr.objects.hasOwnProperty(bid)) {
+ jsxc.otr.objects[bid].sendMsg(msg, uid);
+ } else {
+ jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data('jid'), msg, uid);
+ }
+ },
+
+ /**
+ * Create message stanza and send it.
+ *
+ * @memberOf jsxc.xmpp
+ * @param jid Jabber id
+ * @param msg Message
+ * @param uid unique id
+ * @private
+ */
+ _sendMessage: function(jid, msg, uid) {
+ var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid)) || {};
+ var isBar = (Strophe.getBareJidFromJid(jid) === jid);
+ var type = data.type || 'chat';
+
+ var xmlMsg = $msg({
+ to: jid,
+ type: type,
+ id: uid
+ }).c('body').t(msg);
+
+ if (jsxc.xmpp.carbons.enabled && msg.match(/^\?OTR/)) {
+ xmlMsg.up().c("private", {
+ xmlns: jsxc.CONST.NS.CARBONS
+ });
+ }
+
+ if (type === 'chat' && (isBar || jsxc.xmpp.conn.caps.hasFeatureByJid(jid, Strophe.NS.RECEIPTS))) {
+ // Add request according to XEP-0184
+ xmlMsg.up().c('request', {
+ xmlns: 'urn:xmpp:receipts'
+ });
+ }
+
+ jsxc.xmpp.conn.send(xmlMsg);
+ },
+
+ /**
+ * This function loads a vcard.
+ *
+ * @memberOf jsxc.xmpp
+ * @param bid
+ * @param cb
+ * @param error_cb
+ */
+ loadVcard: function(bid, cb, error_cb) {
+ if (jsxc.master) {
+ jsxc.xmpp.conn.vcard.get(cb, bid, error_cb);
+ } else {
+ jsxc.storage.setUserItem('vcard', bid, 'request:' + (new Date()).getTime());
+
+ $(document).one('loaded.vcard.jsxc', function(ev, result) {
+ if (result && result.state === 'success') {
+ cb($(result.data).get(0));
+ } else {
+ error_cb();
+ }
+ });
+ }
+ },
+
+ /**
+ * Retrieves capabilities.
+ *
+ * @memberOf jsxc.xmpp
+ * @param jid
+ * @returns List of known capabilities
+ */
+ getCapabilitiesByJid: function(jid) {
+ if (jsxc.xmpp.conn) {
+ return jsxc.xmpp.conn.caps.getCapabilitiesByJid(jid);
+ }
+
+ var jidVerIndex = JSON.parse(localStorage.getItem('strophe.caps._jidVerIndex')) || {};
+ var knownCapabilities = JSON.parse(localStorage.getItem('strophe.caps._knownCapabilities')) || {};
+
+ if (jidVerIndex[jid]) {
+ return knownCapabilities[jidVerIndex[jid]];
+ }
+
+ return null;
+ }
+};
+
+/**
+ * Handle carbons (XEP-0280);
+ *
+ * @namespace jsxc.xmpp.carbons
+ */
+jsxc.xmpp.carbons = {
+ enabled: false,
+
+ /**
+ * Enable carbons.
+ *
+ * @memberOf jsxc.xmpp.carbons
+ * @param cb callback
+ */
+ enable: function(cb) {
+ var iq = $iq({
+ type: 'set'
+ }).c('enable', {
+ xmlns: jsxc.CONST.NS.CARBONS
+ });
+
+ jsxc.xmpp.conn.sendIQ(iq, function() {
+ jsxc.xmpp.carbons.enabled = true;
+
+ jsxc.debug('Carbons enabled');
+
+ if (cb) {
+ cb.call(this);
+ }
+ }, function(stanza) {
+ jsxc.warn('Could not enable carbons', stanza);
+ });
+ },
+
+ /**
+ * Disable carbons.
+ *
+ * @memberOf jsxc.xmpp.carbons
+ * @param cb callback
+ */
+ disable: function(cb) {
+ var iq = $iq({
+ type: 'set'
+ }).c('disable', {
+ xmlns: jsxc.CONST.NS.CARBONS
+ });
+
+ jsxc.xmpp.conn.sendIQ(iq, function() {
+ jsxc.xmpp.carbons.enabled = false;
+
+ jsxc.debug('Carbons disabled');
+
+ if (cb) {
+ cb.call(this);
+ }
+ }, function(stanza) {
+ jsxc.warn('Could not disable carbons', stanza);
+ });
+ },
+
+ /**
+ * Enable/Disable carbons depending on options key.
+ *
+ * @memberOf jsxc.xmpp.carbons
+ * @param err error message
+ */
+ refresh: function(err) {
+ if (err === false) {
+ return;
+ }
+
+ if (jsxc.options.get('carbons').enable) {
+ return jsxc.xmpp.carbons.enable();
+ }
+
+ return jsxc.xmpp.carbons.disable();
+ }
+};
+
+}(jQuery)); \ No newline at end of file
diff --git a/build/js/jsxc/jsxc.lib.js b/build/js/jsxc/jsxc.lib.js
deleted file mode 100644
index 66a3654..0000000
--- a/build/js/jsxc/jsxc.lib.js
+++ /dev/null
@@ -1,6243 +0,0 @@
-/*!
- * jsxc v1.1.0 - 2015-02-08
- *
- * Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
- * Released under the MIT license
- *
- * Please see http://www.jsxc.org/
- *
- * @author Klaus Herberth <klaus@jsxc.org>
- * @version 1.1.0
- * @license MIT
- */
-
-var jsxc;
-
-(function($) {
- "use strict";
-
- /**
- * JavaScript Xmpp Chat namespace
- *
- * @namespace jsxc
- */
- jsxc = {
- /** Version of jsxc */
- version: '1.1.0',
-
- /** True if i'm the master */
- master: false,
-
- /** True if the role allocation is finished */
- role_allocation: false,
-
- /** Timeout for keepalive */
- to: null,
-
- /** Timeout after normal keepalive starts */
- toBusy: null,
-
- /** Timeout for notification */
- toNotification: null,
-
- /** Timeout delay for notification */
- toNotificationDelay: 500,
-
- /** Interval for keep-alive */
- keepalive: null,
-
- /** True if last activity was 10 min ago */
- restore: false,
-
- /** True if restore is complete */
- restoreCompleted: false,
-
- /** True if login through box */
- triggeredFromBox: false,
-
- /** True if logout through element click */
- triggeredFromElement: false,
-
- /** True if logout through logout click */
- triggeredFromLogout: false,
-
- /** last values which we wrote into localstorage (IE workaround) */
- ls: [],
-
- /**
- * storage event is even fired if I write something into storage (IE
- * workaround) 0: conform, 1: not conform, 2: not shure
- */
- storageNotConform: null,
-
- /** Timeout for storageNotConform test */
- toSNC: null,
-
- /** My bar id */
- bid: null,
-
- /** Some constants */
- CONST: {
- NOTIFICATION_DEFAULT: 'default',
- NOTIFICATION_GRANTED: 'granted',
- NOTIFICATION_DENIED: 'denied',
- STATUS: [ 'offline', 'dnd', 'xa', 'away', 'chat', 'online' ],
- SOUNDS: {
- MSG: 'incomingMessage.wav',
- CALL: 'Rotary-Phone6.mp3',
- NOTICE: 'Ping1.mp3'
- },
- REGEX: {
- JID: new RegExp('\\b[^"&\'\\/:<>@\\s]+@[\\w-_.]+\\b', 'ig'),
- URL: new RegExp(/((?:https?:\/\/|www\.|([\w\-]+\.[a-zA-Z]{2,3})(?=\b))(?:(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\)([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|])?)|(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]))?)/gi)
- },
- NS: {
- CARBONS: 'urn:xmpp:carbons:2',
- FORWARD: 'urn:xmpp:forward:0'
- }
- },
-
- /**
- * Parse a unix timestamp and return a formatted time string
- *
- * @memberOf jsxc
- * @param {Object} unixtime
- * @returns time of day and/or date
- */
- getFormattedTime: function(unixtime) {
- var msgDate = new Date(parseInt(unixtime));
- var date = ('0' + msgDate.getDate()).slice(-2);
- var month = ('0' + (msgDate.getMonth() + 1)).slice(-2);
- var year = msgDate.getFullYear();
- var hours = ('0' + msgDate.getHours()).slice(-2);
- var minutes = ('0' + msgDate.getMinutes()).slice(-2);
- var dateNow = new Date(), time = hours + ':' + minutes;
-
- // compare dates only
- dateNow.setHours(0, 0, 0, 0);
- msgDate.setHours(0, 0, 0, 0);
-
- if (dateNow.getTime() !== msgDate.getTime()) {
- return date + '.' + month + '.' + year + ' ' + time;
- }
- return time;
- },
-
- /**
- * Write debug message to console and to log.
- *
- * @memberOf jsxc
- * @param {String} msg Debug message
- * @param {Object} data
- * @param {String} Could be warn|error|null
- */
- debug: function(msg, data, level) {
- if (level) {
- msg = '[' + level + '] ' + msg;
- }
-
- if (data) {
- if (jsxc.storage.getItem('debug') === true) {
- console.log(msg, data);
- }
-
- // try to convert data to string
- var d;
- try {
- // clone html snippet
- d = $("<span>").prepend($(data).clone()).html();
- } catch (err) {
- try {
- d = JSON.stringify(data);
- } catch (err2) {
- d = 'see js console';
- }
- }
-
- jsxc.log = jsxc.log + msg + ': ' + d + '\n';
- } else {
- console.log(msg);
- jsxc.log = jsxc.log + msg + '\n';
- }
- },
-
- /**
- * Write warn message.
- *
- * @memberOf jsxc
- * @param {String} msg Warn message
- * @param {Object} data
- */
- warn: function(msg, data) {
- jsxc.debug(msg, data, 'WARN');
- },
-
- /**
- * Write error message.
- *
- * @memberOf jsxc
- * @param {String} msg Error message
- * @param {Object} data
- */
- error: function(msg, data) {
- jsxc.debug(msg, data, 'ERROR');
- },
-
- /** debug log */
- log: '',
-
- /**
- * Starts the action
- *
- * @memberOf jsxc
- * @param {object} options
- */
- init: function(options) {
-
- if (options) {
- // override default options
- $.extend(true, jsxc.options, options);
- }
-
- /**
- * Getter method for options. Saved options will override default one.
- *
- * @param {string} key option key
- * @returns default or saved option value
- */
- jsxc.options.get = function(key) {
- var local = jsxc.storage.getUserItem('options') || {};
-
- return local[key] || jsxc.options[key];
- };
-
- /**
- * Setter method for options. Will write into localstorage.
- *
- * @param {string} key option key
- * @param {object} value option value
- */
- jsxc.options.set = function(key, value) {
- jsxc.storage.updateItem('options', key, value, true);
- };
-
- jsxc.storageNotConform = jsxc.storage.getItem('storageNotConform');
- if (jsxc.storageNotConform === null) {
- jsxc.storageNotConform = 2;
- }
-
- // detect language
- var lang;
- if (jsxc.storage.getItem('lang') !== null) {
- lang = jsxc.storage.getItem('lang');
- } else if (jsxc.options.autoLang && navigator.language) {
- lang = navigator.language.substr(0, 2);
- } else {
- lang = jsxc.options.defaultLang;
- }
-
- // set language
- jsxc.l = jsxc.l10n.en;
- $.extend(jsxc.l, jsxc.l10n[lang]);
-
- // Check localStorage
- if (typeof (localStorage) === 'undefined') {
- jsxc.debug("Browser doesn't support localStorage.");
- return;
- }
-
- if (jsxc.storage.getItem('debug') === true) {
- jsxc.options.otr.debug = true;
- }
-
- // Register event listener for the storage event
- window.addEventListener('storage', jsxc.storage.onStorage, false);
-
- var lastActivity = jsxc.storage.getItem('lastActivity') || 0;
-
- if ((new Date()).getTime() - lastActivity < jsxc.options.loginTimeout) {
- jsxc.restore = true;
- }
-
- // Check if we have to establish a new connection
- if (!jsxc.storage.getItem('rid') || !jsxc.storage.getItem('sid') || !jsxc.restore) {
-
- // Looking for a login form
- if (!jsxc.options.loginForm.form || !(jsxc.el_exists(jsxc.options.loginForm.form) && jsxc.el_exists(jsxc.options.loginForm.jid) && jsxc.el_exists(jsxc.options.loginForm.pass))) {
-
- if (jsxc.options.displayRosterMinimized()) {
- // Show minimized roster
- jsxc.storage.setUserItem('roster', 'hidden');
- jsxc.gui.roster.init();
- jsxc.gui.roster.noConnection();
- }
-
- return;
- }
-
- if (typeof jsxc.options.formFound === 'function') {
- jsxc.options.formFound.call();
- }
-
- // create jquery object
- var form = jsxc.options.loginForm.form = $(jsxc.options.loginForm.form);
- var events = form.data('events') || {
- submit: []
- };
- var submits = [];
-
- // save attached submit events and remove them. Will be reattached
- // in jsxc.submitLoginForm
- $.each(events.submit, function(index, val) {
- submits.push(val.handler);
- });
-
- form.data('submits', submits);
- form.off('submit');
-
- // Add jsxc login action to form
- form.submit(function() {
-
- var settings = jsxc.prepareLogin();
-
- if (settings !== false && (settings.xmpp.onlogin === "true" || settings.xmpp.onlogin === true)) {
- jsxc.options.loginForm.triggered = true;
-
- jsxc.xmpp.login();
-
- // Trigger submit in jsxc.xmpp.connected()
- return false;
- }
-
- return true;
- });
-
- } else {
-
- // Restore old connection
-
- jsxc.bid = jsxc.jidToBid(jsxc.storage.getItem('jid'));
-
- jsxc.gui.init();
-
- // Looking for logout element
- if (jsxc.options.logoutElement !== null && jsxc.options.logoutElement.length > 0) {
- jsxc.options.logoutElement.one('click', function() {
- jsxc.options.logoutElement = $(this);
- jsxc.triggeredFromLogout = true;
- return jsxc.xmpp.logout();
- });
- }
-
- if (typeof (jsxc.storage.getItem('alive')) === 'undefined' || !jsxc.restore) {
- jsxc.onMaster();
- } else {
- jsxc.checkMaster();
- }
- }
- },
-
- /**
- * Load settings and prepare jid.
- *
- * @memberOf jsxc
- * @returns Loaded settings
- */
- prepareLogin: function() {
- var username = $(jsxc.options.loginForm.jid).val();
- var password = $(jsxc.options.loginForm.pass).val();
-
- if (typeof jsxc.options.loadSettings !== 'function') {
- jsxc.error('No loadSettings function given. Abort.');
- return;
- }
-
- jsxc.gui.showWaitAlert(jsxc.l.Logging_in);
-
- var settings = jsxc.options.loadSettings.call(this, username, password);
-
- if (settings === false || settings === null || typeof settings === 'undefined') {
- jsxc.warn('No settings provided');
-
- return false;
- }
-
- if (typeof settings.xmpp.username === 'string') {
- username = settings.xmpp.username;
- }
-
- var resource = (settings.xmpp.resource) ? '/' + settings.xmpp.resource : '';
- var domain = settings.xmpp.domain;
- var jid;
-
- if (username.match(/@(.*)$/)) {
- jid = (username.match(/\/(.*)$/)) ? username : username + resource;
- } else {
- jid = username + '@' + domain + resource;
- }
-
- if (typeof jsxc.options.loginForm.preJid === 'function') {
- jid = jsxc.options.loginForm.preJid(jid);
- }
-
- jsxc.bid = jsxc.jidToBid(jid);
-
- settings.xmpp.username = jid.split('@')[0];
- settings.xmpp.domain = jid.split('@')[1].split('/')[0];
- settings.xmpp.resource = jid.split('@')[1].split('/')[1] || "";
-
- $.each(settings, function(key, val) {
- jsxc.options.set(key, val);
- });
-
- jsxc.options.xmpp.jid = jid;
- jsxc.options.xmpp.password = password;
-
- return settings;
- },
-
- /**
- * Called if the script is a slave
- */
- onSlave: function() {
- jsxc.debug('I am the slave.');
-
- jsxc.role_allocation = true;
-
- jsxc.restoreRoster();
- jsxc.restoreWindows();
- jsxc.restoreCompleted = true;
-
- $(document).trigger('restoreCompleted.jsxc');
- },
-
- /**
- * Called if the script is the master
- */
- onMaster: function() {
- jsxc.debug('I am master.');
-
- jsxc.master = true;
-
- // Init local storage
- jsxc.storage.setItem('alive', 0);
- jsxc.storage.setItem('alive_busy', 0);
- if (!jsxc.storage.getUserItem('windowlist')) {
- jsxc.storage.setUserItem('windowlist', []);
- }
-
- // Sending keepalive signal
- jsxc.startKeepAlive();
-
- if (jsxc.options.get('otr').enable) {
- // create or load DSA key and call _onMaster
- jsxc.otr.createDSA();
- } else {
- jsxc._onMaster();
- }
- },
-
- /**
- * Second half of the onMaster routine
- */
- _onMaster: function() {
-
- // create otr objects, if we lost the master
- if (jsxc.role_allocation) {
- $.each(jsxc.storage.getUserItem('windowlist'), function(index, val) {
- jsxc.otr.create(val);
- });
- }
-
- jsxc.role_allocation = true;
-
- if (jsxc.restore && !jsxc.restoreCompleted) {
- jsxc.restoreRoster();
- jsxc.restoreWindows();
- jsxc.restoreCompleted = true;
-
- $(document).trigger('restoreCompleted.jsxc');
- }
-
- // Prepare notifications
- if (jsxc.restore) {
- var noti = jsxc.storage.getUserItem('notification') || 2;
- if (jsxc.options.notification && noti > 0 && jsxc.notification.hasSupport()) {
- if (jsxc.notification.hasPermission()) {
- jsxc.notification.init();
- } else {
- jsxc.notification.prepareRequest();
- }
- } else {
- // No support => disable
- jsxc.options.notification = false;
- }
- }
-
- $(document).on('connectionReady.jsxc', function() {
- jsxc.gui.updateAvatar($('#jsxc_avatar'), jsxc.storage.getItem('jid'), 'own');
- });
-
- jsxc.xmpp.login();
- },
-
- /**
- * Checks if there is a master
- */
- checkMaster: function() {
- jsxc.debug('check master');
-
- jsxc.to = window.setTimeout(jsxc.onMaster, 1000);
- jsxc.storage.ink('alive');
- },
-
- /**
- * Start sending keep-alive signal
- */
- startKeepAlive: function() {
- jsxc.keepalive = window.setInterval(jsxc.keepAlive, jsxc.options.timeout - 1000);
- },
-
- /**
- * Sends the keep-alive signal to signal that the master is still there.
- */
- keepAlive: function() {
- jsxc.storage.ink('alive');
-
- if (jsxc.role_allocation) {
- jsxc.storage.setItem('lastActivity', (new Date()).getTime());
- }
- },
-
- /**
- * Send one keep-alive signal with higher timeout, and than resume with
- * normal signal
- */
- keepBusyAlive: function() {
- if (jsxc.toBusy) {
- window.clearTimeout(jsxc.toBusy);
- }
-
- if (jsxc.keepalive) {
- window.clearInterval(jsxc.keepalive);
- }
-
- jsxc.storage.ink('alive_busy');
- jsxc.toBusy = window.setTimeout(jsxc.startKeepAlive, jsxc.options.busyTimeout - 1000);
- },
-
- /**
- * Generates a random integer number between 0 and max
- *
- * @param {Integer} max
- * @return {Integer} random integer between 0 and max
- */
- random: function(max) {
- return Math.floor(Math.random() * max);
- },
-
- /**
- * Checks if there is a element with the given selector
- *
- * @param {String} selector jQuery selector
- * @return {Boolean}
- */
- el_exists: function(selector) {
- return $(selector).length > 0;
- },
-
- /**
- * Creates a CSS compatible string from a JID
- *
- * @param {type} jid Valid Jabber ID
- * @returns {String} css Compatible string
- */
- jidToCid: function(jid) {
- jsxc.warn('jsxc.jidToCid is deprecated!');
-
- var cid = Strophe.getBareJidFromJid(jid).replace('@', '-').replace(/\./g, '-').toLowerCase();
-
- return cid;
- },
-
- /**
- * Create comparable bar jid.
- *
- * @memberOf jsxc
- * @param jid
- * @returns comparable bar jid
- */
- jidToBid: function(jid) {
- return Strophe.getBareJidFromJid(jid).toLowerCase();
- },
-
- /**
- * Restore roster
- */
- restoreRoster: function() {
- var buddies = jsxc.storage.getUserItem('buddylist');
-
- if (!buddies || buddies.length === 0) {
- jsxc.debug('No saved buddylist.');
-
- jsxc.gui.roster.empty();
-
- return;
- }
-
- $.each(buddies, function(index, value) {
- jsxc.gui.roster.add(value);
- });
-
- $(document).trigger('cloaded.roster.jsxc');
- },
-
- /**
- * Restore all windows
- */
- restoreWindows: function() {
- var windows = jsxc.storage.getUserItem('windowlist');
-
- if (windows === null) {
- return;
- }
-
- $.each(windows, function(index, bid) {
- var window = jsxc.storage.getUserItem('window', bid);
-
- if (!window) {
- jsxc.debug('Associated window-element is missing: ' + bid);
- return true;
- }
-
- jsxc.gui.window.init(bid);
-
- if (!window.minimize) {
- jsxc.gui.window.show(bid);
- } else {
- jsxc.gui.window.hide(bid);
- }
-
- jsxc.gui.window.setText(bid, window.text);
- });
- },
-
- /**
- * This method submits the specified login form.
- */
- submitLoginForm: function() {
- var form = jsxc.options.loginForm.form.off('submit');
-
- // Attach original events
- var submits = form.data('submits') || [];
- $.each(submits, function(index, val) {
- form.submit(val);
- });
-
- if (form.find('#submit').length > 0) {
- form.find('#submit').click();
- } else {
- form.submit();
- }
- },
-
- /**
- * Escapes some characters to HTML character
- */
- escapeHTML: function(text) {
- text = text.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
- return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
- },
-
- /**
- * Removes all html tags.
- *
- * @memberOf jsxc
- * @param text
- * @returns stripped text
- */
- removeHTML: function(text) {
- return $('<span>').html(text).text();
- },
-
- /**
- * Executes only one of the given events
- *
- * @param {string} obj.key event name
- * @param {function} obj.value function to execute
- * @returns {string} namespace of all events
- */
- switchEvents: function(obj) {
- var ns = Math.random().toString(36).substr(2, 12);
- var self = this;
-
- $.each(obj, function(key, val) {
- $(document).one(key + '.' + ns, function() {
- $(document).off('.' + ns);
-
- val.apply(self, arguments);
- });
- });
-
- return ns;
- },
-
- /**
- * Checks if tab is hidden.
- *
- * @returns {boolean} True if tab is hidden
- */
- isHidden: function() {
- var hidden = false;
-
- if (typeof document.hidden !== 'undefined') {
- hidden = document.hidden;
- } else if (typeof document.webkitHidden !== 'undefined') {
- hidden = document.webkitHidden;
- } else if (typeof document.mozHidden !== 'undefined') {
- hidden = document.mozHidden;
- } else if (typeof document.msHidden !== 'undefined') {
- hidden = document.msHidden;
- }
-
- // handle multiple tabs
- if (hidden && jsxc.master) {
- jsxc.storage.ink('hidden', 0);
- } else if (!hidden && !jsxc.master) {
- jsxc.storage.ink('hidden');
- }
-
- return hidden;
- },
-
- /**
- * Replace %%tokens%% with correct translation.
- *
- * @param {String} text Given text
- * @returns {String} Translated string
- */
- translate: function(text) {
- return text.replace(/%%([a-zA-Z0-9_-}{ .!,?/'@]+)%%/g, function(s, key) {
- var k = key.replace(/ /gi, '_').replace(/[.!,?/'@]/g, '');
-
- if (!jsxc.l[k]) {
- jsxc.warn('No translation for: ' + k);
- }
-
- return jsxc.l[k] || key.replace(/_/g, ' ');
- });
- },
-
- /**
- * Executes the given function in jsxc namespace.
- *
- * @memberOf jsxc
- * @param {string} fnName Function name
- * @param {array} fnParams Function parameters
- * @returns Function return value
- */
- exec: function(fnName, fnParams) {
- var fnList = fnName.split('.');
- var fn = jsxc[fnList[0]];
- var i;
- for (i = 1; i < fnList.length; i++) {
- fn = fn[fnList[i]];
- }
-
- if (typeof fn === 'function') {
- return fn.apply(null, fnParams);
- }
- }
- };
-
- /**
- * Set some options for the chat.
- *
- * @namespace jsxc.options
- */
- jsxc.options = {
-
- /** name of container application (e.g. owncloud or SOGo) */
- app_name: 'web applications',
-
- /** Timeout for the keepalive signal */
- timeout: 3000,
-
- /** Timeout for the keepalive signal if the master is busy */
- busyTimeout: 15000,
-
- /** OTR options */
- otr: {
- enable: true,
- ERROR_START_AKE: false,
- debug: false,
- SEND_WHITESPACE_TAG: true,
- WHITESPACE_START_AKE: true
- },
-
- /** xmpp options */
- xmpp: {
- url: null,
- jid: null,
- domain: null,
- password: null,
- overwrite: false,
- onlogin: true
- },
-
- /** default xmpp priorities */
- priority: {
- online: 0,
- chat: 0,
- away: 0,
- xa: 0,
- dnd: 0
- },
-
- /** If all 3 properties are set, the login form is used */
- loginForm: {
- /** jquery object from form */
- form: null,
-
- /** jquery object from input element which contains the jid */
- jid: null,
-
- /** jquery object from input element which contains the password */
- pass: null,
-
- /** manipulate JID from input element */
- preJid: function(jid) {
- return jid;
- },
-
- /**
- * Action after connected: submit [String] Submit form, false [boolean]
- * Do nothing, continue [String] Start chat
- */
- onConnected: 'submit',
-
- /**
- * Action after auth fail: submit [String] Submit form, false [boolean]
- * Do nothing, ask [String] Show auth fail dialog
- */
- onAuthFail: 'submit'
- },
-
- /** jquery object from logout element */
- logoutElement: null,
-
- /** How many messages should be logged? */
- numberOfMsg: 10,
-
- /** Default language */
- defaultLang: 'en',
-
- /** auto language detection */
- autoLang: true,
-
- /** Place for roster */
- rosterAppend: 'body',
-
- /** Should we use the HTML5 notification API? */
- notification: true,
-
- /** duration for notification */
- popupDuration: 6000,
-
- /** Absolute path root of JSXC installation */
- root: '',
-
- /** Timeout for restore in ms */
- loginTimeout: 1000 * 60 * 10,
-
- /**
- * This function decides wether the roster will be displayed or not if no
- * connection is found.
- */
- displayRosterMinimized: function() {
- return false;
- },
-
- /** Set to true if you want to hide offline buddies. */
- hideOffline: false,
-
- /** Mute notification sound? */
- muteNotification: false,
-
- /**
- * If no avatar is found, this function is called.
- *
- * @param jid Jid of that user.
- * @this {jQuery} Elements to update with probable .jsxc_avatar elements
- */
- defaultAvatar: function() {
-
- },
-
- /**
- * Returns permanent saved settings and overwrite default jsxc.options.
- *
- * @memberOf jsxc.options
- * @param username String username
- * @param password String password
- * @returns {object} at least xmpp.url
- */
- loadSettings: function() {
-
- },
-
- /**
- * Call this function to save user settings permanent.
- *
- * @memberOf jsxc.options
- * @param data Holds all data as key/value
- * @returns {boolean} false if function failes
- */
- saveSettinsPermanent: function() {
-
- },
-
- carbons: {
- /** Enable carbon copies? */
- enable: false
- }
- };
-
- /**
- * Handle functions for chat window's and buddylist
- *
- * @namespace jsxc.gui
- */
- jsxc.gui = {
- /** Smilie token to file mapping */
- emotions: [ [ 'O:-) O:)', 'angel' ], [ '>:-( >:( &gt;:-( &gt;:(', 'angry' ], [ ':-) :)', 'smile' ], [ ':-D :D', 'grin' ], [ ':-( :(', 'sad' ], [ ';-) ;)', 'wink' ], [ ':-P :P', 'tonguesmile' ], [ '=-O', 'surprised' ], [ ':kiss: :-*', 'kiss' ], [ '8-) :cool:', 'sunglassess' ], [ ':\'-( :\'( :&amp;apos;-(', 'crysad' ], [ ':-/', 'doubt' ], [ ':-X :X', 'zip' ], [ ':yes:', 'thumbsup' ], [ ':no:', 'thumbsdown' ], [ ':beer:', 'beer' ], [ ':devil:', 'devil' ], [ ':kiss: :kissing:', 'kissing' ], [ '@->-- :rose: @-&gt;--', 'rose' ], [ ':music:', 'music' ], [ ':love:', 'love' ], [ ':zzz:', 'tired' ] ],
-
- /**
- * Different uri query actions as defined in XEP-0147.
- *
- * @namespace jsxc.gui.queryActions
- */
- queryActions: {
- /** xmpp:JID?message[;body=TEXT] */
- message: function(jid, params) {
- var win = jsxc.gui.window.open(jsxc.jidToBid(jid));
-
- if (params && typeof params.body === 'string') {
- win.find('.jsxc_textinput').val(params.body);
- }
- },
-
- /** xmpp:JID?remove */
- remove: function(jid) {
- jsxc.gui.showRemoveDialog(jsxc.jidToBid(jid));
- },
-
- /** xmpp:JID?subscribe[;name=NAME] */
- subscribe: function(jid, params) {
- jsxc.gui.showContactDialog(jid);
-
- if (params && typeof params.name) {
- $('#jsxc_alias').val(params.name);
- }
- },
-
- /** xmpp:JID?vcard */
- vcard: function(jid) {
- jsxc.gui.showVcard(jid);
- }
- },
-
- /**
- * Creates application skeleton.
- *
- * @memberOf jsxc.gui
- */
- init: function() {
- //Prevent duplicate windowList
- if ($('#jsxc_windowList').length > 0) {
- return;
- }
-
- $('body').append($(jsxc.gui.template.get('windowList')));
-
- $(window).resize(jsxc.gui.updateWindowListSB);
- $('#jsxc_windowList').resize(jsxc.gui.updateWindowListSB);
-
- $('#jsxc_windowListSB .jsxc_scrollLeft').click(function() {
- jsxc.gui.scrollWindowListBy(-200);
- });
- $('#jsxc_windowListSB .jsxc_scrollRight').click(function() {
- jsxc.gui.scrollWindowListBy(200);
- });
- $('#jsxc_windowList').on('wheel', function(ev) {
- if ($('#jsxc_windowList').data('isOver')) {
- jsxc.gui.scrollWindowListBy((ev.originalEvent.wheelDelta > 0) ? 200 : -200);
- }
- });
-
- jsxc.gui.tooltip('#jsxc_windowList');
-
- if (!jsxc.el_exists('#jsxc_roster')) {
- jsxc.gui.roster.init();
- }
-
- // prepare regexp for emotions
- $.each(jsxc.gui.emotions, function(i, val) {
- // escape characters
- var reg = val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g, '\\$1');
- reg = '(' + reg.split(' ').join('|') + ')';
- jsxc.gui.emotions[i][2] = new RegExp(reg, 'g');
- });
-
- // We need this often, so we creates some template jquery objects
- jsxc.gui.windowTemplate = $(jsxc.gui.template.get('chatWindow'));
- jsxc.gui.buddyTemplate = $(jsxc.gui.template.get('rosterBuddy'));
- },
-
- /**
- * Init tooltip plugin for given jQuery selector.
- *
- * @param {String} selector jQuery selector
- * @memberOf jsxc.gui
- */
- tooltip: function(selector) {
- $(selector).tooltip({
- show: {
- delay: 600
- },
- content: function() {
- return $(this).attr('title').replace(/\n/g, '<br />');
- }
- });
- },
-
- /**
- * Updates Information in roster and chatbar
- *
- * @param {String} bid bar jid
- */
- update: function(bid) {
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- if (!data) {
- jsxc.debug('No data for ' + bid);
- return;
- }
-
- var ri = jsxc.gui.roster.getItem(bid); // roster item from user
- var we = jsxc.gui.window.get(bid); // window element from user
- var ue = ri.add(we); // both
- var spot = $('.jsxc_spot[data-bid="' + bid + '"]');
-
- // Attach data to corresponding roster item
- ri.data(data);
-
- // Add online status
- ue.add(spot).removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + jsxc.CONST.STATUS[data.status]);
-
- // Change name and add title
- ue.find('.jsxc_name').add(spot).text(data.name).attr('title', jsxc.l.is + ' ' + jsxc.CONST.STATUS[data.status]);
-
- // Update gui according to encryption state
- switch (data.msgstate) {
- case 0:
- we.find('.jsxc_transfer').removeClass('jsxc_enc jsxc_fin').attr('title', jsxc.l.your_connection_is_unencrypted);
- we.find('.jsxc_settings .jsxc_verification').addClass('jsxc_disabled');
- we.find('.jsxc_settings .jsxc_transfer').text(jsxc.l.start_private);
- break;
- case 1:
- we.find('.jsxc_transfer').addClass('jsxc_enc').attr('title', jsxc.l.your_connection_is_encrypted);
- we.find('.jsxc_settings .jsxc_verification').removeClass('jsxc_disabled');
- we.find('.jsxc_settings .jsxc_transfer').text(jsxc.l.close_private);
- break;
- case 2:
- we.find('.jsxc_settings .jsxc_verification').addClass('jsxc_disabled');
- we.find('.jsxc_transfer').removeClass('jsxc_enc').addClass('jsxc_fin').attr('title', jsxc.l.your_buddy_closed_the_private_connection);
- we.find('.jsxc_settings .jsxc_transfer').text(jsxc.l.close_private);
- break;
- }
-
- // update gui according to verification state
- if (data.trust) {
- we.find('.jsxc_transfer').addClass('jsxc_trust').attr('title', jsxc.l.your_buddy_is_verificated);
- } else {
- we.find('.jsxc_transfer').removeClass('jsxc_trust');
- }
-
- // update gui according to subscription state
- if (data.sub && data.sub !== 'both') {
- ue.addClass('jsxc_oneway');
- } else {
- ue.removeClass('jsxc_oneway');
- }
-
- var info = '<b>' + Strophe.getBareJidFromJid(data.jid) + '</b>\n';
- info += jsxc.translate('%%Subscription%%: %%' + data.sub + '%%\n');
- info += jsxc.translate('%%Status%%: %%' + jsxc.CONST.STATUS[data.status] + '%%');
-
- ri.find('.jsxc_name').attr('title', info);
-
- if (data.avatar && data.avatar.length > 0) {
- jsxc.gui.updateAvatar(ue, data.jid, data.avatar);
- } else {
- jsxc.options.defaultAvatar.call(ue, data.jid);
- }
- },
-
- /**
- * Update avatar on all given elements.
- *
- * @memberOf jsxc.gui
- * @param {jQuery} el Elements with subelement .jsxc_avatar
- * @param {string} jid Jid
- * @param {string} aid Avatar id (sha1 hash of image)
- */
- updateAvatar: function(el, jid, aid) {
-
- if (typeof aid === 'undefined') {
- if (typeof jsxc.options.defaultAvatar === 'function') {
- jsxc.options.defaultAvatar.call(el, jid);
- }
- return;
- }
-
- var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
-
- var setAvatar = function(src) {
- if (src === 0 || src === '0') {
- jsxc.options.defaultAvatar.call(el, jid);
- return;
- }
-
- el.find('.jsxc_avatar').removeAttr('style');
-
- el.find('.jsxc_avatar').css({
- 'background-image': 'url(' + src + ')',
- 'text-indent': '999px'
- });
- };
-
- if (avatarSrc !== null) {
- setAvatar(avatarSrc);
- } else {
- jsxc.xmpp.conn.vcard.get(function(stanza) {
- jsxc.debug('vCard', stanza);
-
- var vCard = $(stanza).find("vCard > PHOTO");
- var src;
-
- if (vCard.length === 0) {
- jsxc.debug('No photo provided');
- src = '0';
- } else if (vCard.find('EXTVAL').length > 0) {
- src = vCard.find('EXTVAL').text();
- } else {
- var img = vCard.find('BINVAL').text();
- var type = vCard.find('TYPE').text();
- src = 'data:' + type + ';base64,' + img;
- }
-
- // concat chunks
- src = src.replace(/[\t\r\n\f]/gi, '');
-
- jsxc.storage.setUserItem('avatar', aid, src);
- setAvatar(src);
- }, Strophe.getBareJidFromJid(jid), function(msg) {
- jsxc.warn('Could not load vcard.', msg);
-
- jsxc.storage.setUserItem('avatar', aid, 0);
- setAvatar(0);
- });
- }
- },
-
- /**
- * Updates scrollbar handlers.
- *
- * @memberOf jsxc.gui
- */
- updateWindowListSB: function() {
-
- if ($('#jsxc_windowList>ul').width() > $('#jsxc_windowList').width()) {
- $('#jsxc_windowListSB > div').removeClass('jsxc_disabled');
- } else {
- $('#jsxc_windowListSB > div').addClass('jsxc_disabled');
- $('#jsxc_windowList>ul').css('right', '0px');
- }
- },
-
- /**
- * Scroll window list by offset.
- *
- * @memberOf jsxc.gui
- * @param offset
- */
- scrollWindowListBy: function(offset) {
-
- var scrollWidth = $('#jsxc_windowList>ul').width();
- var width = $('#jsxc_windowList').width();
- var el = $('#jsxc_windowList>ul');
- var right = parseInt(el.css('right')) - offset;
- var padding = $("#jsxc_windowListSB").width();
-
- if (scrollWidth < width) {
- return;
- }
-
- if (right > 0) {
- right = 0;
- }
-
- if (right < width - scrollWidth - padding) {
- right = width - scrollWidth - padding;
- }
-
- el.css('right', right + 'px');
- },
-
- /**
- * Returns the window element
- *
- * @param {String} bid
- * @returns {jquery} jQuery object of the window element
- */
- getWindow: function(bid) {
- jsxc.warn('jsxc.gui.getWindow is deprecated!');
-
- return jsxc.gui.window.get(bid);
- },
-
- /**
- * Toggle list with timeout, like menu or settings
- *
- * @memberof jsxc.gui
- */
- toggleList: function() {
- var self = $(this);
-
- self.disableSelection();
-
- var ul = self.find('ul');
- var slideUp = null;
-
- slideUp = function() {
- ul.slideUp({
- complete: function() {
- self.removeClass('jsxc_opened');
- }
- });
-
- $('body').off('click', null, slideUp);
- };
-
- $(this).click(function() {
-
- if (ul.is(":hidden")) {
- // hide other lists
- $('body').click();
- $('body').one('click', slideUp);
- } else {
- $('body').off('click', null, slideUp);
- }
-
- ul.slideToggle();
-
- window.clearTimeout(ul.data('timer'));
-
- self.toggleClass('jsxc_opened');
-
- return false;
- }).mouseleave(function() {
- ul.data('timer', window.setTimeout(slideUp, 2000));
- }).mouseenter(function() {
- window.clearTimeout(ul.data('timer'));
- });
- },
-
- /**
- * Creates and show loginbox
- */
- showLoginBox: function() {
- // Set focus to password field
- $(document).on("complete.dialog.jsxc", function() {
- $('#jsxc_password').focus();
- });
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('loginBox'));
-
- $('#jsxc_dialog').find('form').submit(function() {
-
- $(this).find('input[type=submit]').prop('disabled', true);
-
- jsxc.options.loginForm.form = $(this);
- jsxc.options.loginForm.jid = $(this).find('#jsxc_username');
- jsxc.options.loginForm.pass = $(this).find('#jsxc_password');
-
- var settings = jsxc.prepareLogin();
-
- jsxc.triggeredFromBox = true;
- jsxc.options.loginForm.triggered = false;
-
- if (settings === false) {
- jsxc.gui.showAuthFail();
- } else {
- jsxc.xmpp.login();
- }
-
- return false;
- });
- },
-
- /**
- * Creates and show the fingerprint dialog
- *
- * @param {String} bid
- */
- showFingerprints: function(bid) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('fingerprintsDialog', bid));
- },
-
- /**
- * Creates and show the verification dialog
- *
- * @param {String} bid
- */
- showVerification: function(bid) {
-
- // Check if there is a open dialog
- if ($('#jsxc_dialog').length > 0) {
- setTimeout(function() {
- jsxc.gui.showVerification(bid);
- }, 3000);
- return;
- }
-
- // verification only possible if the connection is encrypted
- if (jsxc.storage.getUserItem('buddy', bid).msgstate !== OTR.CONST.MSGSTATE_ENCRYPTED) {
- jsxc.warn('Connection not encrypted');
- return;
- }
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('authenticationDialog', bid));
-
- // Add handler
-
- $('#jsxc_dialog > div:gt(0)').hide();
- $('#jsxc_dialog select').change(function() {
- $('#jsxc_dialog > div:gt(0)').hide();
- $('#jsxc_dialog > div:eq(' + $(this).prop('selectedIndex') + ')').slideDown({
- complete: function() {
- jsxc.gui.dialog.resize();
- }
- });
- });
-
- // Manual
- $('#jsxc_dialog > div:eq(1) a.creation').click(function() {
- if (jsxc.master) {
- jsxc.otr.objects[bid].trust = true;
- }
-
- jsxc.storage.updateUserItem('buddy', bid, 'trust', true);
-
- jsxc.gui.dialog.close();
-
- jsxc.storage.updateUserItem('buddy', bid, 'trust', true);
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.conversation_is_now_verified);
- jsxc.gui.update(bid);
- });
-
- // Question
- $('#jsxc_dialog > div:eq(2) a.creation').click(function() {
- var div = $('#jsxc_dialog > div:eq(2)');
- var sec = div.find('#jsxc_secret2').val();
- var quest = div.find('#jsxc_quest').val();
-
- if (sec === '' || quest === '') {
- // Add information for the user which form is missing
- div.find('input[value=""]').addClass('jsxc_invalid').keyup(function() {
- if ($(this).val().match(/.*/)) {
- $(this).removeClass('jsxc_invalid');
- }
- });
- return;
- }
-
- if (jsxc.master) {
- jsxc.otr.sendSmpReq(bid, sec, quest);
- } else {
- jsxc.storage.setUserItem('smp_' + bid, {
- sec: sec,
- quest: quest
- });
- }
-
- jsxc.gui.dialog.close();
-
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.authentication_query_sent);
- });
-
- // Secret
- $('#jsxc_dialog > div:eq(3) .creation').click(function() {
- var div = $('#jsxc_dialog > div:eq(3)');
- var sec = div.find('#jsxc_secret').val();
-
- if (sec === '') {
- // Add information for the user which form is missing
- div.find('#jsxc_secret').addClass('jsxc_invalid').keyup(function() {
- if ($(this).val().match(/.*/)) {
- $(this).removeClass('jsxc_invalid');
- }
- });
- return;
- }
-
- if (jsxc.master) {
- jsxc.otr.sendSmpReq(bid, sec);
- } else {
- jsxc.storage.setUserItem('smp_' + bid, {
- sec: sec,
- quest: null
- });
- }
-
- jsxc.gui.dialog.close();
-
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.authentication_query_sent);
- });
- },
-
- /**
- * Create and show approve dialog
- *
- * @param {type} from valid jid
- */
- showApproveDialog: function(from) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('approveDialog'), {
- 'noClose': true
- });
-
- $('#jsxc_dialog .jsxc_their_jid').text(Strophe.getBareJidFromJid(from));
-
- $('#jsxc_dialog .jsxc_deny').click(function(ev) {
- ev.stopPropagation();
-
- jsxc.xmpp.resFriendReq(from, false);
-
- jsxc.gui.dialog.close();
- });
-
- $('#jsxc_dialog .jsxc_approve').click(function(ev) {
- ev.stopPropagation();
-
- var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(from));
-
- jsxc.xmpp.resFriendReq(from, true);
-
- // If friendship is not mutual show contact dialog
- if (!data || data.sub === 'from') {
- $(document).one('close.dialog.jsxc', function() {
- jsxc.gui.showContactDialog(from);
- });
- }
-
- jsxc.gui.dialog.close();
- });
- },
-
- /**
- * Create and show dialog to add a buddy
- *
- * @param {string} [username] jabber id
- */
- showContactDialog: function(username) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('contactDialog'));
-
- // If we got a friendship request, we would display the username in our
- // response
- if (username) {
- $('#jsxc_username').val(username);
- }
-
- $('#jsxc_dialog form').submit(function() {
- var username = $('#jsxc_username').val();
- var alias = $('#jsxc_alias').val();
-
- if (!username.match(/@(.*)$/)) {
- username += '@' + Strophe.getDomainFromJid(jsxc.storage.getItem('jid'));
- }
-
- // Check if the username is valid
- if (!username || !username.match(jsxc.CONST.REGEX.JID)) {
- // Add notification
- $('#jsxc_username').addClass('jsxc_invalid').keyup(function() {
- if ($(this).val().match(jsxc.CONST.REGEX.JID)) {
- $(this).removeClass('jsxc_invalid');
- }
- });
- return false;
- }
- jsxc.xmpp.addBuddy(username, alias);
-
- jsxc.gui.dialog.close();
-
- return false;
- });
- },
-
- /**
- * Create and show dialog to remove a buddy
- *
- * @param {type} bid
- * @returns {undefined}
- */
- showRemoveDialog: function(bid) {
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('removeDialog', bid));
-
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- $('#jsxc_dialog .creation').click(function(ev) {
- ev.stopPropagation();
-
- if (jsxc.master) {
- jsxc.xmpp.removeBuddy(data.jid);
- } else {
- // inform master
- jsxc.storage.setUserItem('deletebuddy', bid, {
- jid: data.jid
- });
- }
-
- jsxc.gui.dialog.close();
- });
- },
-
- /**
- * Create and show a wait dialog
- *
- * @param {type} msg message to display to the user
- * @returns {undefined}
- */
- showWaitAlert: function(msg) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('waitAlert', null, msg), {
- 'noClose': true
- });
- },
-
- /**
- * Create and show a wait dialog
- *
- * @param {type} msg message to display to the user
- * @returns {undefined}
- */
- showAlert: function(msg) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('alert', null, msg));
- },
-
- /**
- * Create and show a auth fail dialog
- *
- * @returns {undefined}
- */
- showAuthFail: function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('authFailDialog'));
-
- if (jsxc.options.loginForm.triggered !== false) {
- $('#jsxc_dialog .jsxc_cancel').hide();
- }
-
- $('#jsxc_dialog .creation').click(function() {
- jsxc.gui.dialog.close();
- });
-
- $('#jsxc_dialog .jsxc_cancel').click(function() {
- jsxc.submitLoginForm();
- });
- },
-
- /**
- * Create and show a confirm dialog
- *
- * @param {String} msg Message
- * @param {function} confirm
- * @param {function} dismiss
- * @returns {undefined}
- */
- showConfirmDialog: function(msg, confirm, dismiss) {
- jsxc.gui.dialog.open(jsxc.gui.template.get('confirmDialog', null, msg), {
- noClose: true
- });
-
- if (confirm) {
- $('#jsxc_dialog .creation').click(confirm);
- }
-
- if (dismiss) {
- $('#jsxc_dialog .jsxc_cancel').click(dismiss);
- }
- },
-
- /**
- * Show about dialog.
- *
- * @memberOf jsxc.gui
- */
- showAboutDialog: function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('aboutDialog'));
-
- $('#jsxc_dialog .jsxc_debuglog').click(function() {
- jsxc.gui.showDebugLog();
- });
- },
-
- /**
- * Show debug log.
- *
- * @memberOf jsxc.gui
- */
- showDebugLog: function() {
- var userInfo = '<h3>User information</h3>';
-
- if (navigator) {
- var key;
- for (key in navigator) {
- if (navigator.hasOwnProperty(key) && typeof navigator[key] === 'string') {
- userInfo += '<b>' + key + ':</b> ' + navigator[key] + '<br />';
- }
- }
- }
-
- if (window.screen) {
- userInfo += '<b>Height:</b> ' + window.screen.height + '<br />';
- userInfo += '<b>Width:</b> ' + window.screen.width + '<br />';
- }
-
- userInfo += '<b>jsxc version:</b> ' + jsxc.version + '<br />';
-
- jsxc.gui.dialog.open('<div class="jsxc_log">' + userInfo + '<h3>Log</h3><pre>' + jsxc.escapeHTML(jsxc.log) + '</pre></div>');
- },
-
- /**
- * Show vCard of user with the given bar jid.
- *
- * @memberOf jsxc.gui
- * @param {String} jid
- */
- showVcard: function(jid) {
- var bid = jsxc.jidToBid(jid);
- jsxc.gui.dialog.open(jsxc.gui.template.get('vCard', bid));
-
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- if (data) {
- // Display resources and corresponding information
- var i, j, res, identities, identity = null, cap, client;
- for (i = 0; i < data.res.length; i++) {
- res = data.res[i];
-
- identities = [];
- cap = jsxc.xmpp.getCapabilitiesByJid(bid + '/' + res);
-
- if (cap !== null && cap.identities !== null) {
- identities = cap.identities;
- }
-
- client = '';
- for (j = 0; j < identities.length; j++) {
- identity = identities[j];
- if (identity.category === 'client') {
- if (client !== '') {
- client += ',\n';
- }
-
- client += identity.name + ' (' + identity.type + ')';
- }
- }
-
- var status = jsxc.storage.getUserItem('res', bid)[res];
-
- $('#jsxc_dialog ul.jsxc_vCard').append('<li class="jsxc_sep"><strong>' + jsxc.translate('%%Resource%%') + ':</strong> ' + res + '</li>');
- $('#jsxc_dialog ul.jsxc_vCard').append('<li><strong>' + jsxc.translate('%%Client%%') + ':</strong> ' + client + '</li>');
- $('#jsxc_dialog ul.jsxc_vCard').append('<li>' + jsxc.translate('<strong>%%Status%%:</strong> %%' + jsxc.CONST.STATUS[status] + '%%') + '</li>');
- }
- }
-
- var printProp = function(el, depth) {
- var content = '';
-
- el.each(function() {
- var item = $(this);
- var children = $(this).children();
-
- content += '<li>';
-
- var prop = jsxc.translate('%%' + item[0].tagName + '%%');
-
- if (prop !== ' ') {
- content += '<strong>' + prop + ':</strong> ';
- }
-
- if (item[0].tagName === 'PHOTO') {
-
- } else if (children.length > 0) {
- content += '<ul>';
- content += printProp(children, depth + 1);
- content += '</ul>';
- } else if (item.text() !== '') {
- content += jsxc.escapeHTML(item.text());
- }
-
- content += '</li>';
-
- if (depth === 0 && $('#jsxc_dialog ul.jsxc_vCard').length > 0) {
- if ($('#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first').length > 0) {
- $('#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first').before(content);
- } else {
- $('#jsxc_dialog ul.jsxc_vCard').append(content);
- }
- content = '';
- }
- });
-
- if (depth > 0) {
- return content;
- }
- };
-
- var failedToLoad = function() {
- if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) {
- return;
- }
-
- $('#jsxc_dialog p').remove();
-
- var content = '<p>';
- content += jsxc.translate('%%Sorry, your buddy doesn\'t provide any information.%%');
- content += '</p>';
-
- $('#jsxc_dialog').append(content);
- };
-
- jsxc.xmpp.loadVcard(bid, function(stanza) {
-
- if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) {
- return;
- }
-
- $('#jsxc_dialog p').remove();
-
- var photo = $(stanza).find("vCard > PHOTO");
-
- if (photo.length > 0) {
- var img = photo.find('BINVAL').text();
- var type = photo.find('TYPE').text();
- var src = 'data:' + type + ';base64,' + img;
-
- if (photo.find('EXTVAL').length > 0) {
- src = photo.find('EXTVAL').text();
- }
-
- // concat chunks
- src = src.replace(/[\t\r\n\f]/gi, '');
-
- var img_el = $('<img class="jsxc_vCard" alt="avatar" />');
- img_el.attr('src', src);
-
- $('#jsxc_dialog h3').before(img_el);
- }
-
- if ($(stanza).find('vCard').length === 0 || ($(stanza).find('vcard > *').length === 1 && photo.length === 1)) {
- failedToLoad();
- return;
- }
-
- printProp($(stanza).find('vcard > *'), 0);
-
- }, failedToLoad);
- },
-
- showSettings: function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('settings'));
-
- if (jsxc.options.get('xmpp').overwrite === 'false' || jsxc.options.get('xmpp').overwrite === false) {
- $('.jsxc_fieldsetXmpp').hide();
- }
-
- $('#jsxc_dialog form').each(function() {
- var self = $(this);
-
- self.find('input[type!="submit"]').each(function() {
- var id = this.id.split("-");
- var prop = id[0];
- var key = id[1];
- var type = this.type;
-
- var data = jsxc.options.get(prop);
-
- if (data && typeof data[key] !== 'undefined') {
- if (type === 'checkbox') {
- if (data[key] !== 'false' && data[key] !== false) {
- this.checked = 'checked';
- }
- } else {
- $(this).val(data[key]);
- }
- }
- });
- });
-
- $('#jsxc_dialog form').submit(function() {
-
- var self = $(this);
- var data = {};
-
- self.find('input[type!="submit"]').each(function() {
- var id = this.id.split("-");
- var prop = id[0];
- var key = id[1];
- var val;
- var type = this.type;
-
- if (type === 'checkbox') {
- val = this.checked;
- } else {
- val = $(this).val();
- }
-
- if (!data[prop]) {
- data[prop] = {};
- }
-
- data[prop][key] = val;
- });
-
- $.each(data, function(key, val) {
- jsxc.options.set(key, val);
- });
-
- var err = jsxc.options.saveSettinsPermanent.call(this, data);
-
- if (typeof self.attr('data-onsubmit') === 'string') {
- jsxc.exec(self.attr('data-onsubmit'), [ err ]);
- }
-
- setTimeout(function() {
- self.find('input[type="submit"]').effect('highlight', {
- color: (err) ? 'green' : 'red'
- }, 4000);
- }, 200);
-
- return false;
- });
- },
-
- /**
- * Show prompt for notification permission.
- *
- * @memberOf jsxc.gui
- */
- showRequestNotification: function() {
- jsxc.gui.showConfirmDialog(jsxc.translate("%%Should we notify you_%%"), function() {
- jsxc.gui.dialog.open(jsxc.gui.template.get('pleaseAccept'), {
- noClose: true
- });
-
- jsxc.notification.requestPermission();
- }, function() {
- $(document).trigger('notificationfailure.jsxc');
- });
- },
-
- showUnknownSender: function(bid) {
- jsxc.gui.showConfirmDialog(jsxc.translate('%%You_received_a_message_from_an_unknown_sender%% (' + bid + '). %%Do_you_want_to_display_them%%'), function() {
-
- jsxc.gui.dialog.close();
-
- jsxc.storage.saveBuddy(bid, {
- jid: bid,
- name: bid,
- status: 0,
- sub: 'none',
- res: []
- });
-
- jsxc.gui.window.open(bid);
-
- }, function() {
- // reset state
- jsxc.storage.removeUserItem('chat', bid);
- });
- },
-
- /**
- * Change own presence to pres.
- *
- * @memberOf jsxc.gui
- * @param pres {CONST.STATUS} New presence state
- * @param external {boolean} True if triggered from other tab.
- */
- changePresence: function(pres, external) {
-
- if (external !== true) {
- jsxc.storage.setUserItem('presence', pres);
- }
-
- if (jsxc.master) {
- jsxc.xmpp.sendPres();
- }
-
- $('#jsxc_presence > span').text($('#jsxc_presence > ul .jsxc_' + pres).text());
-
- jsxc.gui.updatePresence('own', pres);
- },
-
- /**
- * Update all presence objects for given user.
- *
- * @memberOf jsxc.gui
- * @param bid bar jid of user.
- * @param {CONST.STATUS} pres New presence state.
- */
- updatePresence: function(bid, pres) {
-
- if (bid === 'own') {
- if (pres === 'dnd') {
- $('#jsxc_menu .jsxc_muteNotification').addClass('jsxc_disabled');
- jsxc.notification.muteSound(true);
- } else {
- $('#jsxc_menu .jsxc_muteNotification').removeClass('jsxc_disabled');
-
- if (!jsxc.options.get('muteNotification')) {
- jsxc.notification.unmuteSound(true);
- }
- }
- }
-
- $('.jsxc_presence[data-bid="' + bid + '"]').removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + pres);
- },
-
- /**
- * Switch read state to UNread.
- *
- * @memberOf jsxc.gui
- * @param bid
- */
- unreadMsg: function(bid) {
- var win = jsxc.gui.window.get(bid);
-
- jsxc.gui.roster.getItem(bid).add(win).addClass('jsxc_unreadMsg');
- jsxc.storage.updateUserItem('window', bid, 'unread', true);
- },
-
- /**
- * Switch read state to read.
- *
- * @memberOf jsxc.gui
- * @param bid
- */
- readMsg: function(bid) {
- var win = jsxc.gui.window.get(bid);
-
- if (win.hasClass('jsxc_unreadMsg')) {
- jsxc.gui.roster.getItem(bid).add(win).removeClass('jsxc_unreadMsg');
- jsxc.storage.updateUserItem('window', bid, 'unread', false);
- }
- },
-
- /**
- * This function searches for URI scheme according to XEP-0147.
- *
- * @memberOf jsxc.gui
- * @param container In which element should we search?
- */
- detectUriScheme: function(container) {
- container = (container) ? $(container) : $('body');
-
- container.find("a[href^='xmpp:']").each(function() {
-
- var element = $(this);
- var href = element.attr('href').replace(/^xmpp:/, '');
- var jid = href.split('?')[0];
- var action, params = {};
-
- if (href.indexOf('?') < 0) {
- action = 'message';
- } else {
- var pairs = href.substring(href.indexOf('?') + 1).split(';');
- action = pairs[0];
-
- var i, key, value;
- for (i = 1; i < pairs.length; i++) {
- key = pairs[i].split('=')[0];
- value = (pairs[i].indexOf('=') > 0) ? pairs[i].substring(pairs[i].indexOf('=') + 1) : null;
-
- params[decodeURIComponent(key)] = decodeURIComponent(value);
- }
- }
-
- if (typeof jsxc.gui.queryActions[action] === 'function') {
- element.addClass('jsxc_uriScheme jsxc_uriScheme_' + action);
-
- element.off('click').click(function(ev) {
- ev.stopPropagation();
-
- jsxc.gui.queryActions[action].call(jsxc, jid, params);
-
- return false;
- });
- }
- });
- },
-
- detectEmail: function(container) {
- container = (container) ? $(container) : $('body');
-
- container.find('a[href^="mailto:"]').each(function() {
- var spot = $("<span>X</span>").addClass("jsxc_spot");
- var href = $(this).attr("href").replace(/^ *mailto:/, "").trim();
-
- if (href !== '' && href !== Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))) {
- var bid = jsxc.jidToBid(href);
- var self = $(this);
- var s = self.prev();
-
- if (!s.hasClass('jsxc_spot')) {
- s = spot.clone().attr('data-bid', bid);
-
- self.before(s);
- }
-
- s.off('click');
-
- if (jsxc.storage.getUserItem('buddy', bid)) {
- jsxc.gui.update(bid);
- s.click(function() {
- jsxc.gui.window.open(bid);
-
- return false;
- });
- } else {
- s.click(function() {
- jsxc.gui.showContactDialog(href);
-
- return false;
- });
- }
- }
- });
- }
- };
-
- /**
- * Handle functions related to the gui of the roster
- *
- * @namespace jsxc.gui.roster
- */
- jsxc.gui.roster = {
-
- /**
- * Init the roster skeleton
- *
- * @memberOf jsxc.gui.roster
- * @returns {undefined}
- */
- init: function() {
- $(jsxc.options.rosterAppend + ':first').append($(jsxc.gui.template.get('roster')));
-
- if (jsxc.options.get('hideOffline')) {
- $('#jsxc_menu .jsxc_hideOffline').text(jsxc.translate('%%Show offline%%'));
- $('#jsxc_buddylist').addClass('jsxc_hideOffline');
- }
-
- $('#jsxc_menu .jsxc_settings').click(function() {
- jsxc.gui.showSettings();
- });
-
- $('#jsxc_menu .jsxc_hideOffline').click(function() {
- var hideOffline = !jsxc.options.get('hideOffline');
-
- if (hideOffline) {
- $('#jsxc_buddylist').addClass('jsxc_hideOffline');
- } else {
- $('#jsxc_buddylist').removeClass('jsxc_hideOffline');
- }
-
- $(this).text(hideOffline ? jsxc.translate('%%Show offline%%') : jsxc.translate('%%Hide offline%%'));
-
- jsxc.options.set('hideOffline', hideOffline);
- });
-
- if (jsxc.options.get('muteNotification')) {
- jsxc.notification.muteSound();
- }
-
- $('#jsxc_menu .jsxc_muteNotification').click(function() {
-
- if (jsxc.storage.getUserItem('presence') === 'dnd') {
- return;
- }
-
- // invert current choice
- var mute = !jsxc.options.get('muteNotification');
-
- if (mute) {
- jsxc.notification.muteSound();
- } else {
- jsxc.notification.unmuteSound();
- }
- });
-
- $('#jsxc_roster .jsxc_addBuddy').click(function() {
- jsxc.gui.showContactDialog();
- });
-
- $('#jsxc_roster .jsxc_onlineHelp').click(function() {
- window.open("http://www.jsxc.org/manual.html", "onlineHelp");
- });
-
- $('#jsxc_roster .jsxc_about').click(function() {
- jsxc.gui.showAboutDialog();
- });
-
- $('#jsxc_toggleRoster').click(function() {
- jsxc.gui.roster.toggle();
- });
-
- $('#jsxc_presence > ul > li').click(function() {
- var self = $(this);
-
- jsxc.gui.changePresence(self.data('pres'));
- });
-
- $('#jsxc_buddylist').slimScroll({
- distance: '3px',
- height: ($('#jsxc_roster').height() - 31) + 'px',
- width: $('#jsxc_buddylist').width() + 'px',
- color: '#fff',
- opacity: '0.5'
- });
-
- $('#jsxc_roster > .jsxc_bottom > div').each(function() {
- jsxc.gui.toggleList.call($(this));
- });
-
- if (jsxc.storage.getUserItem('roster') === 'hidden') {
- $('#jsxc_roster').css('right', '-200px');
- $('#jsxc_windowList > ul').css('paddingRight', '10px');
- }
-
- var pres = jsxc.storage.getUserItem('presence') || 'online';
- $('#jsxc_presence > span').text($('#jsxc_presence > ul .jsxc_' + pres).text());
- jsxc.gui.updatePresence('own', pres);
-
- jsxc.gui.tooltip('#jsxc_roster');
-
- jsxc.notice.load();
-
- $(document).trigger('ready.roster.jsxc');
- },
-
- /**
- * Create roster item and add it to the roster
- *
- * @param {String} bid bar jid
- */
- add: function(bid) {
- var data = jsxc.storage.getUserItem('buddy', bid);
- var bud = jsxc.gui.buddyTemplate.clone().attr('data-bid', bid).attr('data-type', data.type || 'chat');
-
- jsxc.gui.roster.insert(bid, bud);
-
- bud.click(function() {
- jsxc.gui.window.open(bid);
- });
-
- bud.find('.jsxc_chaticon').click(function() {
- jsxc.gui.window.open(bid);
- });
-
- bud.find('.jsxc_rename').click(function() {
- jsxc.gui.roster.rename(bid);
- return false;
- });
-
- bud.find('.jsxc_delete').click(function() {
- jsxc.gui.showRemoveDialog(bid);
- return false;
- });
-
- var expandClick = function() {
- bud.trigger('extra.jsxc');
-
- bud.toggleClass('jsxc_expand');
-
- jsxc.gui.updateAvatar(bud, data.jid, data.avatar);
- return false;
- };
-
- bud.find('.jsxc_control').click(expandClick);
- bud.dblclick(expandClick);
-
- bud.find('.jsxc_vcardicon').click(function() {
- jsxc.gui.showVcard(data.jid);
- return false;
- });
-
- jsxc.gui.update(bid);
-
- // update scrollbar
- $('#jsxc_buddylist').slimScroll({
- scrollTo: '0px'
- });
-
- $(document).trigger('add.roster.jsxc', [ bid, data, bud ]);
- },
-
- getItem: function(bid) {
- return $("#jsxc_buddylist > li[data-bid='" + bid + "']");
- },
-
- /**
- * Insert roster item. First order: online > away > offline. Second order:
- * alphabetical of the name
- *
- * @param {type} bid
- * @param {jquery} li roster item which should be insert
- * @returns {undefined}
- */
- insert: function(bid, li) {
-
- var data = jsxc.storage.getUserItem('buddy', bid);
- var listElements = $('#jsxc_buddylist > li');
- var insert = false;
-
- // Insert buddy with no mutual friendship to the end
- var status = (data.sub === 'both') ? data.status : -1;
-
- listElements.each(function() {
-
- var thisStatus = ($(this).data('sub') === 'both') ? $(this).data('status') : -1;
-
- if (($(this).data('name').toLowerCase() > data.name.toLowerCase() && thisStatus === status) || thisStatus < status) {
-
- $(this).before(li);
- insert = true;
-
- return false;
- }
- });
-
- if (!insert) {
- li.appendTo('#jsxc_buddylist');
- }
- },
-
- /**
- * Initiate reorder of roster item
- *
- * @param {type} bid
- * @returns {undefined}
- */
- reorder: function(bid) {
- jsxc.gui.roster.insert(bid, jsxc.gui.roster.remove(bid));
- },
-
- /**
- * Removes buddy from roster
- *
- * @param {String} bid bar jid
- * @return {JQueryObject} Roster list element
- */
- remove: function(bid) {
- return jsxc.gui.roster.getItem(bid).detach();
- },
-
- /**
- * Removes buddy from roster and clean up
- *
- * @param {String} bid bar compatible jid
- */
- purge: function(bid) {
- if (jsxc.master) {
- jsxc.storage.removeUserItem('buddy', bid);
- jsxc.storage.removeUserItem('otr', bid);
- jsxc.storage.removeUserItem('otr_version_' + bid);
- jsxc.storage.removeUserItem('chat', bid);
- jsxc.storage.removeUserItem('window', bid);
- jsxc.storage.removeUserElement('buddylist', bid);
- jsxc.storage.removeUserElement('windowlist', bid);
- }
-
- jsxc.gui.window._close(bid);
- jsxc.gui.roster.remove(bid);
- },
-
- /**
- * Create input element for rename action
- *
- * @param {type} bid
- * @returns {undefined}
- */
- rename: function(bid) {
- var name = jsxc.gui.roster.getItem(bid).find('.jsxc_name');
- var options = jsxc.gui.roster.getItem(bid).find('.jsxc_options, .jsxc_control');
- var input = $('<input type="text" name="name"/>');
-
- options.hide();
- name = name.replaceWith(input);
-
- input.val(name.text());
- input.keypress(function(ev) {
- if (ev.which !== 13) {
- return;
- }
-
- options.show();
- input.replaceWith(name);
- jsxc.gui.roster._rename(bid, $(this).val());
-
- $('html').off('click');
- });
-
- // Disable html click event, if click on input
- input.click(function() {
- return false;
- });
-
- $('html').one('click', function() {
- options.show();
- input.replaceWith(name);
- jsxc.gui.roster._rename(bid, input.val());
- });
- },
-
- /**
- * Rename buddy
- *
- * @param {type} bid
- * @param {type} newname new name of buddy
- * @returns {undefined}
- */
- _rename: function(bid, newname) {
- if (jsxc.master) {
- var d = jsxc.storage.getUserItem('buddy', bid);
- var iq = $iq({
- type: 'set'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- }).c('item', {
- jid: Strophe.getBareJidFromJid(d.jid),
- name: newname
- });
- jsxc.xmpp.conn.sendIQ(iq);
- }
-
- jsxc.storage.updateUserItem('buddy', bid, 'name', newname);
- jsxc.gui.update(bid);
- },
-
- /**
- * Toogle complete roster
- *
- * @param {Integer} d Duration in ms
- */
- toggle: function(d) {
- var duration = d || 500;
-
- var roster = $('#jsxc_roster');
- var wl = $('#jsxc_windowList');
-
- var roster_width = roster.innerWidth();
- var roster_right = parseFloat($('#jsxc_roster').css('right'));
- var state = (roster_right < 0) ? 'shown' : 'hidden';
-
- jsxc.storage.setUserItem('roster', state);
-
- roster.animate({
- right: ((roster_width + roster_right) * -1) + 'px'
- }, duration);
- wl.animate({
- right: (10 - roster_right) + 'px'
- }, duration);
-
- $(document).trigger('toggle.roster.jsxc', [ state, duration ]);
- },
-
- /**
- * Shows a text with link to a login box that no connection exists.
- */
- noConnection: function() {
- $('#jsxc_roster').addClass('jsxc_noConnection');
-
- $('#jsxc_roster').append($('<p>' + jsxc.l.no_connection + '</p>').append(' <a>' + jsxc.l.relogin + '</a>').click(function() {
- jsxc.gui.showLoginBox();
- }));
- },
-
- /**
- * Shows a text with link to add a new buddy.
- *
- * @memberOf jsxc.gui.roster
- */
- empty: function() {
- var text = $('<p>' + jsxc.l.Your_roster_is_empty_add_a + '</p>');
- var link = $('<a>' + jsxc.l.new_buddy + '</a>');
-
- link.click(function() {
- jsxc.gui.showContactDialog();
- });
- text.append(link);
- text.append('.');
-
- $('#jsxc_roster').prepend(text);
- }
- };
-
- /**
- * Wrapper for dialog
- *
- * @namespace jsxc.gui.dialog
- */
- jsxc.gui.dialog = {
- /**
- * Open a Dialog.
- *
- * @memberOf jsxc.gui.dialog
- * @param {String} data Data of the dialog
- * @param {Object} [o] Options for the dialog
- * @param {Boolean} [o.noClose] If true, hide all default close options
- * @returns {jQuery} Dialog object
- */
- open: function(data, o) {
-
- var opt = o || {};
-
- // default options
- var options = {};
- options = {
- onComplete: function() {
- $('#jsxc_dialog .jsxc_close').click(function(ev) {
- ev.preventDefault();
-
- jsxc.gui.dialog.close();
- });
-
- // workaround for old colorbox version (used by firstrunwizard)
- if (options.closeButton === false) {
- $('#cboxClose').hide();
- }
-
- $.colorbox.resize();
-
- $(document).trigger('complete.dialog.jsxc');
- },
- onClosed: function() {
- $(document).trigger('close.dialog.jsxc');
- },
- onCleanup: function() {
- $(document).trigger('cleanup.dialog.jsxc');
- },
- opacity: 0.5
- };
-
- if (opt.noClose) {
- options.overlayClose = false;
- options.escKey = false;
- options.closeButton = false;
- delete opt.noClose;
- }
-
- $.extend(options, opt);
-
- options.html = '<div id="jsxc_dialog">' + data + '</div>';
-
- $.colorbox(options);
-
- return $('#jsxc_dialog');
- },
-
- /**
- * Close current dialog.
- */
- close: function() {
- jsxc.debug('close dialog');
- $.colorbox.close();
- },
-
- /**
- * Resizes current dialog.
- *
- * @param {Object} options e.g. width and height
- */
- resize: function(options) {
- $.colorbox.resize(options);
- }
- };
-
- /**
- * Handle functions related to the gui of the window
- *
- * @namespace jsxc.gui.window
- */
- jsxc.gui.window = {
- /**
- * Init a window skeleton
- *
- * @memberOf jsxc.gui.window
- * @param {String} bid
- * @returns {jQuery} Window object
- */
- init: function(bid) {
- if (jsxc.gui.window.get(bid).length > 0) {
- return jsxc.gui.window.get(bid);
- }
-
- var win = jsxc.gui.windowTemplate.clone().attr('data-bid', bid).hide().appendTo('#jsxc_windowList > ul').show('slow');
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- // Attach jid to window
- win.data('jid', data.jid);
-
- // Add handler
-
- jsxc.gui.toggleList.call(win.find('.jsxc_settings'));
-
- win.find('.jsxc_verification').click(function() {
- jsxc.gui.showVerification(bid);
- });
-
- win.find('.jsxc_fingerprints').click(function() {
- jsxc.gui.showFingerprints(bid);
- });
-
- win.find('.jsxc_transfer').click(function() {
- jsxc.otr.toggleTransfer(bid);
- });
-
- win.find('.jsxc_bar').click(function() {
- jsxc.gui.window.toggle(bid);
- });
-
- win.find('.jsxc_close').click(function() {
- jsxc.gui.window.close(bid);
- });
-
- win.find('.jsxc_clear').click(function() {
- jsxc.gui.window.clear(bid);
- });
-
- win.find('.jsxc_tools').click(function() {
- return false;
- });
-
- win.find('.jsxc_textinput').keyup(function(ev) {
- var body = $(this).val();
-
- if (ev.which === 13) {
- body = '';
- }
-
- jsxc.storage.updateUserItem('window', bid, 'text', body);
-
- if (ev.which === 27) {
- jsxc.gui.window.close(bid);
- }
- }).keypress(function(ev) {
- if (ev.which !== 13 || !$(this).val()) {
- return;
- }
-
- jsxc.gui.window.postMessage(bid, 'out', $(this).val());
-
- $(this).val('');
- }).focus(function() {
- // remove unread flag
- jsxc.gui.readMsg(bid);
- }).mouseenter(function() {
- $('#jsxc_windowList').data('isOver', true);
- }).mouseleave(function() {
- $('#jsxc_windowList').data('isOver', false);
- });
-
- win.find('.jsxc_textarea').click(function() {
- win.find('.jsxc_textinput').focus();
- });
-
- win.find('.jsxc_textarea').slimScroll({
- height: '234px',
- distance: '3px'
- });
-
- win.find('.jsxc_fade').hide();
-
- win.find('.jsxc_name').disableSelection();
-
- win.find('.slimScrollDiv').resizable({
- handles: 'w, nw, n',
- minHeight: 234,
- minWidth: 250,
- resize: function(event, ui) {
- win.width(ui.size.width);
- win.find('.jsxc_textarea').slimScroll({
- height: ui.size.height
- });
- win.find('.jsxc_emoticons').css('top', (ui.size.height + 6) + 'px');
- }
- });
-
- if ($.inArray(bid, jsxc.storage.getUserItem('windowlist')) < 0) {
-
- // add window to windowlist
- var wl = jsxc.storage.getUserItem('windowlist');
- wl.push(bid);
- jsxc.storage.setUserItem('windowlist', wl);
-
- // init window element in storage
- jsxc.storage.setUserItem('window', bid, {
- minimize: true,
- text: '',
- unread: false
- });
- } else {
-
- if (jsxc.storage.getUserItem('window', bid).unread) {
- jsxc.gui.unreadMsg(bid);
- }
- }
-
- $.each(jsxc.gui.emotions, function(i, val) {
- var ins = val[0].split(' ')[0];
- var li = $('<li><div title="' + ins + '" class="jsxc_' + val[1] + '"/></li>');
- li.click(function() {
- win.find('input').val(win.find('input').val() + ins);
- win.find('input').focus();
- });
- win.find('.jsxc_emoticons ul').append(li);
- });
-
- jsxc.gui.toggleList.call(win.find('.jsxc_emoticons'));
-
- jsxc.gui.window.restoreChat(bid);
-
- jsxc.gui.update(bid);
-
- jsxc.gui.updateWindowListSB();
-
- // create related otr object
- if (jsxc.master && !jsxc.otr.objects[bid]) {
- jsxc.otr.create(bid);
- } else {
- jsxc.otr.enable(bid);
- }
-
- $(document).trigger('init.window.jsxc', [ win ]);
-
- return win;
- },
-
- /**
- * Returns the window element
- *
- * @param {String} bid
- * @returns {jquery} jQuery object of the window element
- */
- get: function(id) {
- return $("li.jsxc_windowItem[data-bid='" + jsxc.jidToBid(id) + "']");
- },
-
- /**
- * Open a window, related to the bid. If the window doesn't exist, it will
- * be created.
- *
- * @param {String} bid
- * @returns {jQuery} Window object
- */
- open: function(bid) {
- var win = jsxc.gui.window.init(bid);
- jsxc.gui.window.show(bid);
- jsxc.gui.window.highlight(bid);
-
- var padding = $("#jsxc_windowListSB").width();
- var innerWidth = $('#jsxc_windowList>ul').width();
- var outerWidth = $('#jsxc_windowList').width() - padding;
-
- if (innerWidth > outerWidth) {
- var offset = parseInt($('#jsxc_windowList>ul').css('right'));
- var width = win.outerWidth(true);
-
- var right = innerWidth - win.position().left - width + offset;
- var left = outerWidth - (innerWidth - win.position().left) - offset;
-
- if (left < 0) {
- jsxc.gui.scrollWindowListBy(left * -1);
- }
-
- if (right < 0) {
- jsxc.gui.scrollWindowListBy(right);
- }
- }
-
- return win;
- },
-
- /**
- * Close chatwindow and clean up
- *
- * @param {String} bid bar jid
- */
- close: function(bid) {
-
- if (jsxc.gui.window.get(bid).length === 0) {
- jsxc.warn('Want to close a window, that is not open.');
- return;
- }
-
- jsxc.storage.removeUserElement('windowlist', bid);
- jsxc.storage.removeUserItem('window', bid);
-
- if (jsxc.storage.getUserItem('buddylist').indexOf(bid) < 0) {
- // delete data from unknown sender
-
- jsxc.storage.removeUserItem('buddy', bid);
- jsxc.storage.removeUserItem('chat', bid);
- }
-
- jsxc.gui.window._close(bid);
- },
-
- /**
- * Close chatwindow
- *
- * @param {String} bid
- */
- _close: function(bid) {
- jsxc.gui.window.get(bid).hide('slow', function() {
- $(this).remove();
-
- jsxc.gui.updateWindowListSB();
- });
- },
-
- /**
- * Toggle between minimize and maximize of the text area
- *
- * @param {String} bid bar jid
- */
- toggle: function(bid) {
-
- var win = jsxc.gui.window.get(bid);
-
- if (win.parents("#jsxc_windowList").length === 0) {
- return;
- }
-
- if (win.find('.jsxc_fade').is(':hidden')) {
- jsxc.gui.window.show(bid);
- } else {
- jsxc.gui.window.hide(bid);
- }
-
- jsxc.gui.updateWindowListSB();
- },
-
- /**
- * Maximize text area and save
- *
- * @param {String} bid
- */
- show: function(bid) {
-
- jsxc.storage.updateUserItem('window', bid, 'minimize', false);
-
- jsxc.gui.window._show(bid);
- },
-
- /**
- * Maximize text area
- *
- * @param {String} bid
- * @returns {undefined}
- */
- _show: function(bid) {
- var win = jsxc.gui.window.get(bid);
- jsxc.gui.window.get(bid).find('.jsxc_fade').slideDown();
- win.removeClass('jsxc_min');
-
- // If the area is hidden, the scrolldown function doesn't work. So we
- // call it here.
- jsxc.gui.window.scrollDown(bid);
-
- if (jsxc.restoreCompleted) {
- win.find('.jsxc_textinput').focus();
- }
-
- win.trigger('show.window.jsxc');
- },
-
- /**
- * Minimize text area and save
- *
- * @param {String} bid
- */
- hide: function(bid) {
- jsxc.storage.updateUserItem('window', bid, 'minimize', true);
-
- jsxc.gui.window._hide(bid);
- },
-
- /**
- * Minimize text area
- *
- * @param {String} bid
- */
- _hide: function(bid) {
- jsxc.gui.window.get(bid).addClass('jsxc_min').find(' .jsxc_fade').slideUp();
-
- jsxc.gui.window.get(bid).trigger('hidden.window.jsxc');
- },
-
- /**
- * Highlight window
- *
- * @param {type} bid
- */
- highlight: function(bid) {
- var el = jsxc.gui.window.get(bid).find(' .jsxc_bar');
-
- if (!el.is(':animated')) {
- el.effect('highlight', {
- color: 'orange'
- }, 2000);
- }
- },
-
- /**
- * Scroll chat area to the bottom
- *
- * @param {String} bid bar jid
- */
- scrollDown: function(bid) {
- var chat = jsxc.gui.window.get(bid).find('.jsxc_textarea');
-
- // check if chat exist
- if (chat.length === 0) {
- return;
- }
-
- chat.slimScroll({
- scrollTo: (chat.get(0).scrollHeight + 'px')
- });
- },
-
- /**
- * Write Message to chat area and save
- *
- * @param {String} bid bar jid
- * @param {String} direction 'in' message is received or 'out' message is
- * send
- * @param {String} msg Message to display
- * @param {boolean} encrypted Was this message encrypted? Default: false
- * @param {boolean} forwarded Was this message forwarded? Default: false
- * @param {integer} stamp Timestamp
- */
- postMessage: function(bid, direction, msg, encrypted, forwarded, stamp) {
- var data = jsxc.storage.getUserItem('buddy', bid);
- var html_msg = msg;
-
- // remove html tags and reencode html tags
- msg = jsxc.removeHTML(msg);
- msg = jsxc.escapeHTML(msg);
-
- // exceptions:
-
- if (direction === 'out' && data.msgstate === OTR.CONST.MSGSTATE_FINISHED && forwarded !== true) {
- direction = 'sys';
- msg = jsxc.l.your_message_wasnt_send_please_end_your_private_conversation;
- }
-
- if (direction === 'in' && data.msgstate === OTR.CONST.MSGSTATE_FINISHED) {
- direction = 'sys';
- msg = jsxc.l.unencrypted_message_received + ' ' + msg;
- }
-
- if (direction === 'out' && data.sub === 'from') {
- direction = 'sys';
- msg = jsxc.l.your_message_wasnt_send_because_you_have_no_valid_subscription;
- }
-
- encrypted = encrypted || data.msgstate === OTR.CONST.MSGSTATE_ENCRYPTED;
- var post = jsxc.storage.saveMessage(bid, direction, msg, encrypted, forwarded, stamp);
-
- if (direction === 'in') {
- $(document).trigger('postmessagein.jsxc', [ bid, html_msg ]);
- }
-
- if (direction === 'out' && jsxc.master && forwarded !== true) {
- jsxc.xmpp.sendMessage(bid, html_msg, post.uid);
- }
-
- jsxc.gui.window._postMessage(bid, post);
-
- if (direction === 'out' && msg === '?') {
- jsxc.gui.window.postMessage(bid, 'sys', '42');
- }
- },
-
- /**
- * Write Message to chat area
- *
- * @param {String} bid bar jid
- * @param {Object} post Post object with direction, msg, uid, received
- * @param {Bool} restore If true no highlights are used and so unread flag
- * set
- */
- _postMessage: function(bid, post, restore) {
- var win = jsxc.gui.window.get(bid);
- var msg = post.msg;
- var direction = post.direction;
- var uid = post.uid;
-
- if (win.find('.jsxc_textinput').is(':not(:focus)') && jsxc.restoreCompleted && direction === 'in' && !restore) {
- jsxc.gui.window.highlight(bid);
- }
-
- msg = msg.replace(jsxc.CONST.REGEX.URL, function(url) {
-
- var href = (url.match(/^https?:\/\//i)) ? url : 'http://' + url;
-
- return '<a href="' + href + '" target="_blank">' + url + '</a>';
- });
-
- msg = msg.replace(new RegExp('(xmpp:)?(' + jsxc.CONST.REGEX.JID.source + ')(\\?[^\\s]+\\b)?', 'i'), function(match, protocol, jid, action) {
- if (protocol === 'xmpp:') {
- if (typeof action === 'string') {
- jid += action;
- }
-
- return '<a href="xmpp:' + jid + '">' + jid + '</a>';
- }
-
- return '<a href="mailto:' + jid + '" target="_blank">' + jid + '</a>';
- });
-
- $.each(jsxc.gui.emotions, function(i, val) {
- msg = msg.replace(val[2], function(match, p1) {
-
- // escape value for alt and title, this prevents double
- // replacement
- var esc = '', i;
- for (i = 0; i < p1.length; i++) {
- esc += '&#' + p1.charCodeAt(i) + ';';
- }
-
- return '<div title="' + esc + '" class="jsxc_emoticon jsxc_' + val[1] + '"/>';
- });
- });
-
- var msgDiv = $("<div>"), msgTsDiv = $("<div>");
- msgDiv.addClass('jsxc_chatmessage jsxc_' + direction);
- msgDiv.attr('id', uid);
- msgDiv.html('<div>' + msg + '</div>');
- msgTsDiv.addClass('jsxc_timestamp');
- msgTsDiv.html(jsxc.getFormattedTime(post.stamp));
-
- if (post.received || false) {
- msgDiv.addClass('jsxc_received');
- }
-
- if (post.forwarded) {
- msgDiv.addClass('jsxc_forwarded');
- }
-
- if (post.encrypted) {
- msgDiv.addClass('jsxc_encrypted');
- }
-
- if (direction === 'sys') {
- jsxc.gui.window.get(bid).find('.jsxc_textarea').append('<div style="clear:both"/>');
- } else if (typeof post.stamp !== 'undefined') {
- msgDiv.append(msgTsDiv);
- }
-
- win.find('.jsxc_textarea').append(msgDiv);
-
- jsxc.gui.detectUriScheme(win);
- jsxc.gui.detectEmail(win);
-
- jsxc.gui.window.scrollDown(bid);
-
- // if window has no focus set unread flag
- if (!win.find('.jsxc_textinput').is(':focus') && jsxc.restoreCompleted && !restore) {
- jsxc.gui.unreadMsg(bid);
- }
- },
-
- /**
- * Set text into input area
- *
- * @param {type} bid
- * @param {type} text
- * @returns {undefined}
- */
- setText: function(bid, text) {
- jsxc.gui.window.get(bid).find('.jsxc_textinput').val(text);
- },
-
- /**
- * Load old log into chat area
- *
- * @param {type} bid
- * @returns {undefined}
- */
- restoreChat: function(bid) {
- var chat = jsxc.storage.getUserItem('chat', bid);
-
- while (chat !== null && chat.length > 0) {
- var c = chat.pop();
- jsxc.gui.window._postMessage(bid, c, true);
- }
- },
-
- /**
- * Clear chat history
- *
- * @param {type} bid
- * @returns {undefined}
- */
- clear: function(bid) {
- jsxc.storage.setUserItem('chat', bid, []);
- jsxc.gui.window.get(bid).find('.jsxc_textarea').empty();
- }
- };
-
- /**
- * Hold all HTML templates.
- *
- * @namespace jsxc.gui.template
- */
- jsxc.gui.template = {
- /**
- * Return requested template and replace all placeholder
- *
- * @memberOf jsxc.gui.template;
- * @param {type} name template name
- * @param {type} bid
- * @param {type} msg
- * @returns {String} HTML Template
- */
- get: function(name, bid, msg) {
-
- // common placeholder
- var ph = {
- my_priv_fingerprint: jsxc.storage.getUserItem('priv_fingerprint') ? jsxc.storage.getUserItem('priv_fingerprint').replace(/(.{8})/g, '$1 ') : jsxc.l.not_available,
- my_jid: jsxc.storage.getItem('jid') || '',
- my_node: Strophe.getNodeFromJid(jsxc.storage.getItem('jid') || '') || '',
- root: jsxc.options.root,
- app_name: jsxc.options.app_name
- };
-
- // placeholder depending on bid
- if (bid) {
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- $.extend(ph, {
- bid_priv_fingerprint: (data && data.fingerprint) ? data.fingerprint.replace(/(.{8})/g, '$1 ') : jsxc.l.not_available,
- bid_jid: bid,
- bid_name: (data && data.name) ? data.name : bid
- });
- }
-
- // placeholder depending on msg
- if (msg) {
- $.extend(ph, {
- msg: msg
- });
- }
-
- var ret = jsxc.gui.template[name];
-
- if (typeof (ret) === 'string') {
- ret = jsxc.translate(ret);
-
- ret = ret.replace(/\{\{([a-zA-Z0-9_\-]+)\}\}/g, function(s, key) {
- return (typeof ph[key] === 'string') ? ph[key] : s;
- });
-
- return ret;
- }
-
- jsxc.debug('Template not available: ' + name);
- return name;
- },
- authenticationDialog: '<h3>Verification</h3>\
- <p>%%Authenticating_a_buddy_helps_%%</p>\
- <div>\
- <p style="margin:0px;">%%How_do_you_want_to_authenticate_your_buddy%%</p>\
- <select size="1">\
- <option>%%Select_method%%</option>\
- <option>%%Manual%%</option>\
- <option>%%Question%%</option>\
- <option>%%Secret%%</option>\
- </select>\
- </div>\
- <div style="display:none">\
- <p class=".jsxc_explanation">%%To_verify_the_fingerprint_%%</p>\
- <p><strong>%%Your_fingerprint%%</strong><br />\
- <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p>\
- <p><strong>%%Buddy_fingerprint%%</strong><br />\
- <span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br />\
- <p class="jsxc_right"><a href="#" class="jsxc_close button">%%Close%%</a> <a href="#" class="button creation">%%Compared%%</a></p>\
- </div>\
- <div style="display:none">\
- <p class=".jsxc_explanation">%%To_authenticate_using_a_question_%%</p>\
- <p><label for="jsxc_quest">%%Question%%:</label><input type="text" name="quest" id="jsxc_quest" /></p>\
- <p><label for="jsxc_secret2">%%Secret%%:</label><input type="text" name="secret2" id="jsxc_secret2" /></p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Ask%%</a></p>\
- </div>\
- <div style="display:none">\
- <p class=".jsxc_explanation">%%To_authenticate_pick_a_secret_%%</p>\
- <p><label for="jsxc_secret">%%Secret%%:</label><input type="text" name="secret" id="jsxc_secret" /></p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Compare%%</a></p>\
- </div>',
- fingerprintsDialog: '<div>\
- <p class="jsxc_maxWidth">%%A_fingerprint_%%</p>\
- <p><strong>%%Your_fingerprint%%</strong><br />\
- <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p>\
- <p><strong>%%Buddy_fingerprint%%</strong><br />\
- <span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br />\
- <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a></p>\
- </div>',
- chatWindow: '<li class="jsxc_min jsxc_windowItem">\
- <div class="jsxc_window">\
- <div class="jsxc_bar">\
- <div class="jsxc_avatar">☺</div>\
- <div class="jsxc_tools">\
- <div class="jsxc_settings">\
- <ul>\
- <li class="jsxc_fingerprints jsxc_otr jsxc_disabled">%%Fingerprints%%</li>\
- <li class="jsxc_verification">%%Authentication%%</li>\
- <li class="jsxc_transfer jsxc_otr jsxc_disabled">%%start_private%%</li>\
- <li class="jsxc_clear">%%clear_history%%</li>\
- </ul>\
- </div>\
- <div class="jsxc_transfer jsxc_otr jsxc_disabled"/>\
- <div class="jsxc_close">×</div>\
- </div>\
- <div class="jsxc_name"/>\
- <div class="jsxc_cycle"/>\
- </div>\
- <div class="jsxc_fade">\
- <div class="jsxc_gradient"/>\
- <div class="jsxc_textarea"/>\
- <div class="jsxc_emoticons"><ul/></div>\
- <input type="text" class="jsxc_textinput" placeholder="...%%Message%%" />\
- </div>\
- </div>\
- </li>',
- roster: '<div id="jsxc_roster">\
- <ul id="jsxc_buddylist"></ul>\
- <div class="jsxc_bottom jsxc_presence" data-bid="own">\
- <div id="jsxc_avatar">\
- <div class="jsxc_avatar">☺</div>\
- </div>\
- <div id="jsxc_menu">\
- <span></span>\
- <ul>\
- <li class="jsxc_settings">%%Settings%%</li>\
- <li class="jsxc_muteNotification">%%Mute%%</li>\
- <li class="jsxc_addBuddy">%%Add_buddy%%</li>\
- <li class="jsxc_hideOffline">%%Hide offline%%</li>\
- <li class="jsxc_onlineHelp">%%Online help%%</li>\
- <li class="jsxc_about">%%About%%</li>\
- </ul>\
- </div>\
- <div id="jsxc_notice">\
- <span></span>\
- <ul></ul>\
- </div>\
- <div id="jsxc_presence">\
- <span>%%Online%%</span>\
- <ul>\
- <li data-pres="online" class="jsxc_online">%%Online%%</li>\
- <li data-pres="chat" class="jsxc_chat">%%Chatty%%</li>\
- <li data-pres="away" class="jsxc_away">%%Away%%</li>\
- <li data-pres="xa" class="jsxc_xa">%%Extended away%%</li>\
- <li data-pres="dnd" class="jsxc_dnd">%%dnd%%</li>\
- <!-- <li data-pres="offline" class="jsxc_offline">%%Offline%%</li> -->\
- </ul>\
- </div>\
- </div>\
- <div id="jsxc_toggleRoster"></div>\
- </div>',
- windowList: '<div id="jsxc_windowList">\
- <ul></ul>\
- </div>\
- <div id="jsxc_windowListSB">\
- <div class="jsxc_scrollLeft jsxc_disabled">&lt;</div>\
- <div class="jsxc_scrollRight jsxc_disabled">&gt;</div>\
- </div>',
- rosterBuddy: '<li>\
- <div class="jsxc_avatar">☺</div>\
- <div class="jsxc_control"></div>\
- <div class="jsxc_name"/>\
- <div class="jsxc_options jsxc_right">\
- <div class="jsxc_rename" title="%%rename_buddy%%">✎</div>\
- <div class="jsxc_delete" title="%%delete_buddy%%">✘</div>\
- </div>\
- <div class="jsxc_options jsxc_left">\
- <div class="jsxc_chaticon" title="%%send_message%%"/>\
- <div class="jsxc_vcardicon" title="%%get_info%%">i</div>\
- </div>\
- </li>',
- loginBox: '<h3>%%Login%%</h3>\
- <form>\
- <p><label for="jsxc_username">%%Username%%:</label>\
- <input type="text" name="username" id="jsxc_username" required="required" value="{{my_node}}"/></p>\
- <p><label for="jsxc_password">%%Password%%:</label>\
- <input type="password" name="password" required="required" id="jsxc_password" /></p>\
- <div class="bottom_submit_section">\
- <input type="reset" class="button jsxc_close" name="clear" value="%%Cancel%%"/>\
- <input type="submit" class="button creation" name="commit" value="%%Connect%%"/>\
- </div>\
- </form>',
- contactDialog: '<h3>%%Add_buddy%%</h3>\
- <p class=".jsxc_explanation">%%Type_in_the_full_username_%%</p>\
- <form>\
- <p><label for="jsxc_username">* %%Username%%:</label>\
- <input type="text" name="username" id="jsxc_username" pattern="^[^\\x22&\'\\/:<>@\\s]+(@[.\\-_\\w]+)?" required="required" /></p>\
- <p><label for="jsxc_alias">%%Alias%%:</label>\
- <input type="text" name="alias" id="jsxc_alias" /></p>\
- <p class="jsxc_right">\
- <input class="button" type="submit" value="%%Add%%" />\
- </p>\
- <form>',
- approveDialog: '<h3>%%Subscription_request%%</h3>\
- <p>%%You_have_a_request_from%% <b class="jsxc_their_jid"></b>.</p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_deny">%%Deny%%</a> <a href="#" class="button creation jsxc_approve">%%Approve%%</a></p>',
- removeDialog: '<h3>%%Remove buddy%%</h3>\
- <p class="jsxc_maxWidth">%%You_are_about_to_remove_%%</p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_cancel jsxc_close">%%Cancel%%</a> <a href="#" class="button creation">%%Remove%%</a></p>',
- waitAlert: '<h3>{{msg}}</h3>\
- <p>%%Please_wait%%</p>\
- <p class="jsxc_center"><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /></p>',
- alert: '<h3>%%Alert%%</h3>\
- <p>{{msg}}</p>\
- <p class="jsxc_right"><a href="#" class="button jsxc_close jsxc_cancel">%%Ok%%</a></p>',
- authFailDialog: '<h3>%%Login_failed%%</h3>\
- <p>%%Sorry_we_cant_authentikate_%%</p>\
- <p class="jsxc_right">\
- <a class="button jsxc_cancel">%%Continue_without_chat%%</a>\
- <a class="button creation">%%Retry%%</a>\
- </p>',
- confirmDialog: '<p>{{msg}}</p>\
- <p class="jsxc_right">\
- <a class="button jsxc_cancel jsxc_close">%%Dismiss%%</a>\
- <a class="button creation">%%Confirm%%</a>\
- </p>',
- pleaseAccept: '<p>%%Please_accept_%%</p>',
- aboutDialog: '<h3>JavaScript XMPP Chat</h3>\
- <p><b>Version: </b>' + jsxc.version + '<br />\
- <a href="http://jsxc.org/" target="_blank">www.jsxc.org</a><br />\
- <br />\
- <i>Released under the MIT license</i><br />\
- <br />\
- Real-time chat app for {{app_name}} and more.<br />\
- Requires an external <a href="https://xmpp.org/xmpp-software/servers/" target="_blank">XMPP server</a>.<br />\
- <br />\
- <b>Credits: </b> <a href="http://www.beepzoid.com/old-phones/" target="_blank">David English (Ringtone)</a>,\
- <a href="https://soundcloud.com/freefilmandgamemusic/ping-1?in=freefilmandgamemusic/sets/free-notification-sounds-and" target="_blank">CameronMusic (Ping)</a></p>\
- <p class="jsxc_right"><a class="button jsxc_debuglog" href="#">Show debug log</a></p>',
- vCard: '<h3>%%Info_about%% {{bid_name}}</h3>\
- <ul class="jsxc_vCard"></ul>\
- <p><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /> %%Please_wait%%...</p>',
- settings: '<h3>%%User_settings%%</h3>\
- <p></p>\
- <form>\
- <fieldset class="jsxc_fieldsetXmpp jsxc_fieldset">\
- <legend>%%Login options%%</legend>\
- <label for="xmpp-url">%%BOSH url%%</label><input type="text" id="xmpp-url" readonly="readonly"/><br />\
- <label for="xmpp-username">%%Username%%</label><input type="text" id="xmpp-username"/><br />\
- <label for="xmpp-domain">%%Domain%%</label><input type="text" id="xmpp-domain"/><br />\
- <label for="xmpp-resource">%%Resource%%</label><input type="text" id="xmpp-resource"/><br />\
- <label for="xmpp-onlogin">%%On login%%</label><input type="checkbox" id="xmpp-onlogin" /><br />\
- <input type="submit" value="%%Save%%"/>\
- </fieldset>\
- </form>\
- <p></p>\
- <form>\
- <fieldset class="jsxc_fieldsetPriority jsxc_fieldset">\
- <legend>%%Priority%%</legend>\
- <label for="priority-online">%%Online%%</label><input type="number" value="0" id="priority-online" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-chat">%%Chatty%%</label><input type="number" value="0" id="priority-chat" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-away">%%Away%%</label><input type="number" value="0" id="priority-away" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-xa">%%Extended_away%%</label><input type="number" value="0" id="priority-xa" min="-128" max="127" step="1" required="required"/><br />\
- <label for="priority-dnd">%%dnd%%</label><input type="number" value="0" id="priority-dnd" min="-128" max="127" step="1" required="required"/><br />\
- <input type="submit" value="%%Save%%"/>\
- </fieldset>\
- </form>\
- <p></p>\
- <form data-onsubmit="xmpp.carbons.refresh">\
- <fieldset class="jsxc_fieldsetCarbons jsxc_fieldset">\
- <legend>%%Carbon copy%%</legend>\
- <label for="carbons-enable">%%Enable%%</label><input type="checkbox" id="carbons-enable" /><br />\
- <input type="submit" value="%%Save%%"/>\
- </fieldset>\
- </form>'
- };
-
- /**
- * Handle XMPP stuff.
- *
- * @namespace jsxc.xmpp
- */
- jsxc.xmpp = {
- conn: null, // connection
-
- /**
- * Create new connection or attach to old
- *
- * @name login
- * @memberOf jsxc.xmpp
- */
- /**
- * Create new connection with given parameters.
- *
- * @name login^2
- * @param {string} jid
- * @param {string} password
- * @memberOf jsxc.xmpp
- */
- /**
- * Attach connection with given parameters.
- *
- * @name login^3
- * @param {string} jid
- * @param {string} sid
- * @param {string} rid
- * @memberOf jsxc.xmpp
- */
- login: function() {
-
- if (jsxc.xmpp.conn && jsxc.xmpp.conn.connected) {
- return;
- }
-
- var jid = null, password = null, sid = null, rid = null;
-
- switch (arguments.length) {
- case 2:
- jid = arguments[0];
- password = arguments[1];
- break;
- case 3:
- jid = arguments[0];
- sid = arguments[1];
- rid = arguments[2];
- break;
- default:
- jid = jsxc.storage.getItem('jid');
- sid = jsxc.storage.getItem('sid');
- rid = jsxc.storage.getItem('rid');
- }
-
- var url = jsxc.options.get('xmpp').url;
-
- // Register eventlistener
- $(document).on('connected.jsxc', jsxc.xmpp.connected);
- $(document).on('attached.jsxc', jsxc.xmpp.attached);
- $(document).on('disconnected.jsxc', jsxc.xmpp.disconnected);
- $(document).on('ridChange', jsxc.xmpp.onRidChange);
- $(document).on('connfail.jsxc', jsxc.xmpp.onConnfail);
- $(document).on('authfail.jsxc', jsxc.xmpp.onAuthFail);
-
- Strophe.addNamespace('RECEIPTS', 'urn:xmpp:receipts');
-
- // Create new connection (no login)
- jsxc.xmpp.conn = new Strophe.Connection(url);
-
- // Override default function to preserve unique id
- var stropheGetUniqueId = jsxc.xmpp.conn.getUniqueId;
- jsxc.xmpp.conn.getUniqueId = function(suffix) {
- var uid = stropheGetUniqueId.call(jsxc.xmpp.conn, suffix);
- jsxc.storage.setItem('_uniqueId', jsxc.xmpp.conn._uniqueId);
-
- return uid;
- };
-
- if (jsxc.storage.getItem('debug') === true) {
- jsxc.xmpp.conn.xmlInput = function(data) {
- console.log('<', data);
- };
- jsxc.xmpp.conn.xmlOutput = function(data) {
- console.log('>', data);
- };
- }
-
- var callback = function(status, condition) {
-
- jsxc.debug(Object.getOwnPropertyNames(Strophe.Status)[status] + ': ' + condition);
-
- switch (status) {
- case Strophe.Status.CONNECTED:
- jsxc.bid = jsxc.jidToBid(jsxc.xmpp.conn.jid.toLowerCase());
- $(document).trigger('connected.jsxc');
- break;
- case Strophe.Status.ATTACHED:
- $(document).trigger('attached.jsxc');
- break;
- case Strophe.Status.DISCONNECTED:
- $(document).trigger('disconnected.jsxc');
- break;
- case Strophe.Status.CONNFAIL:
- $(document).trigger('connfail.jsxc');
- break;
- case Strophe.Status.AUTHFAIL:
- $(document).trigger('authfail.jsxc');
- break;
- }
- };
-
- if (jsxc.xmpp.conn.caps) {
- jsxc.xmpp.conn.caps.node = 'http://jsxc.org/';
- }
-
- if (jsxc.restore && sid && rid) {
- jsxc.debug('Try to attach');
- jsxc.debug('SID: ' + sid);
- jsxc.xmpp.conn.attach(jid, sid, rid, callback);
- } else {
- jsxc.debug('New connection');
-
- if (jsxc.xmpp.conn.caps) {
- // Add system handler, because user handler isn't called before
- // we are authenticated
- jsxc.xmpp.conn._addSysHandler(function(stanza) {
- var from = jsxc.xmpp.conn.domain, c = stanza.querySelector('c'), ver = c.getAttribute('ver'), node = c.getAttribute('node');
-
- var _jidNodeIndex = JSON.parse(localStorage.getItem('strophe.caps._jidNodeIndex')) || {};
-
- jsxc.xmpp.conn.caps._jidVerIndex[from] = ver;
- _jidNodeIndex[from] = node;
-
- localStorage.setItem('strophe.caps._jidVerIndex', JSON.stringify(jsxc.xmpp.conn.caps._jidVerIndex));
- localStorage.setItem('strophe.caps._jidNodeIndex', JSON.stringify(_jidNodeIndex));
- }, Strophe.NS.CAPS);
- }
-
- jsxc.xmpp.conn.connect(jid || jsxc.options.xmpp.jid, password || jsxc.options.xmpp.password, callback);
- }
- },
-
- /**
- * Logs user out of his xmpp session and does some clean up.
- *
- * @returns {Boolean}
- */
- logout: function() {
-
- // instruct all tabs
- jsxc.storage.removeItem('sid');
-
- // clean up
- jsxc.storage.removeUserItem('buddylist');
- jsxc.storage.removeUserItem('windowlist');
- jsxc.storage.removeItem('_uniqueId');
-
- if (!jsxc.master) {
- $('#jsxc_roster').remove();
- $('#jsxc_windowlist').remove();
- return true;
- }
-
- if (jsxc.xmpp.conn === null) {
- return true;
- }
-
- // Hide dropdown menu
- $('body').click();
-
- jsxc.triggeredFromElement = true;
-
- // restore all otr objects
- $.each(jsxc.storage.getUserItem('otrlist') || {}, function(i, val) {
- jsxc.otr.create(val);
- });
-
- var numOtr = Object.keys(jsxc.otr.objects || {}).length + 1;
- var disReady = function() {
- if (--numOtr <= 0) {
- jsxc.xmpp.conn.flush();
-
- setTimeout(function() {
- jsxc.xmpp.conn.disconnect();
- }, 600);
- }
- };
-
- // end all private conversations
- $.each(jsxc.otr.objects || {}, function(key, obj) {
- if (obj.msgstate === OTR.CONST.MSGSTATE_ENCRYPTED) {
- obj.endOtr.call(obj, function() {
- obj.init.call(obj);
- jsxc.otr.backup(key);
-
- disReady();
- });
- } else {
- disReady();
- }
- });
-
- disReady();
-
- // Trigger real logout in jsxc.xmpp.disconnected()
- return false;
- },
-
- /**
- * Triggered if connection is established
- *
- * @private
- */
- connected: function() {
-
- jsxc.xmpp.conn.pause();
-
- var nomJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid).toLowerCase() + '/' + Strophe.getResourceFromJid(jsxc.xmpp.conn.jid);
-
- // Save sid and jid
- jsxc.storage.setItem('sid', jsxc.xmpp.conn._proto.sid);
- jsxc.storage.setItem('jid', nomJid);
-
- jsxc.storage.setItem('lastActivity', (new Date()).getTime());
-
- // make shure roster will be reloaded
- jsxc.storage.removeUserItem('buddylist');
-
- jsxc.storage.removeUserItem('windowlist');
- jsxc.storage.removeUserItem('own');
- jsxc.storage.removeUserItem('avatar', 'own');
- jsxc.storage.removeUserItem('otrlist');
-
- if (jsxc.options.loginForm.triggered) {
- switch (jsxc.options.loginForm.onConnected || 'submit') {
- case 'submit':
- jsxc.submitLoginForm();
- /* falls through */
- case false:
- jsxc.xmpp.connectionReady();
- return;
- }
- }
-
- // start chat
-
- jsxc.gui.init();
- $('#jsxc_roster').removeClass('jsxc_noConnection');
- jsxc.onMaster();
- jsxc.xmpp.conn.resume();
- jsxc.gui.dialog.close();
- $(document).trigger('attached.jsxc');
- },
-
- /**
- * Triggered if connection is attached
- *
- * @private
- */
- attached: function() {
-
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged, 'jabber:iq:roster', 'iq', 'set');
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onMessage, null, 'message', 'chat');
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived, null, 'message');
- jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence, null, 'presence');
-
- var caps = jsxc.xmpp.conn.caps;
- var domain = jsxc.xmpp.conn.domain;
-
- if (caps && jsxc.options.get('carbons').enable) {
- var conditionalEnable = function() {
- if (jsxc.xmpp.conn.caps.hasFeatureByJid(domain, jsxc.CONST.NS.CARBONS)) {
- jsxc.xmpp.carbons.enable();
- }
- };
-
- if (typeof caps._knownCapabilities[caps._jidVerIndex[domain]] === 'undefined') {
- var _jidNodeIndex = JSON.parse(localStorage.getItem('strophe.caps._jidNodeIndex')) || {};
-
- $(document).on('caps.strophe', function onCaps(ev, from) {
-
- if (from !== domain) {
- return;
- }
-
- conditionalEnable();
-
- $(document).off('caps.strophe', onCaps);
- });
-
- caps._requestCapabilities(jsxc.xmpp.conn.domain, _jidNodeIndex[domain], caps._jidVerIndex[domain]);
- } else {
- // We know server caps
- conditionalEnable();
- }
- }
-
- // Only load roaster if necessary
- if (!jsxc.restore || !jsxc.storage.getUserItem('buddylist')) {
- // in order to not overide existing presence information, we send
- // pres first after roster is ready
- $(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres);
-
- $('#jsxc_roster > p:first').remove();
-
- var iq = $iq({
- type: 'get'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- });
-
- jsxc.xmpp.conn.sendIQ(iq, jsxc.xmpp.onRoster);
- } else {
- jsxc.xmpp.sendPres();
- }
-
- jsxc.xmpp.connectionReady();
- },
-
- /**
- * Triggered if the connection is ready
- */
- connectionReady: function() {
-
- // Load saved unique id
- jsxc.xmpp.conn._uniqueId = jsxc.storage.getItem('_uniqueId') || new Date().getTime();
-
- $(document).trigger('connectionReady.jsxc');
- },
-
- /**
- * Sends presence stanza to server.
- */
- sendPres: function() {
- // disco stuff
- if (jsxc.xmpp.conn.disco) {
- jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC');
- jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO);
- jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS);
- }
-
- // create presence stanza
- var pres = $pres();
-
- if (jsxc.xmpp.conn.caps) {
- // attach caps
- pres.c('c', jsxc.xmpp.conn.caps.generateCapsAttrs()).up();
- }
-
- var presState = jsxc.storage.getUserItem('presence') || 'online';
- if (presState !== 'online') {
- pres.c('show').t(presState).up();
- }
-
- var priority = jsxc.options.get('priority');
- if (priority && typeof priority[presState] !== 'undefined' && parseInt(priority[presState]) !== 0) {
- pres.c('priority').t(priority[presState]).up();
- }
-
- jsxc.debug('Send presence', pres.toString());
- jsxc.xmpp.conn.send(pres);
- },
-
- /**
- * Triggered if lost connection
- *
- * @private
- */
- disconnected: function() {
- jsxc.debug('disconnected');
-
- jsxc.storage.removeItem('sid');
- jsxc.storage.removeItem('rid');
- jsxc.storage.removeItem('lastActivity');
- jsxc.storage.removeItem('hidden');
- jsxc.storage.removeUserItem('avatar', 'own');
- jsxc.storage.removeUserItem('otrlist');
-
- $(document).off('connected.jsxc', jsxc.xmpp.connected);
- $(document).off('attached.jsxc', jsxc.xmpp.attached);
- $(document).off('disconnected.jsxc', jsxc.xmpp.disconnected);
- $(document).off('ridChange', jsxc.xmpp.onRidChange);
- $(document).off('connfail.jsxc', jsxc.xmpp.onConnfail);
- $(document).off('authfail.jsxc', jsxc.xmpp.onAuthFail);
-
- jsxc.xmpp.conn = null;
-
- $('#jsxc_windowList').remove();
-
- if (jsxc.triggeredFromElement) {
- $('#jsxc_roster').remove();
-
- if (jsxc.triggeredFromLogout) {
- window.location = jsxc.options.logoutElement.attr('href');
- }
- } else {
- jsxc.gui.roster.noConnection();
- }
-
- window.clearInterval(jsxc.keepalive);
- },
-
- /**
- * Triggered on connection fault
- *
- * @param {String} condition information why we lost the connection
- * @private
- */
- onConnfail: function(ev, condition) {
- jsxc.debug('XMPP connection failed: ' + condition);
-
- if (jsxc.options.loginForm.triggered) {
- jsxc.submitLoginForm();
- }
- },
-
- /**
- * Triggered on auth fail.
- *
- * @private
- */
- onAuthFail: function() {
- if (jsxc.options.loginForm.triggered) {
- switch (jsxc.options.loginForm.onAuthFail || 'ask') {
- case 'ask':
- jsxc.gui.showAuthFail();
- break;
- case 'submit':
- jsxc.submitLoginForm();
- break;
- }
- }
- },
-
- /**
- * Triggered on initial roster load
- *
- * @param {dom} iq
- * @private
- */
- onRoster: function(iq) {
- /*
- * <iq from='' type='get' id=''> <query xmlns='jabber:iq:roster'> <item
- * jid='' name='' subscription='' /> ... </query> </iq>
- */
-
- jsxc.debug('Load roster', iq);
-
- var buddies = [];
-
- $(iq).find('item').each(function() {
- var jid = $(this).attr('jid');
- var name = $(this).attr('name') || jid;
- var bid = jsxc.jidToBid(jid);
- var sub = $(this).attr('subscription');
-
- buddies.push(bid);
-
- jsxc.storage.removeUserItem('res', bid);
-
- jsxc.storage.saveBuddy(bid, {
- jid: jid,
- name: name,
- status: 0,
- sub: sub,
- res: []
- });
-
- jsxc.gui.roster.add(bid);
- });
-
- if (buddies.length === 0) {
- jsxc.gui.roster.empty();
- }
-
- jsxc.storage.setUserItem('buddylist', buddies);
-
- jsxc.debug('Roster loaded');
- $(document).trigger('cloaded.roster.jsxc');
- },
-
- /**
- * Triggerd on roster changes
- *
- * @param {dom} iq
- * @returns {Boolean} True to preserve handler
- * @private
- */
- onRosterChanged: function(iq) {
- /*
- * <iq from='' type='set' id=''> <query xmlns='jabber:iq:roster'> <item
- * jid='' name='' subscription='' /> </query> </iq>
- */
-
- jsxc.debug('onRosterChanged', iq);
-
- $(iq).find('item').each(function() {
- var jid = $(this).attr('jid');
- var name = $(this).attr('name') || jid;
- var bid = jsxc.jidToBid(jid);
- var sub = $(this).attr('subscription');
- // var ask = $(this).attr('ask');
-
- if (sub === 'remove') {
- jsxc.gui.roster.purge(bid);
- } else {
- var bl = jsxc.storage.getUserItem('buddylist');
-
- if (bl.indexOf(bid) < 0) {
- bl.push(bid); // (INFO) push returns the new length
- jsxc.storage.setUserItem('buddylist', bl);
- }
-
- var temp = jsxc.storage.saveBuddy(bid, {
- jid: jid,
- name: name,
- sub: sub
- });
-
- if (temp === 'updated') {
-
- jsxc.gui.update(bid);
- jsxc.gui.roster.reorder(bid);
- } else {
- jsxc.gui.roster.add(bid);
- }
- }
-
- // Remove pending friendship request from notice list
- if (sub === 'from' || sub === 'both') {
- var notices = jsxc.storage.getUserItem('notices');
- var noticeKey = null, notice;
-
- for (noticeKey in notices) {
- notice = notices[noticeKey];
-
- if (notice.fnName === 'gui.showApproveDialog' && notice.fnParams[0] === jid) {
- jsxc.debug('Remove notice with key ' + noticeKey);
-
- jsxc.notice.remove(noticeKey);
- }
- }
- }
- });
-
- if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) {
- jsxc.gui.roster.empty();
- } else {
- $('#jsxc_roster > p:first').remove();
- }
-
- // preserve handler
- return true;
- },
-
- /**
- * Triggered on incoming presence stanzas
- *
- * @param {dom} presence
- * @private
- */
- onPresence: function(presence) {
- /*
- * <presence xmlns='jabber:client' type='unavailable' from='' to=''/>
- *
- * <presence xmlns='jabber:client' from='' to=''> <priority>5</priority>
- * <c xmlns='http://jabber.org/protocol/caps'
- * node='http://psi-im.org/caps' ver='caps-b75d8d2b25' ext='ca cs
- * ep-notify-2 html'/> </presence>
- *
- * <presence xmlns='jabber:client' from='' to=''> <show>chat</show>
- * <status></status> <priority>5</priority> <c
- * xmlns='http://jabber.org/protocol/caps'
- * node='http://psi-im.org/caps' ver='caps-b75d8d2b25' ext='ca cs
- * ep-notify-2 html'/> </presence>
- */
- jsxc.debug('onPresence', presence);
-
- var ptype = $(presence).attr('type');
- var from = $(presence).attr('from');
- var jid = Strophe.getBareJidFromJid(from).toLowerCase();
- var r = Strophe.getResourceFromJid(from);
- var bid = jsxc.jidToBid(jid);
- var data = jsxc.storage.getUserItem('buddy', bid);
- var res = jsxc.storage.getUserItem('res', bid) || {};
- var status = null;
- var xVCard = $(presence).find('x[xmlns="vcard-temp:x:update"]');
-
- if (jid === Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))) {
- return true;
- }
-
- if (ptype === 'error') {
- jsxc.error('[XMPP] ' + $(presence).attr('code'));
- return true;
- }
-
- // incoming friendship request
- if (ptype === 'subscribe') {
- jsxc.storage.setUserItem('friendReq', {
- jid: jid,
- approve: -1
- });
- jsxc.notice.add('%%Friendship request%%', '%%from%% ' + jid, 'gui.showApproveDialog', [ jid ]);
-
- return true;
- } else if (ptype === 'unavailable' || ptype === 'unsubscribed') {
- status = jsxc.CONST.STATUS.indexOf('offline');
- } else {
- var show = $(presence).find('show').text();
- if (show === '') {
- status = jsxc.CONST.STATUS.indexOf('online');
- } else {
- status = jsxc.CONST.STATUS.indexOf(show);
- }
- }
-
- if (status === 0) {
- delete res[r];
- } else {
- res[r] = status;
- }
-
- var maxVal = [];
- var max = 0, prop = null;
- for (prop in res) {
- if (res.hasOwnProperty(prop)) {
- if (max <= res[prop]) {
- if (max !== res[prop]) {
- maxVal = [];
- max = res[prop];
- }
- maxVal.push(prop);
- }
- }
- }
-
- if (data.status === 0 && max > 0) {
- // buddy has come online
- jsxc.notification.notify(data.name, jsxc.translate('%%has come online%%.'));
- }
-
- data.status = max;
- data.res = maxVal;
- data.jid = jid;
-
- // Looking for avatar
- if (xVCard.length > 0) {
- var photo = xVCard.find('photo');
-
- if (photo.length > 0 && photo.text() !== data.avatar) {
- jsxc.storage.removeUserItem('avatar', data.avatar);
- data.avatar = photo.text();
- }
- }
-
- // Reset jid
- if (jsxc.gui.window.get(bid).length > 0) {
- jsxc.gui.window.get(bid).data('jid', jid);
- }
-
- jsxc.storage.setUserItem('buddy', bid, data);
- jsxc.storage.setUserItem('res', bid, res);
-
- jsxc.debug('Presence (' + from + '): ' + status);
-
- jsxc.gui.update(bid);
- jsxc.gui.roster.reorder(bid);
-
- $(document).trigger('presence.jsxc', [ from, status, presence ]);
-
- // preserve handler
- return true;
- },
-
- /**
- * Triggered on incoming message stanzas
- *
- * @param {dom} presence
- * @returns {Boolean}
- * @private
- */
- onMessage: function(stanza) {
-
- var forwarded = $(stanza).find('forwarded[xmlns="' + jsxc.CONST.NS.FORWARD + '"]');
- var message, carbon;
-
- if (forwarded.length > 0) {
- message = forwarded.find('> message');
- forwarded = true;
- carbon = $(stanza).find('> [xmlns="' + jsxc.CONST.NS.CARBONS + '"]');
-
- if (carbon.length === 0) {
- carbon = false;
- }
-
- jsxc.debug('Incoming forwarded message', message);
- } else {
- message = stanza;
- forwarded = false;
- carbon = false;
-
- jsxc.debug('Incoming message', message);
- }
-
- var body = $(message).find('body:first').text();
-
- if (!body || (body.match(/\?OTR/i) && forwarded)) {
- return true;
- }
-
- var type = $(message).attr('type');
- var from = $(message).attr('from');
- var mid = $(message).attr('id');
- var bid;
-
- var delay = $(message).find('delay[xmlns="urn:xmpp:delay"]');
-
- var stamp = (delay.length > 0) ? new Date(delay.attr('stamp')) : new Date();
- stamp = stamp.getTime();
-
- if (carbon) {
- var direction = (carbon.prop("tagName") === 'sent') ? 'out' : 'in';
- bid = jsxc.jidToBid((direction === 'out') ? $(message).attr('to') : from);
-
- jsxc.gui.window.postMessage(bid, direction, body, false, forwarded, stamp);
-
- return true;
-
- } else if (forwarded) {
- // Someone forwarded a message to us
-
- body = from + jsxc.translate(' %%to%% ') + $(stanza).attr('to') + '"' + body + '"';
-
- from = $(stanza).attr('from');
- }
-
- var jid = Strophe.getBareJidFromJid(from);
- bid = jsxc.jidToBid(jid);
- var data = jsxc.storage.getUserItem('buddy', bid);
- var request = $(message).find("request[xmlns='urn:xmpp:receipts']");
-
- if (data === null) {
- // jid not in roster
-
- var chat = jsxc.storage.getUserItem('chat', bid) || [];
-
- if (chat.length === 0) {
- jsxc.notice.add('%%Unknown sender%%', '%%You received a message from an unknown sender%% (' + bid + ').', 'gui.showUnknownSender', [ bid ]);
- }
-
- var msg = jsxc.removeHTML(body);
- msg = jsxc.escapeHTML(msg);
-
- jsxc.storage.saveMessage(bid, 'in', msg, false, forwarded, stamp);
-
- return true;
- }
-
- var win = jsxc.gui.window.init(bid);
-
- // If we now the full jid, we use it
- if (type === 'chat') {
- win.data('jid', from);
- jsxc.storage.updateUserItem('buddy', bid, {
- jid: from
- });
- }
-
- $(document).trigger('message.jsxc', [ from, body ]);
-
- // create related otr object
- if (jsxc.master && !jsxc.otr.objects[bid]) {
- jsxc.otr.create(bid);
- }
-
- if (!forwarded && mid !== null && request.length && data !== null && (data.sub === 'both' || data.sub === 'from') && type === 'chat') {
- // Send received according to XEP-0184
- jsxc.xmpp.conn.send($msg({
- to: from
- }).c('received', {
- xmlns: 'urn:xmpp:receipts',
- id: mid
- }));
- }
-
- if (jsxc.otr.objects.hasOwnProperty(bid)) {
- jsxc.otr.objects[bid].receiveMsg(body, {
- stamp: stamp,
- forwarded: forwarded
- });
- } else {
- jsxc.gui.window.postMessage(bid, 'in', body, false, forwarded, stamp);
- }
-
- // preserve handler
- return true;
- },
-
- /**
- * Triggerd if the rid changed
- *
- * @param {event} ev
- * @param {obejct} data
- * @private
- */
- onRidChange: function(ev, data) {
- jsxc.storage.setItem('rid', data.rid);
- },
-
- /**
- * response to friendship request
- *
- * @param {string} from jid from original friendship req
- * @param {boolean} approve
- */
- resFriendReq: function(from, approve) {
- if (jsxc.master) {
- jsxc.xmpp.conn.send($pres({
- to: from,
- type: (approve) ? 'subscribed' : 'unsubscribed'
- }));
-
- jsxc.storage.removeUserItem('friendReq');
- jsxc.gui.dialog.close();
-
- } else {
- jsxc.storage.updateUserItem('friendReq', 'approve', approve);
- }
- },
-
- /**
- * Add buddy to my friends
- *
- * @param {string} username jid
- * @param {string} alias
- */
- addBuddy: function(username, alias) {
- var bid = jsxc.jidToBid(username);
-
- if (jsxc.master) {
- // add buddy to roster (trigger onRosterChanged)
- var iq = $iq({
- type: 'set'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- }).c('item', {
- jid: username,
- name: alias || ''
- });
- jsxc.xmpp.conn.sendIQ(iq);
-
- // send subscription request to buddy (trigger onRosterChanged)
- jsxc.xmpp.conn.send($pres({
- to: username,
- type: 'subscribe'
- }));
-
- jsxc.storage.removeUserItem('add_' + bid);
- } else {
- jsxc.storage.setUserItem('add_' + bid, {
- username: username,
- alias: alias || null
- });
- }
- },
-
- /**
- * Remove buddy from my friends
- *
- * @param {type} jid
- */
- removeBuddy: function(jid) {
- var bid = jsxc.jidToBid(jid);
-
- // Shortcut to remove buddy from roster and cancle all subscriptions
- var iq = $iq({
- type: 'set'
- }).c('query', {
- xmlns: 'jabber:iq:roster'
- }).c('item', {
- jid: Strophe.getBareJidFromJid(jid),
- subscription: 'remove'
- });
- jsxc.xmpp.conn.sendIQ(iq);
-
- jsxc.gui.roster.purge(bid);
- },
-
- onReceived: function(message) {
- var from = $(message).attr('from');
- var jid = Strophe.getBareJidFromJid(from);
- var bid = jsxc.jidToBid(jid);
- var received = $(message).find("received[xmlns='urn:xmpp:receipts']");
-
- if (received.length) {
- var receivedId = received.attr('id').replace(/:/, '-');
- var chat = jsxc.storage.getUserItem('chat', bid);
- var i;
-
- for (i = chat.length - 1; i >= 0; i--) {
- if (chat[i].uid === receivedId) {
- chat[i].received = true;
-
- $('#' + receivedId).addClass('jsxc_received');
-
- jsxc.storage.setUserItem('chat', bid, chat);
- break;
- }
- }
- }
-
- return true;
- },
-
- /**
- * Public function to send message.
- *
- * @memberOf jsxc.xmpp
- * @param bid css jid of user
- * @param msg message
- * @param uid unique id
- */
- sendMessage: function(bid, msg, uid) {
- if (jsxc.otr.objects.hasOwnProperty(bid)) {
- jsxc.otr.objects[bid].sendMsg(msg, uid);
- } else {
- jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data('jid'), msg, uid);
- }
- },
-
- /**
- * Create message stanza and send it.
- *
- * @memberOf jsxc.xmpp
- * @param jid Jabber id
- * @param msg Message
- * @param uid unique id
- * @private
- */
- _sendMessage: function(jid, msg, uid) {
- var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid)) || {};
- var isBar = (Strophe.getBareJidFromJid(jid) === jid);
- var type = data.type || 'chat';
-
- var xmlMsg = $msg({
- to: jid,
- type: type,
- id: uid
- }).c('body').t(msg);
-
- if (jsxc.xmpp.carbons.enabled && msg.match(/^\?OTR/)) {
- xmlMsg.up().c("private", {
- xmlns: jsxc.CONST.NS.CARBONS
- });
- }
-
- if (type === 'chat' && (isBar || jsxc.xmpp.conn.caps.hasFeatureByJid(jid, Strophe.NS.RECEIPTS))) {
- // Add request according to XEP-0184
- xmlMsg.up().c('request', {
- xmlns: 'urn:xmpp:receipts'
- });
- }
-
- jsxc.xmpp.conn.send(xmlMsg);
- },
-
- /**
- * This function loads a vcard.
- *
- * @memberOf jsxc.xmpp
- * @param bid
- * @param cb
- * @param error_cb
- */
- loadVcard: function(bid, cb, error_cb) {
- if (jsxc.master) {
- jsxc.xmpp.conn.vcard.get(cb, bid, error_cb);
- } else {
- jsxc.storage.setUserItem('vcard', bid, 'request:' + (new Date()).getTime());
-
- $(document).one('loaded.vcard.jsxc', function(ev, result) {
- if (result && result.state === 'success') {
- cb($(result.data).get(0));
- } else {
- error_cb();
- }
- });
- }
- },
-
- /**
- * Retrieves capabilities.
- *
- * @memberOf jsxc.xmpp
- * @param jid
- * @returns List of known capabilities
- */
- getCapabilitiesByJid: function(jid) {
- if (jsxc.xmpp.conn) {
- return jsxc.xmpp.conn.caps.getCapabilitiesByJid(jid);
- }
-
- var jidVerIndex = JSON.parse(localStorage.getItem('strophe.caps._jidVerIndex')) || {};
- var knownCapabilities = JSON.parse(localStorage.getItem('strophe.caps._knownCapabilities')) || {};
-
- if (jidVerIndex[jid]) {
- return knownCapabilities[jidVerIndex[jid]];
- }
-
- return null;
- }
- };
-
- /**
- * Handle carbons (XEP-0280);
- *
- * @namespace jsxc.xmpp.carbons
- */
- jsxc.xmpp.carbons = {
- enabled: false,
-
- /**
- * Enable carbons.
- *
- * @memberOf jsxc.xmpp.carbons
- * @param cb callback
- */
- enable: function(cb) {
- var iq = $iq({
- type: 'set'
- }).c('enable', {
- xmlns: jsxc.CONST.NS.CARBONS
- });
-
- jsxc.xmpp.conn.sendIQ(iq, function() {
- jsxc.xmpp.carbons.enabled = true;
-
- jsxc.debug('Carbons enabled');
-
- if (cb) {
- cb.call(this);
- }
- }, function(stanza) {
- jsxc.warn('Could not enable carbons', stanza);
- });
- },
-
- /**
- * Disable carbons.
- *
- * @memberOf jsxc.xmpp.carbons
- * @param cb callback
- */
- disable: function(cb) {
- var iq = $iq({
- type: 'set'
- }).c('disable', {
- xmlns: jsxc.CONST.NS.CARBONS
- });
-
- jsxc.xmpp.conn.sendIQ(iq, function() {
- jsxc.xmpp.carbons.enabled = false;
-
- jsxc.debug('Carbons disabled');
-
- if (cb) {
- cb.call(this);
- }
- }, function(stanza) {
- jsxc.warn('Could not disable carbons', stanza);
- });
- },
-
- /**
- * Enable/Disable carbons depending on options key.
- *
- * @memberOf jsxc.xmpp.carbons
- * @param err error message
- */
- refresh: function(err) {
- if (err === false) {
- return;
- }
-
- if (jsxc.options.get('carbons').enable) {
- return jsxc.xmpp.carbons.enable();
- }
-
- return jsxc.xmpp.carbons.disable();
- }
- };
-
- /**
- * Handle long-live data
- *
- * @namespace jsxc.storage
- */
- jsxc.storage = {
- /**
- * Prefix for localstorage
- *
- * @privat
- */
- PREFIX: 'jsxc',
-
- SEP: ':',
-
- /**
- * @param {type} uk Should we generate a user prefix?
- * @returns {String} prefix
- * @memberOf jsxc.storage
- */
- getPrefix: function(uk) {
- var self = jsxc.storage;
-
- return self.PREFIX + self.SEP + ((uk && jsxc.bid) ? jsxc.bid + self.SEP : '');
- },
-
- /**
- * Save item to storage
- *
- * @function
- * @param {String} key variablename
- * @param {Object} value value
- * @param {String} uk Userkey? Should we add the bid as prefix?
- */
- setItem: function(key, value, uk) {
-
- // Workaround for non-conform browser
- if (jsxc.storageNotConform > 0 && key !== 'rid' && key !== 'lastActivity') {
- if (jsxc.storageNotConform > 1 && jsxc.toSNC === null) {
- jsxc.toSNC = window.setTimeout(function() {
- jsxc.storageNotConform = 0;
- jsxc.storage.setItem('storageNotConform', 0);
- }, 1000);
- }
-
- jsxc.ls.push(JSON.stringify({
- key: key,
- value: value
- }));
- }
-
- if (typeof (value) === 'object') {
- value = JSON.stringify(value);
- }
-
- localStorage.setItem(jsxc.storage.getPrefix(uk) + key, value);
- },
-
- setUserItem: function(type, key, value) {
- var self = jsxc.storage;
-
- if (arguments.length === 2) {
- value = key;
- key = type;
- type = '';
- } else if (arguments.length === 3) {
- key = type + self.SEP + key;
- }
-
- return jsxc.storage.setItem(key, value, true);
- },
-
- /**
- * Load item from storage
- *
- * @function
- * @param {String} key variablename
- * @param {String} uk Userkey? Should we add the bid as prefix?
- */
- getItem: function(key, uk) {
- key = jsxc.storage.getPrefix(uk) + key;
-
- var value = localStorage.getItem(key);
- try {
- return JSON.parse(value);
- } catch (e) {
- return value;
- }
- },
-
- /**
- * Get a user item from storage.
- *
- * @param key
- * @returns user item
- */
- getUserItem: function(type, key) {
- var self = jsxc.storage;
-
- if (arguments.length === 1) {
- key = type;
- } else if (arguments.length === 2) {
- key = type + self.SEP + key;
- }
-
- return jsxc.storage.getItem(key, true);
- },
-
- /**
- * Remove item from storage
- *
- * @function
- * @param {String} key variablename
- * @param {String} uk Userkey? Should we add the bid as prefix?
- */
- removeItem: function(key, uk) {
-
- // Workaround for non-conform browser
- if (jsxc.storageNotConform && key !== 'rid' && key !== 'lastActivity') {
- jsxc.ls.push(JSON.stringify({
- key: jsxc.storage.prefix + key,
- value: ''
- }));
- }
-
- localStorage.removeItem(jsxc.storage.getPrefix(uk) + key);
- },
-
- /**
- * Remove user item from storage.
- *
- * @param key
- */
- removeUserItem: function(type, key) {
- var self = jsxc.storage;
-
- if (arguments.length === 1) {
- key = type;
- } else if (arguments.length === 2) {
- key = type + self.SEP + key;
- }
-
- jsxc.storage.removeItem(key, true);
- },
-
- /**
- * Updates value of a variable in a saved object.
- *
- * @function
- * @param {String} key variablename
- * @param {String|object} variable variablename in object or object with
- * variable/key pairs
- * @param {Object} [value] value
- * @param {String} uk Userkey? Should we add the bid as prefix?
- */
- updateItem: function(key, variable, value, uk) {
-
- var data = jsxc.storage.getItem(key, uk) || {};
-
- if (typeof (variable) === 'object') {
-
- $.each(variable, function(key, val) {
- if (typeof (data[key]) === 'undefined') {
- jsxc.debug('Variable ' + key + ' doesn\'t exist in ' + variable + '. It was created.');
- }
-
- data[key] = val;
- });
- } else {
- if (typeof (data[variable]) === 'undefined') {
- jsxc.debug('Variable ' + variable + ' doesn\'t exist. It was created.');
- }
-
- data[variable] = value;
- }
-
- jsxc.storage.setItem(key, data, uk);
- },
-
- /**
- * Updates value of a variable in a saved user object.
- *
- * @param {String} key variablename
- * @param {String|object} variable variablename in object or object with
- * variable/key pairs
- * @param {Object} [value] value
- */
- updateUserItem: function(type, key, variable, value) {
- var self = jsxc.storage;
-
- if (arguments.length === 4 || (arguments.length === 3 && typeof variable === 'object')) {
- key = type + self.SEP + key;
- } else {
- value = variable;
- variable = key;
- key = type;
- }
-
- return jsxc.storage.updateItem(key, variable, value, true);
- },
-
- /**
- * Inkrements value
- *
- * @function
- * @param {String} key variablename
- * @param {String} uk Userkey? Should we add the bid as prefix?
- */
- ink: function(key, uk) {
-
- jsxc.storage.setItem(key, Number(jsxc.storage.getItem(key, uk)) + 1, uk);
- },
-
- /**
- * Remove element from array or object
- *
- * @param {string} key name of array or object
- * @param {string} name name of element in array or object
- * @param {String} uk Userkey? Should we add the bid as prefix?
- * @returns {undefined}
- */
- removeElement: function(key, name, uk) {
- var item = jsxc.storage.getItem(key, uk);
-
- if ($.isArray(item)) {
- item = $.grep(item, function(e) {
- return e !== name;
- });
- } else if (typeof (item) === 'object') {
- delete item[name];
- }
-
- jsxc.storage.setItem(key, item, uk);
- },
-
- removeUserElement: function(type, key, name) {
- var self = jsxc.storage;
-
- if (arguments.length === 2) {
- name = key;
- key = type;
- } else if (arguments.length === 3) {
- key = type + self.SEP + key;
- }
-
- return jsxc.storage.removeElement(key, name, true);
- },
-
- /**
- * Triggered if changes are recognized
- *
- * @function
- * @param {event} e Storageevent
- * @param {String} e.key Keyname which triggered event
- * @param {Object} e.oldValue Old Value for key
- * @param {Object} e.newValue New Value for key
- * @param {String} e.url
- */
- onStorage: function(e) {
-
- // skip
- if (e.key === jsxc.storage.PREFIX + jsxc.storage.SEP + 'rid' || e.key === jsxc.storage.PREFIX + jsxc.storage.SEP + 'lastActivity') {
- return;
- }
-
- var re = new RegExp('^' + jsxc.storage.PREFIX + jsxc.storage.SEP + '(?:[^' + jsxc.storage.SEP + ']+@[^' + jsxc.storage.SEP + ']+' + jsxc.storage.SEP + ')?(.*)', 'i');
- var key = e.key.replace(re, '$1');
-
- // Workaround for non-conform browser: Triggered event on every page
- // (own)
- if (jsxc.storageNotConform > 0 && jsxc.ls.length > 0) {
-
- var val = e.newValue;
- try {
- val = JSON.parse(val);
- } catch (err) {
- }
-
- var index = $.inArray(JSON.stringify({
- key: key,
- value: val
- }), jsxc.ls);
-
- if (index >= 0) {
-
- // confirm that the storage event is not fired regularly
- if (jsxc.storageNotConform > 1) {
- window.clearTimeout(jsxc.toSNC);
- jsxc.storageNotConform = 1;
- jsxc.storage.setItem('storageNotConform', 1);
- }
-
- jsxc.ls.splice(index, 1);
- return;
- }
- }
-
- // Workaround for non-conform browser
- if (e.oldValue === e.newValue) {
- return;
- }
-
- var n, o;
- var bid = key.replace(new RegExp('[^' + jsxc.storage.SEP + ']+' + jsxc.storage.SEP + '(.*)', 'i'), '$1');
-
- // react if someone ask, if there is a master
- if (jsxc.master && key === 'alive') {
- jsxc.debug('Master request.');
-
- jsxc.storage.ink('alive');
- return;
- }
-
- // master alive
- if (!jsxc.master && (key === 'alive' || key === 'alive_busy') && !jsxc.triggeredFromElement) {
-
- // reset timeout
- window.clearTimeout(jsxc.to);
- jsxc.to = window.setTimeout(jsxc.checkMaster, ((key === 'alive') ? jsxc.options.timeout : jsxc.options.busyTimeout) + jsxc.random(60));
-
- // only call the first time
- if (!jsxc.role_allocation) {
- jsxc.onSlave();
- }
-
- return;
- }
-
- if (key.match(/^notices/)) {
- jsxc.notice.load();
- }
-
- if (key.match(/^presence/)) {
- jsxc.gui.changePresence(e.newValue, true);
- }
-
- if (key.match(/^options/) && e.newValue) {
- n = JSON.parse(e.newValue);
-
- if (typeof n.muteNotification !== 'undefined' && n.muteNotification) {
- jsxc.notification.muteSound(true);
- } else {
- jsxc.notification.unmuteSound(true);
- }
- }
-
- if (key.match(/^hidden/)) {
- if (jsxc.master) {
- clearTimeout(jsxc.toNotification);
- } else {
- jsxc.isHidden();
- }
- }
-
- if (key.match(new RegExp('^chat' + jsxc.storage.SEP))) {
-
- var posts = JSON.parse(e.newValue);
- var data, el;
-
- while (posts.length > 0) {
- data = posts.pop();
- el = $('#' + data.uid);
-
- if (el.length === 0) {
- if (jsxc.master && data.direction === 'out') {
- jsxc.xmpp.sendMessage(bid, data.msg, data.uid);
- }
-
- jsxc.gui.window._postMessage(bid, data);
- } else if (data.received) {
- el.addClass('jsxc_received');
- }
- }
- return;
- }
-
- if (key.match(new RegExp('^window' + jsxc.storage.SEP))) {
-
- if (!e.newValue) {
- jsxc.gui.window._close(bid);
- return;
- }
-
- if (!e.oldValue) {
- jsxc.gui.window.open(bid);
- return;
- }
-
- n = JSON.parse(e.newValue);
-
- if (n.minimize) {
- jsxc.gui.window._hide(bid);
- } else {
- jsxc.gui.window._show(bid);
- }
-
- jsxc.gui.window.setText(bid, n.text);
-
- return;
- }
-
- if (key.match(new RegExp('^smp' + jsxc.storage.SEP))) {
-
- if (!e.newValue) {
-
- jsxc.gui.dialog.close();
-
- if (jsxc.master) {
- jsxc.otr.objects[bid].sm.abort();
- }
-
- return;
- }
-
- n = JSON.parse(e.newValue);
-
- if (typeof (n.data) !== 'undefined') {
-
- jsxc.otr.onSmpQuestion(bid, n.data);
-
- } else if (jsxc.master && n.sec) {
- jsxc.gui.dialog.close();
-
- jsxc.otr.sendSmpReq(bid, n.sec, n.quest);
- }
- }
-
- if (!jsxc.master && key.match(new RegExp('^buddy' + jsxc.storage.SEP))) {
-
- if (!e.newValue) {
- jsxc.gui.roster.purge(bid);
- return;
- }
- if (!e.oldValue) {
- jsxc.gui.roster.add(bid);
- return;
- }
-
- n = JSON.parse(e.newValue);
- o = JSON.parse(e.oldValue);
-
- jsxc.gui.update(bid);
-
- if (o.status !== n.status || o.sub !== n.sub) {
- jsxc.gui.roster.reorder(bid);
- }
- }
-
- if (jsxc.master && key.match(new RegExp('^deletebuddy' + jsxc.storage.SEP)) && e.newValue) {
- n = JSON.parse(e.newValue);
-
- jsxc.xmpp.removeBuddy(n.jid);
- jsxc.storage.removeUserItem(key);
- }
-
- if (jsxc.master && key.match(new RegExp('^buddy' + jsxc.storage.SEP))) {
-
- n = JSON.parse(e.newValue);
- o = JSON.parse(e.oldValue);
-
- if (o.transferReq !== n.transferReq) {
- jsxc.storage.updateUserItem('buddy', bid, 'transferReq', -1);
-
- if (n.transferReq === 0) {
- jsxc.otr.goPlain(bid);
- }
- if (n.transferReq === 1) {
- jsxc.otr.goEncrypt(bid);
- }
- }
-
- if (o.name !== n.name) {
- jsxc.gui.roster._rename(bid, n.name);
- }
- }
-
- // logout
- if (key === 'sid') {
- if (!e.newValue) {
- // if (jsxc.master && jsxc.xmpp.conn) {
- // jsxc.xmpp.conn.disconnect();
- // jsxc.triggeredFromElement = true;
- // }
- jsxc.xmpp.logout();
-
- }
- return;
- }
-
- if (key === 'friendReq') {
- n = JSON.parse(e.newValue);
-
- if (jsxc.master && n.approve >= 0) {
- jsxc.xmpp.resFriendReq(n.jid, n.approve);
- }
- }
-
- if (jsxc.master && key.match(new RegExp('^add' + jsxc.storage.SEP))) {
- n = JSON.parse(e.newValue);
-
- jsxc.xmpp.addBuddy(n.username, n.alias);
- }
-
- if (key === 'roster') {
- jsxc.gui.roster.toggle();
- }
-
- if (jsxc.master && key.match(new RegExp('^vcard' + jsxc.storage.SEP)) && e.newValue !== null && e.newValue.match(/^request:/)) {
-
- jsxc.xmpp.loadVcard(bid, function(stanza) {
- jsxc.storage.setUserItem('vcard', bid, {
- state: 'success',
- data: $('<div>').append(stanza).html()
- });
- }, function() {
- jsxc.storage.setUserItem('vcard', bid, {
- state: 'error'
- });
- });
- }
-
- if (!jsxc.master && key.match(new RegExp('^vcard' + jsxc.storage.SEP)) && e.newValue !== null && !e.newValue.match(/^request:/)) {
- n = JSON.parse(e.newValue);
-
- if (typeof n.state !== 'undefined') {
- $(document).trigger('loaded.vcard.jsxc', n);
- }
-
- jsxc.storage.removeUserItem('vcard', bid);
- }
- },
-
- /**
- * Save message to storage.
- *
- * @memberOf jsxc.storage
- * @param bid
- * @param direction
- * @param msg
- * @param encrypted
- * @param forwarded
- * @return post
- */
- saveMessage: function(bid, direction, msg, encrypted, forwarded, stamp) {
- var chat = jsxc.storage.getUserItem('chat', bid) || [];
-
- var uid = new Date().getTime() + ':msg';
-
- if (chat.length > jsxc.options.get('numberOfMsg')) {
- chat.pop();
- }
-
- var post = {
- direction: direction,
- msg: msg,
- uid: uid.replace(/:/, '-'),
- received: false,
- encrypted: encrypted || false,
- forwarded: forwarded || false,
- stamp: stamp || new Date().getTime()
- };
-
- chat.unshift(post);
- jsxc.storage.setUserItem('chat', bid, chat);
-
- return post;
- },
-
- /**
- * Save or update buddy data.
- *
- * @memberOf jsxc.storage
- * @param bid
- * @param data
- * @returns {String} Updated or created
- */
- saveBuddy: function(bid, data) {
-
- if (jsxc.storage.getUserItem('buddy', bid)) {
- jsxc.storage.updateUserItem('buddy', bid, data);
-
- return 'updated';
- }
-
- jsxc.storage.setUserItem('buddy', bid, $.extend({
- jid: '',
- name: '',
- status: 0,
- sub: 'none',
- msgstate: 0,
- transferReq: -1,
- trust: false,
- fingerprint: null,
- res: [],
- type: 'chat'
- }, data));
-
- return 'created';
- }
- };
-
- /**
- * @namespace jsxc.otr
- */
- jsxc.otr = {
- /** list of otr objects */
- objects: {},
-
- dsaFallback: null,
- /**
- * Handler for otr receive event
- *
- * @memberOf jsxc.otr
- * @param {Object} d
- * @param {string} d.bid
- * @param {string} d.msg received message
- * @param {boolean} d.encrypted True, if msg was encrypted.
- * @param {boolean} d.forwarded
- * @param {string} d.stamp timestamp
- */
- receiveMessage: function(d) {
- var bid = d.bid;
-
- if (jsxc.otr.objects[bid].msgstate !== OTR.CONST.MSGSTATE_PLAINTEXT) {
- jsxc.otr.backup(bid);
- }
-
- if (jsxc.otr.objects[bid].msgstate !== OTR.CONST.MSGSTATE_PLAINTEXT && !d.encrypted) {
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.translate('%%Received an unencrypted message.%% [') + d.msg + ']', d.encrypted, d.forwarded, d.stamp);
- } else {
- jsxc.gui.window.postMessage(bid, 'in', d.msg, d.encrypted, d.forwarded, d.stamp);
- }
- },
-
- /**
- * Handler for otr send event
- *
- * @param {string} jid
- * @param {string} msg message to be send
- */
- sendMessage: function(jid, msg, uid) {
- if (jsxc.otr.objects[jsxc.jidToBid(jid)].msgstate !== 0) {
- jsxc.otr.backup(jsxc.jidToBid(jid));
- }
-
- jsxc.xmpp._sendMessage(jid, msg, uid);
- },
-
- /**
- * Create new otr instance
- *
- * @param {type} bid
- * @returns {undefined}
- */
- create: function(bid) {
-
- if (jsxc.otr.objects.hasOwnProperty(bid)) {
- return;
- }
-
- if (!jsxc.options.otr.priv) {
- return;
- }
-
- // save list of otr objects
- var ol = jsxc.storage.getUserItem('otrlist') || [];
- if (ol.indexOf(bid) < 0) {
- ol.push(bid);
- jsxc.storage.setUserItem('otrlist', ol);
- }
-
- jsxc.otr.objects[bid] = new OTR(jsxc.options.otr);
-
- if (jsxc.options.otr.SEND_WHITESPACE_TAG) {
- jsxc.otr.objects[bid].SEND_WHITESPACE_TAG = true;
- }
-
- if (jsxc.options.otr.WHITESPACE_START_AKE) {
- jsxc.otr.objects[bid].WHITESPACE_START_AKE = true;
- }
-
- jsxc.otr.objects[bid].on('status', function(status) {
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- if (data === null) {
- return;
- }
-
- switch (status) {
- case OTR.CONST.STATUS_SEND_QUERY:
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.trying_to_start_private_conversation);
- break;
- case OTR.CONST.STATUS_AKE_SUCCESS:
- data.fingerprint = jsxc.otr.objects[bid].their_priv_pk.fingerprint();
- data.msgstate = OTR.CONST.MSGSTATE_ENCRYPTED;
-
- var msg = (jsxc.otr.objects[bid].trust ? jsxc.l.Verified : jsxc.l.Unverified) + ' ' + jsxc.l.private_conversation_started;
- jsxc.gui.window.postMessage(bid, 'sys', msg);
- break;
- case OTR.CONST.STATUS_END_OTR:
- data.fingerprint = null;
-
- if (jsxc.otr.objects[bid].msgstate === OTR.CONST.MSGSTATE_PLAINTEXT) {
- // we abort the private conversation
-
- data.msgstate = OTR.CONST.MSGSTATE_PLAINTEXT;
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.private_conversation_aborted);
-
- } else {
- // the buddy abort the private conversation
-
- data.msgstate = OTR.CONST.MSGSTATE_FINISHED;
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.your_buddy_closed_the_private_conversation_you_should_do_the_same);
- }
- break;
- case OTR.CONST.STATUS_SMP_HANDLE:
- jsxc.keepBusyAlive();
- break;
- }
-
- jsxc.storage.setUserItem('buddy', bid, data);
-
- // for encryption and verification state
- jsxc.gui.update(bid);
- });
-
- jsxc.otr.objects[bid].on('smp', function(type, data) {
- switch (type) {
- case 'question': // verification request received
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.Authentication_request_received);
-
- if ($('#jsxc_dialog').length > 0) {
- jsxc.otr.objects[bid].sm.abort();
- break;
- }
-
- jsxc.otr.onSmpQuestion(bid, data);
- jsxc.storage.setUserItem('smp_' + bid, {
- data: data || null
- });
-
- break;
- case 'trust': // verification completed
- jsxc.otr.objects[bid].trust = data;
- jsxc.storage.updateUserItem('buddy', bid, 'trust', data);
- jsxc.otr.backup(bid);
- jsxc.gui.update(bid);
-
- if (data) {
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.conversation_is_now_verified);
- } else {
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.authentication_failed);
- }
- jsxc.storage.removeUserItem('smp_' + bid);
- jsxc.gui.dialog.close();
- break;
- case 'abort':
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.l.Authentication_aborted);
- break;
- default:
- jsxc.debug('[OTR] sm callback: Unknown type: ' + type);
- }
- });
-
- // Receive message
- jsxc.otr.objects[bid].on('ui', function(msg, encrypted, meta) {
- jsxc.otr.receiveMessage({
- bid: bid,
- msg: msg,
- encrypted: encrypted === true,
- stamp: meta.stamp,
- forwarded: meta.forwarded
- });
- });
-
- // Send message
- jsxc.otr.objects[bid].on('io', function(msg, uid) {
- var jid = jsxc.gui.window.get(bid).data('jid') || jsxc.otr.objects[bid].jid;
-
- jsxc.otr.objects[bid].jid = jid;
-
- jsxc.otr.sendMessage(jid, msg, uid);
- });
-
- jsxc.otr.objects[bid].on('error', function(err) {
- // Handle this case in jsxc.otr.receiveMessage
- if (err !== 'Received an unencrypted message.') {
- jsxc.gui.window.postMessage(bid, 'sys', '[OTR] ' + jsxc.translate('%%' + err + '%%'));
- }
-
- jsxc.error('[OTR] ' + err);
- });
-
- jsxc.otr.restore(bid);
- },
-
- /**
- * show verification dialog with related part (secret or question)
- *
- * @param {type} bid
- * @param {string} [data]
- * @returns {undefined}
- */
- onSmpQuestion: function(bid, data) {
- jsxc.gui.showVerification(bid);
-
- $('#jsxc_dialog select').prop('selectedIndex', (data ? 2 : 3)).change();
- $('#jsxc_dialog > div:eq(0)').hide();
-
- if (data) {
- $('#jsxc_dialog > div:eq(2)').find('#jsxc_quest').val(data).prop('disabled', true);
- $('#jsxc_dialog > div:eq(2)').find('.creation').text('Answer');
- $('#jsxc_dialog > div:eq(2)').find('.jsxc_explanation').text(jsxc.l.your_buddy_is_attempting_to_determine_ + ' ' + jsxc.l.to_authenticate_to_your_buddy + jsxc.l.enter_the_answer_and_click_answer);
- } else {
- $('#jsxc_dialog > div:eq(3)').find('.jsxc_explanation').text(jsxc.l.your_buddy_is_attempting_to_determine_ + ' ' + jsxc.l.to_authenticate_to_your_buddy + jsxc.l.enter_the_secret);
- }
-
- $('#jsxc_dialog .jsxc_close').click(function() {
- jsxc.storage.removeUserItem('smp_' + bid);
-
- if (jsxc.master) {
- jsxc.otr.objects[bid].sm.abort();
- }
- });
- },
-
- /**
- * Send verification request to buddy
- *
- * @param {string} bid
- * @param {string} sec secret
- * @param {string} [quest] question
- * @returns {undefined}
- */
- sendSmpReq: function(bid, sec, quest) {
- jsxc.keepBusyAlive();
-
- jsxc.otr.objects[bid].smpSecret(sec, quest || '');
- },
-
- /**
- * Toggle encryption state
- *
- * @param {type} bid
- * @returns {undefined}
- */
- toggleTransfer: function(bid) {
- if (jsxc.storage.getUserItem('buddy', bid).msgstate === 0) {
- jsxc.otr.goEncrypt(bid);
- } else {
- jsxc.otr.goPlain(bid);
- }
- },
-
- /**
- * Send request to encrypt the session
- *
- * @param {type} bid
- * @returns {undefined}
- */
- goEncrypt: function(bid) {
- if (jsxc.master) {
- jsxc.otr.objects[bid].sendQueryMsg();
- } else {
- jsxc.storage.updateUserItem('buddy', bid, 'transferReq', 1);
- }
- },
-
- /**
- * Abort encryptet session
- *
- * @param {type} bid
- * @param cb callback
- * @returns {undefined}
- */
- goPlain: function(bid, cb) {
- if (jsxc.master) {
- jsxc.otr.objects[bid].endOtr.call(jsxc.otr.objects[bid], cb);
- jsxc.otr.objects[bid].init.call(jsxc.otr.objects[bid]);
-
- jsxc.otr.backup(bid);
- } else {
- jsxc.storage.updateUserItem('buddy', bid, 'transferReq', 0);
- }
- },
-
- /**
- * Backups otr session
- *
- * @param {string} bid
- */
- backup: function(bid) {
- var o = jsxc.otr.objects[bid]; // otr object
- var r = {}; // return value
-
- if (o === null) {
- return;
- }
-
- // all variables which should be saved
- var savekey = [ 'jid', 'our_instance_tag', 'msgstate', 'authstate', 'fragment', 'their_y', 'their_old_y', 'their_keyid', 'their_instance_tag', 'our_dh', 'our_old_dh', 'our_keyid', 'sessKeys', 'storedMgs', 'oldMacKeys', 'trust', 'transmittedRS', 'ssid', 'receivedPlaintext', 'authstate', 'send_interval' ];
-
- var i;
- for (i = 0; i < savekey.length; i++) {
- r[savekey[i]] = JSON.stringify(o[savekey[i]]);
- }
-
- if (o.their_priv_pk !== null) {
- r.their_priv_pk = JSON.stringify(o.their_priv_pk.packPublic());
- }
-
- if (o.ake.otr_version && o.ake.otr_version !== '') {
- r.otr_version = JSON.stringify(o.ake.otr_version);
- }
-
- jsxc.storage.setUserItem('otr', bid, r);
- },
-
- /**
- * Restore old otr session
- *
- * @param {string} bid
- */
- restore: function(bid) {
- var o = jsxc.otr.objects[bid];
- var d = jsxc.storage.getUserItem('otr', bid);
-
- if (o !== null || d !== null) {
- var key;
- for (key in d) {
- if (d.hasOwnProperty(key)) {
- var val = JSON.parse(d[key]);
- if (key === 'their_priv_pk' && val !== null) {
- val = DSA.parsePublic(val);
- }
- if (key === 'otr_version' && val !== null) {
- o.ake.otr_version = val;
- } else {
- o[key] = val;
- }
- }
- }
-
- jsxc.otr.objects[bid] = o;
-
- if (o.msgstate === 1 && o.their_priv_pk !== null) {
- o._smInit.call(jsxc.otr.objects[bid]);
- }
- }
-
- jsxc.otr.enable(bid);
- },
-
- /**
- * Create or load DSA key
- *
- * @returns {unresolved}
- */
- createDSA: function() {
- if (jsxc.options.otr.priv) {
- return;
- }
-
- if (jsxc.storage.getUserItem('key') === null) {
- var msg = jsxc.l.Creating_your_private_key_;
- var worker = null;
-
- if (Worker) {
- // try to create web-worker
-
- try {
- worker = new Worker(jsxc.options.root + '/lib/otr/build/dsa-webworker.js');
- } catch (err) {
- jsxc.warn('Couldn\'t create web-worker.', err);
- }
- }
-
- jsxc.otr.dsaFallback = (worker === null);
-
- if (!jsxc.otr.dsaFallback) {
- // create DSA key in background
-
- jsxc._onMaster();
-
- worker.onmessage = function(e) {
- var type = e.data.type;
- var val = e.data.val;
-
- if (type === 'debug') {
- jsxc.debug(val);
- } else if (type === 'data') {
- jsxc.otr.DSAready(DSA.parsePrivate(val));
- }
- };
-
- // start worker
- worker.postMessage({
- imports: [ jsxc.options.root + '/lib/otr/vendor/salsa20.js', jsxc.options.root + '/lib/otr/vendor/bigint.js', jsxc.options.root + '/lib/otr/vendor/crypto.js', jsxc.options.root + '/lib/otr/vendor/eventemitter.js', jsxc.options.root + '/lib/otr/lib/const.js', jsxc.options.root + '/lib/otr/lib/helpers.js', jsxc.options.root + '/lib/otr/lib/dsa.js' ],
- seed: BigInt.getSeed(),
- debug: true
- });
-
- } else {
- // fallback
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('waitAlert', null, msg), {
- noClose: true
- });
-
- jsxc.debug('DSA key creation started.');
-
- // wait until the wait alert is opened
- setTimeout(function() {
- var dsa = new DSA();
- jsxc.otr.DSAready(dsa);
- }, 500);
- }
- } else {
- jsxc.debug('DSA key loaded');
- jsxc.options.otr.priv = DSA.parsePrivate(jsxc.storage.getUserItem('key'));
-
- jsxc.otr._createDSA();
- }
- },
-
- /**
- * Ending of createDSA().
- */
- _createDSA: function() {
-
- jsxc.storage.setUserItem('priv_fingerprint', jsxc.options.otr.priv.fingerprint());
-
- if (jsxc.otr.dsaFallback !== false) {
- jsxc._onMaster();
- }
- },
-
- /**
- * Ending of DSA key generation.
- *
- * @param {DSA} dsa DSA object
- */
- DSAready: function(dsa) {
- jsxc.storage.setUserItem('key', dsa.packPrivate());
- jsxc.options.otr.priv = dsa;
-
- // close wait alert
- if (jsxc.otr.dsaFallback) {
- jsxc.gui.dialog.close();
- } else {
- $.each(jsxc.storage.getUserItem('windowlist'), function(index, val) {
- jsxc.otr.create(val);
- });
- }
-
- jsxc.otr._createDSA();
- },
-
- enable: function(bid) {
- jsxc.gui.window.get(bid).find('.jsxc_otr').removeClass('jsxc_disabled');
- }
- };
-
- /**
- * This namespace handles the Notification API.
- *
- * @namespace jsxc.notification
- */
- jsxc.notification = {
-
- /** Current audio file. */
- audio: null,
-
- /**
- * Register notification on incoming messages.
- *
- * @memberOf jsxc.notification
- */
- init: function() {
- $(document).on('postmessagein.jsxc', function(event, bid, msg) {
- msg = (msg.match(/^\?OTR/)) ? jsxc.translate('%%Encrypted message%%') : msg;
- var data = jsxc.storage.getUserItem('buddy', bid);
-
- jsxc.notification.notify(jsxc.translate('%%New message from%% ') + data.name, msg, undefined, undefined, jsxc.CONST.SOUNDS.MSG);
- });
-
- $(document).on('callincoming.jingle', function() {
- jsxc.notification.playSound(jsxc.CONST.SOUNDS.CALL, true, true);
- });
-
- $(document).on('accept.call.jsxc reject.call.jsxc', function() {
- jsxc.notification.stopSound();
- });
- },
-
- /**
- * Shows a pop up notification and optional play sound.
- *
- * @param title Title
- * @param msg Message
- * @param d Duration
- * @param force Should message also shown, if tab is visible?
- * @param soundFile Playing given sound file
- * @param loop Loop sound file?
- */
- notify: function(title, msg, d, force, soundFile, loop) {
- if (!jsxc.options.notification || !jsxc.notification.hasPermission()) {
- return; // notifications disabled
- }
-
- if (!jsxc.isHidden() && !force) {
- return; // Tab is visible
- }
-
- jsxc.toNotification = setTimeout(function() {
-
- if (typeof soundFile === 'string') {
- jsxc.notification.playSound(soundFile, loop, force);
- }
-
- var popup = new Notification(jsxc.translate(title), {
- body: jsxc.translate(msg),
- icon: jsxc.options.root + '/img/XMPP_logo.png'
- });
-
- var duration = d || jsxc.options.popupDuration;
-
- if (duration > 0) {
- setTimeout(function() {
- popup.close();
- }, duration);
- }
- }, jsxc.toNotificationDelay);
- },
-
- /**
- * Checks if browser has support for notifications and add on chrome to
- * the default api.
- *
- * @returns {Boolean} True if the browser has support.
- */
- hasSupport: function() {
- if (window.webkitNotifications) {
- // prepare chrome
-
- window.Notification = function(title, opt) {
- var popup = window.webkitNotifications.createNotification(null, title, opt.body);
- popup.show();
-
- popup.close = function() {
- popup.cancel();
- };
-
- return popup;
- };
-
- var permission;
- switch (window.webkitNotifications.checkPermission()) {
- case 0:
- permission = jsxc.CONST.NOTIFICATION_GRANTED;
- break;
- case 2:
- permission = jsxc.CONST.NOTIFICATION_DENIED;
- break;
- default: // 1
- permission = jsxc.CONST.NOTIFICATION_DEFAULT;
- }
- window.Notification.permission = permission;
-
- window.Notification.requestPermission = function(func) {
- window.webkitNotifications.requestPermission(func);
- };
-
- return true;
- } else if (window.Notification) {
- return true;
- } else {
- return false;
- }
- },
-
- /**
- * Ask user on first incoming message if we should inform him about new
- * messages.
- */
- prepareRequest: function() {
-
- $(document).one('postmessagein.jsxc', function() {
- jsxc.switchEvents({
- 'notificationready.jsxc': function() {
- jsxc.gui.dialog.close();
- jsxc.notification.init();
- jsxc.storage.setUserItem('notification', true);
- },
- 'notificationfailure.jsxc': function() {
- jsxc.gui.dialog.close();
- jsxc.options.notification = false;
- jsxc.storage.setUserItem('notification', false);
- }
- });
-
- setTimeout(function() {
- jsxc.notice.add('%%Notifications%%?', '%%Should_we_notify_you_%%', 'gui.showRequestNotification');
- }, 1000);
- });
- },
-
- /**
- * Request notification permission.
- */
- requestPermission: function() {
- window.Notification.requestPermission(function(status) {
- if (window.Notification.permission !== status) {
- window.Notification.permission = status;
- }
-
- if (jsxc.notification.hasPermission()) {
- $(document).trigger('notificationready.jsxc');
- } else {
- $(document).trigger('notificationfailure.jsxc');
- }
- });
- },
-
- /**
- * Check permission.
- *
- * @returns {Boolean} True if we have the permission
- */
- hasPermission: function() {
- return window.Notification.permission === jsxc.CONST.NOTIFICATION_GRANTED;
- },
-
- /**
- * Plays the given file.
- *
- * @memberOf jsxc.notification
- * @param {string} soundFile File relative to the sound directory
- * @param {boolean} loop True for loop
- * @param {boolean} force Play even if a tab is visible. Default: false.
- */
- playSound: function(soundFile, loop, force) {
- if (!jsxc.master) {
- // only master plays sound
- return;
- }
-
- if (jsxc.options.get('muteNotification') || jsxc.storage.getUserItem('presence') === 'dnd') {
- // sound mute or own presence is dnd
- return;
- }
-
- if (!jsxc.isHidden() && !force) {
- // tab is visible
- return;
- }
-
- // stop current audio file
- jsxc.notification.stopSound();
-
- var audio = new Audio(jsxc.options.root + '/sound/' + soundFile);
- audio.loop = loop || false;
- audio.play();
-
- jsxc.notification.audio = audio;
- },
-
- /**
- * Stop/remove current sound.
- *
- * @memberOf jsxc.notification
- */
- stopSound: function() {
- var audio = jsxc.notification.audio;
-
- if (typeof audio !== 'undefined' && audio !== null) {
- audio.pause();
- jsxc.notification.audio = null;
- }
- },
-
- /**
- * Mute sound.
- *
- * @memberOf jsxc.notification
- * @param {boolean} external True if triggered from external tab. Default:
- * false.
- */
- muteSound: function(external) {
- $('#jsxc_menu .jsxc_muteNotification').text(jsxc.translate('%%Unmute%%'));
-
- if (external !== true) {
- jsxc.options.set('muteNotification', true);
- }
- },
-
- /**
- * Unmute sound.
- *
- * @memberOf jsxc.notification
- * @param {boolean} external True if triggered from external tab. Default:
- * false.
- */
- unmuteSound: function(external) {
- $('#jsxc_menu .jsxc_muteNotification').text(jsxc.translate('%%Mute%%'));
-
- if (external !== true) {
- jsxc.options.set('muteNotification', false);
- }
- }
- };
-
- /**
- * This namespace handle the notice system.
- *
- * @namspace jsxc.notice
- * @memberOf jsxc
- */
- jsxc.notice = {
- /** Number of notices. */
- _num: 0,
-
- /**
- * Loads the saved notices.
- *
- * @memberOf jsxc.notice
- */
- load: function() {
- // reset list
- $('#jsxc_notice ul li').remove();
- $('#jsxc_notice > span').text('');
- jsxc.notice._num = 0;
-
- var saved = jsxc.storage.getUserItem('notices') || [];
- var key = null;
-
- for (key in saved) {
- if (saved.hasOwnProperty(key)) {
- var val = saved[key];
-
- jsxc.notice.add(val.msg, val.description, val.fnName, val.fnParams, key);
- }
- }
- },
-
- /**
- * Add a new notice to the stack;
- *
- * @memberOf jsxc.notice
- * @param msg Header message
- * @param description Notice description
- * @param fnName Function name to be called if you open the notice
- * @param fnParams Array of params for function
- * @param id Notice id
- */
- add: function(msg, description, fnName, fnParams, id) {
- var nid = id || Date.now();
- var list = $('#jsxc_notice ul');
- var notice = $('<li/>');
-
- notice.click(function() {
- jsxc.notice.remove(nid);
-
- jsxc.exec(fnName, fnParams);
-
- return false;
- });
-
- notice.text(jsxc.translate(msg));
- notice.attr('title', jsxc.translate(description) || '');
- notice.attr('data-nid', nid);
- list.append(notice);
-
- $('#jsxc_notice > span').text(++jsxc.notice._num);
-
- if (!id) {
- var saved = jsxc.storage.getUserItem('notices') || {};
- saved[nid] = {
- msg: msg,
- description: description,
- fnName: fnName,
- fnParams: fnParams
- };
- jsxc.storage.setUserItem('notices', saved);
-
- jsxc.notification.notify(msg, description || '', null, true, jsxc.CONST.SOUNDS.NOTICE);
- }
- },
-
- /**
- * Removes notice from stack
- *
- * @memberOf jsxc.notice
- * @param nid The notice id
- */
- remove: function(nid) {
- var el = $('#jsxc_notice li[data-nid=' + nid + ']');
-
- el.remove();
- $('#jsxc_notice > span').text(--jsxc.notice._num || '');
-
- var s = jsxc.storage.getUserItem('notices');
- delete s[nid];
- jsxc.storage.setUserItem('notices', s);
- }
- };
-
- /**
- * Contains all available translations
- *
- * @namespace jsxc.l10n
- * @memberOf jsxc
- */
- jsxc.l10n = {
- en: {
- Logging_in: 'Logging in…',
- your_connection_is_unencrypted: 'Your connection is unencrypted.',
- your_connection_is_encrypted: 'Your connection is encrypted.',
- your_buddy_closed_the_private_connection: 'Your buddy closed the private connection.',
- start_private: 'Start private',
- close_private: 'Close private',
- your_buddy_is_verificated: 'Your buddy is verified.',
- you_have_only_a_subscription_in_one_way: 'You only have a one-way subscription.',
- authentication_query_sent: 'Authentication query sent.',
- your_message_wasnt_send_please_end_your_private_conversation: 'Your message was not sent. Please end your private conversation.',
- unencrypted_message_received: 'Unencrypted message received:',
- your_message_wasnt_send_because_you_have_no_valid_subscription: 'Your message was not sent because you have no valid subscription.',
- not_available: 'Not available',
- no_connection: 'No connection!',
- relogin: 'relogin',
- trying_to_start_private_conversation: 'Trying to start private conversation!',
- Verified: 'Verified',
- Unverified: 'Unverified',
- private_conversation_started: 'Private conversation started.',
- private_conversation_aborted: 'Private conversation aborted!',
- your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Your buddy closed the private conversation! You should do the same.',
- conversation_is_now_verified: 'Conversation is now verified.',
- authentication_failed: 'Authentication failed.',
- your_buddy_is_attempting_to_determine_: 'You buddy is attempting to determine if he or she is really talking to you.',
- to_authenticate_to_your_buddy: 'To authenticate to your buddy, ',
- enter_the_answer_and_click_answer: 'enter the answer and click Answer.',
- enter_the_secret: 'enter the secret.',
- Creating_your_private_key_: 'Creating your private key; this may take a while.',
- Authenticating_a_buddy_helps_: 'Authenticating a buddy helps ensure that the person you are talking to is really the one he or she claims to be.',
- How_do_you_want_to_authenticate_your_buddy: 'How do you want to authenticate {{bid_name}} (<b>{{bid_jid}}</b>)?',
- Select_method: 'Select method...',
- Manual: 'Manual',
- Question: 'Question',
- Secret: 'Secret',
- To_verify_the_fingerprint_: 'To verify the fingerprint, contact your buddy via some other trustworthy channel, such as the telephone.',
- Your_fingerprint: 'Your fingerprint',
- Buddy_fingerprint: 'Buddy fingerprint',
- Close: 'Close',
- Compared: 'Compared',
- To_authenticate_using_a_question_: 'To authenticate using a question, pick a question whose answer is known only you and your buddy.',
- Ask: 'Ask',
- To_authenticate_pick_a_secret_: 'To authenticate, pick a secret known only to you and your buddy.',
- Compare: 'Compare',
- Fingerprints: 'Fingerprints',
- Authentication: 'Authentication',
- Message: 'Message',
- Add_buddy: 'Add buddy',
- rename_buddy: 'rename buddy',
- delete_buddy: 'delete buddy',
- Login: 'Login',
- Username: 'Username',
- Password: 'Password',
- Cancel: 'Cancel',
- Connect: 'Connect',
- Type_in_the_full_username_: 'Type in the full username and an optional alias.',
- Alias: 'Alias',
- Add: 'Add',
- Subscription_request: 'Subscription request',
- You_have_a_request_from: 'You have a request from',
- Deny: 'Deny',
- Approve: 'Approve',
- Remove_buddy: 'Remove buddy',
- You_are_about_to_remove_: 'You are about to remove {{bid_name}} (<b>{{bid_jid}}</b>) from your buddy list. All related chats will be closed.',
- Continue_without_chat: 'Continue without chat',
- Please_wait: 'Please wait',
- Login_failed: 'Chat login failed',
- Sorry_we_cant_authentikate_: 'Authentication failed with the chat server. Maybe the password is wrong?',
- Retry: 'Back',
- clear_history: 'Clear history',
- New_message_from: 'New message from',
- Should_we_notify_you_: 'Should we notify you about new messages in the future?',
- Please_accept_: 'Please click the "Allow" button at the top.',
- Hide_offline: 'Hide offline contacts',
- Show_offline: 'Show offline contacts',
- About: 'About',
- dnd: 'Do Not Disturb',
- Mute: 'Mute',
- Unmute: 'Unmute',
- Subscription: 'Subscription',
- both: 'both',
- Status: 'Status',
- online: 'online',
- chat: 'chat',
- away: 'away',
- xa: 'extended away',
- offline: 'offline',
- none: 'none',
- Unknown_instance_tag: 'Unknown instance tag.',
- Not_one_of_our_latest_keys: 'Not one of our latest keys.',
- Received_an_unreadable_encrypted_message: 'Received an unreadable encrypted message.',
- Online: 'Online',
- Chatty: 'Chatty',
- Away: 'Away',
- Extended_away: 'Extended away',
- Offline: 'Offline',
- Friendship_request: 'Friendship request',
- Confirm: 'Confirm',
- Dismiss: 'Dismiss',
- Remove: 'Remove',
- Online_help: 'Online help',
- FN: 'Full name',
- N: ' ',
- FAMILY: 'Family name',
- GIVEN: 'Given name',
- NICKNAME: 'Nickname',
- URL: 'URL',
- ADR: 'Address',
- STREET: 'Street Address',
- EXTADD: 'Extended Address',
- LOCALITY: 'Locality',
- REGION: 'Region',
- PCODE: 'Postal Code',
- CTRY: 'Country',
- TEL: 'Telephone',
- NUMBER: 'Number',
- EMAIL: 'Email',
- USERID: ' ',
- ORG: 'Organization',
- ORGNAME: 'Name',
- ORGUNIT: 'Unit',
- TITLE: 'Job title',
- ROLE: 'Role',
- BDAY: 'Birthday',
- DESC: 'Description',
- PHOTO: ' ',
- send_message: 'Send message',
- get_info: 'Show information',
- Settings: 'Settings',
- Priority: 'Priority',
- Save: 'Save',
- User_settings: 'User settings',
- A_fingerprint_: 'A fingerprint is used to make sure that the person you are talking to is who he or she is saying.',
- Your_roster_is_empty_add_a: 'Your roster is empty, add a ',
- new_buddy: 'new buddy',
- is: 'is',
- Login_options: 'Login options',
- BOSH_url: 'BOSH URL',
- Domain: 'Domain',
- Resource: 'Resource',
- On_login: 'On login',
- Received_an_unencrypted_message: 'Received an unencrypted message',
- Sorry_your_buddy_doesnt_provide_any_information: 'Sorry, your buddy does not provide any information.',
- Info_about: 'Info about',
- Authentication_aborted: 'Authentication aborted.',
- Authentication_request_received: 'Authentication request received.',
- Do_you_want_to_display_them: 'Do you want to display them?',
- Log_in_without_chat: 'Log in without chat',
- has_come_online: 'has come online',
- Unknown_sender: 'Unknown sender',
- You_received_a_message_from_an_unknown_sender: 'You received a message from an unknown sender'
- },
- de: {
- Logging_in: 'Login läuft…',
- your_connection_is_unencrypted: 'Deine Verbindung ist UNverschlüsselt.',
- your_connection_is_encrypted: 'Deine Verbindung ist verschlüsselt.',
- your_buddy_closed_the_private_connection: 'Dein Freund hat die private Verbindung getrennt.',
- start_private: 'Privat starten',
- close_private: 'Privat abbrechen',
- your_buddy_is_verificated: 'Dein Freund ist verifiziert.',
- you_have_only_a_subscription_in_one_way: 'Die Freundschaft ist nur einseitig.',
- authentication_query_sent: 'Authentifizierungsanfrage gesendet.',
- your_message_wasnt_send_please_end_your_private_conversation: 'Deine Nachricht wurde nicht gesendet. Bitte beende die private Konversation.',
- unencrypted_message_received: 'Unverschlüsselte Nachricht erhalten.',
- your_message_wasnt_send_because_you_have_no_valid_subscription: 'Deine Nachricht wurde nicht gesandt, da die Freundschaft einseitig ist.',
- not_available: 'Nicht verfügbar.',
- no_connection: 'Keine Verbindung.',
- relogin: 'Neu anmelden.',
- trying_to_start_private_conversation: 'Versuche private Konversation zu starten.',
- Verified: 'Verifiziert',
- Unverified: 'Unverifiziert',
- private_conversation_started: 'Private Konversation gestartet.',
- private_conversation_aborted: 'Private Konversation abgebrochen.',
- your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Dein Freund hat die private Konversation beendet. Das solltest du auch tun!',
- conversation_is_now_verified: 'Konversation ist jetzt verifiziert',
- authentication_failed: 'Authentifizierung fehlgeschlagen.',
- your_buddy_is_attempting_to_determine_: 'Dein Freund versucht herauszufinden ob er wirklich mit dir redet.',
- to_authenticate_to_your_buddy: 'Um dich gegenüber deinem Freund zu verifizieren ',
- enter_the_answer_and_click_answer: 'gib die Antwort ein und klick auf Antworten.',
- enter_the_secret: 'gib das Geheimnis ein.',
- Creating_your_private_key_: 'Wir werden jetzt deinen privaten Schlüssel generieren. Das kann einige Zeit in Anspruch nehmen.',
- Authenticating_a_buddy_helps_: 'Einen Freund zu authentifizieren hilft sicher zustellen, dass die Person mit der du sprichst auch die ist die sie sagt.',
- How_do_you_want_to_authenticate_your_buddy: 'Wie willst du {{bid_name}} (<b>{{bid_jid}}</b>) authentifizieren?',
- Select_method: 'Wähle...',
- Manual: 'Manual',
- Question: 'Frage',
- Secret: 'Geheimnis',
- To_verify_the_fingerprint_: 'Um den Fingerprint zu verifizieren kontaktiere dein Freund über einen anderen Kommunikationsweg. Zum Beispiel per Telefonanruf.',
- Your_fingerprint: 'Dein Fingerprint',
- Buddy_fingerprint: 'Sein/Ihr Fingerprint',
- Close: 'Schließen',
- Compared: 'Verglichen',
- To_authenticate_using_a_question_: 'Um die Authentifizierung per Frage durchzuführen, wähle eine Frage bei welcher nur dein Freund die Antwort weiß.',
- Ask: 'Frage',
- To_authenticate_pick_a_secret_: 'Um deinen Freund zu authentifizieren, wähle ein Geheimnis welches nur deinem Freund und dir bekannt ist.',
- Compare: 'Vergleiche',
- Fingerprints: 'Fingerprints',
- Authentication: 'Authentifizierung',
- Message: 'Nachricht',
- Add_buddy: 'Freund hinzufügen',
- rename_buddy: 'Freund umbenennen',
- delete_buddy: 'Freund löschen',
- Login: 'Anmeldung',
- Username: 'Benutzername',
- Password: 'Passwort',
- Cancel: 'Abbrechen',
- Connect: 'Verbinden',
- Type_in_the_full_username_: 'Gib bitte den vollen Benutzernamen und optional ein Alias an.',
- Alias: 'Alias',
- Add: 'Hinzufügen',
- Subscription_request: 'Freundschaftsanfrage',
- You_have_a_request_from: 'Du hast eine Anfrage von',
- Deny: 'Ablehnen',
- Approve: 'Bestätigen',
- Remove_buddy: 'Freund entfernen',
- You_are_about_to_remove_: 'Du bist gerade dabei {{bid_name}} (<b>{{bid_jid}}</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.',
- Continue_without_chat: 'Weiter ohne Chat',
- Please_wait: 'Bitte warten',
- Login_failed: 'Chat-Anmeldung fehlgeschlagen',
- Sorry_we_cant_authentikate_: 'Der Chatserver hat die Anmeldung abgelehnt. Falsches Passwort?',
- Retry: 'Zurück',
- clear_history: 'Lösche Verlauf',
- New_message_from: 'Neue Nachricht von',
- Should_we_notify_you_: 'Sollen wir dich in Zukunft über eingehende Nachrichten informieren, auch wenn dieser Tab nicht im Vordergrund ist?',
- Please_accept_: 'Bitte klick auf den "Zulassen" Button oben.',
- Menu: 'Menü',
- Hide_offline: 'Offline ausblenden',
- Show_offline: 'Offline einblenden',
- About: 'Über',
- dnd: 'Beschäftigt',
- Mute: 'Ton aus',
- Unmute: 'Ton an',
- Subscription: 'Bezug',
- both: 'beidseitig',
- Status: 'Status',
- online: 'online',
- chat: 'chat',
- away: 'abwesend',
- xa: 'länger abwesend',
- offline: 'offline',
- none: 'keine',
- Unknown_instance_tag: 'Unbekannter instance tag.',
- Not_one_of_our_latest_keys: 'Nicht einer unserer letzten Schlüssel.',
- Received_an_unreadable_encrypted_message: 'Eine unlesbare verschlüsselte Nachricht erhalten.',
- Online: 'Online',
- Chatty: 'Gesprächig',
- Away: 'Abwesend',
- Extended_away: 'Länger abwesend',
- Offline: 'Offline',
- Friendship_request: 'Freundschaftsanfrage',
- Confirm: 'Bestätigen',
- Dismiss: 'Ablehnen',
- Remove: 'Löschen',
- Online_help: 'Online Hilfe',
- FN: 'Name',
- N: ' ',
- FAMILY: 'Familienname',
- GIVEN: 'Vorname',
- NICKNAME: 'Spitzname',
- URL: 'URL',
- ADR: 'Adresse',
- STREET: 'Straße',
- EXTADD: 'Zusätzliche Adresse',
- LOCALITY: 'Ortschaft',
- REGION: 'Region',
- PCODE: 'Postleitzahl',
- CTRY: 'Land',
- TEL: 'Telefon',
- NUMBER: 'Nummer',
- EMAIL: 'E-Mail',
- USERID: ' ',
- ORG: 'Organisation',
- ORGNAME: 'Name',
- ORGUNIT: 'Abteilung',
- TITLE: 'Titel',
- ROLE: 'Rolle',
- BDAY: 'Geburtstag',
- DESC: 'Beschreibung',
- PHOTO: ' ',
- send_message: 'Sende Nachricht',
- get_info: 'Benutzerinformationen',
- Settings: 'Einstellungen',
- Priority: 'Priorität',
- Save: 'Speichern',
- User_settings: 'Benutzereinstellungen',
- A_fingerprint_: 'Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.',
- Your_roster_is_empty_add_a: 'Deine Freundesliste ist leer, füge einen neuen Freund ',
- new_buddy: 'hinzu',
- is: 'ist',
- Login_options: 'Anmeldeoptionen',
- BOSH_url: 'BOSH url',
- Domain: 'Domain',
- Resource: 'Ressource',
- On_login: 'Beim Anmelden',
- Received_an_unencrypted_message: 'Unverschlüsselte Nachricht empfangen',
- Sorry_your_buddy_doesnt_provide_any_information: 'Dein Freund stellt leider keine Informationen bereit.',
- Info_about: 'Info über',
- Authentication_aborted: 'Authentifizierung abgebrochen.',
- Authentication_request_received: 'Authentifizierunganfrage empfangen.',
- Log_in_without_chat: 'Anmelden ohne Chat',
- Do_you_want_to_display_them: 'Möchtest du sie sehen?',
- has_come_online: 'ist online gekommen',
- Unknown_sender: 'Unbekannter Sender',
- You_received_a_message_from_an_unknown_sender: 'Du hast eine Nachricht von einem unbekannten Sender erhalten'
- },
- es: {
- Logging_in: 'Por favor, espere...',
- your_connection_is_unencrypted: 'Su conexión no está cifrada.',
- your_connection_is_encrypted: 'Su conexión está cifrada.',
- your_buddy_closed_the_private_connection: 'Su amigo ha cerrado la conexión privada.',
- start_private: 'Iniciar privado',
- close_private: 'Cerrar privado',
- your_buddy_is_verificated: 'Tu amigo está verificado.',
- you_have_only_a_subscription_in_one_way: 'Sólo tienes una suscripción de un modo.',
- authentication_query_sent: 'Consulta de verificación enviada.',
- your_message_wasnt_send_please_end_your_private_conversation: 'Su mensaje no fue enviado. Por favor, termine su conversación privada.',
- unencrypted_message_received: 'Mensaje no cifrado recibido:',
- your_message_wasnt_send_because_you_have_no_valid_subscription: 'Su mensaje no se ha enviado, porque usted no tiene suscripción válida.',
- not_available: 'No disponible',
- no_connection: 'Sin conexión!',
- relogin: 'iniciar sesión nuevamente',
- trying_to_start_private_conversation: 'Intentando iniciar una conversación privada!',
- Verified: 'Verificado',
- Unverified: 'No verificado',
- private_conversation_started: 'se inició una conversación privada.',
- private_conversation_aborted: 'Conversación privada abortada!',
- your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Su amigo cerró la conversación privada! Usted debería hacer lo mismo.',
- conversation_is_now_verified: 'La conversación es ahora verificada.',
- authentication_failed: 'Fallo la verificación.',
- your_buddy_is_attempting_to_determine_: 'Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.',
- to_authenticate_to_your_buddy: 'Para autenticar a su amigo, ',
- enter_the_answer_and_click_answer: 'introduce la respuesta y haga clic en Contestar.',
- enter_the_secret: 'especifique el secreto.',
- Creating_your_private_key_: 'Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.',
- Authenticating_a_buddy_helps_: 'Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.',
- How_do_you_want_to_authenticate_your_buddy: '¿Cómo desea autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?',
- Select_method: 'Escoja un método...',
- Manual: 'Manual',
- Question: 'Pregunta',
- Secret: 'Secreto',
- To_verify_the_fingerprint_: 'Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.',
- Your_fingerprint: 'Tu firma digital',
- Buddy_fingerprint: 'firma digital de tu amigo',
- Close: 'Cerrar',
- Compared: 'Comparado',
- To_authenticate_using_a_question_: 'Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.',
- Ask: 'Preguntar',
- To_authenticate_pick_a_secret_: 'Para autenticar, elija un secreto conocido sólo por usted y su amigo.',
- Compare: 'Comparar',
- Fingerprints: 'Firmas digitales',
- Authentication: 'Autenticación',
- Message: 'Mensaje',
- Add_buddy: 'Añadir amigo',
- rename_buddy: 'renombrar amigo',
- delete_buddy: 'eliminar amigo',
- Login: 'Iniciar Sesión',
- Username: 'Usuario',
- Password: 'Contraseña',
- Cancel: 'Cancelar',
- Connect: 'Conectar',
- Type_in_the_full_username_: 'Escriba el usuario completo y un alias opcional.',
- Alias: 'Alias',
- Add: 'Añadir',
- Subscription_request: 'Solicitud de suscripción',
- You_have_a_request_from: 'Tienes una petición de',
- Deny: 'Rechazar',
- Approve: 'Aprobar',
- Remove_buddy: 'Eliminar amigo',
- You_are_about_to_remove_: 'Vas a eliminar a {{bid_name}} (<b>{{bid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.',
- Continue_without_chat: 'Continuar',
- Please_wait: 'Espere por favor',
- Login_failed: 'Fallo el inicio de sesión',
- Sorry_we_cant_authentikate_: 'Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?',
- Retry: 'Reintentar',
- clear_history: 'Borrar el historial',
- New_message_from: 'Nuevo mensaje de',
- Should_we_notify_you_: '¿Debemos notificarle sobre nuevos mensajes en el futuro?',
- Please_accept_: 'Por favor, haga clic en el botón "Permitir" en la parte superior.',
- dnd: 'No Molestar',
- Mute: 'Desactivar sonido',
- Unmute: 'Activar sonido',
- Subscription: 'Suscripción',
- both: 'ambos',
- Status: 'Estado',
- online: 'en línea',
- chat: 'chat',
- away: 'ausente',
- xa: 'mas ausente',
- offline: 'desconectado',
- none: 'nadie',
- Unknown_instance_tag: 'Etiqueta de instancia desconocida.',
- Not_one_of_our_latest_keys: 'No de nuestra ultima tecla.',
- Received_an_unreadable_encrypted_message: 'Se recibió un mensaje cifrado ilegible.',
- Online: 'En linea',
- Chatty: 'Hablador',
- Away: 'Ausente',
- Extended_away: 'Mas ausente',
- Offline: 'Desconectado',
- Friendship_request: 'Solicitud de amistad',
- Confirm: 'Confirmar',
- Dismiss: 'Rechazar',
- Remove: 'Eliminar',
- Online_help: 'Ayuda en línea',
- FN: 'Nombre completo ',
- N: ' ',
- FAMILY: 'Apellido',
- GIVEN: 'Nombre',
- NICKNAME: 'Apodar',
- URL: 'URL',
- ADR: 'Dirección',
- STREET: 'Calle',
- EXTADD: 'Extendido dirección',
- LOCALITY: 'Población',
- REGION: 'Región',
- PCODE: 'Código postal',
- CTRY: 'País',
- TEL: 'Teléfono',
- NUMBER: 'Número',
- EMAIL: 'Emilio',
- USERID: ' ',
- ORG: 'Organización',
- ORGNAME: 'Nombre',
- ORGUNIT: 'Departamento',
- TITLE: 'Título',
- ROLE: 'Rol',
- BDAY: 'Cumpleaños',
- DESC: 'Descripción',
- PHOTO: ' ',
- send_message: 'mandar un texto',
- get_info: 'obtener información',
- Settings: 'Ajustes',
- Priority: 'Prioridad',
- Save: 'Guardar',
- User_settings: 'Configuración de usuario',
- A_fingerprint_: 'La huella digital se utiliza para que puedas estar seguro que la persona con la que estas hablando es quien realmente dice ser',
- Your_roster_is_empty_add_a: 'Tu lista de amigos esta vacia',
- new_buddy: 'Nuevo amigo',
- is: 'es',
- Login_options: 'Opciones de login',
- BOSH_url: 'BOSH url',
- Domain: 'Dominio',
- Resource: 'Recurso',
- On_login: 'Iniciar sesión',
- Received_an_unencrypted_message: 'Recibe un mensaje no cifrado'
- }
- };
-}(jQuery));
diff --git a/build/js/jsxc/jsxc.lib.webrtc.js b/build/js/jsxc/jsxc.lib.webrtc.js
deleted file mode 100644
index 5856020..0000000
--- a/build/js/jsxc/jsxc.lib.webrtc.js
+++ /dev/null
@@ -1,1056 +0,0 @@
-/*!
- * jsxc v1.1.0 - 2015-02-08
- *
- * Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
- * Released under the MIT license
- *
- * Please see http://www.jsxc.org/
- *
- * @author Klaus Herberth <klaus@jsxc.org>
- * @version 1.1.0
- * @license MIT
- */
-
-/* global jsxc, Strophe, SDPUtil, getUserMediaWithConstraints, setupRTC, jQuery, MediaStreamTrack */
-
-var RTC = null, RTCPeerconnection = null;
-
-jsxc.gui.template.incomingCall = '<h3>%%Incoming_call%%</h3>\
- <p>%%Do_you_want_to_accept_the_call_from%% {{bid_name}}?</p>\
- <p class="jsxc_right">\
- <a href="#" class="button jsxc_reject">%%Reject%%</a> <a href="#" class="button creation jsxc_accept">%%Accept%%</a>\
- </p>';
-
-jsxc.gui.template.allowMediaAccess = '<p>%%Please_allow_access_to_microphone_and_camera%%</p>';
-
-jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\
- <div class="jsxc_chatarea">\
- <ul></ul>\
- </div>\
- <div class="jsxc_videoContainer">\
- <video class="jsxc_localvideo" autoplay></video>\
- <video class="jsxc_remotevideo" autoplay></video>\
- <div class="jsxc_status"></div>\
- <div class="bubblingG">\
- <span id="bubblingG_1">\
- </span>\
- <span id="bubblingG_2">\
- </span>\
- <span id="bubblingG_3">\
- </span>\
- </div>\
- <div class="jsxc_noRemoteVideo">\
- <div>\
- <div></div>\
- <p>%%No_video_signal%%</p>\
- <div></div>\
- </div>\
- </div>\
- </div>\
- <div class="jsxc_controlbar">\
- <button type="button" class="jsxc_hangUp">%%hang_up%%</button>\
- <input type="range" class="jsxc_volume" min="0.0" max="1.0" step="0.05" value="0.5" />\
- <div class="jsxc_buttongroup">\
- <button type="button" class="jsxc_snapshot">%%snapshot%%</button><button type="button" class="jsxc_snapshots">&#9660;</button>\
- </div>\
- <!-- <button type="button" class="jsxc_mute_local">%%mute_my_audio%%</button>\
- <button type="button" class="jsxc_pause_local">%%pause_my_video%%</button> --> \
- <button type="button" class="jsxc_showchat">%%chat%%</button>\
- <button type="button" class="jsxc_fullscreen">%%fullscreen%%</button>\
- <button type="button" class="jsxc_info">%%Info%%</button>\
- </div>\
- <div class="jsxc_multi">\
- <div class="jsxc_snapshotbar">\
- <p>No pictures yet!</p>\
- </div>\n\
- <!--<div class="jsxc_chatarea">\
- <ul></ul>\
- </div>-->\
- <div class="jsxc_infobar"></div>\
- </div>\
- </div>';
-
-(function($) {
- "use strict";
-
- /**
- * WebRTC namespace for jsxc.
- *
- * @namespace jsxc.webrtc
- */
- jsxc.webrtc = {
- /** strophe connection */
- conn: null,
-
- /** local video stream */
- localStream: null,
-
- /** remote video stream */
- remoteStream: null,
-
- /** jid of the last caller */
- last_caller: null,
-
- /** should we auto accept incoming calls? */
- AUTO_ACCEPT: false,
-
- /** required disco features */
- reqVideoFeatures: [ 'urn:xmpp:jingle:apps:rtp:video', 'urn:xmpp:jingle:apps:rtp:audio', 'urn:xmpp:jingle:transports:ice-udp:1', 'urn:xmpp:jingle:apps:dtls:0' ],
-
- /** bare jid to current jid mapping */
- chatJids: {},
-
- /**
- * Initialize webrtc plugin.
- *
- * @private
- * @memberOf jsxc.webrtc
- */
- init: function() {
- var self = jsxc.webrtc;
-
- // shortcut
- self.conn = jsxc.xmpp.conn;
-
- if (RTC.browser === 'firefox') {
- self.conn.jingle.media_constraints.mandatory.MozDontOfferDataChannel = true;
- }
-
- if (!self.conn.jingle) {
- jsxc.error('No jingle plugin found!');
- return;
- }
-
- // jingle configuration
- self.conn.jingle.PRANSWER = false;
- self.conn.jingle.AUTOACCEPT = false;
- self.conn.jingle.ice_config = jsxc.storage.getUserItem('iceConfig');
- self.conn.jingle.MULTIPARTY = false;
- self.conn.jingle.pc_constraints = RTC.pc_constraints;
-
- $(document).on('message.jsxc', $.proxy(self.onMessage, self));
- $(document).on('presence.jsxc', $.proxy(self.onPresence, self));
-
- $(document).on('mediaready.jingle', $.proxy(self.onMediaReady, self));
- $(document).on('mediafailure.jingle', $.proxy(self.onMediaFailure, self));
- $(document).on('callincoming.jingle', $.proxy(self.onCallIncoming, self));
- $(document).on('callterminated.jingle', $.proxy(self.onCallTerminated, self));
- $(document).on('ringing.jingle', $.proxy(self.onCallRinging, self));
-
- $(document).on('remotestreamadded.jingle', $.proxy(self.onRemoteStreamAdded, self));
- $(document).on('remotestreamremoved.jingle', $.proxy(self.onRemoteStreamRemoved, self));
- $(document).on('iceconnectionstatechange.jingle', $.proxy(self.onIceConnectionStateChanged, self));
- $(document).on('nostuncandidates.jingle', $.proxy(self.noStunCandidates, self));
-
- $(document).on('error.jingle', function(ev, sid, error) {
- jsxc.error('[JINGLE]', error);
- });
-
- if (self.conn.disco) {
- self.conn.disco.addFeature('urn:xmpp:jingle:apps:dtls:0');
- }
-
- if (self.conn.caps) {
- $(document).on('caps.strophe', $.proxy(self.onCaps, self));
- }
-
- self.getTurnCrendentials();
- },
-
- /**
- * Checks if cached configuration is valid and if necessary update it.
- *
- * @memberOf jsxc.webrtc
- */
- getTurnCrendentials: function() {
-
- if (!jsxc.options.turnCredentialsPath) {
- jsxc.debug('No path for TURN credentials defined!');
- return;
- }
-
- var ttl = (jsxc.storage.getUserItem('iceValidity') || 0) - (new Date()).getTime();
- if (ttl > 0) {
- // credentials valid
-
- window.setTimeout(jsxc.webrtc.getTurnCrendentials, ttl + 500);
- return;
- }
-
- $.ajax(jsxc.options.turnCredentialsPath, {
- async: true,
- success: function(data) {
- var iceConfig = {
- iceServers: [ {
- url: 'turn:' + data.url,
- credential: data.credential,
- username: data.username
- } ]
- };
-
- jsxc.webrtc.conn.jingle.ice_config = iceConfig;
- jsxc.storage.setUserItem('iceConfig', iceConfig);
- jsxc.storage.setUserItem('iceValidity', (new Date()).getTime() + 1000 * data.ttl);
- },
- dataType: 'json'
- });
- },
-
- /**
- * Return list of video capable resources.
- *
- * @memberOf jsxc.webrtc
- * @param jid
- * @returns {Array}
- */
- getCapableRes: function(jid) {
- var self = jsxc.webrtc;
- var bid = jsxc.jidToBid(jid);
- var res = jsxc.storage.getUserItem('res', bid) || [];
-
- var available = [];
- $.each(res, function(r) {
- if (self.conn.caps.hasFeatureByJid(bid + '/' + r, self.reqVideoFeatures)) {
- available.push(r);
- }
- });
-
- return available;
- },
-
- /**
- * Add "video" button to roster
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param bid bid of roster item
- * @param data data wich belongs to bid
- * @param el the roster item
- */
- onAddRosterItem: function(event, bid, data, el) {
- var self = jsxc.webrtc;
-
- if (!self.conn) {
- $(document).one('connectionReady.jsxc', function() {
- self.onAddRosterItem(null, bid, data, el);
- });
- return;
- }
-
- var videoIcon = $('<div class="jsxc_video jsxc_disabled" title="' + jsxc.l.Start_video_call + '"></div>');
-
- videoIcon.click(function() {
- self.startCall(data.jid);
- return false;
- });
-
- el.find('.jsxc_options.jsxc_left').append(videoIcon);
-
- el.on('extra.jsxc', function() {
- self.updateIcon(bid);
- });
- },
-
- /**
- * Add "video" button to window menu.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param win jQuery window object
- */
- initWindow: function(event, win) {
- var self = jsxc.webrtc;
-
- jsxc.debug('webrtc.initWindow');
-
- if (!self.conn) {
- $(document).one('connectionReady.jsxc', function() {
- self.initWindow(null, win);
- });
- return;
- }
-
- var div = $('<div>').addClass('jsxc_video');
- win.find('.jsxc_transfer:eq(1)').after(div);
-
- self.updateIcon(jsxc.jidToBid(win.data('jid')));
- },
-
- /**
- * Enable or disable "video" icon and assign full jid.
- *
- * @memberOf jsxc.webrtc
- * @param bid CSS conform jid
- */
- updateIcon: function(bid) {
- jsxc.debug('Update icon', bid);
-
- var self = jsxc.webrtc;
-
- if (bid === jsxc.jidToBid(self.conn.jid)) {
- return;
- }
-
- var win = jsxc.gui.window.get(bid);
- var jid = win.data('jid') || jsxc.storage.getUserItem('buddy', bid).jid;
-
- var el = win.find('.jsxc_video').add(jsxc.gui.roster.getItem(bid).find('.jsxc_video'));
-
- var capableRes = self.getCapableRes(jid);
- var targetRes = Strophe.getResourceFromJid(jid);
-
- if (targetRes === null) {
- $.each(jsxc.storage.getUserItem('buddy', bid).res, function(index, val) {
- if (capableRes.indexOf(val) > -1) {
- targetRes = val;
- return false;
- }
- });
- }
-
- el.off('click');
-
- if (capableRes.indexOf(targetRes) > -1) {
- el.click(function() {
- self.startCall(jid + '/' + targetRes);
- });
-
- el.removeClass('jsxc_disabled');
-
- el.attr('title', jsxc.translate('%%Start video call%%'));
- } else {
- el.addClass('jsxc_disabled');
-
- el.attr('title', jsxc.translate('%%Video call not possible.%%'));
- }
- },
-
- /**
- * Check if full jid changed.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param e
- * @param from full jid
- */
- onMessage: function(e, from) {
- var self = jsxc.webrtc;
- var bid = jsxc.jidToBid(from);
-
- jsxc.debug('webrtc.onmessage', from);
-
- if (self.chatJids[bid] !== from) {
- self.updateIcon(bid);
- self.chatJids[bid] = from;
- }
- },
-
- /**
- * Update icon on presence.
- *
- * @memberOf jsxc.webrtc
- * @param ev
- * @param status
- * @private
- */
- onPresence: function(ev, jid) {
- var self = jsxc.webrtc;
-
- jsxc.debug('webrtc.onpresence', jid);
-
- self.updateIcon(jsxc.jidToBid(jid));
- },
-
- /**
- * Display status message to user.
- *
- * @memberOf jsxc.webrtc
- * @param txt message
- * @param d duration in ms
- */
- setStatus: function(txt, d) {
- var status = $('.jsxc_webrtc .jsxc_status');
- var duration = (typeof d === 'undefined' || d === null) ? 4000 : d;
-
- jsxc.debug('[Webrtc]', txt);
-
- if (status.html()) {
- // attach old messages
- txt = status.html() + '<br />' + txt;
- }
-
- status.html(txt);
-
- status.css({
- 'margin-left': '-' + (status.width() / 2) + 'px',
- opacity: 0,
- display: 'block'
- });
-
- status.stop().animate({
- opacity: 1
- });
-
- clearTimeout(status.data('timeout'));
-
- if (duration === 0) {
- return;
- }
-
- var to = setTimeout(function() {
- status.stop().animate({
- opacity: 0
- }, function() {
- status.html('');
- });
- }, duration);
-
- status.data('timeout', to);
- },
-
- /**
- * Update "video" button if we receive cap information.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param jid
- */
- onCaps: function(event, jid) {
- var self = jsxc.webrtc;
-
- self.updateIcon(jsxc.jidToBid(jid));
- },
-
- /**
- * Called if video/audio is ready. Open window and display some messages.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param stream
- */
- onMediaReady: function(event, stream) {
- jsxc.debug('media ready');
-
- var self = jsxc.webrtc;
-
- self.localStream = stream;
- self.conn.jingle.localStream = stream;
-
- jsxc.gui.showVideoWindow(self.last_caller);
-
- var i;
- for (i = 0; i < stream.getAudioTracks().length; i++) {
- self.setStatus((stream.getAudioTracks().length > 0) ? 'Use local audio device.' : 'No local audio device.');
-
- jsxc.debug('using audio device "' + stream.getAudioTracks()[i].label + '"');
- }
- for (i = 0; i < stream.getVideoTracks().length; i++) {
- self.setStatus((stream.getVideoTracks().length > 0) ? 'Use local video device.' : 'No local video device.');
-
- jsxc.debug('using video device "' + stream.getVideoTracks()[i].label + '"');
- $('#jsxc_dialog .jsxc_localvideo').show();
- }
-
- $(document).one('cleanup.dialog.jsxc', $.proxy(self.hangUp, self));
- $(document).trigger('finish.mediaready.jsxc');
- },
-
- /**
- * Called if media failes.
- *
- * @private
- * @memberOf jsxc.webrtc
- */
- onMediaFailure: function(ev, err) {
- this.setStatus('media failure');
-
- jsxc.gui.window.postMessage(jsxc.jidToBid(jsxc.webrtc.last_caller), 'sys', jsxc.translate('%%Media failure%%: ') + err.name);
- jsxc.debug('media failure: ' + err.name);
- },
-
- /**
- * Called on incoming call.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param sid Session id
- */
- onCallIncoming: function(event, sid) {
- jsxc.debug('incoming call' + sid);
-
- var self = this;
- var sess = this.conn.jingle.sessions[sid];
- var bid = jsxc.jidToBid(sess.peerjid);
-
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.translate('%%Incoming call.%%'));
-
- // display notification
- jsxc.notification.notify(jsxc.translate('%%Incoming call%%'), jsxc.translate('%%from%% ' + bid));
-
- // send signal to partner
- sess.sendRinging();
-
- jsxc.webrtc.last_caller = sess.peerjid;
-
- jsxc.switchEvents({
- 'mediaready.jingle': function(event, stream) {
- self.setStatus('Accept call');
-
- sess.localStream = stream;
- sess.peerconnection.addStream(stream);
-
- sess.sendAnswer();
- sess.accept();
- },
- 'mediafailure.jingle': function() {
- sess.sendTerminate('decline');
- sess.terminate();
- }
- });
-
- if (jsxc.webrtc.AUTO_ACCEPT) {
- self.reqUserMedia();
- return;
- }
-
- var dialog = jsxc.gui.dialog.open(jsxc.gui.template.get('incomingCall', bid), {
- noClose: true
- });
-
- dialog.find('.jsxc_accept').click(function() {
- $(document).trigger('accept.call.jsxc');
-
- self.reqUserMedia();
- });
-
- dialog.find('.jsxc_reject').click(function() {
- jsxc.gui.dialog.close();
- $(document).trigger('reject.call.jsxc');
-
- sess.sendTerminate('decline');
- sess.terminate();
- });
- },
-
- /**
- * Called if call is terminated.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param sid Session id
- * @param reason Reason for termination
- * @param [text] Optional explanation
- */
- onCallTerminated: function(event, sid, reason, text) {
- this.setStatus('call terminated ' + sid + (reason ? (': ' + reason + ' ' + text) : ''));
-
- var bid = jsxc.jidToBid(jsxc.webrtc.last_caller);
-
- if (this.localStream) {
- this.localStream.stop();
- }
-
- if ($('.jsxc_videoContainer').length) {
- $('.jsxc_remotevideo')[0].src = "";
- $('.jsxc_localvideo')[0].src = "";
- }
-
- this.conn.jingle.localStream = null;
- this.localStream = null;
- this.remoteStream = null;
-
- var win = $('#jsxc_dialog .jsxc_chatarea > ul > li');
- $('#jsxc_windowList > ul').prepend(win.detach());
- win.find('.slimScrollDiv').resizable('enable');
-
- $(document).off('cleanup.dialog.jsxc');
- $(document).off('error.jingle');
- jsxc.gui.dialog.close();
-
- jsxc.gui.window.postMessage(bid, 'sys', jsxc.translate('%%Call terminated%%' + (reason ? (': %%' + reason + '%%') : '') + '.'));
- },
-
- /**
- * Remote station is ringing.
- *
- * @private
- * @memberOf jsxc.webrtc
- */
- onCallRinging: function() {
- this.setStatus('ringing...', 0);
- },
-
- /**
- * Called if we receive a remote stream.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param data
- * @param sid Session id
- */
- onRemoteStreamAdded: function(event, data, sid) {
- this.setStatus('Remote stream for session ' + sid + ' added.');
-
- var stream = data.stream;
- this.remoteStream = stream;
-
- var sess = this.conn.jingle.sessions[sid];
-
- var isVideoDevice = stream.getVideoTracks().length > 0;
- var isAudioDevice = stream.getAudioTracks().length > 0;
-
- sess.remoteDevices = {
- video: isVideoDevice,
- audio: isAudioDevice
- };
-
- this.setStatus(isVideoDevice ? 'Use remote video device.' : 'No remote video device');
- this.setStatus(isAudioDevice ? 'Use remote audio device.' : 'No remote audio device');
-
- if ($('.jsxc_remotevideo').length) {
- RTC.attachMediaStream($('#jsxc_dialog .jsxc_remotevideo'), stream);
-
- $('#jsxc_dialog .jsxc_' + (isVideoDevice ? 'remotevideo' : 'noRemoteVideo')).addClass('jsxc_deviceAvailable');
- }
- },
-
- /**
- * Called if the remote stream was removed.
- *
- * @private
- * @meberOf jsxc.webrtc
- * @param event
- * @param data
- * @param sid Session id
- */
- onRemoteStreamRemoved: function(event, data, sid) {
- this.setStatus('Remote stream for session ' + sid + ' removed.');
- },
-
- /**
- * Extracts local and remote ip and display it to the user.
- *
- * @private
- * @memberOf jsxc.webrtc
- * @param event
- * @param sid session id
- * @param sess
- */
- onIceConnectionStateChanged: function(event, sid, sess) {
- var sigState = sess.peerconnection.signalingState;
- var iceCon = sess.peerconnection.iceConnectionState;
-
- jsxc.debug('iceGat state for ' + sid, sess.peerconnection.iceGatheringState);
- jsxc.debug('iceCon state for ' + sid, iceCon);
- jsxc.debug('sig state for ' + sid, sigState);
-
- if (sigState === 'stable' && (iceCon === 'connected' || iceCon === 'completed')) {
-
- $('#jsxc_dialog .jsxc_deviceAvailable').show();
- $('#jsxc_dialog .bubblingG').hide();
-
- var localSDP = sess.peerconnection.localDescription.sdp;
- var remoteSDP = sess.peerconnection.remoteDescription.sdp;
-
- sess.local_fp = SDPUtil.parse_fingerprint(SDPUtil.find_line(localSDP, 'a=fingerprint:')).fingerprint;
- sess.remote_fp = SDPUtil.parse_fingerprint(SDPUtil.find_line(remoteSDP, 'a=fingerprint:')).fingerprint;
-
- var ip_regex = "(\\d{1,3}\\.\\d{1,3}.\\d{1,3}\\.\\d{1,3}) \\d+ typ host";
-
- sess.remote_ip = remoteSDP.match(new RegExp(ip_regex))[1];
- sess.local_ip = localSDP.match(new RegExp(ip_regex))[1];
-
- var regex = new RegExp(ip_regex, 'g');
- var match;
- while ((match = regex.exec(remoteSDP)) !== null) {
- if (match[1] !== sess.remote_ip) {
- alert('!!! WARNING !!!\n\nPossible Man-in-the-middle attack detected!\n\nYou should close the connection.');
- return;
- }
- }
-
- var text = '<p>';
- text += '<b>' + jsxc.translate('%%Local IP%%: ') + '</b>' + sess.local_ip + '<br />';
- text += '<b>' + jsxc.translate('%%Remote IP%%: ') + '</b>' + sess.remote_ip + '<br />';
- text += '<b>' + jsxc.translate('%%Local Fingerprint%%: ') + '</b>' + sess.local_fp + '<br />';
- text += '<b>' + jsxc.translate('%%Remote Fingerprint%%: ') + '</b>' + sess.remote_fp;
- text += '</p>';
-
- $('#jsxc_dialog .jsxc_infobar').html(text);
- } else if (iceCon === 'failed') {
- jsxc.gui.window.postMessage(jsxc.jidToBid(sess.peerjid), 'sys', jsxc.translate('%%ICE connection failure%%.'));
-
- $(document).off('cleanup.dialog.jsxc');
-
- sess.sendTerminate('failed-transport');
- sess.terminate();
-
- $(document).trigger('callterminated.jingle');
- }
- },
-
- /**
- * No STUN candidates found
- *
- * @private
- * @memberOf jsxc.webrtc
- */
- noStunCandidates: function() {
-
- },
-
- /**
- * Start a call to the specified jid.
- *
- * @memberOf jsxc.webrtc
- * @param jid full jid
- * @param um requested user media
- */
- startCall: function(jid, um) {
- var self = this;
-
- if (Strophe.getResourceFromJid(jid) === null) {
- jsxc.debug('We need a full jid');
- return;
- }
-
- self.last_caller = jid;
-
- jsxc.switchEvents({
- 'finish.mediaready.jsxc': function() {
- self.setStatus('Initiate call');
-
- jsxc.gui.window.postMessage(jsxc.jidToBid(jid), 'sys', jsxc.translate('%%Call started.%%'));
-
- $(document).one('error.jingle', function(e, sid, error) {
- if (error.source !== 'offer') {
- return;
- }
-
- $(document).off('cleanup.dialog.jsxc');
- setTimeout(function() {
- jsxc.gui.showAlert("Sorry, we couldn't establish a connection. Maybe your buddy is offline.");
- }, 500);
- });
-
- self.conn.jingle.initiate(jid, self.conn.jid.toLowerCase());
- },
- 'mediafailure.jingle': function() {
- jsxc.gui.dialog.close();
- }
- });
-
- self.reqUserMedia(um);
- },
-
- /**
- * Hang up the current call.
- *
- * @memberOf jsxc.webrtc
- */
- hangUp: function(reason, text) {
- $(document).off('cleanup.dialog.jsxc');
-
- jsxc.webrtc.conn.jingle.terminate(null, reason, text);
- $(document).trigger('callterminated.jingle');
- },
-
- /**
- * Request video and audio from local user.
- *
- * @memberOf jsxc.webrtc
- */
- reqUserMedia: function(um) {
- if (this.localStream) {
- $(document).trigger('mediaready.jingle', [ this.localStream ]);
- return;
- }
-
- um = um || [ 'video', 'audio' ];
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('allowMediaAccess'), {
- noClose: true
- });
- this.setStatus('please allow access to microphone and camera');
-
- if (typeof MediaStreamTrack !== 'undefined' && typeof MediaStreamTrack.getSources !== 'undefined') {
- MediaStreamTrack.getSources(function(sourceInfo) {
- var availableDevices = sourceInfo.map(function(el) {
-
- return el.kind;
- });
-
- um = um.filter(function(el) {
- return availableDevices.indexOf(el) !== -1;
- });
-
- getUserMediaWithConstraints(um);
- });
- } else {
- getUserMediaWithConstraints(um);
- }
- },
-
- /**
- * Make a snapshot from a video stream and display it.
- *
- * @memberOf jsxc.webrtc
- * @param video Video stream
- */
- snapshot: function(video) {
- if (!video) {
- jsxc.debug('Missing video element');
- }
-
- $('.jsxc_snapshotbar p').remove();
-
- var canvas = $('<canvas/>').css('display', 'none').appendTo('body').attr({
- width: video.width(),
- height: video.height()
- }).get(0);
- var ctx = canvas.getContext('2d');
-
- ctx.drawImage(video[0], 0, 0);
- var img = $('<img/>');
- var url = null;
-
- try {
- url = canvas.toDataURL('image/jpeg');
- } catch (err) {
- jsxc.warn('Error', err);
- return;
- }
-
- img[0].src = url;
- var link = $('<a/>').attr({
- target: '_blank',
- href: url
- });
- link.append(img);
- $('.jsxc_snapshotbar').append(link);
-
- canvas.remove();
- }
- };
-
- /**
- * Display window for video call.
- *
- * @memberOf jsxc.gui
- */
- jsxc.gui.showVideoWindow = function(jid) {
- var self = jsxc.webrtc;
-
- $(document).one('complete.dialog.jsxc', function() {
-
- // mute own video element to avoid echoes
- $('#jsxc_dialog .jsxc_localvideo')[0].muted = true;
- $('#jsxc_dialog .jsxc_localvideo')[0].volume = 0;
-
- var rv = $('#jsxc_dialog .jsxc_remotevideo');
- var lv = $('#jsxc_dialog .jsxc_localvideo');
-
- lv.draggable({
- containment: "parent"
- });
-
- RTC.attachMediaStream(lv, self.localStream);
-
- var w_dialog = $('#jsxc_dialog').width();
- var w_remote = rv.width();
-
- // fit in video
- if (w_remote > w_dialog) {
- var scale = w_dialog / w_remote;
- var new_h = rv.height() * scale;
- var new_w = w_dialog;
- var vc = $('#jsxc_dialog .jsxc_videoContainer');
-
- rv.height(new_h);
- rv.width(new_w);
-
- vc.height(new_h);
- vc.width(new_w);
-
- lv.height(lv.height() * scale);
- lv.width(lv.width() * scale);
- }
-
- if (self.remoteStream) {
- RTC.attachMediaStream(rv, self.remoteStream);
-
- $('#jsxc_dialog .jsxc_' + (self.remoteStream.getVideoTracks().length > 0 ? 'remotevideo' : 'noRemoteVideo')).addClass('jsxc_deviceAvailable');
- }
-
- var toggleMulti = function(elem, open) {
- $('#jsxc_dialog .jsxc_multi > div').not(elem).slideUp();
-
- var opt = {
- complete: jsxc.gui.dialog.resize
- };
-
- if (open) {
- elem.slideDown(opt);
- } else {
- elem.slideToggle(opt);
- }
- };
-
- var win = jsxc.gui.window.open(jsxc.jidToBid(jid));
-
- win.find('.slimScrollDiv').resizable('disable');
- win.find('.jsxc_textarea').slimScroll({
- height: 413
- });
- win.find('.jsxc_emoticons').css('top', (413 + 6) + 'px');
-
- $('#jsxc_dialog .jsxc_chatarea ul').append(win.detach());
-
- $('#jsxc_dialog .jsxc_hangUp').click(function() {
- jsxc.webrtc.hangUp();
- });
-
- $('#jsxc_dialog .jsxc_snapshot').click(function() {
- jsxc.webrtc.snapshot(rv);
- toggleMulti($('#jsxc_dialog .jsxc_snapshotbar'), true);
- });
-
- $('#jsxc_dialog .jsxc_snapshots').click(function() {
- toggleMulti($('#jsxc_dialog .jsxc_snapshotbar'));
- });
-
- $('#jsxc_dialog .jsxc_showchat').click(function() {
- var chatarea = $('#jsxc_dialog .jsxc_chatarea');
-
- if (chatarea.is(':hidden')) {
- chatarea.show();
- $('#jsxc_dialog .jsxc_webrtc').width('900');
- jsxc.gui.dialog.resize({
- width: '920px'
- });
- } else {
- chatarea.hide();
- $('#jsxc_dialog .jsxc_webrtc').width('650');
- jsxc.gui.dialog.resize({
- width: '660px'
- });
- }
- });
-
- $('#jsxc_dialog .jsxc_info').click(function() {
- toggleMulti($('#jsxc_dialog .jsxc_infobar'));
- });
-
- $('#jsxc_dialog .jsxc_fullscreen').click(function() {
-
- if ($.support.fullscreen) {
- // Reset position of localvideo
- $(document).one('disabled.fullscreen', function() {
- lv.removeAttr('style');
- });
-
- $('#jsxc_dialog .jsxc_videoContainer').fullscreen();
- }
- });
-
- $('#jsxc_dialog .jsxc_volume').change(function() {
- rv[0].volume = $(this).val();
- });
-
- $('#jsxc_dialog .jsxc_volume').dblclick(function() {
- $(this).val(0.5);
- });
- });
-
- jsxc.gui.dialog.open(jsxc.gui.template.get('videoWindow'), {
- noClose: true
- });
- };
-
- $.extend(jsxc.CONST, {
- KEYCODE_ENTER: 13,
- KEYCODE_ESC: 27
- });
-
- $(document).ready(function() {
- RTC = setupRTC();
-
- if (RTC !== null) {
- RTCPeerconnection = RTC.peerconnection;
-
- $(document).on('add.roster.jsxc', jsxc.webrtc.onAddRosterItem);
- $(document).on('init.window.jsxc', jsxc.webrtc.initWindow);
- $(document).on('attached.jsxc', jsxc.webrtc.init);
- }
- });
-
- $.extend(jsxc.l10n.en, {
- Please_allow_access_to_microphone_and_camera: 'Please click the "Allow" button at the top, to allow access to microphone and camera.',
- Incoming_call: 'Incoming call',
- from: 'from',
- Do_you_want_to_accept_the_call_from: 'Do you want to accept the call from',
- Reject: 'Reject',
- Accept: 'Accept',
- hang_up: 'hang up',
- snapshot: 'snapshot',
- mute_my_audio: 'mute my audio',
- pause_my_video: 'pause my video',
- fullscreen: 'fullscreen',
- Info: 'Info',
- Local_IP: 'Local IP',
- Remote_IP: 'Remote IP',
- Local_Fingerprint: 'Local fingerprint',
- Remote_Fingerprint: 'Remote fingerprint',
- Video_call_not_possible: 'Video call not possible. Your buddy does not support video calls.',
- Start_video_call: 'Start video call'
- });
-
- $.extend(jsxc.l10n.de, {
- Please_allow_access_to_microphone_and_camera: 'Bitte klick auf den "Zulassen" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.',
- Incoming_call: 'Eingehender Anruf',
- from: 'von',
- Do_you_want_to_accept_the_call_from: 'Möchtest Du den Anruf annehmen von',
- Reject: 'Ablehnen',
- Accept: 'Annehmen',
- hang_up: 'Auflegen',
- snapshot: 'Schnappschuss',
- mute_my_audio: 'Mein Ton aus',
- pause_my_video: 'Mein Video pausieren',
- fullscreen: 'Vollbild',
- Info: 'Info',
- Local_IP: 'Lokale IP',
- Remote_IP: 'Remote IP',
- Local_Fingerprint: 'Lokaler Fingerprint',
- Remote_Fingerprint: 'Remote Fingerprint',
- Video_call_not_possible: 'Videoanruf nicht verfügbar. Dein Gesprächspartner unterstützt keine Videotelefonie.',
- Start_video_call: 'Starte Videoanruf'
- });
-
- $.extend(jsxc.l10n.es, {
- Please_allow_access_to_microphone_and_camera: 'Por favor, permitir el acceso al micrófono y la cámara.',
- Incoming_call: 'Llamada entrante',
- from: 'de',
- Do_you_want_to_accept_the_call_from: 'Desea aceptar la llamada de',
- Reject: 'Rechazar',
- Accept: 'Aceptar',
- hang_up: 'colgar',
- snapshot: 'instantánea',
- mute_my_audio: 'silenciar mi audio',
- pause_my_video: 'pausar mi vídeo',
- fullscreen: 'pantalla completa',
- Info: 'Info',
- Local_IP: 'IP local',
- Remote_IP: 'IP remota',
- Local_Fingerprint: 'Firma digital local',
- Remote_Fingerprint: 'Firma digital remota',
- Video_call_not_possible: 'Llamada de vídeo no es posible',
- Start_video_call: 'Iniciar llamada de vídeo'
- });
-}(jQuery));
diff --git a/build/js/jsxc/jsxc.min.js b/build/js/jsxc/jsxc.min.js
index 8e6c1b7..620b8e8 100644
--- a/build/js/jsxc/jsxc.min.js
+++ b/build/js/jsxc/jsxc.min.js
@@ -1,6 +1,5 @@
-/*! This file is concatenated for the browser. */
/*!
- * jsxc v1.1.0 - 2015-02-08
+ * jsxc v2.0.0-beta1 - 2015-04-29
*
* Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
* Released under the MIT license
@@ -8,23 +7,13 @@
* Please see http://www.jsxc.org/
*
* @author Klaus Herberth <klaus@jsxc.org>
- * @version 1.1.0
+ * @version 2.0.0-beta1
* @license MIT
*/
-var jsxc;!function($){"use strict";jsxc={version:"1.1.0",master:!1,role_allocation:!1,to:null,toBusy:null,toNotification:null,toNotificationDelay:500,keepalive:null,restore:!1,restoreCompleted:!1,triggeredFromBox:!1,triggeredFromElement:!1,triggeredFromLogout:!1,ls:[],storageNotConform:null,toSNC:null,bid:null,CONST:{NOTIFICATION_DEFAULT:"default",NOTIFICATION_GRANTED:"granted",NOTIFICATION_DENIED:"denied",STATUS:["offline","dnd","xa","away","chat","online"],SOUNDS:{MSG:"incomingMessage.wav",CALL:"Rotary-Phone6.mp3",NOTICE:"Ping1.mp3"},REGEX:{JID:new RegExp("\\b[^\"&'\\/:<>@\\s]+@[\\w-_.]+\\b","ig"),URL:new RegExp(/((?:https?:\/\/|www\.|([\w\-]+\.[a-zA-Z]{2,3})(?=\b))(?:(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\)([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|])?)|(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]))?)/gi)},NS:{CARBONS:"urn:xmpp:carbons:2",FORWARD:"urn:xmpp:forward:0"}},getFormattedTime:function(unixtime){var msgDate=new Date(parseInt(unixtime)),date=("0"+msgDate.getDate()).slice(-2),month=("0"+(msgDate.getMonth()+1)).slice(-2),year=msgDate.getFullYear(),hours=("0"+msgDate.getHours()).slice(-2),minutes=("0"+msgDate.getMinutes()).slice(-2),dateNow=new Date,time=hours+":"+minutes;return dateNow.setHours(0,0,0,0),msgDate.setHours(0,0,0,0),dateNow.getTime()!==msgDate.getTime()?date+"."+month+"."+year+" "+time:time},debug:function(msg,data,level){if(level&&(msg="["+level+"] "+msg),data){jsxc.storage.getItem("debug")===!0&&console.log(msg,data);var d;try{d=$("<span>").prepend($(data).clone()).html()}catch(err){try{d=JSON.stringify(data)}catch(err2){d="see js console"}}jsxc.log=jsxc.log+msg+": "+d+"\n"}else console.log(msg),jsxc.log=jsxc.log+msg+"\n"},warn:function(msg,data){jsxc.debug(msg,data,"WARN")},error:function(msg,data){jsxc.debug(msg,data,"ERROR")},log:"",init:function(options){options&&$.extend(!0,jsxc.options,options),jsxc.options.get=function(key){var local=jsxc.storage.getUserItem("options")||{};return local[key]||jsxc.options[key]},jsxc.options.set=function(key,value){jsxc.storage.updateItem("options",key,value,!0)},jsxc.storageNotConform=jsxc.storage.getItem("storageNotConform"),null===jsxc.storageNotConform&&(jsxc.storageNotConform=2);var lang;if(lang=null!==jsxc.storage.getItem("lang")?jsxc.storage.getItem("lang"):jsxc.options.autoLang&&navigator.language?navigator.language.substr(0,2):jsxc.options.defaultLang,jsxc.l=jsxc.l10n.en,$.extend(jsxc.l,jsxc.l10n[lang]),"undefined"==typeof localStorage)return void jsxc.debug("Browser doesn't support localStorage.");jsxc.storage.getItem("debug")===!0&&(jsxc.options.otr.debug=!0),window.addEventListener("storage",jsxc.storage.onStorage,!1);var lastActivity=jsxc.storage.getItem("lastActivity")||0;if((new Date).getTime()-lastActivity<jsxc.options.loginTimeout&&(jsxc.restore=!0),jsxc.storage.getItem("rid")&&jsxc.storage.getItem("sid")&&jsxc.restore)jsxc.bid=jsxc.jidToBid(jsxc.storage.getItem("jid")),jsxc.gui.init(),null!==jsxc.options.logoutElement&&jsxc.options.logoutElement.length>0&&jsxc.options.logoutElement.one("click",function(){return jsxc.options.logoutElement=$(this),jsxc.triggeredFromLogout=!0,jsxc.xmpp.logout()}),"undefined"!=typeof jsxc.storage.getItem("alive")&&jsxc.restore?jsxc.checkMaster():jsxc.onMaster();else{if(!jsxc.options.loginForm.form||!(jsxc.el_exists(jsxc.options.loginForm.form)&&jsxc.el_exists(jsxc.options.loginForm.jid)&&jsxc.el_exists(jsxc.options.loginForm.pass)))return void(jsxc.options.displayRosterMinimized()&&(jsxc.storage.setUserItem("roster","hidden"),jsxc.gui.roster.init(),jsxc.gui.roster.noConnection()));"function"==typeof jsxc.options.formFound&&jsxc.options.formFound.call();var form=jsxc.options.loginForm.form=$(jsxc.options.loginForm.form),events=form.data("events")||{submit:[]},submits=[];$.each(events.submit,function(index,val){submits.push(val.handler)}),form.data("submits",submits),form.off("submit"),form.submit(function(){var settings=jsxc.prepareLogin();return settings===!1||"true"!==settings.xmpp.onlogin&&settings.xmpp.onlogin!==!0?!0:(jsxc.options.loginForm.triggered=!0,jsxc.xmpp.login(),!1)})}},prepareLogin:function(){var username=$(jsxc.options.loginForm.jid).val(),password=$(jsxc.options.loginForm.pass).val();if("function"!=typeof jsxc.options.loadSettings)return void jsxc.error("No loadSettings function given. Abort.");jsxc.gui.showWaitAlert(jsxc.l.Logging_in);var settings=jsxc.options.loadSettings.call(this,username,password);if(settings===!1||null===settings||"undefined"==typeof settings)return jsxc.warn("No settings provided"),!1;"string"==typeof settings.xmpp.username&&(username=settings.xmpp.username);var jid,resource=settings.xmpp.resource?"/"+settings.xmpp.resource:"",domain=settings.xmpp.domain;return jid=username.match(/@(.*)$/)?username.match(/\/(.*)$/)?username:username+resource:username+"@"+domain+resource,"function"==typeof jsxc.options.loginForm.preJid&&(jid=jsxc.options.loginForm.preJid(jid)),jsxc.bid=jsxc.jidToBid(jid),settings.xmpp.username=jid.split("@")[0],settings.xmpp.domain=jid.split("@")[1].split("/")[0],settings.xmpp.resource=jid.split("@")[1].split("/")[1]||"",$.each(settings,function(key,val){jsxc.options.set(key,val)}),jsxc.options.xmpp.jid=jid,jsxc.options.xmpp.password=password,settings},onSlave:function(){jsxc.debug("I am the slave."),jsxc.role_allocation=!0,jsxc.restoreRoster(),jsxc.restoreWindows(),jsxc.restoreCompleted=!0,$(document).trigger("restoreCompleted.jsxc")},onMaster:function(){jsxc.debug("I am master."),jsxc.master=!0,jsxc.storage.setItem("alive",0),jsxc.storage.setItem("alive_busy",0),jsxc.storage.getUserItem("windowlist")||jsxc.storage.setUserItem("windowlist",[]),jsxc.startKeepAlive(),jsxc.options.get("otr").enable?jsxc.otr.createDSA():jsxc._onMaster()},_onMaster:function(){if(jsxc.role_allocation&&$.each(jsxc.storage.getUserItem("windowlist"),function(index,val){jsxc.otr.create(val)}),jsxc.role_allocation=!0,jsxc.restore&&!jsxc.restoreCompleted&&(jsxc.restoreRoster(),jsxc.restoreWindows(),jsxc.restoreCompleted=!0,$(document).trigger("restoreCompleted.jsxc")),jsxc.restore){var noti=jsxc.storage.getUserItem("notification")||2;jsxc.options.notification&&noti>0&&jsxc.notification.hasSupport()?jsxc.notification.hasPermission()?jsxc.notification.init():jsxc.notification.prepareRequest():jsxc.options.notification=!1}$(document).on("connectionReady.jsxc",function(){jsxc.gui.updateAvatar($("#jsxc_avatar"),jsxc.storage.getItem("jid"),"own")}),jsxc.xmpp.login()},checkMaster:function(){jsxc.debug("check master"),jsxc.to=window.setTimeout(jsxc.onMaster,1e3),jsxc.storage.ink("alive")},startKeepAlive:function(){jsxc.keepalive=window.setInterval(jsxc.keepAlive,jsxc.options.timeout-1e3)},keepAlive:function(){jsxc.storage.ink("alive"),jsxc.role_allocation&&jsxc.storage.setItem("lastActivity",(new Date).getTime())},keepBusyAlive:function(){jsxc.toBusy&&window.clearTimeout(jsxc.toBusy),jsxc.keepalive&&window.clearInterval(jsxc.keepalive),jsxc.storage.ink("alive_busy"),jsxc.toBusy=window.setTimeout(jsxc.startKeepAlive,jsxc.options.busyTimeout-1e3)},random:function(max){return Math.floor(Math.random()*max)},el_exists:function(selector){return $(selector).length>0},jidToCid:function(jid){jsxc.warn("jsxc.jidToCid is deprecated!");var cid=Strophe.getBareJidFromJid(jid).replace("@","-").replace(/\./g,"-").toLowerCase();return cid},jidToBid:function(jid){return Strophe.getBareJidFromJid(jid).toLowerCase()},restoreRoster:function(){var buddies=jsxc.storage.getUserItem("buddylist");return buddies&&0!==buddies.length?($.each(buddies,function(index,value){jsxc.gui.roster.add(value)}),void $(document).trigger("cloaded.roster.jsxc")):(jsxc.debug("No saved buddylist."),void jsxc.gui.roster.empty())},restoreWindows:function(){var windows=jsxc.storage.getUserItem("windowlist");null!==windows&&$.each(windows,function(index,bid){var window=jsxc.storage.getUserItem("window",bid);return window?(jsxc.gui.window.init(bid),window.minimize?jsxc.gui.window.hide(bid):jsxc.gui.window.show(bid),void jsxc.gui.window.setText(bid,window.text)):(jsxc.debug("Associated window-element is missing: "+bid),!0)})},submitLoginForm:function(){var form=jsxc.options.loginForm.form.off("submit"),submits=form.data("submits")||[];$.each(submits,function(index,val){form.submit(val)}),form.find("#submit").length>0?form.find("#submit").click():form.submit()},escapeHTML:function(text){return text=text.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">"),text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},removeHTML:function(text){return $("<span>").html(text).text()},switchEvents:function(obj){var ns=Math.random().toString(36).substr(2,12),self=this;return $.each(obj,function(key,val){$(document).one(key+"."+ns,function(){$(document).off("."+ns),val.apply(self,arguments)})}),ns},isHidden:function(){var hidden=!1;return"undefined"!=typeof document.hidden?hidden=document.hidden:"undefined"!=typeof document.webkitHidden?hidden=document.webkitHidden:"undefined"!=typeof document.mozHidden?hidden=document.mozHidden:"undefined"!=typeof document.msHidden&&(hidden=document.msHidden),hidden&&jsxc.master?jsxc.storage.ink("hidden",0):hidden||jsxc.master||jsxc.storage.ink("hidden"),hidden},translate:function(text){return text.replace(/%%([a-zA-Z0-9_-}{ .!,?/'@]+)%%/g,function(s,key){var k=key.replace(/ /gi,"_").replace(/[.!,?/'@]/g,"");return jsxc.l[k]||jsxc.warn("No translation for: "+k),jsxc.l[k]||key.replace(/_/g," ")})},exec:function(fnName,fnParams){var i,fnList=fnName.split("."),fn=jsxc[fnList[0]];for(i=1;i<fnList.length;i++)fn=fn[fnList[i]];return"function"==typeof fn?fn.apply(null,fnParams):void 0}},jsxc.options={app_name:"web applications",timeout:3e3,busyTimeout:15e3,otr:{enable:!0,ERROR_START_AKE:!1,debug:!1,SEND_WHITESPACE_TAG:!0,WHITESPACE_START_AKE:!0},xmpp:{url:null,jid:null,domain:null,password:null,overwrite:!1,onlogin:!0},priority:{online:0,chat:0,away:0,xa:0,dnd:0},loginForm:{form:null,jid:null,pass:null,preJid:function(jid){return jid},onConnected:"submit",onAuthFail:"submit"},logoutElement:null,numberOfMsg:10,defaultLang:"en",autoLang:!0,rosterAppend:"body",notification:!0,popupDuration:6e3,root:"",loginTimeout:6e5,displayRosterMinimized:function(){return!1},hideOffline:!1,muteNotification:!1,defaultAvatar:function(){},loadSettings:function(){},saveSettinsPermanent:function(){},carbons:{enable:!1}},jsxc.gui={emotions:[["O:-) O:)","angel"],[">:-( >:( &gt;:-( &gt;:(","angry"],[":-) :)","smile"],[":-D :D","grin"],[":-( :(","sad"],[";-) ;)","wink"],[":-P :P","tonguesmile"],["=-O","surprised"],[":kiss: :-*","kiss"],["8-) :cool:","sunglassess"],[":'-( :'( :&amp;apos;-(","crysad"],[":-/","doubt"],[":-X :X","zip"],[":yes:","thumbsup"],[":no:","thumbsdown"],[":beer:","beer"],[":devil:","devil"],[":kiss: :kissing:","kissing"],["@->-- :rose: @-&gt;--","rose"],[":music:","music"],[":love:","love"],[":zzz:","tired"]],queryActions:{message:function(jid,params){var win=jsxc.gui.window.open(jsxc.jidToBid(jid));params&&"string"==typeof params.body&&win.find(".jsxc_textinput").val(params.body)},remove:function(jid){jsxc.gui.showRemoveDialog(jsxc.jidToBid(jid))},subscribe:function(jid,params){jsxc.gui.showContactDialog(jid),params&&$("#jsxc_alias").val(params.name)},vcard:function(jid){jsxc.gui.showVcard(jid)}},init:function(){$("#jsxc_windowList").length>0||($("body").append($(jsxc.gui.template.get("windowList"))),$(window).resize(jsxc.gui.updateWindowListSB),$("#jsxc_windowList").resize(jsxc.gui.updateWindowListSB),$("#jsxc_windowListSB .jsxc_scrollLeft").click(function(){jsxc.gui.scrollWindowListBy(-200)}),$("#jsxc_windowListSB .jsxc_scrollRight").click(function(){jsxc.gui.scrollWindowListBy(200)}),$("#jsxc_windowList").on("wheel",function(ev){$("#jsxc_windowList").data("isOver")&&jsxc.gui.scrollWindowListBy(ev.originalEvent.wheelDelta>0?200:-200)}),jsxc.gui.tooltip("#jsxc_windowList"),jsxc.el_exists("#jsxc_roster")||jsxc.gui.roster.init(),$.each(jsxc.gui.emotions,function(i,val){var reg=val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g,"\\$1");reg="("+reg.split(" ").join("|")+")",jsxc.gui.emotions[i][2]=new RegExp(reg,"g")}),jsxc.gui.windowTemplate=$(jsxc.gui.template.get("chatWindow")),jsxc.gui.buddyTemplate=$(jsxc.gui.template.get("rosterBuddy")))},tooltip:function(selector){$(selector).tooltip({show:{delay:600},content:function(){return $(this).attr("title").replace(/\n/g,"<br />")}})},update:function(bid){var data=jsxc.storage.getUserItem("buddy",bid);if(!data)return void jsxc.debug("No data for "+bid);var ri=jsxc.gui.roster.getItem(bid),we=jsxc.gui.window.get(bid),ue=ri.add(we),spot=$('.jsxc_spot[data-bid="'+bid+'"]');switch(ri.data(data),ue.add(spot).removeClass("jsxc_"+jsxc.CONST.STATUS.join(" jsxc_")).addClass("jsxc_"+jsxc.CONST.STATUS[data.status]),ue.find(".jsxc_name").add(spot).text(data.name).attr("title",jsxc.l.is+" "+jsxc.CONST.STATUS[data.status]),data.msgstate){case 0:we.find(".jsxc_transfer").removeClass("jsxc_enc jsxc_fin").attr("title",jsxc.l.your_connection_is_unencrypted),we.find(".jsxc_settings .jsxc_verification").addClass("jsxc_disabled"),we.find(".jsxc_settings .jsxc_transfer").text(jsxc.l.start_private);break;case 1:we.find(".jsxc_transfer").addClass("jsxc_enc").attr("title",jsxc.l.your_connection_is_encrypted),we.find(".jsxc_settings .jsxc_verification").removeClass("jsxc_disabled"),we.find(".jsxc_settings .jsxc_transfer").text(jsxc.l.close_private);break;case 2:we.find(".jsxc_settings .jsxc_verification").addClass("jsxc_disabled"),we.find(".jsxc_transfer").removeClass("jsxc_enc").addClass("jsxc_fin").attr("title",jsxc.l.your_buddy_closed_the_private_connection),we.find(".jsxc_settings .jsxc_transfer").text(jsxc.l.close_private)}data.trust?we.find(".jsxc_transfer").addClass("jsxc_trust").attr("title",jsxc.l.your_buddy_is_verificated):we.find(".jsxc_transfer").removeClass("jsxc_trust"),data.sub&&"both"!==data.sub?ue.addClass("jsxc_oneway"):ue.removeClass("jsxc_oneway");var info="<b>"+Strophe.getBareJidFromJid(data.jid)+"</b>\n";info+=jsxc.translate("%%Subscription%%: %%"+data.sub+"%%\n"),info+=jsxc.translate("%%Status%%: %%"+jsxc.CONST.STATUS[data.status]+"%%"),ri.find(".jsxc_name").attr("title",info),data.avatar&&data.avatar.length>0?jsxc.gui.updateAvatar(ue,data.jid,data.avatar):jsxc.options.defaultAvatar.call(ue,data.jid)},updateAvatar:function(el,jid,aid){if("undefined"==typeof aid)return void("function"==typeof jsxc.options.defaultAvatar&&jsxc.options.defaultAvatar.call(el,jid));var avatarSrc=jsxc.storage.getUserItem("avatar",aid),setAvatar=function(src){return 0===src||"0"===src?void jsxc.options.defaultAvatar.call(el,jid):(el.find(".jsxc_avatar").removeAttr("style"),void el.find(".jsxc_avatar").css({"background-image":"url("+src+")","text-indent":"999px"}))};null!==avatarSrc?setAvatar(avatarSrc):jsxc.xmpp.conn.vcard.get(function(stanza){jsxc.debug("vCard",stanza);var src,vCard=$(stanza).find("vCard > PHOTO");if(0===vCard.length)jsxc.debug("No photo provided"),src="0";else if(vCard.find("EXTVAL").length>0)src=vCard.find("EXTVAL").text();else{var img=vCard.find("BINVAL").text(),type=vCard.find("TYPE").text();src="data:"+type+";base64,"+img}src=src.replace(/[\t\r\n\f]/gi,""),jsxc.storage.setUserItem("avatar",aid,src),setAvatar(src)},Strophe.getBareJidFromJid(jid),function(msg){jsxc.warn("Could not load vcard.",msg),jsxc.storage.setUserItem("avatar",aid,0),setAvatar(0)})},updateWindowListSB:function(){$("#jsxc_windowList>ul").width()>$("#jsxc_windowList").width()?$("#jsxc_windowListSB > div").removeClass("jsxc_disabled"):($("#jsxc_windowListSB > div").addClass("jsxc_disabled"),$("#jsxc_windowList>ul").css("right","0px"))},scrollWindowListBy:function(offset){var scrollWidth=$("#jsxc_windowList>ul").width(),width=$("#jsxc_windowList").width(),el=$("#jsxc_windowList>ul"),right=parseInt(el.css("right"))-offset,padding=$("#jsxc_windowListSB").width();width>scrollWidth||(right>0&&(right=0),width-scrollWidth-padding>right&&(right=width-scrollWidth-padding),el.css("right",right+"px"))},getWindow:function(bid){return jsxc.warn("jsxc.gui.getWindow is deprecated!"),jsxc.gui.window.get(bid)},toggleList:function(){var self=$(this);self.disableSelection();var ul=self.find("ul"),slideUp=null;slideUp=function(){ul.slideUp({complete:function(){self.removeClass("jsxc_opened")}}),$("body").off("click",null,slideUp)},$(this).click(function(){return ul.is(":hidden")?($("body").click(),$("body").one("click",slideUp)):$("body").off("click",null,slideUp),ul.slideToggle(),window.clearTimeout(ul.data("timer")),self.toggleClass("jsxc_opened"),!1}).mouseleave(function(){ul.data("timer",window.setTimeout(slideUp,2e3))}).mouseenter(function(){window.clearTimeout(ul.data("timer"))})},showLoginBox:function(){$(document).on("complete.dialog.jsxc",function(){$("#jsxc_password").focus()}),jsxc.gui.dialog.open(jsxc.gui.template.get("loginBox")),$("#jsxc_dialog").find("form").submit(function(){$(this).find("input[type=submit]").prop("disabled",!0),jsxc.options.loginForm.form=$(this),jsxc.options.loginForm.jid=$(this).find("#jsxc_username"),jsxc.options.loginForm.pass=$(this).find("#jsxc_password");var settings=jsxc.prepareLogin();return jsxc.triggeredFromBox=!0,jsxc.options.loginForm.triggered=!1,settings===!1?jsxc.gui.showAuthFail():jsxc.xmpp.login(),!1})},showFingerprints:function(bid){jsxc.gui.dialog.open(jsxc.gui.template.get("fingerprintsDialog",bid))},showVerification:function(bid){return $("#jsxc_dialog").length>0?void setTimeout(function(){jsxc.gui.showVerification(bid)},3e3):jsxc.storage.getUserItem("buddy",bid).msgstate!==OTR.CONST.MSGSTATE_ENCRYPTED?void jsxc.warn("Connection not encrypted"):(jsxc.gui.dialog.open(jsxc.gui.template.get("authenticationDialog",bid)),$("#jsxc_dialog > div:gt(0)").hide(),$("#jsxc_dialog select").change(function(){$("#jsxc_dialog > div:gt(0)").hide(),$("#jsxc_dialog > div:eq("+$(this).prop("selectedIndex")+")").slideDown({complete:function(){jsxc.gui.dialog.resize()}})}),$("#jsxc_dialog > div:eq(1) a.creation").click(function(){jsxc.master&&(jsxc.otr.objects[bid].trust=!0),jsxc.storage.updateUserItem("buddy",bid,"trust",!0),jsxc.gui.dialog.close(),jsxc.storage.updateUserItem("buddy",bid,"trust",!0),jsxc.gui.window.postMessage(bid,"sys",jsxc.l.conversation_is_now_verified),jsxc.gui.update(bid)}),$("#jsxc_dialog > div:eq(2) a.creation").click(function(){var div=$("#jsxc_dialog > div:eq(2)"),sec=div.find("#jsxc_secret2").val(),quest=div.find("#jsxc_quest").val();return""===sec||""===quest?void div.find('input[value=""]').addClass("jsxc_invalid").keyup(function(){$(this).val().match(/.*/)&&$(this).removeClass("jsxc_invalid")}):(jsxc.master?jsxc.otr.sendSmpReq(bid,sec,quest):jsxc.storage.setUserItem("smp_"+bid,{sec:sec,quest:quest}),jsxc.gui.dialog.close(),void jsxc.gui.window.postMessage(bid,"sys",jsxc.l.authentication_query_sent))}),void $("#jsxc_dialog > div:eq(3) .creation").click(function(){var div=$("#jsxc_dialog > div:eq(3)"),sec=div.find("#jsxc_secret").val();return""===sec?void div.find("#jsxc_secret").addClass("jsxc_invalid").keyup(function(){$(this).val().match(/.*/)&&$(this).removeClass("jsxc_invalid")}):(jsxc.master?jsxc.otr.sendSmpReq(bid,sec):jsxc.storage.setUserItem("smp_"+bid,{sec:sec,quest:null}),jsxc.gui.dialog.close(),void jsxc.gui.window.postMessage(bid,"sys",jsxc.l.authentication_query_sent))}))},showApproveDialog:function(from){jsxc.gui.dialog.open(jsxc.gui.template.get("approveDialog"),{noClose:!0}),$("#jsxc_dialog .jsxc_their_jid").text(Strophe.getBareJidFromJid(from)),$("#jsxc_dialog .jsxc_deny").click(function(ev){ev.stopPropagation(),jsxc.xmpp.resFriendReq(from,!1),jsxc.gui.dialog.close()}),$("#jsxc_dialog .jsxc_approve").click(function(ev){ev.stopPropagation();var data=jsxc.storage.getUserItem("buddy",jsxc.jidToBid(from));jsxc.xmpp.resFriendReq(from,!0),data&&"from"!==data.sub||$(document).one("close.dialog.jsxc",function(){jsxc.gui.showContactDialog(from)}),jsxc.gui.dialog.close()})},showContactDialog:function(username){jsxc.gui.dialog.open(jsxc.gui.template.get("contactDialog")),username&&$("#jsxc_username").val(username),$("#jsxc_dialog form").submit(function(){var username=$("#jsxc_username").val(),alias=$("#jsxc_alias").val();return username.match(/@(.*)$/)||(username+="@"+Strophe.getDomainFromJid(jsxc.storage.getItem("jid"))),username&&username.match(jsxc.CONST.REGEX.JID)?(jsxc.xmpp.addBuddy(username,alias),jsxc.gui.dialog.close(),!1):($("#jsxc_username").addClass("jsxc_invalid").keyup(function(){$(this).val().match(jsxc.CONST.REGEX.JID)&&$(this).removeClass("jsxc_invalid")}),!1)})},showRemoveDialog:function(bid){jsxc.gui.dialog.open(jsxc.gui.template.get("removeDialog",bid));var data=jsxc.storage.getUserItem("buddy",bid);$("#jsxc_dialog .creation").click(function(ev){ev.stopPropagation(),jsxc.master?jsxc.xmpp.removeBuddy(data.jid):jsxc.storage.setUserItem("deletebuddy",bid,{jid:data.jid}),jsxc.gui.dialog.close()})},showWaitAlert:function(msg){jsxc.gui.dialog.open(jsxc.gui.template.get("waitAlert",null,msg),{noClose:!0})},showAlert:function(msg){jsxc.gui.dialog.open(jsxc.gui.template.get("alert",null,msg))},showAuthFail:function(){jsxc.gui.dialog.open(jsxc.gui.template.get("authFailDialog")),jsxc.options.loginForm.triggered!==!1&&$("#jsxc_dialog .jsxc_cancel").hide(),$("#jsxc_dialog .creation").click(function(){jsxc.gui.dialog.close()}),$("#jsxc_dialog .jsxc_cancel").click(function(){jsxc.submitLoginForm()})},showConfirmDialog:function(msg,confirm,dismiss){jsxc.gui.dialog.open(jsxc.gui.template.get("confirmDialog",null,msg),{noClose:!0}),confirm&&$("#jsxc_dialog .creation").click(confirm),dismiss&&$("#jsxc_dialog .jsxc_cancel").click(dismiss)},showAboutDialog:function(){jsxc.gui.dialog.open(jsxc.gui.template.get("aboutDialog")),$("#jsxc_dialog .jsxc_debuglog").click(function(){jsxc.gui.showDebugLog()})},showDebugLog:function(){var userInfo="<h3>User information</h3>";if(navigator){var key;for(key in navigator)navigator.hasOwnProperty(key)&&"string"==typeof navigator[key]&&(userInfo+="<b>"+key+":</b> "+navigator[key]+"<br />")}window.screen&&(userInfo+="<b>Height:</b> "+window.screen.height+"<br />",userInfo+="<b>Width:</b> "+window.screen.width+"<br />"),userInfo+="<b>jsxc version:</b> "+jsxc.version+"<br />",jsxc.gui.dialog.open('<div class="jsxc_log">'+userInfo+"<h3>Log</h3><pre>"+jsxc.escapeHTML(jsxc.log)+"</pre></div>")},showVcard:function(jid){var bid=jsxc.jidToBid(jid);jsxc.gui.dialog.open(jsxc.gui.template.get("vCard",bid));var data=jsxc.storage.getUserItem("buddy",bid);if(data){var i,j,res,identities,cap,client,identity=null;for(i=0;i<data.res.length;i++){for(res=data.res[i],identities=[],cap=jsxc.xmpp.getCapabilitiesByJid(bid+"/"+res),null!==cap&&null!==cap.identities&&(identities=cap.identities),client="",j=0;j<identities.length;j++)identity=identities[j],"client"===identity.category&&(""!==client&&(client+=",\n"),client+=identity.name+" ("+identity.type+")");var status=jsxc.storage.getUserItem("res",bid)[res];$("#jsxc_dialog ul.jsxc_vCard").append('<li class="jsxc_sep"><strong>'+jsxc.translate("%%Resource%%")+":</strong> "+res+"</li>"),$("#jsxc_dialog ul.jsxc_vCard").append("<li><strong>"+jsxc.translate("%%Client%%")+":</strong> "+client+"</li>"),$("#jsxc_dialog ul.jsxc_vCard").append("<li>"+jsxc.translate("<strong>%%Status%%:</strong> %%"+jsxc.CONST.STATUS[status]+"%%")+"</li>")}}var printProp=function(el,depth){var content="";return el.each(function(){var item=$(this),children=$(this).children();content+="<li>";var prop=jsxc.translate("%%"+item[0].tagName+"%%");" "!==prop&&(content+="<strong>"+prop+":</strong> "),"PHOTO"===item[0].tagName||(children.length>0?(content+="<ul>",content+=printProp(children,depth+1),content+="</ul>"):""!==item.text()&&(content+=jsxc.escapeHTML(item.text()))),content+="</li>",0===depth&&$("#jsxc_dialog ul.jsxc_vCard").length>0&&($("#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first").length>0?$("#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first").before(content):$("#jsxc_dialog ul.jsxc_vCard").append(content),content="")}),depth>0?content:void 0},failedToLoad=function(){if(0!==$("#jsxc_dialog ul.jsxc_vCard").length){$("#jsxc_dialog p").remove();var content="<p>";content+=jsxc.translate("%%Sorry, your buddy doesn't provide any information.%%"),content+="</p>",$("#jsxc_dialog").append(content)}};jsxc.xmpp.loadVcard(bid,function(stanza){if(0!==$("#jsxc_dialog ul.jsxc_vCard").length){$("#jsxc_dialog p").remove();var photo=$(stanza).find("vCard > PHOTO");if(photo.length>0){var img=photo.find("BINVAL").text(),type=photo.find("TYPE").text(),src="data:"+type+";base64,"+img;photo.find("EXTVAL").length>0&&(src=photo.find("EXTVAL").text()),src=src.replace(/[\t\r\n\f]/gi,"");var img_el=$('<img class="jsxc_vCard" alt="avatar" />');img_el.attr("src",src),$("#jsxc_dialog h3").before(img_el)}return 0===$(stanza).find("vCard").length||1===$(stanza).find("vcard > *").length&&1===photo.length?void failedToLoad():void printProp($(stanza).find("vcard > *"),0)}},failedToLoad)},showSettings:function(){jsxc.gui.dialog.open(jsxc.gui.template.get("settings")),("false"===jsxc.options.get("xmpp").overwrite||jsxc.options.get("xmpp").overwrite===!1)&&$(".jsxc_fieldsetXmpp").hide(),$("#jsxc_dialog form").each(function(){var self=$(this);self.find('input[type!="submit"]').each(function(){var id=this.id.split("-"),prop=id[0],key=id[1],type=this.type,data=jsxc.options.get(prop);data&&"undefined"!=typeof data[key]&&("checkbox"===type?"false"!==data[key]&&data[key]!==!1&&(this.checked="checked"):$(this).val(data[key]))})}),$("#jsxc_dialog form").submit(function(){var self=$(this),data={};self.find('input[type!="submit"]').each(function(){var val,id=this.id.split("-"),prop=id[0],key=id[1],type=this.type;val="checkbox"===type?this.checked:$(this).val(),data[prop]||(data[prop]={}),data[prop][key]=val}),$.each(data,function(key,val){jsxc.options.set(key,val)});var err=jsxc.options.saveSettinsPermanent.call(this,data);return"string"==typeof self.attr("data-onsubmit")&&jsxc.exec(self.attr("data-onsubmit"),[err]),setTimeout(function(){self.find('input[type="submit"]').effect("highlight",{color:err?"green":"red"},4e3)},200),!1})},showRequestNotification:function(){jsxc.gui.showConfirmDialog(jsxc.translate("%%Should we notify you_%%"),function(){jsxc.gui.dialog.open(jsxc.gui.template.get("pleaseAccept"),{noClose:!0}),jsxc.notification.requestPermission()},function(){$(document).trigger("notificationfailure.jsxc")})},showUnknownSender:function(bid){jsxc.gui.showConfirmDialog(jsxc.translate("%%You_received_a_message_from_an_unknown_sender%% ("+bid+"). %%Do_you_want_to_display_them%%"),function(){jsxc.gui.dialog.close(),jsxc.storage.saveBuddy(bid,{jid:bid,name:bid,status:0,sub:"none",res:[]}),jsxc.gui.window.open(bid)},function(){jsxc.storage.removeUserItem("chat",bid)})},changePresence:function(pres,external){external!==!0&&jsxc.storage.setUserItem("presence",pres),jsxc.master&&jsxc.xmpp.sendPres(),$("#jsxc_presence > span").text($("#jsxc_presence > ul .jsxc_"+pres).text()),jsxc.gui.updatePresence("own",pres)},updatePresence:function(bid,pres){"own"===bid&&("dnd"===pres?($("#jsxc_menu .jsxc_muteNotification").addClass("jsxc_disabled"),jsxc.notification.muteSound(!0)):($("#jsxc_menu .jsxc_muteNotification").removeClass("jsxc_disabled"),jsxc.options.get("muteNotification")||jsxc.notification.unmuteSound(!0))),$('.jsxc_presence[data-bid="'+bid+'"]').removeClass("jsxc_"+jsxc.CONST.STATUS.join(" jsxc_")).addClass("jsxc_"+pres)},unreadMsg:function(bid){var win=jsxc.gui.window.get(bid);jsxc.gui.roster.getItem(bid).add(win).addClass("jsxc_unreadMsg"),jsxc.storage.updateUserItem("window",bid,"unread",!0)},readMsg:function(bid){var win=jsxc.gui.window.get(bid);win.hasClass("jsxc_unreadMsg")&&(jsxc.gui.roster.getItem(bid).add(win).removeClass("jsxc_unreadMsg"),jsxc.storage.updateUserItem("window",bid,"unread",!1))},detectUriScheme:function(container){container=$(container?container:"body"),container.find("a[href^='xmpp:']").each(function(){var action,element=$(this),href=element.attr("href").replace(/^xmpp:/,""),jid=href.split("?")[0],params={};if(href.indexOf("?")<0)action="message";else{var pairs=href.substring(href.indexOf("?")+1).split(";");action=pairs[0];var i,key,value;for(i=1;i<pairs.length;i++)key=pairs[i].split("=")[0],value=pairs[i].indexOf("=")>0?pairs[i].substring(pairs[i].indexOf("=")+1):null,params[decodeURIComponent(key)]=decodeURIComponent(value)}"function"==typeof jsxc.gui.queryActions[action]&&(element.addClass("jsxc_uriScheme jsxc_uriScheme_"+action),element.off("click").click(function(ev){return ev.stopPropagation(),jsxc.gui.queryActions[action].call(jsxc,jid,params),!1}))})},detectEmail:function(container){container=$(container?container:"body"),container.find('a[href^="mailto:"]').each(function(){var spot=$("<span>X</span>").addClass("jsxc_spot"),href=$(this).attr("href").replace(/^ *mailto:/,"").trim();if(""!==href&&href!==Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))){var bid=jsxc.jidToBid(href),self=$(this),s=self.prev();s.hasClass("jsxc_spot")||(s=spot.clone().attr("data-bid",bid),self.before(s)),s.off("click"),jsxc.storage.getUserItem("buddy",bid)?(jsxc.gui.update(bid),s.click(function(){return jsxc.gui.window.open(bid),!1})):s.click(function(){return jsxc.gui.showContactDialog(href),!1})}})}},jsxc.gui.roster={init:function(){$(jsxc.options.rosterAppend+":first").append($(jsxc.gui.template.get("roster"))),jsxc.options.get("hideOffline")&&($("#jsxc_menu .jsxc_hideOffline").text(jsxc.translate("%%Show offline%%")),$("#jsxc_buddylist").addClass("jsxc_hideOffline")),$("#jsxc_menu .jsxc_settings").click(function(){jsxc.gui.showSettings()}),$("#jsxc_menu .jsxc_hideOffline").click(function(){var hideOffline=!jsxc.options.get("hideOffline");hideOffline?$("#jsxc_buddylist").addClass("jsxc_hideOffline"):$("#jsxc_buddylist").removeClass("jsxc_hideOffline"),$(this).text(jsxc.translate(hideOffline?"%%Show offline%%":"%%Hide offline%%")),jsxc.options.set("hideOffline",hideOffline)}),jsxc.options.get("muteNotification")&&jsxc.notification.muteSound(),$("#jsxc_menu .jsxc_muteNotification").click(function(){if("dnd"!==jsxc.storage.getUserItem("presence")){var mute=!jsxc.options.get("muteNotification");mute?jsxc.notification.muteSound():jsxc.notification.unmuteSound()}}),$("#jsxc_roster .jsxc_addBuddy").click(function(){jsxc.gui.showContactDialog()}),$("#jsxc_roster .jsxc_onlineHelp").click(function(){window.open("http://www.jsxc.org/manual.html","onlineHelp")}),$("#jsxc_roster .jsxc_about").click(function(){jsxc.gui.showAboutDialog()}),$("#jsxc_toggleRoster").click(function(){jsxc.gui.roster.toggle()}),$("#jsxc_presence > ul > li").click(function(){var self=$(this);jsxc.gui.changePresence(self.data("pres"))}),$("#jsxc_buddylist").slimScroll({distance:"3px",height:$("#jsxc_roster").height()-31+"px",width:$("#jsxc_buddylist").width()+"px",color:"#fff",opacity:"0.5"}),$("#jsxc_roster > .jsxc_bottom > div").each(function(){jsxc.gui.toggleList.call($(this))}),"hidden"===jsxc.storage.getUserItem("roster")&&($("#jsxc_roster").css("right","-200px"),$("#jsxc_windowList > ul").css("paddingRight","10px"));var pres=jsxc.storage.getUserItem("presence")||"online";$("#jsxc_presence > span").text($("#jsxc_presence > ul .jsxc_"+pres).text()),jsxc.gui.updatePresence("own",pres),jsxc.gui.tooltip("#jsxc_roster"),jsxc.notice.load(),$(document).trigger("ready.roster.jsxc")},add:function(bid){var data=jsxc.storage.getUserItem("buddy",bid),bud=jsxc.gui.buddyTemplate.clone().attr("data-bid",bid).attr("data-type",data.type||"chat");jsxc.gui.roster.insert(bid,bud),bud.click(function(){jsxc.gui.window.open(bid)}),bud.find(".jsxc_chaticon").click(function(){jsxc.gui.window.open(bid)}),bud.find(".jsxc_rename").click(function(){return jsxc.gui.roster.rename(bid),!1}),bud.find(".jsxc_delete").click(function(){return jsxc.gui.showRemoveDialog(bid),!1});var expandClick=function(){return bud.trigger("extra.jsxc"),bud.toggleClass("jsxc_expand"),jsxc.gui.updateAvatar(bud,data.jid,data.avatar),!1};bud.find(".jsxc_control").click(expandClick),bud.dblclick(expandClick),bud.find(".jsxc_vcardicon").click(function(){return jsxc.gui.showVcard(data.jid),!1
-}),jsxc.gui.update(bid),$("#jsxc_buddylist").slimScroll({scrollTo:"0px"}),$(document).trigger("add.roster.jsxc",[bid,data,bud])},getItem:function(bid){return $("#jsxc_buddylist > li[data-bid='"+bid+"']")},insert:function(bid,li){var data=jsxc.storage.getUserItem("buddy",bid),listElements=$("#jsxc_buddylist > li"),insert=!1,status="both"===data.sub?data.status:-1;listElements.each(function(){var thisStatus="both"===$(this).data("sub")?$(this).data("status"):-1;return $(this).data("name").toLowerCase()>data.name.toLowerCase()&&thisStatus===status||status>thisStatus?($(this).before(li),insert=!0,!1):void 0}),insert||li.appendTo("#jsxc_buddylist")},reorder:function(bid){jsxc.gui.roster.insert(bid,jsxc.gui.roster.remove(bid))},remove:function(bid){return jsxc.gui.roster.getItem(bid).detach()},purge:function(bid){jsxc.master&&(jsxc.storage.removeUserItem("buddy",bid),jsxc.storage.removeUserItem("otr",bid),jsxc.storage.removeUserItem("otr_version_"+bid),jsxc.storage.removeUserItem("chat",bid),jsxc.storage.removeUserItem("window",bid),jsxc.storage.removeUserElement("buddylist",bid),jsxc.storage.removeUserElement("windowlist",bid)),jsxc.gui.window._close(bid),jsxc.gui.roster.remove(bid)},rename:function(bid){var name=jsxc.gui.roster.getItem(bid).find(".jsxc_name"),options=jsxc.gui.roster.getItem(bid).find(".jsxc_options, .jsxc_control"),input=$('<input type="text" name="name"/>');options.hide(),name=name.replaceWith(input),input.val(name.text()),input.keypress(function(ev){13===ev.which&&(options.show(),input.replaceWith(name),jsxc.gui.roster._rename(bid,$(this).val()),$("html").off("click"))}),input.click(function(){return!1}),$("html").one("click",function(){options.show(),input.replaceWith(name),jsxc.gui.roster._rename(bid,input.val())})},_rename:function(bid,newname){if(jsxc.master){var d=jsxc.storage.getUserItem("buddy",bid),iq=$iq({type:"set"}).c("query",{xmlns:"jabber:iq:roster"}).c("item",{jid:Strophe.getBareJidFromJid(d.jid),name:newname});jsxc.xmpp.conn.sendIQ(iq)}jsxc.storage.updateUserItem("buddy",bid,"name",newname),jsxc.gui.update(bid)},toggle:function(d){var duration=d||500,roster=$("#jsxc_roster"),wl=$("#jsxc_windowList"),roster_width=roster.innerWidth(),roster_right=parseFloat($("#jsxc_roster").css("right")),state=0>roster_right?"shown":"hidden";jsxc.storage.setUserItem("roster",state),roster.animate({right:-1*(roster_width+roster_right)+"px"},duration),wl.animate({right:10-roster_right+"px"},duration),$(document).trigger("toggle.roster.jsxc",[state,duration])},noConnection:function(){$("#jsxc_roster").addClass("jsxc_noConnection"),$("#jsxc_roster").append($("<p>"+jsxc.l.no_connection+"</p>").append(" <a>"+jsxc.l.relogin+"</a>").click(function(){jsxc.gui.showLoginBox()}))},empty:function(){var text=$("<p>"+jsxc.l.Your_roster_is_empty_add_a+"</p>"),link=$("<a>"+jsxc.l.new_buddy+"</a>");link.click(function(){jsxc.gui.showContactDialog()}),text.append(link),text.append("."),$("#jsxc_roster").prepend(text)}},jsxc.gui.dialog={open:function(data,o){var opt=o||{},options={};return options={onComplete:function(){$("#jsxc_dialog .jsxc_close").click(function(ev){ev.preventDefault(),jsxc.gui.dialog.close()}),options.closeButton===!1&&$("#cboxClose").hide(),$.colorbox.resize(),$(document).trigger("complete.dialog.jsxc")},onClosed:function(){$(document).trigger("close.dialog.jsxc")},onCleanup:function(){$(document).trigger("cleanup.dialog.jsxc")},opacity:.5},opt.noClose&&(options.overlayClose=!1,options.escKey=!1,options.closeButton=!1,delete opt.noClose),$.extend(options,opt),options.html='<div id="jsxc_dialog">'+data+"</div>",$.colorbox(options),$("#jsxc_dialog")},close:function(){jsxc.debug("close dialog"),$.colorbox.close()},resize:function(options){$.colorbox.resize(options)}},jsxc.gui.window={init:function(bid){if(jsxc.gui.window.get(bid).length>0)return jsxc.gui.window.get(bid);var win=jsxc.gui.windowTemplate.clone().attr("data-bid",bid).hide().appendTo("#jsxc_windowList > ul").show("slow"),data=jsxc.storage.getUserItem("buddy",bid);if(win.data("jid",data.jid),jsxc.gui.toggleList.call(win.find(".jsxc_settings")),win.find(".jsxc_verification").click(function(){jsxc.gui.showVerification(bid)}),win.find(".jsxc_fingerprints").click(function(){jsxc.gui.showFingerprints(bid)}),win.find(".jsxc_transfer").click(function(){jsxc.otr.toggleTransfer(bid)}),win.find(".jsxc_bar").click(function(){jsxc.gui.window.toggle(bid)}),win.find(".jsxc_close").click(function(){jsxc.gui.window.close(bid)}),win.find(".jsxc_clear").click(function(){jsxc.gui.window.clear(bid)}),win.find(".jsxc_tools").click(function(){return!1}),win.find(".jsxc_textinput").keyup(function(ev){var body=$(this).val();13===ev.which&&(body=""),jsxc.storage.updateUserItem("window",bid,"text",body),27===ev.which&&jsxc.gui.window.close(bid)}).keypress(function(ev){13===ev.which&&$(this).val()&&(jsxc.gui.window.postMessage(bid,"out",$(this).val()),$(this).val(""))}).focus(function(){jsxc.gui.readMsg(bid)}).mouseenter(function(){$("#jsxc_windowList").data("isOver",!0)}).mouseleave(function(){$("#jsxc_windowList").data("isOver",!1)}),win.find(".jsxc_textarea").click(function(){win.find(".jsxc_textinput").focus()}),win.find(".jsxc_textarea").slimScroll({height:"234px",distance:"3px"}),win.find(".jsxc_fade").hide(),win.find(".jsxc_name").disableSelection(),win.find(".slimScrollDiv").resizable({handles:"w, nw, n",minHeight:234,minWidth:250,resize:function(event,ui){win.width(ui.size.width),win.find(".jsxc_textarea").slimScroll({height:ui.size.height}),win.find(".jsxc_emoticons").css("top",ui.size.height+6+"px")}}),$.inArray(bid,jsxc.storage.getUserItem("windowlist"))<0){var wl=jsxc.storage.getUserItem("windowlist");wl.push(bid),jsxc.storage.setUserItem("windowlist",wl),jsxc.storage.setUserItem("window",bid,{minimize:!0,text:"",unread:!1})}else jsxc.storage.getUserItem("window",bid).unread&&jsxc.gui.unreadMsg(bid);return $.each(jsxc.gui.emotions,function(i,val){var ins=val[0].split(" ")[0],li=$('<li><div title="'+ins+'" class="jsxc_'+val[1]+'"/></li>');li.click(function(){win.find("input").val(win.find("input").val()+ins),win.find("input").focus()}),win.find(".jsxc_emoticons ul").append(li)}),jsxc.gui.toggleList.call(win.find(".jsxc_emoticons")),jsxc.gui.window.restoreChat(bid),jsxc.gui.update(bid),jsxc.gui.updateWindowListSB(),jsxc.master&&!jsxc.otr.objects[bid]?jsxc.otr.create(bid):jsxc.otr.enable(bid),$(document).trigger("init.window.jsxc",[win]),win},get:function(id){return $("li.jsxc_windowItem[data-bid='"+jsxc.jidToBid(id)+"']")},open:function(bid){var win=jsxc.gui.window.init(bid);jsxc.gui.window.show(bid),jsxc.gui.window.highlight(bid);var padding=$("#jsxc_windowListSB").width(),innerWidth=$("#jsxc_windowList>ul").width(),outerWidth=$("#jsxc_windowList").width()-padding;if(innerWidth>outerWidth){var offset=parseInt($("#jsxc_windowList>ul").css("right")),width=win.outerWidth(!0),right=innerWidth-win.position().left-width+offset,left=outerWidth-(innerWidth-win.position().left)-offset;0>left&&jsxc.gui.scrollWindowListBy(-1*left),0>right&&jsxc.gui.scrollWindowListBy(right)}return win},close:function(bid){return 0===jsxc.gui.window.get(bid).length?void jsxc.warn("Want to close a window, that is not open."):(jsxc.storage.removeUserElement("windowlist",bid),jsxc.storage.removeUserItem("window",bid),jsxc.storage.getUserItem("buddylist").indexOf(bid)<0&&(jsxc.storage.removeUserItem("buddy",bid),jsxc.storage.removeUserItem("chat",bid)),void jsxc.gui.window._close(bid))},_close:function(bid){jsxc.gui.window.get(bid).hide("slow",function(){$(this).remove(),jsxc.gui.updateWindowListSB()})},toggle:function(bid){var win=jsxc.gui.window.get(bid);0!==win.parents("#jsxc_windowList").length&&(win.find(".jsxc_fade").is(":hidden")?jsxc.gui.window.show(bid):jsxc.gui.window.hide(bid),jsxc.gui.updateWindowListSB())},show:function(bid){jsxc.storage.updateUserItem("window",bid,"minimize",!1),jsxc.gui.window._show(bid)},_show:function(bid){var win=jsxc.gui.window.get(bid);jsxc.gui.window.get(bid).find(".jsxc_fade").slideDown(),win.removeClass("jsxc_min"),jsxc.gui.window.scrollDown(bid),jsxc.restoreCompleted&&win.find(".jsxc_textinput").focus(),win.trigger("show.window.jsxc")},hide:function(bid){jsxc.storage.updateUserItem("window",bid,"minimize",!0),jsxc.gui.window._hide(bid)},_hide:function(bid){jsxc.gui.window.get(bid).addClass("jsxc_min").find(" .jsxc_fade").slideUp(),jsxc.gui.window.get(bid).trigger("hidden.window.jsxc")},highlight:function(bid){var el=jsxc.gui.window.get(bid).find(" .jsxc_bar");el.is(":animated")||el.effect("highlight",{color:"orange"},2e3)},scrollDown:function(bid){var chat=jsxc.gui.window.get(bid).find(".jsxc_textarea");0!==chat.length&&chat.slimScroll({scrollTo:chat.get(0).scrollHeight+"px"})},postMessage:function(bid,direction,msg,encrypted,forwarded,stamp){var data=jsxc.storage.getUserItem("buddy",bid),html_msg=msg;msg=jsxc.removeHTML(msg),msg=jsxc.escapeHTML(msg),"out"===direction&&data.msgstate===OTR.CONST.MSGSTATE_FINISHED&&forwarded!==!0&&(direction="sys",msg=jsxc.l.your_message_wasnt_send_please_end_your_private_conversation),"in"===direction&&data.msgstate===OTR.CONST.MSGSTATE_FINISHED&&(direction="sys",msg=jsxc.l.unencrypted_message_received+" "+msg),"out"===direction&&"from"===data.sub&&(direction="sys",msg=jsxc.l.your_message_wasnt_send_because_you_have_no_valid_subscription),encrypted=encrypted||data.msgstate===OTR.CONST.MSGSTATE_ENCRYPTED;var post=jsxc.storage.saveMessage(bid,direction,msg,encrypted,forwarded,stamp);"in"===direction&&$(document).trigger("postmessagein.jsxc",[bid,html_msg]),"out"===direction&&jsxc.master&&forwarded!==!0&&jsxc.xmpp.sendMessage(bid,html_msg,post.uid),jsxc.gui.window._postMessage(bid,post),"out"===direction&&"?"===msg&&jsxc.gui.window.postMessage(bid,"sys","42")},_postMessage:function(bid,post,restore){var win=jsxc.gui.window.get(bid),msg=post.msg,direction=post.direction,uid=post.uid;win.find(".jsxc_textinput").is(":not(:focus)")&&jsxc.restoreCompleted&&"in"===direction&&!restore&&jsxc.gui.window.highlight(bid),msg=msg.replace(jsxc.CONST.REGEX.URL,function(url){var href=url.match(/^https?:\/\//i)?url:"http://"+url;return'<a href="'+href+'" target="_blank">'+url+"</a>"}),msg=msg.replace(new RegExp("(xmpp:)?("+jsxc.CONST.REGEX.JID.source+")(\\?[^\\s]+\\b)?","i"),function(match,protocol,jid,action){return"xmpp:"===protocol?("string"==typeof action&&(jid+=action),'<a href="xmpp:'+jid+'">'+jid+"</a>"):'<a href="mailto:'+jid+'" target="_blank">'+jid+"</a>"}),$.each(jsxc.gui.emotions,function(i,val){msg=msg.replace(val[2],function(match,p1){var i,esc="";for(i=0;i<p1.length;i++)esc+="&#"+p1.charCodeAt(i)+";";return'<div title="'+esc+'" class="jsxc_emoticon jsxc_'+val[1]+'"/>'})});var msgDiv=$("<div>"),msgTsDiv=$("<div>");msgDiv.addClass("jsxc_chatmessage jsxc_"+direction),msgDiv.attr("id",uid),msgDiv.html("<div>"+msg+"</div>"),msgTsDiv.addClass("jsxc_timestamp"),msgTsDiv.html(jsxc.getFormattedTime(post.stamp)),post.received&&msgDiv.addClass("jsxc_received"),post.forwarded&&msgDiv.addClass("jsxc_forwarded"),post.encrypted&&msgDiv.addClass("jsxc_encrypted"),"sys"===direction?jsxc.gui.window.get(bid).find(".jsxc_textarea").append('<div style="clear:both"/>'):"undefined"!=typeof post.stamp&&msgDiv.append(msgTsDiv),win.find(".jsxc_textarea").append(msgDiv),jsxc.gui.detectUriScheme(win),jsxc.gui.detectEmail(win),jsxc.gui.window.scrollDown(bid),win.find(".jsxc_textinput").is(":focus")||!jsxc.restoreCompleted||restore||jsxc.gui.unreadMsg(bid)},setText:function(bid,text){jsxc.gui.window.get(bid).find(".jsxc_textinput").val(text)},restoreChat:function(bid){for(var chat=jsxc.storage.getUserItem("chat",bid);null!==chat&&chat.length>0;){var c=chat.pop();jsxc.gui.window._postMessage(bid,c,!0)}},clear:function(bid){jsxc.storage.setUserItem("chat",bid,[]),jsxc.gui.window.get(bid).find(".jsxc_textarea").empty()}},jsxc.gui.template={get:function(name,bid,msg){var ph={my_priv_fingerprint:jsxc.storage.getUserItem("priv_fingerprint")?jsxc.storage.getUserItem("priv_fingerprint").replace(/(.{8})/g,"$1 "):jsxc.l.not_available,my_jid:jsxc.storage.getItem("jid")||"",my_node:Strophe.getNodeFromJid(jsxc.storage.getItem("jid")||"")||"",root:jsxc.options.root,app_name:jsxc.options.app_name};if(bid){var data=jsxc.storage.getUserItem("buddy",bid);$.extend(ph,{bid_priv_fingerprint:data&&data.fingerprint?data.fingerprint.replace(/(.{8})/g,"$1 "):jsxc.l.not_available,bid_jid:bid,bid_name:data&&data.name?data.name:bid})}msg&&$.extend(ph,{msg:msg});var ret=jsxc.gui.template[name];return"string"==typeof ret?(ret=jsxc.translate(ret),ret=ret.replace(/\{\{([a-zA-Z0-9_\-]+)\}\}/g,function(s,key){return"string"==typeof ph[key]?ph[key]:s})):(jsxc.debug("Template not available: "+name),name)},authenticationDialog:'<h3>Verification</h3> <p>%%Authenticating_a_buddy_helps_%%</p> <div> <p style="margin:0px;">%%How_do_you_want_to_authenticate_your_buddy%%</p> <select size="1"> <option>%%Select_method%%</option> <option>%%Manual%%</option> <option>%%Question%%</option> <option>%%Secret%%</option> </select> </div> <div style="display:none"> <p class=".jsxc_explanation">%%To_verify_the_fingerprint_%%</p> <p><strong>%%Your_fingerprint%%</strong><br /> <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p> <p><strong>%%Buddy_fingerprint%%</strong><br /> <span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br /> <p class="jsxc_right"><a href="#" class="jsxc_close button">%%Close%%</a> <a href="#" class="button creation">%%Compared%%</a></p> </div> <div style="display:none"> <p class=".jsxc_explanation">%%To_authenticate_using_a_question_%%</p> <p><label for="jsxc_quest">%%Question%%:</label><input type="text" name="quest" id="jsxc_quest" /></p> <p><label for="jsxc_secret2">%%Secret%%:</label><input type="text" name="secret2" id="jsxc_secret2" /></p> <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Ask%%</a></p> </div> <div style="display:none"> <p class=".jsxc_explanation">%%To_authenticate_pick_a_secret_%%</p> <p><label for="jsxc_secret">%%Secret%%:</label><input type="text" name="secret" id="jsxc_secret" /></p> <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Compare%%</a></p> </div>',fingerprintsDialog:'<div> <p class="jsxc_maxWidth">%%A_fingerprint_%%</p> <p><strong>%%Your_fingerprint%%</strong><br /> <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p> <p><strong>%%Buddy_fingerprint%%</strong><br /> <span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br /> <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a></p> </div>',chatWindow:'<li class="jsxc_min jsxc_windowItem"> <div class="jsxc_window"> <div class="jsxc_bar"> <div class="jsxc_avatar">☺</div> <div class="jsxc_tools"> <div class="jsxc_settings"> <ul> <li class="jsxc_fingerprints jsxc_otr jsxc_disabled">%%Fingerprints%%</li> <li class="jsxc_verification">%%Authentication%%</li> <li class="jsxc_transfer jsxc_otr jsxc_disabled">%%start_private%%</li> <li class="jsxc_clear">%%clear_history%%</li> </ul> </div> <div class="jsxc_transfer jsxc_otr jsxc_disabled"/> <div class="jsxc_close">×</div> </div> <div class="jsxc_name"/> <div class="jsxc_cycle"/> </div> <div class="jsxc_fade"> <div class="jsxc_gradient"/> <div class="jsxc_textarea"/> <div class="jsxc_emoticons"><ul/></div> <input type="text" class="jsxc_textinput" placeholder="...%%Message%%" /> </div> </div> </li>',roster:'<div id="jsxc_roster"> <ul id="jsxc_buddylist"></ul> <div class="jsxc_bottom jsxc_presence" data-bid="own"> <div id="jsxc_avatar"> <div class="jsxc_avatar">☺</div> </div> <div id="jsxc_menu"> <span></span> <ul> <li class="jsxc_settings">%%Settings%%</li> <li class="jsxc_muteNotification">%%Mute%%</li> <li class="jsxc_addBuddy">%%Add_buddy%%</li> <li class="jsxc_hideOffline">%%Hide offline%%</li> <li class="jsxc_onlineHelp">%%Online help%%</li> <li class="jsxc_about">%%About%%</li> </ul> </div> <div id="jsxc_notice"> <span></span> <ul></ul> </div> <div id="jsxc_presence"> <span>%%Online%%</span> <ul> <li data-pres="online" class="jsxc_online">%%Online%%</li> <li data-pres="chat" class="jsxc_chat">%%Chatty%%</li> <li data-pres="away" class="jsxc_away">%%Away%%</li> <li data-pres="xa" class="jsxc_xa">%%Extended away%%</li> <li data-pres="dnd" class="jsxc_dnd">%%dnd%%</li> <!-- <li data-pres="offline" class="jsxc_offline">%%Offline%%</li> --> </ul> </div> </div> <div id="jsxc_toggleRoster"></div> </div>',windowList:'<div id="jsxc_windowList"> <ul></ul> </div> <div id="jsxc_windowListSB"> <div class="jsxc_scrollLeft jsxc_disabled">&lt;</div> <div class="jsxc_scrollRight jsxc_disabled">&gt;</div> </div>',rosterBuddy:'<li> <div class="jsxc_avatar">☺</div> <div class="jsxc_control"></div> <div class="jsxc_name"/> <div class="jsxc_options jsxc_right"> <div class="jsxc_rename" title="%%rename_buddy%%">✎</div> <div class="jsxc_delete" title="%%delete_buddy%%">✘</div> </div> <div class="jsxc_options jsxc_left"> <div class="jsxc_chaticon" title="%%send_message%%"/> <div class="jsxc_vcardicon" title="%%get_info%%">i</div> </div> </li>',loginBox:'<h3>%%Login%%</h3> <form> <p><label for="jsxc_username">%%Username%%:</label> <input type="text" name="username" id="jsxc_username" required="required" value="{{my_node}}"/></p> <p><label for="jsxc_password">%%Password%%:</label> <input type="password" name="password" required="required" id="jsxc_password" /></p> <div class="bottom_submit_section"> <input type="reset" class="button jsxc_close" name="clear" value="%%Cancel%%"/> <input type="submit" class="button creation" name="commit" value="%%Connect%%"/> </div> </form>',contactDialog:'<h3>%%Add_buddy%%</h3> <p class=".jsxc_explanation">%%Type_in_the_full_username_%%</p> <form> <p><label for="jsxc_username">* %%Username%%:</label> <input type="text" name="username" id="jsxc_username" pattern="^[^\\x22&\'\\/:<>@\\s]+(@[.\\-_\\w]+)?" required="required" /></p> <p><label for="jsxc_alias">%%Alias%%:</label> <input type="text" name="alias" id="jsxc_alias" /></p> <p class="jsxc_right"> <input class="button" type="submit" value="%%Add%%" /> </p> <form>',approveDialog:'<h3>%%Subscription_request%%</h3> <p>%%You_have_a_request_from%% <b class="jsxc_their_jid"></b>.</p> <p class="jsxc_right"><a href="#" class="button jsxc_deny">%%Deny%%</a> <a href="#" class="button creation jsxc_approve">%%Approve%%</a></p>',removeDialog:'<h3>%%Remove buddy%%</h3> <p class="jsxc_maxWidth">%%You_are_about_to_remove_%%</p> <p class="jsxc_right"><a href="#" class="button jsxc_cancel jsxc_close">%%Cancel%%</a> <a href="#" class="button creation">%%Remove%%</a></p>',waitAlert:'<h3>{{msg}}</h3> <p>%%Please_wait%%</p> <p class="jsxc_center"><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /></p>',alert:'<h3>%%Alert%%</h3> <p>{{msg}}</p> <p class="jsxc_right"><a href="#" class="button jsxc_close jsxc_cancel">%%Ok%%</a></p>',authFailDialog:'<h3>%%Login_failed%%</h3> <p>%%Sorry_we_cant_authentikate_%%</p> <p class="jsxc_right"> <a class="button jsxc_cancel">%%Continue_without_chat%%</a> <a class="button creation">%%Retry%%</a> </p>',confirmDialog:'<p>{{msg}}</p> <p class="jsxc_right"> <a class="button jsxc_cancel jsxc_close">%%Dismiss%%</a> <a class="button creation">%%Confirm%%</a> </p>',pleaseAccept:"<p>%%Please_accept_%%</p>",aboutDialog:"<h3>JavaScript XMPP Chat</h3> <p><b>Version: </b>"+jsxc.version+'<br /> <a href="http://jsxc.org/" target="_blank">www.jsxc.org</a><br /> <br /> <i>Released under the MIT license</i><br /> <br /> Real-time chat app for {{app_name}} and more.<br /> Requires an external <a href="https://xmpp.org/xmpp-software/servers/" target="_blank">XMPP server</a>.<br /> <br /> <b>Credits: </b> <a href="http://www.beepzoid.com/old-phones/" target="_blank">David English (Ringtone)</a>, <a href="https://soundcloud.com/freefilmandgamemusic/ping-1?in=freefilmandgamemusic/sets/free-notification-sounds-and" target="_blank">CameronMusic (Ping)</a></p> <p class="jsxc_right"><a class="button jsxc_debuglog" href="#">Show debug log</a></p>',vCard:'<h3>%%Info_about%% {{bid_name}}</h3> <ul class="jsxc_vCard"></ul> <p><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /> %%Please_wait%%...</p>',settings:'<h3>%%User_settings%%</h3> <p></p> <form> <fieldset class="jsxc_fieldsetXmpp jsxc_fieldset"> <legend>%%Login options%%</legend> <label for="xmpp-url">%%BOSH url%%</label><input type="text" id="xmpp-url" readonly="readonly"/><br /> <label for="xmpp-username">%%Username%%</label><input type="text" id="xmpp-username"/><br /> <label for="xmpp-domain">%%Domain%%</label><input type="text" id="xmpp-domain"/><br /> <label for="xmpp-resource">%%Resource%%</label><input type="text" id="xmpp-resource"/><br /> <label for="xmpp-onlogin">%%On login%%</label><input type="checkbox" id="xmpp-onlogin" /><br /> <input type="submit" value="%%Save%%"/> </fieldset> </form> <p></p> <form> <fieldset class="jsxc_fieldsetPriority jsxc_fieldset"> <legend>%%Priority%%</legend> <label for="priority-online">%%Online%%</label><input type="number" value="0" id="priority-online" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-chat">%%Chatty%%</label><input type="number" value="0" id="priority-chat" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-away">%%Away%%</label><input type="number" value="0" id="priority-away" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-xa">%%Extended_away%%</label><input type="number" value="0" id="priority-xa" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-dnd">%%dnd%%</label><input type="number" value="0" id="priority-dnd" min="-128" max="127" step="1" required="required"/><br /> <input type="submit" value="%%Save%%"/> </fieldset> </form> <p></p> <form data-onsubmit="xmpp.carbons.refresh"> <fieldset class="jsxc_fieldsetCarbons jsxc_fieldset"> <legend>%%Carbon copy%%</legend> <label for="carbons-enable">%%Enable%%</label><input type="checkbox" id="carbons-enable" /><br /> <input type="submit" value="%%Save%%"/> </fieldset> </form>'},jsxc.xmpp={conn:null,login:function(){if(!jsxc.xmpp.conn||!jsxc.xmpp.conn.connected){var jid=null,password=null,sid=null,rid=null;switch(arguments.length){case 2:jid=arguments[0],password=arguments[1];break;case 3:jid=arguments[0],sid=arguments[1],rid=arguments[2];break;default:jid=jsxc.storage.getItem("jid"),sid=jsxc.storage.getItem("sid"),rid=jsxc.storage.getItem("rid")}var url=jsxc.options.get("xmpp").url;$(document).on("connected.jsxc",jsxc.xmpp.connected),$(document).on("attached.jsxc",jsxc.xmpp.attached),$(document).on("disconnected.jsxc",jsxc.xmpp.disconnected),$(document).on("ridChange",jsxc.xmpp.onRidChange),$(document).on("connfail.jsxc",jsxc.xmpp.onConnfail),$(document).on("authfail.jsxc",jsxc.xmpp.onAuthFail),Strophe.addNamespace("RECEIPTS","urn:xmpp:receipts"),jsxc.xmpp.conn=new Strophe.Connection(url);var stropheGetUniqueId=jsxc.xmpp.conn.getUniqueId;jsxc.xmpp.conn.getUniqueId=function(suffix){var uid=stropheGetUniqueId.call(jsxc.xmpp.conn,suffix);return jsxc.storage.setItem("_uniqueId",jsxc.xmpp.conn._uniqueId),uid},jsxc.storage.getItem("debug")===!0&&(jsxc.xmpp.conn.xmlInput=function(data){console.log("<",data)},jsxc.xmpp.conn.xmlOutput=function(data){console.log(">",data)});var callback=function(status,condition){switch(jsxc.debug(Object.getOwnPropertyNames(Strophe.Status)[status]+": "+condition),status){case Strophe.Status.CONNECTED:jsxc.bid=jsxc.jidToBid(jsxc.xmpp.conn.jid.toLowerCase()),$(document).trigger("connected.jsxc");break;case Strophe.Status.ATTACHED:$(document).trigger("attached.jsxc");break;case Strophe.Status.DISCONNECTED:$(document).trigger("disconnected.jsxc");break;case Strophe.Status.CONNFAIL:$(document).trigger("connfail.jsxc");break;case Strophe.Status.AUTHFAIL:$(document).trigger("authfail.jsxc")}};jsxc.xmpp.conn.caps&&(jsxc.xmpp.conn.caps.node="http://jsxc.org/"),jsxc.restore&&sid&&rid?(jsxc.debug("Try to attach"),jsxc.debug("SID: "+sid),jsxc.xmpp.conn.attach(jid,sid,rid,callback)):(jsxc.debug("New connection"),jsxc.xmpp.conn.caps&&jsxc.xmpp.conn._addSysHandler(function(stanza){var from=jsxc.xmpp.conn.domain,c=stanza.querySelector("c"),ver=c.getAttribute("ver"),node=c.getAttribute("node"),_jidNodeIndex=JSON.parse(localStorage.getItem("strophe.caps._jidNodeIndex"))||{};jsxc.xmpp.conn.caps._jidVerIndex[from]=ver,_jidNodeIndex[from]=node,localStorage.setItem("strophe.caps._jidVerIndex",JSON.stringify(jsxc.xmpp.conn.caps._jidVerIndex)),localStorage.setItem("strophe.caps._jidNodeIndex",JSON.stringify(_jidNodeIndex))},Strophe.NS.CAPS),jsxc.xmpp.conn.connect(jid||jsxc.options.xmpp.jid,password||jsxc.options.xmpp.password,callback))}},logout:function(){if(jsxc.storage.removeItem("sid"),jsxc.storage.removeUserItem("buddylist"),jsxc.storage.removeUserItem("windowlist"),jsxc.storage.removeItem("_uniqueId"),!jsxc.master)return $("#jsxc_roster").remove(),$("#jsxc_windowlist").remove(),!0;if(null===jsxc.xmpp.conn)return!0;$("body").click(),jsxc.triggeredFromElement=!0,$.each(jsxc.storage.getUserItem("otrlist")||{},function(i,val){jsxc.otr.create(val)});var numOtr=Object.keys(jsxc.otr.objects||{}).length+1,disReady=function(){--numOtr<=0&&(jsxc.xmpp.conn.flush(),setTimeout(function(){jsxc.xmpp.conn.disconnect()},600))};return $.each(jsxc.otr.objects||{},function(key,obj){obj.msgstate===OTR.CONST.MSGSTATE_ENCRYPTED?obj.endOtr.call(obj,function(){obj.init.call(obj),jsxc.otr.backup(key),disReady()}):disReady()}),disReady(),!1},connected:function(){jsxc.xmpp.conn.pause();var nomJid=Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid).toLowerCase()+"/"+Strophe.getResourceFromJid(jsxc.xmpp.conn.jid);if(jsxc.storage.setItem("sid",jsxc.xmpp.conn._proto.sid),jsxc.storage.setItem("jid",nomJid),jsxc.storage.setItem("lastActivity",(new Date).getTime()),jsxc.storage.removeUserItem("buddylist"),jsxc.storage.removeUserItem("windowlist"),jsxc.storage.removeUserItem("own"),jsxc.storage.removeUserItem("avatar","own"),jsxc.storage.removeUserItem("otrlist"),jsxc.options.loginForm.triggered)switch(jsxc.options.loginForm.onConnected||"submit"){case"submit":jsxc.submitLoginForm();case!1:return void jsxc.xmpp.connectionReady()}jsxc.gui.init(),$("#jsxc_roster").removeClass("jsxc_noConnection"),jsxc.onMaster(),jsxc.xmpp.conn.resume(),jsxc.gui.dialog.close(),$(document).trigger("attached.jsxc")},attached:function(){jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged,"jabber:iq:roster","iq","set"),jsxc.xmpp.conn.addHandler(jsxc.xmpp.onMessage,null,"message","chat"),jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived,null,"message"),jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence,null,"presence");var caps=jsxc.xmpp.conn.caps,domain=jsxc.xmpp.conn.domain;if(caps&&jsxc.options.get("carbons").enable){var conditionalEnable=function(){jsxc.xmpp.conn.caps.hasFeatureByJid(domain,jsxc.CONST.NS.CARBONS)&&jsxc.xmpp.carbons.enable()};if("undefined"==typeof caps._knownCapabilities[caps._jidVerIndex[domain]]){var _jidNodeIndex=JSON.parse(localStorage.getItem("strophe.caps._jidNodeIndex"))||{};$(document).on("caps.strophe",function onCaps(ev,from){from===domain&&(conditionalEnable(),$(document).off("caps.strophe",onCaps))}),caps._requestCapabilities(jsxc.xmpp.conn.domain,_jidNodeIndex[domain],caps._jidVerIndex[domain])}else conditionalEnable()}if(jsxc.restore&&jsxc.storage.getUserItem("buddylist"))jsxc.xmpp.sendPres();else{$(document).one("cloaded.roster.jsxc",jsxc.xmpp.sendPres),$("#jsxc_roster > p:first").remove();var iq=$iq({type:"get"}).c("query",{xmlns:"jabber:iq:roster"});jsxc.xmpp.conn.sendIQ(iq,jsxc.xmpp.onRoster)}jsxc.xmpp.connectionReady()},connectionReady:function(){jsxc.xmpp.conn._uniqueId=jsxc.storage.getItem("_uniqueId")||(new Date).getTime(),$(document).trigger("connectionReady.jsxc")},sendPres:function(){jsxc.xmpp.conn.disco&&(jsxc.xmpp.conn.disco.addIdentity("client","web","JSXC"),jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO),jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS));var pres=$pres();jsxc.xmpp.conn.caps&&pres.c("c",jsxc.xmpp.conn.caps.generateCapsAttrs()).up();var presState=jsxc.storage.getUserItem("presence")||"online";"online"!==presState&&pres.c("show").t(presState).up();var priority=jsxc.options.get("priority");priority&&"undefined"!=typeof priority[presState]&&0!==parseInt(priority[presState])&&pres.c("priority").t(priority[presState]).up(),jsxc.debug("Send presence",pres.toString()),jsxc.xmpp.conn.send(pres)},disconnected:function(){jsxc.debug("disconnected"),jsxc.storage.removeItem("sid"),jsxc.storage.removeItem("rid"),jsxc.storage.removeItem("lastActivity"),jsxc.storage.removeItem("hidden"),jsxc.storage.removeUserItem("avatar","own"),jsxc.storage.removeUserItem("otrlist"),$(document).off("connected.jsxc",jsxc.xmpp.connected),$(document).off("attached.jsxc",jsxc.xmpp.attached),$(document).off("disconnected.jsxc",jsxc.xmpp.disconnected),$(document).off("ridChange",jsxc.xmpp.onRidChange),$(document).off("connfail.jsxc",jsxc.xmpp.onConnfail),$(document).off("authfail.jsxc",jsxc.xmpp.onAuthFail),jsxc.xmpp.conn=null,$("#jsxc_windowList").remove(),jsxc.triggeredFromElement?($("#jsxc_roster").remove(),jsxc.triggeredFromLogout&&(window.location=jsxc.options.logoutElement.attr("href"))):jsxc.gui.roster.noConnection(),window.clearInterval(jsxc.keepalive)},onConnfail:function(ev,condition){jsxc.debug("XMPP connection failed: "+condition),jsxc.options.loginForm.triggered&&jsxc.submitLoginForm()
-},onAuthFail:function(){if(jsxc.options.loginForm.triggered)switch(jsxc.options.loginForm.onAuthFail||"ask"){case"ask":jsxc.gui.showAuthFail();break;case"submit":jsxc.submitLoginForm()}},onRoster:function(iq){jsxc.debug("Load roster",iq);var buddies=[];$(iq).find("item").each(function(){var jid=$(this).attr("jid"),name=$(this).attr("name")||jid,bid=jsxc.jidToBid(jid),sub=$(this).attr("subscription");buddies.push(bid),jsxc.storage.removeUserItem("res",bid),jsxc.storage.saveBuddy(bid,{jid:jid,name:name,status:0,sub:sub,res:[]}),jsxc.gui.roster.add(bid)}),0===buddies.length&&jsxc.gui.roster.empty(),jsxc.storage.setUserItem("buddylist",buddies),jsxc.debug("Roster loaded"),$(document).trigger("cloaded.roster.jsxc")},onRosterChanged:function(iq){return jsxc.debug("onRosterChanged",iq),$(iq).find("item").each(function(){var jid=$(this).attr("jid"),name=$(this).attr("name")||jid,bid=jsxc.jidToBid(jid),sub=$(this).attr("subscription");if("remove"===sub)jsxc.gui.roster.purge(bid);else{var bl=jsxc.storage.getUserItem("buddylist");bl.indexOf(bid)<0&&(bl.push(bid),jsxc.storage.setUserItem("buddylist",bl));var temp=jsxc.storage.saveBuddy(bid,{jid:jid,name:name,sub:sub});"updated"===temp?(jsxc.gui.update(bid),jsxc.gui.roster.reorder(bid)):jsxc.gui.roster.add(bid)}if("from"===sub||"both"===sub){var notice,notices=jsxc.storage.getUserItem("notices"),noticeKey=null;for(noticeKey in notices)notice=notices[noticeKey],"gui.showApproveDialog"===notice.fnName&&notice.fnParams[0]===jid&&(jsxc.debug("Remove notice with key "+noticeKey),jsxc.notice.remove(noticeKey))}}),jsxc.storage.getUserItem("buddylist")&&0!==jsxc.storage.getUserItem("buddylist").length?$("#jsxc_roster > p:first").remove():jsxc.gui.roster.empty(),!0},onPresence:function(presence){jsxc.debug("onPresence",presence);var ptype=$(presence).attr("type"),from=$(presence).attr("from"),jid=Strophe.getBareJidFromJid(from).toLowerCase(),r=Strophe.getResourceFromJid(from),bid=jsxc.jidToBid(jid),data=jsxc.storage.getUserItem("buddy",bid),res=jsxc.storage.getUserItem("res",bid)||{},status=null,xVCard=$(presence).find('x[xmlns="vcard-temp:x:update"]');if(jid===Strophe.getBareJidFromJid(jsxc.storage.getItem("jid")))return!0;if("error"===ptype)return jsxc.error("[XMPP] "+$(presence).attr("code")),!0;if("subscribe"===ptype)return jsxc.storage.setUserItem("friendReq",{jid:jid,approve:-1}),jsxc.notice.add("%%Friendship request%%","%%from%% "+jid,"gui.showApproveDialog",[jid]),!0;if("unavailable"===ptype||"unsubscribed"===ptype)status=jsxc.CONST.STATUS.indexOf("offline");else{var show=$(presence).find("show").text();status=jsxc.CONST.STATUS.indexOf(""===show?"online":show)}0===status?delete res[r]:res[r]=status;var maxVal=[],max=0,prop=null;for(prop in res)res.hasOwnProperty(prop)&&max<=res[prop]&&(max!==res[prop]&&(maxVal=[],max=res[prop]),maxVal.push(prop));if(0===data.status&&max>0&&jsxc.notification.notify(data.name,jsxc.translate("%%has come online%%.")),data.status=max,data.res=maxVal,data.jid=jid,xVCard.length>0){var photo=xVCard.find("photo");photo.length>0&&photo.text()!==data.avatar&&(jsxc.storage.removeUserItem("avatar",data.avatar),data.avatar=photo.text())}return jsxc.gui.window.get(bid).length>0&&jsxc.gui.window.get(bid).data("jid",jid),jsxc.storage.setUserItem("buddy",bid,data),jsxc.storage.setUserItem("res",bid,res),jsxc.debug("Presence ("+from+"): "+status),jsxc.gui.update(bid),jsxc.gui.roster.reorder(bid),$(document).trigger("presence.jsxc",[from,status,presence]),!0},onMessage:function(stanza){var message,carbon,forwarded=$(stanza).find('forwarded[xmlns="'+jsxc.CONST.NS.FORWARD+'"]');forwarded.length>0?(message=forwarded.find("> message"),forwarded=!0,carbon=$(stanza).find('> [xmlns="'+jsxc.CONST.NS.CARBONS+'"]'),0===carbon.length&&(carbon=!1),jsxc.debug("Incoming forwarded message",message)):(message=stanza,forwarded=!1,carbon=!1,jsxc.debug("Incoming message",message));var body=$(message).find("body:first").text();if(!body||body.match(/\?OTR/i)&&forwarded)return!0;var bid,type=$(message).attr("type"),from=$(message).attr("from"),mid=$(message).attr("id"),delay=$(message).find('delay[xmlns="urn:xmpp:delay"]'),stamp=delay.length>0?new Date(delay.attr("stamp")):new Date;if(stamp=stamp.getTime(),carbon){var direction="sent"===carbon.prop("tagName")?"out":"in";return bid=jsxc.jidToBid("out"===direction?$(message).attr("to"):from),jsxc.gui.window.postMessage(bid,direction,body,!1,forwarded,stamp),!0}forwarded&&(body=from+jsxc.translate(" %%to%% ")+$(stanza).attr("to")+'"'+body+'"',from=$(stanza).attr("from"));var jid=Strophe.getBareJidFromJid(from);bid=jsxc.jidToBid(jid);var data=jsxc.storage.getUserItem("buddy",bid),request=$(message).find("request[xmlns='urn:xmpp:receipts']");if(null===data){var chat=jsxc.storage.getUserItem("chat",bid)||[];0===chat.length&&jsxc.notice.add("%%Unknown sender%%","%%You received a message from an unknown sender%% ("+bid+").","gui.showUnknownSender",[bid]);var msg=jsxc.removeHTML(body);return msg=jsxc.escapeHTML(msg),jsxc.storage.saveMessage(bid,"in",msg,!1,forwarded,stamp),!0}var win=jsxc.gui.window.init(bid);return"chat"===type&&(win.data("jid",from),jsxc.storage.updateUserItem("buddy",bid,{jid:from})),$(document).trigger("message.jsxc",[from,body]),jsxc.master&&!jsxc.otr.objects[bid]&&jsxc.otr.create(bid),forwarded||null===mid||!request.length||null===data||"both"!==data.sub&&"from"!==data.sub||"chat"!==type||jsxc.xmpp.conn.send($msg({to:from}).c("received",{xmlns:"urn:xmpp:receipts",id:mid})),jsxc.otr.objects.hasOwnProperty(bid)?jsxc.otr.objects[bid].receiveMsg(body,{stamp:stamp,forwarded:forwarded}):jsxc.gui.window.postMessage(bid,"in",body,!1,forwarded,stamp),!0},onRidChange:function(ev,data){jsxc.storage.setItem("rid",data.rid)},resFriendReq:function(from,approve){jsxc.master?(jsxc.xmpp.conn.send($pres({to:from,type:approve?"subscribed":"unsubscribed"})),jsxc.storage.removeUserItem("friendReq"),jsxc.gui.dialog.close()):jsxc.storage.updateUserItem("friendReq","approve",approve)},addBuddy:function(username,alias){var bid=jsxc.jidToBid(username);if(jsxc.master){var iq=$iq({type:"set"}).c("query",{xmlns:"jabber:iq:roster"}).c("item",{jid:username,name:alias||""});jsxc.xmpp.conn.sendIQ(iq),jsxc.xmpp.conn.send($pres({to:username,type:"subscribe"})),jsxc.storage.removeUserItem("add_"+bid)}else jsxc.storage.setUserItem("add_"+bid,{username:username,alias:alias||null})},removeBuddy:function(jid){var bid=jsxc.jidToBid(jid),iq=$iq({type:"set"}).c("query",{xmlns:"jabber:iq:roster"}).c("item",{jid:Strophe.getBareJidFromJid(jid),subscription:"remove"});jsxc.xmpp.conn.sendIQ(iq),jsxc.gui.roster.purge(bid)},onReceived:function(message){var from=$(message).attr("from"),jid=Strophe.getBareJidFromJid(from),bid=jsxc.jidToBid(jid),received=$(message).find("received[xmlns='urn:xmpp:receipts']");if(received.length){var i,receivedId=received.attr("id").replace(/:/,"-"),chat=jsxc.storage.getUserItem("chat",bid);for(i=chat.length-1;i>=0;i--)if(chat[i].uid===receivedId){chat[i].received=!0,$("#"+receivedId).addClass("jsxc_received"),jsxc.storage.setUserItem("chat",bid,chat);break}}return!0},sendMessage:function(bid,msg,uid){jsxc.otr.objects.hasOwnProperty(bid)?jsxc.otr.objects[bid].sendMsg(msg,uid):jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data("jid"),msg,uid)},_sendMessage:function(jid,msg,uid){var data=jsxc.storage.getUserItem("buddy",jsxc.jidToBid(jid))||{},isBar=Strophe.getBareJidFromJid(jid)===jid,type=data.type||"chat",xmlMsg=$msg({to:jid,type:type,id:uid}).c("body").t(msg);jsxc.xmpp.carbons.enabled&&msg.match(/^\?OTR/)&&xmlMsg.up().c("private",{xmlns:jsxc.CONST.NS.CARBONS}),"chat"===type&&(isBar||jsxc.xmpp.conn.caps.hasFeatureByJid(jid,Strophe.NS.RECEIPTS))&&xmlMsg.up().c("request",{xmlns:"urn:xmpp:receipts"}),jsxc.xmpp.conn.send(xmlMsg)},loadVcard:function(bid,cb,error_cb){jsxc.master?jsxc.xmpp.conn.vcard.get(cb,bid,error_cb):(jsxc.storage.setUserItem("vcard",bid,"request:"+(new Date).getTime()),$(document).one("loaded.vcard.jsxc",function(ev,result){result&&"success"===result.state?cb($(result.data).get(0)):error_cb()}))},getCapabilitiesByJid:function(jid){if(jsxc.xmpp.conn)return jsxc.xmpp.conn.caps.getCapabilitiesByJid(jid);var jidVerIndex=JSON.parse(localStorage.getItem("strophe.caps._jidVerIndex"))||{},knownCapabilities=JSON.parse(localStorage.getItem("strophe.caps._knownCapabilities"))||{};return jidVerIndex[jid]?knownCapabilities[jidVerIndex[jid]]:null}},jsxc.xmpp.carbons={enabled:!1,enable:function(cb){var iq=$iq({type:"set"}).c("enable",{xmlns:jsxc.CONST.NS.CARBONS});jsxc.xmpp.conn.sendIQ(iq,function(){jsxc.xmpp.carbons.enabled=!0,jsxc.debug("Carbons enabled"),cb&&cb.call(this)},function(stanza){jsxc.warn("Could not enable carbons",stanza)})},disable:function(cb){var iq=$iq({type:"set"}).c("disable",{xmlns:jsxc.CONST.NS.CARBONS});jsxc.xmpp.conn.sendIQ(iq,function(){jsxc.xmpp.carbons.enabled=!1,jsxc.debug("Carbons disabled"),cb&&cb.call(this)},function(stanza){jsxc.warn("Could not disable carbons",stanza)})},refresh:function(err){return err!==!1?jsxc.options.get("carbons").enable?jsxc.xmpp.carbons.enable():jsxc.xmpp.carbons.disable():void 0}},jsxc.storage={PREFIX:"jsxc",SEP:":",getPrefix:function(uk){var self=jsxc.storage;return self.PREFIX+self.SEP+(uk&&jsxc.bid?jsxc.bid+self.SEP:"")},setItem:function(key,value,uk){jsxc.storageNotConform>0&&"rid"!==key&&"lastActivity"!==key&&(jsxc.storageNotConform>1&&null===jsxc.toSNC&&(jsxc.toSNC=window.setTimeout(function(){jsxc.storageNotConform=0,jsxc.storage.setItem("storageNotConform",0)},1e3)),jsxc.ls.push(JSON.stringify({key:key,value:value}))),"object"==typeof value&&(value=JSON.stringify(value)),localStorage.setItem(jsxc.storage.getPrefix(uk)+key,value)},setUserItem:function(type,key,value){var self=jsxc.storage;return 2===arguments.length?(value=key,key=type,type=""):3===arguments.length&&(key=type+self.SEP+key),jsxc.storage.setItem(key,value,!0)},getItem:function(key,uk){key=jsxc.storage.getPrefix(uk)+key;var value=localStorage.getItem(key);try{return JSON.parse(value)}catch(e){return value}},getUserItem:function(type,key){var self=jsxc.storage;return 1===arguments.length?key=type:2===arguments.length&&(key=type+self.SEP+key),jsxc.storage.getItem(key,!0)},removeItem:function(key,uk){jsxc.storageNotConform&&"rid"!==key&&"lastActivity"!==key&&jsxc.ls.push(JSON.stringify({key:jsxc.storage.prefix+key,value:""})),localStorage.removeItem(jsxc.storage.getPrefix(uk)+key)},removeUserItem:function(type,key){var self=jsxc.storage;1===arguments.length?key=type:2===arguments.length&&(key=type+self.SEP+key),jsxc.storage.removeItem(key,!0)},updateItem:function(key,variable,value,uk){var data=jsxc.storage.getItem(key,uk)||{};"object"==typeof variable?$.each(variable,function(key,val){"undefined"==typeof data[key]&&jsxc.debug("Variable "+key+" doesn't exist in "+variable+". It was created."),data[key]=val}):("undefined"==typeof data[variable]&&jsxc.debug("Variable "+variable+" doesn't exist. It was created."),data[variable]=value),jsxc.storage.setItem(key,data,uk)},updateUserItem:function(type,key,variable,value){var self=jsxc.storage;return 4===arguments.length||3===arguments.length&&"object"==typeof variable?key=type+self.SEP+key:(value=variable,variable=key,key=type),jsxc.storage.updateItem(key,variable,value,!0)},ink:function(key,uk){jsxc.storage.setItem(key,Number(jsxc.storage.getItem(key,uk))+1,uk)},removeElement:function(key,name,uk){var item=jsxc.storage.getItem(key,uk);$.isArray(item)?item=$.grep(item,function(e){return e!==name}):"object"==typeof item&&delete item[name],jsxc.storage.setItem(key,item,uk)},removeUserElement:function(type,key,name){var self=jsxc.storage;return 2===arguments.length?(name=key,key=type):3===arguments.length&&(key=type+self.SEP+key),jsxc.storage.removeElement(key,name,!0)},onStorage:function(e){if(e.key!==jsxc.storage.PREFIX+jsxc.storage.SEP+"rid"&&e.key!==jsxc.storage.PREFIX+jsxc.storage.SEP+"lastActivity"){var re=new RegExp("^"+jsxc.storage.PREFIX+jsxc.storage.SEP+"(?:[^"+jsxc.storage.SEP+"]+@[^"+jsxc.storage.SEP+"]+"+jsxc.storage.SEP+")?(.*)","i"),key=e.key.replace(re,"$1");if(jsxc.storageNotConform>0&&jsxc.ls.length>0){var val=e.newValue;try{val=JSON.parse(val)}catch(err){}var index=$.inArray(JSON.stringify({key:key,value:val}),jsxc.ls);if(index>=0)return jsxc.storageNotConform>1&&(window.clearTimeout(jsxc.toSNC),jsxc.storageNotConform=1,jsxc.storage.setItem("storageNotConform",1)),void jsxc.ls.splice(index,1)}if(e.oldValue!==e.newValue){var n,o,bid=key.replace(new RegExp("[^"+jsxc.storage.SEP+"]+"+jsxc.storage.SEP+"(.*)","i"),"$1");if(jsxc.master&&"alive"===key)return jsxc.debug("Master request."),void jsxc.storage.ink("alive");if(!(jsxc.master||"alive"!==key&&"alive_busy"!==key||jsxc.triggeredFromElement))return window.clearTimeout(jsxc.to),jsxc.to=window.setTimeout(jsxc.checkMaster,("alive"===key?jsxc.options.timeout:jsxc.options.busyTimeout)+jsxc.random(60)),void(jsxc.role_allocation||jsxc.onSlave());if(key.match(/^notices/)&&jsxc.notice.load(),key.match(/^presence/)&&jsxc.gui.changePresence(e.newValue,!0),key.match(/^options/)&&e.newValue&&(n=JSON.parse(e.newValue),"undefined"!=typeof n.muteNotification&&n.muteNotification?jsxc.notification.muteSound(!0):jsxc.notification.unmuteSound(!0)),key.match(/^hidden/)&&(jsxc.master?clearTimeout(jsxc.toNotification):jsxc.isHidden()),key.match(new RegExp("^chat"+jsxc.storage.SEP)))for(var data,el,posts=JSON.parse(e.newValue);posts.length>0;)data=posts.pop(),el=$("#"+data.uid),0===el.length?(jsxc.master&&"out"===data.direction&&jsxc.xmpp.sendMessage(bid,data.msg,data.uid),jsxc.gui.window._postMessage(bid,data)):data.received&&el.addClass("jsxc_received");else{if(key.match(new RegExp("^window"+jsxc.storage.SEP)))return e.newValue?e.oldValue?(n=JSON.parse(e.newValue),n.minimize?jsxc.gui.window._hide(bid):jsxc.gui.window._show(bid),void jsxc.gui.window.setText(bid,n.text)):void jsxc.gui.window.open(bid):void jsxc.gui.window._close(bid);if(key.match(new RegExp("^smp"+jsxc.storage.SEP))){if(!e.newValue)return jsxc.gui.dialog.close(),void(jsxc.master&&jsxc.otr.objects[bid].sm.abort());n=JSON.parse(e.newValue),"undefined"!=typeof n.data?jsxc.otr.onSmpQuestion(bid,n.data):jsxc.master&&n.sec&&(jsxc.gui.dialog.close(),jsxc.otr.sendSmpReq(bid,n.sec,n.quest))}if(!jsxc.master&&key.match(new RegExp("^buddy"+jsxc.storage.SEP))){if(!e.newValue)return void jsxc.gui.roster.purge(bid);if(!e.oldValue)return void jsxc.gui.roster.add(bid);n=JSON.parse(e.newValue),o=JSON.parse(e.oldValue),jsxc.gui.update(bid),(o.status!==n.status||o.sub!==n.sub)&&jsxc.gui.roster.reorder(bid)}if(jsxc.master&&key.match(new RegExp("^deletebuddy"+jsxc.storage.SEP))&&e.newValue&&(n=JSON.parse(e.newValue),jsxc.xmpp.removeBuddy(n.jid),jsxc.storage.removeUserItem(key)),jsxc.master&&key.match(new RegExp("^buddy"+jsxc.storage.SEP))&&(n=JSON.parse(e.newValue),o=JSON.parse(e.oldValue),o.transferReq!==n.transferReq&&(jsxc.storage.updateUserItem("buddy",bid,"transferReq",-1),0===n.transferReq&&jsxc.otr.goPlain(bid),1===n.transferReq&&jsxc.otr.goEncrypt(bid)),o.name!==n.name&&jsxc.gui.roster._rename(bid,n.name)),"sid"===key)return void(e.newValue||jsxc.xmpp.logout());"friendReq"===key&&(n=JSON.parse(e.newValue),jsxc.master&&n.approve>=0&&jsxc.xmpp.resFriendReq(n.jid,n.approve)),jsxc.master&&key.match(new RegExp("^add"+jsxc.storage.SEP))&&(n=JSON.parse(e.newValue),jsxc.xmpp.addBuddy(n.username,n.alias)),"roster"===key&&jsxc.gui.roster.toggle(),jsxc.master&&key.match(new RegExp("^vcard"+jsxc.storage.SEP))&&null!==e.newValue&&e.newValue.match(/^request:/)&&jsxc.xmpp.loadVcard(bid,function(stanza){jsxc.storage.setUserItem("vcard",bid,{state:"success",data:$("<div>").append(stanza).html()})},function(){jsxc.storage.setUserItem("vcard",bid,{state:"error"})}),jsxc.master||!key.match(new RegExp("^vcard"+jsxc.storage.SEP))||null===e.newValue||e.newValue.match(/^request:/)||(n=JSON.parse(e.newValue),"undefined"!=typeof n.state&&$(document).trigger("loaded.vcard.jsxc",n),jsxc.storage.removeUserItem("vcard",bid))}}}},saveMessage:function(bid,direction,msg,encrypted,forwarded,stamp){var chat=jsxc.storage.getUserItem("chat",bid)||[],uid=(new Date).getTime()+":msg";chat.length>jsxc.options.get("numberOfMsg")&&chat.pop();var post={direction:direction,msg:msg,uid:uid.replace(/:/,"-"),received:!1,encrypted:encrypted||!1,forwarded:forwarded||!1,stamp:stamp||(new Date).getTime()};return chat.unshift(post),jsxc.storage.setUserItem("chat",bid,chat),post},saveBuddy:function(bid,data){return jsxc.storage.getUserItem("buddy",bid)?(jsxc.storage.updateUserItem("buddy",bid,data),"updated"):(jsxc.storage.setUserItem("buddy",bid,$.extend({jid:"",name:"",status:0,sub:"none",msgstate:0,transferReq:-1,trust:!1,fingerprint:null,res:[],type:"chat"},data)),"created")}},jsxc.otr={objects:{},dsaFallback:null,receiveMessage:function(d){var bid=d.bid;jsxc.otr.objects[bid].msgstate!==OTR.CONST.MSGSTATE_PLAINTEXT&&jsxc.otr.backup(bid),jsxc.otr.objects[bid].msgstate===OTR.CONST.MSGSTATE_PLAINTEXT||d.encrypted?jsxc.gui.window.postMessage(bid,"in",d.msg,d.encrypted,d.forwarded,d.stamp):jsxc.gui.window.postMessage(bid,"sys",jsxc.translate("%%Received an unencrypted message.%% [")+d.msg+"]",d.encrypted,d.forwarded,d.stamp)},sendMessage:function(jid,msg,uid){0!==jsxc.otr.objects[jsxc.jidToBid(jid)].msgstate&&jsxc.otr.backup(jsxc.jidToBid(jid)),jsxc.xmpp._sendMessage(jid,msg,uid)},create:function(bid){if(!jsxc.otr.objects.hasOwnProperty(bid)&&jsxc.options.otr.priv){var ol=jsxc.storage.getUserItem("otrlist")||[];ol.indexOf(bid)<0&&(ol.push(bid),jsxc.storage.setUserItem("otrlist",ol)),jsxc.otr.objects[bid]=new OTR(jsxc.options.otr),jsxc.options.otr.SEND_WHITESPACE_TAG&&(jsxc.otr.objects[bid].SEND_WHITESPACE_TAG=!0),jsxc.options.otr.WHITESPACE_START_AKE&&(jsxc.otr.objects[bid].WHITESPACE_START_AKE=!0),jsxc.otr.objects[bid].on("status",function(status){var data=jsxc.storage.getUserItem("buddy",bid);if(null!==data){switch(status){case OTR.CONST.STATUS_SEND_QUERY:jsxc.gui.window.postMessage(bid,"sys",jsxc.l.trying_to_start_private_conversation);break;case OTR.CONST.STATUS_AKE_SUCCESS:data.fingerprint=jsxc.otr.objects[bid].their_priv_pk.fingerprint(),data.msgstate=OTR.CONST.MSGSTATE_ENCRYPTED;var msg=(jsxc.otr.objects[bid].trust?jsxc.l.Verified:jsxc.l.Unverified)+" "+jsxc.l.private_conversation_started;jsxc.gui.window.postMessage(bid,"sys",msg);break;case OTR.CONST.STATUS_END_OTR:data.fingerprint=null,jsxc.otr.objects[bid].msgstate===OTR.CONST.MSGSTATE_PLAINTEXT?(data.msgstate=OTR.CONST.MSGSTATE_PLAINTEXT,jsxc.gui.window.postMessage(bid,"sys",jsxc.l.private_conversation_aborted)):(data.msgstate=OTR.CONST.MSGSTATE_FINISHED,jsxc.gui.window.postMessage(bid,"sys",jsxc.l.your_buddy_closed_the_private_conversation_you_should_do_the_same));break;case OTR.CONST.STATUS_SMP_HANDLE:jsxc.keepBusyAlive()}jsxc.storage.setUserItem("buddy",bid,data),jsxc.gui.update(bid)}}),jsxc.otr.objects[bid].on("smp",function(type,data){switch(type){case"question":if(jsxc.gui.window.postMessage(bid,"sys",jsxc.l.Authentication_request_received),$("#jsxc_dialog").length>0){jsxc.otr.objects[bid].sm.abort();break}jsxc.otr.onSmpQuestion(bid,data),jsxc.storage.setUserItem("smp_"+bid,{data:data||null});break;case"trust":jsxc.otr.objects[bid].trust=data,jsxc.storage.updateUserItem("buddy",bid,"trust",data),jsxc.otr.backup(bid),jsxc.gui.update(bid),data?jsxc.gui.window.postMessage(bid,"sys",jsxc.l.conversation_is_now_verified):jsxc.gui.window.postMessage(bid,"sys",jsxc.l.authentication_failed),jsxc.storage.removeUserItem("smp_"+bid),jsxc.gui.dialog.close();break;case"abort":jsxc.gui.window.postMessage(bid,"sys",jsxc.l.Authentication_aborted);break;default:jsxc.debug("[OTR] sm callback: Unknown type: "+type)}}),jsxc.otr.objects[bid].on("ui",function(msg,encrypted,meta){jsxc.otr.receiveMessage({bid:bid,msg:msg,encrypted:encrypted===!0,stamp:meta.stamp,forwarded:meta.forwarded})}),jsxc.otr.objects[bid].on("io",function(msg,uid){var jid=jsxc.gui.window.get(bid).data("jid")||jsxc.otr.objects[bid].jid;jsxc.otr.objects[bid].jid=jid,jsxc.otr.sendMessage(jid,msg,uid)}),jsxc.otr.objects[bid].on("error",function(err){"Received an unencrypted message."!==err&&jsxc.gui.window.postMessage(bid,"sys","[OTR] "+jsxc.translate("%%"+err+"%%")),jsxc.error("[OTR] "+err)}),jsxc.otr.restore(bid)}},onSmpQuestion:function(bid,data){jsxc.gui.showVerification(bid),$("#jsxc_dialog select").prop("selectedIndex",data?2:3).change(),$("#jsxc_dialog > div:eq(0)").hide(),data?($("#jsxc_dialog > div:eq(2)").find("#jsxc_quest").val(data).prop("disabled",!0),$("#jsxc_dialog > div:eq(2)").find(".creation").text("Answer"),$("#jsxc_dialog > div:eq(2)").find(".jsxc_explanation").text(jsxc.l.your_buddy_is_attempting_to_determine_+" "+jsxc.l.to_authenticate_to_your_buddy+jsxc.l.enter_the_answer_and_click_answer)):$("#jsxc_dialog > div:eq(3)").find(".jsxc_explanation").text(jsxc.l.your_buddy_is_attempting_to_determine_+" "+jsxc.l.to_authenticate_to_your_buddy+jsxc.l.enter_the_secret),$("#jsxc_dialog .jsxc_close").click(function(){jsxc.storage.removeUserItem("smp_"+bid),jsxc.master&&jsxc.otr.objects[bid].sm.abort()})},sendSmpReq:function(bid,sec,quest){jsxc.keepBusyAlive(),jsxc.otr.objects[bid].smpSecret(sec,quest||"")},toggleTransfer:function(bid){0===jsxc.storage.getUserItem("buddy",bid).msgstate?jsxc.otr.goEncrypt(bid):jsxc.otr.goPlain(bid)},goEncrypt:function(bid){jsxc.master?jsxc.otr.objects[bid].sendQueryMsg():jsxc.storage.updateUserItem("buddy",bid,"transferReq",1)},goPlain:function(bid,cb){jsxc.master?(jsxc.otr.objects[bid].endOtr.call(jsxc.otr.objects[bid],cb),jsxc.otr.objects[bid].init.call(jsxc.otr.objects[bid]),jsxc.otr.backup(bid)):jsxc.storage.updateUserItem("buddy",bid,"transferReq",0)},backup:function(bid){var o=jsxc.otr.objects[bid],r={};if(null!==o){var i,savekey=["jid","our_instance_tag","msgstate","authstate","fragment","their_y","their_old_y","their_keyid","their_instance_tag","our_dh","our_old_dh","our_keyid","sessKeys","storedMgs","oldMacKeys","trust","transmittedRS","ssid","receivedPlaintext","authstate","send_interval"];for(i=0;i<savekey.length;i++)r[savekey[i]]=JSON.stringify(o[savekey[i]]);null!==o.their_priv_pk&&(r.their_priv_pk=JSON.stringify(o.their_priv_pk.packPublic())),o.ake.otr_version&&""!==o.ake.otr_version&&(r.otr_version=JSON.stringify(o.ake.otr_version)),jsxc.storage.setUserItem("otr",bid,r)}},restore:function(bid){var o=jsxc.otr.objects[bid],d=jsxc.storage.getUserItem("otr",bid);if(null!==o||null!==d){var key;for(key in d)if(d.hasOwnProperty(key)){var val=JSON.parse(d[key]);"their_priv_pk"===key&&null!==val&&(val=DSA.parsePublic(val)),"otr_version"===key&&null!==val?o.ake.otr_version=val:o[key]=val}jsxc.otr.objects[bid]=o,1===o.msgstate&&null!==o.their_priv_pk&&o._smInit.call(jsxc.otr.objects[bid])}jsxc.otr.enable(bid)},createDSA:function(){if(!jsxc.options.otr.priv)if(null===jsxc.storage.getUserItem("key")){var msg=jsxc.l.Creating_your_private_key_,worker=null;if(Worker)try{worker=new Worker(jsxc.options.root+"/lib/otr/build/dsa-webworker.js")}catch(err){jsxc.warn("Couldn't create web-worker.",err)}jsxc.otr.dsaFallback=null===worker,jsxc.otr.dsaFallback?(jsxc.gui.dialog.open(jsxc.gui.template.get("waitAlert",null,msg),{noClose:!0}),jsxc.debug("DSA key creation started."),setTimeout(function(){var dsa=new DSA;jsxc.otr.DSAready(dsa)},500)):(jsxc._onMaster(),worker.onmessage=function(e){var type=e.data.type,val=e.data.val;"debug"===type?jsxc.debug(val):"data"===type&&jsxc.otr.DSAready(DSA.parsePrivate(val))},worker.postMessage({imports:[jsxc.options.root+"/lib/otr/vendor/salsa20.js",jsxc.options.root+"/lib/otr/vendor/bigint.js",jsxc.options.root+"/lib/otr/vendor/crypto.js",jsxc.options.root+"/lib/otr/vendor/eventemitter.js",jsxc.options.root+"/lib/otr/lib/const.js",jsxc.options.root+"/lib/otr/lib/helpers.js",jsxc.options.root+"/lib/otr/lib/dsa.js"],seed:BigInt.getSeed(),debug:!0}))}else jsxc.debug("DSA key loaded"),jsxc.options.otr.priv=DSA.parsePrivate(jsxc.storage.getUserItem("key")),jsxc.otr._createDSA()},_createDSA:function(){jsxc.storage.setUserItem("priv_fingerprint",jsxc.options.otr.priv.fingerprint()),jsxc.otr.dsaFallback!==!1&&jsxc._onMaster()},DSAready:function(dsa){jsxc.storage.setUserItem("key",dsa.packPrivate()),jsxc.options.otr.priv=dsa,jsxc.otr.dsaFallback?jsxc.gui.dialog.close():$.each(jsxc.storage.getUserItem("windowlist"),function(index,val){jsxc.otr.create(val)}),jsxc.otr._createDSA()},enable:function(bid){jsxc.gui.window.get(bid).find(".jsxc_otr").removeClass("jsxc_disabled")}},jsxc.notification={audio:null,init:function(){$(document).on("postmessagein.jsxc",function(event,bid,msg){msg=msg.match(/^\?OTR/)?jsxc.translate("%%Encrypted message%%"):msg;var data=jsxc.storage.getUserItem("buddy",bid);jsxc.notification.notify(jsxc.translate("%%New message from%% ")+data.name,msg,void 0,void 0,jsxc.CONST.SOUNDS.MSG)}),$(document).on("callincoming.jingle",function(){jsxc.notification.playSound(jsxc.CONST.SOUNDS.CALL,!0,!0)}),$(document).on("accept.call.jsxc reject.call.jsxc",function(){jsxc.notification.stopSound()})},notify:function(title,msg,d,force,soundFile,loop){jsxc.options.notification&&jsxc.notification.hasPermission()&&(jsxc.isHidden()||force)&&(jsxc.toNotification=setTimeout(function(){"string"==typeof soundFile&&jsxc.notification.playSound(soundFile,loop,force);var popup=new Notification(jsxc.translate(title),{body:jsxc.translate(msg),icon:jsxc.options.root+"/img/XMPP_logo.png"}),duration=d||jsxc.options.popupDuration;duration>0&&setTimeout(function(){popup.close()},duration)},jsxc.toNotificationDelay))},hasSupport:function(){if(window.webkitNotifications){window.Notification=function(title,opt){var popup=window.webkitNotifications.createNotification(null,title,opt.body);return popup.show(),popup.close=function(){popup.cancel()},popup};var permission;switch(window.webkitNotifications.checkPermission()){case 0:permission=jsxc.CONST.NOTIFICATION_GRANTED;break;case 2:permission=jsxc.CONST.NOTIFICATION_DENIED;break;default:permission=jsxc.CONST.NOTIFICATION_DEFAULT}return window.Notification.permission=permission,window.Notification.requestPermission=function(func){window.webkitNotifications.requestPermission(func)},!0}return window.Notification?!0:!1},prepareRequest:function(){$(document).one("postmessagein.jsxc",function(){jsxc.switchEvents({"notificationready.jsxc":function(){jsxc.gui.dialog.close(),jsxc.notification.init(),jsxc.storage.setUserItem("notification",!0)},"notificationfailure.jsxc":function(){jsxc.gui.dialog.close(),jsxc.options.notification=!1,jsxc.storage.setUserItem("notification",!1)}}),setTimeout(function(){jsxc.notice.add("%%Notifications%%?","%%Should_we_notify_you_%%","gui.showRequestNotification")},1e3)})},requestPermission:function(){window.Notification.requestPermission(function(status){window.Notification.permission!==status&&(window.Notification.permission=status),$(document).trigger(jsxc.notification.hasPermission()?"notificationready.jsxc":"notificationfailure.jsxc")})},hasPermission:function(){return window.Notification.permission===jsxc.CONST.NOTIFICATION_GRANTED},playSound:function(soundFile,loop,force){if(jsxc.master&&!jsxc.options.get("muteNotification")&&"dnd"!==jsxc.storage.getUserItem("presence")&&(jsxc.isHidden()||force)){jsxc.notification.stopSound();var audio=new Audio(jsxc.options.root+"/sound/"+soundFile);audio.loop=loop||!1,audio.play(),jsxc.notification.audio=audio}},stopSound:function(){var audio=jsxc.notification.audio;"undefined"!=typeof audio&&null!==audio&&(audio.pause(),jsxc.notification.audio=null)},muteSound:function(external){$("#jsxc_menu .jsxc_muteNotification").text(jsxc.translate("%%Unmute%%")),external!==!0&&jsxc.options.set("muteNotification",!0)},unmuteSound:function(external){$("#jsxc_menu .jsxc_muteNotification").text(jsxc.translate("%%Mute%%")),external!==!0&&jsxc.options.set("muteNotification",!1)}},jsxc.notice={_num:0,load:function(){$("#jsxc_notice ul li").remove(),$("#jsxc_notice > span").text(""),jsxc.notice._num=0;var saved=jsxc.storage.getUserItem("notices")||[],key=null;for(key in saved)if(saved.hasOwnProperty(key)){var val=saved[key];jsxc.notice.add(val.msg,val.description,val.fnName,val.fnParams,key)}},add:function(msg,description,fnName,fnParams,id){var nid=id||Date.now(),list=$("#jsxc_notice ul"),notice=$("<li/>");if(notice.click(function(){return jsxc.notice.remove(nid),jsxc.exec(fnName,fnParams),!1}),notice.text(jsxc.translate(msg)),notice.attr("title",jsxc.translate(description)||""),notice.attr("data-nid",nid),list.append(notice),$("#jsxc_notice > span").text(++jsxc.notice._num),!id){var saved=jsxc.storage.getUserItem("notices")||{};saved[nid]={msg:msg,description:description,fnName:fnName,fnParams:fnParams},jsxc.storage.setUserItem("notices",saved),jsxc.notification.notify(msg,description||"",null,!0,jsxc.CONST.SOUNDS.NOTICE)}},remove:function(nid){var el=$("#jsxc_notice li[data-nid="+nid+"]");el.remove(),$("#jsxc_notice > span").text(--jsxc.notice._num||"");var s=jsxc.storage.getUserItem("notices");delete s[nid],jsxc.storage.setUserItem("notices",s)}},jsxc.l10n={en:{Logging_in:"Logging in…",your_connection_is_unencrypted:"Your connection is unencrypted.",your_connection_is_encrypted:"Your connection is encrypted.",your_buddy_closed_the_private_connection:"Your buddy closed the private connection.",start_private:"Start private",close_private:"Close private",your_buddy_is_verificated:"Your buddy is verified.",you_have_only_a_subscription_in_one_way:"You only have a one-way subscription.",authentication_query_sent:"Authentication query sent.",your_message_wasnt_send_please_end_your_private_conversation:"Your message was not sent. Please end your private conversation.",unencrypted_message_received:"Unencrypted message received:",your_message_wasnt_send_because_you_have_no_valid_subscription:"Your message was not sent because you have no valid subscription.",not_available:"Not available",no_connection:"No connection!",relogin:"relogin",trying_to_start_private_conversation:"Trying to start private conversation!",Verified:"Verified",Unverified:"Unverified",private_conversation_started:"Private conversation started.",private_conversation_aborted:"Private conversation aborted!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Your buddy closed the private conversation! You should do the same.",conversation_is_now_verified:"Conversation is now verified.",authentication_failed:"Authentication failed.",your_buddy_is_attempting_to_determine_:"You buddy is attempting to determine if he or she is really talking to you.",to_authenticate_to_your_buddy:"To authenticate to your buddy, ",enter_the_answer_and_click_answer:"enter the answer and click Answer.",enter_the_secret:"enter the secret.",Creating_your_private_key_:"Creating your private key; this may take a while.",Authenticating_a_buddy_helps_:"Authenticating a buddy helps ensure that the person you are talking to is really the one he or she claims to be.",How_do_you_want_to_authenticate_your_buddy:"How do you want to authenticate {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Select method...",Manual:"Manual",Question:"Question",Secret:"Secret",To_verify_the_fingerprint_:"To verify the fingerprint, contact your buddy via some other trustworthy channel, such as the telephone.",Your_fingerprint:"Your fingerprint",Buddy_fingerprint:"Buddy fingerprint",Close:"Close",Compared:"Compared",To_authenticate_using_a_question_:"To authenticate using a question, pick a question whose answer is known only you and your buddy.",Ask:"Ask",To_authenticate_pick_a_secret_:"To authenticate, pick a secret known only to you and your buddy.",Compare:"Compare",Fingerprints:"Fingerprints",Authentication:"Authentication",Message:"Message",Add_buddy:"Add buddy",rename_buddy:"rename buddy",delete_buddy:"delete buddy",Login:"Login",Username:"Username",Password:"Password",Cancel:"Cancel",Connect:"Connect",Type_in_the_full_username_:"Type in the full username and an optional alias.",Alias:"Alias",Add:"Add",Subscription_request:"Subscription request",You_have_a_request_from:"You have a request from",Deny:"Deny",Approve:"Approve",Remove_buddy:"Remove buddy",You_are_about_to_remove_:"You are about to remove {{bid_name}} (<b>{{bid_jid}}</b>) from your buddy list. All related chats will be closed.",Continue_without_chat:"Continue without chat",Please_wait:"Please wait",Login_failed:"Chat login failed",Sorry_we_cant_authentikate_:"Authentication failed with the chat server. Maybe the password is wrong?",Retry:"Back",clear_history:"Clear history",New_message_from:"New message from",Should_we_notify_you_:"Should we notify you about new messages in the future?",Please_accept_:'Please click the "Allow" button at the top.',Hide_offline:"Hide offline contacts",Show_offline:"Show offline contacts",About:"About",dnd:"Do Not Disturb",Mute:"Mute",Unmute:"Unmute",Subscription:"Subscription",both:"both",Status:"Status",online:"online",chat:"chat",away:"away",xa:"extended away",offline:"offline",none:"none",Unknown_instance_tag:"Unknown instance tag.",Not_one_of_our_latest_keys:"Not one of our latest keys.",Received_an_unreadable_encrypted_message:"Received an unreadable encrypted message.",Online:"Online",Chatty:"Chatty",Away:"Away",Extended_away:"Extended away",Offline:"Offline",Friendship_request:"Friendship request",Confirm:"Confirm",Dismiss:"Dismiss",Remove:"Remove",Online_help:"Online help",FN:"Full name",N:" ",FAMILY:"Family name",GIVEN:"Given name",NICKNAME:"Nickname",URL:"URL",ADR:"Address",STREET:"Street Address",EXTADD:"Extended Address",LOCALITY:"Locality",REGION:"Region",PCODE:"Postal Code",CTRY:"Country",TEL:"Telephone",NUMBER:"Number",EMAIL:"Email",USERID:" ",ORG:"Organization",ORGNAME:"Name",ORGUNIT:"Unit",TITLE:"Job title",ROLE:"Role",BDAY:"Birthday",DESC:"Description",PHOTO:" ",send_message:"Send message",get_info:"Show information",Settings:"Settings",Priority:"Priority",Save:"Save",User_settings:"User settings",A_fingerprint_:"A fingerprint is used to make sure that the person you are talking to is who he or she is saying.",Your_roster_is_empty_add_a:"Your roster is empty, add a ",new_buddy:"new buddy",is:"is",Login_options:"Login options",BOSH_url:"BOSH URL",Domain:"Domain",Resource:"Resource",On_login:"On login",Received_an_unencrypted_message:"Received an unencrypted message",Sorry_your_buddy_doesnt_provide_any_information:"Sorry, your buddy does not provide any information.",Info_about:"Info about",Authentication_aborted:"Authentication aborted.",Authentication_request_received:"Authentication request received.",Do_you_want_to_display_them:"Do you want to display them?",Log_in_without_chat:"Log in without chat",has_come_online:"has come online",Unknown_sender:"Unknown sender",You_received_a_message_from_an_unknown_sender:"You received a message from an unknown sender"},de:{Logging_in:"Login läuft…",your_connection_is_unencrypted:"Deine Verbindung ist UNverschlüsselt.",your_connection_is_encrypted:"Deine Verbindung ist verschlüsselt.",your_buddy_closed_the_private_connection:"Dein Freund hat die private Verbindung getrennt.",start_private:"Privat starten",close_private:"Privat abbrechen",your_buddy_is_verificated:"Dein Freund ist verifiziert.",you_have_only_a_subscription_in_one_way:"Die Freundschaft ist nur einseitig.",authentication_query_sent:"Authentifizierungsanfrage gesendet.",your_message_wasnt_send_please_end_your_private_conversation:"Deine Nachricht wurde nicht gesendet. Bitte beende die private Konversation.",unencrypted_message_received:"Unverschlüsselte Nachricht erhalten.",your_message_wasnt_send_because_you_have_no_valid_subscription:"Deine Nachricht wurde nicht gesandt, da die Freundschaft einseitig ist.",not_available:"Nicht verfügbar.",no_connection:"Keine Verbindung.",relogin:"Neu anmelden.",trying_to_start_private_conversation:"Versuche private Konversation zu starten.",Verified:"Verifiziert",Unverified:"Unverifiziert",private_conversation_started:"Private Konversation gestartet.",private_conversation_aborted:"Private Konversation abgebrochen.",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Dein Freund hat die private Konversation beendet. Das solltest du auch tun!",conversation_is_now_verified:"Konversation ist jetzt verifiziert",authentication_failed:"Authentifizierung fehlgeschlagen.",your_buddy_is_attempting_to_determine_:"Dein Freund versucht herauszufinden ob er wirklich mit dir redet.",to_authenticate_to_your_buddy:"Um dich gegenüber deinem Freund zu verifizieren ",enter_the_answer_and_click_answer:"gib die Antwort ein und klick auf Antworten.",enter_the_secret:"gib das Geheimnis ein.",Creating_your_private_key_:"Wir werden jetzt deinen privaten Schlüssel generieren. Das kann einige Zeit in Anspruch nehmen.",Authenticating_a_buddy_helps_:"Einen Freund zu authentifizieren hilft sicher zustellen, dass die Person mit der du sprichst auch die ist die sie sagt.",How_do_you_want_to_authenticate_your_buddy:"Wie willst du {{bid_name}} (<b>{{bid_jid}}</b>) authentifizieren?",Select_method:"Wähle...",Manual:"Manual",Question:"Frage",Secret:"Geheimnis",To_verify_the_fingerprint_:"Um den Fingerprint zu verifizieren kontaktiere dein Freund über einen anderen Kommunikationsweg. Zum Beispiel per Telefonanruf.",Your_fingerprint:"Dein Fingerprint",Buddy_fingerprint:"Sein/Ihr Fingerprint",Close:"Schließen",Compared:"Verglichen",To_authenticate_using_a_question_:"Um die Authentifizierung per Frage durchzuführen, wähle eine Frage bei welcher nur dein Freund die Antwort weiß.",Ask:"Frage",To_authenticate_pick_a_secret_:"Um deinen Freund zu authentifizieren, wähle ein Geheimnis welches nur deinem Freund und dir bekannt ist.",Compare:"Vergleiche",Fingerprints:"Fingerprints",Authentication:"Authentifizierung",Message:"Nachricht",Add_buddy:"Freund hinzufügen",rename_buddy:"Freund umbenennen",delete_buddy:"Freund löschen",Login:"Anmeldung",Username:"Benutzername",Password:"Passwort",Cancel:"Abbrechen",Connect:"Verbinden",Type_in_the_full_username_:"Gib bitte den vollen Benutzernamen und optional ein Alias an.",Alias:"Alias",Add:"Hinzufügen",Subscription_request:"Freundschaftsanfrage",You_have_a_request_from:"Du hast eine Anfrage von",Deny:"Ablehnen",Approve:"Bestätigen",Remove_buddy:"Freund entfernen",You_are_about_to_remove_:"Du bist gerade dabei {{bid_name}} (<b>{{bid_jid}}</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.",Continue_without_chat:"Weiter ohne Chat",Please_wait:"Bitte warten",Login_failed:"Chat-Anmeldung fehlgeschlagen",Sorry_we_cant_authentikate_:"Der Chatserver hat die Anmeldung abgelehnt. Falsches Passwort?",Retry:"Zurück",clear_history:"Lösche Verlauf",New_message_from:"Neue Nachricht von",Should_we_notify_you_:"Sollen wir dich in Zukunft über eingehende Nachrichten informieren, auch wenn dieser Tab nicht im Vordergrund ist?",Please_accept_:'Bitte klick auf den "Zulassen" Button oben.',Menu:"Menü",Hide_offline:"Offline ausblenden",Show_offline:"Offline einblenden",About:"Über",dnd:"Beschäftigt",Mute:"Ton aus",Unmute:"Ton an",Subscription:"Bezug",both:"beidseitig",Status:"Status",online:"online",chat:"chat",away:"abwesend",xa:"länger abwesend",offline:"offline",none:"keine",Unknown_instance_tag:"Unbekannter instance tag.",Not_one_of_our_latest_keys:"Nicht einer unserer letzten Schlüssel.",Received_an_unreadable_encrypted_message:"Eine unlesbare verschlüsselte Nachricht erhalten.",Online:"Online",Chatty:"Gesprächig",Away:"Abwesend",Extended_away:"Länger abwesend",Offline:"Offline",Friendship_request:"Freundschaftsanfrage",Confirm:"Bestätigen",Dismiss:"Ablehnen",Remove:"Löschen",Online_help:"Online Hilfe",FN:"Name",N:" ",FAMILY:"Familienname",GIVEN:"Vorname",NICKNAME:"Spitzname",URL:"URL",ADR:"Adresse",STREET:"Straße",EXTADD:"Zusätzliche Adresse",LOCALITY:"Ortschaft",REGION:"Region",PCODE:"Postleitzahl",CTRY:"Land",TEL:"Telefon",NUMBER:"Nummer",EMAIL:"E-Mail",USERID:" ",ORG:"Organisation",ORGNAME:"Name",ORGUNIT:"Abteilung",TITLE:"Titel",ROLE:"Rolle",BDAY:"Geburtstag",DESC:"Beschreibung",PHOTO:" ",send_message:"Sende Nachricht",get_info:"Benutzerinformationen",Settings:"Einstellungen",Priority:"Priorität",Save:"Speichern",User_settings:"Benutzereinstellungen",A_fingerprint_:"Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.",Your_roster_is_empty_add_a:"Deine Freundesliste ist leer, füge einen neuen Freund ",new_buddy:"hinzu",is:"ist",Login_options:"Anmeldeoptionen",BOSH_url:"BOSH url",Domain:"Domain",Resource:"Ressource",On_login:"Beim Anmelden",Received_an_unencrypted_message:"Unverschlüsselte Nachricht empfangen",Sorry_your_buddy_doesnt_provide_any_information:"Dein Freund stellt leider keine Informationen bereit.",Info_about:"Info über",Authentication_aborted:"Authentifizierung abgebrochen.",Authentication_request_received:"Authentifizierunganfrage empfangen.",Log_in_without_chat:"Anmelden ohne Chat",Do_you_want_to_display_them:"Möchtest du sie sehen?",has_come_online:"ist online gekommen",Unknown_sender:"Unbekannter Sender",You_received_a_message_from_an_unknown_sender:"Du hast eine Nachricht von einem unbekannten Sender erhalten"},es:{Logging_in:"Por favor, espere...",your_connection_is_unencrypted:"Su conexión no está cifrada.",your_connection_is_encrypted:"Su conexión está cifrada.",your_buddy_closed_the_private_connection:"Su amigo ha cerrado la conexión privada.",start_private:"Iniciar privado",close_private:"Cerrar privado",your_buddy_is_verificated:"Tu amigo está verificado.",you_have_only_a_subscription_in_one_way:"Sólo tienes una suscripción de un modo.",authentication_query_sent:"Consulta de verificación enviada.",your_message_wasnt_send_please_end_your_private_conversation:"Su mensaje no fue enviado. Por favor, termine su conversación privada.",unencrypted_message_received:"Mensaje no cifrado recibido:",your_message_wasnt_send_because_you_have_no_valid_subscription:"Su mensaje no se ha enviado, porque usted no tiene suscripción válida.",not_available:"No disponible",no_connection:"Sin conexión!",relogin:"iniciar sesión nuevamente",trying_to_start_private_conversation:"Intentando iniciar una conversación privada!",Verified:"Verificado",Unverified:"No verificado",private_conversation_started:"se inició una conversación privada.",private_conversation_aborted:"Conversación privada abortada!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Su amigo cerró la conversación privada! Usted debería hacer lo mismo.",conversation_is_now_verified:"La conversación es ahora verificada.",authentication_failed:"Fallo la verificación.",your_buddy_is_attempting_to_determine_:"Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.",to_authenticate_to_your_buddy:"Para autenticar a su amigo, ",enter_the_answer_and_click_answer:"introduce la respuesta y haga clic en Contestar.",enter_the_secret:"especifique el secreto.",Creating_your_private_key_:"Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.",Authenticating_a_buddy_helps_:"Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.",How_do_you_want_to_authenticate_your_buddy:"¿Cómo desea autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Escoja un método...",Manual:"Manual",Question:"Pregunta",Secret:"Secreto",To_verify_the_fingerprint_:"Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.",Your_fingerprint:"Tu firma digital",Buddy_fingerprint:"firma digital de tu amigo",Close:"Cerrar",Compared:"Comparado",To_authenticate_using_a_question_:"Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.",Ask:"Preguntar",To_authenticate_pick_a_secret_:"Para autenticar, elija un secreto conocido sólo por usted y su amigo.",Compare:"Comparar",Fingerprints:"Firmas digitales",Authentication:"Autenticación",Message:"Mensaje",Add_buddy:"Añadir amigo",rename_buddy:"renombrar amigo",delete_buddy:"eliminar amigo",Login:"Iniciar Sesión",Username:"Usuario",Password:"Contraseña",Cancel:"Cancelar",Connect:"Conectar",Type_in_the_full_username_:"Escriba el usuario completo y un alias opcional.",Alias:"Alias",Add:"Añadir",Subscription_request:"Solicitud de suscripción",You_have_a_request_from:"Tienes una petición de",Deny:"Rechazar",Approve:"Aprobar",Remove_buddy:"Eliminar amigo",You_are_about_to_remove_:"Vas a eliminar a {{bid_name}} (<b>{{bid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.",Continue_without_chat:"Continuar",Please_wait:"Espere por favor",Login_failed:"Fallo el inicio de sesión",Sorry_we_cant_authentikate_:"Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?",Retry:"Reintentar",clear_history:"Borrar el historial",New_message_from:"Nuevo mensaje de",Should_we_notify_you_:"¿Debemos notificarle sobre nuevos mensajes en el futuro?",Please_accept_:'Por favor, haga clic en el botón "Permitir" en la parte superior.',dnd:"No Molestar",Mute:"Desactivar sonido",Unmute:"Activar sonido",Subscription:"Suscripción",both:"ambos",Status:"Estado",online:"en línea",chat:"chat",away:"ausente",xa:"mas ausente",offline:"desconectado",none:"nadie",Unknown_instance_tag:"Etiqueta de instancia desconocida.",Not_one_of_our_latest_keys:"No de nuestra ultima tecla.",Received_an_unreadable_encrypted_message:"Se recibió un mensaje cifrado ilegible.",Online:"En linea",Chatty:"Hablador",Away:"Ausente",Extended_away:"Mas ausente",Offline:"Desconectado",Friendship_request:"Solicitud de amistad",Confirm:"Confirmar",Dismiss:"Rechazar",Remove:"Eliminar",Online_help:"Ayuda en línea",FN:"Nombre completo ",N:" ",FAMILY:"Apellido",GIVEN:"Nombre",NICKNAME:"Apodar",URL:"URL",ADR:"Dirección",STREET:"Calle",EXTADD:"Extendido dirección",LOCALITY:"Población",REGION:"Región",PCODE:"Código postal",CTRY:"País",TEL:"Teléfono",NUMBER:"Número",EMAIL:"Emilio",USERID:" ",ORG:"Organización",ORGNAME:"Nombre",ORGUNIT:"Departamento",TITLE:"Título",ROLE:"Rol",BDAY:"Cumpleaños",DESC:"Descripción",PHOTO:" ",send_message:"mandar un texto",get_info:"obtener información",Settings:"Ajustes",Priority:"Prioridad",Save:"Guardar",User_settings:"Configuración de usuario",A_fingerprint_:"La huella digital se utiliza para que puedas estar seguro que la persona con la que estas hablando es quien realmente dice ser",Your_roster_is_empty_add_a:"Tu lista de amigos esta vacia",new_buddy:"Nuevo amigo",is:"es",Login_options:"Opciones de login",BOSH_url:"BOSH url",Domain:"Dominio",Resource:"Recurso",On_login:"Iniciar sesión",Received_an_unencrypted_message:"Recibe un mensaje no cifrado"}}
-}(jQuery);/*!
- * jsxc v1.1.0 - 2015-02-08
- *
- * Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
- * Released under the MIT license
- *
- * Please see http://www.jsxc.org/
- *
- * @author Klaus Herberth <klaus@jsxc.org>
- * @version 1.1.0
- * @license MIT
- */
-var RTC=null,RTCPeerconnection=null;jsxc.gui.template.incomingCall='<h3>%%Incoming_call%%</h3> <p>%%Do_you_want_to_accept_the_call_from%% {{bid_name}}?</p> <p class="jsxc_right"> <a href="#" class="button jsxc_reject">%%Reject%%</a> <a href="#" class="button creation jsxc_accept">%%Accept%%</a> </p>',jsxc.gui.template.allowMediaAccess="<p>%%Please_allow_access_to_microphone_and_camera%%</p>",jsxc.gui.template.videoWindow='<div class="jsxc_webrtc"> <div class="jsxc_chatarea"> <ul></ul> </div> <div class="jsxc_videoContainer"> <video class="jsxc_localvideo" autoplay></video> <video class="jsxc_remotevideo" autoplay></video> <div class="jsxc_status"></div> <div class="bubblingG"> <span id="bubblingG_1"> </span> <span id="bubblingG_2"> </span> <span id="bubblingG_3"> </span> </div> <div class="jsxc_noRemoteVideo"> <div> <div></div> <p>%%No_video_signal%%</p> <div></div> </div> </div> </div> <div class="jsxc_controlbar"> <button type="button" class="jsxc_hangUp">%%hang_up%%</button> <input type="range" class="jsxc_volume" min="0.0" max="1.0" step="0.05" value="0.5" /> <div class="jsxc_buttongroup"> <button type="button" class="jsxc_snapshot">%%snapshot%%</button><button type="button" class="jsxc_snapshots">&#9660;</button> </div> <!-- <button type="button" class="jsxc_mute_local">%%mute_my_audio%%</button> <button type="button" class="jsxc_pause_local">%%pause_my_video%%</button> --> <button type="button" class="jsxc_showchat">%%chat%%</button> <button type="button" class="jsxc_fullscreen">%%fullscreen%%</button> <button type="button" class="jsxc_info">%%Info%%</button> </div> <div class="jsxc_multi"> <div class="jsxc_snapshotbar"> <p>No pictures yet!</p> </div>\n <!--<div class="jsxc_chatarea"> <ul></ul> </div>--> <div class="jsxc_infobar"></div> </div> </div>',function($){"use strict";jsxc.webrtc={conn:null,localStream:null,remoteStream:null,last_caller:null,AUTO_ACCEPT:!1,reqVideoFeatures:["urn:xmpp:jingle:apps:rtp:video","urn:xmpp:jingle:apps:rtp:audio","urn:xmpp:jingle:transports:ice-udp:1","urn:xmpp:jingle:apps:dtls:0"],chatJids:{},init:function(){var self=jsxc.webrtc;return self.conn=jsxc.xmpp.conn,"firefox"===RTC.browser&&(self.conn.jingle.media_constraints.mandatory.MozDontOfferDataChannel=!0),self.conn.jingle?(self.conn.jingle.PRANSWER=!1,self.conn.jingle.AUTOACCEPT=!1,self.conn.jingle.ice_config=jsxc.storage.getUserItem("iceConfig"),self.conn.jingle.MULTIPARTY=!1,self.conn.jingle.pc_constraints=RTC.pc_constraints,$(document).on("message.jsxc",$.proxy(self.onMessage,self)),$(document).on("presence.jsxc",$.proxy(self.onPresence,self)),$(document).on("mediaready.jingle",$.proxy(self.onMediaReady,self)),$(document).on("mediafailure.jingle",$.proxy(self.onMediaFailure,self)),$(document).on("callincoming.jingle",$.proxy(self.onCallIncoming,self)),$(document).on("callterminated.jingle",$.proxy(self.onCallTerminated,self)),$(document).on("ringing.jingle",$.proxy(self.onCallRinging,self)),$(document).on("remotestreamadded.jingle",$.proxy(self.onRemoteStreamAdded,self)),$(document).on("remotestreamremoved.jingle",$.proxy(self.onRemoteStreamRemoved,self)),$(document).on("iceconnectionstatechange.jingle",$.proxy(self.onIceConnectionStateChanged,self)),$(document).on("nostuncandidates.jingle",$.proxy(self.noStunCandidates,self)),$(document).on("error.jingle",function(ev,sid,error){jsxc.error("[JINGLE]",error)}),self.conn.disco&&self.conn.disco.addFeature("urn:xmpp:jingle:apps:dtls:0"),self.conn.caps&&$(document).on("caps.strophe",$.proxy(self.onCaps,self)),void self.getTurnCrendentials()):void jsxc.error("No jingle plugin found!")},getTurnCrendentials:function(){if(!jsxc.options.turnCredentialsPath)return void jsxc.debug("No path for TURN credentials defined!");var ttl=(jsxc.storage.getUserItem("iceValidity")||0)-(new Date).getTime();return ttl>0?void window.setTimeout(jsxc.webrtc.getTurnCrendentials,ttl+500):void $.ajax(jsxc.options.turnCredentialsPath,{async:!0,success:function(data){var iceConfig={iceServers:[{url:"turn:"+data.url,credential:data.credential,username:data.username}]};jsxc.webrtc.conn.jingle.ice_config=iceConfig,jsxc.storage.setUserItem("iceConfig",iceConfig),jsxc.storage.setUserItem("iceValidity",(new Date).getTime()+1e3*data.ttl)},dataType:"json"})},getCapableRes:function(jid){var self=jsxc.webrtc,bid=jsxc.jidToBid(jid),res=jsxc.storage.getUserItem("res",bid)||[],available=[];return $.each(res,function(r){self.conn.caps.hasFeatureByJid(bid+"/"+r,self.reqVideoFeatures)&&available.push(r)}),available},onAddRosterItem:function(event,bid,data,el){var self=jsxc.webrtc;if(!self.conn)return void $(document).one("connectionReady.jsxc",function(){self.onAddRosterItem(null,bid,data,el)});var videoIcon=$('<div class="jsxc_video jsxc_disabled" title="'+jsxc.l.Start_video_call+'"></div>');videoIcon.click(function(){return self.startCall(data.jid),!1}),el.find(".jsxc_options.jsxc_left").append(videoIcon),el.on("extra.jsxc",function(){self.updateIcon(bid)})},initWindow:function(event,win){var self=jsxc.webrtc;if(jsxc.debug("webrtc.initWindow"),!self.conn)return void $(document).one("connectionReady.jsxc",function(){self.initWindow(null,win)});var div=$("<div>").addClass("jsxc_video");win.find(".jsxc_transfer:eq(1)").after(div),self.updateIcon(jsxc.jidToBid(win.data("jid")))},updateIcon:function(bid){jsxc.debug("Update icon",bid);var self=jsxc.webrtc;if(bid!==jsxc.jidToBid(self.conn.jid)){var win=jsxc.gui.window.get(bid),jid=win.data("jid")||jsxc.storage.getUserItem("buddy",bid).jid,el=win.find(".jsxc_video").add(jsxc.gui.roster.getItem(bid).find(".jsxc_video")),capableRes=self.getCapableRes(jid),targetRes=Strophe.getResourceFromJid(jid);null===targetRes&&$.each(jsxc.storage.getUserItem("buddy",bid).res,function(index,val){return capableRes.indexOf(val)>-1?(targetRes=val,!1):void 0}),el.off("click"),capableRes.indexOf(targetRes)>-1?(el.click(function(){self.startCall(jid+"/"+targetRes)}),el.removeClass("jsxc_disabled"),el.attr("title",jsxc.translate("%%Start video call%%"))):(el.addClass("jsxc_disabled"),el.attr("title",jsxc.translate("%%Video call not possible.%%")))}},onMessage:function(e,from){var self=jsxc.webrtc,bid=jsxc.jidToBid(from);jsxc.debug("webrtc.onmessage",from),self.chatJids[bid]!==from&&(self.updateIcon(bid),self.chatJids[bid]=from)},onPresence:function(ev,jid){var self=jsxc.webrtc;jsxc.debug("webrtc.onpresence",jid),self.updateIcon(jsxc.jidToBid(jid))},setStatus:function(txt,d){var status=$(".jsxc_webrtc .jsxc_status"),duration="undefined"==typeof d||null===d?4e3:d;if(jsxc.debug("[Webrtc]",txt),status.html()&&(txt=status.html()+"<br />"+txt),status.html(txt),status.css({"margin-left":"-"+status.width()/2+"px",opacity:0,display:"block"}),status.stop().animate({opacity:1}),clearTimeout(status.data("timeout")),0!==duration){var to=setTimeout(function(){status.stop().animate({opacity:0},function(){status.html("")})},duration);status.data("timeout",to)}},onCaps:function(event,jid){var self=jsxc.webrtc;self.updateIcon(jsxc.jidToBid(jid))},onMediaReady:function(event,stream){jsxc.debug("media ready");var self=jsxc.webrtc;self.localStream=stream,self.conn.jingle.localStream=stream,jsxc.gui.showVideoWindow(self.last_caller);var i;for(i=0;i<stream.getAudioTracks().length;i++)self.setStatus(stream.getAudioTracks().length>0?"Use local audio device.":"No local audio device."),jsxc.debug('using audio device "'+stream.getAudioTracks()[i].label+'"');for(i=0;i<stream.getVideoTracks().length;i++)self.setStatus(stream.getVideoTracks().length>0?"Use local video device.":"No local video device."),jsxc.debug('using video device "'+stream.getVideoTracks()[i].label+'"'),$("#jsxc_dialog .jsxc_localvideo").show();$(document).one("cleanup.dialog.jsxc",$.proxy(self.hangUp,self)),$(document).trigger("finish.mediaready.jsxc")},onMediaFailure:function(ev,err){this.setStatus("media failure"),jsxc.gui.window.postMessage(jsxc.jidToBid(jsxc.webrtc.last_caller),"sys",jsxc.translate("%%Media failure%%: ")+err.name),jsxc.debug("media failure: "+err.name)},onCallIncoming:function(event,sid){jsxc.debug("incoming call"+sid);var self=this,sess=this.conn.jingle.sessions[sid],bid=jsxc.jidToBid(sess.peerjid);if(jsxc.gui.window.postMessage(bid,"sys",jsxc.translate("%%Incoming call.%%")),jsxc.notification.notify(jsxc.translate("%%Incoming call%%"),jsxc.translate("%%from%% "+bid)),sess.sendRinging(),jsxc.webrtc.last_caller=sess.peerjid,jsxc.switchEvents({"mediaready.jingle":function(event,stream){self.setStatus("Accept call"),sess.localStream=stream,sess.peerconnection.addStream(stream),sess.sendAnswer(),sess.accept()},"mediafailure.jingle":function(){sess.sendTerminate("decline"),sess.terminate()}}),jsxc.webrtc.AUTO_ACCEPT)return void self.reqUserMedia();var dialog=jsxc.gui.dialog.open(jsxc.gui.template.get("incomingCall",bid),{noClose:!0});dialog.find(".jsxc_accept").click(function(){$(document).trigger("accept.call.jsxc"),self.reqUserMedia()}),dialog.find(".jsxc_reject").click(function(){jsxc.gui.dialog.close(),$(document).trigger("reject.call.jsxc"),sess.sendTerminate("decline"),sess.terminate()})},onCallTerminated:function(event,sid,reason,text){this.setStatus("call terminated "+sid+(reason?": "+reason+" "+text:""));var bid=jsxc.jidToBid(jsxc.webrtc.last_caller);this.localStream&&this.localStream.stop(),$(".jsxc_videoContainer").length&&($(".jsxc_remotevideo")[0].src="",$(".jsxc_localvideo")[0].src=""),this.conn.jingle.localStream=null,this.localStream=null,this.remoteStream=null;var win=$("#jsxc_dialog .jsxc_chatarea > ul > li");$("#jsxc_windowList > ul").prepend(win.detach()),win.find(".slimScrollDiv").resizable("enable"),$(document).off("cleanup.dialog.jsxc"),$(document).off("error.jingle"),jsxc.gui.dialog.close(),jsxc.gui.window.postMessage(bid,"sys",jsxc.translate("%%Call terminated%%"+(reason?": %%"+reason+"%%":"")+"."))},onCallRinging:function(){this.setStatus("ringing...",0)},onRemoteStreamAdded:function(event,data,sid){this.setStatus("Remote stream for session "+sid+" added.");var stream=data.stream;this.remoteStream=stream;var sess=this.conn.jingle.sessions[sid],isVideoDevice=stream.getVideoTracks().length>0,isAudioDevice=stream.getAudioTracks().length>0;sess.remoteDevices={video:isVideoDevice,audio:isAudioDevice},this.setStatus(isVideoDevice?"Use remote video device.":"No remote video device"),this.setStatus(isAudioDevice?"Use remote audio device.":"No remote audio device"),$(".jsxc_remotevideo").length&&(RTC.attachMediaStream($("#jsxc_dialog .jsxc_remotevideo"),stream),$("#jsxc_dialog .jsxc_"+(isVideoDevice?"remotevideo":"noRemoteVideo")).addClass("jsxc_deviceAvailable"))},onRemoteStreamRemoved:function(event,data,sid){this.setStatus("Remote stream for session "+sid+" removed.")},onIceConnectionStateChanged:function(event,sid,sess){var sigState=sess.peerconnection.signalingState,iceCon=sess.peerconnection.iceConnectionState;if(jsxc.debug("iceGat state for "+sid,sess.peerconnection.iceGatheringState),jsxc.debug("iceCon state for "+sid,iceCon),jsxc.debug("sig state for "+sid,sigState),"stable"!==sigState||"connected"!==iceCon&&"completed"!==iceCon)"failed"===iceCon&&(jsxc.gui.window.postMessage(jsxc.jidToBid(sess.peerjid),"sys",jsxc.translate("%%ICE connection failure%%.")),$(document).off("cleanup.dialog.jsxc"),sess.sendTerminate("failed-transport"),sess.terminate(),$(document).trigger("callterminated.jingle"));else{$("#jsxc_dialog .jsxc_deviceAvailable").show(),$("#jsxc_dialog .bubblingG").hide();var localSDP=sess.peerconnection.localDescription.sdp,remoteSDP=sess.peerconnection.remoteDescription.sdp;sess.local_fp=SDPUtil.parse_fingerprint(SDPUtil.find_line(localSDP,"a=fingerprint:")).fingerprint,sess.remote_fp=SDPUtil.parse_fingerprint(SDPUtil.find_line(remoteSDP,"a=fingerprint:")).fingerprint;var ip_regex="(\\d{1,3}\\.\\d{1,3}.\\d{1,3}\\.\\d{1,3}) \\d+ typ host";sess.remote_ip=remoteSDP.match(new RegExp(ip_regex))[1],sess.local_ip=localSDP.match(new RegExp(ip_regex))[1];for(var match,regex=new RegExp(ip_regex,"g");null!==(match=regex.exec(remoteSDP));)if(match[1]!==sess.remote_ip)return void alert("!!! WARNING !!!\n\nPossible Man-in-the-middle attack detected!\n\nYou should close the connection.");var text="<p>";text+="<b>"+jsxc.translate("%%Local IP%%: ")+"</b>"+sess.local_ip+"<br />",text+="<b>"+jsxc.translate("%%Remote IP%%: ")+"</b>"+sess.remote_ip+"<br />",text+="<b>"+jsxc.translate("%%Local Fingerprint%%: ")+"</b>"+sess.local_fp+"<br />",text+="<b>"+jsxc.translate("%%Remote Fingerprint%%: ")+"</b>"+sess.remote_fp,text+="</p>",$("#jsxc_dialog .jsxc_infobar").html(text)}},noStunCandidates:function(){},startCall:function(jid,um){var self=this;return null===Strophe.getResourceFromJid(jid)?void jsxc.debug("We need a full jid"):(self.last_caller=jid,jsxc.switchEvents({"finish.mediaready.jsxc":function(){self.setStatus("Initiate call"),jsxc.gui.window.postMessage(jsxc.jidToBid(jid),"sys",jsxc.translate("%%Call started.%%")),$(document).one("error.jingle",function(e,sid,error){"offer"===error.source&&($(document).off("cleanup.dialog.jsxc"),setTimeout(function(){jsxc.gui.showAlert("Sorry, we couldn't establish a connection. Maybe your buddy is offline.")},500))}),self.conn.jingle.initiate(jid,self.conn.jid.toLowerCase())},"mediafailure.jingle":function(){jsxc.gui.dialog.close()}}),void self.reqUserMedia(um))},hangUp:function(reason,text){$(document).off("cleanup.dialog.jsxc"),jsxc.webrtc.conn.jingle.terminate(null,reason,text),$(document).trigger("callterminated.jingle")},reqUserMedia:function(um){return this.localStream?void $(document).trigger("mediaready.jingle",[this.localStream]):(um=um||["video","audio"],jsxc.gui.dialog.open(jsxc.gui.template.get("allowMediaAccess"),{noClose:!0}),this.setStatus("please allow access to microphone and camera"),void("undefined"!=typeof MediaStreamTrack&&"undefined"!=typeof MediaStreamTrack.getSources?MediaStreamTrack.getSources(function(sourceInfo){var availableDevices=sourceInfo.map(function(el){return el.kind});um=um.filter(function(el){return-1!==availableDevices.indexOf(el)}),getUserMediaWithConstraints(um)}):getUserMediaWithConstraints(um)))},snapshot:function(video){video||jsxc.debug("Missing video element"),$(".jsxc_snapshotbar p").remove();var canvas=$("<canvas/>").css("display","none").appendTo("body").attr({width:video.width(),height:video.height()}).get(0),ctx=canvas.getContext("2d");ctx.drawImage(video[0],0,0);var img=$("<img/>"),url=null;try{url=canvas.toDataURL("image/jpeg")}catch(err){return void jsxc.warn("Error",err)}img[0].src=url;var link=$("<a/>").attr({target:"_blank",href:url});link.append(img),$(".jsxc_snapshotbar").append(link),canvas.remove()}},jsxc.gui.showVideoWindow=function(jid){var self=jsxc.webrtc;$(document).one("complete.dialog.jsxc",function(){$("#jsxc_dialog .jsxc_localvideo")[0].muted=!0,$("#jsxc_dialog .jsxc_localvideo")[0].volume=0;var rv=$("#jsxc_dialog .jsxc_remotevideo"),lv=$("#jsxc_dialog .jsxc_localvideo");lv.draggable({containment:"parent"}),RTC.attachMediaStream(lv,self.localStream);var w_dialog=$("#jsxc_dialog").width(),w_remote=rv.width();if(w_remote>w_dialog){var scale=w_dialog/w_remote,new_h=rv.height()*scale,new_w=w_dialog,vc=$("#jsxc_dialog .jsxc_videoContainer");rv.height(new_h),rv.width(new_w),vc.height(new_h),vc.width(new_w),lv.height(lv.height()*scale),lv.width(lv.width()*scale)}self.remoteStream&&(RTC.attachMediaStream(rv,self.remoteStream),$("#jsxc_dialog .jsxc_"+(self.remoteStream.getVideoTracks().length>0?"remotevideo":"noRemoteVideo")).addClass("jsxc_deviceAvailable"));var toggleMulti=function(elem,open){$("#jsxc_dialog .jsxc_multi > div").not(elem).slideUp();var opt={complete:jsxc.gui.dialog.resize};open?elem.slideDown(opt):elem.slideToggle(opt)},win=jsxc.gui.window.open(jsxc.jidToBid(jid));win.find(".slimScrollDiv").resizable("disable"),win.find(".jsxc_textarea").slimScroll({height:413}),win.find(".jsxc_emoticons").css("top","419px"),$("#jsxc_dialog .jsxc_chatarea ul").append(win.detach()),$("#jsxc_dialog .jsxc_hangUp").click(function(){jsxc.webrtc.hangUp()}),$("#jsxc_dialog .jsxc_snapshot").click(function(){jsxc.webrtc.snapshot(rv),toggleMulti($("#jsxc_dialog .jsxc_snapshotbar"),!0)}),$("#jsxc_dialog .jsxc_snapshots").click(function(){toggleMulti($("#jsxc_dialog .jsxc_snapshotbar"))}),$("#jsxc_dialog .jsxc_showchat").click(function(){var chatarea=$("#jsxc_dialog .jsxc_chatarea");chatarea.is(":hidden")?(chatarea.show(),$("#jsxc_dialog .jsxc_webrtc").width("900"),jsxc.gui.dialog.resize({width:"920px"})):(chatarea.hide(),$("#jsxc_dialog .jsxc_webrtc").width("650"),jsxc.gui.dialog.resize({width:"660px"}))}),$("#jsxc_dialog .jsxc_info").click(function(){toggleMulti($("#jsxc_dialog .jsxc_infobar"))}),$("#jsxc_dialog .jsxc_fullscreen").click(function(){$.support.fullscreen&&($(document).one("disabled.fullscreen",function(){lv.removeAttr("style")}),$("#jsxc_dialog .jsxc_videoContainer").fullscreen())}),$("#jsxc_dialog .jsxc_volume").change(function(){rv[0].volume=$(this).val()}),$("#jsxc_dialog .jsxc_volume").dblclick(function(){$(this).val(.5)})}),jsxc.gui.dialog.open(jsxc.gui.template.get("videoWindow"),{noClose:!0})},$.extend(jsxc.CONST,{KEYCODE_ENTER:13,KEYCODE_ESC:27}),$(document).ready(function(){RTC=setupRTC(),null!==RTC&&(RTCPeerconnection=RTC.peerconnection,$(document).on("add.roster.jsxc",jsxc.webrtc.onAddRosterItem),$(document).on("init.window.jsxc",jsxc.webrtc.initWindow),$(document).on("attached.jsxc",jsxc.webrtc.init))}),$.extend(jsxc.l10n.en,{Please_allow_access_to_microphone_and_camera:'Please click the "Allow" button at the top, to allow access to microphone and camera.',Incoming_call:"Incoming call",from:"from",Do_you_want_to_accept_the_call_from:"Do you want to accept the call from",Reject:"Reject",Accept:"Accept",hang_up:"hang up",snapshot:"snapshot",mute_my_audio:"mute my audio",pause_my_video:"pause my video",fullscreen:"fullscreen",Info:"Info",Local_IP:"Local IP",Remote_IP:"Remote IP",Local_Fingerprint:"Local fingerprint",Remote_Fingerprint:"Remote fingerprint",Video_call_not_possible:"Video call not possible. Your buddy does not support video calls.",Start_video_call:"Start video call"}),$.extend(jsxc.l10n.de,{Please_allow_access_to_microphone_and_camera:'Bitte klick auf den "Zulassen" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.',Incoming_call:"Eingehender Anruf",from:"von",Do_you_want_to_accept_the_call_from:"Möchtest Du den Anruf annehmen von",Reject:"Ablehnen",Accept:"Annehmen",hang_up:"Auflegen",snapshot:"Schnappschuss",mute_my_audio:"Mein Ton aus",pause_my_video:"Mein Video pausieren",fullscreen:"Vollbild",Info:"Info",Local_IP:"Lokale IP",Remote_IP:"Remote IP",Local_Fingerprint:"Lokaler Fingerprint",Remote_Fingerprint:"Remote Fingerprint",Video_call_not_possible:"Videoanruf nicht verfügbar. Dein Gesprächspartner unterstützt keine Videotelefonie.",Start_video_call:"Starte Videoanruf"}),$.extend(jsxc.l10n.es,{Please_allow_access_to_microphone_and_camera:"Por favor, permitir el acceso al micrófono y la cámara.",Incoming_call:"Llamada entrante",from:"de",Do_you_want_to_accept_the_call_from:"Desea aceptar la llamada de",Reject:"Rechazar",Accept:"Aceptar",hang_up:"colgar",snapshot:"instantánea",mute_my_audio:"silenciar mi audio",pause_my_video:"pausar mi vídeo",fullscreen:"pantalla completa",Info:"Info",Local_IP:"IP local",Remote_IP:"IP remota",Local_Fingerprint:"Firma digital local",Remote_Fingerprint:"Firma digital remota",Video_call_not_possible:"Llamada de vídeo no es posible",Start_video_call:"Iniciar llamada de vídeo"})}(jQuery);
+/*! This file is concatenated for the browser. */
+var jsxc=null,RTC=null,RTCPeerconnection=null;!function($){"use strict";jsxc={version:"2.0.0-beta1",master:!1,role_allocation:!1,to:null,toBusy:null,toNotification:null,toNotificationDelay:500,keepalive:null,restore:!1,restoreCompleted:!1,triggeredFromBox:!1,triggeredFromElement:!1,triggeredFromLogout:!1,ls:[],storageNotConform:null,toSNC:null,bid:null,CONST:{NOTIFICATION_DEFAULT:"default",NOTIFICATION_GRANTED:"granted",NOTIFICATION_DENIED:"denied",STATUS:["offline","dnd","xa","away","chat","online"],SOUNDS:{MSG:"incomingMessage.wav",CALL:"Rotary-Phone6.mp3",NOTICE:"Ping1.mp3"},REGEX:{JID:new RegExp("\\b[^\"&'\\/:<>@\\s]+@[\\w-_.]+\\b","ig"),URL:new RegExp(/((?:https?:\/\/|www\.|([\w\-]+\.[a-zA-Z]{2,3})(?=\b))(?:(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*\)([\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|])?)|(?:[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]))?)/gi)},NS:{CARBONS:"urn:xmpp:carbons:2",FORWARD:"urn:xmpp:forward:0"}},getFormattedTime:function(unixtime){var msgDate=new Date(parseInt(unixtime)),date=("0"+msgDate.getDate()).slice(-2),month=("0"+(msgDate.getMonth()+1)).slice(-2),year=msgDate.getFullYear(),hours=("0"+msgDate.getHours()).slice(-2),minutes=("0"+msgDate.getMinutes()).slice(-2),dateNow=new Date,time=hours+":"+minutes;return dateNow.setHours(0,0,0,0),msgDate.setHours(0,0,0,0),dateNow.getTime()!==msgDate.getTime()?date+"."+month+"."+year+" "+time:time},debug:function(msg,data,level){if(level&&(msg="["+level+"] "+msg),data){jsxc.storage.getItem("debug")===!0&&console.log(msg,data);var d;try{d=$("<span>").prepend($(data).clone()).html()}catch(err){try{d=JSON.stringify(data)}catch(err2){d="see js console"}}jsxc.log=jsxc.log+msg+": "+d+"\n"}else console.log(msg),jsxc.log=jsxc.log+msg+"\n"},warn:function(msg,data){jsxc.debug(msg,data,"WARN")},error:function(msg,data){jsxc.debug(msg,data,"ERROR")},log:"",init:function(options){options&&$.extend(!0,jsxc.options,options),jsxc.options.get=function(key){var local=jsxc.storage.getUserItem("options")||{};return local[key]||jsxc.options[key]},jsxc.options.set=function(key,value){jsxc.storage.updateItem("options",key,value,!0)},jsxc.storageNotConform=jsxc.storage.getItem("storageNotConform"),null===jsxc.storageNotConform&&(jsxc.storageNotConform=2);var lang;if(lang=null!==jsxc.storage.getItem("lang")?jsxc.storage.getItem("lang"):jsxc.options.autoLang&&navigator.language?navigator.language.substr(0,2):jsxc.options.defaultLang,$.i18n.init({lng:lang,fallbackLng:"en",resStore:I18next,useLocalStorage:!0,localStorageExpirationTime:864e5}),"undefined"==typeof localStorage)return void jsxc.debug("Browser doesn't support localStorage.");jsxc.storage.getItem("debug")===!0&&(jsxc.options.otr.debug=!0),window.addEventListener("storage",jsxc.storage.onStorage,!1);var lastActivity=jsxc.storage.getItem("lastActivity")||0;if((new Date).getTime()-lastActivity<jsxc.options.loginTimeout&&(jsxc.restore=!0),$(document).on("connectionReady.jsxc",function(){if(null!==jsxc.options.logoutElement&&jsxc.options.logoutElement.length>0){var logout=function(){return jsxc.options.logoutElement=$(this),jsxc.triggeredFromLogout=!0,jsxc.xmpp.logout()};jsxc.options.logoutElement.off("click",null,logout).one("click",logout)}}),jsxc.storage.getItem("rid")&&jsxc.storage.getItem("sid")&&jsxc.restore)jsxc.bid=jsxc.jidToBid(jsxc.storage.getItem("jid")),jsxc.gui.init(),"undefined"!=typeof jsxc.storage.getItem("alive")&&jsxc.restore?jsxc.checkMaster():jsxc.onMaster();else{if(!jsxc.options.loginForm.form||!(jsxc.el_exists(jsxc.options.loginForm.form)&&jsxc.el_exists(jsxc.options.loginForm.jid)&&jsxc.el_exists(jsxc.options.loginForm.pass)))return void(jsxc.options.displayRosterMinimized()&&(jsxc.storage.setUserItem("roster","hidden"),jsxc.gui.roster.init(),jsxc.gui.roster.noConnection()));"function"==typeof jsxc.options.formFound&&jsxc.options.formFound.call();var form=jsxc.options.loginForm.form=$(jsxc.options.loginForm.form),events=form.data("events")||{submit:[]},submits=[];$.each(events.submit,function(index,val){submits.push(val.handler)}),form.data("submits",submits),form.off("submit"),form.submit(function(){var settings=jsxc.prepareLogin();return settings===!1||"true"!==settings.xmpp.onlogin&&settings.xmpp.onlogin!==!0?!0:(jsxc.options.loginForm.triggered=!0,jsxc.xmpp.login(),!1)})}},prepareLogin:function(){var username=$(jsxc.options.loginForm.jid).val(),password=$(jsxc.options.loginForm.pass).val();if("function"!=typeof jsxc.options.loadSettings)return void jsxc.error("No loadSettings function given. Abort.");jsxc.gui.showWaitAlert($.t("Logging_in"));var settings=jsxc.options.loadSettings.call(this,username,password);if(settings===!1||null===settings||"undefined"==typeof settings)return jsxc.warn("No settings provided"),!1;"string"==typeof settings.xmpp.username&&(username=settings.xmpp.username);var jid,resource=settings.xmpp.resource?"/"+settings.xmpp.resource:"",domain=settings.xmpp.domain;return jid=username.match(/@(.*)$/)?username.match(/\/(.*)$/)?username:username+resource:username+"@"+domain+resource,"function"==typeof jsxc.options.loginForm.preJid&&(jid=jsxc.options.loginForm.preJid(jid)),jsxc.bid=jsxc.jidToBid(jid),settings.xmpp.username=jid.split("@")[0],settings.xmpp.domain=jid.split("@")[1].split("/")[0],settings.xmpp.resource=jid.split("@")[1].split("/")[1]||"",$.each(settings,function(key,val){jsxc.options.set(key,val)}),jsxc.options.xmpp.jid=jid,jsxc.options.xmpp.password=password,settings},onSlave:function(){jsxc.debug("I am the slave."),jsxc.role_allocation=!0,jsxc.restoreRoster(),jsxc.restoreWindows(),jsxc.restoreCompleted=!0,$(document).trigger("restoreCompleted.jsxc")},onMaster:function(){jsxc.debug("I am master."),jsxc.master=!0,jsxc.storage.setItem("alive",0),jsxc.storage.setItem("alive_busy",0),jsxc.storage.getUserItem("windowlist")||jsxc.storage.setUserItem("windowlist",[]),jsxc.startKeepAlive(),jsxc.options.get("otr").enable?jsxc.otr.createDSA():jsxc._onMaster()},_onMaster:function(){if(jsxc.role_allocation&&$.each(jsxc.storage.getUserItem("windowlist"),function(index,val){jsxc.otr.create(val)}),jsxc.role_allocation=!0,jsxc.restore&&!jsxc.restoreCompleted&&(jsxc.restoreRoster(),jsxc.restoreWindows(),jsxc.restoreCompleted=!0,$(document).trigger("restoreCompleted.jsxc")),jsxc.restore){var noti=jsxc.storage.getUserItem("notification");noti="number"==typeof noti?noti:2,jsxc.options.notification&&noti>0&&jsxc.notification.hasSupport()?jsxc.notification.hasPermission()?jsxc.notification.init():jsxc.notification.prepareRequest():jsxc.options.notification=!1}$(document).on("connectionReady.jsxc",function(){jsxc.gui.updateAvatar($("#jsxc_avatar"),jsxc.jidToBid(jsxc.storage.getItem("jid")),"own")}),jsxc.xmpp.login()},checkMaster:function(){jsxc.debug("check master"),jsxc.to=window.setTimeout(jsxc.onMaster,1e3),jsxc.storage.ink("alive")},startKeepAlive:function(){jsxc.keepalive=window.setInterval(jsxc.keepAlive,jsxc.options.timeout-1e3)},keepAlive:function(){jsxc.storage.ink("alive"),jsxc.role_allocation&&jsxc.storage.setItem("lastActivity",(new Date).getTime())},keepBusyAlive:function(){jsxc.toBusy&&window.clearTimeout(jsxc.toBusy),jsxc.keepalive&&window.clearInterval(jsxc.keepalive),jsxc.storage.ink("alive_busy"),jsxc.toBusy=window.setTimeout(jsxc.startKeepAlive,jsxc.options.busyTimeout-1e3)},random:function(max){return Math.floor(Math.random()*max)},el_exists:function(selector){return $(selector).length>0},jidToCid:function(jid){jsxc.warn("jsxc.jidToCid is deprecated!");var cid=Strophe.getBareJidFromJid(jid).replace("@","-").replace(/\./g,"-").toLowerCase();return cid},jidToBid:function(jid){return Strophe.getBareJidFromJid(jid).toLowerCase()},restoreRoster:function(){var buddies=jsxc.storage.getUserItem("buddylist");return buddies&&0!==buddies.length?($.each(buddies,function(index,value){jsxc.gui.roster.add(value)}),void $(document).trigger("cloaded.roster.jsxc")):(jsxc.debug("No saved buddylist."),void jsxc.gui.roster.empty())},restoreWindows:function(){var windows=jsxc.storage.getUserItem("windowlist");null!==windows&&$.each(windows,function(index,bid){var window=jsxc.storage.getUserItem("window",bid);return window?(jsxc.gui.window.init(bid),window.minimize?jsxc.gui.window.hide(bid):jsxc.gui.window.show(bid),void jsxc.gui.window.setText(bid,window.text)):(jsxc.debug("Associated window-element is missing: "+bid),!0)})},submitLoginForm:function(){var form=jsxc.options.loginForm.form.off("submit"),submits=form.data("submits")||[];$.each(submits,function(index,val){form.submit(val)}),form.find("#submit").length>0?form.find("#submit").click():form.submit()},escapeHTML:function(text){return text=text.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">"),text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},removeHTML:function(text){return $("<span>").html(text).text()},switchEvents:function(obj){var ns=Math.random().toString(36).substr(2,12),self=this;return $.each(obj,function(key,val){$(document).one(key+"."+ns,function(){$(document).off("."+ns),val.apply(self,arguments)})}),ns},isHidden:function(){var hidden=!1;return"undefined"!=typeof document.hidden?hidden=document.hidden:"undefined"!=typeof document.webkitHidden?hidden=document.webkitHidden:"undefined"!=typeof document.mozHidden?hidden=document.mozHidden:"undefined"!=typeof document.msHidden&&(hidden=document.msHidden),hidden&&jsxc.master?jsxc.storage.ink("hidden",0):hidden||jsxc.master||jsxc.storage.ink("hidden"),hidden},hasFocus:function(){var focus=!0;return"function"==typeof document.hasFocus&&(focus=document.hasFocus()),!focus&&jsxc.master?jsxc.storage.ink("focus",0):focus&&!jsxc.master&&jsxc.storage.ink("focus"),focus},exec:function(fnName,fnParams){var i,fnList=fnName.split("."),fn=jsxc[fnList[0]];for(i=1;i<fnList.length;i++)fn=fn[fnList[i]];return"function"==typeof fn?fn.apply(null,fnParams):void 0},hashStr:function(str){var i,hash=0;if(0===str.length)return hash;for(i=0;i<str.length;i++)hash=(hash<<5)-hash+str.charCodeAt(i),hash|=0;return hash}},jsxc.gui={emotions:[["O:-) O:)","angel"],[">:-( >:( &gt;:-( &gt;:(","angry"],[":-) :)","smile"],[":-D :D","grin"],[":-( :(","sad"],[";-) ;)","wink"],[":-P :P","tonguesmile"],["=-O","surprised"],[":kiss: :-*","kiss"],["8-) :cool:","sunglassess"],[":'-( :'( :&amp;apos;-(","crysad"],[":-/","doubt"],[":-X :X","zip"],[":yes:","thumbsup"],[":no:","thumbsdown"],[":beer:","beer"],[":devil:","devil"],[":kiss: :kissing:","kissing"],["@->-- :rose: @-&gt;--","rose"],[":music:","music"],[":love:","love"],[":zzz:","tired"]],queryActions:{message:function(jid,params){var win=jsxc.gui.window.open(jsxc.jidToBid(jid));params&&"string"==typeof params.body&&win.find(".jsxc_textinput").val(params.body)},remove:function(jid){jsxc.gui.showRemoveDialog(jsxc.jidToBid(jid))},subscribe:function(jid,params){jsxc.gui.showContactDialog(jid),params&&$("#jsxc_alias").val(params.name)},vcard:function(jid){jsxc.gui.showVcard(jid)}},init:function(){$("#jsxc_windowList").length>0||($("body").append($(jsxc.gui.template.get("windowList"))),$(window).resize(jsxc.gui.updateWindowListSB),$("#jsxc_windowList").resize(jsxc.gui.updateWindowListSB),$("#jsxc_windowListSB .jsxc_scrollLeft").click(function(){jsxc.gui.scrollWindowListBy(-200)}),$("#jsxc_windowListSB .jsxc_scrollRight").click(function(){jsxc.gui.scrollWindowListBy(200)}),$("#jsxc_windowList").on("wheel",function(ev){$("#jsxc_windowList").data("isOver")&&jsxc.gui.scrollWindowListBy(ev.originalEvent.wheelDelta>0?200:-200)}),jsxc.gui.tooltip("#jsxc_windowList"),jsxc.el_exists("#jsxc_roster")||jsxc.gui.roster.init(),$.each(jsxc.gui.emotions,function(i,val){var reg=val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g,"\\$1");reg="("+reg.split(" ").join("|")+")",jsxc.gui.emotions[i][2]=new RegExp(reg,"g")}),jsxc.gui.windowTemplate=$(jsxc.gui.template.get("chatWindow")),jsxc.gui.buddyTemplate=$(jsxc.gui.template.get("rosterBuddy")))},tooltip:function(selector){$(selector).tooltip({show:{delay:600},content:function(){return $(this).attr("title").replace(/\n/g,"<br />")}})},update:function(bid){var data=jsxc.storage.getUserItem("buddy",bid);if(!data)return void jsxc.debug("No data for "+bid);var ri=jsxc.gui.roster.getItem(bid),we=jsxc.gui.window.get(bid),ue=ri.add(we),spot=$('.jsxc_spot[data-bid="'+bid+'"]');switch(ri.data(data),ue.add(spot).removeClass("jsxc_"+jsxc.CONST.STATUS.join(" jsxc_")).addClass("jsxc_"+jsxc.CONST.STATUS[data.status]),ue.find(".jsxc_name:first").add(spot).text(data.name).attr("title",$.t("is")+" "+jsxc.CONST.STATUS[data.status]),data.msgstate){case 0:we.find(".jsxc_transfer").removeClass("jsxc_enc jsxc_fin").attr("title",$.t("your_connection_is_unencrypted")),we.find(".jsxc_settings .jsxc_verification").addClass("jsxc_disabled"),we.find(".jsxc_settings .jsxc_transfer").text($.t("start_private"));break;case 1:we.find(".jsxc_transfer").addClass("jsxc_enc").attr("title",$.t("your_connection_is_encrypted")),we.find(".jsxc_settings .jsxc_verification").removeClass("jsxc_disabled"),we.find(".jsxc_settings .jsxc_transfer").text($.t("close_private"));break;case 2:we.find(".jsxc_settings .jsxc_verification").addClass("jsxc_disabled"),we.find(".jsxc_transfer").removeClass("jsxc_enc").addClass("jsxc_fin").attr("title",$.t("your_buddy_closed_the_private_connection")),we.find(".jsxc_settings .jsxc_transfer").text($.t("close_private"))}data.trust?we.find(".jsxc_transfer").addClass("jsxc_trust").attr("title",$.t("your_buddy_is_verificated")):we.find(".jsxc_transfer").removeClass("jsxc_trust"),data.sub&&"both"!==data.sub?ue.addClass("jsxc_oneway"):ue.removeClass("jsxc_oneway");var info="<b>"+Strophe.getBareJidFromJid(data.jid)+"</b>\n";info+=$.t("Subscription")+": "+$.t(data.sub)+"\n",info+=$.t("Status")+": "+$.t(jsxc.CONST.STATUS[data.status]),ri.find(".jsxc_name").attr("title",info),jsxc.gui.updateAvatar(ri.add(we.find(".jsxc_bar")),data.jid,data.avatar)},updateAvatar:function(el,jid,aid){var setAvatar=function(src){return 0===src||"0"===src?"function"==typeof jsxc.options.defaultAvatar?void jsxc.options.defaultAvatar.call(el,jid):void jsxc.gui.avatarPlaceholder(el.find(".jsxc_avatar"),jid):(el.find(".jsxc_avatar").removeAttr("style"),void el.find(".jsxc_avatar").css({"background-image":"url("+src+")","text-indent":"999px"}))};if("undefined"==typeof aid)return void setAvatar(0);var avatarSrc=jsxc.storage.getUserItem("avatar",aid);null!==avatarSrc?setAvatar(avatarSrc):jsxc.xmpp.conn.vcard.get(function(stanza){jsxc.debug("vCard",stanza);var src,vCard=$(stanza).find("vCard > PHOTO");if(0===vCard.length)jsxc.debug("No photo provided"),src="0";else if(vCard.find("EXTVAL").length>0)src=vCard.find("EXTVAL").text();else{var img=vCard.find("BINVAL").text(),type=vCard.find("TYPE").text();src="data:"+type+";base64,"+img}src=src.replace(/[\t\r\n\f]/gi,""),jsxc.storage.setUserItem("avatar",aid,src),setAvatar(src)},Strophe.getBareJidFromJid(jid),function(msg){jsxc.warn("Could not load vcard.",msg),jsxc.storage.setUserItem("avatar",aid,0),setAvatar(0)})},updateWindowListSB:function(){$("#jsxc_windowList>ul").width()>$("#jsxc_windowList").width()?$("#jsxc_windowListSB > div").removeClass("jsxc_disabled"):($("#jsxc_windowListSB > div").addClass("jsxc_disabled"),$("#jsxc_windowList>ul").css("right","0px"))},scrollWindowListBy:function(offset){var scrollWidth=$("#jsxc_windowList>ul").width(),width=$("#jsxc_windowList").width(),el=$("#jsxc_windowList>ul"),right=parseInt(el.css("right"))-offset,padding=$("#jsxc_windowListSB").width();width>scrollWidth||(right>0&&(right=0),width-scrollWidth-padding>right&&(right=width-scrollWidth-padding),el.css("right",right+"px"))},getWindow:function(bid){return jsxc.warn("jsxc.gui.getWindow is deprecated!"),jsxc.gui.window.get(bid)},toggleList:function(){var self=$(this);self.disableSelection();var ul=self.find("ul"),slideUp=null;slideUp=function(){ul.slideUp({complete:function(){self.removeClass("jsxc_opened")}}),$("body").off("click",null,slideUp)},$(this).click(function(){return ul.is(":hidden")?($("body").click(),$("body").one("click",slideUp)):$("body").off("click",null,slideUp),ul.slideToggle(),window.clearTimeout(ul.data("timer")),self.toggleClass("jsxc_opened"),!1}).mouseleave(function(){ul.data("timer",window.setTimeout(slideUp,2e3))}).mouseenter(function(){window.clearTimeout(ul.data("timer"))})},showLoginBox:function(){$(document).on("complete.dialog.jsxc",function(){$("#jsxc_password").focus()}),jsxc.gui.dialog.open(jsxc.gui.template.get("loginBox")),$("#jsxc_dialog").find("form").submit(function(){$(this).find("input[type=submit]").prop("disabled",!0),jsxc.options.loginForm.form=$(this),jsxc.options.loginForm.jid=$(this).find("#jsxc_username"),jsxc.options.loginForm.pass=$(this).find("#jsxc_password");var settings=jsxc.prepareLogin();return jsxc.triggeredFromBox=!0,jsxc.options.loginForm.triggered=!1,settings===!1?jsxc.gui.showAuthFail():jsxc.xmpp.login(),!1})},showFingerprints:function(bid){jsxc.gui.dialog.open(jsxc.gui.template.get("fingerprintsDialog",bid))},showVerification:function(bid){return $("#jsxc_dialog").length>0?void setTimeout(function(){jsxc.gui.showVerification(bid)},3e3):jsxc.storage.getUserItem("buddy",bid).msgstate!==OTR.CONST.MSGSTATE_ENCRYPTED?void jsxc.warn("Connection not encrypted"):(jsxc.gui.dialog.open(jsxc.gui.template.get("authenticationDialog",bid)),$("#jsxc_dialog > div:gt(0)").hide(),$("#jsxc_dialog select").change(function(){$("#jsxc_dialog > div:gt(0)").hide(),$("#jsxc_dialog > div:eq("+$(this).prop("selectedIndex")+")").slideDown({complete:function(){jsxc.gui.dialog.resize()}})}),$("#jsxc_dialog > div:eq(1) a.creation").click(function(){jsxc.master&&(jsxc.otr.objects[bid].trust=!0),jsxc.storage.updateUserItem("buddy",bid,"trust",!0),jsxc.gui.dialog.close(),jsxc.storage.updateUserItem("buddy",bid,"trust",!0),jsxc.gui.window.postMessage(bid,"sys",$.t("conversation_is_now_verified")),jsxc.gui.update(bid)}),$("#jsxc_dialog > div:eq(2) a.creation").click(function(){var div=$("#jsxc_dialog > div:eq(2)"),sec=div.find("#jsxc_secret2").val(),quest=div.find("#jsxc_quest").val();return""===sec||""===quest?void div.find('input[value=""]').addClass("jsxc_invalid").keyup(function(){$(this).val().match(/.*/)&&$(this).removeClass("jsxc_invalid")}):(jsxc.master?jsxc.otr.sendSmpReq(bid,sec,quest):jsxc.storage.setUserItem("smp_"+bid,{sec:sec,quest:quest}),jsxc.gui.dialog.close(),void jsxc.gui.window.postMessage(bid,"sys",$.t("authentication_query_sent")))}),void $("#jsxc_dialog > div:eq(3) .creation").click(function(){var div=$("#jsxc_dialog > div:eq(3)"),sec=div.find("#jsxc_secret").val();return""===sec?void div.find("#jsxc_secret").addClass("jsxc_invalid").keyup(function(){$(this).val().match(/.*/)&&$(this).removeClass("jsxc_invalid")}):(jsxc.master?jsxc.otr.sendSmpReq(bid,sec):jsxc.storage.setUserItem("smp_"+bid,{sec:sec,quest:null}),jsxc.gui.dialog.close(),void jsxc.gui.window.postMessage(bid,"sys",$.t("authentication_query_sent")))}))},showApproveDialog:function(from){jsxc.gui.dialog.open(jsxc.gui.template.get("approveDialog"),{noClose:!0}),$("#jsxc_dialog .jsxc_their_jid").text(Strophe.getBareJidFromJid(from)),$("#jsxc_dialog .jsxc_deny").click(function(ev){ev.stopPropagation(),jsxc.xmpp.resFriendReq(from,!1),jsxc.gui.dialog.close()}),$("#jsxc_dialog .jsxc_approve").click(function(ev){ev.stopPropagation();var data=jsxc.storage.getUserItem("buddy",jsxc.jidToBid(from));jsxc.xmpp.resFriendReq(from,!0),data&&"from"!==data.sub||$(document).one("close.dialog.jsxc",function(){jsxc.gui.showContactDialog(from)}),jsxc.gui.dialog.close()})},showContactDialog:function(username){jsxc.gui.dialog.open(jsxc.gui.template.get("contactDialog")),username&&$("#jsxc_username").val(username),$("#jsxc_username").keyup(function(){if("function"==typeof jsxc.options.getUsers){var val=$(this).val();$("#jsxc_userlist").empty(),""!==val&&jsxc.options.getUsers.call(this,val,function(list){$.each(list||{},function(uid,displayname){var option=$("<option>");option.attr("data-username",uid),option.attr("data-alias",displayname),option.attr("value",uid).appendTo("#jsxc_userlist"),uid!==displayname&&option.clone().attr("value",displayname).appendTo("#jsxc_userlist")})})}}),$("#jsxc_username").on("input",function(){var val=$(this).val(),option=$("#jsxc_userlist").find('option[data-username="'+val+'"], option[data-alias="'+val+'"]');option.length>0&&($("#jsxc_username").val(option.attr("data-username")),$("#jsxc_alias").val(option.attr("data-alias")))}),$("#jsxc_dialog form").submit(function(){var username=$("#jsxc_username").val(),alias=$("#jsxc_alias").val();return username.match(/@(.*)$/)||(username+="@"+Strophe.getDomainFromJid(jsxc.storage.getItem("jid"))),username&&username.match(jsxc.CONST.REGEX.JID)?(jsxc.xmpp.addBuddy(username,alias),jsxc.gui.dialog.close(),!1):($("#jsxc_username").addClass("jsxc_invalid").keyup(function(){$(this).val().match(jsxc.CONST.REGEX.JID)&&$(this).removeClass("jsxc_invalid")}),!1)})},showRemoveDialog:function(bid){jsxc.gui.dialog.open(jsxc.gui.template.get("removeDialog",bid));var data=jsxc.storage.getUserItem("buddy",bid);$("#jsxc_dialog .creation").click(function(ev){ev.stopPropagation(),jsxc.master?jsxc.xmpp.removeBuddy(data.jid):jsxc.storage.setUserItem("deletebuddy",bid,{jid:data.jid}),jsxc.gui.dialog.close()})},showWaitAlert:function(msg){jsxc.gui.dialog.open(jsxc.gui.template.get("waitAlert",null,msg),{noClose:!0})},showAlert:function(msg){jsxc.gui.dialog.open(jsxc.gui.template.get("alert",null,msg))},showAuthFail:function(){jsxc.gui.dialog.open(jsxc.gui.template.get("authFailDialog")),jsxc.options.loginForm.triggered!==!1&&$("#jsxc_dialog .jsxc_cancel").hide(),$("#jsxc_dialog .creation").click(function(){jsxc.gui.dialog.close()}),$("#jsxc_dialog .jsxc_cancel").click(function(){jsxc.submitLoginForm()})},showConfirmDialog:function(msg,confirm,dismiss){jsxc.gui.dialog.open(jsxc.gui.template.get("confirmDialog",null,msg),{noClose:!0}),confirm&&$("#jsxc_dialog .creation").click(confirm),dismiss&&$("#jsxc_dialog .jsxc_cancel").click(dismiss)},showAboutDialog:function(){jsxc.gui.dialog.open(jsxc.gui.template.get("aboutDialog")),$("#jsxc_dialog .jsxc_debuglog").click(function(){jsxc.gui.showDebugLog()})},showDebugLog:function(){var userInfo="<h3>User information</h3>";if(navigator){var key;for(key in navigator)navigator.hasOwnProperty(key)&&"string"==typeof navigator[key]&&(userInfo+="<b>"+key+":</b> "+navigator[key]+"<br />")}window.screen&&(userInfo+="<b>Height:</b> "+window.screen.height+"<br />",userInfo+="<b>Width:</b> "+window.screen.width+"<br />"),userInfo+="<b>jsxc version:</b> "+jsxc.version+"<br />",jsxc.gui.dialog.open('<div class="jsxc_log">'+userInfo+"<h3>Log</h3><pre>"+jsxc.escapeHTML(jsxc.log)+"</pre></div>")},showVcard:function(jid){var bid=jsxc.jidToBid(jid);jsxc.gui.dialog.open(jsxc.gui.template.get("vCard",bid));var data=jsxc.storage.getUserItem("buddy",bid);if(data){var i,j,res,identities,cap,client,identity=null;for(i=0;i<data.res.length;i++){for(res=data.res[i],identities=[],cap=jsxc.xmpp.getCapabilitiesByJid(bid+"/"+res),null!==cap&&null!==cap.identities&&(identities=cap.identities),client="",j=0;j<identities.length;j++)identity=identities[j],"client"===identity.category&&(""!==client&&(client+=",\n"),client+=identity.name+" ("+identity.type+")");var status=jsxc.storage.getUserItem("res",bid)[res];$("#jsxc_dialog ul.jsxc_vCard").append('<li class="jsxc_sep"><strong>'+$.t("Resource")+":</strong> "+res+"</li>"),$("#jsxc_dialog ul.jsxc_vCard").append("<li><strong>"+$.t("Client")+":</strong> "+client+"</li>"),$("#jsxc_dialog ul.jsxc_vCard").append("<li><strong>"+$.t("Status")+":</strong> "+$.t(jsxc.CONST.STATUS[status])+"</li>")}}var printProp=function(el,depth){var content="";return el.each(function(){var item=$(this),children=$(this).children();content+="<li>";var prop=$.t(item[0].tagName);" "!==prop&&(content+="<strong>"+prop+":</strong> "),"PHOTO"===item[0].tagName||(children.length>0?(content+="<ul>",content+=printProp(children,depth+1),content+="</ul>"):""!==item.text()&&(content+=jsxc.escapeHTML(item.text()))),content+="</li>",0===depth&&$("#jsxc_dialog ul.jsxc_vCard").length>0&&($("#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first").length>0?$("#jsxc_dialog ul.jsxc_vCard li.jsxc_sep:first").before(content):$("#jsxc_dialog ul.jsxc_vCard").append(content),content="")}),depth>0?content:void 0},failedToLoad=function(){if(0!==$("#jsxc_dialog ul.jsxc_vCard").length){$("#jsxc_dialog p").remove();var content="<p>";content+=$.t("Sorry_your_buddy_doesnt_provide_any_information"),content+="</p>",$("#jsxc_dialog").append(content)}};jsxc.xmpp.loadVcard(bid,function(stanza){if(0!==$("#jsxc_dialog ul.jsxc_vCard").length){$("#jsxc_dialog p").remove();var photo=$(stanza).find("vCard > PHOTO");if(photo.length>0){var img=photo.find("BINVAL").text(),type=photo.find("TYPE").text(),src="data:"+type+";base64,"+img;photo.find("EXTVAL").length>0&&(src=photo.find("EXTVAL").text()),src=src.replace(/[\t\r\n\f]/gi,"");var img_el=$('<img class="jsxc_vCard" alt="avatar" />');img_el.attr("src",src),$("#jsxc_dialog h3").before(img_el)}return 0===$(stanza).find("vCard").length||1===$(stanza).find("vcard > *").length&&1===photo.length?void failedToLoad():void printProp($(stanza).find("vcard > *"),0)}},failedToLoad)},showSettings:function(){jsxc.gui.dialog.open(jsxc.gui.template.get("settings")),("false"===jsxc.options.get("xmpp").overwrite||jsxc.options.get("xmpp").overwrite===!1)&&$(".jsxc_fieldsetXmpp").hide(),$("#jsxc_dialog form").each(function(){var self=$(this);self.find('input[type!="submit"]').each(function(){var id=this.id.split("-"),prop=id[0],key=id[1],type=this.type,data=jsxc.options.get(prop);data&&"undefined"!=typeof data[key]&&("checkbox"===type?"false"!==data[key]&&data[key]!==!1&&(this.checked="checked"):$(this).val(data[key]))})}),$("#jsxc_dialog form").submit(function(){var self=$(this),data={};self.find('input[type!="submit"]').each(function(){var val,id=this.id.split("-"),prop=id[0],key=id[1],type=this.type;val="checkbox"===type?this.checked:$(this).val(),data[prop]||(data[prop]={}),data[prop][key]=val}),$.each(data,function(key,val){jsxc.options.set(key,val)});var err=jsxc.options.saveSettinsPermanent.call(this,data);return"string"==typeof self.attr("data-onsubmit")&&jsxc.exec(self.attr("data-onsubmit"),[err]),setTimeout(function(){self.find('input[type="submit"]').effect("highlight",{color:err?"green":"red"},4e3)},200),!1})},showRequestNotification:function(){jsxc.switchEvents({"notificationready.jsxc":function(){jsxc.gui.dialog.close(),jsxc.notification.init(),jsxc.storage.setUserItem("notification",1)},"notificationfailure.jsxc":function(){jsxc.gui.dialog.close(),jsxc.options.notification=!1,jsxc.storage.setUserItem("notification",0)}}),jsxc.gui.showConfirmDialog($.t("Should_we_notify_you_"),function(){jsxc.gui.dialog.open(jsxc.gui.template.get("pleaseAccept"),{noClose:!0}),jsxc.notification.requestPermission()},function(){$(document).trigger("notificationfailure.jsxc")})},showUnknownSender:function(bid){var confirmationText=$.t("You_received_a_message_from_an_unknown_sender")+" ("+bid+"). "+$.t("Do_you_want_to_display_them");jsxc.gui.showConfirmDialog(confirmationText,function(){jsxc.gui.dialog.close(),jsxc.storage.saveBuddy(bid,{jid:bid,name:bid,status:0,sub:"none",res:[]}),jsxc.gui.window.open(bid)},function(){jsxc.storage.removeUserItem("chat",bid)})},changePresence:function(pres,external){external!==!0&&jsxc.storage.setUserItem("presence",pres),jsxc.master&&jsxc.xmpp.sendPres(),$("#jsxc_presence > span").text($("#jsxc_presence > ul .jsxc_"+pres).text()),jsxc.gui.updatePresence("own",pres)},updatePresence:function(bid,pres){"own"===bid&&("dnd"===pres?($("#jsxc_menu .jsxc_muteNotification").addClass("jsxc_disabled"),jsxc.notification.muteSound(!0)):($("#jsxc_menu .jsxc_muteNotification").removeClass("jsxc_disabled"),jsxc.options.get("muteNotification")||jsxc.notification.unmuteSound(!0))),$('.jsxc_presence[data-bid="'+bid+'"]').removeClass("jsxc_"+jsxc.CONST.STATUS.join(" jsxc_")).addClass("jsxc_"+pres)},unreadMsg:function(bid){var win=jsxc.gui.window.get(bid);jsxc.gui.roster.getItem(bid).add(win).addClass("jsxc_unreadMsg"),jsxc.storage.updateUserItem("window",bid,"unread",!0)},readMsg:function(bid){var win=jsxc.gui.window.get(bid);win.hasClass("jsxc_unreadMsg")&&(jsxc.gui.roster.getItem(bid).add(win).removeClass("jsxc_unreadMsg"),jsxc.storage.updateUserItem("window",bid,"unread",!1))},detectUriScheme:function(container){container=$(container?container:"body"),container.find("a[href^='xmpp:']").each(function(){var action,element=$(this),href=element.attr("href").replace(/^xmpp:/,""),jid=href.split("?")[0],params={};if(href.indexOf("?")<0)action="message";else{var pairs=href.substring(href.indexOf("?")+1).split(";");action=pairs[0];var i,key,value;for(i=1;i<pairs.length;i++)key=pairs[i].split("=")[0],value=pairs[i].indexOf("=")>0?pairs[i].substring(pairs[i].indexOf("=")+1):null,params[decodeURIComponent(key)]=decodeURIComponent(value)}"function"==typeof jsxc.gui.queryActions[action]&&(element.addClass("jsxc_uriScheme jsxc_uriScheme_"+action),element.off("click").click(function(ev){return ev.stopPropagation(),jsxc.gui.queryActions[action].call(jsxc,jid,params),!1}))})},detectEmail:function(container){container=$(container?container:"body"),container.find('a[href^="mailto:"]').each(function(){var spot=$("<span>X</span>").addClass("jsxc_spot"),href=$(this).attr("href").replace(/^ *mailto:/,"").trim();if(""!==href&&href!==Strophe.getBareJidFromJid(jsxc.storage.getItem("jid"))){var bid=jsxc.jidToBid(href),self=$(this),s=self.prev();s.hasClass("jsxc_spot")||(s=spot.clone().attr("data-bid",bid),self.before(s)),s.off("click"),jsxc.storage.getUserItem("buddy",bid)?(jsxc.gui.update(bid),s.click(function(){return jsxc.gui.window.open(bid),!1})):s.click(function(){return jsxc.gui.showContactDialog(href),!1})}})},avatarPlaceholder:function(el,seed,text){text=text||seed;var options=jsxc.options.get("avatarplaceholder")||{},hash=jsxc.hashStr(seed),hue=Math.abs(hash)%360,saturation=options.saturation||90,lightness=options.lightness||65;el.css({"background-color":"hsl("+hue+", "+saturation+"%, "+lightness+"%)",color:"#fff","font-weight":"bold","text-align":"center","line-height":el.height()+"px","font-size":.6*el.height()+"px"}),"string"==typeof text&&text.length>0&&el.text(text[0].toUpperCase())}},jsxc.gui.roster={ready:!1,init:function(){$(jsxc.options.rosterAppend+":first").append($(jsxc.gui.template.get("roster"))),jsxc.options.get("hideOffline")&&($("#jsxc_menu .jsxc_hideOffline").text($.t("Show_offline")),$("#jsxc_buddylist").addClass("jsxc_hideOffline")),$("#jsxc_menu .jsxc_settings").click(function(){jsxc.gui.showSettings()}),$("#jsxc_menu .jsxc_hideOffline").click(function(){var hideOffline=!jsxc.options.get("hideOffline");hideOffline?$("#jsxc_buddylist").addClass("jsxc_hideOffline"):$("#jsxc_buddylist").removeClass("jsxc_hideOffline"),$(this).text($.t(hideOffline?"Show_offline":"Hide_offline")),jsxc.options.set("hideOffline",hideOffline)}),jsxc.options.get("muteNotification")&&jsxc.notification.muteSound(),$("#jsxc_menu .jsxc_muteNotification").click(function(){if("dnd"!==jsxc.storage.getUserItem("presence")){var mute=!jsxc.options.get("muteNotification");mute?jsxc.notification.muteSound():jsxc.notification.unmuteSound()}}),$("#jsxc_roster .jsxc_addBuddy").click(function(){jsxc.gui.showContactDialog()}),$("#jsxc_roster .jsxc_onlineHelp").click(function(){window.open("http://www.jsxc.org/manual.html","onlineHelp")}),$("#jsxc_roster .jsxc_about").click(function(){jsxc.gui.showAboutDialog()}),$("#jsxc_toggleRoster").click(function(){jsxc.gui.roster.toggle()}),$("#jsxc_presence > ul > li").click(function(){var self=$(this),pres=self.data("pres");"offline"===pres?jsxc.xmpp.logout(!1):jsxc.gui.changePresence(pres)}),$("#jsxc_buddylist").slimScroll({distance:"3px",height:$("#jsxc_roster").height()-31+"px",width:$("#jsxc_buddylist").width()+"px",color:"#fff",opacity:"0.5"}),$("#jsxc_roster > .jsxc_bottom > div").each(function(){jsxc.gui.toggleList.call($(this))}),"hidden"===jsxc.storage.getUserItem("roster")&&($("#jsxc_roster").css("right","-200px"),$("#jsxc_windowList > ul").css("paddingRight","10px"));
+var pres=jsxc.storage.getUserItem("presence")||"online";$("#jsxc_presence > span").text($("#jsxc_presence > ul .jsxc_"+pres).text()),jsxc.gui.updatePresence("own",pres),jsxc.gui.tooltip("#jsxc_roster"),jsxc.notice.load(),jsxc.gui.roster.ready=!0,$(document).trigger("ready.roster.jsxc")},add:function(bid){var data=jsxc.storage.getUserItem("buddy",bid),bud=jsxc.gui.buddyTemplate.clone().attr("data-bid",bid).attr("data-type",data.type||"chat");jsxc.gui.roster.insert(bid,bud),bud.click(function(){jsxc.gui.window.open(bid)}),bud.find(".jsxc_chaticon").click(function(){jsxc.gui.window.open(bid)}),bud.find(".jsxc_rename").click(function(){return jsxc.gui.roster.rename(bid),!1}),bud.find(".jsxc_delete").click(function(){return jsxc.gui.showRemoveDialog(bid),!1});var expandClick=function(){return bud.trigger("extra.jsxc"),bud.toggleClass("jsxc_expand"),jsxc.gui.updateAvatar(bud,data.jid,data.avatar),!1};bud.find(".jsxc_control").click(expandClick),bud.dblclick(expandClick),bud.find(".jsxc_vcardicon").click(function(){return jsxc.gui.showVcard(data.jid),!1}),jsxc.gui.update(bid),$("#jsxc_buddylist").slimScroll({scrollTo:"0px"}),$(document).trigger("add.roster.jsxc",[bid,data,bud])},getItem:function(bid){return $("#jsxc_buddylist > li[data-bid='"+bid+"']")},insert:function(bid,li){var data=jsxc.storage.getUserItem("buddy",bid),listElements=$("#jsxc_buddylist > li"),insert=!1,status="both"===data.sub?data.status:-1;listElements.each(function(){var thisStatus="both"===$(this).data("sub")?$(this).data("status"):-1;return $(this).data("name").toLowerCase()>data.name.toLowerCase()&&thisStatus===status||status>thisStatus?($(this).before(li),insert=!0,!1):void 0}),insert||li.appendTo("#jsxc_buddylist")},reorder:function(bid){jsxc.gui.roster.insert(bid,jsxc.gui.roster.remove(bid))},remove:function(bid){return jsxc.gui.roster.getItem(bid).detach()},purge:function(bid){jsxc.master&&(jsxc.storage.removeUserItem("buddy",bid),jsxc.storage.removeUserItem("otr",bid),jsxc.storage.removeUserItem("otr_version_"+bid),jsxc.storage.removeUserItem("chat",bid),jsxc.storage.removeUserItem("window",bid),jsxc.storage.removeUserElement("buddylist",bid),jsxc.storage.removeUserElement("windowlist",bid)),jsxc.gui.window._close(bid),jsxc.gui.roster.remove(bid)},rename:function(bid){var name=jsxc.gui.roster.getItem(bid).find(".jsxc_name"),options=jsxc.gui.roster.getItem(bid).find(".jsxc_options, .jsxc_control"),input=$('<input type="text" name="name"/>');options.hide(),name=name.replaceWith(input),input.val(name.text()),input.keypress(function(ev){13===ev.which&&(options.show(),input.replaceWith(name),jsxc.gui.roster._rename(bid,$(this).val()),$("html").off("click"))}),input.click(function(){return!1}),$("html").one("click",function(){options.show(),input.replaceWith(name),jsxc.gui.roster._rename(bid,input.val())})},_rename:function(bid,newname){if(jsxc.master){var d=jsxc.storage.getUserItem("buddy",bid);if("chat"===d.type){var iq=$iq({type:"set"}).c("query",{xmlns:"jabber:iq:roster"}).c("item",{jid:Strophe.getBareJidFromJid(d.jid),name:newname});jsxc.xmpp.conn.sendIQ(iq)}}jsxc.storage.updateUserItem("buddy",bid,"name",newname),jsxc.gui.update(bid)},toggle:function(d){var duration=d||500,roster=$("#jsxc_roster"),wl=$("#jsxc_windowList"),roster_width=roster.innerWidth(),roster_right=parseFloat($("#jsxc_roster").css("right")),state=0>roster_right?"shown":"hidden";jsxc.storage.setUserItem("roster",state),roster.animate({right:-1*(roster_width+roster_right)+"px"},duration),wl.animate({right:10-roster_right+"px"},duration),$(document).trigger("toggle.roster.jsxc",[state,duration])},noConnection:function(){$("#jsxc_roster").addClass("jsxc_noConnection"),$("#jsxc_buddylist").empty(),$("#jsxc_roster").append($("<p>"+$.t("no_connection")+"</p>").append(" <a>"+$.t("relogin")+"</a>").click(function(){jsxc.gui.showLoginBox()}))},empty:function(){var text=$("<p>"+$.t("Your_roster_is_empty_add_a")+"</p>"),link=$("<a>"+$.t("new_buddy")+"</a>");link.click(function(){jsxc.gui.showContactDialog()}),text.append(link),text.append("."),$("#jsxc_roster").prepend(text)}},jsxc.gui.dialog={open:function(data,o){var opt=o||{},options={};return options={onComplete:function(){$("#jsxc_dialog .jsxc_close").click(function(ev){ev.preventDefault(),jsxc.gui.dialog.close()}),options.closeButton===!1&&$("#cboxClose").hide(),jsxc.gui.dialog.resize(),$(document).trigger("complete.dialog.jsxc")},onClosed:function(){$(document).trigger("close.dialog.jsxc")},onCleanup:function(){$(document).trigger("cleanup.dialog.jsxc")},opacity:.5},opt.noClose&&(options.overlayClose=!1,options.escKey=!1,options.closeButton=!1,delete opt.noClose),$.extend(options,opt),options.html='<div id="jsxc_dialog">'+data+"</div>",$.colorbox(options),$("#jsxc_dialog")},close:function(){jsxc.debug("close dialog"),$.colorbox.close()},resize:function(options){options=$.extend({innerWidth:$("#jsxc_dialog").outerWidth(),innerHeight:$("#jsxc_dialog").outerHeight()},options||{}),$("#cboxLoadedContent").css("overflow","hidden"),$.colorbox.resize(options)}},jsxc.gui.window={init:function(bid){if(jsxc.gui.window.get(bid).length>0)return jsxc.gui.window.get(bid);var win=jsxc.gui.windowTemplate.clone().attr("data-bid",bid).hide().appendTo("#jsxc_windowList > ul").show("slow"),data=jsxc.storage.getUserItem("buddy",bid);if(win.data("jid",data.jid),jsxc.gui.toggleList.call(win.find(".jsxc_settings")),win.find(".jsxc_verification").click(function(){jsxc.gui.showVerification(bid)}),win.find(".jsxc_fingerprints").click(function(){jsxc.gui.showFingerprints(bid)}),win.find(".jsxc_transfer").click(function(){jsxc.otr.toggleTransfer(bid)}),win.find(".jsxc_bar").click(function(){jsxc.gui.window.toggle(bid)}),win.find(".jsxc_close").click(function(){jsxc.gui.window.close(bid)}),win.find(".jsxc_clear").click(function(){jsxc.gui.window.clear(bid)}),win.find(".jsxc_tools").click(function(){return!1}),win.find(".jsxc_textinput").keyup(function(ev){var body=$(this).val();13===ev.which&&(body=""),jsxc.storage.updateUserItem("window",bid,"text",body),27===ev.which&&jsxc.gui.window.close(bid)}).keypress(function(ev){13===ev.which&&$(this).val()&&(jsxc.gui.window.postMessage(bid,"out",$(this).val()),$(this).val(""))}).focus(function(){jsxc.gui.readMsg(bid)}).mouseenter(function(){$("#jsxc_windowList").data("isOver",!0)}).mouseleave(function(){$("#jsxc_windowList").data("isOver",!1)}),win.find(".jsxc_textarea").click(function(){"function"!=typeof getSelection||getSelection().toString()||win.find(".jsxc_textinput").focus()}),win.find(".jsxc_textarea").slimScroll({height:"234px",distance:"3px"}),win.find(".jsxc_fade").hide(),win.find(".jsxc_name").disableSelection(),win.find(".slimScrollDiv").resizable({handles:"w, nw, n",minHeight:234,minWidth:250,resize:function(event,ui){win.width(ui.size.width),win.find(".jsxc_textarea").slimScroll({height:ui.size.height});var offset=win.find(".slimScrollDiv").position().top;win.find(".jsxc_emoticons").css("top",ui.size.height+offset+6+"px"),$(document).trigger("resize.window.jsxc",[win,bid,ui.size])}}),$.inArray(bid,jsxc.storage.getUserItem("windowlist"))<0){var wl=jsxc.storage.getUserItem("windowlist");wl.push(bid),jsxc.storage.setUserItem("windowlist",wl),jsxc.storage.setUserItem("window",bid,{minimize:!0,text:"",unread:!1})}else jsxc.storage.getUserItem("window",bid).unread&&jsxc.gui.unreadMsg(bid);return $.each(jsxc.gui.emotions,function(i,val){var ins=val[0].split(" ")[0],li=$('<li><div title="'+ins+'" class="jsxc_'+val[1]+'"/></li>');li.click(function(){win.find("input").val(win.find("input").val()+ins),win.find("input").focus()}),win.find(".jsxc_emoticons ul").append(li)}),jsxc.gui.toggleList.call(win.find(".jsxc_emoticons")),jsxc.gui.window.restoreChat(bid),jsxc.gui.update(bid),jsxc.gui.updateWindowListSB(),jsxc.master&&!jsxc.otr.objects[bid]?jsxc.otr.create(bid):jsxc.otr.enable(bid),$(document).trigger("init.window.jsxc",[win]),win},get:function(id){return $("li.jsxc_windowItem[data-bid='"+jsxc.jidToBid(id)+"']")},open:function(bid){var win=jsxc.gui.window.init(bid);jsxc.gui.window.show(bid),jsxc.gui.window.highlight(bid);var padding=$("#jsxc_windowListSB").width(),innerWidth=$("#jsxc_windowList>ul").width(),outerWidth=$("#jsxc_windowList").width()-padding;if(innerWidth>outerWidth){var offset=parseInt($("#jsxc_windowList>ul").css("right")),width=win.outerWidth(!0),right=innerWidth-win.position().left-width+offset,left=outerWidth-(innerWidth-win.position().left)-offset;0>left&&jsxc.gui.scrollWindowListBy(-1*left),0>right&&jsxc.gui.scrollWindowListBy(right)}return win},close:function(bid){return 0===jsxc.gui.window.get(bid).length?void jsxc.warn("Want to close a window, that is not open."):(jsxc.storage.removeUserElement("windowlist",bid),jsxc.storage.removeUserItem("window",bid),jsxc.storage.getUserItem("buddylist").indexOf(bid)<0&&(jsxc.storage.removeUserItem("buddy",bid),jsxc.storage.removeUserItem("chat",bid)),void jsxc.gui.window._close(bid))},_close:function(bid){jsxc.gui.window.get(bid).hide("slow",function(){$(this).remove(),jsxc.gui.updateWindowListSB()})},toggle:function(bid){var win=jsxc.gui.window.get(bid);0!==win.parents("#jsxc_windowList").length&&(win.find(".jsxc_fade").is(":hidden")?jsxc.gui.window.show(bid):jsxc.gui.window.hide(bid),jsxc.gui.updateWindowListSB())},show:function(bid){jsxc.storage.updateUserItem("window",bid,"minimize",!1),jsxc.gui.window._show(bid)},_show:function(bid){var win=jsxc.gui.window.get(bid);jsxc.gui.window.get(bid).find(".jsxc_fade").slideDown(),win.removeClass("jsxc_min"),jsxc.gui.window.scrollDown(bid),jsxc.restoreCompleted&&win.find(".jsxc_textinput").focus(),win.trigger("show.window.jsxc")},hide:function(bid){jsxc.storage.updateUserItem("window",bid,"minimize",!0),jsxc.gui.window._hide(bid)},_hide:function(bid){jsxc.gui.window.get(bid).addClass("jsxc_min").find(" .jsxc_fade").slideUp(),jsxc.gui.window.get(bid).trigger("hidden.window.jsxc")},highlight:function(bid){var el=jsxc.gui.window.get(bid).find(" .jsxc_bar");el.is(":animated")||el.effect("highlight",{color:"orange"},2e3)},scrollDown:function(bid){var chat=jsxc.gui.window.get(bid).find(".jsxc_textarea");0!==chat.length&&chat.slimScroll({scrollTo:chat.get(0).scrollHeight+"px"})},postMessage:function(bid,direction,msg,encrypted,forwarded,stamp,sender){var data=jsxc.storage.getUserItem("buddy",bid),html_msg=msg;msg=jsxc.removeHTML(msg),msg=jsxc.escapeHTML(msg),"out"===direction&&data.msgstate===OTR.CONST.MSGSTATE_FINISHED&&forwarded!==!0&&(direction="sys",msg=$.t("your_message_wasnt_send_please_end_your_private_conversation")),"in"===direction&&data.msgstate===OTR.CONST.MSGSTATE_FINISHED&&(direction="sys",msg=$.t("unencrypted_message_received")+" "+msg),"out"===direction&&"from"===data.sub&&(direction="sys",msg=$.t("your_message_wasnt_send_because_you_have_no_valid_subscription")),encrypted=encrypted||data.msgstate===OTR.CONST.MSGSTATE_ENCRYPTED;var post=jsxc.storage.saveMessage(bid,direction,msg,encrypted,forwarded,stamp,sender);"in"===direction&&$(document).trigger("postmessagein.jsxc",[bid,html_msg]),"out"===direction&&jsxc.master&&forwarded!==!0&&jsxc.xmpp.sendMessage(bid,html_msg,post.uid),jsxc.gui.window._postMessage(bid,post),"out"===direction&&"?"===msg&&jsxc.gui.window.postMessage(bid,"sys","42")},_postMessage:function(bid,post,restore){var win=jsxc.gui.window.get(bid),msg=post.msg,direction=post.direction,uid=post.uid;win.find(".jsxc_textinput").is(":not(:focus)")&&jsxc.restoreCompleted&&"in"===direction&&!restore&&jsxc.gui.window.highlight(bid),msg=msg.replace(jsxc.CONST.REGEX.URL,function(url){var href=url.match(/^https?:\/\//i)?url:"http://"+url;return'<a href="'+href+'" target="_blank">'+url+"</a>"}),msg=msg.replace(new RegExp("(xmpp:)?("+jsxc.CONST.REGEX.JID.source+")(\\?[^\\s]+\\b)?","i"),function(match,protocol,jid,action){return"xmpp:"===protocol?("string"==typeof action&&(jid+=action),'<a href="xmpp:'+jid+'">'+jid+"</a>"):'<a href="mailto:'+jid+'" target="_blank">'+jid+"</a>"}),$.each(jsxc.gui.emotions,function(i,val){msg=msg.replace(val[2],function(match,p1){var i,esc="";for(i=0;i<p1.length;i++)esc+="&#"+p1.charCodeAt(i)+";";return'<div title="'+esc+'" class="jsxc_emoticon jsxc_'+val[1]+'"/>'})});var msgDiv=$("<div>"),msgTsDiv=$("<div>");if(msgDiv.addClass("jsxc_chatmessage jsxc_"+direction),msgDiv.attr("id",uid),msgDiv.html("<div>"+msg+"</div>"),msgTsDiv.addClass("jsxc_timestamp"),msgTsDiv.text(jsxc.getFormattedTime(post.stamp)),post.received&&msgDiv.addClass("jsxc_received"),post.forwarded&&msgDiv.addClass("jsxc_forwarded"),post.encrypted&&msgDiv.addClass("jsxc_encrypted"),"sys"===direction?jsxc.gui.window.get(bid).find(".jsxc_textarea").append('<div style="clear:both"/>'):"undefined"!=typeof post.stamp&&msgDiv.append(msgTsDiv),win.find(".jsxc_textarea").append(msgDiv),"object"==typeof post.sender&&null!==post.sender){var title="",avatarDiv=$("<div>");if(avatarDiv.addClass("jsxc_avatar").prependTo(msgDiv),"string"==typeof post.sender.jid){msgDiv.attr("data-bid",jsxc.jidToBid(post.sender.jid));var data=jsxc.storage.getUserItem("buddy",jsxc.jidToBid(post.sender.jid))||{};jsxc.gui.updateAvatar(msgDiv,jsxc.jidToBid(post.sender.jid),data.avatar),title=jsxc.jidToBid(post.sender.jid)}"string"==typeof post.sender.name&&(msgDiv.attr("data-name",post.sender.name),"string"!=typeof post.sender.jid&&jsxc.gui.avatarPlaceholder(avatarDiv,post.sender.name),""!==title&&(title="\n"+title),title=post.sender.name+title,msgTsDiv.text(msgTsDiv.text()+" "+post.sender.name)),avatarDiv.attr("title",jsxc.escapeHTML(title))}jsxc.gui.detectUriScheme(win),jsxc.gui.detectEmail(win),jsxc.gui.window.scrollDown(bid),win.find(".jsxc_textinput").is(":focus")||!jsxc.restoreCompleted||restore||jsxc.gui.unreadMsg(bid)},setText:function(bid,text){jsxc.gui.window.get(bid).find(".jsxc_textinput").val(text)},restoreChat:function(bid){for(var chat=jsxc.storage.getUserItem("chat",bid);null!==chat&&chat.length>0;){var c=chat.pop();jsxc.gui.window._postMessage(bid,c,!0)}},clear:function(bid){jsxc.storage.setUserItem("chat",bid,[]),jsxc.gui.window.get(bid).find(".jsxc_textarea").empty()}},jsxc.gui.template={get:function(name,bid,msg){var ph={my_priv_fingerprint:jsxc.storage.getUserItem("priv_fingerprint")?jsxc.storage.getUserItem("priv_fingerprint").replace(/(.{8})/g,"$1 "):$.t("not_available"),my_jid:jsxc.storage.getItem("jid")||"",my_node:Strophe.getNodeFromJid(jsxc.storage.getItem("jid")||"")||"",root:jsxc.options.root,app_name:jsxc.options.app_name};if(bid){var data=jsxc.storage.getUserItem("buddy",bid);$.extend(ph,{bid_priv_fingerprint:data&&data.fingerprint?data.fingerprint.replace(/(.{8})/g,"$1 "):$.t("not_available"),bid_jid:bid,bid_name:data&&data.name?data.name:bid})}msg&&$.extend(ph,{msg:msg});var ret=jsxc.gui.template[name];return"string"==typeof ret?(ret=ret.replace(/\{\{([a-zA-Z0-9_\-]+)\}\}/g,function(s,key){return"string"==typeof ph[key]?ph[key]:s}),$("<div>").append($(ret).i18n()).html()):(jsxc.debug("Template not available: "+name),name)},authenticationDialog:'<h3>Verification</h3> <p data-i18n="Authenticating_a_buddy_helps_"></p> <div> <p data-i18n="How_do_you_want_to_authenticate_your_buddy" style="margin:0px;"></p> <select size="1"> <option data-i18n="Select_method"></option> <option data-i18n="Manual"></option> <option data-i18n="Question"></option> <option data-i18n="Secret"></option> </select> </div> <div style="display:none"> <p data-i18n="To_verify_the_fingerprint_" class=".jsxc_explanation"></p> <p><strong data-i18n="Your_fingerprint"></strong><br /> <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p> <p><strong data-i18n="Buddy_fingerprint"></strong><br /> <span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br /> <p class="jsxc_right"><a href="#" data-i18n="Close" class="jsxc_close button"></a> <a href="#" data-i18n="Compared" class="button creation"></a></p> </div> <div style="display:none"> <p data-i18n="To_authenticate_using_a_question_" class=".jsxc_explanation"></p> <p><label for="jsxc_quest" data-i18n="Question"></label><input type="text" name="quest" id="jsxc_quest" /></p> <p><label for="jsxc_secret2" data-i18n="Secret"></label><input type="text" name="secret2" id="jsxc_secret2" /></p> <p class="jsxc_right"><a href="#" class="button jsxc_close" data-i18n="Close"></a> <a href="#" class="button creation" data-i18n="Ask"></a></p> </div> <div style="display:none"> <p class=".jsxc_explanation" data-i18n="To_authenticate_pick_a_secret_"></p> <p><label for="jsxc_secret" data-i18n="Secret"></label><input type="text" name="secret" id="jsxc_secret" /></p> <p class="jsxc_right"><a href="#" class="button jsxc_close" data-i18n="Close"></a> <a href="#" class="button creation" data-i18n="Compare"></a></p> </div>',fingerprintsDialog:'<div> <p class="jsxc_maxWidth" data-i18n="A_fingerprint_"></p> <p><strong data-i18n="Your_fingerprint"></strong><br /> <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p> <p><strong data-i18n="Buddy_fingerprint"></strong><br /> <span style="text-transform:uppercase">{{bid_priv_fingerprint}}</span></p><br /> <p class="jsxc_right"><a href="#" class="button jsxc_close" data-i18n="Close"></a></p> </div>',chatWindow:'<li class="jsxc_min jsxc_windowItem"> <div class="jsxc_window"> <div class="jsxc_bar"> <div class="jsxc_avatar">☺</div> <div class="jsxc_tools"> <div class="jsxc_settings"> <ul> <li class="jsxc_fingerprints jsxc_otr jsxc_disabled" data-i18n="Fingerprints"></li> <li class="jsxc_verification" data-i18n="Authentication"></li> <li class="jsxc_transfer jsxc_otr jsxc_disabled" data-i18n="start_private"></li> <li class="jsxc_clear" data-i18n="clear_history"></li> </ul> </div> <div class="jsxc_transfer jsxc_otr jsxc_disabled"/> <div class="jsxc_close">×</div> </div> <div class="jsxc_name"/> <div class="jsxc_cycle"/> </div> <div class="jsxc_fade"> <div class="jsxc_gradient"/> <div class="jsxc_textarea"/> <div class="jsxc_emoticons"><ul/></div> <input type="text" class="jsxc_textinput" data-i18n="[placeholder]Message"/> </div> </div> </li>',roster:'<div id="jsxc_roster"> <ul id="jsxc_buddylist"></ul> <div class="jsxc_bottom jsxc_presence" data-bid="own"> <div id="jsxc_avatar"> <div class="jsxc_avatar">☺</div> </div> <div id="jsxc_menu"> <span></span> <ul> <li class="jsxc_settings" data-i18n="Settings"></li> <li class="jsxc_muteNotification" data-i18n="Mute"></li> <li class="jsxc_addBuddy" data-i18n="Add_buddy"></li> <li class="jsxc_hideOffline" data-i18n="Hide_offline"></li> <li class="jsxc_onlineHelp" data-i18n="Online_help"></li> <li class="jsxc_about" data-i18n="About"></li> </ul> </div> <div id="jsxc_notice"> <span></span> <ul></ul> </div> <div id="jsxc_presence"> <span data-i18n="Online"></span> <ul> <li data-pres="online" class="jsxc_online" data-i18n="Online"></li> <li data-pres="chat" class="jsxc_chat" data-i18n="Chatty"></li> <li data-pres="away" class="jsxc_away" data-i18n="Away"></li> <li data-pres="xa" class="jsxc_xa" data-i18n="Extended_away"></li> <li data-pres="dnd" class="jsxc_dnd" data-i18n="dnd"></li> <li data-pres="offline" class="jsxc_offline" data-i18n="Offline"></li> </ul> </div> </div> <div id="jsxc_toggleRoster"></div> </div>',windowList:'<div id="jsxc_windowList"> <ul></ul> </div> <div id="jsxc_windowListSB"> <div class="jsxc_scrollLeft jsxc_disabled">&lt;</div> <div class="jsxc_scrollRight jsxc_disabled">&gt;</div> </div>',rosterBuddy:'<li> <div class="jsxc_avatar">☺</div> <div class="jsxc_control"></div> <div class="jsxc_name"/> <div class="jsxc_options jsxc_right"> <div class="jsxc_rename" data-i18n="[title]rename_buddy">✎</div> <div class="jsxc_delete" data-i18n="[title]delete_buddy">✘</div> </div> <div class="jsxc_options jsxc_left"> <div class="jsxc_chaticon" data-i18n="[title]send_message"/> <div class="jsxc_vcardicon" data-i18n="[title]get_info">i</div> </div> </li>',loginBox:'<h3 data-i18n="Login"></h3> <form> <p><label for="jsxc_username" data-i18n="Username"></label> <input type="text" name="username" id="jsxc_username" required="required" value="{{my_node}}"/></p> <p><label for="jsxc_password" data-i18n="Password"></label> <input type="password" name="password" required="required" id="jsxc_password" /></p> <div class="bottom_submit_section"> <input type="reset" class="button jsxc_close" name="clear" data-i18n="[value]Cancel"/> <input type="submit" class="button creation" name="commit" data-i18n="[value]Connect"/> </div> </form>',contactDialog:'<h3 data-i18n="Add_buddy"></h3> <p class=".jsxc_explanation" data-i18n="Type_in_the_full_username_"></p> <form> <p><label for="jsxc_username" data-i18n="Username"></label> <input type="text" name="username" id="jsxc_username" list="jsxc_userlist" pattern="^[^\\x22&\'\\/:<>@\\s]+(@[.\\-_\\w]+)?" required="required" /></p> <datalist id="jsxc_userlist"></datalist> <p><label for="jsxc_alias" data-i18n="Alias"></label> <input type="text" name="alias" id="jsxc_alias" /></p> <p class="jsxc_right"> <input class="button" type="submit" data-i18n="[value]Add" /> </p> <form>',approveDialog:'<h3 data-i18n="Subscription_request"></h3> <p><span data-i18n="You_have_a_request_from"></span><b class="jsxc_their_jid"></b>.</p> <p class="jsxc_right"><a href="#" class="button jsxc_deny" data-i18n="Deny"></a> <a href="#" class="button creation jsxc_approve" data-i18n="Approve"></a></p>',removeDialog:'<h3 data-i18n="Remove_buddy"></h3> <p class="jsxc_maxWidth" data-i18n="You_are_about_to_remove_"></p> <p class="jsxc_right"><a href="#" class="button jsxc_cancel jsxc_close" data-i18n="Cancel"></a> <a href="#" class="button creation" data-i18n="Remove"></a></p>',waitAlert:'<h3>{{msg}}</h3> <p data-i18n="Please_wait"></p> <p class="jsxc_center"><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /></p>',alert:'<h3 data-i18n="Alert"></h3> <p>{{msg}}</p> <p class="jsxc_right"><a href="#" data-i18n="Ok" class="button jsxc_close jsxc_cancel"></a></p>',authFailDialog:'<h3 data-i18n="Login_failed"></h3> <p data-i18n="Sorry_we_cant_authentikate_"></p> <p class="jsxc_right"> <a class="button jsxc_cancel" data-i18n="Continue_without_chat"></a> <a class="button creation" data-i18n="Retry"></a> </p>',confirmDialog:'<p>{{msg}}</p> <p class="jsxc_right"> <a class="button jsxc_cancel jsxc_close" data-i18n="Dismiss"></a> <a class="button creation" data-i18n="Confirm"></a> </p>',pleaseAccept:'<p data-i18n="Please_accept_"></p>',aboutDialog:"<h3>JavaScript XMPP Chat</h3> <p><b>Version: </b>"+jsxc.version+'<br /> <a href="http://jsxc.org/" target="_blank">www.jsxc.org</a><br /> <br /> <i>Released under the MIT license</i><br /> <br /> Real-time chat app for {{app_name}} and more.<br /> Requires an external <a href="https://xmpp.org/xmpp-software/servers/" target="_blank">XMPP server</a>.<br /> <br /> <b>Credits: </b> <a href="http://www.beepzoid.com/old-phones/" target="_blank">David English (Ringtone)</a>, <a href="https://soundcloud.com/freefilmandgamemusic/ping-1?in=freefilmandgamemusic/sets/free-notification-sounds-and" target="_blank">CameronMusic (Ping)</a></p> <p class="jsxc_right"><a class="button jsxc_debuglog" href="#">Show debug log</a></p>',vCard:'<h3><span data-i18n="Info_about"></span> <span>{{bid_name}}</span></h3> <ul class="jsxc_vCard"></ul> <p><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /> <span data-i18n="Please_wait"></span>...</p>',settings:'<h3 data-i18n="User_settings"></h3> <p></p> <form> <fieldset class="jsxc_fieldsetXmpp jsxc_fieldset"> <legend data-i18n="Login_options"></legend> <label for="xmpp-url" data-i18n="BOSH_url"></label><input type="text" id="xmpp-url" readonly="readonly"/><br /> <label for="xmpp-username" data-i18n="Username"></label><input type="text" id="xmpp-username"/><br /> <label for="xmpp-domain" data-i18n="Domain"></label><input type="text" id="xmpp-domain"/><br /> <label for="xmpp-resource" data-i18n="Resource"></label><input type="text" id="xmpp-resource"/><br /> <label for="xmpp-onlogin" data-i18n="On_login"></label><input type="checkbox" id="xmpp-onlogin" /><br /> <input type="submit" data-i18n="[value]Save"/> </fieldset> </form> <p></p> <form> <fieldset class="jsxc_fieldsetPriority jsxc_fieldset"> <legend data-i18n="Priority"></legend> <label for="priority-online" data-i18n="Online"></label><input type="number" value="0" id="priority-online" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-chat" data-i18n="Chatty"></label><input type="number" value="0" id="priority-chat" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-away" data-i18n="Away"></label><input type="number" value="0" id="priority-away" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-xa" data-i18n="Extended_away"></label><input type="number" value="0" id="priority-xa" min="-128" max="127" step="1" required="required"/><br /> <label for="priority-dnd" data-i18n="dnd"></label><input type="number" value="0" id="priority-dnd" min="-128" max="127" step="1" required="required"/><br /> <input type="submit" data-i18n="[value]Save"/> </fieldset> </form> <p></p> <form data-onsubmit="xmpp.carbons.refresh"> <fieldset class="jsxc_fieldsetCarbons jsxc_fieldset"> <legend data-i18n="Carbon_copy"></legend> <label for="carbons-enable" data-i18n="Enable"></label><input type="checkbox" id="carbons-enable" /><br /> <input type="submit" data-i18n="[value]Save"/> </fieldset> </form>'},jsxc.gui.template.joinChat='<h3 data-i18n="Join_chat"></h3> <p class=".jsxc_explanation" data-i18n="muc_explanation"></p> <p><label for="jsxc_server" data-i18n="Server"></label> <input type="text" name="server" id="jsxc_server" required="required" readonly="readonly" /></p> <p><label for="jsxc_room" data-i18n="Room"></label> <input type="text" name="room" id="jsxc_room" autocomplete="off" list="jsxc_roomlist" required="required" pattern="^[^\\x22&\'\\/:<>@\\s]+" /></p> <p class="jsxc_inputinfo jsxc_waiting jsxc_room" data-i18n="Rooms_are_loaded"></p> <datalist id="jsxc_roomlist"> <p><label for="jsxc_roomlist_select"></label><select id="jsxc_roomlist_select"><option></option><option>workaround</option></select></p> </datalist> <p><label for="jsxc_nickname" data-i18n="Nickname"></label> <input type="text" name="nickname" id="jsxc_nickname" /></p> <p><label for="jsxc_password" data-i18n="Password"></label> <input type="text" name="password" id="jsxc_password" /></p> <div class="jsxc_msg"></div> <p class="jsxc_right"> <span class="jsxc_warning"></span> <a href="#" class="button jsxc_close" data-i18n="Close"></a> <a href="#" class="button jsxc_continue" data-i18n="Continue"> <a href="#" class="button jsxc_join" data-i18n="Join"></a> </p>',jsxc.muc={conn:null,CONST:{AFFILIATION:{ADMIN:"admin",MEMBER:"member",OUTCAST:"outcast",OWNER:"owner",NONE:"none"},ROLE:{MODERATOR:"moderator",PARTICIPANT:"participant",VISITOR:"visitor",NONE:"none"},ROOMSTATE:{INIT:0,ENTERED:1,EXITED:2,AWAIT_DESTRUCTION:3,DESTROYED:4}},init:function(o){var self=jsxc.muc;self.conn=jsxc.xmpp.conn;var options=o||jsxc.options.get("muc");return options&&"string"==typeof options.server?(jsxc.gui.roster.ready?self.initMenu():$(document).one("ready.roster.jsxc",jsxc.muc.initMenu),$(document).on("presence.jsxc",jsxc.muc.onPresence),$(document).on("error.presence.jsxc",jsxc.muc.onPresenceError),self.conn.addHandler(self.onGroupchatMessage,null,"message","groupchat"),self.conn.addHandler(self.onErrorMessage,null,"message","error"),void(self.conn.muc.roomNames=jsxc.storage.getUserItem("roomNames")||[])):(jsxc.debug("Discover muc service"),void setTimeout(function(){self.conn.disco.items(Strophe.getDomainFromJid(self.conn.jid),null,function(items){$(items).find("item").each(function(){var jid=$(this).attr("jid"),discovered=!1;return self.conn.disco.info(jid,null,function(info){$(info).find('feature[var="'+Strophe.NS.MUC+'"]').length>0&&(jsxc.debug("muc service found",jid),jsxc.options.set("muc",{server:jid,name:$(info).find("identity").attr("name")}),discovered=!0,self.init())}),!discovered})})},1e3))},initMenu:function(){var li=$("<li>").attr("class","jsxc_joinChat").text($.t("Join_chat"));li.click(jsxc.muc.showJoinChat),$("#jsxc_menu ul").append(li)},showJoinChat:function(){var self=jsxc.muc,dialog=jsxc.gui.dialog.open(jsxc.gui.template.get("joinChat"));dialog.find(".jsxc_join").hide(),dialog.find("#jsxc_server").val(jsxc.options.get("muc").server);var error_handler=function(event,condition,room){var msg;switch(condition){case"not-authorized":msg=$.t("A_password_is_required");break;case"registration-required":msg=$.t("You_are_not_on_the_member_list");break;case"forbidden":msg=$.t("You_are_banned_from_this_room");break;case"conflict":msg=$.t("Your_desired_nickname_");break;case"service-unavailable":msg=$.t("The_maximum_number_");break;case"item-not-found":msg=$.t("This_room_is_locked_");break;case"not-allowed":msg=$.t("You_are_not_allowed_to_create_");break;default:jsxc.warn("Unknown muc error condition: "+condition),msg=$.t("Error")+": "+condition}var roomIndex=self.conn.muc.roomNames.indexOf(room);roomIndex>-1&&(self.conn.muc.roomNames.splice(roomIndex,1),delete self.conn.muc.rooms[room]),dialog.find(".jsxc_warning").text(msg)};$(document).on("error.muc.jsxc",error_handler),$(document).on("close.dialog.jsxc",function(){$(document).off("error.muc.jsxc",error_handler)}),self.conn.muc.listRooms(jsxc.options.get("muc").server,function(stanza){$("#jsxc_roomlist option:last").remove(),$(stanza).find("item").each(function(){var r=$("<option>"),rjid=$(this).attr("jid").toLowerCase(),rnode=Strophe.getNodeFromJid(rjid),rname=$(this).attr("name")||rnode;
+r.text(rname),r.attr("data-jid",rjid),r.attr("value",rnode),$("#jsxc_roomlist select").append(r)});var set=$(stanza).find('set[xmlns="http://jabber.org/protocol/rsm"]');if(set.length>0){var count=set.find("count").text()||"?";dialog.find(".jsxc_inputinfo").removeClass("jsxc_waiting").text($.t("Could_load_only",{count:count}))}else dialog.find(".jsxc_inputinfo").hide()},function(){jsxc.warn("Could not load rooms"),dialog.find(".jsxc_inputinfo").hide()}),dialog.find("#jsxc_nickname").attr("placeholder",Strophe.getNodeFromJid(self.conn.jid)),dialog.find(".jsxc_continue").click(function(ev){ev.preventDefault();var room=$("#jsxc_room").val()?jsxc.jidToBid($("#jsxc_room").val()):null,nickname=$("#jsxc_nickname").val()||Strophe.getNodeFromJid(self.conn.jid),password=$("#jsxc_password").val()||null;if(!room||!room.match(/^[^"&\'\/:<>@\s]+$/i))return $("#jsxc_room").addClass("jsxc_invalid").keyup(function(){$(this).val()&&$(this).removeClass("jsxc_invalid")}),!1;if(room.match(/@(.*)$/)||(room+="@"+jsxc.options.get("muc").server),jsxc.xmpp.conn.muc.roomNames.indexOf(room)<0){var discoReceived=function(roomName,subject){jsxc.gui.dialog.resize(),dialog.find(".jsxc_continue").hide(),dialog.find(".jsxc_join").show().effect("highlight",{color:"green"},4e3),dialog.find(".jsxc_join").click(function(ev){return ev.preventDefault(),self.join(room,nickname,password,roomName,subject),!1})};dialog.find(".jsxc_msg").append($("<p>").text($.t("Loading_room_information")).addClass("jsxc_waiting")),jsxc.gui.dialog.resize(),self.conn.disco.info(room,null,function(stanza){dialog.find(".jsxc_msg").html("<p>"+$.t("This_room_is")+"</p>");var table=$("<table>");$(stanza).find("feature").each(function(){var feature=$(this).attr("var");if(""!==feature&&i18n.exists(feature)){var tr=$("<tr>");$("<td>").text($.t(feature+".keyword")).appendTo(tr),$("<td>").text($.t(feature+".description")).appendTo(tr),tr.appendTo(table)}}),dialog.find(".jsxc_msg").append(table);var roomName=$(stanza).find("identity").attr("name"),subject=$(stanza).find('field[var="muc#roominfo_subject"]').attr("label");discoReceived(roomName,subject)},function(){dialog.find(".jsxc_msg").empty(),$("<p>").text($.t("Room_not_found_")).appendTo(dialog.find(".jsxc_msg")),discoReceived()})}else dialog.find(".jsxc_warning").text($.t("You_already_joined_this_room"));return!1}),dialog.find("input").keydown(function(ev){return 13!==ev.which?(dialog.find(".jsxc_warning").empty(),void(dialog.find(".jsxc_continue").is(":hidden")&&(dialog.find(".jsxc_continue").show(),dialog.find(".jsxc_join").hide().off("click"),dialog.find(".jsxc_msg").empty(),jsxc.gui.dialog.resize()))):void(dialog.find(".jsxc_continue").is(":hidden")?dialog.find(".jsxc_join").click():dialog.find(".jsxc_continue").click())})},join:function(room,nickname,password,roomName,subject){var self=jsxc.muc;jsxc.storage.setUserItem("buddy",room,{jid:room,name:roomName||room,sub:"both",type:"groupchat",state:self.CONST.ROOMSTATE.INIT,subject:subject}),jsxc.xmpp.conn.muc.join(room,nickname,null,null,null,password)},leave:function(room){var self=jsxc.muc,own=jsxc.storage.getUserItem("ownNicknames")||{},data=jsxc.storage.getUserItem("buddy",room)||{};data.state===self.CONST.ROOMSTATE.ENTERED?self.conn.muc.leave(room,own[room],function(){self.onExited(room)}):self.onExited(room)},onExited:function(room){var self=jsxc.muc,own=jsxc.storage.getUserItem("ownNicknames")||{};jsxc.storage.setUserItem("roomNames",self.conn.muc.roomNames),delete own[room],jsxc.storage.setUserItem("ownNicknames",own),jsxc.storage.removeUserItem("member",room),jsxc.storage.removeUserItem("chat",room),jsxc.gui.window.close(room),jsxc.gui.roster.purge(room)},destroy:function(room,handler_cb,error_cb){var self=jsxc.muc;jsxc.storage.updateUserItem("buddy",room,"state",self.CONST.ROOMSTATE.AWAIT_DESTRUCTION),jsxc.gui.window.postMessage(room,"sys",$.t("This_room_will_be_closed"));var iq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("destroy");jsxc.muc.conn.sendIQ(iq.tree(),handler_cb,error_cb)},close:function(room){var self=jsxc.muc,roomdata=jsxc.storage.getUserItem("buddy",room)||{};self.emptyMembers(room);var roomIndex=self.conn.muc.roomNames.indexOf(room);roomIndex>-1&&(self.conn.muc.roomNames.splice(roomIndex,1),delete self.conn.muc.rooms[room]),jsxc.storage.setUserItem("roomNames",self.conn.muc.roomNames),roomdata.state===self.CONST.ROOMSTATE.AWAIT_DESTRUCTION&&self.onExited(room),roomdata.state=self.CONST.ROOMSTATE.DESTROYED,jsxc.storage.setUserItem("buddy",room,roomdata)},initWindow:function(event,win){var self=jsxc.muc,data=win.data(),bid=jsxc.jidToBid(data.jid),roomdata=jsxc.storage.getUserItem("buddy",bid);if(!jsxc.xmpp.conn)return void $(document).one("connectionReady.jsxc",function(){self.initWindow(null,win)});if(!(self.conn.muc.roomNames.indexOf(data.jid)<0)){win.addClass("jsxc_groupchat");var own=jsxc.storage.getUserItem("ownNicknames")||{},ownNickname=own[bid],mlIcon=$('<div class="jsxc_members"></div>');win.find(".jsxc_tools > .jsxc_transfer").after(mlIcon);var ml=$('<div class="jsxc_memberlist"><ul></ul></div>');win.find(".jsxc_fade").prepend(ml),ml.on("wheel",function(ev){jsxc.muc.scrollMemberListBy(bid,ev.originalEvent.wheelDelta>0?50:-50)});var toggleMl=function(ev){ev&&ev.preventDefault();var slimOptions={},ul=ml.find("ul:first"),slimHeight=null;if(ml.toggleClass("jsxc_expand"),ml.hasClass("jsxc_expand")){$("body").click(),$("body").one("click",toggleMl),ul.mouseleave(function(){ul.data("timer",window.setTimeout(toggleMl,2e3))}).mouseenter(function(){window.clearTimeout(ul.data("timer"))}).css("left","0px");var maxHeight=.8*win.find(".jsxc_textarea").height(),innerHeight=ml.find("ul").height()+3;slimHeight=innerHeight>maxHeight?maxHeight:innerHeight,slimOptions={distance:"3px",height:slimHeight+"px",width:"100%",color:"#fff",opacity:"0.5"},ml.css("height",slimHeight+"px")}else slimOptions={destroy:!0},ul.attr("style",""),ml.css("height",""),window.clearTimeout(ul.data("timer")),$("body").off("click",null,toggleMl),ul.off("mouseleave mouseenter");return ul.slimscroll(slimOptions),!1};mlIcon.click(toggleMl),win.on("resize",function(){jsxc.muc.scrollMemberListBy(bid,0)}),setTimeout(function(){var top=win.find(".jsxc_emoticons").position().top+win.find(".slimScrollDiv").position().top;win.find(".jsxc_emoticons").css("top",top+"px")},400);var destroy=$("<li>");if(destroy.text($.t("Destroy")),destroy.addClass("jsxc_destroy"),destroy.hide(),destroy.click(function(){self.destroy(bid)}),win.find(".jsxc_settings ul").append(destroy),roomdata.state>self.CONST.ROOMSTATE.INIT){var member=jsxc.storage.getUserItem("member",bid)||{};$.each(member,function(nickname,val){self.insertMember(bid,nickname,val),nickname===ownNickname&&val.affiliation===self.CONST.AFFILIATION.OWNER&&destroy.show()})}var leave=$("<li>");leave.text($.t("Leave")),leave.addClass("jsxc_leave"),leave.click(function(){self.leave(bid)}),win.find(".jsxc_settings ul").append(leave)}},onPresence:function(event,from,status,presence){var self=jsxc.muc,room=jsxc.jidToBid(from),xdata=$(presence).find('x[xmlns^="'+Strophe.NS.MUC+'"]');if(self.conn.muc.roomNames.indexOf(room)<0||0===xdata.length)return!0;var res=Strophe.getResourceFromJid(from)||"",nickname=Strophe.unescapeNode(res),own=jsxc.storage.getUserItem("ownNicknames")||{},member=jsxc.storage.getUserItem("member",room)||{},codes=[];if(xdata.find("status").each(function(){var code=$(this).attr("code");jsxc.debug("[muc][code]",code),codes.push(code)}),0===jsxc.gui.roster.getItem(room).length){jsxc.storage.setUserItem("roomNames",jsxc.xmpp.conn.muc.roomNames),jsxc.storage.removeUserItem("chat",room),member={};var bl=jsxc.storage.getUserItem("buddylist");bl.push(room),jsxc.storage.setUserItem("buddylist",bl),jsxc.gui.roster.add(room),jsxc.gui.window.open(room),jsxc.gui.dialog.close()}var jid=xdata.find("item").attr("jid")||null;if(0===status)if(xdata.find("destroy").length>0)member={},jsxc.gui.window.postMessage(room,"sys",$.t("This_room_has_been_closed")),self.close(room);else{delete member[nickname],self.removeMember(room,nickname);var newNickname=xdata.find("item").attr("nick");codes.indexOf("303")>-1&&newNickname?(newNickname=Strophe.unescapeNode(newNickname),member[newNickname]={},jsxc.gui.window.postMessage(room,"sys",$.t("is_now_known_as",{oldNickname:nickname,newNickname:newNickname,escapeInterpolation:!0}))):(0===codes.length||1===codes.length&&codes.indexOf("110")>-1)&&jsxc.gui.window.postMessage(room,"sys",$.t("left_the_building",{nickname:nickname,escapeInterpolation:!0}))}else!member[nickname]&&own[room]&&jsxc.gui.window.postMessage(room,"sys",$.t("entered_the_room",{nickname:nickname,escapeInterpolation:!0})),member[nickname]={jid:jid,status:status,roomJid:from,affiliation:xdata.find("item").attr("affiliation"),role:xdata.find("item").attr("role")},self.insertMember(room,nickname,member[nickname]);return jsxc.storage.setUserItem("member",room,member),$.each(codes,function(index,code){"function"==typeof self.onStatus[code]&&self.onStatus[code].call(this,room,nickname,member[nickname]||{},xdata),$(document).trigger("status.muc.jsxc",[code,room,nickname,member[nickname]||{},presence])}),!0},onPresenceError:function(event,from,presence){var self=jsxc.muc,xdata=$(presence).find('x[xmlns="'+Strophe.NS.MUC+'"]'),room=jsxc.jidToBid(from);if(0===xdata.length||self.conn.muc.roomNames.indexOf(room)<0)return!0;var error=$(presence).find("error"),condition=error.children()[0].tagName;return jsxc.debug("[muc][error]",condition),$(document).trigger("error.muc.jsxc",[condition,room]),!0},onStatus:{110:function(room,nickname,data){var self=jsxc.muc,own=jsxc.storage.getUserItem("ownNicknames")||{};own[room]=nickname,jsxc.storage.setUserItem("ownNicknames",own),data.affiliation===self.CONST.AFFILIATION.OWNER&&jsxc.gui.window.get(room).find(".jsxc_destroy").show();var roomdata=jsxc.storage.getUserItem("buddy",room);roomdata.state===self.CONST.ROOMSTATE.INIT&&(roomdata.state=self.CONST.ROOMSTATE.ENTERED,jsxc.storage.setUserItem("buddy",room,roomdata))},170:function(room){jsxc.gui.window.postMessage(room,"sys",$.t("Room_logging_is_enabled"))},201:function(room){var self=jsxc.muc;self.conn.muc.createInstantRoom(room)},301:function(room,nickname,data,xdata){var own=jsxc.storage.getUserItem("ownNicknames")||{};own[room]===nickname?(jsxc.muc.close(room),jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_banned")),jsxc.muc.postReason(room,xdata)):jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_info_banned",{nickname:nickname,escapeInterpolation:!0}))},307:function(room,nickname,data,xdata){var own=jsxc.storage.getUserItem("ownNicknames")||{};own[room]===nickname?(jsxc.muc.close(room),jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_kicked")),jsxc.muc.postReason(room,xdata)):jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_info_kicked",{nickname:nickname,escapeInterpolation:!0}))},321:function(room,nickname){var own=jsxc.storage.getUserItem("ownNicknames")||{};own[room]===nickname?(jsxc.muc.close(room),jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_affiliation"))):jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_info_affiliation",{nickname:nickname,escapeInterpolation:!0}))},322:function(room,nickname){var own=jsxc.storage.getUserItem("ownNicknames")||{};own[room]===nickname?(jsxc.muc.close(room),jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_membersonly"))):jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_info_membersonly",{nickname:nickname,escapeInterpolation:!0}))},332:function(room){jsxc.muc.close(room),jsxc.gui.window.postMessage(room,"sys",$.t("muc_removed_shutdown"))}},postReason:function(room,xdata){var actor={name:xdata.find("actor").attr("nick"),jid:xdata.find("actor").attr("jid")},reason=xdata.find("reason").text();""!==reason&&(reason=$.t("Reason")+": "+reason,"string"==typeof actor.name||"string"==typeof actor.jid?jsxc.gui.window.postMessage(room,"in",reason,!1,!1,null,actor):jsxc.gui.window.postMessage(room,"sys",reason))},insertMember:function(room,nickname,memberdata){var self=jsxc.muc,win=jsxc.gui.window.get(room),jid=memberdata.jid,m=win.find('.jsxc_memberlist li[data-nickname="'+nickname+'"]');if(0===m.length){var title=jsxc.escapeHTML(nickname);if(m=$('<li><div class="jsxc_avatar"></div><div class="jsxc_name"/></li>'),m.attr("data-nickname",nickname),win.find(".jsxc_memberlist ul").append(m),"string"==typeof jid){m.find(".jsxc_name").text(jsxc.jidToBid(jid)),m.attr("data-bid",jsxc.jidToBid(jid)),title=title+"\n"+jsxc.jidToBid(jid);var data=jsxc.storage.getUserItem("buddy",jsxc.jidToBid(jid));null!==data&&"object"==typeof data?jsxc.gui.updateAvatar(m,jsxc.jidToBid(jid),data.avatar):jsxc.jidToBid(jid)===jsxc.jidToBid(self.conn.jid)&&jsxc.gui.updateAvatar(m,jsxc.jidToBid(jid),"own")}else m.find(".jsxc_name").text(nickname),jsxc.gui.avatarPlaceholder(m.find(".jsxc_avatar"),nickname);m.attr("title",title)}},removeMember:function(room,nickname){var win=jsxc.gui.window.get(room),m=win.find('.jsxc_memberlist li[data-nickname="'+nickname+'"]');m.length>0&&m.remove()},scrollMemberListBy:function(room,offset){var win=jsxc.gui.window.get(room);if(!win.find(".jsxc_memberlist").hasClass("jsxc_expand")){var el=win.find(".jsxc_memberlist ul:first"),scrollWidth=el.width(),width=win.find(".jsxc_memberlist").width(),left=parseInt(el.css("left"));left=isNaN(left)?0-offset:left-offset,width>scrollWidth||left>0?left=0:width-scrollWidth>left&&(left=width-scrollWidth),el.css("left",left+"px")}},emptyMembers:function(room){var win=jsxc.gui.window.get(room);win.find(".jsxc_memberlist").empty(),jsxc.storage.setUserItem("member",room,{})},onGroupchatMessage:function(message){var id=$(message).attr("id");if(jsxc.el_exists($("#"+id)))return!0;var from=$(message).attr("from"),body=$(message).find("body:first").text(),room=jsxc.jidToBid(from),nickname=Strophe.unescapeNode(Strophe.getResourceFromJid(from));if(""!==body){var delay=$(message).find('delay[xmlns="urn:xmpp:delay"]'),stamp=delay.length>0?new Date(delay.attr("stamp")):new Date;stamp=stamp.getTime();var member=jsxc.storage.getUserItem("member",room)||{},sender={};sender.name=nickname,member[nickname]&&"string"==typeof member[nickname].jid&&(sender.jid=member[nickname].jid),jsxc.gui.window.postMessage(room,"in",body,!1,!1,stamp,sender)}var subject=$(message).find("subject");if(subject.length>0){var roomdata=jsxc.storage.getUserItem("buddy",room);roomdata.subject=subject.text(),jsxc.storage.setUserItem("buddy",room,roomdata),jsxc.gui.window.postMessage(room,"sys",$.t("changed_subject_to",{nickname:nickname,subject:subject.text()}))}return!0},onErrorMessage:function(message){var room=jsxc.jidToBid($(message).attr("from"));return 0===jsxc.gui.window.get(room).length?!0:($(message).find("item-not-found").length>0?jsxc.gui.window.postMessage(room,"sys",$.t("message_not_send_item-not-found")):$(message).find("forbidden").length>0?jsxc.gui.window.postMessage(room,"sys",$.t("message_not_send_forbidden")):$(message).find("not-acceptable").length>0?jsxc.gui.window.postMessage(room,"sys",$.t("message_not_send_not-acceptable")):jsxc.gui.window.postMessage(room,"sys",$.t("message_not_send")),jsxc.debug("[muc] error message for "+room,$(message).find("error")[0]),!0)},onAddRoster:function(event,room,data,bud){var self=jsxc.muc;"groupchat"===data.type&&bud.find(".jsxc_delete").off("click").click(function(){return self.leave(room),!1})}},$(document).on("init.window.jsxc",jsxc.muc.initWindow),$(document).on("add.roster.jsxc",jsxc.muc.onAddRoster),$(document).one("attached.jsxc",function(){jsxc.muc.init()}),$(document).one("connected.jsxc",function(){jsxc.storage.removeUserItem("roomNames"),jsxc.storage.removeUserItem("ownNicknames")}),jsxc.notice={_num:0,load:function(){$("#jsxc_notice ul li").remove(),$("#jsxc_notice > span").text(""),jsxc.notice._num=0;var saved=jsxc.storage.getUserItem("notices")||[],key=null;for(key in saved)if(saved.hasOwnProperty(key)){var val=saved[key];jsxc.notice.add(val.msg,val.description,val.fnName,val.fnParams,key)}},add:function(msg,description,fnName,fnParams,id){var nid=id||Date.now(),list=$("#jsxc_notice ul"),notice=$("<li/>");if(notice.click(function(){return jsxc.notice.remove(nid),jsxc.exec(fnName,fnParams),!1}),notice.text(msg),notice.attr("title",description||""),notice.attr("data-nid",nid),list.append(notice),$("#jsxc_notice > span").text(++jsxc.notice._num),!id){var saved=jsxc.storage.getUserItem("notices")||{};saved[nid]={msg:msg,description:description,fnName:fnName,fnParams:fnParams},jsxc.storage.setUserItem("notices",saved),jsxc.notification.notify(msg,description||"",null,!0,jsxc.CONST.SOUNDS.NOTICE)}},remove:function(nid){var el=$("#jsxc_notice li[data-nid="+nid+"]");el.remove(),$("#jsxc_notice > span").text(--jsxc.notice._num||"");var s=jsxc.storage.getUserItem("notices");delete s[nid],jsxc.storage.setUserItem("notices",s)},has:function(fnName){var saved=jsxc.storage.getUserItem("notices")||[],has=!1;return $.each(saved,function(index,val){return val.fnName===fnName?(has=!0,!1):void 0}),has}},jsxc.notification={audio:null,init:function(){$(document).on("postmessagein.jsxc",function(event,bid,msg){msg=msg.match(/^\?OTR/)?$.t("Encrypted_message"):msg;var data=jsxc.storage.getUserItem("buddy",bid);jsxc.notification.notify({title:$.t("New_message_from")+" "+data.name,msg:msg,soundFile:jsxc.CONST.SOUNDS.MSG,source:bid})}),$(document).on("callincoming.jingle",function(){jsxc.notification.playSound(jsxc.CONST.SOUNDS.CALL,!0,!0)}),$(document).on("accept.call.jsxc reject.call.jsxc",function(){jsxc.notification.stopSound()})},notify:function(title,msg,d,force,soundFile,loop,source){if(jsxc.options.notification&&jsxc.notification.hasPermission()){var o;if(o=null!==title&&"object"==typeof title?title:{title:title,msg:msg,duration:d,force:force,soundFile:soundFile,loop:loop,source:source},!jsxc.hasFocus()||o.force){var icon=o.icon||jsxc.options.root+"/img/XMPP_logo.png";if("string"==typeof o.source){var data=jsxc.storage.getUserItem("buddy",o.source),src=jsxc.storage.getUserItem("avatar",data.avatar);"string"==typeof src&&"0"!==src&&(icon=src)}jsxc.toNotification=setTimeout(function(){"string"==typeof o.soundFile&&jsxc.notification.playSound(o.soundFile,o.loop,o.force);var popup=new Notification($.t(o.title),{body:$.t(o.msg),icon:icon}),duration=o.duration||jsxc.options.popupDuration;duration>0&&setTimeout(function(){popup.close()},duration)},jsxc.toNotificationDelay)}}},hasSupport:function(){if(window.webkitNotifications){window.Notification=function(title,opt){var popup=window.webkitNotifications.createNotification(null,title,opt.body);return popup.show(),popup.close=function(){popup.cancel()},popup};var permission;switch(window.webkitNotifications.checkPermission()){case 0:permission=jsxc.CONST.NOTIFICATION_GRANTED;break;case 2:permission=jsxc.CONST.NOTIFICATION_DENIED;break;default:permission=jsxc.CONST.NOTIFICATION_DEFAULT}return window.Notification.permission=permission,window.Notification.requestPermission=function(func){window.webkitNotifications.requestPermission(func)},!0}return window.Notification?!0:!1},prepareRequest:function(){jsxc.notice.has("gui.showRequestNotification")||$(document).one("postmessagein.jsxc",function(){setTimeout(function(){jsxc.notice.add($.t("Notifications")+"?",$.t("Should_we_notify_you_"),"gui.showRequestNotification")},1e3)})},requestPermission:function(){window.Notification.requestPermission(function(status){window.Notification.permission!==status&&(window.Notification.permission=status),$(document).trigger(jsxc.notification.hasPermission()?"notificationready.jsxc":"notificationfailure.jsxc")})},hasPermission:function(){return window.Notification.permission===jsxc.CONST.NOTIFICATION_GRANTED},playSound:function(soundFile,loop,force){if(jsxc.master&&!jsxc.options.get("muteNotification")&&"dnd"!==jsxc.storage.getUserItem("presence")&&(!jsxc.hasFocus()||force)){jsxc.notification.stopSound();var audio=new Audio(jsxc.options.root+"/sound/"+soundFile);audio.loop=loop||!1,audio.play(),jsxc.notification.audio=audio}},stopSound:function(){var audio=jsxc.notification.audio;"undefined"!=typeof audio&&null!==audio&&(audio.pause(),jsxc.notification.audio=null)},muteSound:function(external){$("#jsxc_menu .jsxc_muteNotification").text($.t("Unmute")),external!==!0&&jsxc.options.set("muteNotification",!0)},unmuteSound:function(external){$("#jsxc_menu .jsxc_muteNotification").text($.t("Mute")),external!==!0&&jsxc.options.set("muteNotification",!1)}},jsxc.options={app_name:"web applications",timeout:3e3,busyTimeout:15e3,otr:{enable:!0,ERROR_START_AKE:!1,debug:!1,SEND_WHITESPACE_TAG:!0,WHITESPACE_START_AKE:!0},xmpp:{url:null,jid:null,domain:null,password:null,overwrite:!1,onlogin:!0},priority:{online:0,chat:0,away:0,xa:0,dnd:0},loginForm:{form:null,jid:null,pass:null,preJid:function(jid){return jid},onConnected:"submit",onAuthFail:"submit"},logoutElement:null,numberOfMsg:10,defaultLang:"en",autoLang:!0,rosterAppend:"body",notification:!0,popupDuration:6e3,root:"",loginTimeout:6e5,displayRosterMinimized:function(){return!1},hideOffline:!1,muteNotification:!1,defaultAvatar:function(jid){jsxc.gui.avatarPlaceholder($(this).find(".jsxc_avatar"),jid)},loadSettings:function(){},saveSettinsPermanent:function(){},carbons:{enable:!1},getUsers:null},jsxc.otr={objects:{},dsaFallback:null,receiveMessage:function(d){var bid=d.bid;jsxc.otr.objects[bid].msgstate!==OTR.CONST.MSGSTATE_PLAINTEXT&&jsxc.otr.backup(bid),jsxc.otr.objects[bid].msgstate===OTR.CONST.MSGSTATE_PLAINTEXT||d.encrypted?jsxc.gui.window.postMessage(bid,"in",d.msg,d.encrypted,d.forwarded,d.stamp):jsxc.gui.window.postMessage(bid,"sys",$.t("Received_an_unencrypted_message")+". ["+d.msg+"]",d.encrypted,d.forwarded,d.stamp)},sendMessage:function(jid,msg,uid){0!==jsxc.otr.objects[jsxc.jidToBid(jid)].msgstate&&jsxc.otr.backup(jsxc.jidToBid(jid)),jsxc.xmpp._sendMessage(jid,msg,uid)},create:function(bid){if(!jsxc.otr.objects.hasOwnProperty(bid)&&jsxc.options.otr.priv){var ol=jsxc.storage.getUserItem("otrlist")||[];ol.indexOf(bid)<0&&(ol.push(bid),jsxc.storage.setUserItem("otrlist",ol)),jsxc.otr.objects[bid]=new OTR(jsxc.options.otr),jsxc.options.otr.SEND_WHITESPACE_TAG&&(jsxc.otr.objects[bid].SEND_WHITESPACE_TAG=!0),jsxc.options.otr.WHITESPACE_START_AKE&&(jsxc.otr.objects[bid].WHITESPACE_START_AKE=!0),jsxc.otr.objects[bid].on("status",function(status){var data=jsxc.storage.getUserItem("buddy",bid);if(null!==data){switch(status){case OTR.CONST.STATUS_SEND_QUERY:jsxc.gui.window.postMessage(bid,"sys",$.t("trying_to_start_private_conversation"));break;case OTR.CONST.STATUS_AKE_SUCCESS:data.fingerprint=jsxc.otr.objects[bid].their_priv_pk.fingerprint(),data.msgstate=OTR.CONST.MSGSTATE_ENCRYPTED;var msg=$.t(jsxc.otr.objects[bid].trust?"Verified":"Unverified")+" "+$.t("private_conversation_started");jsxc.gui.window.postMessage(bid,"sys",msg);break;case OTR.CONST.STATUS_END_OTR:data.fingerprint=null,jsxc.otr.objects[bid].msgstate===OTR.CONST.MSGSTATE_PLAINTEXT?(data.msgstate=OTR.CONST.MSGSTATE_PLAINTEXT,jsxc.gui.window.postMessage(bid,"sys",$.t("private_conversation_aborted"))):(data.msgstate=OTR.CONST.MSGSTATE_FINISHED,jsxc.gui.window.postMessage(bid,"sys",$.t("your_buddy_closed_the_private_conversation_you_should_do_the_same")));break;case OTR.CONST.STATUS_SMP_HANDLE:jsxc.keepBusyAlive()}jsxc.storage.setUserItem("buddy",bid,data),jsxc.gui.update(bid)}}),jsxc.otr.objects[bid].on("smp",function(type,data){switch(type){case"question":if(jsxc.gui.window.postMessage(bid,"sys",$.t("Authentication_request_received")),$("#jsxc_dialog").length>0){jsxc.otr.objects[bid].sm.abort();break}jsxc.otr.onSmpQuestion(bid,data),jsxc.storage.setUserItem("smp_"+bid,{data:data||null});break;case"trust":jsxc.otr.objects[bid].trust=data,jsxc.storage.updateUserItem("buddy",bid,"trust",data),jsxc.otr.backup(bid),jsxc.gui.update(bid),data?jsxc.gui.window.postMessage(bid,"sys",$.t("conversation_is_now_verified")):jsxc.gui.window.postMessage(bid,"sys",$.t("authentication_failed")),jsxc.storage.removeUserItem("smp_"+bid),jsxc.gui.dialog.close();break;case"abort":jsxc.gui.window.postMessage(bid,"sys",$.t("Authentication_aborted"));break;default:jsxc.debug("[OTR] sm callback: Unknown type: "+type)}}),jsxc.otr.objects[bid].on("ui",function(msg,encrypted,meta){jsxc.otr.receiveMessage({bid:bid,msg:msg,encrypted:encrypted===!0,stamp:meta.stamp,forwarded:meta.forwarded})}),jsxc.otr.objects[bid].on("io",function(msg,uid){var jid=jsxc.gui.window.get(bid).data("jid")||jsxc.otr.objects[bid].jid;jsxc.otr.objects[bid].jid=jid,jsxc.otr.sendMessage(jid,msg,uid)}),jsxc.otr.objects[bid].on("error",function(err){"Received an unencrypted message."!==err&&jsxc.gui.window.postMessage(bid,"sys","[OTR] "+$.t(err)),jsxc.error("[OTR] "+err)}),jsxc.otr.restore(bid)}},onSmpQuestion:function(bid,data){jsxc.gui.showVerification(bid),$("#jsxc_dialog select").prop("selectedIndex",data?2:3).change(),$("#jsxc_dialog > div:eq(0)").hide(),data?($("#jsxc_dialog > div:eq(2)").find("#jsxc_quest").val(data).prop("disabled",!0),$("#jsxc_dialog > div:eq(2)").find(".creation").text("Answer"),$("#jsxc_dialog > div:eq(2)").find(".jsxc_explanation").text($.t("your_buddy_is_attempting_to_determine_")+" "+$.t("to_authenticate_to_your_buddy")+$.t("enter_the_answer_and_click_answer"))):$("#jsxc_dialog > div:eq(3)").find(".jsxc_explanation").text($.t("your_buddy_is_attempting_to_determine_")+" "+$.t("to_authenticate_to_your_buddy")+$.t("enter_the_secret")),$("#jsxc_dialog .jsxc_close").click(function(){jsxc.storage.removeUserItem("smp_"+bid),jsxc.master&&jsxc.otr.objects[bid].sm.abort()})},sendSmpReq:function(bid,sec,quest){jsxc.keepBusyAlive(),jsxc.otr.objects[bid].smpSecret(sec,quest||"")},toggleTransfer:function(bid){0===jsxc.storage.getUserItem("buddy",bid).msgstate?jsxc.otr.goEncrypt(bid):jsxc.otr.goPlain(bid)},goEncrypt:function(bid){jsxc.master?jsxc.otr.objects[bid].sendQueryMsg():jsxc.storage.updateUserItem("buddy",bid,"transferReq",1)},goPlain:function(bid,cb){jsxc.master?(jsxc.otr.objects[bid].endOtr.call(jsxc.otr.objects[bid],cb),jsxc.otr.objects[bid].init.call(jsxc.otr.objects[bid]),jsxc.otr.backup(bid)):jsxc.storage.updateUserItem("buddy",bid,"transferReq",0)},backup:function(bid){var o=jsxc.otr.objects[bid],r={};if(null!==o){var i,savekey=["jid","our_instance_tag","msgstate","authstate","fragment","their_y","their_old_y","their_keyid","their_instance_tag","our_dh","our_old_dh","our_keyid","sessKeys","storedMgs","oldMacKeys","trust","transmittedRS","ssid","receivedPlaintext","authstate","send_interval"];for(i=0;i<savekey.length;i++)r[savekey[i]]=JSON.stringify(o[savekey[i]]);null!==o.their_priv_pk&&(r.their_priv_pk=JSON.stringify(o.their_priv_pk.packPublic())),o.ake.otr_version&&""!==o.ake.otr_version&&(r.otr_version=JSON.stringify(o.ake.otr_version)),jsxc.storage.setUserItem("otr",bid,r)}},restore:function(bid){var o=jsxc.otr.objects[bid],d=jsxc.storage.getUserItem("otr",bid);if(null!==o||null!==d){var key;for(key in d)if(d.hasOwnProperty(key)){var val=JSON.parse(d[key]);"their_priv_pk"===key&&null!==val&&(val=DSA.parsePublic(val)),"otr_version"===key&&null!==val?o.ake.otr_version=val:o[key]=val}jsxc.otr.objects[bid]=o,1===o.msgstate&&null!==o.their_priv_pk&&o._smInit.call(jsxc.otr.objects[bid])}jsxc.otr.enable(bid)},createDSA:function(){if(!jsxc.options.otr.priv)if(null===jsxc.storage.getUserItem("key")){var msg=$.t("Creating_your_private_key_"),worker=null;if(Worker)try{worker=new Worker(jsxc.options.root+"/lib/otr/build/dsa-webworker.js")}catch(err){jsxc.warn("Couldn't create web-worker.",err)}jsxc.otr.dsaFallback=null===worker,jsxc.otr.dsaFallback?(jsxc.gui.dialog.open(jsxc.gui.template.get("waitAlert",null,msg),{noClose:!0}),jsxc.debug("DSA key creation started."),setTimeout(function(){var dsa=new DSA;jsxc.otr.DSAready(dsa)},500)):(jsxc._onMaster(),worker.onmessage=function(e){var type=e.data.type,val=e.data.val;"debug"===type?jsxc.debug(val):"data"===type&&jsxc.otr.DSAready(DSA.parsePrivate(val))},worker.postMessage({imports:[jsxc.options.root+"/lib/otr/vendor/salsa20.js",jsxc.options.root+"/lib/otr/vendor/bigint.js",jsxc.options.root+"/lib/otr/vendor/crypto.js",jsxc.options.root+"/lib/otr/vendor/eventemitter.js",jsxc.options.root+"/lib/otr/lib/const.js",jsxc.options.root+"/lib/otr/lib/helpers.js",jsxc.options.root+"/lib/otr/lib/dsa.js"],seed:BigInt.getSeed(),debug:!0}))}else jsxc.debug("DSA key loaded"),jsxc.options.otr.priv=DSA.parsePrivate(jsxc.storage.getUserItem("key")),jsxc.otr._createDSA()},_createDSA:function(){jsxc.storage.setUserItem("priv_fingerprint",jsxc.options.otr.priv.fingerprint()),jsxc.otr.dsaFallback!==!1&&jsxc._onMaster()},DSAready:function(dsa){jsxc.storage.setUserItem("key",dsa.packPrivate()),jsxc.options.otr.priv=dsa,jsxc.otr.dsaFallback?jsxc.gui.dialog.close():$.each(jsxc.storage.getUserItem("windowlist"),function(index,val){jsxc.otr.create(val)}),jsxc.otr._createDSA()},enable:function(bid){jsxc.gui.window.get(bid).find(".jsxc_otr").removeClass("jsxc_disabled")}},jsxc.storage={PREFIX:"jsxc",SEP:":",getPrefix:function(uk){var self=jsxc.storage;return self.PREFIX+self.SEP+(uk&&jsxc.bid?jsxc.bid+self.SEP:"")},setItem:function(key,value,uk){jsxc.storageNotConform>0&&"rid"!==key&&"lastActivity"!==key&&(jsxc.storageNotConform>1&&null===jsxc.toSNC&&(jsxc.toSNC=window.setTimeout(function(){jsxc.storageNotConform=0,jsxc.storage.setItem("storageNotConform",0)},1e3)),jsxc.ls.push(JSON.stringify({key:key,value:value}))),"object"==typeof value&&(value=JSON.stringify(value)),localStorage.setItem(jsxc.storage.getPrefix(uk)+key,value)},setUserItem:function(type,key,value){var self=jsxc.storage;return 2===arguments.length?(value=key,key=type,type=""):3===arguments.length&&(key=type+self.SEP+key),jsxc.storage.setItem(key,value,!0)},getItem:function(key,uk){key=jsxc.storage.getPrefix(uk)+key;var value=localStorage.getItem(key);try{return JSON.parse(value)}catch(e){return value}},getUserItem:function(type,key){var self=jsxc.storage;return 1===arguments.length?key=type:2===arguments.length&&(key=type+self.SEP+key),jsxc.storage.getItem(key,!0)},removeItem:function(key,uk){jsxc.storageNotConform&&"rid"!==key&&"lastActivity"!==key&&jsxc.ls.push(JSON.stringify({key:jsxc.storage.prefix+key,value:""})),localStorage.removeItem(jsxc.storage.getPrefix(uk)+key)},removeUserItem:function(type,key){var self=jsxc.storage;1===arguments.length?key=type:2===arguments.length&&(key=type+self.SEP+key),jsxc.storage.removeItem(key,!0)},updateItem:function(key,variable,value,uk){var data=jsxc.storage.getItem(key,uk)||{};"object"==typeof variable?$.each(variable,function(key,val){"undefined"==typeof data[key]&&jsxc.debug("Variable "+key+" doesn't exist in "+variable+". It was created."),data[key]=val}):("undefined"==typeof data[variable]&&jsxc.debug("Variable "+variable+" doesn't exist. It was created."),data[variable]=value),jsxc.storage.setItem(key,data,uk)},updateUserItem:function(type,key,variable,value){var self=jsxc.storage;return 4===arguments.length||3===arguments.length&&"object"==typeof variable?key=type+self.SEP+key:(value=variable,variable=key,key=type),jsxc.storage.updateItem(key,variable,value,!0)},ink:function(key,uk){jsxc.storage.setItem(key,Number(jsxc.storage.getItem(key,uk))+1,uk)},removeElement:function(key,name,uk){var item=jsxc.storage.getItem(key,uk);$.isArray(item)?item=$.grep(item,function(e){return e!==name}):"object"==typeof item&&delete item[name],jsxc.storage.setItem(key,item,uk)},removeUserElement:function(type,key,name){var self=jsxc.storage;return 2===arguments.length?(name=key,key=type):3===arguments.length&&(key=type+self.SEP+key),jsxc.storage.removeElement(key,name,!0)},onStorage:function(e){if(e.key!==jsxc.storage.PREFIX+jsxc.storage.SEP+"rid"&&e.key!==jsxc.storage.PREFIX+jsxc.storage.SEP+"lastActivity"){var re=new RegExp("^"+jsxc.storage.PREFIX+jsxc.storage.SEP+"(?:[^"+jsxc.storage.SEP+"]+@[^"+jsxc.storage.SEP+"]+"+jsxc.storage.SEP+")?(.*)","i"),key=e.key.replace(re,"$1");if(jsxc.storageNotConform>0&&jsxc.ls.length>0){var val=e.newValue;try{val=JSON.parse(val)}catch(err){}var index=$.inArray(JSON.stringify({key:key,value:val}),jsxc.ls);
+if(index>=0)return jsxc.storageNotConform>1&&(window.clearTimeout(jsxc.toSNC),jsxc.storageNotConform=1,jsxc.storage.setItem("storageNotConform",1)),void jsxc.ls.splice(index,1)}if(e.oldValue!==e.newValue){var n,o,bid=key.replace(new RegExp("[^"+jsxc.storage.SEP+"]+"+jsxc.storage.SEP+"(.*)","i"),"$1");if(jsxc.master&&"alive"===key)return jsxc.debug("Master request."),void jsxc.storage.ink("alive");if(!(jsxc.master||"alive"!==key&&"alive_busy"!==key||jsxc.triggeredFromElement))return window.clearTimeout(jsxc.to),jsxc.to=window.setTimeout(jsxc.checkMaster,("alive"===key?jsxc.options.timeout:jsxc.options.busyTimeout)+jsxc.random(60)),void(jsxc.role_allocation||jsxc.onSlave());if(key.match(/^notices/)&&jsxc.notice.load(),key.match(/^presence/)&&jsxc.gui.changePresence(e.newValue,!0),key.match(/^options/)&&e.newValue&&(n=JSON.parse(e.newValue),"undefined"!=typeof n.muteNotification&&n.muteNotification?jsxc.notification.muteSound(!0):jsxc.notification.unmuteSound(!0)),key.match(/^hidden/)&&(jsxc.master?clearTimeout(jsxc.toNotification):jsxc.isHidden()),key.match(/^focus/)&&(jsxc.master?clearTimeout(jsxc.toNotification):jsxc.hasFocus()),key.match(new RegExp("^chat"+jsxc.storage.SEP)))for(var data,el,posts=JSON.parse(e.newValue);posts.length>0;)data=posts.pop(),el=$("#"+data.uid),0===el.length?(jsxc.master&&"out"===data.direction&&jsxc.xmpp.sendMessage(bid,data.msg,data.uid),jsxc.gui.window._postMessage(bid,data)):data.received&&el.addClass("jsxc_received");else{if(key.match(new RegExp("^window"+jsxc.storage.SEP)))return e.newValue?e.oldValue?(n=JSON.parse(e.newValue),n.minimize?jsxc.gui.window._hide(bid):jsxc.gui.window._show(bid),void jsxc.gui.window.setText(bid,n.text)):void jsxc.gui.window.open(bid):void jsxc.gui.window._close(bid);if(key.match(new RegExp("^smp"+jsxc.storage.SEP))){if(!e.newValue)return jsxc.gui.dialog.close(),void(jsxc.master&&jsxc.otr.objects[bid].sm.abort());n=JSON.parse(e.newValue),"undefined"!=typeof n.data?jsxc.otr.onSmpQuestion(bid,n.data):jsxc.master&&n.sec&&(jsxc.gui.dialog.close(),jsxc.otr.sendSmpReq(bid,n.sec,n.quest))}if(!jsxc.master&&key.match(new RegExp("^buddy"+jsxc.storage.SEP))){if(!e.newValue)return void jsxc.gui.roster.purge(bid);if(!e.oldValue)return void jsxc.gui.roster.add(bid);n=JSON.parse(e.newValue),o=JSON.parse(e.oldValue),jsxc.gui.update(bid),(o.status!==n.status||o.sub!==n.sub)&&jsxc.gui.roster.reorder(bid)}if(jsxc.master&&key.match(new RegExp("^deletebuddy"+jsxc.storage.SEP))&&e.newValue&&(n=JSON.parse(e.newValue),jsxc.xmpp.removeBuddy(n.jid),jsxc.storage.removeUserItem(key)),jsxc.master&&key.match(new RegExp("^buddy"+jsxc.storage.SEP))&&(n=JSON.parse(e.newValue),o=JSON.parse(e.oldValue),o.transferReq!==n.transferReq&&(jsxc.storage.updateUserItem("buddy",bid,"transferReq",-1),0===n.transferReq&&jsxc.otr.goPlain(bid),1===n.transferReq&&jsxc.otr.goEncrypt(bid)),o.name!==n.name&&jsxc.gui.roster._rename(bid,n.name)),"sid"===key)return void(e.newValue||jsxc.xmpp.logout());"friendReq"===key&&(n=JSON.parse(e.newValue),jsxc.master&&n.approve>=0&&jsxc.xmpp.resFriendReq(n.jid,n.approve)),jsxc.master&&key.match(new RegExp("^add"+jsxc.storage.SEP))&&(n=JSON.parse(e.newValue),jsxc.xmpp.addBuddy(n.username,n.alias)),"roster"===key&&jsxc.gui.roster.toggle(),jsxc.master&&key.match(new RegExp("^vcard"+jsxc.storage.SEP))&&null!==e.newValue&&e.newValue.match(/^request:/)&&jsxc.xmpp.loadVcard(bid,function(stanza){jsxc.storage.setUserItem("vcard",bid,{state:"success",data:$("<div>").append(stanza).html()})},function(){jsxc.storage.setUserItem("vcard",bid,{state:"error"})}),jsxc.master||!key.match(new RegExp("^vcard"+jsxc.storage.SEP))||null===e.newValue||e.newValue.match(/^request:/)||(n=JSON.parse(e.newValue),"undefined"!=typeof n.state&&$(document).trigger("loaded.vcard.jsxc",n),jsxc.storage.removeUserItem("vcard",bid))}}}},saveMessage:function(bid,direction,msg,encrypted,forwarded,stamp,sender){var chat=jsxc.storage.getUserItem("chat",bid)||[],uid=(new Date).getTime()+":msg";chat.length>jsxc.options.get("numberOfMsg")&&chat.pop();var post={direction:direction,msg:msg,uid:uid.replace(/:/,"-"),received:!1,encrypted:encrypted||!1,forwarded:forwarded||!1,stamp:stamp||(new Date).getTime(),sender:sender};return chat.unshift(post),jsxc.storage.setUserItem("chat",bid,chat),post},saveBuddy:function(bid,data){return jsxc.storage.getUserItem("buddy",bid)?(jsxc.storage.updateUserItem("buddy",bid,data),"updated"):(jsxc.storage.setUserItem("buddy",bid,$.extend({jid:"",name:"",status:0,sub:"none",msgstate:0,transferReq:-1,trust:!1,fingerprint:null,res:[],type:"chat"},data)),"created")}},jsxc.gui.template.incomingCall='<h3 data-i18n="Incoming_call"></h3> <p><span data-i18n="Do_you_want_to_accept_the_call_from"></span> {{bid_name}}?</p> <p class="jsxc_right"> <a href="#" class="button jsxc_reject" data-i18n="Reject"></a> <a href="#" class="button creation jsxc_accept" data-i18n="Accept"></a> </p>',jsxc.gui.template.allowMediaAccess='<p data-i18n="Please_allow_access_to_microphone_and_camera"></p>',jsxc.gui.template.videoWindow='<div class="jsxc_webrtc"> <div class="jsxc_chatarea"> <ul></ul> </div> <div class="jsxc_videoContainer"> <video class="jsxc_localvideo" autoplay></video> <video class="jsxc_remotevideo" autoplay></video> <div class="jsxc_status"></div> <div class="bubblingG"> <span id="bubblingG_1"> </span> <span id="bubblingG_2"> </span> <span id="bubblingG_3"> </span> </div> <div class="jsxc_noRemoteVideo"> <div> <div></div> <p data-i18n="No_video_signal"></p> <div></div> </div> </div> </div> <div class="jsxc_controlbar"> <button type="button" class="jsxc_hangUp" data-i18n="hang_up"></button> <input type="range" class="jsxc_volume" min="0.0" max="1.0" step="0.05" value="0.5" /> <div class="jsxc_buttongroup"> <button type="button" class="jsxc_snapshot" data-i18n="snapshot"></button><button type="button" class="jsxc_snapshots">&#9660;</button> </div> <!-- <button type="button" class="jsxc_mute_local" data-i18n="mute_my_audio"></button> <button type="button" class="jsxc_pause_local" data-i18n="pause_my_video"></button> --> <button type="button" class="jsxc_showchat" data-i18n="chat"></button> <button type="button" class="jsxc_fullscreen" data-i18n="fullscreen"></button> <button type="button" class="jsxc_info" data-i18n="Info"></button> </div> <div class="jsxc_multi"> <div class="jsxc_snapshotbar"> <p>No pictures yet!</p> </div>\n <!--<div class="jsxc_chatarea"> <ul></ul> </div>--> <div class="jsxc_infobar"></div> </div> </div>',jsxc.webrtc={conn:null,localStream:null,remoteStream:null,last_caller:null,AUTO_ACCEPT:!1,reqVideoFeatures:["urn:xmpp:jingle:apps:rtp:video","urn:xmpp:jingle:apps:rtp:audio","urn:xmpp:jingle:transports:ice-udp:1","urn:xmpp:jingle:apps:dtls:0"],chatJids:{},init:function(){var self=jsxc.webrtc;return self.conn=jsxc.xmpp.conn,"firefox"===RTC.browser&&(self.conn.jingle.media_constraints.mandatory.MozDontOfferDataChannel=!0),self.conn.jingle?(self.conn.jingle.PRANSWER=!1,self.conn.jingle.AUTOACCEPT=!1,self.conn.jingle.ice_config=jsxc.storage.getUserItem("iceConfig"),self.conn.jingle.MULTIPARTY=!1,self.conn.jingle.pc_constraints=RTC.pc_constraints,$(document).on("message.jsxc",$.proxy(self.onMessage,self)),$(document).on("presence.jsxc",$.proxy(self.onPresence,self)),$(document).on("mediaready.jingle",$.proxy(self.onMediaReady,self)),$(document).on("mediafailure.jingle",$.proxy(self.onMediaFailure,self)),$(document).on("callincoming.jingle",$.proxy(self.onCallIncoming,self)),$(document).on("callterminated.jingle",$.proxy(self.onCallTerminated,self)),$(document).on("ringing.jingle",$.proxy(self.onCallRinging,self)),$(document).on("remotestreamadded.jingle",$.proxy(self.onRemoteStreamAdded,self)),$(document).on("remotestreamremoved.jingle",$.proxy(self.onRemoteStreamRemoved,self)),$(document).on("iceconnectionstatechange.jingle",$.proxy(self.onIceConnectionStateChanged,self)),$(document).on("nostuncandidates.jingle",$.proxy(self.noStunCandidates,self)),$(document).on("error.jingle",function(ev,sid,error){jsxc.error("[JINGLE]",error)}),self.conn.disco&&self.conn.disco.addFeature("urn:xmpp:jingle:apps:dtls:0"),self.conn.caps&&$(document).on("caps.strophe",$.proxy(self.onCaps,self)),void self.getTurnCrendentials()):void jsxc.error("No jingle plugin found!")},getTurnCrendentials:function(){if(!jsxc.options.turnCredentialsPath)return void jsxc.debug("No path for TURN credentials defined!");var ttl=(jsxc.storage.getUserItem("iceValidity")||0)-(new Date).getTime();return ttl>0?void window.setTimeout(jsxc.webrtc.getTurnCrendentials,ttl+500):void $.ajax(jsxc.options.turnCredentialsPath,{async:!0,success:function(data){var iceConfig={iceServers:[{url:"turn:"+data.url,credential:data.credential,username:data.username}]};jsxc.webrtc.conn.jingle.ice_config=iceConfig,jsxc.storage.setUserItem("iceConfig",iceConfig),jsxc.storage.setUserItem("iceValidity",(new Date).getTime()+1e3*data.ttl)},dataType:"json"})},getCapableRes:function(jid){var self=jsxc.webrtc,bid=jsxc.jidToBid(jid),res=jsxc.storage.getUserItem("res",bid)||[],available=[];return $.each(res,function(r){self.conn.caps.hasFeatureByJid(bid+"/"+r,self.reqVideoFeatures)&&available.push(r)}),available},onAddRosterItem:function(event,bid,data,el){var self=jsxc.webrtc;if(!self.conn)return void $(document).one("connectionReady.jsxc",function(){self.onAddRosterItem(null,bid,data,el)});var videoIcon=$('<div class="jsxc_video jsxc_disabled" title="'+$.t("Start_video_call")+'"></div>');videoIcon.click(function(){return self.startCall(data.jid),!1}),el.find(".jsxc_options.jsxc_left").append(videoIcon),el.on("extra.jsxc",function(){self.updateIcon(bid)})},initWindow:function(event,win){var self=jsxc.webrtc;if(!win.hasClass("jsxc_groupchat")){if(jsxc.debug("webrtc.initWindow"),!self.conn)return void $(document).one("connectionReady.jsxc",function(){self.initWindow(null,win)});var div=$("<div>").addClass("jsxc_video");win.find(".jsxc_transfer:eq(1)").after(div),self.updateIcon(jsxc.jidToBid(win.data("jid")))}},updateIcon:function(bid){jsxc.debug("Update icon",bid);var self=jsxc.webrtc;if(bid!==jsxc.jidToBid(self.conn.jid)){var win=jsxc.gui.window.get(bid),jid=win.data("jid")||jsxc.storage.getUserItem("buddy",bid).jid,el=win.find(".jsxc_video").add(jsxc.gui.roster.getItem(bid).find(".jsxc_video")),capableRes=self.getCapableRes(jid),targetRes=Strophe.getResourceFromJid(jid);null===targetRes&&($.each(jsxc.storage.getUserItem("buddy",bid).res||[],function(index,val){return capableRes.indexOf(val)>-1?(targetRes=val,!1):void 0}),jid=jid+"/"+targetRes),el.off("click"),capableRes.indexOf(targetRes)>-1?(el.click(function(){self.startCall(jid)}),el.removeClass("jsxc_disabled"),el.attr("title",$.t("Start_video_call"))):(el.addClass("jsxc_disabled"),el.attr("title",$.t("Video_call_not_possible")))}},onMessage:function(e,from){var self=jsxc.webrtc,bid=jsxc.jidToBid(from);jsxc.debug("webrtc.onmessage",from),self.chatJids[bid]!==from&&(self.updateIcon(bid),self.chatJids[bid]=from)},onPresence:function(ev,jid){var self=jsxc.webrtc;jsxc.debug("webrtc.onpresence",jid),self.updateIcon(jsxc.jidToBid(jid))},setStatus:function(txt,d){var status=$(".jsxc_webrtc .jsxc_status"),duration="undefined"==typeof d||null===d?4e3:d;if(jsxc.debug("[Webrtc]",txt),status.html()&&(txt=status.html()+"<br />"+txt),status.html(txt),status.css({"margin-left":"-"+status.width()/2+"px",opacity:0,display:"block"}),status.stop().animate({opacity:1}),clearTimeout(status.data("timeout")),0!==duration){var to=setTimeout(function(){status.stop().animate({opacity:0},function(){status.html("")})},duration);status.data("timeout",to)}},onCaps:function(event,jid){var self=jsxc.webrtc;self.updateIcon(jsxc.jidToBid(jid))},onMediaReady:function(event,stream){jsxc.debug("media ready");var self=jsxc.webrtc;self.localStream=stream,self.conn.jingle.localStream=stream,jsxc.gui.showVideoWindow(self.last_caller);var i;for(i=0;i<stream.getAudioTracks().length;i++)self.setStatus(stream.getAudioTracks().length>0?"Use local audio device.":"No local audio device."),jsxc.debug('using audio device "'+stream.getAudioTracks()[i].label+'"');for(i=0;i<stream.getVideoTracks().length;i++)self.setStatus(stream.getVideoTracks().length>0?"Use local video device.":"No local video device."),jsxc.debug('using video device "'+stream.getVideoTracks()[i].label+'"'),$("#jsxc_dialog .jsxc_localvideo").show();$(document).one("cleanup.dialog.jsxc",$.proxy(self.hangUp,self)),$(document).trigger("finish.mediaready.jsxc")},onMediaFailure:function(ev,err){this.setStatus("media failure"),jsxc.gui.window.postMessage(jsxc.jidToBid(jsxc.webrtc.last_caller),"sys",$.t("Media_failure")+err.name),jsxc.debug("media failure: "+err.name)},onCallIncoming:function(event,sid){jsxc.debug("incoming call"+sid);var self=this,sess=this.conn.jingle.sessions[sid],bid=jsxc.jidToBid(sess.peerjid);if(jsxc.gui.window.postMessage(bid,"sys",$.t("Incoming_call")),jsxc.notification.notify($.t("Incoming_call"),$.t("from")+" "+bid),sess.sendRinging(),jsxc.webrtc.last_caller=sess.peerjid,jsxc.switchEvents({"mediaready.jingle":function(event,stream){self.setStatus("Accept call"),sess.localStream=stream,sess.peerconnection.addStream(stream),sess.sendAnswer(),sess.accept()},"mediafailure.jingle":function(){sess.sendTerminate("decline"),sess.terminate()}}),jsxc.webrtc.AUTO_ACCEPT)return void self.reqUserMedia();var dialog=jsxc.gui.dialog.open(jsxc.gui.template.get("incomingCall",bid),{noClose:!0});dialog.find(".jsxc_accept").click(function(){$(document).trigger("accept.call.jsxc"),self.reqUserMedia()}),dialog.find(".jsxc_reject").click(function(){jsxc.gui.dialog.close(),$(document).trigger("reject.call.jsxc"),sess.sendTerminate("decline"),sess.terminate()})},onCallTerminated:function(event,sid,reason,text){this.setStatus("call terminated "+sid+(reason?": "+reason+" "+text:""));var bid=jsxc.jidToBid(jsxc.webrtc.last_caller);this.localStream&&this.localStream.stop(),$(".jsxc_videoContainer").length&&($(".jsxc_remotevideo")[0].src="",$(".jsxc_localvideo")[0].src=""),this.conn.jingle.localStream=null,this.localStream=null,this.remoteStream=null;var win=$("#jsxc_dialog .jsxc_chatarea > ul > li");$("#jsxc_windowList > ul").prepend(win.detach()),win.find(".slimScrollDiv").resizable("enable"),$(document).off("cleanup.dialog.jsxc"),$(document).off("error.jingle"),jsxc.gui.dialog.close(),jsxc.gui.window.postMessage(bid,"sys",$.t("Call_terminated")+(reason?": "+$.t(reason):"")+".")},onCallRinging:function(){this.setStatus("ringing...",0)},onRemoteStreamAdded:function(event,data,sid){this.setStatus("Remote stream for session "+sid+" added.");var stream=data.stream;this.remoteStream=stream;var sess=this.conn.jingle.sessions[sid],isVideoDevice=stream.getVideoTracks().length>0,isAudioDevice=stream.getAudioTracks().length>0;sess.remoteDevices={video:isVideoDevice,audio:isAudioDevice},this.setStatus(isVideoDevice?"Use remote video device.":"No remote video device"),this.setStatus(isAudioDevice?"Use remote audio device.":"No remote audio device"),$(".jsxc_remotevideo").length&&(RTC.attachMediaStream($("#jsxc_dialog .jsxc_remotevideo"),stream),$("#jsxc_dialog .jsxc_"+(isVideoDevice?"remotevideo":"noRemoteVideo")).addClass("jsxc_deviceAvailable"))},onRemoteStreamRemoved:function(event,data,sid){this.setStatus("Remote stream for session "+sid+" removed.")},onIceConnectionStateChanged:function(event,sid,sess){var sigState=sess.peerconnection.signalingState,iceCon=sess.peerconnection.iceConnectionState;if(jsxc.debug("iceGat state for "+sid,sess.peerconnection.iceGatheringState),jsxc.debug("iceCon state for "+sid,iceCon),jsxc.debug("sig state for "+sid,sigState),"stable"!==sigState||"connected"!==iceCon&&"completed"!==iceCon)"failed"===iceCon&&(jsxc.gui.window.postMessage(jsxc.jidToBid(sess.peerjid),"sys",$.t("ICE_connection_failure")),$(document).off("cleanup.dialog.jsxc"),sess.sendTerminate("failed-transport"),sess.terminate(),$(document).trigger("callterminated.jingle"));else{$("#jsxc_dialog .jsxc_deviceAvailable").show(),$("#jsxc_dialog .bubblingG").hide();var localSDP=sess.peerconnection.localDescription.sdp,remoteSDP=sess.peerconnection.remoteDescription.sdp;sess.local_fp=SDPUtil.parse_fingerprint(SDPUtil.find_line(localSDP,"a=fingerprint:")).fingerprint,sess.remote_fp=SDPUtil.parse_fingerprint(SDPUtil.find_line(remoteSDP,"a=fingerprint:")).fingerprint;var ip_regex="(\\d{1,3}\\.\\d{1,3}.\\d{1,3}\\.\\d{1,3}) \\d+ typ host";sess.remote_ip=remoteSDP.match(new RegExp(ip_regex))[1],sess.local_ip=localSDP.match(new RegExp(ip_regex))[1];for(var match,regex=new RegExp(ip_regex,"g");null!==(match=regex.exec(remoteSDP));)if(match[1]!==sess.remote_ip)return void alert("!!! WARNING !!!\n\nPossible Man-in-the-middle attack detected!\n\nYou should close the connection.");var text="<p>";text+="<b>"+$.t("Local_IP")+": </b>"+sess.local_ip+"<br />",text+="<b>"+$.t("Remote_IP")+": </b>"+sess.remote_ip+"<br />",text+="<b>"+$.t("Local_Fingerprint")+": </b>"+sess.local_fp+"<br />",text+="<b>"+$.t("Remote_Fingerprint")+": </b>"+sess.remote_fp,text+="</p>",$("#jsxc_dialog .jsxc_infobar").html(text)}},noStunCandidates:function(){},startCall:function(jid,um){var self=this;return null===Strophe.getResourceFromJid(jid)?void jsxc.debug("We need a full jid"):(self.last_caller=jid,jsxc.switchEvents({"finish.mediaready.jsxc":function(){self.setStatus("Initiate call"),jsxc.gui.window.postMessage(jsxc.jidToBid(jid),"sys",$.t("Call_started")),$(document).one("error.jingle",function(e,sid,error){"offer"===error.source&&($(document).off("cleanup.dialog.jsxc"),setTimeout(function(){jsxc.gui.showAlert("Sorry, we couldn't establish a connection. Maybe your buddy is offline.")},500))}),self.conn.jingle.initiate(jid,self.conn.jid.toLowerCase())},"mediafailure.jingle":function(){jsxc.gui.dialog.close()}}),void self.reqUserMedia(um))},hangUp:function(reason,text){$(document).off("cleanup.dialog.jsxc"),jsxc.webrtc.conn.jingle.terminate(null,reason,text),$(document).trigger("callterminated.jingle")},reqUserMedia:function(um){return this.localStream?void $(document).trigger("mediaready.jingle",[this.localStream]):(um=um||["video","audio"],jsxc.gui.dialog.open(jsxc.gui.template.get("allowMediaAccess"),{noClose:!0}),this.setStatus("please allow access to microphone and camera"),void("undefined"!=typeof MediaStreamTrack&&"undefined"!=typeof MediaStreamTrack.getSources?MediaStreamTrack.getSources(function(sourceInfo){var availableDevices=sourceInfo.map(function(el){return el.kind});um=um.filter(function(el){return-1!==availableDevices.indexOf(el)}),getUserMediaWithConstraints(um)}):getUserMediaWithConstraints(um)))},snapshot:function(video){video||jsxc.debug("Missing video element"),$(".jsxc_snapshotbar p").remove();var canvas=$("<canvas/>").css("display","none").appendTo("body").attr({width:video.width(),height:video.height()}).get(0),ctx=canvas.getContext("2d");ctx.drawImage(video[0],0,0);var img=$("<img/>"),url=null;try{url=canvas.toDataURL("image/jpeg")}catch(err){return void jsxc.warn("Error",err)}img[0].src=url;var link=$("<a/>").attr({target:"_blank",href:url});link.append(img),$(".jsxc_snapshotbar").append(link),canvas.remove()}},jsxc.gui.showVideoWindow=function(jid){var self=jsxc.webrtc;$(document).one("complete.dialog.jsxc",function(){$("#jsxc_dialog .jsxc_localvideo")[0].muted=!0,$("#jsxc_dialog .jsxc_localvideo")[0].volume=0;var rv=$("#jsxc_dialog .jsxc_remotevideo"),lv=$("#jsxc_dialog .jsxc_localvideo");lv.draggable({containment:"parent"}),RTC.attachMediaStream(lv,self.localStream);var w_dialog=$("#jsxc_dialog").width(),w_remote=rv.width();if(w_remote>w_dialog){var scale=w_dialog/w_remote,new_h=rv.height()*scale,new_w=w_dialog,vc=$("#jsxc_dialog .jsxc_videoContainer");rv.height(new_h),rv.width(new_w),vc.height(new_h),vc.width(new_w),lv.height(lv.height()*scale),lv.width(lv.width()*scale)}self.remoteStream&&(RTC.attachMediaStream(rv,self.remoteStream),$("#jsxc_dialog .jsxc_"+(self.remoteStream.getVideoTracks().length>0?"remotevideo":"noRemoteVideo")).addClass("jsxc_deviceAvailable"));var toggleMulti=function(elem,open){$("#jsxc_dialog .jsxc_multi > div").not(elem).slideUp();var opt={complete:jsxc.gui.dialog.resize};open?elem.slideDown(opt):elem.slideToggle(opt)},win=jsxc.gui.window.open(jsxc.jidToBid(jid));win.find(".slimScrollDiv").resizable("disable"),win.find(".jsxc_textarea").slimScroll({height:413}),win.find(".jsxc_emoticons").css("top","419px"),$("#jsxc_dialog .jsxc_chatarea ul").append(win.detach()),$("#jsxc_dialog .jsxc_hangUp").click(function(){jsxc.webrtc.hangUp()}),$("#jsxc_dialog .jsxc_snapshot").click(function(){jsxc.webrtc.snapshot(rv),toggleMulti($("#jsxc_dialog .jsxc_snapshotbar"),!0)}),$("#jsxc_dialog .jsxc_snapshots").click(function(){toggleMulti($("#jsxc_dialog .jsxc_snapshotbar"))}),$("#jsxc_dialog .jsxc_showchat").click(function(){var chatarea=$("#jsxc_dialog .jsxc_chatarea");chatarea.is(":hidden")?(chatarea.show(),$("#jsxc_dialog .jsxc_webrtc").width("900"),jsxc.gui.dialog.resize({width:"920px"})):(chatarea.hide(),$("#jsxc_dialog .jsxc_webrtc").width("650"),jsxc.gui.dialog.resize({width:"660px"}))}),$("#jsxc_dialog .jsxc_info").click(function(){toggleMulti($("#jsxc_dialog .jsxc_infobar"))}),$("#jsxc_dialog .jsxc_fullscreen").click(function(){$.support.fullscreen&&($(document).one("disabled.fullscreen",function(){lv.removeAttr("style")}),$("#jsxc_dialog .jsxc_videoContainer").fullscreen())}),$("#jsxc_dialog .jsxc_volume").change(function(){rv[0].volume=$(this).val()}),$("#jsxc_dialog .jsxc_volume").dblclick(function(){$(this).val(.5)})}),jsxc.gui.dialog.open(jsxc.gui.template.get("videoWindow"),{noClose:!0})},$.extend(jsxc.CONST,{KEYCODE_ENTER:13,KEYCODE_ESC:27}),$(document).ready(function(){RTC=setupRTC(),null!==RTC&&(RTCPeerconnection=RTC.peerconnection,$(document).on("add.roster.jsxc",jsxc.webrtc.onAddRosterItem),$(document).on("init.window.jsxc",jsxc.webrtc.initWindow),$(document).on("attached.jsxc",jsxc.webrtc.init))}),jsxc.xmpp={conn:null,login:function(){if(!jsxc.xmpp.conn||!jsxc.xmpp.conn.connected){var jid=null,password=null,sid=null,rid=null;switch(arguments.length){case 2:jid=arguments[0],password=arguments[1];break;case 3:jid=arguments[0],sid=arguments[1],rid=arguments[2];break;default:sid=jsxc.storage.getItem("sid"),rid=jsxc.storage.getItem("rid"),null!==sid&&null!==rid?jid=jsxc.storage.getItem("jid"):(sid=null,rid=null,jid=jsxc.options.xmpp.jid)}var url=jsxc.options.get("xmpp").url;$(document).on("connected.jsxc",jsxc.xmpp.connected),$(document).on("attached.jsxc",jsxc.xmpp.attached),$(document).on("disconnected.jsxc",jsxc.xmpp.disconnected),$(document).on("ridChange",jsxc.xmpp.onRidChange),$(document).on("connfail.jsxc",jsxc.xmpp.onConnfail),$(document).on("authfail.jsxc",jsxc.xmpp.onAuthFail),Strophe.addNamespace("RECEIPTS","urn:xmpp:receipts"),jsxc.xmpp.conn=new Strophe.Connection(url);var stropheGetUniqueId=jsxc.xmpp.conn.getUniqueId;jsxc.xmpp.conn.getUniqueId=function(suffix){var uid=stropheGetUniqueId.call(jsxc.xmpp.conn,suffix);return jsxc.storage.setItem("_uniqueId",jsxc.xmpp.conn._uniqueId),uid},jsxc.storage.getItem("debug")===!0&&(jsxc.xmpp.conn.xmlInput=function(data){console.log("<",data)},jsxc.xmpp.conn.xmlOutput=function(data){console.log(">",data)});var callback=function(status,condition){switch(jsxc.debug(Object.getOwnPropertyNames(Strophe.Status)[status]+": "+condition),status){case Strophe.Status.CONNECTED:jsxc.bid=jsxc.jidToBid(jsxc.xmpp.conn.jid.toLowerCase()),$(document).trigger("connected.jsxc");break;case Strophe.Status.ATTACHED:$(document).trigger("attached.jsxc");break;case Strophe.Status.DISCONNECTED:$(document).trigger("disconnected.jsxc");break;case Strophe.Status.CONNFAIL:$(document).trigger("connfail.jsxc");break;case Strophe.Status.AUTHFAIL:$(document).trigger("authfail.jsxc")}};jsxc.xmpp.conn.caps&&(jsxc.xmpp.conn.caps.node="http://jsxc.org/"),jsxc.restore&&sid&&rid?(jsxc.debug("Try to attach"),jsxc.debug("SID: "+sid),jsxc.xmpp.conn.attach(jid,sid,rid,callback)):(jsxc.debug("New connection"),jsxc.xmpp.conn.caps&&jsxc.xmpp.conn._addSysHandler(function(stanza){var from=jsxc.xmpp.conn.domain,c=stanza.querySelector("c"),ver=c.getAttribute("ver"),node=c.getAttribute("node"),_jidNodeIndex=JSON.parse(localStorage.getItem("strophe.caps._jidNodeIndex"))||{};jsxc.xmpp.conn.caps._jidVerIndex[from]=ver,_jidNodeIndex[from]=node,localStorage.setItem("strophe.caps._jidVerIndex",JSON.stringify(jsxc.xmpp.conn.caps._jidVerIndex)),localStorage.setItem("strophe.caps._jidNodeIndex",JSON.stringify(_jidNodeIndex))},Strophe.NS.CAPS),jsxc.xmpp.conn.connect(jid||jsxc.options.xmpp.jid,password||jsxc.options.xmpp.password,callback))}},logout:function(complete){if(jsxc.storage.removeItem("sid"),jsxc.storage.removeUserItem("buddylist"),jsxc.storage.removeUserItem("windowlist"),jsxc.storage.removeItem("_uniqueId"),!jsxc.master)return $("#jsxc_roster").remove(),$("#jsxc_windowlist").remove(),!0;if(null===jsxc.xmpp.conn)return!0;$("body").click(),jsxc.triggeredFromElement="boolean"==typeof complete?complete:!0,$.each(jsxc.storage.getUserItem("otrlist")||{},function(i,val){jsxc.otr.create(val)});var numOtr=Object.keys(jsxc.otr.objects||{}).length+1,disReady=function(){--numOtr<=0&&(jsxc.xmpp.conn.flush(),setTimeout(function(){jsxc.xmpp.conn.disconnect()},600))};return $.each(jsxc.otr.objects||{},function(key,obj){obj.msgstate===OTR.CONST.MSGSTATE_ENCRYPTED?obj.endOtr.call(obj,function(){obj.init.call(obj),jsxc.otr.backup(key),disReady()}):disReady()}),disReady(),!1},connected:function(){jsxc.xmpp.conn.pause();var nomJid=Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid).toLowerCase()+"/"+Strophe.getResourceFromJid(jsxc.xmpp.conn.jid);if(jsxc.storage.setItem("sid",jsxc.xmpp.conn._proto.sid),jsxc.storage.setItem("jid",nomJid),jsxc.storage.setItem("lastActivity",(new Date).getTime()),jsxc.storage.removeUserItem("buddylist"),jsxc.storage.removeUserItem("windowlist"),jsxc.storage.removeUserItem("own"),jsxc.storage.removeUserItem("avatar","own"),jsxc.storage.removeUserItem("otrlist"),jsxc.options.loginForm.triggered)switch(jsxc.options.loginForm.onConnected||"submit"){case"submit":jsxc.submitLoginForm();case!1:return void jsxc.xmpp.connectionReady()}jsxc.gui.init(),$("#jsxc_roster").removeClass("jsxc_noConnection"),jsxc.onMaster(),jsxc.xmpp.conn.resume(),jsxc.gui.dialog.close(),$(document).trigger("attached.jsxc")},attached:function(){jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged,"jabber:iq:roster","iq","set"),jsxc.xmpp.conn.addHandler(jsxc.xmpp.onMessage,null,"message","chat"),jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived,null,"message"),jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence,null,"presence");var caps=jsxc.xmpp.conn.caps,domain=jsxc.xmpp.conn.domain;if(caps&&jsxc.options.get("carbons").enable){var conditionalEnable=function(){jsxc.xmpp.conn.caps.hasFeatureByJid(domain,jsxc.CONST.NS.CARBONS)&&jsxc.xmpp.carbons.enable()};if("undefined"==typeof caps._knownCapabilities[caps._jidVerIndex[domain]]){var _jidNodeIndex=JSON.parse(localStorage.getItem("strophe.caps._jidNodeIndex"))||{};$(document).on("caps.strophe",function onCaps(ev,from){from===domain&&(conditionalEnable(),$(document).off("caps.strophe",onCaps))}),caps._requestCapabilities(jsxc.xmpp.conn.domain,_jidNodeIndex[domain],caps._jidVerIndex[domain])}else conditionalEnable()}if(jsxc.restore&&jsxc.storage.getUserItem("buddylist"))jsxc.xmpp.sendPres();else{$(document).one("cloaded.roster.jsxc",jsxc.xmpp.sendPres),$("#jsxc_roster > p:first").remove();var iq=$iq({type:"get"}).c("query",{xmlns:"jabber:iq:roster"});jsxc.xmpp.conn.sendIQ(iq,jsxc.xmpp.onRoster)}jsxc.xmpp.connectionReady()},connectionReady:function(){jsxc.xmpp.conn._uniqueId=jsxc.storage.getItem("_uniqueId")||(new Date).getTime(),$(document).trigger("connectionReady.jsxc")},sendPres:function(){jsxc.xmpp.conn.disco&&(jsxc.xmpp.conn.disco.addIdentity("client","web","JSXC"),jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO),jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS));var pres=$pres();jsxc.xmpp.conn.caps&&pres.c("c",jsxc.xmpp.conn.caps.generateCapsAttrs()).up();var presState=jsxc.storage.getUserItem("presence")||"online";"online"!==presState&&pres.c("show").t(presState).up();var priority=jsxc.options.get("priority");priority&&"undefined"!=typeof priority[presState]&&0!==parseInt(priority[presState])&&pres.c("priority").t(priority[presState]).up(),jsxc.debug("Send presence",pres.toString()),jsxc.xmpp.conn.send(pres)},disconnected:function(){jsxc.debug("disconnected"),jsxc.storage.removeItem("sid"),jsxc.storage.removeItem("rid"),jsxc.storage.removeItem("lastActivity"),jsxc.storage.removeItem("hidden"),jsxc.storage.removeUserItem("avatar","own"),jsxc.storage.removeUserItem("otrlist"),$(document).off("connected.jsxc",jsxc.xmpp.connected),$(document).off("attached.jsxc",jsxc.xmpp.attached),$(document).off("disconnected.jsxc",jsxc.xmpp.disconnected),$(document).off("ridChange",jsxc.xmpp.onRidChange),$(document).off("connfail.jsxc",jsxc.xmpp.onConnfail),$(document).off("authfail.jsxc",jsxc.xmpp.onAuthFail),jsxc.xmpp.conn=null,$("#jsxc_windowList").remove(),jsxc.triggeredFromElement?($(document).trigger("toggle.roster.jsxc",["hidden",0]),$("#jsxc_roster").remove(),jsxc.triggeredFromLogout&&(window.location=jsxc.options.logoutElement.attr("href"))):jsxc.gui.roster.noConnection(),window.clearInterval(jsxc.keepalive)},onConnfail:function(ev,condition){jsxc.debug("XMPP connection failed: "+condition),jsxc.options.loginForm.triggered&&jsxc.submitLoginForm()},onAuthFail:function(){if(jsxc.options.loginForm.triggered)switch(jsxc.options.loginForm.onAuthFail||"ask"){case"ask":jsxc.gui.showAuthFail();break;case"submit":jsxc.submitLoginForm()}jsxc.triggeredFromBox&&jsxc.gui.showAuthFail()},onRoster:function(iq){jsxc.debug("Load roster",iq);var buddies=[];$(iq).find("item").each(function(){var jid=$(this).attr("jid"),name=$(this).attr("name")||jid,bid=jsxc.jidToBid(jid),sub=$(this).attr("subscription");buddies.push(bid),jsxc.storage.removeUserItem("res",bid),jsxc.storage.saveBuddy(bid,{jid:jid,name:name,status:0,sub:sub,res:[]}),jsxc.gui.roster.add(bid)}),0===buddies.length&&jsxc.gui.roster.empty(),jsxc.storage.setUserItem("buddylist",buddies),jsxc.debug("Roster loaded"),$(document).trigger("cloaded.roster.jsxc")},onRosterChanged:function(iq){return jsxc.debug("onRosterChanged",iq),$(iq).find("item").each(function(){var jid=$(this).attr("jid"),name=$(this).attr("name")||jid,bid=jsxc.jidToBid(jid),sub=$(this).attr("subscription");if("remove"===sub)jsxc.gui.roster.purge(bid);else{var bl=jsxc.storage.getUserItem("buddylist");bl.indexOf(bid)<0&&(bl.push(bid),jsxc.storage.setUserItem("buddylist",bl));var temp=jsxc.storage.saveBuddy(bid,{jid:jid,name:name,sub:sub});"updated"===temp?(jsxc.gui.update(bid),jsxc.gui.roster.reorder(bid)):jsxc.gui.roster.add(bid)}if("from"===sub||"both"===sub){var notice,notices=jsxc.storage.getUserItem("notices"),noticeKey=null;for(noticeKey in notices)notice=notices[noticeKey],"gui.showApproveDialog"===notice.fnName&&notice.fnParams[0]===jid&&(jsxc.debug("Remove notice with key "+noticeKey),jsxc.notice.remove(noticeKey))}}),jsxc.storage.getUserItem("buddylist")&&0!==jsxc.storage.getUserItem("buddylist").length?$("#jsxc_roster > p:first").remove():jsxc.gui.roster.empty(),!0},onPresence:function(presence){jsxc.debug("onPresence",presence);var ptype=$(presence).attr("type"),from=$(presence).attr("from"),jid=Strophe.getBareJidFromJid(from).toLowerCase(),r=Strophe.getResourceFromJid(from),bid=jsxc.jidToBid(jid),data=jsxc.storage.getUserItem("buddy",bid),res=jsxc.storage.getUserItem("res",bid)||{},status=null,xVCard=$(presence).find('x[xmlns="vcard-temp:x:update"]');
+if(jid===Strophe.getBareJidFromJid(jsxc.storage.getItem("jid")))return!0;if("error"===ptype)return $(document).trigger("error.presence.jsxc",[from,presence]),jsxc.error("[XMPP] "+$(presence).attr("code")),!0;if("subscribe"===ptype)return jsxc.storage.setUserItem("friendReq",{jid:jid,approve:-1}),jsxc.notice.add($.t("Friendship_request"),$.t("from")+" "+jid,"gui.showApproveDialog",[jid]),!0;if("unavailable"===ptype||"unsubscribed"===ptype)status=jsxc.CONST.STATUS.indexOf("offline");else{var show=$(presence).find("show").text();status=jsxc.CONST.STATUS.indexOf(""===show?"online":show)}0===status?delete res[r]:res[r]=status;var maxVal=[],max=0,prop=null;for(prop in res)res.hasOwnProperty(prop)&&max<=res[prop]&&(max!==res[prop]&&(maxVal=[],max=res[prop]),maxVal.push(prop));if(0===data.status&&max>0&&jsxc.notification.notify({title:data.name,msg:$.t("has_come_online"),source:bid}),data.status=max,data.res=maxVal,data.jid=jid,xVCard.length>0){var photo=xVCard.find("photo");photo.length>0&&photo.text()!==data.avatar&&(jsxc.storage.removeUserItem("avatar",data.avatar),data.avatar=photo.text())}return jsxc.gui.window.get(bid).length>0&&jsxc.gui.window.get(bid).data("jid",jid),jsxc.storage.setUserItem("buddy",bid,data),jsxc.storage.setUserItem("res",bid,res),jsxc.debug("Presence ("+from+"): "+status),jsxc.gui.update(bid),jsxc.gui.roster.reorder(bid),$(document).trigger("presence.jsxc",[from,status,presence]),!0},onMessage:function(stanza){var message,carbon,forwarded=$(stanza).find('forwarded[xmlns="'+jsxc.CONST.NS.FORWARD+'"]');forwarded.length>0?(message=forwarded.find("> message"),forwarded=!0,carbon=$(stanza).find('> [xmlns="'+jsxc.CONST.NS.CARBONS+'"]'),0===carbon.length&&(carbon=!1),jsxc.debug("Incoming forwarded message",message)):(message=stanza,forwarded=!1,carbon=!1,jsxc.debug("Incoming message",message));var body=$(message).find("body:first").text();if(!body||body.match(/\?OTR/i)&&forwarded)return!0;var bid,type=$(message).attr("type"),from=$(message).attr("from"),mid=$(message).attr("id"),delay=$(message).find('delay[xmlns="urn:xmpp:delay"]'),stamp=delay.length>0?new Date(delay.attr("stamp")):new Date;if(stamp=stamp.getTime(),carbon){var direction="sent"===carbon.prop("tagName")?"out":"in";return bid=jsxc.jidToBid("out"===direction?$(message).attr("to"):from),jsxc.gui.window.postMessage(bid,direction,body,!1,forwarded,stamp),!0}forwarded&&(body=from+" "+$.t("to")+" "+$(stanza).attr("to")+'"'+body+'"',from=$(stanza).attr("from"));var jid=Strophe.getBareJidFromJid(from);bid=jsxc.jidToBid(jid);var data=jsxc.storage.getUserItem("buddy",bid),request=$(message).find("request[xmlns='urn:xmpp:receipts']");if(null===data){var chat=jsxc.storage.getUserItem("chat",bid)||[];0===chat.length&&jsxc.notice.add($.t("Unknown_sender"),$.t("You_received_a_message_from_an_unknown_sender")+" ("+bid+").","gui.showUnknownSender",[bid]);var msg=jsxc.removeHTML(body);return msg=jsxc.escapeHTML(msg),jsxc.storage.saveMessage(bid,"in",msg,!1,forwarded,stamp),!0}var win=jsxc.gui.window.init(bid);return"chat"===type&&(win.data("jid",from),jsxc.storage.updateUserItem("buddy",bid,{jid:from})),$(document).trigger("message.jsxc",[from,body]),jsxc.master&&!jsxc.otr.objects[bid]&&jsxc.otr.create(bid),forwarded||null===mid||!request.length||null===data||"both"!==data.sub&&"from"!==data.sub||"chat"!==type||jsxc.xmpp.conn.send($msg({to:from}).c("received",{xmlns:"urn:xmpp:receipts",id:mid})),jsxc.otr.objects.hasOwnProperty(bid)?jsxc.otr.objects[bid].receiveMsg(body,{stamp:stamp,forwarded:forwarded}):jsxc.gui.window.postMessage(bid,"in",body,!1,forwarded,stamp),!0},onRidChange:function(ev,data){jsxc.storage.setItem("rid",data.rid)},resFriendReq:function(from,approve){jsxc.master?(jsxc.xmpp.conn.send($pres({to:from,type:approve?"subscribed":"unsubscribed"})),jsxc.storage.removeUserItem("friendReq"),jsxc.gui.dialog.close()):jsxc.storage.updateUserItem("friendReq","approve",approve)},addBuddy:function(username,alias){var bid=jsxc.jidToBid(username);if(jsxc.master){var iq=$iq({type:"set"}).c("query",{xmlns:"jabber:iq:roster"}).c("item",{jid:username,name:alias||""});jsxc.xmpp.conn.sendIQ(iq),jsxc.xmpp.conn.send($pres({to:username,type:"subscribe"})),jsxc.storage.removeUserItem("add_"+bid)}else jsxc.storage.setUserItem("add_"+bid,{username:username,alias:alias||null})},removeBuddy:function(jid){var bid=jsxc.jidToBid(jid),iq=$iq({type:"set"}).c("query",{xmlns:"jabber:iq:roster"}).c("item",{jid:Strophe.getBareJidFromJid(jid),subscription:"remove"});jsxc.xmpp.conn.sendIQ(iq),jsxc.gui.roster.purge(bid)},onReceived:function(message){var from=$(message).attr("from"),jid=Strophe.getBareJidFromJid(from),bid=jsxc.jidToBid(jid),received=$(message).find("received[xmlns='urn:xmpp:receipts']");if(received.length){var i,receivedId=received.attr("id").replace(/:/,"-"),chat=jsxc.storage.getUserItem("chat",bid);for(i=chat.length-1;i>=0;i--)if(chat[i].uid===receivedId){chat[i].received=!0,$("#"+receivedId).addClass("jsxc_received"),jsxc.storage.setUserItem("chat",bid,chat);break}}return!0},sendMessage:function(bid,msg,uid){jsxc.otr.objects.hasOwnProperty(bid)?jsxc.otr.objects[bid].sendMsg(msg,uid):jsxc.xmpp._sendMessage(jsxc.gui.window.get(bid).data("jid"),msg,uid)},_sendMessage:function(jid,msg,uid){var data=jsxc.storage.getUserItem("buddy",jsxc.jidToBid(jid))||{},isBar=Strophe.getBareJidFromJid(jid)===jid,type=data.type||"chat",xmlMsg=$msg({to:jid,type:type,id:uid}).c("body").t(msg);jsxc.xmpp.carbons.enabled&&msg.match(/^\?OTR/)&&xmlMsg.up().c("private",{xmlns:jsxc.CONST.NS.CARBONS}),"chat"===type&&(isBar||jsxc.xmpp.conn.caps.hasFeatureByJid(jid,Strophe.NS.RECEIPTS))&&xmlMsg.up().c("request",{xmlns:"urn:xmpp:receipts"}),jsxc.xmpp.conn.send(xmlMsg)},loadVcard:function(bid,cb,error_cb){jsxc.master?jsxc.xmpp.conn.vcard.get(cb,bid,error_cb):(jsxc.storage.setUserItem("vcard",bid,"request:"+(new Date).getTime()),$(document).one("loaded.vcard.jsxc",function(ev,result){result&&"success"===result.state?cb($(result.data).get(0)):error_cb()}))},getCapabilitiesByJid:function(jid){if(jsxc.xmpp.conn)return jsxc.xmpp.conn.caps.getCapabilitiesByJid(jid);var jidVerIndex=JSON.parse(localStorage.getItem("strophe.caps._jidVerIndex"))||{},knownCapabilities=JSON.parse(localStorage.getItem("strophe.caps._knownCapabilities"))||{};return jidVerIndex[jid]?knownCapabilities[jidVerIndex[jid]]:null}},jsxc.xmpp.carbons={enabled:!1,enable:function(cb){var iq=$iq({type:"set"}).c("enable",{xmlns:jsxc.CONST.NS.CARBONS});jsxc.xmpp.conn.sendIQ(iq,function(){jsxc.xmpp.carbons.enabled=!0,jsxc.debug("Carbons enabled"),cb&&cb.call(this)},function(stanza){jsxc.warn("Could not enable carbons",stanza)})},disable:function(cb){var iq=$iq({type:"set"}).c("disable",{xmlns:jsxc.CONST.NS.CARBONS});jsxc.xmpp.conn.sendIQ(iq,function(){jsxc.xmpp.carbons.enabled=!1,jsxc.debug("Carbons disabled"),cb&&cb.call(this)},function(stanza){jsxc.warn("Could not disable carbons",stanza)})},refresh:function(err){return err!==!1?jsxc.options.get("carbons").enable?jsxc.xmpp.carbons.enable():jsxc.xmpp.carbons.disable():void 0}}}(jQuery);
//# sourceMappingURL=jsxc.min.js.map \ No newline at end of file
diff --git a/build/js/jsxc/jsxc.min.js.map b/build/js/jsxc/jsxc.min.js.map
index 932de1f..1a5ffe2 100644
--- a/build/js/jsxc/jsxc.min.js.map
+++ b/build/js/jsxc/jsxc.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"jsxc.min.js","sources":["jsxc.js"],"names":["jsxc","$","version","master","role_allocation","to","toBusy","toNotification","toNotificationDelay","keepalive","restore","restoreCompleted","triggeredFromBox","triggeredFromElement","triggeredFromLogout","ls","storageNotConform","toSNC","bid","CONST","NOTIFICATION_DEFAULT","NOTIFICATION_GRANTED","NOTIFICATION_DENIED","STATUS","SOUNDS","MSG","CALL","NOTICE","REGEX","JID","RegExp","URL","NS","CARBONS","FORWARD","getFormattedTime","unixtime","msgDate","Date","parseInt","date","getDate","slice","month","getMonth","year","getFullYear","hours","getHours","minutes","getMinutes","dateNow","time","setHours","getTime","debug","msg","data","level","storage","getItem","console","log","d","prepend","clone","html","err","JSON","stringify","err2","warn","error","init","options","extend","get","key","local","getUserItem","set","value","updateItem","lang","autoLang","navigator","language","substr","defaultLang","l","l10n","en","otr","window","addEventListener","onStorage","lastActivity","loginTimeout","jidToBid","gui","logoutElement","length","one","this","xmpp","logout","checkMaster","onMaster","loginForm","form","el_exists","jid","pass","displayRosterMinimized","setUserItem","roster","noConnection","formFound","call","events","submit","submits","each","index","val","push","handler","off","settings","prepareLogin","onlogin","triggered","login","username","password","loadSettings","showWaitAlert","Logging_in","resource","domain","match","preJid","split","onSlave","restoreRoster","restoreWindows","document","trigger","setItem","startKeepAlive","enable","createDSA","_onMaster","create","noti","notification","hasSupport","hasPermission","prepareRequest","on","updateAvatar","setTimeout","ink","setInterval","keepAlive","timeout","keepBusyAlive","clearTimeout","clearInterval","busyTimeout","random","max","Math","floor","selector","jidToCid","cid","Strophe","getBareJidFromJid","replace","toLowerCase","buddies","add","empty","windows","minimize","hide","show","setText","text","submitLoginForm","find","click","escapeHTML","removeHTML","switchEvents","obj","ns","toString","self","apply","arguments","isHidden","hidden","webkitHidden","mozHidden","msHidden","translate","s","k","exec","fnName","fnParams","i","fnList","fn","app_name","ERROR_START_AKE","SEND_WHITESPACE_TAG","WHITESPACE_START_AKE","url","overwrite","priority","online","chat","away","xa","dnd","onConnected","onAuthFail","numberOfMsg","rosterAppend","popupDuration","root","hideOffline","muteNotification","defaultAvatar","saveSettinsPermanent","carbons","emotions","queryActions","message","params","win","open","body","remove","showRemoveDialog","subscribe","showContactDialog","name","vcard","showVcard","append","template","resize","updateWindowListSB","scrollWindowListBy","ev","originalEvent","wheelDelta","tooltip","reg","join","windowTemplate","buddyTemplate","delay","content","attr","update","ri","we","ue","spot","removeClass","addClass","status","is","msgstate","your_connection_is_unencrypted","start_private","your_connection_is_encrypted","close_private","your_buddy_closed_the_private_connection","trust","your_buddy_is_verificated","sub","info","avatar","el","aid","avatarSrc","setAvatar","src","removeAttr","css","background-image","text-indent","conn","stanza","vCard","img","type","width","offset","scrollWidth","right","padding","getWindow","toggleList","disableSelection","ul","slideUp","complete","slideToggle","toggleClass","mouseleave","mouseenter","showLoginBox","focus","dialog","prop","showAuthFail","showFingerprints","showVerification","OTR","MSGSTATE_ENCRYPTED","change","slideDown","objects","updateUserItem","close","postMessage","conversation_is_now_verified","div","sec","quest","keyup","sendSmpReq","authentication_query_sent","showApproveDialog","from","noClose","stopPropagation","resFriendReq","alias","getDomainFromJid","addBuddy","removeBuddy","showAlert","showConfirmDialog","confirm","dismiss","showAboutDialog","showDebugLog","userInfo","hasOwnProperty","screen","height","j","res","identities","cap","client","identity","getCapabilitiesByJid","category","printProp","depth","item","children","tagName","before","failedToLoad","loadVcard","photo","img_el","showSettings","id","checked","effect","color","showRequestNotification","requestPermission","showUnknownSender","saveBuddy","removeUserItem","changePresence","pres","external","sendPres","updatePresence","muteSound","unmuteSound","unreadMsg","readMsg","hasClass","detectUriScheme","container","action","element","href","indexOf","pairs","substring","decodeURIComponent","detectEmail","trim","prev","mute","toggle","slimScroll","distance","opacity","notice","load","bud","insert","rename","expandClick","dblclick","scrollTo","li","listElements","thisStatus","appendTo","reorder","detach","purge","removeUserElement","_close","input","replaceWith","keypress","which","_rename","newname","iq","$iq","c","xmlns","sendIQ","duration","wl","roster_width","innerWidth","roster_right","parseFloat","state","animate","no_connection","relogin","Your_roster_is_empty_add_a","link","new_buddy","o","opt","onComplete","preventDefault","closeButton","colorbox","onClosed","onCleanup","overlayClose","escKey","toggleTransfer","clear","resizable","handles","minHeight","minWidth","event","ui","size","inArray","unread","ins","restoreChat","highlight","outerWidth","position","left","parents","_show","scrollDown","_hide","scrollHeight","direction","encrypted","forwarded","stamp","html_msg","MSGSTATE_FINISHED","your_message_wasnt_send_please_end_your_private_conversation","unencrypted_message_received","your_message_wasnt_send_because_you_have_no_valid_subscription","post","saveMessage","sendMessage","uid","_postMessage","source","protocol","p1","esc","charCodeAt","msgDiv","msgTsDiv","received","pop","ph","my_priv_fingerprint","not_available","my_jid","my_node","getNodeFromJid","bid_priv_fingerprint","fingerprint","bid_jid","bid_name","ret","authenticationDialog","fingerprintsDialog","chatWindow","windowList","rosterBuddy","loginBox","contactDialog","approveDialog","removeDialog","waitAlert","alert","authFailDialog","confirmDialog","pleaseAccept","aboutDialog","connected","sid","rid","attached","disconnected","onRidChange","onConnfail","addNamespace","Connection","stropheGetUniqueId","getUniqueId","suffix","_uniqueId","xmlInput","xmlOutput","callback","condition","Object","getOwnPropertyNames","Status","CONNECTED","ATTACHED","DISCONNECTED","CONNFAIL","AUTHFAIL","caps","node","attach","_addSysHandler","querySelector","ver","getAttribute","_jidNodeIndex","parse","localStorage","_jidVerIndex","CAPS","connect","removeItem","numOtr","keys","disReady","flush","disconnect","endOtr","backup","pause","nomJid","getResourceFromJid","_proto","connectionReady","resume","addHandler","onRosterChanged","onMessage","onReceived","onPresence","conditionalEnable","hasFeatureByJid","_knownCapabilities","onCaps","_requestCapabilities","onRoster","disco","addIdentity","addFeature","DISCO_INFO","RECEIPTS","$pres","generateCapsAttrs","up","presState","t","send","location","bl","temp","notices","noticeKey","presence","ptype","r","xVCard","approve","maxVal","notify","carbon","mid","request","$msg","receiveMsg","subscription","receivedId","sendMsg","_sendMessage","isBar","xmlMsg","enabled","cb","error_cb","result","jidVerIndex","knownCapabilities","disable","refresh","PREFIX","SEP","getPrefix","uk","e","prefix","variable","Number","removeElement","isArray","grep","re","newValue","splice","oldValue","n","posts","sm","abort","onSmpQuestion","transferReq","goPlain","goEncrypt","unshift","dsaFallback","receiveMessage","MSGSTATE_PLAINTEXT","priv","ol","STATUS_SEND_QUERY","trying_to_start_private_conversation","STATUS_AKE_SUCCESS","their_priv_pk","Verified","Unverified","private_conversation_started","STATUS_END_OTR","private_conversation_aborted","your_buddy_closed_the_private_conversation_you_should_do_the_same","STATUS_SMP_HANDLE","Authentication_request_received","authentication_failed","Authentication_aborted","meta","your_buddy_is_attempting_to_determine_","to_authenticate_to_your_buddy","enter_the_answer_and_click_answer","enter_the_secret","smpSecret","sendQueryMsg","savekey","packPublic","ake","otr_version","DSA","parsePublic","_smInit","Creating_your_private_key_","worker","Worker","dsa","DSAready","onmessage","parsePrivate","imports","seed","BigInt","getSeed","_createDSA","packPrivate","audio","undefined","playSound","stopSound","title","force","soundFile","loop","popup","Notification","icon","webkitNotifications","createNotification","cancel","permission","checkPermission","func","notificationready.jsxc","notificationfailure.jsxc","Audio","play","_num","saved","description","nid","now","list","you_have_only_a_subscription_in_one_way","Authenticating_a_buddy_helps_","How_do_you_want_to_authenticate_your_buddy","Select_method","Manual","Question","Secret","To_verify_the_fingerprint_","Your_fingerprint","Buddy_fingerprint","Close","Compared","To_authenticate_using_a_question_","Ask","To_authenticate_pick_a_secret_","Compare","Fingerprints","Authentication","Message","Add_buddy","rename_buddy","delete_buddy","Login","Username","Password","Cancel","Connect","Type_in_the_full_username_","Alias","Add","Subscription_request","You_have_a_request_from","Deny","Approve","Remove_buddy","You_are_about_to_remove_","Continue_without_chat","Please_wait","Login_failed","Sorry_we_cant_authentikate_","Retry","clear_history","New_message_from","Should_we_notify_you_","Please_accept_","Hide_offline","Show_offline","About","Mute","Unmute","Subscription","both","offline","none","Unknown_instance_tag","Not_one_of_our_latest_keys","Received_an_unreadable_encrypted_message","Online","Chatty","Away","Extended_away","Offline","Friendship_request","Confirm","Dismiss","Remove","Online_help","FN","N","FAMILY","GIVEN","NICKNAME","ADR","STREET","EXTADD","LOCALITY","REGION","PCODE","CTRY","TEL","NUMBER","EMAIL","USERID","ORG","ORGNAME","ORGUNIT","TITLE","ROLE","BDAY","DESC","PHOTO","send_message","get_info","Settings","Priority","Save","User_settings","A_fingerprint_","Login_options","BOSH_url","Domain","Resource","On_login","Received_an_unencrypted_message","Sorry_your_buddy_doesnt_provide_any_information","Info_about","Do_you_want_to_display_them","Log_in_without_chat","has_come_online","Unknown_sender","You_received_a_message_from_an_unknown_sender","de","Menu","es","jQuery","RTC","RTCPeerconnection","incomingCall","allowMediaAccess","videoWindow","webrtc","localStream","remoteStream","last_caller","AUTO_ACCEPT","reqVideoFeatures","chatJids","browser","jingle","media_constraints","mandatory","MozDontOfferDataChannel","PRANSWER","AUTOACCEPT","ice_config","MULTIPARTY","pc_constraints","proxy","onMediaReady","onMediaFailure","onCallIncoming","onCallTerminated","onCallRinging","onRemoteStreamAdded","onRemoteStreamRemoved","onIceConnectionStateChanged","noStunCandidates","getTurnCrendentials","turnCredentialsPath","ttl","ajax","async","success","iceConfig","iceServers","credential","dataType","getCapableRes","available","onAddRosterItem","videoIcon","Start_video_call","startCall","updateIcon","initWindow","after","capableRes","targetRes","setStatus","txt","margin-left","display","stop","stream","showVideoWindow","getAudioTracks","label","getVideoTracks","hangUp","sess","sessions","peerjid","sendRinging","mediaready.jingle","peerconnection","addStream","sendAnswer","accept","mediafailure.jingle","sendTerminate","terminate","reqUserMedia","reason","isVideoDevice","isAudioDevice","remoteDevices","video","attachMediaStream","sigState","signalingState","iceCon","iceConnectionState","iceGatheringState","localSDP","localDescription","sdp","remoteSDP","remoteDescription","local_fp","SDPUtil","parse_fingerprint","find_line","remote_fp","ip_regex","remote_ip","local_ip","regex","um","finish.mediaready.jsxc","initiate","MediaStreamTrack","getSources","sourceInfo","availableDevices","map","kind","filter","getUserMediaWithConstraints","snapshot","canvas","ctx","getContext","drawImage","toDataURL","target","muted","volume","rv","lv","draggable","containment","w_dialog","w_remote","scale","new_h","new_w","vc","toggleMulti","elem","not","chatarea","support","fullscreen","KEYCODE_ENTER","KEYCODE_ESC","ready","setupRTC","Please_allow_access_to_microphone_and_camera","Incoming_call","Do_you_want_to_accept_the_call_from","Reject","Accept","hang_up","mute_my_audio","pause_my_video","Info","Local_IP","Remote_IP","Local_Fingerprint","Remote_Fingerprint","Video_call_not_possible"],"mappings":"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"} \ No newline at end of file
+{"version":3,"file":"jsxc.min.js","sources":["jsxc.js"],"names":["jsxc","RTC","RTCPeerconnection","$","version","master","role_allocation","to","toBusy","toNotification","toNotificationDelay","keepalive","restore","restoreCompleted","triggeredFromBox","triggeredFromElement","triggeredFromLogout","ls","storageNotConform","toSNC","bid","CONST","NOTIFICATION_DEFAULT","NOTIFICATION_GRANTED","NOTIFICATION_DENIED","STATUS","SOUNDS","MSG","CALL","NOTICE","REGEX","JID","RegExp","URL","NS","CARBONS","FORWARD","getFormattedTime","unixtime","msgDate","Date","parseInt","date","getDate","slice","month","getMonth","year","getFullYear","hours","getHours","minutes","getMinutes","dateNow","time","setHours","getTime","debug","msg","data","level","storage","getItem","console","log","d","prepend","clone","html","err","JSON","stringify","err2","warn","error","init","options","extend","get","key","local","getUserItem","set","value","updateItem","lang","autoLang","navigator","language","substr","defaultLang","i18n","lng","fallbackLng","resStore","I18next","useLocalStorage","localStorageExpirationTime","otr","window","addEventListener","onStorage","lastActivity","loginTimeout","document","on","logoutElement","length","logout","this","xmpp","off","one","jidToBid","gui","checkMaster","onMaster","loginForm","form","el_exists","jid","pass","displayRosterMinimized","setUserItem","roster","noConnection","formFound","call","events","submit","submits","each","index","val","push","handler","settings","prepareLogin","onlogin","triggered","login","username","password","loadSettings","showWaitAlert","t","resource","domain","match","preJid","split","onSlave","restoreRoster","restoreWindows","trigger","setItem","startKeepAlive","enable","createDSA","_onMaster","create","noti","notification","hasSupport","hasPermission","prepareRequest","updateAvatar","setTimeout","ink","setInterval","keepAlive","timeout","keepBusyAlive","clearTimeout","clearInterval","busyTimeout","random","max","Math","floor","selector","jidToCid","cid","Strophe","getBareJidFromJid","replace","toLowerCase","buddies","add","empty","windows","minimize","hide","show","setText","text","submitLoginForm","find","click","escapeHTML","removeHTML","switchEvents","obj","ns","toString","self","apply","arguments","isHidden","hidden","webkitHidden","mozHidden","msHidden","hasFocus","focus","exec","fnName","fnParams","i","fnList","fn","hashStr","str","hash","charCodeAt","emotions","queryActions","message","params","win","open","body","remove","showRemoveDialog","subscribe","showContactDialog","name","vcard","showVcard","append","template","resize","updateWindowListSB","scrollWindowListBy","ev","originalEvent","wheelDelta","tooltip","reg","join","windowTemplate","buddyTemplate","delay","content","attr","update","ri","we","ue","spot","removeClass","addClass","status","msgstate","trust","sub","info","avatar","el","aid","setAvatar","src","defaultAvatar","avatarPlaceholder","removeAttr","css","background-image","text-indent","avatarSrc","conn","stanza","vCard","img","type","width","offset","scrollWidth","right","padding","getWindow","toggleList","disableSelection","ul","slideUp","complete","is","slideToggle","toggleClass","mouseleave","mouseenter","showLoginBox","dialog","prop","showAuthFail","showFingerprints","showVerification","OTR","MSGSTATE_ENCRYPTED","change","slideDown","objects","updateUserItem","close","postMessage","div","sec","quest","keyup","sendSmpReq","showApproveDialog","from","noClose","stopPropagation","resFriendReq","getUsers","list","uid","displayname","option","appendTo","alias","getDomainFromJid","addBuddy","removeBuddy","showAlert","showConfirmDialog","confirm","dismiss","showAboutDialog","showDebugLog","userInfo","hasOwnProperty","screen","height","j","res","identities","cap","client","identity","getCapabilitiesByJid","category","printProp","depth","item","children","tagName","before","failedToLoad","loadVcard","photo","img_el","showSettings","overwrite","id","checked","saveSettinsPermanent","effect","color","showRequestNotification","notificationready.jsxc","notificationfailure.jsxc","requestPermission","showUnknownSender","confirmationText","saveBuddy","removeUserItem","changePresence","pres","external","sendPres","updatePresence","muteSound","unmuteSound","unreadMsg","readMsg","hasClass","detectUriScheme","container","action","element","href","indexOf","pairs","substring","decodeURIComponent","detectEmail","trim","s","prev","seed","hue","abs","saturation","lightness","background-color","font-weight","text-align","line-height","font-size","toUpperCase","ready","rosterAppend","hideOffline","mute","toggle","slimScroll","distance","opacity","notice","load","bud","insert","rename","expandClick","dblclick","scrollTo","li","listElements","thisStatus","reorder","detach","purge","removeUserElement","_close","input","replaceWith","keypress","which","_rename","newname","iq","$iq","c","xmlns","sendIQ","duration","wl","roster_width","innerWidth","roster_right","parseFloat","state","animate","link","o","opt","onComplete","preventDefault","closeButton","onClosed","onCleanup","overlayClose","escKey","colorbox","outerWidth","innerHeight","outerHeight","toggleTransfer","clear","getSelection","resizable","handles","minHeight","minWidth","event","ui","size","position","top","inArray","unread","ins","restoreChat","highlight","left","parents","_show","scrollDown","_hide","chat","scrollHeight","direction","encrypted","forwarded","stamp","sender","html_msg","MSGSTATE_FINISHED","post","saveMessage","sendMessage","_postMessage","url","source","protocol","p1","esc","msgDiv","msgTsDiv","received","title","avatarDiv","prependTo","pop","ph","my_priv_fingerprint","my_jid","my_node","getNodeFromJid","root","app_name","bid_priv_fingerprint","fingerprint","bid_jid","bid_name","ret","authenticationDialog","fingerprintsDialog","chatWindow","windowList","rosterBuddy","loginBox","contactDialog","approveDialog","removeDialog","waitAlert","alert","authFailDialog","confirmDialog","pleaseAccept","aboutDialog","joinChat","muc","AFFILIATION","ADMIN","MEMBER","OUTCAST","OWNER","NONE","ROLE","MODERATOR","PARTICIPANT","VISITOR","ROOMSTATE","INIT","ENTERED","EXITED","AWAIT_DESTRUCTION","DESTROYED","server","initMenu","onPresence","onPresenceError","addHandler","onGroupchatMessage","onErrorMessage","roomNames","disco","items","discovered","MUC","showJoinChat","error_handler","condition","room","roomIndex","splice","rooms","listRooms","r","rjid","rnode","rname","count","nickname","discoReceived","roomName","subject","table","feature","exists","tr","keydown","leave","own","onExited","destroy","handler_cb","error_cb","MUC_OWNER","tree","roomdata","emptyMembers","initWindow","ownNickname","mlIcon","after","ml","scrollMemberListBy","toggleMl","slimOptions","slimHeight","maxHeight","slimscroll","member","insertMember","affiliation","presence","xdata","getResourceFromJid","unescapeNode","codes","code","bl","removeMember","newNickname","oldNickname","escapeInterpolation","roomJid","role","onStatus",110,170,201,"createInstantRoom",301,"postReason",307,321,322,332,"actor","reason","memberdata","m","isNaN","onAddRoster","_num","saved","description","nid","now","notify","has","audio","soundFile","playSound","stopSound","force","loop","icon","popup","Notification","popupDuration","webkitNotifications","createNotification","cancel","permission","checkPermission","func","Audio","play","pause","ERROR_START_AKE","SEND_WHITESPACE_TAG","WHITESPACE_START_AKE","priority","online","away","xa","dnd","onConnected","onAuthFail","numberOfMsg","muteNotification","carbons","dsaFallback","receiveMessage","MSGSTATE_PLAINTEXT","backup","_sendMessage","priv","ol","STATUS_SEND_QUERY","STATUS_AKE_SUCCESS","their_priv_pk","STATUS_END_OTR","STATUS_SMP_HANDLE","sm","abort","onSmpQuestion","meta","smpSecret","goEncrypt","goPlain","sendQueryMsg","cb","endOtr","savekey","packPublic","ake","otr_version","parse","DSA","parsePublic","_smInit","worker","Worker","dsa","DSAready","onmessage","e","parsePrivate","imports","BigInt","getSeed","_createDSA","packPrivate","PREFIX","SEP","getPrefix","uk","localStorage","removeItem","prefix","variable","Number","removeElement","isArray","grep","re","newValue","oldValue","n","posts","transferReq","approve","unshift","incomingCall","allowMediaAccess","videoWindow","webrtc","localStream","remoteStream","last_caller","AUTO_ACCEPT","reqVideoFeatures","chatJids","browser","jingle","media_constraints","mandatory","MozDontOfferDataChannel","PRANSWER","AUTOACCEPT","ice_config","MULTIPARTY","pc_constraints","proxy","onMessage","onMediaReady","onMediaFailure","onCallIncoming","onCallTerminated","onCallRinging","onRemoteStreamAdded","onRemoteStreamRemoved","onIceConnectionStateChanged","noStunCandidates","sid","addFeature","caps","onCaps","getTurnCrendentials","turnCredentialsPath","ttl","ajax","async","success","iceConfig","iceServers","credential","dataType","getCapableRes","available","hasFeatureByJid","onAddRosterItem","videoIcon","startCall","updateIcon","capableRes","targetRes","setStatus","txt","margin-left","display","stop","stream","showVideoWindow","getAudioTracks","label","getVideoTracks","hangUp","sess","sessions","peerjid","sendRinging","mediaready.jingle","peerconnection","addStream","sendAnswer","accept","mediafailure.jingle","sendTerminate","terminate","reqUserMedia","isVideoDevice","isAudioDevice","remoteDevices","video","attachMediaStream","sigState","signalingState","iceCon","iceConnectionState","iceGatheringState","localSDP","localDescription","sdp","remoteSDP","remoteDescription","local_fp","SDPUtil","parse_fingerprint","find_line","remote_fp","ip_regex","remote_ip","local_ip","regex","um","finish.mediaready.jsxc","initiate","MediaStreamTrack","getSources","sourceInfo","availableDevices","map","kind","filter","getUserMediaWithConstraints","snapshot","canvas","ctx","getContext","drawImage","toDataURL","target","muted","volume","rv","lv","draggable","containment","w_dialog","w_remote","scale","new_h","new_w","vc","toggleMulti","elem","not","chatarea","support","fullscreen","KEYCODE_ENTER","KEYCODE_ESC","setupRTC","connected","rid","attached","disconnected","onRidChange","onConnfail","addNamespace","Connection","stropheGetUniqueId","getUniqueId","suffix","_uniqueId","xmlInput","xmlOutput","callback","Object","getOwnPropertyNames","Status","CONNECTED","ATTACHED","DISCONNECTED","CONNFAIL","AUTHFAIL","node","attach","_addSysHandler","querySelector","ver","getAttribute","_jidNodeIndex","_jidVerIndex","CAPS","connect","numOtr","keys","disReady","flush","disconnect","nomJid","_proto","connectionReady","resume","onRosterChanged","onReceived","conditionalEnable","_knownCapabilities","_requestCapabilities","onRoster","addIdentity","DISCO_INFO","RECEIPTS","$pres","generateCapsAttrs","up","presState","send","location","temp","notices","noticeKey","ptype","xVCard","maxVal","carbon","mid","request","$msg","receiveMsg","subscription","receivedId","sendMsg","isBar","xmlMsg","enabled","result","jidVerIndex","knownCapabilities","disable","refresh","jQuery"],"mappings":"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"} \ No newline at end of file
diff --git a/build/js/jsxc/lib/i18next/release/i18next-latest.min.js b/build/js/jsxc/lib/i18next/release/i18next-latest.min.js
new file mode 100644
index 0000000..56b93e1
--- /dev/null
+++ b/build/js/jsxc/lib/i18next/release/i18next-latest.min.js
@@ -0,0 +1,5 @@
+// i18next, v1.7.7
+// Copyright (c)2014 Jan Mühlemann (jamuhl).
+// Distributed under MIT license
+// http://i18next.com
+!function(){function a(a,b){if(!b||"function"==typeof b)return a;for(var c in b)a[c]=b[c];return a}function b(a,c){for(var d in c)d in a?b(a[d],c[d]):a[d]=c[d];return a}function c(a,b,c){var d,e=0,f=a.length,g=void 0===f||"[object Array]"!==Object.prototype.toString.apply(a)||"function"==typeof a;if(c)if(g){for(d in a)if(b.apply(a[d],c)===!1)break}else for(;f>e&&b.apply(a[e++],c)!==!1;);else if(g){for(d in a)if(b.call(a[d],d,a[d])===!1)break}else for(;f>e&&b.call(a[e],e,a[e++])!==!1;);return a}function d(a){return"string"==typeof a?a.replace(/[&<>"'\/]/g,function(a){return Q[a]}):a}function e(a){var b=function(a){if(window.XMLHttpRequest)return a(null,new XMLHttpRequest);if(window.ActiveXObject)try{return a(null,new ActiveXObject("Msxml2.XMLHTTP"))}catch(b){return a(null,new ActiveXObject("Microsoft.XMLHTTP"))}return a(new Error)},c=function(a){if("string"==typeof a)return a;var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")},d=function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(192|d>>6),b+=String.fromCharCode(128|63&d)):(b+=String.fromCharCode(224|d>>12),b+=String.fromCharCode(128|63&d>>6),b+=String.fromCharCode(128|63&d))}return b},e=function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";a=d(a);var c,e,f,g,h,i,j,k="",l=0;do c=a.charCodeAt(l++),e=a.charCodeAt(l++),f=a.charCodeAt(l++),g=c>>2,h=(3&c)<<4|e>>4,i=(15&e)<<2|f>>6,j=63&f,isNaN(e)?i=j=64:isNaN(f)&&(j=64),k+=b.charAt(g)+b.charAt(h)+b.charAt(i)+b.charAt(j),c=e=f="",g=h=i=j="";while(l<a.length);return k},f=function(){for(var a=arguments[0],b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}return a},g=function(a,d,e,h){"function"==typeof e&&(h=e,e={}),e.cache=e.cache||!1,e.data=e.data||{},e.headers=e.headers||{},e.jsonp=e.jsonp||!1,e.async=void 0===e.async?!0:e.async;var i,j=f({accept:"*/*","content-type":"application/x-www-form-urlencoded;charset=UTF-8"},g.headers,e.headers);if(i="application/json"===j["content-type"]?JSON.stringify(e.data):c(e.data),"GET"===a){var k=[];if(i&&(k.push(i),i=null),e.cache||k.push("_="+(new Date).getTime()),e.jsonp&&(k.push("callback="+e.jsonp),k.push("jsonp="+e.jsonp)),k=k.join("&"),k.length>1&&(d+=d.indexOf("?")>-1?"&"+k:"?"+k),e.jsonp){var l=document.getElementsByTagName("head")[0],m=document.createElement("script");return m.type="text/javascript",m.src=d,l.appendChild(m),void 0}}b(function(b,c){if(b)return h(b);c.open(a,d,e.async);for(var f in j)j.hasOwnProperty(f)&&c.setRequestHeader(f,j[f]);c.onreadystatechange=function(){if(4===c.readyState){var a=c.responseText||"";if(!h)return;h(c.status,{text:function(){return a},json:function(){try{return JSON.parse(a)}catch(b){return T.error("Can not parse JSON. URL: "+d),{}}}})}},c.send(i)})},h={authBasic:function(a,b){g.headers.Authorization="Basic "+e(a+":"+b)},connect:function(a,b,c){return g("CONNECT",a,b,c)},del:function(a,b,c){return g("DELETE",a,b,c)},get:function(a,b,c){return g("GET",a,b,c)},head:function(a,b,c){return g("HEAD",a,b,c)},headers:function(a){g.headers=a||{}},isAllowed:function(a,b,c){this.options(a,function(a,d){c(-1!==d.text().indexOf(b))})},options:function(a,b,c){return g("OPTIONS",a,b,c)},patch:function(a,b,c){return g("PATCH",a,b,c)},post:function(a,b,c){return g("POST",a,b,c)},put:function(a,b,c){return g("PUT",a,b,c)},trace:function(a,b,c){return g("TRACE",a,b,c)}},i=a.type?a.type.toLowerCase():"get";h[i](a.url,a,function(b,c){200===b||0===b&&c.text()?a.success(c.json(),b,null):a.error(c.text(),b,null)})}function f(a,b){"function"==typeof a&&(b=a,a={}),a=a||{},T.extend(P,a),delete P.fixLng,P.functions&&(delete P.functions,T.extend(T,a.functions)),"string"==typeof P.ns&&(P.ns={namespaces:[P.ns],defaultNs:P.ns}),"string"==typeof P.fallbackNS&&(P.fallbackNS=[P.fallbackNS]),("string"==typeof P.fallbackLng||"boolean"==typeof P.fallbackLng)&&(P.fallbackLng=[P.fallbackLng]),P.interpolationPrefixEscaped=T.regexEscape(P.interpolationPrefix),P.interpolationSuffixEscaped=T.regexEscape(P.interpolationSuffix),P.lng||(P.lng=T.detectLanguage()),L=T.toLanguages(P.lng),F=L[0],T.log("currentLng set to: "+F),P.useCookie&&T.cookie.read(P.cookieName)!==F&&T.cookie.create(P.cookieName,F,P.cookieExpirationTime,P.cookieDomain),P.detectLngFromLocalStorage&&"undefined"!=typeof document&&window.localStorage&&T.localStorage.setItem("i18next_lng",F);var c=z;a.fixLng&&(c=function(a,b){return b=b||{},b.lng=b.lng||c.lng,z(a,b)},c.lng=F),W.setCurrentLng(F),H&&P.setJqueryExt&&s();var d;if(H&&H.Deferred&&(d=H.Deferred()),!P.resStore){var e=T.toLanguages(P.lng);"string"==typeof P.preload&&(P.preload=[P.preload]);for(var f=0,g=P.preload.length;g>f;f++)for(var h=T.toLanguages(P.preload[f]),i=0,j=h.length;j>i;i++)e.indexOf(h[i])<0&&e.push(h[i]);return I.sync.load(e,P,function(a,e){J=e,M=!0,b&&b(c),d&&d.resolve(c)}),d?d.promise():void 0}return J=P.resStore,M=!0,b&&b(c),d&&d.resolve(c),d?d.promise():void 0}function g(a,b){"string"==typeof a&&(a=[a]);for(var c=0,d=a.length;d>c;c++)P.preload.indexOf(a[c])<0&&P.preload.push(a[c]);return f(b)}function h(a,b,c,d){"string"!=typeof b?(c=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b),J[a]=J[a]||{},J[a][b]=J[a][b]||{},d?T.deepExtend(J[a][b],c):T.extend(J[a][b],c)}function i(a,b){"string"!=typeof b&&(b=P.ns.defaultNs),J[a]=J[a]||{};var c=J[a][b]||{},d=!1;for(var e in c)c.hasOwnProperty(e)&&(d=!0);return d}function j(a,b){"string"!=typeof b&&(b=P.ns.defaultNs),J[a]=J[a]||{},J[a][b]={}}function k(a,b,c,d){"string"!=typeof b?(resource=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b),J[a]=J[a]||{},J[a][b]=J[a][b]||{};for(var e=c.split(P.keyseparator),f=0,g=J[a][b];e[f];)f==e.length-1?g[e[f]]=d:(null==g[e[f]]&&(g[e[f]]={}),g=g[e[f]]),f++}function l(a,b,c){"string"!=typeof b?(resource=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b);for(var d in c)"string"==typeof c[d]&&k(a,b,d,c[d])}function m(a){P.ns.defaultNs=a}function n(a,b){o([a],b)}function o(a,b){var c={dynamicLoad:P.dynamicLoad,resGetPath:P.resGetPath,getAsync:P.getAsync,customLoad:P.customLoad,ns:{namespaces:a,defaultNs:""}},d=T.toLanguages(P.lng);"string"==typeof P.preload&&(P.preload=[P.preload]);for(var e=0,f=P.preload.length;f>e;e++)for(var g=T.toLanguages(P.preload[e]),h=0,i=g.length;i>h;h++)d.indexOf(g[h])<0&&d.push(g[h]);for(var j=[],k=0,l=d.length;l>k;k++){var m=!1,n=J[d[k]];if(n)for(var o=0,p=a.length;p>o;o++)n[a[o]]||(m=!0);else m=!0;m&&j.push(d[k])}j.length?I.sync._fetch(j,c,function(c,d){var e=a.length*j.length;T.each(a,function(a,c){P.ns.namespaces.indexOf(c)<0&&P.ns.namespaces.push(c),T.each(j,function(a,f){J[f]=J[f]||{},J[f][c]=d[f][c],e--,0===e&&b&&(P.useLocalStorage&&I.sync._storeLocal(J),b())})})}):b&&b()}function p(a,b,c){return"function"==typeof b?(c=b,b={}):b||(b={}),b.lng=a,f(b,c)}function q(){return F}function r(a){J={},p(F,a)}function s(){function a(a,b,c){if(0!==b.length){var d="text";if(0===b.indexOf("[")){var e=b.split("]");b=e[1],d=e[0].substr(1,e[0].length-1)}b.indexOf(";")===b.length-1&&(b=b.substr(0,b.length-2));var f;if("html"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.html(H.t(b,f));else if("text"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.text()},c):c,a.text(H.t(b,f));else if("prepend"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.prepend(H.t(b,f));else if("append"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.append(H.t(b,f));else if(0===d.indexOf("data-")){var g=d.substr("data-".length);f=P.defaultValueFromContent?H.extend({defaultValue:a.data(g)},c):c;var h=H.t(b,f);a.data(g,h),a.attr(d,h)}else f=P.defaultValueFromContent?H.extend({defaultValue:a.attr(d)},c):c,a.attr(d,H.t(b,f))}}function b(b,c){var d=b.attr(P.selectorAttr);if(d||"undefined"==typeof d||d===!1||(d=b.text()||b.val()),d){var e=b,f=b.data("i18n-target");if(f&&(e=b.find(f)||b),c||P.useDataAttrOptions!==!0||(c=b.data("i18n-options")),c=c||{},d.indexOf(";")>=0){var g=d.split(";");H.each(g,function(b,d){""!==d&&a(e,d,c)})}else a(e,d,c);P.useDataAttrOptions===!0&&b.data("i18n-options",c)}}H.t=H.t||z,H.fn.i18n=function(a){return this.each(function(){b(H(this),a);var c=H(this).find("["+P.selectorAttr+"]");c.each(function(){b(H(this),a)})})}}function t(a,b,c,d){if(!a)return a;if(d=d||b,a.indexOf(d.interpolationPrefix||P.interpolationPrefix)<0)return a;var e=d.interpolationPrefix?T.regexEscape(d.interpolationPrefix):P.interpolationPrefixEscaped,f=d.interpolationSuffix?T.regexEscape(d.interpolationSuffix):P.interpolationSuffixEscaped,g="HTML"+f,h=b.replace&&"object"==typeof b.replace?b.replace:b;return T.each(h,function(b,h){var i=c?c+P.keyseparator+b:b;"object"==typeof h&&null!==h?a=t(a,h,i,d):d.escapeInterpolation||P.escapeInterpolation?(a=a.replace(new RegExp([e,i,g].join(""),"g"),T.regexReplacementEscape(h)),a=a.replace(new RegExp([e,i,f].join(""),"g"),T.regexReplacementEscape(T.escape(h)))):a=a.replace(new RegExp([e,i,f].join(""),"g"),T.regexReplacementEscape(h))}),a}function u(a,b){var c=",",d="{",e="}",f=T.extend({},b);for(delete f.postProcess;-1!=a.indexOf(P.reusePrefix)&&(K++,!(K>P.maxRecursion));){var g=a.lastIndexOf(P.reusePrefix),h=a.indexOf(P.reuseSuffix,g)+P.reuseSuffix.length,i=a.substring(g,h),j=i.replace(P.reusePrefix,"").replace(P.reuseSuffix,"");if(g>=h)return T.error("there is an missing closing in following translation value",a),"";if(-1!=j.indexOf(c)){var k=j.indexOf(c);if(-1!=j.indexOf(d,k)&&-1!=j.indexOf(e,k)){var l=j.indexOf(d,k),m=j.indexOf(e,l)+e.length;try{f=T.extend(f,JSON.parse(j.substring(l,m))),j=j.substring(0,k)}catch(n){}}}var o=C(j,f);a=a.replace(i,T.regexReplacementEscape(o))}return a}function v(a){return a.context&&("string"==typeof a.context||"number"==typeof a.context)}function w(a){return void 0!==a.count&&"string"!=typeof a.count}function x(a){return void 0!==a.indefinite_article&&"string"!=typeof a.indefinite_article&&a.indefinite_article}function y(a,b){b=b||{};var c=A(a,b),d=D(a,b);return void 0!==d||d===c}function z(a,b){return b=b||{},M?(K=0,C.apply(null,arguments)):(T.log("i18next not finished initialization. you might have called t function before loading resources finished."),b.defaultValue||"")}function A(a,b){return void 0!==b.defaultValue?b.defaultValue:a}function B(){for(var a=[],b=1;b<arguments.length;b++)a.push(arguments[b]);return{postProcess:"sprintf",sprintf:a}}function C(a,b){if(b&&"object"!=typeof b?"sprintf"===P.shortcutFunction?b=B.apply(null,arguments):"defaultValue"===P.shortcutFunction&&(b={defaultValue:b}):b=b||{},"object"==typeof P.defaultVariables&&(b=T.extend({},P.defaultVariables,b)),void 0===a||null===a||""===a)return"";"string"==typeof a&&(a=[a]);var c=a[0];if(a.length>1)for(var d=0;d<a.length&&(c=a[d],!y(c,b));d++);var e,f=A(c,b),g=D(c,b),h=b.lng?T.toLanguages(b.lng,b.fallbackLng):L,i=b.ns||P.ns.defaultNs;c.indexOf(P.nsseparator)>-1&&(e=c.split(P.nsseparator),i=e[0],c=e[1]),void 0===g&&P.sendMissing&&"function"==typeof P.missingKeyHandler&&(b.lng?P.missingKeyHandler(h[0],i,c,f,h):P.missingKeyHandler(P.lng,i,c,f,h));var j=b.postProcess||P.postProcess;void 0!==g&&j&&X[j]&&(g=X[j](g,c,b));var k=f;if(f.indexOf(P.nsseparator)>-1&&(e=f.split(P.nsseparator),k=e[1]),k===c&&P.parseMissingKey&&(f=P.parseMissingKey(f)),void 0===g&&(f=t(f,b),f=u(f,b),j&&X[j])){var l=A(c,b);g=X[j](l,c,b)}return void 0!==g?g:f}function D(a,b){b=b||{};var c,d,e=A(a,b),f=L;if(!J)return e;if("cimode"===f[0].toLowerCase())return e;if(b.lngs&&(f=b.lngs),b.lng&&(f=T.toLanguages(b.lng,b.fallbackLng),!J[f[0]])){var g=P.getAsync;P.getAsync=!1,I.sync.load(f,P,function(a,b){T.extend(J,b),P.getAsync=g})}var h=b.ns||P.ns.defaultNs;if(a.indexOf(P.nsseparator)>-1){var i=a.split(P.nsseparator);h=i[0],a=i[1]}if(v(b)){c=T.extend({},b),delete c.context,c.defaultValue=P.contextNotFound;var j=h+P.nsseparator+a+"_"+b.context;if(d=z(j,c),d!=P.contextNotFound)return t(d,{context:b.context})}if(w(b,f[0])){c=T.extend({lngs:[f[0]]},b),delete c.count,delete c.lng,c.defaultValue=P.pluralNotFound;var k;if(W.needsPlural(f[0],b.count)){k=h+P.nsseparator+a+P.pluralSuffix;var l=W.get(f[0],b.count);l>=0?k=k+"_"+l:1===l&&(k=h+P.nsseparator+a)}else k=h+P.nsseparator+a;if(d=z(k,c),d!=P.pluralNotFound)return t(d,{count:b.count,interpolationPrefix:b.interpolationPrefix,interpolationSuffix:b.interpolationSuffix});if(!(f.length>1))return d;var m=f.slice();if(m.shift(),b=T.extend(b,{lngs:m}),delete b.lng,d=z(h+P.nsseparator+a,b),d!=P.pluralNotFound)return d}if(x(b)){var n=T.extend({},b);delete n.indefinite_article,n.defaultValue=P.indefiniteNotFound;var o=h+P.nsseparator+a+(b.count&&!w(b,f[0])||!b.count?P.indefiniteSuffix:"");if(d=z(o,n),d!=P.indefiniteNotFound)return d}for(var p,q=a.split(P.keyseparator),r=0,s=f.length;s>r&&void 0===p;r++){for(var y=f[r],B=0,E=J[y]&&J[y][h];q[B];)E=E&&E[q[B]],B++;if(void 0!==E){var F=Object.prototype.toString.apply(E);if("string"==typeof E)E=t(E,b),E=u(E,b);else if("[object Array]"!==F||P.returnObjectTrees||b.returnObjectTrees){if(null===E&&P.fallbackOnNull===!0)E=void 0;else if(null!==E)if(P.returnObjectTrees||b.returnObjectTrees){if("[object Number]"!==F&&"[object Function]"!==F&&"[object RegExp]"!==F){var G="[object Array]"===F?[]:{};T.each(E,function(c){G[c]=C(h+P.nsseparator+a+P.keyseparator+c,b)}),E=G}}else P.objectTreeKeyHandler&&"function"==typeof P.objectTreeKeyHandler?E=P.objectTreeKeyHandler(a,E,y,h,b):(E="key '"+h+":"+a+" ("+y+")' "+"returned an object instead of string.",T.log(E))}else E=E.join("\n"),E=t(E,b),E=u(E,b);"string"==typeof E&&""===E.trim()&&P.fallbackOnEmpty===!0&&(E=void 0),p=E}}if(void 0===p&&!b.isFallbackLookup&&(P.fallbackToDefaultNS===!0||P.fallbackNS&&P.fallbackNS.length>0)){if(b.isFallbackLookup=!0,P.fallbackNS.length){for(var H=0,K=P.fallbackNS.length;K>H;H++)if(p=D(P.fallbackNS[H]+P.nsseparator+a,b),p||""===p&&P.fallbackOnEmpty===!1){var M=p.indexOf(P.nsseparator)>-1?p.split(P.nsseparator)[1]:p,N=e.indexOf(P.nsseparator)>-1?e.split(P.nsseparator)[1]:e;if(M!==N)break}}else p=D(a,b);b.isFallbackLookup=!1}return p}function E(){var a,b=P.lngWhitelist||[],c=[];if("undefined"!=typeof window&&!function(){for(var a=window.location.search.substring(1),b=a.split("&"),d=0;d<b.length;d++){var e=b[d].indexOf("=");if(e>0){var f=b[d].substring(0,e);f==P.detectLngQS&&c.push(b[d].substring(e+1))}}}(),P.useCookie&&"undefined"!=typeof document){var d=T.cookie.read(P.cookieName);d&&c.push(d)}if(P.detectLngFromLocalStorage&&"undefined"!=typeof window&&window.localStorage&&c.push(window.localStorage.getItem("i18next_lng")),"undefined"!=typeof navigator){if(navigator.languages)for(var e=0;e<navigator.languages.length;e++)c.push(navigator.languages[e]);navigator.userLanguage&&c.push(navigator.userLanguage),navigator.language&&c.push(navigator.language)}return function(){for(var d=0;d<c.length;d++){var e=c[d];if(e.indexOf("-")>-1){var f=e.split("-");e=P.lowerCaseLng?f[0].toLowerCase()+"-"+f[1].toLowerCase():f[0].toLowerCase()+"-"+f[1].toUpperCase()}if(0===b.length||b.indexOf(e)>-1){a=e;break}}}(),a||(a=P.fallbackLng[0]),a}Array.prototype.indexOf||(Array.prototype.indexOf=function(a){"use strict";if(null==this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>0&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&1/0!=d&&d!=-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(a){"use strict";if(null==this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=c;arguments.length>1&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&d!=1/0&&d!=-(1/0)&&(d=(d>0||-1)*Math.floor(Math.abs(d))));for(var e=d>=0?Math.min(d,c-1):c-Math.abs(d);e>=0;e--)if(e in b&&b[e]===a)return e;return-1}),"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});var F,G=this,H=G.jQuery||G.Zepto,I={},J={},K=0,L=[],M=!1,N={};if("undefined"!=typeof module&&module.exports){if(!H)try{H=require("jquery")}catch(O){}H&&(H.i18n=H.i18n||I),module.exports=I}else H&&(H.i18n=H.i18n||I),G.i18n=G.i18n||I;N={load:function(a,b,c){b.useLocalStorage?N._loadLocal(a,b,function(d,e){for(var f=[],g=0,h=a.length;h>g;g++)e[a[g]]||f.push(a[g]);f.length>0?N._fetch(f,b,function(a,b){T.extend(e,b),N._storeLocal(b),c(null,e)}):c(null,e)}):N._fetch(a,b,function(a,b){c(null,b)})},_loadLocal:function(a,b,c){var d={},e=(new Date).getTime();if(window.localStorage){var f=a.length;T.each(a,function(a,g){var h=window.localStorage.getItem("res_"+g);h&&(h=JSON.parse(h),h.i18nStamp&&h.i18nStamp+b.localStorageExpirationTime>e&&(d[g]=h)),f--,0===f&&c(null,d)})}},_storeLocal:function(a){if(window.localStorage)for(var b in a)a[b].i18nStamp=(new Date).getTime(),T.localStorage.setItem("res_"+b,JSON.stringify(a[b]))},_fetch:function(a,b,c){var d=b.ns,e={};if(b.dynamicLoad){var f=function(a,b){c(null,b)};if("function"==typeof b.customLoad)b.customLoad(a,d.namespaces,b,f);else{var g=t(b.resGetPath,{lng:a.join("+"),ns:d.namespaces.join("+")});T.ajax({url:g,success:function(a){T.log("loaded: "+g),f(null,a)},error:function(a,b,c){T.log("failed loading: "+g),f("failed loading resource.json error: "+c)},dataType:"json",async:b.getAsync})}}else{var h,i=d.namespaces.length*a.length;T.each(d.namespaces,function(d,f){T.each(a,function(a,d){var g=function(a,b){a&&(h=h||[],h.push(a)),e[d]=e[d]||{},e[d][f]=b,i--,0===i&&c(h,e)};"function"==typeof b.customLoad?b.customLoad(d,f,b,g):N._fetchOne(d,f,b,g)})})}},_fetchOne:function(a,b,c,d){var e=t(c.resGetPath,{lng:a,ns:b});T.ajax({url:e,success:function(a){T.log("loaded: "+e),d(null,a)},error:function(a,b,c){if(b&&200==b||a&&a.status&&200==a.status)T.error("There is a typo in: "+e);else if(b&&404==b||a&&a.status&&404==a.status)T.log("Does not exist: "+e);else{var f=b?b:a&&a.status?a.status:null;T.log(f+" when loading "+e)}d(c,{})},dataType:"json",async:c.getAsync})},postMissing:function(a,b,c,d,e){var f={};f[c]=d;var g=[];if("fallback"===P.sendMissingTo&&P.fallbackLng[0]!==!1)for(var h=0;h<P.fallbackLng.length;h++)g.push({lng:P.fallbackLng[h],url:t(P.resPostPath,{lng:P.fallbackLng[h],ns:b})});else if("current"===P.sendMissingTo||"fallback"===P.sendMissingTo&&P.fallbackLng[0]===!1)g.push({lng:a,url:t(P.resPostPath,{lng:a,ns:b})});else if("all"===P.sendMissingTo)for(var h=0,i=e.length;i>h;h++)g.push({lng:e[h],url:t(P.resPostPath,{lng:e[h],ns:b})});for(var j=0,k=g.length;k>j;j++){var l=g[j];T.ajax({url:l.url,type:P.sendType,data:f,success:function(){T.log("posted missing key '"+c+"' to: "+l.url);for(var a=c.split("."),e=0,f=J[l.lng][b];a[e];)f=f[a[e]]=e===a.length-1?d:f[a[e]]||{},e++},error:function(){T.log("failed posting missing key '"+c+"' to: "+l.url)},dataType:"json",async:P.postAsync})}},reload:r};var P={lng:void 0,load:"all",preload:[],lowerCaseLng:!1,returnObjectTrees:!1,fallbackLng:["dev"],fallbackNS:[],detectLngQS:"setLng",detectLngFromLocalStorage:!1,ns:"translation",fallbackOnNull:!0,fallbackOnEmpty:!1,fallbackToDefaultNS:!1,nsseparator:":",keyseparator:".",selectorAttr:"data-i18n",debug:!1,resGetPath:"locales/__lng__/__ns__.json",resPostPath:"locales/add/__lng__/__ns__",getAsync:!0,postAsync:!0,resStore:void 0,useLocalStorage:!1,localStorageExpirationTime:6048e5,dynamicLoad:!1,sendMissing:!1,sendMissingTo:"fallback",sendType:"POST",interpolationPrefix:"__",interpolationSuffix:"__",defaultVariables:!1,reusePrefix:"$t(",reuseSuffix:")",pluralSuffix:"_plural",pluralNotFound:["plural_not_found",Math.random()].join(""),contextNotFound:["context_not_found",Math.random()].join(""),escapeInterpolation:!1,indefiniteSuffix:"_indefinite",indefiniteNotFound:["indefinite_not_found",Math.random()].join(""),setJqueryExt:!0,defaultValueFromContent:!0,useDataAttrOptions:!1,cookieExpirationTime:void 0,useCookie:!0,cookieName:"i18next",cookieDomain:void 0,objectTreeKeyHandler:void 0,postProcess:void 0,parseMissingKey:void 0,missingKeyHandler:N.postMissing,shortcutFunction:"sprintf"},Q={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"},R={create:function(a,b,c,d){var e;if(c){var f=new Date;f.setTime(f.getTime()+1e3*60*c),e="; expires="+f.toGMTString()}else e="";d=d?"domain="+d+";":"",document.cookie=a+"="+b+e+";"+d+"path=/"},read:function(a){for(var b=a+"=",c=document.cookie.split(";"),d=0;d<c.length;d++){for(var e=c[d];" "==e.charAt(0);)e=e.substring(1,e.length);if(0===e.indexOf(b))return e.substring(b.length,e.length)}return null},remove:function(a){this.create(a,"",-1)}},S={create:function(){},read:function(){return null},remove:function(){}},T={extend:H?H.extend:a,deepExtend:b,each:H?H.each:c,ajax:H?H.ajax:"undefined"!=typeof document?e:function(){},cookie:"undefined"!=typeof document?R:S,detectLanguage:E,escape:d,log:function(a){P.debug&&"undefined"!=typeof console&&console.log(a)},error:function(a){"undefined"!=typeof console&&console.error(a)},getCountyIndexOfLng:function(a){var b=0;return("nb-NO"===a||"nn-NO"===a||"nb-no"===a||"nn-no"===a)&&(b=1),b},toLanguages:function(a){function b(a){var b=a;if("string"==typeof a&&a.indexOf("-")>-1){var c=a.split("-");b=P.lowerCaseLng?c[0].toLowerCase()+"-"+c[1].toLowerCase():c[0].toLowerCase()+"-"+c[1].toUpperCase()}else b=P.lowerCaseLng?a.toLowerCase():a;return b}var c=this.log,d=[],e=P.lngWhitelist||!1,f=function(a){!e||e.indexOf(a)>-1?d.push(a):c("rejecting non-whitelisted language: "+a)};if("string"==typeof a&&a.indexOf("-")>-1){var g=a.split("-");"unspecific"!==P.load&&f(b(a)),"current"!==P.load&&f(b(g[this.getCountyIndexOfLng(a)]))}else f(b(a));for(var h=0;h<P.fallbackLng.length;h++)-1===d.indexOf(P.fallbackLng[h])&&P.fallbackLng[h]&&d.push(b(P.fallbackLng[h]));return d},regexEscape:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},regexReplacementEscape:function(a){return"string"==typeof a?a.replace(/\$/g,"$$$$"):a},localStorage:{setItem:function(a,b){if(window.localStorage)try{window.localStorage.setItem(a,b)}catch(c){T.log('failed to set value for key "'+a+'" to localStorage.')}}}};T.applyReplacement=t;var U=[["ach","Acholi",[1,2],1],["af","Afrikaans",[1,2],2],["ak","Akan",[1,2],1],["am","Amharic",[1,2],1],["an","Aragonese",[1,2],2],["ar","Arabic",[0,1,2,3,11,100],5],["arn","Mapudungun",[1,2],1],["ast","Asturian",[1,2],2],["ay","Aymará",[1],3],["az","Azerbaijani",[1,2],2],["be","Belarusian",[1,2,5],4],["bg","Bulgarian",[1,2],2],["bn","Bengali",[1,2],2],["bo","Tibetan",[1],3],["br","Breton",[1,2],1],["bs","Bosnian",[1,2,5],4],["ca","Catalan",[1,2],2],["cgg","Chiga",[1],3],["cs","Czech",[1,2,5],6],["csb","Kashubian",[1,2,5],7],["cy","Welsh",[1,2,3,8],8],["da","Danish",[1,2],2],["de","German",[1,2],2],["dev","Development Fallback",[1,2],2],["dz","Dzongkha",[1],3],["el","Greek",[1,2],2],["en","English",[1,2],2],["eo","Esperanto",[1,2],2],["es","Spanish",[1,2],2],["es_ar","Argentinean Spanish",[1,2],2],["et","Estonian",[1,2],2],["eu","Basque",[1,2],2],["fa","Persian",[1],3],["fi","Finnish",[1,2],2],["fil","Filipino",[1,2],1],["fo","Faroese",[1,2],2],["fr","French",[1,2],9],["fur","Friulian",[1,2],2],["fy","Frisian",[1,2],2],["ga","Irish",[1,2,3,7,11],10],["gd","Scottish Gaelic",[1,2,3,20],11],["gl","Galician",[1,2],2],["gu","Gujarati",[1,2],2],["gun","Gun",[1,2],1],["ha","Hausa",[1,2],2],["he","Hebrew",[1,2],2],["hi","Hindi",[1,2],2],["hr","Croatian",[1,2,5],4],["hu","Hungarian",[1,2],2],["hy","Armenian",[1,2],2],["ia","Interlingua",[1,2],2],["id","Indonesian",[1],3],["is","Icelandic",[1,2],12],["it","Italian",[1,2],2],["ja","Japanese",[1],3],["jbo","Lojban",[1],3],["jv","Javanese",[0,1],13],["ka","Georgian",[1],3],["kk","Kazakh",[1],3],["km","Khmer",[1],3],["kn","Kannada",[1,2],2],["ko","Korean",[1],3],["ku","Kurdish",[1,2],2],["kw","Cornish",[1,2,3,4],14],["ky","Kyrgyz",[1],3],["lb","Letzeburgesch",[1,2],2],["ln","Lingala",[1,2],1],["lo","Lao",[1],3],["lt","Lithuanian",[1,2,10],15],["lv","Latvian",[1,2,0],16],["mai","Maithili",[1,2],2],["mfe","Mauritian Creole",[1,2],1],["mg","Malagasy",[1,2],1],["mi","Maori",[1,2],1],["mk","Macedonian",[1,2],17],["ml","Malayalam",[1,2],2],["mn","Mongolian",[1,2],2],["mnk","Mandinka",[0,1,2],18],["mr","Marathi",[1,2],2],["ms","Malay",[1],3],["mt","Maltese",[1,2,11,20],19],["nah","Nahuatl",[1,2],2],["nap","Neapolitan",[1,2],2],["nb","Norwegian Bokmal",[1,2],2],["ne","Nepali",[1,2],2],["nl","Dutch",[1,2],2],["nn","Norwegian Nynorsk",[1,2],2],["no","Norwegian",[1,2],2],["nso","Northern Sotho",[1,2],2],["oc","Occitan",[1,2],1],["or","Oriya",[2,1],2],["pa","Punjabi",[1,2],2],["pap","Papiamento",[1,2],2],["pl","Polish",[1,2,5],7],["pms","Piemontese",[1,2],2],["ps","Pashto",[1,2],2],["pt","Portuguese",[1,2],2],["pt_br","Brazilian Portuguese",[1,2],2],["rm","Romansh",[1,2],2],["ro","Romanian",[1,2,20],20],["ru","Russian",[1,2,5],4],["sah","Yakut",[1],3],["sco","Scots",[1,2],2],["se","Northern Sami",[1,2],2],["si","Sinhala",[1,2],2],["sk","Slovak",[1,2,5],6],["sl","Slovenian",[5,1,2,3],21],["so","Somali",[1,2],2],["son","Songhay",[1,2],2],["sq","Albanian",[1,2],2],["sr","Serbian",[1,2,5],4],["su","Sundanese",[1],3],["sv","Swedish",[1,2],2],["sw","Swahili",[1,2],2],["ta","Tamil",[1,2],2],["te","Telugu",[1,2],2],["tg","Tajik",[1,2],1],["th","Thai",[1],3],["ti","Tigrinya",[1,2],1],["tk","Turkmen",[1,2],2],["tr","Turkish",[1,2],1],["tt","Tatar",[1],3],["ug","Uyghur",[1],3],["uk","Ukrainian",[1,2,5],4],["ur","Urdu",[1,2],2],["uz","Uzbek",[1,2],1],["vi","Vietnamese",[1],3],["wa","Walloon",[1,2],1],["wo","Wolof",[1],3],["yo","Yoruba",[1,2],2],["zh","Chinese",[1],3]],V={1:function(a){return Number(a>1)},2:function(a){return Number(1!=a)},3:function(){return 0},4:function(a){return Number(1==a%10&&11!=a%100?0:a%10>=2&&4>=a%10&&(10>a%100||a%100>=20)?1:2)},5:function(a){return Number(0===a?0:1==a?1:2==a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5)},6:function(a){return Number(1==a?0:a>=2&&4>=a?1:2)},7:function(a){return Number(1==a?0:a%10>=2&&4>=a%10&&(10>a%100||a%100>=20)?1:2)},8:function(a){return Number(1==a?0:2==a?1:8!=a&&11!=a?2:3)},9:function(a){return Number(a>=2)},10:function(a){return Number(1==a?0:2==a?1:7>a?2:11>a?3:4)},11:function(a){return Number(1==a||11==a?0:2==a||12==a?1:a>2&&20>a?2:3)},12:function(a){return Number(1!=a%10||11==a%100)},13:function(a){return Number(0!==a)},14:function(a){return Number(1==a?0:2==a?1:3==a?2:3)},15:function(a){return Number(1==a%10&&11!=a%100?0:a%10>=2&&(10>a%100||a%100>=20)?1:2)},16:function(a){return Number(1==a%10&&11!=a%100?0:0!==a?1:2)},17:function(a){return Number(1==a||1==a%10?0:1)},18:function(a){return Number(1==a?1:2)},19:function(a){return Number(1==a?0:0===a||a%100>1&&11>a%100?1:a%100>10&&20>a%100?2:3)},20:function(a){return Number(1==a?0:0===a||a%100>0&&20>a%100?1:2)},21:function(a){return Number(1==a%100?1:2==a%100?2:3==a%100||4==a%100?3:0)}},W={rules:function(){var a,b={};for(a=U.length;a--;)b[U[a][0]]={name:U[a][1],numbers:U[a][2],plurals:V[U[a][3]]};return b}(),addRule:function(a,b){W.rules[a]=b},setCurrentLng:function(a){if(!W.currentRule||W.currentRule.lng!==a){var b=a.split("-");W.currentRule={lng:a,rule:W.rules[b[0]]}}},needsPlural:function(a,b){var c,d=a.split("-");return c=W.currentRule&&W.currentRule.lng===a?W.currentRule.rule:W.rules[d[T.getCountyIndexOfLng(a)]],c&&c.numbers.length<=1?!1:1!==this.get(a,b)},get:function(a,b){function c(b,c){var d;if(d=W.currentRule&&W.currentRule.lng===a?W.currentRule.rule:W.rules[b]){var e;e=d.noAbs?d.plurals(c):d.plurals(Math.abs(c));var f=d.numbers[e];return 2===d.numbers.length&&1===d.numbers[0]&&(2===f?f=-1:1===f&&(f=1)),f}return 1===c?"1":"-1"}var d=a.split("-");return c(d[T.getCountyIndexOfLng(a)],b)}},X={},Y=function(a,b){X[a]=b},Z=function(){function a(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function b(a,b){for(var c=[];b>0;c[--b]=a);return c.join("")}var c=function(){return c.cache.hasOwnProperty(arguments[0])||(c.cache[arguments[0]]=c.parse(arguments[0])),c.format.call(null,c.cache[arguments[0]],arguments)};return c.format=function(c,d){var e,f,g,h,i,j,k,l=1,m=c.length,n="",o=[];for(f=0;m>f;f++)if(n=a(c[f]),"string"===n)o.push(c[f]);else if("array"===n){if(h=c[f],h[2])for(e=d[l],g=0;g<h[2].length;g++){if(!e.hasOwnProperty(h[2][g]))throw Z('[sprintf] property "%s" does not exist',h[2][g]);e=e[h[2][g]]}else e=h[1]?d[h[1]]:d[l++];if(/[^s]/.test(h[8])&&"number"!=a(e))throw Z("[sprintf] expecting number but found %s",a(e));switch(h[8]){case"b":e=e.toString(2);break;case"c":e=String.fromCharCode(e);break;case"d":e=parseInt(e,10);break;case"e":e=h[7]?e.toExponential(h[7]):e.toExponential();break;case"f":e=h[7]?parseFloat(e).toFixed(h[7]):parseFloat(e);break;case"o":e=e.toString(8);break;case"s":e=(e=String(e))&&h[7]?e.substring(0,h[7]):e;break;case"u":e=Math.abs(e);break;case"x":e=e.toString(16);break;case"X":e=e.toString(16).toUpperCase()}e=/[def]/.test(h[8])&&h[3]&&e>=0?"+"+e:e,j=h[4]?"0"==h[4]?"0":h[4].charAt(1):" ",k=h[6]-String(e).length,i=h[6]?b(j,k):"",o.push(h[5]?e+i:i+e)}return o.join("")},c.cache={},c.parse=function(a){for(var b=a,c=[],d=[],e=0;b;){if(null!==(c=/^[^\x25]+/.exec(b)))d.push(c[0]);else if(null!==(c=/^\x25{2}/.exec(b)))d.push("%");else{if(null===(c=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(b)))throw"[sprintf] huh?";if(c[2]){e|=1;var f=[],g=c[2],h=[];if(null===(h=/^([a-z_][a-z_\d]*)/i.exec(g)))throw"[sprintf] huh?";for(f.push(h[1]);""!==(g=g.substring(h[0].length));)if(null!==(h=/^\.([a-z_][a-z_\d]*)/i.exec(g)))f.push(h[1]);else{if(null===(h=/^\[(\d+)\]/.exec(g)))throw"[sprintf] huh?";f.push(h[1])}c[2]=f}else e|=2;if(3===e)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";d.push(c)}b=b.substring(c[0].length)}return d},c}(),$=function(a,b){return b.unshift(a),Z.apply(null,b)};Y("sprintf",function(a,b,c){return c.sprintf?"[object Array]"===Object.prototype.toString.apply(c.sprintf)?$(a,c.sprintf):"object"==typeof c.sprintf?Z(a,c.sprintf):a:a}),I.init=f,I.setLng=p,I.preload=g,I.addResourceBundle=h,I.hasResourceBundle=i,I.addResource=k,I.addResources=l,I.removeResourceBundle=j,I.loadNamespace=n,I.loadNamespaces=o,I.setDefaultNamespace=m,I.t=z,I.translate=z,I.exists=y,I.detectLanguage=T.detectLanguage,I.pluralExtensions=W,I.sync=N,I.functions=T,I.lng=q,I.addPostProcessor=Y,I.options=P}(); \ No newline at end of file
diff --git a/build/js/jsxc/lib/jsxc.dep.js b/build/js/jsxc/lib/jsxc.dep.js
index 5ed5bda..29834e9 100644
--- a/build/js/jsxc/lib/jsxc.dep.js
+++ b/build/js/jsxc/lib/jsxc.dep.js
@@ -1,12 +1,10 @@
/*!
- * jsxc v1.1.0 - 2015-02-08
+ * jsxc v2.0.0-beta1 - 2015-04-29
*
* This file concatenates all dependencies of jsxc.
*
*/
-/*!
- * Source: build/lib/strophe.js, license: multiple, url: http://strophe.im/strophejs/ */
/**
* Modified by
* Klaus Herberth, 2014
@@ -5161,8 +5159,6 @@ Strophe.Websocket.prototype = {
}
};
-/*!
- * Source: build/lib/strophe.muc.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
// Generated by CoffeeScript 1.3.3
/*
*Plugin to implement the MUC extension.
@@ -6183,8 +6179,6 @@ Occupant = (function() {
return Occupant;
})();
-/*!
- * Source: build/lib/strophe.disco.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
/*
Copyright 2010, François de Metz <francois@2metz.fr>
*/
@@ -6418,8 +6412,6 @@ Strophe.addConnectionPlugin('disco',
}
});
-/*!
- * Source: build/lib/strophe.caps.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
/**
* Entity Capabilities (XEP-0115)
*
@@ -6690,8 +6682,6 @@ Strophe.addConnectionPlugin('disco',
}
});
}(jQuery));
-/*!
- * Source: build/lib/strophe.vcard.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
// Generated by CoffeeScript 1.3.3
/*
Plugin to implement the vCard extension.
@@ -6758,8 +6748,6 @@ Strophe.addConnectionPlugin('vcard', {
return this._connection.sendIQ(iq, handler_cb, error_rb);
}
});
-/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
/* jshint -W117 */
(function($){
Strophe.addConnectionPlugin('jingle', {
@@ -7027,8 +7015,6 @@ Strophe.addConnectionPlugin('jingle', {
});
}(jQuery));
-/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.session.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
/* jshint -W117 */
// Jingle stuff
var JingleSession;
@@ -7944,8 +7930,6 @@ JingleSession.prototype.getStats = function (interval) {
}(jQuery));
-/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.sdp.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
/* jshint -W117 */
var SDP;
@@ -8769,8 +8753,6 @@ SDPUtil = {
};
}(jQuery));
-/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.adapter.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
/* jshint -W117 */
var setupRTC, getUserMediaWithConstraints, TraceablePeerConnection;
@@ -9158,8 +9140,6 @@ getUserMediaWithConstraints = function(um, resolution, bandwidth, fps) {
}
}(jQuery));
-/*!
- * Source: build/lib/otr/build/dep/salsa20.js, license: AGPL3, url: https://github.com/neoatlantis/node-salsa20 */
// Salsa20 implementation
// Contributed to Cryptocat by Dmitry Chestnykh
// 21-01-2013
@@ -9414,8 +9394,6 @@ getUserMediaWithConstraints = function(um, resolution, bandwidth, fps) {
return Salsa20
}))
-/*!
- * Source: build/lib/otr/build/dep/bigint.js, license: public domain, url: www.leemon.com */
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
@@ -11121,8 +11099,6 @@ getUserMediaWithConstraints = function(um, resolution, bandwidth, fps) {
}
}))
-/*!
- * Source: build/lib/otr/build/dep/crypto.js, license: code.google.com/p/crypto-js/wiki/license, url: code.google.com/p/crypto-js */
;(function (root, factory) {
if (typeof define === "function" && define.amd) {
@@ -13558,8 +13534,6 @@ CryptoJS.mode.CTR = (function () {
}));
/*!
- * Source: build/lib/otr/build/dep/eventemitter.js, license: MIT, url: http://git.io/ee */
-/*!
* EventEmitter v4.2.3 - git.io/ee
* Oliver Caldwell
* MIT license
@@ -14016,8 +13990,6 @@ CryptoJS.mode.CTR = (function () {
}.call(this));
/*!
- * Source: build/lib/otr/build/otr.js, license: MPL v2.0, url: https://arlolra.github.io/otr/ */
-/*!
otr.js v0.2.14 - 2015-01-16
(c) 2015 - Arlo Breault <arlolra@gmail.com>
@@ -16650,4 +16622,10 @@ CryptoJS.mode.CTR = (function () {
, DSA: this.DSA
}
-})) \ No newline at end of file
+}))
+// i18next, v1.7.7
+// Copyright (c)2014 Jan Mühlemann (jamuhl).
+// Distributed under MIT license
+// http://i18next.com
+!function(){function a(a,b){if(!b||"function"==typeof b)return a;for(var c in b)a[c]=b[c];return a}function b(a,c){for(var d in c)d in a?b(a[d],c[d]):a[d]=c[d];return a}function c(a,b,c){var d,e=0,f=a.length,g=void 0===f||"[object Array]"!==Object.prototype.toString.apply(a)||"function"==typeof a;if(c)if(g){for(d in a)if(b.apply(a[d],c)===!1)break}else for(;f>e&&b.apply(a[e++],c)!==!1;);else if(g){for(d in a)if(b.call(a[d],d,a[d])===!1)break}else for(;f>e&&b.call(a[e],e,a[e++])!==!1;);return a}function d(a){return"string"==typeof a?a.replace(/[&<>"'\/]/g,function(a){return Q[a]}):a}function e(a){var b=function(a){if(window.XMLHttpRequest)return a(null,new XMLHttpRequest);if(window.ActiveXObject)try{return a(null,new ActiveXObject("Msxml2.XMLHTTP"))}catch(b){return a(null,new ActiveXObject("Microsoft.XMLHTTP"))}return a(new Error)},c=function(a){if("string"==typeof a)return a;var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")},d=function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(192|d>>6),b+=String.fromCharCode(128|63&d)):(b+=String.fromCharCode(224|d>>12),b+=String.fromCharCode(128|63&d>>6),b+=String.fromCharCode(128|63&d))}return b},e=function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";a=d(a);var c,e,f,g,h,i,j,k="",l=0;do c=a.charCodeAt(l++),e=a.charCodeAt(l++),f=a.charCodeAt(l++),g=c>>2,h=(3&c)<<4|e>>4,i=(15&e)<<2|f>>6,j=63&f,isNaN(e)?i=j=64:isNaN(f)&&(j=64),k+=b.charAt(g)+b.charAt(h)+b.charAt(i)+b.charAt(j),c=e=f="",g=h=i=j="";while(l<a.length);return k},f=function(){for(var a=arguments[0],b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}return a},g=function(a,d,e,h){"function"==typeof e&&(h=e,e={}),e.cache=e.cache||!1,e.data=e.data||{},e.headers=e.headers||{},e.jsonp=e.jsonp||!1,e.async=void 0===e.async?!0:e.async;var i,j=f({accept:"*/*","content-type":"application/x-www-form-urlencoded;charset=UTF-8"},g.headers,e.headers);if(i="application/json"===j["content-type"]?JSON.stringify(e.data):c(e.data),"GET"===a){var k=[];if(i&&(k.push(i),i=null),e.cache||k.push("_="+(new Date).getTime()),e.jsonp&&(k.push("callback="+e.jsonp),k.push("jsonp="+e.jsonp)),k=k.join("&"),k.length>1&&(d+=d.indexOf("?")>-1?"&"+k:"?"+k),e.jsonp){var l=document.getElementsByTagName("head")[0],m=document.createElement("script");return m.type="text/javascript",m.src=d,l.appendChild(m),void 0}}b(function(b,c){if(b)return h(b);c.open(a,d,e.async);for(var f in j)j.hasOwnProperty(f)&&c.setRequestHeader(f,j[f]);c.onreadystatechange=function(){if(4===c.readyState){var a=c.responseText||"";if(!h)return;h(c.status,{text:function(){return a},json:function(){try{return JSON.parse(a)}catch(b){return T.error("Can not parse JSON. URL: "+d),{}}}})}},c.send(i)})},h={authBasic:function(a,b){g.headers.Authorization="Basic "+e(a+":"+b)},connect:function(a,b,c){return g("CONNECT",a,b,c)},del:function(a,b,c){return g("DELETE",a,b,c)},get:function(a,b,c){return g("GET",a,b,c)},head:function(a,b,c){return g("HEAD",a,b,c)},headers:function(a){g.headers=a||{}},isAllowed:function(a,b,c){this.options(a,function(a,d){c(-1!==d.text().indexOf(b))})},options:function(a,b,c){return g("OPTIONS",a,b,c)},patch:function(a,b,c){return g("PATCH",a,b,c)},post:function(a,b,c){return g("POST",a,b,c)},put:function(a,b,c){return g("PUT",a,b,c)},trace:function(a,b,c){return g("TRACE",a,b,c)}},i=a.type?a.type.toLowerCase():"get";h[i](a.url,a,function(b,c){200===b||0===b&&c.text()?a.success(c.json(),b,null):a.error(c.text(),b,null)})}function f(a,b){"function"==typeof a&&(b=a,a={}),a=a||{},T.extend(P,a),delete P.fixLng,P.functions&&(delete P.functions,T.extend(T,a.functions)),"string"==typeof P.ns&&(P.ns={namespaces:[P.ns],defaultNs:P.ns}),"string"==typeof P.fallbackNS&&(P.fallbackNS=[P.fallbackNS]),("string"==typeof P.fallbackLng||"boolean"==typeof P.fallbackLng)&&(P.fallbackLng=[P.fallbackLng]),P.interpolationPrefixEscaped=T.regexEscape(P.interpolationPrefix),P.interpolationSuffixEscaped=T.regexEscape(P.interpolationSuffix),P.lng||(P.lng=T.detectLanguage()),L=T.toLanguages(P.lng),F=L[0],T.log("currentLng set to: "+F),P.useCookie&&T.cookie.read(P.cookieName)!==F&&T.cookie.create(P.cookieName,F,P.cookieExpirationTime,P.cookieDomain),P.detectLngFromLocalStorage&&"undefined"!=typeof document&&window.localStorage&&T.localStorage.setItem("i18next_lng",F);var c=z;a.fixLng&&(c=function(a,b){return b=b||{},b.lng=b.lng||c.lng,z(a,b)},c.lng=F),W.setCurrentLng(F),H&&P.setJqueryExt&&s();var d;if(H&&H.Deferred&&(d=H.Deferred()),!P.resStore){var e=T.toLanguages(P.lng);"string"==typeof P.preload&&(P.preload=[P.preload]);for(var f=0,g=P.preload.length;g>f;f++)for(var h=T.toLanguages(P.preload[f]),i=0,j=h.length;j>i;i++)e.indexOf(h[i])<0&&e.push(h[i]);return I.sync.load(e,P,function(a,e){J=e,M=!0,b&&b(c),d&&d.resolve(c)}),d?d.promise():void 0}return J=P.resStore,M=!0,b&&b(c),d&&d.resolve(c),d?d.promise():void 0}function g(a,b){"string"==typeof a&&(a=[a]);for(var c=0,d=a.length;d>c;c++)P.preload.indexOf(a[c])<0&&P.preload.push(a[c]);return f(b)}function h(a,b,c,d){"string"!=typeof b?(c=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b),J[a]=J[a]||{},J[a][b]=J[a][b]||{},d?T.deepExtend(J[a][b],c):T.extend(J[a][b],c)}function i(a,b){"string"!=typeof b&&(b=P.ns.defaultNs),J[a]=J[a]||{};var c=J[a][b]||{},d=!1;for(var e in c)c.hasOwnProperty(e)&&(d=!0);return d}function j(a,b){"string"!=typeof b&&(b=P.ns.defaultNs),J[a]=J[a]||{},J[a][b]={}}function k(a,b,c,d){"string"!=typeof b?(resource=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b),J[a]=J[a]||{},J[a][b]=J[a][b]||{};for(var e=c.split(P.keyseparator),f=0,g=J[a][b];e[f];)f==e.length-1?g[e[f]]=d:(null==g[e[f]]&&(g[e[f]]={}),g=g[e[f]]),f++}function l(a,b,c){"string"!=typeof b?(resource=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b);for(var d in c)"string"==typeof c[d]&&k(a,b,d,c[d])}function m(a){P.ns.defaultNs=a}function n(a,b){o([a],b)}function o(a,b){var c={dynamicLoad:P.dynamicLoad,resGetPath:P.resGetPath,getAsync:P.getAsync,customLoad:P.customLoad,ns:{namespaces:a,defaultNs:""}},d=T.toLanguages(P.lng);"string"==typeof P.preload&&(P.preload=[P.preload]);for(var e=0,f=P.preload.length;f>e;e++)for(var g=T.toLanguages(P.preload[e]),h=0,i=g.length;i>h;h++)d.indexOf(g[h])<0&&d.push(g[h]);for(var j=[],k=0,l=d.length;l>k;k++){var m=!1,n=J[d[k]];if(n)for(var o=0,p=a.length;p>o;o++)n[a[o]]||(m=!0);else m=!0;m&&j.push(d[k])}j.length?I.sync._fetch(j,c,function(c,d){var e=a.length*j.length;T.each(a,function(a,c){P.ns.namespaces.indexOf(c)<0&&P.ns.namespaces.push(c),T.each(j,function(a,f){J[f]=J[f]||{},J[f][c]=d[f][c],e--,0===e&&b&&(P.useLocalStorage&&I.sync._storeLocal(J),b())})})}):b&&b()}function p(a,b,c){return"function"==typeof b?(c=b,b={}):b||(b={}),b.lng=a,f(b,c)}function q(){return F}function r(a){J={},p(F,a)}function s(){function a(a,b,c){if(0!==b.length){var d="text";if(0===b.indexOf("[")){var e=b.split("]");b=e[1],d=e[0].substr(1,e[0].length-1)}b.indexOf(";")===b.length-1&&(b=b.substr(0,b.length-2));var f;if("html"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.html(H.t(b,f));else if("text"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.text()},c):c,a.text(H.t(b,f));else if("prepend"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.prepend(H.t(b,f));else if("append"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.append(H.t(b,f));else if(0===d.indexOf("data-")){var g=d.substr("data-".length);f=P.defaultValueFromContent?H.extend({defaultValue:a.data(g)},c):c;var h=H.t(b,f);a.data(g,h),a.attr(d,h)}else f=P.defaultValueFromContent?H.extend({defaultValue:a.attr(d)},c):c,a.attr(d,H.t(b,f))}}function b(b,c){var d=b.attr(P.selectorAttr);if(d||"undefined"==typeof d||d===!1||(d=b.text()||b.val()),d){var e=b,f=b.data("i18n-target");if(f&&(e=b.find(f)||b),c||P.useDataAttrOptions!==!0||(c=b.data("i18n-options")),c=c||{},d.indexOf(";")>=0){var g=d.split(";");H.each(g,function(b,d){""!==d&&a(e,d,c)})}else a(e,d,c);P.useDataAttrOptions===!0&&b.data("i18n-options",c)}}H.t=H.t||z,H.fn.i18n=function(a){return this.each(function(){b(H(this),a);var c=H(this).find("["+P.selectorAttr+"]");c.each(function(){b(H(this),a)})})}}function t(a,b,c,d){if(!a)return a;if(d=d||b,a.indexOf(d.interpolationPrefix||P.interpolationPrefix)<0)return a;var e=d.interpolationPrefix?T.regexEscape(d.interpolationPrefix):P.interpolationPrefixEscaped,f=d.interpolationSuffix?T.regexEscape(d.interpolationSuffix):P.interpolationSuffixEscaped,g="HTML"+f,h=b.replace&&"object"==typeof b.replace?b.replace:b;return T.each(h,function(b,h){var i=c?c+P.keyseparator+b:b;"object"==typeof h&&null!==h?a=t(a,h,i,d):d.escapeInterpolation||P.escapeInterpolation?(a=a.replace(new RegExp([e,i,g].join(""),"g"),T.regexReplacementEscape(h)),a=a.replace(new RegExp([e,i,f].join(""),"g"),T.regexReplacementEscape(T.escape(h)))):a=a.replace(new RegExp([e,i,f].join(""),"g"),T.regexReplacementEscape(h))}),a}function u(a,b){var c=",",d="{",e="}",f=T.extend({},b);for(delete f.postProcess;-1!=a.indexOf(P.reusePrefix)&&(K++,!(K>P.maxRecursion));){var g=a.lastIndexOf(P.reusePrefix),h=a.indexOf(P.reuseSuffix,g)+P.reuseSuffix.length,i=a.substring(g,h),j=i.replace(P.reusePrefix,"").replace(P.reuseSuffix,"");if(g>=h)return T.error("there is an missing closing in following translation value",a),"";if(-1!=j.indexOf(c)){var k=j.indexOf(c);if(-1!=j.indexOf(d,k)&&-1!=j.indexOf(e,k)){var l=j.indexOf(d,k),m=j.indexOf(e,l)+e.length;try{f=T.extend(f,JSON.parse(j.substring(l,m))),j=j.substring(0,k)}catch(n){}}}var o=C(j,f);a=a.replace(i,T.regexReplacementEscape(o))}return a}function v(a){return a.context&&("string"==typeof a.context||"number"==typeof a.context)}function w(a){return void 0!==a.count&&"string"!=typeof a.count}function x(a){return void 0!==a.indefinite_article&&"string"!=typeof a.indefinite_article&&a.indefinite_article}function y(a,b){b=b||{};var c=A(a,b),d=D(a,b);return void 0!==d||d===c}function z(a,b){return b=b||{},M?(K=0,C.apply(null,arguments)):(T.log("i18next not finished initialization. you might have called t function before loading resources finished."),b.defaultValue||"")}function A(a,b){return void 0!==b.defaultValue?b.defaultValue:a}function B(){for(var a=[],b=1;b<arguments.length;b++)a.push(arguments[b]);return{postProcess:"sprintf",sprintf:a}}function C(a,b){if(b&&"object"!=typeof b?"sprintf"===P.shortcutFunction?b=B.apply(null,arguments):"defaultValue"===P.shortcutFunction&&(b={defaultValue:b}):b=b||{},"object"==typeof P.defaultVariables&&(b=T.extend({},P.defaultVariables,b)),void 0===a||null===a||""===a)return"";"string"==typeof a&&(a=[a]);var c=a[0];if(a.length>1)for(var d=0;d<a.length&&(c=a[d],!y(c,b));d++);var e,f=A(c,b),g=D(c,b),h=b.lng?T.toLanguages(b.lng,b.fallbackLng):L,i=b.ns||P.ns.defaultNs;c.indexOf(P.nsseparator)>-1&&(e=c.split(P.nsseparator),i=e[0],c=e[1]),void 0===g&&P.sendMissing&&"function"==typeof P.missingKeyHandler&&(b.lng?P.missingKeyHandler(h[0],i,c,f,h):P.missingKeyHandler(P.lng,i,c,f,h));var j=b.postProcess||P.postProcess;void 0!==g&&j&&X[j]&&(g=X[j](g,c,b));var k=f;if(f.indexOf(P.nsseparator)>-1&&(e=f.split(P.nsseparator),k=e[1]),k===c&&P.parseMissingKey&&(f=P.parseMissingKey(f)),void 0===g&&(f=t(f,b),f=u(f,b),j&&X[j])){var l=A(c,b);g=X[j](l,c,b)}return void 0!==g?g:f}function D(a,b){b=b||{};var c,d,e=A(a,b),f=L;if(!J)return e;if("cimode"===f[0].toLowerCase())return e;if(b.lngs&&(f=b.lngs),b.lng&&(f=T.toLanguages(b.lng,b.fallbackLng),!J[f[0]])){var g=P.getAsync;P.getAsync=!1,I.sync.load(f,P,function(a,b){T.extend(J,b),P.getAsync=g})}var h=b.ns||P.ns.defaultNs;if(a.indexOf(P.nsseparator)>-1){var i=a.split(P.nsseparator);h=i[0],a=i[1]}if(v(b)){c=T.extend({},b),delete c.context,c.defaultValue=P.contextNotFound;var j=h+P.nsseparator+a+"_"+b.context;if(d=z(j,c),d!=P.contextNotFound)return t(d,{context:b.context})}if(w(b,f[0])){c=T.extend({lngs:[f[0]]},b),delete c.count,delete c.lng,c.defaultValue=P.pluralNotFound;var k;if(W.needsPlural(f[0],b.count)){k=h+P.nsseparator+a+P.pluralSuffix;var l=W.get(f[0],b.count);l>=0?k=k+"_"+l:1===l&&(k=h+P.nsseparator+a)}else k=h+P.nsseparator+a;if(d=z(k,c),d!=P.pluralNotFound)return t(d,{count:b.count,interpolationPrefix:b.interpolationPrefix,interpolationSuffix:b.interpolationSuffix});if(!(f.length>1))return d;var m=f.slice();if(m.shift(),b=T.extend(b,{lngs:m}),delete b.lng,d=z(h+P.nsseparator+a,b),d!=P.pluralNotFound)return d}if(x(b)){var n=T.extend({},b);delete n.indefinite_article,n.defaultValue=P.indefiniteNotFound;var o=h+P.nsseparator+a+(b.count&&!w(b,f[0])||!b.count?P.indefiniteSuffix:"");if(d=z(o,n),d!=P.indefiniteNotFound)return d}for(var p,q=a.split(P.keyseparator),r=0,s=f.length;s>r&&void 0===p;r++){for(var y=f[r],B=0,E=J[y]&&J[y][h];q[B];)E=E&&E[q[B]],B++;if(void 0!==E){var F=Object.prototype.toString.apply(E);if("string"==typeof E)E=t(E,b),E=u(E,b);else if("[object Array]"!==F||P.returnObjectTrees||b.returnObjectTrees){if(null===E&&P.fallbackOnNull===!0)E=void 0;else if(null!==E)if(P.returnObjectTrees||b.returnObjectTrees){if("[object Number]"!==F&&"[object Function]"!==F&&"[object RegExp]"!==F){var G="[object Array]"===F?[]:{};T.each(E,function(c){G[c]=C(h+P.nsseparator+a+P.keyseparator+c,b)}),E=G}}else P.objectTreeKeyHandler&&"function"==typeof P.objectTreeKeyHandler?E=P.objectTreeKeyHandler(a,E,y,h,b):(E="key '"+h+":"+a+" ("+y+")' "+"returned an object instead of string.",T.log(E))}else E=E.join("\n"),E=t(E,b),E=u(E,b);"string"==typeof E&&""===E.trim()&&P.fallbackOnEmpty===!0&&(E=void 0),p=E}}if(void 0===p&&!b.isFallbackLookup&&(P.fallbackToDefaultNS===!0||P.fallbackNS&&P.fallbackNS.length>0)){if(b.isFallbackLookup=!0,P.fallbackNS.length){for(var H=0,K=P.fallbackNS.length;K>H;H++)if(p=D(P.fallbackNS[H]+P.nsseparator+a,b),p||""===p&&P.fallbackOnEmpty===!1){var M=p.indexOf(P.nsseparator)>-1?p.split(P.nsseparator)[1]:p,N=e.indexOf(P.nsseparator)>-1?e.split(P.nsseparator)[1]:e;if(M!==N)break}}else p=D(a,b);b.isFallbackLookup=!1}return p}function E(){var a,b=P.lngWhitelist||[],c=[];if("undefined"!=typeof window&&!function(){for(var a=window.location.search.substring(1),b=a.split("&"),d=0;d<b.length;d++){var e=b[d].indexOf("=");if(e>0){var f=b[d].substring(0,e);f==P.detectLngQS&&c.push(b[d].substring(e+1))}}}(),P.useCookie&&"undefined"!=typeof document){var d=T.cookie.read(P.cookieName);d&&c.push(d)}if(P.detectLngFromLocalStorage&&"undefined"!=typeof window&&window.localStorage&&c.push(window.localStorage.getItem("i18next_lng")),"undefined"!=typeof navigator){if(navigator.languages)for(var e=0;e<navigator.languages.length;e++)c.push(navigator.languages[e]);navigator.userLanguage&&c.push(navigator.userLanguage),navigator.language&&c.push(navigator.language)}return function(){for(var d=0;d<c.length;d++){var e=c[d];if(e.indexOf("-")>-1){var f=e.split("-");e=P.lowerCaseLng?f[0].toLowerCase()+"-"+f[1].toLowerCase():f[0].toLowerCase()+"-"+f[1].toUpperCase()}if(0===b.length||b.indexOf(e)>-1){a=e;break}}}(),a||(a=P.fallbackLng[0]),a}Array.prototype.indexOf||(Array.prototype.indexOf=function(a){"use strict";if(null==this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>0&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&1/0!=d&&d!=-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(a){"use strict";if(null==this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=c;arguments.length>1&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&d!=1/0&&d!=-(1/0)&&(d=(d>0||-1)*Math.floor(Math.abs(d))));for(var e=d>=0?Math.min(d,c-1):c-Math.abs(d);e>=0;e--)if(e in b&&b[e]===a)return e;return-1}),"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});var F,G=this,H=G.jQuery||G.Zepto,I={},J={},K=0,L=[],M=!1,N={};if("undefined"!=typeof module&&module.exports){if(!H)try{H=require("jquery")}catch(O){}H&&(H.i18n=H.i18n||I),module.exports=I}else H&&(H.i18n=H.i18n||I),G.i18n=G.i18n||I;N={load:function(a,b,c){b.useLocalStorage?N._loadLocal(a,b,function(d,e){for(var f=[],g=0,h=a.length;h>g;g++)e[a[g]]||f.push(a[g]);f.length>0?N._fetch(f,b,function(a,b){T.extend(e,b),N._storeLocal(b),c(null,e)}):c(null,e)}):N._fetch(a,b,function(a,b){c(null,b)})},_loadLocal:function(a,b,c){var d={},e=(new Date).getTime();if(window.localStorage){var f=a.length;T.each(a,function(a,g){var h=window.localStorage.getItem("res_"+g);h&&(h=JSON.parse(h),h.i18nStamp&&h.i18nStamp+b.localStorageExpirationTime>e&&(d[g]=h)),f--,0===f&&c(null,d)})}},_storeLocal:function(a){if(window.localStorage)for(var b in a)a[b].i18nStamp=(new Date).getTime(),T.localStorage.setItem("res_"+b,JSON.stringify(a[b]))},_fetch:function(a,b,c){var d=b.ns,e={};if(b.dynamicLoad){var f=function(a,b){c(null,b)};if("function"==typeof b.customLoad)b.customLoad(a,d.namespaces,b,f);else{var g=t(b.resGetPath,{lng:a.join("+"),ns:d.namespaces.join("+")});T.ajax({url:g,success:function(a){T.log("loaded: "+g),f(null,a)},error:function(a,b,c){T.log("failed loading: "+g),f("failed loading resource.json error: "+c)},dataType:"json",async:b.getAsync})}}else{var h,i=d.namespaces.length*a.length;T.each(d.namespaces,function(d,f){T.each(a,function(a,d){var g=function(a,b){a&&(h=h||[],h.push(a)),e[d]=e[d]||{},e[d][f]=b,i--,0===i&&c(h,e)};"function"==typeof b.customLoad?b.customLoad(d,f,b,g):N._fetchOne(d,f,b,g)})})}},_fetchOne:function(a,b,c,d){var e=t(c.resGetPath,{lng:a,ns:b});T.ajax({url:e,success:function(a){T.log("loaded: "+e),d(null,a)},error:function(a,b,c){if(b&&200==b||a&&a.status&&200==a.status)T.error("There is a typo in: "+e);else if(b&&404==b||a&&a.status&&404==a.status)T.log("Does not exist: "+e);else{var f=b?b:a&&a.status?a.status:null;T.log(f+" when loading "+e)}d(c,{})},dataType:"json",async:c.getAsync})},postMissing:function(a,b,c,d,e){var f={};f[c]=d;var g=[];if("fallback"===P.sendMissingTo&&P.fallbackLng[0]!==!1)for(var h=0;h<P.fallbackLng.length;h++)g.push({lng:P.fallbackLng[h],url:t(P.resPostPath,{lng:P.fallbackLng[h],ns:b})});else if("current"===P.sendMissingTo||"fallback"===P.sendMissingTo&&P.fallbackLng[0]===!1)g.push({lng:a,url:t(P.resPostPath,{lng:a,ns:b})});else if("all"===P.sendMissingTo)for(var h=0,i=e.length;i>h;h++)g.push({lng:e[h],url:t(P.resPostPath,{lng:e[h],ns:b})});for(var j=0,k=g.length;k>j;j++){var l=g[j];T.ajax({url:l.url,type:P.sendType,data:f,success:function(){T.log("posted missing key '"+c+"' to: "+l.url);for(var a=c.split("."),e=0,f=J[l.lng][b];a[e];)f=f[a[e]]=e===a.length-1?d:f[a[e]]||{},e++},error:function(){T.log("failed posting missing key '"+c+"' to: "+l.url)},dataType:"json",async:P.postAsync})}},reload:r};var P={lng:void 0,load:"all",preload:[],lowerCaseLng:!1,returnObjectTrees:!1,fallbackLng:["dev"],fallbackNS:[],detectLngQS:"setLng",detectLngFromLocalStorage:!1,ns:"translation",fallbackOnNull:!0,fallbackOnEmpty:!1,fallbackToDefaultNS:!1,nsseparator:":",keyseparator:".",selectorAttr:"data-i18n",debug:!1,resGetPath:"locales/__lng__/__ns__.json",resPostPath:"locales/add/__lng__/__ns__",getAsync:!0,postAsync:!0,resStore:void 0,useLocalStorage:!1,localStorageExpirationTime:6048e5,dynamicLoad:!1,sendMissing:!1,sendMissingTo:"fallback",sendType:"POST",interpolationPrefix:"__",interpolationSuffix:"__",defaultVariables:!1,reusePrefix:"$t(",reuseSuffix:")",pluralSuffix:"_plural",pluralNotFound:["plural_not_found",Math.random()].join(""),contextNotFound:["context_not_found",Math.random()].join(""),escapeInterpolation:!1,indefiniteSuffix:"_indefinite",indefiniteNotFound:["indefinite_not_found",Math.random()].join(""),setJqueryExt:!0,defaultValueFromContent:!0,useDataAttrOptions:!1,cookieExpirationTime:void 0,useCookie:!0,cookieName:"i18next",cookieDomain:void 0,objectTreeKeyHandler:void 0,postProcess:void 0,parseMissingKey:void 0,missingKeyHandler:N.postMissing,shortcutFunction:"sprintf"},Q={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"},R={create:function(a,b,c,d){var e;if(c){var f=new Date;f.setTime(f.getTime()+1e3*60*c),e="; expires="+f.toGMTString()}else e="";d=d?"domain="+d+";":"",document.cookie=a+"="+b+e+";"+d+"path=/"},read:function(a){for(var b=a+"=",c=document.cookie.split(";"),d=0;d<c.length;d++){for(var e=c[d];" "==e.charAt(0);)e=e.substring(1,e.length);if(0===e.indexOf(b))return e.substring(b.length,e.length)}return null},remove:function(a){this.create(a,"",-1)}},S={create:function(){},read:function(){return null},remove:function(){}},T={extend:H?H.extend:a,deepExtend:b,each:H?H.each:c,ajax:H?H.ajax:"undefined"!=typeof document?e:function(){},cookie:"undefined"!=typeof document?R:S,detectLanguage:E,escape:d,log:function(a){P.debug&&"undefined"!=typeof console&&console.log(a)},error:function(a){"undefined"!=typeof console&&console.error(a)},getCountyIndexOfLng:function(a){var b=0;return("nb-NO"===a||"nn-NO"===a||"nb-no"===a||"nn-no"===a)&&(b=1),b},toLanguages:function(a){function b(a){var b=a;if("string"==typeof a&&a.indexOf("-")>-1){var c=a.split("-");b=P.lowerCaseLng?c[0].toLowerCase()+"-"+c[1].toLowerCase():c[0].toLowerCase()+"-"+c[1].toUpperCase()}else b=P.lowerCaseLng?a.toLowerCase():a;return b}var c=this.log,d=[],e=P.lngWhitelist||!1,f=function(a){!e||e.indexOf(a)>-1?d.push(a):c("rejecting non-whitelisted language: "+a)};if("string"==typeof a&&a.indexOf("-")>-1){var g=a.split("-");"unspecific"!==P.load&&f(b(a)),"current"!==P.load&&f(b(g[this.getCountyIndexOfLng(a)]))}else f(b(a));for(var h=0;h<P.fallbackLng.length;h++)-1===d.indexOf(P.fallbackLng[h])&&P.fallbackLng[h]&&d.push(b(P.fallbackLng[h]));return d},regexEscape:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},regexReplacementEscape:function(a){return"string"==typeof a?a.replace(/\$/g,"$$$$"):a},localStorage:{setItem:function(a,b){if(window.localStorage)try{window.localStorage.setItem(a,b)}catch(c){T.log('failed to set value for key "'+a+'" to localStorage.')}}}};T.applyReplacement=t;var U=[["ach","Acholi",[1,2],1],["af","Afrikaans",[1,2],2],["ak","Akan",[1,2],1],["am","Amharic",[1,2],1],["an","Aragonese",[1,2],2],["ar","Arabic",[0,1,2,3,11,100],5],["arn","Mapudungun",[1,2],1],["ast","Asturian",[1,2],2],["ay","Aymará",[1],3],["az","Azerbaijani",[1,2],2],["be","Belarusian",[1,2,5],4],["bg","Bulgarian",[1,2],2],["bn","Bengali",[1,2],2],["bo","Tibetan",[1],3],["br","Breton",[1,2],1],["bs","Bosnian",[1,2,5],4],["ca","Catalan",[1,2],2],["cgg","Chiga",[1],3],["cs","Czech",[1,2,5],6],["csb","Kashubian",[1,2,5],7],["cy","Welsh",[1,2,3,8],8],["da","Danish",[1,2],2],["de","German",[1,2],2],["dev","Development Fallback",[1,2],2],["dz","Dzongkha",[1],3],["el","Greek",[1,2],2],["en","English",[1,2],2],["eo","Esperanto",[1,2],2],["es","Spanish",[1,2],2],["es_ar","Argentinean Spanish",[1,2],2],["et","Estonian",[1,2],2],["eu","Basque",[1,2],2],["fa","Persian",[1],3],["fi","Finnish",[1,2],2],["fil","Filipino",[1,2],1],["fo","Faroese",[1,2],2],["fr","French",[1,2],9],["fur","Friulian",[1,2],2],["fy","Frisian",[1,2],2],["ga","Irish",[1,2,3,7,11],10],["gd","Scottish Gaelic",[1,2,3,20],11],["gl","Galician",[1,2],2],["gu","Gujarati",[1,2],2],["gun","Gun",[1,2],1],["ha","Hausa",[1,2],2],["he","Hebrew",[1,2],2],["hi","Hindi",[1,2],2],["hr","Croatian",[1,2,5],4],["hu","Hungarian",[1,2],2],["hy","Armenian",[1,2],2],["ia","Interlingua",[1,2],2],["id","Indonesian",[1],3],["is","Icelandic",[1,2],12],["it","Italian",[1,2],2],["ja","Japanese",[1],3],["jbo","Lojban",[1],3],["jv","Javanese",[0,1],13],["ka","Georgian",[1],3],["kk","Kazakh",[1],3],["km","Khmer",[1],3],["kn","Kannada",[1,2],2],["ko","Korean",[1],3],["ku","Kurdish",[1,2],2],["kw","Cornish",[1,2,3,4],14],["ky","Kyrgyz",[1],3],["lb","Letzeburgesch",[1,2],2],["ln","Lingala",[1,2],1],["lo","Lao",[1],3],["lt","Lithuanian",[1,2,10],15],["lv","Latvian",[1,2,0],16],["mai","Maithili",[1,2],2],["mfe","Mauritian Creole",[1,2],1],["mg","Malagasy",[1,2],1],["mi","Maori",[1,2],1],["mk","Macedonian",[1,2],17],["ml","Malayalam",[1,2],2],["mn","Mongolian",[1,2],2],["mnk","Mandinka",[0,1,2],18],["mr","Marathi",[1,2],2],["ms","Malay",[1],3],["mt","Maltese",[1,2,11,20],19],["nah","Nahuatl",[1,2],2],["nap","Neapolitan",[1,2],2],["nb","Norwegian Bokmal",[1,2],2],["ne","Nepali",[1,2],2],["nl","Dutch",[1,2],2],["nn","Norwegian Nynorsk",[1,2],2],["no","Norwegian",[1,2],2],["nso","Northern Sotho",[1,2],2],["oc","Occitan",[1,2],1],["or","Oriya",[2,1],2],["pa","Punjabi",[1,2],2],["pap","Papiamento",[1,2],2],["pl","Polish",[1,2,5],7],["pms","Piemontese",[1,2],2],["ps","Pashto",[1,2],2],["pt","Portuguese",[1,2],2],["pt_br","Brazilian Portuguese",[1,2],2],["rm","Romansh",[1,2],2],["ro","Romanian",[1,2,20],20],["ru","Russian",[1,2,5],4],["sah","Yakut",[1],3],["sco","Scots",[1,2],2],["se","Northern Sami",[1,2],2],["si","Sinhala",[1,2],2],["sk","Slovak",[1,2,5],6],["sl","Slovenian",[5,1,2,3],21],["so","Somali",[1,2],2],["son","Songhay",[1,2],2],["sq","Albanian",[1,2],2],["sr","Serbian",[1,2,5],4],["su","Sundanese",[1],3],["sv","Swedish",[1,2],2],["sw","Swahili",[1,2],2],["ta","Tamil",[1,2],2],["te","Telugu",[1,2],2],["tg","Tajik",[1,2],1],["th","Thai",[1],3],["ti","Tigrinya",[1,2],1],["tk","Turkmen",[1,2],2],["tr","Turkish",[1,2],1],["tt","Tatar",[1],3],["ug","Uyghur",[1],3],["uk","Ukrainian",[1,2,5],4],["ur","Urdu",[1,2],2],["uz","Uzbek",[1,2],1],["vi","Vietnamese",[1],3],["wa","Walloon",[1,2],1],["wo","Wolof",[1],3],["yo","Yoruba",[1,2],2],["zh","Chinese",[1],3]],V={1:function(a){return Number(a>1)},2:function(a){return Number(1!=a)},3:function(){return 0},4:function(a){return Number(1==a%10&&11!=a%100?0:a%10>=2&&4>=a%10&&(10>a%100||a%100>=20)?1:2)},5:function(a){return Number(0===a?0:1==a?1:2==a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5)},6:function(a){return Number(1==a?0:a>=2&&4>=a?1:2)},7:function(a){return Number(1==a?0:a%10>=2&&4>=a%10&&(10>a%100||a%100>=20)?1:2)},8:function(a){return Number(1==a?0:2==a?1:8!=a&&11!=a?2:3)},9:function(a){return Number(a>=2)},10:function(a){return Number(1==a?0:2==a?1:7>a?2:11>a?3:4)},11:function(a){return Number(1==a||11==a?0:2==a||12==a?1:a>2&&20>a?2:3)},12:function(a){return Number(1!=a%10||11==a%100)},13:function(a){return Number(0!==a)},14:function(a){return Number(1==a?0:2==a?1:3==a?2:3)},15:function(a){return Number(1==a%10&&11!=a%100?0:a%10>=2&&(10>a%100||a%100>=20)?1:2)},16:function(a){return Number(1==a%10&&11!=a%100?0:0!==a?1:2)},17:function(a){return Number(1==a||1==a%10?0:1)},18:function(a){return Number(1==a?1:2)},19:function(a){return Number(1==a?0:0===a||a%100>1&&11>a%100?1:a%100>10&&20>a%100?2:3)},20:function(a){return Number(1==a?0:0===a||a%100>0&&20>a%100?1:2)},21:function(a){return Number(1==a%100?1:2==a%100?2:3==a%100||4==a%100?3:0)}},W={rules:function(){var a,b={};for(a=U.length;a--;)b[U[a][0]]={name:U[a][1],numbers:U[a][2],plurals:V[U[a][3]]};return b}(),addRule:function(a,b){W.rules[a]=b},setCurrentLng:function(a){if(!W.currentRule||W.currentRule.lng!==a){var b=a.split("-");W.currentRule={lng:a,rule:W.rules[b[0]]}}},needsPlural:function(a,b){var c,d=a.split("-");return c=W.currentRule&&W.currentRule.lng===a?W.currentRule.rule:W.rules[d[T.getCountyIndexOfLng(a)]],c&&c.numbers.length<=1?!1:1!==this.get(a,b)},get:function(a,b){function c(b,c){var d;if(d=W.currentRule&&W.currentRule.lng===a?W.currentRule.rule:W.rules[b]){var e;e=d.noAbs?d.plurals(c):d.plurals(Math.abs(c));var f=d.numbers[e];return 2===d.numbers.length&&1===d.numbers[0]&&(2===f?f=-1:1===f&&(f=1)),f}return 1===c?"1":"-1"}var d=a.split("-");return c(d[T.getCountyIndexOfLng(a)],b)}},X={},Y=function(a,b){X[a]=b},Z=function(){function a(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function b(a,b){for(var c=[];b>0;c[--b]=a);return c.join("")}var c=function(){return c.cache.hasOwnProperty(arguments[0])||(c.cache[arguments[0]]=c.parse(arguments[0])),c.format.call(null,c.cache[arguments[0]],arguments)};return c.format=function(c,d){var e,f,g,h,i,j,k,l=1,m=c.length,n="",o=[];for(f=0;m>f;f++)if(n=a(c[f]),"string"===n)o.push(c[f]);else if("array"===n){if(h=c[f],h[2])for(e=d[l],g=0;g<h[2].length;g++){if(!e.hasOwnProperty(h[2][g]))throw Z('[sprintf] property "%s" does not exist',h[2][g]);e=e[h[2][g]]}else e=h[1]?d[h[1]]:d[l++];if(/[^s]/.test(h[8])&&"number"!=a(e))throw Z("[sprintf] expecting number but found %s",a(e));switch(h[8]){case"b":e=e.toString(2);break;case"c":e=String.fromCharCode(e);break;case"d":e=parseInt(e,10);break;case"e":e=h[7]?e.toExponential(h[7]):e.toExponential();break;case"f":e=h[7]?parseFloat(e).toFixed(h[7]):parseFloat(e);break;case"o":e=e.toString(8);break;case"s":e=(e=String(e))&&h[7]?e.substring(0,h[7]):e;break;case"u":e=Math.abs(e);break;case"x":e=e.toString(16);break;case"X":e=e.toString(16).toUpperCase()}e=/[def]/.test(h[8])&&h[3]&&e>=0?"+"+e:e,j=h[4]?"0"==h[4]?"0":h[4].charAt(1):" ",k=h[6]-String(e).length,i=h[6]?b(j,k):"",o.push(h[5]?e+i:i+e)}return o.join("")},c.cache={},c.parse=function(a){for(var b=a,c=[],d=[],e=0;b;){if(null!==(c=/^[^\x25]+/.exec(b)))d.push(c[0]);else if(null!==(c=/^\x25{2}/.exec(b)))d.push("%");else{if(null===(c=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(b)))throw"[sprintf] huh?";if(c[2]){e|=1;var f=[],g=c[2],h=[];if(null===(h=/^([a-z_][a-z_\d]*)/i.exec(g)))throw"[sprintf] huh?";for(f.push(h[1]);""!==(g=g.substring(h[0].length));)if(null!==(h=/^\.([a-z_][a-z_\d]*)/i.exec(g)))f.push(h[1]);else{if(null===(h=/^\[(\d+)\]/.exec(g)))throw"[sprintf] huh?";f.push(h[1])}c[2]=f}else e|=2;if(3===e)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";d.push(c)}b=b.substring(c[0].length)}return d},c}(),$=function(a,b){return b.unshift(a),Z.apply(null,b)};Y("sprintf",function(a,b,c){return c.sprintf?"[object Array]"===Object.prototype.toString.apply(c.sprintf)?$(a,c.sprintf):"object"==typeof c.sprintf?Z(a,c.sprintf):a:a}),I.init=f,I.setLng=p,I.preload=g,I.addResourceBundle=h,I.hasResourceBundle=i,I.addResource=k,I.addResources=l,I.removeResourceBundle=j,I.loadNamespace=n,I.loadNamespaces=o,I.setDefaultNamespace=m,I.t=z,I.translate=z,I.exists=y,I.detectLanguage=T.detectLanguage,I.pluralExtensions=W,I.sync=N,I.functions=T,I.lng=q,I.addPostProcessor=Y,I.options=P}();
+var I18next = {"de":{"translation":{"Logging_in":"Login läuft…","your_connection_is_unencrypted":"Deine Verbindung ist Unverschlüsselt.","your_connection_is_encrypted":"Deine Verbindung ist verschlüsselt.","your_buddy_closed_the_private_connection":"Dein Kontakt hat die private Verbindung getrennt.","start_private":"Privat starten","close_private":"Privat abbrechen","your_buddy_is_verificated":"Dein Kontakt ist verifiziert.","you_have_only_a_subscription_in_one_way":"Der Kontaktstatus ist einseitig.","authentication_query_sent":"Authentifizierungsanfrage gesendet.","your_message_wasnt_send_please_end_your_private_conversation":"Deine Nachricht wurde nicht gesendet. Bitte beende die private Konversation.","unencrypted_message_received":"Unverschlüsselte Nachricht erhalten.","your_message_wasnt_send_because_you_have_no_valid_subscription":"Deine Nachricht wurde nicht gesandt, da der Kontaktstatus einseitig ist.","not_available":"Nicht verfügbar.","no_connection":"Keine Verbindung.","relogin":"Neu anmelden.","trying_to_start_private_conversation":"Versuche private Konversation zu starten.","Verified":"Verifiziert","Unverified":"Unverifiziert","private_conversation_started":"Private Konversation gestartet.","private_conversation_aborted":"Private Konversation abgebrochen.","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Dein Kontakt hat die private Konversation beendet. Das solltest du auch tun!","conversation_is_now_verified":"Konversation ist jetzt verifiziert","authentication_failed":"Authentifizierung fehlgeschlagen.","your_buddy_is_attempting_to_determine_":"Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet.","to_authenticate_to_your_buddy":"Um dich gegenüber deinem Kontakt zu verifizieren ","enter_the_answer_and_click_answer":"gib die Antwort ein und klick auf Antworten.","enter_the_secret":"gib das Geheimnis ein.","Creating_your_private_key_":"Wir werden jetzt deinen privaten Schlüssel generieren. Das kann einige Zeit in Anspruch nehmen.","Authenticating_a_buddy_helps_":"Einen Kontakt zu authentifizieren hilft sicher zustellen, dass die Person mit der du sprichst auch die ist die sie sagt.","How_do_you_want_to_authenticate_your_buddy":"Wie willst du {{bid_name}} (<b>{{bid_jid}}</b>) authentifizieren?","Select_method":"Wähle...","Manual":"Manual","Question":"Frage","Secret":"Geheimnis","To_verify_the_fingerprint_":"Um den Fingerprint zu verifizieren kontaktiere dein Kontakt über einen anderen Kommunikationsweg. Zum Beispiel per Telefonanruf.","Your_fingerprint":"Dein Fingerprint","Buddy_fingerprint":"Sein/Ihr Fingerprint","Close":"Schließen","Compared":"Verglichen","To_authenticate_using_a_question_":"Um die Authentifizierung per Frage durchzuführen, wähle eine Frage bei welcher nur dein Kontakt die Antwort weiß.","Ask":"Frage","To_authenticate_pick_a_secret_":"Um deinen Kontakt zu authentifizieren, wähle ein Geheimnis welches nur deinem Kontakt und dir bekannt ist.","Compare":"Vergleiche","Fingerprints":"Fingerprints","Authentication":"Authentifizierung","Message":"Nachricht","Add_buddy":"Kontakt hinzufügen","rename_buddy":"Kontakt umbenennen","delete_buddy":"Kontakt löschen","Login":"Anmeldung","Username":"Benutzername","Password":"Passwort","Cancel":"Abbrechen","Connect":"Verbinden","Type_in_the_full_username_":"Gib bitte den vollen Benutzernamen und optional ein Alias an.","Alias":"Alias","Add":"Hinzufügen","Subscription_request":"Kontaktanfrage","You_have_a_request_from":"Du hast eine Anfrage von","Deny":"Ablehnen","Approve":"Bestätigen","Remove_buddy":"Kontakt entfernen","You_are_about_to_remove_":"Du bist gerade dabei {{bid_name}} (<b>{{bid_jid}}</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.","Continue_without_chat":"Weiter ohne Chat","Please_wait":"Bitte warten","Login_failed":"Chat-Anmeldung fehlgeschlagen","Sorry_we_cant_authentikate_":"Der Chatserver hat die Anmeldung abgelehnt. Falsches Passwort?","Retry":"Zurück","clear_history":"Lösche Verlauf","New_message_from":"Neue Nachricht von","Should_we_notify_you_":"Sollen wir dich in Zukunft über eingehende Nachrichten informieren, auch wenn dieser Tab nicht im Vordergrund ist?","Please_accept_":"Bitte klick auf den \"Zulassen\" Button oben.","Hide_offline":"Offline ausblenden","Show_offline":"Offline einblenden","About":"Über","dnd":"Beschäftigt","Mute":"Ton aus","Unmute":"Ton an","Subscription":"Bezug","both":"beidseitig","Status":"Status","online":"online","chat":"chat","away":"abwesend","xa":"länger abwesend","offline":"offline","none":"keine","Unknown_instance_tag":"Unbekannter instance tag.","Not_one_of_our_latest_keys":"Nicht einer unserer letzten Schlüssel.","Received_an_unreadable_encrypted_message":"Eine unlesbare verschlüsselte Nachricht erhalten.","Online":"Online","Chatty":"Gesprächig","Away":"Abwesend","Extended_away":"Länger abwesend","Offline":"Offline","Friendship_request":"Kontaktanfrage","Confirm":"Bestätigen","Dismiss":"Ablehnen","Remove":"Löschen","Online_help":"Online Hilfe","FN":"Name","N":" ","FAMILY":"Familienname","GIVEN":"Vorname","NICKNAME":"Spitzname","URL":"URL","ADR":"Adresse","STREET":"Straße","EXTADD":"Zusätzliche Adresse","LOCALITY":"Ortschaft","REGION":"Region","PCODE":"Postleitzahl","CTRY":"Land","TEL":"Telefon","NUMBER":"Nummer","EMAIL":"E-Mail","USERID":" ","ORG":"Organisation","ORGNAME":"Name","ORGUNIT":"Abteilung","TITLE":"Titel","ROLE":"Rolle","BDAY":"Geburtstag","DESC":"Beschreibung","PHOTO":" ","send_message":"Sende Nachricht","get_info":"Benutzerinformationen","Settings":"Einstellungen","Priority":"Priorität","Save":"Speichern","User_settings":"Benutzereinstellungen","A_fingerprint_":"Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.","Your_roster_is_empty_add_a":"Deine Kontaktliste ist leer, füge einen neuen Kontakt ","new_buddy":"hinzu","is":"ist","Login_options":"Anmeldeoptionen","BOSH_url":"BOSH url","Domain":"Domain","Resource":"Ressource","On_login":"Beim Anmelden","Received_an_unencrypted_message":"Unverschlüsselte Nachricht empfangen","Sorry_your_buddy_doesnt_provide_any_information":"Dein Kontakt stellt leider keine Informationen bereit.","Info_about":"Info über","Authentication_aborted":"Authentifizierung abgebrochen.","Authentication_request_received":"Authentifizierunganfrage empfangen.","Do_you_want_to_display_them":"Möchtest du sie sehen?","Log_in_without_chat":"Anmelden ohne Chat","has_come_online":"ist online gekommen","Unknown_sender":"Unbekannter Sender","You_received_a_message_from_an_unknown_sender":"Du hast eine Nachricht von einem unbekannten Sender erhalten","Please_allow_access_to_microphone_and_camera":"Bitte klick auf den \"Zulassen\" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.","Incoming_call":"Eingehender Anruf","from":"von","Do_you_want_to_accept_the_call_from":"Möchtest Du den Anruf annehmen von","Reject":"Ablehnen","Accept":"Annehmen","hang_up":"Auflegen","snapshot":"Schnappschuss","mute_my_audio":"Mein Ton aus","pause_my_video":"Mein Video pausieren","fullscreen":"Vollbild","Info":"Info","Local_IP":"Lokale IP","Remote_IP":"Remote IP","Local_Fingerprint":"Lokaler Fingerprint","Remote_Fingerprint":"Remote Fingerprint","Video_call_not_possible":"Videoanruf nicht verfügbar. Dein Gesprächspartner unterstützt keine Videotelefonie.","Start_video_call":"Starte Videoanruf"}},"el":{"translation":{"Logging_in":null,"your_connection_is_unencrypted":null,"your_connection_is_encrypted":null,"your_buddy_closed_the_private_connection":null,"start_private":null,"close_private":null,"your_buddy_is_verificated":null,"you_have_only_a_subscription_in_one_way":null,"authentication_query_sent":null,"your_message_wasnt_send_please_end_your_private_conversation":null,"unencrypted_message_received":null,"your_message_wasnt_send_because_you_have_no_valid_subscription":null,"not_available":null,"no_connection":null,"relogin":null,"trying_to_start_private_conversation":null,"Verified":null,"Unverified":null,"private_conversation_started":null,"private_conversation_aborted":null,"your_buddy_closed_the_private_conversation_you_should_do_the_same":null,"conversation_is_now_verified":null,"authentication_failed":null,"your_buddy_is_attempting_to_determine_":null,"to_authenticate_to_your_buddy":null,"enter_the_answer_and_click_answer":null,"enter_the_secret":null,"Creating_your_private_key_":null,"Authenticating_a_buddy_helps_":null,"How_do_you_want_to_authenticate_your_buddy":null,"Select_method":null,"Manual":null,"Question":null,"Secret":null,"To_verify_the_fingerprint_":null,"Your_fingerprint":null,"Buddy_fingerprint":null,"Close":null,"Compared":null,"To_authenticate_using_a_question_":null,"Ask":null,"To_authenticate_pick_a_secret_":null,"Compare":null,"Fingerprints":null,"Authentication":null,"Message":null,"Add_buddy":null,"rename_buddy":null,"delete_buddy":null,"Login":null,"Username":null,"Password":null,"Cancel":null,"Connect":null,"Type_in_the_full_username_":null,"Alias":null,"Add":null,"Subscription_request":null,"You_have_a_request_from":null,"Deny":null,"Approve":null,"Remove_buddy":null,"You_are_about_to_remove_":null,"Continue_without_chat":null,"Please_wait":null,"Login_failed":null,"Sorry_we_cant_authentikate_":null,"Retry":null,"clear_history":null,"New_message_from":null,"Should_we_notify_you_":null,"Please_accept_":null,"Hide_offline":null,"Show_offline":null,"About":null,"dnd":null,"Mute":null,"Unmute":null,"Subscription":null,"both":null,"Status":null,"online":null,"chat":null,"away":null,"xa":null,"offline":null,"none":null,"Unknown_instance_tag":null,"Not_one_of_our_latest_keys":null,"Received_an_unreadable_encrypted_message":null,"Online":null,"Chatty":null,"Away":null,"Extended_away":null,"Offline":null,"Friendship_request":null,"Confirm":null,"Dismiss":null,"Remove":null,"Online_help":null,"FN":null,"N":null,"FAMILY":null,"GIVEN":null,"NICKNAME":null,"URL":null,"ADR":null,"STREET":null,"EXTADD":null,"LOCALITY":null,"REGION":null,"PCODE":null,"CTRY":null,"TEL":null,"NUMBER":null,"EMAIL":null,"USERID":null,"ORG":null,"ORGNAME":null,"ORGUNIT":null,"TITLE":null,"ROLE":null,"BDAY":null,"DESC":null,"PHOTO":null,"send_message":null,"get_info":null,"Settings":null,"Priority":null,"Save":null,"User_settings":null,"A_fingerprint_":null,"Your_roster_is_empty_add_a":null,"new_buddy":null,"is":null,"Login_options":null,"BOSH_url":null,"Domain":null,"Resource":null,"On_login":null,"Received_an_unencrypted_message":null,"Sorry_your_buddy_doesnt_provide_any_information":null,"Info_about":null,"Authentication_aborted":null,"Authentication_request_received":null,"Do_you_want_to_display_them":null,"Log_in_without_chat":null,"has_come_online":null,"Unknown_sender":null,"You_received_a_message_from_an_unknown_sender":null,"Please_allow_access_to_microphone_and_camera":null,"Incoming_call":null,"from":null,"Do_you_want_to_accept_the_call_from":null,"Reject":null,"Accept":null,"hang_up":null,"snapshot":null,"mute_my_audio":null,"pause_my_video":null,"fullscreen":null,"Info":null,"Local_IP":null,"Remote_IP":null,"Local_Fingerprint":null,"Remote_Fingerprint":null,"Video_call_not_possible":null,"Start_video_call":null}},"en":{"translation":{"Logging_in":"Logging in…","your_connection_is_unencrypted":"Your connection is unencrypted.","your_connection_is_encrypted":"Your connection is encrypted.","your_buddy_closed_the_private_connection":"Your buddy closed the private connection.","start_private":"Start private","close_private":"Close private","your_buddy_is_verificated":"Your buddy is verified.","you_have_only_a_subscription_in_one_way":"You only have a one-way subscription.","authentication_query_sent":"Authentication query sent.","your_message_wasnt_send_please_end_your_private_conversation":"Your message was not sent. Please end your private conversation.","unencrypted_message_received":"Unencrypted message received","your_message_wasnt_send_because_you_have_no_valid_subscription":"Your message was not sent because you have no valid subscription.","not_available":"Not available","no_connection":"No connection!","relogin":"relogin","trying_to_start_private_conversation":"Trying to start private conversation!","Verified":"Verified","Unverified":"Unverified","private_conversation_started":"Private conversation started.","private_conversation_aborted":"Private conversation aborted!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Your buddy closed the private conversation! You should do the same.","conversation_is_now_verified":"Conversation is now verified.","authentication_failed":"Authentication failed.","your_buddy_is_attempting_to_determine_":"You buddy is attempting to determine if he or she is really talking to you.","to_authenticate_to_your_buddy":"To authenticate to your buddy, ","enter_the_answer_and_click_answer":"enter the answer and click Answer.","enter_the_secret":"enter the secret.","Creating_your_private_key_":"Creating your private key; this may take a while.","Authenticating_a_buddy_helps_":"Authenticating a buddy helps ensure that the person you are talking to is really the one he or she claims to be.","How_do_you_want_to_authenticate_your_buddy":"How do you want to authenticate {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Select method...","Manual":"Manual","Question":"Question","Secret":"Secret","To_verify_the_fingerprint_":"To verify the fingerprint, contact your buddy via some other trustworthy channel, such as the telephone.","Your_fingerprint":"Your fingerprint","Buddy_fingerprint":"Buddy fingerprint","Close":"Close","Compared":"Compared","To_authenticate_using_a_question_":"To authenticate using a question, pick a question whose answer is known only you and your buddy.","Ask":"Ask","To_authenticate_pick_a_secret_":"To authenticate, pick a secret known only to you and your buddy.","Compare":"Compare","Fingerprints":"Fingerprints","Authentication":"Authentication","Message":"Message","Add_buddy":"Add buddy","rename_buddy":"rename buddy","delete_buddy":"delete buddy","Login":"Login","Username":"Username","Password":"Password","Cancel":"Cancel","Connect":"Connect","Type_in_the_full_username_":"Type in the full username and an optional alias.","Alias":"Alias","Add":"Add","Subscription_request":"Subscription request","You_have_a_request_from":"You have a request from","Deny":"Deny","Approve":"Approve","Remove_buddy":"Remove buddy","You_are_about_to_remove_":"You are about to remove {{bid_name}} (<b>{{bid_jid}}</b>) from your buddy list. All related chats will be closed.","Continue_without_chat":"Continue without chat","Please_wait":"Please wait","Login_failed":"Chat login failed","Sorry_we_cant_authentikate_":"Authentication failed with the chat server. Maybe the password is wrong?","Retry":"Back","clear_history":"Clear history","New_message_from":"New message from","Should_we_notify_you_":"Should we notify you about new messages in the future?","Please_accept_":"Please click the \"Allow\" button at the top.","Hide_offline":"Hide offline contacts","Show_offline":"Show offline contacts","About":"About","dnd":"Do Not Disturb","Mute":"Mute","Unmute":"Unmute","Subscription":"Subscription","both":"both","Status":"Status","online":"online","chat":"chat","away":"away","xa":"extended away","offline":"offline","none":"none","Unknown_instance_tag":"Unknown instance tag.","Not_one_of_our_latest_keys":"Not one of our latest keys.","Received_an_unreadable_encrypted_message":"Received an unreadable encrypted message.","Online":"Online","Chatty":"Chatty","Away":"Away","Extended_away":"Extended away","Offline":"Offline","Friendship_request":"Friendship request","Confirm":"Confirm","Dismiss":"Dismiss","Remove":"Remove","Online_help":"Online help","FN":"Full name","N":" ","FAMILY":"Family name","GIVEN":"Given name","NICKNAME":"Nickname","URL":"URL","ADR":"Address","STREET":"Street Address","EXTADD":"Extended Address","LOCALITY":"Locality","REGION":"Region","PCODE":"Postal Code","CTRY":"Country","TEL":"Telephone","NUMBER":"Number","EMAIL":"Email","USERID":" ","ORG":"Organization","ORGNAME":"Name","ORGUNIT":"Unit","TITLE":"Job title","ROLE":"Role","BDAY":"Birthday","DESC":"Description","PHOTO":" ","send_message":"Send message","get_info":"Show information","Settings":"Settings","Priority":"Priority","Save":"Save","User_settings":"User settings","A_fingerprint_":"A fingerprint is used to make sure that the person you are talking to is who he or she is saying.","Your_roster_is_empty_add_a":"Your roster is empty, add a ","new_buddy":"new buddy","is":"is","Login_options":"Login options","BOSH_url":"BOSH URL","Domain":"Domain","Resource":"Resource","On_login":"On login","Received_an_unencrypted_message":"Received an unencrypted message","Sorry_your_buddy_doesnt_provide_any_information":"Sorry, your buddy does not provide any information.","Info_about":"Info about","Authentication_aborted":"Authentication aborted.","Authentication_request_received":"Authentication request received.","Do_you_want_to_display_them":"Do you want to display them?","Log_in_without_chat":"Log in without chat","has_come_online":"has come online","Unknown_sender":"Unknown sender","You_received_a_message_from_an_unknown_sender":"You received a message from an unknown sender","Please_allow_access_to_microphone_and_camera":"Please click the \"Allow\" button at the top, to allow access to microphone and camera.","Incoming_call":"Incoming call","from":"from","Do_you_want_to_accept_the_call_from":"Do you want to accept the call from","Reject":"Reject","Accept":"Accept","hang_up":"hang up","snapshot":"snapshot","mute_my_audio":"mute my audio","pause_my_video":"pause my video","fullscreen":"fullscreen","Info":"Info","Local_IP":"Local IP","Remote_IP":"Remote IP","Local_Fingerprint":"Local fingerprint","Remote_Fingerprint":"Remote fingerprint","Video_call_not_possible":"Video call not possible. Your buddy does not support video calls.","Start_video_call":"Start video call","Join_chat":"Join chat","Join":"Join","Room":"Room","Nickname":"Nickname","left_the_building":"__nickname__ left the building","entered_the_room":"__nickname__ entered the room","is_now_known_as":"__oldNickname__ is now known as __newNickname__","This_room_is":"This room is","muc_hidden":{"keyword":"hidden","description":"can not be found through search"},"muc_membersonly":{"keyword":"members-only","description":"you need to be on the member list"},"muc_moderated":{"keyword":"moderated","description":"only persons with \"voice\" are allowed to send messages"},"muc_nonanonymous":{"keyword":"non-anonymous","description":"your jabber id is exposed to all other occupants"},"muc_open":{"keyword":"open","description":"everyone is allowed to join"},"muc_passwordprotected":{"keyword":"password-protected","description":"you need to provide the correct password"},"muc_persistent":{"keyword":"persistent","description":"will not be destroyed if the last occupant left"},"muc_public":{"keyword":"public","description":"can be found through search"},"muc_semianonymous":{"keyword":"semi-anonymous","description":"your jabber id is only exposed to room admins"},"muc_temporary":{"keyword":"temporary","description":"will be destroyed if the last occupant left"},"muc_unmoderated":{"keyword":"unmoderated","description":"everyone is allowed to send messages"},"muc_unsecured":{"keyword":"unsecured","description":"you need no password to enter"},"Continue":"Continue","Server":"Server","Rooms_are_loaded":"Rooms are loaded","Could_load_only":"Could load only __count__ rooms for autocomplete","muc_explanation":"Please enter room name and optional a nickname and password to join a chat","You_already_joined_this_room":"You already joined this room","This_room_will_be_closed":"This room will be closed","Room_not_found_":"A new room will be created","Loading_room_information":"Loading room information","Destroy":"Destroy","Leave":"Leave","changed_subject_to":"__nickname__ changed the room subject to \"__subject__\"","muc_removed_kicked":"You have been kicked from the room","muc_removed_info_kicked":"__nickname__ has been kicked from the room","muc_removed_banned":"You have been banned from the room","muc_removed_info_banned":"__nickname__ has been banned from the room","muc_removed_affiliation":"You have been removed from the room, because of an affiliation change","muc_removed_info_affiliation":"__nickname__ has been removed from the room, because of an affiliation change","muc_removed_membersonly":"You have been removed from the room, because the room has been changed to members-only and you are no member","muc_removed_info_membersonly":"__nickname__ has been removed from the room, because the room has been changed to members-only and you are no member","muc_removed_shutdown":"You have been removed from the room, because the MUC service is being shut down","Reason":"Reason","message_not_send":"Your message was not send because of an error","message_not_send_item-not-found":"Your message was not send because this room does not exist","message_not_send_forbidden":"Your message was not send because you have no voice in this room","message_not_send_not-acceptable":"Your message was not send because you are no occupant of this room","This_room_has_been_closed":"This room has been closed","Room_logging_is_enabled":"Room logging is enabled","A_password_is_required":"A password is required","You_are_not_on_the_member_list":"You are not on the member list","You_are_banned_from_this_room":"You are banned from this room","Your_desired_nickname_":"Your desired nickname is already in use. Please choose another","The_maximum_number_":"The maximum number of user is reached in this room","This_room_is_locked_":"This room is locked","You_are_not_allowed_to_create_":"You are not allowed to create a room"}},"es":{"translation":{"Logging_in":"Por favor, espere...","your_connection_is_unencrypted":"Su conexión no está cifrada.","your_connection_is_encrypted":"Su conexión está cifrada.","your_buddy_closed_the_private_connection":"Su amigo ha cerrado la conexión privada.","start_private":"Iniciar privado","close_private":"Cerrar privado","your_buddy_is_verificated":"Tu amigo está verificado.","you_have_only_a_subscription_in_one_way":"Sólo tienes una suscripción de un modo.","authentication_query_sent":"Consulta de verificación enviada.","your_message_wasnt_send_please_end_your_private_conversation":"Su mensaje no fue enviado. Por favor, termine su conversación privada.","unencrypted_message_received":"Mensaje no cifrado recibido:","your_message_wasnt_send_because_you_have_no_valid_subscription":"Su mensaje no se ha enviado, porque usted no tiene suscripción válida.","not_available":"No disponible","no_connection":"Sin conexión!","relogin":"iniciar sesión nuevamente","trying_to_start_private_conversation":"Intentando iniciar una conversación privada!","Verified":"Verificado","Unverified":"No verificado","private_conversation_started":"se inició una conversación privada.","private_conversation_aborted":"Conversación privada abortada!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Su amigo cerró la conversación privada! Usted debería hacer lo mismo.","conversation_is_now_verified":"La conversación es ahora verificada.","authentication_failed":"Fallo la verificación.","your_buddy_is_attempting_to_determine_":"Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.","to_authenticate_to_your_buddy":"Para autenticar a su amigo, ","enter_the_answer_and_click_answer":"introduce la respuesta y haga clic en Contestar.","enter_the_secret":"especifique el secreto.","Creating_your_private_key_":"Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.","Authenticating_a_buddy_helps_":"Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.","How_do_you_want_to_authenticate_your_buddy":"¿Cómo desea autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Escoja un método...","Manual":"Manual","Question":"Pregunta","Secret":"Secreto","To_verify_the_fingerprint_":"Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.","Your_fingerprint":"Tu firma digital","Buddy_fingerprint":"firma digital de tu amigo","Close":"Cerrar","Compared":"Comparado","To_authenticate_using_a_question_":"Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.","Ask":"Preguntar","To_authenticate_pick_a_secret_":"Para autenticar, elija un secreto conocido sólo por usted y su amigo.","Compare":"Comparar","Fingerprints":"Firmas digitales","Authentication":"Autenticación","Message":"Mensaje","Add_buddy":"Añadir amigo","rename_buddy":"renombrar amigo","delete_buddy":"eliminar amigo","Login":"Iniciar Sesión","Username":"Usuario","Password":"Contraseña","Cancel":"Cancelar","Connect":"Conectar","Type_in_the_full_username_":"Escriba el usuario completo y un alias opcional.","Alias":"Alias","Add":"Añadir","Subscription_request":"Solicitud de suscripción","You_have_a_request_from":"Tienes una petición de","Deny":"Rechazar","Approve":"Aprobar","Remove_buddy":"Eliminar amigo","You_are_about_to_remove_":"Vas a eliminar a {{bid_name}} (<b>{{bid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.","Continue_without_chat":"Continuar","Please_wait":"Espere por favor","Login_failed":"Fallo el inicio de sesión","Sorry_we_cant_authentikate_":"Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?","Retry":"Reintentar","clear_history":"Borrar el historial","New_message_from":"Nuevo mensaje de","Should_we_notify_you_":"¿Debemos notificarle sobre nuevos mensajes en el futuro?","Please_accept_":"Por favor, haga clic en el botón \"Permitir\" en la parte superior.","Hide_offline":"Ocultar contactos desconectados","Show_offline":"Mostrar contactos desconectados","About":"Acerca de","dnd":"No Molestar","Mute":"Desactivar sonido","Unmute":"Activar sonido","Subscription":"Suscripción","both":"ambos","Status":"Estado","online":"en línea","chat":"chat","away":"ausente","xa":"mas ausente","offline":"desconectado","none":"nadie","Unknown_instance_tag":"Etiqueta de instancia desconocida.","Not_one_of_our_latest_keys":"No de nuestra ultima tecla.","Received_an_unreadable_encrypted_message":"Se recibió un mensaje cifrado ilegible.","Online":"En linea","Chatty":"Hablador","Away":"Ausente","Extended_away":"Mas ausente","Offline":"Desconectado","Friendship_request":"Solicitud de amistad","Confirm":"Confirmar","Dismiss":"Rechazar","Remove":"Eliminar","Online_help":"Ayuda en línea","FN":"Nombre completo ","N":" ","FAMILY":"Apellido","GIVEN":"Nombre","NICKNAME":"Apodar","URL":"URL","ADR":"Dirección","STREET":"Calle","EXTADD":"Extendido dirección","LOCALITY":"Población","REGION":"Región","PCODE":"Código postal","CTRY":"País","TEL":"Teléfono","NUMBER":"Número","EMAIL":"Emilio","USERID":" ","ORG":"Organización","ORGNAME":"Nombre","ORGUNIT":"Departamento","TITLE":"Título","ROLE":"Rol","BDAY":"Cumpleaños","DESC":"Descripción","PHOTO":" ","send_message":"mandar un texto","get_info":"obtener información","Settings":"Ajustes","Priority":"Prioridad","Save":"Guardar","User_settings":"Configuración de usuario","A_fingerprint_":"La huella digital se utiliza para que puedas estar seguro que la persona con la que estas hablando es quien realmente dice ser","Your_roster_is_empty_add_a":"Tu lista de amigos esta vacia","new_buddy":"Nuevo amigo","is":"es","Login_options":"Opciones de login","BOSH_url":"BOSH url","Domain":"Dominio","Resource":"Recurso","On_login":"Iniciar sesión","Received_an_unencrypted_message":"Recibe un mensaje no cifrado","Sorry_your_buddy_doesnt_provide_any_information":"Lo sentimos, su amigo no provee ninguna información.","Info_about":"Info acerca de","Authentication_aborted":"Autenticación abortada","Authentication_request_received":"Pedido de autenticación recibido.","Do_you_want_to_display_them":"¿Quiere mostrarlos?","Log_in_without_chat":"Ingresar sin chat","has_come_online":"se ha conectado","Unknown_sender":"Remitente desconocido","You_received_a_message_from_an_unknown_sender":"Ha recibido un mensaje de un remitente desconocido","Please_allow_access_to_microphone_and_camera":"Por favor, permitir el acceso al micrófono y la cámara.","Incoming_call":"Llamada entrante","from":"de","Do_you_want_to_accept_the_call_from":"Desea aceptar la llamada de","Reject":"Rechazar","Accept":"Aceptar","hang_up":"colgar","snapshot":"instantánea","mute_my_audio":"silenciar mi audio","pause_my_video":"pausar mi vídeo","fullscreen":"pantalla completa","Info":"Info","Local_IP":"IP local","Remote_IP":"IP remota","Local_Fingerprint":"Firma digital local","Remote_Fingerprint":"Firma digital remota","Video_call_not_possible":"Llamada de vídeo no es posible","Start_video_call":"Iniciar llamada de vídeo"}},"fr":{"translation":{"Logging_in":"Connexion...","your_connection_is_unencrypted":"Connexion non chiffrée.","your_connection_is_encrypted":"Connexion chiffrée.","your_buddy_closed_the_private_connection":"Votre ami a fermé la connexion privée.","start_private":"Démarrer une conversation privé","close_private":"Clôturer une conversation privée","your_buddy_is_verificated":"Votre ami est vérifié.","you_have_only_a_subscription_in_one_way":"Vous ne pouvez souscrire qu'une fois.","authentication_query_sent":"Requête d’authentification envoyée.","your_message_wasnt_send_please_end_your_private_conversation":"Votre message n'a pas été envoyé. Veuillez terminer votre conversation privée.","unencrypted_message_received":"Message non chiffré reçu","your_message_wasnt_send_because_you_have_no_valid_subscription":"Votre message n'a pas été envoyé car votre abonnement n'est pas valide.","not_available":"Pas disponible","no_connection":"Pas de connexion !","relogin":"Re-connexion","trying_to_start_private_conversation":"Essai de démarrage d'une conversation privée !","Verified":"Vérifié","Unverified":"Non vérifié","private_conversation_started":"Conversation privé démarrée.","private_conversation_aborted":"Conversation privée interrompue !","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Votre ami a fermé la conversation privée ! Vous devriez faire de même.","conversation_is_now_verified":"La conversation est maintenant vérifiée.","authentication_failed":"L'authentification a échoué.","your_buddy_is_attempting_to_determine_":"Votre ami tente de déterminer si il ou elle parle vraiment à vous.","to_authenticate_to_your_buddy":"Vous authentifier à votre ami, ","enter_the_answer_and_click_answer":"Saisissez une réponse et cliquer sur Répondre.","enter_the_secret":"Entrez le mot secret","Creating_your_private_key_":"Création de votre clé privée; cela peut prendre un moment.","Authenticating_a_buddy_helps_":"L'authentification d'un ami permet de s'assurer que la personne à qui vous parlez est vraiment celui qu'il ou elle prétend être.","How_do_you_want_to_authenticate_your_buddy":"Comment voulez-vous vous authentifier {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Sélection de la méthode...","Manual":"Manuel","Question":"Question","Secret":"Sécurité","To_verify_the_fingerprint_":"Pour vérifier l'empreinte, contactez votre ami via un autre canal digne de confiance, tel que le téléphone.","Your_fingerprint":"Votre empreinte","Buddy_fingerprint":"Empreinte de l'ami","Close":"Fermer","Compared":"Comparé","To_authenticate_using_a_question_":"Pour s'authentifier à l'aide d'une question, choisissez une question dont la réponse n'est connue que vous et de votre ami.","Ask":"Demander","To_authenticate_pick_a_secret_":"Pour vous authentifier, choisissez un secret connu seulement de vous et de votre ami.","Compare":"Comparer","Fingerprints":"Empreintes","Authentication":"Authentification","Message":"Message","Add_buddy":"Ajouter comme ami","rename_buddy":"Renommer l'ami","delete_buddy":"Supprimer l'ami","Login":"Connexion","Username":"Nom d'utilisateur","Password":"Mot de passe","Cancel":"Annuler","Connect":"Connecter","Type_in_the_full_username_":"Tapez un nom d'utilisateur complet et un alias(optionnel).","Alias":"Alias","Add":"Ajouter","Subscription_request":"Demande d'abonnement","You_have_a_request_from":"Vous avez une requête de ","Deny":"Refuser","Approve":"Approuver","Remove_buddy":"Supprimer l'ami","You_are_about_to_remove_":"Vous allez retirer {{bid_name}} (<b>{{bid_jid}}</b>) de votre liste d'amis. Toutes les fenêtres de chat en lien avec celui-ci seront fermées.","Continue_without_chat":"Continuer sans tchat","Please_wait":"Merci de patienter","Login_failed":"Authentification échouée","Sorry_we_cant_authentikate_":"La connexion avec le serveur de tchat a échoué. Vérifiez le mot de passe.","Retry":"Retour","clear_history":"Effacer l’historique","New_message_from":"Nouveau message de","Should_we_notify_you_":"Dans le futur, devrons-nous vous notifier les nouveaux messages ?","Please_accept_":"Merci de cliquer sur le bouton \"autoriser\" en haut de page","Hide_offline":"Masquer les contacts non connectés","Show_offline":"Afficher les contacts non connectés","About":"À propos","dnd":"Ne pas déranger","Mute":"Muet","Unmute":"Son actif","Subscription":"Abonnement","both":"Les deux","Status":"Status","online":"En ligne","chat":"tchat","away":"Absent","xa":"Options étendues","offline":"Hors ligne","none":"Aucun","Unknown_instance_tag":"Tag inconnu","Not_one_of_our_latest_keys":"Ce n'est pas l'une des dernières touches","Received_an_unreadable_encrypted_message":"Message chiffré non lisible","Online":"En ligne","Chatty":"tchatty","Away":"Absent","Extended_away":"Options étendues","Offline":"Hors ligne","Friendship_request":"Demande d'amitié","Confirm":"Valider","Dismiss":"Rejeter","Remove":"Supprimer","Online_help":"Aide en ligne","FN":"Nom","N":" N ","FAMILY":"Nom de famille","GIVEN":"prénom","NICKNAME":"Surnom","URL":"URL","ADR":"Adresse","STREET":"Rue","EXTADD":"Adresse (suite)","LOCALITY":"Localité","REGION":"Région","PCODE":"Code Postal","CTRY":"Pays","TEL":"Téléphone","NUMBER":"Numéro","EMAIL":"Courriel","USERID":" USERID ","ORG":"Organisation","ORGNAME":"Nom","ORGUNIT":"Unité","TITLE":"Qualité:","ROLE":"Rôle","BDAY":"Date de naissance","DESC":"Description","PHOTO":"Photo","send_message":"Envoyer le message","get_info":"Montrer les informations","Settings":"Réglages","Priority":"Priorité","Save":"Enregistrer","User_settings":"Paramètres utilisateur","A_fingerprint_":"Une empreinte est utilisée pour s'assurer de l'identité de la personne à qui vous parlez","Your_roster_is_empty_add_a":"Votre liste est vide, ajouter ","new_buddy":"Nouvel ami","is":"est","Login_options":"Options d'identification","BOSH_url":"URL BOSH","Domain":"Domaine","Resource":"Ressource","On_login":"Après authentification","Received_an_unencrypted_message":"Reçu un message non chiffré","Sorry_your_buddy_doesnt_provide_any_information":"Désolé, votre ami n'a pas fourni d'informations","Info_about":"A propos de","Authentication_aborted":"Authentification interrompue.","Authentication_request_received":"Requête d'authentification reçue.","Do_you_want_to_display_them":"Voulez-vous les afficher ?","Log_in_without_chat":"S'identifier sans tchat","has_come_online":"vient d'arriver","Unknown_sender":"Expéditeur inconnu","You_received_a_message_from_an_unknown_sender":"Vous avez reçu un message d'un expéditeur inconnu","Please_allow_access_to_microphone_and_camera":"Veuillez cliquez sur le bouton \"Autoriser\" en haut, pour permettre l'accès au micro et à la caméra.","Incoming_call":"Appel entrant","from":"de","Do_you_want_to_accept_the_call_from":"Voulez-vous accepter l'appel de","Reject":"Rejeté","Accept":"Accepté","hang_up":"Décrochez","snapshot":"Capture d’écran","mute_my_audio":"Couper l'audio","pause_my_video":"Mettre ma vidéo en pause","fullscreen":"Plein écran","Info":"Info","Local_IP":"IP locale","Remote_IP":"IP distante","Local_Fingerprint":"Empreinte locale","Remote_Fingerprint":"Empreinte distante","Video_call_not_possible":"L'appel vidéo n'est possible. Votre ami ne supporte pas les appels vidéo.","Start_video_call":"Démarrer l'appel vidéo"}},"it":{"translation":{"Logging_in":"login…","your_connection_is_unencrypted":"La sua connessione è non cifrata.","your_connection_is_encrypted":"La sua connessione è cifrata.","your_buddy_closed_the_private_connection":"La sua connessione privata è stato chiuso dal suo compagno.","start_private":"Inizia privata","close_private":"Chiude privata","your_buddy_is_verificated":"Il tuo compagno è stato verificato","you_have_only_a_subscription_in_one_way":"Hai solo una one-way inscrizione.","authentication_query_sent":"Domanda d'autenticità inviata.","your_message_wasnt_send_please_end_your_private_conversation":"Il tuo messaggio non è stato inviato. Si prega di finire la sua conversazione privata.","unencrypted_message_received":"Messaggio non cifrato ricevuto","your_message_wasnt_send_because_you_have_no_valid_subscription":"Il tuo messaggio non è stato inviato perché non hai una sottoscrizione valida.","not_available":"non disponibile","no_connection":"nessun collegamento!","relogin":"nuovo login","trying_to_start_private_conversation":"Cercando di avviare una conversazione privata!","Verified":"verificato","Unverified":"non verificato","private_conversation_started":"Conversazione privata iniziato.","private_conversation_aborted":"Conversazione privata abortito!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Il tuo compagno ha chiuso la conversazione privata! Si dovrebbe fare lo stesso.","conversation_is_now_verified":"Conversazione è ora verificato.","authentication_failed":"autenticazione fallita.","your_buddy_is_attempting_to_determine_":"Il tuo compagno sta cercando di determinare se lui o lei sta davvero parlando con te.","to_authenticate_to_your_buddy":"Per autenticare a il tuo compagno. ","enter_the_answer_and_click_answer":"inserisci la risposta e fare click su risposta.","enter_the_secret":"inserire il segreto.","Creating_your_private_key_":"Creare la propria chiave privata; questo potrebbe richiedere un po'.","Authenticating_a_buddy_helps_":"Autenticazione un compagno aiuta a garantire che la persona si sta parlando è davvero quello che lui o lei sostiene di essere.","How_do_you_want_to_authenticate_your_buddy":"Come si desidera autenticare {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Seleziona metodo ..","Manual":"manuale","Question":"domanda","Secret":"segreto","To_verify_the_fingerprint_":"Per verificare l'impronta digitale, contattare il proprio compagno attraverso qualche altro canale affidabile, come il telefono.","Your_fingerprint":"il tuo impronta digitale","Buddy_fingerprint":"impronta digitale da compagno","Close":"chiude","Compared":"comparato","To_authenticate_using_a_question_":"Per autenticare tramite una questione, scegli una questione la cui risposta è nota solo voi e il tuo compagno","Ask":"chiedi","To_authenticate_pick_a_secret_":"Per autenticare, scegli un segreto noto solo a te e il tuo compagno.","Compare":"Comparare","Fingerprints":"Impronta digitale","Authentication":"Autenticazione","Message":"Messagio","Add_buddy":"Aggiungi un compagno","rename_buddy":"rinomina compagno","delete_buddy":"elimina compagno","Login":"Login","Username":"Identificazione dell'utente","Password":"Password","Cancel":"Cancella","Connect":"Collega","Type_in_the_full_username_":"Digita l'identificazione utente completo e un alias opzionale.","Alias":"Alias","Add":"Aggiungi","Subscription_request":"Rrichiesta di sottoscrizione","You_have_a_request_from":"Hai una richiesta da","Deny":"Refiuta","Approve":"Approva","Remove_buddy":"Rimuova il compagno","You_are_about_to_remove_":"Stai rimovendo {{bid_name}} (<b>{{bid_jid}}</b>) del suo lista di compagni. Tutte le chat appartenente saranno chiuse.","Continue_without_chat":"Continua senza chat","Please_wait":"Si prega d'attendere","Login_failed":"Chat login è fallito","Sorry_we_cant_authentikate_":"Autenticazione non riuscita con il server di chat. Forse la password è sbagliata?","Retry":"Indietro","clear_history":"Cancella la cronologia","New_message_from":"Nuovo messaggio da","Should_we_notify_you_":"Vuoi ricevere una notifica di nuovi messaggi in futuro?","Please_accept_":"Si prega di fare clic sul bottone \"Autorizzazione\" sopra.","Hide_offline":"Nascondere i contatti non in linea","Show_offline":"Mostra i contatti non in linea","About":"Informazione legale","dnd":"Non disturbare","Mute":"Muto attivo","Unmute":"Muto inattivo","Subscription":"Sottoscrizione","both":"etrambi","Status":"Status","online":"In linea","chat":"chat","away":"via","xa":"via estensivo","offline":"non in linea","none":"nessuno","Unknown_instance_tag":"Instance tag sconosciuta.","Not_one_of_our_latest_keys":"Non è una delle nostre ultime chiavi.","Received_an_unreadable_encrypted_message":"Ricevuto un messaggio crittografato illeggibile.","Online":"In linea","Chatty":"Chiacchierino","Away":"Via","Extended_away":"Via estensivo","Offline":"Non in linea","Friendship_request":"Amicizia richiesto","Confirm":"Conferma","Dismiss":"Rifiuta","Remove":"Rimuovi","Online_help":"Guida in linea","FN":"Nome e cognome","N":null,"FAMILY":"Cognome","GIVEN":"Nome","NICKNAME":"Soprannome","URL":"URL","ADR":"Indirizzo","STREET":"Via","EXTADD":"Esteso Indirizzo","LOCALITY":"Località","REGION":"Regione","PCODE":"Codice Postale","CTRY":"Paese","TEL":"Telefono","NUMBER":"Numero","EMAIL":"E-mail","USERID":null,"ORG":"Organizzazione","ORGNAME":"Nome","ORGUNIT":"Unità","TITLE":"Titolo di lavoro","ROLE":"Funzione","BDAY":"Compleanno","DESC":"Descrizione","PHOTO":null,"send_message":"Messagio inviato","get_info":"Mostra informazioni","Settings":"Impostazione","Priority":"Priorità","Save":"Salva","User_settings":"Impostazione dell'utente","A_fingerprint_":"Una impronta digitale è usato per assicurarsi che la persona con cui stai parlando è lui o lei che sta dicendo.","Your_roster_is_empty_add_a":"Il suo elenco è vuoto, aggiungi un ","new_buddy":"compagno nuovo","is":"è","Login_options":"Opzioni di login","BOSH_url":"BOSH URL","Domain":"Domain","Resource":"Risorsa","On_login":"Login on","Received_an_unencrypted_message":"Ricevuto un messaggio non crittografato","Sorry_your_buddy_doesnt_provide_any_information":"Spiace, il tuo compagno non fornisce alcuna informazione.","Info_about":"Informazioni","Authentication_aborted":"Autenticazione interrotta","Authentication_request_received":"Richiesta di autenticazione ricevuto.","Do_you_want_to_display_them":"Vuoi che venga visualizzato?","Log_in_without_chat":"Log in senza chat","has_come_online":"È venuto in linea","Unknown_sender":"Mittente sconosciuto","You_received_a_message_from_an_unknown_sender":"Hai ricevuto un messaggio da un mittente sconosciuto","Please_allow_access_to_microphone_and_camera":"Si prega di fare clic sul bottone \"Autorizzazione\" sopra per autorizzazione del l'accesso al microfono e fotocamera.","Incoming_call":"Chiamata in arrivo","from":"di","Do_you_want_to_accept_the_call_from":"Vuoi accettare la chiamata di","Reject":"Rifiuta","Accept":"Accetta","hang_up":"Riattacca","snapshot":"istantanea","mute_my_audio":"disattiva il mio audio","pause_my_video":"pausa il mio audio","fullscreen":"schermo intero","Info":"Informazione","Local_IP":"IP locale","Remote_IP":"IP remoto","Local_Fingerprint":"Impronta digitale locale","Remote_Fingerprint":"Impronta digitale remoto","Video_call_not_possible":"Videochiamata non è possibile. Il tuo compagno non può effettuare videochiamate.","Start_video_call":"Inizia videochiamata"}},"nds":{"translation":{"Logging_in":null,"your_connection_is_unencrypted":null,"your_connection_is_encrypted":null,"your_buddy_closed_the_private_connection":null,"start_private":null,"close_private":null,"your_buddy_is_verificated":null,"you_have_only_a_subscription_in_one_way":null,"authentication_query_sent":null,"your_message_wasnt_send_please_end_your_private_conversation":null,"unencrypted_message_received":null,"your_message_wasnt_send_because_you_have_no_valid_subscription":null,"not_available":null,"no_connection":null,"relogin":null,"trying_to_start_private_conversation":null,"Verified":null,"Unverified":null,"private_conversation_started":null,"private_conversation_aborted":null,"your_buddy_closed_the_private_conversation_you_should_do_the_same":null,"conversation_is_now_verified":null,"authentication_failed":null,"your_buddy_is_attempting_to_determine_":null,"to_authenticate_to_your_buddy":null,"enter_the_answer_and_click_answer":null,"enter_the_secret":null,"Creating_your_private_key_":null,"Authenticating_a_buddy_helps_":null,"How_do_you_want_to_authenticate_your_buddy":null,"Select_method":null,"Manual":null,"Question":null,"Secret":null,"To_verify_the_fingerprint_":null,"Your_fingerprint":null,"Buddy_fingerprint":null,"Close":null,"Compared":null,"To_authenticate_using_a_question_":null,"Ask":null,"To_authenticate_pick_a_secret_":null,"Compare":null,"Fingerprints":null,"Authentication":null,"Message":null,"Add_buddy":null,"rename_buddy":null,"delete_buddy":null,"Login":null,"Username":null,"Password":null,"Cancel":null,"Connect":null,"Type_in_the_full_username_":null,"Alias":null,"Add":null,"Subscription_request":null,"You_have_a_request_from":null,"Deny":null,"Approve":null,"Remove_buddy":null,"You_are_about_to_remove_":null,"Continue_without_chat":null,"Please_wait":null,"Login_failed":null,"Sorry_we_cant_authentikate_":null,"Retry":null,"clear_history":null,"New_message_from":null,"Should_we_notify_you_":null,"Please_accept_":null,"Hide_offline":null,"Show_offline":null,"About":null,"dnd":null,"Mute":null,"Unmute":null,"Subscription":null,"both":null,"Status":null,"online":null,"chat":null,"away":null,"xa":null,"offline":null,"none":null,"Unknown_instance_tag":null,"Not_one_of_our_latest_keys":null,"Received_an_unreadable_encrypted_message":null,"Online":null,"Chatty":null,"Away":null,"Extended_away":null,"Offline":null,"Friendship_request":null,"Confirm":null,"Dismiss":null,"Remove":null,"Online_help":null,"FN":null,"N":null,"FAMILY":null,"GIVEN":null,"NICKNAME":null,"URL":null,"ADR":null,"STREET":null,"EXTADD":null,"LOCALITY":null,"REGION":null,"PCODE":null,"CTRY":null,"TEL":null,"NUMBER":null,"EMAIL":null,"USERID":null,"ORG":null,"ORGNAME":null,"ORGUNIT":null,"TITLE":null,"ROLE":null,"BDAY":null,"DESC":null,"PHOTO":null,"send_message":null,"get_info":null,"Settings":null,"Priority":null,"Save":null,"User_settings":null,"A_fingerprint_":null,"Your_roster_is_empty_add_a":null,"new_buddy":null,"is":null,"Login_options":null,"BOSH_url":null,"Domain":null,"Resource":null,"On_login":null,"Received_an_unencrypted_message":null,"Sorry_your_buddy_doesnt_provide_any_information":null,"Info_about":null,"Authentication_aborted":null,"Authentication_request_received":null,"Do_you_want_to_display_them":null,"Log_in_without_chat":null,"has_come_online":null,"Unknown_sender":null,"You_received_a_message_from_an_unknown_sender":null,"Please_allow_access_to_microphone_and_camera":null,"Incoming_call":null,"from":null,"Do_you_want_to_accept_the_call_from":null,"Reject":null,"Accept":null,"hang_up":null,"snapshot":null,"mute_my_audio":null,"pause_my_video":null,"fullscreen":null,"Info":null,"Local_IP":null,"Remote_IP":null,"Local_Fingerprint":null,"Remote_Fingerprint":null,"Video_call_not_possible":null,"Start_video_call":null}},"pl":{"translation":{"Logging_in":"Logowanie...","your_connection_is_unencrypted":"Twoje połączenie nie jest szyfrowane.","your_connection_is_encrypted":"Twoje połączenie jest szyfrowane.","your_buddy_closed_the_private_connection":"Twój rozmówca zamknął połączenie.","start_private":"Rozpocznij rozmowę.","close_private":"Zakończ rozmowę.","your_buddy_is_verificated":"Twój rozmówca został zweryfikowany.","you_have_only_a_subscription_in_one_way":"Masz jednostronną subskrypcję.","authentication_query_sent":"Wysłano proźbę o autentykację.","your_message_wasnt_send_please_end_your_private_conversation":"Twoja wiadomość nie została wysłana. Proszę, zamknij rozmowę.","unencrypted_message_received":"Zwrotna niezaszyfrowana wiadomość.","your_message_wasnt_send_because_you_have_no_valid_subscription":"Wiadomość nie została wysłana ponieważ nie posiadasz subskrybcji u rozmówcy.","not_available":"Niedostępny.","no_connection":"Brak połączenia!","relogin":"Połącz ponownie","trying_to_start_private_conversation":"Rozpocznij rozmowę!","Verified":"Zweryfikowano","Unverified":"Niezweryfikowano","private_conversation_started":"Rozmowa prywatna rozpoczęta.","private_conversation_aborted":"Anulowano rozmowę!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Rozmówca przerwał połączenie!","conversation_is_now_verified":"Zweryfikowano połączenie.","authentication_failed":"Weryfikacja się nie powiodła.","your_buddy_is_attempting_to_determine_":"Twój rozmówca próbuje się z Tobą połączyć.","to_authenticate_to_your_buddy":"Autoryzacja z rozmówcą, ","enter_the_answer_and_click_answer":"napisz odpowiedź.","enter_the_secret":"wpisz hasło.","Creating_your_private_key_":"Tworzenie klucza prywatnego; może to chwilę potrwać","Authenticating_a_buddy_helps_":"Autoryzacja pomoże w ustaleniu faktycznej tożsamości rozmówcy ;).","How_do_you_want_to_authenticate_your_buddy":"Jakiej autoryzacji chcesz użyć {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Wybierz sposób...","Manual":"Ręcznie","Question":"Pytanie","Secret":"Hasło","To_verify_the_fingerprint_":"Aby zweryfikować kod najpierw skontaktuj się z rozmówcą np. za pomocą telefonu.","Your_fingerprint":"Twój kod:","Buddy_fingerprint":"Kod rozmówcy","Close":"Zamknij","Compared":"Porównano","To_authenticate_using_a_question_":"Aby autoryzować za pomocą pytania, wybierz pytanie na które tylko Twój rozmówca zna odpowiedź.","Ask":"Zadaj pytanie","To_authenticate_pick_a_secret_":"Aby autoryzować za pomocą hasła, wybierz hasło na które zna tylko Twój rozmówca.","Compare":"Dopasuj","Fingerprints":"Kody autoryzacyjne","Authentication":"Autoryzacja","Message":"Wiadomość","Add_buddy":"Dodaj kontakt","rename_buddy":"Zmień nazwę","delete_buddy":"Usuń kontakt","Login":"Login","Username":"Nazwa Użytkownika","Password":"Hasło","Cancel":"Anuluj","Connect":"Połączenie","Type_in_the_full_username_":"Wpisz pełną nazwę użytkownika (np. <B>imię.nazwisko@zajezdnia.local</B>) oraz jego nazwę wyświetlaną (Alias).","Alias":"Alias","Add":"Dodaj","Subscription_request":"Potwierdzenie subskrypcji","You_have_a_request_from":"Masz potwierdzenie od","Deny":"Odmów","Approve":"Zatwierdź","Remove_buddy":"Usuń rozmówcę","You_are_about_to_remove_":"Twój rozmówca {{bid_name}} (<b>{{bid_jid}}</b>) usunął Cię ze swojej listy kontaktów.","Continue_without_chat":"Kontynuuj bez komunikatora","Please_wait":"Proszę czekać","Login_failed":"Błędne logowanie","Sorry_we_cant_authentikate_":"Błędna autoryzacja z serwerem. Może hasło jest nieprawidłowe?","Retry":"Powrót","clear_history":"Wyczyść historię","New_message_from":"Nowa wiadomość od","Should_we_notify_you_":"Czy chcesz otrzymywać powiadomienia o nowych wiadomościach w przyszłości?","Please_accept_":"Kliknij \"Zezwól\" na górze.","Hide_offline":"Schowaj niedostępne kontakty","Show_offline":"Pokaż niedostępne kontakty","About":"Info","dnd":"Nie przeszkadzać","Mute":"Wycisz","Unmute":"Włącz dźwięk","Subscription":"Subskrybcja","both":"obustronna","Status":"Status","online":"Dostępny","chat":"czat","away":"z dala od kompa","xa":"hen hen...","offline":"niedostępny","none":"brak","Unknown_instance_tag":"Nieznany przypadek.","Not_one_of_our_latest_keys":"Not one of our latest keys.","Received_an_unreadable_encrypted_message":"Received an unreadable encrypted message.","Online":"Połączony","Chatty":"Pogawędzimy?","Away":"Daleko","Extended_away":"Hen Hen...","Offline":"Niedostępny","Friendship_request":"Zapytanie od znajomego?","Confirm":"Potwierdzenie","Dismiss":"Odwołaj","Remove":"Usuń","Online_help":"Pomoc Online","FN":"Pełna nazwa","N":" ","FAMILY":"Nazwisko","GIVEN":"Imię","NICKNAME":"Pseudonim","URL":"Strona WWW","ADR":"Adres","STREET":"Ulica","EXTADD":"Extended Address","LOCALITY":"Lokalizacja","REGION":"Region","PCODE":"Kod pocztowy","CTRY":"Kraj","TEL":"Telefon","NUMBER":"Numer","EMAIL":"Email","USERID":" ","ORG":"Organizacja","ORGNAME":"Nazwa","ORGUNIT":"Jednostka","TITLE":"Stanowisko","ROLE":"Rola","BDAY":"Data urodzin","DESC":"Opis","PHOTO":" ","send_message":"Wyślij wiadomość","get_info":"Pokaż informację","Settings":"Ustawienia","Priority":"Priorytet","Save":"Zapisz","User_settings":"Ustawienia Użytkownika","A_fingerprint_":"Kod służy do autoryzacji Twojego rozmówcy aby potwierdzić jego tożsamość.","Your_roster_is_empty_add_a":"Twoja lista jest pusta, dodaj kontakty ","new_buddy":"Nowy kontakt","is":"jest","Login_options":"opcje logowania","BOSH_url":"Adres BOSH","Domain":"Domena","Resource":"Źródło","On_login":"Na login","Received_an_unencrypted_message":"Zatwierdzono nieszyfrowaną wiadomość.","Sorry_your_buddy_doesnt_provide_any_information":"Twój rozmówca nie posiada żadnych informacji.","Info_about":"Informacja o...","Authentication_aborted":"Autoryzacja anulowana.","Authentication_request_received":"Prośba o autoryzację została przyjęta.","Do_you_want_to_display_them":"Chcesz to wyświetlić?","Log_in_without_chat":"Zaloguj bez komunikatora","has_come_online":"jest teraz dostępny","Unknown_sender":"Nieznany nadawca","You_received_a_message_from_an_unknown_sender":"Masz wiadomość od nieznanego nadawcy.","Please_allow_access_to_microphone_and_camera":"Kliknij \"Potwierdź\" na górze, aby móc korzystać z mikrofonu oraz kamery.","Incoming_call":"Przychodzące połączenie","from":"z","Do_you_want_to_accept_the_call_from":"Akceptujesz połączenie od","Reject":"Odrzuć","Accept":"Zaakceptuj","hang_up":"odbierz","snapshot":"zrób zdjęcie","mute_my_audio":"wycisz dźwięk","pause_my_video":"zatrzymaj moje wideo","fullscreen":"Pełny ekran","Info":"Informacja","Local_IP":"Adres IP","Remote_IP":"Zdalny adres IP","Local_Fingerprint":"Kod lokalny","Remote_Fingerprint":"Zdalny kod","Video_call_not_possible":"Rozmowa wideo jest niemożliwa. Twój rozmówca nie ma możliwości prowadzenia takich rozmów.","Start_video_call":"Rozpocznij rozmowę wideo"}},"pt-BR":{"translation":{"Logging_in":"Entrando...","your_connection_is_unencrypted":"Sua conexão não é encriptada","your_connection_is_encrypted":"Sua conexão é encriptada","your_buddy_closed_the_private_connection":"Seu contato fechou a conexão privada","start_private":"Iniciar conversa privada","close_private":"Fechar conversa privada","your_buddy_is_verificated":"Seu contato está verificado","you_have_only_a_subscription_in_one_way":"Você só tem a inscrição one-way","authentication_query_sent":"Pergunta de autenticação enviada","your_message_wasnt_send_please_end_your_private_conversation":"Sua mensagem não foi enviada. Por favor finalize sua conversa privada","unencrypted_message_received":"Mensagem não encriptada recebida","your_message_wasnt_send_because_you_have_no_valid_subscription":"Sua mensagem não foi enviada porque sua inscrição não é válida","not_available":"Indisponível","no_connection":"Sem conexão!","relogin":"reentrar","trying_to_start_private_conversation":"Tentando iniciar conversa privada","Verified":"Verificado","Unverified":"Não verificado","private_conversation_started":"Conversa privada iniciada.","private_conversation_aborted":"Conversa privada abortada!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Seu contato encerrou a conversa privada! Você deveria fazer o mesmo.","conversation_is_now_verified":"Conversa verificada.","authentication_failed":"Autenticação falhou.","your_buddy_is_attempting_to_determine_":"Seu contato está tentando determinar se ele realmente está falando contigo.","to_authenticate_to_your_buddy":"Para autenticar seu contato, ","enter_the_answer_and_click_answer":"entre com a resposta e clique em Responder.","enter_the_secret":"escreva a senha.","Creating_your_private_key_":"Criando sua chave privada: isso pode demorar um pouco.","Authenticating_a_buddy_helps_":"Autenticar seu contato ajuda a garantir que a pessoa com a qual você está falando é realmente a pessoa que ela alega ser.","How_do_you_want_to_authenticate_your_buddy":"Como você gostaria de se autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Selecione o método...","Manual":"Manual","Question":"Pergunta","Secret":"Senha","To_verify_the_fingerprint_":"Para verificar o fingerprint, entre em contato com seu contato usando outro meio, de preferência seguro, como o telefone.","Your_fingerprint":"Seu fingerprint","Buddy_fingerprint":"Fingerprint do contato","Close":"Fechar","Compared":"Comparado","To_authenticate_using_a_question_":"Para autenticar seu contato faça uma pergunta, mas escolha que só ele saiba a resposta.","Ask":"Pergunta","To_authenticate_pick_a_secret_":"Para autenticar, escolha um segredo que somente você e seu contato saibam.","Compare":"Compare","Fingerprints":"Fingerprints","Authentication":"Autenticação","Message":"Mensagem","Add_buddy":"Adicionar contato","rename_buddy":"renomear contato","delete_buddy":"remover contato","Login":"Entrar","Username":"Usuário","Password":"Senha","Cancel":"Cancelar","Connect":"Conectar","Type_in_the_full_username_":"Digite seu nome completo e um apelido opcional.","Alias":"Apelido","Add":"Adicionar","Subscription_request":"Pedido de inscrição","You_have_a_request_from":"Você tem um pedido de","Deny":"Negar","Approve":"Aprovar","Remove_buddy":"Remover contato","You_are_about_to_remove_":"Você está prestes a remover {{bid_name}} (<b>{{bid_jid}}</b>) de sua lista de contatos. Todas as conversas serão fechadas.","Continue_without_chat":"Continue sem converar","Please_wait":"Por favor aguarde","Login_failed":"Autenticação da conversa falhou","Sorry_we_cant_authentikate_":"A autenticação com o servidor falhou. Talvez seja a senha errada?","Retry":"Voltar","clear_history":"Limpar histórico","New_message_from":"Nova mensagem de","Should_we_notify_you_":"Devemos continuar notificando sobre novas mensagens no futuro?","Please_accept_":"Por favor clique no botão \"Permitir\" na parte superior.","Hide_offline":"Esconder contatos desconectados","Show_offline":"Mostrar contatos desconectados","About":"Sobre","dnd":"Não perturbe","Mute":"Mudo","Unmute":"Ligar","Subscription":"Inscrição","both":"ambos","Status":"Status","online":"online","chat":"conversa","away":"ausente","xa":"ausente por mais tempo","offline":"desativado","none":"nenhum","Unknown_instance_tag":"Marcação desconhecida da instância","Not_one_of_our_latest_keys":"Nenhuma de nossas ultimas chaves.","Received_an_unreadable_encrypted_message":"Mensagem encriptada ilegível foi recebida.","Online":"Online","Chatty":"Tagarela","Away":"Ausente","Extended_away":"Ausente por mais tempo","Offline":"Desativado","Friendship_request":"Pedido de amizade","Confirm":"Confirmar","Dismiss":"Ignorar","Remove":"Remover","Online_help":"Ajuda online","FN":"Nome completo","N":" ","FAMILY":"Sobrenome","GIVEN":"Nome","NICKNAME":"Apelido","URL":"URL","ADR":"Endereço","STREET":"Rua, Av, etc","EXTADD":"Complemento","LOCALITY":"Localidade","REGION":"Região","PCODE":"CEP","CTRY":"País","TEL":"Telefone","NUMBER":"Número","EMAIL":"Email","USERID":" ","ORG":"Empresa","ORGNAME":"Nome","ORGUNIT":"Unidade","TITLE":"Cargo","ROLE":"Rol","BDAY":"Data de nascimento","DESC":"Descrição","PHOTO":" ","send_message":"Enviar mensagem","get_info":"Exibir informações","Settings":"Configurações","Priority":"Prioridade","Save":"Salvar","User_settings":"Configurações do usuário","A_fingerprint_":"O fingerprint é usado para certificar que a pessoa com a qual se está falando é que ela diz ser.","Your_roster_is_empty_add_a":"Sua lista está vazia, adicione um ","new_buddy":"novo contato","is":"é","Login_options":"Opções de login","BOSH_url":"BOSH URL","Domain":"Domínio","Resource":"Recurso","On_login":"Ao autenticar","Received_an_unencrypted_message":"Mensagem não encriptada recebida","Sorry_your_buddy_doesnt_provide_any_information":"Desculpe, seu contato não forneceu nenhuma informação","Info_about":"Informações sobre","Authentication_aborted":"Autenticação encerrada.","Authentication_request_received":"Pedido de autenticação recebido","Do_you_want_to_display_them":"Você quer mostrá-los?","Log_in_without_chat":"Entrar sem conversar","has_come_online":"ficou online","Unknown_sender":"Emissor desconhecido","You_received_a_message_from_an_unknown_sender":"Você recebeu uma mensagem de um emissor desconhecido","Please_allow_access_to_microphone_and_camera":"Por favor clique no botão \"Permitir\" no topo, para conceder acesso ao seu microfone e câmera.","Incoming_call":"Recebendo chamada","from":"de","Do_you_want_to_accept_the_call_from":"Você aceita a chamada de","Reject":"Negar","Accept":"Aceitar","hang_up":"desligar","snapshot":"registrar imagem","mute_my_audio":"mudo","pause_my_video":"pausar vídeo","fullscreen":"tela cheia","Info":"Informações","Local_IP":"IP local","Remote_IP":"IP remoto","Local_Fingerprint":"Fingerprint local","Remote_Fingerprint":"Fingerprint remoto","Video_call_not_possible":"Chamada de vídeo impossível. Seu contato não suporta chamadas desse tipo.","Start_video_call":"Iniciar chamada de vídeo"}},"ro":{"translation":{"Logging_in":null,"your_connection_is_unencrypted":null,"your_connection_is_encrypted":null,"your_buddy_closed_the_private_connection":null,"start_private":null,"close_private":null,"your_buddy_is_verificated":null,"you_have_only_a_subscription_in_one_way":null,"authentication_query_sent":null,"your_message_wasnt_send_please_end_your_private_conversation":null,"unencrypted_message_received":null,"your_message_wasnt_send_because_you_have_no_valid_subscription":null,"not_available":null,"no_connection":null,"relogin":null,"trying_to_start_private_conversation":null,"Verified":null,"Unverified":null,"private_conversation_started":null,"private_conversation_aborted":null,"your_buddy_closed_the_private_conversation_you_should_do_the_same":null,"conversation_is_now_verified":null,"authentication_failed":null,"your_buddy_is_attempting_to_determine_":null,"to_authenticate_to_your_buddy":null,"enter_the_answer_and_click_answer":null,"enter_the_secret":null,"Creating_your_private_key_":null,"Authenticating_a_buddy_helps_":null,"How_do_you_want_to_authenticate_your_buddy":null,"Select_method":null,"Manual":null,"Question":null,"Secret":null,"To_verify_the_fingerprint_":null,"Your_fingerprint":null,"Buddy_fingerprint":null,"Close":null,"Compared":null,"To_authenticate_using_a_question_":null,"Ask":null,"To_authenticate_pick_a_secret_":null,"Compare":null,"Fingerprints":null,"Authentication":null,"Message":null,"Add_buddy":null,"rename_buddy":null,"delete_buddy":null,"Login":null,"Username":null,"Password":null,"Cancel":null,"Connect":null,"Type_in_the_full_username_":null,"Alias":null,"Add":null,"Subscription_request":null,"You_have_a_request_from":null,"Deny":null,"Approve":null,"Remove_buddy":null,"You_are_about_to_remove_":null,"Continue_without_chat":null,"Please_wait":null,"Login_failed":null,"Sorry_we_cant_authentikate_":null,"Retry":null,"clear_history":null,"New_message_from":null,"Should_we_notify_you_":null,"Please_accept_":null,"Hide_offline":null,"Show_offline":null,"About":null,"dnd":null,"Mute":null,"Unmute":null,"Subscription":null,"both":null,"Status":null,"online":null,"chat":null,"away":null,"xa":null,"offline":null,"none":null,"Unknown_instance_tag":null,"Not_one_of_our_latest_keys":null,"Received_an_unreadable_encrypted_message":null,"Online":null,"Chatty":null,"Away":null,"Extended_away":null,"Offline":null,"Friendship_request":null,"Confirm":null,"Dismiss":null,"Remove":null,"Online_help":null,"FN":null,"N":null,"FAMILY":null,"GIVEN":null,"NICKNAME":null,"URL":null,"ADR":null,"STREET":null,"EXTADD":null,"LOCALITY":null,"REGION":null,"PCODE":null,"CTRY":null,"TEL":null,"NUMBER":null,"EMAIL":null,"USERID":null,"ORG":null,"ORGNAME":null,"ORGUNIT":null,"TITLE":null,"ROLE":null,"BDAY":null,"DESC":null,"PHOTO":null,"send_message":null,"get_info":null,"Settings":null,"Priority":null,"Save":null,"User_settings":null,"A_fingerprint_":null,"Your_roster_is_empty_add_a":null,"new_buddy":null,"is":null,"Login_options":null,"BOSH_url":null,"Domain":null,"Resource":null,"On_login":null,"Received_an_unencrypted_message":null,"Sorry_your_buddy_doesnt_provide_any_information":null,"Info_about":null,"Authentication_aborted":null,"Authentication_request_received":null,"Do_you_want_to_display_them":null,"Log_in_without_chat":null,"has_come_online":null,"Unknown_sender":null,"You_received_a_message_from_an_unknown_sender":null,"Please_allow_access_to_microphone_and_camera":null,"Incoming_call":null,"from":null,"Do_you_want_to_accept_the_call_from":null,"Reject":null,"Accept":null,"hang_up":null,"snapshot":null,"mute_my_audio":null,"pause_my_video":null,"fullscreen":null,"Info":null,"Local_IP":null,"Remote_IP":null,"Local_Fingerprint":null,"Remote_Fingerprint":null,"Video_call_not_possible":null,"Start_video_call":null}}}; \ No newline at end of file
diff --git a/build/js/jsxc/lib/jsxc.dep.min.js b/build/js/jsxc/lib/jsxc.dep.min.js
index 9043d7d..c931f7a 100644
--- a/build/js/jsxc/lib/jsxc.dep.min.js
+++ b/build/js/jsxc/lib/jsxc.dep.min.js
@@ -1,11 +1,9 @@
/*!
- * jsxc v1.1.0 - 2015-02-08
+ * jsxc v2.0.0-beta1 - 2015-04-29
*
* This file concatenates all dependencies of jsxc.
*
*/
-/*!
- * Source: build/lib/strophe.js, license: multiple, url: http://strophe.im/strophejs/ */
/*! This code was written by Tyler Akins and has been placed in the
public domain. It would be nice if you left this header intact.
Base64 code from Tyler Akins -- http://rumkin.com
@@ -25,13 +23,8 @@ function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),8*s.length))}function
Copyright 2006-2008, OGG, LLC
*/
Function.prototype.bind||(Function.prototype.bind=function(obj){var func=this,_slice=Array.prototype.slice,_concat=Array.prototype.concat,_args=_slice.call(arguments,1);return function(){return func.apply(obj?obj:this,_concat.call(_args,_slice.call(arguments,0)))}}),Array.prototype.indexOf||(Array.prototype.indexOf=function(elt){var len=this.length,from=Number(arguments[1])||0;for(from=0>from?Math.ceil(from):Math.floor(from),0>from&&(from+=len);len>from;from++)if(from in this&&this[from]===elt)return from;return-1}),function(callback){function $build(name,attrs){return new Strophe.Builder(name,attrs)}function $msg(attrs){return new Strophe.Builder("message",attrs)}function $iq(attrs){return new Strophe.Builder("iq",attrs)}function $pres(attrs){return new Strophe.Builder("presence",attrs)}var Strophe;Strophe={VERSION:"1.1.3",NS:{HTTPBIND:"http://jabber.org/protocol/httpbind",BOSH:"urn:xmpp:xbosh",CLIENT:"jabber:client",AUTH:"jabber:iq:auth",ROSTER:"jabber:iq:roster",PROFILE:"jabber:iq:profile",DISCO_INFO:"http://jabber.org/protocol/disco#info",DISCO_ITEMS:"http://jabber.org/protocol/disco#items",MUC:"http://jabber.org/protocol/muc",SASL:"urn:ietf:params:xml:ns:xmpp-sasl",STREAM:"http://etherx.jabber.org/streams",BIND:"urn:ietf:params:xml:ns:xmpp-bind",SESSION:"urn:ietf:params:xml:ns:xmpp-session",VERSION:"jabber:iq:version",STANZAS:"urn:ietf:params:xml:ns:xmpp-stanzas",XHTML_IM:"http://jabber.org/protocol/xhtml-im",XHTML:"http://www.w3.org/1999/xhtml"},XHTML:{tags:["a","blockquote","br","cite","em","img","li","ol","p","span","strong","ul","body"],attributes:{a:["href"],blockquote:["style"],br:[],cite:["style"],em:[],img:["src","alt","style","height","width"],li:["style"],ol:["style"],p:["style"],span:["style"],strong:[],ul:["style"],body:[]},css:["background-color","color","font-family","font-size","font-style","font-weight","margin-left","margin-right","text-align","text-decoration"],validTag:function(tag){for(var i=0;i<Strophe.XHTML.tags.length;i++)if(tag==Strophe.XHTML.tags[i])return!0;return!1},validAttribute:function(tag,attribute){if("undefined"!=typeof Strophe.XHTML.attributes[tag]&&Strophe.XHTML.attributes[tag].length>0)for(var i=0;i<Strophe.XHTML.attributes[tag].length;i++)if(attribute==Strophe.XHTML.attributes[tag][i])return!0;return!1},validCSS:function(style){for(var i=0;i<Strophe.XHTML.css.length;i++)if(style==Strophe.XHTML.css[i])return!0;return!1}},Status:{ERROR:0,CONNECTING:1,CONNFAIL:2,AUTHENTICATING:3,AUTHFAIL:4,CONNECTED:5,DISCONNECTED:6,DISCONNECTING:7,ATTACHED:8},LogLevel:{DEBUG:0,INFO:1,WARN:2,ERROR:3,FATAL:4},ElementType:{NORMAL:1,TEXT:3,CDATA:4,FRAGMENT:11},TIMEOUT:1.1,SECONDARY_TIMEOUT:.1,addNamespace:function(name,value){Strophe.NS[name]=value},forEachChild:function(elem,elemName,func){var i,childNode;for(i=0;i<elem.childNodes.length;i++)childNode=elem.childNodes[i],childNode.nodeType!=Strophe.ElementType.NORMAL||elemName&&!this.isTagEqual(childNode,elemName)||func(childNode)},isTagEqual:function(el,name){return el.tagName.toLowerCase()==name.toLowerCase()},_xmlGenerator:null,_makeGenerator:function(){var doc;return void 0===document.implementation.createDocument||document.implementation.createDocument&&document.documentMode&&document.documentMode<10?(doc=this._getIEXmlDom(),doc.appendChild(doc.createElement("strophe"))):doc=document.implementation.createDocument("jabber:client","strophe",null),doc},xmlGenerator:function(){return Strophe._xmlGenerator||(Strophe._xmlGenerator=Strophe._makeGenerator()),Strophe._xmlGenerator},_getIEXmlDom:function(){for(var doc=null,docStrings=["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.5.0","Msxml2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"],d=0;d<docStrings.length&&null===doc;d++)try{doc=new ActiveXObject(docStrings[d])}catch(e){doc=null}return doc},xmlElement:function(name){if(!name)return null;var a,i,k,node=Strophe.xmlGenerator().createElement(name);for(a=1;a<arguments.length;a++)if(arguments[a])if("string"==typeof arguments[a]||"number"==typeof arguments[a])node.appendChild(Strophe.xmlTextNode(arguments[a]));else if("object"==typeof arguments[a]&&"function"==typeof arguments[a].sort)for(i=0;i<arguments[a].length;i++)"object"==typeof arguments[a][i]&&"function"==typeof arguments[a][i].sort&&node.setAttribute(arguments[a][i][0],arguments[a][i][1]);else if("object"==typeof arguments[a])for(k in arguments[a])arguments[a].hasOwnProperty(k)&&node.setAttribute(k,arguments[a][k]);return node},xmlescape:function(text){return text=text.replace(/\&/g,"&amp;"),text=text.replace(/</g,"&lt;"),text=text.replace(/>/g,"&gt;"),text=text.replace(/'/g,"&apos;"),text=text.replace(/"/g,"&quot;")},xmlTextNode:function(text){return Strophe.xmlGenerator().createTextNode(text)},xmlHtmlNode:function(html){var node;if(window.DOMParser){var parser=new DOMParser;node=parser.parseFromString(html,"text/xml")}else node=new ActiveXObject("Microsoft.XMLDOM"),node.async="false",node.loadXML(html);return node},getText:function(elem){if(!elem)return null;var str="";0===elem.childNodes.length&&elem.nodeType==Strophe.ElementType.TEXT&&(str+=elem.nodeValue);for(var i=0;i<elem.childNodes.length;i++)elem.childNodes[i].nodeType==Strophe.ElementType.TEXT&&(str+=elem.childNodes[i].nodeValue);return Strophe.xmlescape(str)},copyElement:function(elem){var i,el;if(elem.nodeType==Strophe.ElementType.NORMAL){for(el=Strophe.xmlElement(elem.tagName),i=0;i<elem.attributes.length;i++)el.setAttribute(elem.attributes[i].nodeName.toLowerCase(),elem.attributes[i].value);for(i=0;i<elem.childNodes.length;i++)el.appendChild(Strophe.copyElement(elem.childNodes[i]))}else elem.nodeType==Strophe.ElementType.TEXT&&(el=Strophe.xmlGenerator().createTextNode(elem.nodeValue));return el},createHtml:function(elem){var i,el,j,tag,attribute,value,css,cssAttrs,attr,cssName,cssValue;if(elem.nodeType==Strophe.ElementType.NORMAL)if(tag=elem.nodeName.toLowerCase(),Strophe.XHTML.validTag(tag))try{for(el=Strophe.xmlElement(tag),i=0;i<Strophe.XHTML.attributes[tag].length;i++)if(attribute=Strophe.XHTML.attributes[tag][i],value=elem.getAttribute(attribute),"undefined"!=typeof value&&null!==value&&""!==value&&value!==!1&&0!==value)if("style"==attribute&&"object"==typeof value&&"undefined"!=typeof value.cssText&&(value=value.cssText),"style"==attribute){for(css=[],cssAttrs=value.split(";"),j=0;j<cssAttrs.length;j++)attr=cssAttrs[j].split(":"),cssName=attr[0].replace(/^\s*/,"").replace(/\s*$/,"").toLowerCase(),Strophe.XHTML.validCSS(cssName)&&(cssValue=attr[1].replace(/^\s*/,"").replace(/\s*$/,""),css.push(cssName+": "+cssValue));css.length>0&&(value=css.join("; "),el.setAttribute(attribute,value))}else el.setAttribute(attribute,value);for(i=0;i<elem.childNodes.length;i++)el.appendChild(Strophe.createHtml(elem.childNodes[i]))}catch(e){el=Strophe.xmlTextNode("")}else for(el=Strophe.xmlGenerator().createDocumentFragment(),i=0;i<elem.childNodes.length;i++)el.appendChild(Strophe.createHtml(elem.childNodes[i]));else if(elem.nodeType==Strophe.ElementType.FRAGMENT)for(el=Strophe.xmlGenerator().createDocumentFragment(),i=0;i<elem.childNodes.length;i++)el.appendChild(Strophe.createHtml(elem.childNodes[i]));else elem.nodeType==Strophe.ElementType.TEXT&&(el=Strophe.xmlTextNode(elem.nodeValue));return el},escapeNode:function(node){return node.replace(/^\s+|\s+$/g,"").replace(/\\/g,"\\5c").replace(/ /g,"\\20").replace(/\"/g,"\\22").replace(/\&/g,"\\26").replace(/\'/g,"\\27").replace(/\//g,"\\2f").replace(/:/g,"\\3a").replace(/</g,"\\3c").replace(/>/g,"\\3e").replace(/@/g,"\\40")},unescapeNode:function(node){return node.replace(/\\20/g," ").replace(/\\22/g,'"').replace(/\\26/g,"&").replace(/\\27/g,"'").replace(/\\2f/g,"/").replace(/\\3a/g,":").replace(/\\3c/g,"<").replace(/\\3e/g,">").replace(/\\40/g,"@").replace(/\\5c/g,"\\")},getNodeFromJid:function(jid){return jid.indexOf("@")<0?null:jid.split("@")[0]},getDomainFromJid:function(jid){var bare=Strophe.getBareJidFromJid(jid);if(bare.indexOf("@")<0)return bare;var parts=bare.split("@");return parts.splice(0,1),parts.join("@")},getResourceFromJid:function(jid){var s=jid.split("/");return s.length<2?null:(s.splice(0,1),s.join("/"))},getBareJidFromJid:function(jid){return jid?jid.split("/")[0]:null},log:function(){},debug:function(msg){this.log(this.LogLevel.DEBUG,msg)},info:function(msg){this.log(this.LogLevel.INFO,msg)},warn:function(msg){this.log(this.LogLevel.WARN,msg)},error:function(msg){this.log(this.LogLevel.ERROR,msg)},fatal:function(msg){this.log(this.LogLevel.FATAL,msg)},serialize:function(elem){var result;if(!elem)return null;"function"==typeof elem.tree&&(elem=elem.tree());var i,child,nodeName=elem.nodeName;for(elem.getAttribute("_realname")&&(nodeName=elem.getAttribute("_realname")),result="<"+nodeName,i=0;i<elem.attributes.length;i++)"_realname"!=elem.attributes[i].nodeName&&(result+=" "+elem.attributes[i].nodeName.toLowerCase()+"='"+elem.attributes[i].value.replace(/&/g,"&amp;").replace(/\'/g,"&apos;").replace(/>/g,"&gt;").replace(/</g,"&lt;")+"'");if(elem.childNodes.length>0){for(result+=">",i=0;i<elem.childNodes.length;i++)switch(child=elem.childNodes[i],child.nodeType){case Strophe.ElementType.NORMAL:result+=Strophe.serialize(child);break;case Strophe.ElementType.TEXT:result+=Strophe.xmlescape(child.nodeValue);break;case Strophe.ElementType.CDATA:result+="<![CDATA["+child.nodeValue+"]]>"}result+="</"+nodeName+">"}else result+="/>";return result},_requestId:0,_connectionPlugins:{},addConnectionPlugin:function(name,ptype){Strophe._connectionPlugins[name]=ptype}},Strophe.Builder=function(name,attrs){("presence"==name||"message"==name||"iq"==name)&&(attrs&&!attrs.xmlns?attrs.xmlns=Strophe.NS.CLIENT:attrs||(attrs={xmlns:Strophe.NS.CLIENT})),this.nodeTree=Strophe.xmlElement(name,attrs),this.node=this.nodeTree},Strophe.Builder.prototype={tree:function(){return this.nodeTree},toString:function(){return Strophe.serialize(this.nodeTree)},up:function(){return this.node=this.node.parentNode,this},attrs:function(moreattrs){for(var k in moreattrs)moreattrs.hasOwnProperty(k)&&this.node.setAttribute(k,moreattrs[k]);return this},c:function(name,attrs,text){var child=Strophe.xmlElement(name,attrs,text);return this.node.appendChild(child),text||(this.node=child),this},cnode:function(elem){var impNode,xmlGen=Strophe.xmlGenerator();try{impNode=void 0!==xmlGen.importNode}catch(e){impNode=!1}var newElem=impNode?xmlGen.importNode(elem,!0):Strophe.copyElement(elem);return this.node.appendChild(newElem),this.node=newElem,this},t:function(text){var child=Strophe.xmlTextNode(text);return this.node.appendChild(child),this},h:function(html){var fragment=document.createElement("body");fragment.innerHTML=html;for(var xhtml=Strophe.createHtml(fragment);xhtml.childNodes.length>0;)this.node.appendChild(xhtml.childNodes[0]);return this}},Strophe.Handler=function(handler,ns,name,type,id,from,options){this.handler=handler,this.ns=ns,this.name=name,this.type=type,this.id=id,this.options=options||{matchBare:!1},this.options.matchBare||(this.options.matchBare=!1),this.from=this.options.matchBare?from?Strophe.getBareJidFromJid(from):null:from,this.user=!0},Strophe.Handler.prototype={isMatch:function(elem){var nsMatch,from=null;if(from=this.options.matchBare?Strophe.getBareJidFromJid(elem.getAttribute("from")):elem.getAttribute("from"),nsMatch=!1,this.ns){var that=this;Strophe.forEachChild(elem,null,function(elem){elem.getAttribute("xmlns")==that.ns&&(nsMatch=!0)}),nsMatch=nsMatch||elem.getAttribute("xmlns")==this.ns}else nsMatch=!0;return!nsMatch||this.name&&!Strophe.isTagEqual(elem,this.name)||this.type&&elem.getAttribute("type")!=this.type||this.id&&elem.getAttribute("id")!=this.id||this.from&&from!=this.from?!1:!0},run:function(elem){var result=null;try{result=this.handler(elem)}catch(e){throw e.sourceURL?Strophe.fatal("error: "+this.handler+" "+e.sourceURL+":"+e.line+" - "+e.name+": "+e.message):e.fileName?("undefined"!=typeof console&&(console.trace(),console.error(this.handler," - error - ",e,e.message)),Strophe.fatal("error: "+this.handler+" "+e.fileName+":"+e.lineNumber+" - "+e.name+": "+e.message)):Strophe.fatal("error: "+e.message+"\n"+e.stack),e}return result},toString:function(){return"{Handler: "+this.handler+"("+this.name+","+this.id+","+this.ns+")}"}},Strophe.TimedHandler=function(period,handler){this.period=period,this.handler=handler,this.lastCalled=(new Date).getTime(),this.user=!0},Strophe.TimedHandler.prototype={run:function(){return this.lastCalled=(new Date).getTime(),this.handler()},reset:function(){this.lastCalled=(new Date).getTime()},toString:function(){return"{TimedHandler: "+this.handler+"("+this.period+")}"}},Strophe.Connection=function(service,options){this.service=service,this.options=options||{};var proto=this.options.protocol||"";this._proto=0===service.indexOf("ws:")||0===service.indexOf("wss:")||0===proto.indexOf("ws")?new Strophe.Websocket(this):new Strophe.Bosh(this),this.jid="",this.domain=null,this.features=null,this._sasl_data={},this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this._idleTimeout=null,this._disconnectTimeout=null,this.do_authentication=!0,this.authenticated=!1,this.disconnecting=!1,this.connected=!1,this.errors=0,this.paused=!1,this._data=[],this._uniqueId=0,this._sasl_success_handler=null,this._sasl_failure_handler=null,this._sasl_challenge_handler=null,this.maxRetries=5,this._idleTimeout=setTimeout(this._onIdle.bind(this),100);for(var k in Strophe._connectionPlugins)if(Strophe._connectionPlugins.hasOwnProperty(k)){var ptype=Strophe._connectionPlugins[k],F=function(){};F.prototype=ptype,this[k]=new F,this[k].init(this)}},Strophe.Connection.prototype={reset:function(){this._proto._reset(),this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this.authenticated=!1,this.disconnecting=!1,this.connected=!1,this.errors=0,this._requests=[],this._uniqueId=0},pause:function(){this.paused=!0},resume:function(){this.paused=!1},getUniqueId:function(suffix){return"string"==typeof suffix||"number"==typeof suffix?++this._uniqueId+":"+suffix:++this._uniqueId+""},connect:function(jid,pass,callback,wait,hold,route){this.jid=jid,this.authzid=Strophe.getBareJidFromJid(this.jid),this.authcid=Strophe.getNodeFromJid(this.jid),this.pass=pass,this.servtype="xmpp",this.connect_callback=callback,this.disconnecting=!1,this.connected=!1,this.authenticated=!1,this.errors=0,this.domain=Strophe.getDomainFromJid(this.jid),this._changeConnectStatus(Strophe.Status.CONNECTING,null),this._proto._connect(wait,hold,route)},attach:function(jid,sid,rid,callback,wait,hold,wind){this._proto._attach(jid,sid,rid,callback,wait,hold,wind)},xmlInput:function(){},xmlOutput:function(){},rawInput:function(){},rawOutput:function(){},send:function(elem){if(null!==elem){if("function"==typeof elem.sort)for(var i=0;i<elem.length;i++)this._queueData(elem[i]);else this._queueData("function"==typeof elem.tree?elem.tree():elem);this._proto._send()}},flush:function(){clearTimeout(this._idleTimeout),this._onIdle()},sendIQ:function(elem,callback,errback,timeout){var timeoutHandler=null,that=this;"function"==typeof elem.tree&&(elem=elem.tree());var id=elem.getAttribute("id");id||(id=this.getUniqueId("sendIQ"),elem.setAttribute("id",id));var handler=this.addHandler(function(stanza){timeoutHandler&&that.deleteTimedHandler(timeoutHandler);var iqtype=stanza.getAttribute("type");if("result"==iqtype)callback&&callback(stanza);else{if("error"!=iqtype)throw{name:"StropheError",message:"Got bad IQ type of "+iqtype};errback&&errback(stanza)}},null,"iq",null,id);return timeout&&(timeoutHandler=this.addTimedHandler(timeout,function(){return that.deleteHandler(handler),errback&&errback(null),!1})),this.send(elem),id},_queueData:function(element){if(null===element||!element.tagName||!element.childNodes)throw{name:"StropheError",message:"Cannot queue non-DOMElement."};this._data.push(element)},_sendRestart:function(){this._data.push("restart"),this._proto._sendRestart(),this._idleTimeout=setTimeout(this._onIdle.bind(this),100)},addTimedHandler:function(period,handler){var thand=new Strophe.TimedHandler(period,handler);return this.addTimeds.push(thand),thand},deleteTimedHandler:function(handRef){this.removeTimeds.push(handRef)},addHandler:function(handler,ns,name,type,id,from,options){var hand=new Strophe.Handler(handler,ns,name,type,id,from,options);return this.addHandlers.push(hand),hand},deleteHandler:function(handRef){this.removeHandlers.push(handRef)},disconnect:function(reason){if(this._changeConnectStatus(Strophe.Status.DISCONNECTING,reason),Strophe.info("Disconnect was called because: "+reason),this.connected){var pres=!1;this.disconnecting=!0,this.authenticated&&(pres=$pres({xmlns:Strophe.NS.CLIENT,type:"unavailable"})),this._disconnectTimeout=this._addSysTimedHandler(3e3,this._onDisconnectTimeout.bind(this)),this._proto._disconnect(pres)}},_changeConnectStatus:function(status,condition){for(var k in Strophe._connectionPlugins)if(Strophe._connectionPlugins.hasOwnProperty(k)){var plugin=this[k];if(plugin.statusChanged)try{plugin.statusChanged(status,condition)}catch(err){Strophe.error(""+k+" plugin caused an exception changing status: "+err)}}if(this.connect_callback)try{this.connect_callback(status,condition)}catch(e){Strophe.error("User connection callback caused an exception: "+e)}},_doDisconnect:function(){null!==this._disconnectTimeout&&(this.deleteTimedHandler(this._disconnectTimeout),this._disconnectTimeout=null),Strophe.info("_doDisconnect was called"),this._proto._doDisconnect(),this.authenticated=!1,this.disconnecting=!1,this.handlers=[],this.timedHandlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._changeConnectStatus(Strophe.Status.DISCONNECTED,null),this.connected=!1},_dataRecv:function(req,raw){Strophe.info("_dataRecv called");var elem=this._proto._reqToData(req);if(null!==elem){this.xmlInput!==Strophe.Connection.prototype.xmlInput&&this.xmlInput(elem.nodeName===this._proto.strip&&elem.childNodes.length?elem.childNodes[0]:elem),this.rawInput!==Strophe.Connection.prototype.rawInput&&this.rawInput(raw?raw:Strophe.serialize(elem));for(var i,hand;this.removeHandlers.length>0;)hand=this.removeHandlers.pop(),i=this.handlers.indexOf(hand),i>=0&&this.handlers.splice(i,1);for(;this.addHandlers.length>0;)this.handlers.push(this.addHandlers.pop());if(this.disconnecting&&this._proto._emptyQueue())return void this._doDisconnect();var cond,conflict,typ=elem.getAttribute("type");if(null!==typ&&"terminate"==typ){if(this.disconnecting)return;return cond=elem.getAttribute("condition"),conflict=elem.getElementsByTagName("conflict"),null!==cond?("remote-stream-error"==cond&&conflict.length>0&&(cond="conflict"),this._changeConnectStatus(Strophe.Status.CONNFAIL,cond)):this._changeConnectStatus(Strophe.Status.CONNFAIL,"unknown"),void this.disconnect("unknown stream-error")}var that=this;Strophe.forEachChild(elem,null,function(child){var i,newList;for(newList=that.handlers,that.handlers=[],i=0;i<newList.length;i++){var hand=newList[i];try{!hand.isMatch(child)||!that.authenticated&&hand.user?that.handlers.push(hand):hand.run(child)&&that.handlers.push(hand)}catch(e){Strophe.warn("Removing Strophe handlers due to uncaught exception: "+e.message)}}})}},mechanisms:{},_connect_cb:function(req,_callback,raw){Strophe.info("_connect_cb was called"),this.connected=!0;var bodyWrap=this._proto._reqToData(req);if(bodyWrap){this.xmlInput!==Strophe.Connection.prototype.xmlInput&&this.xmlInput(bodyWrap.nodeName===this._proto.strip&&bodyWrap.childNodes.length?bodyWrap.childNodes[0]:bodyWrap),this.rawInput!==Strophe.Connection.prototype.rawInput&&this.rawInput(raw?raw:Strophe.serialize(bodyWrap));var conncheck=this._proto._connect_cb(bodyWrap);if(conncheck!==Strophe.Status.CONNFAIL){this._authentication.sasl_scram_sha1=!1,this._authentication.sasl_plain=!1,this._authentication.sasl_digest_md5=!1,this._authentication.sasl_anonymous=!1,this._authentication.legacy_auth=!1;var hasFeatures=bodyWrap.getElementsByTagName("stream:features").length>0;hasFeatures||(hasFeatures=bodyWrap.getElementsByTagName("features").length>0);var i,mech,mechanisms=bodyWrap.getElementsByTagName("mechanism"),matched=[],found_authentication=!1;if(!hasFeatures)return void this._proto._no_auth_received(_callback);if(mechanisms.length>0)for(i=0;i<mechanisms.length;i++)mech=Strophe.getText(mechanisms[i]),this.mechanisms[mech]&&matched.push(this.mechanisms[mech]);return this._authentication.legacy_auth=bodyWrap.getElementsByTagName("auth").length>0,(found_authentication=this._authentication.legacy_auth||matched.length>0)?void(this.do_authentication!==!1&&this.authenticate(matched)):void this._proto._no_auth_received(_callback)}}},authenticate:function(matched){var i;for(i=0;i<matched.length-1;++i){for(var higher=i,j=i+1;j<matched.length;++j)matched[j].prototype.priority>matched[higher].prototype.priority&&(higher=j);if(higher!=i){var swap=matched[i];matched[i]=matched[higher],matched[higher]=swap}}var mechanism_found=!1;for(i=0;i<matched.length;++i)if(matched[i].test(this)){this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null),this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null),this._sasl_challenge_handler=this._addSysHandler(this._sasl_challenge_cb.bind(this),null,"challenge",null,null),this._sasl_mechanism=new matched[i],this._sasl_mechanism.onStart(this);var request_auth_exchange=$build("auth",{xmlns:Strophe.NS.SASL,mechanism:this._sasl_mechanism.name});if(this._sasl_mechanism.isClientFirst){var response=this._sasl_mechanism.onChallenge(this,null);request_auth_exchange.t(Base64.encode(response))}this.send(request_auth_exchange.tree()),mechanism_found=!0;break}mechanism_found||(null===Strophe.getNodeFromJid(this.jid)?(this._changeConnectStatus(Strophe.Status.CONNFAIL,"x-strophe-bad-non-anon-jid"),this.disconnect("x-strophe-bad-non-anon-jid")):(this._changeConnectStatus(Strophe.Status.AUTHENTICATING,null),this._addSysHandler(this._auth1_cb.bind(this),null,null,null,"_auth_1"),this.send($iq({type:"get",to:this.domain,id:"_auth_1"}).c("query",{xmlns:Strophe.NS.AUTH}).c("username",{}).t(Strophe.getNodeFromJid(this.jid)).tree())))},_sasl_challenge_cb:function(elem){var challenge=Base64.decode(Strophe.getText(elem)),response=this._sasl_mechanism.onChallenge(this,challenge),stanza=$build("response",{xmlns:Strophe.NS.SASL});return""!==response&&stanza.t(Base64.encode(response)),this.send(stanza.tree()),!0},_auth1_cb:function(){var iq=$iq({type:"set",id:"_auth_2"}).c("query",{xmlns:Strophe.NS.AUTH}).c("username",{}).t(Strophe.getNodeFromJid(this.jid)).up().c("password").t(this.pass);return Strophe.getResourceFromJid(this.jid)||(this.jid=Strophe.getBareJidFromJid(this.jid)+"/strophe"),iq.up().c("resource",{}).t(Strophe.getResourceFromJid(this.jid)),this._addSysHandler(this._auth2_cb.bind(this),null,null,null,"_auth_2"),this.send(iq.tree()),!1},_sasl_success_cb:function(elem){if(this._sasl_data["server-signature"]){var serverSignature,success=Base64.decode(Strophe.getText(elem)),attribMatch=/([a-z]+)=([^,]+)(,|$)/,matches=success.match(attribMatch);if("v"==matches[1]&&(serverSignature=matches[2]),serverSignature!=this._sasl_data["server-signature"])return this.deleteHandler(this._sasl_failure_handler),this._sasl_failure_handler=null,this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_data={},this._sasl_failure_cb(null)}return Strophe.info("SASL authentication succeeded."),this._sasl_mechanism&&this._sasl_mechanism.onSuccess(),this.deleteHandler(this._sasl_failure_handler),this._sasl_failure_handler=null,this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._addSysHandler(this._sasl_auth1_cb.bind(this),null,"stream:features",null,null),this._sendRestart(),!1},_sasl_auth1_cb:function(elem){this.features=elem;var i,child;for(i=0;i<elem.childNodes.length;i++)child=elem.childNodes[i],"bind"==child.nodeName&&(this.do_bind=!0),"session"==child.nodeName&&(this.do_session=!0);if(!this.do_bind)return this._changeConnectStatus(Strophe.Status.AUTHFAIL,null),!1;this._addSysHandler(this._sasl_bind_cb.bind(this),null,null,null,"_bind_auth_2");var resource=Strophe.getResourceFromJid(this.jid);return this.send(resource?$iq({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:Strophe.NS.BIND}).c("resource",{}).t(resource).tree():$iq({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:Strophe.NS.BIND}).tree()),!1},_sasl_bind_cb:function(elem){if("error"==elem.getAttribute("type")){Strophe.info("SASL binding failed.");var condition,conflict=elem.getElementsByTagName("conflict");return conflict.length>0&&(condition="conflict"),this._changeConnectStatus(Strophe.Status.AUTHFAIL,condition),!1}var jidNode,bind=elem.getElementsByTagName("bind");return bind.length>0?(jidNode=bind[0].getElementsByTagName("jid"),void(jidNode.length>0&&(this.jid=Strophe.getText(jidNode[0]),this.do_session?(this._addSysHandler(this._sasl_session_cb.bind(this),null,null,null,"_session_auth_2"),this.send($iq({type:"set",id:"_session_auth_2"}).c("session",{xmlns:Strophe.NS.SESSION}).tree())):(this.authenticated=!0,this._changeConnectStatus(Strophe.Status.CONNECTED,null))))):(Strophe.info("SASL binding failed."),this._changeConnectStatus(Strophe.Status.AUTHFAIL,null),!1)},_sasl_session_cb:function(elem){if("result"==elem.getAttribute("type"))this.authenticated=!0,this._changeConnectStatus(Strophe.Status.CONNECTED,null);else if("error"==elem.getAttribute("type"))return Strophe.info("Session creation failed."),this._changeConnectStatus(Strophe.Status.AUTHFAIL,null),!1;return!1},_sasl_failure_cb:function(){return this._sasl_success_handler&&(this.deleteHandler(this._sasl_success_handler),this._sasl_success_handler=null),this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_mechanism&&this._sasl_mechanism.onFailure(),this._changeConnectStatus(Strophe.Status.AUTHFAIL,null),!1},_auth2_cb:function(elem){return"result"==elem.getAttribute("type")?(this.authenticated=!0,this._changeConnectStatus(Strophe.Status.CONNECTED,null)):"error"==elem.getAttribute("type")&&(this._changeConnectStatus(Strophe.Status.AUTHFAIL,null),this.disconnect("authentication failed")),!1},_addSysTimedHandler:function(period,handler){var thand=new Strophe.TimedHandler(period,handler);return thand.user=!1,this.addTimeds.push(thand),thand},_addSysHandler:function(handler,ns,name,type,id){var hand=new Strophe.Handler(handler,ns,name,type,id);return hand.user=!1,this.addHandlers.push(hand),hand},_onDisconnectTimeout:function(){return Strophe.info("_onDisconnectTimeout was called"),this._proto._onDisconnectTimeout(),this._doDisconnect(),!1},_onIdle:function(){for(var i,thand,since,newList;this.addTimeds.length>0;)this.timedHandlers.push(this.addTimeds.pop());for(;this.removeTimeds.length>0;)thand=this.removeTimeds.pop(),i=this.timedHandlers.indexOf(thand),i>=0&&this.timedHandlers.splice(i,1);var now=(new Date).getTime();for(newList=[],i=0;i<this.timedHandlers.length;i++)thand=this.timedHandlers[i],(this.authenticated||!thand.user)&&(since=thand.lastCalled+thand.period,0>=since-now?thand.run()&&newList.push(thand):newList.push(thand));this.timedHandlers=newList,clearTimeout(this._idleTimeout),this._proto._onIdle(),this.connected&&(this._idleTimeout=setTimeout(this._onIdle.bind(this),100))}},callback&&callback(Strophe,$build,$msg,$iq,$pres),Strophe.SASLMechanism=function(name,isClientFirst,priority){this.name=name,this.isClientFirst=isClientFirst,this.priority=priority},Strophe.SASLMechanism.prototype={test:function(){return!0},onStart:function(connection){this._connection=connection},onChallenge:function(){throw new Error("You should implement challenge handling!")},onFailure:function(){this._connection=null},onSuccess:function(){this._connection=null}},Strophe.SASLAnonymous=function(){},Strophe.SASLAnonymous.prototype=new Strophe.SASLMechanism("ANONYMOUS",!1,10),Strophe.SASLAnonymous.test=function(connection){return null===connection.authcid},Strophe.Connection.prototype.mechanisms[Strophe.SASLAnonymous.prototype.name]=Strophe.SASLAnonymous,Strophe.SASLPlain=function(){},Strophe.SASLPlain.prototype=new Strophe.SASLMechanism("PLAIN",!0,20),Strophe.SASLPlain.test=function(connection){return null!==connection.authcid},Strophe.SASLPlain.prototype.onChallenge=function(connection){var auth_str=connection.authzid;return auth_str+="\x00",auth_str+=connection.authcid,auth_str+="\x00",auth_str+=connection.pass},Strophe.Connection.prototype.mechanisms[Strophe.SASLPlain.prototype.name]=Strophe.SASLPlain,Strophe.SASLSHA1=function(){},Strophe.SASLSHA1.prototype=new Strophe.SASLMechanism("SCRAM-SHA-1",!0,40),Strophe.SASLSHA1.test=function(connection){return null!==connection.authcid},Strophe.SASLSHA1.prototype.onChallenge=function(connection,challenge,test_cnonce){var cnonce=test_cnonce||MD5.hexdigest(1234567890*Math.random()),auth_str="n="+connection.authcid;return auth_str+=",r=",auth_str+=cnonce,connection._sasl_data.cnonce=cnonce,connection._sasl_data["client-first-message-bare"]=auth_str,auth_str="n,,"+auth_str,this.onChallenge=function(connection,challenge){for(var nonce,salt,iter,Hi,U,U_old,i,k,clientKey,serverKey,clientSignature,responseText="c=biws,",authMessage=connection._sasl_data["client-first-message-bare"]+","+challenge+",",cnonce=connection._sasl_data.cnonce,attribMatch=/([a-z]+)=([^,]+)(,|$)/;challenge.match(attribMatch);){var matches=challenge.match(attribMatch);switch(challenge=challenge.replace(matches[0],""),matches[1]){case"r":nonce=matches[2];break;case"s":salt=matches[2];break;case"i":iter=matches[2]}}if(nonce.substr(0,cnonce.length)!==cnonce)return connection._sasl_data={},connection._sasl_failure_cb();for(responseText+="r="+nonce,authMessage+=responseText,salt=Base64.decode(salt),salt+="\x00\x00\x00",Hi=U_old=core_hmac_sha1(connection.pass,salt),i=1;iter>i;i++){for(U=core_hmac_sha1(connection.pass,binb2str(U_old)),k=0;5>k;k++)Hi[k]^=U[k];U_old=U}for(Hi=binb2str(Hi),clientKey=core_hmac_sha1(Hi,"Client Key"),serverKey=str_hmac_sha1(Hi,"Server Key"),clientSignature=core_hmac_sha1(str_sha1(binb2str(clientKey)),authMessage),connection._sasl_data["server-signature"]=b64_hmac_sha1(serverKey,authMessage),k=0;5>k;k++)clientKey[k]^=clientSignature[k];return responseText+=",p="+Base64.encode(binb2str(clientKey))}.bind(this),auth_str},Strophe.Connection.prototype.mechanisms[Strophe.SASLSHA1.prototype.name]=Strophe.SASLSHA1,Strophe.SASLMD5=function(){},Strophe.SASLMD5.prototype=new Strophe.SASLMechanism("DIGEST-MD5",!1,30),Strophe.SASLMD5.test=function(connection){return null!==connection.authcid},Strophe.SASLMD5.prototype._quote=function(str){return'"'+str.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'},Strophe.SASLMD5.prototype.onChallenge=function(connection,challenge,test_cnonce){for(var matches,attribMatch=/([a-z]+)=("[^"]+"|[^,"]+)(?:,|$)/,cnonce=test_cnonce||MD5.hexdigest(""+1234567890*Math.random()),realm="",host=null,nonce="",qop="";challenge.match(attribMatch);)switch(matches=challenge.match(attribMatch),challenge=challenge.replace(matches[0],""),matches[2]=matches[2].replace(/^"(.+)"$/,"$1"),matches[1]){case"realm":realm=matches[2];break;case"nonce":nonce=matches[2];break;case"qop":qop=matches[2];break;case"host":host=matches[2]}var digest_uri=connection.servtype+"/"+connection.domain;null!==host&&(digest_uri=digest_uri+"/"+host);var A1=MD5.hash(connection.authcid+":"+realm+":"+this._connection.pass)+":"+nonce+":"+cnonce,A2="AUTHENTICATE:"+digest_uri,responseText="";return responseText+="charset=utf-8,",responseText+="username="+this._quote(connection.authcid)+",",responseText+="realm="+this._quote(realm)+",",responseText+="nonce="+this._quote(nonce)+",",responseText+="nc=00000001,",responseText+="cnonce="+this._quote(cnonce)+",",responseText+="digest-uri="+this._quote(digest_uri)+",",responseText+="response="+MD5.hexdigest(MD5.hexdigest(A1)+":"+nonce+":00000001:"+cnonce+":auth:"+MD5.hexdigest(A2))+",",responseText+="qop=auth",this.onChallenge=function(){return""
-}.bind(this),responseText},Strophe.Connection.prototype.mechanisms[Strophe.SASLMD5.prototype.name]=Strophe.SASLMD5}(function(){window.Strophe=arguments[0],window.$build=arguments[1],window.$msg=arguments[2],window.$iq=arguments[3],window.$pres=arguments[4]}),Strophe.Request=function(elem,func,rid,sends){this.id=++Strophe._requestId,this.xmlData=elem,this.data=Strophe.serialize(elem),this.origFunc=func,this.func=func,this.rid=rid,this.date=0/0,this.sends=sends||0,this.abort=!1,this.dead=null,this.age=function(){if(!this.date)return 0;var now=new Date;return(now-this.date)/1e3},this.timeDead=function(){if(!this.dead)return 0;var now=new Date;return(now-this.dead)/1e3},this.xhr=this._newXHR()},Strophe.Request.prototype={getResponse:function(){var node=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){if(node=this.xhr.responseXML.documentElement,"parsererror"==node.tagName)throw Strophe.error("invalid response received"),Strophe.error("responseText: "+this.xhr.responseText),Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML)),"parsererror"}else this.xhr.responseText&&(Strophe.error("invalid response received"),Strophe.error("responseText: "+this.xhr.responseText),Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML)));return node},_newXHR:function(){var xhr=null;return window.XMLHttpRequest?(xhr=new XMLHttpRequest,xhr.overrideMimeType&&xhr.overrideMimeType("text/xml")):window.ActiveXObject&&(xhr=new ActiveXObject("Microsoft.XMLHTTP")),xhr.onreadystatechange=this.func.bind(null,this),xhr}},Strophe.Bosh=function(connection){this._conn=connection,this.rid=Math.floor(4294967295*Math.random()),this.sid=null,this.hold=1,this.wait=60,this.window=5,this._requests=[]},Strophe.Bosh.prototype={strip:null,_buildBody:function(){var bodyWrap=$build("body",{rid:this.rid++,xmlns:Strophe.NS.HTTPBIND});return null!==this.sid&&bodyWrap.attrs({sid:this.sid}),bodyWrap},_reset:function(){this.rid=Math.floor(4294967295*Math.random()),this.sid=null,jQuery(document).trigger("ridChange",{rid:this.rid})},_connect:function(wait,hold,route){this.wait=wait||this.wait,this.hold=hold||this.hold;var body=this._buildBody().attrs({to:this._conn.domain,"xml:lang":"en",wait:this.wait,hold:this.hold,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":Strophe.NS.BOSH});route&&body.attrs({route:route});var _connect_cb=this._conn._connect_cb;this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,_connect_cb.bind(this._conn)),body.tree().getAttribute("rid"))),this._throttledRequestHandler()},_attach:function(jid,sid,rid,callback,wait,hold,wind){this._conn.jid=jid,this.sid=sid,this.rid=rid,this._conn.connect_callback=callback,this._conn.domain=Strophe.getDomainFromJid(this._conn.jid),this._conn.authenticated=!0,this._conn.connected=!0,this.wait=wait||this.wait,this.hold=hold||this.hold,this.window=wind||this.window,this._conn._changeConnectStatus(Strophe.Status.ATTACHED,null)},_connect_cb:function(bodyWrap){var cond,conflict,typ=bodyWrap.getAttribute("type");if(null!==typ&&"terminate"==typ)return Strophe.error("BOSH-Connection failed: "+cond),cond=bodyWrap.getAttribute("condition"),conflict=bodyWrap.getElementsByTagName("conflict"),null!==cond?("remote-stream-error"==cond&&conflict.length>0&&(cond="conflict"),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,cond)):this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"unknown"),this._conn._doDisconnect(),Strophe.Status.CONNFAIL;this.sid||(this.sid=bodyWrap.getAttribute("sid"));var wind=bodyWrap.getAttribute("requests");wind&&(this.window=parseInt(wind,10));var hold=bodyWrap.getAttribute("hold");hold&&(this.hold=parseInt(hold,10));var wait=bodyWrap.getAttribute("wait");wait&&(this.wait=parseInt(wait,10))},_disconnect:function(pres){this._sendTerminate(pres)},_doDisconnect:function(){this.sid=null,this.rid=Math.floor(4294967295*Math.random()),jQuery(document).trigger("ridChange",{rid:this.rid})},_emptyQueue:function(){return 0===this._requests.length},_hitError:function(reqStatus){this.errors++,Strophe.warn("request errored, status: "+reqStatus+", number of errors: "+this.errors),this.errors>4&&this._onDisconnectTimeout()},_no_auth_received:function(_callback){_callback=_callback?_callback.bind(this._conn):this._conn._connect_cb.bind(this._conn);var body=this._buildBody();this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,_callback.bind(this._conn)),body.tree().getAttribute("rid"))),this._throttledRequestHandler()},_onDisconnectTimeout:function(){for(var req;this._requests.length>0;)req=this._requests.pop(),req.abort=!0,req.xhr.abort(),req.xhr.onreadystatechange=function(){}},_onIdle:function(){var data=this._conn._data;if(this._conn.authenticated&&0===this._requests.length&&0===data.length&&!this._conn.disconnecting&&(Strophe.info("no requests during idle cycle, sending blank request"),data.push(null)),this._requests.length<2&&data.length>0&&!this._conn.paused){for(var body=this._buildBody(),i=0;i<data.length;i++)null!==data[i]&&("restart"===data[i]?body.attrs({to:this._conn.domain,"xml:lang":"en","xmpp:restart":"true","xmlns:xmpp":Strophe.NS.BOSH}):body.cnode(data[i]).up());delete this._conn._data,this._conn._data=[],this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),body.tree().getAttribute("rid"))),this._processRequest(this._requests.length-1)}if(this._requests.length>0){var time_elapsed=this._requests[0].age();null!==this._requests[0].dead&&this._requests[0].timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait)&&this._throttledRequestHandler(),time_elapsed>Math.floor(Strophe.TIMEOUT*this.wait)&&(Strophe.warn("Request "+this._requests[0].id+" timed out, over "+Math.floor(Strophe.TIMEOUT*this.wait)+" seconds since last activity"),this._throttledRequestHandler())}},_onRequestStateChange:function(func,req){if(Strophe.debug("request id "+req.id+"."+req.sends+" state changed to "+req.xhr.readyState),req.abort)return void(req.abort=!1);2==req.xhr.readyState&&jQuery(document).trigger("ridChange",{rid:Number(req.rid)+1});var reqStatus;if(4==req.xhr.readyState){reqStatus=0;try{reqStatus=req.xhr.status}catch(e){}if("undefined"==typeof reqStatus&&(reqStatus=0),this.disconnecting&&reqStatus>=400)return void this._hitError(reqStatus);var reqIs0=this._requests[0]==req,reqIs1=this._requests[1]==req;(reqStatus>0&&500>reqStatus||req.sends>5)&&(this._removeRequest(req),Strophe.debug("request id "+req.id+" should now be removed")),200==reqStatus?((reqIs1||reqIs0&&this._requests.length>0&&this._requests[0].age()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait))&&this._restartRequest(0),Strophe.debug("request id "+req.id+"."+req.sends+" got 200"),func(req),this.errors=0):(Strophe.error("request id "+req.id+"."+req.sends+" error "+reqStatus+" happened"),(0===reqStatus||reqStatus>=400&&600>reqStatus||reqStatus>=12e3)&&(this._hitError(reqStatus),reqStatus>=400&&500>reqStatus&&(this._conn._changeConnectStatus(Strophe.Status.DISCONNECTING,null),this._conn._doDisconnect()))),reqStatus>0&&500>reqStatus||req.sends>5||this._throttledRequestHandler()}},_processRequest:function(i){var self=this,req=this._requests[i],reqStatus=-1;try{4==req.xhr.readyState&&(reqStatus=req.xhr.status)}catch(e){Strophe.error("caught an error in _requests["+i+"], reqStatus: "+reqStatus)}if("undefined"==typeof reqStatus&&(reqStatus=-1),req.sends>this.maxRetries)return void this._onDisconnectTimeout();var time_elapsed=req.age(),primaryTimeout=!isNaN(time_elapsed)&&time_elapsed>Math.floor(Strophe.TIMEOUT*this.wait),secondaryTimeout=null!==req.dead&&req.timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait),requestCompletedWithServerError=4==req.xhr.readyState&&(1>reqStatus||reqStatus>=500);if((primaryTimeout||secondaryTimeout||requestCompletedWithServerError)&&(secondaryTimeout&&Strophe.error("Request "+this._requests[i].id+" timed out (secondary), restarting"),req.abort=!0,req.xhr.abort(),req.xhr.onreadystatechange=function(){},this._requests[i]=new Strophe.Request(req.xmlData,req.origFunc,req.rid,req.sends),req=this._requests[i]),0===req.xhr.readyState){Strophe.debug("request id "+req.id+"."+req.sends+" posting");try{req.xhr.open("POST",this._conn.service,this._conn.options.sync?!1:!0)}catch(e2){return Strophe.error("XHR open failed."),this._conn.connected||this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"bad-service"),void this._conn.disconnect()}var sendFunc=function(){if(req.date=new Date,self._conn.options.customHeaders){var headers=self._conn.options.customHeaders;for(var header in headers)headers.hasOwnProperty(header)&&req.xhr.setRequestHeader(header,headers[header])}req.xhr.send(req.data)};if(req.sends>1){var backoff=1e3*Math.min(Math.floor(Strophe.TIMEOUT*this.wait),Math.pow(req.sends,3));setTimeout(sendFunc,backoff)}else sendFunc();req.sends++,this._conn.xmlOutput!==Strophe.Connection.prototype.xmlOutput&&this._conn.xmlOutput(req.xmlData.nodeName===this.strip&&req.xmlData.childNodes.length?req.xmlData.childNodes[0]:req.xmlData),this._conn.rawOutput!==Strophe.Connection.prototype.rawOutput&&this._conn.rawOutput(req.data)}else Strophe.debug("_processRequest: "+(0===i?"first":"second")+" request has readyState of "+req.xhr.readyState)},_removeRequest:function(req){Strophe.debug("removing request");var i;for(i=this._requests.length-1;i>=0;i--)req==this._requests[i]&&this._requests.splice(i,1);req.xhr.onreadystatechange=function(){},this._throttledRequestHandler()},_restartRequest:function(i){var req=this._requests[i];null===req.dead&&(req.dead=new Date),this._processRequest(i)},_reqToData:function(req){try{return req.getResponse()}catch(e){if("parsererror"!=e)throw e;this._conn.disconnect("strophe-parsererror")}},_sendTerminate:function(pres){Strophe.info("_sendTerminate was called");var body=this._buildBody().attrs({type:"terminate"});pres&&body.cnode(pres.tree());var req=new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),body.tree().getAttribute("rid"));this._requests.push(req),this._throttledRequestHandler()},_send:function(){clearTimeout(this._conn._idleTimeout),this._throttledRequestHandler(),this._conn._idleTimeout=setTimeout(this._conn._onIdle.bind(this._conn),100)},_sendRestart:function(){this._throttledRequestHandler(),clearTimeout(this._conn._idleTimeout)},_throttledRequestHandler:function(){Strophe.debug(this._requests?"_throttledRequestHandler called with "+this._requests.length+" requests":"_throttledRequestHandler called with undefined requests"),this._requests&&0!==this._requests.length&&(this._requests.length>0&&this._processRequest(0),this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)<this.window&&this._processRequest(1))}},Strophe.Websocket=function(connection){this._conn=connection,this.strip="stream:stream";var service=connection.service;if(0!==service.indexOf("ws:")&&0!==service.indexOf("wss:")){var new_service="";new_service+="ws"===connection.options.protocol&&"https:"!==window.location.protocol?"ws":"wss",new_service+="://"+window.location.host,new_service+=0!==service.indexOf("/")?window.location.pathname+service:service,connection.service=new_service}},Strophe.Websocket.prototype={_buildStream:function(){return $build("stream:stream",{to:this._conn.domain,xmlns:Strophe.NS.CLIENT,"xmlns:stream":Strophe.NS.STREAM,version:"1.0"})},_check_streamerror:function(bodyWrap,connectstatus){var errors=bodyWrap.getElementsByTagName("stream:error");if(0===errors.length)return!1;for(var error=errors[0],condition="",text="",ns="urn:ietf:params:xml:ns:xmpp-streams",i=0;i<error.childNodes.length;i++){var e=error.childNodes[i];if(e.getAttribute("xmlns")!==ns)break;"text"===e.nodeName?text=e.textContent:condition=e.nodeName}var errorString="WebSocket stream error: ";return errorString+=condition?condition:"unknown",text&&(errorString+=" - "+condition),Strophe.error(errorString),this._conn._changeConnectStatus(connectstatus,condition),this._conn._doDisconnect(),!0},_reset:function(){},_connect:function(){this._closeSocket(),this.socket=new WebSocket(this._conn.service,"xmpp"),this.socket.onopen=this._onOpen.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this.socket.onmessage=this._connect_cb_wrapper.bind(this)},_connect_cb:function(bodyWrap){var error=this._check_streamerror(bodyWrap,Strophe.Status.CONNFAIL);return error?Strophe.Status.CONNFAIL:void 0},_handleStreamStart:function(message){var error=!1,ns=message.getAttribute("xmlns");"string"!=typeof ns?error="Missing xmlns in stream:stream":ns!==Strophe.NS.CLIENT&&(error="Wrong xmlns in stream:stream: "+ns);var ns_stream=message.namespaceURI;"string"!=typeof ns_stream?error="Missing xmlns:stream in stream:stream":ns_stream!==Strophe.NS.STREAM&&(error="Wrong xmlns:stream in stream:stream: "+ns_stream);var ver=message.getAttribute("version");return"string"!=typeof ver?error="Missing version in stream:stream":"1.0"!==ver&&(error="Wrong version in stream:stream: "+ver),error?(this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,error),this._conn._doDisconnect(),!1):!0},_connect_cb_wrapper:function(message){if(0===message.data.indexOf("<stream:stream ")||0===message.data.indexOf("<?xml")){var data=message.data.replace(/^(<\?.*?\?>\s*)*/,"");if(""===data)return;data=message.data.replace(/<stream:stream (.*[^\/])>/,"<stream:stream $1/>");var streamStart=(new DOMParser).parseFromString(data,"text/xml").documentElement;this._conn.xmlInput(streamStart),this._conn.rawInput(message.data),this._handleStreamStart(streamStart)&&(this._connect_cb(streamStart),this.streamStart=message.data.replace(/^<stream:(.*)\/>$/,"<stream:$1>"))}else{if("</stream:stream>"===message.data)return this._conn.rawInput(message.data),this._conn.xmlInput(document.createElement("stream:stream")),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"Received closing stream"),void this._conn._doDisconnect();var string=this._streamWrap(message.data),elem=(new DOMParser).parseFromString(string,"text/xml").documentElement;this.socket.onmessage=this._onMessage.bind(this),this._conn._connect_cb(elem,null,message.data)}},_disconnect:function(pres){if(this.socket.readyState!==WebSocket.CLOSED){pres&&this._conn.send(pres);var close="</stream:stream>";this._conn.xmlOutput(document.createElement("stream:stream")),this._conn.rawOutput(close);try{this.socket.send(close)}catch(e){Strophe.info("Couldn't send closing stream tag.")}}this._conn._doDisconnect()},_doDisconnect:function(){Strophe.info("WebSockets _doDisconnect was called"),this._closeSocket()},_streamWrap:function(stanza){return this.streamStart+stanza+"</stream:stream>"},_closeSocket:function(){if(this.socket)try{this.socket.close()}catch(e){}this.socket=null},_emptyQueue:function(){return!0},_onClose:function(){this._conn.connected&&!this._conn.disconnecting?(Strophe.error("Websocket closed unexcectedly"),this._conn._doDisconnect()):Strophe.info("Websocket closed")},_no_auth_received:function(_callback){Strophe.error("Server did not send any auth methods"),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"Server did not send any auth methods"),_callback&&(_callback=_callback.bind(this._conn))(),this._conn._doDisconnect()},_onDisconnectTimeout:function(){},_onError:function(error){Strophe.error("Websocket error "+error),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"The WebSocket connection could not be established was disconnected."),this._disconnect()},_onIdle:function(){var data=this._conn._data;if(data.length>0&&!this._conn.paused){for(var i=0;i<data.length;i++)if(null!==data[i]){var stanza,rawStanza;"restart"===data[i]?(stanza=this._buildStream(),rawStanza=this._removeClosingTag(stanza),stanza=stanza.tree()):(stanza=data[i],rawStanza=Strophe.serialize(stanza)),this._conn.xmlOutput(stanza),this._conn.rawOutput(rawStanza),this.socket.send(rawStanza)}this._conn._data=[]}},_onMessage:function(message){var elem,data;if("</stream:stream>"===message.data){var close="</stream:stream>";return this._conn.rawInput(close),this._conn.xmlInput(document.createElement("stream:stream")),void(this._conn.disconnecting||this._conn._doDisconnect())}if(0===message.data.search("<stream:stream ")){if(data=message.data.replace(/<stream:stream (.*[^\/])>/,"<stream:stream $1/>"),elem=(new DOMParser).parseFromString(data,"text/xml").documentElement,!this._handleStreamStart(elem))return}else data=this._streamWrap(message.data),elem=(new DOMParser).parseFromString(data,"text/xml").documentElement;if(!this._check_streamerror(elem,Strophe.Status.ERROR))return this._conn.disconnecting&&"presence"===elem.firstChild.nodeName&&"unavailable"===elem.firstChild.getAttribute("type")?(this._conn.xmlInput(elem),void this._conn.rawInput(Strophe.serialize(elem))):void this._conn._dataRecv(elem,message.data)},_onOpen:function(){Strophe.info("Websocket open");var start=this._buildStream();this._conn.xmlOutput(start.tree());var startString=this._removeClosingTag(start);this._conn.rawOutput(startString),this.socket.send(startString)},_removeClosingTag:function(elem){var string=Strophe.serialize(elem);return string=string.replace(/<(stream:stream .*[^\/])\/>$/,"<$1>")},_reqToData:function(stanza){return stanza},_send:function(){this._conn.flush()},_sendRestart:function(){clearTimeout(this._conn._idleTimeout),this._conn._onIdle.bind(this._conn)()}};/*!
- * Source: build/lib/strophe.muc.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
-var Occupant,RoomConfig,XmppRoom,__bind=function(fn,me){return function(){return fn.apply(me,arguments)}};Strophe.addConnectionPlugin("muc",{_connection:null,rooms:{},roomNames:[],init:function(conn){return this._connection=conn,this._muc_handler=null,Strophe.addNamespace("MUC_OWNER",Strophe.NS.MUC+"#owner"),Strophe.addNamespace("MUC_ADMIN",Strophe.NS.MUC+"#admin"),Strophe.addNamespace("MUC_USER",Strophe.NS.MUC+"#user"),Strophe.addNamespace("MUC_ROOMCONF",Strophe.NS.MUC+"#roomconfig")},join:function(room,nick,msg_handler_cb,pres_handler_cb,roster_cb,password,history_attrs,extended_presence){var msg,room_nick,_ref,_this=this;return room_nick=this.test_append_nick(room,nick),msg=$pres({from:this._connection.jid,to:room_nick}).c("x",{xmlns:Strophe.NS.MUC}),null!=history_attrs&&(msg=msg.c("history",history_attrs).up()),null!=password&&msg.cnode(Strophe.xmlElement("password",[],password)),null!=extended_presence&&msg.up().cnode(extended_presence),null==(_ref=this._muc_handler)&&(this._muc_handler=this._connection.addHandler(function(stanza){var from,handler,handlers,id,roomname,x,xmlns,xquery,_i,_len;if(from=stanza.getAttribute("from"),!from)return!0;if(roomname=from.split("/")[0],!_this.rooms[roomname])return!0;if(room=_this.rooms[roomname],handlers={},"message"===stanza.nodeName)handlers=room._message_handlers;else if("presence"===stanza.nodeName&&(xquery=stanza.getElementsByTagName("x"),xquery.length>0))for(_i=0,_len=xquery.length;_len>_i;_i++)if(x=xquery[_i],xmlns=x.getAttribute("xmlns"),xmlns&&xmlns.match(Strophe.NS.MUC)){handlers=room._presence_handlers;break}for(id in handlers)handler=handlers[id],handler(stanza,room)||delete handlers[id];return!0})),this.rooms.hasOwnProperty(room)||(this.rooms[room]=new XmppRoom(this,room,nick,password),this.roomNames.push(room)),pres_handler_cb&&this.rooms[room].addHandler("presence",pres_handler_cb),msg_handler_cb&&this.rooms[room].addHandler("message",msg_handler_cb),roster_cb&&this.rooms[room].addHandler("roster",roster_cb),this._connection.send(msg)},leave:function(room,nick,handler_cb,exit_msg){var id,presence,presenceid,room_nick;return id=this.roomNames.indexOf(room),delete this.rooms[room],id>=0&&(this.roomNames.splice(id,1),0===this.roomNames.length&&(this._connection.deleteHandler(this._muc_handler),this._muc_handler=null)),room_nick=this.test_append_nick(room,nick),presenceid=this._connection.getUniqueId(),presence=$pres({type:"unavailable",id:presenceid,from:this._connection.jid,to:room_nick}),null!=exit_msg&&presence.c("status",exit_msg),null!=handler_cb&&this._connection.addHandler(handler_cb,null,"presence",null,presenceid),this._connection.send(presence),presenceid},message:function(room,nick,message,html_message,type){var msg,msgid,parent,room_nick;return room_nick=this.test_append_nick(room,nick),type=type||(null!=nick?"chat":"groupchat"),msgid=this._connection.getUniqueId(),msg=$msg({to:room_nick,from:this._connection.jid,type:type,id:msgid}).c("body",{xmlns:Strophe.NS.CLIENT}).t(message),msg.up(),null!=html_message&&(msg.c("html",{xmlns:Strophe.NS.XHTML_IM}).c("body",{xmlns:Strophe.NS.XHTML}).t(html_message),0===msg.node.childNodes.length?(parent=msg.node.parentNode,msg.up().up(),msg.node.removeChild(parent)):msg.up().up()),msg.c("x",{xmlns:"jabber:x:event"}).c("composing"),this._connection.send(msg),msgid},groupchat:function(room,message,html_message){return this.message(room,null,message,html_message)},invite:function(room,receiver,reason){var invitation,msgid;return msgid=this._connection.getUniqueId(),invitation=$msg({from:this._connection.jid,to:room,id:msgid}).c("x",{xmlns:Strophe.NS.MUC_USER}).c("invite",{to:receiver}),null!=reason&&invitation.c("reason",reason),this._connection.send(invitation),msgid},directInvite:function(room,receiver,reason,password){var attrs,invitation,msgid;return msgid=this._connection.getUniqueId(),attrs={xmlns:"jabber:x:conference",jid:room},null!=reason&&(attrs.reason=reason),null!=password&&(attrs.password=password),invitation=$msg({from:this._connection.jid,to:receiver,id:msgid}).c("x",attrs),this._connection.send(invitation),msgid},queryOccupants:function(room,success_cb,error_cb){var attrs,info;return attrs={xmlns:Strophe.NS.DISCO_ITEMS},info=$iq({from:this._connection.jid,to:room,type:"get"}).c("query",attrs),this._connection.sendIQ(info,success_cb,error_cb)},configure:function(room,handler_cb,error_cb){var config,stanza;return config=$iq({to:room,type:"get"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}),stanza=config.tree(),this._connection.sendIQ(stanza,handler_cb,error_cb)},cancelConfigure:function(room){var config,stanza;return config=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("x",{xmlns:"jabber:x:data",type:"cancel"}),stanza=config.tree(),this._connection.sendIQ(stanza)},saveConfiguration:function(room,config,success_cb,error_cb){var conf,iq,stanza,_i,_len;if(iq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}),config instanceof Form)config.type="submit",iq.cnode(config.toXML());else for(iq.c("x",{xmlns:"jabber:x:data",type:"submit"}),_i=0,_len=config.length;_len>_i;_i++)conf=config[_i],iq.cnode(conf).up();return stanza=iq.tree(),this._connection.sendIQ(stanza,success_cb,error_cb)},createInstantRoom:function(room,success_cb,error_cb){var roomiq;return roomiq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("x",{xmlns:"jabber:x:data",type:"submit"}),this._connection.sendIQ(roomiq.tree(),success_cb,error_cb)},setTopic:function(room,topic){var msg;return msg=$msg({to:room,from:this._connection.jid,type:"groupchat"}).c("subject",{xmlns:"jabber:client"}).t(topic),this._connection.send(msg.tree())},_modifyPrivilege:function(room,item,reason,handler_cb,error_cb){var iq;return iq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_ADMIN}).cnode(item.node),null!=reason&&iq.c("reason",reason),this._connection.sendIQ(iq.tree(),handler_cb,error_cb)},modifyRole:function(room,nick,role,reason,handler_cb,error_cb){var item;return item=$build("item",{nick:nick,role:role}),this._modifyPrivilege(room,item,reason,handler_cb,error_cb)},kick:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"none",reason,handler_cb,error_cb)},voice:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"participant",reason,handler_cb,error_cb)},mute:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"visitor",reason,handler_cb,error_cb)},op:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"moderator",reason,handler_cb,error_cb)},deop:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"participant",reason,handler_cb,error_cb)},modifyAffiliation:function(room,jid,affiliation,reason,handler_cb,error_cb){var item;return item=$build("item",{jid:jid,affiliation:affiliation}),this._modifyPrivilege(room,item,reason,handler_cb,error_cb)},ban:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"outcast",reason,handler_cb,error_cb)},member:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"member",reason,handler_cb,error_cb)},revoke:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"none",reason,handler_cb,error_cb)},owner:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"owner",reason,handler_cb,error_cb)},admin:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"admin",reason,handler_cb,error_cb)},changeNick:function(room,user){var presence,room_nick;return room_nick=this.test_append_nick(room,user),presence=$pres({from:this._connection.jid,to:room_nick,id:this._connection.getUniqueId()}),this._connection.send(presence.tree())},setStatus:function(room,user,show,status){var presence,room_nick;return room_nick=this.test_append_nick(room,user),presence=$pres({from:this._connection.jid,to:room_nick}),null!=show&&presence.c("show",show).up(),null!=status&&presence.c("status",status),this._connection.send(presence.tree())},listRooms:function(server,handle_cb,error_cb){var iq;return iq=$iq({to:server,from:this._connection.jid,type:"get"}).c("query",{xmlns:Strophe.NS.DISCO_ITEMS}),this._connection.sendIQ(iq,handle_cb,error_cb)},test_append_nick:function(room,nick){return room+(null!=nick?"/"+Strophe.escapeNode(nick):"")}}),XmppRoom=function(){function XmppRoom(client,name,nick,password){this.client=client,this.name=name,this.nick=nick,this.password=password,this._roomRosterHandler=__bind(this._roomRosterHandler,this),this._addOccupant=__bind(this._addOccupant,this),this.roster={},this._message_handlers={},this._presence_handlers={},this._roster_handlers={},this._handler_ids=0,client.muc&&(this.client=client.muc),this.name=Strophe.getBareJidFromJid(name),this.addHandler("presence",this._roomRosterHandler)}return XmppRoom.prototype.join=function(msg_handler_cb,pres_handler_cb,roster_cb){return this.client.join(this.name,this.nick,msg_handler_cb,pres_handler_cb,roster_cb,this.password)},XmppRoom.prototype.leave=function(handler_cb,message){return this.client.leave(this.name,this.nick,handler_cb,message),delete this.client.rooms[this.name]},XmppRoom.prototype.message=function(nick,message,html_message,type){return this.client.message(this.name,nick,message,html_message,type)},XmppRoom.prototype.groupchat=function(message,html_message){return this.client.groupchat(this.name,message,html_message)},XmppRoom.prototype.invite=function(receiver,reason){return this.client.invite(this.name,receiver,reason)},XmppRoom.prototype.directInvite=function(receiver,reason){return this.client.directInvite(this.name,receiver,reason,this.password)},XmppRoom.prototype.configure=function(handler_cb){return this.client.configure(this.name,handler_cb)},XmppRoom.prototype.cancelConfigure=function(){return this.client.cancelConfigure(this.name)},XmppRoom.prototype.saveConfiguration=function(config){return this.client.saveConfiguration(this.name,config)},XmppRoom.prototype.queryOccupants=function(success_cb,error_cb){return this.client.queryOccupants(this.name,success_cb,error_cb)},XmppRoom.prototype.setTopic=function(topic){return this.client.setTopic(this.name,topic)},XmppRoom.prototype.modifyRole=function(nick,role,reason,success_cb,error_cb){return this.client.modifyRole(this.name,nick,role,reason,success_cb,error_cb)},XmppRoom.prototype.kick=function(nick,reason,handler_cb,error_cb){return this.client.kick(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.voice=function(nick,reason,handler_cb,error_cb){return this.client.voice(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.mute=function(nick,reason,handler_cb,error_cb){return this.client.mute(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.op=function(nick,reason,handler_cb,error_cb){return this.client.op(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.deop=function(nick,reason,handler_cb,error_cb){return this.client.deop(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.modifyAffiliation=function(jid,affiliation,reason,success_cb,error_cb){return this.client.modifyAffiliation(this.name,jid,affiliation,reason,success_cb,error_cb)},XmppRoom.prototype.ban=function(jid,reason,handler_cb,error_cb){return this.client.ban(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.member=function(jid,reason,handler_cb,error_cb){return this.client.member(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.revoke=function(jid,reason,handler_cb,error_cb){return this.client.revoke(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.owner=function(jid,reason,handler_cb,error_cb){return this.client.owner(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.admin=function(jid,reason,handler_cb,error_cb){return this.client.admin(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.changeNick=function(nick){return this.nick=nick,this.client.changeNick(this.name,nick)},XmppRoom.prototype.setStatus=function(show,status){return this.client.setStatus(this.name,this.nick,show,status)},XmppRoom.prototype.addHandler=function(handler_type,handler){var id;switch(id=this._handler_ids++,handler_type){case"presence":this._presence_handlers[id]=handler;break;case"message":this._message_handlers[id]=handler;break;case"roster":this._roster_handlers[id]=handler;break;default:return this._handler_ids--,null}return id},XmppRoom.prototype.removeHandler=function(id){return delete this._presence_handlers[id],delete this._message_handlers[id],delete this._roster_handlers[id]},XmppRoom.prototype._addOccupant=function(data){var occ;return occ=new Occupant(data,this),this.roster[occ.nick]=occ,occ},XmppRoom.prototype._roomRosterHandler=function(pres){var data,handler,id,newnick,nick,_ref;switch(data=XmppRoom._parsePresence(pres),nick=data.nick,newnick=data.newnick||null,data.type){case"error":return;case"unavailable":newnick&&(data.nick=newnick,this.roster[nick]&&this.roster[newnick]&&(this.roster[nick].update(this.roster[newnick]),this.roster[newnick]=this.roster[nick]),this.roster[nick]&&!this.roster[newnick]&&(this.roster[newnick]=this.roster[nick].update(data))),delete this.roster[nick];break;default:this.roster[nick]?this.roster[nick].update(data):this._addOccupant(data)}_ref=this._roster_handlers;for(id in _ref)handler=_ref[id],handler(this.roster,this)||delete this._roster_handlers[id];return!0},XmppRoom._parsePresence=function(pres){var a,c,c2,data,_i,_j,_len,_len1,_ref,_ref1,_ref2,_ref3,_ref4,_ref5,_ref6,_ref7;for(data={},a=pres.attributes,data.nick=Strophe.getResourceFromJid(a.from.textContent),data.type=(null!=(_ref=a.type)?_ref.textContent:void 0)||null,data.states=[],_ref1=pres.childNodes,_i=0,_len=_ref1.length;_len>_i;_i++)switch(c=_ref1[_i],c.nodeName){case"status":data.status=c.textContent||null;break;case"show":data.show=c.textContent||null;break;case"x":if(a=c.attributes,(null!=(_ref2=a.xmlns)?_ref2.textContent:void 0)===Strophe.NS.MUC_USER)for(_ref3=c.childNodes,_j=0,_len1=_ref3.length;_len1>_j;_j++)switch(c2=_ref3[_j],c2.nodeName){case"item":a=c2.attributes,data.affiliation=(null!=(_ref4=a.affiliation)?_ref4.textContent:void 0)||null,data.role=(null!=(_ref5=a.role)?_ref5.textContent:void 0)||null,data.jid=(null!=(_ref6=a.jid)?_ref6.textContent:void 0)||null,data.newnick=(null!=(_ref7=a.nick)?_ref7.textContent:void 0)||null;break;case"status":c2.attributes.code&&data.states.push(c2.attributes.code.textContent)}}return data},XmppRoom}(),RoomConfig=function(){function RoomConfig(info){this.parse=__bind(this.parse,this),null!=info&&this.parse(info)}return RoomConfig.prototype.parse=function(result){var attr,attrs,child,field,identity,query,_i,_j,_k,_len,_len1,_len2,_ref;for(query=result.getElementsByTagName("query")[0].childNodes,this.identities=[],this.features=[],this.x=[],_i=0,_len=query.length;_len>_i;_i++)switch(child=query[_i],attrs=child.attributes,child.nodeName){case"identity":for(identity={},_j=0,_len1=attrs.length;_len1>_j;_j++)attr=attrs[_j],identity[attr.name]=attr.textContent;this.identities.push(identity);break;case"feature":this.features.push(attrs["var"].textContent);break;case"x":if(attrs=child.childNodes[0].attributes,"FORM_TYPE"===!attrs["var"].textContent||"hidden"===!attrs.type.textContent)break;for(_ref=child.childNodes,_k=0,_len2=_ref.length;_len2>_k;_k++)field=_ref[_k],field.attributes.type||(attrs=field.attributes,this.x.push({"var":attrs["var"].textContent,label:attrs.label.textContent||"",value:field.firstChild.textContent||""}))}return{identities:this.identities,features:this.features,x:this.x}},RoomConfig}(),Occupant=function(){function Occupant(data,room){this.room=room,this.update=__bind(this.update,this),this.admin=__bind(this.admin,this),this.owner=__bind(this.owner,this),this.revoke=__bind(this.revoke,this),this.member=__bind(this.member,this),this.ban=__bind(this.ban,this),this.modifyAffiliation=__bind(this.modifyAffiliation,this),this.deop=__bind(this.deop,this),this.op=__bind(this.op,this),this.mute=__bind(this.mute,this),this.voice=__bind(this.voice,this),this.kick=__bind(this.kick,this),this.modifyRole=__bind(this.modifyRole,this),this.update(data)}return Occupant.prototype.modifyRole=function(role,reason,success_cb,error_cb){return this.room.modifyRole(this.nick,role,reason,success_cb,error_cb)},Occupant.prototype.kick=function(reason,handler_cb,error_cb){return this.room.kick(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.voice=function(reason,handler_cb,error_cb){return this.room.voice(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.mute=function(reason,handler_cb,error_cb){return this.room.mute(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.op=function(reason,handler_cb,error_cb){return this.room.op(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.deop=function(reason,handler_cb,error_cb){return this.room.deop(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.modifyAffiliation=function(affiliation,reason,success_cb,error_cb){return this.room.modifyAffiliation(this.jid,affiliation,reason,success_cb,error_cb)},Occupant.prototype.ban=function(reason,handler_cb,error_cb){return this.room.ban(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.member=function(reason,handler_cb,error_cb){return this.room.member(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.revoke=function(reason,handler_cb,error_cb){return this.room.revoke(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.owner=function(reason,handler_cb,error_cb){return this.room.owner(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.admin=function(reason,handler_cb,error_cb){return this.room.admin(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.update=function(data){return this.nick=data.nick||null,this.affiliation=data.affiliation||null,this.role=data.role||null,this.jid=data.jid||null,this.status=data.status||null,this.show=data.show||null,this},Occupant}(),/*!
- * Source: build/lib/strophe.disco.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
-Strophe.addConnectionPlugin("disco",{_connection:null,_identities:[],_features:[],_items:[],init:function(conn){this._connection=conn,this._identities=[],this._features=[],this._items=[],conn.addHandler(this._onDiscoInfo.bind(this),Strophe.NS.DISCO_INFO,"iq","get",null,null),conn.addHandler(this._onDiscoItems.bind(this),Strophe.NS.DISCO_ITEMS,"iq","get",null,null)},addIdentity:function(category,type,name,lang){for(var i=0;i<this._identities.length;i++)if(this._identities[i].category==category&&this._identities[i].type==type&&this._identities[i].name==name&&this._identities[i].lang==lang)return!1;return this._identities.push({category:category,type:type,name:name,lang:lang}),!0},addFeature:function(var_name){for(var i=0;i<this._features.length;i++)if(this._features[i]==var_name)return!1;return this._features.push(var_name),!0},removeFeature:function(var_name){for(var i=0;i<this._features.length;i++)if(this._features[i]===var_name)return this._features.splice(i,1),!0;return!1},addItem:function(jid,name,node,call_back){return node&&!call_back?!1:(this._items.push({jid:jid,name:name,node:node,call_back:call_back}),!0)},info:function(jid,node,success,error,timeout){var attrs={xmlns:Strophe.NS.DISCO_INFO};node&&(attrs.node=node);var info=$iq({from:this._connection.jid,to:jid,type:"get"}).c("query",attrs);this._connection.sendIQ(info,success,error,timeout)},items:function(jid,node,success,error,timeout){var attrs={xmlns:Strophe.NS.DISCO_ITEMS};node&&(attrs.node=node);var items=$iq({from:this._connection.jid,to:jid,type:"get"}).c("query",attrs);this._connection.sendIQ(items,success,error,timeout)},_buildIQResult:function(stanza,query_attrs){var id=stanza.getAttribute("id"),from=stanza.getAttribute("from"),iqresult=$iq({type:"result",id:id});return null!==from&&iqresult.attrs({to:from}),iqresult.c("query",query_attrs)},_onDiscoInfo:function(stanza){var node=stanza.getElementsByTagName("query")[0].getAttribute("node"),attrs={xmlns:Strophe.NS.DISCO_INFO};node&&(attrs.node=node);for(var iqresult=this._buildIQResult(stanza,attrs),i=0;i<this._identities.length;i++){var attrs={category:this._identities[i].category,type:this._identities[i].type};this._identities[i].name&&(attrs.name=this._identities[i].name),this._identities[i].lang&&(attrs["xml:lang"]=this._identities[i].lang),iqresult.c("identity",attrs).up()}for(var i=0;i<this._features.length;i++)iqresult.c("feature",{"var":this._features[i]}).up();return this._connection.send(iqresult.tree()),!0},_onDiscoItems:function(stanza){var query_attrs={xmlns:Strophe.NS.DISCO_ITEMS},node=stanza.getElementsByTagName("query")[0].getAttribute("node");if(node){query_attrs.node=node;for(var items=[],i=0;i<this._items.length;i++)if(this._items[i].node==node){items=this._items[i].call_back(stanza);break}}else var items=this._items;for(var iqresult=this._buildIQResult(stanza,query_attrs),i=0;i<items.length;i++){var attrs={jid:items[i].jid};items[i].name&&(attrs.name=items[i].name),items[i].node&&(attrs.node=items[i].node),iqresult.c("item",attrs).up()}return this._connection.send(iqresult.tree()),!0}}),/*!
- * Source: build/lib/strophe.caps.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
-/**
+}.bind(this),responseText},Strophe.Connection.prototype.mechanisms[Strophe.SASLMD5.prototype.name]=Strophe.SASLMD5}(function(){window.Strophe=arguments[0],window.$build=arguments[1],window.$msg=arguments[2],window.$iq=arguments[3],window.$pres=arguments[4]}),Strophe.Request=function(elem,func,rid,sends){this.id=++Strophe._requestId,this.xmlData=elem,this.data=Strophe.serialize(elem),this.origFunc=func,this.func=func,this.rid=rid,this.date=0/0,this.sends=sends||0,this.abort=!1,this.dead=null,this.age=function(){if(!this.date)return 0;var now=new Date;return(now-this.date)/1e3},this.timeDead=function(){if(!this.dead)return 0;var now=new Date;return(now-this.dead)/1e3},this.xhr=this._newXHR()},Strophe.Request.prototype={getResponse:function(){var node=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){if(node=this.xhr.responseXML.documentElement,"parsererror"==node.tagName)throw Strophe.error("invalid response received"),Strophe.error("responseText: "+this.xhr.responseText),Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML)),"parsererror"}else this.xhr.responseText&&(Strophe.error("invalid response received"),Strophe.error("responseText: "+this.xhr.responseText),Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML)));return node},_newXHR:function(){var xhr=null;return window.XMLHttpRequest?(xhr=new XMLHttpRequest,xhr.overrideMimeType&&xhr.overrideMimeType("text/xml")):window.ActiveXObject&&(xhr=new ActiveXObject("Microsoft.XMLHTTP")),xhr.onreadystatechange=this.func.bind(null,this),xhr}},Strophe.Bosh=function(connection){this._conn=connection,this.rid=Math.floor(4294967295*Math.random()),this.sid=null,this.hold=1,this.wait=60,this.window=5,this._requests=[]},Strophe.Bosh.prototype={strip:null,_buildBody:function(){var bodyWrap=$build("body",{rid:this.rid++,xmlns:Strophe.NS.HTTPBIND});return null!==this.sid&&bodyWrap.attrs({sid:this.sid}),bodyWrap},_reset:function(){this.rid=Math.floor(4294967295*Math.random()),this.sid=null,jQuery(document).trigger("ridChange",{rid:this.rid})},_connect:function(wait,hold,route){this.wait=wait||this.wait,this.hold=hold||this.hold;var body=this._buildBody().attrs({to:this._conn.domain,"xml:lang":"en",wait:this.wait,hold:this.hold,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":Strophe.NS.BOSH});route&&body.attrs({route:route});var _connect_cb=this._conn._connect_cb;this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,_connect_cb.bind(this._conn)),body.tree().getAttribute("rid"))),this._throttledRequestHandler()},_attach:function(jid,sid,rid,callback,wait,hold,wind){this._conn.jid=jid,this.sid=sid,this.rid=rid,this._conn.connect_callback=callback,this._conn.domain=Strophe.getDomainFromJid(this._conn.jid),this._conn.authenticated=!0,this._conn.connected=!0,this.wait=wait||this.wait,this.hold=hold||this.hold,this.window=wind||this.window,this._conn._changeConnectStatus(Strophe.Status.ATTACHED,null)},_connect_cb:function(bodyWrap){var cond,conflict,typ=bodyWrap.getAttribute("type");if(null!==typ&&"terminate"==typ)return Strophe.error("BOSH-Connection failed: "+cond),cond=bodyWrap.getAttribute("condition"),conflict=bodyWrap.getElementsByTagName("conflict"),null!==cond?("remote-stream-error"==cond&&conflict.length>0&&(cond="conflict"),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,cond)):this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"unknown"),this._conn._doDisconnect(),Strophe.Status.CONNFAIL;this.sid||(this.sid=bodyWrap.getAttribute("sid"));var wind=bodyWrap.getAttribute("requests");wind&&(this.window=parseInt(wind,10));var hold=bodyWrap.getAttribute("hold");hold&&(this.hold=parseInt(hold,10));var wait=bodyWrap.getAttribute("wait");wait&&(this.wait=parseInt(wait,10))},_disconnect:function(pres){this._sendTerminate(pres)},_doDisconnect:function(){this.sid=null,this.rid=Math.floor(4294967295*Math.random()),jQuery(document).trigger("ridChange",{rid:this.rid})},_emptyQueue:function(){return 0===this._requests.length},_hitError:function(reqStatus){this.errors++,Strophe.warn("request errored, status: "+reqStatus+", number of errors: "+this.errors),this.errors>4&&this._onDisconnectTimeout()},_no_auth_received:function(_callback){_callback=_callback?_callback.bind(this._conn):this._conn._connect_cb.bind(this._conn);var body=this._buildBody();this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,_callback.bind(this._conn)),body.tree().getAttribute("rid"))),this._throttledRequestHandler()},_onDisconnectTimeout:function(){for(var req;this._requests.length>0;)req=this._requests.pop(),req.abort=!0,req.xhr.abort(),req.xhr.onreadystatechange=function(){}},_onIdle:function(){var data=this._conn._data;if(this._conn.authenticated&&0===this._requests.length&&0===data.length&&!this._conn.disconnecting&&(Strophe.info("no requests during idle cycle, sending blank request"),data.push(null)),this._requests.length<2&&data.length>0&&!this._conn.paused){for(var body=this._buildBody(),i=0;i<data.length;i++)null!==data[i]&&("restart"===data[i]?body.attrs({to:this._conn.domain,"xml:lang":"en","xmpp:restart":"true","xmlns:xmpp":Strophe.NS.BOSH}):body.cnode(data[i]).up());delete this._conn._data,this._conn._data=[],this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),body.tree().getAttribute("rid"))),this._processRequest(this._requests.length-1)}if(this._requests.length>0){var time_elapsed=this._requests[0].age();null!==this._requests[0].dead&&this._requests[0].timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait)&&this._throttledRequestHandler(),time_elapsed>Math.floor(Strophe.TIMEOUT*this.wait)&&(Strophe.warn("Request "+this._requests[0].id+" timed out, over "+Math.floor(Strophe.TIMEOUT*this.wait)+" seconds since last activity"),this._throttledRequestHandler())}},_onRequestStateChange:function(func,req){if(Strophe.debug("request id "+req.id+"."+req.sends+" state changed to "+req.xhr.readyState),req.abort)return void(req.abort=!1);2==req.xhr.readyState&&jQuery(document).trigger("ridChange",{rid:Number(req.rid)+1});var reqStatus;if(4==req.xhr.readyState){reqStatus=0;try{reqStatus=req.xhr.status}catch(e){}if("undefined"==typeof reqStatus&&(reqStatus=0),this.disconnecting&&reqStatus>=400)return void this._hitError(reqStatus);var reqIs0=this._requests[0]==req,reqIs1=this._requests[1]==req;(reqStatus>0&&500>reqStatus||req.sends>5)&&(this._removeRequest(req),Strophe.debug("request id "+req.id+" should now be removed")),200==reqStatus?((reqIs1||reqIs0&&this._requests.length>0&&this._requests[0].age()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait))&&this._restartRequest(0),Strophe.debug("request id "+req.id+"."+req.sends+" got 200"),func(req),this.errors=0):(Strophe.error("request id "+req.id+"."+req.sends+" error "+reqStatus+" happened"),(0===reqStatus||reqStatus>=400&&600>reqStatus||reqStatus>=12e3)&&(this._hitError(reqStatus),reqStatus>=400&&500>reqStatus&&(this._conn._changeConnectStatus(Strophe.Status.DISCONNECTING,null),this._conn._doDisconnect()))),reqStatus>0&&500>reqStatus||req.sends>5||this._throttledRequestHandler()}},_processRequest:function(i){var self=this,req=this._requests[i],reqStatus=-1;try{4==req.xhr.readyState&&(reqStatus=req.xhr.status)}catch(e){Strophe.error("caught an error in _requests["+i+"], reqStatus: "+reqStatus)}if("undefined"==typeof reqStatus&&(reqStatus=-1),req.sends>this.maxRetries)return void this._onDisconnectTimeout();var time_elapsed=req.age(),primaryTimeout=!isNaN(time_elapsed)&&time_elapsed>Math.floor(Strophe.TIMEOUT*this.wait),secondaryTimeout=null!==req.dead&&req.timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait),requestCompletedWithServerError=4==req.xhr.readyState&&(1>reqStatus||reqStatus>=500);if((primaryTimeout||secondaryTimeout||requestCompletedWithServerError)&&(secondaryTimeout&&Strophe.error("Request "+this._requests[i].id+" timed out (secondary), restarting"),req.abort=!0,req.xhr.abort(),req.xhr.onreadystatechange=function(){},this._requests[i]=new Strophe.Request(req.xmlData,req.origFunc,req.rid,req.sends),req=this._requests[i]),0===req.xhr.readyState){Strophe.debug("request id "+req.id+"."+req.sends+" posting");try{req.xhr.open("POST",this._conn.service,this._conn.options.sync?!1:!0)}catch(e2){return Strophe.error("XHR open failed."),this._conn.connected||this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"bad-service"),void this._conn.disconnect()}var sendFunc=function(){if(req.date=new Date,self._conn.options.customHeaders){var headers=self._conn.options.customHeaders;for(var header in headers)headers.hasOwnProperty(header)&&req.xhr.setRequestHeader(header,headers[header])}req.xhr.send(req.data)};if(req.sends>1){var backoff=1e3*Math.min(Math.floor(Strophe.TIMEOUT*this.wait),Math.pow(req.sends,3));setTimeout(sendFunc,backoff)}else sendFunc();req.sends++,this._conn.xmlOutput!==Strophe.Connection.prototype.xmlOutput&&this._conn.xmlOutput(req.xmlData.nodeName===this.strip&&req.xmlData.childNodes.length?req.xmlData.childNodes[0]:req.xmlData),this._conn.rawOutput!==Strophe.Connection.prototype.rawOutput&&this._conn.rawOutput(req.data)}else Strophe.debug("_processRequest: "+(0===i?"first":"second")+" request has readyState of "+req.xhr.readyState)},_removeRequest:function(req){Strophe.debug("removing request");var i;for(i=this._requests.length-1;i>=0;i--)req==this._requests[i]&&this._requests.splice(i,1);req.xhr.onreadystatechange=function(){},this._throttledRequestHandler()},_restartRequest:function(i){var req=this._requests[i];null===req.dead&&(req.dead=new Date),this._processRequest(i)},_reqToData:function(req){try{return req.getResponse()}catch(e){if("parsererror"!=e)throw e;this._conn.disconnect("strophe-parsererror")}},_sendTerminate:function(pres){Strophe.info("_sendTerminate was called");var body=this._buildBody().attrs({type:"terminate"});pres&&body.cnode(pres.tree());var req=new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),body.tree().getAttribute("rid"));this._requests.push(req),this._throttledRequestHandler()},_send:function(){clearTimeout(this._conn._idleTimeout),this._throttledRequestHandler(),this._conn._idleTimeout=setTimeout(this._conn._onIdle.bind(this._conn),100)},_sendRestart:function(){this._throttledRequestHandler(),clearTimeout(this._conn._idleTimeout)},_throttledRequestHandler:function(){Strophe.debug(this._requests?"_throttledRequestHandler called with "+this._requests.length+" requests":"_throttledRequestHandler called with undefined requests"),this._requests&&0!==this._requests.length&&(this._requests.length>0&&this._processRequest(0),this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)<this.window&&this._processRequest(1))}},Strophe.Websocket=function(connection){this._conn=connection,this.strip="stream:stream";var service=connection.service;if(0!==service.indexOf("ws:")&&0!==service.indexOf("wss:")){var new_service="";new_service+="ws"===connection.options.protocol&&"https:"!==window.location.protocol?"ws":"wss",new_service+="://"+window.location.host,new_service+=0!==service.indexOf("/")?window.location.pathname+service:service,connection.service=new_service}},Strophe.Websocket.prototype={_buildStream:function(){return $build("stream:stream",{to:this._conn.domain,xmlns:Strophe.NS.CLIENT,"xmlns:stream":Strophe.NS.STREAM,version:"1.0"})},_check_streamerror:function(bodyWrap,connectstatus){var errors=bodyWrap.getElementsByTagName("stream:error");if(0===errors.length)return!1;for(var error=errors[0],condition="",text="",ns="urn:ietf:params:xml:ns:xmpp-streams",i=0;i<error.childNodes.length;i++){var e=error.childNodes[i];if(e.getAttribute("xmlns")!==ns)break;"text"===e.nodeName?text=e.textContent:condition=e.nodeName}var errorString="WebSocket stream error: ";return errorString+=condition?condition:"unknown",text&&(errorString+=" - "+condition),Strophe.error(errorString),this._conn._changeConnectStatus(connectstatus,condition),this._conn._doDisconnect(),!0},_reset:function(){},_connect:function(){this._closeSocket(),this.socket=new WebSocket(this._conn.service,"xmpp"),this.socket.onopen=this._onOpen.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this.socket.onmessage=this._connect_cb_wrapper.bind(this)},_connect_cb:function(bodyWrap){var error=this._check_streamerror(bodyWrap,Strophe.Status.CONNFAIL);return error?Strophe.Status.CONNFAIL:void 0},_handleStreamStart:function(message){var error=!1,ns=message.getAttribute("xmlns");"string"!=typeof ns?error="Missing xmlns in stream:stream":ns!==Strophe.NS.CLIENT&&(error="Wrong xmlns in stream:stream: "+ns);var ns_stream=message.namespaceURI;"string"!=typeof ns_stream?error="Missing xmlns:stream in stream:stream":ns_stream!==Strophe.NS.STREAM&&(error="Wrong xmlns:stream in stream:stream: "+ns_stream);var ver=message.getAttribute("version");return"string"!=typeof ver?error="Missing version in stream:stream":"1.0"!==ver&&(error="Wrong version in stream:stream: "+ver),error?(this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,error),this._conn._doDisconnect(),!1):!0},_connect_cb_wrapper:function(message){if(0===message.data.indexOf("<stream:stream ")||0===message.data.indexOf("<?xml")){var data=message.data.replace(/^(<\?.*?\?>\s*)*/,"");if(""===data)return;data=message.data.replace(/<stream:stream (.*[^\/])>/,"<stream:stream $1/>");var streamStart=(new DOMParser).parseFromString(data,"text/xml").documentElement;this._conn.xmlInput(streamStart),this._conn.rawInput(message.data),this._handleStreamStart(streamStart)&&(this._connect_cb(streamStart),this.streamStart=message.data.replace(/^<stream:(.*)\/>$/,"<stream:$1>"))}else{if("</stream:stream>"===message.data)return this._conn.rawInput(message.data),this._conn.xmlInput(document.createElement("stream:stream")),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"Received closing stream"),void this._conn._doDisconnect();var string=this._streamWrap(message.data),elem=(new DOMParser).parseFromString(string,"text/xml").documentElement;this.socket.onmessage=this._onMessage.bind(this),this._conn._connect_cb(elem,null,message.data)}},_disconnect:function(pres){if(this.socket.readyState!==WebSocket.CLOSED){pres&&this._conn.send(pres);var close="</stream:stream>";this._conn.xmlOutput(document.createElement("stream:stream")),this._conn.rawOutput(close);try{this.socket.send(close)}catch(e){Strophe.info("Couldn't send closing stream tag.")}}this._conn._doDisconnect()},_doDisconnect:function(){Strophe.info("WebSockets _doDisconnect was called"),this._closeSocket()},_streamWrap:function(stanza){return this.streamStart+stanza+"</stream:stream>"},_closeSocket:function(){if(this.socket)try{this.socket.close()}catch(e){}this.socket=null},_emptyQueue:function(){return!0},_onClose:function(){this._conn.connected&&!this._conn.disconnecting?(Strophe.error("Websocket closed unexcectedly"),this._conn._doDisconnect()):Strophe.info("Websocket closed")},_no_auth_received:function(_callback){Strophe.error("Server did not send any auth methods"),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"Server did not send any auth methods"),_callback&&(_callback=_callback.bind(this._conn))(),this._conn._doDisconnect()},_onDisconnectTimeout:function(){},_onError:function(error){Strophe.error("Websocket error "+error),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"The WebSocket connection could not be established was disconnected."),this._disconnect()},_onIdle:function(){var data=this._conn._data;if(data.length>0&&!this._conn.paused){for(var i=0;i<data.length;i++)if(null!==data[i]){var stanza,rawStanza;"restart"===data[i]?(stanza=this._buildStream(),rawStanza=this._removeClosingTag(stanza),stanza=stanza.tree()):(stanza=data[i],rawStanza=Strophe.serialize(stanza)),this._conn.xmlOutput(stanza),this._conn.rawOutput(rawStanza),this.socket.send(rawStanza)}this._conn._data=[]}},_onMessage:function(message){var elem,data;if("</stream:stream>"===message.data){var close="</stream:stream>";return this._conn.rawInput(close),this._conn.xmlInput(document.createElement("stream:stream")),void(this._conn.disconnecting||this._conn._doDisconnect())}if(0===message.data.search("<stream:stream ")){if(data=message.data.replace(/<stream:stream (.*[^\/])>/,"<stream:stream $1/>"),elem=(new DOMParser).parseFromString(data,"text/xml").documentElement,!this._handleStreamStart(elem))return}else data=this._streamWrap(message.data),elem=(new DOMParser).parseFromString(data,"text/xml").documentElement;if(!this._check_streamerror(elem,Strophe.Status.ERROR))return this._conn.disconnecting&&"presence"===elem.firstChild.nodeName&&"unavailable"===elem.firstChild.getAttribute("type")?(this._conn.xmlInput(elem),void this._conn.rawInput(Strophe.serialize(elem))):void this._conn._dataRecv(elem,message.data)},_onOpen:function(){Strophe.info("Websocket open");var start=this._buildStream();this._conn.xmlOutput(start.tree());var startString=this._removeClosingTag(start);this._conn.rawOutput(startString),this.socket.send(startString)},_removeClosingTag:function(elem){var string=Strophe.serialize(elem);return string=string.replace(/<(stream:stream .*[^\/])\/>$/,"<$1>")},_reqToData:function(stanza){return stanza},_send:function(){this._conn.flush()},_sendRestart:function(){clearTimeout(this._conn._idleTimeout),this._conn._onIdle.bind(this._conn)()}};var Occupant,RoomConfig,XmppRoom,__bind=function(fn,me){return function(){return fn.apply(me,arguments)}};Strophe.addConnectionPlugin("muc",{_connection:null,rooms:{},roomNames:[],init:function(conn){return this._connection=conn,this._muc_handler=null,Strophe.addNamespace("MUC_OWNER",Strophe.NS.MUC+"#owner"),Strophe.addNamespace("MUC_ADMIN",Strophe.NS.MUC+"#admin"),Strophe.addNamespace("MUC_USER",Strophe.NS.MUC+"#user"),Strophe.addNamespace("MUC_ROOMCONF",Strophe.NS.MUC+"#roomconfig")},join:function(room,nick,msg_handler_cb,pres_handler_cb,roster_cb,password,history_attrs,extended_presence){var msg,room_nick,_ref,_this=this;return room_nick=this.test_append_nick(room,nick),msg=$pres({from:this._connection.jid,to:room_nick}).c("x",{xmlns:Strophe.NS.MUC}),null!=history_attrs&&(msg=msg.c("history",history_attrs).up()),null!=password&&msg.cnode(Strophe.xmlElement("password",[],password)),null!=extended_presence&&msg.up().cnode(extended_presence),null==(_ref=this._muc_handler)&&(this._muc_handler=this._connection.addHandler(function(stanza){var from,handler,handlers,id,roomname,x,xmlns,xquery,_i,_len;if(from=stanza.getAttribute("from"),!from)return!0;if(roomname=from.split("/")[0],!_this.rooms[roomname])return!0;if(room=_this.rooms[roomname],handlers={},"message"===stanza.nodeName)handlers=room._message_handlers;else if("presence"===stanza.nodeName&&(xquery=stanza.getElementsByTagName("x"),xquery.length>0))for(_i=0,_len=xquery.length;_len>_i;_i++)if(x=xquery[_i],xmlns=x.getAttribute("xmlns"),xmlns&&xmlns.match(Strophe.NS.MUC)){handlers=room._presence_handlers;break}for(id in handlers)handler=handlers[id],handler(stanza,room)||delete handlers[id];return!0})),this.rooms.hasOwnProperty(room)||(this.rooms[room]=new XmppRoom(this,room,nick,password),this.roomNames.push(room)),pres_handler_cb&&this.rooms[room].addHandler("presence",pres_handler_cb),msg_handler_cb&&this.rooms[room].addHandler("message",msg_handler_cb),roster_cb&&this.rooms[room].addHandler("roster",roster_cb),this._connection.send(msg)},leave:function(room,nick,handler_cb,exit_msg){var id,presence,presenceid,room_nick;return id=this.roomNames.indexOf(room),delete this.rooms[room],id>=0&&(this.roomNames.splice(id,1),0===this.roomNames.length&&(this._connection.deleteHandler(this._muc_handler),this._muc_handler=null)),room_nick=this.test_append_nick(room,nick),presenceid=this._connection.getUniqueId(),presence=$pres({type:"unavailable",id:presenceid,from:this._connection.jid,to:room_nick}),null!=exit_msg&&presence.c("status",exit_msg),null!=handler_cb&&this._connection.addHandler(handler_cb,null,"presence",null,presenceid),this._connection.send(presence),presenceid},message:function(room,nick,message,html_message,type){var msg,msgid,parent,room_nick;return room_nick=this.test_append_nick(room,nick),type=type||(null!=nick?"chat":"groupchat"),msgid=this._connection.getUniqueId(),msg=$msg({to:room_nick,from:this._connection.jid,type:type,id:msgid}).c("body",{xmlns:Strophe.NS.CLIENT}).t(message),msg.up(),null!=html_message&&(msg.c("html",{xmlns:Strophe.NS.XHTML_IM}).c("body",{xmlns:Strophe.NS.XHTML}).t(html_message),0===msg.node.childNodes.length?(parent=msg.node.parentNode,msg.up().up(),msg.node.removeChild(parent)):msg.up().up()),msg.c("x",{xmlns:"jabber:x:event"}).c("composing"),this._connection.send(msg),msgid},groupchat:function(room,message,html_message){return this.message(room,null,message,html_message)},invite:function(room,receiver,reason){var invitation,msgid;return msgid=this._connection.getUniqueId(),invitation=$msg({from:this._connection.jid,to:room,id:msgid}).c("x",{xmlns:Strophe.NS.MUC_USER}).c("invite",{to:receiver}),null!=reason&&invitation.c("reason",reason),this._connection.send(invitation),msgid},directInvite:function(room,receiver,reason,password){var attrs,invitation,msgid;return msgid=this._connection.getUniqueId(),attrs={xmlns:"jabber:x:conference",jid:room},null!=reason&&(attrs.reason=reason),null!=password&&(attrs.password=password),invitation=$msg({from:this._connection.jid,to:receiver,id:msgid}).c("x",attrs),this._connection.send(invitation),msgid},queryOccupants:function(room,success_cb,error_cb){var attrs,info;return attrs={xmlns:Strophe.NS.DISCO_ITEMS},info=$iq({from:this._connection.jid,to:room,type:"get"}).c("query",attrs),this._connection.sendIQ(info,success_cb,error_cb)},configure:function(room,handler_cb,error_cb){var config,stanza;return config=$iq({to:room,type:"get"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}),stanza=config.tree(),this._connection.sendIQ(stanza,handler_cb,error_cb)},cancelConfigure:function(room){var config,stanza;return config=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("x",{xmlns:"jabber:x:data",type:"cancel"}),stanza=config.tree(),this._connection.sendIQ(stanza)},saveConfiguration:function(room,config,success_cb,error_cb){var conf,iq,stanza,_i,_len;if(iq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}),config instanceof Form)config.type="submit",iq.cnode(config.toXML());else for(iq.c("x",{xmlns:"jabber:x:data",type:"submit"}),_i=0,_len=config.length;_len>_i;_i++)conf=config[_i],iq.cnode(conf).up();return stanza=iq.tree(),this._connection.sendIQ(stanza,success_cb,error_cb)},createInstantRoom:function(room,success_cb,error_cb){var roomiq;return roomiq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("x",{xmlns:"jabber:x:data",type:"submit"}),this._connection.sendIQ(roomiq.tree(),success_cb,error_cb)},setTopic:function(room,topic){var msg;return msg=$msg({to:room,from:this._connection.jid,type:"groupchat"}).c("subject",{xmlns:"jabber:client"}).t(topic),this._connection.send(msg.tree())},_modifyPrivilege:function(room,item,reason,handler_cb,error_cb){var iq;return iq=$iq({to:room,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_ADMIN}).cnode(item.node),null!=reason&&iq.c("reason",reason),this._connection.sendIQ(iq.tree(),handler_cb,error_cb)},modifyRole:function(room,nick,role,reason,handler_cb,error_cb){var item;return item=$build("item",{nick:nick,role:role}),this._modifyPrivilege(room,item,reason,handler_cb,error_cb)},kick:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"none",reason,handler_cb,error_cb)},voice:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"participant",reason,handler_cb,error_cb)},mute:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"visitor",reason,handler_cb,error_cb)},op:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"moderator",reason,handler_cb,error_cb)},deop:function(room,nick,reason,handler_cb,error_cb){return this.modifyRole(room,nick,"participant",reason,handler_cb,error_cb)},modifyAffiliation:function(room,jid,affiliation,reason,handler_cb,error_cb){var item;return item=$build("item",{jid:jid,affiliation:affiliation}),this._modifyPrivilege(room,item,reason,handler_cb,error_cb)},ban:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"outcast",reason,handler_cb,error_cb)},member:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"member",reason,handler_cb,error_cb)},revoke:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"none",reason,handler_cb,error_cb)},owner:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"owner",reason,handler_cb,error_cb)},admin:function(room,jid,reason,handler_cb,error_cb){return this.modifyAffiliation(room,jid,"admin",reason,handler_cb,error_cb)},changeNick:function(room,user){var presence,room_nick;return room_nick=this.test_append_nick(room,user),presence=$pres({from:this._connection.jid,to:room_nick,id:this._connection.getUniqueId()}),this._connection.send(presence.tree())},setStatus:function(room,user,show,status){var presence,room_nick;return room_nick=this.test_append_nick(room,user),presence=$pres({from:this._connection.jid,to:room_nick}),null!=show&&presence.c("show",show).up(),null!=status&&presence.c("status",status),this._connection.send(presence.tree())},listRooms:function(server,handle_cb,error_cb){var iq;return iq=$iq({to:server,from:this._connection.jid,type:"get"}).c("query",{xmlns:Strophe.NS.DISCO_ITEMS}),this._connection.sendIQ(iq,handle_cb,error_cb)},test_append_nick:function(room,nick){return room+(null!=nick?"/"+Strophe.escapeNode(nick):"")}}),XmppRoom=function(){function XmppRoom(client,name,nick,password){this.client=client,this.name=name,this.nick=nick,this.password=password,this._roomRosterHandler=__bind(this._roomRosterHandler,this),this._addOccupant=__bind(this._addOccupant,this),this.roster={},this._message_handlers={},this._presence_handlers={},this._roster_handlers={},this._handler_ids=0,client.muc&&(this.client=client.muc),this.name=Strophe.getBareJidFromJid(name),this.addHandler("presence",this._roomRosterHandler)}return XmppRoom.prototype.join=function(msg_handler_cb,pres_handler_cb,roster_cb){return this.client.join(this.name,this.nick,msg_handler_cb,pres_handler_cb,roster_cb,this.password)},XmppRoom.prototype.leave=function(handler_cb,message){return this.client.leave(this.name,this.nick,handler_cb,message),delete this.client.rooms[this.name]},XmppRoom.prototype.message=function(nick,message,html_message,type){return this.client.message(this.name,nick,message,html_message,type)},XmppRoom.prototype.groupchat=function(message,html_message){return this.client.groupchat(this.name,message,html_message)},XmppRoom.prototype.invite=function(receiver,reason){return this.client.invite(this.name,receiver,reason)},XmppRoom.prototype.directInvite=function(receiver,reason){return this.client.directInvite(this.name,receiver,reason,this.password)},XmppRoom.prototype.configure=function(handler_cb){return this.client.configure(this.name,handler_cb)},XmppRoom.prototype.cancelConfigure=function(){return this.client.cancelConfigure(this.name)},XmppRoom.prototype.saveConfiguration=function(config){return this.client.saveConfiguration(this.name,config)},XmppRoom.prototype.queryOccupants=function(success_cb,error_cb){return this.client.queryOccupants(this.name,success_cb,error_cb)},XmppRoom.prototype.setTopic=function(topic){return this.client.setTopic(this.name,topic)},XmppRoom.prototype.modifyRole=function(nick,role,reason,success_cb,error_cb){return this.client.modifyRole(this.name,nick,role,reason,success_cb,error_cb)},XmppRoom.prototype.kick=function(nick,reason,handler_cb,error_cb){return this.client.kick(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.voice=function(nick,reason,handler_cb,error_cb){return this.client.voice(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.mute=function(nick,reason,handler_cb,error_cb){return this.client.mute(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.op=function(nick,reason,handler_cb,error_cb){return this.client.op(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.deop=function(nick,reason,handler_cb,error_cb){return this.client.deop(this.name,nick,reason,handler_cb,error_cb)},XmppRoom.prototype.modifyAffiliation=function(jid,affiliation,reason,success_cb,error_cb){return this.client.modifyAffiliation(this.name,jid,affiliation,reason,success_cb,error_cb)},XmppRoom.prototype.ban=function(jid,reason,handler_cb,error_cb){return this.client.ban(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.member=function(jid,reason,handler_cb,error_cb){return this.client.member(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.revoke=function(jid,reason,handler_cb,error_cb){return this.client.revoke(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.owner=function(jid,reason,handler_cb,error_cb){return this.client.owner(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.admin=function(jid,reason,handler_cb,error_cb){return this.client.admin(this.name,jid,reason,handler_cb,error_cb)},XmppRoom.prototype.changeNick=function(nick){return this.nick=nick,this.client.changeNick(this.name,nick)},XmppRoom.prototype.setStatus=function(show,status){return this.client.setStatus(this.name,this.nick,show,status)},XmppRoom.prototype.addHandler=function(handler_type,handler){var id;switch(id=this._handler_ids++,handler_type){case"presence":this._presence_handlers[id]=handler;break;case"message":this._message_handlers[id]=handler;break;case"roster":this._roster_handlers[id]=handler;break;default:return this._handler_ids--,null}return id},XmppRoom.prototype.removeHandler=function(id){return delete this._presence_handlers[id],delete this._message_handlers[id],delete this._roster_handlers[id]},XmppRoom.prototype._addOccupant=function(data){var occ;return occ=new Occupant(data,this),this.roster[occ.nick]=occ,occ},XmppRoom.prototype._roomRosterHandler=function(pres){var data,handler,id,newnick,nick,_ref;switch(data=XmppRoom._parsePresence(pres),nick=data.nick,newnick=data.newnick||null,data.type){case"error":return;case"unavailable":newnick&&(data.nick=newnick,this.roster[nick]&&this.roster[newnick]&&(this.roster[nick].update(this.roster[newnick]),this.roster[newnick]=this.roster[nick]),this.roster[nick]&&!this.roster[newnick]&&(this.roster[newnick]=this.roster[nick].update(data))),delete this.roster[nick];break;default:this.roster[nick]?this.roster[nick].update(data):this._addOccupant(data)}_ref=this._roster_handlers;for(id in _ref)handler=_ref[id],handler(this.roster,this)||delete this._roster_handlers[id];return!0},XmppRoom._parsePresence=function(pres){var a,c,c2,data,_i,_j,_len,_len1,_ref,_ref1,_ref2,_ref3,_ref4,_ref5,_ref6,_ref7;for(data={},a=pres.attributes,data.nick=Strophe.getResourceFromJid(a.from.textContent),data.type=(null!=(_ref=a.type)?_ref.textContent:void 0)||null,data.states=[],_ref1=pres.childNodes,_i=0,_len=_ref1.length;_len>_i;_i++)switch(c=_ref1[_i],c.nodeName){case"status":data.status=c.textContent||null;break;case"show":data.show=c.textContent||null;break;case"x":if(a=c.attributes,(null!=(_ref2=a.xmlns)?_ref2.textContent:void 0)===Strophe.NS.MUC_USER)for(_ref3=c.childNodes,_j=0,_len1=_ref3.length;_len1>_j;_j++)switch(c2=_ref3[_j],c2.nodeName){case"item":a=c2.attributes,data.affiliation=(null!=(_ref4=a.affiliation)?_ref4.textContent:void 0)||null,data.role=(null!=(_ref5=a.role)?_ref5.textContent:void 0)||null,data.jid=(null!=(_ref6=a.jid)?_ref6.textContent:void 0)||null,data.newnick=(null!=(_ref7=a.nick)?_ref7.textContent:void 0)||null;break;case"status":c2.attributes.code&&data.states.push(c2.attributes.code.textContent)}}return data
+},XmppRoom}(),RoomConfig=function(){function RoomConfig(info){this.parse=__bind(this.parse,this),null!=info&&this.parse(info)}return RoomConfig.prototype.parse=function(result){var attr,attrs,child,field,identity,query,_i,_j,_k,_len,_len1,_len2,_ref;for(query=result.getElementsByTagName("query")[0].childNodes,this.identities=[],this.features=[],this.x=[],_i=0,_len=query.length;_len>_i;_i++)switch(child=query[_i],attrs=child.attributes,child.nodeName){case"identity":for(identity={},_j=0,_len1=attrs.length;_len1>_j;_j++)attr=attrs[_j],identity[attr.name]=attr.textContent;this.identities.push(identity);break;case"feature":this.features.push(attrs["var"].textContent);break;case"x":if(attrs=child.childNodes[0].attributes,"FORM_TYPE"===!attrs["var"].textContent||"hidden"===!attrs.type.textContent)break;for(_ref=child.childNodes,_k=0,_len2=_ref.length;_len2>_k;_k++)field=_ref[_k],field.attributes.type||(attrs=field.attributes,this.x.push({"var":attrs["var"].textContent,label:attrs.label.textContent||"",value:field.firstChild.textContent||""}))}return{identities:this.identities,features:this.features,x:this.x}},RoomConfig}(),Occupant=function(){function Occupant(data,room){this.room=room,this.update=__bind(this.update,this),this.admin=__bind(this.admin,this),this.owner=__bind(this.owner,this),this.revoke=__bind(this.revoke,this),this.member=__bind(this.member,this),this.ban=__bind(this.ban,this),this.modifyAffiliation=__bind(this.modifyAffiliation,this),this.deop=__bind(this.deop,this),this.op=__bind(this.op,this),this.mute=__bind(this.mute,this),this.voice=__bind(this.voice,this),this.kick=__bind(this.kick,this),this.modifyRole=__bind(this.modifyRole,this),this.update(data)}return Occupant.prototype.modifyRole=function(role,reason,success_cb,error_cb){return this.room.modifyRole(this.nick,role,reason,success_cb,error_cb)},Occupant.prototype.kick=function(reason,handler_cb,error_cb){return this.room.kick(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.voice=function(reason,handler_cb,error_cb){return this.room.voice(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.mute=function(reason,handler_cb,error_cb){return this.room.mute(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.op=function(reason,handler_cb,error_cb){return this.room.op(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.deop=function(reason,handler_cb,error_cb){return this.room.deop(this.nick,reason,handler_cb,error_cb)},Occupant.prototype.modifyAffiliation=function(affiliation,reason,success_cb,error_cb){return this.room.modifyAffiliation(this.jid,affiliation,reason,success_cb,error_cb)},Occupant.prototype.ban=function(reason,handler_cb,error_cb){return this.room.ban(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.member=function(reason,handler_cb,error_cb){return this.room.member(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.revoke=function(reason,handler_cb,error_cb){return this.room.revoke(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.owner=function(reason,handler_cb,error_cb){return this.room.owner(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.admin=function(reason,handler_cb,error_cb){return this.room.admin(this.jid,reason,handler_cb,error_cb)},Occupant.prototype.update=function(data){return this.nick=data.nick||null,this.affiliation=data.affiliation||null,this.role=data.role||null,this.jid=data.jid||null,this.status=data.status||null,this.show=data.show||null,this},Occupant}(),Strophe.addConnectionPlugin("disco",{_connection:null,_identities:[],_features:[],_items:[],init:function(conn){this._connection=conn,this._identities=[],this._features=[],this._items=[],conn.addHandler(this._onDiscoInfo.bind(this),Strophe.NS.DISCO_INFO,"iq","get",null,null),conn.addHandler(this._onDiscoItems.bind(this),Strophe.NS.DISCO_ITEMS,"iq","get",null,null)},addIdentity:function(category,type,name,lang){for(var i=0;i<this._identities.length;i++)if(this._identities[i].category==category&&this._identities[i].type==type&&this._identities[i].name==name&&this._identities[i].lang==lang)return!1;return this._identities.push({category:category,type:type,name:name,lang:lang}),!0},addFeature:function(var_name){for(var i=0;i<this._features.length;i++)if(this._features[i]==var_name)return!1;return this._features.push(var_name),!0},removeFeature:function(var_name){for(var i=0;i<this._features.length;i++)if(this._features[i]===var_name)return this._features.splice(i,1),!0;return!1},addItem:function(jid,name,node,call_back){return node&&!call_back?!1:(this._items.push({jid:jid,name:name,node:node,call_back:call_back}),!0)},info:function(jid,node,success,error,timeout){var attrs={xmlns:Strophe.NS.DISCO_INFO};node&&(attrs.node=node);var info=$iq({from:this._connection.jid,to:jid,type:"get"}).c("query",attrs);this._connection.sendIQ(info,success,error,timeout)},items:function(jid,node,success,error,timeout){var attrs={xmlns:Strophe.NS.DISCO_ITEMS};node&&(attrs.node=node);var items=$iq({from:this._connection.jid,to:jid,type:"get"}).c("query",attrs);this._connection.sendIQ(items,success,error,timeout)},_buildIQResult:function(stanza,query_attrs){var id=stanza.getAttribute("id"),from=stanza.getAttribute("from"),iqresult=$iq({type:"result",id:id});return null!==from&&iqresult.attrs({to:from}),iqresult.c("query",query_attrs)},_onDiscoInfo:function(stanza){var node=stanza.getElementsByTagName("query")[0].getAttribute("node"),attrs={xmlns:Strophe.NS.DISCO_INFO};node&&(attrs.node=node);for(var iqresult=this._buildIQResult(stanza,attrs),i=0;i<this._identities.length;i++){var attrs={category:this._identities[i].category,type:this._identities[i].type};this._identities[i].name&&(attrs.name=this._identities[i].name),this._identities[i].lang&&(attrs["xml:lang"]=this._identities[i].lang),iqresult.c("identity",attrs).up()}for(var i=0;i<this._features.length;i++)iqresult.c("feature",{"var":this._features[i]}).up();return this._connection.send(iqresult.tree()),!0},_onDiscoItems:function(stanza){var query_attrs={xmlns:Strophe.NS.DISCO_ITEMS},node=stanza.getElementsByTagName("query")[0].getAttribute("node");if(node){query_attrs.node=node;for(var items=[],i=0;i<this._items.length;i++)if(this._items[i].node==node){items=this._items[i].call_back(stanza);break}}else var items=this._items;for(var iqresult=this._buildIQResult(stanza,query_attrs),i=0;i<items.length;i++){var attrs={jid:items[i].jid};items[i].name&&(attrs.name=items[i].name),items[i].node&&(attrs.node=items[i].node),iqresult.c("item",attrs).up()}return this._connection.send(iqresult.tree()),!0}}),/**
* Entity Capabilities (XEP-0115)
*
* Depends on disco plugin.
@@ -43,25 +36,17 @@ Strophe.addConnectionPlugin("disco",{_connection:null,_identities:[],_features:[
*
* @license MIT
*/
-function($){Strophe.addConnectionPlugin("caps",{HASH:"sha-1",node:"http://strophe.im/strophejs/",_ver:"",_connection:null,_knownCapabilities:JSON.parse(localStorage.getItem("strophe.caps._knownCapabilities"))||{},_jidVerIndex:JSON.parse(localStorage.getItem("strophe.caps._jidVerIndex"))||{},init:function(conn){if(this._connection=conn,Strophe.addNamespace("CAPS","http://jabber.org/protocol/caps"),!this._connection.disco)throw"Caps plugin requires the disco plugin to be installed.";this._connection.disco.addFeature(Strophe.NS.CAPS),this._connection.addHandler(this._delegateCapabilities.bind(this),Strophe.NS.CAPS)},generateCapsAttrs:function(){return{xmlns:Strophe.NS.CAPS,hash:this.HASH,node:this.node,ver:this.generateVer()}},generateVer:function(){if(""!==this._ver)return this._ver;for(var ver="",identities=this._connection.disco._identities.sort(this._sortIdentities),identitiesLen=identities.length,features=this._connection.disco._features.sort(),featuresLen=features.length,i=0;identitiesLen>i;i++){var curIdent=identities[i];ver+=curIdent.category+"/"+curIdent.type+"/"+curIdent.lang+"/"+curIdent.name+"<"}for(var i=0;featuresLen>i;i++)ver+=features[i]+"<";return this._ver=b64_sha1(ver),this._ver},getCapabilitiesByJid:function(jid){return this._jidVerIndex[jid]?this._knownCapabilities[this._jidVerIndex[jid]]:null},hasFeatureByJid:function(jid,feature){if(this._jidVerIndex[jid]&&null!==feature&&"undefined"!=typeof feature){$.isArray(feature)||(feature=$.makeArray(feature));var i;for(i=0;i<feature.length;i++)if(this._knownCapabilities[this._jidVerIndex[jid]].features.indexOf(feature[i])<0)return!1;return!0}return!1},_delegateCapabilities:function(stanza){var from=stanza.getAttribute("from"),c=stanza.querySelector("c"),ver=c.getAttribute("ver"),node=c.getAttribute("node");return this._knownCapabilities[ver]?(this._jidVerIndex[from]=ver,this._jidVerIndex[from]&&!this._jidVerIndex[from]===ver||(this._jidVerIndex[from]=ver),localStorage.setItem("strophe.caps._jidVerIndex",JSON.stringify(this._jidVerIndex)),$(document).trigger("caps.strophe",[from]),!0):this._requestCapabilities(from,node,ver)},_requestCapabilities:function(to,node,ver){if(to!==this._connection.jid){var id=this._connection.disco.info(to,node+"#"+ver);this._connection.addHandler(this._handleDiscoInfoReply.bind(this),Strophe.NS.DISCO_INFO,"iq","result",id,to)}return!0},_handleDiscoInfoReply:function(stanza){var query=stanza.querySelector("query"),from=stanza.getAttribute("from"),node=query.getAttribute("node"),ver=node?node.split("#")[1]:this._jidVerIndex[from];if(this._knownCapabilities[ver])this._jidVerIndex[from]&&!this._jidVerIndex[from]===ver||(this._jidVerIndex[from]=ver);else{var childNodes=query.childNodes,childNodesLen=childNodes.length;this._knownCapabilities[ver]={features:[],identities:[]};for(var i=0;childNodesLen>i;i++){var node=childNodes[i];"feature"==node.nodeName?this._knownCapabilities[ver].features.push(node.getAttribute("var")):"identity"==node.nodeName?this._knownCapabilities[ver].identities.push(this._attributesToJsObject(node.attributes)):("undefined"==typeof this._knownCapabilities[ver][node.nodeName]&&(this._knownCapabilities[ver][node.nodeName]=[]),this._knownCapabilities[ver][node.nodeName].push(this._attributesToJsObject(node.attributes)))}this._jidVerIndex[from]=ver}return localStorage.setItem("strophe.caps._jidVerIndex",JSON.stringify(this._jidVerIndex)),localStorage.setItem("strophe.caps._knownCapabilities",JSON.stringify(this._knownCapabilities)),$(document).trigger("caps.strophe",[from]),!1},_attributesToJsObject:function(attr){var obj={};for(i=0;i<attr.length;i++)obj[attr[i].name]=attr[i].value;return obj},_sortIdentities:function(a,b){return a.category>b.category?1:a.category<b.category?-1:a.type>b.type?1:a.type<b.type?-1:a.lang>b.lang?1:a.lang<b.lang?-1:0}})}(jQuery);/*!
- * Source: build/lib/strophe.vcard.js, license: MIT, url: https://github.com/strophe/strophejs-plugins */
-var buildIq;buildIq=function(type,jid,vCardEl){var iq;return iq=$iq(jid?{type:type,to:jid}:{type:type}),iq.c("vCard",{xmlns:Strophe.NS.VCARD}),vCardEl&&iq.cnode(vCardEl),iq},Strophe.addConnectionPlugin("vcard",{_connection:null,init:function(conn){return this._connection=conn,Strophe.addNamespace("VCARD","vcard-temp")},get:function(handler_cb,jid,error_cb){var iq;return iq=buildIq("get",jid),this._connection.sendIQ(iq,handler_cb,error_cb)},set:function(handler_cb,vCardEl,jid){var iq;return iq=buildIq("set",jid,vCardEl),this._connection.sendIQ(iq,handler_cb,error_rb)}}),/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
-function($){Strophe.addConnectionPlugin("jingle",{connection:null,sessions:{},jid2session:{},ice_config:{iceServers:[]},pc_constraints:{},media_constraints:{mandatory:{OfferToReceiveAudio:!0,OfferToReceiveVideo:!0}},localStream:null,init:function(conn){this.connection=conn,this.connection.disco&&(this.connection.disco.addFeature("urn:xmpp:jingle:1"),this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:1"),this.connection.disco.addFeature("urn:xmpp:jingle:transports:ice-udp:1"),this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:audio"),this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:video"),this.connection.disco.addFeature("urn:ietf:rfc:5761")),this.connection.addHandler(this.onJingle.bind(this),"urn:xmpp:jingle:1","iq","set",null,null)},onJingle:function(iq){var sid=$(iq).find("jingle").attr("sid"),action=$(iq).find("jingle").attr("action"),ack=$iq({type:"result",to:iq.getAttribute("from"),id:iq.getAttribute("id")});console.log("on jingle "+action);var sess=this.sessions[sid];if("session-initiate"!=action){if(null===sess)return ack.type="error",ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"}),this.connection.send(ack),!0;if(Strophe.getBareJidFromJid(iq.getAttribute("from"))!=Strophe.getBareJidFromJid(sess.peerjid))return console.warn("jid mismatch for session id",sid,iq.getAttribute("from"),sess.peerjid),ack.type="error",ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"}),this.connection.send(ack),!0}else if(void 0!==sess)return ack.type="error",ack.c("error",{type:"cancel"}).c("service-unavailable",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up(),console.warn("duplicate session id",sid),this.connection.send(ack),!0;switch(this.connection.send(ack),action){case"session-initiate":sess=new JingleSession($(iq).attr("to"),$(iq).find("jingle").attr("sid"),this.connection),this.localStream&&sess.localStreams.push(this.localStream),sess.media_constraints=this.media_constraints,sess.pc_constraints=this.pc_constraints,sess.ice_config=this.ice_config,sess.initiate($(iq).attr("from"),!1),sess.setRemoteDescription($(iq).find(">jingle"),"offer"),$(iq).find('>jingle>muted[xmlns="http://jitsi.org/protocol/meet#startmuted"]').length&&(console.log("got a request to start muted"),sess.startmuted=!0),this.sessions[sess.sid]=sess,this.jid2session[sess.peerjid]=sess,$(document).trigger("callincoming.jingle",[sess.sid]);break;case"session-accept":sess.setRemoteDescription($(iq).find(">jingle"),"answer"),sess.accept(),$(document).trigger("callaccepted.jingle",[sess.sid]);break;case"session-terminate":console.log("terminating..."),sess.terminate(),this.terminate(sess.sid),$(iq).find(">jingle>reason").length?$(document).trigger("callterminated.jingle",[sess.sid,$(iq).find(">jingle>reason>:first")[0].tagName,$(iq).find(">jingle>reason>text").text()]):$(document).trigger("callterminated.jingle",[sess.sid]);break;case"transport-info":sess.addIceCandidate($(iq).find(">jingle>content"));break;case"session-info":var affected;$(iq).find('>jingle>ringing[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length?$(document).trigger("ringing.jingle",[sess.sid]):$(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length?(affected=$(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name"),$(document).trigger("mute.jingle",[sess.sid,affected])):$(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length&&(affected=$(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name"),$(document).trigger("unmute.jingle",[sess.sid,affected]));break;case"addsource":sess.addSource($(iq).find(">jingle>content"));break;case"removesource":sess.removeSource($(iq).find(">jingle>content"));break;default:console.warn("jingle action not implemented",action)}return!0},initiate:function(peerjid,myjid){var sess=new JingleSession(myjid||this.connection.jid,Math.random().toString(36).substr(2,12),this.connection);return this.localStream&&sess.localStreams.push(this.localStream),sess.media_constraints=this.media_constraints,sess.pc_constraints=this.pc_constraints,sess.ice_config=this.ice_config,sess.initiate(peerjid,!0),this.sessions[sess.sid]=sess,this.jid2session[sess.peerjid]=sess,sess.sendOffer(),sess},terminate:function(sid,reason,text){if(null===sid||void 0===sid)for(sid in this.sessions)"ended"!=this.sessions[sid].state&&(this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text),this.sessions[sid].terminate()),delete this.jid2session[this.sessions[sid].peerjid],delete this.sessions[sid];else this.sessions.hasOwnProperty(sid)&&("ended"!=this.sessions[sid].state&&(this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text),this.sessions[sid].terminate()),delete this.jid2session[this.sessions[sid].peerjid],delete this.sessions[sid])},terminateByJid:function(jid){if(this.jid2session.hasOwnProperty(jid)){var sess=this.jid2session[jid];sess&&(sess.terminate(),console.log("peer went away silently",jid),delete this.sessions[sess.sid],delete this.jid2session[jid],$(document).trigger("callterminated.jingle",[sess.sid,"gone"]))}},getStunAndTurnCredentials:function(){var self=this;this.connection.sendIQ($iq({type:"get",to:this.connection.domain}).c("services",{xmlns:"urn:xmpp:extdisco:1"}).c("service",{host:"turn."+this.connection.domain}),function(res){var iceservers=[];$(res).find(">services>service").each(function(idx,el){el=$(el);var dict={};switch(el.attr("type")){case"stun":dict.url="stun:"+el.attr("host"),el.attr("port")&&(dict.url+=":"+el.attr("port")),iceservers.push(dict);break;case"turn":dict.url="turn:",el.attr("username")&&(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)&&parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2],10)<28?dict.url+=el.attr("username")+"@":dict.username=el.attr("username")),dict.url+=el.attr("host"),el.attr("port")&&"3478"!=el.attr("port")&&(dict.url+=":"+el.attr("port")),el.attr("transport")&&"udp"!=el.attr("transport")&&(dict.url+="?transport="+el.attr("transport")),el.attr("password")&&(dict.credential=el.attr("password")),iceservers.push(dict)}}),self.ice_config.iceServers=iceservers},function(err){console.warn("getting turn credentials failed",err),console.warn("is mod_turncredentials or similar installed?")})}})}(jQuery);/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.session.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
-var JingleSession;!function($){JingleSession=function(me,sid,connection){this.me=me,this.sid=sid,this.connection=connection,this.initiator=null,this.responder=null,this.isInitiator=null,this.peerjid=null,this.state=null,this.peerconnection=null,this.remoteStream=null,this.localSDP=null,this.remoteSDP=null,this.localStreams=[],this.relayedStreams=[],this.remoteStreams=[],this.startTime=null,this.stopTime=null,this.media_constraints=null,this.pc_constraints=null,this.ice_config={},this.drip_container=[],this.usetrickle=!0,this.usepranswer=!1,this.usedrip=!1,this.hadstuncandidate=!1,this.hadturncandidate=!1,this.lasticecandidate=!1,this.statsinterval=null,this.reason=null,this.addssrc=[],this.removessrc=[],this.pendingop=null,this.wait=!0,this.nickname=null,this.startmuted=!1,this.filter_candidates=null},JingleSession.prototype.initiate=function(peerjid,isInitiator){var self=this;if(null!==this.state)return void console.error("attempt to initiate on session "+this.sid+"in state "+this.state);this.isInitiator=isInitiator,this.state="pending",this.initiator=isInitiator?this.me:peerjid,this.responder=isInitiator?peerjid:this.me,this.peerjid=peerjid;try{this.peerconnection=new RTCPeerconnection(this.ice_config,this.pc_constraints)}catch(e){return console.error("Failed to create PeerConnection, exception: ",e.message),void console.error(e)}this.hadstuncandidate=!1,this.hadturncandidate=!1,this.lasticecandidate=!1,this.peerconnection.onicecandidate=function(event){self.sendIceCandidate(event.candidate)},this.peerconnection.onaddstream=function(event){self.remoteStream=event.stream,self.remoteStreams.push(event.stream),$(document).trigger("remotestreamadded.jingle",[event,self.sid])},this.peerconnection.onremovestream=function(event){self.remoteStream=null,$(document).trigger("remotestreamremoved.jingle",[event,self.sid])},this.peerconnection.onsignalingstatechange=function(){!self||!self.peerconnection},this.peerconnection.oniceconnectionstatechange=function(){if(self&&self.peerconnection){switch(self.peerconnection.iceConnectionState){case"connected":this.startTime=new Date;break;case"disconnected":this.stopTime=new Date}$(document).trigger("iceconnectionstatechange.jingle",[self.sid,self])}},this.localStreams.forEach(function(stream){self.peerconnection.addStream(stream)}),this.relayedStreams.forEach(function(stream){self.peerconnection.addStream(stream)})},JingleSession.prototype.accept=function(){var self=this;this.state="active";var pranswer=this.peerconnection.localDescription;if(pranswer&&"pranswer"==pranswer.type){if(console.log("going from pranswer to answer"),this.usetrickle)for(var lines=SDPUtil.find_lines(pranswer.sdp,"a=candidate:"),i=0;i<lines.length;i++)pranswer.sdp=pranswer.sdp.replace(lines[i]+"\r\n","");for(;SDPUtil.find_line(pranswer.sdp,"a=inactive");)pranswer.sdp=pranswer.sdp.replace("a=inactive","a=sendrecv");var prsdp=new SDP(pranswer.sdp),accept=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-accept",initiator:this.initiator,responder:this.responder,sid:this.sid});prsdp.toJingle(accept,this.initiator==this.me?"initiator":"responder"),this.connection.sendIQ(accept,function(){var ack={};ack.source="answer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="answer",$(document).trigger("error.jingle",[self.sid,error])},1e4);for(var sdp=this.peerconnection.localDescription.sdp;SDPUtil.find_line(sdp,"a=inactive");)sdp=sdp.replace("a=inactive","a=sendrecv");this.peerconnection.setLocalDescription(new RTCSessionDescription({type:"answer",sdp:sdp}),function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(e){console.error("setLocalDescription failed",e)})}},JingleSession.prototype.terminate=function(reason){this.state="ended",this.reason=reason,this.peerconnection.close(),null!==this.statsinterval&&(window.clearInterval(this.statsinterval),this.statsinterval=null)},JingleSession.prototype.active=function(){return"active"==this.state},JingleSession.prototype.sendIceCandidate=function(candidate){var self=this;if(candidate&&!this.lasticecandidate){var ice=SDPUtil.iceparams(this.localSDP.media[candidate.sdpMLineIndex],this.localSDP.session),jcand=SDPUtil.candidateToJingle(candidate.candidate);if(!ice||!jcand)return void console.error("failed to get ice && jcand");if(ice.xmlns="urn:xmpp:jingle:transports:ice-udp:1","srflx"===jcand.type?this.hadstuncandidate=!0:"relay"===jcand.type&&(this.hadturncandidate=!0),(null===this.filter_candidates||jcand.type===this.filter_candidates)&&this.usetrickle){if(console.log("sendIceCandidate using trickle"),this.usedrip)return 0===this.drip_container.length&&window.setTimeout(function(){console.log("sending drip container"),0!==self.drip_container.length&&(self.sendIceCandidates(self.drip_container),self.drip_container=[])},20),void this.drip_container.push(event.candidate);console.log("sending single candidate"),self.sendIceCandidates([event.candidate])}}else{if(console.log("sendIceCandidate: last candidate..."),!this.usetrickle){console.log("should send full offer now...");var init=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"offer"==this.peerconnection.localDescription.type?"session-initiate":"session-accept",initiator:this.initiator,sid:this.sid});null!=this.nickname&&init.c("nick",{xmlns:"http://jabber.org/protocol/nick"}).t(this.nickname).up(),this.startmuted&&init.c("muted",{xmlns:"http://jitsi.org/protocol/meet#startmuted"}).up(),this.localSDP=new SDP(this.peerconnection.localDescription.sdp),this.localSDP.toJingle(init,this.initiator==this.me?"initiator":"responder"),console.log("try to send ack(offer)..."),this.connection.sendIQ(init,function(){console.log("Sent session initiate (ACK, offer)...");var ack={};ack.source="offer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){self.state="error",self.peerconnection.close();var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="offer",$(document).trigger("error.jingle",[self.sid,error])},1e4)}this.lasticecandidate=!0,console.log("Have we encountered any srflx candidates? "+this.hadstuncandidate),console.log("Have we encountered any relay candidates? "+this.hadturncandidate),this.hadstuncandidate||this.hadturncandidate||"closed"==this.peerconnection.signalingState||(console.log("no candidates found!"),$(document).trigger("nostuncandidates.jingle",[this.sid]))}},JingleSession.prototype.sendIceCandidates=function(candidates){console.log("sendIceCandidates",candidates);for(var cand=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"transport-info",initiator:this.initiator,sid:this.sid}),mid=0;mid<this.localSDP.media.length;mid++){var cands=candidates.filter(function(el){return el.sdpMLineIndex==mid});if(cands.length>0){var ice=SDPUtil.iceparams(this.localSDP.media[mid],this.localSDP.session);ice.xmlns="urn:xmpp:jingle:transports:ice-udp:1",cand.c("content",{creator:this.initiator==this.me?"initiator":"responder",name:cands[0].sdpMid}).c("transport",ice);for(var i=0;i<cands.length;i++)cand.c("candidate",SDPUtil.candidateToJingle(cands[i].candidate)).up();if(SDPUtil.find_line(this.localSDP.media[mid],"a=fingerprint:",this.localSDP.session)){var tmp=SDPUtil.parse_fingerprint(SDPUtil.find_line(this.localSDP.media[mid],"a=fingerprint:",this.localSDP.session));tmp.required=!0,cand.c("fingerprint").t(tmp.fingerprint),delete tmp.fingerprint,cand.attrs(tmp),cand.up()}cand.up(),cand.up()}}console.log("try to send ack(transportinfo)..."),this.connection.sendIQ(cand,function(){var ack={};ack.source="transportinfo",console.log("Sent session initiate (ACK, transportinfo)..."),$(document).trigger("ack.jingle",[this.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="transportinfo",$(document).trigger("error.jingle",[this.sid,error])},1e4)},JingleSession.prototype.sendOffer=function(){var self=this;this.peerconnection.createOffer(function(sdp){self.createdOffer(sdp)},function(e){console.error("createOffer failed",e)},this.media_constraints)},JingleSession.prototype.createdOffer=function(sdp){var self=this;if(this.localSDP=new SDP(sdp.sdp),this.usetrickle){var init=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-initiate",initiator:this.initiator,sid:this.sid});null!=this.nickname&&init.c("nick",{xmlns:"http://jabber.org/protocol/nick"}).t(this.nickname).up(),this.startmuted&&init.c("muted",{xmlns:"http://jitsi.org/protocol/meet#startmuted"}).up(),this.localSDP.toJingle(init,this.initiator==this.me?"initiator":"responder"),this.connection.sendIQ(init,function(){var ack={};ack.source="offer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){self.state="error",self.peerconnection.close();var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="offer",$(document).trigger("error.jingle",[self.sid,error])},1e4)}sdp.sdp=this.localSDP.raw,this.peerconnection.setLocalDescription(sdp,function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(e){console.error("setLocalDescription failed",e)});for(var cands=SDPUtil.find_lines(this.localSDP.raw,"a=candidate:"),i=0;i<cands.length;i++){var cand=SDPUtil.parse_icecandidate(cands[i]);"srflx"==cand.type?this.hadstuncandidate=!0:"relay"==cand.type&&(this.hadturncandidate=!0)}},JingleSession.prototype.setRemoteDescription=function(elem,desctype){if(this.remoteSDP=new SDP(""),this.remoteSDP.fromJingle(elem),null!==this.peerconnection.remoteDescription&&(console.log("setRemoteDescription when remote description is not null, should be pranswer",this.peerconnection.remoteDescription),"pranswer"==this.peerconnection.remoteDescription.type)){for(var pranswer=new SDP(this.peerconnection.remoteDescription.sdp),i=0;i<pranswer.media.length;i++){SDPUtil.find_line(this.remoteSDP.media[i],"a=ice-ufrag:",this.remoteSDP.session)||(SDPUtil.find_line(pranswer.media[i],"a=ice-ufrag:",pranswer.session)?this.remoteSDP.media[i]+=SDPUtil.find_line(pranswer.media[i],"a=ice-ufrag:",pranswer.session)+"\r\n":console.warn("no ice ufrag?"),SDPUtil.find_line(pranswer.media[i],"a=ice-pwd:",pranswer.session)?this.remoteSDP.media[i]+=SDPUtil.find_line(pranswer.media[i],"a=ice-pwd:",pranswer.session)+"\r\n":console.warn("no ice pwd?"));for(var lines=SDPUtil.find_lines(pranswer.media[i],"a=candidate:"),j=0;j<lines.length;j++)this.remoteSDP.media[i]+=lines[j]+"\r\n"}this.remoteSDP.raw=this.remoteSDP.session+this.remoteSDP.media.join("")}var remotedesc=new RTCSessionDescription({type:desctype,sdp:this.remoteSDP.raw});this.peerconnection.setRemoteDescription(remotedesc,function(){},function(e){console.error("setRemoteDescription error",e)})},JingleSession.prototype.addIceCandidate=function(elem){var self=this;if("closed"!=this.peerconnection.signalingState){if(!this.peerconnection.remoteDescription&&"have-local-offer"==this.peerconnection.signalingState){if(console.log("trickle ice candidate arriving before session accept..."),!this.remoteSDP){for(var cobbled="v=0\r\no=- 1923518516 2 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\n",i=0;i<this.localSDP.media.length;i++)cobbled+=SDPUtil.find_line(this.localSDP.media[i],"m=")+"\r\n",cobbled+=SDPUtil.find_lines(this.localSDP.media[i],"a=rtpmap:").join("\r\n")+"\r\n",SDPUtil.find_line(this.localSDP.media[i],"a=mid:")&&(cobbled+=SDPUtil.find_line(this.localSDP.media[i],"a=mid:")+"\r\n"),cobbled+="a=inactive\r\n";this.remoteSDP=new SDP(cobbled)}elem.each(function(){for(var i=0;i<self.remoteSDP.media.length;i++)if((SDPUtil.find_line(self.remoteSDP.media[i],"a=mid:"+$(this).attr("name"))||0===self.remoteSDP.media[i].indexOf("m="+$(this).attr("name")))&&!SDPUtil.find_line(self.remoteSDP.media[i],"a=ice-ufrag:")){var tmp=$(this).find("transport");self.remoteSDP.media[i]+="a=ice-ufrag:"+tmp.attr("ufrag")+"\r\n",self.remoteSDP.media[i]+="a=ice-pwd:"+tmp.attr("pwd")+"\r\n",tmp=$(this).find("transport>fingerprint"),tmp.length?self.remoteSDP.media[i]+="a=fingerprint:"+tmp.attr("hash")+" "+tmp.text()+"\r\n":(console.log("no dtls fingerprint (webrtc issue #1718?)"),self.remoteSDP.media[i]+="a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:BAADBAADBAADBAADBAADBAADBAADBAADBAADBAAD\r\n");break}}),this.remoteSDP.raw=this.remoteSDP.session+this.remoteSDP.media.join("");var iscomplete=this.remoteSDP.media.filter(function(mediapart){return SDPUtil.find_line(mediapart,"a=ice-ufrag:")}).length==this.remoteSDP.media.length;if(iscomplete){console.log("setting pranswer");try{this.peerconnection.setRemoteDescription(new RTCSessionDescription({type:"pranswer",sdp:this.remoteSDP.raw}),function(){},function(e){console.log("setRemoteDescription pranswer failed",e.toString())})}catch(e){console.error("setting pranswer failed",e)}}}elem.each(function(){var i,idx=-1;for(i=0;i<self.remoteSDP.media.length;i++)if(SDPUtil.find_line(self.remoteSDP.media[i],"a=mid:"+$(this).attr("name"))||0===self.remoteSDP.media[i].indexOf("m="+$(this).attr("name"))){idx=i;break}if(-1==idx)for(i=0;i<self.localSDP.media.length;i++)if(SDPUtil.find_line(self.localSDP.media[i],"a=mid:"+$(this).attr("name"))||0===self.localSDP.media[i].indexOf("m="+$(this).attr("name"))){idx=i;break}var name=$(this).attr("name");$(this).find("transport>candidate").each(function(){var line,candidate;line=SDPUtil.candidateFromJingle(this),candidate=new RTCIceCandidate({sdpMLineIndex:idx,sdpMid:name,candidate:line});try{self.peerconnection.addIceCandidate(candidate)}catch(e){console.error("addIceCandidate failed",e.toString(),line)}})})}},JingleSession.prototype.sendAnswer=function(provisional){var self=this;this.peerconnection.createAnswer(function(sdp){self.createdAnswer(sdp,provisional)},function(e){console.error("createAnswer failed",e)},this.media_constraints)},JingleSession.prototype.createdAnswer=function(sdp,provisional){var self=this;if(this.localSDP=new SDP(sdp.sdp),this.usepranswer=provisional===!0,this.startmuted&&(console.log("we got a request to start muted..."),this.connection.jingle.localStream.getAudioTracks().forEach(function(track){track.enabled=!1}),this.connection.jingle.localStream.getVideoTracks().forEach(function(track){track.enabled=!1}),this.localSDP.media[1]=this.localSDP.media[1].replace("a=sendrecv","a=recvonly"),SDPUtil.find_lines(this.localSDP.media[1],"a=ssrc:").forEach(function(line){self.localSDP.media[1]=self.localSDP.media[1].replace(line+"\r\n","")}),this.localSDP.raw=this.localSDP.session+this.localSDP.media.join("")),this.usetrickle)if(this.usepranswer){sdp.type="pranswer";for(var i=0;i<this.localSDP.media.length;i++)this.localSDP.media[i]=this.localSDP.media[i].replace("a=sendrecv\r\n","a=inactive\r\n");this.localSDP.raw=this.localSDP.session+this.localSDP.media.join("")}else{var accept=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-accept",initiator:this.initiator,responder:this.responder,sid:this.sid});this.localSDP.toJingle(accept,this.initiator==this.me?"initiator":"responder"),this.connection.sendIQ(accept,function(){var ack={};ack.source="answer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="answer",$(document).trigger("error.jingle",[self.sid,error])},1e4)}sdp.sdp=this.localSDP.raw,this.peerconnection.setLocalDescription(sdp,function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(e){console.error("setLocalDescription failed",e)});for(var cands=SDPUtil.find_lines(this.localSDP.raw,"a=candidate:"),j=0;j<cands.length;j++){var cand=SDPUtil.parse_icecandidate(cands[j]);"srflx"==cand.type?this.hadstuncandidate=!0:"relay"==cand.type&&(this.hadturncandidate=!0)}},JingleSession.prototype.sendTerminate=function(reason,text){var self=this,term=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-terminate",initiator:this.initiator,sid:this.sid}).c("reason").c(reason||"success");text&&term.up().c("text").t(text),this.connection.sendIQ(term,function(){self.peerconnection.close(),self.peerconnection=null,self.terminate();var ack={};ack.source="terminate",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};$(document).trigger("ack.jingle",[self.sid,error])},1e4),null!==this.statsinterval&&(window.clearInterval(this.statsinterval),this.statsinterval=null)},JingleSession.prototype.addSource=function(elem){console.log("addssrc",(new Date).getTime()),console.log("ice",this.peerconnection.iceConnectionState);var sdp=new SDP(this.peerconnection.remoteDescription.sdp),self=this;$(elem).each(function(idx,content){var name=$(content).attr("name"),lines="";tmp=$(content).find('>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'),tmp.each(function(){var ssrc=$(this).attr("ssrc");$(this).find(">parameter").each(function(){lines+="a=ssrc:"+ssrc+" "+$(this).attr("name"),$(this).attr("value")&&$(this).attr("value").length&&(lines+=":"+$(this).attr("value")),lines+="\r\n"})}),sdp.media.forEach(function(media,idx){SDPUtil.find_line(media,"a=mid:"+name)&&(sdp.media[idx]+=lines,self.addssrc[idx]||(self.addssrc[idx]=""),self.addssrc[idx]+=lines)}),sdp.raw=sdp.session+sdp.media.join("")}),this.modifySources()},JingleSession.prototype.removeSource=function(elem){console.log("removessrc",(new Date).getTime()),console.log("ice",this.peerconnection.iceConnectionState);var sdp=new SDP(this.peerconnection.remoteDescription.sdp),self=this;$(elem).each(function(idx,content){var name=$(content).attr("name"),lines="";tmp=$(content).find('>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'),tmp.each(function(){var ssrc=$(this).attr("ssrc");$(this).find(">parameter").each(function(){lines+="a=ssrc:"+ssrc+" "+$(this).attr("name"),$(this).attr("value")&&$(this).attr("value").length&&(lines+=":"+$(this).attr("value")),lines+="\r\n"})}),sdp.media.forEach(function(media,idx){SDPUtil.find_line(media,"a=mid:"+name)&&(sdp.media[idx]+=lines,self.addssrc[idx]||(self.removessrc[idx]=""),self.removessrc[idx]+=lines)}),sdp.raw=sdp.session+sdp.media.join("")}),this.modifySources()},JingleSession.prototype.modifySources=function(){var self=this;if("closed"!=this.peerconnection.signalingState&&(this.addssrc.length||this.removessrc.length||null!==this.pendingop)){if("stable"!=this.peerconnection.signalingState||"connected"!=this.peerconnection.iceConnectionState)return console.warn("modifySources not yet",this.peerconnection.signalingState,this.peerconnection.iceConnectionState),this.wait=!0,void window.setTimeout(function(){self.modifySources()},250);if(this.wait)return window.setTimeout(function(){self.modifySources()},2500),void(this.wait=!1);var sdp=new SDP(this.peerconnection.remoteDescription.sdp);this.addssrc.forEach(function(lines,idx){sdp.media[idx]+=lines}),this.addssrc=[],this.removessrc.forEach(function(lines,idx){lines=lines.split("\r\n"),lines.pop(),lines.forEach(function(line){sdp.media[idx]=sdp.media[idx].replace(line+"\r\n","")})}),this.removessrc=[],sdp.raw=sdp.session+sdp.media.join(""),this.peerconnection.setRemoteDescription(new RTCSessionDescription({type:"offer",sdp:sdp.raw}),function(){self.peerconnection.createAnswer(function(modifiedAnswer){if(null!==self.pendingop){var sdp=new SDP(modifiedAnswer.sdp);if(sdp.media.length>1){switch(self.pendingop){case"mute":sdp.media[1]=sdp.media[1].replace("a=sendrecv","a=recvonly");break;case"unmute":sdp.media[1]=sdp.media[1].replace("a=recvonly","a=sendrecv")}sdp.raw=sdp.session+sdp.media.join(""),modifiedAnswer.sdp=sdp.raw}self.pendingop=null}self.peerconnection.setLocalDescription(modifiedAnswer,function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(){console.log("modified setLocalDescription failed")})},function(){console.log("modified answer failed")})},function(){console.log("modify failed")})}},JingleSession.prototype.hardMuteVideo=function(muted){this.pendingop=muted?"mute":"unmute",this.modifySources(),this.connection.jingle.localStream.getVideoTracks().forEach(function(track){track.enabled=!muted})},JingleSession.prototype.sendMute=function(muted,content){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c(muted?"mute":"unmute",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"}),info.attrs({creator:this.me==this.initiator?"creator":"responder"}),content&&info.attrs({name:content}),this.connection.send(info)},JingleSession.prototype.sendRinging=function(){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c("ringing",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"}),this.connection.send(info)},JingleSession.prototype.getStats=function(interval){var self=this,recv={audio:0,video:0},lost={audio:0,video:0},lastrecv={audio:0,video:0},lastlost={audio:0,video:0},loss={audio:0,video:0},delta={audio:0,video:0};return this.statsinterval=window.setInterval(function(){self&&self.peerconnection&&self.peerconnection.getStats&&self.peerconnection.getStats(function(stats){for(var results=stats.result(),i=0;i<results.length;++i)if("ssrc"==results[i].type){var packetsrecv=results[i].stat("packetsReceived"),packetslost=results[i].stat("packetsLost");packetsrecv&&packetslost&&(packetsrecv=parseInt(packetsrecv,10),packetslost=parseInt(packetslost,10),results[i].stat("googFrameRateReceived")?(lastlost.video=lost.video,lastrecv.video=recv.video,recv.video=packetsrecv,lost.video=packetslost):(lastlost.audio=lost.audio,lastrecv.audio=recv.audio,recv.audio=packetsrecv,lost.audio=packetslost))}delta.audio=recv.audio-lastrecv.audio,delta.video=recv.video-lastrecv.video,loss.audio=delta.audio>0?Math.ceil(100*(lost.audio-lastlost.audio)/delta.audio):0,loss.video=delta.video>0?Math.ceil(100*(lost.video-lastlost.video)/delta.video):0,$(document).trigger("packetloss.jingle",[self.sid,loss])})},interval||3e3),this.statsinterval}}(jQuery);/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.sdp.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
-var SDP;!function($){SDP=function(sdp){this.media=sdp.split("\r\nm=");for(var i=1;i<this.media.length;i++)this.media[i]="m="+this.media[i],i!=this.media.length-1&&(this.media[i]+="\r\n");this.session=this.media.shift()+"\r\n",this.raw=this.session+this.media.join("")},SDP.prototype.mangle=function(){var i,j,mline,lines,rtpmap,newdesc;for(i=0;i<this.media.length;i++)if(lines=this.media[i].split("\r\n"),lines.pop(),mline=SDPUtil.parse_mline(lines.shift()),"audio"==mline.media){for(newdesc="",mline.fmt.length=0,j=0;j<lines.length;j++)if("a=rtpmap:"==lines[j].substr(0,9)){if(rtpmap=SDPUtil.parse_rtpmap(lines[j]),"CN"==rtpmap.name||"ISAC"==rtpmap.name)continue;mline.fmt.push(rtpmap.id),newdesc+=lines[j]+"\r\n"}else newdesc+=lines[j]+"\r\n";this.media[i]=SDPUtil.build_mline(mline)+"\r\n",this.media[i]+=newdesc}this.raw=this.session+this.media.join("")},SDP.prototype.removeSessionLines=function(prefix){var self=this,lines=SDPUtil.find_lines(this.session,prefix);return lines.forEach(function(line){self.session=self.session.replace(line+"\r\n","")}),this.raw=this.session+this.media.join(""),lines},SDP.prototype.removeMediaLines=function(mediaindex,prefix){var self=this,lines=SDPUtil.find_lines(this.media[mediaindex],prefix);return lines.forEach(function(line){self.media[mediaindex]=self.media[mediaindex].replace(line+"\r\n","")}),this.raw=this.session+this.media.join(""),lines},SDP.prototype.toJingle=function(elem,thecreator){var i,j,k,mline,ssrc,rtpmap,tmp,lines;if(SDPUtil.find_line(this.session,"a=group:"))for(lines=SDPUtil.find_lines(this.session,"a=group:"),i=0;i<lines.length;i++){tmp=lines[i].split(" ");var semantics=tmp.shift().substr(8);for(elem.c("group",{xmlns:"urn:xmpp:jingle:apps:grouping:0",semantics:semantics}),j=0;j<tmp.length;j++)elem.c("content",{name:tmp[j]}).up();elem.up()}var bundle=[];for(SDPUtil.find_line(this.session,"a=group:BUNDLE")&&(bundle=SDPUtil.find_line(this.session,"a=group:BUNDLE ").split(" "),bundle.shift()),i=0;i<this.media.length;i++)if(mline=SDPUtil.parse_mline(this.media[i].split("\r\n")[0]),"audio"==mline.media||"video"==mline.media){if(ssrc=SDPUtil.find_line(this.media[i],"a=ssrc:")?SDPUtil.find_line(this.media[i],"a=ssrc:").substring(7).split(" ")[0]:!1,elem.c("content",{creator:thecreator,name:mline.media}),SDPUtil.find_line(this.media[i],"a=mid:")){var mid=SDPUtil.parse_mid(SDPUtil.find_line(this.media[i],"a=mid:"));elem.attrs({name:mid}),-1!=bundle.indexOf(mid)&&(elem.c("bundle",{xmlns:"http://estos.de/ns/bundle"}).up(),bundle.splice(bundle.indexOf(mid),1))}if(SDPUtil.find_line(this.media[i],"a=rtpmap:").length){for(elem.c("description",{xmlns:"urn:xmpp:jingle:apps:rtp:1",media:mline.media}),ssrc&&elem.attrs({ssrc:ssrc}),j=0;j<mline.fmt.length;j++){if(rtpmap=SDPUtil.find_line(this.media[i],"a=rtpmap:"+mline.fmt[j]),elem.c("payload-type",SDPUtil.parse_rtpmap(rtpmap)),SDPUtil.find_line(this.media[i],"a=fmtp:"+mline.fmt[j]))for(tmp=SDPUtil.parse_fmtp(SDPUtil.find_line(this.media[i],"a=fmtp:"+mline.fmt[j])),k=0;k<tmp.length;k++)elem.c("parameter",tmp[k]).up();this.RtcpFbToJingle(i,elem,mline.fmt[j]),elem.up()}if(SDPUtil.find_line(this.media[i],"a=crypto:",this.session)){elem.c("encryption",{required:1});var crypto=SDPUtil.find_lines(this.media[i],"a=crypto:",this.session);crypto.forEach(function(line){elem.c("crypto",SDPUtil.parse_crypto(line)).up()}),elem.up()}if(ssrc){elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"});var ssrclines=SDPUtil.find_lines(this.media[i],"a=ssrc:");ssrclines.forEach(function(line){idx=line.indexOf(" ");var linessrc=line.substr(0,idx).substr(7);linessrc!=ssrc&&(elem.up(),ssrc=linessrc,elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"}));var kv=line.substr(idx+1);elem.c("parameter"),-1==kv.indexOf(":")?elem.attrs({name:kv}):(elem.attrs({name:kv.split(":",2)[0]}),elem.attrs({value:kv.split(":",2)[1]})),elem.up()}),elem.up(),tmp=SDPUtil.parse_ssrc(this.media[i]),tmp.xmlns="http://estos.de/ns/ssrc",tmp.ssrc=ssrc,elem.c("ssrc",tmp).up()}if(SDPUtil.find_line(this.media[i],"a=rtcp-mux")&&elem.c("rtcp-mux").up(),this.RtcpFbToJingle(i,elem,"*"),SDPUtil.find_line(this.media[i],"a=extmap:"))for(lines=SDPUtil.find_lines(this.media[i],"a=extmap:"),j=0;j<lines.length;j++){if(tmp=SDPUtil.parse_extmap(lines[j]),elem.c("rtp-hdrext",{xmlns:"urn:xmpp:jingle:apps:rtp:rtp-hdrext:0",uri:tmp.uri,id:tmp.value}),tmp.hasOwnProperty("direction"))switch(tmp.direction){case"sendonly":elem.attrs({senders:"responder"});break;case"recvonly":elem.attrs({senders:"initiator"});break;case"sendrecv":elem.attrs({senders:"both"});break;case"inactive":elem.attrs({senders:"none"})}elem.up()}elem.up()}this.TransportToJingle(i,elem),SDPUtil.find_line(this.media[i],"a=sendrecv",this.session)?elem.attrs({senders:"both"}):SDPUtil.find_line(this.media[i],"a=sendonly",this.session)?elem.attrs({senders:"initiator"}):SDPUtil.find_line(this.media[i],"a=recvonly",this.session)?elem.attrs({senders:"responder"}):SDPUtil.find_line(this.media[i],"a=inactive",this.session)&&elem.attrs({senders:"none"}),"0"==mline.port&&elem.attrs({senders:"rejected"}),elem.up()}return elem.up(),elem},SDP.prototype.TransportToJingle=function(mediaindex,elem){var tmp,self=this;elem.c("transport");var fingerprints=SDPUtil.find_lines(this.media[mediaindex],"a=fingerprint:",this.session);if(fingerprints.forEach(function(line){tmp=SDPUtil.parse_fingerprint(line),tmp.xmlns="urn:xmpp:tmp:jingle:apps:dtls:0",elem.c("fingerprint").t(tmp.fingerprint),delete tmp.fingerprint,line=SDPUtil.find_line(self.media[mediaindex],"a=setup:",self.session),line&&(tmp.setup=line.substr(8)),elem.attrs(tmp),elem.up()}),tmp=SDPUtil.iceparams(this.media[mediaindex],this.session),tmp&&(tmp.xmlns="urn:xmpp:jingle:transports:ice-udp:1",elem.attrs(tmp),SDPUtil.find_line(this.media[mediaindex],"a=candidate:",this.session))){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=candidate:",this.session);lines.forEach(function(line){elem.c("candidate",SDPUtil.candidateToJingle(line)).up()})}elem.up()},SDP.prototype.RtcpFbToJingle=function(mediaindex,elem,payloadtype){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=rtcp-fb:"+payloadtype);lines.forEach(function(line){var tmp=SDPUtil.parse_rtcpfb(line);"trr-int"==tmp.type?(elem.c("rtcp-fb-trr-int",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",value:tmp.params[0]}),elem.up()):(elem.c("rtcp-fb",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",type:tmp.type}),tmp.params.length>0&&elem.attrs({subtype:tmp.params[0]}),elem.up())})},SDP.prototype.RtcpFbFromJingle=function(elem,payloadtype){var media="",tmp=elem.find('>rtcp-fb-trr-int[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]');return tmp.length&&(media+="a=rtcp-fb:* trr-int ",media+=tmp.attr("value")?tmp.attr("value"):"0",media+="\r\n"),tmp=elem.find('>rtcp-fb[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]'),tmp.each(function(){media+="a=rtcp-fb:"+payloadtype+" "+$(this).attr("type"),$(this).attr("subtype")&&(media+=" "+$(this).attr("subtype")),media+="\r\n"}),media},SDP.prototype.fromJingle=function(jingle){var self=this;if(this.raw="v=0\r\no=- 1923518516 2 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\n",$(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').length)$(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').each(function(idx,group){var contents=$(group).find(">content").map(function(idx,content){return content.getAttribute("name")}).get();contents.length>0&&(self.raw+="a=group:"+(group.getAttribute("semantics")||group.getAttribute("type"))+" "+contents.join(" ")+"\r\n")});else if($(jingle).find('>group[xmlns="urn:ietf:rfc:5888"]').length)$(jingle).find('>group[xmlns="urn:ietf:rfc:5888"]').each(function(idx,group){var contents=$(group).find(">content").map(function(idx,content){return content.getAttribute("name")}).get();null!==group.getAttribute("type")&&contents.length>0&&(self.raw+="a=group:"+group.getAttribute("type")+" "+contents.join(" ")+"\r\n")});else{var bundle=$(jingle).find(">content").filter(function(idx,content){return $(content).find(">bundle").length>0}).map(function(idx,content){return content.getAttribute("name")}).get();bundle.length&&(this.raw+="a=group:BUNDLE "+bundle.join(" ")+"\r\n")}this.session=this.raw,jingle.find(">content").each(function(){var m=self.jingle2media($(this));self.media.push(m)}),this.raw=this.session+this.media.join("")},SDP.prototype.jingle2media=function(content){var tmp,media="",desc=content.find("description"),ssrc=desc.attr("ssrc"),self=this;switch(tmp={media:desc.attr("media")},tmp.port="1","rejected"==content.attr("senders")&&(tmp.port="0"),tmp.proto=content.find(">transport>fingerprint").length||desc.find("encryption").length?"RTP/SAVPF":"RTP/AVPF",tmp.fmt=desc.find("payload-type").map(function(){return this.getAttribute("id")}).get(),media+=SDPUtil.build_mline(tmp)+"\r\n",media+="c=IN IP4 0.0.0.0\r\n",media+="a=rtcp:1 IN IP4 0.0.0.0\r\n",tmp=content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]'),tmp.length&&(tmp.attr("ufrag")&&(media+=SDPUtil.build_iceufrag(tmp.attr("ufrag"))+"\r\n"),tmp.attr("pwd")&&(media+=SDPUtil.build_icepwd(tmp.attr("pwd"))+"\r\n"),tmp.find(">fingerprint").each(function(){media+="a=fingerprint:"+this.getAttribute("hash"),media+=" "+$(this).text(),media+="\r\n",this.getAttribute("setup")&&(media+="a=setup:"+this.getAttribute("setup")+"\r\n")})),content.attr("senders")){case"initiator":media+="a=sendonly\r\n";break;case"responder":media+="a=recvonly\r\n";break;case"none":media+="a=inactive\r\n";break;case"both":media+="a=sendrecv\r\n"}return media+="a=mid:"+content.attr("name")+"\r\n",desc.find("rtcp-mux").length&&(media+="a=rtcp-mux\r\n"),desc.find("encryption").length&&desc.find("encryption>crypto").each(function(){media+="a=crypto:"+this.getAttribute("tag"),media+=" "+this.getAttribute("crypto-suite"),media+=" "+this.getAttribute("key-params"),this.getAttribute("session-params")&&(media+=" "+this.getAttribute("session-params")),media+="\r\n"}),desc.find("payload-type").each(function(){media+=SDPUtil.build_rtpmap(this)+"\r\n",$(this).find(">parameter").length&&(media+="a=fmtp:"+this.getAttribute("id")+" ",media+=$(this).find("parameter").map(function(){return(this.getAttribute("name")?this.getAttribute("name")+"=":"")+this.getAttribute("value")}).get().join(";"),media+="\r\n"),media+=self.RtcpFbFromJingle($(this),this.getAttribute("id"))}),media+=self.RtcpFbFromJingle(desc,"*"),tmp=desc.find('>rtp-hdrext[xmlns="urn:xmpp:jingle:apps:rtp:rtp-hdrext:0"]'),tmp.each(function(){media+="a=extmap:"+this.getAttribute("id")+" "+this.getAttribute("uri")+"\r\n"}),content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]>candidate').each(function(){media+=SDPUtil.candidateFromJingle(this)}),tmp=content.find('description>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'),tmp.each(function(){var ssrc=this.getAttribute("ssrc");$(this).find(">parameter").each(function(){media+="a=ssrc:"+ssrc+" "+this.getAttribute("name"),this.getAttribute("value")&&this.getAttribute("value").length&&(media+=":"+this.getAttribute("value")),media+="\r\n"})}),0===tmp.length&&(tmp=content.find('description>ssrc[xmlns="http://estos.de/ns/ssrc"]'),tmp.length&&(media+="a=ssrc:"+ssrc+" cname:"+tmp.attr("cname")+"\r\n",media+="a=ssrc:"+ssrc+" msid:"+tmp.attr("msid")+"\r\n",media+="a=ssrc:"+ssrc+" mslabel:"+tmp.attr("mslabel")+"\r\n",media+="a=ssrc:"+ssrc+" label:"+tmp.attr("label")+"\r\n")),media},SDPUtil={iceparams:function(mediadesc,sessiondesc){var data=null;return SDPUtil.find_line(mediadesc,"a=ice-ufrag:",sessiondesc)&&SDPUtil.find_line(mediadesc,"a=ice-pwd:",sessiondesc)&&(data={ufrag:SDPUtil.parse_iceufrag(SDPUtil.find_line(mediadesc,"a=ice-ufrag:",sessiondesc)),pwd:SDPUtil.parse_icepwd(SDPUtil.find_line(mediadesc,"a=ice-pwd:",sessiondesc))}),data},parse_iceufrag:function(line){return line.substring(12)},build_iceufrag:function(frag){return"a=ice-ufrag:"+frag},parse_icepwd:function(line){return line.substring(10)},build_icepwd:function(pwd){return"a=ice-pwd:"+pwd},parse_mid:function(line){return line.substring(6)},parse_mline:function(line){var parts=line.substring(2).split(" "),data={};return data.media=parts.shift(),data.port=parts.shift(),data.proto=parts.shift(),""===parts[parts.length-1]&&parts.pop(),data.fmt=parts,data},build_mline:function(mline){return"m="+mline.media+" "+mline.port+" "+mline.proto+" "+mline.fmt.join(" ")},parse_rtpmap:function(line){var parts=line.substring(9).split(" "),data={};return data.id=parts.shift(),parts=parts[0].split("/"),data.name=parts.shift(),data.clockrate=parts.shift(),data.channels=parts.length?parts.shift():"1",data},build_rtpmap:function(el){var line="a=rtpmap:"+el.getAttribute("id")+" "+el.getAttribute("name")+"/"+el.getAttribute("clockrate");return el.getAttribute("channels")&&"1"!=el.getAttribute("channels")&&(line+="/"+el.getAttribute("channels")),line},parse_crypto:function(line){var parts=line.substring(9).split(" "),data={};return data.tag=parts.shift(),data["crypto-suite"]=parts.shift(),data["key-params"]=parts.shift(),parts.length&&(data["session-params"]=parts.join(" ")),data},parse_fingerprint:function(line){var parts=line.substring(14).split(" "),data={};return data.hash=parts.shift(),data.fingerprint=parts.shift(),data},parse_fmtp:function(line){var i,key,value,parts=line.split(" "),data=[];for(parts.shift(),parts=parts.join(" ").split(";"),i=0;i<parts.length;i++){for(key=parts[i].split("=")[0];key.length&&" "==key[0];)key=key.substring(1);value=parts[i].split("=")[1],key&&value?data.push({name:key,value:value}):key&&data.push({name:"",value:key})}return data},parse_icecandidate:function(line){var candidate={},elems=line.split(" ");candidate.foundation=elems[0].substring(12),candidate.component=elems[1],candidate.protocol=elems[2].toLowerCase(),candidate.priority=elems[3],candidate.ip=elems[4],candidate.port=elems[5],candidate.type=elems[7],candidate.generation=0;for(var i=8;i<elems.length;i+=2)switch(elems[i]){case"raddr":candidate["rel-addr"]=elems[i+1];break;case"rport":candidate["rel-port"]=elems[i+1];break;case"generation":candidate.generation=elems[i+1];break;case"tcptype":candidate.tcptype=elems[i+1];break;default:console.log('parse_icecandidate not translating "'+elems[i]+'" = "'+elems[i+1]+'"')}return candidate.network="1",candidate.id=Math.random().toString(36).substr(2,10),candidate},build_icecandidate:function(cand){var line=["a=candidate:"+cand.foundation,cand.component,cand.protocol,cand.priority,cand.ip,cand.port,"typ",cand.type].join(" ");switch(line+=" ",cand.type){case"srflx":case"prflx":case"relay":cand.hasOwnAttribute("rel-addr")&&cand.hasOwnAttribute("rel-port")&&(line+="raddr",line+=" ",line+=cand["rel-addr"],line+=" ",line+="rport",line+=" ",line+=cand["rel-port"],line+=" ")}return cand.hasOwnAttribute("tcptype")&&(line+="tcptype",line+=" ",line+=cand.tcptype,line+=" "),line+="generation",line+=" ",line+=cand.hasOwnAttribute("generation")?cand.generation:"0"},parse_ssrc:function(desc){for(var lines=desc.split("\r\n"),data={},i=0;i<lines.length;i++)if("a=ssrc:"==lines[i].substring(0,7)){var idx=lines[i].indexOf(" ");data[lines[i].substr(idx+1).split(":",2)[0]]=lines[i].substr(idx+1).split(":",2)[1]}return data},parse_rtcpfb:function(line){var parts=line.substr(10).split(" "),data={};return data.pt=parts.shift(),data.type=parts.shift(),data.params=parts,data},parse_extmap:function(line){var parts=line.substr(9).split(" "),data={};return data.value=parts.shift(),-1!=data.value.indexOf("/")?(data.direction=data.value.substr(data.value.indexOf("/")+1),data.value=data.value.substr(0,data.value.indexOf("/"))):data.direction="both",data.uri=parts.shift(),data.params=parts,data},find_line:function(haystack,needle,sessionpart){for(var lines=haystack.split("\r\n"),i=0;i<lines.length;i++)if(lines[i].substring(0,needle.length)==needle)return lines[i];if(!sessionpart)return!1;lines=sessionpart.split("\r\n");for(var j=0;j<lines.length;j++)if(lines[j].substring(0,needle.length)==needle)return lines[j];return!1},find_lines:function(haystack,needle,sessionpart){for(var lines=haystack.split("\r\n"),needles=[],i=0;i<lines.length;i++)lines[i].substring(0,needle.length)==needle&&needles.push(lines[i]);if(needles.length||!sessionpart)return needles;lines=sessionpart.split("\r\n");for(var j=0;j<lines.length;j++)lines[j].substring(0,needle.length)==needle&&needles.push(lines[j]);return needles},candidateToJingle:function(line){if(0===line.indexOf("candidate:"))line="a="+line;else if("a=candidate:"!=line.substring(0,12))return console.log("parseCandidate called with a line that is not a candidate line"),console.log(line),null;"\r\n"==line.substring(line.length-2)&&(line=line.substring(0,line.length-2));var i,candidate={},elems=line.split(" ");if("typ"!=elems[6])return console.log("did not find typ in the right place"),console.log(line),null;for(candidate.foundation=elems[0].substring(12),candidate.component=elems[1],candidate.protocol=elems[2].toLowerCase(),candidate.priority=elems[3],candidate.ip=elems[4],candidate.port=elems[5],candidate.type=elems[7],candidate.generation="0",i=8;i<elems.length;i+=2)switch(elems[i]){case"raddr":candidate["rel-addr"]=elems[i+1];break;case"rport":candidate["rel-port"]=elems[i+1];break;case"generation":candidate.generation=elems[i+1];break;case"tcptype":candidate.tcptype=elems[i+1];break;default:console.log('not translating "'+elems[i]+'" = "'+elems[i+1]+'"')}return candidate.network="1",candidate.id=Math.random().toString(36).substr(2,10),candidate},candidateFromJingle:function(cand){var line="a=candidate:";switch(line+=cand.getAttribute("foundation"),line+=" ",line+=cand.getAttribute("component"),line+=" ",line+=cand.getAttribute("protocol"),line+=" ",line+=cand.getAttribute("priority"),line+=" ",line+=cand.getAttribute("ip"),line+=" ",line+=cand.getAttribute("port"),line+=" ",line+="typ",line+=" "+cand.getAttribute("type"),line+=" ",cand.getAttribute("type")){case"srflx":case"prflx":case"relay":cand.getAttribute("rel-addr")&&cand.getAttribute("rel-port")&&(line+="raddr",line+=" ",line+=cand.getAttribute("rel-addr"),line+=" ",line+="rport",line+=" ",line+=cand.getAttribute("rel-port"),line+=" ")}return line+="generation",line+=" ",line+=cand.getAttribute("generation")||"0",line+"\r\n"}}}(jQuery);/*!
- * Source: build/lib/strophe.jingle/strophe.jingle.adapter.js, license: MIT, url: https://github.com/ESTOS/strophe.jingle */
-var setupRTC,getUserMediaWithConstraints,TraceablePeerConnection;!function($){TraceablePeerConnection=function(ice_config,constraints){var self=this,RTCPeerconnection=navigator.mozGetUserMedia?mozRTCPeerConnection:webkitRTCPeerConnection;this.peerconnection=new RTCPeerconnection(ice_config,constraints),this.updateLog=[],this.stats={},this.statsinterval=null,this.maxstats=300,this.trace=function(what,info){self.updateLog.push({time:new Date,type:what,value:info||""})},this.onicecandidate=null,this.peerconnection.onicecandidate=function(event){self.trace("onicecandidate",JSON.stringify(event.candidate,null," ")),null!==self.onicecandidate&&self.onicecandidate(event)},this.onaddstream=null,this.peerconnection.onaddstream=function(event){self.trace("onaddstream",event.stream.id),null!==self.onaddstream&&self.onaddstream(event)},this.onremovestream=null,this.peerconnection.onremovestream=function(event){self.trace("onremovestream",event.stream.id),null!==self.onremovestream&&self.onremovestream(event)},this.onsignalingstatechange=null,this.peerconnection.onsignalingstatechange=function(event){self.trace("onsignalingstatechange",self.signalingState),null!==self.onsignalingstatechange&&self.onsignalingstatechange(event)},this.oniceconnectionstatechange=null,this.peerconnection.oniceconnectionstatechange=function(event){self.trace("oniceconnectionstatechange",self.iceConnectionState),null!==self.oniceconnectionstatechange&&self.oniceconnectionstatechange(event)},this.onnegotiationneeded=null,this.peerconnection.onnegotiationneeded=function(event){self.trace("onnegotiationneeded"),null!==self.onnegotiationneeded&&self.onnegotiationneeded(event)},self.ondatachannel=null,this.peerconnection.ondatachannel=function(event){self.trace("ondatachannel",event),null!==self.ondatachannel&&self.ondatachannel(event)},navigator.mozGetUserMedia||(this.statsinterval=window.setInterval(function(){self.peerconnection.getStats(function(stats){for(var results=stats.result(),i=0;i<results.length;++i){var now=new Date;results[i].names().forEach(function(name){var id=results[i].id+"-"+name;self.stats[id]||(self.stats[id]={startTime:now,endTime:now,values:[],times:[]}),self.stats[id].values.push(results[i].stat(name)),self.stats[id].times.push(now.getTime()),self.stats[id].values.length>self.maxstats&&(self.stats[id].values.shift(),self.stats[id].times.shift()),self.stats[id].endTime=now})}})},1e3))},dumpSDP=function(description){return"type: "+description.type+"\r\n"+description.sdp},void 0!==TraceablePeerConnection.prototype.__defineGetter__&&(TraceablePeerConnection.prototype.__defineGetter__("signalingState",function(){return this.peerconnection.signalingState}),TraceablePeerConnection.prototype.__defineGetter__("iceConnectionState",function(){return this.peerconnection.iceConnectionState}),TraceablePeerConnection.prototype.__defineGetter__("localDescription",function(){return this.peerconnection.localDescription}),TraceablePeerConnection.prototype.__defineGetter__("remoteDescription",function(){return this.peerconnection.remoteDescription})),TraceablePeerConnection.prototype.addStream=function(stream){this.trace("addStream",stream.id),this.peerconnection.addStream(stream)},TraceablePeerConnection.prototype.removeStream=function(stream){this.trace("removeStream",stream.id),this.peerconnection.removeStream(stream)},TraceablePeerConnection.prototype.createDataChannel=function(label,opts){this.trace("createDataChannel",label,opts),this.peerconnection.createDataChannel(label,opts)},TraceablePeerConnection.prototype.setLocalDescription=function(description,successCallback,failureCallback){var self=this;this.trace("setLocalDescription",dumpSDP(description)),this.peerconnection.setLocalDescription(description,function(){self.trace("setLocalDescriptionOnSuccess"),successCallback()},function(err){self.trace("setLocalDescriptionOnFailure",err),failureCallback(err)})},TraceablePeerConnection.prototype.setRemoteDescription=function(description,successCallback,failureCallback){var self=this;this.trace("setRemoteDescription",dumpSDP(description)),this.peerconnection.setRemoteDescription(description,function(){self.trace("setRemoteDescriptionOnSuccess"),successCallback()},function(err){self.trace("setRemoteDescriptionOnFailure",err),failureCallback(err)})},TraceablePeerConnection.prototype.close=function(){this.trace("stop"),null!==this.statsinterval&&(window.clearInterval(this.statsinterval),this.statsinterval=null),this.peerconnection.close()},TraceablePeerConnection.prototype.createOffer=function(successCallback,failureCallback,constraints){var self=this;this.trace("createOffer",JSON.stringify(constraints,null," ")),this.peerconnection.createOffer(function(offer){self.trace("createOfferOnSuccess",dumpSDP(offer)),successCallback(offer)},function(err){self.trace("createOfferOnFailure",err),failureCallback(err)},constraints)},TraceablePeerConnection.prototype.createAnswer=function(successCallback,failureCallback,constraints){var self=this;this.trace("createAnswer",JSON.stringify(constraints,null," ")),this.peerconnection.createAnswer(function(answer){self.trace("createAnswerOnSuccess",dumpSDP(answer)),successCallback(answer)},function(err){self.trace("createAnswerOnFailure",err),failureCallback(err)},constraints)},TraceablePeerConnection.prototype.addIceCandidate=function(candidate){this.trace("addIceCandidate",JSON.stringify(candidate,null," ")),this.peerconnection.addIceCandidate(candidate)},TraceablePeerConnection.prototype.getStats=function(callback){navigator.mozGetUserMedia||this.peerconnection.getStats(callback)},setupRTC=function(){var RTC=null;if(navigator.mozGetUserMedia){console.log("This appears to be Firefox");var version=parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1],10);version>=22&&(RTC={peerconnection:mozRTCPeerConnection,browser:"firefox",getUserMedia:navigator.mozGetUserMedia.bind(navigator),attachMediaStream:function(element,stream){element[0].mozSrcObject=stream,element[0].play()},pc_constraints:{}},MediaStream.prototype.getVideoTracks||(MediaStream.prototype.getVideoTracks=function(){return[]}),MediaStream.prototype.getAudioTracks||(MediaStream.prototype.getAudioTracks=function(){return[]}),RTCSessionDescription=mozRTCSessionDescription,RTCIceCandidate=mozRTCIceCandidate)}else navigator.webkitGetUserMedia&&(console.log("This appears to be Chrome"),RTC={peerconnection:webkitRTCPeerConnection,browser:"chrome",getUserMedia:navigator.webkitGetUserMedia.bind(navigator),attachMediaStream:function(element,stream){element.attr("src",webkitURL.createObjectURL(stream))},pc_constraints:{optional:[{DtlsSrtpKeyAgreement:"true"}]}},-1!=navigator.userAgent.indexOf("Android")&&(RTC.pc_constraints={}),webkitMediaStream.prototype.getVideoTracks||(webkitMediaStream.prototype.getVideoTracks=function(){return this.videoTracks}),webkitMediaStream.prototype.getAudioTracks||(webkitMediaStream.prototype.getAudioTracks=function(){return this.audioTracks}));if(null===RTC)try{console.log("Browser does not appear to be WebRTC-capable")}catch(e){}return RTC},getUserMediaWithConstraints=function(um,resolution,bandwidth,fps){var constraints={audio:!1,video:!1};switch(um.indexOf("video")>=0&&(constraints.video={mandatory:{}}),um.indexOf("audio")>=0&&(constraints.audio={}),um.indexOf("screen")>=0&&(constraints.video={mandatory:{chromeMediaSource:"screen"}}),resolution&&!constraints.video&&(constraints.video={mandatory:{}}),resolution){case"1080":case"fullhd":constraints.video.mandatory.minWidth=1920,constraints.video.mandatory.minHeight=1080,constraints.video.mandatory.minAspectRatio=1.77;break;case"720":case"hd":constraints.video.mandatory.minWidth=1280,constraints.video.mandatory.minHeight=720,constraints.video.mandatory.minAspectRatio=1.77;break;case"360":constraints.video.mandatory.minWidth=640,constraints.video.mandatory.minHeight=360,constraints.video.mandatory.minAspectRatio=1.77;break;case"180":constraints.video.mandatory.minWidth=320,constraints.video.mandatory.minHeight=180,constraints.video.mandatory.minAspectRatio=1.77;break;case"960":constraints.video.mandatory.minWidth=960,constraints.video.mandatory.minHeight=720;break;case"640":case"vga":constraints.video.mandatory.minWidth=640,constraints.video.mandatory.minHeight=480;break;case"320":constraints.video.mandatory.minWidth=320,constraints.video.mandatory.minHeight=240;break;default:-1!=navigator.userAgent.indexOf("Android")&&(constraints.video.mandatory.minWidth=320,constraints.video.mandatory.minHeight=240,constraints.video.mandatory.maxFrameRate=15)}bandwidth&&(constraints.video||(constraints.video={mandatory:{}}),constraints.video.optional=[{bandwidth:bandwidth}]),fps&&(constraints.video||(constraints.video={mandatory:{}}),constraints.video.mandatory.minFrameRate=fps);try{RTC.getUserMedia(constraints,function(stream){console.log("onUserMediaSuccess"),$(document).trigger("mediaready.jingle",[stream])},function(error){console.warn("Failed to get access to local media. Error ",error),$(document).trigger("mediafailure.jingle",[error])})}catch(e){console.error("GUM failed: ",e),$(document).trigger("mediafailure.jingle")}}}(jQuery),function(root,factory){"function"==typeof define&&define.amd?define(factory):"undefined"!=typeof module&&module.exports?module.exports=factory():root.Salsa20=factory()}(this,function(){function Salsa20(key,nonce){this.rounds=20,this.sigmaWords=[1634760805,857760878,2036477234,1797285236],this.keyWords=[],this.nonceWords=[0,0],this.counterWords=[0,0],this.block=[],this.blockUsed=64,this.setKey(key),this.setNonce(nonce)}return Salsa20.prototype.setKey=function(key){for(var i=0,j=0;8>i;i++,j+=4)this.keyWords[i]=255&key[j]|(255&key[j+1])<<8|(255&key[j+2])<<16|(255&key[j+3])<<24;this._reset()},Salsa20.prototype.setNonce=function(nonce){this.nonceWords[0]=255&nonce[0]|(255&nonce[1])<<8|(255&nonce[2])<<16|(255&nonce[3])<<24,this.nonceWords[1]=255&nonce[4]|(255&nonce[5])<<8|(255&nonce[6])<<16|(255&nonce[7])<<24,this._reset()},Salsa20.prototype.getBytes=function(numberOfBytes){for(var out=new Array(numberOfBytes),i=0;numberOfBytes>i;i++)64==this.blockUsed&&(this._generateBlock(),this._incrementCounter(),this.blockUsed=0),out[i]=this.block[this.blockUsed],this.blockUsed++;return out},Salsa20.prototype.getHexString=function(numberOfBytes){for(var hex=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],out=[],bytes=this.getBytes(numberOfBytes),i=0;i<bytes.length;i++)out.push(hex[bytes[i]>>4&15]),out.push(hex[15&bytes[i]]);return out.join("")},Salsa20.prototype._reset=function(){this.counterWords[0]=0,this.counterWords[1]=0,this.blockUsed=64},Salsa20.prototype._incrementCounter=function(){this.counterWords[0]=this.counterWords[0]+1&4294967295,0==this.counterWords[0]&&(this.counterWords[1]=this.counterWords[1]+1&4294967295)},Salsa20.prototype._generateBlock=function(){for(var u,j0=this.sigmaWords[0],j1=this.keyWords[0],j2=this.keyWords[1],j3=this.keyWords[2],j4=this.keyWords[3],j5=this.sigmaWords[1],j6=this.nonceWords[0],j7=this.nonceWords[1],j8=this.counterWords[0],j9=this.counterWords[1],j10=this.sigmaWords[2],j11=this.keyWords[4],j12=this.keyWords[5],j13=this.keyWords[6],j14=this.keyWords[7],j15=this.sigmaWords[3],x0=j0,x1=j1,x2=j2,x3=j3,x4=j4,x5=j5,x6=j6,x7=j7,x8=j8,x9=j9,x10=j10,x11=j11,x12=j12,x13=j13,x14=j14,x15=j15,i=0;i<this.rounds;i+=2)u=x0+x12,x4^=u<<7|u>>>25,u=x4+x0,x8^=u<<9|u>>>23,u=x8+x4,x12^=u<<13|u>>>19,u=x12+x8,x0^=u<<18|u>>>14,u=x5+x1,x9^=u<<7|u>>>25,u=x9+x5,x13^=u<<9|u>>>23,u=x13+x9,x1^=u<<13|u>>>19,u=x1+x13,x5^=u<<18|u>>>14,u=x10+x6,x14^=u<<7|u>>>25,u=x14+x10,x2^=u<<9|u>>>23,u=x2+x14,x6^=u<<13|u>>>19,u=x6+x2,x10^=u<<18|u>>>14,u=x15+x11,x3^=u<<7|u>>>25,u=x3+x15,x7^=u<<9|u>>>23,u=x7+x3,x11^=u<<13|u>>>19,u=x11+x7,x15^=u<<18|u>>>14,u=x0+x3,x1^=u<<7|u>>>25,u=x1+x0,x2^=u<<9|u>>>23,u=x2+x1,x3^=u<<13|u>>>19,u=x3+x2,x0^=u<<18|u>>>14,u=x5+x4,x6^=u<<7|u>>>25,u=x6+x5,x7^=u<<9|u>>>23,u=x7+x6,x4^=u<<13|u>>>19,u=x4+x7,x5^=u<<18|u>>>14,u=x10+x9,x11^=u<<7|u>>>25,u=x11+x10,x8^=u<<9|u>>>23,u=x8+x11,x9^=u<<13|u>>>19,u=x9+x8,x10^=u<<18|u>>>14,u=x15+x14,x12^=u<<7|u>>>25,u=x12+x15,x13^=u<<9|u>>>23,u=x13+x12,x14^=u<<13|u>>>19,u=x14+x13,x15^=u<<18|u>>>14;x0+=j0,x1+=j1,x2+=j2,x3+=j3,x4+=j4,x5+=j5,x6+=j6,x7+=j7,x8+=j8,x9+=j9,x10+=j10,x11+=j11,x12+=j12,x13+=j13,x14+=j14,x15+=j15,this.block[0]=x0>>>0&255,this.block[1]=x0>>>8&255,this.block[2]=x0>>>16&255,this.block[3]=x0>>>24&255,this.block[4]=x1>>>0&255,this.block[5]=x1>>>8&255,this.block[6]=x1>>>16&255,this.block[7]=x1>>>24&255,this.block[8]=x2>>>0&255,this.block[9]=x2>>>8&255,this.block[10]=x2>>>16&255,this.block[11]=x2>>>24&255,this.block[12]=x3>>>0&255,this.block[13]=x3>>>8&255,this.block[14]=x3>>>16&255,this.block[15]=x3>>>24&255,this.block[16]=x4>>>0&255,this.block[17]=x4>>>8&255,this.block[18]=x4>>>16&255,this.block[19]=x4>>>24&255,this.block[20]=x5>>>0&255,this.block[21]=x5>>>8&255,this.block[22]=x5>>>16&255,this.block[23]=x5>>>24&255,this.block[24]=x6>>>0&255,this.block[25]=x6>>>8&255,this.block[26]=x6>>>16&255,this.block[27]=x6>>>24&255,this.block[28]=x7>>>0&255,this.block[29]=x7>>>8&255,this.block[30]=x7>>>16&255,this.block[31]=x7>>>24&255,this.block[32]=x8>>>0&255,this.block[33]=x8>>>8&255,this.block[34]=x8>>>16&255,this.block[35]=x8>>>24&255,this.block[36]=x9>>>0&255,this.block[37]=x9>>>8&255,this.block[38]=x9>>>16&255,this.block[39]=x9>>>24&255,this.block[40]=x10>>>0&255,this.block[41]=x10>>>8&255,this.block[42]=x10>>>16&255,this.block[43]=x10>>>24&255,this.block[44]=x11>>>0&255,this.block[45]=x11>>>8&255,this.block[46]=x11>>>16&255,this.block[47]=x11>>>24&255,this.block[48]=x12>>>0&255,this.block[49]=x12>>>8&255,this.block[50]=x12>>>16&255,this.block[51]=x12>>>24&255,this.block[52]=x13>>>0&255,this.block[53]=x13>>>8&255,this.block[54]=x13>>>16&255,this.block[55]=x13>>>24&255,this.block[56]=x14>>>0&255,this.block[57]=x14>>>8&255,this.block[58]=x14>>>16&255,this.block[59]=x14>>>24&255,this.block[60]=x15>>>0&255,this.block[61]=x15>>>8&255,this.block[62]=x15>>>16&255,this.block[63]=x15>>>24&255},Salsa20}),function(root,factory){"function"==typeof define&&define.amd?define(factory.bind(root,root.crypto||root.msCrypto)):"undefined"!=typeof module&&module.exports?module.exports=factory(require("crypto")):root.BigInt=factory(root.crypto||root.msCrypto)}(this,function(crypto){function findPrimes(n){var i,s,p,ans;for(s=new Array(n),i=0;n>i;i++)s[i]=0;for(s[0]=2,p=0;s[p]<n;){for(i=s[p]*s[p];n>i;i+=s[p])s[i]=1;for(p++,s[p]=s[p-1]+1;s[p]<n&&s[s[p]];s[p]++);}for(ans=new Array(p),i=0;p>i;i++)ans[i]=s[i];return ans}function millerRabin(x,b){var i,j,k,s;if(mr_x1.length!=x.length&&(mr_x1=dup(x),mr_r=dup(x),mr_a=dup(x)),copy_(mr_a,b),copy_(mr_r,x),copy_(mr_x1,x),addInt_(mr_r,-1),addInt_(mr_x1,-1),isZero(mr_r))return 0;for(k=0;0==mr_r[k];k++);for(i=1,j=2;mr_r[k]%j==0;j*=2,i++);if(s=k*bpe+i-1,s&&rightShift_(mr_r,s),powMod_(mr_a,mr_r,x),!equalsInt(mr_a,1)&&!equals(mr_a,mr_x1)){for(j=1;s-1>=j&&!equals(mr_a,mr_x1);){if(squareMod_(mr_a,x),equalsInt(mr_a,1))return 0;j++}if(!equals(mr_a,mr_x1))return 0}return 1}function bitSize(x){var j,z,w;for(j=x.length-1;0==x[j]&&j>0;j--);for(z=0,w=x[j];w;w>>=1,z++);return z+=bpe*j}function expand(x,n){var ans=int2bigInt(0,(x.length>n?x.length:n)*bpe,0);return copy_(ans,x),ans}function mod(x,n){var ans=dup(x);return mod_(ans,n),trim(ans,1)}function mult(x,y){var ans=expand(x,x.length+y.length);return mult_(ans,y),trim(ans,1)}function powMod(x,y,n){var ans=expand(x,n.length);return powMod_(ans,trim(y,2),trim(n,2),0),trim(ans,1)}function sub(x,y){var ans=expand(x,x.length>y.length?x.length+1:y.length+1);return sub_(ans,y),trim(ans,1)}function add(x,y){var ans=expand(x,x.length>y.length?x.length+1:y.length+1);return add_(ans,y),trim(ans,1)}function inverseMod(x,n){var s,ans=expand(x,n.length);return s=inverseMod_(ans,n),s?trim(ans,1):null}function multMod(x,y,n){var ans=expand(x,n.length);return multMod_(ans,y,n),trim(ans,1)}function randBigInt(n,s){var a,b;return a=Math.floor((n-1)/bpe)+2,b=int2bigInt(0,0,a),randBigInt_(b,n,s),b}function randBigInt_(b,n,s){var i,a;for(i=0;i<b.length;i++)b[i]=0;for(a=Math.floor((n-1)/bpe)+1,i=0;a>i;i++)b[i]=randomBitInt(bpe);b[a-1]&=(2<<(n-1)%bpe)-1,1==s&&(b[a-1]|=1<<(n-1)%bpe)}function inverseMod_(x,n){var k=1+2*Math.max(x.length,n.length);if(!(1&x[0]||1&n[0]))return copyInt_(x,0),0;for(eg_u.length!=k&&(eg_u=new Array(k),eg_v=new Array(k),eg_A=new Array(k),eg_B=new Array(k),eg_C=new Array(k),eg_D=new Array(k)),copy_(eg_u,x),copy_(eg_v,n),copyInt_(eg_A,1),copyInt_(eg_B,0),copyInt_(eg_C,0),copyInt_(eg_D,1);;){for(;!(1&eg_u[0]);)halve_(eg_u),1&eg_A[0]||1&eg_B[0]?(add_(eg_A,n),halve_(eg_A),sub_(eg_B,x),halve_(eg_B)):(halve_(eg_A),halve_(eg_B));for(;!(1&eg_v[0]);)halve_(eg_v),1&eg_C[0]||1&eg_D[0]?(add_(eg_C,n),halve_(eg_C),sub_(eg_D,x),halve_(eg_D)):(halve_(eg_C),halve_(eg_D));if(greater(eg_v,eg_u)?(sub_(eg_v,eg_u),sub_(eg_C,eg_A),sub_(eg_D,eg_B)):(sub_(eg_u,eg_v),sub_(eg_A,eg_C),sub_(eg_B,eg_D)),equalsInt(eg_u,0)){for(;negative(eg_C);)add_(eg_C,n);return copy_(x,eg_C),equalsInt(eg_v,1)?1:(copyInt_(x,0),0)}}}function inverseModInt(x,n){for(var a=1,b=0;;){if(1==x)return a;if(0==x)return 0;if(b-=a*Math.floor(n/x),n%=x,1==n)return b;if(0==n)return 0;a-=b*Math.floor(x/n),x%=n}}function negative(x){return x[x.length-1]>>bpe-1&1}function greaterShift(x,y,shift){var i,kx=x.length,ky=y.length,k=ky>kx+shift?kx+shift:ky;for(i=ky-1-shift;kx>i&&i>=0;i++)if(x[i]>0)return 1;for(i=kx-1+shift;ky>i;i++)if(y[i]>0)return 0;for(i=k-1;i>=shift;i--){if(x[i-shift]>y[i])return 1;if(x[i-shift]<y[i])return 0}return 0}function greater(x,y){var i,k=x.length<y.length?x.length:y.length;for(i=x.length;i<y.length;i++)if(y[i])return 0;for(i=y.length;i<x.length;i++)if(x[i])return 1;for(i=k-1;i>=0;i--){if(x[i]>y[i])return 1;if(x[i]<y[i])return 0}return 0}function divide_(x,y,q,r){var kx,ky,i,y1,y2,c,a,b;for(copy_(r,x),ky=y.length;0==y[ky-1];ky--);for(b=y[ky-1],a=0;b;a++)b>>=1;for(a=bpe-a,leftShift_(y,a),leftShift_(r,a),kx=r.length;0==r[kx-1]&&kx>ky;kx--);for(copyInt_(q,0);!greaterShift(y,r,kx-ky);)subShift_(r,y,kx-ky),q[kx-ky]++;for(i=kx-1;i>=ky;i--){for(q[i-ky]=r[i]==y[ky-1]?mask:Math.floor((r[i]*radix+r[i-1])/y[ky-1]);y2=(ky>1?y[ky-2]:0)*q[i-ky],c=y2,y2&=mask,c=(c-y2)/radix,y1=c+q[i-ky]*y[ky-1],c=y1,y1&=mask,c=(c-y1)/radix,c==r[i]?y1==r[i-1]?y2>(i>1?r[i-2]:0):y1>r[i-1]:c>r[i];)q[i-ky]--;linCombShift_(r,y,-q[i-ky],i-ky),negative(r)&&(addShift_(r,y,i-ky),q[i-ky]--)}rightShift_(y,a),rightShift_(r,a)}function modInt(x,n){var i,c=0;for(i=x.length-1;i>=0;i--)c=(c*radix+x[i])%n;return c}function int2bigInt(t,bits,minSize){var k,buff;return k=Math.ceil(bits/bpe)+1,k=minSize>k?minSize:k,buff=new Array(k),copyInt_(buff,t),buff}function str2bigInt(s,base,minSize){var d,i,x,y,kk,k=s.length;if(-1==base){for(x=new Array(0);;){for(y=new Array(x.length+1),i=0;i<x.length;i++)y[i+1]=x[i];if(y[0]=parseInt(s,10),x=y,d=s.indexOf(",",0),1>d)break;if(s=s.substring(d+1),0==s.length)break}return x.length<minSize?(y=new Array(minSize),copy_(y,x),y):x}for(var bb=base,p=0,b=1==base?k:0;bb>1;)1&bb&&(p=1),b+=k,bb>>=1;for(b+=p*k,x=int2bigInt(0,b,0),i=0;k>i&&(d=digitsStr.indexOf(s.substring(i,i+1),0),36>=base&&d>=36&&(d-=26),!(d>=base||0>d));i++)multInt_(x,base),addInt_(x,d);for(k=x.length;k>0&&!x[k-1];k--);for(k=minSize>k+1?minSize:k+1,y=new Array(k),kk=k<x.length?k:x.length,i=0;kk>i;i++)y[i]=x[i];for(;k>i;i++)y[i]=0;return y}function equalsInt(x,y){var i;if(x[0]!=y)return 0;for(i=1;i<x.length;i++)if(x[i])return 0;return 1}function equals(x,y){var i,k=x.length<y.length?x.length:y.length;for(i=0;k>i;i++)if(x[i]!=y[i])return 0;if(x.length>y.length){for(;i<x.length;i++)if(x[i])return 0}else for(;i<y.length;i++)if(y[i])return 0;return 1}function isZero(x){var i;for(i=0;i<x.length;i++)if(x[i])return 0;return 1}function bigInt2str(x,base){var i,t,s="";if(s6.length!=x.length?s6=dup(x):copy_(s6,x),-1==base){for(i=x.length-1;i>0;i--)s+=x[i]+",";s+=x[0]}else for(;!isZero(s6);)t=divInt_(s6,base),s=digitsStr.substring(t,t+1)+s;return 0==s.length&&(s="0"),s}function dup(x){var buff;return buff=new Array(x.length),copy_(buff,x),buff}function copy_(x,y){var i,k=x.length<y.length?x.length:y.length;for(i=0;k>i;i++)x[i]=y[i];for(i=k;i<x.length;i++)x[i]=0}function copyInt_(x,n){var i,c;for(c=n,i=0;i<x.length;i++)x[i]=c&mask,c>>=bpe}function addInt_(x,n){var i,k,c,b;for(x[0]+=n,k=x.length,c=0,i=0;k>i;i++)if(c+=x[i],b=0,0>c&&(b=c&mask,b=-((c-b)/radix),c+=b*radix),x[i]=c&mask,c=(c-x[i])/radix-b,!c)return}function rightShift_(x,n){var i,k=Math.floor(n/bpe);if(k){for(i=0;i<x.length-k;i++)x[i]=x[i+k];for(;i<x.length;i++)x[i]=0;n%=bpe}for(i=0;i<x.length-1;i++)x[i]=mask&(x[i+1]<<bpe-n|x[i]>>n);x[i]>>=n}function halve_(x){var i;for(i=0;i<x.length-1;i++)x[i]=mask&(x[i+1]<<bpe-1|x[i]>>1);x[i]=x[i]>>1|x[i]&radix>>1}function leftShift_(x,n){var i,k=Math.floor(n/bpe);if(k){for(i=x.length;i>=k;i--)x[i]=x[i-k];for(;i>=0;i--)x[i]=0;n%=bpe}if(n){for(i=x.length-1;i>0;i--)x[i]=mask&(x[i]<<n|x[i-1]>>bpe-n);x[i]=mask&x[i]<<n}}function multInt_(x,n){var i,k,c,b;if(n)for(k=x.length,c=0,i=0;k>i;i++)c+=x[i]*n,b=0,0>c&&(b=c&mask,b=-((c-b)/radix),c+=b*radix),x[i]=c&mask,c=(c-x[i])/radix-b}function divInt_(x,n){var i,s,r=0;for(i=x.length-1;i>=0;i--)s=r*radix+x[i],x[i]=Math.floor(s/n),r=s%n;return r}function linCombShift_(x,y,b,ys){var i,c,k,kk;for(k=x.length<ys+y.length?x.length:ys+y.length,kk=x.length,c=0,i=ys;k>i;i++)c+=x[i]+b*y[i-ys],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&kk>i;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function addShift_(x,y,ys){var i,c,k,kk;for(k=x.length<ys+y.length?x.length:ys+y.length,kk=x.length,c=0,i=ys;k>i;i++)c+=x[i]+y[i-ys],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&kk>i;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function subShift_(x,y,ys){var i,c,k,kk;for(k=x.length<ys+y.length?x.length:ys+y.length,kk=x.length,c=0,i=ys;k>i;i++)c+=x[i]-y[i-ys],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&kk>i;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function sub_(x,y){var i,c,k;for(k=x.length<y.length?x.length:y.length,c=0,i=0;k>i;i++)c+=x[i]-y[i],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&i<x.length;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function add_(x,y){var i,c,k;for(k=x.length<y.length?x.length:y.length,c=0,i=0;k>i;i++)c+=x[i]+y[i],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&i<x.length;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function mult_(x,y){var i;for(ss.length!=2*x.length&&(ss=new Array(2*x.length)),copyInt_(ss,0),i=0;i<y.length;i++)y[i]&&linCombShift_(ss,x,y[i],i);copy_(x,ss)}function mod_(x,n){s4.length!=x.length?s4=dup(x):copy_(s4,x),s5.length!=x.length&&(s5=dup(x)),divide_(s4,n,s5,x)}function multMod_(x,y,n){var i;for(s0.length!=2*x.length&&(s0=new Array(2*x.length)),copyInt_(s0,0),i=0;i<y.length;i++)y[i]&&linCombShift_(s0,x,y[i],i);mod_(s0,n),copy_(x,s0)}function squareMod_(x,n){var i,j,c,kx,k;for(kx=x.length;kx>0&&!x[kx-1];kx--);for(k=kx>n.length?2*kx:2*n.length,s0.length!=k&&(s0=new Array(k)),copyInt_(s0,0),i=0;kx>i;i++){for(c=s0[2*i]+x[i]*x[i],s0[2*i]=c&mask,c=(c-s0[2*i])/radix,j=i+1;kx>j;j++)c=s0[i+j]+2*x[i]*x[j]+c,s0[i+j]=c&mask,c=(c-s0[i+j])/radix;s0[i+kx]=c}mod_(s0,n),copy_(x,s0)}function trim(x,k){var i,y;for(i=x.length;i>0&&!x[i-1];i--);return y=new Array(i+k),copy_(y,x),y}function powMod_(x,y,n){var k1,k2,kn,np;if(s7.length!=n.length&&(s7=dup(n)),0!=(1&n[0])){for(copyInt_(s7,0),kn=n.length;kn>0&&!n[kn-1];kn--);for(np=radix-inverseModInt(modInt(n,radix),radix),s7[kn]=1,multMod_(x,s7,n),s3.length!=x.length?s3=dup(x):copy_(s3,x),k1=y.length-1;k1>0&!y[k1];k1--);if(0==y[k1])return void copyInt_(x,1);for(k2=1<<bpe-1;k2&&!(y[k1]&k2);k2>>=1);for(;;){if(!(k2>>=1)){if(k1--,0>k1)return void mont_(x,one,n,np);k2=1<<bpe-1}mont_(x,x,n,np),k2&y[k1]&&mont_(x,s3,n,np)}}else for(copy_(s7,x),copyInt_(x,1);!equalsInt(y,0);)1&y[0]&&multMod_(x,s7,n),divInt_(y,2),squareMod_(s7,n)}function mont_(x,y,n,np){var i,j,c,ui,t,t2,ks,kn=n.length,ky=y.length;for(sa.length!=kn&&(sa=new Array(kn)),copyInt_(sa,0);kn>0&&0==n[kn-1];kn--);for(;ky>0&&0==y[ky-1];ky--);for(ks=sa.length-1,i=0;kn>i;i++){for(t=sa[0]+x[i]*y[0],ui=(t&mask)*np&mask,c=t+ui*n[0],c=(c-(c&mask))/radix,t=x[i],j=1;ky-4>j;)c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;ky>j;)c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;kn-4>j;)c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;kn>j;)c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;ks>j;)c+=sa[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;sa[j-1]=c&mask}greater(n,sa)||sub_(sa,n),copy_(x,sa)}function divMod(num,den,n){return multMod(num,inverseMod(den,n),n)}function subMod(one,two,n){return one=mod(one,n),two=mod(two,n),greater(two,one)&&(one=add(one,n)),sub(one,two)}function twoToThe(m){for(var b=Math.floor(m/bpe)+2,t=new Array(b),i=0;b>i;i++)t[i]=0;return t[b-2]=1<<m%bpe,t}function bigInt2bits(bi,pad){pad||(pad=0),bi=dup(bi);for(var ba="";!isZero(bi);)ba=_num2bin[255&bi[0]]+ba,rightShift_(bi,8);for(;ba.length<pad;)ba="\x00"+ba;return ba}function ba2bigInt(data){var mpi=str2bigInt("0",10,data.length);return data.forEach(function(d,i){i&&leftShift_(mpi,8),mpi[0]|=d}),mpi}function getSeed(){return randomBytes(40)}function randomByte(){return randomBytes(1)[0]}function randomBitInt(k){if(k>31)throw new Error("Too many bits.");var i=0,r=0,b=Math.floor(k/8),mask=(1<<k%8)-1;for(mask&&(r=randomByte()&mask);b>i;i++)r=256*r+randomByte();return r}var bpe=26,radix=1<<bpe,mask=radix-1,digitsStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-",one=int2bigInt(1,1,1),t=new Array(0),ss=t,s0=t,s3=t,s4=t,s5=t,s6=t,s7=t,sa=t,mr_x1=t,mr_r=t,mr_a=t,eg_v=t,eg_u=t,eg_A=t,eg_B=t,eg_C=t,eg_D=t,primes=t,_num2bin=function(){for(var i=0,_num2bin={};256>i;++i)_num2bin[i]=String.fromCharCode(i);return _num2bin}(),randomBytes=function(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomBytes)return function(n){try{var buf=crypto.randomBytes(n)}catch(e){throw e}return Array.prototype.slice.call(buf,0)};if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)return function(n){var buf=new Uint8Array(n);return crypto.getRandomValues(buf),Array.prototype.slice.call(buf,0)};throw new Error("Keys should not be generated without CSPRNG.")}();return{str2bigInt:str2bigInt,bigInt2str:bigInt2str,int2bigInt:int2bigInt,multMod:multMod,powMod:powMod,inverseMod:inverseMod,randBigInt:randBigInt,randBigInt_:randBigInt_,equals:equals,equalsInt:equalsInt,sub:sub,mod:mod,modInt:modInt,mult:mult,divInt_:divInt_,rightShift_:rightShift_,dup:dup,greater:greater,add:add,isZero:isZero,bitSize:bitSize,millerRabin:millerRabin,divide_:divide_,trim:trim,primes:primes,findPrimes:findPrimes,getSeed:getSeed,divMod:divMod,subMod:subMod,twoToThe:twoToThe,bigInt2bits:bigInt2bits,ba2bigInt:ba2bigInt}}),function(root,factory){"function"==typeof define&&define.amd?define(factory):"undefined"!=typeof module&&module.exports?module.exports=factory():root.CryptoJS=factory()}(this,function(){var CryptoJS=CryptoJS||function(Math,undefined){var C={},C_lib=C.lib={},Base=C_lib.Base=function(){function F(){}return{extend:function(overrides){F.prototype=this;var subtype=new F;return overrides&&subtype.mixIn(overrides),subtype.hasOwnProperty("init")||(subtype.init=function(){subtype.$super.init.apply(this,arguments)}),subtype.init.prototype=subtype,subtype.$super=this,subtype},create:function(){var instance=this.extend();return instance.init.apply(instance,arguments),instance},init:function(){},mixIn:function(properties){for(var propertyName in properties)properties.hasOwnProperty(propertyName)&&(this[propertyName]=properties[propertyName]);properties.hasOwnProperty("toString")&&(this.toString=properties.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),WordArray=C_lib.WordArray=Base.extend({init:function(words,sigBytes){words=this.words=words||[],this.sigBytes=sigBytes!=undefined?sigBytes:4*words.length},toString:function(encoder){return(encoder||Hex).stringify(this)},concat:function(wordArray){var thisWords=this.words,thatWords=wordArray.words,thisSigBytes=this.sigBytes,thatSigBytes=wordArray.sigBytes;if(this.clamp(),thisSigBytes%4)for(var i=0;thatSigBytes>i;i++){var thatByte=thatWords[i>>>2]>>>24-i%4*8&255;thisWords[thisSigBytes+i>>>2]|=thatByte<<24-(thisSigBytes+i)%4*8}else if(thatWords.length>65535)for(var i=0;thatSigBytes>i;i+=4)thisWords[thisSigBytes+i>>>2]=thatWords[i>>>2];else thisWords.push.apply(thisWords,thatWords);return this.sigBytes+=thatSigBytes,this},clamp:function(){var words=this.words,sigBytes=this.sigBytes;words[sigBytes>>>2]&=4294967295<<32-sigBytes%4*8,words.length=Math.ceil(sigBytes/4)},clone:function(){var clone=Base.clone.call(this);return clone.words=this.words.slice(0),clone},random:function(nBytes){for(var words=[],i=0;nBytes>i;i+=4)words.push(4294967296*Math.random()|0);return new WordArray.init(words,nBytes)}}),C_enc=C.enc={},Hex=C_enc.Hex={stringify:function(wordArray){for(var words=wordArray.words,sigBytes=wordArray.sigBytes,hexChars=[],i=0;sigBytes>i;i++){var bite=words[i>>>2]>>>24-i%4*8&255;hexChars.push((bite>>>4).toString(16)),hexChars.push((15&bite).toString(16))}return hexChars.join("")},parse:function(hexStr){for(var hexStrLength=hexStr.length,words=[],i=0;hexStrLength>i;i+=2)words[i>>>3]|=parseInt(hexStr.substr(i,2),16)<<24-i%8*4;return new WordArray.init(words,hexStrLength/2)}},Latin1=C_enc.Latin1={stringify:function(wordArray){for(var words=wordArray.words,sigBytes=wordArray.sigBytes,latin1Chars=[],i=0;sigBytes>i;i++){var bite=words[i>>>2]>>>24-i%4*8&255;latin1Chars.push(String.fromCharCode(bite))}return latin1Chars.join("")},parse:function(latin1Str){for(var latin1StrLength=latin1Str.length,words=[],i=0;latin1StrLength>i;i++)words[i>>>2]|=(255&latin1Str.charCodeAt(i))<<24-i%4*8;return new WordArray.init(words,latin1StrLength)}},Utf8=C_enc.Utf8={stringify:function(wordArray){try{return decodeURIComponent(escape(Latin1.stringify(wordArray)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(utf8Str){return Latin1.parse(unescape(encodeURIComponent(utf8Str)))}},BufferedBlockAlgorithm=C_lib.BufferedBlockAlgorithm=Base.extend({reset:function(){this._data=new WordArray.init,this._nDataBytes=0},_append:function(data){"string"==typeof data&&(data=Utf8.parse(data)),this._data.concat(data),this._nDataBytes+=data.sigBytes},_process:function(doFlush){var data=this._data,dataWords=data.words,dataSigBytes=data.sigBytes,blockSize=this.blockSize,blockSizeBytes=4*blockSize,nBlocksReady=dataSigBytes/blockSizeBytes;nBlocksReady=doFlush?Math.ceil(nBlocksReady):Math.max((0|nBlocksReady)-this._minBufferSize,0);var nWordsReady=nBlocksReady*blockSize,nBytesReady=Math.min(4*nWordsReady,dataSigBytes);if(nWordsReady){for(var offset=0;nWordsReady>offset;offset+=blockSize)this._doProcessBlock(dataWords,offset);var processedWords=dataWords.splice(0,nWordsReady);data.sigBytes-=nBytesReady}return new WordArray.init(processedWords,nBytesReady)},clone:function(){var clone=Base.clone.call(this);return clone._data=this._data.clone(),clone},_minBufferSize:0}),C_algo=(C_lib.Hasher=BufferedBlockAlgorithm.extend({cfg:Base.extend(),init:function(cfg){this.cfg=this.cfg.extend(cfg),this.reset()},reset:function(){BufferedBlockAlgorithm.reset.call(this),this._doReset()},update:function(messageUpdate){return this._append(messageUpdate),this._process(),this},finalize:function(messageUpdate){messageUpdate&&this._append(messageUpdate);var hash=this._doFinalize();return hash},blockSize:16,_createHelper:function(hasher){return function(message,cfg){return new hasher.init(cfg).finalize(message)}},_createHmacHelper:function(hasher){return function(message,key){return new C_algo.HMAC.init(hasher,key).finalize(message)}}}),C.algo={});
-return C}(Math);return function(){{var C=CryptoJS,C_lib=C.lib,WordArray=C_lib.WordArray,C_enc=C.enc;C_enc.Base64={stringify:function(wordArray){var words=wordArray.words,sigBytes=wordArray.sigBytes,map=this._map;wordArray.clamp();for(var base64Chars=[],i=0;sigBytes>i;i+=3)for(var byte1=words[i>>>2]>>>24-i%4*8&255,byte2=words[i+1>>>2]>>>24-(i+1)%4*8&255,byte3=words[i+2>>>2]>>>24-(i+2)%4*8&255,triplet=byte1<<16|byte2<<8|byte3,j=0;4>j&&sigBytes>i+.75*j;j++)base64Chars.push(map.charAt(triplet>>>6*(3-j)&63));var paddingChar=map.charAt(64);if(paddingChar)for(;base64Chars.length%4;)base64Chars.push(paddingChar);return base64Chars.join("")},parse:function(base64Str){var base64StrLength=base64Str.length,map=this._map,paddingChar=map.charAt(64);if(paddingChar){var paddingIndex=base64Str.indexOf(paddingChar);-1!=paddingIndex&&(base64StrLength=paddingIndex)}for(var words=[],nBytes=0,i=0;base64StrLength>i;i++)if(i%4){var bits1=map.indexOf(base64Str.charAt(i-1))<<i%4*2,bits2=map.indexOf(base64Str.charAt(i))>>>6-i%4*2;words[nBytes>>>2]|=(bits1|bits2)<<24-nBytes%4*8,nBytes++}return WordArray.create(words,nBytes)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}}(),CryptoJS.lib.Cipher||function(undefined){var C=CryptoJS,C_lib=C.lib,Base=C_lib.Base,WordArray=C_lib.WordArray,BufferedBlockAlgorithm=C_lib.BufferedBlockAlgorithm,C_enc=C.enc,Base64=(C_enc.Utf8,C_enc.Base64),C_algo=C.algo,EvpKDF=C_algo.EvpKDF,Cipher=C_lib.Cipher=BufferedBlockAlgorithm.extend({cfg:Base.extend(),createEncryptor:function(key,cfg){return this.create(this._ENC_XFORM_MODE,key,cfg)},createDecryptor:function(key,cfg){return this.create(this._DEC_XFORM_MODE,key,cfg)},init:function(xformMode,key,cfg){this.cfg=this.cfg.extend(cfg),this._xformMode=xformMode,this._key=key,this.reset()},reset:function(){BufferedBlockAlgorithm.reset.call(this),this._doReset()},process:function(dataUpdate){return this._append(dataUpdate),this._process()},finalize:function(dataUpdate){dataUpdate&&this._append(dataUpdate);var finalProcessedData=this._doFinalize();return finalProcessedData},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function selectCipherStrategy(key){return"string"==typeof key?PasswordBasedCipher:SerializableCipher}return function(cipher){return{encrypt:function(message,key,cfg){return selectCipherStrategy(key).encrypt(cipher,message,key,cfg)},decrypt:function(ciphertext,key,cfg){return selectCipherStrategy(key).decrypt(cipher,ciphertext,key,cfg)}}}}()}),C_mode=(C_lib.StreamCipher=Cipher.extend({_doFinalize:function(){var finalProcessedBlocks=this._process(!0);return finalProcessedBlocks},blockSize:1}),C.mode={}),BlockCipherMode=C_lib.BlockCipherMode=Base.extend({createEncryptor:function(cipher,iv){return this.Encryptor.create(cipher,iv)},createDecryptor:function(cipher,iv){return this.Decryptor.create(cipher,iv)},init:function(cipher,iv){this._cipher=cipher,this._iv=iv}}),CBC=C_mode.CBC=function(){function xorBlock(words,offset,blockSize){var iv=this._iv;if(iv){var block=iv;this._iv=undefined}else var block=this._prevBlock;for(var i=0;blockSize>i;i++)words[offset+i]^=block[i]}var CBC=BlockCipherMode.extend();return CBC.Encryptor=CBC.extend({processBlock:function(words,offset){var cipher=this._cipher,blockSize=cipher.blockSize;xorBlock.call(this,words,offset,blockSize),cipher.encryptBlock(words,offset),this._prevBlock=words.slice(offset,offset+blockSize)}}),CBC.Decryptor=CBC.extend({processBlock:function(words,offset){var cipher=this._cipher,blockSize=cipher.blockSize,thisBlock=words.slice(offset,offset+blockSize);cipher.decryptBlock(words,offset),xorBlock.call(this,words,offset,blockSize),this._prevBlock=thisBlock}}),CBC}(),C_pad=C.pad={},Pkcs7=C_pad.Pkcs7={pad:function(data,blockSize){for(var blockSizeBytes=4*blockSize,nPaddingBytes=blockSizeBytes-data.sigBytes%blockSizeBytes,paddingWord=nPaddingBytes<<24|nPaddingBytes<<16|nPaddingBytes<<8|nPaddingBytes,paddingWords=[],i=0;nPaddingBytes>i;i+=4)paddingWords.push(paddingWord);var padding=WordArray.create(paddingWords,nPaddingBytes);data.concat(padding)},unpad:function(data){var nPaddingBytes=255&data.words[data.sigBytes-1>>>2];data.sigBytes-=nPaddingBytes}},CipherParams=(C_lib.BlockCipher=Cipher.extend({cfg:Cipher.cfg.extend({mode:CBC,padding:Pkcs7}),reset:function(){Cipher.reset.call(this);var cfg=this.cfg,iv=cfg.iv,mode=cfg.mode;if(this._xformMode==this._ENC_XFORM_MODE)var modeCreator=mode.createEncryptor;else{var modeCreator=mode.createDecryptor;this._minBufferSize=1}this._mode=modeCreator.call(mode,this,iv&&iv.words)},_doProcessBlock:function(words,offset){this._mode.processBlock(words,offset)},_doFinalize:function(){var padding=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){padding.pad(this._data,this.blockSize);var finalProcessedBlocks=this._process(!0)}else{var finalProcessedBlocks=this._process(!0);padding.unpad(finalProcessedBlocks)}return finalProcessedBlocks},blockSize:4}),C_lib.CipherParams=Base.extend({init:function(cipherParams){this.mixIn(cipherParams)},toString:function(formatter){return(formatter||this.formatter).stringify(this)}})),C_format=C.format={},OpenSSLFormatter=C_format.OpenSSL={stringify:function(cipherParams){var ciphertext=cipherParams.ciphertext,salt=cipherParams.salt;if(salt)var wordArray=WordArray.create([1398893684,1701076831]).concat(salt).concat(ciphertext);else var wordArray=ciphertext;return wordArray.toString(Base64)},parse:function(openSSLStr){var ciphertext=Base64.parse(openSSLStr),ciphertextWords=ciphertext.words;if(1398893684==ciphertextWords[0]&&1701076831==ciphertextWords[1]){var salt=WordArray.create(ciphertextWords.slice(2,4));ciphertextWords.splice(0,4),ciphertext.sigBytes-=16}return CipherParams.create({ciphertext:ciphertext,salt:salt})}},SerializableCipher=C_lib.SerializableCipher=Base.extend({cfg:Base.extend({format:OpenSSLFormatter}),encrypt:function(cipher,message,key,cfg){cfg=this.cfg.extend(cfg);var encryptor=cipher.createEncryptor(key,cfg),ciphertext=encryptor.finalize(message),cipherCfg=encryptor.cfg;return CipherParams.create({ciphertext:ciphertext,key:key,iv:cipherCfg.iv,algorithm:cipher,mode:cipherCfg.mode,padding:cipherCfg.padding,blockSize:cipher.blockSize,formatter:cfg.format})},decrypt:function(cipher,ciphertext,key,cfg){cfg=this.cfg.extend(cfg),ciphertext=this._parse(ciphertext,cfg.format);var plaintext=cipher.createDecryptor(key,cfg).finalize(ciphertext.ciphertext);return plaintext},_parse:function(ciphertext,format){return"string"==typeof ciphertext?format.parse(ciphertext,this):ciphertext}}),C_kdf=C.kdf={},OpenSSLKdf=C_kdf.OpenSSL={execute:function(password,keySize,ivSize,salt){salt||(salt=WordArray.random(8));var key=EvpKDF.create({keySize:keySize+ivSize}).compute(password,salt),iv=WordArray.create(key.words.slice(keySize),4*ivSize);return key.sigBytes=4*keySize,CipherParams.create({key:key,iv:iv,salt:salt})}},PasswordBasedCipher=C_lib.PasswordBasedCipher=SerializableCipher.extend({cfg:SerializableCipher.cfg.extend({kdf:OpenSSLKdf}),encrypt:function(cipher,message,password,cfg){cfg=this.cfg.extend(cfg);var derivedParams=cfg.kdf.execute(password,cipher.keySize,cipher.ivSize);cfg.iv=derivedParams.iv;var ciphertext=SerializableCipher.encrypt.call(this,cipher,message,derivedParams.key,cfg);return ciphertext.mixIn(derivedParams),ciphertext},decrypt:function(cipher,ciphertext,password,cfg){cfg=this.cfg.extend(cfg),ciphertext=this._parse(ciphertext,cfg.format);var derivedParams=cfg.kdf.execute(password,cipher.keySize,cipher.ivSize,ciphertext.salt);cfg.iv=derivedParams.iv;var plaintext=SerializableCipher.decrypt.call(this,cipher,ciphertext,derivedParams.key,cfg);return plaintext}})}(),function(){var C=CryptoJS,C_lib=C.lib,BlockCipher=C_lib.BlockCipher,C_algo=C.algo,SBOX=[],INV_SBOX=[],SUB_MIX_0=[],SUB_MIX_1=[],SUB_MIX_2=[],SUB_MIX_3=[],INV_SUB_MIX_0=[],INV_SUB_MIX_1=[],INV_SUB_MIX_2=[],INV_SUB_MIX_3=[];!function(){for(var d=[],i=0;256>i;i++)d[i]=128>i?i<<1:i<<1^283;for(var x=0,xi=0,i=0;256>i;i++){var sx=xi^xi<<1^xi<<2^xi<<3^xi<<4;sx=sx>>>8^255&sx^99,SBOX[x]=sx,INV_SBOX[sx]=x;var x2=d[x],x4=d[x2],x8=d[x4],t=257*d[sx]^16843008*sx;SUB_MIX_0[x]=t<<24|t>>>8,SUB_MIX_1[x]=t<<16|t>>>16,SUB_MIX_2[x]=t<<8|t>>>24,SUB_MIX_3[x]=t;var t=16843009*x8^65537*x4^257*x2^16843008*x;INV_SUB_MIX_0[sx]=t<<24|t>>>8,INV_SUB_MIX_1[sx]=t<<16|t>>>16,INV_SUB_MIX_2[sx]=t<<8|t>>>24,INV_SUB_MIX_3[sx]=t,x?(x=x2^d[d[d[x8^x2]]],xi^=d[d[xi]]):x=xi=1}}();var RCON=[0,1,2,4,8,16,32,64,128,27,54],AES=C_algo.AES=BlockCipher.extend({_doReset:function(){for(var key=this._key,keyWords=key.words,keySize=key.sigBytes/4,nRounds=this._nRounds=keySize+6,ksRows=4*(nRounds+1),keySchedule=this._keySchedule=[],ksRow=0;ksRows>ksRow;ksRow++)if(keySize>ksRow)keySchedule[ksRow]=keyWords[ksRow];else{var t=keySchedule[ksRow-1];ksRow%keySize?keySize>6&&ksRow%keySize==4&&(t=SBOX[t>>>24]<<24|SBOX[t>>>16&255]<<16|SBOX[t>>>8&255]<<8|SBOX[255&t]):(t=t<<8|t>>>24,t=SBOX[t>>>24]<<24|SBOX[t>>>16&255]<<16|SBOX[t>>>8&255]<<8|SBOX[255&t],t^=RCON[ksRow/keySize|0]<<24),keySchedule[ksRow]=keySchedule[ksRow-keySize]^t}for(var invKeySchedule=this._invKeySchedule=[],invKsRow=0;ksRows>invKsRow;invKsRow++){var ksRow=ksRows-invKsRow;if(invKsRow%4)var t=keySchedule[ksRow];else var t=keySchedule[ksRow-4];invKeySchedule[invKsRow]=4>invKsRow||4>=ksRow?t:INV_SUB_MIX_0[SBOX[t>>>24]]^INV_SUB_MIX_1[SBOX[t>>>16&255]]^INV_SUB_MIX_2[SBOX[t>>>8&255]]^INV_SUB_MIX_3[SBOX[255&t]]}},encryptBlock:function(M,offset){this._doCryptBlock(M,offset,this._keySchedule,SUB_MIX_0,SUB_MIX_1,SUB_MIX_2,SUB_MIX_3,SBOX)},decryptBlock:function(M,offset){var t=M[offset+1];M[offset+1]=M[offset+3],M[offset+3]=t,this._doCryptBlock(M,offset,this._invKeySchedule,INV_SUB_MIX_0,INV_SUB_MIX_1,INV_SUB_MIX_2,INV_SUB_MIX_3,INV_SBOX);var t=M[offset+1];M[offset+1]=M[offset+3],M[offset+3]=t},_doCryptBlock:function(M,offset,keySchedule,SUB_MIX_0,SUB_MIX_1,SUB_MIX_2,SUB_MIX_3,SBOX){for(var nRounds=this._nRounds,s0=M[offset]^keySchedule[0],s1=M[offset+1]^keySchedule[1],s2=M[offset+2]^keySchedule[2],s3=M[offset+3]^keySchedule[3],ksRow=4,round=1;nRounds>round;round++){var t0=SUB_MIX_0[s0>>>24]^SUB_MIX_1[s1>>>16&255]^SUB_MIX_2[s2>>>8&255]^SUB_MIX_3[255&s3]^keySchedule[ksRow++],t1=SUB_MIX_0[s1>>>24]^SUB_MIX_1[s2>>>16&255]^SUB_MIX_2[s3>>>8&255]^SUB_MIX_3[255&s0]^keySchedule[ksRow++],t2=SUB_MIX_0[s2>>>24]^SUB_MIX_1[s3>>>16&255]^SUB_MIX_2[s0>>>8&255]^SUB_MIX_3[255&s1]^keySchedule[ksRow++],t3=SUB_MIX_0[s3>>>24]^SUB_MIX_1[s0>>>16&255]^SUB_MIX_2[s1>>>8&255]^SUB_MIX_3[255&s2]^keySchedule[ksRow++];s0=t0,s1=t1,s2=t2,s3=t3}var t0=(SBOX[s0>>>24]<<24|SBOX[s1>>>16&255]<<16|SBOX[s2>>>8&255]<<8|SBOX[255&s3])^keySchedule[ksRow++],t1=(SBOX[s1>>>24]<<24|SBOX[s2>>>16&255]<<16|SBOX[s3>>>8&255]<<8|SBOX[255&s0])^keySchedule[ksRow++],t2=(SBOX[s2>>>24]<<24|SBOX[s3>>>16&255]<<16|SBOX[s0>>>8&255]<<8|SBOX[255&s1])^keySchedule[ksRow++],t3=(SBOX[s3>>>24]<<24|SBOX[s0>>>16&255]<<16|SBOX[s1>>>8&255]<<8|SBOX[255&s2])^keySchedule[ksRow++];M[offset]=t0,M[offset+1]=t1,M[offset+2]=t2,M[offset+3]=t3},keySize:8});C.AES=BlockCipher._createHelper(AES)}(),function(){var C=CryptoJS,C_lib=C.lib,WordArray=C_lib.WordArray,Hasher=C_lib.Hasher,C_algo=C.algo,W=[],SHA1=C_algo.SHA1=Hasher.extend({_doReset:function(){this._hash=new WordArray.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(M,offset){for(var H=this._hash.words,a=H[0],b=H[1],c=H[2],d=H[3],e=H[4],i=0;80>i;i++){if(16>i)W[i]=0|M[offset+i];else{var n=W[i-3]^W[i-8]^W[i-14]^W[i-16];W[i]=n<<1|n>>>31}var t=(a<<5|a>>>27)+e+W[i];t+=20>i?(b&c|~b&d)+1518500249:40>i?(b^c^d)+1859775393:60>i?(b&c|b&d|c&d)-1894007588:(b^c^d)-899497514,e=d,d=c,c=b<<30|b>>>2,b=a,a=t}H[0]=H[0]+a|0,H[1]=H[1]+b|0,H[2]=H[2]+c|0,H[3]=H[3]+d|0,H[4]=H[4]+e|0},_doFinalize:function(){var data=this._data,dataWords=data.words,nBitsTotal=8*this._nDataBytes,nBitsLeft=8*data.sigBytes;return dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32,dataWords[(nBitsLeft+64>>>9<<4)+14]=Math.floor(nBitsTotal/4294967296),dataWords[(nBitsLeft+64>>>9<<4)+15]=nBitsTotal,data.sigBytes=4*dataWords.length,this._process(),this._hash},clone:function(){var clone=Hasher.clone.call(this);return clone._hash=this._hash.clone(),clone}});C.SHA1=Hasher._createHelper(SHA1),C.HmacSHA1=Hasher._createHmacHelper(SHA1)}(),function(Math){var C=CryptoJS,C_lib=C.lib,WordArray=C_lib.WordArray,Hasher=C_lib.Hasher,C_algo=C.algo,H=[],K=[];!function(){function isPrime(n){for(var sqrtN=Math.sqrt(n),factor=2;sqrtN>=factor;factor++)if(!(n%factor))return!1;return!0}function getFractionalBits(n){return 4294967296*(n-(0|n))|0}for(var n=2,nPrime=0;64>nPrime;)isPrime(n)&&(8>nPrime&&(H[nPrime]=getFractionalBits(Math.pow(n,.5))),K[nPrime]=getFractionalBits(Math.pow(n,1/3)),nPrime++),n++}();var W=[],SHA256=C_algo.SHA256=Hasher.extend({_doReset:function(){this._hash=new WordArray.init(H.slice(0))},_doProcessBlock:function(M,offset){for(var H=this._hash.words,a=H[0],b=H[1],c=H[2],d=H[3],e=H[4],f=H[5],g=H[6],h=H[7],i=0;64>i;i++){if(16>i)W[i]=0|M[offset+i];else{var gamma0x=W[i-15],gamma0=(gamma0x<<25|gamma0x>>>7)^(gamma0x<<14|gamma0x>>>18)^gamma0x>>>3,gamma1x=W[i-2],gamma1=(gamma1x<<15|gamma1x>>>17)^(gamma1x<<13|gamma1x>>>19)^gamma1x>>>10;W[i]=gamma0+W[i-7]+gamma1+W[i-16]}var ch=e&f^~e&g,maj=a&b^a&c^b&c,sigma0=(a<<30|a>>>2)^(a<<19|a>>>13)^(a<<10|a>>>22),sigma1=(e<<26|e>>>6)^(e<<21|e>>>11)^(e<<7|e>>>25),t1=h+sigma1+ch+K[i]+W[i],t2=sigma0+maj;h=g,g=f,f=e,e=d+t1|0,d=c,c=b,b=a,a=t1+t2|0}H[0]=H[0]+a|0,H[1]=H[1]+b|0,H[2]=H[2]+c|0,H[3]=H[3]+d|0,H[4]=H[4]+e|0,H[5]=H[5]+f|0,H[6]=H[6]+g|0,H[7]=H[7]+h|0},_doFinalize:function(){var data=this._data,dataWords=data.words,nBitsTotal=8*this._nDataBytes,nBitsLeft=8*data.sigBytes;return dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32,dataWords[(nBitsLeft+64>>>9<<4)+14]=Math.floor(nBitsTotal/4294967296),dataWords[(nBitsLeft+64>>>9<<4)+15]=nBitsTotal,data.sigBytes=4*dataWords.length,this._process(),this._hash},clone:function(){var clone=Hasher.clone.call(this);return clone._hash=this._hash.clone(),clone}});C.SHA256=Hasher._createHelper(SHA256),C.HmacSHA256=Hasher._createHmacHelper(SHA256)}(Math),function(){{var C=CryptoJS,C_lib=C.lib,Base=C_lib.Base,C_enc=C.enc,Utf8=C_enc.Utf8,C_algo=C.algo;C_algo.HMAC=Base.extend({init:function(hasher,key){hasher=this._hasher=new hasher.init,"string"==typeof key&&(key=Utf8.parse(key));var hasherBlockSize=hasher.blockSize,hasherBlockSizeBytes=4*hasherBlockSize;key.sigBytes>hasherBlockSizeBytes&&(key=hasher.finalize(key)),key.clamp();for(var oKey=this._oKey=key.clone(),iKey=this._iKey=key.clone(),oKeyWords=oKey.words,iKeyWords=iKey.words,i=0;hasherBlockSize>i;i++)oKeyWords[i]^=1549556828,iKeyWords[i]^=909522486;oKey.sigBytes=iKey.sigBytes=hasherBlockSizeBytes,this.reset()},reset:function(){var hasher=this._hasher;hasher.reset(),hasher.update(this._iKey)},update:function(messageUpdate){return this._hasher.update(messageUpdate),this},finalize:function(messageUpdate){var hasher=this._hasher,innerHash=hasher.finalize(messageUpdate);hasher.reset();var hmac=hasher.finalize(this._oKey.clone().concat(innerHash));return hmac}})}}(),CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}},CryptoJS.mode.CTR=function(){var CTR=CryptoJS.lib.BlockCipherMode.extend(),Encryptor=CTR.Encryptor=CTR.extend({processBlock:function(words,offset){var cipher=this._cipher,blockSize=cipher.blockSize,iv=this._iv,counter=this._counter;iv&&(counter=this._counter=iv.slice(0),this._iv=void 0);var keystream=counter.slice(0);cipher.encryptBlock(keystream,0),counter[blockSize-1]=counter[blockSize-1]+1|0;for(var i=0;blockSize>i;i++)words[offset+i]^=keystream[i]}});return CTR.Decryptor=Encryptor,CTR}(),CryptoJS}),/*!
- * Source: build/lib/otr/build/dep/eventemitter.js, license: MIT, url: http://git.io/ee */
-/*!
+function($){Strophe.addConnectionPlugin("caps",{HASH:"sha-1",node:"http://strophe.im/strophejs/",_ver:"",_connection:null,_knownCapabilities:JSON.parse(localStorage.getItem("strophe.caps._knownCapabilities"))||{},_jidVerIndex:JSON.parse(localStorage.getItem("strophe.caps._jidVerIndex"))||{},init:function(conn){if(this._connection=conn,Strophe.addNamespace("CAPS","http://jabber.org/protocol/caps"),!this._connection.disco)throw"Caps plugin requires the disco plugin to be installed.";this._connection.disco.addFeature(Strophe.NS.CAPS),this._connection.addHandler(this._delegateCapabilities.bind(this),Strophe.NS.CAPS)},generateCapsAttrs:function(){return{xmlns:Strophe.NS.CAPS,hash:this.HASH,node:this.node,ver:this.generateVer()}},generateVer:function(){if(""!==this._ver)return this._ver;for(var ver="",identities=this._connection.disco._identities.sort(this._sortIdentities),identitiesLen=identities.length,features=this._connection.disco._features.sort(),featuresLen=features.length,i=0;identitiesLen>i;i++){var curIdent=identities[i];ver+=curIdent.category+"/"+curIdent.type+"/"+curIdent.lang+"/"+curIdent.name+"<"}for(var i=0;featuresLen>i;i++)ver+=features[i]+"<";return this._ver=b64_sha1(ver),this._ver},getCapabilitiesByJid:function(jid){return this._jidVerIndex[jid]?this._knownCapabilities[this._jidVerIndex[jid]]:null},hasFeatureByJid:function(jid,feature){if(this._jidVerIndex[jid]&&null!==feature&&"undefined"!=typeof feature){$.isArray(feature)||(feature=$.makeArray(feature));var i;for(i=0;i<feature.length;i++)if(this._knownCapabilities[this._jidVerIndex[jid]].features.indexOf(feature[i])<0)return!1;return!0}return!1},_delegateCapabilities:function(stanza){var from=stanza.getAttribute("from"),c=stanza.querySelector("c"),ver=c.getAttribute("ver"),node=c.getAttribute("node");return this._knownCapabilities[ver]?(this._jidVerIndex[from]=ver,this._jidVerIndex[from]&&!this._jidVerIndex[from]===ver||(this._jidVerIndex[from]=ver),localStorage.setItem("strophe.caps._jidVerIndex",JSON.stringify(this._jidVerIndex)),$(document).trigger("caps.strophe",[from]),!0):this._requestCapabilities(from,node,ver)},_requestCapabilities:function(to,node,ver){if(to!==this._connection.jid){var id=this._connection.disco.info(to,node+"#"+ver);this._connection.addHandler(this._handleDiscoInfoReply.bind(this),Strophe.NS.DISCO_INFO,"iq","result",id,to)}return!0},_handleDiscoInfoReply:function(stanza){var query=stanza.querySelector("query"),from=stanza.getAttribute("from"),node=query.getAttribute("node"),ver=node?node.split("#")[1]:this._jidVerIndex[from];if(this._knownCapabilities[ver])this._jidVerIndex[from]&&!this._jidVerIndex[from]===ver||(this._jidVerIndex[from]=ver);else{var childNodes=query.childNodes,childNodesLen=childNodes.length;this._knownCapabilities[ver]={features:[],identities:[]};for(var i=0;childNodesLen>i;i++){var node=childNodes[i];"feature"==node.nodeName?this._knownCapabilities[ver].features.push(node.getAttribute("var")):"identity"==node.nodeName?this._knownCapabilities[ver].identities.push(this._attributesToJsObject(node.attributes)):("undefined"==typeof this._knownCapabilities[ver][node.nodeName]&&(this._knownCapabilities[ver][node.nodeName]=[]),this._knownCapabilities[ver][node.nodeName].push(this._attributesToJsObject(node.attributes)))}this._jidVerIndex[from]=ver}return localStorage.setItem("strophe.caps._jidVerIndex",JSON.stringify(this._jidVerIndex)),localStorage.setItem("strophe.caps._knownCapabilities",JSON.stringify(this._knownCapabilities)),$(document).trigger("caps.strophe",[from]),!1},_attributesToJsObject:function(attr){var obj={};for(i=0;i<attr.length;i++)obj[attr[i].name]=attr[i].value;return obj},_sortIdentities:function(a,b){return a.category>b.category?1:a.category<b.category?-1:a.type>b.type?1:a.type<b.type?-1:a.lang>b.lang?1:a.lang<b.lang?-1:0}})}(jQuery);var buildIq;buildIq=function(type,jid,vCardEl){var iq;return iq=$iq(jid?{type:type,to:jid}:{type:type}),iq.c("vCard",{xmlns:Strophe.NS.VCARD}),vCardEl&&iq.cnode(vCardEl),iq},Strophe.addConnectionPlugin("vcard",{_connection:null,init:function(conn){return this._connection=conn,Strophe.addNamespace("VCARD","vcard-temp")},get:function(handler_cb,jid,error_cb){var iq;return iq=buildIq("get",jid),this._connection.sendIQ(iq,handler_cb,error_cb)},set:function(handler_cb,vCardEl,jid){var iq;return iq=buildIq("set",jid,vCardEl),this._connection.sendIQ(iq,handler_cb,error_rb)}}),function($){Strophe.addConnectionPlugin("jingle",{connection:null,sessions:{},jid2session:{},ice_config:{iceServers:[]},pc_constraints:{},media_constraints:{mandatory:{OfferToReceiveAudio:!0,OfferToReceiveVideo:!0}},localStream:null,init:function(conn){this.connection=conn,this.connection.disco&&(this.connection.disco.addFeature("urn:xmpp:jingle:1"),this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:1"),this.connection.disco.addFeature("urn:xmpp:jingle:transports:ice-udp:1"),this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:audio"),this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:video"),this.connection.disco.addFeature("urn:ietf:rfc:5761")),this.connection.addHandler(this.onJingle.bind(this),"urn:xmpp:jingle:1","iq","set",null,null)},onJingle:function(iq){var sid=$(iq).find("jingle").attr("sid"),action=$(iq).find("jingle").attr("action"),ack=$iq({type:"result",to:iq.getAttribute("from"),id:iq.getAttribute("id")});console.log("on jingle "+action);var sess=this.sessions[sid];if("session-initiate"!=action){if(null===sess)return ack.type="error",ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"}),this.connection.send(ack),!0;if(Strophe.getBareJidFromJid(iq.getAttribute("from"))!=Strophe.getBareJidFromJid(sess.peerjid))return console.warn("jid mismatch for session id",sid,iq.getAttribute("from"),sess.peerjid),ack.type="error",ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"}),this.connection.send(ack),!0}else if(void 0!==sess)return ack.type="error",ack.c("error",{type:"cancel"}).c("service-unavailable",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up(),console.warn("duplicate session id",sid),this.connection.send(ack),!0;switch(this.connection.send(ack),action){case"session-initiate":sess=new JingleSession($(iq).attr("to"),$(iq).find("jingle").attr("sid"),this.connection),this.localStream&&sess.localStreams.push(this.localStream),sess.media_constraints=this.media_constraints,sess.pc_constraints=this.pc_constraints,sess.ice_config=this.ice_config,sess.initiate($(iq).attr("from"),!1),sess.setRemoteDescription($(iq).find(">jingle"),"offer"),$(iq).find('>jingle>muted[xmlns="http://jitsi.org/protocol/meet#startmuted"]').length&&(console.log("got a request to start muted"),sess.startmuted=!0),this.sessions[sess.sid]=sess,this.jid2session[sess.peerjid]=sess,$(document).trigger("callincoming.jingle",[sess.sid]);break;case"session-accept":sess.setRemoteDescription($(iq).find(">jingle"),"answer"),sess.accept(),$(document).trigger("callaccepted.jingle",[sess.sid]);break;case"session-terminate":console.log("terminating..."),sess.terminate(),this.terminate(sess.sid),$(iq).find(">jingle>reason").length?$(document).trigger("callterminated.jingle",[sess.sid,$(iq).find(">jingle>reason>:first")[0].tagName,$(iq).find(">jingle>reason>text").text()]):$(document).trigger("callterminated.jingle",[sess.sid]);break;case"transport-info":sess.addIceCandidate($(iq).find(">jingle>content"));break;case"session-info":var affected;$(iq).find('>jingle>ringing[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length?$(document).trigger("ringing.jingle",[sess.sid]):$(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length?(affected=$(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name"),$(document).trigger("mute.jingle",[sess.sid,affected])):$(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length&&(affected=$(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name"),$(document).trigger("unmute.jingle",[sess.sid,affected]));break;case"addsource":sess.addSource($(iq).find(">jingle>content"));break;case"removesource":sess.removeSource($(iq).find(">jingle>content"));break;default:console.warn("jingle action not implemented",action)}return!0},initiate:function(peerjid,myjid){var sess=new JingleSession(myjid||this.connection.jid,Math.random().toString(36).substr(2,12),this.connection);return this.localStream&&sess.localStreams.push(this.localStream),sess.media_constraints=this.media_constraints,sess.pc_constraints=this.pc_constraints,sess.ice_config=this.ice_config,sess.initiate(peerjid,!0),this.sessions[sess.sid]=sess,this.jid2session[sess.peerjid]=sess,sess.sendOffer(),sess},terminate:function(sid,reason,text){if(null===sid||void 0===sid)for(sid in this.sessions)"ended"!=this.sessions[sid].state&&(this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text),this.sessions[sid].terminate()),delete this.jid2session[this.sessions[sid].peerjid],delete this.sessions[sid];else this.sessions.hasOwnProperty(sid)&&("ended"!=this.sessions[sid].state&&(this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text),this.sessions[sid].terminate()),delete this.jid2session[this.sessions[sid].peerjid],delete this.sessions[sid])},terminateByJid:function(jid){if(this.jid2session.hasOwnProperty(jid)){var sess=this.jid2session[jid];sess&&(sess.terminate(),console.log("peer went away silently",jid),delete this.sessions[sess.sid],delete this.jid2session[jid],$(document).trigger("callterminated.jingle",[sess.sid,"gone"]))}},getStunAndTurnCredentials:function(){var self=this;this.connection.sendIQ($iq({type:"get",to:this.connection.domain}).c("services",{xmlns:"urn:xmpp:extdisco:1"}).c("service",{host:"turn."+this.connection.domain}),function(res){var iceservers=[];$(res).find(">services>service").each(function(idx,el){el=$(el);var dict={};switch(el.attr("type")){case"stun":dict.url="stun:"+el.attr("host"),el.attr("port")&&(dict.url+=":"+el.attr("port")),iceservers.push(dict);break;case"turn":dict.url="turn:",el.attr("username")&&(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)&&parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2],10)<28?dict.url+=el.attr("username")+"@":dict.username=el.attr("username")),dict.url+=el.attr("host"),el.attr("port")&&"3478"!=el.attr("port")&&(dict.url+=":"+el.attr("port")),el.attr("transport")&&"udp"!=el.attr("transport")&&(dict.url+="?transport="+el.attr("transport")),el.attr("password")&&(dict.credential=el.attr("password")),iceservers.push(dict)}}),self.ice_config.iceServers=iceservers},function(err){console.warn("getting turn credentials failed",err),console.warn("is mod_turncredentials or similar installed?")})}})}(jQuery);var JingleSession;!function($){JingleSession=function(me,sid,connection){this.me=me,this.sid=sid,this.connection=connection,this.initiator=null,this.responder=null,this.isInitiator=null,this.peerjid=null,this.state=null,this.peerconnection=null,this.remoteStream=null,this.localSDP=null,this.remoteSDP=null,this.localStreams=[],this.relayedStreams=[],this.remoteStreams=[],this.startTime=null,this.stopTime=null,this.media_constraints=null,this.pc_constraints=null,this.ice_config={},this.drip_container=[],this.usetrickle=!0,this.usepranswer=!1,this.usedrip=!1,this.hadstuncandidate=!1,this.hadturncandidate=!1,this.lasticecandidate=!1,this.statsinterval=null,this.reason=null,this.addssrc=[],this.removessrc=[],this.pendingop=null,this.wait=!0,this.nickname=null,this.startmuted=!1,this.filter_candidates=null},JingleSession.prototype.initiate=function(peerjid,isInitiator){var self=this;if(null!==this.state)return void console.error("attempt to initiate on session "+this.sid+"in state "+this.state);this.isInitiator=isInitiator,this.state="pending",this.initiator=isInitiator?this.me:peerjid,this.responder=isInitiator?peerjid:this.me,this.peerjid=peerjid;try{this.peerconnection=new RTCPeerconnection(this.ice_config,this.pc_constraints)}catch(e){return console.error("Failed to create PeerConnection, exception: ",e.message),void console.error(e)}this.hadstuncandidate=!1,this.hadturncandidate=!1,this.lasticecandidate=!1,this.peerconnection.onicecandidate=function(event){self.sendIceCandidate(event.candidate)},this.peerconnection.onaddstream=function(event){self.remoteStream=event.stream,self.remoteStreams.push(event.stream),$(document).trigger("remotestreamadded.jingle",[event,self.sid])},this.peerconnection.onremovestream=function(event){self.remoteStream=null,$(document).trigger("remotestreamremoved.jingle",[event,self.sid])},this.peerconnection.onsignalingstatechange=function(){!self||!self.peerconnection},this.peerconnection.oniceconnectionstatechange=function(){if(self&&self.peerconnection){switch(self.peerconnection.iceConnectionState){case"connected":this.startTime=new Date;break;case"disconnected":this.stopTime=new Date}$(document).trigger("iceconnectionstatechange.jingle",[self.sid,self])}},this.localStreams.forEach(function(stream){self.peerconnection.addStream(stream)}),this.relayedStreams.forEach(function(stream){self.peerconnection.addStream(stream)})},JingleSession.prototype.accept=function(){var self=this;this.state="active";var pranswer=this.peerconnection.localDescription;if(pranswer&&"pranswer"==pranswer.type){if(console.log("going from pranswer to answer"),this.usetrickle)for(var lines=SDPUtil.find_lines(pranswer.sdp,"a=candidate:"),i=0;i<lines.length;i++)pranswer.sdp=pranswer.sdp.replace(lines[i]+"\r\n","");for(;SDPUtil.find_line(pranswer.sdp,"a=inactive");)pranswer.sdp=pranswer.sdp.replace("a=inactive","a=sendrecv");var prsdp=new SDP(pranswer.sdp),accept=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-accept",initiator:this.initiator,responder:this.responder,sid:this.sid});prsdp.toJingle(accept,this.initiator==this.me?"initiator":"responder"),this.connection.sendIQ(accept,function(){var ack={};ack.source="answer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="answer",$(document).trigger("error.jingle",[self.sid,error])},1e4);for(var sdp=this.peerconnection.localDescription.sdp;SDPUtil.find_line(sdp,"a=inactive");)sdp=sdp.replace("a=inactive","a=sendrecv");this.peerconnection.setLocalDescription(new RTCSessionDescription({type:"answer",sdp:sdp}),function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(e){console.error("setLocalDescription failed",e)})}},JingleSession.prototype.terminate=function(reason){this.state="ended",this.reason=reason,this.peerconnection.close(),null!==this.statsinterval&&(window.clearInterval(this.statsinterval),this.statsinterval=null)},JingleSession.prototype.active=function(){return"active"==this.state},JingleSession.prototype.sendIceCandidate=function(candidate){var self=this;if(candidate&&!this.lasticecandidate){var ice=SDPUtil.iceparams(this.localSDP.media[candidate.sdpMLineIndex],this.localSDP.session),jcand=SDPUtil.candidateToJingle(candidate.candidate);if(!ice||!jcand)return void console.error("failed to get ice && jcand");if(ice.xmlns="urn:xmpp:jingle:transports:ice-udp:1","srflx"===jcand.type?this.hadstuncandidate=!0:"relay"===jcand.type&&(this.hadturncandidate=!0),(null===this.filter_candidates||jcand.type===this.filter_candidates)&&this.usetrickle){if(console.log("sendIceCandidate using trickle"),this.usedrip)return 0===this.drip_container.length&&window.setTimeout(function(){console.log("sending drip container"),0!==self.drip_container.length&&(self.sendIceCandidates(self.drip_container),self.drip_container=[])},20),void this.drip_container.push(event.candidate);console.log("sending single candidate"),self.sendIceCandidates([event.candidate])}}else{if(console.log("sendIceCandidate: last candidate..."),!this.usetrickle){console.log("should send full offer now...");var init=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"offer"==this.peerconnection.localDescription.type?"session-initiate":"session-accept",initiator:this.initiator,sid:this.sid});null!=this.nickname&&init.c("nick",{xmlns:"http://jabber.org/protocol/nick"}).t(this.nickname).up(),this.startmuted&&init.c("muted",{xmlns:"http://jitsi.org/protocol/meet#startmuted"}).up(),this.localSDP=new SDP(this.peerconnection.localDescription.sdp),this.localSDP.toJingle(init,this.initiator==this.me?"initiator":"responder"),console.log("try to send ack(offer)..."),this.connection.sendIQ(init,function(){console.log("Sent session initiate (ACK, offer)...");var ack={};ack.source="offer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){self.state="error",self.peerconnection.close();var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="offer",$(document).trigger("error.jingle",[self.sid,error])},1e4)}this.lasticecandidate=!0,console.log("Have we encountered any srflx candidates? "+this.hadstuncandidate),console.log("Have we encountered any relay candidates? "+this.hadturncandidate),this.hadstuncandidate||this.hadturncandidate||"closed"==this.peerconnection.signalingState||(console.log("no candidates found!"),$(document).trigger("nostuncandidates.jingle",[this.sid]))}},JingleSession.prototype.sendIceCandidates=function(candidates){console.log("sendIceCandidates",candidates);for(var cand=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"transport-info",initiator:this.initiator,sid:this.sid}),mid=0;mid<this.localSDP.media.length;mid++){var cands=candidates.filter(function(el){return el.sdpMLineIndex==mid});if(cands.length>0){var ice=SDPUtil.iceparams(this.localSDP.media[mid],this.localSDP.session);ice.xmlns="urn:xmpp:jingle:transports:ice-udp:1",cand.c("content",{creator:this.initiator==this.me?"initiator":"responder",name:cands[0].sdpMid}).c("transport",ice);for(var i=0;i<cands.length;i++)cand.c("candidate",SDPUtil.candidateToJingle(cands[i].candidate)).up();if(SDPUtil.find_line(this.localSDP.media[mid],"a=fingerprint:",this.localSDP.session)){var tmp=SDPUtil.parse_fingerprint(SDPUtil.find_line(this.localSDP.media[mid],"a=fingerprint:",this.localSDP.session));tmp.required=!0,cand.c("fingerprint").t(tmp.fingerprint),delete tmp.fingerprint,cand.attrs(tmp),cand.up()}cand.up(),cand.up()}}console.log("try to send ack(transportinfo)..."),this.connection.sendIQ(cand,function(){var ack={};ack.source="transportinfo",console.log("Sent session initiate (ACK, transportinfo)..."),$(document).trigger("ack.jingle",[this.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="transportinfo",$(document).trigger("error.jingle",[this.sid,error])},1e4)},JingleSession.prototype.sendOffer=function(){var self=this;this.peerconnection.createOffer(function(sdp){self.createdOffer(sdp)},function(e){console.error("createOffer failed",e)},this.media_constraints)},JingleSession.prototype.createdOffer=function(sdp){var self=this;if(this.localSDP=new SDP(sdp.sdp),this.usetrickle){var init=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-initiate",initiator:this.initiator,sid:this.sid});null!=this.nickname&&init.c("nick",{xmlns:"http://jabber.org/protocol/nick"}).t(this.nickname).up(),this.startmuted&&init.c("muted",{xmlns:"http://jitsi.org/protocol/meet#startmuted"}).up(),this.localSDP.toJingle(init,this.initiator==this.me?"initiator":"responder"),this.connection.sendIQ(init,function(){var ack={};ack.source="offer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){self.state="error",self.peerconnection.close();var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="offer",$(document).trigger("error.jingle",[self.sid,error])},1e4)}sdp.sdp=this.localSDP.raw,this.peerconnection.setLocalDescription(sdp,function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(e){console.error("setLocalDescription failed",e)});for(var cands=SDPUtil.find_lines(this.localSDP.raw,"a=candidate:"),i=0;i<cands.length;i++){var cand=SDPUtil.parse_icecandidate(cands[i]);"srflx"==cand.type?this.hadstuncandidate=!0:"relay"==cand.type&&(this.hadturncandidate=!0)}},JingleSession.prototype.setRemoteDescription=function(elem,desctype){if(this.remoteSDP=new SDP(""),this.remoteSDP.fromJingle(elem),null!==this.peerconnection.remoteDescription&&(console.log("setRemoteDescription when remote description is not null, should be pranswer",this.peerconnection.remoteDescription),"pranswer"==this.peerconnection.remoteDescription.type)){for(var pranswer=new SDP(this.peerconnection.remoteDescription.sdp),i=0;i<pranswer.media.length;i++){SDPUtil.find_line(this.remoteSDP.media[i],"a=ice-ufrag:",this.remoteSDP.session)||(SDPUtil.find_line(pranswer.media[i],"a=ice-ufrag:",pranswer.session)?this.remoteSDP.media[i]+=SDPUtil.find_line(pranswer.media[i],"a=ice-ufrag:",pranswer.session)+"\r\n":console.warn("no ice ufrag?"),SDPUtil.find_line(pranswer.media[i],"a=ice-pwd:",pranswer.session)?this.remoteSDP.media[i]+=SDPUtil.find_line(pranswer.media[i],"a=ice-pwd:",pranswer.session)+"\r\n":console.warn("no ice pwd?"));for(var lines=SDPUtil.find_lines(pranswer.media[i],"a=candidate:"),j=0;j<lines.length;j++)this.remoteSDP.media[i]+=lines[j]+"\r\n"}this.remoteSDP.raw=this.remoteSDP.session+this.remoteSDP.media.join("")}var remotedesc=new RTCSessionDescription({type:desctype,sdp:this.remoteSDP.raw});this.peerconnection.setRemoteDescription(remotedesc,function(){},function(e){console.error("setRemoteDescription error",e)})},JingleSession.prototype.addIceCandidate=function(elem){var self=this;if("closed"!=this.peerconnection.signalingState){if(!this.peerconnection.remoteDescription&&"have-local-offer"==this.peerconnection.signalingState){if(console.log("trickle ice candidate arriving before session accept..."),!this.remoteSDP){for(var cobbled="v=0\r\no=- 1923518516 2 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\n",i=0;i<this.localSDP.media.length;i++)cobbled+=SDPUtil.find_line(this.localSDP.media[i],"m=")+"\r\n",cobbled+=SDPUtil.find_lines(this.localSDP.media[i],"a=rtpmap:").join("\r\n")+"\r\n",SDPUtil.find_line(this.localSDP.media[i],"a=mid:")&&(cobbled+=SDPUtil.find_line(this.localSDP.media[i],"a=mid:")+"\r\n"),cobbled+="a=inactive\r\n";this.remoteSDP=new SDP(cobbled)}elem.each(function(){for(var i=0;i<self.remoteSDP.media.length;i++)if((SDPUtil.find_line(self.remoteSDP.media[i],"a=mid:"+$(this).attr("name"))||0===self.remoteSDP.media[i].indexOf("m="+$(this).attr("name")))&&!SDPUtil.find_line(self.remoteSDP.media[i],"a=ice-ufrag:")){var tmp=$(this).find("transport");self.remoteSDP.media[i]+="a=ice-ufrag:"+tmp.attr("ufrag")+"\r\n",self.remoteSDP.media[i]+="a=ice-pwd:"+tmp.attr("pwd")+"\r\n",tmp=$(this).find("transport>fingerprint"),tmp.length?self.remoteSDP.media[i]+="a=fingerprint:"+tmp.attr("hash")+" "+tmp.text()+"\r\n":(console.log("no dtls fingerprint (webrtc issue #1718?)"),self.remoteSDP.media[i]+="a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:BAADBAADBAADBAADBAADBAADBAADBAADBAADBAAD\r\n");break}}),this.remoteSDP.raw=this.remoteSDP.session+this.remoteSDP.media.join("");var iscomplete=this.remoteSDP.media.filter(function(mediapart){return SDPUtil.find_line(mediapart,"a=ice-ufrag:")}).length==this.remoteSDP.media.length;if(iscomplete){console.log("setting pranswer");try{this.peerconnection.setRemoteDescription(new RTCSessionDescription({type:"pranswer",sdp:this.remoteSDP.raw}),function(){},function(e){console.log("setRemoteDescription pranswer failed",e.toString())})}catch(e){console.error("setting pranswer failed",e)}}}elem.each(function(){var i,idx=-1;for(i=0;i<self.remoteSDP.media.length;i++)if(SDPUtil.find_line(self.remoteSDP.media[i],"a=mid:"+$(this).attr("name"))||0===self.remoteSDP.media[i].indexOf("m="+$(this).attr("name"))){idx=i;break}if(-1==idx)for(i=0;i<self.localSDP.media.length;i++)if(SDPUtil.find_line(self.localSDP.media[i],"a=mid:"+$(this).attr("name"))||0===self.localSDP.media[i].indexOf("m="+$(this).attr("name"))){idx=i;break}var name=$(this).attr("name");$(this).find("transport>candidate").each(function(){var line,candidate;line=SDPUtil.candidateFromJingle(this),candidate=new RTCIceCandidate({sdpMLineIndex:idx,sdpMid:name,candidate:line});try{self.peerconnection.addIceCandidate(candidate)}catch(e){console.error("addIceCandidate failed",e.toString(),line)}})})}},JingleSession.prototype.sendAnswer=function(provisional){var self=this;this.peerconnection.createAnswer(function(sdp){self.createdAnswer(sdp,provisional)},function(e){console.error("createAnswer failed",e)},this.media_constraints)},JingleSession.prototype.createdAnswer=function(sdp,provisional){var self=this;if(this.localSDP=new SDP(sdp.sdp),this.usepranswer=provisional===!0,this.startmuted&&(console.log("we got a request to start muted..."),this.connection.jingle.localStream.getAudioTracks().forEach(function(track){track.enabled=!1}),this.connection.jingle.localStream.getVideoTracks().forEach(function(track){track.enabled=!1}),this.localSDP.media[1]=this.localSDP.media[1].replace("a=sendrecv","a=recvonly"),SDPUtil.find_lines(this.localSDP.media[1],"a=ssrc:").forEach(function(line){self.localSDP.media[1]=self.localSDP.media[1].replace(line+"\r\n","")}),this.localSDP.raw=this.localSDP.session+this.localSDP.media.join("")),this.usetrickle)if(this.usepranswer){sdp.type="pranswer";for(var i=0;i<this.localSDP.media.length;i++)this.localSDP.media[i]=this.localSDP.media[i].replace("a=sendrecv\r\n","a=inactive\r\n");this.localSDP.raw=this.localSDP.session+this.localSDP.media.join("")}else{var accept=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-accept",initiator:this.initiator,responder:this.responder,sid:this.sid});this.localSDP.toJingle(accept,this.initiator==this.me?"initiator":"responder"),this.connection.sendIQ(accept,function(){var ack={};ack.source="answer",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};error.source="answer",$(document).trigger("error.jingle",[self.sid,error])},1e4)}sdp.sdp=this.localSDP.raw,this.peerconnection.setLocalDescription(sdp,function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(e){console.error("setLocalDescription failed",e)});for(var cands=SDPUtil.find_lines(this.localSDP.raw,"a=candidate:"),j=0;j<cands.length;j++){var cand=SDPUtil.parse_icecandidate(cands[j]);"srflx"==cand.type?this.hadstuncandidate=!0:"relay"==cand.type&&(this.hadturncandidate=!0)}},JingleSession.prototype.sendTerminate=function(reason,text){var self=this,term=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-terminate",initiator:this.initiator,sid:this.sid}).c("reason").c(reason||"success");text&&term.up().c("text").t(text),this.connection.sendIQ(term,function(){self.peerconnection.close(),self.peerconnection=null,self.terminate();var ack={};ack.source="terminate",$(document).trigger("ack.jingle",[self.sid,ack])},function(stanza){var error=$(stanza).find("error").length?{code:$(stanza).find("error").attr("code"),reason:$(stanza).find("error :first")[0].tagName}:{};$(document).trigger("ack.jingle",[self.sid,error])},1e4),null!==this.statsinterval&&(window.clearInterval(this.statsinterval),this.statsinterval=null)},JingleSession.prototype.addSource=function(elem){console.log("addssrc",(new Date).getTime()),console.log("ice",this.peerconnection.iceConnectionState);var sdp=new SDP(this.peerconnection.remoteDescription.sdp),self=this;$(elem).each(function(idx,content){var name=$(content).attr("name"),lines="";tmp=$(content).find('>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'),tmp.each(function(){var ssrc=$(this).attr("ssrc");$(this).find(">parameter").each(function(){lines+="a=ssrc:"+ssrc+" "+$(this).attr("name"),$(this).attr("value")&&$(this).attr("value").length&&(lines+=":"+$(this).attr("value")),lines+="\r\n"})}),sdp.media.forEach(function(media,idx){SDPUtil.find_line(media,"a=mid:"+name)&&(sdp.media[idx]+=lines,self.addssrc[idx]||(self.addssrc[idx]=""),self.addssrc[idx]+=lines)}),sdp.raw=sdp.session+sdp.media.join("")}),this.modifySources()},JingleSession.prototype.removeSource=function(elem){console.log("removessrc",(new Date).getTime()),console.log("ice",this.peerconnection.iceConnectionState);var sdp=new SDP(this.peerconnection.remoteDescription.sdp),self=this;$(elem).each(function(idx,content){var name=$(content).attr("name"),lines="";tmp=$(content).find('>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'),tmp.each(function(){var ssrc=$(this).attr("ssrc");$(this).find(">parameter").each(function(){lines+="a=ssrc:"+ssrc+" "+$(this).attr("name"),$(this).attr("value")&&$(this).attr("value").length&&(lines+=":"+$(this).attr("value")),lines+="\r\n"})}),sdp.media.forEach(function(media,idx){SDPUtil.find_line(media,"a=mid:"+name)&&(sdp.media[idx]+=lines,self.addssrc[idx]||(self.removessrc[idx]=""),self.removessrc[idx]+=lines)}),sdp.raw=sdp.session+sdp.media.join("")}),this.modifySources()},JingleSession.prototype.modifySources=function(){var self=this;if("closed"!=this.peerconnection.signalingState&&(this.addssrc.length||this.removessrc.length||null!==this.pendingop)){if("stable"!=this.peerconnection.signalingState||"connected"!=this.peerconnection.iceConnectionState)return console.warn("modifySources not yet",this.peerconnection.signalingState,this.peerconnection.iceConnectionState),this.wait=!0,void window.setTimeout(function(){self.modifySources()},250);if(this.wait)return window.setTimeout(function(){self.modifySources()},2500),void(this.wait=!1);var sdp=new SDP(this.peerconnection.remoteDescription.sdp);this.addssrc.forEach(function(lines,idx){sdp.media[idx]+=lines}),this.addssrc=[],this.removessrc.forEach(function(lines,idx){lines=lines.split("\r\n"),lines.pop(),lines.forEach(function(line){sdp.media[idx]=sdp.media[idx].replace(line+"\r\n","")})}),this.removessrc=[],sdp.raw=sdp.session+sdp.media.join(""),this.peerconnection.setRemoteDescription(new RTCSessionDescription({type:"offer",sdp:sdp.raw}),function(){self.peerconnection.createAnswer(function(modifiedAnswer){if(null!==self.pendingop){var sdp=new SDP(modifiedAnswer.sdp);if(sdp.media.length>1){switch(self.pendingop){case"mute":sdp.media[1]=sdp.media[1].replace("a=sendrecv","a=recvonly");break;case"unmute":sdp.media[1]=sdp.media[1].replace("a=recvonly","a=sendrecv")}sdp.raw=sdp.session+sdp.media.join(""),modifiedAnswer.sdp=sdp.raw}self.pendingop=null}self.peerconnection.setLocalDescription(modifiedAnswer,function(){$(document).trigger("setLocalDescription.jingle",[self.sid])},function(){console.log("modified setLocalDescription failed")})},function(){console.log("modified answer failed")})},function(){console.log("modify failed")})}},JingleSession.prototype.hardMuteVideo=function(muted){this.pendingop=muted?"mute":"unmute",this.modifySources(),this.connection.jingle.localStream.getVideoTracks().forEach(function(track){track.enabled=!muted})},JingleSession.prototype.sendMute=function(muted,content){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c(muted?"mute":"unmute",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"}),info.attrs({creator:this.me==this.initiator?"creator":"responder"}),content&&info.attrs({name:content}),this.connection.send(info)},JingleSession.prototype.sendRinging=function(){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});
+info.c("ringing",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"}),this.connection.send(info)},JingleSession.prototype.getStats=function(interval){var self=this,recv={audio:0,video:0},lost={audio:0,video:0},lastrecv={audio:0,video:0},lastlost={audio:0,video:0},loss={audio:0,video:0},delta={audio:0,video:0};return this.statsinterval=window.setInterval(function(){self&&self.peerconnection&&self.peerconnection.getStats&&self.peerconnection.getStats(function(stats){for(var results=stats.result(),i=0;i<results.length;++i)if("ssrc"==results[i].type){var packetsrecv=results[i].stat("packetsReceived"),packetslost=results[i].stat("packetsLost");packetsrecv&&packetslost&&(packetsrecv=parseInt(packetsrecv,10),packetslost=parseInt(packetslost,10),results[i].stat("googFrameRateReceived")?(lastlost.video=lost.video,lastrecv.video=recv.video,recv.video=packetsrecv,lost.video=packetslost):(lastlost.audio=lost.audio,lastrecv.audio=recv.audio,recv.audio=packetsrecv,lost.audio=packetslost))}delta.audio=recv.audio-lastrecv.audio,delta.video=recv.video-lastrecv.video,loss.audio=delta.audio>0?Math.ceil(100*(lost.audio-lastlost.audio)/delta.audio):0,loss.video=delta.video>0?Math.ceil(100*(lost.video-lastlost.video)/delta.video):0,$(document).trigger("packetloss.jingle",[self.sid,loss])})},interval||3e3),this.statsinterval}}(jQuery);var SDP;!function($){SDP=function(sdp){this.media=sdp.split("\r\nm=");for(var i=1;i<this.media.length;i++)this.media[i]="m="+this.media[i],i!=this.media.length-1&&(this.media[i]+="\r\n");this.session=this.media.shift()+"\r\n",this.raw=this.session+this.media.join("")},SDP.prototype.mangle=function(){var i,j,mline,lines,rtpmap,newdesc;for(i=0;i<this.media.length;i++)if(lines=this.media[i].split("\r\n"),lines.pop(),mline=SDPUtil.parse_mline(lines.shift()),"audio"==mline.media){for(newdesc="",mline.fmt.length=0,j=0;j<lines.length;j++)if("a=rtpmap:"==lines[j].substr(0,9)){if(rtpmap=SDPUtil.parse_rtpmap(lines[j]),"CN"==rtpmap.name||"ISAC"==rtpmap.name)continue;mline.fmt.push(rtpmap.id),newdesc+=lines[j]+"\r\n"}else newdesc+=lines[j]+"\r\n";this.media[i]=SDPUtil.build_mline(mline)+"\r\n",this.media[i]+=newdesc}this.raw=this.session+this.media.join("")},SDP.prototype.removeSessionLines=function(prefix){var self=this,lines=SDPUtil.find_lines(this.session,prefix);return lines.forEach(function(line){self.session=self.session.replace(line+"\r\n","")}),this.raw=this.session+this.media.join(""),lines},SDP.prototype.removeMediaLines=function(mediaindex,prefix){var self=this,lines=SDPUtil.find_lines(this.media[mediaindex],prefix);return lines.forEach(function(line){self.media[mediaindex]=self.media[mediaindex].replace(line+"\r\n","")}),this.raw=this.session+this.media.join(""),lines},SDP.prototype.toJingle=function(elem,thecreator){var i,j,k,mline,ssrc,rtpmap,tmp,lines;if(SDPUtil.find_line(this.session,"a=group:"))for(lines=SDPUtil.find_lines(this.session,"a=group:"),i=0;i<lines.length;i++){tmp=lines[i].split(" ");var semantics=tmp.shift().substr(8);for(elem.c("group",{xmlns:"urn:xmpp:jingle:apps:grouping:0",semantics:semantics}),j=0;j<tmp.length;j++)elem.c("content",{name:tmp[j]}).up();elem.up()}var bundle=[];for(SDPUtil.find_line(this.session,"a=group:BUNDLE")&&(bundle=SDPUtil.find_line(this.session,"a=group:BUNDLE ").split(" "),bundle.shift()),i=0;i<this.media.length;i++)if(mline=SDPUtil.parse_mline(this.media[i].split("\r\n")[0]),"audio"==mline.media||"video"==mline.media){if(ssrc=SDPUtil.find_line(this.media[i],"a=ssrc:")?SDPUtil.find_line(this.media[i],"a=ssrc:").substring(7).split(" ")[0]:!1,elem.c("content",{creator:thecreator,name:mline.media}),SDPUtil.find_line(this.media[i],"a=mid:")){var mid=SDPUtil.parse_mid(SDPUtil.find_line(this.media[i],"a=mid:"));elem.attrs({name:mid}),-1!=bundle.indexOf(mid)&&(elem.c("bundle",{xmlns:"http://estos.de/ns/bundle"}).up(),bundle.splice(bundle.indexOf(mid),1))}if(SDPUtil.find_line(this.media[i],"a=rtpmap:").length){for(elem.c("description",{xmlns:"urn:xmpp:jingle:apps:rtp:1",media:mline.media}),ssrc&&elem.attrs({ssrc:ssrc}),j=0;j<mline.fmt.length;j++){if(rtpmap=SDPUtil.find_line(this.media[i],"a=rtpmap:"+mline.fmt[j]),elem.c("payload-type",SDPUtil.parse_rtpmap(rtpmap)),SDPUtil.find_line(this.media[i],"a=fmtp:"+mline.fmt[j]))for(tmp=SDPUtil.parse_fmtp(SDPUtil.find_line(this.media[i],"a=fmtp:"+mline.fmt[j])),k=0;k<tmp.length;k++)elem.c("parameter",tmp[k]).up();this.RtcpFbToJingle(i,elem,mline.fmt[j]),elem.up()}if(SDPUtil.find_line(this.media[i],"a=crypto:",this.session)){elem.c("encryption",{required:1});var crypto=SDPUtil.find_lines(this.media[i],"a=crypto:",this.session);crypto.forEach(function(line){elem.c("crypto",SDPUtil.parse_crypto(line)).up()}),elem.up()}if(ssrc){elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"});var ssrclines=SDPUtil.find_lines(this.media[i],"a=ssrc:");ssrclines.forEach(function(line){idx=line.indexOf(" ");var linessrc=line.substr(0,idx).substr(7);linessrc!=ssrc&&(elem.up(),ssrc=linessrc,elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"}));var kv=line.substr(idx+1);elem.c("parameter"),-1==kv.indexOf(":")?elem.attrs({name:kv}):(elem.attrs({name:kv.split(":",2)[0]}),elem.attrs({value:kv.split(":",2)[1]})),elem.up()}),elem.up(),tmp=SDPUtil.parse_ssrc(this.media[i]),tmp.xmlns="http://estos.de/ns/ssrc",tmp.ssrc=ssrc,elem.c("ssrc",tmp).up()}if(SDPUtil.find_line(this.media[i],"a=rtcp-mux")&&elem.c("rtcp-mux").up(),this.RtcpFbToJingle(i,elem,"*"),SDPUtil.find_line(this.media[i],"a=extmap:"))for(lines=SDPUtil.find_lines(this.media[i],"a=extmap:"),j=0;j<lines.length;j++){if(tmp=SDPUtil.parse_extmap(lines[j]),elem.c("rtp-hdrext",{xmlns:"urn:xmpp:jingle:apps:rtp:rtp-hdrext:0",uri:tmp.uri,id:tmp.value}),tmp.hasOwnProperty("direction"))switch(tmp.direction){case"sendonly":elem.attrs({senders:"responder"});break;case"recvonly":elem.attrs({senders:"initiator"});break;case"sendrecv":elem.attrs({senders:"both"});break;case"inactive":elem.attrs({senders:"none"})}elem.up()}elem.up()}this.TransportToJingle(i,elem),SDPUtil.find_line(this.media[i],"a=sendrecv",this.session)?elem.attrs({senders:"both"}):SDPUtil.find_line(this.media[i],"a=sendonly",this.session)?elem.attrs({senders:"initiator"}):SDPUtil.find_line(this.media[i],"a=recvonly",this.session)?elem.attrs({senders:"responder"}):SDPUtil.find_line(this.media[i],"a=inactive",this.session)&&elem.attrs({senders:"none"}),"0"==mline.port&&elem.attrs({senders:"rejected"}),elem.up()}return elem.up(),elem},SDP.prototype.TransportToJingle=function(mediaindex,elem){var tmp,self=this;elem.c("transport");var fingerprints=SDPUtil.find_lines(this.media[mediaindex],"a=fingerprint:",this.session);if(fingerprints.forEach(function(line){tmp=SDPUtil.parse_fingerprint(line),tmp.xmlns="urn:xmpp:tmp:jingle:apps:dtls:0",elem.c("fingerprint").t(tmp.fingerprint),delete tmp.fingerprint,line=SDPUtil.find_line(self.media[mediaindex],"a=setup:",self.session),line&&(tmp.setup=line.substr(8)),elem.attrs(tmp),elem.up()}),tmp=SDPUtil.iceparams(this.media[mediaindex],this.session),tmp&&(tmp.xmlns="urn:xmpp:jingle:transports:ice-udp:1",elem.attrs(tmp),SDPUtil.find_line(this.media[mediaindex],"a=candidate:",this.session))){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=candidate:",this.session);lines.forEach(function(line){elem.c("candidate",SDPUtil.candidateToJingle(line)).up()})}elem.up()},SDP.prototype.RtcpFbToJingle=function(mediaindex,elem,payloadtype){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=rtcp-fb:"+payloadtype);lines.forEach(function(line){var tmp=SDPUtil.parse_rtcpfb(line);"trr-int"==tmp.type?(elem.c("rtcp-fb-trr-int",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",value:tmp.params[0]}),elem.up()):(elem.c("rtcp-fb",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",type:tmp.type}),tmp.params.length>0&&elem.attrs({subtype:tmp.params[0]}),elem.up())})},SDP.prototype.RtcpFbFromJingle=function(elem,payloadtype){var media="",tmp=elem.find('>rtcp-fb-trr-int[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]');return tmp.length&&(media+="a=rtcp-fb:* trr-int ",media+=tmp.attr("value")?tmp.attr("value"):"0",media+="\r\n"),tmp=elem.find('>rtcp-fb[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]'),tmp.each(function(){media+="a=rtcp-fb:"+payloadtype+" "+$(this).attr("type"),$(this).attr("subtype")&&(media+=" "+$(this).attr("subtype")),media+="\r\n"}),media},SDP.prototype.fromJingle=function(jingle){var self=this;if(this.raw="v=0\r\no=- 1923518516 2 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\n",$(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').length)$(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').each(function(idx,group){var contents=$(group).find(">content").map(function(idx,content){return content.getAttribute("name")}).get();contents.length>0&&(self.raw+="a=group:"+(group.getAttribute("semantics")||group.getAttribute("type"))+" "+contents.join(" ")+"\r\n")});else if($(jingle).find('>group[xmlns="urn:ietf:rfc:5888"]').length)$(jingle).find('>group[xmlns="urn:ietf:rfc:5888"]').each(function(idx,group){var contents=$(group).find(">content").map(function(idx,content){return content.getAttribute("name")}).get();null!==group.getAttribute("type")&&contents.length>0&&(self.raw+="a=group:"+group.getAttribute("type")+" "+contents.join(" ")+"\r\n")});else{var bundle=$(jingle).find(">content").filter(function(idx,content){return $(content).find(">bundle").length>0}).map(function(idx,content){return content.getAttribute("name")}).get();bundle.length&&(this.raw+="a=group:BUNDLE "+bundle.join(" ")+"\r\n")}this.session=this.raw,jingle.find(">content").each(function(){var m=self.jingle2media($(this));self.media.push(m)}),this.raw=this.session+this.media.join("")},SDP.prototype.jingle2media=function(content){var tmp,media="",desc=content.find("description"),ssrc=desc.attr("ssrc"),self=this;switch(tmp={media:desc.attr("media")},tmp.port="1","rejected"==content.attr("senders")&&(tmp.port="0"),tmp.proto=content.find(">transport>fingerprint").length||desc.find("encryption").length?"RTP/SAVPF":"RTP/AVPF",tmp.fmt=desc.find("payload-type").map(function(){return this.getAttribute("id")}).get(),media+=SDPUtil.build_mline(tmp)+"\r\n",media+="c=IN IP4 0.0.0.0\r\n",media+="a=rtcp:1 IN IP4 0.0.0.0\r\n",tmp=content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]'),tmp.length&&(tmp.attr("ufrag")&&(media+=SDPUtil.build_iceufrag(tmp.attr("ufrag"))+"\r\n"),tmp.attr("pwd")&&(media+=SDPUtil.build_icepwd(tmp.attr("pwd"))+"\r\n"),tmp.find(">fingerprint").each(function(){media+="a=fingerprint:"+this.getAttribute("hash"),media+=" "+$(this).text(),media+="\r\n",this.getAttribute("setup")&&(media+="a=setup:"+this.getAttribute("setup")+"\r\n")})),content.attr("senders")){case"initiator":media+="a=sendonly\r\n";break;case"responder":media+="a=recvonly\r\n";break;case"none":media+="a=inactive\r\n";break;case"both":media+="a=sendrecv\r\n"}return media+="a=mid:"+content.attr("name")+"\r\n",desc.find("rtcp-mux").length&&(media+="a=rtcp-mux\r\n"),desc.find("encryption").length&&desc.find("encryption>crypto").each(function(){media+="a=crypto:"+this.getAttribute("tag"),media+=" "+this.getAttribute("crypto-suite"),media+=" "+this.getAttribute("key-params"),this.getAttribute("session-params")&&(media+=" "+this.getAttribute("session-params")),media+="\r\n"}),desc.find("payload-type").each(function(){media+=SDPUtil.build_rtpmap(this)+"\r\n",$(this).find(">parameter").length&&(media+="a=fmtp:"+this.getAttribute("id")+" ",media+=$(this).find("parameter").map(function(){return(this.getAttribute("name")?this.getAttribute("name")+"=":"")+this.getAttribute("value")}).get().join(";"),media+="\r\n"),media+=self.RtcpFbFromJingle($(this),this.getAttribute("id"))}),media+=self.RtcpFbFromJingle(desc,"*"),tmp=desc.find('>rtp-hdrext[xmlns="urn:xmpp:jingle:apps:rtp:rtp-hdrext:0"]'),tmp.each(function(){media+="a=extmap:"+this.getAttribute("id")+" "+this.getAttribute("uri")+"\r\n"}),content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]>candidate').each(function(){media+=SDPUtil.candidateFromJingle(this)}),tmp=content.find('description>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'),tmp.each(function(){var ssrc=this.getAttribute("ssrc");$(this).find(">parameter").each(function(){media+="a=ssrc:"+ssrc+" "+this.getAttribute("name"),this.getAttribute("value")&&this.getAttribute("value").length&&(media+=":"+this.getAttribute("value")),media+="\r\n"})}),0===tmp.length&&(tmp=content.find('description>ssrc[xmlns="http://estos.de/ns/ssrc"]'),tmp.length&&(media+="a=ssrc:"+ssrc+" cname:"+tmp.attr("cname")+"\r\n",media+="a=ssrc:"+ssrc+" msid:"+tmp.attr("msid")+"\r\n",media+="a=ssrc:"+ssrc+" mslabel:"+tmp.attr("mslabel")+"\r\n",media+="a=ssrc:"+ssrc+" label:"+tmp.attr("label")+"\r\n")),media},SDPUtil={iceparams:function(mediadesc,sessiondesc){var data=null;return SDPUtil.find_line(mediadesc,"a=ice-ufrag:",sessiondesc)&&SDPUtil.find_line(mediadesc,"a=ice-pwd:",sessiondesc)&&(data={ufrag:SDPUtil.parse_iceufrag(SDPUtil.find_line(mediadesc,"a=ice-ufrag:",sessiondesc)),pwd:SDPUtil.parse_icepwd(SDPUtil.find_line(mediadesc,"a=ice-pwd:",sessiondesc))}),data},parse_iceufrag:function(line){return line.substring(12)},build_iceufrag:function(frag){return"a=ice-ufrag:"+frag},parse_icepwd:function(line){return line.substring(10)},build_icepwd:function(pwd){return"a=ice-pwd:"+pwd},parse_mid:function(line){return line.substring(6)},parse_mline:function(line){var parts=line.substring(2).split(" "),data={};return data.media=parts.shift(),data.port=parts.shift(),data.proto=parts.shift(),""===parts[parts.length-1]&&parts.pop(),data.fmt=parts,data},build_mline:function(mline){return"m="+mline.media+" "+mline.port+" "+mline.proto+" "+mline.fmt.join(" ")},parse_rtpmap:function(line){var parts=line.substring(9).split(" "),data={};return data.id=parts.shift(),parts=parts[0].split("/"),data.name=parts.shift(),data.clockrate=parts.shift(),data.channels=parts.length?parts.shift():"1",data},build_rtpmap:function(el){var line="a=rtpmap:"+el.getAttribute("id")+" "+el.getAttribute("name")+"/"+el.getAttribute("clockrate");return el.getAttribute("channels")&&"1"!=el.getAttribute("channels")&&(line+="/"+el.getAttribute("channels")),line},parse_crypto:function(line){var parts=line.substring(9).split(" "),data={};return data.tag=parts.shift(),data["crypto-suite"]=parts.shift(),data["key-params"]=parts.shift(),parts.length&&(data["session-params"]=parts.join(" ")),data},parse_fingerprint:function(line){var parts=line.substring(14).split(" "),data={};return data.hash=parts.shift(),data.fingerprint=parts.shift(),data},parse_fmtp:function(line){var i,key,value,parts=line.split(" "),data=[];for(parts.shift(),parts=parts.join(" ").split(";"),i=0;i<parts.length;i++){for(key=parts[i].split("=")[0];key.length&&" "==key[0];)key=key.substring(1);value=parts[i].split("=")[1],key&&value?data.push({name:key,value:value}):key&&data.push({name:"",value:key})}return data},parse_icecandidate:function(line){var candidate={},elems=line.split(" ");candidate.foundation=elems[0].substring(12),candidate.component=elems[1],candidate.protocol=elems[2].toLowerCase(),candidate.priority=elems[3],candidate.ip=elems[4],candidate.port=elems[5],candidate.type=elems[7],candidate.generation=0;for(var i=8;i<elems.length;i+=2)switch(elems[i]){case"raddr":candidate["rel-addr"]=elems[i+1];break;case"rport":candidate["rel-port"]=elems[i+1];break;case"generation":candidate.generation=elems[i+1];break;case"tcptype":candidate.tcptype=elems[i+1];break;default:console.log('parse_icecandidate not translating "'+elems[i]+'" = "'+elems[i+1]+'"')}return candidate.network="1",candidate.id=Math.random().toString(36).substr(2,10),candidate},build_icecandidate:function(cand){var line=["a=candidate:"+cand.foundation,cand.component,cand.protocol,cand.priority,cand.ip,cand.port,"typ",cand.type].join(" ");switch(line+=" ",cand.type){case"srflx":case"prflx":case"relay":cand.hasOwnAttribute("rel-addr")&&cand.hasOwnAttribute("rel-port")&&(line+="raddr",line+=" ",line+=cand["rel-addr"],line+=" ",line+="rport",line+=" ",line+=cand["rel-port"],line+=" ")}return cand.hasOwnAttribute("tcptype")&&(line+="tcptype",line+=" ",line+=cand.tcptype,line+=" "),line+="generation",line+=" ",line+=cand.hasOwnAttribute("generation")?cand.generation:"0"},parse_ssrc:function(desc){for(var lines=desc.split("\r\n"),data={},i=0;i<lines.length;i++)if("a=ssrc:"==lines[i].substring(0,7)){var idx=lines[i].indexOf(" ");data[lines[i].substr(idx+1).split(":",2)[0]]=lines[i].substr(idx+1).split(":",2)[1]}return data},parse_rtcpfb:function(line){var parts=line.substr(10).split(" "),data={};return data.pt=parts.shift(),data.type=parts.shift(),data.params=parts,data},parse_extmap:function(line){var parts=line.substr(9).split(" "),data={};return data.value=parts.shift(),-1!=data.value.indexOf("/")?(data.direction=data.value.substr(data.value.indexOf("/")+1),data.value=data.value.substr(0,data.value.indexOf("/"))):data.direction="both",data.uri=parts.shift(),data.params=parts,data},find_line:function(haystack,needle,sessionpart){for(var lines=haystack.split("\r\n"),i=0;i<lines.length;i++)if(lines[i].substring(0,needle.length)==needle)return lines[i];if(!sessionpart)return!1;lines=sessionpart.split("\r\n");for(var j=0;j<lines.length;j++)if(lines[j].substring(0,needle.length)==needle)return lines[j];return!1},find_lines:function(haystack,needle,sessionpart){for(var lines=haystack.split("\r\n"),needles=[],i=0;i<lines.length;i++)lines[i].substring(0,needle.length)==needle&&needles.push(lines[i]);if(needles.length||!sessionpart)return needles;lines=sessionpart.split("\r\n");for(var j=0;j<lines.length;j++)lines[j].substring(0,needle.length)==needle&&needles.push(lines[j]);return needles},candidateToJingle:function(line){if(0===line.indexOf("candidate:"))line="a="+line;else if("a=candidate:"!=line.substring(0,12))return console.log("parseCandidate called with a line that is not a candidate line"),console.log(line),null;"\r\n"==line.substring(line.length-2)&&(line=line.substring(0,line.length-2));var i,candidate={},elems=line.split(" ");if("typ"!=elems[6])return console.log("did not find typ in the right place"),console.log(line),null;for(candidate.foundation=elems[0].substring(12),candidate.component=elems[1],candidate.protocol=elems[2].toLowerCase(),candidate.priority=elems[3],candidate.ip=elems[4],candidate.port=elems[5],candidate.type=elems[7],candidate.generation="0",i=8;i<elems.length;i+=2)switch(elems[i]){case"raddr":candidate["rel-addr"]=elems[i+1];break;case"rport":candidate["rel-port"]=elems[i+1];break;case"generation":candidate.generation=elems[i+1];break;case"tcptype":candidate.tcptype=elems[i+1];break;default:console.log('not translating "'+elems[i]+'" = "'+elems[i+1]+'"')}return candidate.network="1",candidate.id=Math.random().toString(36).substr(2,10),candidate},candidateFromJingle:function(cand){var line="a=candidate:";switch(line+=cand.getAttribute("foundation"),line+=" ",line+=cand.getAttribute("component"),line+=" ",line+=cand.getAttribute("protocol"),line+=" ",line+=cand.getAttribute("priority"),line+=" ",line+=cand.getAttribute("ip"),line+=" ",line+=cand.getAttribute("port"),line+=" ",line+="typ",line+=" "+cand.getAttribute("type"),line+=" ",cand.getAttribute("type")){case"srflx":case"prflx":case"relay":cand.getAttribute("rel-addr")&&cand.getAttribute("rel-port")&&(line+="raddr",line+=" ",line+=cand.getAttribute("rel-addr"),line+=" ",line+="rport",line+=" ",line+=cand.getAttribute("rel-port"),line+=" ")}return line+="generation",line+=" ",line+=cand.getAttribute("generation")||"0",line+"\r\n"}}}(jQuery);var setupRTC,getUserMediaWithConstraints,TraceablePeerConnection;!function($){TraceablePeerConnection=function(ice_config,constraints){var self=this,RTCPeerconnection=navigator.mozGetUserMedia?mozRTCPeerConnection:webkitRTCPeerConnection;this.peerconnection=new RTCPeerconnection(ice_config,constraints),this.updateLog=[],this.stats={},this.statsinterval=null,this.maxstats=300,this.trace=function(what,info){self.updateLog.push({time:new Date,type:what,value:info||""})},this.onicecandidate=null,this.peerconnection.onicecandidate=function(event){self.trace("onicecandidate",JSON.stringify(event.candidate,null," ")),null!==self.onicecandidate&&self.onicecandidate(event)},this.onaddstream=null,this.peerconnection.onaddstream=function(event){self.trace("onaddstream",event.stream.id),null!==self.onaddstream&&self.onaddstream(event)},this.onremovestream=null,this.peerconnection.onremovestream=function(event){self.trace("onremovestream",event.stream.id),null!==self.onremovestream&&self.onremovestream(event)},this.onsignalingstatechange=null,this.peerconnection.onsignalingstatechange=function(event){self.trace("onsignalingstatechange",self.signalingState),null!==self.onsignalingstatechange&&self.onsignalingstatechange(event)},this.oniceconnectionstatechange=null,this.peerconnection.oniceconnectionstatechange=function(event){self.trace("oniceconnectionstatechange",self.iceConnectionState),null!==self.oniceconnectionstatechange&&self.oniceconnectionstatechange(event)},this.onnegotiationneeded=null,this.peerconnection.onnegotiationneeded=function(event){self.trace("onnegotiationneeded"),null!==self.onnegotiationneeded&&self.onnegotiationneeded(event)},self.ondatachannel=null,this.peerconnection.ondatachannel=function(event){self.trace("ondatachannel",event),null!==self.ondatachannel&&self.ondatachannel(event)},navigator.mozGetUserMedia||(this.statsinterval=window.setInterval(function(){self.peerconnection.getStats(function(stats){for(var results=stats.result(),i=0;i<results.length;++i){var now=new Date;results[i].names().forEach(function(name){var id=results[i].id+"-"+name;self.stats[id]||(self.stats[id]={startTime:now,endTime:now,values:[],times:[]}),self.stats[id].values.push(results[i].stat(name)),self.stats[id].times.push(now.getTime()),self.stats[id].values.length>self.maxstats&&(self.stats[id].values.shift(),self.stats[id].times.shift()),self.stats[id].endTime=now})}})},1e3))},dumpSDP=function(description){return"type: "+description.type+"\r\n"+description.sdp},void 0!==TraceablePeerConnection.prototype.__defineGetter__&&(TraceablePeerConnection.prototype.__defineGetter__("signalingState",function(){return this.peerconnection.signalingState}),TraceablePeerConnection.prototype.__defineGetter__("iceConnectionState",function(){return this.peerconnection.iceConnectionState}),TraceablePeerConnection.prototype.__defineGetter__("localDescription",function(){return this.peerconnection.localDescription}),TraceablePeerConnection.prototype.__defineGetter__("remoteDescription",function(){return this.peerconnection.remoteDescription})),TraceablePeerConnection.prototype.addStream=function(stream){this.trace("addStream",stream.id),this.peerconnection.addStream(stream)},TraceablePeerConnection.prototype.removeStream=function(stream){this.trace("removeStream",stream.id),this.peerconnection.removeStream(stream)},TraceablePeerConnection.prototype.createDataChannel=function(label,opts){this.trace("createDataChannel",label,opts),this.peerconnection.createDataChannel(label,opts)},TraceablePeerConnection.prototype.setLocalDescription=function(description,successCallback,failureCallback){var self=this;this.trace("setLocalDescription",dumpSDP(description)),this.peerconnection.setLocalDescription(description,function(){self.trace("setLocalDescriptionOnSuccess"),successCallback()},function(err){self.trace("setLocalDescriptionOnFailure",err),failureCallback(err)})},TraceablePeerConnection.prototype.setRemoteDescription=function(description,successCallback,failureCallback){var self=this;this.trace("setRemoteDescription",dumpSDP(description)),this.peerconnection.setRemoteDescription(description,function(){self.trace("setRemoteDescriptionOnSuccess"),successCallback()},function(err){self.trace("setRemoteDescriptionOnFailure",err),failureCallback(err)})},TraceablePeerConnection.prototype.close=function(){this.trace("stop"),null!==this.statsinterval&&(window.clearInterval(this.statsinterval),this.statsinterval=null),this.peerconnection.close()},TraceablePeerConnection.prototype.createOffer=function(successCallback,failureCallback,constraints){var self=this;this.trace("createOffer",JSON.stringify(constraints,null," ")),this.peerconnection.createOffer(function(offer){self.trace("createOfferOnSuccess",dumpSDP(offer)),successCallback(offer)},function(err){self.trace("createOfferOnFailure",err),failureCallback(err)},constraints)},TraceablePeerConnection.prototype.createAnswer=function(successCallback,failureCallback,constraints){var self=this;this.trace("createAnswer",JSON.stringify(constraints,null," ")),this.peerconnection.createAnswer(function(answer){self.trace("createAnswerOnSuccess",dumpSDP(answer)),successCallback(answer)},function(err){self.trace("createAnswerOnFailure",err),failureCallback(err)},constraints)},TraceablePeerConnection.prototype.addIceCandidate=function(candidate){this.trace("addIceCandidate",JSON.stringify(candidate,null," ")),this.peerconnection.addIceCandidate(candidate)},TraceablePeerConnection.prototype.getStats=function(callback){navigator.mozGetUserMedia||this.peerconnection.getStats(callback)},setupRTC=function(){var RTC=null;if(navigator.mozGetUserMedia){console.log("This appears to be Firefox");var version=parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1],10);version>=22&&(RTC={peerconnection:mozRTCPeerConnection,browser:"firefox",getUserMedia:navigator.mozGetUserMedia.bind(navigator),attachMediaStream:function(element,stream){element[0].mozSrcObject=stream,element[0].play()},pc_constraints:{}},MediaStream.prototype.getVideoTracks||(MediaStream.prototype.getVideoTracks=function(){return[]}),MediaStream.prototype.getAudioTracks||(MediaStream.prototype.getAudioTracks=function(){return[]}),RTCSessionDescription=mozRTCSessionDescription,RTCIceCandidate=mozRTCIceCandidate)}else navigator.webkitGetUserMedia&&(console.log("This appears to be Chrome"),RTC={peerconnection:webkitRTCPeerConnection,browser:"chrome",getUserMedia:navigator.webkitGetUserMedia.bind(navigator),attachMediaStream:function(element,stream){element.attr("src",webkitURL.createObjectURL(stream))},pc_constraints:{optional:[{DtlsSrtpKeyAgreement:"true"}]}},-1!=navigator.userAgent.indexOf("Android")&&(RTC.pc_constraints={}),webkitMediaStream.prototype.getVideoTracks||(webkitMediaStream.prototype.getVideoTracks=function(){return this.videoTracks}),webkitMediaStream.prototype.getAudioTracks||(webkitMediaStream.prototype.getAudioTracks=function(){return this.audioTracks}));if(null===RTC)try{console.log("Browser does not appear to be WebRTC-capable")}catch(e){}return RTC},getUserMediaWithConstraints=function(um,resolution,bandwidth,fps){var constraints={audio:!1,video:!1};switch(um.indexOf("video")>=0&&(constraints.video={mandatory:{}}),um.indexOf("audio")>=0&&(constraints.audio={}),um.indexOf("screen")>=0&&(constraints.video={mandatory:{chromeMediaSource:"screen"}}),resolution&&!constraints.video&&(constraints.video={mandatory:{}}),resolution){case"1080":case"fullhd":constraints.video.mandatory.minWidth=1920,constraints.video.mandatory.minHeight=1080,constraints.video.mandatory.minAspectRatio=1.77;break;case"720":case"hd":constraints.video.mandatory.minWidth=1280,constraints.video.mandatory.minHeight=720,constraints.video.mandatory.minAspectRatio=1.77;break;case"360":constraints.video.mandatory.minWidth=640,constraints.video.mandatory.minHeight=360,constraints.video.mandatory.minAspectRatio=1.77;break;case"180":constraints.video.mandatory.minWidth=320,constraints.video.mandatory.minHeight=180,constraints.video.mandatory.minAspectRatio=1.77;break;case"960":constraints.video.mandatory.minWidth=960,constraints.video.mandatory.minHeight=720;break;case"640":case"vga":constraints.video.mandatory.minWidth=640,constraints.video.mandatory.minHeight=480;break;case"320":constraints.video.mandatory.minWidth=320,constraints.video.mandatory.minHeight=240;break;default:-1!=navigator.userAgent.indexOf("Android")&&(constraints.video.mandatory.minWidth=320,constraints.video.mandatory.minHeight=240,constraints.video.mandatory.maxFrameRate=15)}bandwidth&&(constraints.video||(constraints.video={mandatory:{}}),constraints.video.optional=[{bandwidth:bandwidth}]),fps&&(constraints.video||(constraints.video={mandatory:{}}),constraints.video.mandatory.minFrameRate=fps);try{RTC.getUserMedia(constraints,function(stream){console.log("onUserMediaSuccess"),$(document).trigger("mediaready.jingle",[stream])},function(error){console.warn("Failed to get access to local media. Error ",error),$(document).trigger("mediafailure.jingle",[error])})}catch(e){console.error("GUM failed: ",e),$(document).trigger("mediafailure.jingle")}}}(jQuery),function(root,factory){"function"==typeof define&&define.amd?define(factory):"undefined"!=typeof module&&module.exports?module.exports=factory():root.Salsa20=factory()}(this,function(){function Salsa20(key,nonce){this.rounds=20,this.sigmaWords=[1634760805,857760878,2036477234,1797285236],this.keyWords=[],this.nonceWords=[0,0],this.counterWords=[0,0],this.block=[],this.blockUsed=64,this.setKey(key),this.setNonce(nonce)}return Salsa20.prototype.setKey=function(key){for(var i=0,j=0;8>i;i++,j+=4)this.keyWords[i]=255&key[j]|(255&key[j+1])<<8|(255&key[j+2])<<16|(255&key[j+3])<<24;this._reset()},Salsa20.prototype.setNonce=function(nonce){this.nonceWords[0]=255&nonce[0]|(255&nonce[1])<<8|(255&nonce[2])<<16|(255&nonce[3])<<24,this.nonceWords[1]=255&nonce[4]|(255&nonce[5])<<8|(255&nonce[6])<<16|(255&nonce[7])<<24,this._reset()},Salsa20.prototype.getBytes=function(numberOfBytes){for(var out=new Array(numberOfBytes),i=0;numberOfBytes>i;i++)64==this.blockUsed&&(this._generateBlock(),this._incrementCounter(),this.blockUsed=0),out[i]=this.block[this.blockUsed],this.blockUsed++;return out},Salsa20.prototype.getHexString=function(numberOfBytes){for(var hex=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],out=[],bytes=this.getBytes(numberOfBytes),i=0;i<bytes.length;i++)out.push(hex[bytes[i]>>4&15]),out.push(hex[15&bytes[i]]);return out.join("")},Salsa20.prototype._reset=function(){this.counterWords[0]=0,this.counterWords[1]=0,this.blockUsed=64},Salsa20.prototype._incrementCounter=function(){this.counterWords[0]=this.counterWords[0]+1&4294967295,0==this.counterWords[0]&&(this.counterWords[1]=this.counterWords[1]+1&4294967295)},Salsa20.prototype._generateBlock=function(){for(var u,j0=this.sigmaWords[0],j1=this.keyWords[0],j2=this.keyWords[1],j3=this.keyWords[2],j4=this.keyWords[3],j5=this.sigmaWords[1],j6=this.nonceWords[0],j7=this.nonceWords[1],j8=this.counterWords[0],j9=this.counterWords[1],j10=this.sigmaWords[2],j11=this.keyWords[4],j12=this.keyWords[5],j13=this.keyWords[6],j14=this.keyWords[7],j15=this.sigmaWords[3],x0=j0,x1=j1,x2=j2,x3=j3,x4=j4,x5=j5,x6=j6,x7=j7,x8=j8,x9=j9,x10=j10,x11=j11,x12=j12,x13=j13,x14=j14,x15=j15,i=0;i<this.rounds;i+=2)u=x0+x12,x4^=u<<7|u>>>25,u=x4+x0,x8^=u<<9|u>>>23,u=x8+x4,x12^=u<<13|u>>>19,u=x12+x8,x0^=u<<18|u>>>14,u=x5+x1,x9^=u<<7|u>>>25,u=x9+x5,x13^=u<<9|u>>>23,u=x13+x9,x1^=u<<13|u>>>19,u=x1+x13,x5^=u<<18|u>>>14,u=x10+x6,x14^=u<<7|u>>>25,u=x14+x10,x2^=u<<9|u>>>23,u=x2+x14,x6^=u<<13|u>>>19,u=x6+x2,x10^=u<<18|u>>>14,u=x15+x11,x3^=u<<7|u>>>25,u=x3+x15,x7^=u<<9|u>>>23,u=x7+x3,x11^=u<<13|u>>>19,u=x11+x7,x15^=u<<18|u>>>14,u=x0+x3,x1^=u<<7|u>>>25,u=x1+x0,x2^=u<<9|u>>>23,u=x2+x1,x3^=u<<13|u>>>19,u=x3+x2,x0^=u<<18|u>>>14,u=x5+x4,x6^=u<<7|u>>>25,u=x6+x5,x7^=u<<9|u>>>23,u=x7+x6,x4^=u<<13|u>>>19,u=x4+x7,x5^=u<<18|u>>>14,u=x10+x9,x11^=u<<7|u>>>25,u=x11+x10,x8^=u<<9|u>>>23,u=x8+x11,x9^=u<<13|u>>>19,u=x9+x8,x10^=u<<18|u>>>14,u=x15+x14,x12^=u<<7|u>>>25,u=x12+x15,x13^=u<<9|u>>>23,u=x13+x12,x14^=u<<13|u>>>19,u=x14+x13,x15^=u<<18|u>>>14;x0+=j0,x1+=j1,x2+=j2,x3+=j3,x4+=j4,x5+=j5,x6+=j6,x7+=j7,x8+=j8,x9+=j9,x10+=j10,x11+=j11,x12+=j12,x13+=j13,x14+=j14,x15+=j15,this.block[0]=x0>>>0&255,this.block[1]=x0>>>8&255,this.block[2]=x0>>>16&255,this.block[3]=x0>>>24&255,this.block[4]=x1>>>0&255,this.block[5]=x1>>>8&255,this.block[6]=x1>>>16&255,this.block[7]=x1>>>24&255,this.block[8]=x2>>>0&255,this.block[9]=x2>>>8&255,this.block[10]=x2>>>16&255,this.block[11]=x2>>>24&255,this.block[12]=x3>>>0&255,this.block[13]=x3>>>8&255,this.block[14]=x3>>>16&255,this.block[15]=x3>>>24&255,this.block[16]=x4>>>0&255,this.block[17]=x4>>>8&255,this.block[18]=x4>>>16&255,this.block[19]=x4>>>24&255,this.block[20]=x5>>>0&255,this.block[21]=x5>>>8&255,this.block[22]=x5>>>16&255,this.block[23]=x5>>>24&255,this.block[24]=x6>>>0&255,this.block[25]=x6>>>8&255,this.block[26]=x6>>>16&255,this.block[27]=x6>>>24&255,this.block[28]=x7>>>0&255,this.block[29]=x7>>>8&255,this.block[30]=x7>>>16&255,this.block[31]=x7>>>24&255,this.block[32]=x8>>>0&255,this.block[33]=x8>>>8&255,this.block[34]=x8>>>16&255,this.block[35]=x8>>>24&255,this.block[36]=x9>>>0&255,this.block[37]=x9>>>8&255,this.block[38]=x9>>>16&255,this.block[39]=x9>>>24&255,this.block[40]=x10>>>0&255,this.block[41]=x10>>>8&255,this.block[42]=x10>>>16&255,this.block[43]=x10>>>24&255,this.block[44]=x11>>>0&255,this.block[45]=x11>>>8&255,this.block[46]=x11>>>16&255,this.block[47]=x11>>>24&255,this.block[48]=x12>>>0&255,this.block[49]=x12>>>8&255,this.block[50]=x12>>>16&255,this.block[51]=x12>>>24&255,this.block[52]=x13>>>0&255,this.block[53]=x13>>>8&255,this.block[54]=x13>>>16&255,this.block[55]=x13>>>24&255,this.block[56]=x14>>>0&255,this.block[57]=x14>>>8&255,this.block[58]=x14>>>16&255,this.block[59]=x14>>>24&255,this.block[60]=x15>>>0&255,this.block[61]=x15>>>8&255,this.block[62]=x15>>>16&255,this.block[63]=x15>>>24&255
+},Salsa20}),function(root,factory){"function"==typeof define&&define.amd?define(factory.bind(root,root.crypto||root.msCrypto)):"undefined"!=typeof module&&module.exports?module.exports=factory(require("crypto")):root.BigInt=factory(root.crypto||root.msCrypto)}(this,function(crypto){function findPrimes(n){var i,s,p,ans;for(s=new Array(n),i=0;n>i;i++)s[i]=0;for(s[0]=2,p=0;s[p]<n;){for(i=s[p]*s[p];n>i;i+=s[p])s[i]=1;for(p++,s[p]=s[p-1]+1;s[p]<n&&s[s[p]];s[p]++);}for(ans=new Array(p),i=0;p>i;i++)ans[i]=s[i];return ans}function millerRabin(x,b){var i,j,k,s;if(mr_x1.length!=x.length&&(mr_x1=dup(x),mr_r=dup(x),mr_a=dup(x)),copy_(mr_a,b),copy_(mr_r,x),copy_(mr_x1,x),addInt_(mr_r,-1),addInt_(mr_x1,-1),isZero(mr_r))return 0;for(k=0;0==mr_r[k];k++);for(i=1,j=2;mr_r[k]%j==0;j*=2,i++);if(s=k*bpe+i-1,s&&rightShift_(mr_r,s),powMod_(mr_a,mr_r,x),!equalsInt(mr_a,1)&&!equals(mr_a,mr_x1)){for(j=1;s-1>=j&&!equals(mr_a,mr_x1);){if(squareMod_(mr_a,x),equalsInt(mr_a,1))return 0;j++}if(!equals(mr_a,mr_x1))return 0}return 1}function bitSize(x){var j,z,w;for(j=x.length-1;0==x[j]&&j>0;j--);for(z=0,w=x[j];w;w>>=1,z++);return z+=bpe*j}function expand(x,n){var ans=int2bigInt(0,(x.length>n?x.length:n)*bpe,0);return copy_(ans,x),ans}function mod(x,n){var ans=dup(x);return mod_(ans,n),trim(ans,1)}function mult(x,y){var ans=expand(x,x.length+y.length);return mult_(ans,y),trim(ans,1)}function powMod(x,y,n){var ans=expand(x,n.length);return powMod_(ans,trim(y,2),trim(n,2),0),trim(ans,1)}function sub(x,y){var ans=expand(x,x.length>y.length?x.length+1:y.length+1);return sub_(ans,y),trim(ans,1)}function add(x,y){var ans=expand(x,x.length>y.length?x.length+1:y.length+1);return add_(ans,y),trim(ans,1)}function inverseMod(x,n){var s,ans=expand(x,n.length);return s=inverseMod_(ans,n),s?trim(ans,1):null}function multMod(x,y,n){var ans=expand(x,n.length);return multMod_(ans,y,n),trim(ans,1)}function randBigInt(n,s){var a,b;return a=Math.floor((n-1)/bpe)+2,b=int2bigInt(0,0,a),randBigInt_(b,n,s),b}function randBigInt_(b,n,s){var i,a;for(i=0;i<b.length;i++)b[i]=0;for(a=Math.floor((n-1)/bpe)+1,i=0;a>i;i++)b[i]=randomBitInt(bpe);b[a-1]&=(2<<(n-1)%bpe)-1,1==s&&(b[a-1]|=1<<(n-1)%bpe)}function inverseMod_(x,n){var k=1+2*Math.max(x.length,n.length);if(!(1&x[0]||1&n[0]))return copyInt_(x,0),0;for(eg_u.length!=k&&(eg_u=new Array(k),eg_v=new Array(k),eg_A=new Array(k),eg_B=new Array(k),eg_C=new Array(k),eg_D=new Array(k)),copy_(eg_u,x),copy_(eg_v,n),copyInt_(eg_A,1),copyInt_(eg_B,0),copyInt_(eg_C,0),copyInt_(eg_D,1);;){for(;!(1&eg_u[0]);)halve_(eg_u),1&eg_A[0]||1&eg_B[0]?(add_(eg_A,n),halve_(eg_A),sub_(eg_B,x),halve_(eg_B)):(halve_(eg_A),halve_(eg_B));for(;!(1&eg_v[0]);)halve_(eg_v),1&eg_C[0]||1&eg_D[0]?(add_(eg_C,n),halve_(eg_C),sub_(eg_D,x),halve_(eg_D)):(halve_(eg_C),halve_(eg_D));if(greater(eg_v,eg_u)?(sub_(eg_v,eg_u),sub_(eg_C,eg_A),sub_(eg_D,eg_B)):(sub_(eg_u,eg_v),sub_(eg_A,eg_C),sub_(eg_B,eg_D)),equalsInt(eg_u,0)){for(;negative(eg_C);)add_(eg_C,n);return copy_(x,eg_C),equalsInt(eg_v,1)?1:(copyInt_(x,0),0)}}}function inverseModInt(x,n){for(var a=1,b=0;;){if(1==x)return a;if(0==x)return 0;if(b-=a*Math.floor(n/x),n%=x,1==n)return b;if(0==n)return 0;a-=b*Math.floor(x/n),x%=n}}function negative(x){return x[x.length-1]>>bpe-1&1}function greaterShift(x,y,shift){var i,kx=x.length,ky=y.length,k=ky>kx+shift?kx+shift:ky;for(i=ky-1-shift;kx>i&&i>=0;i++)if(x[i]>0)return 1;for(i=kx-1+shift;ky>i;i++)if(y[i]>0)return 0;for(i=k-1;i>=shift;i--){if(x[i-shift]>y[i])return 1;if(x[i-shift]<y[i])return 0}return 0}function greater(x,y){var i,k=x.length<y.length?x.length:y.length;for(i=x.length;i<y.length;i++)if(y[i])return 0;for(i=y.length;i<x.length;i++)if(x[i])return 1;for(i=k-1;i>=0;i--){if(x[i]>y[i])return 1;if(x[i]<y[i])return 0}return 0}function divide_(x,y,q,r){var kx,ky,i,y1,y2,c,a,b;for(copy_(r,x),ky=y.length;0==y[ky-1];ky--);for(b=y[ky-1],a=0;b;a++)b>>=1;for(a=bpe-a,leftShift_(y,a),leftShift_(r,a),kx=r.length;0==r[kx-1]&&kx>ky;kx--);for(copyInt_(q,0);!greaterShift(y,r,kx-ky);)subShift_(r,y,kx-ky),q[kx-ky]++;for(i=kx-1;i>=ky;i--){for(q[i-ky]=r[i]==y[ky-1]?mask:Math.floor((r[i]*radix+r[i-1])/y[ky-1]);y2=(ky>1?y[ky-2]:0)*q[i-ky],c=y2,y2&=mask,c=(c-y2)/radix,y1=c+q[i-ky]*y[ky-1],c=y1,y1&=mask,c=(c-y1)/radix,c==r[i]?y1==r[i-1]?y2>(i>1?r[i-2]:0):y1>r[i-1]:c>r[i];)q[i-ky]--;linCombShift_(r,y,-q[i-ky],i-ky),negative(r)&&(addShift_(r,y,i-ky),q[i-ky]--)}rightShift_(y,a),rightShift_(r,a)}function modInt(x,n){var i,c=0;for(i=x.length-1;i>=0;i--)c=(c*radix+x[i])%n;return c}function int2bigInt(t,bits,minSize){var k,buff;return k=Math.ceil(bits/bpe)+1,k=minSize>k?minSize:k,buff=new Array(k),copyInt_(buff,t),buff}function str2bigInt(s,base,minSize){var d,i,x,y,kk,k=s.length;if(-1==base){for(x=new Array(0);;){for(y=new Array(x.length+1),i=0;i<x.length;i++)y[i+1]=x[i];if(y[0]=parseInt(s,10),x=y,d=s.indexOf(",",0),1>d)break;if(s=s.substring(d+1),0==s.length)break}return x.length<minSize?(y=new Array(minSize),copy_(y,x),y):x}for(var bb=base,p=0,b=1==base?k:0;bb>1;)1&bb&&(p=1),b+=k,bb>>=1;for(b+=p*k,x=int2bigInt(0,b,0),i=0;k>i&&(d=digitsStr.indexOf(s.substring(i,i+1),0),36>=base&&d>=36&&(d-=26),!(d>=base||0>d));i++)multInt_(x,base),addInt_(x,d);for(k=x.length;k>0&&!x[k-1];k--);for(k=minSize>k+1?minSize:k+1,y=new Array(k),kk=k<x.length?k:x.length,i=0;kk>i;i++)y[i]=x[i];for(;k>i;i++)y[i]=0;return y}function equalsInt(x,y){var i;if(x[0]!=y)return 0;for(i=1;i<x.length;i++)if(x[i])return 0;return 1}function equals(x,y){var i,k=x.length<y.length?x.length:y.length;for(i=0;k>i;i++)if(x[i]!=y[i])return 0;if(x.length>y.length){for(;i<x.length;i++)if(x[i])return 0}else for(;i<y.length;i++)if(y[i])return 0;return 1}function isZero(x){var i;for(i=0;i<x.length;i++)if(x[i])return 0;return 1}function bigInt2str(x,base){var i,t,s="";if(s6.length!=x.length?s6=dup(x):copy_(s6,x),-1==base){for(i=x.length-1;i>0;i--)s+=x[i]+",";s+=x[0]}else for(;!isZero(s6);)t=divInt_(s6,base),s=digitsStr.substring(t,t+1)+s;return 0==s.length&&(s="0"),s}function dup(x){var buff;return buff=new Array(x.length),copy_(buff,x),buff}function copy_(x,y){var i,k=x.length<y.length?x.length:y.length;for(i=0;k>i;i++)x[i]=y[i];for(i=k;i<x.length;i++)x[i]=0}function copyInt_(x,n){var i,c;for(c=n,i=0;i<x.length;i++)x[i]=c&mask,c>>=bpe}function addInt_(x,n){var i,k,c,b;for(x[0]+=n,k=x.length,c=0,i=0;k>i;i++)if(c+=x[i],b=0,0>c&&(b=c&mask,b=-((c-b)/radix),c+=b*radix),x[i]=c&mask,c=(c-x[i])/radix-b,!c)return}function rightShift_(x,n){var i,k=Math.floor(n/bpe);if(k){for(i=0;i<x.length-k;i++)x[i]=x[i+k];for(;i<x.length;i++)x[i]=0;n%=bpe}for(i=0;i<x.length-1;i++)x[i]=mask&(x[i+1]<<bpe-n|x[i]>>n);x[i]>>=n}function halve_(x){var i;for(i=0;i<x.length-1;i++)x[i]=mask&(x[i+1]<<bpe-1|x[i]>>1);x[i]=x[i]>>1|x[i]&radix>>1}function leftShift_(x,n){var i,k=Math.floor(n/bpe);if(k){for(i=x.length;i>=k;i--)x[i]=x[i-k];for(;i>=0;i--)x[i]=0;n%=bpe}if(n){for(i=x.length-1;i>0;i--)x[i]=mask&(x[i]<<n|x[i-1]>>bpe-n);x[i]=mask&x[i]<<n}}function multInt_(x,n){var i,k,c,b;if(n)for(k=x.length,c=0,i=0;k>i;i++)c+=x[i]*n,b=0,0>c&&(b=c&mask,b=-((c-b)/radix),c+=b*radix),x[i]=c&mask,c=(c-x[i])/radix-b}function divInt_(x,n){var i,s,r=0;for(i=x.length-1;i>=0;i--)s=r*radix+x[i],x[i]=Math.floor(s/n),r=s%n;return r}function linCombShift_(x,y,b,ys){var i,c,k,kk;for(k=x.length<ys+y.length?x.length:ys+y.length,kk=x.length,c=0,i=ys;k>i;i++)c+=x[i]+b*y[i-ys],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&kk>i;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function addShift_(x,y,ys){var i,c,k,kk;for(k=x.length<ys+y.length?x.length:ys+y.length,kk=x.length,c=0,i=ys;k>i;i++)c+=x[i]+y[i-ys],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&kk>i;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function subShift_(x,y,ys){var i,c,k,kk;for(k=x.length<ys+y.length?x.length:ys+y.length,kk=x.length,c=0,i=ys;k>i;i++)c+=x[i]-y[i-ys],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&kk>i;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function sub_(x,y){var i,c,k;for(k=x.length<y.length?x.length:y.length,c=0,i=0;k>i;i++)c+=x[i]-y[i],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&i<x.length;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function add_(x,y){var i,c,k;for(k=x.length<y.length?x.length:y.length,c=0,i=0;k>i;i++)c+=x[i]+y[i],x[i]=c&mask,c=(c-x[i])/radix;for(i=k;c&&i<x.length;i++)c+=x[i],x[i]=c&mask,c=(c-x[i])/radix}function mult_(x,y){var i;for(ss.length!=2*x.length&&(ss=new Array(2*x.length)),copyInt_(ss,0),i=0;i<y.length;i++)y[i]&&linCombShift_(ss,x,y[i],i);copy_(x,ss)}function mod_(x,n){s4.length!=x.length?s4=dup(x):copy_(s4,x),s5.length!=x.length&&(s5=dup(x)),divide_(s4,n,s5,x)}function multMod_(x,y,n){var i;for(s0.length!=2*x.length&&(s0=new Array(2*x.length)),copyInt_(s0,0),i=0;i<y.length;i++)y[i]&&linCombShift_(s0,x,y[i],i);mod_(s0,n),copy_(x,s0)}function squareMod_(x,n){var i,j,c,kx,k;for(kx=x.length;kx>0&&!x[kx-1];kx--);for(k=kx>n.length?2*kx:2*n.length,s0.length!=k&&(s0=new Array(k)),copyInt_(s0,0),i=0;kx>i;i++){for(c=s0[2*i]+x[i]*x[i],s0[2*i]=c&mask,c=(c-s0[2*i])/radix,j=i+1;kx>j;j++)c=s0[i+j]+2*x[i]*x[j]+c,s0[i+j]=c&mask,c=(c-s0[i+j])/radix;s0[i+kx]=c}mod_(s0,n),copy_(x,s0)}function trim(x,k){var i,y;for(i=x.length;i>0&&!x[i-1];i--);return y=new Array(i+k),copy_(y,x),y}function powMod_(x,y,n){var k1,k2,kn,np;if(s7.length!=n.length&&(s7=dup(n)),0!=(1&n[0])){for(copyInt_(s7,0),kn=n.length;kn>0&&!n[kn-1];kn--);for(np=radix-inverseModInt(modInt(n,radix),radix),s7[kn]=1,multMod_(x,s7,n),s3.length!=x.length?s3=dup(x):copy_(s3,x),k1=y.length-1;k1>0&!y[k1];k1--);if(0==y[k1])return void copyInt_(x,1);for(k2=1<<bpe-1;k2&&!(y[k1]&k2);k2>>=1);for(;;){if(!(k2>>=1)){if(k1--,0>k1)return void mont_(x,one,n,np);k2=1<<bpe-1}mont_(x,x,n,np),k2&y[k1]&&mont_(x,s3,n,np)}}else for(copy_(s7,x),copyInt_(x,1);!equalsInt(y,0);)1&y[0]&&multMod_(x,s7,n),divInt_(y,2),squareMod_(s7,n)}function mont_(x,y,n,np){var i,j,c,ui,t,t2,ks,kn=n.length,ky=y.length;for(sa.length!=kn&&(sa=new Array(kn)),copyInt_(sa,0);kn>0&&0==n[kn-1];kn--);for(;ky>0&&0==y[ky-1];ky--);for(ks=sa.length-1,i=0;kn>i;i++){for(t=sa[0]+x[i]*y[0],ui=(t&mask)*np&mask,c=t+ui*n[0],c=(c-(c&mask))/radix,t=x[i],j=1;ky-4>j;)c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;ky>j;)c+=sa[j]+ui*n[j]+t*y[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;kn-4>j;)c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++,c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;kn>j;)c+=sa[j]+ui*n[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;for(;ks>j;)c+=sa[j],t2=sa[j-1]=c&mask,c=(c-t2)/radix,j++;sa[j-1]=c&mask}greater(n,sa)||sub_(sa,n),copy_(x,sa)}function divMod(num,den,n){return multMod(num,inverseMod(den,n),n)}function subMod(one,two,n){return one=mod(one,n),two=mod(two,n),greater(two,one)&&(one=add(one,n)),sub(one,two)}function twoToThe(m){for(var b=Math.floor(m/bpe)+2,t=new Array(b),i=0;b>i;i++)t[i]=0;return t[b-2]=1<<m%bpe,t}function bigInt2bits(bi,pad){pad||(pad=0),bi=dup(bi);for(var ba="";!isZero(bi);)ba=_num2bin[255&bi[0]]+ba,rightShift_(bi,8);for(;ba.length<pad;)ba="\x00"+ba;return ba}function ba2bigInt(data){var mpi=str2bigInt("0",10,data.length);return data.forEach(function(d,i){i&&leftShift_(mpi,8),mpi[0]|=d}),mpi}function getSeed(){return randomBytes(40)}function randomByte(){return randomBytes(1)[0]}function randomBitInt(k){if(k>31)throw new Error("Too many bits.");var i=0,r=0,b=Math.floor(k/8),mask=(1<<k%8)-1;for(mask&&(r=randomByte()&mask);b>i;i++)r=256*r+randomByte();return r}var bpe=26,radix=1<<bpe,mask=radix-1,digitsStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-",one=int2bigInt(1,1,1),t=new Array(0),ss=t,s0=t,s3=t,s4=t,s5=t,s6=t,s7=t,sa=t,mr_x1=t,mr_r=t,mr_a=t,eg_v=t,eg_u=t,eg_A=t,eg_B=t,eg_C=t,eg_D=t,primes=t,_num2bin=function(){for(var i=0,_num2bin={};256>i;++i)_num2bin[i]=String.fromCharCode(i);return _num2bin}(),randomBytes=function(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomBytes)return function(n){try{var buf=crypto.randomBytes(n)}catch(e){throw e}return Array.prototype.slice.call(buf,0)};if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)return function(n){var buf=new Uint8Array(n);return crypto.getRandomValues(buf),Array.prototype.slice.call(buf,0)};throw new Error("Keys should not be generated without CSPRNG.")}();return{str2bigInt:str2bigInt,bigInt2str:bigInt2str,int2bigInt:int2bigInt,multMod:multMod,powMod:powMod,inverseMod:inverseMod,randBigInt:randBigInt,randBigInt_:randBigInt_,equals:equals,equalsInt:equalsInt,sub:sub,mod:mod,modInt:modInt,mult:mult,divInt_:divInt_,rightShift_:rightShift_,dup:dup,greater:greater,add:add,isZero:isZero,bitSize:bitSize,millerRabin:millerRabin,divide_:divide_,trim:trim,primes:primes,findPrimes:findPrimes,getSeed:getSeed,divMod:divMod,subMod:subMod,twoToThe:twoToThe,bigInt2bits:bigInt2bits,ba2bigInt:ba2bigInt}}),function(root,factory){"function"==typeof define&&define.amd?define(factory):"undefined"!=typeof module&&module.exports?module.exports=factory():root.CryptoJS=factory()}(this,function(){var CryptoJS=CryptoJS||function(Math,undefined){var C={},C_lib=C.lib={},Base=C_lib.Base=function(){function F(){}return{extend:function(overrides){F.prototype=this;var subtype=new F;return overrides&&subtype.mixIn(overrides),subtype.hasOwnProperty("init")||(subtype.init=function(){subtype.$super.init.apply(this,arguments)}),subtype.init.prototype=subtype,subtype.$super=this,subtype},create:function(){var instance=this.extend();return instance.init.apply(instance,arguments),instance},init:function(){},mixIn:function(properties){for(var propertyName in properties)properties.hasOwnProperty(propertyName)&&(this[propertyName]=properties[propertyName]);properties.hasOwnProperty("toString")&&(this.toString=properties.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),WordArray=C_lib.WordArray=Base.extend({init:function(words,sigBytes){words=this.words=words||[],this.sigBytes=sigBytes!=undefined?sigBytes:4*words.length},toString:function(encoder){return(encoder||Hex).stringify(this)},concat:function(wordArray){var thisWords=this.words,thatWords=wordArray.words,thisSigBytes=this.sigBytes,thatSigBytes=wordArray.sigBytes;if(this.clamp(),thisSigBytes%4)for(var i=0;thatSigBytes>i;i++){var thatByte=thatWords[i>>>2]>>>24-i%4*8&255;thisWords[thisSigBytes+i>>>2]|=thatByte<<24-(thisSigBytes+i)%4*8}else if(thatWords.length>65535)for(var i=0;thatSigBytes>i;i+=4)thisWords[thisSigBytes+i>>>2]=thatWords[i>>>2];else thisWords.push.apply(thisWords,thatWords);return this.sigBytes+=thatSigBytes,this},clamp:function(){var words=this.words,sigBytes=this.sigBytes;words[sigBytes>>>2]&=4294967295<<32-sigBytes%4*8,words.length=Math.ceil(sigBytes/4)},clone:function(){var clone=Base.clone.call(this);return clone.words=this.words.slice(0),clone},random:function(nBytes){for(var words=[],i=0;nBytes>i;i+=4)words.push(4294967296*Math.random()|0);return new WordArray.init(words,nBytes)}}),C_enc=C.enc={},Hex=C_enc.Hex={stringify:function(wordArray){for(var words=wordArray.words,sigBytes=wordArray.sigBytes,hexChars=[],i=0;sigBytes>i;i++){var bite=words[i>>>2]>>>24-i%4*8&255;hexChars.push((bite>>>4).toString(16)),hexChars.push((15&bite).toString(16))}return hexChars.join("")},parse:function(hexStr){for(var hexStrLength=hexStr.length,words=[],i=0;hexStrLength>i;i+=2)words[i>>>3]|=parseInt(hexStr.substr(i,2),16)<<24-i%8*4;return new WordArray.init(words,hexStrLength/2)}},Latin1=C_enc.Latin1={stringify:function(wordArray){for(var words=wordArray.words,sigBytes=wordArray.sigBytes,latin1Chars=[],i=0;sigBytes>i;i++){var bite=words[i>>>2]>>>24-i%4*8&255;latin1Chars.push(String.fromCharCode(bite))}return latin1Chars.join("")},parse:function(latin1Str){for(var latin1StrLength=latin1Str.length,words=[],i=0;latin1StrLength>i;i++)words[i>>>2]|=(255&latin1Str.charCodeAt(i))<<24-i%4*8;return new WordArray.init(words,latin1StrLength)}},Utf8=C_enc.Utf8={stringify:function(wordArray){try{return decodeURIComponent(escape(Latin1.stringify(wordArray)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(utf8Str){return Latin1.parse(unescape(encodeURIComponent(utf8Str)))}},BufferedBlockAlgorithm=C_lib.BufferedBlockAlgorithm=Base.extend({reset:function(){this._data=new WordArray.init,this._nDataBytes=0},_append:function(data){"string"==typeof data&&(data=Utf8.parse(data)),this._data.concat(data),this._nDataBytes+=data.sigBytes},_process:function(doFlush){var data=this._data,dataWords=data.words,dataSigBytes=data.sigBytes,blockSize=this.blockSize,blockSizeBytes=4*blockSize,nBlocksReady=dataSigBytes/blockSizeBytes;nBlocksReady=doFlush?Math.ceil(nBlocksReady):Math.max((0|nBlocksReady)-this._minBufferSize,0);var nWordsReady=nBlocksReady*blockSize,nBytesReady=Math.min(4*nWordsReady,dataSigBytes);if(nWordsReady){for(var offset=0;nWordsReady>offset;offset+=blockSize)this._doProcessBlock(dataWords,offset);var processedWords=dataWords.splice(0,nWordsReady);data.sigBytes-=nBytesReady}return new WordArray.init(processedWords,nBytesReady)},clone:function(){var clone=Base.clone.call(this);return clone._data=this._data.clone(),clone},_minBufferSize:0}),C_algo=(C_lib.Hasher=BufferedBlockAlgorithm.extend({cfg:Base.extend(),init:function(cfg){this.cfg=this.cfg.extend(cfg),this.reset()},reset:function(){BufferedBlockAlgorithm.reset.call(this),this._doReset()},update:function(messageUpdate){return this._append(messageUpdate),this._process(),this},finalize:function(messageUpdate){messageUpdate&&this._append(messageUpdate);var hash=this._doFinalize();return hash},blockSize:16,_createHelper:function(hasher){return function(message,cfg){return new hasher.init(cfg).finalize(message)}},_createHmacHelper:function(hasher){return function(message,key){return new C_algo.HMAC.init(hasher,key).finalize(message)}}}),C.algo={});return C}(Math);return function(){{var C=CryptoJS,C_lib=C.lib,WordArray=C_lib.WordArray,C_enc=C.enc;C_enc.Base64={stringify:function(wordArray){var words=wordArray.words,sigBytes=wordArray.sigBytes,map=this._map;wordArray.clamp();for(var base64Chars=[],i=0;sigBytes>i;i+=3)for(var byte1=words[i>>>2]>>>24-i%4*8&255,byte2=words[i+1>>>2]>>>24-(i+1)%4*8&255,byte3=words[i+2>>>2]>>>24-(i+2)%4*8&255,triplet=byte1<<16|byte2<<8|byte3,j=0;4>j&&sigBytes>i+.75*j;j++)base64Chars.push(map.charAt(triplet>>>6*(3-j)&63));var paddingChar=map.charAt(64);if(paddingChar)for(;base64Chars.length%4;)base64Chars.push(paddingChar);return base64Chars.join("")},parse:function(base64Str){var base64StrLength=base64Str.length,map=this._map,paddingChar=map.charAt(64);if(paddingChar){var paddingIndex=base64Str.indexOf(paddingChar);-1!=paddingIndex&&(base64StrLength=paddingIndex)}for(var words=[],nBytes=0,i=0;base64StrLength>i;i++)if(i%4){var bits1=map.indexOf(base64Str.charAt(i-1))<<i%4*2,bits2=map.indexOf(base64Str.charAt(i))>>>6-i%4*2;words[nBytes>>>2]|=(bits1|bits2)<<24-nBytes%4*8,nBytes++}return WordArray.create(words,nBytes)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}}(),CryptoJS.lib.Cipher||function(undefined){var C=CryptoJS,C_lib=C.lib,Base=C_lib.Base,WordArray=C_lib.WordArray,BufferedBlockAlgorithm=C_lib.BufferedBlockAlgorithm,C_enc=C.enc,Base64=(C_enc.Utf8,C_enc.Base64),C_algo=C.algo,EvpKDF=C_algo.EvpKDF,Cipher=C_lib.Cipher=BufferedBlockAlgorithm.extend({cfg:Base.extend(),createEncryptor:function(key,cfg){return this.create(this._ENC_XFORM_MODE,key,cfg)},createDecryptor:function(key,cfg){return this.create(this._DEC_XFORM_MODE,key,cfg)},init:function(xformMode,key,cfg){this.cfg=this.cfg.extend(cfg),this._xformMode=xformMode,this._key=key,this.reset()},reset:function(){BufferedBlockAlgorithm.reset.call(this),this._doReset()},process:function(dataUpdate){return this._append(dataUpdate),this._process()},finalize:function(dataUpdate){dataUpdate&&this._append(dataUpdate);var finalProcessedData=this._doFinalize();return finalProcessedData},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function selectCipherStrategy(key){return"string"==typeof key?PasswordBasedCipher:SerializableCipher}return function(cipher){return{encrypt:function(message,key,cfg){return selectCipherStrategy(key).encrypt(cipher,message,key,cfg)},decrypt:function(ciphertext,key,cfg){return selectCipherStrategy(key).decrypt(cipher,ciphertext,key,cfg)}}}}()}),C_mode=(C_lib.StreamCipher=Cipher.extend({_doFinalize:function(){var finalProcessedBlocks=this._process(!0);return finalProcessedBlocks},blockSize:1}),C.mode={}),BlockCipherMode=C_lib.BlockCipherMode=Base.extend({createEncryptor:function(cipher,iv){return this.Encryptor.create(cipher,iv)},createDecryptor:function(cipher,iv){return this.Decryptor.create(cipher,iv)},init:function(cipher,iv){this._cipher=cipher,this._iv=iv}}),CBC=C_mode.CBC=function(){function xorBlock(words,offset,blockSize){var iv=this._iv;if(iv){var block=iv;this._iv=undefined}else var block=this._prevBlock;for(var i=0;blockSize>i;i++)words[offset+i]^=block[i]}var CBC=BlockCipherMode.extend();return CBC.Encryptor=CBC.extend({processBlock:function(words,offset){var cipher=this._cipher,blockSize=cipher.blockSize;xorBlock.call(this,words,offset,blockSize),cipher.encryptBlock(words,offset),this._prevBlock=words.slice(offset,offset+blockSize)}}),CBC.Decryptor=CBC.extend({processBlock:function(words,offset){var cipher=this._cipher,blockSize=cipher.blockSize,thisBlock=words.slice(offset,offset+blockSize);cipher.decryptBlock(words,offset),xorBlock.call(this,words,offset,blockSize),this._prevBlock=thisBlock}}),CBC}(),C_pad=C.pad={},Pkcs7=C_pad.Pkcs7={pad:function(data,blockSize){for(var blockSizeBytes=4*blockSize,nPaddingBytes=blockSizeBytes-data.sigBytes%blockSizeBytes,paddingWord=nPaddingBytes<<24|nPaddingBytes<<16|nPaddingBytes<<8|nPaddingBytes,paddingWords=[],i=0;nPaddingBytes>i;i+=4)paddingWords.push(paddingWord);var padding=WordArray.create(paddingWords,nPaddingBytes);data.concat(padding)},unpad:function(data){var nPaddingBytes=255&data.words[data.sigBytes-1>>>2];data.sigBytes-=nPaddingBytes}},CipherParams=(C_lib.BlockCipher=Cipher.extend({cfg:Cipher.cfg.extend({mode:CBC,padding:Pkcs7}),reset:function(){Cipher.reset.call(this);var cfg=this.cfg,iv=cfg.iv,mode=cfg.mode;if(this._xformMode==this._ENC_XFORM_MODE)var modeCreator=mode.createEncryptor;else{var modeCreator=mode.createDecryptor;this._minBufferSize=1}this._mode=modeCreator.call(mode,this,iv&&iv.words)},_doProcessBlock:function(words,offset){this._mode.processBlock(words,offset)},_doFinalize:function(){var padding=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){padding.pad(this._data,this.blockSize);var finalProcessedBlocks=this._process(!0)}else{var finalProcessedBlocks=this._process(!0);padding.unpad(finalProcessedBlocks)}return finalProcessedBlocks},blockSize:4}),C_lib.CipherParams=Base.extend({init:function(cipherParams){this.mixIn(cipherParams)},toString:function(formatter){return(formatter||this.formatter).stringify(this)}})),C_format=C.format={},OpenSSLFormatter=C_format.OpenSSL={stringify:function(cipherParams){var ciphertext=cipherParams.ciphertext,salt=cipherParams.salt;if(salt)var wordArray=WordArray.create([1398893684,1701076831]).concat(salt).concat(ciphertext);else var wordArray=ciphertext;return wordArray.toString(Base64)},parse:function(openSSLStr){var ciphertext=Base64.parse(openSSLStr),ciphertextWords=ciphertext.words;if(1398893684==ciphertextWords[0]&&1701076831==ciphertextWords[1]){var salt=WordArray.create(ciphertextWords.slice(2,4));ciphertextWords.splice(0,4),ciphertext.sigBytes-=16}return CipherParams.create({ciphertext:ciphertext,salt:salt})}},SerializableCipher=C_lib.SerializableCipher=Base.extend({cfg:Base.extend({format:OpenSSLFormatter}),encrypt:function(cipher,message,key,cfg){cfg=this.cfg.extend(cfg);var encryptor=cipher.createEncryptor(key,cfg),ciphertext=encryptor.finalize(message),cipherCfg=encryptor.cfg;return CipherParams.create({ciphertext:ciphertext,key:key,iv:cipherCfg.iv,algorithm:cipher,mode:cipherCfg.mode,padding:cipherCfg.padding,blockSize:cipher.blockSize,formatter:cfg.format})},decrypt:function(cipher,ciphertext,key,cfg){cfg=this.cfg.extend(cfg),ciphertext=this._parse(ciphertext,cfg.format);var plaintext=cipher.createDecryptor(key,cfg).finalize(ciphertext.ciphertext);return plaintext},_parse:function(ciphertext,format){return"string"==typeof ciphertext?format.parse(ciphertext,this):ciphertext}}),C_kdf=C.kdf={},OpenSSLKdf=C_kdf.OpenSSL={execute:function(password,keySize,ivSize,salt){salt||(salt=WordArray.random(8));var key=EvpKDF.create({keySize:keySize+ivSize}).compute(password,salt),iv=WordArray.create(key.words.slice(keySize),4*ivSize);return key.sigBytes=4*keySize,CipherParams.create({key:key,iv:iv,salt:salt})}},PasswordBasedCipher=C_lib.PasswordBasedCipher=SerializableCipher.extend({cfg:SerializableCipher.cfg.extend({kdf:OpenSSLKdf}),encrypt:function(cipher,message,password,cfg){cfg=this.cfg.extend(cfg);var derivedParams=cfg.kdf.execute(password,cipher.keySize,cipher.ivSize);cfg.iv=derivedParams.iv;var ciphertext=SerializableCipher.encrypt.call(this,cipher,message,derivedParams.key,cfg);return ciphertext.mixIn(derivedParams),ciphertext},decrypt:function(cipher,ciphertext,password,cfg){cfg=this.cfg.extend(cfg),ciphertext=this._parse(ciphertext,cfg.format);var derivedParams=cfg.kdf.execute(password,cipher.keySize,cipher.ivSize,ciphertext.salt);cfg.iv=derivedParams.iv;var plaintext=SerializableCipher.decrypt.call(this,cipher,ciphertext,derivedParams.key,cfg);return plaintext}})}(),function(){var C=CryptoJS,C_lib=C.lib,BlockCipher=C_lib.BlockCipher,C_algo=C.algo,SBOX=[],INV_SBOX=[],SUB_MIX_0=[],SUB_MIX_1=[],SUB_MIX_2=[],SUB_MIX_3=[],INV_SUB_MIX_0=[],INV_SUB_MIX_1=[],INV_SUB_MIX_2=[],INV_SUB_MIX_3=[];!function(){for(var d=[],i=0;256>i;i++)d[i]=128>i?i<<1:i<<1^283;for(var x=0,xi=0,i=0;256>i;i++){var sx=xi^xi<<1^xi<<2^xi<<3^xi<<4;sx=sx>>>8^255&sx^99,SBOX[x]=sx,INV_SBOX[sx]=x;var x2=d[x],x4=d[x2],x8=d[x4],t=257*d[sx]^16843008*sx;SUB_MIX_0[x]=t<<24|t>>>8,SUB_MIX_1[x]=t<<16|t>>>16,SUB_MIX_2[x]=t<<8|t>>>24,SUB_MIX_3[x]=t;var t=16843009*x8^65537*x4^257*x2^16843008*x;INV_SUB_MIX_0[sx]=t<<24|t>>>8,INV_SUB_MIX_1[sx]=t<<16|t>>>16,INV_SUB_MIX_2[sx]=t<<8|t>>>24,INV_SUB_MIX_3[sx]=t,x?(x=x2^d[d[d[x8^x2]]],xi^=d[d[xi]]):x=xi=1}}();var RCON=[0,1,2,4,8,16,32,64,128,27,54],AES=C_algo.AES=BlockCipher.extend({_doReset:function(){for(var key=this._key,keyWords=key.words,keySize=key.sigBytes/4,nRounds=this._nRounds=keySize+6,ksRows=4*(nRounds+1),keySchedule=this._keySchedule=[],ksRow=0;ksRows>ksRow;ksRow++)if(keySize>ksRow)keySchedule[ksRow]=keyWords[ksRow];else{var t=keySchedule[ksRow-1];ksRow%keySize?keySize>6&&ksRow%keySize==4&&(t=SBOX[t>>>24]<<24|SBOX[t>>>16&255]<<16|SBOX[t>>>8&255]<<8|SBOX[255&t]):(t=t<<8|t>>>24,t=SBOX[t>>>24]<<24|SBOX[t>>>16&255]<<16|SBOX[t>>>8&255]<<8|SBOX[255&t],t^=RCON[ksRow/keySize|0]<<24),keySchedule[ksRow]=keySchedule[ksRow-keySize]^t}for(var invKeySchedule=this._invKeySchedule=[],invKsRow=0;ksRows>invKsRow;invKsRow++){var ksRow=ksRows-invKsRow;if(invKsRow%4)var t=keySchedule[ksRow];else var t=keySchedule[ksRow-4];invKeySchedule[invKsRow]=4>invKsRow||4>=ksRow?t:INV_SUB_MIX_0[SBOX[t>>>24]]^INV_SUB_MIX_1[SBOX[t>>>16&255]]^INV_SUB_MIX_2[SBOX[t>>>8&255]]^INV_SUB_MIX_3[SBOX[255&t]]}},encryptBlock:function(M,offset){this._doCryptBlock(M,offset,this._keySchedule,SUB_MIX_0,SUB_MIX_1,SUB_MIX_2,SUB_MIX_3,SBOX)},decryptBlock:function(M,offset){var t=M[offset+1];M[offset+1]=M[offset+3],M[offset+3]=t,this._doCryptBlock(M,offset,this._invKeySchedule,INV_SUB_MIX_0,INV_SUB_MIX_1,INV_SUB_MIX_2,INV_SUB_MIX_3,INV_SBOX);var t=M[offset+1];M[offset+1]=M[offset+3],M[offset+3]=t},_doCryptBlock:function(M,offset,keySchedule,SUB_MIX_0,SUB_MIX_1,SUB_MIX_2,SUB_MIX_3,SBOX){for(var nRounds=this._nRounds,s0=M[offset]^keySchedule[0],s1=M[offset+1]^keySchedule[1],s2=M[offset+2]^keySchedule[2],s3=M[offset+3]^keySchedule[3],ksRow=4,round=1;nRounds>round;round++){var t0=SUB_MIX_0[s0>>>24]^SUB_MIX_1[s1>>>16&255]^SUB_MIX_2[s2>>>8&255]^SUB_MIX_3[255&s3]^keySchedule[ksRow++],t1=SUB_MIX_0[s1>>>24]^SUB_MIX_1[s2>>>16&255]^SUB_MIX_2[s3>>>8&255]^SUB_MIX_3[255&s0]^keySchedule[ksRow++],t2=SUB_MIX_0[s2>>>24]^SUB_MIX_1[s3>>>16&255]^SUB_MIX_2[s0>>>8&255]^SUB_MIX_3[255&s1]^keySchedule[ksRow++],t3=SUB_MIX_0[s3>>>24]^SUB_MIX_1[s0>>>16&255]^SUB_MIX_2[s1>>>8&255]^SUB_MIX_3[255&s2]^keySchedule[ksRow++];s0=t0,s1=t1,s2=t2,s3=t3}var t0=(SBOX[s0>>>24]<<24|SBOX[s1>>>16&255]<<16|SBOX[s2>>>8&255]<<8|SBOX[255&s3])^keySchedule[ksRow++],t1=(SBOX[s1>>>24]<<24|SBOX[s2>>>16&255]<<16|SBOX[s3>>>8&255]<<8|SBOX[255&s0])^keySchedule[ksRow++],t2=(SBOX[s2>>>24]<<24|SBOX[s3>>>16&255]<<16|SBOX[s0>>>8&255]<<8|SBOX[255&s1])^keySchedule[ksRow++],t3=(SBOX[s3>>>24]<<24|SBOX[s0>>>16&255]<<16|SBOX[s1>>>8&255]<<8|SBOX[255&s2])^keySchedule[ksRow++];M[offset]=t0,M[offset+1]=t1,M[offset+2]=t2,M[offset+3]=t3},keySize:8});C.AES=BlockCipher._createHelper(AES)}(),function(){var C=CryptoJS,C_lib=C.lib,WordArray=C_lib.WordArray,Hasher=C_lib.Hasher,C_algo=C.algo,W=[],SHA1=C_algo.SHA1=Hasher.extend({_doReset:function(){this._hash=new WordArray.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(M,offset){for(var H=this._hash.words,a=H[0],b=H[1],c=H[2],d=H[3],e=H[4],i=0;80>i;i++){if(16>i)W[i]=0|M[offset+i];else{var n=W[i-3]^W[i-8]^W[i-14]^W[i-16];W[i]=n<<1|n>>>31}var t=(a<<5|a>>>27)+e+W[i];t+=20>i?(b&c|~b&d)+1518500249:40>i?(b^c^d)+1859775393:60>i?(b&c|b&d|c&d)-1894007588:(b^c^d)-899497514,e=d,d=c,c=b<<30|b>>>2,b=a,a=t}H[0]=H[0]+a|0,H[1]=H[1]+b|0,H[2]=H[2]+c|0,H[3]=H[3]+d|0,H[4]=H[4]+e|0},_doFinalize:function(){var data=this._data,dataWords=data.words,nBitsTotal=8*this._nDataBytes,nBitsLeft=8*data.sigBytes;return dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32,dataWords[(nBitsLeft+64>>>9<<4)+14]=Math.floor(nBitsTotal/4294967296),dataWords[(nBitsLeft+64>>>9<<4)+15]=nBitsTotal,data.sigBytes=4*dataWords.length,this._process(),this._hash},clone:function(){var clone=Hasher.clone.call(this);return clone._hash=this._hash.clone(),clone}});C.SHA1=Hasher._createHelper(SHA1),C.HmacSHA1=Hasher._createHmacHelper(SHA1)}(),function(Math){var C=CryptoJS,C_lib=C.lib,WordArray=C_lib.WordArray,Hasher=C_lib.Hasher,C_algo=C.algo,H=[],K=[];!function(){function isPrime(n){for(var sqrtN=Math.sqrt(n),factor=2;sqrtN>=factor;factor++)if(!(n%factor))return!1;return!0}function getFractionalBits(n){return 4294967296*(n-(0|n))|0}for(var n=2,nPrime=0;64>nPrime;)isPrime(n)&&(8>nPrime&&(H[nPrime]=getFractionalBits(Math.pow(n,.5))),K[nPrime]=getFractionalBits(Math.pow(n,1/3)),nPrime++),n++}();var W=[],SHA256=C_algo.SHA256=Hasher.extend({_doReset:function(){this._hash=new WordArray.init(H.slice(0))},_doProcessBlock:function(M,offset){for(var H=this._hash.words,a=H[0],b=H[1],c=H[2],d=H[3],e=H[4],f=H[5],g=H[6],h=H[7],i=0;64>i;i++){if(16>i)W[i]=0|M[offset+i];else{var gamma0x=W[i-15],gamma0=(gamma0x<<25|gamma0x>>>7)^(gamma0x<<14|gamma0x>>>18)^gamma0x>>>3,gamma1x=W[i-2],gamma1=(gamma1x<<15|gamma1x>>>17)^(gamma1x<<13|gamma1x>>>19)^gamma1x>>>10;W[i]=gamma0+W[i-7]+gamma1+W[i-16]}var ch=e&f^~e&g,maj=a&b^a&c^b&c,sigma0=(a<<30|a>>>2)^(a<<19|a>>>13)^(a<<10|a>>>22),sigma1=(e<<26|e>>>6)^(e<<21|e>>>11)^(e<<7|e>>>25),t1=h+sigma1+ch+K[i]+W[i],t2=sigma0+maj;h=g,g=f,f=e,e=d+t1|0,d=c,c=b,b=a,a=t1+t2|0}H[0]=H[0]+a|0,H[1]=H[1]+b|0,H[2]=H[2]+c|0,H[3]=H[3]+d|0,H[4]=H[4]+e|0,H[5]=H[5]+f|0,H[6]=H[6]+g|0,H[7]=H[7]+h|0},_doFinalize:function(){var data=this._data,dataWords=data.words,nBitsTotal=8*this._nDataBytes,nBitsLeft=8*data.sigBytes;return dataWords[nBitsLeft>>>5]|=128<<24-nBitsLeft%32,dataWords[(nBitsLeft+64>>>9<<4)+14]=Math.floor(nBitsTotal/4294967296),dataWords[(nBitsLeft+64>>>9<<4)+15]=nBitsTotal,data.sigBytes=4*dataWords.length,this._process(),this._hash},clone:function(){var clone=Hasher.clone.call(this);return clone._hash=this._hash.clone(),clone}});C.SHA256=Hasher._createHelper(SHA256),C.HmacSHA256=Hasher._createHmacHelper(SHA256)
+}(Math),function(){{var C=CryptoJS,C_lib=C.lib,Base=C_lib.Base,C_enc=C.enc,Utf8=C_enc.Utf8,C_algo=C.algo;C_algo.HMAC=Base.extend({init:function(hasher,key){hasher=this._hasher=new hasher.init,"string"==typeof key&&(key=Utf8.parse(key));var hasherBlockSize=hasher.blockSize,hasherBlockSizeBytes=4*hasherBlockSize;key.sigBytes>hasherBlockSizeBytes&&(key=hasher.finalize(key)),key.clamp();for(var oKey=this._oKey=key.clone(),iKey=this._iKey=key.clone(),oKeyWords=oKey.words,iKeyWords=iKey.words,i=0;hasherBlockSize>i;i++)oKeyWords[i]^=1549556828,iKeyWords[i]^=909522486;oKey.sigBytes=iKey.sigBytes=hasherBlockSizeBytes,this.reset()},reset:function(){var hasher=this._hasher;hasher.reset(),hasher.update(this._iKey)},update:function(messageUpdate){return this._hasher.update(messageUpdate),this},finalize:function(messageUpdate){var hasher=this._hasher,innerHash=hasher.finalize(messageUpdate);hasher.reset();var hmac=hasher.finalize(this._oKey.clone().concat(innerHash));return hmac}})}}(),CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}},CryptoJS.mode.CTR=function(){var CTR=CryptoJS.lib.BlockCipherMode.extend(),Encryptor=CTR.Encryptor=CTR.extend({processBlock:function(words,offset){var cipher=this._cipher,blockSize=cipher.blockSize,iv=this._iv,counter=this._counter;iv&&(counter=this._counter=iv.slice(0),this._iv=void 0);var keystream=counter.slice(0);cipher.encryptBlock(keystream,0),counter[blockSize-1]=counter[blockSize-1]+1|0;for(var i=0;blockSize>i;i++)words[offset+i]^=keystream[i]}});return CTR.Decryptor=Encryptor,CTR}(),CryptoJS}),/*!
* EventEmitter v4.2.3 - git.io/ee
* Oliver Caldwell
* MIT license
* @preserve
*/
function(){"use strict";function EventEmitter(){}function indexOfListener(listeners,listener){for(var i=listeners.length;i--;)if(listeners[i].listener===listener)return i;return-1}function alias(name){return function(){return this[name].apply(this,arguments)}}var proto=EventEmitter.prototype;proto.getListeners=function(evt){var response,key,events=this._getEvents();if("object"==typeof evt){response={};for(key in events)events.hasOwnProperty(key)&&evt.test(key)&&(response[key]=events[key])}else response=events[evt]||(events[evt]=[]);return response},proto.flattenListeners=function(listeners){var i,flatListeners=[];for(i=0;i<listeners.length;i+=1)flatListeners.push(listeners[i].listener);return flatListeners},proto.getListenersAsObject=function(evt){var response,listeners=this.getListeners(evt);return listeners instanceof Array&&(response={},response[evt]=listeners),response||listeners},proto.addListener=function(evt,listener){var key,listeners=this.getListenersAsObject(evt),listenerIsWrapped="object"==typeof listener;for(key in listeners)listeners.hasOwnProperty(key)&&-1===indexOfListener(listeners[key],listener)&&listeners[key].push(listenerIsWrapped?listener:{listener:listener,once:!1});return this},proto.on=alias("addListener"),proto.addOnceListener=function(evt,listener){return this.addListener(evt,{listener:listener,once:!0})},proto.once=alias("addOnceListener"),proto.defineEvent=function(evt){return this.getListeners(evt),this},proto.defineEvents=function(evts){for(var i=0;i<evts.length;i+=1)this.defineEvent(evts[i]);return this},proto.removeListener=function(evt,listener){var index,key,listeners=this.getListenersAsObject(evt);for(key in listeners)listeners.hasOwnProperty(key)&&(index=indexOfListener(listeners[key],listener),-1!==index&&listeners[key].splice(index,1));return this},proto.off=alias("removeListener"),proto.addListeners=function(evt,listeners){return this.manipulateListeners(!1,evt,listeners)},proto.removeListeners=function(evt,listeners){return this.manipulateListeners(!0,evt,listeners)},proto.manipulateListeners=function(remove,evt,listeners){var i,value,single=remove?this.removeListener:this.addListener,multiple=remove?this.removeListeners:this.addListeners;if("object"!=typeof evt||evt instanceof RegExp)for(i=listeners.length;i--;)single.call(this,evt,listeners[i]);else for(i in evt)evt.hasOwnProperty(i)&&(value=evt[i])&&("function"==typeof value?single.call(this,i,value):multiple.call(this,i,value));return this},proto.removeEvent=function(evt){var key,type=typeof evt,events=this._getEvents();if("string"===type)delete events[evt];else if("object"===type)for(key in events)events.hasOwnProperty(key)&&evt.test(key)&&delete events[key];else delete this._events;return this},proto.emitEvent=function(evt,args){var listener,i,key,response,listeners=this.getListenersAsObject(evt);for(key in listeners)if(listeners.hasOwnProperty(key))for(i=listeners[key].length;i--;)listener=listeners[key][i],listener.once===!0&&this.removeListener(evt,listener.listener),response=listener.listener.apply(this,args||[]),response===this._getOnceReturnValue()&&this.removeListener(evt,listener.listener);return this},proto.trigger=alias("emitEvent"),proto.emit=function(evt){var args=Array.prototype.slice.call(arguments,1);return this.emitEvent(evt,args)},proto.setOnceReturnValue=function(value){return this._onceReturnValue=value,this},proto._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},proto._getEvents=function(){return this._events||(this._events={})},"function"==typeof define&&define.amd?define(function(){return EventEmitter}):"object"==typeof module&&module.exports?module.exports=EventEmitter:this.EventEmitter=EventEmitter}.call(this),function(root,factory){"function"==typeof define&&define.amd?define(["bigint","crypto","eventemitter"],function(BigInt,CryptoJS,EventEmitter){var root={BigInt:BigInt,CryptoJS:CryptoJS,EventEmitter:EventEmitter,OTR:{},DSA:{}};return factory.call(root)}):(root.OTR={},root.DSA={},factory.call(root))}(this,function(){return function(){"use strict";var root=this,CONST={N:"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",G:"2",MSGSTATE_PLAINTEXT:0,MSGSTATE_ENCRYPTED:1,MSGSTATE_FINISHED:2,AUTHSTATE_NONE:0,AUTHSTATE_AWAITING_DHKEY:1,AUTHSTATE_AWAITING_REVEALSIG:2,AUTHSTATE_AWAITING_SIG:3,WHITESPACE_TAG:" ",WHITESPACE_TAG_V2:" ",WHITESPACE_TAG_V3:" ",OTR_TAG:"?OTR",OTR_VERSION_1:"\x00",OTR_VERSION_2:"\x00",OTR_VERSION_3:"\x00",SMPSTATE_EXPECT0:0,SMPSTATE_EXPECT1:1,SMPSTATE_EXPECT2:2,SMPSTATE_EXPECT3:3,SMPSTATE_EXPECT4:4,STATUS_SEND_QUERY:0,STATUS_AKE_INIT:1,STATUS_AKE_SUCCESS:2,STATUS_END_OTR:3};"undefined"!=typeof module&&module.exports?module.exports=CONST:root.OTR.CONST=CONST}.call(this),function(){"use strict";function intCompare(x,y){var z=~(x^y);return z&=z>>16,z&=z>>8,z&=z>>4,z&=z>>2,z&=z>>1,1&z}var CryptoJS,BigInt,root=this,HLP={};"undefined"!=typeof module&&module.exports?(module.exports=HLP={},CryptoJS=require("../vendor/crypto.js"),BigInt=require("../vendor/bigint.js")):(root.OTR&&(root.OTR.HLP=HLP),root.DSA&&(root.DSA.HLP=HLP),CryptoJS=root.CryptoJS,BigInt=root.BigInt);var DTS={BYTE:1,SHORT:2,INT:4,CTR:8,MAC:20,SIG:40},WRAPPER_BEGIN="?OTR",WRAPPER_END=".",TWO=BigInt.str2bigInt("2",10);HLP.debug=function(msg){this.debug&&"function"!=typeof this.debug&&"undefined"!=typeof console&&console.log(msg)},HLP.extend=function(child,parent){function Ctor(){this.constructor=child}for(var key in parent)Object.hasOwnProperty.call(parent,key)&&(child[key]=parent[key]);Ctor.prototype=parent.prototype,child.prototype=new Ctor,child.__super__=parent.prototype},HLP.compare=function(str1,str2){if(str1.length!==str2.length)return!1;for(var i=0,result=0;i<str1.length;i++)result|=str1[i].charCodeAt(0)^str2[i].charCodeAt(0);return intCompare(result,0)},HLP.randomExponent=function(){return BigInt.randBigInt(1536)},HLP.smpHash=function(version,fmpi,smpi){var sha256=CryptoJS.algo.SHA256.create();sha256.update(CryptoJS.enc.Latin1.parse(HLP.packBytes(version,DTS.BYTE))),sha256.update(CryptoJS.enc.Latin1.parse(HLP.packMPI(fmpi))),smpi&&sha256.update(CryptoJS.enc.Latin1.parse(HLP.packMPI(smpi)));var hash=sha256.finalize();return HLP.bits2bigInt(hash.toString(CryptoJS.enc.Latin1))},HLP.makeMac=function(aesctr,m){var pass=CryptoJS.enc.Latin1.parse(m),mac=CryptoJS.HmacSHA256(CryptoJS.enc.Latin1.parse(aesctr),pass);return HLP.mask(mac.toString(CryptoJS.enc.Latin1),0,160)},HLP.make1Mac=function(aesctr,m){var pass=CryptoJS.enc.Latin1.parse(m),mac=CryptoJS.HmacSHA1(CryptoJS.enc.Latin1.parse(aesctr),pass);return mac.toString(CryptoJS.enc.Latin1)},HLP.encryptAes=function(msg,c,iv){var opts={mode:CryptoJS.mode.CTR,iv:CryptoJS.enc.Latin1.parse(iv),padding:CryptoJS.pad.NoPadding},aesctr=CryptoJS.AES.encrypt(msg,CryptoJS.enc.Latin1.parse(c),opts),aesctr_decoded=CryptoJS.enc.Base64.parse(aesctr.toString());return CryptoJS.enc.Latin1.stringify(aesctr_decoded)},HLP.decryptAes=function(msg,c,iv){msg=CryptoJS.enc.Latin1.parse(msg);var opts={mode:CryptoJS.mode.CTR,iv:CryptoJS.enc.Latin1.parse(iv),padding:CryptoJS.pad.NoPadding};return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(msg),CryptoJS.enc.Latin1.parse(c),opts)},HLP.multPowMod=function(a,b,c,d,e){return BigInt.multMod(BigInt.powMod(a,b,e),BigInt.powMod(c,d,e),e)},HLP.ZKP=function(v,c,d,e){return BigInt.equals(c,HLP.smpHash(v,d,e))},HLP.GTOE=function(a,b){return BigInt.equals(a,b)||BigInt.greater(a,b)},HLP.between=function(x,a,b){return BigInt.greater(x,a)&&BigInt.greater(b,x)},HLP.checkGroup=function(g,N_MINUS_2){return HLP.GTOE(g,TWO)&&HLP.GTOE(N_MINUS_2,g)},HLP.h1=function(b,secbytes){var sha1=CryptoJS.algo.SHA1.create();return sha1.update(CryptoJS.enc.Latin1.parse(b)),sha1.update(CryptoJS.enc.Latin1.parse(secbytes)),sha1.finalize().toString(CryptoJS.enc.Latin1)},HLP.h2=function(b,secbytes){var sha256=CryptoJS.algo.SHA256.create();return sha256.update(CryptoJS.enc.Latin1.parse(b)),sha256.update(CryptoJS.enc.Latin1.parse(secbytes)),sha256.finalize().toString(CryptoJS.enc.Latin1)},HLP.mask=function(bytes,start,n){return bytes.substr(start/8,n/8)};var _toString=String.fromCharCode;HLP.packBytes=function(val,bytes){val=val.toString(16);for(var nex,res="";bytes>0;bytes--)nex=val.length?val.substr(-2,2):"0",val=val.substr(0,val.length-2),res=_toString(parseInt(nex,16))+res;return res},HLP.packINT=function(d){return HLP.packBytes(d,DTS.INT)},HLP.packCtr=function(d){return HLP.padCtr(HLP.packBytes(d,DTS.CTR))},HLP.padCtr=function(ctr){return ctr+"\x00\x00\x00\x00\x00\x00\x00\x00"},HLP.unpackCtr=function(d){return d=HLP.toByteArray(d.substring(0,8)),HLP.unpack(d)},HLP.unpack=function(arr){for(var val=0,i=0,len=arr.length;len>i;i++)val=256*val+arr[i];return val},HLP.packData=function(d){return HLP.packINT(d.length)+d},HLP.bits2bigInt=function(bits){return bits=HLP.toByteArray(bits),BigInt.ba2bigInt(bits)},HLP.packMPI=function(mpi){return HLP.packData(BigInt.bigInt2bits(BigInt.trim(mpi,0)))},HLP.packSHORT=function(short){return HLP.packBytes(short,DTS.SHORT)},HLP.unpackSHORT=function(short){return short=HLP.toByteArray(short),HLP.unpack(short)},HLP.packTLV=function(type,value){return HLP.packSHORT(type)+HLP.packSHORT(value.length)+value},HLP.readLen=function(msg){return msg=HLP.toByteArray(msg.substring(0,4)),HLP.unpack(msg)},HLP.readData=function(data){var n=HLP.unpack(data.splice(0,4));return[n,data]},HLP.readMPI=function(data){return data=HLP.toByteArray(data),data=HLP.readData(data),BigInt.ba2bigInt(data[1])},HLP.packMPIs=function(arr){return arr.reduce(function(prv,cur){return prv+HLP.packMPI(cur)},"")},HLP.unpackMPIs=function(num,mpis){for(var i=0,arr=[];num>i;i++)arr.push("MPI");return HLP.splitype(arr,mpis).map(function(m){return HLP.readMPI(m)})},HLP.wrapMsg=function(msg,fs,v3,our_it,their_it){msg=CryptoJS.enc.Base64.stringify(CryptoJS.enc.Latin1.parse(msg)),msg=WRAPPER_BEGIN+":"+msg+WRAPPER_END;var its;if(v3&&(its="|",its+=HLP.readLen(our_it).toString(16),its+="|",its+=HLP.readLen(their_it).toString(16)),!fs)return[null,msg];var n=Math.ceil(msg.length/fs);if(n>65535)return["Too many fragments"];if(1==n)return[null,msg];var k,bi,ei,frag,mf,mfs=[];for(k=1;n>=k;k++)bi=(k-1)*fs,ei=k*fs,frag=msg.slice(bi,ei),mf=WRAPPER_BEGIN,v3&&(mf+=its),mf+=","+k+",",mf+=n+",",mf+=frag+",",mfs.push(mf);return[null,mfs]},HLP.splitype=function splitype(arr,msg){var data=[];return arr.forEach(function(a){var str;switch(a){case"PUBKEY":str=splitype(["SHORT","MPI","MPI","MPI","MPI"],msg).join("");break;case"DATA":case"MPI":str=msg.substring(0,HLP.readLen(msg)+4);break;default:str=msg.substring(0,DTS[a])}data.push(str),msg=msg.substring(str.length)}),data};var _bin2num=function(){for(var i=0,_bin2num={};256>i;++i)_bin2num[String.fromCharCode(i)]=i;for(i=128;256>i;++i)_bin2num[String.fromCharCode(63232+i)]=i;return _bin2num}();HLP.toByteArray=function(data){for(var rv=[],ary=data.split(""),i=-1,iz=ary.length,remain=iz%8;remain--;)++i,rv[i]=_bin2num[ary[i]];for(remain=iz>>3;remain--;)rv.push(_bin2num[ary[++i]],_bin2num[ary[++i]],_bin2num[ary[++i]],_bin2num[ary[++i]],_bin2num[ary[++i]],_bin2num[ary[++i]],_bin2num[ary[++i]],_bin2num[ary[++i]]);return rv}}.call(this),function(){"use strict";function timer(){var start=(new Date).getTime();return function(s){if(DEBUG&&"undefined"!=typeof console){var t=(new Date).getTime();console.log(s+": "+(t-start)),start=t}}}function makeRandom(min,max){var c=BigInt.randBigInt(BigInt.bitSize(max));return HLP.between(c,min,max)?c:makeRandom(min,max)}function isProbPrime(k,n){var i,B=3e4,l=BigInt.bitSize(k),primes=BigInt.primes;for(0===primes.length&&(primes=BigInt.findPrimes(B)),rpprb.length!=k.length&&(rpprb=BigInt.dup(k)),i=0;i<primes.length&&primes[i]<=B;i++)if(0===BigInt.modInt(k,primes[i])&&!BigInt.equalsInt(k,primes[i]))return 0;for(i=0;n>i;i++){for(BigInt.randBigInt_(rpprb,l,0);!BigInt.greater(k,rpprb);)BigInt.randBigInt_(rpprb,l,0);if(!BigInt.millerRabin(k,rpprb))return 0}return 1}function generatePrimes(bit_length){for(var q,p,rem,counter,t=timer(),repeat=bit_lengths[bit_length].repeat,N=bit_lengths[bit_length].N,LM1=BigInt.twoToThe(bit_length-1),bl4=4*bit_length,brk=!1;;)if(q=BigInt.randBigInt(N,1),q[0]|=1,isProbPrime(q,repeat)){for(t("q"),counter=0;bl4>counter;counter++)if(p=BigInt.randBigInt(bit_length,1),p[0]|=1,rem=BigInt.mod(p,q),rem=BigInt.sub(rem,ONE),p=BigInt.sub(p,rem),!BigInt.greater(LM1,p)&&isProbPrime(p,repeat)){t("p"),primes[bit_length]={p:p,q:q},brk=!0;break}if(brk)break}for(var g,h=BigInt.dup(TWO),pm1=BigInt.sub(p,ONE),e=BigInt.multMod(pm1,BigInt.inverseMod(q,p),p);;){g=BigInt.powMod(h,e,p);{if(!BigInt.equals(g,ONE))return primes[bit_length].g=g,void t("g");h=BigInt.add(h,ONE)}}throw new Error("Unreachable!")}function DSA(obj,opts){if(!(this instanceof DSA))return new DSA(obj,opts);if(opts=opts||{},obj){var self=this;return["p","q","g","y","x"].forEach(function(prop){self[prop]=obj[prop]}),void(this.type=obj.type||KEY_TYPE)}var bit_length=parseInt(opts.bit_length?opts.bit_length:1024,10);if(!bit_lengths[bit_length])throw new Error("Unsupported bit length.");primes[bit_length]||generatePrimes(bit_length),this.p=primes[bit_length].p,this.q=primes[bit_length].q,this.g=primes[bit_length].g,this.type=KEY_TYPE,this.x=makeRandom(ZERO,this.q),this.y=BigInt.powMod(this.g,this.x,this.p),opts.nocache&&(primes[bit_length]=null)}function tokenizeStr(str){var start,end;if(start=str.indexOf("("),end=str.lastIndexOf(")"),0>start||0>end)throw new Error("Malformed S-Expression");str=str.substring(start+1,end);var splt=str.search(/\s/),obj={type:str.substring(0,splt),val:[]};if(str=str.substring(splt+1,end),start=str.indexOf("("),0>start)obj.val.push(str);else for(var i,len,ss,es;start>-1;){for(i=start+1,len=str.length,ss=1,es=0;len>i&&ss>es;i++)"("===str[i]&&ss++,")"===str[i]&&es++;obj.val.push(tokenizeStr(str.substring(start,++i))),str=str.substring(++i),start=str.indexOf("(")}return obj}function parseLibotr(obj){if(!obj.type)throw new Error("Parse error.");var o,val;return"privkeys"===obj.type?(o=[],obj.val.forEach(function(i){o.push(parseLibotr(i))}),o):(o={},obj.val.forEach(function(i){val=i.val[0],"string"==typeof val?0===val.indexOf("#")&&(val=val.substring(1,val.lastIndexOf("#")),val=BigInt.str2bigInt(val,16)):val=parseLibotr(i),o[i.type]=val}),o)}var CryptoJS,BigInt,Worker,WWPath,HLP,root=this;"undefined"!=typeof module&&module.exports?(module.exports=DSA,CryptoJS=require("../vendor/crypto.js"),BigInt=require("../vendor/bigint.js"),WWPath=require("path").join(__dirname,"/dsa-webworker.js"),HLP=require("./helpers.js")):(Object.keys(root.DSA).forEach(function(k){DSA[k]=root.DSA[k]}),root.DSA=DSA,CryptoJS=root.CryptoJS,BigInt=root.BigInt,Worker=root.Worker,WWPath="dsa-webworker.js",HLP=DSA.HLP);var ZERO=BigInt.str2bigInt("0",10),ONE=BigInt.str2bigInt("1",10),TWO=BigInt.str2bigInt("2",10),KEY_TYPE="\x00\x00",DEBUG=!1,rpprb=[],bit_lengths={1024:{N:160,repeat:40},2048:{N:224,repeat:56}},primes={};DSA.prototype={constructor:DSA,packPublic:function(){var str=this.type;return str+=HLP.packMPI(this.p),str+=HLP.packMPI(this.q),str+=HLP.packMPI(this.g),str+=HLP.packMPI(this.y)},packPrivate:function(){var str=this.packPublic()+HLP.packMPI(this.x);return str=CryptoJS.enc.Latin1.parse(str),str.toString(CryptoJS.enc.Base64)},generateNonce:function(m){var priv=BigInt.bigInt2bits(BigInt.trim(this.x,0)),rand=BigInt.bigInt2bits(BigInt.randBigInt(256)),sha256=CryptoJS.algo.SHA256.create();sha256.update(CryptoJS.enc.Latin1.parse(priv)),sha256.update(m),sha256.update(CryptoJS.enc.Latin1.parse(rand));var hash=sha256.finalize();return hash=HLP.bits2bigInt(hash.toString(CryptoJS.enc.Latin1)),BigInt.rightShift_(hash,256-BigInt.bitSize(this.q)),HLP.between(hash,ZERO,this.q)?hash:this.generateNonce(m)},sign:function(m){m=CryptoJS.enc.Latin1.parse(m);for(var k,b=BigInt.str2bigInt(m.toString(CryptoJS.enc.Hex),16),r=ZERO,s=ZERO;BigInt.isZero(s)||BigInt.isZero(r);)k=this.generateNonce(m),r=BigInt.mod(BigInt.powMod(this.g,k,this.p),this.q),BigInt.isZero(r)||(s=BigInt.inverseMod(k,this.q),s=BigInt.mult(s,BigInt.add(b,BigInt.mult(this.x,r))),s=BigInt.mod(s,this.q));return[r,s]},fingerprint:function(){var pk=this.packPublic();return this.type===KEY_TYPE&&(pk=pk.substring(2)),pk=CryptoJS.enc.Latin1.parse(pk),CryptoJS.SHA1(pk).toString(CryptoJS.enc.Hex)}},DSA.parsePublic=function(str,priv){var fields=["SHORT","MPI","MPI","MPI","MPI"];priv&&fields.push("MPI"),str=HLP.splitype(fields,str);var obj={type:str[0],p:HLP.readMPI(str[1]),q:HLP.readMPI(str[2]),g:HLP.readMPI(str[3]),y:HLP.readMPI(str[4])};return priv&&(obj.x=HLP.readMPI(str[5])),new DSA(obj)},DSA.parsePrivate=function(str,libotr){return libotr?parseLibotr(tokenizeStr(str))[0]["private-key"].dsa:(str=CryptoJS.enc.Base64.parse(str),str=str.toString(CryptoJS.enc.Latin1),DSA.parsePublic(str,!0))},DSA.verify=function(key,m,r,s){if(!HLP.between(r,ZERO,key.q)||!HLP.between(s,ZERO,key.q))return!1;var hm=CryptoJS.enc.Latin1.parse(m);hm=BigInt.str2bigInt(hm.toString(CryptoJS.enc.Hex),16);var w=BigInt.inverseMod(s,key.q),u1=BigInt.multMod(hm,w,key.q),u2=BigInt.multMod(r,w,key.q);u1=BigInt.powMod(key.g,u1,key.p),u2=BigInt.powMod(key.y,u2,key.p);var v=BigInt.mod(BigInt.multMod(u1,u2,key.p),key.q);return BigInt.equals(v,r)},DSA.createInWebWorker=function(options,cb){var opts={path:WWPath,seed:BigInt.getSeed};options&&"object"==typeof options&&Object.keys(options).forEach(function(k){opts[k]=options[k]}),"undefined"!=typeof module&&module.exports&&(Worker=require("webworker-threads").Worker);var worker=new Worker(opts.path);worker.onmessage=function(e){var data=e.data;switch(data.type){case"debug":if(!DEBUG||"undefined"==typeof console)return;console.log(data.val);break;case"data":worker.terminate(),cb(DSA.parsePrivate(data.val));break;default:throw new Error("Unrecognized type.")}},worker.postMessage({seed:opts.seed(),imports:opts.imports,debug:DEBUG})}}.call(this),function(){"use strict";var CryptoJS,CONST,HLP,root=this,Parse={};"undefined"!=typeof module&&module.exports?(module.exports=Parse,CryptoJS=require("../vendor/crypto.js"),CONST=require("./const.js"),HLP=require("./helpers.js")):(root.OTR.Parse=Parse,CryptoJS=root.CryptoJS,CONST=root.OTR.CONST,HLP=root.OTR.HLP);var tags={};tags[CONST.WHITESPACE_TAG_V2]=CONST.OTR_VERSION_2,tags[CONST.WHITESPACE_TAG_V3]=CONST.OTR_VERSION_3,Parse.parseMsg=function(otr,msg){var ver=[],start=msg.indexOf(CONST.OTR_TAG);if(!~start){if(this.initFragment(otr),ind=msg.indexOf(CONST.WHITESPACE_TAG),~ind){msg=msg.split(""),msg.splice(ind,16);for(var tag,len=msg.length;len>ind;)tag=msg.slice(ind,ind+8).join(""),Object.hasOwnProperty.call(tags,tag)?(msg.splice(ind,8),ver.push(tags[tag])):ind+=8;msg=msg.join("")}return{msg:msg,ver:ver}}var ind=start+CONST.OTR_TAG.length,com=msg[ind];if(","===com||"|"===com)return this.msgFragment(otr,msg.substring(ind+1),"|"===com);if(this.initFragment(otr),~["?","v"].indexOf(com)){"?"===msg[ind]&&(ver.push(CONST.OTR_VERSION_1),ind+=1);var vers={2:CONST.OTR_VERSION_2,3:CONST.OTR_VERSION_3},qs=msg.substring(ind+1),qi=qs.indexOf("?");return qi>=1&&(qs=qs.substring(0,qi).split(""),"v"===msg[ind]&&qs.forEach(function(q){Object.hasOwnProperty.call(vers,q)&&ver.push(vers[q])})),{cls:"query",ver:ver}}if(":"===com){ind+=1;var info=msg.substring(ind,ind+4);if(info.length<4)return{msg:msg};info=CryptoJS.enc.Base64.parse(info).toString(CryptoJS.enc.Latin1);var version=info.substring(0,2),type=info.substring(2);if(!otr["ALLOW_V"+HLP.unpackSHORT(version)])return{msg:msg};ind+=4;var end=msg.substring(ind).indexOf(".");if(!~end)return{msg:msg};msg=CryptoJS.enc.Base64.parse(msg.substring(ind,ind+end)),msg=CryptoJS.enc.Latin1.stringify(msg);var instance_tags;version===CONST.OTR_VERSION_3&&(instance_tags=msg.substring(0,8),msg=msg.substring(8));var cls;return~["","\n","",""].indexOf(type)?cls="ake":""===type&&(cls="data"),{version:version,type:type,msg:msg,cls:cls,instance_tags:instance_tags}}return" Error:"===msg.substring(ind,ind+7)?(otr.ERROR_START_AKE&&otr.sendQueryMsg(),{msg:msg.substring(ind+7),cls:"error"}):{msg:msg}},Parse.initFragment=function(otr){otr.fragment={s:"",j:0,k:0}},Parse.msgFragment=function(otr,msg,v3){if(msg=msg.split(","),v3){var its=msg.shift().split("|"),their_it=HLP.packINT(parseInt(its[0],16)),our_it=HLP.packINT(parseInt(its[1],16));if(otr.checkInstanceTags(their_it+our_it))return}if(!(msg.length<4||isNaN(parseInt(msg[0],10))||isNaN(parseInt(msg[1],10)))){var k=parseInt(msg[0],10),n=parseInt(msg[1],10);return msg=msg[2],k>n||0===n||0===k?void this.initFragment(otr):(1===k?(this.initFragment(otr),otr.fragment={k:1,n:n,s:msg}):n===otr.fragment.n&&k===otr.fragment.k+1?(otr.fragment.s+=msg,otr.fragment.k+=1):this.initFragment(otr),n===k?(msg=otr.fragment.s,this.initFragment(otr),this.parseMsg(otr,msg)):void 0)}}}.call(this),function(){"use strict";function hMac(gx,gy,pk,kid,m){var pass=CryptoJS.enc.Latin1.parse(m),hmac=CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256,pass);return hmac.update(CryptoJS.enc.Latin1.parse(HLP.packMPI(gx))),hmac.update(CryptoJS.enc.Latin1.parse(HLP.packMPI(gy))),hmac.update(CryptoJS.enc.Latin1.parse(pk)),hmac.update(CryptoJS.enc.Latin1.parse(kid)),hmac.finalize().toString(CryptoJS.enc.Latin1)}function AKE(otr){if(!(this instanceof AKE))return new AKE(otr);this.otr=otr,this.our_dh=otr.our_old_dh,this.our_keyid=otr.our_keyid-1,this.their_y=null,this.their_keyid=null,this.their_priv_pk=null,this.ssid=null,this.transmittedRS=!1,this.r=null;var self=this;["sendMsg"].forEach(function(meth){self[meth]=self[meth].bind(self)})}var CryptoJS,BigInt,CONST,HLP,DSA,root=this;"undefined"!=typeof module&&module.exports?(module.exports=AKE,CryptoJS=require("../vendor/crypto.js"),BigInt=require("../vendor/bigint.js"),CONST=require("./const.js"),HLP=require("./helpers.js"),DSA=require("./dsa.js")):(root.OTR.AKE=AKE,CryptoJS=root.CryptoJS,BigInt=root.BigInt,CONST=root.OTR.CONST,HLP=root.OTR.HLP,DSA=root.DSA);var N=BigInt.str2bigInt(CONST.N,16),N_MINUS_2=BigInt.sub(N,BigInt.str2bigInt("2",10));AKE.prototype={constructor:AKE,createKeys:function(g){var s=BigInt.powMod(g,this.our_dh.privateKey,N),secbytes=HLP.packMPI(s);this.ssid=HLP.mask(HLP.h2("\x00",secbytes),0,64);var tmp=HLP.h2("",secbytes);this.c=HLP.mask(tmp,0,128),this.c_prime=HLP.mask(tmp,128,128),this.m1=HLP.h2("",secbytes),this.m2=HLP.h2("",secbytes),this.m1_prime=HLP.h2("",secbytes),this.m2_prime=HLP.h2("",secbytes)},verifySignMac:function(mac,aesctr,m2,c,their_y,our_dh_pk,m1,ctr){var vmac=HLP.makeMac(aesctr,m2);if(!HLP.compare(mac,vmac))return["MACs do not match."];var x=HLP.decryptAes(aesctr.substring(4),c,ctr);x=HLP.splitype(["PUBKEY","INT","SIG"],x.toString(CryptoJS.enc.Latin1));var m=hMac(their_y,our_dh_pk,x[0],x[1],m1),pub=DSA.parsePublic(x[0]),r=HLP.bits2bigInt(x[2].substring(0,20)),s=HLP.bits2bigInt(x[2].substring(20));return DSA.verify(pub,m,r,s)?[null,HLP.readLen(x[1]),pub]:["Cannot verify signature of m."]},makeM:function(their_y,m1,c,m2){var pk=this.otr.priv.packPublic(),kid=HLP.packINT(this.our_keyid),m=hMac(this.our_dh.publicKey,their_y,pk,kid,m1);m=this.otr.priv.sign(m);var msg=pk+kid;msg+=BigInt.bigInt2bits(m[0],20),msg+=BigInt.bigInt2bits(m[1],20),msg=CryptoJS.enc.Latin1.parse(msg);var aesctr=HLP.packData(HLP.encryptAes(msg,c,HLP.packCtr(0))),mac=HLP.makeMac(aesctr,m2);return aesctr+mac},akeSuccess:function(version){return HLP.debug.call(this.otr,"success"),BigInt.equals(this.their_y,this.our_dh.publicKey)?this.otr.error("equal keys - we have a problem."):(this.otr.our_old_dh=this.our_dh,this.otr.their_priv_pk=this.their_priv_pk,this.their_keyid===this.otr.their_keyid&&BigInt.equals(this.their_y,this.otr.their_y)||this.their_keyid===this.otr.their_keyid-1&&BigInt.equals(this.their_y,this.otr.their_old_y)||(this.otr.their_y=this.their_y,this.otr.their_old_y=null,this.otr.their_keyid=this.their_keyid,this.otr.sessKeys[0]=[new this.otr.DHSession(this.otr.our_dh,this.otr.their_y),null],this.otr.sessKeys[1]=[new this.otr.DHSession(this.otr.our_old_dh,this.otr.their_y),null]),this.otr.ssid=this.ssid,this.otr.transmittedRS=this.transmittedRS,this.otr_version=version,this.otr.authstate=CONST.AUTHSTATE_NONE,this.otr.msgstate=CONST.MSGSTATE_ENCRYPTED,this.r=null,this.myhashed=null,this.dhcommit=null,this.encrypted=null,this.hashed=null,this.otr.trigger("status",[CONST.STATUS_AKE_SUCCESS]),void this.otr.sendStored())},handleAKE:function(msg){var send,vsm,type,version=msg.version;switch(msg.type){case"":if(HLP.debug.call(this.otr,"d-h key message"),msg=HLP.splitype(["DATA","DATA"],msg.msg),this.otr.authstate===CONST.AUTHSTATE_AWAITING_DHKEY){var ourHash=HLP.readMPI(this.myhashed),theirHash=HLP.readMPI(msg[1]);if(BigInt.greater(ourHash,theirHash)){type="",send=this.dhcommit;break}this.our_dh=this.otr.dh(),this.otr.authstate=CONST.AUTHSTATE_NONE,this.r=null,this.myhashed=null}else this.otr.authstate===CONST.AUTHSTATE_AWAITING_SIG&&(this.our_dh=this.otr.dh());this.otr.authstate=CONST.AUTHSTATE_AWAITING_REVEALSIG,this.encrypted=msg[0].substring(4),this.hashed=msg[1].substring(4),type="\n",send=HLP.packMPI(this.our_dh.publicKey);break;case"\n":if(HLP.debug.call(this.otr,"reveal signature message"),msg=HLP.splitype(["MPI"],msg.msg),this.otr.authstate!==CONST.AUTHSTATE_AWAITING_DHKEY){if(this.otr.authstate!==CONST.AUTHSTATE_AWAITING_SIG)return;if(!BigInt.equals(this.their_y,HLP.readMPI(msg[0])))return}if(this.otr.authstate=CONST.AUTHSTATE_AWAITING_SIG,this.their_y=HLP.readMPI(msg[0]),!HLP.checkGroup(this.their_y,N_MINUS_2))return this.otr.error("Illegal g^y.");this.createKeys(this.their_y),type="",send=HLP.packMPI(this.r),send+=this.makeM(this.their_y,this.m1,this.c,this.m2),this.m1=null,this.m2=null,this.c=null;break;case"":if(HLP.debug.call(this.otr,"signature message"),this.otr.authstate!==CONST.AUTHSTATE_AWAITING_REVEALSIG)return;msg=HLP.splitype(["DATA","DATA","MAC"],msg.msg),this.r=HLP.readMPI(msg[0]);var key=CryptoJS.enc.Hex.parse(BigInt.bigInt2str(this.r,16));key=CryptoJS.enc.Latin1.stringify(key);var gxmpi=HLP.decryptAes(this.encrypted,key,HLP.packCtr(0));gxmpi=gxmpi.toString(CryptoJS.enc.Latin1),this.their_y=HLP.readMPI(gxmpi);var hash=CryptoJS.SHA256(CryptoJS.enc.Latin1.parse(gxmpi));return HLP.compare(this.hashed,hash.toString(CryptoJS.enc.Latin1))?HLP.checkGroup(this.their_y,N_MINUS_2)?(this.createKeys(this.their_y),vsm=this.verifySignMac(msg[2],msg[1],this.m2,this.c,this.their_y,this.our_dh.publicKey,this.m1,HLP.packCtr(0)),vsm[0]?this.otr.error(vsm[0]):(this.their_keyid=vsm[1],this.their_priv_pk=vsm[2],send=this.makeM(this.their_y,this.m1_prime,this.c_prime,this.m2_prime),this.m1=null,this.m2=null,this.m1_prime=null,this.m2_prime=null,this.c=null,this.c_prime=null,this.sendMsg(version,"",send),void this.akeSuccess(version))):this.otr.error("Illegal g^x."):this.otr.error("Hashed g^x does not match.");case"":if(HLP.debug.call(this.otr,"data message"),this.otr.authstate!==CONST.AUTHSTATE_AWAITING_SIG)return;return msg=HLP.splitype(["DATA","MAC"],msg.msg),vsm=this.verifySignMac(msg[1],msg[0],this.m2_prime,this.c_prime,this.their_y,this.our_dh.publicKey,this.m1_prime,HLP.packCtr(0)),vsm[0]?this.otr.error(vsm[0]):(this.their_keyid=vsm[1],this.their_priv_pk=vsm[2],this.m1_prime=null,this.m2_prime=null,this.c_prime=null,this.transmittedRS=!0,void this.akeSuccess(version));default:return}this.sendMsg(version,type,send)},sendMsg:function(version,type,msg){var send=version+type,v3=version===CONST.OTR_VERSION_3;return v3&&(HLP.debug.call(this.otr,"instance tags"),send+=this.otr.our_instance_tag,send+=this.otr.their_instance_tag),send+=msg,send=HLP.wrapMsg(send,this.otr.fragment_size,v3,this.otr.our_instance_tag,this.otr.their_instance_tag),send[0]?this.otr.error(send[0]):void this.otr.io(send[1])},initiateAKE:function(version){HLP.debug.call(this.otr,"d-h commit message"),this.otr.trigger("status",[CONST.STATUS_AKE_INIT]),this.otr.authstate=CONST.AUTHSTATE_AWAITING_DHKEY;var gxmpi=HLP.packMPI(this.our_dh.publicKey);gxmpi=CryptoJS.enc.Latin1.parse(gxmpi),this.r=BigInt.randBigInt(128);var key=CryptoJS.enc.Hex.parse(BigInt.bigInt2str(this.r,16));key=CryptoJS.enc.Latin1.stringify(key),this.myhashed=CryptoJS.SHA256(gxmpi),this.myhashed=HLP.packData(this.myhashed.toString(CryptoJS.enc.Latin1)),this.dhcommit=HLP.packData(HLP.encryptAes(gxmpi,key,HLP.packCtr(0))),this.dhcommit+=this.myhashed,this.sendMsg(version,"",this.dhcommit)}}}.call(this),function(){"use strict";function SM(reqs){return this instanceof SM?(this.version=1,this.our_fp=reqs.our_fp,this.their_fp=reqs.their_fp,this.ssid=reqs.ssid,this.debug=!!reqs.debug,void this.init()):new SM(reqs)}var CryptoJS,BigInt,EventEmitter,CONST,HLP,root=this;"undefined"!=typeof module&&module.exports?(module.exports=SM,CryptoJS=require("../vendor/crypto.js"),BigInt=require("../vendor/bigint.js"),EventEmitter=require("../vendor/eventemitter.js"),CONST=require("./const.js"),HLP=require("./helpers.js")):(root.OTR.SM=SM,CryptoJS=root.CryptoJS,BigInt=root.BigInt,EventEmitter=root.EventEmitter,CONST=root.OTR.CONST,HLP=root.OTR.HLP);var G=BigInt.str2bigInt(CONST.G,10),N=BigInt.str2bigInt(CONST.N,16),N_MINUS_2=BigInt.sub(N,BigInt.str2bigInt("2",10)),Q=BigInt.sub(N,BigInt.str2bigInt("1",10));BigInt.divInt_(Q,2),HLP.extend(SM,EventEmitter),SM.prototype.init=function(){this.smpstate=CONST.SMPSTATE_EXPECT1,this.secret=null},SM.prototype.makeSecret=function(our,secret){var sha256=CryptoJS.algo.SHA256.create();sha256.update(CryptoJS.enc.Latin1.parse(HLP.packBytes(this.version,1))),sha256.update(CryptoJS.enc.Hex.parse(our?this.our_fp:this.their_fp)),sha256.update(CryptoJS.enc.Hex.parse(our?this.their_fp:this.our_fp)),sha256.update(CryptoJS.enc.Latin1.parse(this.ssid)),sha256.update(CryptoJS.enc.Latin1.parse(secret));var hash=sha256.finalize();this.secret=HLP.bits2bigInt(hash.toString(CryptoJS.enc.Latin1))},SM.prototype.makeG2s=function(){this.a2=HLP.randomExponent(),this.a3=HLP.randomExponent(),this.g2a=BigInt.powMod(G,this.a2,N),this.g3a=BigInt.powMod(G,this.a3,N),HLP.checkGroup(this.g2a,N_MINUS_2)&&HLP.checkGroup(this.g3a,N_MINUS_2)||this.makeG2s()},SM.prototype.computeGs=function(g2a,g3a){this.g2=BigInt.powMod(g2a,this.a2,N),this.g3=BigInt.powMod(g3a,this.a3,N)},SM.prototype.computePQ=function(r){this.p=BigInt.powMod(this.g3,r,N),this.q=HLP.multPowMod(G,r,this.g2,this.secret,N)},SM.prototype.computeR=function(){this.r=BigInt.powMod(this.QoQ,this.a3,N)},SM.prototype.computeRab=function(r){return BigInt.powMod(r,this.a3,N)},SM.prototype.computeC=function(v,r){return HLP.smpHash(v,BigInt.powMod(G,r,N))},SM.prototype.computeD=function(r,a,c){return BigInt.subMod(r,BigInt.multMod(a,c,Q),Q)},SM.prototype.handleSM=function(msg){var send,r2,r3,r7,t1,t2,t3,t4,rab,tmp2,cR,d7,ms,trust,expectStates={2:CONST.SMPSTATE_EXPECT1,3:CONST.SMPSTATE_EXPECT2,4:CONST.SMPSTATE_EXPECT3,5:CONST.SMPSTATE_EXPECT4,7:CONST.SMPSTATE_EXPECT1};if(6===msg.type)return this.init(),void this.trigger("abort");if(this.smpstate!==expectStates[msg.type])return this.abort();switch(this.smpstate){case CONST.SMPSTATE_EXPECT1:HLP.debug.call(this,"smp tlv 2");var ind,question;return 7===msg.type&&(ind=msg.msg.indexOf("\x00"),question=msg.msg.substring(0,ind),msg.msg=msg.msg.substring(ind+1)),ms=HLP.readLen(msg.msg.substr(0,4)),6!==ms?this.abort():(msg=HLP.unpackMPIs(6,msg.msg.substring(4)),HLP.checkGroup(msg[0],N_MINUS_2)&&HLP.checkGroup(msg[3],N_MINUS_2)&&HLP.ZKP(1,msg[1],HLP.multPowMod(G,msg[2],msg[0],msg[1],N))&&HLP.ZKP(2,msg[4],HLP.multPowMod(G,msg[5],msg[3],msg[4],N))?(this.g3ao=msg[3],this.makeG2s(),r2=HLP.randomExponent(),r3=HLP.randomExponent(),this.c2=this.computeC(3,r2),this.c3=this.computeC(4,r3),this.d2=this.computeD(r2,this.a2,this.c2),this.d3=this.computeD(r3,this.a3,this.c3),this.computeGs(msg[0],msg[3]),this.smpstate=CONST.SMPSTATE_EXPECT0,question&&(question=CryptoJS.enc.Latin1.parse(question).toString(CryptoJS.enc.Utf8)),void this.trigger("question",[question])):this.abort());
-case CONST.SMPSTATE_EXPECT2:if(HLP.debug.call(this,"smp tlv 3"),ms=HLP.readLen(msg.msg.substr(0,4)),11!==ms)return this.abort();if(msg=HLP.unpackMPIs(11,msg.msg.substring(4)),!(HLP.checkGroup(msg[0],N_MINUS_2)&&HLP.checkGroup(msg[3],N_MINUS_2)&&HLP.checkGroup(msg[6],N_MINUS_2)&&HLP.checkGroup(msg[7],N_MINUS_2)))return this.abort();if(!HLP.ZKP(3,msg[1],HLP.multPowMod(G,msg[2],msg[0],msg[1],N)))return this.abort();if(!HLP.ZKP(4,msg[4],HLP.multPowMod(G,msg[5],msg[3],msg[4],N)))return this.abort();if(this.g3ao=msg[3],this.computeGs(msg[0],msg[3]),t1=HLP.multPowMod(this.g3,msg[9],msg[6],msg[8],N),t2=HLP.multPowMod(G,msg[9],this.g2,msg[10],N),t2=BigInt.multMod(t2,BigInt.powMod(msg[7],msg[8],N),N),!HLP.ZKP(5,msg[8],t1,t2))return this.abort();var r4=HLP.randomExponent();this.computePQ(r4);var r5=HLP.randomExponent(),r6=HLP.randomExponent(),tmp=HLP.multPowMod(G,r5,this.g2,r6,N),cP=HLP.smpHash(6,BigInt.powMod(this.g3,r5,N),tmp),d5=this.computeD(r5,r4,cP),d6=this.computeD(r6,this.secret,cP);this.QoQ=BigInt.divMod(this.q,msg[7],N),this.PoP=BigInt.divMod(this.p,msg[6],N),this.computeR(),r7=HLP.randomExponent(),tmp2=BigInt.powMod(this.QoQ,r7,N),cR=HLP.smpHash(7,BigInt.powMod(G,r7,N),tmp2),d7=this.computeD(r7,this.a3,cR),this.smpstate=CONST.SMPSTATE_EXPECT4,send=HLP.packINT(8)+HLP.packMPIs([this.p,this.q,cP,d5,d6,this.r,cR,d7]),send=HLP.packTLV(4,send);break;case CONST.SMPSTATE_EXPECT3:if(HLP.debug.call(this,"smp tlv 4"),ms=HLP.readLen(msg.msg.substr(0,4)),8!==ms)return this.abort();if(msg=HLP.unpackMPIs(8,msg.msg.substring(4)),!HLP.checkGroup(msg[0],N_MINUS_2)||!HLP.checkGroup(msg[1],N_MINUS_2)||!HLP.checkGroup(msg[5],N_MINUS_2))return this.abort();if(t1=HLP.multPowMod(this.g3,msg[3],msg[0],msg[2],N),t2=HLP.multPowMod(G,msg[3],this.g2,msg[4],N),t2=BigInt.multMod(t2,BigInt.powMod(msg[1],msg[2],N),N),!HLP.ZKP(6,msg[2],t1,t2))return this.abort();if(t3=HLP.multPowMod(G,msg[7],this.g3ao,msg[6],N),this.QoQ=BigInt.divMod(msg[1],this.q,N),t4=HLP.multPowMod(this.QoQ,msg[7],msg[5],msg[6],N),!HLP.ZKP(7,msg[6],t3,t4))return this.abort();this.computeR(),r7=HLP.randomExponent(),tmp2=BigInt.powMod(this.QoQ,r7,N),cR=HLP.smpHash(8,BigInt.powMod(G,r7,N),tmp2),d7=this.computeD(r7,this.a3,cR),send=HLP.packINT(3)+HLP.packMPIs([this.r,cR,d7]),send=HLP.packTLV(5,send),rab=this.computeRab(msg[5]),trust=!!BigInt.equals(rab,BigInt.divMod(msg[0],this.p,N)),this.trigger("trust",[trust,"answered"]),this.init();break;case CONST.SMPSTATE_EXPECT4:return HLP.debug.call(this,"smp tlv 5"),ms=HLP.readLen(msg.msg.substr(0,4)),3!==ms?this.abort():(msg=HLP.unpackMPIs(3,msg.msg.substring(4)),HLP.checkGroup(msg[0],N_MINUS_2)?(t3=HLP.multPowMod(G,msg[2],this.g3ao,msg[1],N),t4=HLP.multPowMod(this.QoQ,msg[2],msg[0],msg[1],N),HLP.ZKP(8,msg[1],t3,t4)?(rab=this.computeRab(msg[0]),trust=!!BigInt.equals(rab,this.PoP),this.trigger("trust",[trust,"asked"]),void this.init()):this.abort()):this.abort())}this.sendMsg(send)},SM.prototype.sendMsg=function(send){this.trigger("send",[this.ssid,"\x00"+send])},SM.prototype.rcvSecret=function(secret,question){HLP.debug.call(this,"receive secret");var fn,our=!1;this.smpstate===CONST.SMPSTATE_EXPECT0?fn=this.answer:(fn=this.initiate,our=!0),this.makeSecret(our,secret),fn.call(this,question)},SM.prototype.answer=function(){HLP.debug.call(this,"smp answer");var r4=HLP.randomExponent();this.computePQ(r4);var r5=HLP.randomExponent(),r6=HLP.randomExponent(),tmp=HLP.multPowMod(G,r5,this.g2,r6,N),cP=HLP.smpHash(5,BigInt.powMod(this.g3,r5,N),tmp),d5=this.computeD(r5,r4,cP),d6=this.computeD(r6,this.secret,cP);this.smpstate=CONST.SMPSTATE_EXPECT3;var send=HLP.packINT(11)+HLP.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3,this.p,this.q,cP,d5,d6]);this.sendMsg(HLP.packTLV(3,send))},SM.prototype.initiate=function(question){HLP.debug.call(this,"smp initiate"),this.smpstate!==CONST.SMPSTATE_EXPECT1&&this.abort(),this.makeG2s();var r2=HLP.randomExponent(),r3=HLP.randomExponent();this.c2=this.computeC(1,r2),this.c3=this.computeC(2,r3),this.d2=this.computeD(r2,this.a2,this.c2),this.d3=this.computeD(r3,this.a3,this.c3),this.smpstate=CONST.SMPSTATE_EXPECT2;var send="",type=2;question&&(send+=question,send+="\x00",type=7),send+=HLP.packINT(6)+HLP.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3]),this.sendMsg(HLP.packTLV(type,send))},SM.prototype.abort=function(){this.init(),this.sendMsg(HLP.packTLV(6,"")),this.trigger("abort")}}.call(this),function(){"use strict";function OTRCB(cb){this.cb=cb}function OTR(options){if(!(this instanceof OTR))return new OTR(options);if(options=options||{},options.priv&&!(options.priv instanceof DSA))throw new Error("Requires long-lived DSA key.");if(this.priv=options.priv?options.priv:new DSA,this.fragment_size=options.fragment_size||0,this.fragment_size<0)throw new Error("Fragment size must be a positive integer.");if(this.send_interval=options.send_interval||0,this.send_interval<0)throw new Error("Send interval must be a positive integer.");this.outgoing=[],this.our_instance_tag=options.instance_tag||OTR.makeInstanceTag(),this.debug=!!options.debug,this.smw=options.smw,this.init();var self=this;["sendMsg","receiveMsg"].forEach(function(meth){self[meth]=self[meth].bind(self)}),EventEmitter.call(this)}var CryptoJS,BigInt,EventEmitter,Worker,SMWPath,CONST,HLP,Parse,AKE,SM,DSA,root=this;"undefined"!=typeof module&&module.exports?(module.exports=OTR,CryptoJS=require("../vendor/crypto.js"),BigInt=require("../vendor/bigint.js"),EventEmitter=require("../vendor/eventemitter.js"),SMWPath=require("path").join(__dirname,"/sm-webworker.js"),CONST=require("./const.js"),HLP=require("./helpers.js"),Parse=require("./parse.js"),AKE=require("./ake.js"),SM=require("./sm.js"),DSA=require("./dsa.js"),OTR.CONST=CONST):(Object.keys(root.OTR).forEach(function(k){OTR[k]=root.OTR[k]}),root.OTR=OTR,CryptoJS=root.CryptoJS,BigInt=root.BigInt,EventEmitter=root.EventEmitter,Worker=root.Worker,SMWPath="sm-webworker.js",CONST=OTR.CONST,HLP=OTR.HLP,Parse=OTR.Parse,AKE=OTR.AKE,SM=OTR.SM,DSA=root.DSA);var G=BigInt.str2bigInt(CONST.G,10),N=BigInt.str2bigInt(CONST.N,16),MAX_INT=Math.pow(2,53)-1,MAX_UINT=Math.pow(2,31)-1;HLP.extend(OTR,EventEmitter),OTR.prototype.init=function(){this.msgstate=CONST.MSGSTATE_PLAINTEXT,this.authstate=CONST.AUTHSTATE_NONE,this.ALLOW_V2=!0,this.ALLOW_V3=!0,this.REQUIRE_ENCRYPTION=!1,this.SEND_WHITESPACE_TAG=!1,this.WHITESPACE_START_AKE=!1,this.ERROR_START_AKE=!1,Parse.initFragment(this),this.their_y=null,this.their_old_y=null,this.their_keyid=0,this.their_priv_pk=null,this.their_instance_tag="\x00\x00\x00\x00",this.our_dh=this.dh(),this.our_old_dh=this.dh(),this.our_keyid=2,this.sessKeys=[new Array(2),new Array(2)],this.storedMgs=[],this.oldMacKeys=[],this.sm=null,this._akeInit(),this.receivedPlaintext=!1},OTR.prototype._akeInit=function(){this.ake=new AKE(this),this.transmittedRS=!1,this.ssid=null},OTR.prototype._SMW=function(otr,reqs){this.otr=otr;var opts={path:SMWPath,seed:BigInt.getSeed};"object"==typeof otr.smw&&Object.keys(otr.smw).forEach(function(k){opts[k]=otr.smw[k]}),"undefined"!=typeof module&&module.exports&&(Worker=require("webworker-threads").Worker),this.worker=new Worker(opts.path);var self=this;this.worker.onmessage=function(e){var d=e.data;d&&self.trigger(d.method,d.args)},this.worker.postMessage({type:"seed",seed:opts.seed(),imports:opts.imports}),this.worker.postMessage({type:"init",reqs:reqs})},HLP.extend(OTR.prototype._SMW,EventEmitter),["handleSM","rcvSecret","abort"].forEach(function(m){OTR.prototype._SMW.prototype[m]=function(){this.worker.postMessage({type:"method",method:m,args:Array.prototype.slice.call(arguments,0)})}}),OTR.prototype._smInit=function(){var reqs={ssid:this.ssid,our_fp:this.priv.fingerprint(),their_fp:this.their_priv_pk.fingerprint(),debug:this.debug};this.smw?(this.sm&&this.sm.worker.terminate(),this.sm=new this._SMW(this,reqs)):this.sm=new SM(reqs);var self=this;["trust","abort","question"].forEach(function(e){self.sm.on(e,function(){self.trigger("smp",[e].concat(Array.prototype.slice.call(arguments)))})}),this.sm.on("send",function(ssid,send){self.ssid===ssid&&(send=self.prepareMsg(send),self.io(send))})},OTR.prototype.io=function(msg,meta){msg=[].concat(msg).map(function(m){return{msg:m,meta:meta}}),this.outgoing=this.outgoing.concat(msg);var self=this;!function send(first){if(!first){if(!self.outgoing.length)return;var elem=self.outgoing.shift(),cb=null;elem.meta instanceof OTRCB&&(cb=elem.meta.cb,elem.meta=null),self.trigger("io",[elem.msg,elem.meta]),cb&&cb()}setTimeout(send,first?0:self.send_interval)}(!0)},OTR.prototype.dh=function(){var keys={privateKey:BigInt.randBigInt(320)};return keys.publicKey=BigInt.powMod(G,keys.privateKey,N),keys},OTR.prototype.DHSession=function DHSession(our_dh,their_y){if(!(this instanceof DHSession))return new DHSession(our_dh,their_y);var s=BigInt.powMod(their_y,our_dh.privateKey,N),secbytes=HLP.packMPI(s);this.id=HLP.mask(HLP.h2("\x00",secbytes),0,64);var sq=BigInt.greater(our_dh.publicKey,their_y),sendbyte=sq?"":"",rcvbyte=sq?"":"";this.sendenc=HLP.mask(HLP.h1(sendbyte,secbytes),0,128),this.sendmac=CryptoJS.SHA1(CryptoJS.enc.Latin1.parse(this.sendenc)),this.sendmac=this.sendmac.toString(CryptoJS.enc.Latin1),this.rcvenc=HLP.mask(HLP.h1(rcvbyte,secbytes),0,128),this.rcvmac=CryptoJS.SHA1(CryptoJS.enc.Latin1.parse(this.rcvenc)),this.rcvmac=this.rcvmac.toString(CryptoJS.enc.Latin1),this.rcvmacused=!1,this.extra_symkey=HLP.h2("ÿ",secbytes),this.send_counter=0,this.rcv_counter=0},OTR.prototype.rotateOurKeys=function(){var self=this;this.sessKeys[1].forEach(function(sk){sk&&sk.rcvmacused&&self.oldMacKeys.push(sk.rcvmac)}),this.our_old_dh=this.our_dh,this.our_dh=this.dh(),this.our_keyid+=1,this.sessKeys[1][0]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[0][1],this.sessKeys[0]=[this.their_y?new this.DHSession(this.our_dh,this.their_y):null,this.their_old_y?new this.DHSession(this.our_dh,this.their_old_y):null]},OTR.prototype.rotateTheirKeys=function(their_y){this.their_keyid+=1;var self=this;this.sessKeys.forEach(function(sk){sk[1]&&sk[1].rcvmacused&&self.oldMacKeys.push(sk[1].rcvmac)}),this.their_old_y=this.their_y,this.sessKeys[0][1]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[1][0],this.their_y=their_y,this.sessKeys[0][0]=new this.DHSession(this.our_dh,this.their_y),this.sessKeys[1][0]=new this.DHSession(this.our_old_dh,this.their_y)},OTR.prototype.prepareMsg=function(msg,esk){if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED||0===this.their_keyid)return this.notify("Not ready to encrypt.");var sessKeys=this.sessKeys[1][0];if(sessKeys.send_counter>=MAX_INT)return this.notify("Should have rekeyed by now.");sessKeys.send_counter+=1;var ctr=HLP.packCtr(sessKeys.send_counter),send=this.ake.otr_version+"",v3=this.ake.otr_version===CONST.OTR_VERSION_3;if(v3&&(send+=this.our_instance_tag,send+=this.their_instance_tag),send+="\x00",send+=HLP.packINT(this.our_keyid-1),send+=HLP.packINT(this.their_keyid),send+=HLP.packMPI(this.our_dh.publicKey),send+=ctr.substring(0,8),Math.ceil(msg.length/8)>=MAX_UINT)return this.notify("Message is too long.");var aes=HLP.encryptAes(CryptoJS.enc.Latin1.parse(msg),sessKeys.sendenc,ctr);return send+=HLP.packData(aes),send+=HLP.make1Mac(send,sessKeys.sendmac),send+=HLP.packData(this.oldMacKeys.splice(0).join("")),send=HLP.wrapMsg(send,this.fragment_size,v3,this.our_instance_tag,this.their_instance_tag),send[0]?this.notify(send[0]):(esk&&this.trigger("file",["send",sessKeys.extra_symkey,esk]),send[1])},OTR.prototype.handleDataMsg=function(msg){var vt=msg.version+msg.type;this.ake.otr_version===CONST.OTR_VERSION_3&&(vt+=msg.instance_tags);var types=["BYTE","INT","INT","MPI","CTR","DATA","MAC","DATA"];msg=HLP.splitype(types,msg.msg);var ign=""===msg[0];if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED||8!==msg.length)return void(ign||this.error("Received an unreadable encrypted message."));var our_keyid=this.our_keyid-HLP.readLen(msg[2]),their_keyid=this.their_keyid-HLP.readLen(msg[1]);if(0>our_keyid||our_keyid>1)return void(ign||this.error("Not of our latest keys."));if(0>their_keyid||their_keyid>1)return void(ign||this.error("Not of your latest keys."));var their_y=their_keyid?this.their_old_y:this.their_y;if(1===their_keyid&&!their_y)return void(ign||this.error("Do not have that key."));var sessKeys=this.sessKeys[our_keyid][their_keyid],ctr=HLP.unpackCtr(msg[4]);if(ctr<=sessKeys.rcv_counter)return void(ign||this.error("Counter in message is not larger."));sessKeys.rcv_counter=ctr,vt+=msg.slice(0,6).join("");var vmac=HLP.make1Mac(vt,sessKeys.rcvmac);if(!HLP.compare(msg[6],vmac))return void(ign||this.error("MACs do not match."));sessKeys.rcvmacused=!0;var out=HLP.decryptAes(msg[5].substring(4),sessKeys.rcvenc,HLP.padCtr(msg[4]));out=out.toString(CryptoJS.enc.Latin1),our_keyid||this.rotateOurKeys(),their_keyid||this.rotateTheirKeys(HLP.readMPI(msg[3]));var ind=out.indexOf("\x00");return~ind&&(this.handleTLVs(out.substring(ind+1),sessKeys),out=out.substring(0,ind)),out=CryptoJS.enc.Latin1.parse(out),out.toString(CryptoJS.enc.Utf8)},OTR.prototype.handleTLVs=function(tlvs,sessKeys){for(var type,len,msg;tlvs.length&&(type=HLP.unpackSHORT(tlvs.substr(0,2)),len=HLP.unpackSHORT(tlvs.substr(2,2)),msg=tlvs.substr(4,len),!(msg.length<len));){switch(type){case 1:this.msgstate=CONST.MSGSTATE_FINISHED,this.trigger("status",[CONST.STATUS_END_OTR]);break;case 2:case 3:case 4:case 5:case 6:case 7:if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED)return void(this.sm&&this.sm.abort());this.sm||this._smInit(),this.sm.handleSM({msg:msg,type:type});break;case 8:msg=msg.substring(4),msg=CryptoJS.enc.Latin1.parse(msg),msg=msg.toString(CryptoJS.enc.Utf8),this.trigger("file",["receive",sessKeys.extra_symkey,msg])}tlvs=tlvs.substring(4+len)}},OTR.prototype.smpSecret=function(secret,question){return this.msgstate!==CONST.MSGSTATE_ENCRYPTED?this.notify("Must be encrypted for SMP."):"string"!=typeof secret||secret.length<1?this.notify("Secret is required."):(this.sm||this._smInit(),secret=CryptoJS.enc.Utf8.parse(secret).toString(CryptoJS.enc.Latin1),question&&(question=CryptoJS.enc.Utf8.parse(question).toString(CryptoJS.enc.Latin1)),void this.sm.rcvSecret(secret,question))},OTR.prototype.sendQueryMsg=function(){var versions={},msg=CONST.OTR_TAG;this.ALLOW_V2&&(versions[2]=!0),this.ALLOW_V3&&(versions[3]=!0);var vs=Object.keys(versions);vs.length&&(msg+="v",vs.forEach(function(v){"1"!==v&&(msg+=v)}),msg+="?"),this.io(msg),this.trigger("status",[CONST.STATUS_SEND_QUERY])},OTR.prototype.sendMsg=function(msg,meta){switch((this.REQUIRE_ENCRYPTION||this.msgstate!==CONST.MSGSTATE_PLAINTEXT)&&(msg=CryptoJS.enc.Utf8.parse(msg),msg=msg.toString(CryptoJS.enc.Latin1)),this.msgstate){case CONST.MSGSTATE_PLAINTEXT:if(this.REQUIRE_ENCRYPTION)return this.storedMgs.push({msg:msg,meta:meta}),void this.sendQueryMsg();this.SEND_WHITESPACE_TAG&&!this.receivedPlaintext&&(msg+=CONST.WHITESPACE_TAG,this.ALLOW_V3&&(msg+=CONST.WHITESPACE_TAG_V3),this.ALLOW_V2&&(msg+=CONST.WHITESPACE_TAG_V2));break;case CONST.MSGSTATE_FINISHED:return this.storedMgs.push({msg:msg,meta:meta}),void this.notify("Message cannot be sent at this time.","warn");case CONST.MSGSTATE_ENCRYPTED:msg=this.prepareMsg(msg);break;default:throw new Error("Unknown message state.")}msg&&this.io(msg,meta)},OTR.prototype.receiveMsg=function(msg,meta){if(msg=Parse.parseMsg(this,msg)){switch(msg.cls){case"error":return void this.notify(msg.msg);case"ake":return msg.version===CONST.OTR_VERSION_3&&this.checkInstanceTags(msg.instance_tags)?void this.notify("Received a message intended for a different session.","warn"):void this.ake.handleAKE(msg);case"data":if(msg.version===CONST.OTR_VERSION_3&&this.checkInstanceTags(msg.instance_tags))return void this.notify("Received a message intended for a different session.","warn");msg.msg=this.handleDataMsg(msg),msg.encrypted=!0;break;case"query":this.msgstate===CONST.MSGSTATE_ENCRYPTED&&this._akeInit(),this.doAKE(msg);break;default:(this.REQUIRE_ENCRYPTION||this.msgstate!==CONST.MSGSTATE_PLAINTEXT)&&this.notify("Received an unencrypted message.","warn"),this.receivedPlaintext=!0,this.WHITESPACE_START_AKE&&msg.ver.length>0&&this.doAKE(msg)}msg.msg&&this.trigger("ui",[msg.msg,!!msg.encrypted,meta])}},OTR.prototype.checkInstanceTags=function(it){var their_it=HLP.readLen(it.substr(0,4)),our_it=HLP.readLen(it.substr(4,4));if(our_it&&our_it!==HLP.readLen(this.our_instance_tag))return!0;if(HLP.readLen(this.their_instance_tag)){if(HLP.readLen(this.their_instance_tag)!==their_it)return!0}else{if(100>their_it)return!0;this.their_instance_tag=HLP.packINT(their_it)}},OTR.prototype.doAKE=function(msg){this.ALLOW_V3&&~msg.ver.indexOf(CONST.OTR_VERSION_3)?this.ake.initiateAKE(CONST.OTR_VERSION_3):this.ALLOW_V2&&~msg.ver.indexOf(CONST.OTR_VERSION_2)?this.ake.initiateAKE(CONST.OTR_VERSION_2):this.notify("OTR conversation requested, but no compatible protocol version found.","warn")},OTR.prototype.error=function(err){this.debug||(err="An OTR error has occurred."),this.io("?OTR Error:"+err),this.notify(err)},OTR.prototype.notify=function(err,severity){this.trigger("error",[err,severity||"error"])},OTR.prototype.sendStored=function(){var self=this;this.storedMgs.splice(0).forEach(function(elem){var msg=self.prepareMsg(elem.msg);self.io(msg,elem.meta)})},OTR.prototype.sendFile=function(filename){if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED)return this.notify("Not ready to encrypt.");if(this.ake.otr_version!==CONST.OTR_VERSION_3)return this.notify("Protocol v3 required.");if(!filename)return this.notify("Please specify a filename.");var l1name=CryptoJS.enc.Utf8.parse(filename);if(l1name=l1name.toString(CryptoJS.enc.Latin1),l1name.length>=65532)return this.notify("Filename is too long.");var msg="\x00";msg+="\x00\b",msg+=HLP.packSHORT(4+l1name.length),msg+="\x00\x00\x00",msg+=l1name,msg=this.prepareMsg(msg,filename),this.io(msg)},OTR.prototype.endOtr=function(cb){this.msgstate===CONST.MSGSTATE_ENCRYPTED&&("function"==typeof cb&&(cb=new OTRCB(cb)),this.sendMsg("\x00\x00\x00\x00",cb),this.sm&&(this.smw&&this.sm.worker.terminate(),this.sm=null)),this.msgstate=CONST.MSGSTATE_PLAINTEXT,this.receivedPlaintext=!1,this.trigger("status",[CONST.STATUS_END_OTR])},OTR.makeInstanceTag=function(){var num=BigInt.randBigInt(32);return BigInt.greater(BigInt.str2bigInt("100",16),num)?OTR.makeInstanceTag():HLP.packINT(parseInt(BigInt.bigInt2str(num,10),10))}}.call(this),{OTR:this.OTR,DSA:this.DSA}});
+case CONST.SMPSTATE_EXPECT2:if(HLP.debug.call(this,"smp tlv 3"),ms=HLP.readLen(msg.msg.substr(0,4)),11!==ms)return this.abort();if(msg=HLP.unpackMPIs(11,msg.msg.substring(4)),!(HLP.checkGroup(msg[0],N_MINUS_2)&&HLP.checkGroup(msg[3],N_MINUS_2)&&HLP.checkGroup(msg[6],N_MINUS_2)&&HLP.checkGroup(msg[7],N_MINUS_2)))return this.abort();if(!HLP.ZKP(3,msg[1],HLP.multPowMod(G,msg[2],msg[0],msg[1],N)))return this.abort();if(!HLP.ZKP(4,msg[4],HLP.multPowMod(G,msg[5],msg[3],msg[4],N)))return this.abort();if(this.g3ao=msg[3],this.computeGs(msg[0],msg[3]),t1=HLP.multPowMod(this.g3,msg[9],msg[6],msg[8],N),t2=HLP.multPowMod(G,msg[9],this.g2,msg[10],N),t2=BigInt.multMod(t2,BigInt.powMod(msg[7],msg[8],N),N),!HLP.ZKP(5,msg[8],t1,t2))return this.abort();var r4=HLP.randomExponent();this.computePQ(r4);var r5=HLP.randomExponent(),r6=HLP.randomExponent(),tmp=HLP.multPowMod(G,r5,this.g2,r6,N),cP=HLP.smpHash(6,BigInt.powMod(this.g3,r5,N),tmp),d5=this.computeD(r5,r4,cP),d6=this.computeD(r6,this.secret,cP);this.QoQ=BigInt.divMod(this.q,msg[7],N),this.PoP=BigInt.divMod(this.p,msg[6],N),this.computeR(),r7=HLP.randomExponent(),tmp2=BigInt.powMod(this.QoQ,r7,N),cR=HLP.smpHash(7,BigInt.powMod(G,r7,N),tmp2),d7=this.computeD(r7,this.a3,cR),this.smpstate=CONST.SMPSTATE_EXPECT4,send=HLP.packINT(8)+HLP.packMPIs([this.p,this.q,cP,d5,d6,this.r,cR,d7]),send=HLP.packTLV(4,send);break;case CONST.SMPSTATE_EXPECT3:if(HLP.debug.call(this,"smp tlv 4"),ms=HLP.readLen(msg.msg.substr(0,4)),8!==ms)return this.abort();if(msg=HLP.unpackMPIs(8,msg.msg.substring(4)),!HLP.checkGroup(msg[0],N_MINUS_2)||!HLP.checkGroup(msg[1],N_MINUS_2)||!HLP.checkGroup(msg[5],N_MINUS_2))return this.abort();if(t1=HLP.multPowMod(this.g3,msg[3],msg[0],msg[2],N),t2=HLP.multPowMod(G,msg[3],this.g2,msg[4],N),t2=BigInt.multMod(t2,BigInt.powMod(msg[1],msg[2],N),N),!HLP.ZKP(6,msg[2],t1,t2))return this.abort();if(t3=HLP.multPowMod(G,msg[7],this.g3ao,msg[6],N),this.QoQ=BigInt.divMod(msg[1],this.q,N),t4=HLP.multPowMod(this.QoQ,msg[7],msg[5],msg[6],N),!HLP.ZKP(7,msg[6],t3,t4))return this.abort();this.computeR(),r7=HLP.randomExponent(),tmp2=BigInt.powMod(this.QoQ,r7,N),cR=HLP.smpHash(8,BigInt.powMod(G,r7,N),tmp2),d7=this.computeD(r7,this.a3,cR),send=HLP.packINT(3)+HLP.packMPIs([this.r,cR,d7]),send=HLP.packTLV(5,send),rab=this.computeRab(msg[5]),trust=!!BigInt.equals(rab,BigInt.divMod(msg[0],this.p,N)),this.trigger("trust",[trust,"answered"]),this.init();break;case CONST.SMPSTATE_EXPECT4:return HLP.debug.call(this,"smp tlv 5"),ms=HLP.readLen(msg.msg.substr(0,4)),3!==ms?this.abort():(msg=HLP.unpackMPIs(3,msg.msg.substring(4)),HLP.checkGroup(msg[0],N_MINUS_2)?(t3=HLP.multPowMod(G,msg[2],this.g3ao,msg[1],N),t4=HLP.multPowMod(this.QoQ,msg[2],msg[0],msg[1],N),HLP.ZKP(8,msg[1],t3,t4)?(rab=this.computeRab(msg[0]),trust=!!BigInt.equals(rab,this.PoP),this.trigger("trust",[trust,"asked"]),void this.init()):this.abort()):this.abort())}this.sendMsg(send)},SM.prototype.sendMsg=function(send){this.trigger("send",[this.ssid,"\x00"+send])},SM.prototype.rcvSecret=function(secret,question){HLP.debug.call(this,"receive secret");var fn,our=!1;this.smpstate===CONST.SMPSTATE_EXPECT0?fn=this.answer:(fn=this.initiate,our=!0),this.makeSecret(our,secret),fn.call(this,question)},SM.prototype.answer=function(){HLP.debug.call(this,"smp answer");var r4=HLP.randomExponent();this.computePQ(r4);var r5=HLP.randomExponent(),r6=HLP.randomExponent(),tmp=HLP.multPowMod(G,r5,this.g2,r6,N),cP=HLP.smpHash(5,BigInt.powMod(this.g3,r5,N),tmp),d5=this.computeD(r5,r4,cP),d6=this.computeD(r6,this.secret,cP);this.smpstate=CONST.SMPSTATE_EXPECT3;var send=HLP.packINT(11)+HLP.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3,this.p,this.q,cP,d5,d6]);this.sendMsg(HLP.packTLV(3,send))},SM.prototype.initiate=function(question){HLP.debug.call(this,"smp initiate"),this.smpstate!==CONST.SMPSTATE_EXPECT1&&this.abort(),this.makeG2s();var r2=HLP.randomExponent(),r3=HLP.randomExponent();this.c2=this.computeC(1,r2),this.c3=this.computeC(2,r3),this.d2=this.computeD(r2,this.a2,this.c2),this.d3=this.computeD(r3,this.a3,this.c3),this.smpstate=CONST.SMPSTATE_EXPECT2;var send="",type=2;question&&(send+=question,send+="\x00",type=7),send+=HLP.packINT(6)+HLP.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3]),this.sendMsg(HLP.packTLV(type,send))},SM.prototype.abort=function(){this.init(),this.sendMsg(HLP.packTLV(6,"")),this.trigger("abort")}}.call(this),function(){"use strict";function OTRCB(cb){this.cb=cb}function OTR(options){if(!(this instanceof OTR))return new OTR(options);if(options=options||{},options.priv&&!(options.priv instanceof DSA))throw new Error("Requires long-lived DSA key.");if(this.priv=options.priv?options.priv:new DSA,this.fragment_size=options.fragment_size||0,this.fragment_size<0)throw new Error("Fragment size must be a positive integer.");if(this.send_interval=options.send_interval||0,this.send_interval<0)throw new Error("Send interval must be a positive integer.");this.outgoing=[],this.our_instance_tag=options.instance_tag||OTR.makeInstanceTag(),this.debug=!!options.debug,this.smw=options.smw,this.init();var self=this;["sendMsg","receiveMsg"].forEach(function(meth){self[meth]=self[meth].bind(self)}),EventEmitter.call(this)}var CryptoJS,BigInt,EventEmitter,Worker,SMWPath,CONST,HLP,Parse,AKE,SM,DSA,root=this;"undefined"!=typeof module&&module.exports?(module.exports=OTR,CryptoJS=require("../vendor/crypto.js"),BigInt=require("../vendor/bigint.js"),EventEmitter=require("../vendor/eventemitter.js"),SMWPath=require("path").join(__dirname,"/sm-webworker.js"),CONST=require("./const.js"),HLP=require("./helpers.js"),Parse=require("./parse.js"),AKE=require("./ake.js"),SM=require("./sm.js"),DSA=require("./dsa.js"),OTR.CONST=CONST):(Object.keys(root.OTR).forEach(function(k){OTR[k]=root.OTR[k]}),root.OTR=OTR,CryptoJS=root.CryptoJS,BigInt=root.BigInt,EventEmitter=root.EventEmitter,Worker=root.Worker,SMWPath="sm-webworker.js",CONST=OTR.CONST,HLP=OTR.HLP,Parse=OTR.Parse,AKE=OTR.AKE,SM=OTR.SM,DSA=root.DSA);var G=BigInt.str2bigInt(CONST.G,10),N=BigInt.str2bigInt(CONST.N,16),MAX_INT=Math.pow(2,53)-1,MAX_UINT=Math.pow(2,31)-1;HLP.extend(OTR,EventEmitter),OTR.prototype.init=function(){this.msgstate=CONST.MSGSTATE_PLAINTEXT,this.authstate=CONST.AUTHSTATE_NONE,this.ALLOW_V2=!0,this.ALLOW_V3=!0,this.REQUIRE_ENCRYPTION=!1,this.SEND_WHITESPACE_TAG=!1,this.WHITESPACE_START_AKE=!1,this.ERROR_START_AKE=!1,Parse.initFragment(this),this.their_y=null,this.their_old_y=null,this.their_keyid=0,this.their_priv_pk=null,this.their_instance_tag="\x00\x00\x00\x00",this.our_dh=this.dh(),this.our_old_dh=this.dh(),this.our_keyid=2,this.sessKeys=[new Array(2),new Array(2)],this.storedMgs=[],this.oldMacKeys=[],this.sm=null,this._akeInit(),this.receivedPlaintext=!1},OTR.prototype._akeInit=function(){this.ake=new AKE(this),this.transmittedRS=!1,this.ssid=null},OTR.prototype._SMW=function(otr,reqs){this.otr=otr;var opts={path:SMWPath,seed:BigInt.getSeed};"object"==typeof otr.smw&&Object.keys(otr.smw).forEach(function(k){opts[k]=otr.smw[k]}),"undefined"!=typeof module&&module.exports&&(Worker=require("webworker-threads").Worker),this.worker=new Worker(opts.path);var self=this;this.worker.onmessage=function(e){var d=e.data;d&&self.trigger(d.method,d.args)},this.worker.postMessage({type:"seed",seed:opts.seed(),imports:opts.imports}),this.worker.postMessage({type:"init",reqs:reqs})},HLP.extend(OTR.prototype._SMW,EventEmitter),["handleSM","rcvSecret","abort"].forEach(function(m){OTR.prototype._SMW.prototype[m]=function(){this.worker.postMessage({type:"method",method:m,args:Array.prototype.slice.call(arguments,0)})}}),OTR.prototype._smInit=function(){var reqs={ssid:this.ssid,our_fp:this.priv.fingerprint(),their_fp:this.their_priv_pk.fingerprint(),debug:this.debug};this.smw?(this.sm&&this.sm.worker.terminate(),this.sm=new this._SMW(this,reqs)):this.sm=new SM(reqs);var self=this;["trust","abort","question"].forEach(function(e){self.sm.on(e,function(){self.trigger("smp",[e].concat(Array.prototype.slice.call(arguments)))})}),this.sm.on("send",function(ssid,send){self.ssid===ssid&&(send=self.prepareMsg(send),self.io(send))})},OTR.prototype.io=function(msg,meta){msg=[].concat(msg).map(function(m){return{msg:m,meta:meta}}),this.outgoing=this.outgoing.concat(msg);var self=this;!function send(first){if(!first){if(!self.outgoing.length)return;var elem=self.outgoing.shift(),cb=null;elem.meta instanceof OTRCB&&(cb=elem.meta.cb,elem.meta=null),self.trigger("io",[elem.msg,elem.meta]),cb&&cb()}setTimeout(send,first?0:self.send_interval)}(!0)},OTR.prototype.dh=function(){var keys={privateKey:BigInt.randBigInt(320)};return keys.publicKey=BigInt.powMod(G,keys.privateKey,N),keys},OTR.prototype.DHSession=function DHSession(our_dh,their_y){if(!(this instanceof DHSession))return new DHSession(our_dh,their_y);var s=BigInt.powMod(their_y,our_dh.privateKey,N),secbytes=HLP.packMPI(s);this.id=HLP.mask(HLP.h2("\x00",secbytes),0,64);var sq=BigInt.greater(our_dh.publicKey,their_y),sendbyte=sq?"":"",rcvbyte=sq?"":"";this.sendenc=HLP.mask(HLP.h1(sendbyte,secbytes),0,128),this.sendmac=CryptoJS.SHA1(CryptoJS.enc.Latin1.parse(this.sendenc)),this.sendmac=this.sendmac.toString(CryptoJS.enc.Latin1),this.rcvenc=HLP.mask(HLP.h1(rcvbyte,secbytes),0,128),this.rcvmac=CryptoJS.SHA1(CryptoJS.enc.Latin1.parse(this.rcvenc)),this.rcvmac=this.rcvmac.toString(CryptoJS.enc.Latin1),this.rcvmacused=!1,this.extra_symkey=HLP.h2("ÿ",secbytes),this.send_counter=0,this.rcv_counter=0},OTR.prototype.rotateOurKeys=function(){var self=this;this.sessKeys[1].forEach(function(sk){sk&&sk.rcvmacused&&self.oldMacKeys.push(sk.rcvmac)}),this.our_old_dh=this.our_dh,this.our_dh=this.dh(),this.our_keyid+=1,this.sessKeys[1][0]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[0][1],this.sessKeys[0]=[this.their_y?new this.DHSession(this.our_dh,this.their_y):null,this.their_old_y?new this.DHSession(this.our_dh,this.their_old_y):null]},OTR.prototype.rotateTheirKeys=function(their_y){this.their_keyid+=1;var self=this;this.sessKeys.forEach(function(sk){sk[1]&&sk[1].rcvmacused&&self.oldMacKeys.push(sk[1].rcvmac)}),this.their_old_y=this.their_y,this.sessKeys[0][1]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[1][0],this.their_y=their_y,this.sessKeys[0][0]=new this.DHSession(this.our_dh,this.their_y),this.sessKeys[1][0]=new this.DHSession(this.our_old_dh,this.their_y)},OTR.prototype.prepareMsg=function(msg,esk){if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED||0===this.their_keyid)return this.notify("Not ready to encrypt.");var sessKeys=this.sessKeys[1][0];if(sessKeys.send_counter>=MAX_INT)return this.notify("Should have rekeyed by now.");sessKeys.send_counter+=1;var ctr=HLP.packCtr(sessKeys.send_counter),send=this.ake.otr_version+"",v3=this.ake.otr_version===CONST.OTR_VERSION_3;if(v3&&(send+=this.our_instance_tag,send+=this.their_instance_tag),send+="\x00",send+=HLP.packINT(this.our_keyid-1),send+=HLP.packINT(this.their_keyid),send+=HLP.packMPI(this.our_dh.publicKey),send+=ctr.substring(0,8),Math.ceil(msg.length/8)>=MAX_UINT)return this.notify("Message is too long.");var aes=HLP.encryptAes(CryptoJS.enc.Latin1.parse(msg),sessKeys.sendenc,ctr);return send+=HLP.packData(aes),send+=HLP.make1Mac(send,sessKeys.sendmac),send+=HLP.packData(this.oldMacKeys.splice(0).join("")),send=HLP.wrapMsg(send,this.fragment_size,v3,this.our_instance_tag,this.their_instance_tag),send[0]?this.notify(send[0]):(esk&&this.trigger("file",["send",sessKeys.extra_symkey,esk]),send[1])},OTR.prototype.handleDataMsg=function(msg){var vt=msg.version+msg.type;this.ake.otr_version===CONST.OTR_VERSION_3&&(vt+=msg.instance_tags);var types=["BYTE","INT","INT","MPI","CTR","DATA","MAC","DATA"];msg=HLP.splitype(types,msg.msg);var ign=""===msg[0];if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED||8!==msg.length)return void(ign||this.error("Received an unreadable encrypted message."));var our_keyid=this.our_keyid-HLP.readLen(msg[2]),their_keyid=this.their_keyid-HLP.readLen(msg[1]);if(0>our_keyid||our_keyid>1)return void(ign||this.error("Not of our latest keys."));if(0>their_keyid||their_keyid>1)return void(ign||this.error("Not of your latest keys."));var their_y=their_keyid?this.their_old_y:this.their_y;if(1===their_keyid&&!their_y)return void(ign||this.error("Do not have that key."));var sessKeys=this.sessKeys[our_keyid][their_keyid],ctr=HLP.unpackCtr(msg[4]);if(ctr<=sessKeys.rcv_counter)return void(ign||this.error("Counter in message is not larger."));sessKeys.rcv_counter=ctr,vt+=msg.slice(0,6).join("");var vmac=HLP.make1Mac(vt,sessKeys.rcvmac);if(!HLP.compare(msg[6],vmac))return void(ign||this.error("MACs do not match."));sessKeys.rcvmacused=!0;var out=HLP.decryptAes(msg[5].substring(4),sessKeys.rcvenc,HLP.padCtr(msg[4]));out=out.toString(CryptoJS.enc.Latin1),our_keyid||this.rotateOurKeys(),their_keyid||this.rotateTheirKeys(HLP.readMPI(msg[3]));var ind=out.indexOf("\x00");return~ind&&(this.handleTLVs(out.substring(ind+1),sessKeys),out=out.substring(0,ind)),out=CryptoJS.enc.Latin1.parse(out),out.toString(CryptoJS.enc.Utf8)},OTR.prototype.handleTLVs=function(tlvs,sessKeys){for(var type,len,msg;tlvs.length&&(type=HLP.unpackSHORT(tlvs.substr(0,2)),len=HLP.unpackSHORT(tlvs.substr(2,2)),msg=tlvs.substr(4,len),!(msg.length<len));){switch(type){case 1:this.msgstate=CONST.MSGSTATE_FINISHED,this.trigger("status",[CONST.STATUS_END_OTR]);break;case 2:case 3:case 4:case 5:case 6:case 7:if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED)return void(this.sm&&this.sm.abort());this.sm||this._smInit(),this.sm.handleSM({msg:msg,type:type});break;case 8:msg=msg.substring(4),msg=CryptoJS.enc.Latin1.parse(msg),msg=msg.toString(CryptoJS.enc.Utf8),this.trigger("file",["receive",sessKeys.extra_symkey,msg])}tlvs=tlvs.substring(4+len)}},OTR.prototype.smpSecret=function(secret,question){return this.msgstate!==CONST.MSGSTATE_ENCRYPTED?this.notify("Must be encrypted for SMP."):"string"!=typeof secret||secret.length<1?this.notify("Secret is required."):(this.sm||this._smInit(),secret=CryptoJS.enc.Utf8.parse(secret).toString(CryptoJS.enc.Latin1),question&&(question=CryptoJS.enc.Utf8.parse(question).toString(CryptoJS.enc.Latin1)),void this.sm.rcvSecret(secret,question))},OTR.prototype.sendQueryMsg=function(){var versions={},msg=CONST.OTR_TAG;this.ALLOW_V2&&(versions[2]=!0),this.ALLOW_V3&&(versions[3]=!0);var vs=Object.keys(versions);vs.length&&(msg+="v",vs.forEach(function(v){"1"!==v&&(msg+=v)}),msg+="?"),this.io(msg),this.trigger("status",[CONST.STATUS_SEND_QUERY])},OTR.prototype.sendMsg=function(msg,meta){switch((this.REQUIRE_ENCRYPTION||this.msgstate!==CONST.MSGSTATE_PLAINTEXT)&&(msg=CryptoJS.enc.Utf8.parse(msg),msg=msg.toString(CryptoJS.enc.Latin1)),this.msgstate){case CONST.MSGSTATE_PLAINTEXT:if(this.REQUIRE_ENCRYPTION)return this.storedMgs.push({msg:msg,meta:meta}),void this.sendQueryMsg();this.SEND_WHITESPACE_TAG&&!this.receivedPlaintext&&(msg+=CONST.WHITESPACE_TAG,this.ALLOW_V3&&(msg+=CONST.WHITESPACE_TAG_V3),this.ALLOW_V2&&(msg+=CONST.WHITESPACE_TAG_V2));break;case CONST.MSGSTATE_FINISHED:return this.storedMgs.push({msg:msg,meta:meta}),void this.notify("Message cannot be sent at this time.","warn");case CONST.MSGSTATE_ENCRYPTED:msg=this.prepareMsg(msg);break;default:throw new Error("Unknown message state.")}msg&&this.io(msg,meta)},OTR.prototype.receiveMsg=function(msg,meta){if(msg=Parse.parseMsg(this,msg)){switch(msg.cls){case"error":return void this.notify(msg.msg);case"ake":return msg.version===CONST.OTR_VERSION_3&&this.checkInstanceTags(msg.instance_tags)?void this.notify("Received a message intended for a different session.","warn"):void this.ake.handleAKE(msg);case"data":if(msg.version===CONST.OTR_VERSION_3&&this.checkInstanceTags(msg.instance_tags))return void this.notify("Received a message intended for a different session.","warn");msg.msg=this.handleDataMsg(msg),msg.encrypted=!0;break;case"query":this.msgstate===CONST.MSGSTATE_ENCRYPTED&&this._akeInit(),this.doAKE(msg);break;default:(this.REQUIRE_ENCRYPTION||this.msgstate!==CONST.MSGSTATE_PLAINTEXT)&&this.notify("Received an unencrypted message.","warn"),this.receivedPlaintext=!0,this.WHITESPACE_START_AKE&&msg.ver.length>0&&this.doAKE(msg)}msg.msg&&this.trigger("ui",[msg.msg,!!msg.encrypted,meta])}},OTR.prototype.checkInstanceTags=function(it){var their_it=HLP.readLen(it.substr(0,4)),our_it=HLP.readLen(it.substr(4,4));if(our_it&&our_it!==HLP.readLen(this.our_instance_tag))return!0;if(HLP.readLen(this.their_instance_tag)){if(HLP.readLen(this.their_instance_tag)!==their_it)return!0}else{if(100>their_it)return!0;this.their_instance_tag=HLP.packINT(their_it)}},OTR.prototype.doAKE=function(msg){this.ALLOW_V3&&~msg.ver.indexOf(CONST.OTR_VERSION_3)?this.ake.initiateAKE(CONST.OTR_VERSION_3):this.ALLOW_V2&&~msg.ver.indexOf(CONST.OTR_VERSION_2)?this.ake.initiateAKE(CONST.OTR_VERSION_2):this.notify("OTR conversation requested, but no compatible protocol version found.","warn")},OTR.prototype.error=function(err){this.debug||(err="An OTR error has occurred."),this.io("?OTR Error:"+err),this.notify(err)},OTR.prototype.notify=function(err,severity){this.trigger("error",[err,severity||"error"])},OTR.prototype.sendStored=function(){var self=this;this.storedMgs.splice(0).forEach(function(elem){var msg=self.prepareMsg(elem.msg);self.io(msg,elem.meta)})},OTR.prototype.sendFile=function(filename){if(this.msgstate!==CONST.MSGSTATE_ENCRYPTED)return this.notify("Not ready to encrypt.");if(this.ake.otr_version!==CONST.OTR_VERSION_3)return this.notify("Protocol v3 required.");if(!filename)return this.notify("Please specify a filename.");var l1name=CryptoJS.enc.Utf8.parse(filename);if(l1name=l1name.toString(CryptoJS.enc.Latin1),l1name.length>=65532)return this.notify("Filename is too long.");var msg="\x00";msg+="\x00\b",msg+=HLP.packSHORT(4+l1name.length),msg+="\x00\x00\x00",msg+=l1name,msg=this.prepareMsg(msg,filename),this.io(msg)},OTR.prototype.endOtr=function(cb){this.msgstate===CONST.MSGSTATE_ENCRYPTED&&("function"==typeof cb&&(cb=new OTRCB(cb)),this.sendMsg("\x00\x00\x00\x00",cb),this.sm&&(this.smw&&this.sm.worker.terminate(),this.sm=null)),this.msgstate=CONST.MSGSTATE_PLAINTEXT,this.receivedPlaintext=!1,this.trigger("status",[CONST.STATUS_END_OTR])},OTR.makeInstanceTag=function(){var num=BigInt.randBigInt(32);return BigInt.greater(BigInt.str2bigInt("100",16),num)?OTR.makeInstanceTag():HLP.packINT(parseInt(BigInt.bigInt2str(num,10),10))}}.call(this),{OTR:this.OTR,DSA:this.DSA}}),!function(){function a(a,b){if(!b||"function"==typeof b)return a;for(var c in b)a[c]=b[c];return a}function b(a,c){for(var d in c)d in a?b(a[d],c[d]):a[d]=c[d];return a}function c(a,b,c){var d,e=0,f=a.length,g=void 0===f||"[object Array]"!==Object.prototype.toString.apply(a)||"function"==typeof a;if(c)if(g){for(d in a)if(b.apply(a[d],c)===!1)break}else for(;f>e&&b.apply(a[e++],c)!==!1;);else if(g){for(d in a)if(b.call(a[d],d,a[d])===!1)break}else for(;f>e&&b.call(a[e],e,a[e++])!==!1;);return a}function d(a){return"string"==typeof a?a.replace(/[&<>"'\/]/g,function(a){return Q[a]}):a}function e(a){var b=function(a){if(window.XMLHttpRequest)return a(null,new XMLHttpRequest);if(window.ActiveXObject)try{return a(null,new ActiveXObject("Msxml2.XMLHTTP"))}catch(b){return a(null,new ActiveXObject("Microsoft.XMLHTTP"))}return a(new Error)},c=function(a){if("string"==typeof a)return a;var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")},d=function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(192|d>>6),b+=String.fromCharCode(128|63&d)):(b+=String.fromCharCode(224|d>>12),b+=String.fromCharCode(128|63&d>>6),b+=String.fromCharCode(128|63&d))}return b},e=function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";a=d(a);var c,e,f,g,h,i,j,k="",l=0;do c=a.charCodeAt(l++),e=a.charCodeAt(l++),f=a.charCodeAt(l++),g=c>>2,h=(3&c)<<4|e>>4,i=(15&e)<<2|f>>6,j=63&f,isNaN(e)?i=j=64:isNaN(f)&&(j=64),k+=b.charAt(g)+b.charAt(h)+b.charAt(i)+b.charAt(j),c=e=f="",g=h=i=j="";while(l<a.length);return k},f=function(){for(var a=arguments[0],b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}return a},g=function(a,d,e,h){"function"==typeof e&&(h=e,e={}),e.cache=e.cache||!1,e.data=e.data||{},e.headers=e.headers||{},e.jsonp=e.jsonp||!1,e.async=void 0===e.async?!0:e.async;var i,j=f({accept:"*/*","content-type":"application/x-www-form-urlencoded;charset=UTF-8"},g.headers,e.headers);if(i="application/json"===j["content-type"]?JSON.stringify(e.data):c(e.data),"GET"===a){var k=[];if(i&&(k.push(i),i=null),e.cache||k.push("_="+(new Date).getTime()),e.jsonp&&(k.push("callback="+e.jsonp),k.push("jsonp="+e.jsonp)),k=k.join("&"),k.length>1&&(d+=d.indexOf("?")>-1?"&"+k:"?"+k),e.jsonp){var l=document.getElementsByTagName("head")[0],m=document.createElement("script");return m.type="text/javascript",m.src=d,void l.appendChild(m)}}b(function(b,c){if(b)return h(b);c.open(a,d,e.async);for(var f in j)j.hasOwnProperty(f)&&c.setRequestHeader(f,j[f]);c.onreadystatechange=function(){if(4===c.readyState){var a=c.responseText||"";if(!h)return;h(c.status,{text:function(){return a},json:function(){try{return JSON.parse(a)}catch(b){return T.error("Can not parse JSON. URL: "+d),{}}}})}},c.send(i)})},h={authBasic:function(a,b){g.headers.Authorization="Basic "+e(a+":"+b)},connect:function(a,b,c){return g("CONNECT",a,b,c)},del:function(a,b,c){return g("DELETE",a,b,c)},get:function(a,b,c){return g("GET",a,b,c)},head:function(a,b,c){return g("HEAD",a,b,c)},headers:function(a){g.headers=a||{}},isAllowed:function(a,b,c){this.options(a,function(a,d){c(-1!==d.text().indexOf(b))})},options:function(a,b,c){return g("OPTIONS",a,b,c)},patch:function(a,b,c){return g("PATCH",a,b,c)},post:function(a,b,c){return g("POST",a,b,c)},put:function(a,b,c){return g("PUT",a,b,c)},trace:function(a,b,c){return g("TRACE",a,b,c)}},i=a.type?a.type.toLowerCase():"get";h[i](a.url,a,function(b,c){200===b||0===b&&c.text()?a.success(c.json(),b,null):a.error(c.text(),b,null)})}function f(a,b){"function"==typeof a&&(b=a,a={}),a=a||{},T.extend(P,a),delete P.fixLng,P.functions&&(delete P.functions,T.extend(T,a.functions)),"string"==typeof P.ns&&(P.ns={namespaces:[P.ns],defaultNs:P.ns}),"string"==typeof P.fallbackNS&&(P.fallbackNS=[P.fallbackNS]),("string"==typeof P.fallbackLng||"boolean"==typeof P.fallbackLng)&&(P.fallbackLng=[P.fallbackLng]),P.interpolationPrefixEscaped=T.regexEscape(P.interpolationPrefix),P.interpolationSuffixEscaped=T.regexEscape(P.interpolationSuffix),P.lng||(P.lng=T.detectLanguage()),L=T.toLanguages(P.lng),F=L[0],T.log("currentLng set to: "+F),P.useCookie&&T.cookie.read(P.cookieName)!==F&&T.cookie.create(P.cookieName,F,P.cookieExpirationTime,P.cookieDomain),P.detectLngFromLocalStorage&&"undefined"!=typeof document&&window.localStorage&&T.localStorage.setItem("i18next_lng",F);var c=z;a.fixLng&&(c=function(a,b){return b=b||{},b.lng=b.lng||c.lng,z(a,b)},c.lng=F),W.setCurrentLng(F),H&&P.setJqueryExt&&s();var d;if(H&&H.Deferred&&(d=H.Deferred()),!P.resStore){var e=T.toLanguages(P.lng);"string"==typeof P.preload&&(P.preload=[P.preload]);for(var f=0,g=P.preload.length;g>f;f++)for(var h=T.toLanguages(P.preload[f]),i=0,j=h.length;j>i;i++)e.indexOf(h[i])<0&&e.push(h[i]);return I.sync.load(e,P,function(a,e){J=e,M=!0,b&&b(c),d&&d.resolve(c)}),d?d.promise():void 0}return J=P.resStore,M=!0,b&&b(c),d&&d.resolve(c),d?d.promise():void 0}function g(a,b){"string"==typeof a&&(a=[a]);for(var c=0,d=a.length;d>c;c++)P.preload.indexOf(a[c])<0&&P.preload.push(a[c]);return f(b)}function h(a,b,c,d){"string"!=typeof b?(c=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b),J[a]=J[a]||{},J[a][b]=J[a][b]||{},d?T.deepExtend(J[a][b],c):T.extend(J[a][b],c)}function i(a,b){"string"!=typeof b&&(b=P.ns.defaultNs),J[a]=J[a]||{};var c=J[a][b]||{},d=!1;for(var e in c)c.hasOwnProperty(e)&&(d=!0);return d}function j(a,b){"string"!=typeof b&&(b=P.ns.defaultNs),J[a]=J[a]||{},J[a][b]={}}function k(a,b,c,d){"string"!=typeof b?(resource=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b),J[a]=J[a]||{},J[a][b]=J[a][b]||{};for(var e=c.split(P.keyseparator),f=0,g=J[a][b];e[f];)f==e.length-1?g[e[f]]=d:(null==g[e[f]]&&(g[e[f]]={}),g=g[e[f]]),f++}function l(a,b,c){"string"!=typeof b?(resource=b,b=P.ns.defaultNs):P.ns.namespaces.indexOf(b)<0&&P.ns.namespaces.push(b);for(var d in c)"string"==typeof c[d]&&k(a,b,d,c[d])}function m(a){P.ns.defaultNs=a}function n(a,b){o([a],b)}function o(a,b){var c={dynamicLoad:P.dynamicLoad,resGetPath:P.resGetPath,getAsync:P.getAsync,customLoad:P.customLoad,ns:{namespaces:a,defaultNs:""}},d=T.toLanguages(P.lng);"string"==typeof P.preload&&(P.preload=[P.preload]);for(var e=0,f=P.preload.length;f>e;e++)for(var g=T.toLanguages(P.preload[e]),h=0,i=g.length;i>h;h++)d.indexOf(g[h])<0&&d.push(g[h]);for(var j=[],k=0,l=d.length;l>k;k++){var m=!1,n=J[d[k]];if(n)for(var o=0,p=a.length;p>o;o++)n[a[o]]||(m=!0);else m=!0;m&&j.push(d[k])}j.length?I.sync._fetch(j,c,function(c,d){var e=a.length*j.length;T.each(a,function(a,c){P.ns.namespaces.indexOf(c)<0&&P.ns.namespaces.push(c),T.each(j,function(a,f){J[f]=J[f]||{},J[f][c]=d[f][c],e--,0===e&&b&&(P.useLocalStorage&&I.sync._storeLocal(J),b())})})}):b&&b()}function p(a,b,c){return"function"==typeof b?(c=b,b={}):b||(b={}),b.lng=a,f(b,c)}function q(){return F}function r(a){J={},p(F,a)}function s(){function a(a,b,c){if(0!==b.length){var d="text";if(0===b.indexOf("[")){var e=b.split("]");b=e[1],d=e[0].substr(1,e[0].length-1)}b.indexOf(";")===b.length-1&&(b=b.substr(0,b.length-2));var f;if("html"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.html(H.t(b,f));else if("text"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.text()},c):c,a.text(H.t(b,f));else if("prepend"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.prepend(H.t(b,f));else if("append"===d)f=P.defaultValueFromContent?H.extend({defaultValue:a.html()},c):c,a.append(H.t(b,f));else if(0===d.indexOf("data-")){var g=d.substr("data-".length);f=P.defaultValueFromContent?H.extend({defaultValue:a.data(g)},c):c;var h=H.t(b,f);a.data(g,h),a.attr(d,h)}else f=P.defaultValueFromContent?H.extend({defaultValue:a.attr(d)},c):c,a.attr(d,H.t(b,f))}}function b(b,c){var d=b.attr(P.selectorAttr);if(d||"undefined"==typeof d||d===!1||(d=b.text()||b.val()),d){var e=b,f=b.data("i18n-target");if(f&&(e=b.find(f)||b),c||P.useDataAttrOptions!==!0||(c=b.data("i18n-options")),c=c||{},d.indexOf(";")>=0){var g=d.split(";");H.each(g,function(b,d){""!==d&&a(e,d,c)})}else a(e,d,c);P.useDataAttrOptions===!0&&b.data("i18n-options",c)}}H.t=H.t||z,H.fn.i18n=function(a){return this.each(function(){b(H(this),a);var c=H(this).find("["+P.selectorAttr+"]");c.each(function(){b(H(this),a)})})}}function t(a,b,c,d){if(!a)return a;if(d=d||b,a.indexOf(d.interpolationPrefix||P.interpolationPrefix)<0)return a;var e=d.interpolationPrefix?T.regexEscape(d.interpolationPrefix):P.interpolationPrefixEscaped,f=d.interpolationSuffix?T.regexEscape(d.interpolationSuffix):P.interpolationSuffixEscaped,g="HTML"+f,h=b.replace&&"object"==typeof b.replace?b.replace:b;return T.each(h,function(b,h){var i=c?c+P.keyseparator+b:b;"object"==typeof h&&null!==h?a=t(a,h,i,d):d.escapeInterpolation||P.escapeInterpolation?(a=a.replace(new RegExp([e,i,g].join(""),"g"),T.regexReplacementEscape(h)),a=a.replace(new RegExp([e,i,f].join(""),"g"),T.regexReplacementEscape(T.escape(h)))):a=a.replace(new RegExp([e,i,f].join(""),"g"),T.regexReplacementEscape(h))}),a}function u(a,b){var c=",",d="{",e="}",f=T.extend({},b);for(delete f.postProcess;-1!=a.indexOf(P.reusePrefix)&&(K++,!(K>P.maxRecursion));){var g=a.lastIndexOf(P.reusePrefix),h=a.indexOf(P.reuseSuffix,g)+P.reuseSuffix.length,i=a.substring(g,h),j=i.replace(P.reusePrefix,"").replace(P.reuseSuffix,"");if(g>=h)return T.error("there is an missing closing in following translation value",a),"";if(-1!=j.indexOf(c)){var k=j.indexOf(c);if(-1!=j.indexOf(d,k)&&-1!=j.indexOf(e,k)){var l=j.indexOf(d,k),m=j.indexOf(e,l)+e.length;try{f=T.extend(f,JSON.parse(j.substring(l,m))),j=j.substring(0,k)}catch(n){}}}var o=C(j,f);a=a.replace(i,T.regexReplacementEscape(o))}return a}function v(a){return a.context&&("string"==typeof a.context||"number"==typeof a.context)}function w(a){return void 0!==a.count&&"string"!=typeof a.count}function x(a){return void 0!==a.indefinite_article&&"string"!=typeof a.indefinite_article&&a.indefinite_article}function y(a,b){b=b||{};var c=A(a,b),d=D(a,b);return void 0!==d||d===c}function z(a,b){return b=b||{},M?(K=0,C.apply(null,arguments)):(T.log("i18next not finished initialization. you might have called t function before loading resources finished."),b.defaultValue||"")}function A(a,b){return void 0!==b.defaultValue?b.defaultValue:a}function B(){for(var a=[],b=1;b<arguments.length;b++)a.push(arguments[b]);return{postProcess:"sprintf",sprintf:a}}function C(a,b){if(b&&"object"!=typeof b?"sprintf"===P.shortcutFunction?b=B.apply(null,arguments):"defaultValue"===P.shortcutFunction&&(b={defaultValue:b}):b=b||{},"object"==typeof P.defaultVariables&&(b=T.extend({},P.defaultVariables,b)),void 0===a||null===a||""===a)return"";"string"==typeof a&&(a=[a]);var c=a[0];if(a.length>1)for(var d=0;d<a.length&&(c=a[d],!y(c,b));d++);var e,f=A(c,b),g=D(c,b),h=b.lng?T.toLanguages(b.lng,b.fallbackLng):L,i=b.ns||P.ns.defaultNs;c.indexOf(P.nsseparator)>-1&&(e=c.split(P.nsseparator),i=e[0],c=e[1]),void 0===g&&P.sendMissing&&"function"==typeof P.missingKeyHandler&&(b.lng?P.missingKeyHandler(h[0],i,c,f,h):P.missingKeyHandler(P.lng,i,c,f,h));var j=b.postProcess||P.postProcess;void 0!==g&&j&&X[j]&&(g=X[j](g,c,b));var k=f;if(f.indexOf(P.nsseparator)>-1&&(e=f.split(P.nsseparator),k=e[1]),k===c&&P.parseMissingKey&&(f=P.parseMissingKey(f)),void 0===g&&(f=t(f,b),f=u(f,b),j&&X[j])){var l=A(c,b);g=X[j](l,c,b)}return void 0!==g?g:f}function D(a,b){b=b||{};var c,d,e=A(a,b),f=L;if(!J)return e;if("cimode"===f[0].toLowerCase())return e;if(b.lngs&&(f=b.lngs),b.lng&&(f=T.toLanguages(b.lng,b.fallbackLng),!J[f[0]])){var g=P.getAsync;P.getAsync=!1,I.sync.load(f,P,function(a,b){T.extend(J,b),P.getAsync=g})}var h=b.ns||P.ns.defaultNs;if(a.indexOf(P.nsseparator)>-1){var i=a.split(P.nsseparator);h=i[0],a=i[1]}if(v(b)){c=T.extend({},b),delete c.context,c.defaultValue=P.contextNotFound;var j=h+P.nsseparator+a+"_"+b.context;if(d=z(j,c),d!=P.contextNotFound)return t(d,{context:b.context})}if(w(b,f[0])){c=T.extend({lngs:[f[0]]},b),delete c.count,delete c.lng,c.defaultValue=P.pluralNotFound;var k;if(W.needsPlural(f[0],b.count)){k=h+P.nsseparator+a+P.pluralSuffix;var l=W.get(f[0],b.count);l>=0?k=k+"_"+l:1===l&&(k=h+P.nsseparator+a)}else k=h+P.nsseparator+a;if(d=z(k,c),d!=P.pluralNotFound)return t(d,{count:b.count,interpolationPrefix:b.interpolationPrefix,interpolationSuffix:b.interpolationSuffix});if(!(f.length>1))return d;var m=f.slice();if(m.shift(),b=T.extend(b,{lngs:m}),delete b.lng,d=z(h+P.nsseparator+a,b),d!=P.pluralNotFound)return d}if(x(b)){var n=T.extend({},b);delete n.indefinite_article,n.defaultValue=P.indefiniteNotFound;var o=h+P.nsseparator+a+(b.count&&!w(b,f[0])||!b.count?P.indefiniteSuffix:"");if(d=z(o,n),d!=P.indefiniteNotFound)return d}for(var p,q=a.split(P.keyseparator),r=0,s=f.length;s>r&&void 0===p;r++){for(var y=f[r],B=0,E=J[y]&&J[y][h];q[B];)E=E&&E[q[B]],B++;if(void 0!==E){var F=Object.prototype.toString.apply(E);if("string"==typeof E)E=t(E,b),E=u(E,b);else if("[object Array]"!==F||P.returnObjectTrees||b.returnObjectTrees){if(null===E&&P.fallbackOnNull===!0)E=void 0;else if(null!==E)if(P.returnObjectTrees||b.returnObjectTrees){if("[object Number]"!==F&&"[object Function]"!==F&&"[object RegExp]"!==F){var G="[object Array]"===F?[]:{};T.each(E,function(c){G[c]=C(h+P.nsseparator+a+P.keyseparator+c,b)}),E=G}}else P.objectTreeKeyHandler&&"function"==typeof P.objectTreeKeyHandler?E=P.objectTreeKeyHandler(a,E,y,h,b):(E="key '"+h+":"+a+" ("+y+")' returned an object instead of string.",T.log(E))}else E=E.join("\n"),E=t(E,b),E=u(E,b);
+"string"==typeof E&&""===E.trim()&&P.fallbackOnEmpty===!0&&(E=void 0),p=E}}if(void 0===p&&!b.isFallbackLookup&&(P.fallbackToDefaultNS===!0||P.fallbackNS&&P.fallbackNS.length>0)){if(b.isFallbackLookup=!0,P.fallbackNS.length){for(var H=0,K=P.fallbackNS.length;K>H;H++)if(p=D(P.fallbackNS[H]+P.nsseparator+a,b),p||""===p&&P.fallbackOnEmpty===!1){var M=p.indexOf(P.nsseparator)>-1?p.split(P.nsseparator)[1]:p,N=e.indexOf(P.nsseparator)>-1?e.split(P.nsseparator)[1]:e;if(M!==N)break}}else p=D(a,b);b.isFallbackLookup=!1}return p}function E(){var a,b=P.lngWhitelist||[],c=[];if("undefined"!=typeof window&&!function(){for(var a=window.location.search.substring(1),b=a.split("&"),d=0;d<b.length;d++){var e=b[d].indexOf("=");if(e>0){var f=b[d].substring(0,e);f==P.detectLngQS&&c.push(b[d].substring(e+1))}}}(),P.useCookie&&"undefined"!=typeof document){var d=T.cookie.read(P.cookieName);d&&c.push(d)}if(P.detectLngFromLocalStorage&&"undefined"!=typeof window&&window.localStorage&&c.push(window.localStorage.getItem("i18next_lng")),"undefined"!=typeof navigator){if(navigator.languages)for(var e=0;e<navigator.languages.length;e++)c.push(navigator.languages[e]);navigator.userLanguage&&c.push(navigator.userLanguage),navigator.language&&c.push(navigator.language)}return function(){for(var d=0;d<c.length;d++){var e=c[d];if(e.indexOf("-")>-1){var f=e.split("-");e=P.lowerCaseLng?f[0].toLowerCase()+"-"+f[1].toLowerCase():f[0].toLowerCase()+"-"+f[1].toUpperCase()}if(0===b.length||b.indexOf(e)>-1){a=e;break}}}(),a||(a=P.fallbackLng[0]),a}Array.prototype.indexOf||(Array.prototype.indexOf=function(a){"use strict";if(null==this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>0&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&1/0!=d&&d!=-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(a){"use strict";if(null==this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=c;arguments.length>1&&(d=Number(arguments[1]),d!=d?d=0:0!=d&&d!=1/0&&d!=-(1/0)&&(d=(d>0||-1)*Math.floor(Math.abs(d))));for(var e=d>=0?Math.min(d,c-1):c-Math.abs(d);e>=0;e--)if(e in b&&b[e]===a)return e;return-1}),"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});var F,G=this,H=G.jQuery||G.Zepto,I={},J={},K=0,L=[],M=!1,N={};if("undefined"!=typeof module&&module.exports){if(!H)try{H=require("jquery")}catch(O){}H&&(H.i18n=H.i18n||I),module.exports=I}else H&&(H.i18n=H.i18n||I),G.i18n=G.i18n||I;N={load:function(a,b,c){b.useLocalStorage?N._loadLocal(a,b,function(d,e){for(var f=[],g=0,h=a.length;h>g;g++)e[a[g]]||f.push(a[g]);f.length>0?N._fetch(f,b,function(a,b){T.extend(e,b),N._storeLocal(b),c(null,e)}):c(null,e)}):N._fetch(a,b,function(a,b){c(null,b)})},_loadLocal:function(a,b,c){var d={},e=(new Date).getTime();if(window.localStorage){var f=a.length;T.each(a,function(a,g){var h=window.localStorage.getItem("res_"+g);h&&(h=JSON.parse(h),h.i18nStamp&&h.i18nStamp+b.localStorageExpirationTime>e&&(d[g]=h)),f--,0===f&&c(null,d)})}},_storeLocal:function(a){if(window.localStorage)for(var b in a)a[b].i18nStamp=(new Date).getTime(),T.localStorage.setItem("res_"+b,JSON.stringify(a[b]))},_fetch:function(a,b,c){var d=b.ns,e={};if(b.dynamicLoad){var f=function(a,b){c(null,b)};if("function"==typeof b.customLoad)b.customLoad(a,d.namespaces,b,f);else{var g=t(b.resGetPath,{lng:a.join("+"),ns:d.namespaces.join("+")});T.ajax({url:g,success:function(a){T.log("loaded: "+g),f(null,a)},error:function(a,b,c){T.log("failed loading: "+g),f("failed loading resource.json error: "+c)},dataType:"json",async:b.getAsync})}}else{var h,i=d.namespaces.length*a.length;T.each(d.namespaces,function(d,f){T.each(a,function(a,d){var g=function(a,b){a&&(h=h||[],h.push(a)),e[d]=e[d]||{},e[d][f]=b,i--,0===i&&c(h,e)};"function"==typeof b.customLoad?b.customLoad(d,f,b,g):N._fetchOne(d,f,b,g)})})}},_fetchOne:function(a,b,c,d){var e=t(c.resGetPath,{lng:a,ns:b});T.ajax({url:e,success:function(a){T.log("loaded: "+e),d(null,a)},error:function(a,b,c){if(b&&200==b||a&&a.status&&200==a.status)T.error("There is a typo in: "+e);else if(b&&404==b||a&&a.status&&404==a.status)T.log("Does not exist: "+e);else{var f=b?b:a&&a.status?a.status:null;T.log(f+" when loading "+e)}d(c,{})},dataType:"json",async:c.getAsync})},postMissing:function(a,b,c,d,e){var f={};f[c]=d;var g=[];if("fallback"===P.sendMissingTo&&P.fallbackLng[0]!==!1)for(var h=0;h<P.fallbackLng.length;h++)g.push({lng:P.fallbackLng[h],url:t(P.resPostPath,{lng:P.fallbackLng[h],ns:b})});else if("current"===P.sendMissingTo||"fallback"===P.sendMissingTo&&P.fallbackLng[0]===!1)g.push({lng:a,url:t(P.resPostPath,{lng:a,ns:b})});else if("all"===P.sendMissingTo)for(var h=0,i=e.length;i>h;h++)g.push({lng:e[h],url:t(P.resPostPath,{lng:e[h],ns:b})});for(var j=0,k=g.length;k>j;j++){var l=g[j];T.ajax({url:l.url,type:P.sendType,data:f,success:function(){T.log("posted missing key '"+c+"' to: "+l.url);for(var a=c.split("."),e=0,f=J[l.lng][b];a[e];)f=f[a[e]]=e===a.length-1?d:f[a[e]]||{},e++},error:function(){T.log("failed posting missing key '"+c+"' to: "+l.url)},dataType:"json",async:P.postAsync})}},reload:r};var P={lng:void 0,load:"all",preload:[],lowerCaseLng:!1,returnObjectTrees:!1,fallbackLng:["dev"],fallbackNS:[],detectLngQS:"setLng",detectLngFromLocalStorage:!1,ns:"translation",fallbackOnNull:!0,fallbackOnEmpty:!1,fallbackToDefaultNS:!1,nsseparator:":",keyseparator:".",selectorAttr:"data-i18n",debug:!1,resGetPath:"locales/__lng__/__ns__.json",resPostPath:"locales/add/__lng__/__ns__",getAsync:!0,postAsync:!0,resStore:void 0,useLocalStorage:!1,localStorageExpirationTime:6048e5,dynamicLoad:!1,sendMissing:!1,sendMissingTo:"fallback",sendType:"POST",interpolationPrefix:"__",interpolationSuffix:"__",defaultVariables:!1,reusePrefix:"$t(",reuseSuffix:")",pluralSuffix:"_plural",pluralNotFound:["plural_not_found",Math.random()].join(""),contextNotFound:["context_not_found",Math.random()].join(""),escapeInterpolation:!1,indefiniteSuffix:"_indefinite",indefiniteNotFound:["indefinite_not_found",Math.random()].join(""),setJqueryExt:!0,defaultValueFromContent:!0,useDataAttrOptions:!1,cookieExpirationTime:void 0,useCookie:!0,cookieName:"i18next",cookieDomain:void 0,objectTreeKeyHandler:void 0,postProcess:void 0,parseMissingKey:void 0,missingKeyHandler:N.postMissing,shortcutFunction:"sprintf"},Q={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"},R={create:function(a,b,c,d){var e;if(c){var f=new Date;f.setTime(f.getTime()+6e4*c),e="; expires="+f.toGMTString()}else e="";d=d?"domain="+d+";":"",document.cookie=a+"="+b+e+";"+d+"path=/"},read:function(a){for(var b=a+"=",c=document.cookie.split(";"),d=0;d<c.length;d++){for(var e=c[d];" "==e.charAt(0);)e=e.substring(1,e.length);if(0===e.indexOf(b))return e.substring(b.length,e.length)}return null},remove:function(a){this.create(a,"",-1)}},S={create:function(){},read:function(){return null},remove:function(){}},T={extend:H?H.extend:a,deepExtend:b,each:H?H.each:c,ajax:H?H.ajax:"undefined"!=typeof document?e:function(){},cookie:"undefined"!=typeof document?R:S,detectLanguage:E,escape:d,log:function(a){P.debug&&"undefined"!=typeof console&&console.log(a)},error:function(a){"undefined"!=typeof console&&console.error(a)},getCountyIndexOfLng:function(a){var b=0;return("nb-NO"===a||"nn-NO"===a||"nb-no"===a||"nn-no"===a)&&(b=1),b},toLanguages:function(a){function b(a){var b=a;if("string"==typeof a&&a.indexOf("-")>-1){var c=a.split("-");b=P.lowerCaseLng?c[0].toLowerCase()+"-"+c[1].toLowerCase():c[0].toLowerCase()+"-"+c[1].toUpperCase()}else b=P.lowerCaseLng?a.toLowerCase():a;return b}var c=this.log,d=[],e=P.lngWhitelist||!1,f=function(a){!e||e.indexOf(a)>-1?d.push(a):c("rejecting non-whitelisted language: "+a)};if("string"==typeof a&&a.indexOf("-")>-1){var g=a.split("-");"unspecific"!==P.load&&f(b(a)),"current"!==P.load&&f(b(g[this.getCountyIndexOfLng(a)]))}else f(b(a));for(var h=0;h<P.fallbackLng.length;h++)-1===d.indexOf(P.fallbackLng[h])&&P.fallbackLng[h]&&d.push(b(P.fallbackLng[h]));return d},regexEscape:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},regexReplacementEscape:function(a){return"string"==typeof a?a.replace(/\$/g,"$$$$"):a},localStorage:{setItem:function(a,b){if(window.localStorage)try{window.localStorage.setItem(a,b)}catch(c){T.log('failed to set value for key "'+a+'" to localStorage.')}}}};T.applyReplacement=t;var U=[["ach","Acholi",[1,2],1],["af","Afrikaans",[1,2],2],["ak","Akan",[1,2],1],["am","Amharic",[1,2],1],["an","Aragonese",[1,2],2],["ar","Arabic",[0,1,2,3,11,100],5],["arn","Mapudungun",[1,2],1],["ast","Asturian",[1,2],2],["ay","Aymará",[1],3],["az","Azerbaijani",[1,2],2],["be","Belarusian",[1,2,5],4],["bg","Bulgarian",[1,2],2],["bn","Bengali",[1,2],2],["bo","Tibetan",[1],3],["br","Breton",[1,2],1],["bs","Bosnian",[1,2,5],4],["ca","Catalan",[1,2],2],["cgg","Chiga",[1],3],["cs","Czech",[1,2,5],6],["csb","Kashubian",[1,2,5],7],["cy","Welsh",[1,2,3,8],8],["da","Danish",[1,2],2],["de","German",[1,2],2],["dev","Development Fallback",[1,2],2],["dz","Dzongkha",[1],3],["el","Greek",[1,2],2],["en","English",[1,2],2],["eo","Esperanto",[1,2],2],["es","Spanish",[1,2],2],["es_ar","Argentinean Spanish",[1,2],2],["et","Estonian",[1,2],2],["eu","Basque",[1,2],2],["fa","Persian",[1],3],["fi","Finnish",[1,2],2],["fil","Filipino",[1,2],1],["fo","Faroese",[1,2],2],["fr","French",[1,2],9],["fur","Friulian",[1,2],2],["fy","Frisian",[1,2],2],["ga","Irish",[1,2,3,7,11],10],["gd","Scottish Gaelic",[1,2,3,20],11],["gl","Galician",[1,2],2],["gu","Gujarati",[1,2],2],["gun","Gun",[1,2],1],["ha","Hausa",[1,2],2],["he","Hebrew",[1,2],2],["hi","Hindi",[1,2],2],["hr","Croatian",[1,2,5],4],["hu","Hungarian",[1,2],2],["hy","Armenian",[1,2],2],["ia","Interlingua",[1,2],2],["id","Indonesian",[1],3],["is","Icelandic",[1,2],12],["it","Italian",[1,2],2],["ja","Japanese",[1],3],["jbo","Lojban",[1],3],["jv","Javanese",[0,1],13],["ka","Georgian",[1],3],["kk","Kazakh",[1],3],["km","Khmer",[1],3],["kn","Kannada",[1,2],2],["ko","Korean",[1],3],["ku","Kurdish",[1,2],2],["kw","Cornish",[1,2,3,4],14],["ky","Kyrgyz",[1],3],["lb","Letzeburgesch",[1,2],2],["ln","Lingala",[1,2],1],["lo","Lao",[1],3],["lt","Lithuanian",[1,2,10],15],["lv","Latvian",[1,2,0],16],["mai","Maithili",[1,2],2],["mfe","Mauritian Creole",[1,2],1],["mg","Malagasy",[1,2],1],["mi","Maori",[1,2],1],["mk","Macedonian",[1,2],17],["ml","Malayalam",[1,2],2],["mn","Mongolian",[1,2],2],["mnk","Mandinka",[0,1,2],18],["mr","Marathi",[1,2],2],["ms","Malay",[1],3],["mt","Maltese",[1,2,11,20],19],["nah","Nahuatl",[1,2],2],["nap","Neapolitan",[1,2],2],["nb","Norwegian Bokmal",[1,2],2],["ne","Nepali",[1,2],2],["nl","Dutch",[1,2],2],["nn","Norwegian Nynorsk",[1,2],2],["no","Norwegian",[1,2],2],["nso","Northern Sotho",[1,2],2],["oc","Occitan",[1,2],1],["or","Oriya",[2,1],2],["pa","Punjabi",[1,2],2],["pap","Papiamento",[1,2],2],["pl","Polish",[1,2,5],7],["pms","Piemontese",[1,2],2],["ps","Pashto",[1,2],2],["pt","Portuguese",[1,2],2],["pt_br","Brazilian Portuguese",[1,2],2],["rm","Romansh",[1,2],2],["ro","Romanian",[1,2,20],20],["ru","Russian",[1,2,5],4],["sah","Yakut",[1],3],["sco","Scots",[1,2],2],["se","Northern Sami",[1,2],2],["si","Sinhala",[1,2],2],["sk","Slovak",[1,2,5],6],["sl","Slovenian",[5,1,2,3],21],["so","Somali",[1,2],2],["son","Songhay",[1,2],2],["sq","Albanian",[1,2],2],["sr","Serbian",[1,2,5],4],["su","Sundanese",[1],3],["sv","Swedish",[1,2],2],["sw","Swahili",[1,2],2],["ta","Tamil",[1,2],2],["te","Telugu",[1,2],2],["tg","Tajik",[1,2],1],["th","Thai",[1],3],["ti","Tigrinya",[1,2],1],["tk","Turkmen",[1,2],2],["tr","Turkish",[1,2],1],["tt","Tatar",[1],3],["ug","Uyghur",[1],3],["uk","Ukrainian",[1,2,5],4],["ur","Urdu",[1,2],2],["uz","Uzbek",[1,2],1],["vi","Vietnamese",[1],3],["wa","Walloon",[1,2],1],["wo","Wolof",[1],3],["yo","Yoruba",[1,2],2],["zh","Chinese",[1],3]],V={1:function(a){return Number(a>1)},2:function(a){return Number(1!=a)},3:function(){return 0},4:function(a){return Number(1==a%10&&11!=a%100?0:a%10>=2&&4>=a%10&&(10>a%100||a%100>=20)?1:2)},5:function(a){return Number(0===a?0:1==a?1:2==a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5)},6:function(a){return Number(1==a?0:a>=2&&4>=a?1:2)},7:function(a){return Number(1==a?0:a%10>=2&&4>=a%10&&(10>a%100||a%100>=20)?1:2)},8:function(a){return Number(1==a?0:2==a?1:8!=a&&11!=a?2:3)},9:function(a){return Number(a>=2)},10:function(a){return Number(1==a?0:2==a?1:7>a?2:11>a?3:4)},11:function(a){return Number(1==a||11==a?0:2==a||12==a?1:a>2&&20>a?2:3)},12:function(a){return Number(1!=a%10||11==a%100)},13:function(a){return Number(0!==a)},14:function(a){return Number(1==a?0:2==a?1:3==a?2:3)},15:function(a){return Number(1==a%10&&11!=a%100?0:a%10>=2&&(10>a%100||a%100>=20)?1:2)},16:function(a){return Number(1==a%10&&11!=a%100?0:0!==a?1:2)},17:function(a){return Number(1==a||1==a%10?0:1)},18:function(a){return Number(1==a?1:2)},19:function(a){return Number(1==a?0:0===a||a%100>1&&11>a%100?1:a%100>10&&20>a%100?2:3)},20:function(a){return Number(1==a?0:0===a||a%100>0&&20>a%100?1:2)},21:function(a){return Number(1==a%100?1:2==a%100?2:3==a%100||4==a%100?3:0)}},W={rules:function(){var a,b={};for(a=U.length;a--;)b[U[a][0]]={name:U[a][1],numbers:U[a][2],plurals:V[U[a][3]]};return b}(),addRule:function(a,b){W.rules[a]=b},setCurrentLng:function(a){if(!W.currentRule||W.currentRule.lng!==a){var b=a.split("-");W.currentRule={lng:a,rule:W.rules[b[0]]}}},needsPlural:function(a,b){var c,d=a.split("-");return c=W.currentRule&&W.currentRule.lng===a?W.currentRule.rule:W.rules[d[T.getCountyIndexOfLng(a)]],c&&c.numbers.length<=1?!1:1!==this.get(a,b)},get:function(a,b){function c(b,c){var d;if(d=W.currentRule&&W.currentRule.lng===a?W.currentRule.rule:W.rules[b]){var e;e=d.plurals(d.noAbs?c:Math.abs(c));var f=d.numbers[e];return 2===d.numbers.length&&1===d.numbers[0]&&(2===f?f=-1:1===f&&(f=1)),f}return 1===c?"1":"-1"}var d=a.split("-");return c(d[T.getCountyIndexOfLng(a)],b)}},X={},Y=function(a,b){X[a]=b},Z=function(){function a(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function b(a,b){for(var c=[];b>0;c[--b]=a);return c.join("")}var c=function(){return c.cache.hasOwnProperty(arguments[0])||(c.cache[arguments[0]]=c.parse(arguments[0])),c.format.call(null,c.cache[arguments[0]],arguments)};return c.format=function(c,d){var e,f,g,h,i,j,k,l=1,m=c.length,n="",o=[];for(f=0;m>f;f++)if(n=a(c[f]),"string"===n)o.push(c[f]);else if("array"===n){if(h=c[f],h[2])for(e=d[l],g=0;g<h[2].length;g++){if(!e.hasOwnProperty(h[2][g]))throw Z('[sprintf] property "%s" does not exist',h[2][g]);e=e[h[2][g]]}else e=h[1]?d[h[1]]:d[l++];if(/[^s]/.test(h[8])&&"number"!=a(e))throw Z("[sprintf] expecting number but found %s",a(e));switch(h[8]){case"b":e=e.toString(2);break;case"c":e=String.fromCharCode(e);break;case"d":e=parseInt(e,10);break;case"e":e=h[7]?e.toExponential(h[7]):e.toExponential();break;case"f":e=h[7]?parseFloat(e).toFixed(h[7]):parseFloat(e);break;case"o":e=e.toString(8);break;case"s":e=(e=String(e))&&h[7]?e.substring(0,h[7]):e;break;case"u":e=Math.abs(e);break;case"x":e=e.toString(16);break;case"X":e=e.toString(16).toUpperCase()}e=/[def]/.test(h[8])&&h[3]&&e>=0?"+"+e:e,j=h[4]?"0"==h[4]?"0":h[4].charAt(1):" ",k=h[6]-String(e).length,i=h[6]?b(j,k):"",o.push(h[5]?e+i:i+e)}return o.join("")},c.cache={},c.parse=function(a){for(var b=a,c=[],d=[],e=0;b;){if(null!==(c=/^[^\x25]+/.exec(b)))d.push(c[0]);else if(null!==(c=/^\x25{2}/.exec(b)))d.push("%");else{if(null===(c=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(b)))throw"[sprintf] huh?";if(c[2]){e|=1;var f=[],g=c[2],h=[];if(null===(h=/^([a-z_][a-z_\d]*)/i.exec(g)))throw"[sprintf] huh?";for(f.push(h[1]);""!==(g=g.substring(h[0].length));)if(null!==(h=/^\.([a-z_][a-z_\d]*)/i.exec(g)))f.push(h[1]);else{if(null===(h=/^\[(\d+)\]/.exec(g)))throw"[sprintf] huh?";f.push(h[1])}c[2]=f}else e|=2;if(3===e)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";d.push(c)}b=b.substring(c[0].length)}return d},c}(),$=function(a,b){return b.unshift(a),Z.apply(null,b)};Y("sprintf",function(a,b,c){return c.sprintf?"[object Array]"===Object.prototype.toString.apply(c.sprintf)?$(a,c.sprintf):"object"==typeof c.sprintf?Z(a,c.sprintf):a:a}),I.init=f,I.setLng=p,I.preload=g,I.addResourceBundle=h,I.hasResourceBundle=i,I.addResource=k,I.addResources=l,I.removeResourceBundle=j,I.loadNamespace=n,I.loadNamespaces=o,I.setDefaultNamespace=m,I.t=z,I.translate=z,I.exists=y,I.detectLanguage=T.detectLanguage,I.pluralExtensions=W,I.sync=N,I.functions=T,I.lng=q,I.addPostProcessor=Y,I.options=P}();var I18next={de:{translation:{Logging_in:"Login läuft…",your_connection_is_unencrypted:"Deine Verbindung ist Unverschlüsselt.",your_connection_is_encrypted:"Deine Verbindung ist verschlüsselt.",your_buddy_closed_the_private_connection:"Dein Kontakt hat die private Verbindung getrennt.",start_private:"Privat starten",close_private:"Privat abbrechen",your_buddy_is_verificated:"Dein Kontakt ist verifiziert.",you_have_only_a_subscription_in_one_way:"Der Kontaktstatus ist einseitig.",authentication_query_sent:"Authentifizierungsanfrage gesendet.",your_message_wasnt_send_please_end_your_private_conversation:"Deine Nachricht wurde nicht gesendet. Bitte beende die private Konversation.",unencrypted_message_received:"Unverschlüsselte Nachricht erhalten.",your_message_wasnt_send_because_you_have_no_valid_subscription:"Deine Nachricht wurde nicht gesandt, da der Kontaktstatus einseitig ist.",not_available:"Nicht verfügbar.",no_connection:"Keine Verbindung.",relogin:"Neu anmelden.",trying_to_start_private_conversation:"Versuche private Konversation zu starten.",Verified:"Verifiziert",Unverified:"Unverifiziert",private_conversation_started:"Private Konversation gestartet.",private_conversation_aborted:"Private Konversation abgebrochen.",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Dein Kontakt hat die private Konversation beendet. Das solltest du auch tun!",conversation_is_now_verified:"Konversation ist jetzt verifiziert",authentication_failed:"Authentifizierung fehlgeschlagen.",your_buddy_is_attempting_to_determine_:"Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet.",to_authenticate_to_your_buddy:"Um dich gegenüber deinem Kontakt zu verifizieren ",enter_the_answer_and_click_answer:"gib die Antwort ein und klick auf Antworten.",enter_the_secret:"gib das Geheimnis ein.",Creating_your_private_key_:"Wir werden jetzt deinen privaten Schlüssel generieren. Das kann einige Zeit in Anspruch nehmen.",Authenticating_a_buddy_helps_:"Einen Kontakt zu authentifizieren hilft sicher zustellen, dass die Person mit der du sprichst auch die ist die sie sagt.",How_do_you_want_to_authenticate_your_buddy:"Wie willst du {{bid_name}} (<b>{{bid_jid}}</b>) authentifizieren?",Select_method:"Wähle...",Manual:"Manual",Question:"Frage",Secret:"Geheimnis",To_verify_the_fingerprint_:"Um den Fingerprint zu verifizieren kontaktiere dein Kontakt über einen anderen Kommunikationsweg. Zum Beispiel per Telefonanruf.",Your_fingerprint:"Dein Fingerprint",Buddy_fingerprint:"Sein/Ihr Fingerprint",Close:"Schließen",Compared:"Verglichen",To_authenticate_using_a_question_:"Um die Authentifizierung per Frage durchzuführen, wähle eine Frage bei welcher nur dein Kontakt die Antwort weiß.",Ask:"Frage",To_authenticate_pick_a_secret_:"Um deinen Kontakt zu authentifizieren, wähle ein Geheimnis welches nur deinem Kontakt und dir bekannt ist.",Compare:"Vergleiche",Fingerprints:"Fingerprints",Authentication:"Authentifizierung",Message:"Nachricht",Add_buddy:"Kontakt hinzufügen",rename_buddy:"Kontakt umbenennen",delete_buddy:"Kontakt löschen",Login:"Anmeldung",Username:"Benutzername",Password:"Passwort",Cancel:"Abbrechen",Connect:"Verbinden",Type_in_the_full_username_:"Gib bitte den vollen Benutzernamen und optional ein Alias an.",Alias:"Alias",Add:"Hinzufügen",Subscription_request:"Kontaktanfrage",You_have_a_request_from:"Du hast eine Anfrage von",Deny:"Ablehnen",Approve:"Bestätigen",Remove_buddy:"Kontakt entfernen",You_are_about_to_remove_:"Du bist gerade dabei {{bid_name}} (<b>{{bid_jid}}</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.",Continue_without_chat:"Weiter ohne Chat",Please_wait:"Bitte warten",Login_failed:"Chat-Anmeldung fehlgeschlagen",Sorry_we_cant_authentikate_:"Der Chatserver hat die Anmeldung abgelehnt. Falsches Passwort?",Retry:"Zurück",clear_history:"Lösche Verlauf",New_message_from:"Neue Nachricht von",Should_we_notify_you_:"Sollen wir dich in Zukunft über eingehende Nachrichten informieren, auch wenn dieser Tab nicht im Vordergrund ist?",Please_accept_:'Bitte klick auf den "Zulassen" Button oben.',Hide_offline:"Offline ausblenden",Show_offline:"Offline einblenden",About:"Über",dnd:"Beschäftigt",Mute:"Ton aus",Unmute:"Ton an",Subscription:"Bezug",both:"beidseitig",Status:"Status",online:"online",chat:"chat",away:"abwesend",xa:"länger abwesend",offline:"offline",none:"keine",Unknown_instance_tag:"Unbekannter instance tag.",Not_one_of_our_latest_keys:"Nicht einer unserer letzten Schlüssel.",Received_an_unreadable_encrypted_message:"Eine unlesbare verschlüsselte Nachricht erhalten.",Online:"Online",Chatty:"Gesprächig",Away:"Abwesend",Extended_away:"Länger abwesend",Offline:"Offline",Friendship_request:"Kontaktanfrage",Confirm:"Bestätigen",Dismiss:"Ablehnen",Remove:"Löschen",Online_help:"Online Hilfe",FN:"Name",N:" ",FAMILY:"Familienname",GIVEN:"Vorname",NICKNAME:"Spitzname",URL:"URL",ADR:"Adresse",STREET:"Straße",EXTADD:"Zusätzliche Adresse",LOCALITY:"Ortschaft",REGION:"Region",PCODE:"Postleitzahl",CTRY:"Land",TEL:"Telefon",NUMBER:"Nummer",EMAIL:"E-Mail",USERID:" ",ORG:"Organisation",ORGNAME:"Name",ORGUNIT:"Abteilung",TITLE:"Titel",ROLE:"Rolle",BDAY:"Geburtstag",DESC:"Beschreibung",PHOTO:" ",send_message:"Sende Nachricht",get_info:"Benutzerinformationen",Settings:"Einstellungen",Priority:"Priorität",Save:"Speichern",User_settings:"Benutzereinstellungen",A_fingerprint_:"Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.",Your_roster_is_empty_add_a:"Deine Kontaktliste ist leer, füge einen neuen Kontakt ",new_buddy:"hinzu",is:"ist",Login_options:"Anmeldeoptionen",BOSH_url:"BOSH url",Domain:"Domain",Resource:"Ressource",On_login:"Beim Anmelden",Received_an_unencrypted_message:"Unverschlüsselte Nachricht empfangen",Sorry_your_buddy_doesnt_provide_any_information:"Dein Kontakt stellt leider keine Informationen bereit.",Info_about:"Info über",Authentication_aborted:"Authentifizierung abgebrochen.",Authentication_request_received:"Authentifizierunganfrage empfangen.",Do_you_want_to_display_them:"Möchtest du sie sehen?",Log_in_without_chat:"Anmelden ohne Chat",has_come_online:"ist online gekommen",Unknown_sender:"Unbekannter Sender",You_received_a_message_from_an_unknown_sender:"Du hast eine Nachricht von einem unbekannten Sender erhalten",Please_allow_access_to_microphone_and_camera:'Bitte klick auf den "Zulassen" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.',Incoming_call:"Eingehender Anruf",from:"von",Do_you_want_to_accept_the_call_from:"Möchtest Du den Anruf annehmen von",Reject:"Ablehnen",Accept:"Annehmen",hang_up:"Auflegen",snapshot:"Schnappschuss",mute_my_audio:"Mein Ton aus",pause_my_video:"Mein Video pausieren",fullscreen:"Vollbild",Info:"Info",Local_IP:"Lokale IP",Remote_IP:"Remote IP",Local_Fingerprint:"Lokaler Fingerprint",Remote_Fingerprint:"Remote Fingerprint",Video_call_not_possible:"Videoanruf nicht verfügbar. Dein Gesprächspartner unterstützt keine Videotelefonie.",Start_video_call:"Starte Videoanruf"}},el:{translation:{Logging_in:null,your_connection_is_unencrypted:null,your_connection_is_encrypted:null,your_buddy_closed_the_private_connection:null,start_private:null,close_private:null,your_buddy_is_verificated:null,you_have_only_a_subscription_in_one_way:null,authentication_query_sent:null,your_message_wasnt_send_please_end_your_private_conversation:null,unencrypted_message_received:null,your_message_wasnt_send_because_you_have_no_valid_subscription:null,not_available:null,no_connection:null,relogin:null,trying_to_start_private_conversation:null,Verified:null,Unverified:null,private_conversation_started:null,private_conversation_aborted:null,your_buddy_closed_the_private_conversation_you_should_do_the_same:null,conversation_is_now_verified:null,authentication_failed:null,your_buddy_is_attempting_to_determine_:null,to_authenticate_to_your_buddy:null,enter_the_answer_and_click_answer:null,enter_the_secret:null,Creating_your_private_key_:null,Authenticating_a_buddy_helps_:null,How_do_you_want_to_authenticate_your_buddy:null,Select_method:null,Manual:null,Question:null,Secret:null,To_verify_the_fingerprint_:null,Your_fingerprint:null,Buddy_fingerprint:null,Close:null,Compared:null,To_authenticate_using_a_question_:null,Ask:null,To_authenticate_pick_a_secret_:null,Compare:null,Fingerprints:null,Authentication:null,Message:null,Add_buddy:null,rename_buddy:null,delete_buddy:null,Login:null,Username:null,Password:null,Cancel:null,Connect:null,Type_in_the_full_username_:null,Alias:null,Add:null,Subscription_request:null,You_have_a_request_from:null,Deny:null,Approve:null,Remove_buddy:null,You_are_about_to_remove_:null,Continue_without_chat:null,Please_wait:null,Login_failed:null,Sorry_we_cant_authentikate_:null,Retry:null,clear_history:null,New_message_from:null,Should_we_notify_you_:null,Please_accept_:null,Hide_offline:null,Show_offline:null,About:null,dnd:null,Mute:null,Unmute:null,Subscription:null,both:null,Status:null,online:null,chat:null,away:null,xa:null,offline:null,none:null,Unknown_instance_tag:null,Not_one_of_our_latest_keys:null,Received_an_unreadable_encrypted_message:null,Online:null,Chatty:null,Away:null,Extended_away:null,Offline:null,Friendship_request:null,Confirm:null,Dismiss:null,Remove:null,Online_help:null,FN:null,N:null,FAMILY:null,GIVEN:null,NICKNAME:null,URL:null,ADR:null,STREET:null,EXTADD:null,LOCALITY:null,REGION:null,PCODE:null,CTRY:null,TEL:null,NUMBER:null,EMAIL:null,USERID:null,ORG:null,ORGNAME:null,ORGUNIT:null,TITLE:null,ROLE:null,BDAY:null,DESC:null,PHOTO:null,send_message:null,get_info:null,Settings:null,Priority:null,Save:null,User_settings:null,A_fingerprint_:null,Your_roster_is_empty_add_a:null,new_buddy:null,is:null,Login_options:null,BOSH_url:null,Domain:null,Resource:null,On_login:null,Received_an_unencrypted_message:null,Sorry_your_buddy_doesnt_provide_any_information:null,Info_about:null,Authentication_aborted:null,Authentication_request_received:null,Do_you_want_to_display_them:null,Log_in_without_chat:null,has_come_online:null,Unknown_sender:null,You_received_a_message_from_an_unknown_sender:null,Please_allow_access_to_microphone_and_camera:null,Incoming_call:null,from:null,Do_you_want_to_accept_the_call_from:null,Reject:null,Accept:null,hang_up:null,snapshot:null,mute_my_audio:null,pause_my_video:null,fullscreen:null,Info:null,Local_IP:null,Remote_IP:null,Local_Fingerprint:null,Remote_Fingerprint:null,Video_call_not_possible:null,Start_video_call:null}},en:{translation:{Logging_in:"Logging in…",your_connection_is_unencrypted:"Your connection is unencrypted.",your_connection_is_encrypted:"Your connection is encrypted.",your_buddy_closed_the_private_connection:"Your buddy closed the private connection.",start_private:"Start private",close_private:"Close private",your_buddy_is_verificated:"Your buddy is verified.",you_have_only_a_subscription_in_one_way:"You only have a one-way subscription.",authentication_query_sent:"Authentication query sent.",your_message_wasnt_send_please_end_your_private_conversation:"Your message was not sent. Please end your private conversation.",unencrypted_message_received:"Unencrypted message received",your_message_wasnt_send_because_you_have_no_valid_subscription:"Your message was not sent because you have no valid subscription.",not_available:"Not available",no_connection:"No connection!",relogin:"relogin",trying_to_start_private_conversation:"Trying to start private conversation!",Verified:"Verified",Unverified:"Unverified",private_conversation_started:"Private conversation started.",private_conversation_aborted:"Private conversation aborted!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Your buddy closed the private conversation! You should do the same.",conversation_is_now_verified:"Conversation is now verified.",authentication_failed:"Authentication failed.",your_buddy_is_attempting_to_determine_:"You buddy is attempting to determine if he or she is really talking to you.",to_authenticate_to_your_buddy:"To authenticate to your buddy, ",enter_the_answer_and_click_answer:"enter the answer and click Answer.",enter_the_secret:"enter the secret.",Creating_your_private_key_:"Creating your private key; this may take a while.",Authenticating_a_buddy_helps_:"Authenticating a buddy helps ensure that the person you are talking to is really the one he or she claims to be.",How_do_you_want_to_authenticate_your_buddy:"How do you want to authenticate {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Select method...",Manual:"Manual",Question:"Question",Secret:"Secret",To_verify_the_fingerprint_:"To verify the fingerprint, contact your buddy via some other trustworthy channel, such as the telephone.",Your_fingerprint:"Your fingerprint",Buddy_fingerprint:"Buddy fingerprint",Close:"Close",Compared:"Compared",To_authenticate_using_a_question_:"To authenticate using a question, pick a question whose answer is known only you and your buddy.",Ask:"Ask",To_authenticate_pick_a_secret_:"To authenticate, pick a secret known only to you and your buddy.",Compare:"Compare",Fingerprints:"Fingerprints",Authentication:"Authentication",Message:"Message",Add_buddy:"Add buddy",rename_buddy:"rename buddy",delete_buddy:"delete buddy",Login:"Login",Username:"Username",Password:"Password",Cancel:"Cancel",Connect:"Connect",Type_in_the_full_username_:"Type in the full username and an optional alias.",Alias:"Alias",Add:"Add",Subscription_request:"Subscription request",You_have_a_request_from:"You have a request from",Deny:"Deny",Approve:"Approve",Remove_buddy:"Remove buddy",You_are_about_to_remove_:"You are about to remove {{bid_name}} (<b>{{bid_jid}}</b>) from your buddy list. All related chats will be closed.",Continue_without_chat:"Continue without chat",Please_wait:"Please wait",Login_failed:"Chat login failed",Sorry_we_cant_authentikate_:"Authentication failed with the chat server. Maybe the password is wrong?",Retry:"Back",clear_history:"Clear history",New_message_from:"New message from",Should_we_notify_you_:"Should we notify you about new messages in the future?",Please_accept_:'Please click the "Allow" button at the top.',Hide_offline:"Hide offline contacts",Show_offline:"Show offline contacts",About:"About",dnd:"Do Not Disturb",Mute:"Mute",Unmute:"Unmute",Subscription:"Subscription",both:"both",Status:"Status",online:"online",chat:"chat",away:"away",xa:"extended away",offline:"offline",none:"none",Unknown_instance_tag:"Unknown instance tag.",Not_one_of_our_latest_keys:"Not one of our latest keys.",Received_an_unreadable_encrypted_message:"Received an unreadable encrypted message.",Online:"Online",Chatty:"Chatty",Away:"Away",Extended_away:"Extended away",Offline:"Offline",Friendship_request:"Friendship request",Confirm:"Confirm",Dismiss:"Dismiss",Remove:"Remove",Online_help:"Online help",FN:"Full name",N:" ",FAMILY:"Family name",GIVEN:"Given name",NICKNAME:"Nickname",URL:"URL",ADR:"Address",STREET:"Street Address",EXTADD:"Extended Address",LOCALITY:"Locality",REGION:"Region",PCODE:"Postal Code",CTRY:"Country",TEL:"Telephone",NUMBER:"Number",EMAIL:"Email",USERID:" ",ORG:"Organization",ORGNAME:"Name",ORGUNIT:"Unit",TITLE:"Job title",ROLE:"Role",BDAY:"Birthday",DESC:"Description",PHOTO:" ",send_message:"Send message",get_info:"Show information",Settings:"Settings",Priority:"Priority",Save:"Save",User_settings:"User settings",A_fingerprint_:"A fingerprint is used to make sure that the person you are talking to is who he or she is saying.",Your_roster_is_empty_add_a:"Your roster is empty, add a ",new_buddy:"new buddy",is:"is",Login_options:"Login options",BOSH_url:"BOSH URL",Domain:"Domain",Resource:"Resource",On_login:"On login",Received_an_unencrypted_message:"Received an unencrypted message",Sorry_your_buddy_doesnt_provide_any_information:"Sorry, your buddy does not provide any information.",Info_about:"Info about",Authentication_aborted:"Authentication aborted.",Authentication_request_received:"Authentication request received.",Do_you_want_to_display_them:"Do you want to display them?",Log_in_without_chat:"Log in without chat",has_come_online:"has come online",Unknown_sender:"Unknown sender",You_received_a_message_from_an_unknown_sender:"You received a message from an unknown sender",Please_allow_access_to_microphone_and_camera:'Please click the "Allow" button at the top, to allow access to microphone and camera.',Incoming_call:"Incoming call",from:"from",Do_you_want_to_accept_the_call_from:"Do you want to accept the call from",Reject:"Reject",Accept:"Accept",hang_up:"hang up",snapshot:"snapshot",mute_my_audio:"mute my audio",pause_my_video:"pause my video",fullscreen:"fullscreen",Info:"Info",Local_IP:"Local IP",Remote_IP:"Remote IP",Local_Fingerprint:"Local fingerprint",Remote_Fingerprint:"Remote fingerprint",Video_call_not_possible:"Video call not possible. Your buddy does not support video calls.",Start_video_call:"Start video call",Join_chat:"Join chat",Join:"Join",Room:"Room",Nickname:"Nickname",left_the_building:"__nickname__ left the building",entered_the_room:"__nickname__ entered the room",is_now_known_as:"__oldNickname__ is now known as __newNickname__",This_room_is:"This room is",muc_hidden:{keyword:"hidden",description:"can not be found through search"},muc_membersonly:{keyword:"members-only",description:"you need to be on the member list"},muc_moderated:{keyword:"moderated",description:'only persons with "voice" are allowed to send messages'},muc_nonanonymous:{keyword:"non-anonymous",description:"your jabber id is exposed to all other occupants"},muc_open:{keyword:"open",description:"everyone is allowed to join"},muc_passwordprotected:{keyword:"password-protected",description:"you need to provide the correct password"},muc_persistent:{keyword:"persistent",description:"will not be destroyed if the last occupant left"},muc_public:{keyword:"public",description:"can be found through search"},muc_semianonymous:{keyword:"semi-anonymous",description:"your jabber id is only exposed to room admins"},muc_temporary:{keyword:"temporary",description:"will be destroyed if the last occupant left"},muc_unmoderated:{keyword:"unmoderated",description:"everyone is allowed to send messages"},muc_unsecured:{keyword:"unsecured",description:"you need no password to enter"},Continue:"Continue",Server:"Server",Rooms_are_loaded:"Rooms are loaded",Could_load_only:"Could load only __count__ rooms for autocomplete",muc_explanation:"Please enter room name and optional a nickname and password to join a chat",You_already_joined_this_room:"You already joined this room",This_room_will_be_closed:"This room will be closed",Room_not_found_:"A new room will be created",Loading_room_information:"Loading room information",Destroy:"Destroy",Leave:"Leave",changed_subject_to:'__nickname__ changed the room subject to "__subject__"',muc_removed_kicked:"You have been kicked from the room",muc_removed_info_kicked:"__nickname__ has been kicked from the room",muc_removed_banned:"You have been banned from the room",muc_removed_info_banned:"__nickname__ has been banned from the room",muc_removed_affiliation:"You have been removed from the room, because of an affiliation change",muc_removed_info_affiliation:"__nickname__ has been removed from the room, because of an affiliation change",muc_removed_membersonly:"You have been removed from the room, because the room has been changed to members-only and you are no member",muc_removed_info_membersonly:"__nickname__ has been removed from the room, because the room has been changed to members-only and you are no member",muc_removed_shutdown:"You have been removed from the room, because the MUC service is being shut down",Reason:"Reason",message_not_send:"Your message was not send because of an error","message_not_send_item-not-found":"Your message was not send because this room does not exist",message_not_send_forbidden:"Your message was not send because you have no voice in this room","message_not_send_not-acceptable":"Your message was not send because you are no occupant of this room",This_room_has_been_closed:"This room has been closed",Room_logging_is_enabled:"Room logging is enabled",A_password_is_required:"A password is required",You_are_not_on_the_member_list:"You are not on the member list",You_are_banned_from_this_room:"You are banned from this room",Your_desired_nickname_:"Your desired nickname is already in use. Please choose another",The_maximum_number_:"The maximum number of user is reached in this room",This_room_is_locked_:"This room is locked",You_are_not_allowed_to_create_:"You are not allowed to create a room"}},es:{translation:{Logging_in:"Por favor, espere...",your_connection_is_unencrypted:"Su conexión no está cifrada.",your_connection_is_encrypted:"Su conexión está cifrada.",your_buddy_closed_the_private_connection:"Su amigo ha cerrado la conexión privada.",start_private:"Iniciar privado",close_private:"Cerrar privado",your_buddy_is_verificated:"Tu amigo está verificado.",you_have_only_a_subscription_in_one_way:"Sólo tienes una suscripción de un modo.",authentication_query_sent:"Consulta de verificación enviada.",your_message_wasnt_send_please_end_your_private_conversation:"Su mensaje no fue enviado. Por favor, termine su conversación privada.",unencrypted_message_received:"Mensaje no cifrado recibido:",your_message_wasnt_send_because_you_have_no_valid_subscription:"Su mensaje no se ha enviado, porque usted no tiene suscripción válida.",not_available:"No disponible",no_connection:"Sin conexión!",relogin:"iniciar sesión nuevamente",trying_to_start_private_conversation:"Intentando iniciar una conversación privada!",Verified:"Verificado",Unverified:"No verificado",private_conversation_started:"se inició una conversación privada.",private_conversation_aborted:"Conversación privada abortada!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Su amigo cerró la conversación privada! Usted debería hacer lo mismo.",conversation_is_now_verified:"La conversación es ahora verificada.",authentication_failed:"Fallo la verificación.",your_buddy_is_attempting_to_determine_:"Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.",to_authenticate_to_your_buddy:"Para autenticar a su amigo, ",enter_the_answer_and_click_answer:"introduce la respuesta y haga clic en Contestar.",enter_the_secret:"especifique el secreto.",Creating_your_private_key_:"Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.",Authenticating_a_buddy_helps_:"Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.",How_do_you_want_to_authenticate_your_buddy:"¿Cómo desea autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Escoja un método...",Manual:"Manual",Question:"Pregunta",Secret:"Secreto",To_verify_the_fingerprint_:"Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.",Your_fingerprint:"Tu firma digital",Buddy_fingerprint:"firma digital de tu amigo",Close:"Cerrar",Compared:"Comparado",To_authenticate_using_a_question_:"Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.",Ask:"Preguntar",To_authenticate_pick_a_secret_:"Para autenticar, elija un secreto conocido sólo por usted y su amigo.",Compare:"Comparar",Fingerprints:"Firmas digitales",Authentication:"Autenticación",Message:"Mensaje",Add_buddy:"Añadir amigo",rename_buddy:"renombrar amigo",delete_buddy:"eliminar amigo",Login:"Iniciar Sesión",Username:"Usuario",Password:"Contraseña",Cancel:"Cancelar",Connect:"Conectar",Type_in_the_full_username_:"Escriba el usuario completo y un alias opcional.",Alias:"Alias",Add:"Añadir",Subscription_request:"Solicitud de suscripción",You_have_a_request_from:"Tienes una petición de",Deny:"Rechazar",Approve:"Aprobar",Remove_buddy:"Eliminar amigo",You_are_about_to_remove_:"Vas a eliminar a {{bid_name}} (<b>{{bid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.",Continue_without_chat:"Continuar",Please_wait:"Espere por favor",Login_failed:"Fallo el inicio de sesión",Sorry_we_cant_authentikate_:"Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?",Retry:"Reintentar",clear_history:"Borrar el historial",New_message_from:"Nuevo mensaje de",Should_we_notify_you_:"¿Debemos notificarle sobre nuevos mensajes en el futuro?",Please_accept_:'Por favor, haga clic en el botón "Permitir" en la parte superior.',Hide_offline:"Ocultar contactos desconectados",Show_offline:"Mostrar contactos desconectados",About:"Acerca de",dnd:"No Molestar",Mute:"Desactivar sonido",Unmute:"Activar sonido",Subscription:"Suscripción",both:"ambos",Status:"Estado",online:"en línea",chat:"chat",away:"ausente",xa:"mas ausente",offline:"desconectado",none:"nadie",Unknown_instance_tag:"Etiqueta de instancia desconocida.",Not_one_of_our_latest_keys:"No de nuestra ultima tecla.",Received_an_unreadable_encrypted_message:"Se recibió un mensaje cifrado ilegible.",Online:"En linea",Chatty:"Hablador",Away:"Ausente",Extended_away:"Mas ausente",Offline:"Desconectado",Friendship_request:"Solicitud de amistad",Confirm:"Confirmar",Dismiss:"Rechazar",Remove:"Eliminar",Online_help:"Ayuda en línea",FN:"Nombre completo ",N:" ",FAMILY:"Apellido",GIVEN:"Nombre",NICKNAME:"Apodar",URL:"URL",ADR:"Dirección",STREET:"Calle",EXTADD:"Extendido dirección",LOCALITY:"Población",REGION:"Región",PCODE:"Código postal",CTRY:"País",TEL:"Teléfono",NUMBER:"Número",EMAIL:"Emilio",USERID:" ",ORG:"Organización",ORGNAME:"Nombre",ORGUNIT:"Departamento",TITLE:"Título",ROLE:"Rol",BDAY:"Cumpleaños",DESC:"Descripción",PHOTO:" ",send_message:"mandar un texto",get_info:"obtener información",Settings:"Ajustes",Priority:"Prioridad",Save:"Guardar",User_settings:"Configuración de usuario",A_fingerprint_:"La huella digital se utiliza para que puedas estar seguro que la persona con la que estas hablando es quien realmente dice ser",Your_roster_is_empty_add_a:"Tu lista de amigos esta vacia",new_buddy:"Nuevo amigo",is:"es",Login_options:"Opciones de login",BOSH_url:"BOSH url",Domain:"Dominio",Resource:"Recurso",On_login:"Iniciar sesión",Received_an_unencrypted_message:"Recibe un mensaje no cifrado",Sorry_your_buddy_doesnt_provide_any_information:"Lo sentimos, su amigo no provee ninguna información.",Info_about:"Info acerca de",Authentication_aborted:"Autenticación abortada",Authentication_request_received:"Pedido de autenticación recibido.",Do_you_want_to_display_them:"¿Quiere mostrarlos?",Log_in_without_chat:"Ingresar sin chat",has_come_online:"se ha conectado",Unknown_sender:"Remitente desconocido",You_received_a_message_from_an_unknown_sender:"Ha recibido un mensaje de un remitente desconocido",Please_allow_access_to_microphone_and_camera:"Por favor, permitir el acceso al micrófono y la cámara.",Incoming_call:"Llamada entrante",from:"de",Do_you_want_to_accept_the_call_from:"Desea aceptar la llamada de",Reject:"Rechazar",Accept:"Aceptar",hang_up:"colgar",snapshot:"instantánea",mute_my_audio:"silenciar mi audio",pause_my_video:"pausar mi vídeo",fullscreen:"pantalla completa",Info:"Info",Local_IP:"IP local",Remote_IP:"IP remota",Local_Fingerprint:"Firma digital local",Remote_Fingerprint:"Firma digital remota",Video_call_not_possible:"Llamada de vídeo no es posible",Start_video_call:"Iniciar llamada de vídeo"}},fr:{translation:{Logging_in:"Connexion...",your_connection_is_unencrypted:"Connexion non chiffrée.",your_connection_is_encrypted:"Connexion chiffrée.",your_buddy_closed_the_private_connection:"Votre ami a fermé la connexion privée.",start_private:"Démarrer une conversation privé",close_private:"Clôturer une conversation privée",your_buddy_is_verificated:"Votre ami est vérifié.",you_have_only_a_subscription_in_one_way:"Vous ne pouvez souscrire qu'une fois.",authentication_query_sent:"Requête d’authentification envoyée.",your_message_wasnt_send_please_end_your_private_conversation:"Votre message n'a pas été envoyé. Veuillez terminer votre conversation privée.",unencrypted_message_received:"Message non chiffré reçu",your_message_wasnt_send_because_you_have_no_valid_subscription:"Votre message n'a pas été envoyé car votre abonnement n'est pas valide.",not_available:"Pas disponible",no_connection:"Pas de connexion !",relogin:"Re-connexion",trying_to_start_private_conversation:"Essai de démarrage d'une conversation privée !",Verified:"Vérifié",Unverified:"Non vérifié",private_conversation_started:"Conversation privé démarrée.",private_conversation_aborted:"Conversation privée interrompue !",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Votre ami a fermé la conversation privée ! Vous devriez faire de même.",conversation_is_now_verified:"La conversation est maintenant vérifiée.",authentication_failed:"L'authentification a échoué.",your_buddy_is_attempting_to_determine_:"Votre ami tente de déterminer si il ou elle parle vraiment à vous.",to_authenticate_to_your_buddy:"Vous authentifier à votre ami, ",enter_the_answer_and_click_answer:"Saisissez une réponse et cliquer sur Répondre.",enter_the_secret:"Entrez le mot secret",Creating_your_private_key_:"Création de votre clé privée; cela peut prendre un moment.",Authenticating_a_buddy_helps_:"L'authentification d'un ami permet de s'assurer que la personne à qui vous parlez est vraiment celui qu'il ou elle prétend être.",How_do_you_want_to_authenticate_your_buddy:"Comment voulez-vous vous authentifier {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Sélection de la méthode...",Manual:"Manuel",Question:"Question",Secret:"Sécurité",To_verify_the_fingerprint_:"Pour vérifier l'empreinte, contactez votre ami via un autre canal digne de confiance, tel que le téléphone.",Your_fingerprint:"Votre empreinte",Buddy_fingerprint:"Empreinte de l'ami",Close:"Fermer",Compared:"Comparé",To_authenticate_using_a_question_:"Pour s'authentifier à l'aide d'une question, choisissez une question dont la réponse n'est connue que vous et de votre ami.",Ask:"Demander",To_authenticate_pick_a_secret_:"Pour vous authentifier, choisissez un secret connu seulement de vous et de votre ami.",Compare:"Comparer",Fingerprints:"Empreintes",Authentication:"Authentification",Message:"Message",Add_buddy:"Ajouter comme ami",rename_buddy:"Renommer l'ami",delete_buddy:"Supprimer l'ami",Login:"Connexion",Username:"Nom d'utilisateur",Password:"Mot de passe",Cancel:"Annuler",Connect:"Connecter",Type_in_the_full_username_:"Tapez un nom d'utilisateur complet et un alias(optionnel).",Alias:"Alias",Add:"Ajouter",Subscription_request:"Demande d'abonnement",You_have_a_request_from:"Vous avez une requête de ",Deny:"Refuser",Approve:"Approuver",Remove_buddy:"Supprimer l'ami",You_are_about_to_remove_:"Vous allez retirer {{bid_name}} (<b>{{bid_jid}}</b>) de votre liste d'amis. Toutes les fenêtres de chat en lien avec celui-ci seront fermées.",Continue_without_chat:"Continuer sans tchat",Please_wait:"Merci de patienter",Login_failed:"Authentification échouée",Sorry_we_cant_authentikate_:"La connexion avec le serveur de tchat a échoué. Vérifiez le mot de passe.",Retry:"Retour",clear_history:"Effacer l’historique",New_message_from:"Nouveau message de",Should_we_notify_you_:"Dans le futur, devrons-nous vous notifier les nouveaux messages ?",Please_accept_:'Merci de cliquer sur le bouton "autoriser" en haut de page',Hide_offline:"Masquer les contacts non connectés",Show_offline:"Afficher les contacts non connectés",About:"À propos",dnd:"Ne pas déranger",Mute:"Muet",Unmute:"Son actif",Subscription:"Abonnement",both:"Les deux",Status:"Status",online:"En ligne",chat:"tchat",away:"Absent",xa:"Options étendues",offline:"Hors ligne",none:"Aucun",Unknown_instance_tag:"Tag inconnu",Not_one_of_our_latest_keys:"Ce n'est pas l'une des dernières touches",Received_an_unreadable_encrypted_message:"Message chiffré non lisible",Online:"En ligne",Chatty:"tchatty",Away:"Absent",Extended_away:"Options étendues",Offline:"Hors ligne",Friendship_request:"Demande d'amitié",Confirm:"Valider",Dismiss:"Rejeter",Remove:"Supprimer",Online_help:"Aide en ligne",FN:"Nom",N:" N ",FAMILY:"Nom de famille",GIVEN:"prénom",NICKNAME:"Surnom",URL:"URL",ADR:"Adresse",STREET:"Rue",EXTADD:"Adresse (suite)",LOCALITY:"Localité",REGION:"Région",PCODE:"Code Postal",CTRY:"Pays",TEL:"Téléphone",NUMBER:"Numéro",EMAIL:"Courriel",USERID:" USERID ",ORG:"Organisation",ORGNAME:"Nom",ORGUNIT:"Unité",TITLE:"Qualité:",ROLE:"Rôle",BDAY:"Date de naissance",DESC:"Description",PHOTO:"Photo",send_message:"Envoyer le message",get_info:"Montrer les informations",Settings:"Réglages",Priority:"Priorité",Save:"Enregistrer",User_settings:"Paramètres utilisateur",A_fingerprint_:"Une empreinte est utilisée pour s'assurer de l'identité de la personne à qui vous parlez",Your_roster_is_empty_add_a:"Votre liste est vide, ajouter ",new_buddy:"Nouvel ami",is:"est",Login_options:"Options d'identification",BOSH_url:"URL BOSH",Domain:"Domaine",Resource:"Ressource",On_login:"Après authentification",Received_an_unencrypted_message:"Reçu un message non chiffré",Sorry_your_buddy_doesnt_provide_any_information:"Désolé, votre ami n'a pas fourni d'informations",Info_about:"A propos de",Authentication_aborted:"Authentification interrompue.",Authentication_request_received:"Requête d'authentification reçue.",Do_you_want_to_display_them:"Voulez-vous les afficher ?",Log_in_without_chat:"S'identifier sans tchat",has_come_online:"vient d'arriver",Unknown_sender:"Expéditeur inconnu",You_received_a_message_from_an_unknown_sender:"Vous avez reçu un message d'un expéditeur inconnu",Please_allow_access_to_microphone_and_camera:'Veuillez cliquez sur le bouton "Autoriser" en haut, pour permettre l\'accès au micro et à la caméra.',Incoming_call:"Appel entrant",from:"de",Do_you_want_to_accept_the_call_from:"Voulez-vous accepter l'appel de",Reject:"Rejeté",Accept:"Accepté",hang_up:"Décrochez",snapshot:"Capture d’écran",mute_my_audio:"Couper l'audio",pause_my_video:"Mettre ma vidéo en pause",fullscreen:"Plein écran",Info:"Info",Local_IP:"IP locale",Remote_IP:"IP distante",Local_Fingerprint:"Empreinte locale",Remote_Fingerprint:"Empreinte distante",Video_call_not_possible:"L'appel vidéo n'est possible. Votre ami ne supporte pas les appels vidéo.",Start_video_call:"Démarrer l'appel vidéo"}},it:{translation:{Logging_in:"login…",your_connection_is_unencrypted:"La sua connessione è non cifrata.",your_connection_is_encrypted:"La sua connessione è cifrata.",your_buddy_closed_the_private_connection:"La sua connessione privata è stato chiuso dal suo compagno.",start_private:"Inizia privata",close_private:"Chiude privata",your_buddy_is_verificated:"Il tuo compagno è stato verificato",you_have_only_a_subscription_in_one_way:"Hai solo una one-way inscrizione.",authentication_query_sent:"Domanda d'autenticità inviata.",your_message_wasnt_send_please_end_your_private_conversation:"Il tuo messaggio non è stato inviato. Si prega di finire la sua conversazione privata.",unencrypted_message_received:"Messaggio non cifrato ricevuto",your_message_wasnt_send_because_you_have_no_valid_subscription:"Il tuo messaggio non è stato inviato perché non hai una sottoscrizione valida.",not_available:"non disponibile",no_connection:"nessun collegamento!",relogin:"nuovo login",trying_to_start_private_conversation:"Cercando di avviare una conversazione privata!",Verified:"verificato",Unverified:"non verificato",private_conversation_started:"Conversazione privata iniziato.",private_conversation_aborted:"Conversazione privata abortito!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Il tuo compagno ha chiuso la conversazione privata! Si dovrebbe fare lo stesso.",conversation_is_now_verified:"Conversazione è ora verificato.",authentication_failed:"autenticazione fallita.",your_buddy_is_attempting_to_determine_:"Il tuo compagno sta cercando di determinare se lui o lei sta davvero parlando con te.",to_authenticate_to_your_buddy:"Per autenticare a il tuo compagno. ",enter_the_answer_and_click_answer:"inserisci la risposta e fare click su risposta.",enter_the_secret:"inserire il segreto.",Creating_your_private_key_:"Creare la propria chiave privata; questo potrebbe richiedere un po'.",Authenticating_a_buddy_helps_:"Autenticazione un compagno aiuta a garantire che la persona si sta parlando è davvero quello che lui o lei sostiene di essere.",How_do_you_want_to_authenticate_your_buddy:"Come si desidera autenticare {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Seleziona metodo ..",Manual:"manuale",Question:"domanda",Secret:"segreto",To_verify_the_fingerprint_:"Per verificare l'impronta digitale, contattare il proprio compagno attraverso qualche altro canale affidabile, come il telefono.",Your_fingerprint:"il tuo impronta digitale",Buddy_fingerprint:"impronta digitale da compagno",Close:"chiude",Compared:"comparato",To_authenticate_using_a_question_:"Per autenticare tramite una questione, scegli una questione la cui risposta è nota solo voi e il tuo compagno",Ask:"chiedi",To_authenticate_pick_a_secret_:"Per autenticare, scegli un segreto noto solo a te e il tuo compagno.",Compare:"Comparare",Fingerprints:"Impronta digitale",Authentication:"Autenticazione",Message:"Messagio",Add_buddy:"Aggiungi un compagno",rename_buddy:"rinomina compagno",delete_buddy:"elimina compagno",Login:"Login",Username:"Identificazione dell'utente",Password:"Password",Cancel:"Cancella",Connect:"Collega",Type_in_the_full_username_:"Digita l'identificazione utente completo e un alias opzionale.",Alias:"Alias",Add:"Aggiungi",Subscription_request:"Rrichiesta di sottoscrizione",You_have_a_request_from:"Hai una richiesta da",Deny:"Refiuta",Approve:"Approva",Remove_buddy:"Rimuova il compagno",You_are_about_to_remove_:"Stai rimovendo {{bid_name}} (<b>{{bid_jid}}</b>) del suo lista di compagni. Tutte le chat appartenente saranno chiuse.",Continue_without_chat:"Continua senza chat",Please_wait:"Si prega d'attendere",Login_failed:"Chat login è fallito",Sorry_we_cant_authentikate_:"Autenticazione non riuscita con il server di chat. Forse la password è sbagliata?",Retry:"Indietro",clear_history:"Cancella la cronologia",New_message_from:"Nuovo messaggio da",Should_we_notify_you_:"Vuoi ricevere una notifica di nuovi messaggi in futuro?",Please_accept_:'Si prega di fare clic sul bottone "Autorizzazione" sopra.',Hide_offline:"Nascondere i contatti non in linea",Show_offline:"Mostra i contatti non in linea",About:"Informazione legale",dnd:"Non disturbare",Mute:"Muto attivo",Unmute:"Muto inattivo",Subscription:"Sottoscrizione",both:"etrambi",Status:"Status",online:"In linea",chat:"chat",away:"via",xa:"via estensivo",offline:"non in linea",none:"nessuno",Unknown_instance_tag:"Instance tag sconosciuta.",Not_one_of_our_latest_keys:"Non è una delle nostre ultime chiavi.",Received_an_unreadable_encrypted_message:"Ricevuto un messaggio crittografato illeggibile.",Online:"In linea",Chatty:"Chiacchierino",Away:"Via",Extended_away:"Via estensivo",Offline:"Non in linea",Friendship_request:"Amicizia richiesto",Confirm:"Conferma",Dismiss:"Rifiuta",Remove:"Rimuovi",Online_help:"Guida in linea",FN:"Nome e cognome",N:null,FAMILY:"Cognome",GIVEN:"Nome",NICKNAME:"Soprannome",URL:"URL",ADR:"Indirizzo",STREET:"Via",EXTADD:"Esteso Indirizzo",LOCALITY:"Località",REGION:"Regione",PCODE:"Codice Postale",CTRY:"Paese",TEL:"Telefono",NUMBER:"Numero",EMAIL:"E-mail",USERID:null,ORG:"Organizzazione",ORGNAME:"Nome",ORGUNIT:"Unità",TITLE:"Titolo di lavoro",ROLE:"Funzione",BDAY:"Compleanno",DESC:"Descrizione",PHOTO:null,send_message:"Messagio inviato",get_info:"Mostra informazioni",Settings:"Impostazione",Priority:"Priorità",Save:"Salva",User_settings:"Impostazione dell'utente",A_fingerprint_:"Una impronta digitale è usato per assicurarsi che la persona con cui stai parlando è lui o lei che sta dicendo.",Your_roster_is_empty_add_a:"Il suo elenco è vuoto, aggiungi un ",new_buddy:"compagno nuovo",is:"è",Login_options:"Opzioni di login",BOSH_url:"BOSH URL",Domain:"Domain",Resource:"Risorsa",On_login:"Login on",Received_an_unencrypted_message:"Ricevuto un messaggio non crittografato",Sorry_your_buddy_doesnt_provide_any_information:"Spiace, il tuo compagno non fornisce alcuna informazione.",Info_about:"Informazioni",Authentication_aborted:"Autenticazione interrotta",Authentication_request_received:"Richiesta di autenticazione ricevuto.",Do_you_want_to_display_them:"Vuoi che venga visualizzato?",Log_in_without_chat:"Log in senza chat",has_come_online:"È venuto in linea",Unknown_sender:"Mittente sconosciuto",You_received_a_message_from_an_unknown_sender:"Hai ricevuto un messaggio da un mittente sconosciuto",Please_allow_access_to_microphone_and_camera:'Si prega di fare clic sul bottone "Autorizzazione" sopra per autorizzazione del l\'accesso al microfono e fotocamera.',Incoming_call:"Chiamata in arrivo",from:"di",Do_you_want_to_accept_the_call_from:"Vuoi accettare la chiamata di",Reject:"Rifiuta",Accept:"Accetta",hang_up:"Riattacca",snapshot:"istantanea",mute_my_audio:"disattiva il mio audio",pause_my_video:"pausa il mio audio",fullscreen:"schermo intero",Info:"Informazione",Local_IP:"IP locale",Remote_IP:"IP remoto",Local_Fingerprint:"Impronta digitale locale",Remote_Fingerprint:"Impronta digitale remoto",Video_call_not_possible:"Videochiamata non è possibile. Il tuo compagno non può effettuare videochiamate.",Start_video_call:"Inizia videochiamata"}},nds:{translation:{Logging_in:null,your_connection_is_unencrypted:null,your_connection_is_encrypted:null,your_buddy_closed_the_private_connection:null,start_private:null,close_private:null,your_buddy_is_verificated:null,you_have_only_a_subscription_in_one_way:null,authentication_query_sent:null,your_message_wasnt_send_please_end_your_private_conversation:null,unencrypted_message_received:null,your_message_wasnt_send_because_you_have_no_valid_subscription:null,not_available:null,no_connection:null,relogin:null,trying_to_start_private_conversation:null,Verified:null,Unverified:null,private_conversation_started:null,private_conversation_aborted:null,your_buddy_closed_the_private_conversation_you_should_do_the_same:null,conversation_is_now_verified:null,authentication_failed:null,your_buddy_is_attempting_to_determine_:null,to_authenticate_to_your_buddy:null,enter_the_answer_and_click_answer:null,enter_the_secret:null,Creating_your_private_key_:null,Authenticating_a_buddy_helps_:null,How_do_you_want_to_authenticate_your_buddy:null,Select_method:null,Manual:null,Question:null,Secret:null,To_verify_the_fingerprint_:null,Your_fingerprint:null,Buddy_fingerprint:null,Close:null,Compared:null,To_authenticate_using_a_question_:null,Ask:null,To_authenticate_pick_a_secret_:null,Compare:null,Fingerprints:null,Authentication:null,Message:null,Add_buddy:null,rename_buddy:null,delete_buddy:null,Login:null,Username:null,Password:null,Cancel:null,Connect:null,Type_in_the_full_username_:null,Alias:null,Add:null,Subscription_request:null,You_have_a_request_from:null,Deny:null,Approve:null,Remove_buddy:null,You_are_about_to_remove_:null,Continue_without_chat:null,Please_wait:null,Login_failed:null,Sorry_we_cant_authentikate_:null,Retry:null,clear_history:null,New_message_from:null,Should_we_notify_you_:null,Please_accept_:null,Hide_offline:null,Show_offline:null,About:null,dnd:null,Mute:null,Unmute:null,Subscription:null,both:null,Status:null,online:null,chat:null,away:null,xa:null,offline:null,none:null,Unknown_instance_tag:null,Not_one_of_our_latest_keys:null,Received_an_unreadable_encrypted_message:null,Online:null,Chatty:null,Away:null,Extended_away:null,Offline:null,Friendship_request:null,Confirm:null,Dismiss:null,Remove:null,Online_help:null,FN:null,N:null,FAMILY:null,GIVEN:null,NICKNAME:null,URL:null,ADR:null,STREET:null,EXTADD:null,LOCALITY:null,REGION:null,PCODE:null,CTRY:null,TEL:null,NUMBER:null,EMAIL:null,USERID:null,ORG:null,ORGNAME:null,ORGUNIT:null,TITLE:null,ROLE:null,BDAY:null,DESC:null,PHOTO:null,send_message:null,get_info:null,Settings:null,Priority:null,Save:null,User_settings:null,A_fingerprint_:null,Your_roster_is_empty_add_a:null,new_buddy:null,is:null,Login_options:null,BOSH_url:null,Domain:null,Resource:null,On_login:null,Received_an_unencrypted_message:null,Sorry_your_buddy_doesnt_provide_any_information:null,Info_about:null,Authentication_aborted:null,Authentication_request_received:null,Do_you_want_to_display_them:null,Log_in_without_chat:null,has_come_online:null,Unknown_sender:null,You_received_a_message_from_an_unknown_sender:null,Please_allow_access_to_microphone_and_camera:null,Incoming_call:null,from:null,Do_you_want_to_accept_the_call_from:null,Reject:null,Accept:null,hang_up:null,snapshot:null,mute_my_audio:null,pause_my_video:null,fullscreen:null,Info:null,Local_IP:null,Remote_IP:null,Local_Fingerprint:null,Remote_Fingerprint:null,Video_call_not_possible:null,Start_video_call:null}},pl:{translation:{Logging_in:"Logowanie...",your_connection_is_unencrypted:"Twoje połączenie nie jest szyfrowane.",your_connection_is_encrypted:"Twoje połączenie jest szyfrowane.",your_buddy_closed_the_private_connection:"Twój rozmówca zamknął połączenie.",start_private:"Rozpocznij rozmowę.",close_private:"Zakończ rozmowę.",your_buddy_is_verificated:"Twój rozmówca został zweryfikowany.",you_have_only_a_subscription_in_one_way:"Masz jednostronną subskrypcję.",authentication_query_sent:"Wysłano proźbę o autentykację.",your_message_wasnt_send_please_end_your_private_conversation:"Twoja wiadomość nie została wysłana. Proszę, zamknij rozmowę.",unencrypted_message_received:"Zwrotna niezaszyfrowana wiadomość.",your_message_wasnt_send_because_you_have_no_valid_subscription:"Wiadomość nie została wysłana ponieważ nie posiadasz subskrybcji u rozmówcy.",not_available:"Niedostępny.",no_connection:"Brak połączenia!",relogin:"Połącz ponownie",trying_to_start_private_conversation:"Rozpocznij rozmowę!",Verified:"Zweryfikowano",Unverified:"Niezweryfikowano",private_conversation_started:"Rozmowa prywatna rozpoczęta.",private_conversation_aborted:"Anulowano rozmowę!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Rozmówca przerwał połączenie!",conversation_is_now_verified:"Zweryfikowano połączenie.",authentication_failed:"Weryfikacja się nie powiodła.",your_buddy_is_attempting_to_determine_:"Twój rozmówca próbuje się z Tobą połączyć.",to_authenticate_to_your_buddy:"Autoryzacja z rozmówcą, ",enter_the_answer_and_click_answer:"napisz odpowiedź.",enter_the_secret:"wpisz hasło.",Creating_your_private_key_:"Tworzenie klucza prywatnego; może to chwilę potrwać",Authenticating_a_buddy_helps_:"Autoryzacja pomoże w ustaleniu faktycznej tożsamości rozmówcy ;).",How_do_you_want_to_authenticate_your_buddy:"Jakiej autoryzacji chcesz użyć {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Wybierz sposób...",Manual:"Ręcznie",Question:"Pytanie",Secret:"Hasło",To_verify_the_fingerprint_:"Aby zweryfikować kod najpierw skontaktuj się z rozmówcą np. za pomocą telefonu.",Your_fingerprint:"Twój kod:",Buddy_fingerprint:"Kod rozmówcy",Close:"Zamknij",Compared:"Porównano",To_authenticate_using_a_question_:"Aby autoryzować za pomocą pytania, wybierz pytanie na które tylko Twój rozmówca zna odpowiedź.",Ask:"Zadaj pytanie",To_authenticate_pick_a_secret_:"Aby autoryzować za pomocą hasła, wybierz hasło na które zna tylko Twój rozmówca.",Compare:"Dopasuj",Fingerprints:"Kody autoryzacyjne",Authentication:"Autoryzacja",Message:"Wiadomość",Add_buddy:"Dodaj kontakt",rename_buddy:"Zmień nazwę",delete_buddy:"Usuń kontakt",Login:"Login",Username:"Nazwa Użytkownika",Password:"Hasło",Cancel:"Anuluj",Connect:"Połączenie",Type_in_the_full_username_:"Wpisz pełną nazwę użytkownika (np. <B>imię.nazwisko@zajezdnia.local</B>) oraz jego nazwę wyświetlaną (Alias).",Alias:"Alias",Add:"Dodaj",Subscription_request:"Potwierdzenie subskrypcji",You_have_a_request_from:"Masz potwierdzenie od",Deny:"Odmów",Approve:"Zatwierdź",Remove_buddy:"Usuń rozmówcę",You_are_about_to_remove_:"Twój rozmówca {{bid_name}} (<b>{{bid_jid}}</b>) usunął Cię ze swojej listy kontaktów.",Continue_without_chat:"Kontynuuj bez komunikatora",Please_wait:"Proszę czekać",Login_failed:"Błędne logowanie",Sorry_we_cant_authentikate_:"Błędna autoryzacja z serwerem. Może hasło jest nieprawidłowe?",Retry:"Powrót",clear_history:"Wyczyść historię",New_message_from:"Nowa wiadomość od",Should_we_notify_you_:"Czy chcesz otrzymywać powiadomienia o nowych wiadomościach w przyszłości?",Please_accept_:'Kliknij "Zezwól" na górze.',Hide_offline:"Schowaj niedostępne kontakty",Show_offline:"Pokaż niedostępne kontakty",About:"Info",dnd:"Nie przeszkadzać",Mute:"Wycisz",Unmute:"Włącz dźwięk",Subscription:"Subskrybcja",both:"obustronna",Status:"Status",online:"Dostępny",chat:"czat",away:"z dala od kompa",xa:"hen hen...",offline:"niedostępny",none:"brak",Unknown_instance_tag:"Nieznany przypadek.",Not_one_of_our_latest_keys:"Not one of our latest keys.",Received_an_unreadable_encrypted_message:"Received an unreadable encrypted message.",Online:"Połączony",Chatty:"Pogawędzimy?",Away:"Daleko",Extended_away:"Hen Hen...",Offline:"Niedostępny",Friendship_request:"Zapytanie od znajomego?",Confirm:"Potwierdzenie",Dismiss:"Odwołaj",Remove:"Usuń",Online_help:"Pomoc Online",FN:"Pełna nazwa",N:" ",FAMILY:"Nazwisko",GIVEN:"Imię",NICKNAME:"Pseudonim",URL:"Strona WWW",ADR:"Adres",STREET:"Ulica",EXTADD:"Extended Address",LOCALITY:"Lokalizacja",REGION:"Region",PCODE:"Kod pocztowy",CTRY:"Kraj",TEL:"Telefon",NUMBER:"Numer",EMAIL:"Email",USERID:" ",ORG:"Organizacja",ORGNAME:"Nazwa",ORGUNIT:"Jednostka",TITLE:"Stanowisko",ROLE:"Rola",BDAY:"Data urodzin",DESC:"Opis",PHOTO:" ",send_message:"Wyślij wiadomość",get_info:"Pokaż informację",Settings:"Ustawienia",Priority:"Priorytet",Save:"Zapisz",User_settings:"Ustawienia Użytkownika",A_fingerprint_:"Kod służy do autoryzacji Twojego rozmówcy aby potwierdzić jego tożsamość.",Your_roster_is_empty_add_a:"Twoja lista jest pusta, dodaj kontakty ",new_buddy:"Nowy kontakt",is:"jest",Login_options:"opcje logowania",BOSH_url:"Adres BOSH",Domain:"Domena",Resource:"Źródło",On_login:"Na login",Received_an_unencrypted_message:"Zatwierdzono nieszyfrowaną wiadomość.",Sorry_your_buddy_doesnt_provide_any_information:"Twój rozmówca nie posiada żadnych informacji.",Info_about:"Informacja o...",Authentication_aborted:"Autoryzacja anulowana.",Authentication_request_received:"Prośba o autoryzację została przyjęta.",Do_you_want_to_display_them:"Chcesz to wyświetlić?",Log_in_without_chat:"Zaloguj bez komunikatora",has_come_online:"jest teraz dostępny",Unknown_sender:"Nieznany nadawca",You_received_a_message_from_an_unknown_sender:"Masz wiadomość od nieznanego nadawcy.",Please_allow_access_to_microphone_and_camera:'Kliknij "Potwierdź" na górze, aby móc korzystać z mikrofonu oraz kamery.',Incoming_call:"Przychodzące połączenie",from:"z",Do_you_want_to_accept_the_call_from:"Akceptujesz połączenie od",Reject:"Odrzuć",Accept:"Zaakceptuj",hang_up:"odbierz",snapshot:"zrób zdjęcie",mute_my_audio:"wycisz dźwięk",pause_my_video:"zatrzymaj moje wideo",fullscreen:"Pełny ekran",Info:"Informacja",Local_IP:"Adres IP",Remote_IP:"Zdalny adres IP",Local_Fingerprint:"Kod lokalny",Remote_Fingerprint:"Zdalny kod",Video_call_not_possible:"Rozmowa wideo jest niemożliwa. Twój rozmówca nie ma możliwości prowadzenia takich rozmów.",Start_video_call:"Rozpocznij rozmowę wideo"}},"pt-BR":{translation:{Logging_in:"Entrando...",your_connection_is_unencrypted:"Sua conexão não é encriptada",your_connection_is_encrypted:"Sua conexão é encriptada",your_buddy_closed_the_private_connection:"Seu contato fechou a conexão privada",start_private:"Iniciar conversa privada",close_private:"Fechar conversa privada",your_buddy_is_verificated:"Seu contato está verificado",you_have_only_a_subscription_in_one_way:"Você só tem a inscrição one-way",authentication_query_sent:"Pergunta de autenticação enviada",your_message_wasnt_send_please_end_your_private_conversation:"Sua mensagem não foi enviada. Por favor finalize sua conversa privada",unencrypted_message_received:"Mensagem não encriptada recebida",your_message_wasnt_send_because_you_have_no_valid_subscription:"Sua mensagem não foi enviada porque sua inscrição não é válida",not_available:"Indisponível",no_connection:"Sem conexão!",relogin:"reentrar",trying_to_start_private_conversation:"Tentando iniciar conversa privada",Verified:"Verificado",Unverified:"Não verificado",private_conversation_started:"Conversa privada iniciada.",private_conversation_aborted:"Conversa privada abortada!",your_buddy_closed_the_private_conversation_you_should_do_the_same:"Seu contato encerrou a conversa privada! Você deveria fazer o mesmo.",conversation_is_now_verified:"Conversa verificada.",authentication_failed:"Autenticação falhou.",your_buddy_is_attempting_to_determine_:"Seu contato está tentando determinar se ele realmente está falando contigo.",to_authenticate_to_your_buddy:"Para autenticar seu contato, ",enter_the_answer_and_click_answer:"entre com a resposta e clique em Responder.",enter_the_secret:"escreva a senha.",Creating_your_private_key_:"Criando sua chave privada: isso pode demorar um pouco.",Authenticating_a_buddy_helps_:"Autenticar seu contato ajuda a garantir que a pessoa com a qual você está falando é realmente a pessoa que ela alega ser.",How_do_you_want_to_authenticate_your_buddy:"Como você gostaria de se autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?",Select_method:"Selecione o método...",Manual:"Manual",Question:"Pergunta",Secret:"Senha",To_verify_the_fingerprint_:"Para verificar o fingerprint, entre em contato com seu contato usando outro meio, de preferência seguro, como o telefone.",Your_fingerprint:"Seu fingerprint",Buddy_fingerprint:"Fingerprint do contato",Close:"Fechar",Compared:"Comparado",To_authenticate_using_a_question_:"Para autenticar seu contato faça uma pergunta, mas escolha que só ele saiba a resposta.",Ask:"Pergunta",To_authenticate_pick_a_secret_:"Para autenticar, escolha um segredo que somente você e seu contato saibam.",Compare:"Compare",Fingerprints:"Fingerprints",Authentication:"Autenticação",Message:"Mensagem",Add_buddy:"Adicionar contato",rename_buddy:"renomear contato",delete_buddy:"remover contato",Login:"Entrar",Username:"Usuário",Password:"Senha",Cancel:"Cancelar",Connect:"Conectar",Type_in_the_full_username_:"Digite seu nome completo e um apelido opcional.",Alias:"Apelido",Add:"Adicionar",Subscription_request:"Pedido de inscrição",You_have_a_request_from:"Você tem um pedido de",Deny:"Negar",Approve:"Aprovar",Remove_buddy:"Remover contato",You_are_about_to_remove_:"Você está prestes a remover {{bid_name}} (<b>{{bid_jid}}</b>) de sua lista de contatos. Todas as conversas serão fechadas.",Continue_without_chat:"Continue sem converar",Please_wait:"Por favor aguarde",Login_failed:"Autenticação da conversa falhou",Sorry_we_cant_authentikate_:"A autenticação com o servidor falhou. Talvez seja a senha errada?",Retry:"Voltar",clear_history:"Limpar histórico",New_message_from:"Nova mensagem de",Should_we_notify_you_:"Devemos continuar notificando sobre novas mensagens no futuro?",Please_accept_:'Por favor clique no botão "Permitir" na parte superior.',Hide_offline:"Esconder contatos desconectados",Show_offline:"Mostrar contatos desconectados",About:"Sobre",dnd:"Não perturbe",Mute:"Mudo",Unmute:"Ligar",Subscription:"Inscrição",both:"ambos",Status:"Status",online:"online",chat:"conversa",away:"ausente",xa:"ausente por mais tempo",offline:"desativado",none:"nenhum",Unknown_instance_tag:"Marcação desconhecida da instância",Not_one_of_our_latest_keys:"Nenhuma de nossas ultimas chaves.",Received_an_unreadable_encrypted_message:"Mensagem encriptada ilegível foi recebida.",Online:"Online",Chatty:"Tagarela",Away:"Ausente",Extended_away:"Ausente por mais tempo",Offline:"Desativado",Friendship_request:"Pedido de amizade",Confirm:"Confirmar",Dismiss:"Ignorar",Remove:"Remover",Online_help:"Ajuda online",FN:"Nome completo",N:" ",FAMILY:"Sobrenome",GIVEN:"Nome",NICKNAME:"Apelido",URL:"URL",ADR:"Endereço",STREET:"Rua, Av, etc",EXTADD:"Complemento",LOCALITY:"Localidade",REGION:"Região",PCODE:"CEP",CTRY:"País",TEL:"Telefone",NUMBER:"Número",EMAIL:"Email",USERID:" ",ORG:"Empresa",ORGNAME:"Nome",ORGUNIT:"Unidade",TITLE:"Cargo",ROLE:"Rol",BDAY:"Data de nascimento",DESC:"Descrição",PHOTO:" ",send_message:"Enviar mensagem",get_info:"Exibir informações",Settings:"Configurações",Priority:"Prioridade",Save:"Salvar",User_settings:"Configurações do usuário",A_fingerprint_:"O fingerprint é usado para certificar que a pessoa com a qual se está falando é que ela diz ser.",Your_roster_is_empty_add_a:"Sua lista está vazia, adicione um ",new_buddy:"novo contato",is:"é",Login_options:"Opções de login",BOSH_url:"BOSH URL",Domain:"Domínio",Resource:"Recurso",On_login:"Ao autenticar",Received_an_unencrypted_message:"Mensagem não encriptada recebida",Sorry_your_buddy_doesnt_provide_any_information:"Desculpe, seu contato não forneceu nenhuma informação",Info_about:"Informações sobre",Authentication_aborted:"Autenticação encerrada.",Authentication_request_received:"Pedido de autenticação recebido",Do_you_want_to_display_them:"Você quer mostrá-los?",Log_in_without_chat:"Entrar sem conversar",has_come_online:"ficou online",Unknown_sender:"Emissor desconhecido",You_received_a_message_from_an_unknown_sender:"Você recebeu uma mensagem de um emissor desconhecido",Please_allow_access_to_microphone_and_camera:'Por favor clique no botão "Permitir" no topo, para conceder acesso ao seu microfone e câmera.',Incoming_call:"Recebendo chamada",from:"de",Do_you_want_to_accept_the_call_from:"Você aceita a chamada de",Reject:"Negar",Accept:"Aceitar",hang_up:"desligar",snapshot:"registrar imagem",mute_my_audio:"mudo",pause_my_video:"pausar vídeo",fullscreen:"tela cheia",Info:"Informações",Local_IP:"IP local",Remote_IP:"IP remoto",Local_Fingerprint:"Fingerprint local",Remote_Fingerprint:"Fingerprint remoto",Video_call_not_possible:"Chamada de vídeo impossível. Seu contato não suporta chamadas desse tipo.",Start_video_call:"Iniciar chamada de vídeo"}},ro:{translation:{Logging_in:null,your_connection_is_unencrypted:null,your_connection_is_encrypted:null,your_buddy_closed_the_private_connection:null,start_private:null,close_private:null,your_buddy_is_verificated:null,you_have_only_a_subscription_in_one_way:null,authentication_query_sent:null,your_message_wasnt_send_please_end_your_private_conversation:null,unencrypted_message_received:null,your_message_wasnt_send_because_you_have_no_valid_subscription:null,not_available:null,no_connection:null,relogin:null,trying_to_start_private_conversation:null,Verified:null,Unverified:null,private_conversation_started:null,private_conversation_aborted:null,your_buddy_closed_the_private_conversation_you_should_do_the_same:null,conversation_is_now_verified:null,authentication_failed:null,your_buddy_is_attempting_to_determine_:null,to_authenticate_to_your_buddy:null,enter_the_answer_and_click_answer:null,enter_the_secret:null,Creating_your_private_key_:null,Authenticating_a_buddy_helps_:null,How_do_you_want_to_authenticate_your_buddy:null,Select_method:null,Manual:null,Question:null,Secret:null,To_verify_the_fingerprint_:null,Your_fingerprint:null,Buddy_fingerprint:null,Close:null,Compared:null,To_authenticate_using_a_question_:null,Ask:null,To_authenticate_pick_a_secret_:null,Compare:null,Fingerprints:null,Authentication:null,Message:null,Add_buddy:null,rename_buddy:null,delete_buddy:null,Login:null,Username:null,Password:null,Cancel:null,Connect:null,Type_in_the_full_username_:null,Alias:null,Add:null,Subscription_request:null,You_have_a_request_from:null,Deny:null,Approve:null,Remove_buddy:null,You_are_about_to_remove_:null,Continue_without_chat:null,Please_wait:null,Login_failed:null,Sorry_we_cant_authentikate_:null,Retry:null,clear_history:null,New_message_from:null,Should_we_notify_you_:null,Please_accept_:null,Hide_offline:null,Show_offline:null,About:null,dnd:null,Mute:null,Unmute:null,Subscription:null,both:null,Status:null,online:null,chat:null,away:null,xa:null,offline:null,none:null,Unknown_instance_tag:null,Not_one_of_our_latest_keys:null,Received_an_unreadable_encrypted_message:null,Online:null,Chatty:null,Away:null,Extended_away:null,Offline:null,Friendship_request:null,Confirm:null,Dismiss:null,Remove:null,Online_help:null,FN:null,N:null,FAMILY:null,GIVEN:null,NICKNAME:null,URL:null,ADR:null,STREET:null,EXTADD:null,LOCALITY:null,REGION:null,PCODE:null,CTRY:null,TEL:null,NUMBER:null,EMAIL:null,USERID:null,ORG:null,ORGNAME:null,ORGUNIT:null,TITLE:null,ROLE:null,BDAY:null,DESC:null,PHOTO:null,send_message:null,get_info:null,Settings:null,Priority:null,Save:null,User_settings:null,A_fingerprint_:null,Your_roster_is_empty_add_a:null,new_buddy:null,is:null,Login_options:null,BOSH_url:null,Domain:null,Resource:null,On_login:null,Received_an_unencrypted_message:null,Sorry_your_buddy_doesnt_provide_any_information:null,Info_about:null,Authentication_aborted:null,Authentication_request_received:null,Do_you_want_to_display_them:null,Log_in_without_chat:null,has_come_online:null,Unknown_sender:null,You_received_a_message_from_an_unknown_sender:null,Please_allow_access_to_microphone_and_camera:null,Incoming_call:null,from:null,Do_you_want_to_accept_the_call_from:null,Reject:null,Accept:null,hang_up:null,snapshot:null,mute_my_audio:null,pause_my_video:null,fullscreen:null,Info:null,Local_IP:null,Remote_IP:null,Local_Fingerprint:null,Remote_Fingerprint:null,Video_call_not_possible:null,Start_video_call:null}}};
+
//# sourceMappingURL=jsxc.dep.min.js.map \ No newline at end of file
diff --git a/build/js/jsxc/lib/jsxc.dep.min.js.map b/build/js/jsxc/lib/jsxc.dep.min.js.map
index 3cabcc4..3fe5879 100644
--- a/build/js/jsxc/lib/jsxc.dep.min.js.map
+++ b/build/js/jsxc/lib/jsxc.dep.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"jsxc.dep.min.js","sources":["jsxc.dep.js"],"names":["b64_sha1","s","binb2b64","core_sha1","str2binb","length","str_sha1","binb2str","b64_hmac_sha1","key","data","core_hmac_sha1","str_hmac_sha1","x","len","i","j","t","olda","oldb","oldc","oldd","olde","w","Array","a","b","c","d","e","rol","safe_add","sha1_ft","sha1_kt","bkey","ipad","opad","hash","concat","y","lsw","msw","num","cnt","str","bin","mask","charCodeAt","String","fromCharCode","binarray","triplet","tab","charAt","Base64","keyStr","obj","encode","input","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","isNaN","decode","replace","indexOf","MD5","bit_rol","str2binl","binl2str","binl2hex","hex_tab","md5_cmn","q","md5_ff","md5_gg","md5_hh","md5_ii","core_md5","hexdigest","Function","prototype","bind","func","this","_slice","slice","_concat","_args","call","arguments","apply","elt","from","Number","Math","ceil","floor","callback","$build","name","attrs","Strophe","Builder","$msg","$iq","$pres","VERSION","NS","HTTPBIND","BOSH","CLIENT","AUTH","ROSTER","PROFILE","DISCO_INFO","DISCO_ITEMS","MUC","SASL","STREAM","BIND","SESSION","STANZAS","XHTML_IM","XHTML","tags","attributes","blockquote","br","cite","em","img","li","ol","p","span","strong","ul","body","css","validTag","tag","validAttribute","attribute","validCSS","style","Status","ERROR","CONNECTING","CONNFAIL","AUTHENTICATING","AUTHFAIL","CONNECTED","DISCONNECTED","DISCONNECTING","ATTACHED","LogLevel","DEBUG","INFO","WARN","FATAL","ElementType","NORMAL","TEXT","CDATA","FRAGMENT","TIMEOUT","SECONDARY_TIMEOUT","addNamespace","value","forEachChild","elem","elemName","childNode","childNodes","nodeType","isTagEqual","el","tagName","toLowerCase","_xmlGenerator","_makeGenerator","doc","undefined","document","implementation","createDocument","documentMode","_getIEXmlDom","appendChild","createElement","xmlGenerator","docStrings","ActiveXObject","xmlElement","k","node","xmlTextNode","setAttribute","hasOwnProperty","xmlescape","text","createTextNode","xmlHtmlNode","html","window","DOMParser","parser","parseFromString","async","loadXML","getText","nodeValue","copyElement","nodeName","createHtml","cssAttrs","attr","cssName","cssValue","getAttribute","cssText","split","push","join","createDocumentFragment","escapeNode","unescapeNode","getNodeFromJid","jid","getDomainFromJid","bare","getBareJidFromJid","parts","splice","getResourceFromJid","log","debug","msg","info","warn","error","fatal","serialize","result","tree","child","_requestId","_connectionPlugins","addConnectionPlugin","ptype","xmlns","nodeTree","toString","up","parentNode","moreattrs","cnode","impNode","xmlGen","importNode","newElem","h","fragment","innerHTML","xhtml","Handler","handler","ns","type","id","options","matchBare","user","isMatch","nsMatch","that","run","sourceURL","line","message","fileName","console","trace","lineNumber","stack","TimedHandler","period","lastCalled","Date","getTime","reset","Connection","service","proto","protocol","_proto","Websocket","Bosh","domain","features","_sasl_data","do_session","do_bind","timedHandlers","handlers","removeTimeds","removeHandlers","addTimeds","addHandlers","_authentication","_idleTimeout","_disconnectTimeout","do_authentication","authenticated","disconnecting","connected","errors","paused","_data","_uniqueId","_sasl_success_handler","_sasl_failure_handler","_sasl_challenge_handler","maxRetries","setTimeout","_onIdle","F","init","_reset","_requests","pause","resume","getUniqueId","suffix","connect","pass","wait","hold","route","authzid","authcid","servtype","connect_callback","_changeConnectStatus","_connect","attach","sid","rid","wind","_attach","xmlInput","xmlOutput","rawInput","rawOutput","send","_queueData","_send","flush","clearTimeout","sendIQ","errback","timeout","timeoutHandler","addHandler","stanza","deleteTimedHandler","iqtype","addTimedHandler","deleteHandler","element","_sendRestart","thand","handRef","hand","disconnect","reason","pres","_addSysTimedHandler","_onDisconnectTimeout","_disconnect","status","condition","plugin","statusChanged","err","_doDisconnect","_dataRecv","req","raw","_reqToData","strip","pop","_emptyQueue","cond","conflict","typ","getElementsByTagName","newList","mechanisms","_connect_cb","_callback","bodyWrap","conncheck","sasl_scram_sha1","sasl_plain","sasl_digest_md5","sasl_anonymous","legacy_auth","hasFeatures","mech","matched","found_authentication","_no_auth_received","authenticate","higher","priority","swap","mechanism_found","test","_addSysHandler","_sasl_success_cb","_sasl_failure_cb","_sasl_challenge_cb","_sasl_mechanism","onStart","request_auth_exchange","mechanism","isClientFirst","response","onChallenge","_auth1_cb","to","challenge","iq","_auth2_cb","serverSignature","success","attribMatch","matches","match","onSuccess","_sasl_auth1_cb","_sasl_bind_cb","resource","jidNode","_sasl_session_cb","onFailure","since","now","SASLMechanism","connection","_connection","Error","SASLAnonymous","SASLPlain","auth_str","SASLSHA1","test_cnonce","cnonce","random","nonce","salt","iter","Hi","U","U_old","clientKey","serverKey","clientSignature","responseText","authMessage","substr","SASLMD5","_quote","realm","host","qop","digest_uri","A1","A2","Request","sends","xmlData","origFunc","date","NaN","abort","dead","age","timeDead","xhr","_newXHR","getResponse","responseXML","documentElement","XMLHttpRequest","overrideMimeType","onreadystatechange","_conn","_buildBody","jQuery","trigger","xml:lang","content","ver","xmpp:version","xmlns:xmpp","_onRequestStateChange","_throttledRequestHandler","parseInt","_sendTerminate","_hitError","reqStatus","xmpp:restart","_processRequest","time_elapsed","readyState","reqIs0","reqIs1","_removeRequest","_restartRequest","self","primaryTimeout","secondaryTimeout","requestCompletedWithServerError","open","sync","e2","sendFunc","customHeaders","headers","header","setRequestHeader","backoff","min","pow","abs","new_service","location","pathname","_buildStream","xmlns:stream","version","_check_streamerror","connectstatus","textContent","errorString","_closeSocket","socket","WebSocket","onopen","_onOpen","onerror","_onError","onclose","_onClose","onmessage","_connect_cb_wrapper","_handleStreamStart","ns_stream","namespaceURI","streamStart","string","_streamWrap","_onMessage","CLOSED","close","rawStanza","_removeClosingTag","search","firstChild","start","startString","Occupant","RoomConfig","XmppRoom","__bind","fn","me","rooms","roomNames","conn","_muc_handler","room","nick","msg_handler_cb","pres_handler_cb","roster_cb","password","history_attrs","extended_presence","room_nick","_ref","_this","test_append_nick","roomname","xquery","_i","_len","_message_handlers","_presence_handlers","leave","handler_cb","exit_msg","presence","presenceid","html_message","msgid","parent","removeChild","groupchat","invite","receiver","invitation","MUC_USER","directInvite","queryOccupants","success_cb","error_cb","configure","config","MUC_OWNER","cancelConfigure","saveConfiguration","conf","Form","toXML","createInstantRoom","roomiq","setTopic","topic","_modifyPrivilege","item","MUC_ADMIN","modifyRole","role","kick","voice","mute","op","deop","modifyAffiliation","affiliation","ban","member","revoke","owner","admin","changeNick","setStatus","show","listRooms","server","handle_cb","client","_roomRosterHandler","_addOccupant","roster","_roster_handlers","_handler_ids","muc","handler_type","removeHandler","occ","newnick","_parsePresence","update","c2","_j","_len1","_ref1","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","states","code","parse","field","identity","query","_k","_len2","identities","var","label","_identities","_features","_items","_onDiscoInfo","_onDiscoItems","addIdentity","category","lang","addFeature","var_name","removeFeature","addItem","call_back","items","_buildIQResult","query_attrs","iqresult","$","HASH","_ver","_knownCapabilities","JSON","localStorage","getItem","_jidVerIndex","disco","CAPS","_delegateCapabilities","generateCapsAttrs","generateVer","sort","_sortIdentities","identitiesLen","featuresLen","curIdent","getCapabilitiesByJid","hasFeatureByJid","feature","isArray","makeArray","querySelector","setItem","stringify","_requestCapabilities","_handleDiscoInfoReply","childNodesLen","_attributesToJsObject","buildIq","vCardEl","VCARD","get","set","error_rb","sessions","jid2session","ice_config","iceServers","pc_constraints","media_constraints","mandatory","OfferToReceiveAudio","OfferToReceiveVideo","localStream","onJingle","find","action","ack","sess","peerjid","JingleSession","localStreams","initiate","setRemoteDescription","startmuted","accept","terminate","addIceCandidate","affected","addSource","removeSource","myjid","sendOffer","state","sendTerminate","active","terminateByJid","getStunAndTurnCredentials","res","iceservers","each","idx","dict","url","navigator","userAgent","username","credential","initiator","responder","isInitiator","peerconnection","remoteStream","localSDP","remoteSDP","relayedStreams","remoteStreams","startTime","stopTime","drip_container","usetrickle","usepranswer","usedrip","hadstuncandidate","hadturncandidate","lasticecandidate","statsinterval","addssrc","removessrc","pendingop","nickname","filter_candidates","RTCPeerconnection","onicecandidate","event","sendIceCandidate","candidate","onaddstream","stream","onremovestream","onsignalingstatechange","oniceconnectionstatechange","iceConnectionState","forEach","addStream","pranswer","localDescription","lines","SDPUtil","find_lines","sdp","find_line","prsdp","SDP","toJingle","source","setLocalDescription","RTCSessionDescription","clearInterval","ice","iceparams","media","sdpMLineIndex","session","jcand","candidateToJingle","sendIceCandidates","signalingState","candidates","cand","mid","cands","filter","creator","sdpMid","tmp","parse_fingerprint","required","fingerprint","createOffer","createdOffer","parse_icecandidate","desctype","fromJingle","remoteDescription","remotedesc","cobbled","iscomplete","mediapart","candidateFromJingle","RTCIceCandidate","sendAnswer","provisional","createAnswer","createdAnswer","jingle","getAudioTracks","track","enabled","getVideoTracks","term","ssrc","modifySources","modifiedAnswer","hardMuteVideo","muted","sendMute","sendRinging","getStats","interval","recv","audio","video","lost","lastrecv","lastlost","loss","delta","setInterval","stats","results","packetsrecv","stat","packetslost","shift","mangle","mline","rtpmap","newdesc","parse_mline","fmt","parse_rtpmap","build_mline","removeSessionLines","prefix","removeMediaLines","mediaindex","thecreator","semantics","bundle","substring","parse_mid","parse_fmtp","RtcpFbToJingle","crypto","parse_crypto","ssrclines","linessrc","kv","parse_ssrc","parse_extmap","uri","direction","senders","TransportToJingle","port","fingerprints","setup","payloadtype","parse_rtcpfb","params","subtype","RtcpFbFromJingle","group","contents","map","m","jingle2media","desc","build_iceufrag","build_icepwd","build_rtpmap","mediadesc","sessiondesc","ufrag","parse_iceufrag","pwd","parse_icepwd","frag","clockrate","channels","elems","foundation","component","ip","generation","tcptype","network","build_icecandidate","hasOwnAttribute","pt","haystack","needle","sessionpart","needles","setupRTC","getUserMediaWithConstraints","TraceablePeerConnection","constraints","mozGetUserMedia","mozRTCPeerConnection","webkitRTCPeerConnection","updateLog","maxstats","what","time","onnegotiationneeded","ondatachannel","names","endTime","values","times","dumpSDP","description","__defineGetter__","removeStream","createDataChannel","opts","successCallback","failureCallback","offer","answer","RTC","browser","getUserMedia","attachMediaStream","mozSrcObject","play","MediaStream","mozRTCSessionDescription","mozRTCIceCandidate","webkitGetUserMedia","webkitURL","createObjectURL","optional","DtlsSrtpKeyAgreement","webkitMediaStream","videoTracks","audioTracks","um","resolution","bandwidth","fps","chromeMediaSource","minWidth","minHeight","minAspectRatio","maxFrameRate","minFrameRate","root","factory","define","amd","module","exports","Salsa20","rounds","sigmaWords","keyWords","nonceWords","counterWords","block","blockUsed","setKey","setNonce","getBytes","numberOfBytes","out","_generateBlock","_incrementCounter","getHexString","hex","bytes","u","j0","j1","j2","j3","j4","j5","j6","j7","j8","j9","j10","j11","j12","j13","j14","j15","x0","x1","x2","x3","x4","x5","x6","x7","x8","x9","x10","x11","x12","x13","x14","x15","msCrypto","require","BigInt","findPrimes","n","ans","millerRabin","mr_x1","dup","mr_r","mr_a","copy_","addInt_","isZero","bpe","rightShift_","powMod_","equalsInt","equals","squareMod_","bitSize","z","expand","int2bigInt","mod","mod_","trim","mult","mult_","powMod","sub","sub_","add","add_","inverseMod","inverseMod_","multMod","multMod_","randBigInt","randBigInt_","randomBitInt","max","copyInt_","eg_u","eg_v","eg_A","eg_B","eg_C","eg_D","halve_","greater","negative","inverseModInt","greaterShift","kx","ky","divide_","r","y1","y2","leftShift_","subShift_","radix","linCombShift_","addShift_","modInt","bits","minSize","buff","str2bigInt","base","kk","bb","digitsStr","multInt_","bigInt2str","s6","divInt_","ys","ss","s4","s5","s0","k1","k2","kn","np","s7","s3","mont_","one","ui","t2","ks","sa","divMod","den","subMod","two","twoToThe","bigInt2bits","bi","pad","ba","_num2bin","ba2bigInt","mpi","getSeed","randomBytes","randomByte","primes","buf","getRandomValues","Uint8Array","CryptoJS","C","C_lib","lib","Base","extend","overrides","mixIn","$super","create","instance","properties","propertyName","clone","WordArray","words","sigBytes","encoder","Hex","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","nBytes","C_enc","enc","hexChars","bite","hexStr","hexStrLength","Latin1","latin1Chars","latin1Str","latin1StrLength","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","blockSizeBytes","nBlocksReady","_minBufferSize","nWordsReady","nBytesReady","offset","_doProcessBlock","processedWords","C_algo","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","HMAC","algo","_map","base64Chars","byte1","byte2","byte3","paddingChar","base64Str","base64StrLength","paddingIndex","bits1","bits2","Cipher","EvpKDF","createEncryptor","_ENC_XFORM_MODE","createDecryptor","_DEC_XFORM_MODE","xformMode","_xformMode","_key","process","dataUpdate","finalProcessedData","keySize","ivSize","selectCipherStrategy","PasswordBasedCipher","SerializableCipher","cipher","encrypt","decrypt","ciphertext","C_mode","StreamCipher","finalProcessedBlocks","mode","BlockCipherMode","iv","Encryptor","Decryptor","_cipher","_iv","CBC","xorBlock","_prevBlock","processBlock","encryptBlock","thisBlock","decryptBlock","C_pad","Pkcs7","nPaddingBytes","paddingWord","paddingWords","padding","unpad","CipherParams","BlockCipher","modeCreator","_mode","cipherParams","formatter","C_format","format","OpenSSLFormatter","OpenSSL","openSSLStr","ciphertextWords","encryptor","cipherCfg","algorithm","_parse","plaintext","C_kdf","kdf","OpenSSLKdf","execute","compute","derivedParams","SBOX","INV_SBOX","SUB_MIX_0","SUB_MIX_1","SUB_MIX_2","SUB_MIX_3","INV_SUB_MIX_0","INV_SUB_MIX_1","INV_SUB_MIX_2","INV_SUB_MIX_3","xi","sx","RCON","AES","nRounds","_nRounds","ksRows","keySchedule","_keySchedule","ksRow","invKeySchedule","_invKeySchedule","invKsRow","M","_doCryptBlock","s1","s2","round","t0","t1","t3","W","SHA1","_hash","H","nBitsTotal","nBitsLeft","HmacSHA1","K","isPrime","sqrtN","sqrt","factor","getFractionalBits","nPrime","SHA256","f","g","gamma0x","gamma0","gamma1x","gamma1","ch","maj","sigma0","sigma1","HmacSHA256","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","hmac","NoPadding","CTR","counter","_counter","keystream","EventEmitter","indexOfListener","listeners","listener","alias","getListeners","evt","events","_getEvents","flattenListeners","flatListeners","getListenersAsObject","addListener","listenerIsWrapped","once","on","addOnceListener","defineEvent","defineEvents","evts","removeListener","index","off","addListeners","manipulateListeners","removeListeners","remove","single","multiple","RegExp","removeEvent","_events","emitEvent","args","_getOnceReturnValue","emit","setOnceReturnValue","_onceReturnValue","OTR","DSA","CONST","N","G","MSGSTATE_PLAINTEXT","MSGSTATE_ENCRYPTED","MSGSTATE_FINISHED","AUTHSTATE_NONE","AUTHSTATE_AWAITING_DHKEY","AUTHSTATE_AWAITING_REVEALSIG","AUTHSTATE_AWAITING_SIG","WHITESPACE_TAG","WHITESPACE_TAG_V2","WHITESPACE_TAG_V3","OTR_TAG","OTR_VERSION_1","OTR_VERSION_2","OTR_VERSION_3","SMPSTATE_EXPECT0","SMPSTATE_EXPECT1","SMPSTATE_EXPECT2","SMPSTATE_EXPECT3","SMPSTATE_EXPECT4","STATUS_SEND_QUERY","STATUS_AKE_INIT","STATUS_AKE_SUCCESS","STATUS_END_OTR","intCompare","HLP","DTS","BYTE","SHORT","INT","MAC","SIG","WRAPPER_BEGIN","WRAPPER_END","TWO","Ctor","constructor","Object","__super__","compare","str1","str2","randomExponent","smpHash","fmpi","smpi","sha256","packBytes","packMPI","bits2bigInt","makeMac","aesctr","mac","make1Mac","encryptAes","aesctr_decoded","decryptAes","multPowMod","ZKP","v","GTOE","between","checkGroup","N_MINUS_2","h1","secbytes","sha1","h2","_toString","val","nex","packINT","packCtr","padCtr","ctr","unpackCtr","toByteArray","unpack","arr","packData","packSHORT","short","unpackSHORT","packTLV","readLen","readData","readMPI","packMPIs","reduce","prv","cur","unpackMPIs","mpis","splitype","wrapMsg","fs","v3","our_it","their_it","its","ei","mf","mfs","_bin2num","rv","ary","iz","remain","timer","makeRandom","isProbPrime","B","l","rpprb","generatePrimes","bit_length","rem","repeat","bit_lengths","LM1","bl4","brk","ONE","pm1","prop","KEY_TYPE","ZERO","nocache","tokenizeStr","end","lastIndexOf","splt","es","parseLibotr","o","Worker","WWPath","__dirname","keys","1024","2048","packPublic","packPrivate","generateNonce","priv","rand","sign","pk","parsePublic","fields","parsePrivate","libotr","dsa","verify","hm","u1","u2","createInWebWorker","cb","path","seed","worker","postMessage","imports","Parse","parseMsg","otr","initFragment","ind","com","msgFragment","vers","2","3","qs","qi","cls","instance_tags","ERROR_START_AKE","sendQueryMsg","checkInstanceTags","hMac","gx","gy","kid","AKE","our_dh","our_old_dh","our_keyid","their_y","their_keyid","their_priv_pk","ssid","transmittedRS","meth","createKeys","privateKey","c_prime","m1","m2","m1_prime","m2_prime","verifySignMac","our_dh_pk","vmac","pub","makeM","publicKey","akeSuccess","their_old_y","sessKeys","DHSession","otr_version","authstate","msgstate","myhashed","dhcommit","encrypted","hashed","sendStored","handleAKE","vsm","ourHash","theirHash","dh","gxmpi","sendMsg","our_instance_tag","their_instance_tag","fragment_size","io","initiateAKE","SM","reqs","our_fp","their_fp","Q","smpstate","secret","makeSecret","our","makeG2s","a2","a3","g2a","g3a","computeGs","g2","g3","computePQ","computeR","QoQ","computeRab","computeC","computeD","handleSM","r2","r3","r7","t4","rab","tmp2","cR","d7","ms","trust","expectStates",4,5,7,"question","g3ao","c3","d2","d3","r4","r5","r6","cP","d5","d6","PoP","rcvSecret","OTRCB","send_interval","outgoing","instance_tag","makeInstanceTag","smw","SMWPath","MAX_INT","MAX_UINT","ALLOW_V2","ALLOW_V3","REQUIRE_ENCRYPTION","SEND_WHITESPACE_TAG","WHITESPACE_START_AKE","storedMgs","oldMacKeys","sm","_akeInit","receivedPlaintext","ake","_SMW","method","_smInit","prepareMsg","meta","first","sq","sendbyte","rcvbyte","sendenc","sendmac","rcvenc","rcvmac","rcvmacused","extra_symkey","send_counter","rcv_counter","rotateOurKeys","sk","rotateTheirKeys","esk","notify","aes","handleDataMsg","vt","types","ign","handleTLVs","tlvs","smpSecret","versions","vs","receiveMsg","doAKE","it","severity","sendFile","filename","l1name","endOtr"],"mappings":"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"} \ No newline at end of file
+{"version":3,"file":"jsxc.dep.min.js","sources":["jsxc.dep.js"],"names":["b64_sha1","s","binb2b64","core_sha1","str2binb","length","str_sha1","binb2str","b64_hmac_sha1","key","data","core_hmac_sha1","str_hmac_sha1","x","len","i","j","t","olda","oldb","oldc","oldd","olde","w","Array","a","b","c","d","e","rol","safe_add","sha1_ft","sha1_kt","bkey","ipad","opad","hash","concat","y","lsw","msw","num","cnt","str","bin","mask","charCodeAt","String","fromCharCode","binarray","triplet","tab","charAt","Base64","keyStr","obj","encode","input","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","isNaN","decode","replace","indexOf","MD5","bit_rol","str2binl","binl2str","binl2hex","hex_tab","md5_cmn","q","md5_ff","md5_gg","md5_hh","md5_ii","core_md5","hexdigest","Function","prototype","bind","func","this","_slice","slice","_concat","_args","call","arguments","apply","elt","from","Number","Math","ceil","floor","callback","$build","name","attrs","Strophe","Builder","$msg","$iq","$pres","VERSION","NS","HTTPBIND","BOSH","CLIENT","AUTH","ROSTER","PROFILE","DISCO_INFO","DISCO_ITEMS","MUC","SASL","STREAM","BIND","SESSION","STANZAS","XHTML_IM","XHTML","tags","attributes","blockquote","br","cite","em","img","li","ol","p","span","strong","ul","body","css","validTag","tag","validAttribute","attribute","validCSS","style","Status","ERROR","CONNECTING","CONNFAIL","AUTHENTICATING","AUTHFAIL","CONNECTED","DISCONNECTED","DISCONNECTING","ATTACHED","LogLevel","DEBUG","INFO","WARN","FATAL","ElementType","NORMAL","TEXT","CDATA","FRAGMENT","TIMEOUT","SECONDARY_TIMEOUT","addNamespace","value","forEachChild","elem","elemName","childNode","childNodes","nodeType","isTagEqual","el","tagName","toLowerCase","_xmlGenerator","_makeGenerator","doc","undefined","document","implementation","createDocument","documentMode","_getIEXmlDom","appendChild","createElement","xmlGenerator","docStrings","ActiveXObject","xmlElement","k","node","xmlTextNode","setAttribute","hasOwnProperty","xmlescape","text","createTextNode","xmlHtmlNode","html","window","DOMParser","parser","parseFromString","async","loadXML","getText","nodeValue","copyElement","nodeName","createHtml","cssAttrs","attr","cssName","cssValue","getAttribute","cssText","split","push","join","createDocumentFragment","escapeNode","unescapeNode","getNodeFromJid","jid","getDomainFromJid","bare","getBareJidFromJid","parts","splice","getResourceFromJid","log","debug","msg","info","warn","error","fatal","serialize","result","tree","child","_requestId","_connectionPlugins","addConnectionPlugin","ptype","xmlns","nodeTree","toString","up","parentNode","moreattrs","cnode","impNode","xmlGen","importNode","newElem","h","fragment","innerHTML","xhtml","Handler","handler","ns","type","id","options","matchBare","user","isMatch","nsMatch","that","run","sourceURL","line","message","fileName","console","trace","lineNumber","stack","TimedHandler","period","lastCalled","Date","getTime","reset","Connection","service","proto","protocol","_proto","Websocket","Bosh","domain","features","_sasl_data","do_session","do_bind","timedHandlers","handlers","removeTimeds","removeHandlers","addTimeds","addHandlers","_authentication","_idleTimeout","_disconnectTimeout","do_authentication","authenticated","disconnecting","connected","errors","paused","_data","_uniqueId","_sasl_success_handler","_sasl_failure_handler","_sasl_challenge_handler","maxRetries","setTimeout","_onIdle","F","init","_reset","_requests","pause","resume","getUniqueId","suffix","connect","pass","wait","hold","route","authzid","authcid","servtype","connect_callback","_changeConnectStatus","_connect","attach","sid","rid","wind","_attach","xmlInput","xmlOutput","rawInput","rawOutput","send","_queueData","_send","flush","clearTimeout","sendIQ","errback","timeout","timeoutHandler","addHandler","stanza","deleteTimedHandler","iqtype","addTimedHandler","deleteHandler","element","_sendRestart","thand","handRef","hand","disconnect","reason","pres","_addSysTimedHandler","_onDisconnectTimeout","_disconnect","status","condition","plugin","statusChanged","err","_doDisconnect","_dataRecv","req","raw","_reqToData","strip","pop","_emptyQueue","cond","conflict","typ","getElementsByTagName","newList","mechanisms","_connect_cb","_callback","bodyWrap","conncheck","sasl_scram_sha1","sasl_plain","sasl_digest_md5","sasl_anonymous","legacy_auth","hasFeatures","mech","matched","found_authentication","_no_auth_received","authenticate","higher","priority","swap","mechanism_found","test","_addSysHandler","_sasl_success_cb","_sasl_failure_cb","_sasl_challenge_cb","_sasl_mechanism","onStart","request_auth_exchange","mechanism","isClientFirst","response","onChallenge","_auth1_cb","to","challenge","iq","_auth2_cb","serverSignature","success","attribMatch","matches","match","onSuccess","_sasl_auth1_cb","_sasl_bind_cb","resource","jidNode","_sasl_session_cb","onFailure","since","now","SASLMechanism","connection","_connection","Error","SASLAnonymous","SASLPlain","auth_str","SASLSHA1","test_cnonce","cnonce","random","nonce","salt","iter","Hi","U","U_old","clientKey","serverKey","clientSignature","responseText","authMessage","substr","SASLMD5","_quote","realm","host","qop","digest_uri","A1","A2","Request","sends","xmlData","origFunc","date","NaN","abort","dead","age","timeDead","xhr","_newXHR","getResponse","responseXML","documentElement","XMLHttpRequest","overrideMimeType","onreadystatechange","_conn","_buildBody","jQuery","trigger","xml:lang","content","ver","xmpp:version","xmlns:xmpp","_onRequestStateChange","_throttledRequestHandler","parseInt","_sendTerminate","_hitError","reqStatus","xmpp:restart","_processRequest","time_elapsed","readyState","reqIs0","reqIs1","_removeRequest","_restartRequest","self","primaryTimeout","secondaryTimeout","requestCompletedWithServerError","open","sync","e2","sendFunc","customHeaders","headers","header","setRequestHeader","backoff","min","pow","abs","new_service","location","pathname","_buildStream","xmlns:stream","version","_check_streamerror","connectstatus","textContent","errorString","_closeSocket","socket","WebSocket","onopen","_onOpen","onerror","_onError","onclose","_onClose","onmessage","_connect_cb_wrapper","_handleStreamStart","ns_stream","namespaceURI","streamStart","string","_streamWrap","_onMessage","CLOSED","close","rawStanza","_removeClosingTag","search","firstChild","start","startString","Occupant","RoomConfig","XmppRoom","__bind","fn","me","rooms","roomNames","conn","_muc_handler","room","nick","msg_handler_cb","pres_handler_cb","roster_cb","password","history_attrs","extended_presence","room_nick","_ref","_this","test_append_nick","roomname","xquery","_i","_len","_message_handlers","_presence_handlers","leave","handler_cb","exit_msg","presence","presenceid","html_message","msgid","parent","removeChild","groupchat","invite","receiver","invitation","MUC_USER","directInvite","queryOccupants","success_cb","error_cb","configure","config","MUC_OWNER","cancelConfigure","saveConfiguration","conf","Form","toXML","createInstantRoom","roomiq","setTopic","topic","_modifyPrivilege","item","MUC_ADMIN","modifyRole","role","kick","voice","mute","op","deop","modifyAffiliation","affiliation","ban","member","revoke","owner","admin","changeNick","setStatus","show","listRooms","server","handle_cb","client","_roomRosterHandler","_addOccupant","roster","_roster_handlers","_handler_ids","muc","handler_type","removeHandler","occ","newnick","_parsePresence","update","c2","_j","_len1","_ref1","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","states","code","parse","field","identity","query","_k","_len2","identities","var","label","_identities","_features","_items","_onDiscoInfo","_onDiscoItems","addIdentity","category","lang","addFeature","var_name","removeFeature","addItem","call_back","items","_buildIQResult","query_attrs","iqresult","$","HASH","_ver","_knownCapabilities","JSON","localStorage","getItem","_jidVerIndex","disco","CAPS","_delegateCapabilities","generateCapsAttrs","generateVer","sort","_sortIdentities","identitiesLen","featuresLen","curIdent","getCapabilitiesByJid","hasFeatureByJid","feature","isArray","makeArray","querySelector","setItem","stringify","_requestCapabilities","_handleDiscoInfoReply","childNodesLen","_attributesToJsObject","buildIq","vCardEl","VCARD","get","set","error_rb","sessions","jid2session","ice_config","iceServers","pc_constraints","media_constraints","mandatory","OfferToReceiveAudio","OfferToReceiveVideo","localStream","onJingle","find","action","ack","sess","peerjid","JingleSession","localStreams","initiate","setRemoteDescription","startmuted","accept","terminate","addIceCandidate","affected","addSource","removeSource","myjid","sendOffer","state","sendTerminate","active","terminateByJid","getStunAndTurnCredentials","res","iceservers","each","idx","dict","url","navigator","userAgent","username","credential","initiator","responder","isInitiator","peerconnection","remoteStream","localSDP","remoteSDP","relayedStreams","remoteStreams","startTime","stopTime","drip_container","usetrickle","usepranswer","usedrip","hadstuncandidate","hadturncandidate","lasticecandidate","statsinterval","addssrc","removessrc","pendingop","nickname","filter_candidates","RTCPeerconnection","onicecandidate","event","sendIceCandidate","candidate","onaddstream","stream","onremovestream","onsignalingstatechange","oniceconnectionstatechange","iceConnectionState","forEach","addStream","pranswer","localDescription","lines","SDPUtil","find_lines","sdp","find_line","prsdp","SDP","toJingle","source","setLocalDescription","RTCSessionDescription","clearInterval","ice","iceparams","media","sdpMLineIndex","session","jcand","candidateToJingle","sendIceCandidates","signalingState","candidates","cand","mid","cands","filter","creator","sdpMid","tmp","parse_fingerprint","required","fingerprint","createOffer","createdOffer","parse_icecandidate","desctype","fromJingle","remoteDescription","remotedesc","cobbled","iscomplete","mediapart","candidateFromJingle","RTCIceCandidate","sendAnswer","provisional","createAnswer","createdAnswer","jingle","getAudioTracks","track","enabled","getVideoTracks","term","ssrc","modifySources","modifiedAnswer","hardMuteVideo","muted","sendMute","sendRinging","getStats","interval","recv","audio","video","lost","lastrecv","lastlost","loss","delta","setInterval","stats","results","packetsrecv","stat","packetslost","shift","mangle","mline","rtpmap","newdesc","parse_mline","fmt","parse_rtpmap","build_mline","removeSessionLines","prefix","removeMediaLines","mediaindex","thecreator","semantics","bundle","substring","parse_mid","parse_fmtp","RtcpFbToJingle","crypto","parse_crypto","ssrclines","linessrc","kv","parse_ssrc","parse_extmap","uri","direction","senders","TransportToJingle","port","fingerprints","setup","payloadtype","parse_rtcpfb","params","subtype","RtcpFbFromJingle","group","contents","map","m","jingle2media","desc","build_iceufrag","build_icepwd","build_rtpmap","mediadesc","sessiondesc","ufrag","parse_iceufrag","pwd","parse_icepwd","frag","clockrate","channels","elems","foundation","component","ip","generation","tcptype","network","build_icecandidate","hasOwnAttribute","pt","haystack","needle","sessionpart","needles","setupRTC","getUserMediaWithConstraints","TraceablePeerConnection","constraints","mozGetUserMedia","mozRTCPeerConnection","webkitRTCPeerConnection","updateLog","maxstats","what","time","onnegotiationneeded","ondatachannel","names","endTime","values","times","dumpSDP","description","__defineGetter__","removeStream","createDataChannel","opts","successCallback","failureCallback","offer","answer","RTC","browser","getUserMedia","attachMediaStream","mozSrcObject","play","MediaStream","mozRTCSessionDescription","mozRTCIceCandidate","webkitGetUserMedia","webkitURL","createObjectURL","optional","DtlsSrtpKeyAgreement","webkitMediaStream","videoTracks","audioTracks","um","resolution","bandwidth","fps","chromeMediaSource","minWidth","minHeight","minAspectRatio","maxFrameRate","minFrameRate","root","factory","define","amd","module","exports","Salsa20","rounds","sigmaWords","keyWords","nonceWords","counterWords","block","blockUsed","setKey","setNonce","getBytes","numberOfBytes","out","_generateBlock","_incrementCounter","getHexString","hex","bytes","u","j0","j1","j2","j3","j4","j5","j6","j7","j8","j9","j10","j11","j12","j13","j14","j15","x0","x1","x2","x3","x4","x5","x6","x7","x8","x9","x10","x11","x12","x13","x14","x15","msCrypto","require","BigInt","findPrimes","n","ans","millerRabin","mr_x1","dup","mr_r","mr_a","copy_","addInt_","isZero","bpe","rightShift_","powMod_","equalsInt","equals","squareMod_","bitSize","z","expand","int2bigInt","mod","mod_","trim","mult","mult_","powMod","sub","sub_","add","add_","inverseMod","inverseMod_","multMod","multMod_","randBigInt","randBigInt_","randomBitInt","max","copyInt_","eg_u","eg_v","eg_A","eg_B","eg_C","eg_D","halve_","greater","negative","inverseModInt","greaterShift","kx","ky","divide_","r","y1","y2","leftShift_","subShift_","radix","linCombShift_","addShift_","modInt","bits","minSize","buff","str2bigInt","base","kk","bb","digitsStr","multInt_","bigInt2str","s6","divInt_","ys","ss","s4","s5","s0","k1","k2","kn","np","s7","s3","mont_","one","ui","t2","ks","sa","divMod","den","subMod","two","twoToThe","bigInt2bits","bi","pad","ba","_num2bin","ba2bigInt","mpi","getSeed","randomBytes","randomByte","primes","buf","getRandomValues","Uint8Array","CryptoJS","C","C_lib","lib","Base","extend","overrides","mixIn","$super","create","instance","properties","propertyName","clone","WordArray","words","sigBytes","encoder","Hex","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","nBytes","C_enc","enc","hexChars","bite","hexStr","hexStrLength","Latin1","latin1Chars","latin1Str","latin1StrLength","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","blockSizeBytes","nBlocksReady","_minBufferSize","nWordsReady","nBytesReady","offset","_doProcessBlock","processedWords","C_algo","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","HMAC","algo","_map","base64Chars","byte1","byte2","byte3","paddingChar","base64Str","base64StrLength","paddingIndex","bits1","bits2","Cipher","EvpKDF","createEncryptor","_ENC_XFORM_MODE","createDecryptor","_DEC_XFORM_MODE","xformMode","_xformMode","_key","process","dataUpdate","finalProcessedData","keySize","ivSize","selectCipherStrategy","PasswordBasedCipher","SerializableCipher","cipher","encrypt","decrypt","ciphertext","C_mode","StreamCipher","finalProcessedBlocks","mode","BlockCipherMode","iv","Encryptor","Decryptor","_cipher","_iv","CBC","xorBlock","_prevBlock","processBlock","encryptBlock","thisBlock","decryptBlock","C_pad","Pkcs7","nPaddingBytes","paddingWord","paddingWords","padding","unpad","CipherParams","BlockCipher","modeCreator","_mode","cipherParams","formatter","C_format","format","OpenSSLFormatter","OpenSSL","openSSLStr","ciphertextWords","encryptor","cipherCfg","algorithm","_parse","plaintext","C_kdf","kdf","OpenSSLKdf","execute","compute","derivedParams","SBOX","INV_SBOX","SUB_MIX_0","SUB_MIX_1","SUB_MIX_2","SUB_MIX_3","INV_SUB_MIX_0","INV_SUB_MIX_1","INV_SUB_MIX_2","INV_SUB_MIX_3","xi","sx","RCON","AES","nRounds","_nRounds","ksRows","keySchedule","_keySchedule","ksRow","invKeySchedule","_invKeySchedule","invKsRow","M","_doCryptBlock","s1","s2","round","t0","t1","t3","W","SHA1","_hash","H","nBitsTotal","nBitsLeft","HmacSHA1","K","isPrime","sqrtN","sqrt","factor","getFractionalBits","nPrime","SHA256","f","g","gamma0x","gamma0","gamma1x","gamma1","ch","maj","sigma0","sigma1","HmacSHA256","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","hmac","NoPadding","CTR","counter","_counter","keystream","EventEmitter","indexOfListener","listeners","listener","alias","getListeners","evt","events","_getEvents","flattenListeners","flatListeners","getListenersAsObject","addListener","listenerIsWrapped","once","on","addOnceListener","defineEvent","defineEvents","evts","removeListener","index","off","addListeners","manipulateListeners","removeListeners","remove","single","multiple","RegExp","removeEvent","_events","emitEvent","args","_getOnceReturnValue","emit","setOnceReturnValue","_onceReturnValue","OTR","DSA","CONST","N","G","MSGSTATE_PLAINTEXT","MSGSTATE_ENCRYPTED","MSGSTATE_FINISHED","AUTHSTATE_NONE","AUTHSTATE_AWAITING_DHKEY","AUTHSTATE_AWAITING_REVEALSIG","AUTHSTATE_AWAITING_SIG","WHITESPACE_TAG","WHITESPACE_TAG_V2","WHITESPACE_TAG_V3","OTR_TAG","OTR_VERSION_1","OTR_VERSION_2","OTR_VERSION_3","SMPSTATE_EXPECT0","SMPSTATE_EXPECT1","SMPSTATE_EXPECT2","SMPSTATE_EXPECT3","SMPSTATE_EXPECT4","STATUS_SEND_QUERY","STATUS_AKE_INIT","STATUS_AKE_SUCCESS","STATUS_END_OTR","intCompare","HLP","DTS","BYTE","SHORT","INT","MAC","SIG","WRAPPER_BEGIN","WRAPPER_END","TWO","Ctor","constructor","Object","__super__","compare","str1","str2","randomExponent","smpHash","fmpi","smpi","sha256","packBytes","packMPI","bits2bigInt","makeMac","aesctr","mac","make1Mac","encryptAes","aesctr_decoded","decryptAes","multPowMod","ZKP","v","GTOE","between","checkGroup","N_MINUS_2","h1","secbytes","sha1","h2","_toString","val","nex","packINT","packCtr","padCtr","ctr","unpackCtr","toByteArray","unpack","arr","packData","packSHORT","short","unpackSHORT","packTLV","readLen","readData","readMPI","packMPIs","reduce","prv","cur","unpackMPIs","mpis","splitype","wrapMsg","fs","v3","our_it","their_it","its","ei","mf","mfs","_bin2num","rv","ary","iz","remain","timer","makeRandom","isProbPrime","B","l","rpprb","generatePrimes","bit_length","rem","repeat","bit_lengths","LM1","bl4","brk","ONE","pm1","prop","KEY_TYPE","ZERO","nocache","tokenizeStr","end","lastIndexOf","splt","es","parseLibotr","o","Worker","WWPath","__dirname","keys","1024","2048","packPublic","packPrivate","generateNonce","priv","rand","sign","pk","parsePublic","fields","parsePrivate","libotr","dsa","verify","hm","u1","u2","createInWebWorker","cb","path","seed","worker","postMessage","imports","Parse","parseMsg","otr","initFragment","ind","com","msgFragment","vers","2","3","qs","qi","cls","instance_tags","ERROR_START_AKE","sendQueryMsg","checkInstanceTags","hMac","gx","gy","kid","AKE","our_dh","our_old_dh","our_keyid","their_y","their_keyid","their_priv_pk","ssid","transmittedRS","meth","createKeys","privateKey","c_prime","m1","m2","m1_prime","m2_prime","verifySignMac","our_dh_pk","vmac","pub","makeM","publicKey","akeSuccess","their_old_y","sessKeys","DHSession","otr_version","authstate","msgstate","myhashed","dhcommit","encrypted","hashed","sendStored","handleAKE","vsm","ourHash","theirHash","dh","gxmpi","sendMsg","our_instance_tag","their_instance_tag","fragment_size","io","initiateAKE","SM","reqs","our_fp","their_fp","Q","smpstate","secret","makeSecret","our","makeG2s","a2","a3","g2a","g3a","computeGs","g2","g3","computePQ","computeR","QoQ","computeRab","computeC","computeD","handleSM","r2","r3","r7","t4","rab","tmp2","cR","d7","ms","trust","expectStates",4,5,7,"question","g3ao","c3","d2","d3","r4","r5","r6","cP","d5","d6","PoP","rcvSecret","OTRCB","send_interval","outgoing","instance_tag","makeInstanceTag","smw","SMWPath","MAX_INT","MAX_UINT","ALLOW_V2","ALLOW_V3","REQUIRE_ENCRYPTION","SEND_WHITESPACE_TAG","WHITESPACE_START_AKE","storedMgs","oldMacKeys","sm","_akeInit","receivedPlaintext","ake","_SMW","method","_smInit","prepareMsg","meta","first","sq","sendbyte","rcvbyte","sendenc","sendmac","rcvenc","rcvmac","rcvmacused","extra_symkey","send_counter","rcv_counter","rotateOurKeys","sk","rotateTheirKeys","esk","notify","aes","handleDataMsg","vt","types","ign","handleTLVs","tlvs","smpSecret","versions","vs","receiveMsg","doAKE","it","severity","sendFile","filename","l1name","endOtr","cache","jsonp","content-type","src","json","T","authBasic","Authorization","del","head","isAllowed","patch","post","put","P","fixLng","functions","namespaces","defaultNs","fallbackNS","fallbackLng","interpolationPrefixEscaped","regexEscape","interpolationPrefix","interpolationSuffixEscaped","interpolationSuffix","lng","detectLanguage","L","toLanguages","useCookie","cookie","read","cookieName","cookieExpirationTime","cookieDomain","detectLngFromLocalStorage","setCurrentLng","setJqueryExt","Deferred","resStore","preload","I","load","J","resolve","promise","deepExtend","keyseparator","dynamicLoad","resGetPath","getAsync","customLoad","_fetch","useLocalStorage","_storeLocal","defaultValueFromContent","defaultValue","prepend","append","selectorAttr","useDataAttrOptions","i18n","escapeInterpolation","regexReplacementEscape","postProcess","reusePrefix","maxRecursion","reuseSuffix","context","count","indefinite_article","A","D","sprintf","shortcutFunction","defaultVariables","nsseparator","sendMissing","missingKeyHandler","X","parseMissingKey","lngs","contextNotFound","pluralNotFound","needsPlural","pluralSuffix","indefiniteNotFound","indefiniteSuffix","E","returnObjectTrees","fallbackOnNull","objectTreeKeyHandler","fallbackOnEmpty","isFallbackLookup","fallbackToDefaultNS","lngWhitelist","detectLngQS","languages","userLanguage","language","lowerCaseLng","toUpperCase","TypeError","Zepto","O","_loadLocal","i18nStamp","localStorageExpirationTime","ajax","dataType","_fetchOne","postMissing","sendMissingTo","resPostPath","sendType","postAsync","reload","&","<",">","\"","'","/","R","setTime","toGMTString","S","getCountyIndexOfLng","applyReplacement","V",1,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21,"rules","numbers","plurals","addRule","currentRule","rule","noAbs","Y","Z","toExponential","parseFloat","toFixed","exec","unshift","setLng","addResourceBundle","hasResourceBundle","addResource","addResources","removeResourceBundle","loadNamespace","loadNamespaces","setDefaultNamespace","translate","exists","pluralExtensions","addPostProcessor","I18next","de","translation","Logging_in","your_connection_is_unencrypted","your_connection_is_encrypted","your_buddy_closed_the_private_connection","start_private","close_private","your_buddy_is_verificated","you_have_only_a_subscription_in_one_way","authentication_query_sent","your_message_wasnt_send_please_end_your_private_conversation","unencrypted_message_received","your_message_wasnt_send_because_you_have_no_valid_subscription","not_available","no_connection","relogin","trying_to_start_private_conversation","Verified","Unverified","private_conversation_started","private_conversation_aborted","your_buddy_closed_the_private_conversation_you_should_do_the_same","conversation_is_now_verified","authentication_failed","your_buddy_is_attempting_to_determine_","to_authenticate_to_your_buddy","enter_the_answer_and_click_answer","enter_the_secret","Creating_your_private_key_","Authenticating_a_buddy_helps_","How_do_you_want_to_authenticate_your_buddy","Select_method","Manual","Question","Secret","To_verify_the_fingerprint_","Your_fingerprint","Buddy_fingerprint","Close","Compared","To_authenticate_using_a_question_","Ask","To_authenticate_pick_a_secret_","Compare","Fingerprints","Authentication","Message","Add_buddy","rename_buddy","delete_buddy","Login","Username","Password","Cancel","Connect","Type_in_the_full_username_","Alias","Add","Subscription_request","You_have_a_request_from","Deny","Approve","Remove_buddy","You_are_about_to_remove_","Continue_without_chat","Please_wait","Login_failed","Sorry_we_cant_authentikate_","Retry","clear_history","New_message_from","Should_we_notify_you_","Please_accept_","Hide_offline","Show_offline","About","dnd","Mute","Unmute","Subscription","both","online","chat","away","xa","offline","none","Unknown_instance_tag","Not_one_of_our_latest_keys","Received_an_unreadable_encrypted_message","Online","Chatty","Away","Extended_away","Offline","Friendship_request","Confirm","Dismiss","Remove","Online_help","FN","FAMILY","GIVEN","NICKNAME","URL","ADR","STREET","EXTADD","LOCALITY","REGION","PCODE","CTRY","TEL","NUMBER","EMAIL","USERID","ORG","ORGNAME","ORGUNIT","TITLE","ROLE","BDAY","DESC","PHOTO","send_message","get_info","Settings","Priority","Save","User_settings","A_fingerprint_","Your_roster_is_empty_add_a","new_buddy","is","Login_options","BOSH_url","Domain","Resource","On_login","Received_an_unencrypted_message","Sorry_your_buddy_doesnt_provide_any_information","Info_about","Authentication_aborted","Authentication_request_received","Do_you_want_to_display_them","Log_in_without_chat","has_come_online","Unknown_sender","You_received_a_message_from_an_unknown_sender","Please_allow_access_to_microphone_and_camera","Incoming_call","Do_you_want_to_accept_the_call_from","Reject","Accept","hang_up","snapshot","mute_my_audio","pause_my_video","fullscreen","Info","Local_IP","Remote_IP","Local_Fingerprint","Remote_Fingerprint","Video_call_not_possible","Start_video_call","en","Join_chat","Join","Room","Nickname","left_the_building","entered_the_room","is_now_known_as","This_room_is","muc_hidden","keyword","muc_membersonly","muc_moderated","muc_nonanonymous","muc_open","muc_passwordprotected","muc_persistent","muc_public","muc_semianonymous","muc_temporary","muc_unmoderated","muc_unsecured","Continue","Server","Rooms_are_loaded","Could_load_only","muc_explanation","You_already_joined_this_room","This_room_will_be_closed","Room_not_found_","Loading_room_information","Destroy","Leave","changed_subject_to","muc_removed_kicked","muc_removed_info_kicked","muc_removed_banned","muc_removed_info_banned","muc_removed_affiliation","muc_removed_info_affiliation","muc_removed_membersonly","muc_removed_info_membersonly","muc_removed_shutdown","Reason","message_not_send","message_not_send_item-not-found","message_not_send_forbidden","message_not_send_not-acceptable","This_room_has_been_closed","Room_logging_is_enabled","A_password_is_required","You_are_not_on_the_member_list","You_are_banned_from_this_room","Your_desired_nickname_","The_maximum_number_","This_room_is_locked_","You_are_not_allowed_to_create_","fr","nds","pl","pt-BR","ro"],"mappings":"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"} \ No newline at end of file
diff --git a/build/js/jsxc/lib/translation.js b/build/js/jsxc/lib/translation.js
new file mode 100644
index 0000000..c8cb5c0
--- /dev/null
+++ b/build/js/jsxc/lib/translation.js
@@ -0,0 +1 @@
+var I18next = {"de":{"translation":{"Logging_in":"Login läuft…","your_connection_is_unencrypted":"Deine Verbindung ist Unverschlüsselt.","your_connection_is_encrypted":"Deine Verbindung ist verschlüsselt.","your_buddy_closed_the_private_connection":"Dein Kontakt hat die private Verbindung getrennt.","start_private":"Privat starten","close_private":"Privat abbrechen","your_buddy_is_verificated":"Dein Kontakt ist verifiziert.","you_have_only_a_subscription_in_one_way":"Der Kontaktstatus ist einseitig.","authentication_query_sent":"Authentifizierungsanfrage gesendet.","your_message_wasnt_send_please_end_your_private_conversation":"Deine Nachricht wurde nicht gesendet. Bitte beende die private Konversation.","unencrypted_message_received":"Unverschlüsselte Nachricht erhalten.","your_message_wasnt_send_because_you_have_no_valid_subscription":"Deine Nachricht wurde nicht gesandt, da der Kontaktstatus einseitig ist.","not_available":"Nicht verfügbar.","no_connection":"Keine Verbindung.","relogin":"Neu anmelden.","trying_to_start_private_conversation":"Versuche private Konversation zu starten.","Verified":"Verifiziert","Unverified":"Unverifiziert","private_conversation_started":"Private Konversation gestartet.","private_conversation_aborted":"Private Konversation abgebrochen.","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Dein Kontakt hat die private Konversation beendet. Das solltest du auch tun!","conversation_is_now_verified":"Konversation ist jetzt verifiziert","authentication_failed":"Authentifizierung fehlgeschlagen.","your_buddy_is_attempting_to_determine_":"Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet.","to_authenticate_to_your_buddy":"Um dich gegenüber deinem Kontakt zu verifizieren ","enter_the_answer_and_click_answer":"gib die Antwort ein und klick auf Antworten.","enter_the_secret":"gib das Geheimnis ein.","Creating_your_private_key_":"Wir werden jetzt deinen privaten Schlüssel generieren. Das kann einige Zeit in Anspruch nehmen.","Authenticating_a_buddy_helps_":"Einen Kontakt zu authentifizieren hilft sicher zustellen, dass die Person mit der du sprichst auch die ist die sie sagt.","How_do_you_want_to_authenticate_your_buddy":"Wie willst du {{bid_name}} (<b>{{bid_jid}}</b>) authentifizieren?","Select_method":"Wähle...","Manual":"Manual","Question":"Frage","Secret":"Geheimnis","To_verify_the_fingerprint_":"Um den Fingerprint zu verifizieren kontaktiere dein Kontakt über einen anderen Kommunikationsweg. Zum Beispiel per Telefonanruf.","Your_fingerprint":"Dein Fingerprint","Buddy_fingerprint":"Sein/Ihr Fingerprint","Close":"Schließen","Compared":"Verglichen","To_authenticate_using_a_question_":"Um die Authentifizierung per Frage durchzuführen, wähle eine Frage bei welcher nur dein Kontakt die Antwort weiß.","Ask":"Frage","To_authenticate_pick_a_secret_":"Um deinen Kontakt zu authentifizieren, wähle ein Geheimnis welches nur deinem Kontakt und dir bekannt ist.","Compare":"Vergleiche","Fingerprints":"Fingerprints","Authentication":"Authentifizierung","Message":"Nachricht","Add_buddy":"Kontakt hinzufügen","rename_buddy":"Kontakt umbenennen","delete_buddy":"Kontakt löschen","Login":"Anmeldung","Username":"Benutzername","Password":"Passwort","Cancel":"Abbrechen","Connect":"Verbinden","Type_in_the_full_username_":"Gib bitte den vollen Benutzernamen und optional ein Alias an.","Alias":"Alias","Add":"Hinzufügen","Subscription_request":"Kontaktanfrage","You_have_a_request_from":"Du hast eine Anfrage von","Deny":"Ablehnen","Approve":"Bestätigen","Remove_buddy":"Kontakt entfernen","You_are_about_to_remove_":"Du bist gerade dabei {{bid_name}} (<b>{{bid_jid}}</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.","Continue_without_chat":"Weiter ohne Chat","Please_wait":"Bitte warten","Login_failed":"Chat-Anmeldung fehlgeschlagen","Sorry_we_cant_authentikate_":"Der Chatserver hat die Anmeldung abgelehnt. Falsches Passwort?","Retry":"Zurück","clear_history":"Lösche Verlauf","New_message_from":"Neue Nachricht von","Should_we_notify_you_":"Sollen wir dich in Zukunft über eingehende Nachrichten informieren, auch wenn dieser Tab nicht im Vordergrund ist?","Please_accept_":"Bitte klick auf den \"Zulassen\" Button oben.","Hide_offline":"Offline ausblenden","Show_offline":"Offline einblenden","About":"Über","dnd":"Beschäftigt","Mute":"Ton aus","Unmute":"Ton an","Subscription":"Bezug","both":"beidseitig","Status":"Status","online":"online","chat":"chat","away":"abwesend","xa":"länger abwesend","offline":"offline","none":"keine","Unknown_instance_tag":"Unbekannter instance tag.","Not_one_of_our_latest_keys":"Nicht einer unserer letzten Schlüssel.","Received_an_unreadable_encrypted_message":"Eine unlesbare verschlüsselte Nachricht erhalten.","Online":"Online","Chatty":"Gesprächig","Away":"Abwesend","Extended_away":"Länger abwesend","Offline":"Offline","Friendship_request":"Kontaktanfrage","Confirm":"Bestätigen","Dismiss":"Ablehnen","Remove":"Löschen","Online_help":"Online Hilfe","FN":"Name","N":" ","FAMILY":"Familienname","GIVEN":"Vorname","NICKNAME":"Spitzname","URL":"URL","ADR":"Adresse","STREET":"Straße","EXTADD":"Zusätzliche Adresse","LOCALITY":"Ortschaft","REGION":"Region","PCODE":"Postleitzahl","CTRY":"Land","TEL":"Telefon","NUMBER":"Nummer","EMAIL":"E-Mail","USERID":" ","ORG":"Organisation","ORGNAME":"Name","ORGUNIT":"Abteilung","TITLE":"Titel","ROLE":"Rolle","BDAY":"Geburtstag","DESC":"Beschreibung","PHOTO":" ","send_message":"Sende Nachricht","get_info":"Benutzerinformationen","Settings":"Einstellungen","Priority":"Priorität","Save":"Speichern","User_settings":"Benutzereinstellungen","A_fingerprint_":"Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.","Your_roster_is_empty_add_a":"Deine Kontaktliste ist leer, füge einen neuen Kontakt ","new_buddy":"hinzu","is":"ist","Login_options":"Anmeldeoptionen","BOSH_url":"BOSH url","Domain":"Domain","Resource":"Ressource","On_login":"Beim Anmelden","Received_an_unencrypted_message":"Unverschlüsselte Nachricht empfangen","Sorry_your_buddy_doesnt_provide_any_information":"Dein Kontakt stellt leider keine Informationen bereit.","Info_about":"Info über","Authentication_aborted":"Authentifizierung abgebrochen.","Authentication_request_received":"Authentifizierunganfrage empfangen.","Do_you_want_to_display_them":"Möchtest du sie sehen?","Log_in_without_chat":"Anmelden ohne Chat","has_come_online":"ist online gekommen","Unknown_sender":"Unbekannter Sender","You_received_a_message_from_an_unknown_sender":"Du hast eine Nachricht von einem unbekannten Sender erhalten","Please_allow_access_to_microphone_and_camera":"Bitte klick auf den \"Zulassen\" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.","Incoming_call":"Eingehender Anruf","from":"von","Do_you_want_to_accept_the_call_from":"Möchtest Du den Anruf annehmen von","Reject":"Ablehnen","Accept":"Annehmen","hang_up":"Auflegen","snapshot":"Schnappschuss","mute_my_audio":"Mein Ton aus","pause_my_video":"Mein Video pausieren","fullscreen":"Vollbild","Info":"Info","Local_IP":"Lokale IP","Remote_IP":"Remote IP","Local_Fingerprint":"Lokaler Fingerprint","Remote_Fingerprint":"Remote Fingerprint","Video_call_not_possible":"Videoanruf nicht verfügbar. Dein Gesprächspartner unterstützt keine Videotelefonie.","Start_video_call":"Starte Videoanruf"}},"el":{"translation":{"Logging_in":null,"your_connection_is_unencrypted":null,"your_connection_is_encrypted":null,"your_buddy_closed_the_private_connection":null,"start_private":null,"close_private":null,"your_buddy_is_verificated":null,"you_have_only_a_subscription_in_one_way":null,"authentication_query_sent":null,"your_message_wasnt_send_please_end_your_private_conversation":null,"unencrypted_message_received":null,"your_message_wasnt_send_because_you_have_no_valid_subscription":null,"not_available":null,"no_connection":null,"relogin":null,"trying_to_start_private_conversation":null,"Verified":null,"Unverified":null,"private_conversation_started":null,"private_conversation_aborted":null,"your_buddy_closed_the_private_conversation_you_should_do_the_same":null,"conversation_is_now_verified":null,"authentication_failed":null,"your_buddy_is_attempting_to_determine_":null,"to_authenticate_to_your_buddy":null,"enter_the_answer_and_click_answer":null,"enter_the_secret":null,"Creating_your_private_key_":null,"Authenticating_a_buddy_helps_":null,"How_do_you_want_to_authenticate_your_buddy":null,"Select_method":null,"Manual":null,"Question":null,"Secret":null,"To_verify_the_fingerprint_":null,"Your_fingerprint":null,"Buddy_fingerprint":null,"Close":null,"Compared":null,"To_authenticate_using_a_question_":null,"Ask":null,"To_authenticate_pick_a_secret_":null,"Compare":null,"Fingerprints":null,"Authentication":null,"Message":null,"Add_buddy":null,"rename_buddy":null,"delete_buddy":null,"Login":null,"Username":null,"Password":null,"Cancel":null,"Connect":null,"Type_in_the_full_username_":null,"Alias":null,"Add":null,"Subscription_request":null,"You_have_a_request_from":null,"Deny":null,"Approve":null,"Remove_buddy":null,"You_are_about_to_remove_":null,"Continue_without_chat":null,"Please_wait":null,"Login_failed":null,"Sorry_we_cant_authentikate_":null,"Retry":null,"clear_history":null,"New_message_from":null,"Should_we_notify_you_":null,"Please_accept_":null,"Hide_offline":null,"Show_offline":null,"About":null,"dnd":null,"Mute":null,"Unmute":null,"Subscription":null,"both":null,"Status":null,"online":null,"chat":null,"away":null,"xa":null,"offline":null,"none":null,"Unknown_instance_tag":null,"Not_one_of_our_latest_keys":null,"Received_an_unreadable_encrypted_message":null,"Online":null,"Chatty":null,"Away":null,"Extended_away":null,"Offline":null,"Friendship_request":null,"Confirm":null,"Dismiss":null,"Remove":null,"Online_help":null,"FN":null,"N":null,"FAMILY":null,"GIVEN":null,"NICKNAME":null,"URL":null,"ADR":null,"STREET":null,"EXTADD":null,"LOCALITY":null,"REGION":null,"PCODE":null,"CTRY":null,"TEL":null,"NUMBER":null,"EMAIL":null,"USERID":null,"ORG":null,"ORGNAME":null,"ORGUNIT":null,"TITLE":null,"ROLE":null,"BDAY":null,"DESC":null,"PHOTO":null,"send_message":null,"get_info":null,"Settings":null,"Priority":null,"Save":null,"User_settings":null,"A_fingerprint_":null,"Your_roster_is_empty_add_a":null,"new_buddy":null,"is":null,"Login_options":null,"BOSH_url":null,"Domain":null,"Resource":null,"On_login":null,"Received_an_unencrypted_message":null,"Sorry_your_buddy_doesnt_provide_any_information":null,"Info_about":null,"Authentication_aborted":null,"Authentication_request_received":null,"Do_you_want_to_display_them":null,"Log_in_without_chat":null,"has_come_online":null,"Unknown_sender":null,"You_received_a_message_from_an_unknown_sender":null,"Please_allow_access_to_microphone_and_camera":null,"Incoming_call":null,"from":null,"Do_you_want_to_accept_the_call_from":null,"Reject":null,"Accept":null,"hang_up":null,"snapshot":null,"mute_my_audio":null,"pause_my_video":null,"fullscreen":null,"Info":null,"Local_IP":null,"Remote_IP":null,"Local_Fingerprint":null,"Remote_Fingerprint":null,"Video_call_not_possible":null,"Start_video_call":null}},"en":{"translation":{"Logging_in":"Logging in…","your_connection_is_unencrypted":"Your connection is unencrypted.","your_connection_is_encrypted":"Your connection is encrypted.","your_buddy_closed_the_private_connection":"Your buddy closed the private connection.","start_private":"Start private","close_private":"Close private","your_buddy_is_verificated":"Your buddy is verified.","you_have_only_a_subscription_in_one_way":"You only have a one-way subscription.","authentication_query_sent":"Authentication query sent.","your_message_wasnt_send_please_end_your_private_conversation":"Your message was not sent. Please end your private conversation.","unencrypted_message_received":"Unencrypted message received","your_message_wasnt_send_because_you_have_no_valid_subscription":"Your message was not sent because you have no valid subscription.","not_available":"Not available","no_connection":"No connection!","relogin":"relogin","trying_to_start_private_conversation":"Trying to start private conversation!","Verified":"Verified","Unverified":"Unverified","private_conversation_started":"Private conversation started.","private_conversation_aborted":"Private conversation aborted!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Your buddy closed the private conversation! You should do the same.","conversation_is_now_verified":"Conversation is now verified.","authentication_failed":"Authentication failed.","your_buddy_is_attempting_to_determine_":"You buddy is attempting to determine if he or she is really talking to you.","to_authenticate_to_your_buddy":"To authenticate to your buddy, ","enter_the_answer_and_click_answer":"enter the answer and click Answer.","enter_the_secret":"enter the secret.","Creating_your_private_key_":"Creating your private key; this may take a while.","Authenticating_a_buddy_helps_":"Authenticating a buddy helps ensure that the person you are talking to is really the one he or she claims to be.","How_do_you_want_to_authenticate_your_buddy":"How do you want to authenticate {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Select method...","Manual":"Manual","Question":"Question","Secret":"Secret","To_verify_the_fingerprint_":"To verify the fingerprint, contact your buddy via some other trustworthy channel, such as the telephone.","Your_fingerprint":"Your fingerprint","Buddy_fingerprint":"Buddy fingerprint","Close":"Close","Compared":"Compared","To_authenticate_using_a_question_":"To authenticate using a question, pick a question whose answer is known only you and your buddy.","Ask":"Ask","To_authenticate_pick_a_secret_":"To authenticate, pick a secret known only to you and your buddy.","Compare":"Compare","Fingerprints":"Fingerprints","Authentication":"Authentication","Message":"Message","Add_buddy":"Add buddy","rename_buddy":"rename buddy","delete_buddy":"delete buddy","Login":"Login","Username":"Username","Password":"Password","Cancel":"Cancel","Connect":"Connect","Type_in_the_full_username_":"Type in the full username and an optional alias.","Alias":"Alias","Add":"Add","Subscription_request":"Subscription request","You_have_a_request_from":"You have a request from","Deny":"Deny","Approve":"Approve","Remove_buddy":"Remove buddy","You_are_about_to_remove_":"You are about to remove {{bid_name}} (<b>{{bid_jid}}</b>) from your buddy list. All related chats will be closed.","Continue_without_chat":"Continue without chat","Please_wait":"Please wait","Login_failed":"Chat login failed","Sorry_we_cant_authentikate_":"Authentication failed with the chat server. Maybe the password is wrong?","Retry":"Back","clear_history":"Clear history","New_message_from":"New message from","Should_we_notify_you_":"Should we notify you about new messages in the future?","Please_accept_":"Please click the \"Allow\" button at the top.","Hide_offline":"Hide offline contacts","Show_offline":"Show offline contacts","About":"About","dnd":"Do Not Disturb","Mute":"Mute","Unmute":"Unmute","Subscription":"Subscription","both":"both","Status":"Status","online":"online","chat":"chat","away":"away","xa":"extended away","offline":"offline","none":"none","Unknown_instance_tag":"Unknown instance tag.","Not_one_of_our_latest_keys":"Not one of our latest keys.","Received_an_unreadable_encrypted_message":"Received an unreadable encrypted message.","Online":"Online","Chatty":"Chatty","Away":"Away","Extended_away":"Extended away","Offline":"Offline","Friendship_request":"Friendship request","Confirm":"Confirm","Dismiss":"Dismiss","Remove":"Remove","Online_help":"Online help","FN":"Full name","N":" ","FAMILY":"Family name","GIVEN":"Given name","NICKNAME":"Nickname","URL":"URL","ADR":"Address","STREET":"Street Address","EXTADD":"Extended Address","LOCALITY":"Locality","REGION":"Region","PCODE":"Postal Code","CTRY":"Country","TEL":"Telephone","NUMBER":"Number","EMAIL":"Email","USERID":" ","ORG":"Organization","ORGNAME":"Name","ORGUNIT":"Unit","TITLE":"Job title","ROLE":"Role","BDAY":"Birthday","DESC":"Description","PHOTO":" ","send_message":"Send message","get_info":"Show information","Settings":"Settings","Priority":"Priority","Save":"Save","User_settings":"User settings","A_fingerprint_":"A fingerprint is used to make sure that the person you are talking to is who he or she is saying.","Your_roster_is_empty_add_a":"Your roster is empty, add a ","new_buddy":"new buddy","is":"is","Login_options":"Login options","BOSH_url":"BOSH URL","Domain":"Domain","Resource":"Resource","On_login":"On login","Received_an_unencrypted_message":"Received an unencrypted message","Sorry_your_buddy_doesnt_provide_any_information":"Sorry, your buddy does not provide any information.","Info_about":"Info about","Authentication_aborted":"Authentication aborted.","Authentication_request_received":"Authentication request received.","Do_you_want_to_display_them":"Do you want to display them?","Log_in_without_chat":"Log in without chat","has_come_online":"has come online","Unknown_sender":"Unknown sender","You_received_a_message_from_an_unknown_sender":"You received a message from an unknown sender","Please_allow_access_to_microphone_and_camera":"Please click the \"Allow\" button at the top, to allow access to microphone and camera.","Incoming_call":"Incoming call","from":"from","Do_you_want_to_accept_the_call_from":"Do you want to accept the call from","Reject":"Reject","Accept":"Accept","hang_up":"hang up","snapshot":"snapshot","mute_my_audio":"mute my audio","pause_my_video":"pause my video","fullscreen":"fullscreen","Info":"Info","Local_IP":"Local IP","Remote_IP":"Remote IP","Local_Fingerprint":"Local fingerprint","Remote_Fingerprint":"Remote fingerprint","Video_call_not_possible":"Video call not possible. Your buddy does not support video calls.","Start_video_call":"Start video call","Join_chat":"Join chat","Join":"Join","Room":"Room","Nickname":"Nickname","left_the_building":"__nickname__ left the building","entered_the_room":"__nickname__ entered the room","is_now_known_as":"__oldNickname__ is now known as __newNickname__","This_room_is":"This room is","muc_hidden":{"keyword":"hidden","description":"can not be found through search"},"muc_membersonly":{"keyword":"members-only","description":"you need to be on the member list"},"muc_moderated":{"keyword":"moderated","description":"only persons with \"voice\" are allowed to send messages"},"muc_nonanonymous":{"keyword":"non-anonymous","description":"your jabber id is exposed to all other occupants"},"muc_open":{"keyword":"open","description":"everyone is allowed to join"},"muc_passwordprotected":{"keyword":"password-protected","description":"you need to provide the correct password"},"muc_persistent":{"keyword":"persistent","description":"will not be destroyed if the last occupant left"},"muc_public":{"keyword":"public","description":"can be found through search"},"muc_semianonymous":{"keyword":"semi-anonymous","description":"your jabber id is only exposed to room admins"},"muc_temporary":{"keyword":"temporary","description":"will be destroyed if the last occupant left"},"muc_unmoderated":{"keyword":"unmoderated","description":"everyone is allowed to send messages"},"muc_unsecured":{"keyword":"unsecured","description":"you need no password to enter"},"Continue":"Continue","Server":"Server","Rooms_are_loaded":"Rooms are loaded","Could_load_only":"Could load only __count__ rooms for autocomplete","muc_explanation":"Please enter room name and optional a nickname and password to join a chat","You_already_joined_this_room":"You already joined this room","This_room_will_be_closed":"This room will be closed","Room_not_found_":"A new room will be created","Loading_room_information":"Loading room information","Destroy":"Destroy","Leave":"Leave","changed_subject_to":"__nickname__ changed the room subject to \"__subject__\"","muc_removed_kicked":"You have been kicked from the room","muc_removed_info_kicked":"__nickname__ has been kicked from the room","muc_removed_banned":"You have been banned from the room","muc_removed_info_banned":"__nickname__ has been banned from the room","muc_removed_affiliation":"You have been removed from the room, because of an affiliation change","muc_removed_info_affiliation":"__nickname__ has been removed from the room, because of an affiliation change","muc_removed_membersonly":"You have been removed from the room, because the room has been changed to members-only and you are no member","muc_removed_info_membersonly":"__nickname__ has been removed from the room, because the room has been changed to members-only and you are no member","muc_removed_shutdown":"You have been removed from the room, because the MUC service is being shut down","Reason":"Reason","message_not_send":"Your message was not send because of an error","message_not_send_item-not-found":"Your message was not send because this room does not exist","message_not_send_forbidden":"Your message was not send because you have no voice in this room","message_not_send_not-acceptable":"Your message was not send because you are no occupant of this room","This_room_has_been_closed":"This room has been closed","Room_logging_is_enabled":"Room logging is enabled","A_password_is_required":"A password is required","You_are_not_on_the_member_list":"You are not on the member list","You_are_banned_from_this_room":"You are banned from this room","Your_desired_nickname_":"Your desired nickname is already in use. Please choose another","The_maximum_number_":"The maximum number of user is reached in this room","This_room_is_locked_":"This room is locked","You_are_not_allowed_to_create_":"You are not allowed to create a room"}},"es":{"translation":{"Logging_in":"Por favor, espere...","your_connection_is_unencrypted":"Su conexión no está cifrada.","your_connection_is_encrypted":"Su conexión está cifrada.","your_buddy_closed_the_private_connection":"Su amigo ha cerrado la conexión privada.","start_private":"Iniciar privado","close_private":"Cerrar privado","your_buddy_is_verificated":"Tu amigo está verificado.","you_have_only_a_subscription_in_one_way":"Sólo tienes una suscripción de un modo.","authentication_query_sent":"Consulta de verificación enviada.","your_message_wasnt_send_please_end_your_private_conversation":"Su mensaje no fue enviado. Por favor, termine su conversación privada.","unencrypted_message_received":"Mensaje no cifrado recibido:","your_message_wasnt_send_because_you_have_no_valid_subscription":"Su mensaje no se ha enviado, porque usted no tiene suscripción válida.","not_available":"No disponible","no_connection":"Sin conexión!","relogin":"iniciar sesión nuevamente","trying_to_start_private_conversation":"Intentando iniciar una conversación privada!","Verified":"Verificado","Unverified":"No verificado","private_conversation_started":"se inició una conversación privada.","private_conversation_aborted":"Conversación privada abortada!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Su amigo cerró la conversación privada! Usted debería hacer lo mismo.","conversation_is_now_verified":"La conversación es ahora verificada.","authentication_failed":"Fallo la verificación.","your_buddy_is_attempting_to_determine_":"Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.","to_authenticate_to_your_buddy":"Para autenticar a su amigo, ","enter_the_answer_and_click_answer":"introduce la respuesta y haga clic en Contestar.","enter_the_secret":"especifique el secreto.","Creating_your_private_key_":"Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.","Authenticating_a_buddy_helps_":"Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.","How_do_you_want_to_authenticate_your_buddy":"¿Cómo desea autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Escoja un método...","Manual":"Manual","Question":"Pregunta","Secret":"Secreto","To_verify_the_fingerprint_":"Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.","Your_fingerprint":"Tu firma digital","Buddy_fingerprint":"firma digital de tu amigo","Close":"Cerrar","Compared":"Comparado","To_authenticate_using_a_question_":"Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.","Ask":"Preguntar","To_authenticate_pick_a_secret_":"Para autenticar, elija un secreto conocido sólo por usted y su amigo.","Compare":"Comparar","Fingerprints":"Firmas digitales","Authentication":"Autenticación","Message":"Mensaje","Add_buddy":"Añadir amigo","rename_buddy":"renombrar amigo","delete_buddy":"eliminar amigo","Login":"Iniciar Sesión","Username":"Usuario","Password":"Contraseña","Cancel":"Cancelar","Connect":"Conectar","Type_in_the_full_username_":"Escriba el usuario completo y un alias opcional.","Alias":"Alias","Add":"Añadir","Subscription_request":"Solicitud de suscripción","You_have_a_request_from":"Tienes una petición de","Deny":"Rechazar","Approve":"Aprobar","Remove_buddy":"Eliminar amigo","You_are_about_to_remove_":"Vas a eliminar a {{bid_name}} (<b>{{bid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.","Continue_without_chat":"Continuar","Please_wait":"Espere por favor","Login_failed":"Fallo el inicio de sesión","Sorry_we_cant_authentikate_":"Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?","Retry":"Reintentar","clear_history":"Borrar el historial","New_message_from":"Nuevo mensaje de","Should_we_notify_you_":"¿Debemos notificarle sobre nuevos mensajes en el futuro?","Please_accept_":"Por favor, haga clic en el botón \"Permitir\" en la parte superior.","Hide_offline":"Ocultar contactos desconectados","Show_offline":"Mostrar contactos desconectados","About":"Acerca de","dnd":"No Molestar","Mute":"Desactivar sonido","Unmute":"Activar sonido","Subscription":"Suscripción","both":"ambos","Status":"Estado","online":"en línea","chat":"chat","away":"ausente","xa":"mas ausente","offline":"desconectado","none":"nadie","Unknown_instance_tag":"Etiqueta de instancia desconocida.","Not_one_of_our_latest_keys":"No de nuestra ultima tecla.","Received_an_unreadable_encrypted_message":"Se recibió un mensaje cifrado ilegible.","Online":"En linea","Chatty":"Hablador","Away":"Ausente","Extended_away":"Mas ausente","Offline":"Desconectado","Friendship_request":"Solicitud de amistad","Confirm":"Confirmar","Dismiss":"Rechazar","Remove":"Eliminar","Online_help":"Ayuda en línea","FN":"Nombre completo ","N":" ","FAMILY":"Apellido","GIVEN":"Nombre","NICKNAME":"Apodar","URL":"URL","ADR":"Dirección","STREET":"Calle","EXTADD":"Extendido dirección","LOCALITY":"Población","REGION":"Región","PCODE":"Código postal","CTRY":"País","TEL":"Teléfono","NUMBER":"Número","EMAIL":"Emilio","USERID":" ","ORG":"Organización","ORGNAME":"Nombre","ORGUNIT":"Departamento","TITLE":"Título","ROLE":"Rol","BDAY":"Cumpleaños","DESC":"Descripción","PHOTO":" ","send_message":"mandar un texto","get_info":"obtener información","Settings":"Ajustes","Priority":"Prioridad","Save":"Guardar","User_settings":"Configuración de usuario","A_fingerprint_":"La huella digital se utiliza para que puedas estar seguro que la persona con la que estas hablando es quien realmente dice ser","Your_roster_is_empty_add_a":"Tu lista de amigos esta vacia","new_buddy":"Nuevo amigo","is":"es","Login_options":"Opciones de login","BOSH_url":"BOSH url","Domain":"Dominio","Resource":"Recurso","On_login":"Iniciar sesión","Received_an_unencrypted_message":"Recibe un mensaje no cifrado","Sorry_your_buddy_doesnt_provide_any_information":"Lo sentimos, su amigo no provee ninguna información.","Info_about":"Info acerca de","Authentication_aborted":"Autenticación abortada","Authentication_request_received":"Pedido de autenticación recibido.","Do_you_want_to_display_them":"¿Quiere mostrarlos?","Log_in_without_chat":"Ingresar sin chat","has_come_online":"se ha conectado","Unknown_sender":"Remitente desconocido","You_received_a_message_from_an_unknown_sender":"Ha recibido un mensaje de un remitente desconocido","Please_allow_access_to_microphone_and_camera":"Por favor, permitir el acceso al micrófono y la cámara.","Incoming_call":"Llamada entrante","from":"de","Do_you_want_to_accept_the_call_from":"Desea aceptar la llamada de","Reject":"Rechazar","Accept":"Aceptar","hang_up":"colgar","snapshot":"instantánea","mute_my_audio":"silenciar mi audio","pause_my_video":"pausar mi vídeo","fullscreen":"pantalla completa","Info":"Info","Local_IP":"IP local","Remote_IP":"IP remota","Local_Fingerprint":"Firma digital local","Remote_Fingerprint":"Firma digital remota","Video_call_not_possible":"Llamada de vídeo no es posible","Start_video_call":"Iniciar llamada de vídeo"}},"fr":{"translation":{"Logging_in":"Connexion...","your_connection_is_unencrypted":"Connexion non chiffrée.","your_connection_is_encrypted":"Connexion chiffrée.","your_buddy_closed_the_private_connection":"Votre ami a fermé la connexion privée.","start_private":"Démarrer une conversation privé","close_private":"Clôturer une conversation privée","your_buddy_is_verificated":"Votre ami est vérifié.","you_have_only_a_subscription_in_one_way":"Vous ne pouvez souscrire qu'une fois.","authentication_query_sent":"Requête d’authentification envoyée.","your_message_wasnt_send_please_end_your_private_conversation":"Votre message n'a pas été envoyé. Veuillez terminer votre conversation privée.","unencrypted_message_received":"Message non chiffré reçu","your_message_wasnt_send_because_you_have_no_valid_subscription":"Votre message n'a pas été envoyé car votre abonnement n'est pas valide.","not_available":"Pas disponible","no_connection":"Pas de connexion !","relogin":"Re-connexion","trying_to_start_private_conversation":"Essai de démarrage d'une conversation privée !","Verified":"Vérifié","Unverified":"Non vérifié","private_conversation_started":"Conversation privé démarrée.","private_conversation_aborted":"Conversation privée interrompue !","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Votre ami a fermé la conversation privée ! Vous devriez faire de même.","conversation_is_now_verified":"La conversation est maintenant vérifiée.","authentication_failed":"L'authentification a échoué.","your_buddy_is_attempting_to_determine_":"Votre ami tente de déterminer si il ou elle parle vraiment à vous.","to_authenticate_to_your_buddy":"Vous authentifier à votre ami, ","enter_the_answer_and_click_answer":"Saisissez une réponse et cliquer sur Répondre.","enter_the_secret":"Entrez le mot secret","Creating_your_private_key_":"Création de votre clé privée; cela peut prendre un moment.","Authenticating_a_buddy_helps_":"L'authentification d'un ami permet de s'assurer que la personne à qui vous parlez est vraiment celui qu'il ou elle prétend être.","How_do_you_want_to_authenticate_your_buddy":"Comment voulez-vous vous authentifier {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Sélection de la méthode...","Manual":"Manuel","Question":"Question","Secret":"Sécurité","To_verify_the_fingerprint_":"Pour vérifier l'empreinte, contactez votre ami via un autre canal digne de confiance, tel que le téléphone.","Your_fingerprint":"Votre empreinte","Buddy_fingerprint":"Empreinte de l'ami","Close":"Fermer","Compared":"Comparé","To_authenticate_using_a_question_":"Pour s'authentifier à l'aide d'une question, choisissez une question dont la réponse n'est connue que vous et de votre ami.","Ask":"Demander","To_authenticate_pick_a_secret_":"Pour vous authentifier, choisissez un secret connu seulement de vous et de votre ami.","Compare":"Comparer","Fingerprints":"Empreintes","Authentication":"Authentification","Message":"Message","Add_buddy":"Ajouter comme ami","rename_buddy":"Renommer l'ami","delete_buddy":"Supprimer l'ami","Login":"Connexion","Username":"Nom d'utilisateur","Password":"Mot de passe","Cancel":"Annuler","Connect":"Connecter","Type_in_the_full_username_":"Tapez un nom d'utilisateur complet et un alias(optionnel).","Alias":"Alias","Add":"Ajouter","Subscription_request":"Demande d'abonnement","You_have_a_request_from":"Vous avez une requête de ","Deny":"Refuser","Approve":"Approuver","Remove_buddy":"Supprimer l'ami","You_are_about_to_remove_":"Vous allez retirer {{bid_name}} (<b>{{bid_jid}}</b>) de votre liste d'amis. Toutes les fenêtres de chat en lien avec celui-ci seront fermées.","Continue_without_chat":"Continuer sans tchat","Please_wait":"Merci de patienter","Login_failed":"Authentification échouée","Sorry_we_cant_authentikate_":"La connexion avec le serveur de tchat a échoué. Vérifiez le mot de passe.","Retry":"Retour","clear_history":"Effacer l’historique","New_message_from":"Nouveau message de","Should_we_notify_you_":"Dans le futur, devrons-nous vous notifier les nouveaux messages ?","Please_accept_":"Merci de cliquer sur le bouton \"autoriser\" en haut de page","Hide_offline":"Masquer les contacts non connectés","Show_offline":"Afficher les contacts non connectés","About":"À propos","dnd":"Ne pas déranger","Mute":"Muet","Unmute":"Son actif","Subscription":"Abonnement","both":"Les deux","Status":"Status","online":"En ligne","chat":"tchat","away":"Absent","xa":"Options étendues","offline":"Hors ligne","none":"Aucun","Unknown_instance_tag":"Tag inconnu","Not_one_of_our_latest_keys":"Ce n'est pas l'une des dernières touches","Received_an_unreadable_encrypted_message":"Message chiffré non lisible","Online":"En ligne","Chatty":"tchatty","Away":"Absent","Extended_away":"Options étendues","Offline":"Hors ligne","Friendship_request":"Demande d'amitié","Confirm":"Valider","Dismiss":"Rejeter","Remove":"Supprimer","Online_help":"Aide en ligne","FN":"Nom","N":" N ","FAMILY":"Nom de famille","GIVEN":"prénom","NICKNAME":"Surnom","URL":"URL","ADR":"Adresse","STREET":"Rue","EXTADD":"Adresse (suite)","LOCALITY":"Localité","REGION":"Région","PCODE":"Code Postal","CTRY":"Pays","TEL":"Téléphone","NUMBER":"Numéro","EMAIL":"Courriel","USERID":" USERID ","ORG":"Organisation","ORGNAME":"Nom","ORGUNIT":"Unité","TITLE":"Qualité:","ROLE":"Rôle","BDAY":"Date de naissance","DESC":"Description","PHOTO":"Photo","send_message":"Envoyer le message","get_info":"Montrer les informations","Settings":"Réglages","Priority":"Priorité","Save":"Enregistrer","User_settings":"Paramètres utilisateur","A_fingerprint_":"Une empreinte est utilisée pour s'assurer de l'identité de la personne à qui vous parlez","Your_roster_is_empty_add_a":"Votre liste est vide, ajouter ","new_buddy":"Nouvel ami","is":"est","Login_options":"Options d'identification","BOSH_url":"URL BOSH","Domain":"Domaine","Resource":"Ressource","On_login":"Après authentification","Received_an_unencrypted_message":"Reçu un message non chiffré","Sorry_your_buddy_doesnt_provide_any_information":"Désolé, votre ami n'a pas fourni d'informations","Info_about":"A propos de","Authentication_aborted":"Authentification interrompue.","Authentication_request_received":"Requête d'authentification reçue.","Do_you_want_to_display_them":"Voulez-vous les afficher ?","Log_in_without_chat":"S'identifier sans tchat","has_come_online":"vient d'arriver","Unknown_sender":"Expéditeur inconnu","You_received_a_message_from_an_unknown_sender":"Vous avez reçu un message d'un expéditeur inconnu","Please_allow_access_to_microphone_and_camera":"Veuillez cliquez sur le bouton \"Autoriser\" en haut, pour permettre l'accès au micro et à la caméra.","Incoming_call":"Appel entrant","from":"de","Do_you_want_to_accept_the_call_from":"Voulez-vous accepter l'appel de","Reject":"Rejeté","Accept":"Accepté","hang_up":"Décrochez","snapshot":"Capture d’écran","mute_my_audio":"Couper l'audio","pause_my_video":"Mettre ma vidéo en pause","fullscreen":"Plein écran","Info":"Info","Local_IP":"IP locale","Remote_IP":"IP distante","Local_Fingerprint":"Empreinte locale","Remote_Fingerprint":"Empreinte distante","Video_call_not_possible":"L'appel vidéo n'est possible. Votre ami ne supporte pas les appels vidéo.","Start_video_call":"Démarrer l'appel vidéo"}},"it":{"translation":{"Logging_in":"login…","your_connection_is_unencrypted":"La sua connessione è non cifrata.","your_connection_is_encrypted":"La sua connessione è cifrata.","your_buddy_closed_the_private_connection":"La sua connessione privata è stato chiuso dal suo compagno.","start_private":"Inizia privata","close_private":"Chiude privata","your_buddy_is_verificated":"Il tuo compagno è stato verificato","you_have_only_a_subscription_in_one_way":"Hai solo una one-way inscrizione.","authentication_query_sent":"Domanda d'autenticità inviata.","your_message_wasnt_send_please_end_your_private_conversation":"Il tuo messaggio non è stato inviato. Si prega di finire la sua conversazione privata.","unencrypted_message_received":"Messaggio non cifrato ricevuto","your_message_wasnt_send_because_you_have_no_valid_subscription":"Il tuo messaggio non è stato inviato perché non hai una sottoscrizione valida.","not_available":"non disponibile","no_connection":"nessun collegamento!","relogin":"nuovo login","trying_to_start_private_conversation":"Cercando di avviare una conversazione privata!","Verified":"verificato","Unverified":"non verificato","private_conversation_started":"Conversazione privata iniziato.","private_conversation_aborted":"Conversazione privata abortito!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Il tuo compagno ha chiuso la conversazione privata! Si dovrebbe fare lo stesso.","conversation_is_now_verified":"Conversazione è ora verificato.","authentication_failed":"autenticazione fallita.","your_buddy_is_attempting_to_determine_":"Il tuo compagno sta cercando di determinare se lui o lei sta davvero parlando con te.","to_authenticate_to_your_buddy":"Per autenticare a il tuo compagno. ","enter_the_answer_and_click_answer":"inserisci la risposta e fare click su risposta.","enter_the_secret":"inserire il segreto.","Creating_your_private_key_":"Creare la propria chiave privata; questo potrebbe richiedere un po'.","Authenticating_a_buddy_helps_":"Autenticazione un compagno aiuta a garantire che la persona si sta parlando è davvero quello che lui o lei sostiene di essere.","How_do_you_want_to_authenticate_your_buddy":"Come si desidera autenticare {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Seleziona metodo ..","Manual":"manuale","Question":"domanda","Secret":"segreto","To_verify_the_fingerprint_":"Per verificare l'impronta digitale, contattare il proprio compagno attraverso qualche altro canale affidabile, come il telefono.","Your_fingerprint":"il tuo impronta digitale","Buddy_fingerprint":"impronta digitale da compagno","Close":"chiude","Compared":"comparato","To_authenticate_using_a_question_":"Per autenticare tramite una questione, scegli una questione la cui risposta è nota solo voi e il tuo compagno","Ask":"chiedi","To_authenticate_pick_a_secret_":"Per autenticare, scegli un segreto noto solo a te e il tuo compagno.","Compare":"Comparare","Fingerprints":"Impronta digitale","Authentication":"Autenticazione","Message":"Messagio","Add_buddy":"Aggiungi un compagno","rename_buddy":"rinomina compagno","delete_buddy":"elimina compagno","Login":"Login","Username":"Identificazione dell'utente","Password":"Password","Cancel":"Cancella","Connect":"Collega","Type_in_the_full_username_":"Digita l'identificazione utente completo e un alias opzionale.","Alias":"Alias","Add":"Aggiungi","Subscription_request":"Rrichiesta di sottoscrizione","You_have_a_request_from":"Hai una richiesta da","Deny":"Refiuta","Approve":"Approva","Remove_buddy":"Rimuova il compagno","You_are_about_to_remove_":"Stai rimovendo {{bid_name}} (<b>{{bid_jid}}</b>) del suo lista di compagni. Tutte le chat appartenente saranno chiuse.","Continue_without_chat":"Continua senza chat","Please_wait":"Si prega d'attendere","Login_failed":"Chat login è fallito","Sorry_we_cant_authentikate_":"Autenticazione non riuscita con il server di chat. Forse la password è sbagliata?","Retry":"Indietro","clear_history":"Cancella la cronologia","New_message_from":"Nuovo messaggio da","Should_we_notify_you_":"Vuoi ricevere una notifica di nuovi messaggi in futuro?","Please_accept_":"Si prega di fare clic sul bottone \"Autorizzazione\" sopra.","Hide_offline":"Nascondere i contatti non in linea","Show_offline":"Mostra i contatti non in linea","About":"Informazione legale","dnd":"Non disturbare","Mute":"Muto attivo","Unmute":"Muto inattivo","Subscription":"Sottoscrizione","both":"etrambi","Status":"Status","online":"In linea","chat":"chat","away":"via","xa":"via estensivo","offline":"non in linea","none":"nessuno","Unknown_instance_tag":"Instance tag sconosciuta.","Not_one_of_our_latest_keys":"Non è una delle nostre ultime chiavi.","Received_an_unreadable_encrypted_message":"Ricevuto un messaggio crittografato illeggibile.","Online":"In linea","Chatty":"Chiacchierino","Away":"Via","Extended_away":"Via estensivo","Offline":"Non in linea","Friendship_request":"Amicizia richiesto","Confirm":"Conferma","Dismiss":"Rifiuta","Remove":"Rimuovi","Online_help":"Guida in linea","FN":"Nome e cognome","N":null,"FAMILY":"Cognome","GIVEN":"Nome","NICKNAME":"Soprannome","URL":"URL","ADR":"Indirizzo","STREET":"Via","EXTADD":"Esteso Indirizzo","LOCALITY":"Località","REGION":"Regione","PCODE":"Codice Postale","CTRY":"Paese","TEL":"Telefono","NUMBER":"Numero","EMAIL":"E-mail","USERID":null,"ORG":"Organizzazione","ORGNAME":"Nome","ORGUNIT":"Unità","TITLE":"Titolo di lavoro","ROLE":"Funzione","BDAY":"Compleanno","DESC":"Descrizione","PHOTO":null,"send_message":"Messagio inviato","get_info":"Mostra informazioni","Settings":"Impostazione","Priority":"Priorità","Save":"Salva","User_settings":"Impostazione dell'utente","A_fingerprint_":"Una impronta digitale è usato per assicurarsi che la persona con cui stai parlando è lui o lei che sta dicendo.","Your_roster_is_empty_add_a":"Il suo elenco è vuoto, aggiungi un ","new_buddy":"compagno nuovo","is":"è","Login_options":"Opzioni di login","BOSH_url":"BOSH URL","Domain":"Domain","Resource":"Risorsa","On_login":"Login on","Received_an_unencrypted_message":"Ricevuto un messaggio non crittografato","Sorry_your_buddy_doesnt_provide_any_information":"Spiace, il tuo compagno non fornisce alcuna informazione.","Info_about":"Informazioni","Authentication_aborted":"Autenticazione interrotta","Authentication_request_received":"Richiesta di autenticazione ricevuto.","Do_you_want_to_display_them":"Vuoi che venga visualizzato?","Log_in_without_chat":"Log in senza chat","has_come_online":"È venuto in linea","Unknown_sender":"Mittente sconosciuto","You_received_a_message_from_an_unknown_sender":"Hai ricevuto un messaggio da un mittente sconosciuto","Please_allow_access_to_microphone_and_camera":"Si prega di fare clic sul bottone \"Autorizzazione\" sopra per autorizzazione del l'accesso al microfono e fotocamera.","Incoming_call":"Chiamata in arrivo","from":"di","Do_you_want_to_accept_the_call_from":"Vuoi accettare la chiamata di","Reject":"Rifiuta","Accept":"Accetta","hang_up":"Riattacca","snapshot":"istantanea","mute_my_audio":"disattiva il mio audio","pause_my_video":"pausa il mio audio","fullscreen":"schermo intero","Info":"Informazione","Local_IP":"IP locale","Remote_IP":"IP remoto","Local_Fingerprint":"Impronta digitale locale","Remote_Fingerprint":"Impronta digitale remoto","Video_call_not_possible":"Videochiamata non è possibile. Il tuo compagno non può effettuare videochiamate.","Start_video_call":"Inizia videochiamata"}},"nds":{"translation":{"Logging_in":null,"your_connection_is_unencrypted":null,"your_connection_is_encrypted":null,"your_buddy_closed_the_private_connection":null,"start_private":null,"close_private":null,"your_buddy_is_verificated":null,"you_have_only_a_subscription_in_one_way":null,"authentication_query_sent":null,"your_message_wasnt_send_please_end_your_private_conversation":null,"unencrypted_message_received":null,"your_message_wasnt_send_because_you_have_no_valid_subscription":null,"not_available":null,"no_connection":null,"relogin":null,"trying_to_start_private_conversation":null,"Verified":null,"Unverified":null,"private_conversation_started":null,"private_conversation_aborted":null,"your_buddy_closed_the_private_conversation_you_should_do_the_same":null,"conversation_is_now_verified":null,"authentication_failed":null,"your_buddy_is_attempting_to_determine_":null,"to_authenticate_to_your_buddy":null,"enter_the_answer_and_click_answer":null,"enter_the_secret":null,"Creating_your_private_key_":null,"Authenticating_a_buddy_helps_":null,"How_do_you_want_to_authenticate_your_buddy":null,"Select_method":null,"Manual":null,"Question":null,"Secret":null,"To_verify_the_fingerprint_":null,"Your_fingerprint":null,"Buddy_fingerprint":null,"Close":null,"Compared":null,"To_authenticate_using_a_question_":null,"Ask":null,"To_authenticate_pick_a_secret_":null,"Compare":null,"Fingerprints":null,"Authentication":null,"Message":null,"Add_buddy":null,"rename_buddy":null,"delete_buddy":null,"Login":null,"Username":null,"Password":null,"Cancel":null,"Connect":null,"Type_in_the_full_username_":null,"Alias":null,"Add":null,"Subscription_request":null,"You_have_a_request_from":null,"Deny":null,"Approve":null,"Remove_buddy":null,"You_are_about_to_remove_":null,"Continue_without_chat":null,"Please_wait":null,"Login_failed":null,"Sorry_we_cant_authentikate_":null,"Retry":null,"clear_history":null,"New_message_from":null,"Should_we_notify_you_":null,"Please_accept_":null,"Hide_offline":null,"Show_offline":null,"About":null,"dnd":null,"Mute":null,"Unmute":null,"Subscription":null,"both":null,"Status":null,"online":null,"chat":null,"away":null,"xa":null,"offline":null,"none":null,"Unknown_instance_tag":null,"Not_one_of_our_latest_keys":null,"Received_an_unreadable_encrypted_message":null,"Online":null,"Chatty":null,"Away":null,"Extended_away":null,"Offline":null,"Friendship_request":null,"Confirm":null,"Dismiss":null,"Remove":null,"Online_help":null,"FN":null,"N":null,"FAMILY":null,"GIVEN":null,"NICKNAME":null,"URL":null,"ADR":null,"STREET":null,"EXTADD":null,"LOCALITY":null,"REGION":null,"PCODE":null,"CTRY":null,"TEL":null,"NUMBER":null,"EMAIL":null,"USERID":null,"ORG":null,"ORGNAME":null,"ORGUNIT":null,"TITLE":null,"ROLE":null,"BDAY":null,"DESC":null,"PHOTO":null,"send_message":null,"get_info":null,"Settings":null,"Priority":null,"Save":null,"User_settings":null,"A_fingerprint_":null,"Your_roster_is_empty_add_a":null,"new_buddy":null,"is":null,"Login_options":null,"BOSH_url":null,"Domain":null,"Resource":null,"On_login":null,"Received_an_unencrypted_message":null,"Sorry_your_buddy_doesnt_provide_any_information":null,"Info_about":null,"Authentication_aborted":null,"Authentication_request_received":null,"Do_you_want_to_display_them":null,"Log_in_without_chat":null,"has_come_online":null,"Unknown_sender":null,"You_received_a_message_from_an_unknown_sender":null,"Please_allow_access_to_microphone_and_camera":null,"Incoming_call":null,"from":null,"Do_you_want_to_accept_the_call_from":null,"Reject":null,"Accept":null,"hang_up":null,"snapshot":null,"mute_my_audio":null,"pause_my_video":null,"fullscreen":null,"Info":null,"Local_IP":null,"Remote_IP":null,"Local_Fingerprint":null,"Remote_Fingerprint":null,"Video_call_not_possible":null,"Start_video_call":null}},"pl":{"translation":{"Logging_in":"Logowanie...","your_connection_is_unencrypted":"Twoje połączenie nie jest szyfrowane.","your_connection_is_encrypted":"Twoje połączenie jest szyfrowane.","your_buddy_closed_the_private_connection":"Twój rozmówca zamknął połączenie.","start_private":"Rozpocznij rozmowę.","close_private":"Zakończ rozmowę.","your_buddy_is_verificated":"Twój rozmówca został zweryfikowany.","you_have_only_a_subscription_in_one_way":"Masz jednostronną subskrypcję.","authentication_query_sent":"Wysłano proźbę o autentykację.","your_message_wasnt_send_please_end_your_private_conversation":"Twoja wiadomość nie została wysłana. Proszę, zamknij rozmowę.","unencrypted_message_received":"Zwrotna niezaszyfrowana wiadomość.","your_message_wasnt_send_because_you_have_no_valid_subscription":"Wiadomość nie została wysłana ponieważ nie posiadasz subskrybcji u rozmówcy.","not_available":"Niedostępny.","no_connection":"Brak połączenia!","relogin":"Połącz ponownie","trying_to_start_private_conversation":"Rozpocznij rozmowę!","Verified":"Zweryfikowano","Unverified":"Niezweryfikowano","private_conversation_started":"Rozmowa prywatna rozpoczęta.","private_conversation_aborted":"Anulowano rozmowę!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Rozmówca przerwał połączenie!","conversation_is_now_verified":"Zweryfikowano połączenie.","authentication_failed":"Weryfikacja się nie powiodła.","your_buddy_is_attempting_to_determine_":"Twój rozmówca próbuje się z Tobą połączyć.","to_authenticate_to_your_buddy":"Autoryzacja z rozmówcą, ","enter_the_answer_and_click_answer":"napisz odpowiedź.","enter_the_secret":"wpisz hasło.","Creating_your_private_key_":"Tworzenie klucza prywatnego; może to chwilę potrwać","Authenticating_a_buddy_helps_":"Autoryzacja pomoże w ustaleniu faktycznej tożsamości rozmówcy ;).","How_do_you_want_to_authenticate_your_buddy":"Jakiej autoryzacji chcesz użyć {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Wybierz sposób...","Manual":"Ręcznie","Question":"Pytanie","Secret":"Hasło","To_verify_the_fingerprint_":"Aby zweryfikować kod najpierw skontaktuj się z rozmówcą np. za pomocą telefonu.","Your_fingerprint":"Twój kod:","Buddy_fingerprint":"Kod rozmówcy","Close":"Zamknij","Compared":"Porównano","To_authenticate_using_a_question_":"Aby autoryzować za pomocą pytania, wybierz pytanie na które tylko Twój rozmówca zna odpowiedź.","Ask":"Zadaj pytanie","To_authenticate_pick_a_secret_":"Aby autoryzować za pomocą hasła, wybierz hasło na które zna tylko Twój rozmówca.","Compare":"Dopasuj","Fingerprints":"Kody autoryzacyjne","Authentication":"Autoryzacja","Message":"Wiadomość","Add_buddy":"Dodaj kontakt","rename_buddy":"Zmień nazwę","delete_buddy":"Usuń kontakt","Login":"Login","Username":"Nazwa Użytkownika","Password":"Hasło","Cancel":"Anuluj","Connect":"Połączenie","Type_in_the_full_username_":"Wpisz pełną nazwę użytkownika (np. <B>imię.nazwisko@zajezdnia.local</B>) oraz jego nazwę wyświetlaną (Alias).","Alias":"Alias","Add":"Dodaj","Subscription_request":"Potwierdzenie subskrypcji","You_have_a_request_from":"Masz potwierdzenie od","Deny":"Odmów","Approve":"Zatwierdź","Remove_buddy":"Usuń rozmówcę","You_are_about_to_remove_":"Twój rozmówca {{bid_name}} (<b>{{bid_jid}}</b>) usunął Cię ze swojej listy kontaktów.","Continue_without_chat":"Kontynuuj bez komunikatora","Please_wait":"Proszę czekać","Login_failed":"Błędne logowanie","Sorry_we_cant_authentikate_":"Błędna autoryzacja z serwerem. Może hasło jest nieprawidłowe?","Retry":"Powrót","clear_history":"Wyczyść historię","New_message_from":"Nowa wiadomość od","Should_we_notify_you_":"Czy chcesz otrzymywać powiadomienia o nowych wiadomościach w przyszłości?","Please_accept_":"Kliknij \"Zezwól\" na górze.","Hide_offline":"Schowaj niedostępne kontakty","Show_offline":"Pokaż niedostępne kontakty","About":"Info","dnd":"Nie przeszkadzać","Mute":"Wycisz","Unmute":"Włącz dźwięk","Subscription":"Subskrybcja","both":"obustronna","Status":"Status","online":"Dostępny","chat":"czat","away":"z dala od kompa","xa":"hen hen...","offline":"niedostępny","none":"brak","Unknown_instance_tag":"Nieznany przypadek.","Not_one_of_our_latest_keys":"Not one of our latest keys.","Received_an_unreadable_encrypted_message":"Received an unreadable encrypted message.","Online":"Połączony","Chatty":"Pogawędzimy?","Away":"Daleko","Extended_away":"Hen Hen...","Offline":"Niedostępny","Friendship_request":"Zapytanie od znajomego?","Confirm":"Potwierdzenie","Dismiss":"Odwołaj","Remove":"Usuń","Online_help":"Pomoc Online","FN":"Pełna nazwa","N":" ","FAMILY":"Nazwisko","GIVEN":"Imię","NICKNAME":"Pseudonim","URL":"Strona WWW","ADR":"Adres","STREET":"Ulica","EXTADD":"Extended Address","LOCALITY":"Lokalizacja","REGION":"Region","PCODE":"Kod pocztowy","CTRY":"Kraj","TEL":"Telefon","NUMBER":"Numer","EMAIL":"Email","USERID":" ","ORG":"Organizacja","ORGNAME":"Nazwa","ORGUNIT":"Jednostka","TITLE":"Stanowisko","ROLE":"Rola","BDAY":"Data urodzin","DESC":"Opis","PHOTO":" ","send_message":"Wyślij wiadomość","get_info":"Pokaż informację","Settings":"Ustawienia","Priority":"Priorytet","Save":"Zapisz","User_settings":"Ustawienia Użytkownika","A_fingerprint_":"Kod służy do autoryzacji Twojego rozmówcy aby potwierdzić jego tożsamość.","Your_roster_is_empty_add_a":"Twoja lista jest pusta, dodaj kontakty ","new_buddy":"Nowy kontakt","is":"jest","Login_options":"opcje logowania","BOSH_url":"Adres BOSH","Domain":"Domena","Resource":"Źródło","On_login":"Na login","Received_an_unencrypted_message":"Zatwierdzono nieszyfrowaną wiadomość.","Sorry_your_buddy_doesnt_provide_any_information":"Twój rozmówca nie posiada żadnych informacji.","Info_about":"Informacja o...","Authentication_aborted":"Autoryzacja anulowana.","Authentication_request_received":"Prośba o autoryzację została przyjęta.","Do_you_want_to_display_them":"Chcesz to wyświetlić?","Log_in_without_chat":"Zaloguj bez komunikatora","has_come_online":"jest teraz dostępny","Unknown_sender":"Nieznany nadawca","You_received_a_message_from_an_unknown_sender":"Masz wiadomość od nieznanego nadawcy.","Please_allow_access_to_microphone_and_camera":"Kliknij \"Potwierdź\" na górze, aby móc korzystać z mikrofonu oraz kamery.","Incoming_call":"Przychodzące połączenie","from":"z","Do_you_want_to_accept_the_call_from":"Akceptujesz połączenie od","Reject":"Odrzuć","Accept":"Zaakceptuj","hang_up":"odbierz","snapshot":"zrób zdjęcie","mute_my_audio":"wycisz dźwięk","pause_my_video":"zatrzymaj moje wideo","fullscreen":"Pełny ekran","Info":"Informacja","Local_IP":"Adres IP","Remote_IP":"Zdalny adres IP","Local_Fingerprint":"Kod lokalny","Remote_Fingerprint":"Zdalny kod","Video_call_not_possible":"Rozmowa wideo jest niemożliwa. Twój rozmówca nie ma możliwości prowadzenia takich rozmów.","Start_video_call":"Rozpocznij rozmowę wideo"}},"pt-BR":{"translation":{"Logging_in":"Entrando...","your_connection_is_unencrypted":"Sua conexão não é encriptada","your_connection_is_encrypted":"Sua conexão é encriptada","your_buddy_closed_the_private_connection":"Seu contato fechou a conexão privada","start_private":"Iniciar conversa privada","close_private":"Fechar conversa privada","your_buddy_is_verificated":"Seu contato está verificado","you_have_only_a_subscription_in_one_way":"Você só tem a inscrição one-way","authentication_query_sent":"Pergunta de autenticação enviada","your_message_wasnt_send_please_end_your_private_conversation":"Sua mensagem não foi enviada. Por favor finalize sua conversa privada","unencrypted_message_received":"Mensagem não encriptada recebida","your_message_wasnt_send_because_you_have_no_valid_subscription":"Sua mensagem não foi enviada porque sua inscrição não é válida","not_available":"Indisponível","no_connection":"Sem conexão!","relogin":"reentrar","trying_to_start_private_conversation":"Tentando iniciar conversa privada","Verified":"Verificado","Unverified":"Não verificado","private_conversation_started":"Conversa privada iniciada.","private_conversation_aborted":"Conversa privada abortada!","your_buddy_closed_the_private_conversation_you_should_do_the_same":"Seu contato encerrou a conversa privada! Você deveria fazer o mesmo.","conversation_is_now_verified":"Conversa verificada.","authentication_failed":"Autenticação falhou.","your_buddy_is_attempting_to_determine_":"Seu contato está tentando determinar se ele realmente está falando contigo.","to_authenticate_to_your_buddy":"Para autenticar seu contato, ","enter_the_answer_and_click_answer":"entre com a resposta e clique em Responder.","enter_the_secret":"escreva a senha.","Creating_your_private_key_":"Criando sua chave privada: isso pode demorar um pouco.","Authenticating_a_buddy_helps_":"Autenticar seu contato ajuda a garantir que a pessoa com a qual você está falando é realmente a pessoa que ela alega ser.","How_do_you_want_to_authenticate_your_buddy":"Como você gostaria de se autenticar {{bid_name}} (<b>{{bid_jid}}</b>)?","Select_method":"Selecione o método...","Manual":"Manual","Question":"Pergunta","Secret":"Senha","To_verify_the_fingerprint_":"Para verificar o fingerprint, entre em contato com seu contato usando outro meio, de preferência seguro, como o telefone.","Your_fingerprint":"Seu fingerprint","Buddy_fingerprint":"Fingerprint do contato","Close":"Fechar","Compared":"Comparado","To_authenticate_using_a_question_":"Para autenticar seu contato faça uma pergunta, mas escolha que só ele saiba a resposta.","Ask":"Pergunta","To_authenticate_pick_a_secret_":"Para autenticar, escolha um segredo que somente você e seu contato saibam.","Compare":"Compare","Fingerprints":"Fingerprints","Authentication":"Autenticação","Message":"Mensagem","Add_buddy":"Adicionar contato","rename_buddy":"renomear contato","delete_buddy":"remover contato","Login":"Entrar","Username":"Usuário","Password":"Senha","Cancel":"Cancelar","Connect":"Conectar","Type_in_the_full_username_":"Digite seu nome completo e um apelido opcional.","Alias":"Apelido","Add":"Adicionar","Subscription_request":"Pedido de inscrição","You_have_a_request_from":"Você tem um pedido de","Deny":"Negar","Approve":"Aprovar","Remove_buddy":"Remover contato","You_are_about_to_remove_":"Você está prestes a remover {{bid_name}} (<b>{{bid_jid}}</b>) de sua lista de contatos. Todas as conversas serão fechadas.","Continue_without_chat":"Continue sem converar","Please_wait":"Por favor aguarde","Login_failed":"Autenticação da conversa falhou","Sorry_we_cant_authentikate_":"A autenticação com o servidor falhou. Talvez seja a senha errada?","Retry":"Voltar","clear_history":"Limpar histórico","New_message_from":"Nova mensagem de","Should_we_notify_you_":"Devemos continuar notificando sobre novas mensagens no futuro?","Please_accept_":"Por favor clique no botão \"Permitir\" na parte superior.","Hide_offline":"Esconder contatos desconectados","Show_offline":"Mostrar contatos desconectados","About":"Sobre","dnd":"Não perturbe","Mute":"Mudo","Unmute":"Ligar","Subscription":"Inscrição","both":"ambos","Status":"Status","online":"online","chat":"conversa","away":"ausente","xa":"ausente por mais tempo","offline":"desativado","none":"nenhum","Unknown_instance_tag":"Marcação desconhecida da instância","Not_one_of_our_latest_keys":"Nenhuma de nossas ultimas chaves.","Received_an_unreadable_encrypted_message":"Mensagem encriptada ilegível foi recebida.","Online":"Online","Chatty":"Tagarela","Away":"Ausente","Extended_away":"Ausente por mais tempo","Offline":"Desativado","Friendship_request":"Pedido de amizade","Confirm":"Confirmar","Dismiss":"Ignorar","Remove":"Remover","Online_help":"Ajuda online","FN":"Nome completo","N":" ","FAMILY":"Sobrenome","GIVEN":"Nome","NICKNAME":"Apelido","URL":"URL","ADR":"Endereço","STREET":"Rua, Av, etc","EXTADD":"Complemento","LOCALITY":"Localidade","REGION":"Região","PCODE":"CEP","CTRY":"País","TEL":"Telefone","NUMBER":"Número","EMAIL":"Email","USERID":" ","ORG":"Empresa","ORGNAME":"Nome","ORGUNIT":"Unidade","TITLE":"Cargo","ROLE":"Rol","BDAY":"Data de nascimento","DESC":"Descrição","PHOTO":" ","send_message":"Enviar mensagem","get_info":"Exibir informações","Settings":"Configurações","Priority":"Prioridade","Save":"Salvar","User_settings":"Configurações do usuário","A_fingerprint_":"O fingerprint é usado para certificar que a pessoa com a qual se está falando é que ela diz ser.","Your_roster_is_empty_add_a":"Sua lista está vazia, adicione um ","new_buddy":"novo contato","is":"é","Login_options":"Opções de login","BOSH_url":"BOSH URL","Domain":"Domínio","Resource":"Recurso","On_login":"Ao autenticar","Received_an_unencrypted_message":"Mensagem não encriptada recebida","Sorry_your_buddy_doesnt_provide_any_information":"Desculpe, seu contato não forneceu nenhuma informação","Info_about":"Informações sobre","Authentication_aborted":"Autenticação encerrada.","Authentication_request_received":"Pedido de autenticação recebido","Do_you_want_to_display_them":"Você quer mostrá-los?","Log_in_without_chat":"Entrar sem conversar","has_come_online":"ficou online","Unknown_sender":"Emissor desconhecido","You_received_a_message_from_an_unknown_sender":"Você recebeu uma mensagem de um emissor desconhecido","Please_allow_access_to_microphone_and_camera":"Por favor clique no botão \"Permitir\" no topo, para conceder acesso ao seu microfone e câmera.","Incoming_call":"Recebendo chamada","from":"de","Do_you_want_to_accept_the_call_from":"Você aceita a chamada de","Reject":"Negar","Accept":"Aceitar","hang_up":"desligar","snapshot":"registrar imagem","mute_my_audio":"mudo","pause_my_video":"pausar vídeo","fullscreen":"tela cheia","Info":"Informações","Local_IP":"IP local","Remote_IP":"IP remoto","Local_Fingerprint":"Fingerprint local","Remote_Fingerprint":"Fingerprint remoto","Video_call_not_possible":"Chamada de vídeo impossível. Seu contato não suporta chamadas desse tipo.","Start_video_call":"Iniciar chamada de vídeo"}},"ro":{"translation":{"Logging_in":null,"your_connection_is_unencrypted":null,"your_connection_is_encrypted":null,"your_buddy_closed_the_private_connection":null,"start_private":null,"close_private":null,"your_buddy_is_verificated":null,"you_have_only_a_subscription_in_one_way":null,"authentication_query_sent":null,"your_message_wasnt_send_please_end_your_private_conversation":null,"unencrypted_message_received":null,"your_message_wasnt_send_because_you_have_no_valid_subscription":null,"not_available":null,"no_connection":null,"relogin":null,"trying_to_start_private_conversation":null,"Verified":null,"Unverified":null,"private_conversation_started":null,"private_conversation_aborted":null,"your_buddy_closed_the_private_conversation_you_should_do_the_same":null,"conversation_is_now_verified":null,"authentication_failed":null,"your_buddy_is_attempting_to_determine_":null,"to_authenticate_to_your_buddy":null,"enter_the_answer_and_click_answer":null,"enter_the_secret":null,"Creating_your_private_key_":null,"Authenticating_a_buddy_helps_":null,"How_do_you_want_to_authenticate_your_buddy":null,"Select_method":null,"Manual":null,"Question":null,"Secret":null,"To_verify_the_fingerprint_":null,"Your_fingerprint":null,"Buddy_fingerprint":null,"Close":null,"Compared":null,"To_authenticate_using_a_question_":null,"Ask":null,"To_authenticate_pick_a_secret_":null,"Compare":null,"Fingerprints":null,"Authentication":null,"Message":null,"Add_buddy":null,"rename_buddy":null,"delete_buddy":null,"Login":null,"Username":null,"Password":null,"Cancel":null,"Connect":null,"Type_in_the_full_username_":null,"Alias":null,"Add":null,"Subscription_request":null,"You_have_a_request_from":null,"Deny":null,"Approve":null,"Remove_buddy":null,"You_are_about_to_remove_":null,"Continue_without_chat":null,"Please_wait":null,"Login_failed":null,"Sorry_we_cant_authentikate_":null,"Retry":null,"clear_history":null,"New_message_from":null,"Should_we_notify_you_":null,"Please_accept_":null,"Hide_offline":null,"Show_offline":null,"About":null,"dnd":null,"Mute":null,"Unmute":null,"Subscription":null,"both":null,"Status":null,"online":null,"chat":null,"away":null,"xa":null,"offline":null,"none":null,"Unknown_instance_tag":null,"Not_one_of_our_latest_keys":null,"Received_an_unreadable_encrypted_message":null,"Online":null,"Chatty":null,"Away":null,"Extended_away":null,"Offline":null,"Friendship_request":null,"Confirm":null,"Dismiss":null,"Remove":null,"Online_help":null,"FN":null,"N":null,"FAMILY":null,"GIVEN":null,"NICKNAME":null,"URL":null,"ADR":null,"STREET":null,"EXTADD":null,"LOCALITY":null,"REGION":null,"PCODE":null,"CTRY":null,"TEL":null,"NUMBER":null,"EMAIL":null,"USERID":null,"ORG":null,"ORGNAME":null,"ORGUNIT":null,"TITLE":null,"ROLE":null,"BDAY":null,"DESC":null,"PHOTO":null,"send_message":null,"get_info":null,"Settings":null,"Priority":null,"Save":null,"User_settings":null,"A_fingerprint_":null,"Your_roster_is_empty_add_a":null,"new_buddy":null,"is":null,"Login_options":null,"BOSH_url":null,"Domain":null,"Resource":null,"On_login":null,"Received_an_unencrypted_message":null,"Sorry_your_buddy_doesnt_provide_any_information":null,"Info_about":null,"Authentication_aborted":null,"Authentication_request_received":null,"Do_you_want_to_display_them":null,"Log_in_without_chat":null,"has_come_online":null,"Unknown_sender":null,"You_received_a_message_from_an_unknown_sender":null,"Please_allow_access_to_microphone_and_camera":null,"Incoming_call":null,"from":null,"Do_you_want_to_accept_the_call_from":null,"Reject":null,"Accept":null,"hang_up":null,"snapshot":null,"mute_my_audio":null,"pause_my_video":null,"fullscreen":null,"Info":null,"Local_IP":null,"Remote_IP":null,"Local_Fingerprint":null,"Remote_Fingerprint":null,"Video_call_not_possible":null,"Start_video_call":null}}}; \ No newline at end of file
diff --git a/build/js/ojsxc.js b/build/js/ojsxc.js
index cd1dcb1..c7fac6c 100644
--- a/build/js/ojsxc.js
+++ b/build/js/ojsxc.js
@@ -1,5 +1,5 @@
/*!
- * ojsxc v1.1.0 - 2015-02-16
+ * ojsxc v1.1.0 - 2015-04-29
*
* Copyright (c) 2015 Klaus Herberth <klaus@jsxc.org> <br>
* Released under the MIT license
@@ -211,17 +211,30 @@ $(function() {
});
return ret;
+ },
+ getUsers: function(search, cb) {
+ $.ajax({
+ type: 'GET',
+ url: OC.filePath('ojsxc', 'ajax', 'getUsers.php'),
+ data: {
+ search: search
+ },
+ success: cb,
+ error: function() {
+ jsxc.error('XHR error on getUsers.php');
+ }
+ });
}
});
// Add submit link without chat functionality
if (jsxc.el_exists(jsxc.options.loginForm.form) && jsxc.el_exists(jsxc.options.loginForm.jid) && jsxc.el_exists(jsxc.options.loginForm.pass)) {
- var link = $('<a/>').text(jsxc.translate('%%Log_in_without_chat%%')).attr('href', '#').click(function() {
+ var link = $('<a/>').text($.t('Log_in_without_chat')).attr('href', '#').click(function() {
jsxc.submitLoginForm();
});
var alt = $('<p id="jsxc_alt"/>').append(link);
$('#body-login form fieldset').append(alt);
}
-}); \ No newline at end of file
+});