[verto-client] move verto client to github.com/freeswitch/verto-client
|
@ -230,8 +230,6 @@ libs/libsndfile/src/version-metadata.rc
|
||||||
libs/libsndfile/tests/pedantic-header-test.sh
|
libs/libsndfile/tests/pedantic-header-test.sh
|
||||||
yum/RPMS
|
yum/RPMS
|
||||||
yum/temp
|
yum/temp
|
||||||
html5/verto/verto_communicator/bower_components/
|
|
||||||
html5/verto/verto_communicator/node_modules/
|
|
||||||
.vs/
|
.vs/
|
||||||
|
|
||||||
Freeswitch.2015.VC.db
|
Freeswitch.2015.VC.db
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
This needs to be fleshed out more.
|
|
||||||
It would be nice to develop a web app here that implements a web phone.
|
|
||||||
Do not base it on the demo because it was just tossed together.
|
|
||||||
|
|
||||||
To run jshint:
|
|
||||||
|
|
||||||
cd js
|
|
||||||
npm install
|
|
||||||
grunt
|
|
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 19 KiB |
|
@ -1,65 +0,0 @@
|
||||||
.nthChildTest > div:nth-child(odd) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > thead > tr > th {
|
|
||||||
|
|
||||||
border-width:4px;
|
|
||||||
padding: 2px;
|
|
||||||
font-size:10pt;
|
|
||||||
text-align: left;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > thead > tr > th.notSortable {
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > tbody > tr > td {
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
padding: 2px;
|
|
||||||
vertical-align: middle;
|
|
||||||
height:25px;
|
|
||||||
font-size: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable {
|
|
||||||
font-family: verdana;
|
|
||||||
font-size:10pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > tbody > tr:nth-child(odd),
|
|
||||||
.jsDataTable > tbody > tr.odd {
|
|
||||||
background-color: #ffffee;
|
|
||||||
}
|
|
||||||
.jsDataTable > tbody > tr:nth-child(even),
|
|
||||||
.jsDataTable > tbody > tr.even {
|
|
||||||
background-color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > thead th.sortAsc,
|
|
||||||
.jsDataTable > thead th.sortDesc {
|
|
||||||
color:ffffff;
|
|
||||||
|
|
||||||
background-color: #7777ff;
|
|
||||||
background-position: right center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > thead th.sortAsc {
|
|
||||||
background-image: url(/images/table/asc.png);
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable > thead th.sortDesc {
|
|
||||||
background-image: url(/images/table/desc.png);
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable.clickable > tbody > tr,
|
|
||||||
.clickable > .jsDataTable > tbody > tr {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsDataTable.clickable > tbody > tr.nonDataRow,
|
|
||||||
.clickable > .jsDataTable > tbody > tr.nonDataRow {
|
|
||||||
cursor: auto;
|
|
||||||
}
|
|
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 11 KiB |
|
@ -1,327 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<link rel="stylesheet" href="css/jquery.mobile.min.css"/>
|
|
||||||
<link rel="stylesheet" type="text/css" href="css/jsontable.css" />
|
|
||||||
<link rel="shortcut icon" href="favicon.ico" />
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title>FreeSWITCH Verto™ Demo</title>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
.pageheader {
|
|
||||||
font-size: 22px;
|
|
||||||
font-weight: normal;
|
|
||||||
height: 27px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ctlbtn {
|
|
||||||
border: 0px;
|
|
||||||
color: #eeeeee;
|
|
||||||
background-color: #0000ae;
|
|
||||||
font-face: arial;
|
|
||||||
height:18px;
|
|
||||||
font-size:7pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ctlbtn:hover {
|
|
||||||
color: #ffffae;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#chatwin
|
|
||||||
{
|
|
||||||
background-color: #eeeeee;
|
|
||||||
width: 500px;
|
|
||||||
height:150px;
|
|
||||||
overflow-y: scroll;
|
|
||||||
scrolling: auto;
|
|
||||||
text-align: left;
|
|
||||||
border-style:inset;
|
|
||||||
font-size: 10pt;
|
|
||||||
color: #3333ff;
|
|
||||||
resize:both;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chatuid
|
|
||||||
{
|
|
||||||
font-size: 7pt;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #ff3333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chatimg
|
|
||||||
{
|
|
||||||
max-width:100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.l1
|
|
||||||
{
|
|
||||||
border:1;
|
|
||||||
background-color:#fefefe;
|
|
||||||
height:1px;
|
|
||||||
opacity:0.4;
|
|
||||||
}
|
|
||||||
#chatmsg
|
|
||||||
{
|
|
||||||
width:400px;
|
|
||||||
max-height:40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div data-role="page" id="page-login" align="center">
|
|
||||||
<div data-role="header" class="page-header">
|
|
||||||
FreeSWITCH Verto™ Demo
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div data-role="page" id="page-incall" align="center">
|
|
||||||
<div data-role="header" id="calltitle" class="pageheader">
|
|
||||||
Verto™ IN CALL
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
<a target="_CC2104" href="https://www.cluecon.com"><img border="0" width="300" src="img/cc_banner.gif"></a>
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<div id="conf">
|
|
||||||
<div style="color:black;font-family: verdana" align="center" id="conf_count"></div>
|
|
||||||
<table width="800" cellspacing="0" cellpadding="0" border="0" align="center" id="conf_list" class="jsDataTable">
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
<div id="message" hidden="true">
|
|
||||||
<hr class="l1" width="500"/>
|
|
||||||
<div id="chatwin"></div>
|
|
||||||
<!-- <textarea readonly id="chatwin"></textarea>-->
|
|
||||||
<table><tr><td><textarea id="chatmsg"></textarea></td><td><button id="chatsend" style="width:100px;">Send</button></td></tr></table>
|
|
||||||
<hr class="l1" width="500"/><br>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain" id="xferdiv">
|
|
||||||
<input data-mini="true" type="text" id="xferto"><br>
|
|
||||||
<button data-inline="true" id="cancelxferbtn">Cancel Transfer</button>
|
|
||||||
<button data-inline="true" class="startxferbtn">Complete Transfer</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id=keypad>
|
|
||||||
<button class="dtmf" data-inline="true">1</button>
|
|
||||||
<button class="dtmf" data-inline="true">2</button>
|
|
||||||
<button class="dtmf" data-inline="true">3</button>
|
|
||||||
<br>
|
|
||||||
<button class="dtmf" data-inline="true">4</button>
|
|
||||||
<button class="dtmf" data-inline="true">5</button>
|
|
||||||
<button class="dtmf" data-inline="true">6</button>
|
|
||||||
<br>
|
|
||||||
<button class="dtmf" data-inline="true">7</button>
|
|
||||||
<button class="dtmf" data-inline="true">8</button>
|
|
||||||
<button class="dtmf" data-inline="true">9</button>
|
|
||||||
<br>
|
|
||||||
<button class="dtmf" data-inline="true">*</button>
|
|
||||||
<button class="dtmf" data-inline="true">0</button>
|
|
||||||
<button class="dtmf" data-inline="true">#</button>
|
|
||||||
</div>
|
|
||||||
<div id="conf_mod"></div>
|
|
||||||
<div style="color:blue" id="conf_display"></div>
|
|
||||||
|
|
||||||
<button data-inline="true" id="hold">HOLD</button>
|
|
||||||
<button data-inline="true" id="hupbtn">End Call</button>
|
|
||||||
<button data-inline="true" class="startxferbtn">Transfer</button>
|
|
||||||
<br><br>
|
|
||||||
<img src="img/verto_black_web.gif" width="300"><br><br>
|
|
||||||
<div id="media">
|
|
||||||
<video width=800 id="webcam" autoplay="autoplay" hidden="true"></video>
|
|
||||||
</div>
|
|
||||||
<br><br>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div data-role="page" id="page-main" align="center">
|
|
||||||
<div data-role="header" class="pageheader">
|
|
||||||
FreeSWITCH Verto™ Demo
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<a target="_CC2104" href="https://www.cluecon.com"><img border="0" width="300" src="img/cc_banner.gif"></a>
|
|
||||||
|
|
||||||
<div id="offline">
|
|
||||||
<div id="errordisplay" style="font-weight:bold;font-size:18px;color:#ae0000"></div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<label for="name">Login</label>
|
|
||||||
<input type="text" size="20" id="login"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<label for="name">Password</label>
|
|
||||||
<input type="password" size="20" id="passwd"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<label for="name">CID Name</label>
|
|
||||||
<input type="text" size="30" id="name"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<label for="name">CID Number</label>
|
|
||||||
<input type="text" size="20" id="cid"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<label for="name">Hostname</label>
|
|
||||||
<input type="text" size="20" id="hostName"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<label for="name">Websocket URL</label>
|
|
||||||
<input type="text" size="20" id="wsURL"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br><br>
|
|
||||||
<img src="img/verto_black_web.gif" width="300">
|
|
||||||
<br><br>
|
|
||||||
<button data-inline="true" id="loginbtn">Log In</button>
|
|
||||||
|
|
||||||
<br><br><br>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="online" align="center" style="width:600px">
|
|
||||||
<div class="ui-field-contain">
|
|
||||||
<input type="text" id="ext"/><br>
|
|
||||||
<div id="dialpad">
|
|
||||||
<button class="dialbtn" data-inline="true">1</button>
|
|
||||||
<button class="dialbtn" data-inline="true">2</button>
|
|
||||||
<button class="dialbtn" data-inline="true">3</button>
|
|
||||||
<br>
|
|
||||||
<button class="dialbtn" data-inline="true">4</button>
|
|
||||||
<button class="dialbtn" data-inline="true">5</button>
|
|
||||||
<button class="dialbtn" data-inline="true">6</button>
|
|
||||||
<br>
|
|
||||||
<button class="dialbtn" data-inline="true">7</button>
|
|
||||||
<button class="dialbtn" data-inline="true">8</button>
|
|
||||||
<button class="dialbtn" data-inline="true">9</button>
|
|
||||||
<br>
|
|
||||||
<button class="dialbtn" data-inline="true">*</button>
|
|
||||||
<button class="dialbtn" data-inline="true">0</button>
|
|
||||||
<button class="dialbtn" data-inline="true">#</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button data-inline="true" id="clearbtn">Clear</button>
|
|
||||||
<button data-inline="true" id="callbtn">Call</button>
|
|
||||||
<br><br>
|
|
||||||
<div style="color:blue" id="main_info"> </div><br><br>
|
|
||||||
<img src="img/verto_black_web.gif" width="300"><br><br>
|
|
||||||
<button data-inline="true"id="logoutbtn">Log Out</button>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<label><input id="use_vid" type="checkbox" value="foo" > Use Video</label>
|
|
||||||
<label><input id="use_stereo" type="checkbox" value="foo" > Stereo Audio</label>
|
|
||||||
<label><input id="use_stun" type="checkbox" value="foo" > Use STUN</label>
|
|
||||||
<br>
|
|
||||||
<!--
|
|
||||||
<b>TEXT</b><br>To: <input type="text" size="20" id="textto"/> MSG: <input type="text" size="40" id="textmsg"/>
|
|
||||||
<button id="vtxtbtn">Send</button>
|
|
||||||
-->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<table id="directory" width=500 style="font-size:11pt;font-face:arial">
|
|
||||||
<tr><td align=center colspan=2><b>FreeSWITCH VERTO™ WebRTC Demo Directory<Br><br></td></tr>
|
|
||||||
<tr><td width=100><b>Dial</b></td><td><b>Desc</b></td></tr>
|
|
||||||
<tr><td align=left colspan=2><hr></td></tr>
|
|
||||||
|
|
||||||
<tr><td>3d1</td><td> 3D sound demo #1</td></tr>
|
|
||||||
<tr><td>3d2</td><td> 3D sound demo #2</td></tr>
|
|
||||||
|
|
||||||
<tr><td>stereo1</td><td> Stereo sound demo #1</td></tr>
|
|
||||||
<tr><td>stereo2</td><td> Stereo sound demo #2</td></tr>
|
|
||||||
<tr><td>stereo3</td><td> Stereo sound demo #3</td></tr>
|
|
||||||
<tr><td>3500</td><td>Local 48k Stereo Conference</td></tr>
|
|
||||||
<tr><td> </td></tr>
|
|
||||||
<tr><td>cluecon</td><td> ClueCon Hotline</td></tr>
|
|
||||||
<tr><td><number></td><td>Call a US/Canda Number</td></tr>
|
|
||||||
|
|
||||||
<tr><td>vuc</td><td>VoIP Users Conference</td></tr>
|
|
||||||
<tr><td>888</td><td>FreeSWITCH Community Conference</td></tr>
|
|
||||||
|
|
||||||
<tr><td>3300</td><td>Local 48k Conference</td></tr>
|
|
||||||
<tr><td>5000</td><td>Try the Demo IVR</td></tr>
|
|
||||||
<tr><td>9664</td><td>Listen to Hold Music</td></tr>
|
|
||||||
<tr><td>9386</td><td>Funny Prompts</td></tr>
|
|
||||||
<tr><td>9198</td><td>Tetris (tone generator)</td></tr>
|
|
||||||
<tr><td colspan=2><Br>
|
|
||||||
<center>
|
|
||||||
<br><br><br>
|
|
||||||
</td></tr>
|
|
||||||
</td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div><!-- /page -->
|
|
||||||
|
|
||||||
<div data-role="page" id="dialog-logout" data-close-btn="none">
|
|
||||||
<div data-role="header">
|
|
||||||
<h2>Logged Out</h2>
|
|
||||||
</div>
|
|
||||||
<div data-role="content">
|
|
||||||
<p>You have been logged out or disconnected from the server.</p>
|
|
||||||
|
|
||||||
<button onclick="$('#dialog-logout').dialog('close')">OK</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div data-role="page" id="dialog-login-error" data-close-btn="none">
|
|
||||||
<div data-role="header">
|
|
||||||
<h2>Login Error</h2>
|
|
||||||
</div>
|
|
||||||
<div data-role="content">
|
|
||||||
<p>Error logging in</p>
|
|
||||||
|
|
||||||
<button onclick="$('#dialog-login-error').dialog('close')">OK</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div data-role="page" id="dialog-hold" data-close-btn="none">
|
|
||||||
<div data-role="header">
|
|
||||||
<h2>Call On hold</h2>
|
|
||||||
</div>
|
|
||||||
<div data-role="content">
|
|
||||||
<p>The call is on hold</p>
|
|
||||||
|
|
||||||
<button onclick="$('#dialog-hold').dialog('close');cur_call.toggleHold();">Resume Call</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div data-role="page" id="dialog-incoming-call" data-close-btn="none">
|
|
||||||
<div data-role="header">
|
|
||||||
<h2>Incoming Call</h2>
|
|
||||||
</div>
|
|
||||||
<div data-role="content">
|
|
||||||
<div id="dialog-incoming-call-txt"><p>Incoming Call</p></div>
|
|
||||||
<button id="ansbtn">Answer</button>
|
|
||||||
<div id="vansdiv"><button id="vansbtn">Answer Video</button></div>
|
|
||||||
<button id="declinebtn">Decline</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
|
|
||||||
<script type="text/javascript" src="js/jquery.mobile.min.js"></script>
|
|
||||||
<script type="text/javascript" src="js/jquery.json-2.4.min.js"></script>
|
|
||||||
<script type="text/javascript" src="js/jquery.cookie.js"></script>
|
|
||||||
<script type="text/javascript" src="js/jquery.dataTables.min.js"></script>
|
|
||||||
<script type="text/javascript" src="js/verto-min.js"></script>
|
|
||||||
<script type="text/javascript" src="verto.js"></script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery Cookie Plugin v1.3.1
|
|
||||||
* https://github.com/carhartl/jquery-cookie
|
|
||||||
*
|
|
||||||
* Copyright 2013 Klaus Hartl
|
|
||||||
* Released under the MIT license
|
|
||||||
*/
|
|
||||||
(function ($, document, undefined) {
|
|
||||||
|
|
||||||
var pluses = /\+/g;
|
|
||||||
|
|
||||||
function raw(s) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
function decoded(s) {
|
|
||||||
return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
|
|
||||||
}
|
|
||||||
|
|
||||||
function unRfc2068(value) {
|
|
||||||
if (value.indexOf('"') === 0) {
|
|
||||||
// This is a quoted cookie as according to RFC2068, unescape
|
|
||||||
value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function fromJSON(value) {
|
|
||||||
return config.json ? JSON.parse(value) : value;
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = $.cookie = function (key, value, options) {
|
|
||||||
|
|
||||||
// write
|
|
||||||
if (value !== undefined) {
|
|
||||||
options = $.extend({}, config.defaults, options);
|
|
||||||
|
|
||||||
if (value === null) {
|
|
||||||
options.expires = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof options.expires === 'number') {
|
|
||||||
var days = options.expires, t = options.expires = new Date();
|
|
||||||
t.setDate(t.getDate() + days);
|
|
||||||
}
|
|
||||||
|
|
||||||
value = config.json ? JSON.stringify(value) : String(value);
|
|
||||||
|
|
||||||
return (document.cookie = [
|
|
||||||
encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
|
|
||||||
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
|
||||||
options.path ? '; path=' + options.path : '',
|
|
||||||
options.domain ? '; domain=' + options.domain : '',
|
|
||||||
options.secure ? '; secure' : ''
|
|
||||||
].join(''));
|
|
||||||
}
|
|
||||||
|
|
||||||
// read
|
|
||||||
var decode = config.raw ? raw : decoded;
|
|
||||||
var cookies = document.cookie.split('; ');
|
|
||||||
var result = key ? null : {};
|
|
||||||
for (var i = 0, l = cookies.length; i < l; i++) {
|
|
||||||
var parts = cookies[i].split('=');
|
|
||||||
var name = decode(parts.shift());
|
|
||||||
var cookie = decode(parts.join('='));
|
|
||||||
|
|
||||||
if (key && key === name) {
|
|
||||||
result = fromJSON(cookie);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!key) {
|
|
||||||
result[name] = fromJSON(cookie);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
config.defaults = {};
|
|
||||||
|
|
||||||
$.removeCookie = function (key, options) {
|
|
||||||
if ($.cookie(key) !== null) {
|
|
||||||
$.cookie(key, null, options);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
})(jQuery, document);
|
|
|
@ -1,155 +0,0 @@
|
||||||
/*! DataTables 1.10.1
|
|
||||||
* ©2008-2014 SpryMedia Ltd - datatables.net/license
|
|
||||||
*/
|
|
||||||
(function(za,O,l){var N=function(h){function T(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),d[c]=e,"o"===b[1]&&T(a[e])});a._hungarianMap=d}function G(a,b,c){a._hungarianMap||T(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==l&&(c||b[d]===l))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),G(a[d],b[d],c)):b[d]=b[e]})}function N(a){var b=p.defaults.oLanguage,c=a.sZeroRecords;
|
|
||||||
!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&D(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&D(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&cb(a)}function db(a){w(a,"ordering","bSort");w(a,"orderMulti","bSortMulti");w(a,"orderClasses","bSortClasses");w(a,"orderCellsTop","bSortCellsTop");w(a,"order","aaSorting");w(a,"orderFixed","aaSortingFixed");w(a,"paging","bPaginate");
|
|
||||||
w(a,"pagingType","sPaginationType");w(a,"pageLength","iDisplayLength");w(a,"searching","bFilter");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&G(p.models.oSearch,a[b])}function eb(a){w(a,"orderable","bSortable");w(a,"orderData","aDataSort");w(a,"orderSequence","asSorting");w(a,"orderDataType","sortDataType")}function fb(a){var a=a.oBrowser,b=h("<div/>").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top:1,left:1,width:100,
|
|
||||||
overflow:"scroll"}).append(h('<div class="test"/>').css({width:"100%",height:10}))).appendTo("body"),c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==c.offset().left;b.remove()}function gb(a,b,c,d,e,f){var g,j=!1;c!==l&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Aa(a,b){var c=p.defaults.column,d=a.aoColumns.length,c=h.extend({},p.models.oColumn,c,{nTh:b?b:O.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:
|
|
||||||
"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},p.models.oSearch,c[d]);fa(a,d,null)}function fa(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==l&&null!==c&&(eb(c),G(p.defaults.column,c),c.mDataProp!==l&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&
|
|
||||||
!c.sClass&&(c.sClass=c.className),h.extend(b,c),D(b,c,"sWidth","sWidthOrig"),"number"===typeof c.iDataSort&&(b.aDataSort=[c.iDataSort]),D(b,c,"aDataSort"));var g=b.mData,j=U(g),i=b.mRender?U(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var d=j(a,b,l,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return Ba(g)(a,b,c)};a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));
|
|
||||||
a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function V(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ca(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=
|
|
||||||
a.oScroll;(""!==b.sY||""!==b.sX)&&W(a);u(a,null,"column-sizing",[a])}function ga(a,b){var c=X(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function Y(a,b){var c=X(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function Z(a){return X(a,"bVisible").length}function X(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Da(a){var b=a.aoColumns,c=a.aoData,d=p.ext.type.detect,e,f,g,j,i,h,m,n,k;e=0;for(f=b.length;e<f;e++)if(m=b[e],k=[],!m.sType&&m._sManualType)m.sType=
|
|
||||||
m._sManualType;else if(!m.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h&&!(k[i]===l&&(k[i]=A(a,i,e,"type")),n=d[g](k[i],a),!n||"html"===n);i++);if(n){m.sType=n;break}}m.sType||(m.sType="string")}}function hb(a,b,c,d){var e,f,g,j,i,o,m=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){o=b[e];var n=o.targets!==l?o.targets:o.aTargets;h.isArray(n)||(n=[n]);f=0;for(g=n.length;f<g;f++)if("number"===typeof n[f]&&0<=n[f]){for(;m.length<=n[f];)Aa(a);d(n[f],o)}else if("number"===typeof n[f]&&0>n[f])d(m.length+
|
|
||||||
n[f],o);else if("string"===typeof n[f]){j=0;for(i=m.length;j<i;j++)("_all"==n[f]||h(m[j].nTh).hasClass(n[f]))&&d(j,o)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function I(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},p.models.oRow,{src:c?"dom":"data"});f._aData=b;a.aoData.push(f);for(var b=a.aoColumns,f=0,g=b.length;f<g;f++)c&&Ea(a,e,f,A(a,e,f)),b[f].sType=null;a.aiDisplayMaster.push(e);(c||!a.oFeatures.bDeferRender)&&Fa(a,e,c,d);return e}function ha(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,
|
|
||||||
e){c=ia(a,e);return I(a,c.data,e,c.cells)})}function A(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,c=f.fnGetData(g,d,{settings:a,row:b,col:c});if(c===l)return a.iDrawError!=e&&null===j&&(P(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b,4),a.iDrawError=e),j;if((c===g||null===c)&&null!==j)c=j;else if("function"===typeof c)return c.call(g);return null===c&&"display"==d?"":c}function Ea(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,
|
|
||||||
d,{settings:a,row:b,col:c})}function Ga(a){return h.map(a.match(/(\\.|[^\.])+/g),function(a){return a.replace(/\\./g,".")})}function U(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=U(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==l?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,
|
|
||||||
j;if(""!==f){j=Ga(f);for(var i=0,h=j.length;i<h;i++){f=j[i].match($);g=j[i].match(Q);if(f){j[i]=j[i].replace($,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");i=0;for(h=a.length;i<h;i++)g.push(c(a[i],b,j));a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(Q,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===l)return l;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function Ba(a){if(h.isPlainObject(a))return Ba(a._);
|
|
||||||
if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=Ga(e),f;f=e[e.length-1];for(var g,j,i=0,h=e.length-1;i<h;i++){g=e[i].match($);j=e[i].match(Q);if(g){e[i]=e[i].replace($,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");j=0;for(h=d.length;j<h;j++)f={},b(f,d[j],g),a[e[i]].push(f);return}j&&(e[i]=e[i].replace(Q,""),a=a[e[i]](d));if(null===
|
|
||||||
a[e[i]]||a[e[i]]===l)a[e[i]]={};a=a[e[i]]}if(f.match(Q))a[f.replace(Q,"")](d);else a[f.replace($,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ha(a){return C(a.aoData,"_aData")}function ja(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0}function ka(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===l&&a.splice(d,1)}function la(a,b,c,d){var e=a.aoData[b],f;if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=
|
|
||||||
ia(a,e).data;else{var g=e.anCells,j;if(g){c=0;for(f=g.length;c<f;c++){for(j=g[c];j.childNodes.length;)j.removeChild(j.firstChild);g[c].innerHTML=A(a,b,c,"display")}}}e._aSortData=null;e._aFilterData=null;a=a.aoColumns;if(d!==l)a[d].sType=null;else{c=0;for(f=a.length;c<f;c++)a[c].sType=null}Ia(e)}function ia(a,b){var c=[],d=[],e=b.firstChild,f,g,j,i=0,o,m=a.aoColumns,n=function(a,b,c){"string"===typeof a&&(b=a.indexOf("@"),-1!==b&&(a=a.substring(b+1),j["@"+a]=c.getAttribute(a)))},k=function(a){g=m[i];
|
|
||||||
o=h.trim(a.innerHTML);g&&g._bAttrSrc?(j={display:o},n(g.mData.sort,j,a),n(g.mData.type,j,a),n(g.mData.filter,j,a),c.push(j)):c.push(o);i++};if(e)for(;e;){f=e.nodeName.toUpperCase();if("TD"==f||"TH"==f)k(e),d.push(e);e=e.nextSibling}else{d=b.anCells;e=0;for(f=d.length;e<f;e++)k(d[e])}return{data:c,cells:d}}function Fa(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,h,m,n;if(null===e.nTr){j=c||O.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Ia(e);m=0;for(n=a.aoColumns.length;m<n;m++){h=a.aoColumns[m];
|
|
||||||
i=c?d[m]:O.createElement(h.sCellType);g.push(i);if(!c||h.mRender||h.mData!==m)i.innerHTML=A(a,b,m,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&&i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,A(a,b,m),f,b,m)}u(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Ia(a){var b=a.nTr,c=a._aData;if(b){c.DT_RowId&&(b.id=c.DT_RowId);if(c.DT_RowClass){var d=c.DT_RowClass.split(" ");a.__rowc=a.__rowc?
|
|
||||||
Ja(a.__rowc.concat(d)):d;h(b).removeClass(a.__rowc.join(" ")).addClass(c.DT_RowClass)}c.DT_RowData&&h(b).data(c.DT_RowData)}}function ib(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=a.oClasses,m=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=m.length;b<c;b++)f=m[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Ka(a,f.nTh,b))),f.sTitle!=d.html()&&
|
|
||||||
d.html(f.sTitle),La(a,"header")(a,d,f,o);i&&aa(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(o.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=m[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ba(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,o;if(b){c===l&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&
|
|
||||||
!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(o=i=1,j[d][f]===l){a.appendChild(g[d][f].cell);for(j[d][f]=1;g[d+i]!==l&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+o]!==l&&g[d][f].cell==g[d][f+o].cell;){for(c=0;c<i;c++)j[d+c][f+o]=1;o++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function K(a){var b=u(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))B(a,!1);else{var b=
|
|
||||||
[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==z(a),i=a.aiDisplay;a.bDrawing=!0;g!==l&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,B(a,!1);else if(j){if(!a.bDestroying&&!jb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;for(j=j?0:g;j<f;j++){var m=i[j],n=a.aoData[m];null===n.nTr&&Fa(a,m);m=n.nTr;if(0!==e){var k=d[c%e];n._sRowStripe!=
|
|
||||||
k&&(h(m).removeClass(n._sRowStripe).addClass(k),n._sRowStripe=k)}u(a,"aoRowCallback",null,[m,n._aData,c,j]);b.push(m);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==z(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:Z(a),"class":a.oClasses.sRowEmpty}).html(c))[0];u(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ha(a),g,o,i]);u(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],
|
|
||||||
Ha(a),g,o,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));u(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function L(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&kb(a);d?ca(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;K(a);a._drawHold=!1}function lb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});
|
|
||||||
a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,o,m,n,k=0;k<f.length;k++){g=null;j=f[k];if("<"==j){i=h("<div/>")[0];o=f[k+1];if("'"==o||'"'==o){m="";for(n=2;f[k+n]!=o;)m+=f[k+n],n++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(o=m.split("."),i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==m.charAt(0)?i.id=m.substr(1,m.length-1):i.className=m;k+=n}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==
|
|
||||||
j&&d.bPaginate&&d.bLengthChange)g=mb(a);else if("f"==j&&d.bFilter)g=nb(a);else if("r"==j&&d.bProcessing)g=ob(a);else if("t"==j)g=pb(a);else if("i"==j&&d.bInfo)g=qb(a);else if("p"==j&&d.bPaginate)g=rb(a);else if(0!==p.ext.feature.length){i=p.ext.feature;n=0;for(o=i.length;n<o;n++)if(j==i[n].cFeature){g=i[n].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e)}function aa(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,o,m,n,k;a.splice(0,a.length);f=0;for(i=c.length;f<
|
|
||||||
i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){m=1*e.getAttribute("colspan");n=1*e.getAttribute("rowspan");m=!m||0===m||1===m?1:m;n=!n||0===n||1===n?1:n;g=0;for(j=a[f];j[g];)g++;o=g;k=1===m?!0:!1;for(j=0;j<m;j++)for(g=0;g<n;g++)a[f+g][o+j]={cell:e,unique:k},a[f+g].nTr=d}e=e.nextSibling}}}function ma(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],aa(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<
|
|
||||||
g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function na(a,b,c){u(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance;if(h.isPlainObject(g)&&g.data){f=g.data;var i=h.isFunction(f)?f(b):f,b=h.isFunction(f)&&i?i:h.extend(!0,b,i);delete g.data}i={data:b,success:function(b){var d=b.error||b.sError;
|
|
||||||
d&&a.oApi._fnLog(a,0,d);a.json=b;u(a,null,"xhr",[a,b]);c(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=a.oApi._fnLog;"parsererror"==c?d(a,0,"Invalid JSON response",1):4===b.readyState&&d(a,0,"Ajax error",7);B(a,!1)}};a.oAjaxData=b;u(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),c,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(i,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,
|
|
||||||
b,c,a):(a.jqXHR=h.ajax(h.extend(i,g)),g.data=f)}function jb(a){return a.bAjaxDataGet?(a.iDraw++,B(a,!0),na(a,sb(a),function(b){tb(a,b)}),!1):!0}function sb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o,m,n=R(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",C(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var l={draw:a.iDraw,
|
|
||||||
columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)o=b[g],m=f[g],i="function"==typeof o.mData?"function":o.mData,l.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:m.sSearch,regex:m.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,m.sSearch),k("bRegex_"+g,m.bRegex),k("bSearchable_"+g,o.bSearchable)),d.bSort&&k("bSortable_"+g,o.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&
|
|
||||||
(h.each(n,function(a,b){l.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+a,b.dir)}),k("iSortingCols",n.length));b=p.ext.legacy.ajax;return null===b?a.sAjaxSource?j:l:b?j:l}function tb(a,b){var c=b.sEcho!==l?b.sEcho:b.draw,d=b.iTotalRecords!==l?b.iTotalRecords:b.recordsTotal,e=b.iTotalDisplayRecords!==l?b.iTotalDisplayRecords:b.recordsFiltered;if(c){if(1*c<a.iDraw)return;a.iDraw=1*c}ja(a);a._iRecordsTotal=parseInt(d,10);a._iRecordsDisplay=parseInt(e,10);c=oa(a,b);d=0;for(e=
|
|
||||||
c.length;d<e;d++)I(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;K(a);a._bInitComplete||pa(a,b);a.bAjaxDataGet=!0;B(a,!1)}function oa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==l?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?U(c)(b):b}function nb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",
|
|
||||||
{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?"":this.value;b!=e.sSearch&&(ca(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,K(a))},i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT","ssp"===z(a)?Ma(f,400):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",
|
|
||||||
function(b,c){if(a===c)try{i[0]!==O.activeElement&&i.val(e.sSearch)}catch(d){}});return b[0]}function ca(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Da(a);if("ssp"!=z(a)){ub(a,b.sSearch,c,b.bEscapeRegex!==l?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)vb(a,e[b].sSearch,b,e[b].bEscapeRegex!==l?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);
|
|
||||||
wb(a)}else f(b);a.bFiltered=!0;u(a,null,"search",[a])}function wb(a){for(var b=p.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,h=c.length;i<h;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;c.push.apply(c,j)}}function vb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Na(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function ub(a,b,c,d,e,f){var d=Na(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,
|
|
||||||
g;0!==p.ext.search.length&&(c=!0);g=xb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Na(a,b,c,d){a=b?a:Oa(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||"",function(a){return'"'===a.charAt(0)?a.match(/^"(.*)"$/)[1]:a}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function Oa(a){return a.replace(Vb,"\\$1")}function xb(a){var b=
|
|
||||||
a.aoColumns,c,d,e,f,g,j,i,h,m=p.ext.type.search;c=!1;d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)if(c=b[e],c.bSearchable?(i=A(a,d,e,"filter"),i=m[c.sType]?m[c.sType](i):null!==i?i:""):i="",i)i.indexOf&&-1!==i.indexOf("&")&&(qa.innerHTML=i,i=Wb?qa.textContent:qa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}function yb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,
|
|
||||||
caseInsensitive:a.bCaseInsensitive}}function zb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function qb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Ab,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Ab(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+
|
|
||||||
1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Bb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Bb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,
|
|
||||||
f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ra(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;if(a.bInitialised){lb(a);ib(a);ba(a,a.aoHeader);ba(a,a.aoFooter);B(a,!0);c.bAutoWidth&&Ca(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=s(f.sWidth));L(a);e=z(a);"ssp"!=e&&("ajax"==e?na(a,[],function(c){var f=oa(a,c);for(b=0;b<f.length;b++)I(a,f[b]);a.iInitDisplayStart=d;L(a);B(a,!1);pa(a,c)},a):(B(a,!1),
|
|
||||||
pa(a)))}else setTimeout(function(){ra(a)},200)}function pa(a,b){a._bInitComplete=!0;b&&V(a);u(a,"aoInitComplete","init",[a,b])}function Pa(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Qa(a);u(a,null,"length",[a,c])}function mb(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);
|
|
||||||
a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Pa(a,h(this).val());K(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function rb(a){var b=a.sPaginationType,c=p.ext.pager[b],d="function"===typeof c,e=function(a){K(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+
|
|
||||||
"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),m=-1===i,b=m?0:Math.ceil(b/i),i=m?1:Math.ceil(h/i),h=c(b,i),n,m=0;for(n=f.p.length;m<n;m++)La(a,"pageButton")(a,f.p[m],m,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ra(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==
|
|
||||||
b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:P(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(u(a,null,"page",[a]),c&&K(a));return b}function ob(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function B(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");u(a,null,"processing",[a,b])}function pb(a){var b=h(a.nTable);b.attr("role",
|
|
||||||
"grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),o=h(b[0].cloneNode(!1)),m=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");m.length||(m=null);c=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:s(d):"100%"}).append(h("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",
|
|
||||||
width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append(b.children("thead")))).append("top"===j?g:null)).append(h("<div/>",{"class":f.sScrollBody}).css({overflow:"auto",height:!e?null:s(e),width:!d?null:s(d)}).append(b));m&&c.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:s(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.removeAttr("id").css("margin-left",0).append(b.children("tfoot")))).append("bottom"===j?g:
|
|
||||||
null));var b=c.children(),n=b[0],f=b[1],k=m?b[2]:null;d&&h(f).scroll(function(){var a=this.scrollLeft;n.scrollLeft=a;m&&(k.scrollLeft=a)});a.nScrollHead=n;a.nScrollBody=f;a.nScrollFoot=k;a.aoDrawCallback.push({fn:W,sName:"scrolling"});return c[0]}function W(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,f=b.iBarWidth,g=h(a.nScrollHead),j=g[0].style,i=g.children("div"),o=i[0].style,m=i.children("table"),i=a.nScrollBody,n=h(i),k=i.style,l=h(a.nScrollFoot).children("div"),p=l.children("table"),r=h(a.nTHead),
|
|
||||||
q=h(a.nTable),da=q[0],M=da.style,J=a.nTFoot?h(a.nTFoot):null,u=a.oBrowser,v=u.bScrollOversize,y,t,x,w,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};q.children("thead, tfoot").remove();z=r.clone().prependTo(q);y=r.find("tr");x=z.find("tr");z.find("th, td").removeAttr("tabindex");J&&(w=J.clone().prependTo(q),t=J.find("tr"),w=w.find("tr"));c||(k.width="100%",g[0].style.width="100%");h.each(ma(a,z),function(b,c){D=
|
|
||||||
ga(a,b);c.style.width=a.aoColumns[D].sWidth});J&&F(function(a){a.style.width=""},w);b.bCollapse&&""!==e&&(k.height=n[0].offsetHeight+r[0].offsetHeight+"px");g=q.outerWidth();if(""===c){if(M.width="100%",v&&(q.find("tbody").height()>i.offsetHeight||"scroll"==n.css("overflow-y")))M.width=s(q.outerWidth()-f)}else""!==d?M.width=s(d):g==n.width()&&n.height()<q.height()?(M.width=s(g-f),q.outerWidth()>g-f&&(M.width=s(g))):M.width=s(g);g=q.outerWidth();F(E,x);F(function(a){C.push(a.innerHTML);A.push(s(h(a).css("width")))},
|
|
||||||
x);F(function(a,b){a.style.width=A[b]},y);h(x).height(0);J&&(F(E,w),F(function(a){B.push(s(h(a).css("width")))},w),F(function(a,b){a.style.width=B[b]},t),h(w).height(0));F(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.style.width=A[b]},x);J&&F(function(a,b){a.innerHTML="";a.style.width=B[b]},w);if(q.outerWidth()<g){t=i.scrollHeight>i.offsetHeight||"scroll"==n.css("overflow-y")?g+f:g;if(v&&(i.scrollHeight>i.offsetHeight||"scroll"==n.css("overflow-y")))M.width=
|
|
||||||
s(t-f);(""===c||""!==d)&&P(a,1,"Possible column misalignment",6)}else t="100%";k.width=s(t);j.width=s(t);J&&(a.nScrollFoot.style.width=s(t));!e&&v&&(k.height=s(da.offsetHeight+f));e&&b.bCollapse&&(k.height=s(e),b=c&&da.offsetWidth>i.offsetWidth?f:0,da.offsetHeight<i.offsetHeight&&(k.height=s(da.offsetHeight+b)));b=q.outerWidth();m[0].style.width=s(b);o.width=s(b);m=q.height()>i.clientHeight||"scroll"==n.css("overflow-y");u="padding"+(u.bScrollbarLeft?"Left":"Right");o[u]=m?f+"px":"0px";J&&(p[0].style.width=
|
|
||||||
s(b),l[0].style.width=s(b),l[0].style[u]=m?f+"px":"0px");n.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)i.scrollTop=0}function F(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ca(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,f=d.sX,g=d.sXInner,j=c.length,d=X(a,"bVisible"),i=h("th",a.nTHead),o=b.getAttribute("width"),m=b.parentNode,n=!1,k,l;for(k=0;k<
|
|
||||||
d.length;k++)l=c[d[k]],null!==l.sWidth&&(l.sWidth=Cb(l.sWidthOrig,m),n=!0);if(!n&&!f&&!e&&j==Z(a)&&j==i.length)for(k=0;k<j;k++)c[k].sWidth=s(i.eq(k).width());else{j=h(b).clone().empty().css("visibility","hidden").removeAttr("id").append(h(a.nTHead).clone(!1)).append(h(a.nTFoot).clone(!1)).append(h("<tbody><tr/></tbody>"));j.find("tfoot th, tfoot td").css("width","");var p=j.find("tbody tr"),i=ma(a,j.find("thead")[0]);for(k=0;k<d.length;k++)l=c[d[k]],i[k].style.width=null!==l.sWidthOrig&&""!==l.sWidthOrig?
|
|
||||||
s(l.sWidthOrig):"";if(a.aoData.length)for(k=0;k<d.length;k++)n=d[k],l=c[n],h(Db(a,n)).clone(!1).append(l.sContentPadding).appendTo(p);j.appendTo(m);f&&g?j.width(g):f?(j.css("width","auto"),j.width()<m.offsetWidth&&j.width(m.offsetWidth)):e?j.width(m.offsetWidth):o&&j.width(o);Eb(a,j[0]);if(f){for(k=g=0;k<d.length;k++)l=c[d[k]],e=h(i[k]).outerWidth(),g+=null===l.sWidthOrig?e:parseInt(l.sWidth,10)+e-h(i[k]).width();j.width(s(g));b.style.width=s(g)}for(k=0;k<d.length;k++)if(l=c[d[k]],e=h(i[k]).width())l.sWidth=
|
|
||||||
s(e);b.style.width=s(j.css("width"));j.remove()}o&&(b.style.width=s(o));if((o||f)&&!a._reszEvt)h(za).bind("resize.DT-"+a.sInstance,Ma(function(){V(a)})),a._reszEvt=!0}function Ma(a,b){var c=b||200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=l;a.apply(b,j)},c)):d?(d=g,a.apply(b,j)):d=g}}function Cb(a,b){if(!a)return 0;var c=h("<div/>").css("width",s(a)).appendTo(b||O.body),d=c[0].offsetWidth;c.remove();return d}function Eb(a,b){var c=
|
|
||||||
a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(h(b).outerWidth()-c)}function Db(a,b){var c=Fb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(A(a,c,b,"display"))[0]:d.anCells[b]}function Fb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=A(a,f,b,"display")+"",c=c.replace(Xb,""),c.length>d&&(d=c.length,e=f);return e}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Gb(){if(!p.__scrollbarWidth){var a=
|
|
||||||
h("<p/>").css({width:"100%",height:200,padding:0})[0],b=h("<div/>").css({position:"absolute",top:0,left:0,width:200,height:150,padding:0,overflow:"hidden",visibility:"hidden"}).append(a).appendTo("body"),c=a.offsetWidth;b.css("overflow","scroll");a=a.offsetWidth;c===a&&(a=b[0].clientWidth);b.remove();p.__scrollbarWidth=c-a}return p.__scrollbarWidth}function R(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var o=[];f=function(a){a.length&&!h.isArray(a[0])?o.push(a):o.push.apply(o,
|
|
||||||
a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<o.length;a++){i=o[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||"string",d.push({src:i,col:g,dir:o[a][1],index:o[a][2],type:j,formatter:p.ext.type.order[j+"-pre"]})}return d}function kb(a){var b,c,d=[],e=p.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Da(a);h=R(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Hb(a,j.col);if("ssp"!=z(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=
|
|
||||||
b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,l=f[a]._aSortData,p=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=l[j.col],e=p[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,l=h.length,p=f[a]._aSortData,r=f[b]._aSortData;for(j=0;j<l;j++)if(i=h[j],c=p[i.col],g=r[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Ib(a){for(var b,c,
|
|
||||||
d=a.aoColumns,e=R(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Sa(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a){var b=a._idx;b===l&&(b=h.inArray(a[1],
|
|
||||||
f));return b+1>=f.length?0:b+1};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,C(e,"0")),-1!==c?(b=g(e[c]),e[c][1]=f[b],e[c]._idx=b):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);L(a);"function"==typeof d&&d(a)}function Ka(a,b,c,d){var e=a.aoColumns[c];Ta(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(B(a,!0),setTimeout(function(){Sa(a,c,b.shiftKey,
|
|
||||||
d);"ssp"!==z(a)&&B(a,!1)},0)):Sa(a,c,b.shiftKey,d))})}function sa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=R(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(C(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(C(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Hb(a,b){var c=a.aoColumns[b],d=p.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,Y(a,b)));for(var f,g=p.ext.type.order[c.sType+
|
|
||||||
"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:A(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ta(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:yb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:yb(a.aoPreSearchCols[d])}})};u(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=
|
|
||||||
b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Jb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=u(a,"aoStateLoadParams","stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);a._iDisplayStart=e.start;a.iInitDisplayStart=e.start;a._iDisplayLength=e.length;a.aaSorting=[];h.each(e.order,function(b,c){a.aaSorting.push(c[0]>=
|
|
||||||
d.length?[0,c[1]]:c)});h.extend(a.oPreviousSearch,zb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];d[b].bVisible=f.visible;h.extend(a.aoPreSearchCols[b],zb(f.search))}u(a,"aoStateLoaded","stateLoaded",[a,e])}}}function ua(a){var b=p.settings,a=h.inArray(a,C(b,"nTable"));return-1!==a?b[a]:null}function P(a,b,c,d){c="DataTables warning: "+(null!==a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)za.console&&
|
|
||||||
console.log&&console.log(c);else if(a=p.ext,"alert"==(a.sErrMode||a.errMode))alert(c);else throw Error(c);}function D(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?D(a,b,d[0],d[1]):D(a,b,d)}):(d===l&&(d=c),b[c]!==l&&(a[d]=b[c]))}function Kb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Ta(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();
|
|
||||||
c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function x(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function u(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&h(a.nTable).trigger(c+".dt",d);return e}function Qa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;c===a.fnRecordsDisplay()&&(b=c-d);if(-1===d||0>b)b=0;a._iDisplayStart=b}function La(a,b){var c=
|
|
||||||
a.renderer,d=p.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function z(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Ua(a,b){var c=[],c=Lb.numbers_length,d=Math.floor(c/2);b<=c?c=S(0,b):a<=d?(c=S(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=S(b-(c-2),b):(c=S(a-1,a+2),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return va(b,
|
|
||||||
a)},"num-fmt":function(b){return va(b,a,Va)},"html-num":function(b){return va(b,a,wa)},"html-num-fmt":function(b){return va(b,a,wa,Va)}},function(b,c){t.type.order[b+a+"-pre"]=c})}function Mb(a){return function(){var b=[ua(this[p.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return p.ext.internal[a].apply(this,b)}}var p,t,q,r,v,Wa={},Nb=/[\r\n]/g,wa=/<.*?>/g,Yb=/^[\w\+\-]/,Zb=/[\w\+\-]$/,Vb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Va=/[',$\u00a3\u20ac\u00a5%\u2009\u202F]/g,
|
|
||||||
H=function(a){return!a||!0===a||"-"===a?!0:!1},Ob=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Pb=function(a,b){Wa[b]||(Wa[b]=RegExp(Oa(b),"g"));return"string"===typeof a?a.replace(/\./g,"").replace(Wa[b],"."):a},Xa=function(a,b,c){var d="string"===typeof a;b&&d&&(a=Pb(a,b));c&&d&&(a=a.replace(Va,""));return H(a)||!isNaN(parseFloat(a))&&isFinite(a)},Qb=function(a,b,c){return H(a)?!0:!(H(a)||"string"===typeof a)?null:Xa(a.replace(wa,""),b,c)?!0:null},C=function(a,b,c){var d=
|
|
||||||
[],e=0,f=a.length;if(c!==l)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},xa=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==l)for(;f<g;f++)e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},S=function(a,b){var c=[],d;b===l?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Ja=function(a){var b=[],c,d,e=a.length,f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},w=function(a,
|
|
||||||
b,c){a[b]!==l&&(a[c]=a[b])},$=/\[.*?\]$/,Q=/\(\)$/,qa=h("<div>")[0],Wb=qa.textContent!==l,Xb=/<.*?>/g;p=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new q(ua(this[t.iApiIndex])):new q(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===l||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=
|
|
||||||
function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===l||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&W(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===l||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===l||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(!a)};
|
|
||||||
this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===l?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==l){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==l||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==l?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();
|
|
||||||
return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===l||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===l||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ua(this[t.iApiIndex])};
|
|
||||||
this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===l||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===l||e)&&h.columns.adjust();(d===l||d)&&h.draw();return 0};this.fnVersionCheck=t.fnVersionCheck;var b=this,c=a===l,d=this.length;c&&(a={});this.oApi=this.internal=t.internal;for(var e in p.ext.internal)e&&(this[e]=Mb(e));this.each(function(){var e={},g=1<d?Kb(e,a,!0):
|
|
||||||
a,j=0,i,o=this.getAttribute("id"),e=!1,m=p.defaults;if("table"!=this.nodeName.toLowerCase())P(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{db(m);eb(m.column);G(m,m,!0);G(m.column,m.column,!0);G(m,g);var n=p.settings,j=0;for(i=n.length;j<i;j++){if(n[j].nTable==this){i=g.bRetrieve!==l?g.bRetrieve:m.bRetrieve;if(c||i)return n[j].oInstance;if(g.bDestroy!==l?g.bDestroy:m.bDestroy){n[j].oInstance.fnDestroy();break}else{P(n[j],0,"Cannot reinitialise DataTable",3);return}}if(n[j].sTableId==
|
|
||||||
this.id){n.splice(j,1);break}}if(null===o||""===o)this.id=o="DataTables_Table_"+p.ext._unique++;var k=h.extend(!0,{},p.models.oSettings,{nTable:this,oApi:b.internal,oInit:g,sDestroyWidth:h(this)[0].style.width,sInstance:o,sTableId:o});n.push(k);k.oInstance=1===b.length?b:h(this).dataTable();db(g);g.oLanguage&&N(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=h.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);g=Kb(h.extend(!0,{},m),g);D(k.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));
|
|
||||||
D(k,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);D(k.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],
|
|
||||||
["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);D(k.oLanguage,g,"fnInfoCallback");x(k,"aoDrawCallback",g.fnDrawCallback,"user");x(k,"aoServerParams",g.fnServerParams,"user");x(k,"aoStateSaveParams",g.fnStateSaveParams,"user");x(k,"aoStateLoadParams",g.fnStateLoadParams,"user");x(k,"aoStateLoaded",g.fnStateLoaded,"user");x(k,"aoRowCallback",g.fnRowCallback,"user");x(k,"aoRowCreatedCallback",g.fnCreatedRow,"user");x(k,"aoHeaderCallback",g.fnHeaderCallback,"user");x(k,"aoFooterCallback",g.fnFooterCallback,
|
|
||||||
"user");x(k,"aoInitComplete",g.fnInitComplete,"user");x(k,"aoPreDrawCallback",g.fnPreDrawCallback,"user");o=k.oClasses;g.bJQueryUI?(h.extend(o,p.ext.oJUIClasses,g.oClasses),g.sDom===m.sDom&&"lfrtip"===m.sDom&&(k.sDom='<"H"lfr>t<"F"ip>'),k.renderer)?h.isPlainObject(k.renderer)&&!k.renderer.header&&(k.renderer.header="jqueryui"):k.renderer="jqueryui":h.extend(o,p.ext.classes,g.oClasses);h(this).addClass(o.sTable);if(""!==k.oScroll.sX||""!==k.oScroll.sY)k.oScroll.iBarWidth=Gb();!0===k.oScroll.sX&&(k.oScroll.sX=
|
|
||||||
"100%");k.iInitDisplayStart===l&&(k.iInitDisplayStart=g.iDisplayStart,k._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(k.bDeferLoading=!0,j=h.isArray(g.iDeferLoading),k._iRecordsDisplay=j?g.iDeferLoading[0]:g.iDeferLoading,k._iRecordsTotal=j?g.iDeferLoading[1]:g.iDeferLoading);""!==g.oLanguage.sUrl?(k.oLanguage.sUrl=g.oLanguage.sUrl,h.getJSON(k.oLanguage.sUrl,null,function(a){N(a);G(m.oLanguage,a);h.extend(true,k.oLanguage,g.oLanguage,a);ra(k)}),e=!0):h.extend(!0,k.oLanguage,g.oLanguage);
|
|
||||||
null===g.asStripeClasses&&(k.asStripeClasses=[o.sStripeOdd,o.sStripeEven]);var j=k.asStripeClasses,r=h("tbody tr:eq(0)",this);-1!==h.inArray(!0,h.map(j,function(a){return r.hasClass(a)}))&&(h("tbody tr",this).removeClass(j.join(" ")),k.asDestroyStripes=j.slice());var n=[],q,j=this.getElementsByTagName("thead");0!==j.length&&(aa(k.aoHeader,j[0]),n=ma(k));if(null===g.aoColumns){q=[];j=0;for(i=n.length;j<i;j++)q.push(null)}else q=g.aoColumns;j=0;for(i=q.length;j<i;j++)Aa(k,n?n[j]:null);hb(k,g.aoColumnDefs,
|
|
||||||
q,function(a,b){fa(k,a,b)});if(r.length){var s=function(a,b){return a.getAttribute("data-"+b)?b:null};h.each(ia(k,r[0]).cells,function(a,b){var c=k.aoColumns[a];if(c.mData===a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:l,type:d!==null?a+".@data-"+d:l,filter:e!==null?a+".@data-"+e:l};fa(k,a)}}})}var t=k.oFeatures;g.bStateSave&&(t.bStateSave=!0,Jb(k,g),x(k,"aoDrawCallback",ta,"state_save"));if(g.aaSorting===
|
|
||||||
l){n=k.aaSorting;j=0;for(i=n.length;j<i;j++)n[j][1]=k.aoColumns[j].asSorting[0]}sa(k);t.bSort&&x(k,"aoDrawCallback",function(){if(k.bSorted){var a=R(k),b={};h.each(a,function(a,c){b[c.src]=c.dir});u(k,null,"order",[k,a,b]);Ib(k)}});x(k,"aoDrawCallback",function(){(k.bSorted||z(k)==="ssp"||t.bDeferRender)&&sa(k)},"sc");fb(k);j=h(this).children("caption").each(function(){this._captionSide=h(this).css("caption-side")});i=h(this).children("thead");0===i.length&&(i=h("<thead/>").appendTo(this));k.nTHead=
|
|
||||||
i[0];i=h(this).children("tbody");0===i.length&&(i=h("<tbody/>").appendTo(this));k.nTBody=i[0];i=h(this).children("tfoot");if(0===i.length&&0<j.length&&(""!==k.oScroll.sX||""!==k.oScroll.sY))i=h("<tfoot/>").appendTo(this);0===i.length||0===i.children().length?h(this).addClass(o.sNoFooter):0<i.length&&(k.nTFoot=i[0],aa(k.aoFooter,k.nTFoot));if(g.aaData)for(j=0;j<g.aaData.length;j++)I(k,g.aaData[j]);else(k.bDeferLoading||"dom"==z(k))&&ha(k,h(k.nTBody).children("tr"));k.aiDisplay=k.aiDisplayMaster.slice();
|
|
||||||
k.bInitialised=!0;!1===e&&ra(k)}});b=null;return this};var Rb=[],y=Array.prototype,$b=function(a){var b,c,d=p.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};
|
|
||||||
q=function(a,b){if(!this instanceof q)throw"DT API must be constructed as a new object";var c=[],d=function(a){(a=$b(a))&&c.push.apply(c,a)};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=Ja(c);b&&this.push.apply(this,b.toArray?b.toArray():b);this.selector={rows:null,cols:null,opts:null};q.extend(this,this,Rb)};p.Api=q;q.prototype={concat:y.concat,context:[],each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=
|
|
||||||
this.context;return b.length>a?new q(b[a],this[a]):null},filter:function(a){var b=[];if(y.filter)b=y.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new q(this.context,b)},flatten:function(){var a=[];return new q(this.context,a.concat.apply(a,this.toArray()))},join:y.join,indexOf:y.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c){var d=[],e,f,g,h,i,o=this.context,
|
|
||||||
m,n,k=this.selector;"string"===typeof a&&(c=b,b=a,a=!1);f=0;for(g=o.length;f<g;f++)if("table"===b)e=c(o[f],f),e!==l&&d.push(e);else if("columns"===b||"rows"===b)e=c(o[f],this[f],f),e!==l&&d.push(e);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){n=this[f];"column-rows"===b&&(m=Ya(o[f],k.opts));h=0;for(i=n.length;h<i;h++)e=n[h],e="cell"===b?c(o[f],e.row,e.column,f,h):c(o[f],e,f,h,m),e!==l&&d.push(e)}return d.length?(a=new q(o,a?d.concat.apply([],d):d),b=a.selector,b.rows=k.rows,b.cols=
|
|
||||||
k.cols,b.opts=k.opts,a):this},lastIndexOf:y.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(y.map)b=y.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new q(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:y.pop,push:y.push,reduce:y.reduce||function(a,b){return gb(this,a,b,0,this.length,1)},reduceRight:y.reduceRight||function(a,b){return gb(this,
|
|
||||||
a,b,this.length-1,-1,-1)},reverse:y.reverse,selector:null,shift:y.shift,sort:y.sort,splice:y.splice,toArray:function(){return y.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new q(this.context,Ja(this))},unshift:y.unshift};q.extend=function(a,b,c){if(b&&(b instanceof q||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);q.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]=
|
|
||||||
"function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,q.extend(a,b[f.name],f.propExt)}};q.register=r=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)q.register(a[c],b);else for(var e=a.split("."),f=Rb,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var o=f.length;i<o;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:
|
|
||||||
i.propExt}};q.registerPlural=v=function(a,b,c){q.register(a,c);q.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof q?a.length?h.isArray(a[0])?new q(a.context,a[0]):a[0]:l:a})};r("tables()",function(a){var b;if(a){b=q;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});r("table()",function(a){var a=this.tables(a),
|
|
||||||
b=a.context;return b.length?new q(b[0]):a});v("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable})});v("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody})});v("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead})});v("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot})});v("tables().containers()",
|
|
||||||
"table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper})});r("draw()",function(a){return this.iterator("table",function(b){L(b,!1===a)})});r("page()",function(a){return a===l?this.page.info().page:this.iterator("table",function(b){Ra(b,a)})});r("page.info()",function(){if(0===this.context.length)return l;var a=this.context[0],b=a._iDisplayStart,c=a._iDisplayLength,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,
|
|
||||||
end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d}});r("page.len()",function(a){return a===l?0!==this.context.length?this.context[0]._iDisplayLength:l:this.iterator("table",function(b){Pa(b,a)})});var Sb=function(a,b,c){"ssp"==z(a)?L(a,b):(B(a,!0),na(a,[],function(c){ja(a);for(var c=oa(a,c),d=0,g=c.length;d<g;d++)I(a,c[d]);L(a,b);B(a,!1)}));if(c){var d=new q(a);d.one("draw",function(){c(d.ajax.json())})}};r("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});
|
|
||||||
r("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});r("ajax.reload()",function(a,b){return this.iterator("table",function(c){Sb(c,!1===b,a)})});r("ajax.url()",function(a){var b=this.context;if(a===l){if(0===b.length)return l;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});r("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Sb(c,
|
|
||||||
!1===b,a)})});var Za=function(a,b){var c=[],d,e,f,g,j,i;if(!a||"string"===typeof a||a.length===l)a=[a];f=0;for(g=a.length;f<g;f++){e=a[f]&&a[f].split?a[f].split(","):[a[f]];j=0;for(i=e.length;j<i;j++)(d=b("string"===typeof e[j]?h.trim(e[j]):e[j]))&&d.length&&c.push.apply(c,d)}return c},$a=function(a){a||(a={});a.filter&&!a.search&&(a.search=a.filter);return{search:a.search||"none",order:a.order||"current",page:a.page||"all"}},ab=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=
|
|
||||||
a[b],a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ya=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==z(a))return"removed"===j?[]:S(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==
|
|
||||||
j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};r("rows()",function(a,b){a===l?a="":h.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var e=b;return Za(a,function(a){var b=Ob(a);if(b!==null&&!e)return[b];var j=Ya(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;for(var b=[],i=0,o=j.length;i<o;i++)b.push(c.aoData[j[i]].nTr);return a.nodeName&&h.inArray(a,b)!==-1?[a._DT_RowIndex]:h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()})});
|
|
||||||
c.selector.rows=a;c.selector.opts=b;return c});r("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||l})});r("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return xa(a.aoData,b,"_aData")})});v("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData})});v("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,
|
|
||||||
c){la(b,c,a)})});v("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b})});v("rows().remove()","row().remove()",function(){var a=this;return this.iterator("row",function(b,c,d){var e=b.aoData;e.splice(c,1);for(var f=0,g=e.length;f<g;f++)null!==e[f].nTr&&(e[f].nTr._DT_RowIndex=f);h.inArray(c,b.aiDisplay);ka(b.aiDisplayMaster,c);ka(b.aiDisplay,c);ka(a[d],c,!1);Qa(b)})});r("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;
|
|
||||||
for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ha(b,c)[0]):h.push(I(b,c));return h}),c=this.rows(-1);c.pop();c.push.apply(c,b.toArray());return c});r("row()",function(a,b){return ab(this.rows(a,b))});r("row().data()",function(a){var b=this.context;if(a===l)return b.length&&this.length?b[0].aoData[this[0]]._aData:l;b[0].aoData[this[0]]._aData=a;la(b[0],this[0],"data");return this});r("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||
|
|
||||||
null:null});r("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ha(b,a)[0]:I(b,a)});return this.row(b[0])});var bb=function(a){var b=a.context;b.length&&a.length&&(a=b[0].aoData[a[0]],a._details&&(a._details.remove(),a._detailsShow=l,a._details=l))},Tb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();
|
|
||||||
var e=c[0],f=new q(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<C(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=Z(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,
|
|
||||||
b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&bb(g[c])}))}}};r("row().child()",function(a,b){var c=this.context;if(a===l)return c.length&&this.length?c[0].aoData[this[0]]._details:l;if(!0===a)this.child.show();else if(!1===a)bb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(a.nodeName&&"tr"===a.nodeName.toLowerCase())e.push(a);else{var c=h("<tr><td/></tr>").addClass(b);h("td",c).addClass(b).html(a)[0].colSpan=Z(d);e.push(c[0])}};if(h.isArray(a)||
|
|
||||||
a instanceof h)for(var g=0,j=a.length;g<j;g++)f(a[g],b);else f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Tb(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Tb(this,!1);return this});r(["row().child.remove()","row().child().remove()"],function(){bb(this);return this});r("row().child.isShown()",function(){var a=this.context;return a.length&&
|
|
||||||
this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var ac=/^(.*):(name|visIdx|visible)$/;r("columns()",function(a,b){a===l?a="":h.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(b){var c=a,f=b.aoColumns,g=C(f,"sName"),j=C(f,"nTh");return Za(c,function(a){var c=Ob(a);if(a==="")return S(f.length);if(c!==null)return[c>=0?c:f.length+c];var e=typeof a==="string"?a.match(ac):"";if(e)switch(e[2]){case "visIdx":case "visible":a=parseInt(e[1],10);if(a<0){c=h.map(f,function(a,
|
|
||||||
b){return a.bVisible?b:null});return[c[c.length+a]]}return[ga(b,a)];case "name":return h.map(g,function(a,b){return a===e[1]?b:null})}else return h(j).filter(a).map(function(){return h.inArray(this,j)}).toArray()})});c.selector.cols=a;c.selector.opts=b;return c});v("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh})});v("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf})});
|
|
||||||
v("columns().data()","column().data()",function(){return this.iterator("column-rows",function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(A(a,e[d],b,""));return c})});v("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return xa(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)})});v("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return xa(a.aoData,e,"anCells",b)})});v("columns().visible()",
|
|
||||||
"column().visible()",function(a){return this.iterator("column",function(b,c){var d;if(a===l)d=b.aoColumns[c].bVisible;else{var e=b.aoColumns;d=e[c];var f=b.aoData,g,j,i;if(a===l)d=d.bVisible;else{if(d.bVisible!==a){if(a){var o=h.inArray(!0,C(e,"bVisible"),c+1);g=0;for(j=f.length;g<j;g++)i=f[g].nTr,e=f[g].anCells,i&&i.insertBefore(e[c],e[o]||null)}else h(C(b.aoData,"anCells",c)).detach();d.bVisible=a;ba(b,b.aoHeader);ba(b,b.aoFooter);V(b);(b.oScroll.sX||b.oScroll.sY)&&W(b);u(b,null,"column-visibility",
|
|
||||||
[b,c,a]);ta(b)}d=void 0}}return d})});v("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?Y(b,c):c})});r("columns.adjust()",function(){return this.iterator("table",function(a){V(a)})});r("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return ga(c,b);if("fromData"===a||"toVisible"===a)return Y(c,b)}});r("column()",function(a,b){return ab(this.columns(a,b))});r("cells()",
|
|
||||||
function(a,b,c){h.isPlainObject(a)&&(typeof a.row!==l?(c=b,b=null):(c=a,a=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===l)return this.iterator("table",function(b){var d=a,e=$a(c),f=b.aoData,g=Ya(b,e),e=xa(f,g,"anCells"),i=h([].concat.apply([],e)),j,m=b.aoColumns.length,o,p,r,q;return Za(d,function(a){if(a===null||a===l){o=[];p=0;for(r=g.length;p<r;p++){j=g[p];for(q=0;q<m;q++)o.push({row:j,column:q})}return o}return h.isPlainObject(a)?[a]:i.filter(a).map(function(a,b){j=b.parentNode._DT_RowIndex;
|
|
||||||
return{row:j,column:h.inArray(b,f[j].anCells)}}).toArray()})});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,o,m=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(o=d[b].length;i<o;i++)f.push({row:e[b][g],column:d[b][i]})}return f});h.extend(m.selector,{cols:b,rows:a,opts:c});return m});v("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return a.aoData[b].anCells[c]})});r("cells().data()",function(){return this.iterator("cell",
|
|
||||||
function(a,b,c){return A(a,b,c)})});v("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]})});v("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:Y(a,c)}})});r(["cells().invalidate()","cell().invalidate()"],function(a){var b=this.selector;this.rows(b.rows,b.opts).invalidate(a);return this});r("cell()",function(a,b,
|
|
||||||
c){return ab(this.cells(a,b,c))});r("cell().data()",function(a){var b=this.context,c=this[0];if(a===l)return b.length&&c.length?A(b[0],c[0].row,c[0].column):l;Ea(b[0],c[0].row,c[0].column,a);la(b[0],c[0].row,"data",c[0].column);return this});r("order()",function(a,b){var c=this.context;if(a===l)return 0!==c.length?c[0].aaSorting:l;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});r("order.listener()",
|
|
||||||
function(a,b,c){return this.iterator("table",function(d){Ka(d,a,b,c)})});r(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});r("search()",function(a,b,c,d){var e=this.context;return a===l?0!==e.length?e[0].oPreviousSearch.sSearch:l:this.iterator("table",function(e){e.oFeatures.bFilter&&ca(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:
|
|
||||||
c,bCaseInsensitive:null===d?!0:d}),1)})});r(["columns().search()","column().search()"],function(a,b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===l)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ca(e,e.oPreviousSearch,1))})});r("state()",function(){return this.context.length?this.context[0].oSavedState:null});r("state.clear()",function(){return this.iterator("table",
|
|
||||||
function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});r("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});r("state.save()",function(){return this.iterator("table",function(a){ta(a)})});p.versionCheck=p.fnVersionCheck=function(a){for(var b=p.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};p.isDataTable=p.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(p.settings,
|
|
||||||
function(a,e){if(e.nTable===b||e.nScrollHead===b||e.nScrollFoot===b)c=!0});return c};p.tables=p.fnTables=function(a){return jQuery.map(p.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable})};p.camelToHungarian=G;r("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var d=
|
|
||||||
h(this.tables().nodes());d[b].apply(d,a);return this})});r("clear()",function(){return this.iterator("table",function(a){ja(a)})});r("settings()",function(){return new q(this.context,this.context)});r("data()",function(){return this.iterator("table",function(a){return C(a.aoData,"_aData")}).flatten()});r("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),l=h(b.nTableWrapper),
|
|
||||||
m=h.map(b.aoData,function(a){return a.nTr}),n;b.bDestroying=!0;u(b,"aoDestroyCallback","destroy",[b]);a||(new q(b)).columns().visible(!0);l.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(za).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));i.detach();l.detach();b.aaSorting=[];b.aaSortingFixed=[];sa(b);h(m).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+
|
|
||||||
" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(e,b.nTableReinsertBefore);f.children().detach();f.append(m);i.css("width",b.sDestroyWidth).removeClass(d.sTable);(n=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%n])});c=h.inArray(b,p.settings);-1!==c&&p.settings.splice(c,
|
|
||||||
1)})});p.version="1.10.1";p.settings=[];p.models={};p.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};p.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null};p.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,
|
|
||||||
sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};p.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,
|
|
||||||
bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},
|
|
||||||
fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",
|
|
||||||
sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},p.models.oSearch),sAjaxDataProp:"data",
|
|
||||||
sAjaxSource:null,sDom:"lfrtip",sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};T(p.defaults);p.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};T(p.defaults.column);p.models.oSettings={oFeatures:{bAutoWidth:null,
|
|
||||||
bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,
|
|
||||||
asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,
|
|
||||||
bAjaxDataGet:!0,jqXHR:null,json:l,oAjaxData:l,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==z(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==z(this)?1*this._iRecordsDisplay:
|
|
||||||
this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{}};p.ext=t={classes:{},errMode:"alert",feature:[],search:[],internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],
|
|
||||||
search:{},order:{}},_unique:0,fnVersionCheck:p.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:p.version};h.extend(t,{afnFiltering:t.search,aTypes:t.type.detect,ofnSearch:t.type.search,oSort:t.type.order,afnSortData:t.order,aoFeatures:t.feature,oApi:t.internal,oStdClasses:t.classes,oPagination:t.pager});h.extend(p.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",
|
|
||||||
sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",
|
|
||||||
sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ya="",ya="",E=ya+"ui-state-default",ea=ya+"css_right ui-icon ui-icon-",Ub=ya+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(p.ext.oJUIClasses,p.ext.classes,{sPageButton:"fg-button ui-button "+
|
|
||||||
E,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:E+" sorting_asc",sSortDesc:E+" sorting_desc",sSortable:E+" sorting",sSortableAsc:E+" sorting_asc_disabled",sSortableDesc:E+" sorting_desc_disabled",sSortableNone:E+" sorting_disabled",sSortJUIAsc:ea+"triangle-1-n",sSortJUIDesc:ea+"triangle-1-s",sSortJUI:ea+"carat-2-n-s",sSortJUIAscAllowed:ea+"carat-1-n",sSortJUIDescAllowed:ea+
|
|
||||||
"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+E,sScrollFoot:"dataTables_scrollFoot "+E,sHeaderTH:E,sFooterTH:E,sJUIHeader:Ub+" ui-corner-tl ui-corner-tr",sJUIFooter:Ub+" ui-corner-bl ui-corner-br"});var Lb=p.ext.pager;h.extend(Lb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous",Ua(a,b),"next"]},full_numbers:function(a,b){return["first",
|
|
||||||
"previous",Ua(a,b),"next","last"]},_numbers:Ua,numbers_length:7});h.extend(!0,p.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i,l,m=0,n=function(b,d){var k,p,r,q,s=function(b){Ra(a,b.data.action,true)};k=0;for(p=d.length;k<p;k++){q=d[k];if(h.isArray(q)){r=h("<"+(q.DT_el||"div")+"/>").appendTo(b);n(r,q)}else{l=i="";switch(q){case "ellipsis":b.append("<span>…</span>");break;case "first":i=j.sFirst;l=q+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":i=
|
|
||||||
j.sPrevious;l=q+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":i=j.sNext;l=q+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":i=j.sLast;l=q+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:i=q+1;l=e===q?g.sPageButtonActive:""}if(i){r=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof q==="string"?a.sTableId+"_"+q:null}).html(i).appendTo(b);Ta(r,{action:q},s);m++}}}};try{var k=h(O.activeElement).data("dt-idx");n(h(b).empty(),
|
|
||||||
d);k!==null&&h(b).find("[data-dt-idx="+k+"]").focus()}catch(p){}}}});var va=function(a,b,c,d){if(!a||"-"===a)return-Infinity;b&&(a=Pb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(t.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return H(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return H(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,
|
|
||||||
b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});cb("");h.extend(p.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Xa(a,c)?"num"+c:null},function(a){if(a&&(!Yb.test(a)||!Zb.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||H(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Xa(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Qb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Qb(a,
|
|
||||||
c,!0)?"html-num-fmt"+c:null},function(a){return H(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(p.ext.type.search,{html:function(a){return H(a)?a:"string"===typeof a?a.replace(Nb," ").replace(wa,""):""},string:function(a){return H(a)?a:"string"===typeof a?a.replace(Nb," "):a}});h.extend(!0,p.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?
|
|
||||||
d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){var e=c.idx;h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(f,g,h,i){if(a===g){b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(i[e]=="asc"?d.sSortAsc:i[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+
|
|
||||||
" "+d.sSortJUIDescAllowed).addClass(i[e]=="asc"?d.sSortJUIAsc:i[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});p.render={number:function(a,b,c,d){return{display:function(e){var f=0>e?"-":"",e=Math.abs(parseFloat(e)),g=parseInt(e,10),e=c?b+(e-g).toFixed(c).substring(2):"";return f+(d||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+e}}}};h.extend(p.ext.internal,{_fnExternApiFunc:Mb,_fnBuildAjax:na,_fnAjaxUpdate:jb,_fnAjaxParameters:sb,_fnAjaxUpdateDraw:tb,_fnAjaxDataSrc:oa,_fnAddColumn:Aa,
|
|
||||||
_fnColumnOptions:fa,_fnAdjustColumnSizing:V,_fnVisibleToColumnIndex:ga,_fnColumnIndexToVisible:Y,_fnVisbleColumns:Z,_fnGetColumns:X,_fnColumnTypes:Da,_fnApplyColumnDefs:hb,_fnHungarianMap:T,_fnCamelToHungarian:G,_fnLanguageCompat:N,_fnBrowserDetect:fb,_fnAddData:I,_fnAddTr:ha,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==l?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:A,_fnSetCellData:Ea,_fnSplitObjNotation:Ga,_fnGetObjectDataFn:U,
|
|
||||||
_fnSetObjectDataFn:Ba,_fnGetDataMaster:Ha,_fnClearTable:ja,_fnDeleteIndex:ka,_fnInvalidateRow:la,_fnGetRowElements:ia,_fnCreateTr:Fa,_fnBuildHead:ib,_fnDrawHead:ba,_fnDraw:K,_fnReDraw:L,_fnAddOptionsHtml:lb,_fnDetectHeader:aa,_fnGetUniqueThs:ma,_fnFeatureHtmlFilter:nb,_fnFilterComplete:ca,_fnFilterCustom:wb,_fnFilterColumn:vb,_fnFilter:ub,_fnFilterCreateSearch:Na,_fnEscapeRegex:Oa,_fnFilterData:xb,_fnFeatureHtmlInfo:qb,_fnUpdateInfo:Ab,_fnInfoMacros:Bb,_fnInitialise:ra,_fnInitComplete:pa,_fnLengthChange:Pa,
|
|
||||||
_fnFeatureHtmlLength:mb,_fnFeatureHtmlPaginate:rb,_fnPageChange:Ra,_fnFeatureHtmlProcessing:ob,_fnProcessingDisplay:B,_fnFeatureHtmlTable:pb,_fnScrollDraw:W,_fnApplyToChildren:F,_fnCalculateColumnWidths:Ca,_fnThrottle:Ma,_fnConvertToWidth:Cb,_fnScrollingWidthAdjust:Eb,_fnGetWidestNode:Db,_fnGetMaxLenString:Fb,_fnStringToCss:s,_fnScrollBarWidth:Gb,_fnSortFlatten:R,_fnSort:kb,_fnSortAria:Ib,_fnSortListener:Sa,_fnSortAttachListener:Ka,_fnSortingClasses:sa,_fnSortData:Hb,_fnSaveState:ta,_fnLoadState:Jb,
|
|
||||||
_fnSettingsFromNode:ua,_fnLog:P,_fnMap:D,_fnBindAction:Ta,_fnCallbackReg:x,_fnCallbackFire:u,_fnLengthOverflow:Qa,_fnRenderer:La,_fnDataSource:z,_fnRowAttributes:Ia,_fnCalculateEnd:function(){}});h.fn.dataTable=p;h.fn.dataTableSettings=p.settings;h.fn.dataTableExt=p.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(p,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],N):"object"===typeof exports?N(require("jquery")):
|
|
||||||
jQuery&&!jQuery.fn.dataTable&&N(jQuery)})(window,document);
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*! jQuery JSON plugin 2.4.0 | code.google.com/p/jquery-json */
|
|
||||||
(function($){'use strict';var escape=/["\\\x00-\x1f\x7f-\x9f]/g,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},hasOwn=Object.prototype.hasOwnProperty;$.toJSON=typeof JSON==='object'&&JSON.stringify?JSON.stringify:function(o){if(o===null){return'null';}
|
|
||||||
var pairs,k,name,val,type=$.type(o);if(type==='undefined'){return undefined;}
|
|
||||||
if(type==='number'||type==='boolean'){return String(o);}
|
|
||||||
if(type==='string'){return $.quoteString(o);}
|
|
||||||
if(typeof o.toJSON==='function'){return $.toJSON(o.toJSON());}
|
|
||||||
if(type==='date'){var month=o.getUTCMonth()+1,day=o.getUTCDate(),year=o.getUTCFullYear(),hours=o.getUTCHours(),minutes=o.getUTCMinutes(),seconds=o.getUTCSeconds(),milli=o.getUTCMilliseconds();if(month<10){month='0'+month;}
|
|
||||||
if(day<10){day='0'+day;}
|
|
||||||
if(hours<10){hours='0'+hours;}
|
|
||||||
if(minutes<10){minutes='0'+minutes;}
|
|
||||||
if(seconds<10){seconds='0'+seconds;}
|
|
||||||
if(milli<100){milli='0'+milli;}
|
|
||||||
if(milli<10){milli='0'+milli;}
|
|
||||||
return'"'+year+'-'+month+'-'+day+'T'+
|
|
||||||
hours+':'+minutes+':'+seconds+'.'+milli+'Z"';}
|
|
||||||
pairs=[];if($.isArray(o)){for(k=0;k<o.length;k++){pairs.push($.toJSON(o[k])||'null');}
|
|
||||||
return'['+pairs.join(',')+']';}
|
|
||||||
if(typeof o==='object'){for(k in o){if(hasOwn.call(o,k)){type=typeof k;if(type==='number'){name='"'+k+'"';}else if(type==='string'){name=$.quoteString(k);}else{continue;}
|
|
||||||
type=typeof o[k];if(type!=='function'&&type!=='undefined'){val=$.toJSON(o[k]);pairs.push(name+':'+val);}}}
|
|
||||||
return'{'+pairs.join(',')+'}';}};$.evalJSON=typeof JSON==='object'&&JSON.parse?JSON.parse:function(str){return eval('('+str+')');};$.secureEvalJSON=typeof JSON==='object'&&JSON.parse?JSON.parse:function(str){var filtered=str.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered)){return eval('('+str+')');}
|
|
||||||
throw new SyntaxError('Error parsing JSON, source is not valid.');};$.quoteString=function(str){if(str.match(escape)){return'"'+str.replace(escape,function(a){var c=meta[a];if(typeof c==='string'){return c;}
|
|
||||||
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
|
|
||||||
return'"'+str+'"';};}(jQuery));
|
|
|
@ -1,728 +0,0 @@
|
||||||
|
|
||||||
(function($){function findLine(sdpLines,prefix,substr){return findLineInRange(sdpLines,0,-1,prefix,substr);}
|
|
||||||
function findLineInRange(sdpLines,startLine,endLine,prefix,substr){var realEndLine=(endLine!=-1)?endLine:sdpLines.length;for(var i=startLine;i<realEndLine;++i){if(sdpLines[i].indexOf(prefix)===0){if(!substr||sdpLines[i].toLowerCase().indexOf(substr.toLowerCase())!==-1){return i;}}}
|
|
||||||
return null;}
|
|
||||||
function getCodecPayloadType(sdpLine){var pattern=new RegExp('a=rtpmap:(\\d+) \\w+\\/\\d+');var result=sdpLine.match(pattern);return(result&&result.length==2)?result[1]:null;}
|
|
||||||
function setDefaultCodec(mLine,payload){var elements=mLine.split(' ');var newLine=[];var index=0;for(var i=0;i<elements.length;i++){if(index===3){newLine[index++]=payload;}
|
|
||||||
if(elements[i]!==payload)newLine[index++]=elements[i];}
|
|
||||||
return newLine.join(' ');}
|
|
||||||
$.FSRTC=function(options){this.options=$.extend({useVideo:null,useStereo:false,userData:null,localVideo:null,screenShare:false,useCamera:"any",iceServers:false,videoParams:{},audioParams:{},callbacks:{onICEComplete:function(){},onICE:function(){},onOfferSDP:function(){}},useStream:null,},options);this.audioEnabled=true;this.videoEnabled=true;this.mediaData={SDP:null,profile:{},candidateList:[]};this.constraints={offerToReceiveAudio:this.options.useSpeak==="none"?false:true,offerToReceiveVideo:this.options.useVideo?true:false,};if(self.options.useVideo){self.options.useVideo.style.display='none';}
|
|
||||||
setCompat();checkCompat();};$.FSRTC.validRes=[];$.FSRTC.prototype.useVideo=function(obj,local){var self=this;if(obj){self.options.useVideo=obj;self.options.localVideo=local;self.constraints.offerToReceiveVideo=true;}else{self.options.useVideo=null;self.options.localVideo=null;self.constraints.offerToReceiveVideo=false;}
|
|
||||||
if(self.options.useVideo){self.options.useVideo.style.display='none';}};$.FSRTC.prototype.useStereo=function(on){var self=this;self.options.useStereo=on;};$.FSRTC.prototype.stereoHack=function(sdp){var self=this;if(!self.options.useStereo){return sdp;}
|
|
||||||
var sdpLines=sdp.split('\r\n');var opusIndex=findLine(sdpLines,'a=rtpmap','opus/48000'),opusPayload;if(!opusIndex){return sdp;}else{opusPayload=getCodecPayloadType(sdpLines[opusIndex]);}
|
|
||||||
var fmtpLineIndex=findLine(sdpLines,'a=fmtp:'+opusPayload.toString());if(fmtpLineIndex===null){sdpLines[opusIndex]=sdpLines[opusIndex]+'\r\na=fmtp:'+opusPayload.toString()+" stereo=1; sprop-stereo=1"}else{sdpLines[fmtpLineIndex]=sdpLines[fmtpLineIndex].concat('; stereo=1; sprop-stereo=1');}
|
|
||||||
sdp=sdpLines.join('\r\n');return sdp;};function setCompat(){}
|
|
||||||
function checkCompat(){return true;}
|
|
||||||
function onStreamError(self,e){console.log('There has been a problem retrieving the streams - did you allow access? Check Device Resolution',e);doCallback(self,"onError",e);}
|
|
||||||
function onStreamSuccess(self,stream){console.log("Stream Success");doCallback(self,"onStream",stream);}
|
|
||||||
function onRemoteStreamSuccess(self,stream){console.log("Remote Stream Success");doCallback(self,"onRemoteStream",stream);}
|
|
||||||
function onICE(self,candidate){self.mediaData.candidate=candidate;self.mediaData.candidateList.push(self.mediaData.candidate);doCallback(self,"onICE");}
|
|
||||||
function doCallback(self,func,arg){if(func in self.options.callbacks){self.options.callbacks[func](self,arg);}}
|
|
||||||
function onICEComplete(self,candidate){console.log("ICE Complete");doCallback(self,"onICEComplete");}
|
|
||||||
function onChannelError(self,e){console.error("Channel Error",e);doCallback(self,"onError",e);}
|
|
||||||
function onICESDP(self,sdp){self.mediaData.SDP=self.stereoHack(sdp.sdp);console.log("ICE SDP");doCallback(self,"onICESDP");}
|
|
||||||
function onAnswerSDP(self,sdp){self.answer.SDP=self.stereoHack(sdp.sdp);console.log("ICE ANSWER SDP");doCallback(self,"onAnswerSDP",self.answer.SDP);}
|
|
||||||
function onMessage(self,msg){console.log("Message");doCallback(self,"onICESDP",msg);}
|
|
||||||
FSRTCattachMediaStream=function(element,stream){if(typeof element.srcObject!=='undefined'){element.srcObject=stream;}else{console.error('Error attaching stream to element.');}}
|
|
||||||
function onRemoteStream(self,stream){if(self.options.useVideo){self.options.useVideo.style.display='block';var iOS=['iPad','iPhone','iPod'].indexOf(navigator.platform)>=0;if(iOS){self.options.useVideo.setAttribute("playsinline",true);}}
|
|
||||||
var element=self.options.useAudio;console.log("REMOTE STREAM",stream,element);FSRTCattachMediaStream(element,stream);self.remoteStream=stream;onRemoteStreamSuccess(self,stream);}
|
|
||||||
function onOfferSDP(self,sdp){self.mediaData.SDP=self.stereoHack(sdp.sdp);console.log("Offer SDP");doCallback(self,"onOfferSDP");}
|
|
||||||
$.FSRTC.prototype.answer=function(sdp,onSuccess,onError){this.peer.addAnswerSDP({type:"answer",sdp:sdp},onSuccess,onError);};$.FSRTC.prototype.stopPeer=function(){if(self.peer){console.log("stopping peer");self.peer.stop();}}
|
|
||||||
$.FSRTC.prototype.stop=function(){var self=this;if(self.options.useVideo){self.options.useVideo.style.display='none';self.options.useVideo['src']='';}
|
|
||||||
if(self.localStream&&!self.options.useStream){var tracks=self.localStream.getTracks();console.log("Stopping localStream tracks:",tracks);tracks.forEach(function(track){track.stop()})
|
|
||||||
self.localStream=null;}
|
|
||||||
if(self.options.localVideo){deactivateLocalVideo(self.options.localVideo);}
|
|
||||||
if(self.options.localVideoStream&&!self.options.useStream){var tracks=self.options.localVideoStream.getTracks();console.log("Stopping localVideoStream tracks:",tracks);tracks.forEach(function(track){track.stop()})}
|
|
||||||
if(self.peer){console.log("stopping peer");self.peer.stop();}};$.FSRTC.prototype.getMute=function(){var self=this;return self.audioEnabled;}
|
|
||||||
$.FSRTC.prototype.setMute=function(what){var self=this;if(!self.localStream){return false;}
|
|
||||||
var audioTracks=self.localStream.getAudioTracks();for(var i=0,len=audioTracks.length;i<len;i++){switch(what){case"on":audioTracks[i].enabled=true;break;case"off":audioTracks[i].enabled=false;break;case"toggle":audioTracks[i].enabled=!audioTracks[i].enabled;default:break;}
|
|
||||||
self.audioEnabled=audioTracks[i].enabled;}
|
|
||||||
return!self.audioEnabled;}
|
|
||||||
$.FSRTC.prototype.getVideoMute=function(){var self=this;return self.videoEnabled;}
|
|
||||||
$.FSRTC.prototype.setVideoMute=function(what){var self=this;if(!self.localStream){return false;}
|
|
||||||
var videoTracks=self.localStream.getVideoTracks();for(var i=0,len=videoTracks.length;i<len;i++){switch(what){case"on":videoTracks[i].enabled=true;break;case"off":videoTracks[i].enabled=false;break;case"toggle":videoTracks[i].enabled=!videoTracks[i].enabled;default:break;}
|
|
||||||
self.videoEnabled=videoTracks[i].enabled;}
|
|
||||||
return!self.videoEnabled;}
|
|
||||||
$.FSRTC.prototype.createAnswer=function(params){var self=this;self.type="answer";self.remoteSDP=params.sdp;console.debug("inbound sdp: ",params.sdp);function onSuccess(stream){self.localStream=stream;self.peer=FSRTCPeerConnection({type:self.type,attachStream:self.localStream,onICE:function(candidate){return onICE(self,candidate);},onICEComplete:function(){return onICEComplete(self);},onRemoteStream:function(stream){return onRemoteStream(self,stream);},onICESDP:function(sdp){return onICESDP(self,sdp);},onChannelError:function(e){return onChannelError(self,e);},constraints:self.constraints,iceServers:self.options.iceServers,offerSDP:{type:"offer",sdp:self.remoteSDP},turnServer:self.options.turnServer});onStreamSuccess(self,stream);}
|
|
||||||
function onError(e){onStreamError(self,e);}
|
|
||||||
var mediaParams=getMediaParams(self);console.log("Audio constraints",mediaParams.audio);console.log("Video constraints",mediaParams.video);if(self.options.useVideo&&self.options.localVideo&&!self.options.useStream){getUserMedia({constraints:{audio:false,video:{deviceId:params.useCamera},},localVideo:self.options.localVideo,useCameraLabel:self.options.useCameraLabel,useMicLabel:self.options.useMicLabel,onsuccess:function(e){self.options.localVideoStream=e;console.log("local video ready");},onerror:function(e){console.error("local video error!",e);}});}
|
|
||||||
if(self.options.useStream){if(self.options.useVideo){self.options.localVideoStream=self.options.useStream;if(self.options.localVideo){activateLocalVideo(self.options.localVideo,self.options.useStream);}}
|
|
||||||
onSuccess(self.options.useStream);}
|
|
||||||
else{getUserMedia({constraints:{audio:mediaParams.audio,video:mediaParams.video},video:mediaParams.useVideo,useCameraLabel:self.options.useCameraLabel,useMicLabel:self.options.useMicLabel,onsuccess:onSuccess,onerror:onError});}};function getMediaParams(obj){var audio;if(obj.options.useMic&&obj.options.useMic==="none"){console.log("Microphone Disabled");audio=false;}else if(obj.options.videoParams&&obj.options.screenShare){console.error("SCREEN SHARE",obj.options.videoParams);audio=false;}else{audio={};if(obj.options.audioParams){audio=obj.options.audioParams;}
|
|
||||||
if(obj.options.useMic!=="any"){audio.deviceId=assignMediaIdToConstraint(obj.options.useMic);}}
|
|
||||||
if(obj.options.useVideo&&obj.options.localVideo&&!obj.options.useStream){getUserMedia({constraints:{audio:false,video:{deviceId:obj.options.useCamera},},localVideo:obj.options.localVideo,useCameraLabel:obj.options.useCameraLabel,useMicLabel:obj.options.useMicLabel,onsuccess:function(e){obj.options.localVideoStream=e;console.log("local video ready");},onerror:function(e){console.error("local video error!",e);}});}
|
|
||||||
var video={};var bestFrameRate=obj.options.videoParams.vertoBestFrameRate;var minFrameRate=obj.options.videoParams.minFrameRate||15;delete obj.options.videoParams.vertoBestFrameRate;if(obj.options.screenShare){if(!obj.options.useCamera&&!!navigator.mozGetUserMedia){var dowin=window.confirm("Do you want to share an application window? If not you can share an entire screen.");video={width:{min:obj.options.videoParams.minWidth,max:obj.options.videoParams.maxWidth},height:{min:obj.options.videoParams.minHeight,max:obj.options.videoParams.maxHeight},mediaSource:dowin?"window":"screen"}}else{var opt=[];if(obj.options.useCamera){opt.push({sourceId:obj.options.useCamera});}
|
|
||||||
if(bestFrameRate){opt.push({minFrameRate:bestFrameRate});opt.push({maxFrameRate:bestFrameRate});}
|
|
||||||
video={mandatory:obj.options.videoParams,optional:opt};}}else{video={width:{min:obj.options.videoParams.minWidth,max:obj.options.videoParams.maxWidth},height:{min:obj.options.videoParams.minHeight,max:obj.options.videoParams.maxHeight}};var useVideo=obj.options.useVideo;if(useVideo&&obj.options.useCamera&&obj.options.useCamera!=="none"){if(obj.options.useCamera!=="any"){video=assignMediaIdToConstraint(obj.options.useCamera,video);}
|
|
||||||
if(bestFrameRate){video.frameRate={ideal:bestFrameRate,min:minFrameRate,max:30};}}else{console.log("Camera Disabled");video=false;useVideo=false;}}
|
|
||||||
return{audio:audio,video:video,useVideo:useVideo};}
|
|
||||||
$.FSRTC.prototype.call=function(profile){checkCompat();var self=this;var screen=false;self.type="offer";if(self.options.videoParams&&self.options.screenShare){screen=true;}
|
|
||||||
function onSuccess(stream){self.localStream=stream;if(screen){self.constraints.offerToReceiveVideo=false;self.constraints.offerToReceiveAudio=false;self.constraints.offerToSendAudio=false;}
|
|
||||||
self.peer=FSRTCPeerConnection({type:self.type,attachStream:self.localStream,onICE:function(candidate){return onICE(self,candidate);},onICEComplete:function(){return onICEComplete(self);},onRemoteStream:screen?function(stream){}:function(stream){return onRemoteStream(self,stream);},onOfferSDP:function(sdp){return onOfferSDP(self,sdp);},onICESDP:function(sdp){return onICESDP(self,sdp);},onChannelError:function(e){return onChannelError(self,e);},constraints:self.constraints,iceServers:self.options.iceServers,turnServer:self.options.turnServer});onStreamSuccess(self,stream);}
|
|
||||||
function onError(e){onStreamError(self,e);}
|
|
||||||
var mediaParams=getMediaParams(self);console.log("Audio constraints",mediaParams.audio);console.log("Video constraints",mediaParams.video);if(self.options.useStream){if(self.options.useVideo){self.options.localVideoStream=self.options.useStream;if(self.options.localVideo){activateLocalVideo(self.options.localVideo,self.options.useStream);}}
|
|
||||||
onSuccess(self.options.useStream);}
|
|
||||||
else if(mediaParams.audio||mediaParams.video){getUserMedia({constraints:{audio:mediaParams.audio,video:mediaParams.video},video:mediaParams.useVideo,onsuccess:onSuccess,onerror:onError,useCameraLabel:self.options.useCameraLabel,useMicLabel:self.options.useMicLabel,});}else{onSuccess(null);}};function FSRTCPeerConnection(options){var gathering=false,done=false;var config={};var default_ice=[{urls:['stun:stun.l.google.com:19302']}];if(self.options.turnServer){default_ice.push(self.options.turnServer)}
|
|
||||||
if(options.iceServers){if(typeof(options.iceServers)==="boolean"){config.iceServers=default_ice;}else{config.iceServers=options.iceServers;}}
|
|
||||||
config.bundlePolicy="max-compat";config.sdpSemantics="plan-b";var peer=new window.RTCPeerConnection(config);openOffererChannel();var x=0;function ice_handler(){done=true;gathering=null;if(options.onICEComplete){options.onICEComplete();}
|
|
||||||
if(options.type=="offer"){options.onICESDP(peer.localDescription);}else{if(!x&&options.onICESDP){options.onICESDP(peer.localDescription);}}}
|
|
||||||
peer.onicecandidate=function(event){if(done){return;}
|
|
||||||
if(!gathering){gathering=setTimeout(ice_handler,1000);}
|
|
||||||
if(event){if(event.candidate){options.onICE(event.candidate);}}else{done=true;if(gathering){clearTimeout(gathering);gathering=null;}
|
|
||||||
ice_handler();}};if(options.attachStream){options.attachStream.getAudioTracks().forEach(function(track){peer.addTrack(track,options.attachStream)});options.attachStream.getVideoTracks().forEach(function(track){peer.addTrack(track,options.attachStream)});}
|
|
||||||
if(options.attachStreams&&options.attachStreams.length){var streams=options.attachStreams;for(var i=0;i<streams.length;i++){peer.addStream(streams[i]);}}
|
|
||||||
peer.ontrack=function(event){console.log('Peer Track',event)
|
|
||||||
var remoteMediaStream=event.streams[0];remoteMediaStream.oninactive=function(){if(options.onRemoteStreamEnded)options.onRemoteStreamEnded(remoteMediaStream);};if(options.onRemoteStream)options.onRemoteStream(remoteMediaStream);};function createOffer(){if(!options.onOfferSDP)return;peer.createOffer(function(sessionDescription){sessionDescription.sdp=serializeSdp(sessionDescription.sdp);peer.setLocalDescription(sessionDescription);options.onOfferSDP(sessionDescription);},onSdpError,options.constraints);}
|
|
||||||
function createAnswer(){if(options.type!="answer")return;peer.setRemoteDescription(new window.RTCSessionDescription(options.offerSDP),onSdpSuccess,onSdpError);peer.createAnswer(function(sessionDescription){sessionDescription.sdp=serializeSdp(sessionDescription.sdp);peer.setLocalDescription(sessionDescription);if(options.onAnswerSDP){options.onAnswerSDP(sessionDescription);}},onSdpError);}
|
|
||||||
if((options.onChannelMessage)||!options.onChannelMessage){createOffer();createAnswer();}
|
|
||||||
function setBandwidth(sdp){sdp=sdp.replace(/b=AS([^\r\n]+\r\n)/g,'');sdp=sdp.replace(/a=mid:data\r\n/g,'a=mid:data\r\nb=AS:1638400\r\n');return sdp;}
|
|
||||||
function getInteropSDP(sdp){var chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''),extractedChars='';function getChars(){extractedChars+=chars[parseInt(Math.random()*40)]||'';if(extractedChars.length<40)getChars();return extractedChars;}
|
|
||||||
if(options.onAnswerSDP)sdp=sdp.replace(/(a=crypto:0 AES_CM_128_HMAC_SHA1_32)(.*?)(\r\n)/g,'');var inline=getChars()+'\r\n'+(extractedChars='');sdp=sdp.indexOf('a=crypto')==-1?sdp.replace(/c=IN/g,'a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:'+inline+'c=IN'):sdp;return sdp;}
|
|
||||||
function serializeSdp(sdp){return sdp;}
|
|
||||||
var channel;function openOffererChannel(){if(!options.onChannelMessage)return;_openOffererChannel();return;}
|
|
||||||
function _openOffererChannel(){channel=peer.createDataChannel(options.channel||'RTCDataChannel',{reliable:false});setChannelEvents();}
|
|
||||||
function setChannelEvents(){channel.onmessage=function(event){if(options.onChannelMessage)options.onChannelMessage(event);};channel.onopen=function(){if(options.onChannelOpened)options.onChannelOpened(channel);};channel.onclose=function(event){if(options.onChannelClosed)options.onChannelClosed(event);console.warn('WebRTC DataChannel closed',event);};channel.onerror=function(event){if(options.onChannelError)options.onChannelError(event);console.error('WebRTC DataChannel error',event);};}
|
|
||||||
function openAnswererChannel(){peer.ondatachannel=function(event){channel=event.channel;channel.binaryType='blob';setChannelEvents();};return;}
|
|
||||||
function useless(){log('Error in fake:true');}
|
|
||||||
function onSdpSuccess(){}
|
|
||||||
function onSdpError(e){if(options.onChannelError){options.onChannelError(e);}
|
|
||||||
console.error('sdp error:',e);}
|
|
||||||
return{addAnswerSDP:function(sdp,cbSuccess,cbError){peer.setRemoteDescription(new window.RTCSessionDescription(sdp),cbSuccess?cbSuccess:onSdpSuccess,cbError?cbError:onSdpError);},addICE:function(candidate){peer.addIceCandidate(new window.RTCIceCandidate({sdpMLineIndex:candidate.sdpMLineIndex,candidate:candidate.candidate}));},peer:peer,channel:channel,sendData:function(message){if(channel){channel.send(message);}},stop:function(){if(options.attachStream instanceof MediaStream){var tracks=options.attachStream.getTracks();tracks.forEach(function(track){track.stop()})
|
|
||||||
options.attachStream=null}
|
|
||||||
peer.close();}};}
|
|
||||||
var video_constraints={};function activateLocalVideo(el,stream){el.srcObject=stream;el.style.display='block';}
|
|
||||||
function deactivateLocalVideo(el){el.srcObject=null;el.style.display='none';}
|
|
||||||
function assureConstraintByLabel(constraint,fallbackLabel){if(fallbackLabel===undefined&&constraint===undefined){return Promise.resolve(constraint);}
|
|
||||||
if(typeof(assureMediaInputId)!=='function'){console.warn('Tried to use constraint fallbacks but did not found vendor function `assureMediaInputId` on window scope. Did you forget to import `vendor/media-device-id.js` before Verto?');return Promise.resolve(constraint);}
|
|
||||||
if(typeof(constraint)==='object'&&!constraint.deviceId){return Promise.resolve(constraint);}
|
|
||||||
if(constraint.deviceId){if(typeof(constraint.deviceId)==='string'){return new Promise(function(resolve){assureMediaInputId(fallbackLabel,constraint.deviceId).then(function(id){resolve(Object.assign({},constraint,{deviceId:id}));}).catch(function(){resolve(constraint);});});}
|
|
||||||
if(typeof(constraint.deviceId)==='object'&&typeof(constraint.deviceId.exact)==='string'){return new Promise(function(resolve){assureMediaInputId(fallbackLabel,constraint.deviceId.exact).then(function(id){resolve(assignMediaIdToConstraint(id,constraint));}).catch(function(){resolve(constraint);});});}}
|
|
||||||
return Promise.resolve(constraint);}
|
|
||||||
function trustyGetUserMedia(options,constraints){navigator.mediaDevices.getUserMedia(constraints).then(function(stream){if(options.localVideo){activateLocalVideo(options.localVideo,stream);}
|
|
||||||
if(options.onsuccess){options.onsuccess(stream);}}).catch(options.onerror||function(e){console.error(e);});}
|
|
||||||
function assignMediaIdToConstraint(mediaId,rest){return Object.assign({},rest||{},{deviceId:{exact:mediaId}});}
|
|
||||||
function getUserMedia(options){var constraints=options.constraints||{audio:true,video:video_constraints,};Promise.all([assureConstraintByLabel(constraints.audio,options.useMicLabel),assureConstraintByLabel(constraints.video,options.useCameraLabel),]).then(function(assurances){trustyGetUserMedia(options,{audio:assurances[0],video:assurances[1]});}).catch(function(error){console.error('Unexpected error on media id assurance attempts:',error,'Options:',options);});}
|
|
||||||
$.FSRTC.resSupported=function(w,h){for(var i in $.FSRTC.validRes){if($.FSRTC.validRes[i][0]==w&&$.FSRTC.validRes[i][1]==h){return true;}}
|
|
||||||
return false;}
|
|
||||||
$.FSRTC.bestResSupported=function(){var w=0,h=0;for(var i in $.FSRTC.validRes){if($.FSRTC.validRes[i][0]>=w&&$.FSRTC.validRes[i][1]>=h){w=$.FSRTC.validRes[i][0];h=$.FSRTC.validRes[i][1];}}
|
|
||||||
return[w,h];}
|
|
||||||
var resList=[[160,120],[320,180],[320,240],[640,360],[640,480],[1280,720],[1920,1080]];var resI=0;var ttl=0;var checkRes=function(cam,func){if(resI>=resList.length){var res={'validRes':$.FSRTC.validRes,'bestResSupported':$.FSRTC.bestResSupported()};localStorage.setItem("res_"+cam,$.toJSON(res));if(func)return func(res);return;}
|
|
||||||
w=resList[resI][0];h=resList[resI][1];resI++;var video={width:{exact:w},height:{exact:h}};if(cam!=="any"){video=assignMediaIdToConstraint(cam,video);}
|
|
||||||
getUserMedia({constraints:{audio:ttl++==0,video:video},onsuccess:function(e){e.getTracks().forEach(function(track){track.stop()});console.info(w+"x"+h+" supported.");$.FSRTC.validRes.push([w,h]);checkRes(cam,func);},onerror:function(e){console.warn(w+"x"+h+" not supported.");checkRes(cam,func);}});}
|
|
||||||
$.FSRTC.getValidRes=function(cam,func){var used=[];var cached=localStorage.getItem("res_"+cam);if(cached){var cache=$.parseJSON(cached);if(cache){$.FSRTC.validRes=cache.validRes;console.log("CACHED RES FOR CAM "+cam,cache);}else{console.error("INVALID CACHE");}
|
|
||||||
return func?func(cache):null;}
|
|
||||||
$.FSRTC.validRes=[];resI=0;checkRes(cam,func);}
|
|
||||||
$.FSRTC.checkPerms=function(runtime,check_audio,check_video){getUserMedia({constraints:{audio:check_audio,video:check_video},onsuccess:function(e){e.getTracks().forEach(function(track){track.stop()});console.info("media perm init complete");if(runtime){setTimeout(runtime,100,true);}},onerror:function(e){if(check_video&&check_audio){console.error("error, retesting with audio params only");return $.FSRTC.checkPerms(runtime,check_audio,false);}
|
|
||||||
console.error("media perm init error");if(runtime){runtime(false)}}});}})(jQuery);(function($){$.JsonRpcClient=function(options){var self=this;this.options=$.extend({ajaxUrl:null,socketUrl:null,onmessage:null,login:null,passwd:null,sessid:null,loginParams:null,userVariables:null,getSocket:function(onmessage_cb){return self._getSocket(onmessage_cb);}},options);self.ws_cnt=0;this.wsOnMessage=function(event){self._wsOnMessage(event);};};$.JsonRpcClient.prototype._ws_socket=null;$.JsonRpcClient.prototype._ws_callbacks={};$.JsonRpcClient.prototype._current_id=1;$.JsonRpcClient.prototype.speedTest=function(bytes,cb){var socket=this.options.getSocket(this.wsOnMessage);if(socket!==null){this.speedCB=cb;this.speedBytes=bytes;socket.send("#SPU "+bytes);var loops=bytes/1024;var rem=bytes%1024;var i;var data=new Array(1024).join(".");for(i=0;i<loops;i++){socket.send("#SPB "+data);}
|
|
||||||
if(rem){socket.send("#SPB "+data);}
|
|
||||||
socket.send("#SPE");}};$.JsonRpcClient.prototype.call=function(method,params,success_cb,error_cb){if(!params){params={};}
|
|
||||||
if(this.options.sessid){params.sessid=this.options.sessid;}
|
|
||||||
var request={jsonrpc:'2.0',method:method,params:params,id:this._current_id++};if(!success_cb){success_cb=function(e){console.log("Success: ",e);};}
|
|
||||||
if(!error_cb){error_cb=function(e){console.log("Error: ",e);};}
|
|
||||||
var socket=this.options.getSocket(this.wsOnMessage);if(socket!==null){this._wsCall(socket,request,success_cb,error_cb);return;}
|
|
||||||
if(this.options.ajaxUrl===null){throw"$.JsonRpcClient.call used with no websocket and no http endpoint.";}
|
|
||||||
$.ajax({type:'POST',url:this.options.ajaxUrl,data:$.toJSON(request),dataType:'json',cache:false,success:function(data){if('error'in data)error_cb(data.error,this);success_cb(data.result,this);},error:function(jqXHR,textStatus,errorThrown){try{var response=$.parseJSON(jqXHR.responseText);if('console'in window)console.log(response);error_cb(response.error,this);}catch(err){error_cb({error:jqXHR.responseText},this);}}});};$.JsonRpcClient.prototype.notify=function(method,params){if(this.options.sessid){params.sessid=this.options.sessid;}
|
|
||||||
var request={jsonrpc:'2.0',method:method,params:params};var socket=this.options.getSocket(this.wsOnMessage);if(socket!==null){this._wsCall(socket,request);return;}
|
|
||||||
if(this.options.ajaxUrl===null){throw"$.JsonRpcClient.notify used with no websocket and no http endpoint.";}
|
|
||||||
$.ajax({type:'POST',url:this.options.ajaxUrl,data:$.toJSON(request),dataType:'json',cache:false});};$.JsonRpcClient.prototype.batch=function(callback,all_done_cb,error_cb){var batch=new $.JsonRpcClient._batchObject(this,all_done_cb,error_cb);callback(batch);batch._execute();};$.JsonRpcClient.prototype.socketReady=function(){if(this._ws_socket===null||this._ws_socket.readyState>1){return false;}
|
|
||||||
return true;};$.JsonRpcClient.prototype.closeSocket=function(){var self=this;if(self.socketReady()){self._ws_socket.onclose=function(w){console.log("Closing Socket");};self._ws_socket.close();}};$.JsonRpcClient.prototype.loginData=function(params){var self=this;self.options.login=params.login;self.options.passwd=params.passwd;self.options.loginParams=params.loginParams;self.options.userVariables=params.userVariables;};$.JsonRpcClient.prototype.connectSocket=function(onmessage_cb){var self=this;if(self.to){clearTimeout(self.to);}
|
|
||||||
if(!self.socketReady()){self.authing=false;if(self._ws_socket){delete self._ws_socket;}
|
|
||||||
self._ws_socket=new WebSocket(self.options.socketUrl);if(self._ws_socket){self._ws_socket.onmessage=onmessage_cb;self._ws_socket.onclose=function(w){if(!self.ws_sleep){self.ws_sleep=1000;}
|
|
||||||
if(self.options.onWSClose){self.options.onWSClose(self);}
|
|
||||||
if(self.ws_cnt>10&&self.options.wsFallbackURL){self.options.socketUrl=self.options.wsFallbackURL;}
|
|
||||||
console.error("Websocket Lost "+self.ws_cnt+" sleep: "+self.ws_sleep+"msec");self.to=setTimeout(function(){console.log("Attempting Reconnection....");self.connectSocket(onmessage_cb);},self.ws_sleep);self.ws_cnt++;if(self.ws_sleep<3000&&(self.ws_cnt%10)===0){self.ws_sleep+=1000;}};self._ws_socket.onopen=function(){if(self.to){clearTimeout(self.to);}
|
|
||||||
self.ws_sleep=1000;self.ws_cnt=0;if(self.options.onWSConnect){self.options.onWSConnect(self);}
|
|
||||||
var req;while((req=$.JsonRpcClient.q.pop())){self._ws_socket.send(req);}};}}
|
|
||||||
return self._ws_socket?true:false;};$.JsonRpcClient.prototype.stopRetrying=function(){if(self.to)
|
|
||||||
clearTimeout(self.to);}
|
|
||||||
$.JsonRpcClient.prototype._getSocket=function(onmessage_cb){if(this.options.socketUrl===null||!("WebSocket"in window))return null;this.connectSocket(onmessage_cb);return this._ws_socket;};$.JsonRpcClient.q=[];$.JsonRpcClient.prototype._wsCall=function(socket,request,success_cb,error_cb){var request_json=$.toJSON(request);if(socket.readyState<1){self=this;$.JsonRpcClient.q.push(request_json);}else{socket.send(request_json);}
|
|
||||||
if('id'in request&&typeof success_cb!=='undefined'){this._ws_callbacks[request.id]={request:request_json,request_obj:request,success_cb:success_cb,error_cb:error_cb};}};$.JsonRpcClient.prototype._wsOnMessage=function(event){var response;if(event.data[0]=="#"&&event.data[1]=="S"&&event.data[2]=="P"){if(event.data[3]=="U"){this.up_dur=parseInt(event.data.substring(4));}else if(this.speedCB&&event.data[3]=="D"){this.down_dur=parseInt(event.data.substring(4));var up_kps=(((this.speedBytes*8)/(this.up_dur/1000))/1024).toFixed(0);var down_kps=(((this.speedBytes*8)/(this.down_dur/1000))/1024).toFixed(0);console.info("Speed Test: Up: "+up_kps+" Down: "+down_kps);var cb=this.speedCB;this.speedCB=null;cb(event,{upDur:this.up_dur,downDur:this.down_dur,upKPS:up_kps,downKPS:down_kps});}
|
|
||||||
return;}
|
|
||||||
try{response=$.parseJSON(event.data);if(typeof response==='object'&&'jsonrpc'in response&&response.jsonrpc==='2.0'){if('result'in response&&this._ws_callbacks[response.id]){var success_cb=this._ws_callbacks[response.id].success_cb;delete this._ws_callbacks[response.id];success_cb(response.result,this);return;}else if('error'in response&&this._ws_callbacks[response.id]){var error_cb=this._ws_callbacks[response.id].error_cb;var orig_req=this._ws_callbacks[response.id].request;if(!self.authing&&response.error.code==-32000&&self.options.login&&self.options.passwd){self.authing=true;this.call("login",{login:self.options.login,passwd:self.options.passwd,loginParams:self.options.loginParams,userVariables:self.options.userVariables},this._ws_callbacks[response.id].request_obj.method=="login"?function(e){self.authing=false;console.log("logged in");delete self._ws_callbacks[response.id];if(self.options.onWSLogin){self.options.onWSLogin(true,self);}}:function(e){self.authing=false;console.log("logged in, resending request id: "+response.id);var socket=self.options.getSocket(self.wsOnMessage);if(socket!==null){socket.send(orig_req);}
|
|
||||||
if(self.options.onWSLogin){self.options.onWSLogin(true,self);}},function(e){console.log("error logging in, request id:",response.id);delete self._ws_callbacks[response.id];error_cb(response.error,this);if(self.options.onWSLogin){self.options.onWSLogin(false,self);}});return;}
|
|
||||||
delete this._ws_callbacks[response.id];error_cb(response.error,this);return;}}}catch(err){console.log("ERROR: "+err);return;}
|
|
||||||
if(typeof this.options.onmessage==='function'){event.eventData=response;if(!event.eventData){event.eventData={};}
|
|
||||||
var reply=this.options.onmessage(event);if(reply&&typeof reply==="object"&&event.eventData.id){var msg={jsonrpc:"2.0",id:event.eventData.id,result:reply};var socket=self.options.getSocket(self.wsOnMessage);if(socket!==null){socket.send($.toJSON(msg));}}}};$.JsonRpcClient._batchObject=function(jsonrpcclient,all_done_cb,error_cb){this._requests=[];this.jsonrpcclient=jsonrpcclient;this.all_done_cb=all_done_cb;this.error_cb=typeof error_cb==='function'?error_cb:function(){};};$.JsonRpcClient._batchObject.prototype.call=function(method,params,success_cb,error_cb){if(!params){params={};}
|
|
||||||
if(this.options.sessid){params.sessid=this.options.sessid;}
|
|
||||||
if(!success_cb){success_cb=function(e){console.log("Success: ",e);};}
|
|
||||||
if(!error_cb){error_cb=function(e){console.log("Error: ",e);};}
|
|
||||||
this._requests.push({request:{jsonrpc:'2.0',method:method,params:params,id:this.jsonrpcclient._current_id++},success_cb:success_cb,error_cb:error_cb});};$.JsonRpcClient._batchObject.prototype.notify=function(method,params){if(this.options.sessid){params.sessid=this.options.sessid;}
|
|
||||||
this._requests.push({request:{jsonrpc:'2.0',method:method,params:params}});};$.JsonRpcClient._batchObject.prototype._execute=function(){var self=this;if(this._requests.length===0)return;var batch_request=[];var handlers={};var i=0;var call;var success_cb;var error_cb;var socket=self.jsonrpcclient.options.getSocket(self.jsonrpcclient.wsOnMessage);if(socket!==null){for(i=0;i<this._requests.length;i++){call=this._requests[i];success_cb=('success_cb'in call)?call.success_cb:undefined;error_cb=('error_cb'in call)?call.error_cb:undefined;self.jsonrpcclient._wsCall(socket,call.request,success_cb,error_cb);}
|
|
||||||
if(typeof all_done_cb==='function')all_done_cb(result);return;}
|
|
||||||
for(i=0;i<this._requests.length;i++){call=this._requests[i];batch_request.push(call.request);if('id'in call.request){handlers[call.request.id]={success_cb:call.success_cb,error_cb:call.error_cb};}}
|
|
||||||
success_cb=function(data){self._batchCb(data,handlers,self.all_done_cb);};if(self.jsonrpcclient.options.ajaxUrl===null){throw"$.JsonRpcClient.batch used with no websocket and no http endpoint.";}
|
|
||||||
$.ajax({url:self.jsonrpcclient.options.ajaxUrl,data:$.toJSON(batch_request),dataType:'json',cache:false,type:'POST',error:function(jqXHR,textStatus,errorThrown){self.error_cb(jqXHR,textStatus,errorThrown);},success:success_cb});};$.JsonRpcClient._batchObject.prototype._batchCb=function(result,handlers,all_done_cb){for(var i=0;i<result.length;i++){var response=result[i];if('error'in response){if(response.id===null||!(response.id in handlers)){if('console'in window)console.log(response);}else{handlers[response.id].error_cb(response.error,this);}}else{if(!(response.id in handlers)&&'console'in window){console.log(response);}else{handlers[response.id].success_cb(response.result,this);}}}
|
|
||||||
if(typeof all_done_cb==='function')all_done_cb(result);};})(jQuery);(function($){var sources=[];var generateGUID=(typeof(window.crypto)!=='undefined'&&typeof(window.crypto.getRandomValues)!=='undefined')?function(){var buf=new Uint16Array(8);window.crypto.getRandomValues(buf);var S4=function(num){var ret=num.toString(16);while(ret.length<4){ret="0"+ret;}
|
|
||||||
return ret;};return(S4(buf[0])+S4(buf[1])+"-"+S4(buf[2])+"-"+S4(buf[3])+"-"+S4(buf[4])+"-"+S4(buf[5])+S4(buf[6])+S4(buf[7]));}:function(){return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){var r=Math.random()*16|0,v=c=='x'?r:(r&0x3|0x8);return v.toString(16);});};$.verto=function(options,callbacks){var verto=this;$.verto.saved.push(verto);verto.options=$.extend({login:null,passwd:null,socketUrl:null,tag:null,localTag:null,videoParams:{},audioParams:{},loginParams:{},deviceParams:{onResCheck:null},userVariables:{},iceServers:false,ringSleep:6000,sessid:null,useStream:null},options);if(verto.options.deviceParams.useCamera){$.FSRTC.getValidRes(verto.options.deviceParams.useCamera,verto.options.deviceParams.onResCheck);}
|
|
||||||
if(!verto.options.deviceParams.useMic){verto.options.deviceParams.useMic="any";}
|
|
||||||
if(!verto.options.deviceParams.useSpeak){verto.options.deviceParams.useSpeak="any";}
|
|
||||||
if(verto.options.sessid){verto.sessid=verto.options.sessid;}else{verto.sessid=localStorage.getItem("verto_session_uuid")||generateGUID();localStorage.setItem("verto_session_uuid",verto.sessid);}
|
|
||||||
verto.dialogs={};verto.callbacks=callbacks||{};verto.eventSUBS={};verto.rpcClient=new $.JsonRpcClient({login:verto.options.login,passwd:verto.options.passwd,socketUrl:verto.options.socketUrl,wsFallbackURL:verto.options.wsFallbackURL,turnServer:verto.options.turnServer,loginParams:verto.options.loginParams,userVariables:verto.options.userVariables,sessid:verto.sessid,onmessage:function(e){return verto.handleMessage(e.eventData);},onWSConnect:function(o){o.call('login',{});},onWSLogin:function(success){if(verto.callbacks.onWSLogin){verto.callbacks.onWSLogin(verto,success);}},onWSClose:function(success){if(verto.callbacks.onWSClose){verto.callbacks.onWSClose(verto,success);}
|
|
||||||
verto.purge();}});var tag=verto.options.tag;if(typeof(tag)==="function"){tag=tag();}
|
|
||||||
if(verto.options.ringFile&&verto.options.tag){verto.ringer=$("#"+tag);}
|
|
||||||
verto.rpcClient.call('login',{});};$.verto.prototype.deviceParams=function(obj){var verto=this;for(var i in obj){verto.options.deviceParams[i]=obj[i];}
|
|
||||||
if(obj.useCamera){$.FSRTC.getValidRes(verto.options.deviceParams.useCamera,obj?obj.onResCheck:undefined);}};$.verto.prototype.videoParams=function(obj){var verto=this;for(var i in obj){verto.options.videoParams[i]=obj[i];}};$.verto.prototype.iceServers=function(obj){var verto=this;verto.options.iceServers=obj;};$.verto.prototype.loginData=function(params){var verto=this;verto.options.login=params.login;verto.options.passwd=params.passwd;verto.rpcClient.loginData(params);};$.verto.prototype.logout=function(msg){var verto=this;verto.rpcClient.closeSocket();if(verto.callbacks.onWSClose){verto.callbacks.onWSClose(verto,false);}
|
|
||||||
verto.purge();};$.verto.prototype.login=function(msg){var verto=this;verto.logout();verto.rpcClient.call('login',{});};$.verto.prototype.message=function(msg){var verto=this;var err=0;if(!msg.to){console.error("Missing To");err++;}
|
|
||||||
if(!msg.body){console.error("Missing Body");err++;}
|
|
||||||
if(err){return false;}
|
|
||||||
verto.sendMethod("verto.info",{msg:msg});return true;};$.verto.prototype.processReply=function(method,success,e){var verto=this;var i;switch(method){case"verto.subscribe":for(i in e.unauthorizedChannels){drop_bad(verto,e.unauthorizedChannels[i]);}
|
|
||||||
for(i in e.subscribedChannels){mark_ready(verto,e.subscribedChannels[i]);}
|
|
||||||
break;case"verto.unsubscribe":break;}};$.verto.prototype.sendMethod=function(method,params){var verto=this;verto.rpcClient.call(method,params,function(e){verto.processReply(method,true,e);},function(e){verto.processReply(method,false,e);});};function do_sub(verto,channel,obj){}
|
|
||||||
function drop_bad(verto,channel){console.error("drop unauthorized channel: "+channel);delete verto.eventSUBS[channel];}
|
|
||||||
function mark_ready(verto,channel){for(var j in verto.eventSUBS[channel]){verto.eventSUBS[channel][j].ready=true;console.log("subscribed to channel: "+channel);if(verto.eventSUBS[channel][j].readyHandler){verto.eventSUBS[channel][j].readyHandler(verto,channel);}}}
|
|
||||||
var SERNO=1;function do_subscribe(verto,channel,subChannels,sparams){var params=sparams||{};var local=params.local;var obj={eventChannel:channel,userData:params.userData,handler:params.handler,ready:false,readyHandler:params.readyHandler,serno:SERNO++};var isnew=false;if(!verto.eventSUBS[channel]){verto.eventSUBS[channel]=[];subChannels.push(channel);isnew=true;}
|
|
||||||
verto.eventSUBS[channel].push(obj);if(local){obj.ready=true;obj.local=true;}
|
|
||||||
if(!isnew&&verto.eventSUBS[channel][0].ready){obj.ready=true;if(obj.readyHandler){obj.readyHandler(verto,channel);}}
|
|
||||||
return{serno:obj.serno,eventChannel:channel};}
|
|
||||||
$.verto.prototype.subscribe=function(channel,sparams){var verto=this;var r=[];var subChannels=[];var params=sparams||{};if(typeof(channel)==="string"){r.push(do_subscribe(verto,channel,subChannels,params));}else{for(var i in channel){r.push(do_subscribe(verto,channel,subChannels,params));}}
|
|
||||||
if(subChannels.length){verto.sendMethod("verto.subscribe",{eventChannel:subChannels.length==1?subChannels[0]:subChannels,subParams:params.subParams});}
|
|
||||||
return r;};$.verto.prototype.unsubscribe=function(handle){var verto=this;var i;if(!handle){for(i in verto.eventSUBS){if(verto.eventSUBS[i]){verto.unsubscribe(verto.eventSUBS[i]);}}}else{var unsubChannels={};var sendChannels=[];var channel;if(typeof(handle)=="string"){delete verto.eventSUBS[handle];unsubChannels[handle]++;}else{for(i in handle){if(typeof(handle[i])=="string"){channel=handle[i];delete verto.eventSUBS[channel];unsubChannels[channel]++;}else{var repl=[];channel=handle[i].eventChannel;for(var j in verto.eventSUBS[channel]){if(verto.eventSUBS[channel][j].serno==handle[i].serno){}else{repl.push(verto.eventSUBS[channel][j]);}}
|
|
||||||
verto.eventSUBS[channel]=repl;if(verto.eventSUBS[channel].length===0){delete verto.eventSUBS[channel];unsubChannels[channel]++;}}}}
|
|
||||||
for(var u in unsubChannels){console.log("Sending Unsubscribe for: ",u);sendChannels.push(u);}
|
|
||||||
if(sendChannels.length){verto.sendMethod("verto.unsubscribe",{eventChannel:sendChannels.length==1?sendChannels[0]:sendChannels});}}};$.verto.prototype.broadcast=function(channel,params){var verto=this;var msg={eventChannel:channel,data:{}};for(var i in params){msg.data[i]=params[i];}
|
|
||||||
verto.sendMethod("verto.broadcast",msg);};$.verto.prototype.purge=function(callID){var verto=this;var x=0;var i;for(i in verto.dialogs){if(!x){console.log("purging dialogs");}
|
|
||||||
x++;verto.dialogs[i].setState($.verto.enum.state.purge);}
|
|
||||||
for(i in verto.eventSUBS){if(verto.eventSUBS[i]){console.log("purging subscription: "+i);delete verto.eventSUBS[i];}}};$.verto.prototype.hangup=function(callID){var verto=this;if(callID){var dialog=verto.dialogs[callID];if(dialog){dialog.hangup();}}else{for(var i in verto.dialogs){verto.dialogs[i].hangup();}}};$.verto.prototype.newCall=function(args,callbacks){var verto=this;if(!verto.rpcClient.socketReady()){console.error("Not Connected...");return;}
|
|
||||||
if(args["useCamera"]){verto.options.deviceParams["useCamera"]=args["useCamera"];verto.options.deviceParams["useCameraLabel"]=args["useCameraLabel"];}
|
|
||||||
var dialog=new $.verto.dialog($.verto.enum.direction.outbound,this,args);if(callbacks){dialog.callbacks=callbacks;}
|
|
||||||
dialog.invite();return dialog;};$.verto.prototype.handleMessage=function(data){var verto=this;if(!(data&&data.method)){console.error("Invalid Data",data);return;}
|
|
||||||
if(data.params.callID){var dialog=verto.dialogs[data.params.callID];if(data.method==="verto.attach"&&dialog){delete dialog.verto.dialogs[dialog.callID];dialog.rtc.stop();dialog=null;}
|
|
||||||
if(dialog){switch(data.method){case'verto.bye':dialog.hangup(data.params);break;case'verto.answer':dialog.handleAnswer(data.params);break;case'verto.media':dialog.handleMedia(data.params);break;case'verto.display':dialog.handleDisplay(data.params);break;case'verto.info':dialog.handleInfo(data.params);break;default:console.debug("INVALID METHOD OR NON-EXISTANT CALL REFERENCE IGNORED",dialog,data.method);break;}}else{switch(data.method){case'verto.attach':data.params.attach=true;if(data.params.sdp&&data.params.sdp.indexOf("m=video")>0){data.params.useVideo=true;}
|
|
||||||
if(data.params.sdp&&data.params.sdp.indexOf("stereo=1")>0){data.params.useStereo=true;}
|
|
||||||
dialog=new $.verto.dialog($.verto.enum.direction.inbound,verto,data.params);dialog.setState($.verto.enum.state.recovering);break;case'verto.invite':if(data.params.sdp&&data.params.sdp.indexOf("m=video")>0){data.params.wantVideo=true;}
|
|
||||||
if(data.params.sdp&&data.params.sdp.indexOf("stereo=1")>0){data.params.useStereo=true;}
|
|
||||||
dialog=new $.verto.dialog($.verto.enum.direction.inbound,verto,data.params);break;default:console.debug("INVALID METHOD OR NON-EXISTANT CALL REFERENCE IGNORED");break;}}
|
|
||||||
return{method:data.method};}else{switch(data.method){case'verto.punt':verto.purge();verto.logout();break;case'verto.event':var list=null;var key=null;if(data.params){key=data.params.eventChannel;}
|
|
||||||
if(key){list=verto.eventSUBS[key];if(!list){list=verto.eventSUBS[key.split(".")[0]];}}
|
|
||||||
if(!list&&key&&key===verto.sessid){if(verto.callbacks.onMessage){verto.callbacks.onMessage(verto,null,$.verto.enum.message.pvtEvent,data.params);}}else if(!list&&key&&verto.dialogs[key]){verto.dialogs[key].sendMessage($.verto.enum.message.pvtEvent,data.params);}else if(!list){if(!key){key="UNDEFINED";}
|
|
||||||
console.error("UNSUBBED or invalid EVENT "+key+" IGNORED");}else{for(var i in list){var sub=list[i];if(!sub||!sub.ready){console.error("invalid EVENT for "+key+" IGNORED");}else if(sub.handler){sub.handler(verto,data.params,sub.userData);}else if(verto.callbacks.onEvent){verto.callbacks.onEvent(verto,data.params,sub.userData);}else{console.log("EVENT:",data.params);}}}
|
|
||||||
break;case"verto.info":if(verto.callbacks.onMessage){verto.callbacks.onMessage(verto,null,$.verto.enum.message.info,data.params.msg);}
|
|
||||||
console.debug("MESSAGE from: "+data.params.msg.from,data.params.msg.body);break;case'verto.clientReady':if(verto.callbacks.onMessage){verto.callbacks.onMessage(verto,null,$.verto.enum.message.clientReady,data.params);}
|
|
||||||
console.debug("CLIENT READY",data.params);break;default:console.error("INVALID METHOD OR NON-EXISTANT CALL REFERENCE IGNORED",data.method);break;}}};var del_array=function(array,name){var r=[];var len=array.length;for(var i=0;i<len;i++){if(array[i]!=name){r.push(array[i]);}}
|
|
||||||
return r;};var hashArray=function(){var vha=this;var hash={};var array=[];vha.reorder=function(a){array=a;var h=hash;hash={};var len=array.length;for(var i=0;i<len;i++){var key=array[i];if(h[key]){hash[key]=h[key];delete h[key];}}
|
|
||||||
h=undefined;};vha.clear=function(){hash=undefined;array=undefined;hash={};array=[];};vha.add=function(name,val,insertAt){var redraw=false;if(!hash[name]){if(insertAt===undefined||insertAt<0||insertAt>=array.length){array.push(name);}else{var x=0;var n=[];var len=array.length;for(var i=0;i<len;i++){if(x++==insertAt){n.push(name);}
|
|
||||||
n.push(array[i]);}
|
|
||||||
array=undefined;array=n;n=undefined;redraw=true;}}
|
|
||||||
hash[name]=val;return redraw;};vha.del=function(name){var r=false;if(hash[name]){array=del_array(array,name);delete hash[name];r=true;}else{console.error("can't del nonexistant key "+name);}
|
|
||||||
return r;};vha.get=function(name){return hash[name];};vha.order=function(){return array;};vha.hash=function(){return hash;};vha.indexOf=function(name){var len=array.length;for(var i=0;i<len;i++){if(array[i]==name){return i;}}};vha.arrayLen=function(){return array.length;};vha.asArray=function(){var r=[];var len=array.length;for(var i=0;i<len;i++){var key=array[i];r.push(hash[key]);}
|
|
||||||
return r;};vha.each=function(cb){var len=array.length;for(var i=0;i<len;i++){cb(array[i],hash[array[i]]);}};vha.dump=function(html){var str="";vha.each(function(name,val){str+="name: "+name+" val: "+JSON.stringify(val)+(html?"<br>":"\n");});return str;};};$.verto.liveArray=function(verto,context,name,config){var la=this;var lastSerno=0;var binding=null;var user_obj=config.userObj;var local=false;hashArray.call(la);la._add=la.add;la._del=la.del;la._reorder=la.reorder;la._clear=la.clear;la.context=context;la.name=name;la.user_obj=user_obj;la.verto=verto;la.broadcast=function(channel,obj){verto.broadcast(channel,obj);};la.errs=0;la.clear=function(){la._clear();lastSerno=0;if(la.onChange){la.onChange(la,{action:"clear"});}};la.checkSerno=function(serno){if(serno<0){return true;}
|
|
||||||
if(lastSerno>0&&serno!=(lastSerno+1)){if(la.onErr){la.onErr(la,{lastSerno:lastSerno,serno:serno});}
|
|
||||||
la.errs++;console.debug(la.errs);if(la.errs<3){la.bootstrap(la.user_obj);}
|
|
||||||
return false;}else{lastSerno=serno;return true;}};la.reorder=function(serno,a){if(la.checkSerno(serno)){la._reorder(a);if(la.onChange){la.onChange(la,{serno:serno,action:"reorder"});}}};la.init=function(serno,val,key,index){if(key===null||key===undefined){key=serno;}
|
|
||||||
if(la.checkSerno(serno)){if(la.onChange){la.onChange(la,{serno:serno,action:"init",index:index,key:key,data:val});}}};la.bootObj=function(serno,val){if(la.checkSerno(serno)){for(var i in val){la._add(val[i][0],val[i][1]);}
|
|
||||||
if(la.onChange){la.onChange(la,{serno:serno,action:"bootObj",data:val,redraw:true});}}};la.add=function(serno,val,key,index){if(key===null||key===undefined){key=serno;}
|
|
||||||
if(la.checkSerno(serno)){var redraw=la._add(key,val,index);if(la.onChange){la.onChange(la,{serno:serno,action:"add",index:index,key:key,data:val,redraw:redraw});}}};la.modify=function(serno,val,key,index){if(key===null||key===undefined){key=serno;}
|
|
||||||
if(la.checkSerno(serno)){la._add(key,val,index);if(la.onChange){la.onChange(la,{serno:serno,action:"modify",key:key,data:val,index:index});}}};la.del=function(serno,key,index){if(key===null||key===undefined){key=serno;}
|
|
||||||
if(la.checkSerno(serno)){if(index===null||index<0||index===undefined){index=la.indexOf(key);}
|
|
||||||
var ok=la._del(key);if(ok&&la.onChange){la.onChange(la,{serno:serno,action:"del",key:key,index:index});}}};var eventHandler=function(v,e,la){var packet=e.data;if(packet.name!=la.name){return;}
|
|
||||||
switch(packet.action){case"init":la.init(packet.wireSerno,packet.data,packet.hashKey,packet.arrIndex);break;case"bootObj":la.bootObj(packet.wireSerno,packet.data);break;case"add":la.add(packet.wireSerno,packet.data,packet.hashKey,packet.arrIndex);break;case"modify":if(!(packet.arrIndex||packet.hashKey)){console.error("Invalid Packet",packet);}else{la.modify(packet.wireSerno,packet.data,packet.hashKey,packet.arrIndex);}
|
|
||||||
break;case"del":if(!(packet.arrIndex||packet.hashKey)){console.error("Invalid Packet",packet);}else{la.del(packet.wireSerno,packet.hashKey,packet.arrIndex);}
|
|
||||||
break;case"clear":la.clear();break;case"reorder":la.reorder(packet.wireSerno,packet.order);break;default:if(la.checkSerno(packet.wireSerno)){if(la.onChange){la.onChange(la,{serno:packet.wireSerno,action:packet.action,data:packet.data});}}
|
|
||||||
break;}};if(la.context){binding=la.verto.subscribe(la.context,{handler:eventHandler,userData:la,subParams:config.subParams});}
|
|
||||||
la.destroy=function(){la._clear();la.verto.unsubscribe(binding);};la.sendCommand=function(cmd,obj){var self=la;self.broadcast(self.context,{liveArray:{command:cmd,context:self.context,name:self.name,obj:obj}});};la.bootstrap=function(obj){var self=la;la.sendCommand("bootstrap",obj);};la.changepage=function(obj){var self=la;self.clear();self.broadcast(self.context,{liveArray:{command:"changepage",context:la.context,name:la.name,obj:obj}});};la.heartbeat=function(obj){var self=la;var callback=function(){self.heartbeat.call(self,obj);};self.broadcast(self.context,{liveArray:{command:"heartbeat",context:self.context,name:self.name,obj:obj}});self.hb_pid=setTimeout(callback,30000);};la.bootstrap(la.user_obj);};$.verto.liveTable=function(verto,context,name,jq,config){var dt;var la=new $.verto.liveArray(verto,context,name,{subParams:config.subParams});var lt=this;lt.liveArray=la;lt.dataTable=dt;lt.verto=verto;lt.destroy=function(){if(dt){dt.fnDestroy();}
|
|
||||||
if(la){la.destroy();}
|
|
||||||
dt=null;la=null;};la.onErr=function(obj,args){console.error("Error: ",obj,args);};function genRow(data){if(typeof(data[4])==="string"&&data[4].indexOf("{")>-1){var tmp=$.parseJSON(data[4]);data[4]=tmp.oldStatus;data[5]=null;}
|
|
||||||
return data;}
|
|
||||||
function genArray(obj){var data=obj.asArray();for(var i in data){data[i]=genRow(data[i]);}
|
|
||||||
return data;}
|
|
||||||
la.onChange=function(obj,args){var index=0;var iserr=0;if(!dt){if(!config.aoColumns){if(args.action!="init"){return;}
|
|
||||||
config.aoColumns=[];for(var i in args.data){config.aoColumns.push({"sTitle":args.data[i]});}}
|
|
||||||
dt=jq.dataTable(config);}
|
|
||||||
if(dt&&(args.action=="del"||args.action=="modify")){index=args.index;if(index===undefined&&args.key){index=la.indexOf(args.key);}
|
|
||||||
if(index===undefined){console.error("INVALID PACKET Missing INDEX\n",args);return;}}
|
|
||||||
if(config.onChange){config.onChange(obj,args);}
|
|
||||||
try{switch(args.action){case"bootObj":if(!args.data){console.error("missing data");return;}
|
|
||||||
dt.fnClearTable();dt.fnAddData(genArray(obj));dt.fnAdjustColumnSizing();break;case"add":if(!args.data){console.error("missing data");return;}
|
|
||||||
if(args.redraw>-1){dt.fnClearTable();dt.fnAddData(genArray(obj));}else{dt.fnAddData(genRow(args.data));}
|
|
||||||
dt.fnAdjustColumnSizing();break;case"modify":if(!args.data){return;}
|
|
||||||
dt.fnUpdate(genRow(args.data),index);dt.fnAdjustColumnSizing();break;case"del":dt.fnDeleteRow(index);dt.fnAdjustColumnSizing();break;case"clear":dt.fnClearTable();break;case"reorder":dt.fnClearTable();dt.fnAddData(genArray(obj));break;case"hide":jq.hide();break;case"show":jq.show();break;}}catch(err){console.error("ERROR: "+err);iserr++;}
|
|
||||||
if(iserr){obj.errs++;if(obj.errs<3){obj.bootstrap(obj.user_obj);}}else{obj.errs=0;}};la.onChange(la,{action:"init"});};var CONFMAN_SERNO=1;$.verto.conf=function(verto,params){var conf=this;conf.params=$.extend({dialog:null,hasVid:false,laData:null,onBroadcast:null,onLaChange:null,onLaRow:null},params);conf.verto=verto;conf.serno=CONFMAN_SERNO++;createMainModeratorMethods();verto.subscribe(conf.params.laData.modChannel,{handler:function(v,e){if(conf.params.onBroadcast){conf.params.onBroadcast(verto,conf,e.data);}}});verto.subscribe(conf.params.laData.infoChannel,{handler:function(v,e){if(typeof(conf.params.infoCallback)==="function"){conf.params.infoCallback(v,e);}}});verto.subscribe(conf.params.laData.chatChannel,{handler:function(v,e){if(typeof(conf.params.chatCallback)==="function"){conf.params.chatCallback(v,e);}}});};$.verto.conf.prototype.modCommand=function(cmd,id,value){var conf=this;conf.verto.rpcClient.call("verto.broadcast",{"eventChannel":conf.params.laData.modChannel,"data":{"application":"conf-control","command":cmd,"id":id,"value":value}});};$.verto.conf.prototype.destroy=function(){var conf=this;conf.destroyed=true;conf.params.onBroadcast(conf.verto,conf,'destroy');if(conf.params.laData.modChannel){conf.verto.unsubscribe(conf.params.laData.modChannel);}
|
|
||||||
if(conf.params.laData.chatChannel){conf.verto.unsubscribe(conf.params.laData.chatChannel);}
|
|
||||||
if(conf.params.laData.infoChannel){conf.verto.unsubscribe(conf.params.laData.infoChannel);}};function createMainModeratorMethods(){$.verto.conf.prototype.listVideoLayouts=function(){this.modCommand("list-videoLayouts",null,null);};$.verto.conf.prototype.play=function(file){this.modCommand("play",null,file);};$.verto.conf.prototype.stop=function(){this.modCommand("stop",null,"all");};$.verto.conf.prototype.deaf=function(memberID){this.modCommand("deaf",parseInt(memberID));};$.verto.conf.prototype.undeaf=function(memberID){this.modCommand("undeaf",parseInt(memberID));};$.verto.conf.prototype.record=function(file){this.modCommand("recording",null,["start",file]);};$.verto.conf.prototype.stopRecord=function(){this.modCommand("recording",null,["stop","all"]);};$.verto.conf.prototype.snapshot=function(file){if(!this.params.hasVid){throw'Conference has no video';}
|
|
||||||
this.modCommand("vid-write-png",null,file);};$.verto.conf.prototype.setVideoLayout=function(layout,canvasID){if(!this.params.hasVid){throw'Conference has no video';}
|
|
||||||
if(canvasID){this.modCommand("vid-layout",null,[layout,canvasID]);}else{this.modCommand("vid-layout",null,layout);}};$.verto.conf.prototype.kick=function(memberID){this.modCommand("kick",parseInt(memberID));};$.verto.conf.prototype.muteMic=function(memberID){this.modCommand("tmute",parseInt(memberID));};$.verto.conf.prototype.muteVideo=function(memberID){if(!this.params.hasVid){throw'Conference has no video';}
|
|
||||||
this.modCommand("tvmute",parseInt(memberID));};$.verto.conf.prototype.presenter=function(memberID){if(!this.params.hasVid){throw'Conference has no video';}
|
|
||||||
this.modCommand("vid-res-id",parseInt(memberID),"presenter");};$.verto.conf.prototype.videoFloor=function(memberID){if(!this.params.hasVid){throw'Conference has no video';}
|
|
||||||
this.modCommand("vid-floor",parseInt(memberID),"force");};$.verto.conf.prototype.banner=function(memberID,text){if(!this.params.hasVid){throw'Conference has no video';}
|
|
||||||
this.modCommand("vid-banner",parseInt(memberID),escape(text));};$.verto.conf.prototype.volumeDown=function(memberID){this.modCommand("volume_out",parseInt(memberID),"down");};$.verto.conf.prototype.volumeUp=function(memberID){this.modCommand("volume_out",parseInt(memberID),"up");};$.verto.conf.prototype.gainDown=function(memberID){this.modCommand("volume_in",parseInt(memberID),"down");};$.verto.conf.prototype.gainUp=function(memberID){this.modCommand("volume_in",parseInt(memberID),"up");};$.verto.conf.prototype.transfer=function(memberID,exten){this.modCommand("transfer",parseInt(memberID),exten);};$.verto.conf.prototype.sendChat=function(message,type){var conf=this;conf.verto.rpcClient.call("verto.broadcast",{"eventChannel":conf.params.laData.chatChannel,"data":{"action":"send","message":message,"type":type}});};}
|
|
||||||
$.verto.modfuncs={};$.verto.confMan=function(verto,params){var confMan=this;confMan.params=$.extend({tableID:null,statusID:null,mainModID:null,dialog:null,hasVid:false,laData:null,onBroadcast:null,onLaChange:null,onLaRow:null},params);confMan.verto=verto;confMan.serno=CONFMAN_SERNO++;confMan.canvasCount=confMan.params.laData.canvasCount;function genMainMod(jq){var play_id="play_"+confMan.serno;var stop_id="stop_"+confMan.serno;var recording_id="recording_"+confMan.serno;var snapshot_id="snapshot_"+confMan.serno;var rec_stop_id="recording_stop"+confMan.serno;var div_id="confman_"+confMan.serno;var html="<div id='"+div_id+"'><br>"+"<button class='ctlbtn' id='"+play_id+"'>Play</button>"+"<button class='ctlbtn' id='"+stop_id+"'>Stop</button>"+"<button class='ctlbtn' id='"+recording_id+"'>Record</button>"+"<button class='ctlbtn' id='"+rec_stop_id+"'>Record Stop</button>"+
|
|
||||||
(confMan.params.hasVid?"<button class='ctlbtn' id='"+snapshot_id+"'>PNG Snapshot</button>":"")+"<br><br></div>";jq.html(html);$.verto.modfuncs.change_video_layout=function(id,canvas_id){var val=$("#"+id+" option:selected").text();if(val!=="none"){confMan.modCommand("vid-layout",null,[val,canvas_id]);}};if(confMan.params.hasVid){for(var j=0;j<confMan.canvasCount;j++){var vlayout_id="confman_vid_layout_"+j+"_"+confMan.serno;var vlselect_id="confman_vl_select_"+j+"_"+confMan.serno;var vlhtml="<div id='"+vlayout_id+"'><br>"+"<b>Video Layout Canvas "+(j+1)+"</b> <select onChange='$.verto.modfuncs.change_video_layout(\""+vlayout_id+"\", \""+(j+1)+"\")' id='"+vlselect_id+"'></select> "+"<br><br></div>";jq.append(vlhtml);}
|
|
||||||
$("#"+snapshot_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("vid-write-png",null,file);}});}
|
|
||||||
$("#"+play_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("play",null,file);}});$("#"+stop_id).click(function(){confMan.modCommand("stop",null,"all");});$("#"+recording_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("recording",null,["start",file]);}});$("#"+rec_stop_id).click(function(){confMan.modCommand("recording",null,["stop","all"]);});}
|
|
||||||
function genControls(jq,rowid){var x=parseInt(rowid);var kick_id="kick_"+x;var canvas_in_next_id="canvas_in_next_"+x;var canvas_in_prev_id="canvas_in_prev_"+x;var canvas_out_next_id="canvas_out_next_"+x;var canvas_out_prev_id="canvas_out_prev_"+x;var canvas_in_set_id="canvas_in_set_"+x;var canvas_out_set_id="canvas_out_set_"+x;var layer_set_id="layer_set_"+x;var layer_next_id="layer_next_"+x;var layer_prev_id="layer_prev_"+x;var tmute_id="tmute_"+x;var tvmute_id="tvmute_"+x;var vbanner_id="vbanner_"+x;var tvpresenter_id="tvpresenter_"+x;var tvfloor_id="tvfloor_"+x;var box_id="box_"+x;var gainup_id="gain_in_up"+x;var gaindn_id="gain_in_dn"+x;var volup_id="vol_in_up"+x;var voldn_id="vol_in_dn"+x;var transfer_id="transfer"+x;var html="<div id='"+box_id+"'>";html+="<b>General Controls</b><hr noshade>";html+="<button class='ctlbtn' id='"+kick_id+"'>Kick</button>"+"<button class='ctlbtn' id='"+tmute_id+"'>Mute</button>"+"<button class='ctlbtn' id='"+gainup_id+"'>Gain -</button>"+"<button class='ctlbtn' id='"+gaindn_id+"'>Gain +</button>"+"<button class='ctlbtn' id='"+voldn_id+"'>Vol -</button>"+"<button class='ctlbtn' id='"+volup_id+"'>Vol +</button>"+"<button class='ctlbtn' id='"+transfer_id+"'>Transfer</button>";if(confMan.params.hasVid){html+="<br><br><b>Video Controls</b><hr noshade>";html+="<button class='ctlbtn' id='"+tvmute_id+"'>VMute</button>"+"<button class='ctlbtn' id='"+tvpresenter_id+"'>Presenter</button>"+"<button class='ctlbtn' id='"+tvfloor_id+"'>Vid Floor</button>"+"<button class='ctlbtn' id='"+vbanner_id+"'>Banner</button>";if(confMan.canvasCount>1){html+="<br><br><b>Canvas Controls</b><hr noshade>"+"<button class='ctlbtn' id='"+canvas_in_set_id+"'>Set Input Canvas</button>"+"<button class='ctlbtn' id='"+canvas_in_prev_id+"'>Prev Input Canvas</button>"+"<button class='ctlbtn' id='"+canvas_in_next_id+"'>Next Input Canvas</button>"+"<br>"+"<button class='ctlbtn' id='"+canvas_out_set_id+"'>Set Watching Canvas</button>"+"<button class='ctlbtn' id='"+canvas_out_prev_id+"'>Prev Watching Canvas</button>"+"<button class='ctlbtn' id='"+canvas_out_next_id+"'>Next Watching Canvas</button>";}
|
|
||||||
html+="<br>"+"<button class='ctlbtn' id='"+layer_set_id+"'>Set Layer</button>"+"<button class='ctlbtn' id='"+layer_prev_id+"'>Prev Layer</button>"+"<button class='ctlbtn' id='"+layer_next_id+"'>Next Layer</button>"+"</div>";}
|
|
||||||
jq.html(html);if(!jq.data("mouse")){$("#"+box_id).hide();}
|
|
||||||
jq.mouseover(function(e){jq.data({"mouse":true});$("#"+box_id).show();});jq.mouseout(function(e){jq.data({"mouse":false});$("#"+box_id).hide();});$("#"+transfer_id).click(function(){var xten=prompt("Enter Extension");if(xten){confMan.modCommand("transfer",x,xten);}});$("#"+kick_id).click(function(){confMan.modCommand("kick",x);});$("#"+layer_set_id).click(function(){var cid=prompt("Please enter layer ID","");if(cid){confMan.modCommand("vid-layer",x,cid);}});$("#"+layer_next_id).click(function(){confMan.modCommand("vid-layer",x,"next");});$("#"+layer_prev_id).click(function(){confMan.modCommand("vid-layer",x,"prev");});$("#"+canvas_in_set_id).click(function(){var cid=prompt("Please enter canvas ID","");if(cid){confMan.modCommand("vid-canvas",x,cid);}});$("#"+canvas_out_set_id).click(function(){var cid=prompt("Please enter canvas ID","");if(cid){confMan.modCommand("vid-watching-canvas",x,cid);}});$("#"+canvas_in_next_id).click(function(){confMan.modCommand("vid-canvas",x,"next");});$("#"+canvas_in_prev_id).click(function(){confMan.modCommand("vid-canvas",x,"prev");});$("#"+canvas_out_next_id).click(function(){confMan.modCommand("vid-watching-canvas",x,"next");});$("#"+canvas_out_prev_id).click(function(){confMan.modCommand("vid-watching-canvas",x,"prev");});$("#"+tmute_id).click(function(){confMan.modCommand("tmute",x);});if(confMan.params.hasVid){$("#"+tvmute_id).click(function(){confMan.modCommand("tvmute",x);});$("#"+tvpresenter_id).click(function(){confMan.modCommand("vid-res-id",x,"presenter");});$("#"+tvfloor_id).click(function(){confMan.modCommand("vid-floor",x,"force");});$("#"+vbanner_id).click(function(){var text=prompt("Please enter text","");if(text){confMan.modCommand("vid-banner",x,escape(text));}});}
|
|
||||||
$("#"+gainup_id).click(function(){confMan.modCommand("volume_in",x,"up");});$("#"+gaindn_id).click(function(){confMan.modCommand("volume_in",x,"down");});$("#"+volup_id).click(function(){confMan.modCommand("volume_out",x,"up");});$("#"+voldn_id).click(function(){confMan.modCommand("volume_out",x,"down");});return html;}
|
|
||||||
var atitle="";var awidth=0;verto.subscribe(confMan.params.laData.infoChannel,{handler:function(v,e){if(typeof(confMan.params.infoCallback)==="function"){confMan.params.infoCallback(v,e);}}});verto.subscribe(confMan.params.laData.chatChannel,{handler:function(v,e){if(typeof(confMan.params.chatCallback)==="function"){confMan.params.chatCallback(v,e);}}});if(confMan.params.laData.role==="moderator"){atitle="Action";awidth=600;if(confMan.params.mainModID){genMainMod($(confMan.params.mainModID));$(confMan.params.displayID).html("Moderator Controls Ready<br><br>");}else{$(confMan.params.mainModID).html("");}
|
|
||||||
verto.subscribe(confMan.params.laData.modChannel,{handler:function(v,e){if(confMan.params.onBroadcast){confMan.params.onBroadcast(verto,confMan,e.data);}
|
|
||||||
if(e.data["conf-command"]==="list-videoLayouts"){for(var j=0;j<confMan.canvasCount;j++){var vlselect_id="#confman_vl_select_"+j+"_"+confMan.serno;var vlayout_id="#confman_vid_layout_"+j+"_"+confMan.serno;var x=0;var options;$(vlselect_id).selectmenu({});$(vlselect_id).selectmenu("enable");$(vlselect_id).empty();$(vlselect_id).append(new Option("Choose a Layout","none"));if(e.data.responseData){var rdata=[];for(var i in e.data.responseData){rdata.push(e.data.responseData[i].name);}
|
|
||||||
options=rdata.sort(function(a,b){var ga=a.substring(0,6)=="group:"?true:false;var gb=b.substring(0,6)=="group:"?true:false;if((ga||gb)&&ga!=gb){return ga?-1:1;}
|
|
||||||
return((a==b)?0:((a>b)?1:-1));});for(var i in options){$(vlselect_id).append(new Option(options[i],options[i]));x++;}}
|
|
||||||
if(x){$(vlselect_id).selectmenu('refresh',true);}else{$(vlayout_id).hide();}}}else{if(!confMan.destroyed&&confMan.params.displayID){$(confMan.params.displayID).html(e.data.response+"<br><br>");if(confMan.lastTimeout){clearTimeout(confMan.lastTimeout);confMan.lastTimeout=0;}
|
|
||||||
confMan.lastTimeout=setTimeout(function(){$(confMan.params.displayID).html(confMan.destroyed?"":"Moderator Controls Ready<br><br>");},4000);}}}});if(confMan.params.hasVid){confMan.modCommand("list-videoLayouts",null,null);}}
|
|
||||||
var row_callback=null;if(confMan.params.laData.role==="moderator"){row_callback=function(nRow,aData,iDisplayIndex,iDisplayIndexFull){if(!aData[5]){var $row=$('td:eq(5)',nRow);genControls($row,aData);if(confMan.params.onLaRow){confMan.params.onLaRow(verto,confMan,$row,aData);}}};}
|
|
||||||
confMan.lt=new $.verto.liveTable(verto,confMan.params.laData.laChannel,confMan.params.laData.laName,$(confMan.params.tableID),{subParams:{callID:confMan.params.dialog?confMan.params.dialog.callID:null},"onChange":function(obj,args){$(confMan.params.statusID).text("Conference Members: "+" ("+obj.arrayLen()+" Total)");if(confMan.params.onLaChange){confMan.params.onLaChange(verto,confMan,$.verto.enum.confEvent.laChange,obj,args);}},"aaData":[],"aoColumns":[{"sTitle":"ID","sWidth":"50"},{"sTitle":"Number","sWidth":"250"},{"sTitle":"Name","sWidth":"250"},{"sTitle":"Codec","sWidth":"100"},{"sTitle":"Status","sWidth":confMan.params.hasVid?"200px":"150px"},{"sTitle":atitle,"sWidth":awidth,}],"bAutoWidth":true,"bDestroy":true,"bSort":false,"bInfo":false,"bFilter":false,"bLengthChange":false,"bPaginate":false,"iDisplayLength":1400,"oLanguage":{"sEmptyTable":"The Conference is Empty....."},"fnRowCallback":row_callback});};$.verto.confMan.prototype.modCommand=function(cmd,id,value){var confMan=this;confMan.verto.rpcClient.call("verto.broadcast",{"eventChannel":confMan.params.laData.modChannel,"data":{"application":"conf-control","command":cmd,"id":id,"value":value}});};$.verto.confMan.prototype.sendChat=function(message,type){var confMan=this;confMan.verto.rpcClient.call("verto.broadcast",{"eventChannel":confMan.params.laData.chatChannel,"data":{"action":"send","message":message,"type":type}});};$.verto.confMan.prototype.destroy=function(){var confMan=this;confMan.destroyed=true;if(confMan.lt){confMan.lt.destroy();}
|
|
||||||
if(confMan.params.laData.chatChannel){confMan.verto.unsubscribe(confMan.params.laData.chatChannel);}
|
|
||||||
if(confMan.params.laData.modChannel){confMan.verto.unsubscribe(confMan.params.laData.modChannel);}
|
|
||||||
if(confMan.params.mainModID){$(confMan.params.mainModID).html("");}};$.verto.dialog=function(direction,verto,params){var dialog=this;dialog.params=$.extend({useVideo:verto.options.useVideo,useStereo:verto.options.useStereo,screenShare:false,useCamera:false,useMic:verto.options.deviceParams.useMic,useMicLabel:verto.options.deviceParams.useMicLabel,useSpeak:verto.options.deviceParams.useSpeak,tag:verto.options.tag,localTag:verto.options.localTag,login:verto.options.login,videoParams:verto.options.videoParams,useStream:verto.options.useStream,},params);if(!dialog.params.screenShare){dialog.params.useCamera=verto.options.deviceParams.useCamera;dialog.params.useCameraLabel=verto.options.deviceParams.useCameraLabel;}
|
|
||||||
dialog.verto=verto;dialog.direction=direction;dialog.lastState=null;dialog.state=dialog.lastState=$.verto.enum.state.new;dialog.callbacks=verto.callbacks;dialog.answered=false;dialog.attach=params.attach||false;dialog.screenShare=params.screenShare||false;dialog.useCamera=dialog.params.useCamera;dialog.useCameraLabel=dialog.params.useCameraLabel;dialog.useMic=dialog.params.useMic;dialog.useMicLabel=dialog.params.useMicLabel;dialog.useSpeak=dialog.params.useSpeak;if(dialog.params.callID){dialog.callID=dialog.params.callID;}else{dialog.callID=dialog.params.callID=generateGUID();}
|
|
||||||
if(typeof(dialog.params.tag)==="function"){dialog.params.tag=dialog.params.tag();}
|
|
||||||
if(dialog.params.tag){dialog.audioStream=document.getElementById(dialog.params.tag);if(dialog.params.useVideo){dialog.videoStream=dialog.audioStream;}}
|
|
||||||
if(dialog.params.localTag){dialog.localVideo=document.getElementById(dialog.params.localTag);}
|
|
||||||
dialog.verto.dialogs[dialog.callID]=dialog;var RTCcallbacks={};if(dialog.direction==$.verto.enum.direction.inbound){if(dialog.params.display_direction==="outbound"){dialog.params.remote_caller_id_name=dialog.params.caller_id_name;dialog.params.remote_caller_id_number=dialog.params.caller_id_number;}else{dialog.params.remote_caller_id_name=dialog.params.callee_id_name;dialog.params.remote_caller_id_number=dialog.params.callee_id_number;}
|
|
||||||
if(!dialog.params.remote_caller_id_name){dialog.params.remote_caller_id_name="Nobody";}
|
|
||||||
if(!dialog.params.remote_caller_id_number){dialog.params.remote_caller_id_number="UNKNOWN";}
|
|
||||||
RTCcallbacks.onMessage=function(rtc,msg){console.debug(msg);};RTCcallbacks.onAnswerSDP=function(rtc,sdp){console.error("answer sdp",sdp);};}else{dialog.params.remote_caller_id_name="Outbound Call";dialog.params.remote_caller_id_number=dialog.params.destination_number;}
|
|
||||||
RTCcallbacks.onICESDP=function(rtc){console.log("RECV "+rtc.type+" SDP",rtc.mediaData.SDP);if(dialog.state==$.verto.enum.state.requesting||dialog.state==$.verto.enum.state.answering||dialog.state==$.verto.enum.state.active){location.reload();return;}
|
|
||||||
if(rtc.type=="offer"){if(dialog.state==$.verto.enum.state.active){dialog.setState($.verto.enum.state.requesting);dialog.sendMethod("verto.attach",{sdp:rtc.mediaData.SDP});}else{dialog.setState($.verto.enum.state.requesting);dialog.sendMethod("verto.invite",{sdp:rtc.mediaData.SDP});}}else{dialog.setState($.verto.enum.state.answering);dialog.sendMethod(dialog.attach?"verto.attach":"verto.answer",{sdp:dialog.rtc.mediaData.SDP});}};RTCcallbacks.onICE=function(rtc){if(rtc.type=="offer"){console.log("offer",rtc.mediaData.candidate);return;}};RTCcallbacks.onStream=function(rtc,stream){if(dialog.callbacks.permissionCallback&&typeof dialog.callbacks.permissionCallback.onGranted==='function'){dialog.callbacks.permissionCallback.onGranted(stream);}
|
|
||||||
else if(dialog.verto.options.permissionCallback&&typeof dialog.verto.options.permissionCallback.onGranted==='function'){dialog.verto.options.permissionCallback.onGranted(stream);}
|
|
||||||
console.log("stream started");};RTCcallbacks.onRemoteStream=function(rtc,stream){if(typeof dialog.callbacks.onRemoteStream==='function'){dialog.callbacks.onRemoteStream(stream,dialog);}
|
|
||||||
console.log("remote stream started");};RTCcallbacks.onError=function(e){if(dialog.callbacks.permissionCallback&&typeof dialog.callbacks.permissionCallback.onDenied==='function'){dialog.callbacks.permissionCallback.onDenied();}
|
|
||||||
else if(dialog.verto.options.permissionCallback&&typeof dialog.verto.options.permissionCallback.onDenied==='function'){dialog.verto.options.permissionCallback.onDenied();}
|
|
||||||
console.error("ERROR:",e);dialog.hangup({cause:"Device or Permission Error"});};dialog.rtc=new $.FSRTC({callbacks:RTCcallbacks,localVideo:dialog.screenShare?null:dialog.localVideo,useVideo:dialog.params.useVideo?dialog.videoStream:null,useAudio:dialog.audioStream,useStereo:dialog.params.useStereo,videoParams:dialog.params.videoParams,audioParams:verto.options.audioParams,iceServers:verto.options.iceServers,screenShare:dialog.screenShare,useCamera:dialog.useCamera,useCameraLabel:dialog.useCameraLabel,useMic:dialog.useMic,useMicLabel:dialog.useMicLabel,useSpeak:dialog.useSpeak,turnServer:verto.options.turnServer,useStream:dialog.params.useStream});dialog.rtc.verto=dialog.verto;if(dialog.direction==$.verto.enum.direction.inbound){if(dialog.attach){dialog.answer();}else{dialog.ring();}}};$.verto.dialog.prototype.invite=function(){var dialog=this;dialog.rtc.call();};$.verto.dialog.prototype.sendMethod=function(method,obj){var dialog=this;obj.dialogParams={};for(var i in dialog.params){if(i=="sdp"&&method!="verto.invite"&&method!="verto.attach"){continue;}
|
|
||||||
if((obj.noDialogParams&&i!="callID")){continue;}
|
|
||||||
obj.dialogParams[i]=dialog.params[i];}
|
|
||||||
delete obj.noDialogParams;dialog.verto.rpcClient.call(method,obj,function(e){dialog.processReply(method,true,e);},function(e){dialog.processReply(method,false,e);});};function checkStateChange(oldS,newS){if(newS==$.verto.enum.state.purge||$.verto.enum.states[oldS.name][newS.name]){return true;}
|
|
||||||
return false;}
|
|
||||||
function find_name(id){for(var i in $.verto.audioOutDevices){var source=$.verto.audioOutDevices[i];if(source.id===id){return(source.label);}}
|
|
||||||
return id;}
|
|
||||||
$.verto.dialog.prototype.setAudioPlaybackDevice=function(sinkId,callback,arg){var dialog=this;var element=dialog.audioStream;if(typeof element.sinkId!=='undefined'){var devname=find_name(sinkId);console.info("Dialog: "+dialog.callID+" Setting speaker:",element,devname);element.setSinkId(sinkId).then(function(){console.log("Dialog: "+dialog.callID+' Success, audio output device attached: '+sinkId);if(callback){callback(true,devname,arg);}}).catch(function(error){var errorMessage=error;if(error.name==='SecurityError'){errorMessage="Dialog: "+dialog.callID+' You need to use HTTPS for selecting audio output '+'device: '+error;}
|
|
||||||
if(callback){callback(false,null,arg);}
|
|
||||||
console.error(errorMessage);});}else{console.warn("Dialog: "+dialog.callID+' Browser does not support output device selection.');if(callback){callback(false,null,arg);}}}
|
|
||||||
$.verto.dialog.prototype.setState=function(state){var dialog=this;if(dialog.state==$.verto.enum.state.ringing){dialog.stopRinging();}
|
|
||||||
if(dialog.state==state||!checkStateChange(dialog.state,state)){console.error("Dialog "+dialog.callID+": INVALID state change from "+dialog.state.name+" to "+state.name);dialog.hangup();return false;}
|
|
||||||
console.log("Dialog "+dialog.callID+": state change from "+dialog.state.name+" to "+state.name);dialog.lastState=dialog.state;dialog.state=state;if(dialog.callbacks.onDialogState){dialog.callbacks.onDialogState(this);}
|
|
||||||
switch(dialog.state){case $.verto.enum.state.early:case $.verto.enum.state.active:var speaker=dialog.useSpeak;console.info("Using Speaker: ",speaker);if(speaker&&speaker!=="any"&&speaker!=="none"){setTimeout(function(){dialog.setAudioPlaybackDevice(speaker);},500);}
|
|
||||||
break;case $.verto.enum.state.trying:setTimeout(function(){if(dialog.state==$.verto.enum.state.trying){dialog.setState($.verto.enum.state.hangup);}},30000);break;case $.verto.enum.state.purge:dialog.setState($.verto.enum.state.destroy);break;case $.verto.enum.state.hangup:if(dialog.lastState.val>$.verto.enum.state.requesting.val&&dialog.lastState.val<$.verto.enum.state.hangup.val){dialog.sendMethod("verto.bye",{});}
|
|
||||||
dialog.setState($.verto.enum.state.destroy);break;case $.verto.enum.state.destroy:if(typeof(dialog.verto.options.tag)==="function"){$('#'+dialog.params.tag).remove();}
|
|
||||||
delete dialog.verto.dialogs[dialog.callID];if(dialog.params.screenShare){dialog.rtc.stopPeer();}else{dialog.rtc.stop();}
|
|
||||||
break;}
|
|
||||||
return true;};$.verto.dialog.prototype.processReply=function(method,success,e){var dialog=this;switch(method){case"verto.answer":case"verto.attach":if(success){dialog.setState($.verto.enum.state.active);}else{dialog.hangup();}
|
|
||||||
break;case"verto.invite":if(success){dialog.setState($.verto.enum.state.trying);}else{dialog.setState($.verto.enum.state.destroy);}
|
|
||||||
break;case"verto.bye":dialog.hangup();break;case"verto.modify":if(e.holdState){if(e.holdState=="held"){if(dialog.state!=$.verto.enum.state.held){dialog.setState($.verto.enum.state.held);}}else if(e.holdState=="active"){if(dialog.state!=$.verto.enum.state.active){dialog.setState($.verto.enum.state.active);}}}
|
|
||||||
if(success){}
|
|
||||||
break;default:break;}};$.verto.dialog.prototype.hangup=function(params){var dialog=this;if(params){if(params.causeCode){dialog.causeCode=params.causeCode;}
|
|
||||||
if(params.cause){dialog.cause=params.cause;}}
|
|
||||||
if(!dialog.cause&&!dialog.causeCode){dialog.cause="NORMAL_CLEARING";}
|
|
||||||
if(dialog.state.val>=$.verto.enum.state.new.val&&dialog.state.val<$.verto.enum.state.hangup.val){dialog.setState($.verto.enum.state.hangup);}else if(dialog.state.val<$.verto.enum.state.destroy){dialog.setState($.verto.enum.state.destroy);}};$.verto.dialog.prototype.stopRinging=function(){var dialog=this;if(dialog.verto.ringer){dialog.verto.ringer.stop();}};$.verto.dialog.prototype.indicateRing=function(){var dialog=this;if(dialog.verto.ringer){dialog.verto.ringer.attr("src",dialog.verto.options.ringFile)[0].play();setTimeout(function(){dialog.stopRinging();if(dialog.state==$.verto.enum.state.ringing){dialog.indicateRing();}},dialog.verto.options.ringSleep);}};$.verto.dialog.prototype.ring=function(){var dialog=this;dialog.setState($.verto.enum.state.ringing);dialog.indicateRing();};$.verto.dialog.prototype.useVideo=function(on){var dialog=this;dialog.params.useVideo=on;if(on){dialog.videoStream=dialog.audioStream;}else{dialog.videoStream=null;}
|
|
||||||
dialog.rtc.useVideo(dialog.videoStream,dialog.localVideo);};$.verto.dialog.prototype.setMute=function(what){var dialog=this;return dialog.rtc.setMute(what);};$.verto.dialog.prototype.getMute=function(){var dialog=this;return dialog.rtc.getMute();};$.verto.dialog.prototype.setVideoMute=function(what){var dialog=this;return dialog.rtc.setVideoMute(what);};$.verto.dialog.prototype.getVideoMute=function(){var dialog=this;return dialog.rtc.getVideoMute();};$.verto.dialog.prototype.useStereo=function(on){var dialog=this;dialog.params.useStereo=on;dialog.rtc.useStereo(on);};$.verto.dialog.prototype.dtmf=function(digits){var dialog=this;if(digits){dialog.sendMethod("verto.info",{dtmf:digits});}};$.verto.dialog.prototype.rtt=function(obj){var dialog=this;var pobj={};if(!obj){return false;}
|
|
||||||
pobj.code=obj.code;pobj.chars=obj.chars;if(pobj.chars||pobj.code){dialog.sendMethod("verto.info",{txt:obj,noDialogParams:true});}};$.verto.dialog.prototype.transfer=function(dest,params){var dialog=this;if(dest){dialog.sendMethod("verto.modify",{action:"transfer",destination:dest,params:params});}};$.verto.dialog.prototype.replace=function(replaceCallID,params){var dialog=this;if(replaceCallID){dialog.sendMethod("verto.modify",{action:"replace",replaceCallID:replaceCallID,params:params});}};$.verto.dialog.prototype.hold=function(params){var dialog=this;dialog.sendMethod("verto.modify",{action:"hold",params:params});};$.verto.dialog.prototype.unhold=function(params){var dialog=this;dialog.sendMethod("verto.modify",{action:"unhold",params:params});};$.verto.dialog.prototype.toggleHold=function(params){var dialog=this;dialog.sendMethod("verto.modify",{action:"toggleHold",params:params});};$.verto.dialog.prototype.message=function(msg){var dialog=this;var err=0;msg.from=dialog.params.login;if(!msg.to){console.error("Missing To");err++;}
|
|
||||||
if(!msg.body){console.error("Missing Body");err++;}
|
|
||||||
if(err){return false;}
|
|
||||||
dialog.sendMethod("verto.info",{msg:msg});return true;};$.verto.dialog.prototype.answer=function(params){var dialog=this;if(!dialog.answered){if(!params){params={};}
|
|
||||||
params.sdp=dialog.params.sdp;if(params){if(params.useVideo){dialog.useVideo(true);}
|
|
||||||
dialog.params.callee_id_name=params.callee_id_name;dialog.params.callee_id_number=params.callee_id_number;if(params.useCamera){dialog.useCamera=params.useCamera;dialog.useCameraLabel=params.useCameraLabel;}
|
|
||||||
if(params.useMic){dialog.useMic=params.useMic;dialog.useMic=params.useMicLabel;}
|
|
||||||
if(params.useSpeak){dialog.useSpeak=params.useSpeak;}}
|
|
||||||
dialog.rtc.createAnswer(params);dialog.answered=true;}};$.verto.dialog.prototype.handleAnswer=function(params){var dialog=this;dialog.gotAnswer=true;if(dialog.state.val>=$.verto.enum.state.active.val){return;}
|
|
||||||
if(dialog.state.val>=$.verto.enum.state.early.val){dialog.setState($.verto.enum.state.active);}else{if(dialog.gotEarly){console.log("Dialog "+dialog.callID+" Got answer while still establishing early media, delaying...");}else{console.log("Dialog "+dialog.callID+" Answering Channel");dialog.rtc.answer(params.sdp,function(){dialog.setState($.verto.enum.state.active);},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"ANSWER SDP",params.sdp);}}};$.verto.dialog.prototype.cidString=function(enc){var dialog=this;var party=dialog.params.remote_caller_id_name+(enc?" <":" <")+dialog.params.remote_caller_id_number+(enc?">":">");return party;};$.verto.dialog.prototype.sendMessage=function(msg,params){var dialog=this;if(dialog.callbacks.onMessage){dialog.callbacks.onMessage(dialog.verto,dialog,msg,params);}};$.verto.dialog.prototype.handleInfo=function(params){var dialog=this;dialog.sendMessage($.verto.enum.message.info,params);};$.verto.dialog.prototype.handleDisplay=function(params){var dialog=this;if(params.display_name){dialog.params.remote_caller_id_name=params.display_name;}
|
|
||||||
if(params.display_number){dialog.params.remote_caller_id_number=params.display_number;}
|
|
||||||
dialog.sendMessage($.verto.enum.message.display,{});};$.verto.dialog.prototype.handleMedia=function(params){var dialog=this;if(dialog.state.val>=$.verto.enum.state.early.val){return;}
|
|
||||||
dialog.gotEarly=true;dialog.rtc.answer(params.sdp,function(){console.log("Dialog "+dialog.callID+"Establishing early media");dialog.setState($.verto.enum.state.early);if(dialog.gotAnswer){console.log("Dialog "+dialog.callID+"Answering Channel");dialog.setState($.verto.enum.state.active);}},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"EARLY SDP",params.sdp);};$.verto.ENUM=function(s){var i=0,o={};s.split(" ").map(function(x){o[x]={name:x,val:i++};});return Object.freeze(o);};$.verto.enum={};$.verto.enum.states=Object.freeze({new:{requesting:1,recovering:1,ringing:1,destroy:1,answering:1,hangup:1},requesting:{trying:1,hangup:1,active:1},recovering:{answering:1,hangup:1},trying:{active:1,early:1,hangup:1},ringing:{answering:1,hangup:1},answering:{active:1,hangup:1},active:{answering:1,requesting:1,hangup:1,held:1},held:{hangup:1,active:1},early:{hangup:1,active:1},hangup:{destroy:1},destroy:{},purge:{destroy:1}});$.verto.enum.state=$.verto.ENUM("new requesting trying recovering ringing answering early active held hangup destroy purge");$.verto.enum.direction=$.verto.ENUM("inbound outbound");$.verto.enum.message=$.verto.ENUM("display info pvtEvent clientReady");$.verto.enum=Object.freeze($.verto.enum);$.verto.saved=[];$.verto.unloadJobs=[];var unloadEventName='beforeunload';var iOS=['iPad','iPhone','iPod'].indexOf(navigator.platform)>=0;if(iOS){unloadEventName='pagehide';}
|
|
||||||
$(window).bind(unloadEventName,function(){for(var f in $.verto.unloadJobs){$.verto.unloadJobs[f]();}
|
|
||||||
if($.verto.haltClosure)
|
|
||||||
return $.verto.haltClosure();for(var i in $.verto.saved){var verto=$.verto.saved[i];if(verto){verto.purge();verto.logout();}}
|
|
||||||
return $.verto.warnOnUnload;});$.verto.videoDevices=[];$.verto.audioInDevices=[];$.verto.audioOutDevices=[];var checkDevices=function(runtime){console.info("enumerating devices");var aud_in=[],aud_out=[],vid=[];var has_video=0,has_audio=0;var Xstream;function gotDevices(deviceInfos){for(var i=0;i!==deviceInfos.length;++i){var deviceInfo=deviceInfos[i];var text="";console.log(deviceInfo);console.log(deviceInfo.kind+": "+deviceInfo.label+" id = "+deviceInfo.deviceId);if(deviceInfo.kind==='audioinput'){text=deviceInfo.label||'microphone '+(aud_in.length+1);aud_in.push({id:deviceInfo.deviceId,kind:"audio_in",label:text});}else if(deviceInfo.kind==='audiooutput'){text=deviceInfo.label||'speaker '+(aud_out.length+1);aud_out.push({id:deviceInfo.deviceId,kind:"audio_out",label:text});}else if(deviceInfo.kind==='videoinput'){text=deviceInfo.label||'camera '+(vid.length+1);vid.push({id:deviceInfo.deviceId,kind:"video",label:text});}else{console.log('Some other kind of source/device: ',deviceInfo);}}
|
|
||||||
$.verto.videoDevices=vid;$.verto.audioInDevices=aud_in;$.verto.audioOutDevices=aud_out;console.info("Audio IN Devices",$.verto.audioInDevices);console.info("Audio Out Devices",$.verto.audioOutDevices);console.info("Video Devices",$.verto.videoDevices);if(Xstream){Xstream.getTracks().forEach(function(track){track.stop();});}
|
|
||||||
if(runtime){runtime(true);}}
|
|
||||||
function handleError(error){console.log('device enumeration error: ',error);if(runtime)runtime(false);}
|
|
||||||
function checkTypes(devs){for(var i=0;i!==devs.length;++i){if(devs[i].kind==='audioinput'){has_audio++;}else if(devs[i].kind==='videoinput'){has_video++;}}
|
|
||||||
navigator.mediaDevices.getUserMedia({audio:(has_audio>0?true:false),video:(has_video>0?true:false)}).then(function(stream){Xstream=stream;navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(handleError);}).catch(function(err){console.log("The following error occurred: "+err.name);});}
|
|
||||||
navigator.mediaDevices.enumerateDevices().then(checkTypes).catch(handleError);};$.verto.refreshDevices=function(runtime){checkDevices(runtime);}
|
|
||||||
$.verto.init=function(obj,runtime){if(!obj){obj={};}
|
|
||||||
if(!obj.skipPermCheck&&!obj.skipDeviceCheck){$.FSRTC.checkPerms(function(status){checkDevices(runtime);},true,true);}else if(obj.skipPermCheck&&!obj.skipDeviceCheck){checkDevices(runtime);}else if(!obj.skipPermCheck&&obj.skipDeviceCheck){$.FSRTC.checkPerms(function(status){runtime(status);},true,true);}else{runtime(null);}}
|
|
||||||
$.verto.genUUID=function(){return generateGUID();}})(jQuery);(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.adapter=f()}})(function(){var define,module,exports;return(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){'use strict';var _adapter_factory=require('./adapter_factory.js');var adapter=(0,_adapter_factory.adapterFactory)({window:window});module.exports=adapter;},{"./adapter_factory.js":2}],2:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.adapterFactory=adapterFactory;var _utils=require('./utils');var utils=_interopRequireWildcard(_utils);var _chrome_shim=require('./chrome/chrome_shim');var chromeShim=_interopRequireWildcard(_chrome_shim);var _edge_shim=require('./edge/edge_shim');var edgeShim=_interopRequireWildcard(_edge_shim);var _firefox_shim=require('./firefox/firefox_shim');var firefoxShim=_interopRequireWildcard(_firefox_shim);var _safari_shim=require('./safari/safari_shim');var safariShim=_interopRequireWildcard(_safari_shim);var _common_shim=require('./common_shim');var commonShim=_interopRequireWildcard(_common_shim);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function adapterFactory(){var _ref=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},window=_ref.window;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{shimChrome:true,shimFirefox:true,shimEdge:true,shimSafari:true};var logging=utils.log;var browserDetails=utils.detectBrowser(window);var adapter={browserDetails:browserDetails,commonShim:commonShim,extractVersion:utils.extractVersion,disableLog:utils.disableLog,disableWarnings:utils.disableWarnings};switch(browserDetails.browser){case'chrome':if(!chromeShim||!chromeShim.shimPeerConnection||!options.shimChrome){logging('Chrome shim is not included in this adapter release.');return adapter;}
|
|
||||||
logging('adapter.js shimming chrome.');adapter.browserShim=chromeShim;chromeShim.shimGetUserMedia(window);chromeShim.shimMediaStream(window);chromeShim.shimPeerConnection(window);chromeShim.shimOnTrack(window);chromeShim.shimAddTrackRemoveTrack(window);chromeShim.shimGetSendersWithDtmf(window);chromeShim.shimSenderReceiverGetStats(window);chromeShim.fixNegotiationNeeded(window);commonShim.shimRTCIceCandidate(window);commonShim.shimConnectionState(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);commonShim.removeAllowExtmapMixed(window);break;case'firefox':if(!firefoxShim||!firefoxShim.shimPeerConnection||!options.shimFirefox){logging('Firefox shim is not included in this adapter release.');return adapter;}
|
|
||||||
logging('adapter.js shimming firefox.');adapter.browserShim=firefoxShim;firefoxShim.shimGetUserMedia(window);firefoxShim.shimPeerConnection(window);firefoxShim.shimOnTrack(window);firefoxShim.shimRemoveStream(window);firefoxShim.shimSenderGetStats(window);firefoxShim.shimReceiverGetStats(window);firefoxShim.shimRTCDataChannel(window);commonShim.shimRTCIceCandidate(window);commonShim.shimConnectionState(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);break;case'edge':if(!edgeShim||!edgeShim.shimPeerConnection||!options.shimEdge){logging('MS edge shim is not included in this adapter release.');return adapter;}
|
|
||||||
logging('adapter.js shimming edge.');adapter.browserShim=edgeShim;edgeShim.shimGetUserMedia(window);edgeShim.shimGetDisplayMedia(window);edgeShim.shimPeerConnection(window);edgeShim.shimReplaceTrack(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);break;case'safari':if(!safariShim||!options.shimSafari){logging('Safari shim is not included in this adapter release.');return adapter;}
|
|
||||||
logging('adapter.js shimming safari.');adapter.browserShim=safariShim;safariShim.shimRTCIceServerUrls(window);safariShim.shimCreateOfferLegacy(window);safariShim.shimCallbacksAPI(window);safariShim.shimLocalStreamsAPI(window);safariShim.shimRemoteStreamsAPI(window);safariShim.shimTrackEventTransceiver(window);safariShim.shimGetUserMedia(window);commonShim.shimRTCIceCandidate(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);commonShim.removeAllowExtmapMixed(window);break;default:logging('Unsupported browser!');break;}
|
|
||||||
return adapter;}},{"./chrome/chrome_shim":3,"./common_shim":6,"./edge/edge_shim":7,"./firefox/firefox_shim":11,"./safari/safari_shim":14,"./utils":15}],3:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetDisplayMedia=exports.shimGetUserMedia=undefined;var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};var _getusermedia=require('./getusermedia');Object.defineProperty(exports,'shimGetUserMedia',{enumerable:true,get:function get(){return _getusermedia.shimGetUserMedia;}});var _getdisplaymedia=require('./getdisplaymedia');Object.defineProperty(exports,'shimGetDisplayMedia',{enumerable:true,get:function get(){return _getdisplaymedia.shimGetDisplayMedia;}});exports.shimMediaStream=shimMediaStream;exports.shimOnTrack=shimOnTrack;exports.shimGetSendersWithDtmf=shimGetSendersWithDtmf;exports.shimSenderReceiverGetStats=shimSenderReceiverGetStats;exports.shimAddTrackRemoveTrackWithNative=shimAddTrackRemoveTrackWithNative;exports.shimAddTrackRemoveTrack=shimAddTrackRemoveTrack;exports.shimPeerConnection=shimPeerConnection;exports.fixNegotiationNeeded=fixNegotiationNeeded;var _utils=require('../utils.js');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function walkStats(stats,base,resultSet){if(!base||resultSet.has(base.id)){return;}
|
|
||||||
resultSet.set(base.id,base);Object.keys(base).forEach(function(name){if(name.endsWith('Id')){walkStats(stats,stats.get(base[name]),resultSet);}else if(name.endsWith('Ids')){base[name].forEach(function(id){walkStats(stats,stats.get(id),resultSet);});}});}
|
|
||||||
function filterStats(result,track,outbound){var streamStatsType=outbound?'outbound-rtp':'inbound-rtp';var filteredResult=new Map();if(track===null){return filteredResult;}
|
|
||||||
var trackStats=[];result.forEach(function(value){if(value.type==='track'&&value.trackIdentifier===track.id){trackStats.push(value);}});trackStats.forEach(function(trackStat){result.forEach(function(stats){if(stats.type===streamStatsType&&stats.trackId===trackStat.id){walkStats(result,stats,filteredResult);}});});return filteredResult;}
|
|
||||||
function shimMediaStream(window){window.MediaStream=window.MediaStream||window.webkitMediaStream;}
|
|
||||||
function shimOnTrack(window){if((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&!('ontrack'in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,'ontrack',{get:function get(){return this._ontrack;},set:function set(f){if(this._ontrack){this.removeEventListener('track',this._ontrack);}
|
|
||||||
this.addEventListener('track',this._ontrack=f);},enumerable:true,configurable:true});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var _this=this;if(!this._ontrackpoly){this._ontrackpoly=function(e){e.stream.addEventListener('addtrack',function(te){var receiver=void 0;if(window.RTCPeerConnection.prototype.getReceivers){receiver=_this.getReceivers().find(function(r){return r.track&&r.track.id===te.track.id;});}else{receiver={track:te.track};}
|
|
||||||
var event=new Event('track');event.track=te.track;event.receiver=receiver;event.transceiver={receiver:receiver};event.streams=[e.stream];_this.dispatchEvent(event);});e.stream.getTracks().forEach(function(track){var receiver=void 0;if(window.RTCPeerConnection.prototype.getReceivers){receiver=_this.getReceivers().find(function(r){return r.track&&r.track.id===track.id;});}else{receiver={track:track};}
|
|
||||||
var event=new Event('track');event.track=track;event.receiver=receiver;event.transceiver={receiver:receiver};event.streams=[e.stream];_this.dispatchEvent(event);});};this.addEventListener('addstream',this._ontrackpoly);}
|
|
||||||
return origSetRemoteDescription.apply(this,arguments);};}else{utils.wrapPeerConnectionEvent(window,'track',function(e){if(!e.transceiver){Object.defineProperty(e,'transceiver',{value:{receiver:e.receiver}});}
|
|
||||||
return e;});}}
|
|
||||||
function shimGetSendersWithDtmf(window){if((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&!('getSenders'in window.RTCPeerConnection.prototype)&&'createDTMFSender'in window.RTCPeerConnection.prototype){var shimSenderWithDtmf=function shimSenderWithDtmf(pc,track){return{track:track,get dtmf(){if(this._dtmf===undefined){if(track.kind==='audio'){this._dtmf=pc.createDTMFSender(track);}else{this._dtmf=null;}}
|
|
||||||
return this._dtmf;},_pc:pc};};if(!window.RTCPeerConnection.prototype.getSenders){window.RTCPeerConnection.prototype.getSenders=function(){this._senders=this._senders||[];return this._senders.slice();};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){var sender=origAddTrack.apply(this,arguments);if(!sender){sender=shimSenderWithDtmf(this,track);this._senders.push(sender);}
|
|
||||||
return sender;};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){origRemoveTrack.apply(this,arguments);var idx=this._senders.indexOf(sender);if(idx!==-1){this._senders.splice(idx,1);}};}
|
|
||||||
var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this2=this;this._senders=this._senders||[];origAddStream.apply(this,[stream]);stream.getTracks().forEach(function(track){_this2._senders.push(shimSenderWithDtmf(_this2,track));});};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){var _this3=this;this._senders=this._senders||[];origRemoveStream.apply(this,[stream]);stream.getTracks().forEach(function(track){var sender=_this3._senders.find(function(s){return s.track===track;});if(sender){_this3._senders.splice(_this3._senders.indexOf(sender),1);}});};}else if((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&'getSenders'in window.RTCPeerConnection.prototype&&'createDTMFSender'in window.RTCPeerConnection.prototype&&window.RTCRtpSender&&!('dtmf'in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;window.RTCPeerConnection.prototype.getSenders=function(){var _this4=this;var senders=origGetSenders.apply(this,[]);senders.forEach(function(sender){return sender._pc=_this4;});return senders;};Object.defineProperty(window.RTCRtpSender.prototype,'dtmf',{get:function get(){if(this._dtmf===undefined){if(this.track.kind==='audio'){this._dtmf=this._pc.createDTMFSender(this.track);}else{this._dtmf=null;}}
|
|
||||||
return this._dtmf;}});}}
|
|
||||||
function shimSenderReceiverGetStats(window){if(!((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&window.RTCRtpSender&&window.RTCRtpReceiver)){return;}
|
|
||||||
if(!('getStats'in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;if(origGetSenders){window.RTCPeerConnection.prototype.getSenders=function(){var _this5=this;var senders=origGetSenders.apply(this,[]);senders.forEach(function(sender){return sender._pc=_this5;});return senders;};}
|
|
||||||
var origAddTrack=window.RTCPeerConnection.prototype.addTrack;if(origAddTrack){window.RTCPeerConnection.prototype.addTrack=function(){var sender=origAddTrack.apply(this,arguments);sender._pc=this;return sender;};}
|
|
||||||
window.RTCRtpSender.prototype.getStats=function(){var sender=this;return this._pc.getStats().then(function(result){return(filterStats(result,sender.track,true));});};}
|
|
||||||
if(!('getStats'in window.RTCRtpReceiver.prototype)){var origGetReceivers=window.RTCPeerConnection.prototype.getReceivers;if(origGetReceivers){window.RTCPeerConnection.prototype.getReceivers=function(){var _this6=this;var receivers=origGetReceivers.apply(this,[]);receivers.forEach(function(receiver){return receiver._pc=_this6;});return receivers;};}
|
|
||||||
utils.wrapPeerConnectionEvent(window,'track',function(e){e.receiver._pc=e.srcElement;return e;});window.RTCRtpReceiver.prototype.getStats=function(){var receiver=this;return this._pc.getStats().then(function(result){return filterStats(result,receiver.track,false);});};}
|
|
||||||
if(!('getStats'in window.RTCRtpSender.prototype&&'getStats'in window.RTCRtpReceiver.prototype)){return;}
|
|
||||||
var origGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof window.MediaStreamTrack){var track=arguments[0];var sender=void 0;var receiver=void 0;var err=void 0;this.getSenders().forEach(function(s){if(s.track===track){if(sender){err=true;}else{sender=s;}}});this.getReceivers().forEach(function(r){if(r.track===track){if(receiver){err=true;}else{receiver=r;}}
|
|
||||||
return r.track===track;});if(err||sender&&receiver){return Promise.reject(new DOMException('There are more than one sender or receiver for the track.','InvalidAccessError'));}else if(sender){return sender.getStats();}else if(receiver){return receiver.getStats();}
|
|
||||||
return Promise.reject(new DOMException('There is no sender or receiver for the track.','InvalidAccessError'));}
|
|
||||||
return origGetStats.apply(this,arguments);};}
|
|
||||||
function shimAddTrackRemoveTrackWithNative(window){window.RTCPeerConnection.prototype.getLocalStreams=function(){var _this7=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{};return Object.keys(this._shimmedLocalStreams).map(function(streamId){return _this7._shimmedLocalStreams[streamId][0];});};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){if(!stream){return origAddTrack.apply(this,arguments);}
|
|
||||||
this._shimmedLocalStreams=this._shimmedLocalStreams||{};var sender=origAddTrack.apply(this,arguments);if(!this._shimmedLocalStreams[stream.id]){this._shimmedLocalStreams[stream.id]=[stream,sender];}else if(this._shimmedLocalStreams[stream.id].indexOf(sender)===-1){this._shimmedLocalStreams[stream.id].push(sender);}
|
|
||||||
return sender;};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this8=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{};stream.getTracks().forEach(function(track){var alreadyExists=_this8.getSenders().find(function(s){return s.track===track;});if(alreadyExists){throw new DOMException('Track already exists.','InvalidAccessError');}});var existingSenders=this.getSenders();origAddStream.apply(this,arguments);var newSenders=this.getSenders().filter(function(newSender){return existingSenders.indexOf(newSender)===-1;});this._shimmedLocalStreams[stream.id]=[stream].concat(newSenders);};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){this._shimmedLocalStreams=this._shimmedLocalStreams||{};delete this._shimmedLocalStreams[stream.id];return origRemoveStream.apply(this,arguments);};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){var _this9=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{};if(sender){Object.keys(this._shimmedLocalStreams).forEach(function(streamId){var idx=_this9._shimmedLocalStreams[streamId].indexOf(sender);if(idx!==-1){_this9._shimmedLocalStreams[streamId].splice(idx,1);}
|
|
||||||
if(_this9._shimmedLocalStreams[streamId].length===1){delete _this9._shimmedLocalStreams[streamId];}});}
|
|
||||||
return origRemoveTrack.apply(this,arguments);};}
|
|
||||||
function shimAddTrackRemoveTrack(window){if(!window.RTCPeerConnection){return;}
|
|
||||||
var browserDetails=utils.detectBrowser(window);if(window.RTCPeerConnection.prototype.addTrack&&browserDetails.version>=65){return shimAddTrackRemoveTrackWithNative(window);}
|
|
||||||
var origGetLocalStreams=window.RTCPeerConnection.prototype.getLocalStreams;window.RTCPeerConnection.prototype.getLocalStreams=function(){var _this10=this;var nativeStreams=origGetLocalStreams.apply(this);this._reverseStreams=this._reverseStreams||{};return nativeStreams.map(function(stream){return _this10._reverseStreams[stream.id];});};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this11=this;this._streams=this._streams||{};this._reverseStreams=this._reverseStreams||{};stream.getTracks().forEach(function(track){var alreadyExists=_this11.getSenders().find(function(s){return s.track===track;});if(alreadyExists){throw new DOMException('Track already exists.','InvalidAccessError');}});if(!this._reverseStreams[stream.id]){var newStream=new window.MediaStream(stream.getTracks());this._streams[stream.id]=newStream;this._reverseStreams[newStream.id]=stream;stream=newStream;}
|
|
||||||
origAddStream.apply(this,[stream]);};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){this._streams=this._streams||{};this._reverseStreams=this._reverseStreams||{};origRemoveStream.apply(this,[this._streams[stream.id]||stream]);delete this._reverseStreams[this._streams[stream.id]?this._streams[stream.id].id:stream.id];delete this._streams[stream.id];};window.RTCPeerConnection.prototype.addTrack=function(track,stream){var _this12=this;if(this.signalingState==='closed'){throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.','InvalidStateError');}
|
|
||||||
var streams=[].slice.call(arguments,1);if(streams.length!==1||!streams[0].getTracks().find(function(t){return t===track;})){throw new DOMException('The adapter.js addTrack polyfill only supports a single '+' stream which is associated with the specified track.','NotSupportedError');}
|
|
||||||
var alreadyExists=this.getSenders().find(function(s){return s.track===track;});if(alreadyExists){throw new DOMException('Track already exists.','InvalidAccessError');}
|
|
||||||
this._streams=this._streams||{};this._reverseStreams=this._reverseStreams||{};var oldStream=this._streams[stream.id];if(oldStream){oldStream.addTrack(track);Promise.resolve().then(function(){_this12.dispatchEvent(new Event('negotiationneeded'));});}else{var newStream=new window.MediaStream([track]);this._streams[stream.id]=newStream;this._reverseStreams[newStream.id]=stream;this.addStream(newStream);}
|
|
||||||
return this.getSenders().find(function(s){return s.track===track;});};function replaceInternalStreamId(pc,description){var sdp=description.sdp;Object.keys(pc._reverseStreams||[]).forEach(function(internalId){var externalStream=pc._reverseStreams[internalId];var internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(internalStream.id,'g'),externalStream.id);});return new RTCSessionDescription({type:description.type,sdp:sdp});}
|
|
||||||
function replaceExternalStreamId(pc,description){var sdp=description.sdp;Object.keys(pc._reverseStreams||[]).forEach(function(internalId){var externalStream=pc._reverseStreams[internalId];var internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(externalStream.id,'g'),internalStream.id);});return new RTCSessionDescription({type:description.type,sdp:sdp});}
|
|
||||||
['createOffer','createAnswer'].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){var _this13=this;var args=arguments;var isLegacyCall=arguments.length&&typeof arguments[0]==='function';if(isLegacyCall){return nativeMethod.apply(this,[function(description){var desc=replaceInternalStreamId(_this13,description);args[0].apply(null,[desc]);},function(err){if(args[1]){args[1].apply(null,err);}},arguments[2]]);}
|
|
||||||
return nativeMethod.apply(this,arguments).then(function(description){return replaceInternalStreamId(_this13,description);});};});var origSetLocalDescription=window.RTCPeerConnection.prototype.setLocalDescription;window.RTCPeerConnection.prototype.setLocalDescription=function(){if(!arguments.length||!arguments[0].type){return origSetLocalDescription.apply(this,arguments);}
|
|
||||||
arguments[0]=replaceExternalStreamId(this,arguments[0]);return origSetLocalDescription.apply(this,arguments);};var origLocalDescription=Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype,'localDescription');Object.defineProperty(window.RTCPeerConnection.prototype,'localDescription',{get:function get(){var description=origLocalDescription.get.apply(this);if(description.type===''){return description;}
|
|
||||||
return replaceInternalStreamId(this,description);}});window.RTCPeerConnection.prototype.removeTrack=function(sender){var _this14=this;if(this.signalingState==='closed'){throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.','InvalidStateError');}
|
|
||||||
if(!sender._pc){throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack '+'does not implement interface RTCRtpSender.','TypeError');}
|
|
||||||
var isLocal=sender._pc===this;if(!isLocal){throw new DOMException('Sender was not created by this connection.','InvalidAccessError');}
|
|
||||||
this._streams=this._streams||{};var stream=void 0;Object.keys(this._streams).forEach(function(streamid){var hasTrack=_this14._streams[streamid].getTracks().find(function(track){return sender.track===track;});if(hasTrack){stream=_this14._streams[streamid];}});if(stream){if(stream.getTracks().length===1){this.removeStream(this._reverseStreams[stream.id]);}else{stream.removeTrack(sender.track);}
|
|
||||||
this.dispatchEvent(new Event('negotiationneeded'));}};}
|
|
||||||
function shimPeerConnection(window){if(!window.RTCPeerConnection&&window.webkitRTCPeerConnection){window.RTCPeerConnection=window.webkitRTCPeerConnection;}
|
|
||||||
if(!window.RTCPeerConnection){return;}
|
|
||||||
var origGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(selector,successCallback,errorCallback){var _this15=this;var args=arguments;if(arguments.length>0&&typeof selector==='function'){return origGetStats.apply(this,arguments);}
|
|
||||||
if(origGetStats.length===0&&(arguments.length===0||typeof arguments[0]!=='function')){return origGetStats.apply(this,[]);}
|
|
||||||
var fixChromeStats_=function fixChromeStats_(response){var standardReport={};var reports=response.result();reports.forEach(function(report){var standardStats={id:report.id,timestamp:report.timestamp,type:{localcandidate:'local-candidate',remotecandidate:'remote-candidate'}[report.type]||report.type};report.names().forEach(function(name){standardStats[name]=report.stat(name);});standardReport[standardStats.id]=standardStats;});return standardReport;};var makeMapStats=function makeMapStats(stats){return new Map(Object.keys(stats).map(function(key){return[key,stats[key]];}));};if(arguments.length>=2){var successCallbackWrapper_=function successCallbackWrapper_(response){args[1](makeMapStats(fixChromeStats_(response)));};return origGetStats.apply(this,[successCallbackWrapper_,arguments[0]]);}
|
|
||||||
return new Promise(function(resolve,reject){origGetStats.apply(_this15,[function(response){resolve(makeMapStats(fixChromeStats_(response)));},reject]);}).then(successCallback,errorCallback);};['setLocalDescription','setRemoteDescription','addIceCandidate'].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){arguments[0]=new(method==='addIceCandidate'?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]);return nativeMethod.apply(this,arguments);};});var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){if(!arguments[0]){if(arguments[1]){arguments[1].apply(null);}
|
|
||||||
return Promise.resolve();}
|
|
||||||
return nativeAddIceCandidate.apply(this,arguments);};}
|
|
||||||
function fixNegotiationNeeded(window){utils.wrapPeerConnectionEvent(window,'negotiationneeded',function(e){var pc=e.target;if(pc.signalingState!=='stable'){return;}
|
|
||||||
return e;});}},{"../utils.js":15,"./getdisplaymedia":4,"./getusermedia":5}],4:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetDisplayMedia=shimGetDisplayMedia;function shimGetDisplayMedia(window,getSourceId){if(window.navigator.mediaDevices&&'getDisplayMedia'in window.navigator.mediaDevices){return;}
|
|
||||||
if(!window.navigator.mediaDevices){return;}
|
|
||||||
if(typeof getSourceId!=='function'){console.error('shimGetDisplayMedia: getSourceId argument is not '+'a function');return;}
|
|
||||||
window.navigator.mediaDevices.getDisplayMedia=function(constraints){return getSourceId(constraints).then(function(sourceId){var widthSpecified=constraints.video&&constraints.video.width;var heightSpecified=constraints.video&&constraints.video.height;var frameRateSpecified=constraints.video&&constraints.video.frameRate;constraints.video={mandatory:{chromeMediaSource:'desktop',chromeMediaSourceId:sourceId,maxFrameRate:frameRateSpecified||3}};if(widthSpecified){constraints.video.mandatory.maxWidth=widthSpecified;}
|
|
||||||
if(heightSpecified){constraints.video.mandatory.maxHeight=heightSpecified;}
|
|
||||||
return window.navigator.mediaDevices.getUserMedia(constraints);});};}},{}],5:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};exports.shimGetUserMedia=shimGetUserMedia;var _utils=require('../utils.js');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
var logging=utils.log;function shimGetUserMedia(window){var navigator=window&&window.navigator;if(!navigator.mediaDevices){return;}
|
|
||||||
var browserDetails=utils.detectBrowser(window);var constraintsToChrome_=function constraintsToChrome_(c){if((typeof c==='undefined'?'undefined':_typeof(c))!=='object'||c.mandatory||c.optional){return c;}
|
|
||||||
var cc={};Object.keys(c).forEach(function(key){if(key==='require'||key==='advanced'||key==='mediaSource'){return;}
|
|
||||||
var r=_typeof(c[key])==='object'?c[key]:{ideal:c[key]};if(r.exact!==undefined&&typeof r.exact==='number'){r.min=r.max=r.exact;}
|
|
||||||
var oldname_=function oldname_(prefix,name){if(prefix){return prefix+name.charAt(0).toUpperCase()+name.slice(1);}
|
|
||||||
return name==='deviceId'?'sourceId':name;};if(r.ideal!==undefined){cc.optional=cc.optional||[];var oc={};if(typeof r.ideal==='number'){oc[oldname_('min',key)]=r.ideal;cc.optional.push(oc);oc={};oc[oldname_('max',key)]=r.ideal;cc.optional.push(oc);}else{oc[oldname_('',key)]=r.ideal;cc.optional.push(oc);}}
|
|
||||||
if(r.exact!==undefined&&typeof r.exact!=='number'){cc.mandatory=cc.mandatory||{};cc.mandatory[oldname_('',key)]=r.exact;}else{['min','max'].forEach(function(mix){if(r[mix]!==undefined){cc.mandatory=cc.mandatory||{};cc.mandatory[oldname_(mix,key)]=r[mix];}});}});if(c.advanced){cc.optional=(cc.optional||[]).concat(c.advanced);}
|
|
||||||
return cc;};var shimConstraints_=function shimConstraints_(constraints,func){if(browserDetails.version>=61){return func(constraints);}
|
|
||||||
constraints=JSON.parse(JSON.stringify(constraints));if(constraints&&_typeof(constraints.audio)==='object'){var remap=function remap(obj,a,b){if(a in obj&&!(b in obj)){obj[b]=obj[a];delete obj[a];}};constraints=JSON.parse(JSON.stringify(constraints));remap(constraints.audio,'autoGainControl','googAutoGainControl');remap(constraints.audio,'noiseSuppression','googNoiseSuppression');constraints.audio=constraintsToChrome_(constraints.audio);}
|
|
||||||
if(constraints&&_typeof(constraints.video)==='object'){var face=constraints.video.facingMode;face=face&&((typeof face==='undefined'?'undefined':_typeof(face))==='object'?face:{ideal:face});var getSupportedFacingModeLies=browserDetails.version<66;if(face&&(face.exact==='user'||face.exact==='environment'||face.ideal==='user'||face.ideal==='environment')&&!(navigator.mediaDevices.getSupportedConstraints&&navigator.mediaDevices.getSupportedConstraints().facingMode&&!getSupportedFacingModeLies)){delete constraints.video.facingMode;var matches=void 0;if(face.exact==='environment'||face.ideal==='environment'){matches=['back','rear'];}else if(face.exact==='user'||face.ideal==='user'){matches=['front'];}
|
|
||||||
if(matches){return navigator.mediaDevices.enumerateDevices().then(function(devices){devices=devices.filter(function(d){return d.kind==='videoinput';});var dev=devices.find(function(d){return matches.some(function(match){return d.label.toLowerCase().includes(match);});});if(!dev&&devices.length&&matches.includes('back')){dev=devices[devices.length-1];}
|
|
||||||
if(dev){constraints.video.deviceId=face.exact?{exact:dev.deviceId}:{ideal:dev.deviceId};}
|
|
||||||
constraints.video=constraintsToChrome_(constraints.video);logging('chrome: '+JSON.stringify(constraints));return func(constraints);});}}
|
|
||||||
constraints.video=constraintsToChrome_(constraints.video);}
|
|
||||||
logging('chrome: '+JSON.stringify(constraints));return func(constraints);};var shimError_=function shimError_(e){if(browserDetails.version>=64){return e;}
|
|
||||||
return{name:{PermissionDeniedError:'NotAllowedError',PermissionDismissedError:'NotAllowedError',InvalidStateError:'NotAllowedError',DevicesNotFoundError:'NotFoundError',ConstraintNotSatisfiedError:'OverconstrainedError',TrackStartError:'NotReadableError',MediaDeviceFailedDueToShutdown:'NotAllowedError',MediaDeviceKillSwitchOn:'NotAllowedError',TabCaptureError:'AbortError',ScreenCaptureError:'AbortError',DeviceCaptureError:'AbortError'}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function toString(){return this.name+(this.message&&': ')+this.message;}};};var getUserMedia_=function getUserMedia_(constraints,onSuccess,onError){shimConstraints_(constraints,function(c){navigator.webkitGetUserMedia(c,onSuccess,function(e){if(onError){onError(shimError_(e));}});});};navigator.getUserMedia=getUserMedia_.bind(navigator);var origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(cs){return shimConstraints_(cs,function(c){return origGetUserMedia(c).then(function(stream){if(c.audio&&!stream.getAudioTracks().length||c.video&&!stream.getVideoTracks().length){stream.getTracks().forEach(function(track){track.stop();});throw new DOMException('','NotFoundError');}
|
|
||||||
return stream;},function(e){return Promise.reject(shimError_(e));});});};}},{"../utils.js":15}],6:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};exports.shimRTCIceCandidate=shimRTCIceCandidate;exports.shimMaxMessageSize=shimMaxMessageSize;exports.shimSendThrowTypeError=shimSendThrowTypeError;exports.shimConnectionState=shimConnectionState;exports.removeAllowExtmapMixed=removeAllowExtmapMixed;var _sdp=require('sdp');var _sdp2=_interopRequireDefault(_sdp);var _utils=require('./utils');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
|
|
||||||
function shimRTCIceCandidate(window){if(!window.RTCIceCandidate||window.RTCIceCandidate&&'foundation'in window.RTCIceCandidate.prototype){return;}
|
|
||||||
var NativeRTCIceCandidate=window.RTCIceCandidate;window.RTCIceCandidate=function(args){if((typeof args==='undefined'?'undefined':_typeof(args))==='object'&&args.candidate&&args.candidate.indexOf('a=')===0){args=JSON.parse(JSON.stringify(args));args.candidate=args.candidate.substr(2);}
|
|
||||||
if(args.candidate&&args.candidate.length){var nativeCandidate=new NativeRTCIceCandidate(args);var parsedCandidate=_sdp2.default.parseCandidate(args.candidate);var augmentedCandidate=Object.assign(nativeCandidate,parsedCandidate);augmentedCandidate.toJSON=function(){return{candidate:augmentedCandidate.candidate,sdpMid:augmentedCandidate.sdpMid,sdpMLineIndex:augmentedCandidate.sdpMLineIndex,usernameFragment:augmentedCandidate.usernameFragment};};return augmentedCandidate;}
|
|
||||||
return new NativeRTCIceCandidate(args);};window.RTCIceCandidate.prototype=NativeRTCIceCandidate.prototype;utils.wrapPeerConnectionEvent(window,'icecandidate',function(e){if(e.candidate){Object.defineProperty(e,'candidate',{value:new window.RTCIceCandidate(e.candidate),writable:'false'});}
|
|
||||||
return e;});}
|
|
||||||
function shimMaxMessageSize(window){if(window.RTCSctpTransport||!window.RTCPeerConnection){return;}
|
|
||||||
var browserDetails=utils.detectBrowser(window);if(!('sctp'in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,'sctp',{get:function get(){return typeof this._sctp==='undefined'?null:this._sctp;}});}
|
|
||||||
var sctpInDescription=function sctpInDescription(description){var sections=_sdp2.default.splitSections(description.sdp);sections.shift();return sections.some(function(mediaSection){var mLine=_sdp2.default.parseMLine(mediaSection);return mLine&&mLine.kind==='application'&&mLine.protocol.indexOf('SCTP')!==-1;});};var getRemoteFirefoxVersion=function getRemoteFirefoxVersion(description){var match=description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(match===null||match.length<2){return-1;}
|
|
||||||
var version=parseInt(match[1],10);return version!==version?-1:version;};var getCanSendMaxMessageSize=function getCanSendMaxMessageSize(remoteIsFirefox){var canSendMaxMessageSize=65536;if(browserDetails.browser==='firefox'){if(browserDetails.version<57){if(remoteIsFirefox===-1){canSendMaxMessageSize=16384;}else{canSendMaxMessageSize=2147483637;}}else if(browserDetails.version<60){canSendMaxMessageSize=browserDetails.version===57?65535:65536;}else{canSendMaxMessageSize=2147483637;}}
|
|
||||||
return canSendMaxMessageSize;};var getMaxMessageSize=function getMaxMessageSize(description,remoteIsFirefox){var maxMessageSize=65536;if(browserDetails.browser==='firefox'&&browserDetails.version===57){maxMessageSize=65535;}
|
|
||||||
var match=_sdp2.default.matchPrefix(description.sdp,'a=max-message-size:');if(match.length>0){maxMessageSize=parseInt(match[0].substr(19),10);}else if(browserDetails.browser==='firefox'&&remoteIsFirefox!==-1){maxMessageSize=2147483637;}
|
|
||||||
return maxMessageSize;};var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){this._sctp=null;if(sctpInDescription(arguments[0])){var isFirefox=getRemoteFirefoxVersion(arguments[0]);var canSendMMS=getCanSendMaxMessageSize(isFirefox);var remoteMMS=getMaxMessageSize(arguments[0],isFirefox);var maxMessageSize=void 0;if(canSendMMS===0&&remoteMMS===0){maxMessageSize=Number.POSITIVE_INFINITY;}else if(canSendMMS===0||remoteMMS===0){maxMessageSize=Math.max(canSendMMS,remoteMMS);}else{maxMessageSize=Math.min(canSendMMS,remoteMMS);}
|
|
||||||
var sctp={};Object.defineProperty(sctp,'maxMessageSize',{get:function get(){return maxMessageSize;}});this._sctp=sctp;}
|
|
||||||
return origSetRemoteDescription.apply(this,arguments);};}
|
|
||||||
function shimSendThrowTypeError(window){if(!(window.RTCPeerConnection&&'createDataChannel'in window.RTCPeerConnection.prototype)){return;}
|
|
||||||
function wrapDcSend(dc,pc){var origDataChannelSend=dc.send;dc.send=function(){var data=arguments[0];var length=data.length||data.size||data.byteLength;if(dc.readyState==='open'&&pc.sctp&&length>pc.sctp.maxMessageSize){throw new TypeError('Message too large (can send a maximum of '+pc.sctp.maxMessageSize+' bytes)');}
|
|
||||||
return origDataChannelSend.apply(dc,arguments);};}
|
|
||||||
var origCreateDataChannel=window.RTCPeerConnection.prototype.createDataChannel;window.RTCPeerConnection.prototype.createDataChannel=function(){var dataChannel=origCreateDataChannel.apply(this,arguments);wrapDcSend(dataChannel,this);return dataChannel;};utils.wrapPeerConnectionEvent(window,'datachannel',function(e){wrapDcSend(e.channel,e.target);return e;});}
|
|
||||||
function shimConnectionState(window){if(!window.RTCPeerConnection||'connectionState'in window.RTCPeerConnection.prototype){return;}
|
|
||||||
var proto=window.RTCPeerConnection.prototype;Object.defineProperty(proto,'connectionState',{get:function get(){return{completed:'connected',checking:'connecting'}[this.iceConnectionState]||this.iceConnectionState;},enumerable:true,configurable:true});Object.defineProperty(proto,'onconnectionstatechange',{get:function get(){return this._onconnectionstatechange||null;},set:function set(cb){if(this._onconnectionstatechange){this.removeEventListener('connectionstatechange',this._onconnectionstatechange);delete this._onconnectionstatechange;}
|
|
||||||
if(cb){this.addEventListener('connectionstatechange',this._onconnectionstatechange=cb);}},enumerable:true,configurable:true});['setLocalDescription','setRemoteDescription'].forEach(function(method){var origMethod=proto[method];proto[method]=function(){if(!this._connectionstatechangepoly){this._connectionstatechangepoly=function(e){var pc=e.target;if(pc._lastConnectionState!==pc.connectionState){pc._lastConnectionState=pc.connectionState;var newEvent=new Event('connectionstatechange',e);pc.dispatchEvent(newEvent);}
|
|
||||||
return e;};this.addEventListener('iceconnectionstatechange',this._connectionstatechangepoly);}
|
|
||||||
return origMethod.apply(this,arguments);};});}
|
|
||||||
function removeAllowExtmapMixed(window){if(!window.RTCPeerConnection){return;}
|
|
||||||
var browserDetails=utils.detectBrowser(window);if(browserDetails.browser==='chrome'&&browserDetails.version>=71){return;}
|
|
||||||
var nativeSRD=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(desc){if(desc&&desc.sdp&&desc.sdp.indexOf('\na=extmap-allow-mixed')!==-1){desc.sdp=desc.sdp.split('\n').filter(function(line){return line.trim()!=='a=extmap-allow-mixed';}).join('\n');}
|
|
||||||
return nativeSRD.apply(this,arguments);};}},{"./utils":15,"sdp":17}],7:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetDisplayMedia=exports.shimGetUserMedia=undefined;var _getusermedia=require('./getusermedia');Object.defineProperty(exports,'shimGetUserMedia',{enumerable:true,get:function get(){return _getusermedia.shimGetUserMedia;}});var _getdisplaymedia=require('./getdisplaymedia');Object.defineProperty(exports,'shimGetDisplayMedia',{enumerable:true,get:function get(){return _getdisplaymedia.shimGetDisplayMedia;}});exports.shimPeerConnection=shimPeerConnection;exports.shimReplaceTrack=shimReplaceTrack;var _utils=require('../utils');var utils=_interopRequireWildcard(_utils);var _filtericeservers=require('./filtericeservers');var _rtcpeerconnectionShim=require('rtcpeerconnection-shim');var _rtcpeerconnectionShim2=_interopRequireDefault(_rtcpeerconnectionShim);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
|
|
||||||
function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function shimPeerConnection(window){var browserDetails=utils.detectBrowser(window);if(window.RTCIceGatherer){if(!window.RTCIceCandidate){window.RTCIceCandidate=function(args){return args;};}
|
|
||||||
if(!window.RTCSessionDescription){window.RTCSessionDescription=function(args){return args;};}
|
|
||||||
if(browserDetails.version<15025){var origMSTEnabled=Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype,'enabled');Object.defineProperty(window.MediaStreamTrack.prototype,'enabled',{set:function set(value){origMSTEnabled.set.call(this,value);var ev=new Event('enabled');ev.enabled=value;this.dispatchEvent(ev);}});}}
|
|
||||||
if(window.RTCRtpSender&&!('dtmf'in window.RTCRtpSender.prototype)){Object.defineProperty(window.RTCRtpSender.prototype,'dtmf',{get:function get(){if(this._dtmf===undefined){if(this.track.kind==='audio'){this._dtmf=new window.RTCDtmfSender(this);}else if(this.track.kind==='video'){this._dtmf=null;}}
|
|
||||||
return this._dtmf;}});}
|
|
||||||
if(window.RTCDtmfSender&&!window.RTCDTMFSender){window.RTCDTMFSender=window.RTCDtmfSender;}
|
|
||||||
var RTCPeerConnectionShim=(0,_rtcpeerconnectionShim2.default)(window,browserDetails.version);window.RTCPeerConnection=function(config){if(config&&config.iceServers){config.iceServers=(0,_filtericeservers.filterIceServers)(config.iceServers,browserDetails.version);utils.log('ICE servers after filtering:',config.iceServers);}
|
|
||||||
return new RTCPeerConnectionShim(config);};window.RTCPeerConnection.prototype=RTCPeerConnectionShim.prototype;}
|
|
||||||
function shimReplaceTrack(window){if(window.RTCRtpSender&&!('replaceTrack'in window.RTCRtpSender.prototype)){window.RTCRtpSender.prototype.replaceTrack=window.RTCRtpSender.prototype.setTrack;}}},{"../utils":15,"./filtericeservers":8,"./getdisplaymedia":9,"./getusermedia":10,"rtcpeerconnection-shim":16}],8:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.filterIceServers=filterIceServers;var _utils=require('../utils');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function filterIceServers(iceServers,edgeVersion){var hasTurn=false;iceServers=JSON.parse(JSON.stringify(iceServers));return iceServers.filter(function(server){if(server&&(server.urls||server.url)){var urls=server.urls||server.url;if(server.url&&!server.urls){utils.deprecated('RTCIceServer.url','RTCIceServer.urls');}
|
|
||||||
var isString=typeof urls==='string';if(isString){urls=[urls];}
|
|
||||||
urls=urls.filter(function(url){if(url.indexOf('stun:')===0){return false;}
|
|
||||||
var validTurn=url.startsWith('turn')&&!url.startsWith('turn:[')&&url.includes('transport=udp');if(validTurn&&!hasTurn){hasTurn=true;return true;}
|
|
||||||
return validTurn&&!hasTurn;});delete server.url;server.urls=isString?urls[0]:urls;return!!urls.length;}});}},{"../utils":15}],9:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetDisplayMedia=shimGetDisplayMedia;function shimGetDisplayMedia(window){if(!('getDisplayMedia'in window.navigator)){return;}
|
|
||||||
if(!window.navigator.mediaDevices){return;}
|
|
||||||
if(window.navigator.mediaDevices&&'getDisplayMedia'in window.navigator.mediaDevices){return;}
|
|
||||||
window.navigator.mediaDevices.getDisplayMedia=window.navigator.getDisplayMedia.bind(window.navigator.mediaDevices);}},{}],10:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetUserMedia=shimGetUserMedia;function shimGetUserMedia(window){var navigator=window&&window.navigator;var shimError_=function shimError_(e){return{name:{PermissionDeniedError:'NotAllowedError'}[e.name]||e.name,message:e.message,constraint:e.constraint,toString:function toString(){return this.name;}};};var origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(c){return origGetUserMedia(c).catch(function(e){return Promise.reject(shimError_(e));});};}},{}],11:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetDisplayMedia=exports.shimGetUserMedia=undefined;var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};var _getusermedia=require('./getusermedia');Object.defineProperty(exports,'shimGetUserMedia',{enumerable:true,get:function get(){return _getusermedia.shimGetUserMedia;}});var _getdisplaymedia=require('./getdisplaymedia');Object.defineProperty(exports,'shimGetDisplayMedia',{enumerable:true,get:function get(){return _getdisplaymedia.shimGetDisplayMedia;}});exports.shimOnTrack=shimOnTrack;exports.shimPeerConnection=shimPeerConnection;exports.shimSenderGetStats=shimSenderGetStats;exports.shimReceiverGetStats=shimReceiverGetStats;exports.shimRemoveStream=shimRemoveStream;exports.shimRTCDataChannel=shimRTCDataChannel;var _utils=require('../utils');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function shimOnTrack(window){if((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCTrackEvent&&'receiver'in window.RTCTrackEvent.prototype&&!('transceiver'in window.RTCTrackEvent.prototype)){Object.defineProperty(window.RTCTrackEvent.prototype,'transceiver',{get:function get(){return{receiver:this.receiver};}});}}
|
|
||||||
function shimPeerConnection(window){var browserDetails=utils.detectBrowser(window);if((typeof window==='undefined'?'undefined':_typeof(window))!=='object'||!(window.RTCPeerConnection||window.mozRTCPeerConnection)){return;}
|
|
||||||
if(!window.RTCPeerConnection&&window.mozRTCPeerConnection){window.RTCPeerConnection=window.mozRTCPeerConnection;}
|
|
||||||
['setLocalDescription','setRemoteDescription','addIceCandidate'].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){arguments[0]=new(method==='addIceCandidate'?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]);return nativeMethod.apply(this,arguments);};});var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){if(!arguments[0]){if(arguments[1]){arguments[1].apply(null);}
|
|
||||||
return Promise.resolve();}
|
|
||||||
return nativeAddIceCandidate.apply(this,arguments);};var modernStatsTypes={inboundrtp:'inbound-rtp',outboundrtp:'outbound-rtp',candidatepair:'candidate-pair',localcandidate:'local-candidate',remotecandidate:'remote-candidate'};var nativeGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(selector,onSucc,onErr){return nativeGetStats.apply(this,[selector||null]).then(function(stats){if(browserDetails.version<53&&!onSucc){try{stats.forEach(function(stat){stat.type=modernStatsTypes[stat.type]||stat.type;});}catch(e){if(e.name!=='TypeError'){throw e;}
|
|
||||||
stats.forEach(function(stat,i){stats.set(i,Object.assign({},stat,{type:modernStatsTypes[stat.type]||stat.type}));});}}
|
|
||||||
return stats;}).then(onSucc,onErr);};}
|
|
||||||
function shimSenderGetStats(window){if(!((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&window.RTCRtpSender)){return;}
|
|
||||||
if(window.RTCRtpSender&&'getStats'in window.RTCRtpSender.prototype){return;}
|
|
||||||
var origGetSenders=window.RTCPeerConnection.prototype.getSenders;if(origGetSenders){window.RTCPeerConnection.prototype.getSenders=function(){var _this=this;var senders=origGetSenders.apply(this,[]);senders.forEach(function(sender){return sender._pc=_this;});return senders;};}
|
|
||||||
var origAddTrack=window.RTCPeerConnection.prototype.addTrack;if(origAddTrack){window.RTCPeerConnection.prototype.addTrack=function(){var sender=origAddTrack.apply(this,arguments);sender._pc=this;return sender;};}
|
|
||||||
window.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map());};}
|
|
||||||
function shimReceiverGetStats(window){if(!((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&window.RTCRtpSender)){return;}
|
|
||||||
if(window.RTCRtpSender&&'getStats'in window.RTCRtpReceiver.prototype){return;}
|
|
||||||
var origGetReceivers=window.RTCPeerConnection.prototype.getReceivers;if(origGetReceivers){window.RTCPeerConnection.prototype.getReceivers=function(){var _this2=this;var receivers=origGetReceivers.apply(this,[]);receivers.forEach(function(receiver){return receiver._pc=_this2;});return receivers;};}
|
|
||||||
utils.wrapPeerConnectionEvent(window,'track',function(e){e.receiver._pc=e.srcElement;return e;});window.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track);};}
|
|
||||||
function shimRemoveStream(window){if(!window.RTCPeerConnection||'removeStream'in window.RTCPeerConnection.prototype){return;}
|
|
||||||
window.RTCPeerConnection.prototype.removeStream=function(stream){var _this3=this;utils.deprecated('removeStream','removeTrack');this.getSenders().forEach(function(sender){if(sender.track&&stream.getTracks().includes(sender.track)){_this3.removeTrack(sender);}});};}
|
|
||||||
function shimRTCDataChannel(window){if(window.DataChannel&&!window.RTCDataChannel){window.RTCDataChannel=window.DataChannel;}}},{"../utils":15,"./getdisplaymedia":12,"./getusermedia":13}],12:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});exports.shimGetDisplayMedia=shimGetDisplayMedia;function shimGetDisplayMedia(window,preferredMediaSource){if(window.navigator.mediaDevices&&'getDisplayMedia'in window.navigator.mediaDevices){return;}
|
|
||||||
if(!window.navigator.mediaDevices){return;}
|
|
||||||
window.navigator.mediaDevices.getDisplayMedia=function(constraints){if(!(constraints&&constraints.video)){var err=new DOMException('getDisplayMedia without video '+'constraints is undefined');err.name='NotFoundError';err.code=8;return Promise.reject(err);}
|
|
||||||
if(constraints.video===true){constraints.video={mediaSource:preferredMediaSource};}else{constraints.video.mediaSource=preferredMediaSource;}
|
|
||||||
return window.navigator.mediaDevices.getUserMedia(constraints);};}},{}],13:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};exports.shimGetUserMedia=shimGetUserMedia;var _utils=require('../utils');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function shimGetUserMedia(window){var browserDetails=utils.detectBrowser(window);var navigator=window&&window.navigator;var MediaStreamTrack=window&&window.MediaStreamTrack;navigator.getUserMedia=function(constraints,onSuccess,onError){utils.deprecated('navigator.getUserMedia','navigator.mediaDevices.getUserMedia');navigator.mediaDevices.getUserMedia(constraints).then(onSuccess,onError);};if(!(browserDetails.version>55&&'autoGainControl'in navigator.mediaDevices.getSupportedConstraints())){var remap=function remap(obj,a,b){if(a in obj&&!(b in obj)){obj[b]=obj[a];delete obj[a];}};var nativeGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(c){if((typeof c==='undefined'?'undefined':_typeof(c))==='object'&&_typeof(c.audio)==='object'){c=JSON.parse(JSON.stringify(c));remap(c.audio,'autoGainControl','mozAutoGainControl');remap(c.audio,'noiseSuppression','mozNoiseSuppression');}
|
|
||||||
return nativeGetUserMedia(c);};if(MediaStreamTrack&&MediaStreamTrack.prototype.getSettings){var nativeGetSettings=MediaStreamTrack.prototype.getSettings;MediaStreamTrack.prototype.getSettings=function(){var obj=nativeGetSettings.apply(this,arguments);remap(obj,'mozAutoGainControl','autoGainControl');remap(obj,'mozNoiseSuppression','noiseSuppression');return obj;};}
|
|
||||||
if(MediaStreamTrack&&MediaStreamTrack.prototype.applyConstraints){var nativeApplyConstraints=MediaStreamTrack.prototype.applyConstraints;MediaStreamTrack.prototype.applyConstraints=function(c){if(this.kind==='audio'&&(typeof c==='undefined'?'undefined':_typeof(c))==='object'){c=JSON.parse(JSON.stringify(c));remap(c,'autoGainControl','mozAutoGainControl');remap(c,'noiseSuppression','mozNoiseSuppression');}
|
|
||||||
return nativeApplyConstraints.apply(this,[c]);};}}}},{"../utils":15}],14:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};exports.shimLocalStreamsAPI=shimLocalStreamsAPI;exports.shimRemoteStreamsAPI=shimRemoteStreamsAPI;exports.shimCallbacksAPI=shimCallbacksAPI;exports.shimGetUserMedia=shimGetUserMedia;exports.shimConstraints=shimConstraints;exports.shimRTCIceServerUrls=shimRTCIceServerUrls;exports.shimTrackEventTransceiver=shimTrackEventTransceiver;exports.shimCreateOfferLegacy=shimCreateOfferLegacy;var _utils=require('../utils');var utils=_interopRequireWildcard(_utils);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
|
|
||||||
function shimLocalStreamsAPI(window){if((typeof window==='undefined'?'undefined':_typeof(window))!=='object'||!window.RTCPeerConnection){return;}
|
|
||||||
if(!('getLocalStreams'in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.getLocalStreams=function(){if(!this._localStreams){this._localStreams=[];}
|
|
||||||
return this._localStreams;};}
|
|
||||||
if(!('addStream'in window.RTCPeerConnection.prototype)){var _addTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addStream=function(stream){var _this=this;if(!this._localStreams){this._localStreams=[];}
|
|
||||||
if(!this._localStreams.includes(stream)){this._localStreams.push(stream);}
|
|
||||||
stream.getTracks().forEach(function(track){return _addTrack.call(_this,track,stream);});};window.RTCPeerConnection.prototype.addTrack=function(track,stream){if(stream){if(!this._localStreams){this._localStreams=[stream];}else if(!this._localStreams.includes(stream)){this._localStreams.push(stream);}}
|
|
||||||
return _addTrack.call(this,track,stream);};}
|
|
||||||
if(!('removeStream'in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.removeStream=function(stream){var _this2=this;if(!this._localStreams){this._localStreams=[];}
|
|
||||||
var index=this._localStreams.indexOf(stream);if(index===-1){return;}
|
|
||||||
this._localStreams.splice(index,1);var tracks=stream.getTracks();this.getSenders().forEach(function(sender){if(tracks.includes(sender.track)){_this2.removeTrack(sender);}});};}}
|
|
||||||
function shimRemoteStreamsAPI(window){if((typeof window==='undefined'?'undefined':_typeof(window))!=='object'||!window.RTCPeerConnection){return;}
|
|
||||||
if(!('getRemoteStreams'in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[];};}
|
|
||||||
if(!('onaddstream'in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,'onaddstream',{get:function get(){return this._onaddstream;},set:function set(f){var _this3=this;if(this._onaddstream){this.removeEventListener('addstream',this._onaddstream);this.removeEventListener('track',this._onaddstreampoly);}
|
|
||||||
this.addEventListener('addstream',this._onaddstream=f);this.addEventListener('track',this._onaddstreampoly=function(e){e.streams.forEach(function(stream){if(!_this3._remoteStreams){_this3._remoteStreams=[];}
|
|
||||||
if(_this3._remoteStreams.includes(stream)){return;}
|
|
||||||
_this3._remoteStreams.push(stream);var event=new Event('addstream');event.stream=stream;_this3.dispatchEvent(event);});});}});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var pc=this;if(!this._onaddstreampoly){this.addEventListener('track',this._onaddstreampoly=function(e){e.streams.forEach(function(stream){if(!pc._remoteStreams){pc._remoteStreams=[];}
|
|
||||||
if(pc._remoteStreams.indexOf(stream)>=0){return;}
|
|
||||||
pc._remoteStreams.push(stream);var event=new Event('addstream');event.stream=stream;pc.dispatchEvent(event);});});}
|
|
||||||
return origSetRemoteDescription.apply(pc,arguments);};}}
|
|
||||||
function shimCallbacksAPI(window){if((typeof window==='undefined'?'undefined':_typeof(window))!=='object'||!window.RTCPeerConnection){return;}
|
|
||||||
var prototype=window.RTCPeerConnection.prototype;var createOffer=prototype.createOffer;var createAnswer=prototype.createAnswer;var setLocalDescription=prototype.setLocalDescription;var setRemoteDescription=prototype.setRemoteDescription;var addIceCandidate=prototype.addIceCandidate;prototype.createOffer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0];var promise=createOffer.apply(this,[options]);if(!failureCallback){return promise;}
|
|
||||||
promise.then(successCallback,failureCallback);return Promise.resolve();};prototype.createAnswer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0];var promise=createAnswer.apply(this,[options]);if(!failureCallback){return promise;}
|
|
||||||
promise.then(successCallback,failureCallback);return Promise.resolve();};var withCallback=function withCallback(description,successCallback,failureCallback){var promise=setLocalDescription.apply(this,[description]);if(!failureCallback){return promise;}
|
|
||||||
promise.then(successCallback,failureCallback);return Promise.resolve();};prototype.setLocalDescription=withCallback;withCallback=function withCallback(description,successCallback,failureCallback){var promise=setRemoteDescription.apply(this,[description]);if(!failureCallback){return promise;}
|
|
||||||
promise.then(successCallback,failureCallback);return Promise.resolve();};prototype.setRemoteDescription=withCallback;withCallback=function withCallback(candidate,successCallback,failureCallback){var promise=addIceCandidate.apply(this,[candidate]);if(!failureCallback){return promise;}
|
|
||||||
promise.then(successCallback,failureCallback);return Promise.resolve();};prototype.addIceCandidate=withCallback;}
|
|
||||||
function shimGetUserMedia(window){var navigator=window&&window.navigator;if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){var mediaDevices=navigator.mediaDevices;var _getUserMedia=mediaDevices.getUserMedia.bind(mediaDevices);navigator.mediaDevices.getUserMedia=function(constraints){return _getUserMedia(shimConstraints(constraints));};}
|
|
||||||
if(!navigator.getUserMedia&&navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){navigator.getUserMedia=function(constraints,cb,errcb){navigator.mediaDevices.getUserMedia(constraints).then(cb,errcb);}.bind(navigator);}}
|
|
||||||
function shimConstraints(constraints){if(constraints&&constraints.video!==undefined){return Object.assign({},constraints,{video:utils.compactObject(constraints.video)});}
|
|
||||||
return constraints;}
|
|
||||||
function shimRTCIceServerUrls(window){var OrigPeerConnection=window.RTCPeerConnection;window.RTCPeerConnection=function(pcConfig,pcConstraints){if(pcConfig&&pcConfig.iceServers){var newIceServers=[];for(var i=0;i<pcConfig.iceServers.length;i++){var server=pcConfig.iceServers[i];if(!server.hasOwnProperty('urls')&&server.hasOwnProperty('url')){utils.deprecated('RTCIceServer.url','RTCIceServer.urls');server=JSON.parse(JSON.stringify(server));server.urls=server.url;delete server.url;newIceServers.push(server);}else{newIceServers.push(pcConfig.iceServers[i]);}}
|
|
||||||
pcConfig.iceServers=newIceServers;}
|
|
||||||
return new OrigPeerConnection(pcConfig,pcConstraints);};window.RTCPeerConnection.prototype=OrigPeerConnection.prototype;if('generateCertificate'in window.RTCPeerConnection){Object.defineProperty(window.RTCPeerConnection,'generateCertificate',{get:function get(){return OrigPeerConnection.generateCertificate;}});}}
|
|
||||||
function shimTrackEventTransceiver(window){if((typeof window==='undefined'?'undefined':_typeof(window))==='object'&&window.RTCPeerConnection&&'receiver'in window.RTCTrackEvent.prototype&&!window.RTCTransceiver){Object.defineProperty(window.RTCTrackEvent.prototype,'transceiver',{get:function get(){return{receiver:this.receiver};}});}}
|
|
||||||
function shimCreateOfferLegacy(window){var origCreateOffer=window.RTCPeerConnection.prototype.createOffer;window.RTCPeerConnection.prototype.createOffer=function(offerOptions){if(offerOptions){if(typeof offerOptions.offerToReceiveAudio!=='undefined'){offerOptions.offerToReceiveAudio=!!offerOptions.offerToReceiveAudio;}
|
|
||||||
var audioTransceiver=this.getTransceivers().find(function(transceiver){return transceiver.sender.track&&transceiver.sender.track.kind==='audio';});if(offerOptions.offerToReceiveAudio===false&&audioTransceiver){if(audioTransceiver.direction==='sendrecv'){if(audioTransceiver.setDirection){audioTransceiver.setDirection('sendonly');}else{audioTransceiver.direction='sendonly';}}else if(audioTransceiver.direction==='recvonly'){if(audioTransceiver.setDirection){audioTransceiver.setDirection('inactive');}else{audioTransceiver.direction='inactive';}}}else if(offerOptions.offerToReceiveAudio===true&&!audioTransceiver){this.addTransceiver('audio');}
|
|
||||||
if(typeof offerOptions.offerToReceiveVideo!=='undefined'){offerOptions.offerToReceiveVideo=!!offerOptions.offerToReceiveVideo;}
|
|
||||||
var videoTransceiver=this.getTransceivers().find(function(transceiver){return transceiver.sender.track&&transceiver.sender.track.kind==='video';});if(offerOptions.offerToReceiveVideo===false&&videoTransceiver){if(videoTransceiver.direction==='sendrecv'){if(videoTransceiver.setDirection){videoTransceiver.setDirection('sendonly');}else{videoTransceiver.direction='sendonly';}}else if(videoTransceiver.direction==='recvonly'){if(videoTransceiver.setDirection){videoTransceiver.setDirection('inactive');}else{videoTransceiver.direction='inactive';}}}else if(offerOptions.offerToReceiveVideo===true&&!videoTransceiver){this.addTransceiver('video');}}
|
|
||||||
return origCreateOffer.apply(this,arguments);};}},{"../utils":15}],15:[function(require,module,exports){'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};exports.extractVersion=extractVersion;exports.wrapPeerConnectionEvent=wrapPeerConnectionEvent;exports.disableLog=disableLog;exports.disableWarnings=disableWarnings;exports.log=log;exports.deprecated=deprecated;exports.detectBrowser=detectBrowser;exports.compactObject=compactObject;function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}
|
|
||||||
var logDisabled_=true;var deprecationWarnings_=true;function extractVersion(uastring,expr,pos){var match=uastring.match(expr);return match&&match.length>=pos&&parseInt(match[pos],10);}
|
|
||||||
function wrapPeerConnectionEvent(window,eventNameToWrap,wrapper){if(!window.RTCPeerConnection){return;}
|
|
||||||
var proto=window.RTCPeerConnection.prototype;var nativeAddEventListener=proto.addEventListener;proto.addEventListener=function(nativeEventName,cb){if(nativeEventName!==eventNameToWrap){return nativeAddEventListener.apply(this,arguments);}
|
|
||||||
var wrappedCallback=function wrappedCallback(e){var modifiedEvent=wrapper(e);if(modifiedEvent){cb(modifiedEvent);}};this._eventMap=this._eventMap||{};this._eventMap[cb]=wrappedCallback;return nativeAddEventListener.apply(this,[nativeEventName,wrappedCallback]);};var nativeRemoveEventListener=proto.removeEventListener;proto.removeEventListener=function(nativeEventName,cb){if(nativeEventName!==eventNameToWrap||!this._eventMap||!this._eventMap[cb]){return nativeRemoveEventListener.apply(this,arguments);}
|
|
||||||
var unwrappedCb=this._eventMap[cb];delete this._eventMap[cb];return nativeRemoveEventListener.apply(this,[nativeEventName,unwrappedCb]);};Object.defineProperty(proto,'on'+eventNameToWrap,{get:function get(){return this['_on'+eventNameToWrap];},set:function set(cb){if(this['_on'+eventNameToWrap]){this.removeEventListener(eventNameToWrap,this['_on'+eventNameToWrap]);delete this['_on'+eventNameToWrap];}
|
|
||||||
if(cb){this.addEventListener(eventNameToWrap,this['_on'+eventNameToWrap]=cb);}},enumerable:true,configurable:true});}
|
|
||||||
function disableLog(bool){if(typeof bool!=='boolean'){return new Error('Argument type: '+(typeof bool==='undefined'?'undefined':_typeof(bool))+'. Please use a boolean.');}
|
|
||||||
logDisabled_=bool;return bool?'adapter.js logging disabled':'adapter.js logging enabled';}
|
|
||||||
function disableWarnings(bool){if(typeof bool!=='boolean'){return new Error('Argument type: '+(typeof bool==='undefined'?'undefined':_typeof(bool))+'. Please use a boolean.');}
|
|
||||||
deprecationWarnings_=!bool;return'adapter.js deprecation warnings '+(bool?'disabled':'enabled');}
|
|
||||||
function log(){if((typeof window==='undefined'?'undefined':_typeof(window))==='object'){if(logDisabled_){return;}
|
|
||||||
if(typeof console!=='undefined'&&typeof console.log==='function'){console.log.apply(console,arguments);}}}
|
|
||||||
function deprecated(oldMethod,newMethod){if(!deprecationWarnings_){return;}
|
|
||||||
console.warn(oldMethod+' is deprecated, please use '+newMethod+' instead.');}
|
|
||||||
function detectBrowser(window){var navigator=window.navigator;var result={browser:null,version:null};if(typeof window==='undefined'||!window.navigator){result.browser='Not a browser.';return result;}
|
|
||||||
if(navigator.mozGetUserMedia){result.browser='firefox';result.version=extractVersion(navigator.userAgent,/Firefox\/(\d+)\./,1);}else if(navigator.webkitGetUserMedia){result.browser='chrome';result.version=extractVersion(navigator.userAgent,/Chrom(e|ium)\/(\d+)\./,2);}else if(navigator.mediaDevices&&navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)){result.browser='edge';result.version=extractVersion(navigator.userAgent,/Edge\/(\d+).(\d+)$/,2);}else if(window.RTCPeerConnection&&navigator.userAgent.match(/AppleWebKit\/(\d+)\./)){result.browser='safari';result.version=extractVersion(navigator.userAgent,/AppleWebKit\/(\d+)\./,1);}else{result.browser='Not a supported browser.';return result;}
|
|
||||||
return result;}
|
|
||||||
function compactObject(data){if((typeof data==='undefined'?'undefined':_typeof(data))!=='object'){return data;}
|
|
||||||
return Object.keys(data).reduce(function(accumulator,key){var isObject=_typeof(data[key])==='object';var value=isObject?compactObject(data[key]):data[key];var isEmptyObject=isObject&&!Object.keys(value).length;if(value===undefined||isEmptyObject){return accumulator;}
|
|
||||||
return Object.assign(accumulator,_defineProperty({},key,value));},{});}},{}],16:[function(require,module,exports){'use strict';var SDPUtils=require('sdp');function fixStatsType(stat){return{inboundrtp:'inbound-rtp',outboundrtp:'outbound-rtp',candidatepair:'candidate-pair',localcandidate:'local-candidate',remotecandidate:'remote-candidate'}[stat.type]||stat.type;}
|
|
||||||
function writeMediaSection(transceiver,caps,type,stream,dtlsRole){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters());sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),type==='offer'?'actpass':dtlsRole||'active');sdp+='a=mid:'+transceiver.mid+'\r\n';if(transceiver.rtpSender&&transceiver.rtpReceiver){sdp+='a=sendrecv\r\n';}else if(transceiver.rtpSender){sdp+='a=sendonly\r\n';}else if(transceiver.rtpReceiver){sdp+='a=recvonly\r\n';}else{sdp+='a=inactive\r\n';}
|
|
||||||
if(transceiver.rtpSender){var trackId=transceiver.rtpSender._initialTrackId||transceiver.rtpSender.track.id;transceiver.rtpSender._initialTrackId=trackId;var msid='msid:'+(stream?stream.id:'-')+' '+
|
|
||||||
trackId+'\r\n';sdp+='a='+msid;sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].ssrc+' '+msid;if(transceiver.sendEncodingParameters[0].rtx){sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].rtx.ssrc+' '+msid;sdp+='a=ssrc-group:FID '+
|
|
||||||
transceiver.sendEncodingParameters[0].ssrc+' '+
|
|
||||||
transceiver.sendEncodingParameters[0].rtx.ssrc+'\r\n';}}
|
|
||||||
sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].ssrc+' cname:'+SDPUtils.localCName+'\r\n';if(transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx){sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].rtx.ssrc+' cname:'+SDPUtils.localCName+'\r\n';}
|
|
||||||
return sdp;}
|
|
||||||
function filterIceServers(iceServers,edgeVersion){var hasTurn=false;iceServers=JSON.parse(JSON.stringify(iceServers));return iceServers.filter(function(server){if(server&&(server.urls||server.url)){var urls=server.urls||server.url;if(server.url&&!server.urls){console.warn('RTCIceServer.url is deprecated! Use urls instead.');}
|
|
||||||
var isString=typeof urls==='string';if(isString){urls=[urls];}
|
|
||||||
urls=urls.filter(function(url){var validTurn=url.indexOf('turn:')===0&&url.indexOf('transport=udp')!==-1&&url.indexOf('turn:[')===-1&&!hasTurn;if(validTurn){hasTurn=true;return true;}
|
|
||||||
return url.indexOf('stun:')===0&&edgeVersion>=14393&&url.indexOf('?transport=udp')===-1;});delete server.url;server.urls=isString?urls[0]:urls;return!!urls.length;}});}
|
|
||||||
function getCommonCapabilities(localCapabilities,remoteCapabilities){var commonCapabilities={codecs:[],headerExtensions:[],fecMechanisms:[]};var findCodecByPayloadType=function(pt,codecs){pt=parseInt(pt,10);for(var i=0;i<codecs.length;i++){if(codecs[i].payloadType===pt||codecs[i].preferredPayloadType===pt){return codecs[i];}}};var rtxCapabilityMatches=function(lRtx,rRtx,lCodecs,rCodecs){var lCodec=findCodecByPayloadType(lRtx.parameters.apt,lCodecs);var rCodec=findCodecByPayloadType(rRtx.parameters.apt,rCodecs);return lCodec&&rCodec&&lCodec.name.toLowerCase()===rCodec.name.toLowerCase();};localCapabilities.codecs.forEach(function(lCodec){for(var i=0;i<remoteCapabilities.codecs.length;i++){var rCodec=remoteCapabilities.codecs[i];if(lCodec.name.toLowerCase()===rCodec.name.toLowerCase()&&lCodec.clockRate===rCodec.clockRate){if(lCodec.name.toLowerCase()==='rtx'&&lCodec.parameters&&rCodec.parameters.apt){if(!rtxCapabilityMatches(lCodec,rCodec,localCapabilities.codecs,remoteCapabilities.codecs)){continue;}}
|
|
||||||
rCodec=JSON.parse(JSON.stringify(rCodec));rCodec.numChannels=Math.min(lCodec.numChannels,rCodec.numChannels);commonCapabilities.codecs.push(rCodec);rCodec.rtcpFeedback=rCodec.rtcpFeedback.filter(function(fb){for(var j=0;j<lCodec.rtcpFeedback.length;j++){if(lCodec.rtcpFeedback[j].type===fb.type&&lCodec.rtcpFeedback[j].parameter===fb.parameter){return true;}}
|
|
||||||
return false;});break;}}});localCapabilities.headerExtensions.forEach(function(lHeaderExtension){for(var i=0;i<remoteCapabilities.headerExtensions.length;i++){var rHeaderExtension=remoteCapabilities.headerExtensions[i];if(lHeaderExtension.uri===rHeaderExtension.uri){commonCapabilities.headerExtensions.push(rHeaderExtension);break;}}});return commonCapabilities;}
|
|
||||||
function isActionAllowedInSignalingState(action,type,signalingState){return{offer:{setLocalDescription:['stable','have-local-offer'],setRemoteDescription:['stable','have-remote-offer']},answer:{setLocalDescription:['have-remote-offer','have-local-pranswer'],setRemoteDescription:['have-local-offer','have-remote-pranswer']}}[type][action].indexOf(signalingState)!==-1;}
|
|
||||||
function maybeAddCandidate(iceTransport,candidate){var alreadyAdded=iceTransport.getRemoteCandidates().find(function(remoteCandidate){return candidate.foundation===remoteCandidate.foundation&&candidate.ip===remoteCandidate.ip&&candidate.port===remoteCandidate.port&&candidate.priority===remoteCandidate.priority&&candidate.protocol===remoteCandidate.protocol&&candidate.type===remoteCandidate.type;});if(!alreadyAdded){iceTransport.addRemoteCandidate(candidate);}
|
|
||||||
return!alreadyAdded;}
|
|
||||||
function makeError(name,description){var e=new Error(description);e.name=name;e.code={NotSupportedError:9,InvalidStateError:11,InvalidAccessError:15,TypeError:undefined,OperationError:undefined}[name];return e;}
|
|
||||||
module.exports=function(window,edgeVersion){function addTrackToStreamAndFireEvent(track,stream){stream.addTrack(track);stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',{track:track}));}
|
|
||||||
function removeTrackFromStreamAndFireEvent(track,stream){stream.removeTrack(track);stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',{track:track}));}
|
|
||||||
function fireAddTrack(pc,track,receiver,streams){var trackEvent=new Event('track');trackEvent.track=track;trackEvent.receiver=receiver;trackEvent.transceiver={receiver:receiver};trackEvent.streams=streams;window.setTimeout(function(){pc._dispatchEvent('track',trackEvent);});}
|
|
||||||
var RTCPeerConnection=function(config){var pc=this;var _eventTarget=document.createDocumentFragment();['addEventListener','removeEventListener','dispatchEvent'].forEach(function(method){pc[method]=_eventTarget[method].bind(_eventTarget);});this.canTrickleIceCandidates=null;this.needNegotiation=false;this.localStreams=[];this.remoteStreams=[];this._localDescription=null;this._remoteDescription=null;this.signalingState='stable';this.iceConnectionState='new';this.connectionState='new';this.iceGatheringState='new';config=JSON.parse(JSON.stringify(config||{}));this.usingBundle=config.bundlePolicy==='max-bundle';if(config.rtcpMuxPolicy==='negotiate'){throw(makeError('NotSupportedError','rtcpMuxPolicy \'negotiate\' is not supported'));}else if(!config.rtcpMuxPolicy){config.rtcpMuxPolicy='require';}
|
|
||||||
switch(config.iceTransportPolicy){case'all':case'relay':break;default:config.iceTransportPolicy='all';break;}
|
|
||||||
switch(config.bundlePolicy){case'balanced':case'max-compat':case'max-bundle':break;default:config.bundlePolicy='balanced';break;}
|
|
||||||
config.iceServers=filterIceServers(config.iceServers||[],edgeVersion);this._iceGatherers=[];if(config.iceCandidatePoolSize){for(var i=config.iceCandidatePoolSize;i>0;i--){this._iceGatherers.push(new window.RTCIceGatherer({iceServers:config.iceServers,gatherPolicy:config.iceTransportPolicy}));}}else{config.iceCandidatePoolSize=0;}
|
|
||||||
this._config=config;this.transceivers=[];this._sdpSessionId=SDPUtils.generateSessionId();this._sdpSessionVersion=0;this._dtlsRole=undefined;this._isClosed=false;};Object.defineProperty(RTCPeerConnection.prototype,'localDescription',{configurable:true,get:function(){return this._localDescription;}});Object.defineProperty(RTCPeerConnection.prototype,'remoteDescription',{configurable:true,get:function(){return this._remoteDescription;}});RTCPeerConnection.prototype.onicecandidate=null;RTCPeerConnection.prototype.onaddstream=null;RTCPeerConnection.prototype.ontrack=null;RTCPeerConnection.prototype.onremovestream=null;RTCPeerConnection.prototype.onsignalingstatechange=null;RTCPeerConnection.prototype.oniceconnectionstatechange=null;RTCPeerConnection.prototype.onconnectionstatechange=null;RTCPeerConnection.prototype.onicegatheringstatechange=null;RTCPeerConnection.prototype.onnegotiationneeded=null;RTCPeerConnection.prototype.ondatachannel=null;RTCPeerConnection.prototype._dispatchEvent=function(name,event){if(this._isClosed){return;}
|
|
||||||
this.dispatchEvent(event);if(typeof this['on'+name]==='function'){this['on'+name](event);}};RTCPeerConnection.prototype._emitGatheringStateChange=function(){var event=new Event('icegatheringstatechange');this._dispatchEvent('icegatheringstatechange',event);};RTCPeerConnection.prototype.getConfiguration=function(){return this._config;};RTCPeerConnection.prototype.getLocalStreams=function(){return this.localStreams;};RTCPeerConnection.prototype.getRemoteStreams=function(){return this.remoteStreams;};RTCPeerConnection.prototype._createTransceiver=function(kind,doNotAdd){var hasBundleTransport=this.transceivers.length>0;var transceiver={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:kind,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:true};if(this.usingBundle&&hasBundleTransport){transceiver.iceTransport=this.transceivers[0].iceTransport;transceiver.dtlsTransport=this.transceivers[0].dtlsTransport;}else{var transports=this._createIceAndDtlsTransports();transceiver.iceTransport=transports.iceTransport;transceiver.dtlsTransport=transports.dtlsTransport;}
|
|
||||||
if(!doNotAdd){this.transceivers.push(transceiver);}
|
|
||||||
return transceiver;};RTCPeerConnection.prototype.addTrack=function(track,stream){if(this._isClosed){throw makeError('InvalidStateError','Attempted to call addTrack on a closed peerconnection.');}
|
|
||||||
var alreadyExists=this.transceivers.find(function(s){return s.track===track;});if(alreadyExists){throw makeError('InvalidAccessError','Track already exists.');}
|
|
||||||
var transceiver;for(var i=0;i<this.transceivers.length;i++){if(!this.transceivers[i].track&&this.transceivers[i].kind===track.kind){transceiver=this.transceivers[i];}}
|
|
||||||
if(!transceiver){transceiver=this._createTransceiver(track.kind);}
|
|
||||||
this._maybeFireNegotiationNeeded();if(this.localStreams.indexOf(stream)===-1){this.localStreams.push(stream);}
|
|
||||||
transceiver.track=track;transceiver.stream=stream;transceiver.rtpSender=new window.RTCRtpSender(track,transceiver.dtlsTransport);return transceiver.rtpSender;};RTCPeerConnection.prototype.addStream=function(stream){var pc=this;if(edgeVersion>=15025){stream.getTracks().forEach(function(track){pc.addTrack(track,stream);});}else{var clonedStream=stream.clone();stream.getTracks().forEach(function(track,idx){var clonedTrack=clonedStream.getTracks()[idx];track.addEventListener('enabled',function(event){clonedTrack.enabled=event.enabled;});});clonedStream.getTracks().forEach(function(track){pc.addTrack(track,clonedStream);});}};RTCPeerConnection.prototype.removeTrack=function(sender){if(this._isClosed){throw makeError('InvalidStateError','Attempted to call removeTrack on a closed peerconnection.');}
|
|
||||||
if(!(sender instanceof window.RTCRtpSender)){throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack '+'does not implement interface RTCRtpSender.');}
|
|
||||||
var transceiver=this.transceivers.find(function(t){return t.rtpSender===sender;});if(!transceiver){throw makeError('InvalidAccessError','Sender was not created by this connection.');}
|
|
||||||
var stream=transceiver.stream;transceiver.rtpSender.stop();transceiver.rtpSender=null;transceiver.track=null;transceiver.stream=null;var localStreams=this.transceivers.map(function(t){return t.stream;});if(localStreams.indexOf(stream)===-1&&this.localStreams.indexOf(stream)>-1){this.localStreams.splice(this.localStreams.indexOf(stream),1);}
|
|
||||||
this._maybeFireNegotiationNeeded();};RTCPeerConnection.prototype.removeStream=function(stream){var pc=this;stream.getTracks().forEach(function(track){var sender=pc.getSenders().find(function(s){return s.track===track;});if(sender){pc.removeTrack(sender);}});};RTCPeerConnection.prototype.getSenders=function(){return this.transceivers.filter(function(transceiver){return!!transceiver.rtpSender;}).map(function(transceiver){return transceiver.rtpSender;});};RTCPeerConnection.prototype.getReceivers=function(){return this.transceivers.filter(function(transceiver){return!!transceiver.rtpReceiver;}).map(function(transceiver){return transceiver.rtpReceiver;});};RTCPeerConnection.prototype._createIceGatherer=function(sdpMLineIndex,usingBundle){var pc=this;if(usingBundle&&sdpMLineIndex>0){return this.transceivers[0].iceGatherer;}else if(this._iceGatherers.length){return this._iceGatherers.shift();}
|
|
||||||
var iceGatherer=new window.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});Object.defineProperty(iceGatherer,'state',{value:'new',writable:true});this.transceivers[sdpMLineIndex].bufferedCandidateEvents=[];this.transceivers[sdpMLineIndex].bufferCandidates=function(event){var end=!event.candidate||Object.keys(event.candidate).length===0;iceGatherer.state=end?'completed':'gathering';if(pc.transceivers[sdpMLineIndex].bufferedCandidateEvents!==null){pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);}};iceGatherer.addEventListener('localcandidate',this.transceivers[sdpMLineIndex].bufferCandidates);return iceGatherer;};RTCPeerConnection.prototype._gather=function(mid,sdpMLineIndex){var pc=this;var iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;if(iceGatherer.onlocalcandidate){return;}
|
|
||||||
var bufferedCandidateEvents=this.transceivers[sdpMLineIndex].bufferedCandidateEvents;this.transceivers[sdpMLineIndex].bufferedCandidateEvents=null;iceGatherer.removeEventListener('localcandidate',this.transceivers[sdpMLineIndex].bufferCandidates);iceGatherer.onlocalcandidate=function(evt){if(pc.usingBundle&&sdpMLineIndex>0){return;}
|
|
||||||
var event=new Event('icecandidate');event.candidate={sdpMid:mid,sdpMLineIndex:sdpMLineIndex};var cand=evt.candidate;var end=!cand||Object.keys(cand).length===0;if(end){if(iceGatherer.state==='new'||iceGatherer.state==='gathering'){iceGatherer.state='completed';}}else{if(iceGatherer.state==='new'){iceGatherer.state='gathering';}
|
|
||||||
cand.component=1;cand.ufrag=iceGatherer.getLocalParameters().usernameFragment;var serializedCandidate=SDPUtils.writeCandidate(cand);event.candidate=Object.assign(event.candidate,SDPUtils.parseCandidate(serializedCandidate));event.candidate.candidate=serializedCandidate;event.candidate.toJSON=function(){return{candidate:event.candidate.candidate,sdpMid:event.candidate.sdpMid,sdpMLineIndex:event.candidate.sdpMLineIndex,usernameFragment:event.candidate.usernameFragment};};}
|
|
||||||
var sections=SDPUtils.getMediaSections(pc._localDescription.sdp);if(!end){sections[event.candidate.sdpMLineIndex]+='a='+event.candidate.candidate+'\r\n';}else{sections[event.candidate.sdpMLineIndex]+='a=end-of-candidates\r\n';}
|
|
||||||
pc._localDescription.sdp=SDPUtils.getDescription(pc._localDescription.sdp)+
|
|
||||||
sections.join('');var complete=pc.transceivers.every(function(transceiver){return transceiver.iceGatherer&&transceiver.iceGatherer.state==='completed';});if(pc.iceGatheringState!=='gathering'){pc.iceGatheringState='gathering';pc._emitGatheringStateChange();}
|
|
||||||
if(!end){pc._dispatchEvent('icecandidate',event);}
|
|
||||||
if(complete){pc._dispatchEvent('icecandidate',new Event('icecandidate'));pc.iceGatheringState='complete';pc._emitGatheringStateChange();}};window.setTimeout(function(){bufferedCandidateEvents.forEach(function(e){iceGatherer.onlocalcandidate(e);});},0);};RTCPeerConnection.prototype._createIceAndDtlsTransports=function(){var pc=this;var iceTransport=new window.RTCIceTransport(null);iceTransport.onicestatechange=function(){pc._updateIceConnectionState();pc._updateConnectionState();};var dtlsTransport=new window.RTCDtlsTransport(iceTransport);dtlsTransport.ondtlsstatechange=function(){pc._updateConnectionState();};dtlsTransport.onerror=function(){Object.defineProperty(dtlsTransport,'state',{value:'failed',writable:true});pc._updateConnectionState();};return{iceTransport:iceTransport,dtlsTransport:dtlsTransport};};RTCPeerConnection.prototype._disposeIceAndDtlsTransports=function(sdpMLineIndex){var iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;if(iceGatherer){delete iceGatherer.onlocalcandidate;delete this.transceivers[sdpMLineIndex].iceGatherer;}
|
|
||||||
var iceTransport=this.transceivers[sdpMLineIndex].iceTransport;if(iceTransport){delete iceTransport.onicestatechange;delete this.transceivers[sdpMLineIndex].iceTransport;}
|
|
||||||
var dtlsTransport=this.transceivers[sdpMLineIndex].dtlsTransport;if(dtlsTransport){delete dtlsTransport.ondtlsstatechange;delete dtlsTransport.onerror;delete this.transceivers[sdpMLineIndex].dtlsTransport;}};RTCPeerConnection.prototype._transceive=function(transceiver,send,recv){var params=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);if(send&&transceiver.rtpSender){params.encodings=transceiver.sendEncodingParameters;params.rtcp={cname:SDPUtils.localCName,compound:transceiver.rtcpParameters.compound};if(transceiver.recvEncodingParameters.length){params.rtcp.ssrc=transceiver.recvEncodingParameters[0].ssrc;}
|
|
||||||
transceiver.rtpSender.send(params);}
|
|
||||||
if(recv&&transceiver.rtpReceiver&¶ms.codecs.length>0){if(transceiver.kind==='video'&&transceiver.recvEncodingParameters&&edgeVersion<15019){transceiver.recvEncodingParameters.forEach(function(p){delete p.rtx;});}
|
|
||||||
if(transceiver.recvEncodingParameters.length){params.encodings=transceiver.recvEncodingParameters;}else{params.encodings=[{}];}
|
|
||||||
params.rtcp={compound:transceiver.rtcpParameters.compound};if(transceiver.rtcpParameters.cname){params.rtcp.cname=transceiver.rtcpParameters.cname;}
|
|
||||||
if(transceiver.sendEncodingParameters.length){params.rtcp.ssrc=transceiver.sendEncodingParameters[0].ssrc;}
|
|
||||||
transceiver.rtpReceiver.receive(params);}};RTCPeerConnection.prototype.setLocalDescription=function(description){var pc=this;if(['offer','answer'].indexOf(description.type)===-1){return Promise.reject(makeError('TypeError','Unsupported type "'+description.type+'"'));}
|
|
||||||
if(!isActionAllowedInSignalingState('setLocalDescription',description.type,pc.signalingState)||pc._isClosed){return Promise.reject(makeError('InvalidStateError','Can not set local '+description.type+' in state '+pc.signalingState));}
|
|
||||||
var sections;var sessionpart;if(description.type==='offer'){sections=SDPUtils.splitSections(description.sdp);sessionpart=sections.shift();sections.forEach(function(mediaSection,sdpMLineIndex){var caps=SDPUtils.parseRtpParameters(mediaSection);pc.transceivers[sdpMLineIndex].localCapabilities=caps;});pc.transceivers.forEach(function(transceiver,sdpMLineIndex){pc._gather(transceiver.mid,sdpMLineIndex);});}else if(description.type==='answer'){sections=SDPUtils.splitSections(pc._remoteDescription.sdp);sessionpart=sections.shift();var isIceLite=SDPUtils.matchPrefix(sessionpart,'a=ice-lite').length>0;sections.forEach(function(mediaSection,sdpMLineIndex){var transceiver=pc.transceivers[sdpMLineIndex];var iceGatherer=transceiver.iceGatherer;var iceTransport=transceiver.iceTransport;var dtlsTransport=transceiver.dtlsTransport;var localCapabilities=transceiver.localCapabilities;var remoteCapabilities=transceiver.remoteCapabilities;var rejected=SDPUtils.isRejected(mediaSection)&&SDPUtils.matchPrefix(mediaSection,'a=bundle-only').length===0;if(!rejected&&!transceiver.rejected){var remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart);var remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart);if(isIceLite){remoteDtlsParameters.role='server';}
|
|
||||||
if(!pc.usingBundle||sdpMLineIndex===0){pc._gather(transceiver.mid,sdpMLineIndex);if(iceTransport.state==='new'){iceTransport.start(iceGatherer,remoteIceParameters,isIceLite?'controlling':'controlled');}
|
|
||||||
if(dtlsTransport.state==='new'){dtlsTransport.start(remoteDtlsParameters);}}
|
|
||||||
var params=getCommonCapabilities(localCapabilities,remoteCapabilities);pc._transceive(transceiver,params.codecs.length>0,false);}});}
|
|
||||||
pc._localDescription={type:description.type,sdp:description.sdp};if(description.type==='offer'){pc._updateSignalingState('have-local-offer');}else{pc._updateSignalingState('stable');}
|
|
||||||
return Promise.resolve();};RTCPeerConnection.prototype.setRemoteDescription=function(description){var pc=this;if(['offer','answer'].indexOf(description.type)===-1){return Promise.reject(makeError('TypeError','Unsupported type "'+description.type+'"'));}
|
|
||||||
if(!isActionAllowedInSignalingState('setRemoteDescription',description.type,pc.signalingState)||pc._isClosed){return Promise.reject(makeError('InvalidStateError','Can not set remote '+description.type+' in state '+pc.signalingState));}
|
|
||||||
var streams={};pc.remoteStreams.forEach(function(stream){streams[stream.id]=stream;});var receiverList=[];var sections=SDPUtils.splitSections(description.sdp);var sessionpart=sections.shift();var isIceLite=SDPUtils.matchPrefix(sessionpart,'a=ice-lite').length>0;var usingBundle=SDPUtils.matchPrefix(sessionpart,'a=group:BUNDLE ').length>0;pc.usingBundle=usingBundle;var iceOptions=SDPUtils.matchPrefix(sessionpart,'a=ice-options:')[0];if(iceOptions){pc.canTrickleIceCandidates=iceOptions.substr(14).split(' ').indexOf('trickle')>=0;}else{pc.canTrickleIceCandidates=false;}
|
|
||||||
sections.forEach(function(mediaSection,sdpMLineIndex){var lines=SDPUtils.splitLines(mediaSection);var kind=SDPUtils.getKind(mediaSection);var rejected=SDPUtils.isRejected(mediaSection)&&SDPUtils.matchPrefix(mediaSection,'a=bundle-only').length===0;var protocol=lines[0].substr(2).split(' ')[2];var direction=SDPUtils.getDirection(mediaSection,sessionpart);var remoteMsid=SDPUtils.parseMsid(mediaSection);var mid=SDPUtils.getMid(mediaSection)||SDPUtils.generateIdentifier();if(rejected||(kind==='application'&&(protocol==='DTLS/SCTP'||protocol==='UDP/DTLS/SCTP'))){pc.transceivers[sdpMLineIndex]={mid:mid,kind:kind,protocol:protocol,rejected:true};return;}
|
|
||||||
if(!rejected&&pc.transceivers[sdpMLineIndex]&&pc.transceivers[sdpMLineIndex].rejected){pc.transceivers[sdpMLineIndex]=pc._createTransceiver(kind,true);}
|
|
||||||
var transceiver;var iceGatherer;var iceTransport;var dtlsTransport;var rtpReceiver;var sendEncodingParameters;var recvEncodingParameters;var localCapabilities;var track;var remoteCapabilities=SDPUtils.parseRtpParameters(mediaSection);var remoteIceParameters;var remoteDtlsParameters;if(!rejected){remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart);remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart);remoteDtlsParameters.role='client';}
|
|
||||||
recvEncodingParameters=SDPUtils.parseRtpEncodingParameters(mediaSection);var rtcpParameters=SDPUtils.parseRtcpParameters(mediaSection);var isComplete=SDPUtils.matchPrefix(mediaSection,'a=end-of-candidates',sessionpart).length>0;var cands=SDPUtils.matchPrefix(mediaSection,'a=candidate:').map(function(cand){return SDPUtils.parseCandidate(cand);}).filter(function(cand){return cand.component===1;});if((description.type==='offer'||description.type==='answer')&&!rejected&&usingBundle&&sdpMLineIndex>0&&pc.transceivers[sdpMLineIndex]){pc._disposeIceAndDtlsTransports(sdpMLineIndex);pc.transceivers[sdpMLineIndex].iceGatherer=pc.transceivers[0].iceGatherer;pc.transceivers[sdpMLineIndex].iceTransport=pc.transceivers[0].iceTransport;pc.transceivers[sdpMLineIndex].dtlsTransport=pc.transceivers[0].dtlsTransport;if(pc.transceivers[sdpMLineIndex].rtpSender){pc.transceivers[sdpMLineIndex].rtpSender.setTransport(pc.transceivers[0].dtlsTransport);}
|
|
||||||
if(pc.transceivers[sdpMLineIndex].rtpReceiver){pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(pc.transceivers[0].dtlsTransport);}}
|
|
||||||
if(description.type==='offer'&&!rejected){transceiver=pc.transceivers[sdpMLineIndex]||pc._createTransceiver(kind);transceiver.mid=mid;if(!transceiver.iceGatherer){transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,usingBundle);}
|
|
||||||
if(cands.length&&transceiver.iceTransport.state==='new'){if(isComplete&&(!usingBundle||sdpMLineIndex===0)){transceiver.iceTransport.setRemoteCandidates(cands);}else{cands.forEach(function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate);});}}
|
|
||||||
localCapabilities=window.RTCRtpReceiver.getCapabilities(kind);if(edgeVersion<15019){localCapabilities.codecs=localCapabilities.codecs.filter(function(codec){return codec.name!=='rtx';});}
|
|
||||||
sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:(2*sdpMLineIndex+2)*1001}];var isNewTrack=false;if(direction==='sendrecv'||direction==='sendonly'){isNewTrack=!transceiver.rtpReceiver;rtpReceiver=transceiver.rtpReceiver||new window.RTCRtpReceiver(transceiver.dtlsTransport,kind);if(isNewTrack){var stream;track=rtpReceiver.track;if(remoteMsid&&remoteMsid.stream==='-'){}else if(remoteMsid){if(!streams[remoteMsid.stream]){streams[remoteMsid.stream]=new window.MediaStream();Object.defineProperty(streams[remoteMsid.stream],'id',{get:function(){return remoteMsid.stream;}});}
|
|
||||||
Object.defineProperty(track,'id',{get:function(){return remoteMsid.track;}});stream=streams[remoteMsid.stream];}else{if(!streams.default){streams.default=new window.MediaStream();}
|
|
||||||
stream=streams.default;}
|
|
||||||
if(stream){addTrackToStreamAndFireEvent(track,stream);transceiver.associatedRemoteMediaStreams.push(stream);}
|
|
||||||
receiverList.push([track,rtpReceiver,stream]);}}else if(transceiver.rtpReceiver&&transceiver.rtpReceiver.track){transceiver.associatedRemoteMediaStreams.forEach(function(s){var nativeTrack=s.getTracks().find(function(t){return t.id===transceiver.rtpReceiver.track.id;});if(nativeTrack){removeTrackFromStreamAndFireEvent(nativeTrack,s);}});transceiver.associatedRemoteMediaStreams=[];}
|
|
||||||
transceiver.localCapabilities=localCapabilities;transceiver.remoteCapabilities=remoteCapabilities;transceiver.rtpReceiver=rtpReceiver;transceiver.rtcpParameters=rtcpParameters;transceiver.sendEncodingParameters=sendEncodingParameters;transceiver.recvEncodingParameters=recvEncodingParameters;pc._transceive(pc.transceivers[sdpMLineIndex],false,isNewTrack);}else if(description.type==='answer'&&!rejected){transceiver=pc.transceivers[sdpMLineIndex];iceGatherer=transceiver.iceGatherer;iceTransport=transceiver.iceTransport;dtlsTransport=transceiver.dtlsTransport;rtpReceiver=transceiver.rtpReceiver;sendEncodingParameters=transceiver.sendEncodingParameters;localCapabilities=transceiver.localCapabilities;pc.transceivers[sdpMLineIndex].recvEncodingParameters=recvEncodingParameters;pc.transceivers[sdpMLineIndex].remoteCapabilities=remoteCapabilities;pc.transceivers[sdpMLineIndex].rtcpParameters=rtcpParameters;if(cands.length&&iceTransport.state==='new'){if((isIceLite||isComplete)&&(!usingBundle||sdpMLineIndex===0)){iceTransport.setRemoteCandidates(cands);}else{cands.forEach(function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate);});}}
|
|
||||||
if(!usingBundle||sdpMLineIndex===0){if(iceTransport.state==='new'){iceTransport.start(iceGatherer,remoteIceParameters,'controlling');}
|
|
||||||
if(dtlsTransport.state==='new'){dtlsTransport.start(remoteDtlsParameters);}}
|
|
||||||
var commonCapabilities=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);var hasRtx=commonCapabilities.codecs.filter(function(c){return c.name.toLowerCase()==='rtx';}).length;if(!hasRtx&&transceiver.sendEncodingParameters[0].rtx){delete transceiver.sendEncodingParameters[0].rtx;}
|
|
||||||
pc._transceive(transceiver,direction==='sendrecv'||direction==='recvonly',direction==='sendrecv'||direction==='sendonly');if(rtpReceiver&&(direction==='sendrecv'||direction==='sendonly')){track=rtpReceiver.track;if(remoteMsid){if(!streams[remoteMsid.stream]){streams[remoteMsid.stream]=new window.MediaStream();}
|
|
||||||
addTrackToStreamAndFireEvent(track,streams[remoteMsid.stream]);receiverList.push([track,rtpReceiver,streams[remoteMsid.stream]]);}else{if(!streams.default){streams.default=new window.MediaStream();}
|
|
||||||
addTrackToStreamAndFireEvent(track,streams.default);receiverList.push([track,rtpReceiver,streams.default]);}}else{delete transceiver.rtpReceiver;}}});if(pc._dtlsRole===undefined){pc._dtlsRole=description.type==='offer'?'active':'passive';}
|
|
||||||
pc._remoteDescription={type:description.type,sdp:description.sdp};if(description.type==='offer'){pc._updateSignalingState('have-remote-offer');}else{pc._updateSignalingState('stable');}
|
|
||||||
Object.keys(streams).forEach(function(sid){var stream=streams[sid];if(stream.getTracks().length){if(pc.remoteStreams.indexOf(stream)===-1){pc.remoteStreams.push(stream);var event=new Event('addstream');event.stream=stream;window.setTimeout(function(){pc._dispatchEvent('addstream',event);});}
|
|
||||||
receiverList.forEach(function(item){var track=item[0];var receiver=item[1];if(stream.id!==item[2].id){return;}
|
|
||||||
fireAddTrack(pc,track,receiver,[stream]);});}});receiverList.forEach(function(item){if(item[2]){return;}
|
|
||||||
fireAddTrack(pc,item[0],item[1],[]);});window.setTimeout(function(){if(!(pc&&pc.transceivers)){return;}
|
|
||||||
pc.transceivers.forEach(function(transceiver){if(transceiver.iceTransport&&transceiver.iceTransport.state==='new'&&transceiver.iceTransport.getRemoteCandidates().length>0){console.warn('Timeout for addRemoteCandidate. Consider sending '+'an end-of-candidates notification');transceiver.iceTransport.addRemoteCandidate({});}});},4000);return Promise.resolve();};RTCPeerConnection.prototype.close=function(){this.transceivers.forEach(function(transceiver){if(transceiver.iceTransport){transceiver.iceTransport.stop();}
|
|
||||||
if(transceiver.dtlsTransport){transceiver.dtlsTransport.stop();}
|
|
||||||
if(transceiver.rtpSender){transceiver.rtpSender.stop();}
|
|
||||||
if(transceiver.rtpReceiver){transceiver.rtpReceiver.stop();}});this._isClosed=true;this._updateSignalingState('closed');};RTCPeerConnection.prototype._updateSignalingState=function(newState){this.signalingState=newState;var event=new Event('signalingstatechange');this._dispatchEvent('signalingstatechange',event);};RTCPeerConnection.prototype._maybeFireNegotiationNeeded=function(){var pc=this;if(this.signalingState!=='stable'||this.needNegotiation===true){return;}
|
|
||||||
this.needNegotiation=true;window.setTimeout(function(){if(pc.needNegotiation){pc.needNegotiation=false;var event=new Event('negotiationneeded');pc._dispatchEvent('negotiationneeded',event);}},0);};RTCPeerConnection.prototype._updateIceConnectionState=function(){var newState;var states={'new':0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};this.transceivers.forEach(function(transceiver){if(transceiver.iceTransport&&!transceiver.rejected){states[transceiver.iceTransport.state]++;}});newState='new';if(states.failed>0){newState='failed';}else if(states.checking>0){newState='checking';}else if(states.disconnected>0){newState='disconnected';}else if(states.new>0){newState='new';}else if(states.connected>0){newState='connected';}else if(states.completed>0){newState='completed';}
|
|
||||||
if(newState!==this.iceConnectionState){this.iceConnectionState=newState;var event=new Event('iceconnectionstatechange');this._dispatchEvent('iceconnectionstatechange',event);}};RTCPeerConnection.prototype._updateConnectionState=function(){var newState;var states={'new':0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};this.transceivers.forEach(function(transceiver){if(transceiver.iceTransport&&transceiver.dtlsTransport&&!transceiver.rejected){states[transceiver.iceTransport.state]++;states[transceiver.dtlsTransport.state]++;}});states.connected+=states.completed;newState='new';if(states.failed>0){newState='failed';}else if(states.connecting>0){newState='connecting';}else if(states.disconnected>0){newState='disconnected';}else if(states.new>0){newState='new';}else if(states.connected>0){newState='connected';}
|
|
||||||
if(newState!==this.connectionState){this.connectionState=newState;var event=new Event('connectionstatechange');this._dispatchEvent('connectionstatechange',event);}};RTCPeerConnection.prototype.createOffer=function(){var pc=this;if(pc._isClosed){return Promise.reject(makeError('InvalidStateError','Can not call createOffer after close'));}
|
|
||||||
var numAudioTracks=pc.transceivers.filter(function(t){return t.kind==='audio';}).length;var numVideoTracks=pc.transceivers.filter(function(t){return t.kind==='video';}).length;var offerOptions=arguments[0];if(offerOptions){if(offerOptions.mandatory||offerOptions.optional){throw new TypeError('Legacy mandatory/optional constraints not supported.');}
|
|
||||||
if(offerOptions.offerToReceiveAudio!==undefined){if(offerOptions.offerToReceiveAudio===true){numAudioTracks=1;}else if(offerOptions.offerToReceiveAudio===false){numAudioTracks=0;}else{numAudioTracks=offerOptions.offerToReceiveAudio;}}
|
|
||||||
if(offerOptions.offerToReceiveVideo!==undefined){if(offerOptions.offerToReceiveVideo===true){numVideoTracks=1;}else if(offerOptions.offerToReceiveVideo===false){numVideoTracks=0;}else{numVideoTracks=offerOptions.offerToReceiveVideo;}}}
|
|
||||||
pc.transceivers.forEach(function(transceiver){if(transceiver.kind==='audio'){numAudioTracks--;if(numAudioTracks<0){transceiver.wantReceive=false;}}else if(transceiver.kind==='video'){numVideoTracks--;if(numVideoTracks<0){transceiver.wantReceive=false;}}});while(numAudioTracks>0||numVideoTracks>0){if(numAudioTracks>0){pc._createTransceiver('audio');numAudioTracks--;}
|
|
||||||
if(numVideoTracks>0){pc._createTransceiver('video');numVideoTracks--;}}
|
|
||||||
var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);pc.transceivers.forEach(function(transceiver,sdpMLineIndex){var track=transceiver.track;var kind=transceiver.kind;var mid=transceiver.mid||SDPUtils.generateIdentifier();transceiver.mid=mid;if(!transceiver.iceGatherer){transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,pc.usingBundle);}
|
|
||||||
var localCapabilities=window.RTCRtpSender.getCapabilities(kind);if(edgeVersion<15019){localCapabilities.codecs=localCapabilities.codecs.filter(function(codec){return codec.name!=='rtx';});}
|
|
||||||
localCapabilities.codecs.forEach(function(codec){if(codec.name==='H264'&&codec.parameters['level-asymmetry-allowed']===undefined){codec.parameters['level-asymmetry-allowed']='1';}
|
|
||||||
if(transceiver.remoteCapabilities&&transceiver.remoteCapabilities.codecs){transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec){if(codec.name.toLowerCase()===remoteCodec.name.toLowerCase()&&codec.clockRate===remoteCodec.clockRate){codec.preferredPayloadType=remoteCodec.payloadType;}});}});localCapabilities.headerExtensions.forEach(function(hdrExt){var remoteExtensions=transceiver.remoteCapabilities&&transceiver.remoteCapabilities.headerExtensions||[];remoteExtensions.forEach(function(rHdrExt){if(hdrExt.uri===rHdrExt.uri){hdrExt.id=rHdrExt.id;}});});var sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:(2*sdpMLineIndex+1)*1001}];if(track){if(edgeVersion>=15019&&kind==='video'&&!sendEncodingParameters[0].rtx){sendEncodingParameters[0].rtx={ssrc:sendEncodingParameters[0].ssrc+1};}}
|
|
||||||
if(transceiver.wantReceive){transceiver.rtpReceiver=new window.RTCRtpReceiver(transceiver.dtlsTransport,kind);}
|
|
||||||
transceiver.localCapabilities=localCapabilities;transceiver.sendEncodingParameters=sendEncodingParameters;});if(pc._config.bundlePolicy!=='max-compat'){sdp+='a=group:BUNDLE '+pc.transceivers.map(function(t){return t.mid;}).join(' ')+'\r\n';}
|
|
||||||
sdp+='a=ice-options:trickle\r\n';pc.transceivers.forEach(function(transceiver,sdpMLineIndex){sdp+=writeMediaSection(transceiver,transceiver.localCapabilities,'offer',transceiver.stream,pc._dtlsRole);sdp+='a=rtcp-rsize\r\n';if(transceiver.iceGatherer&&pc.iceGatheringState!=='new'&&(sdpMLineIndex===0||!pc.usingBundle)){transceiver.iceGatherer.getLocalCandidates().forEach(function(cand){cand.component=1;sdp+='a='+SDPUtils.writeCandidate(cand)+'\r\n';});if(transceiver.iceGatherer.state==='completed'){sdp+='a=end-of-candidates\r\n';}}});var desc=new window.RTCSessionDescription({type:'offer',sdp:sdp});return Promise.resolve(desc);};RTCPeerConnection.prototype.createAnswer=function(){var pc=this;if(pc._isClosed){return Promise.reject(makeError('InvalidStateError','Can not call createAnswer after close'));}
|
|
||||||
if(!(pc.signalingState==='have-remote-offer'||pc.signalingState==='have-local-pranswer')){return Promise.reject(makeError('InvalidStateError','Can not call createAnswer in signalingState '+pc.signalingState));}
|
|
||||||
var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);if(pc.usingBundle){sdp+='a=group:BUNDLE '+pc.transceivers.map(function(t){return t.mid;}).join(' ')+'\r\n';}
|
|
||||||
sdp+='a=ice-options:trickle\r\n';var mediaSectionsInOffer=SDPUtils.getMediaSections(pc._remoteDescription.sdp).length;pc.transceivers.forEach(function(transceiver,sdpMLineIndex){if(sdpMLineIndex+1>mediaSectionsInOffer){return;}
|
|
||||||
if(transceiver.rejected){if(transceiver.kind==='application'){if(transceiver.protocol==='DTLS/SCTP'){sdp+='m=application 0 DTLS/SCTP 5000\r\n';}else{sdp+='m=application 0 '+transceiver.protocol+' webrtc-datachannel\r\n';}}else if(transceiver.kind==='audio'){sdp+='m=audio 0 UDP/TLS/RTP/SAVPF 0\r\n'+'a=rtpmap:0 PCMU/8000\r\n';}else if(transceiver.kind==='video'){sdp+='m=video 0 UDP/TLS/RTP/SAVPF 120\r\n'+'a=rtpmap:120 VP8/90000\r\n';}
|
|
||||||
sdp+='c=IN IP4 0.0.0.0\r\n'+'a=inactive\r\n'+'a=mid:'+transceiver.mid+'\r\n';return;}
|
|
||||||
if(transceiver.stream){var localTrack;if(transceiver.kind==='audio'){localTrack=transceiver.stream.getAudioTracks()[0];}else if(transceiver.kind==='video'){localTrack=transceiver.stream.getVideoTracks()[0];}
|
|
||||||
if(localTrack){if(edgeVersion>=15019&&transceiver.kind==='video'&&!transceiver.sendEncodingParameters[0].rtx){transceiver.sendEncodingParameters[0].rtx={ssrc:transceiver.sendEncodingParameters[0].ssrc+1};}}}
|
|
||||||
var commonCapabilities=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);var hasRtx=commonCapabilities.codecs.filter(function(c){return c.name.toLowerCase()==='rtx';}).length;if(!hasRtx&&transceiver.sendEncodingParameters[0].rtx){delete transceiver.sendEncodingParameters[0].rtx;}
|
|
||||||
sdp+=writeMediaSection(transceiver,commonCapabilities,'answer',transceiver.stream,pc._dtlsRole);if(transceiver.rtcpParameters&&transceiver.rtcpParameters.reducedSize){sdp+='a=rtcp-rsize\r\n';}});var desc=new window.RTCSessionDescription({type:'answer',sdp:sdp});return Promise.resolve(desc);};RTCPeerConnection.prototype.addIceCandidate=function(candidate){var pc=this;var sections;if(candidate&&!(candidate.sdpMLineIndex!==undefined||candidate.sdpMid)){return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));}
|
|
||||||
return new Promise(function(resolve,reject){if(!pc._remoteDescription){return reject(makeError('InvalidStateError','Can not add ICE candidate without a remote description'));}else if(!candidate||candidate.candidate===''){for(var j=0;j<pc.transceivers.length;j++){if(pc.transceivers[j].rejected){continue;}
|
|
||||||
pc.transceivers[j].iceTransport.addRemoteCandidate({});sections=SDPUtils.getMediaSections(pc._remoteDescription.sdp);sections[j]+='a=end-of-candidates\r\n';pc._remoteDescription.sdp=SDPUtils.getDescription(pc._remoteDescription.sdp)+
|
|
||||||
sections.join('');if(pc.usingBundle){break;}}}else{var sdpMLineIndex=candidate.sdpMLineIndex;if(candidate.sdpMid){for(var i=0;i<pc.transceivers.length;i++){if(pc.transceivers[i].mid===candidate.sdpMid){sdpMLineIndex=i;break;}}}
|
|
||||||
var transceiver=pc.transceivers[sdpMLineIndex];if(transceiver){if(transceiver.rejected){return resolve();}
|
|
||||||
var cand=Object.keys(candidate.candidate).length>0?SDPUtils.parseCandidate(candidate.candidate):{};if(cand.protocol==='tcp'&&(cand.port===0||cand.port===9)){return resolve();}
|
|
||||||
if(cand.component&&cand.component!==1){return resolve();}
|
|
||||||
if(sdpMLineIndex===0||(sdpMLineIndex>0&&transceiver.iceTransport!==pc.transceivers[0].iceTransport)){if(!maybeAddCandidate(transceiver.iceTransport,cand)){return reject(makeError('OperationError','Can not add ICE candidate'));}}
|
|
||||||
var candidateString=candidate.candidate.trim();if(candidateString.indexOf('a=')===0){candidateString=candidateString.substr(2);}
|
|
||||||
sections=SDPUtils.getMediaSections(pc._remoteDescription.sdp);sections[sdpMLineIndex]+='a='+
|
|
||||||
(cand.type?candidateString:'end-of-candidates')
|
|
||||||
+'\r\n';pc._remoteDescription.sdp=SDPUtils.getDescription(pc._remoteDescription.sdp)+
|
|
||||||
sections.join('');}else{return reject(makeError('OperationError','Can not add ICE candidate'));}}
|
|
||||||
resolve();});};RTCPeerConnection.prototype.getStats=function(selector){if(selector&&selector instanceof window.MediaStreamTrack){var senderOrReceiver=null;this.transceivers.forEach(function(transceiver){if(transceiver.rtpSender&&transceiver.rtpSender.track===selector){senderOrReceiver=transceiver.rtpSender;}else if(transceiver.rtpReceiver&&transceiver.rtpReceiver.track===selector){senderOrReceiver=transceiver.rtpReceiver;}});if(!senderOrReceiver){throw makeError('InvalidAccessError','Invalid selector.');}
|
|
||||||
return senderOrReceiver.getStats();}
|
|
||||||
var promises=[];this.transceivers.forEach(function(transceiver){['rtpSender','rtpReceiver','iceGatherer','iceTransport','dtlsTransport'].forEach(function(method){if(transceiver[method]){promises.push(transceiver[method].getStats());}});});return Promise.all(promises).then(function(allStats){var results=new Map();allStats.forEach(function(stats){stats.forEach(function(stat){results.set(stat.id,stat);});});return results;});};var ortcObjects=['RTCRtpSender','RTCRtpReceiver','RTCIceGatherer','RTCIceTransport','RTCDtlsTransport'];ortcObjects.forEach(function(ortcObjectName){var obj=window[ortcObjectName];if(obj&&obj.prototype&&obj.prototype.getStats){var nativeGetstats=obj.prototype.getStats;obj.prototype.getStats=function(){return nativeGetstats.apply(this).then(function(nativeStats){var mapStats=new Map();Object.keys(nativeStats).forEach(function(id){nativeStats[id].type=fixStatsType(nativeStats[id]);mapStats.set(id,nativeStats[id]);});return mapStats;});};}});var methods=['createOffer','createAnswer'];methods.forEach(function(method){var nativeMethod=RTCPeerConnection.prototype[method];RTCPeerConnection.prototype[method]=function(){var args=arguments;if(typeof args[0]==='function'||typeof args[1]==='function'){return nativeMethod.apply(this,[arguments[2]]).then(function(description){if(typeof args[0]==='function'){args[0].apply(null,[description]);}},function(error){if(typeof args[1]==='function'){args[1].apply(null,[error]);}});}
|
|
||||||
return nativeMethod.apply(this,arguments);};});methods=['setLocalDescription','setRemoteDescription','addIceCandidate'];methods.forEach(function(method){var nativeMethod=RTCPeerConnection.prototype[method];RTCPeerConnection.prototype[method]=function(){var args=arguments;if(typeof args[1]==='function'||typeof args[2]==='function'){return nativeMethod.apply(this,arguments).then(function(){if(typeof args[1]==='function'){args[1].apply(null);}},function(error){if(typeof args[2]==='function'){args[2].apply(null,[error]);}});}
|
|
||||||
return nativeMethod.apply(this,arguments);};});['getStats'].forEach(function(method){var nativeMethod=RTCPeerConnection.prototype[method];RTCPeerConnection.prototype[method]=function(){var args=arguments;if(typeof args[1]==='function'){return nativeMethod.apply(this,arguments).then(function(){if(typeof args[1]==='function'){args[1].apply(null);}});}
|
|
||||||
return nativeMethod.apply(this,arguments);};});return RTCPeerConnection;};},{"sdp":17}],17:[function(require,module,exports){'use strict';var SDPUtils={};SDPUtils.generateIdentifier=function(){return Math.random().toString(36).substr(2,10);};SDPUtils.localCName=SDPUtils.generateIdentifier();SDPUtils.splitLines=function(blob){return blob.trim().split('\n').map(function(line){return line.trim();});};SDPUtils.splitSections=function(blob){var parts=blob.split('\nm=');return parts.map(function(part,index){return(index>0?'m='+part:part).trim()+'\r\n';});};SDPUtils.getDescription=function(blob){var sections=SDPUtils.splitSections(blob);return sections&§ions[0];};SDPUtils.getMediaSections=function(blob){var sections=SDPUtils.splitSections(blob);sections.shift();return sections;};SDPUtils.matchPrefix=function(blob,prefix){return SDPUtils.splitLines(blob).filter(function(line){return line.indexOf(prefix)===0;});};SDPUtils.parseCandidate=function(line){var parts;if(line.indexOf('a=candidate:')===0){parts=line.substring(12).split(' ');}else{parts=line.substring(10).split(' ');}
|
|
||||||
var candidate={foundation:parts[0],component:parseInt(parts[1],10),protocol:parts[2].toLowerCase(),priority:parseInt(parts[3],10),ip:parts[4],address:parts[4],port:parseInt(parts[5],10),type:parts[7]};for(var i=8;i<parts.length;i+=2){switch(parts[i]){case'raddr':candidate.relatedAddress=parts[i+1];break;case'rport':candidate.relatedPort=parseInt(parts[i+1],10);break;case'tcptype':candidate.tcpType=parts[i+1];break;case'ufrag':candidate.ufrag=parts[i+1];candidate.usernameFragment=parts[i+1];break;default:candidate[parts[i]]=parts[i+1];break;}}
|
|
||||||
return candidate;};SDPUtils.writeCandidate=function(candidate){var sdp=[];sdp.push(candidate.foundation);sdp.push(candidate.component);sdp.push(candidate.protocol.toUpperCase());sdp.push(candidate.priority);sdp.push(candidate.address||candidate.ip);sdp.push(candidate.port);var type=candidate.type;sdp.push('typ');sdp.push(type);if(type!=='host'&&candidate.relatedAddress&&candidate.relatedPort){sdp.push('raddr');sdp.push(candidate.relatedAddress);sdp.push('rport');sdp.push(candidate.relatedPort);}
|
|
||||||
if(candidate.tcpType&&candidate.protocol.toLowerCase()==='tcp'){sdp.push('tcptype');sdp.push(candidate.tcpType);}
|
|
||||||
if(candidate.usernameFragment||candidate.ufrag){sdp.push('ufrag');sdp.push(candidate.usernameFragment||candidate.ufrag);}
|
|
||||||
return'candidate:'+sdp.join(' ');};SDPUtils.parseIceOptions=function(line){return line.substr(14).split(' ');};SDPUtils.parseRtpMap=function(line){var parts=line.substr(9).split(' ');var parsed={payloadType:parseInt(parts.shift(),10)};parts=parts[0].split('/');parsed.name=parts[0];parsed.clockRate=parseInt(parts[1],10);parsed.channels=parts.length===3?parseInt(parts[2],10):1;parsed.numChannels=parsed.channels;return parsed;};SDPUtils.writeRtpMap=function(codec){var pt=codec.payloadType;if(codec.preferredPayloadType!==undefined){pt=codec.preferredPayloadType;}
|
|
||||||
var channels=codec.channels||codec.numChannels||1;return'a=rtpmap:'+pt+' '+codec.name+'/'+codec.clockRate+
|
|
||||||
(channels!==1?'/'+channels:'')+'\r\n';};SDPUtils.parseExtmap=function(line){var parts=line.substr(9).split(' ');return{id:parseInt(parts[0],10),direction:parts[0].indexOf('/')>0?parts[0].split('/')[1]:'sendrecv',uri:parts[1]};};SDPUtils.writeExtmap=function(headerExtension){return'a=extmap:'+(headerExtension.id||headerExtension.preferredId)+
|
|
||||||
(headerExtension.direction&&headerExtension.direction!=='sendrecv'?'/'+headerExtension.direction:'')+' '+headerExtension.uri+'\r\n';};SDPUtils.parseFmtp=function(line){var parsed={};var kv;var parts=line.substr(line.indexOf(' ')+1).split(';');for(var j=0;j<parts.length;j++){kv=parts[j].trim().split('=');parsed[kv[0].trim()]=kv[1];}
|
|
||||||
return parsed;};SDPUtils.writeFmtp=function(codec){var line='';var pt=codec.payloadType;if(codec.preferredPayloadType!==undefined){pt=codec.preferredPayloadType;}
|
|
||||||
if(codec.parameters&&Object.keys(codec.parameters).length){var params=[];Object.keys(codec.parameters).forEach(function(param){if(codec.parameters[param]){params.push(param+'='+codec.parameters[param]);}else{params.push(param);}});line+='a=fmtp:'+pt+' '+params.join(';')+'\r\n';}
|
|
||||||
return line;};SDPUtils.parseRtcpFb=function(line){var parts=line.substr(line.indexOf(' ')+1).split(' ');return{type:parts.shift(),parameter:parts.join(' ')};};SDPUtils.writeRtcpFb=function(codec){var lines='';var pt=codec.payloadType;if(codec.preferredPayloadType!==undefined){pt=codec.preferredPayloadType;}
|
|
||||||
if(codec.rtcpFeedback&&codec.rtcpFeedback.length){codec.rtcpFeedback.forEach(function(fb){lines+='a=rtcp-fb:'+pt+' '+fb.type+
|
|
||||||
(fb.parameter&&fb.parameter.length?' '+fb.parameter:'')+'\r\n';});}
|
|
||||||
return lines;};SDPUtils.parseSsrcMedia=function(line){var sp=line.indexOf(' ');var parts={ssrc:parseInt(line.substr(7,sp-7),10)};var colon=line.indexOf(':',sp);if(colon>-1){parts.attribute=line.substr(sp+1,colon-sp-1);parts.value=line.substr(colon+1);}else{parts.attribute=line.substr(sp+1);}
|
|
||||||
return parts;};SDPUtils.parseSsrcGroup=function(line){var parts=line.substr(13).split(' ');return{semantics:parts.shift(),ssrcs:parts.map(function(ssrc){return parseInt(ssrc,10);})};};SDPUtils.getMid=function(mediaSection){var mid=SDPUtils.matchPrefix(mediaSection,'a=mid:')[0];if(mid){return mid.substr(6);}};SDPUtils.parseFingerprint=function(line){var parts=line.substr(14).split(' ');return{algorithm:parts[0].toLowerCase(),value:parts[1]};};SDPUtils.getDtlsParameters=function(mediaSection,sessionpart){var lines=SDPUtils.matchPrefix(mediaSection+sessionpart,'a=fingerprint:');return{role:'auto',fingerprints:lines.map(SDPUtils.parseFingerprint)};};SDPUtils.writeDtlsParameters=function(params,setupType){var sdp='a=setup:'+setupType+'\r\n';params.fingerprints.forEach(function(fp){sdp+='a=fingerprint:'+fp.algorithm+' '+fp.value+'\r\n';});return sdp;};SDPUtils.getIceParameters=function(mediaSection,sessionpart){var lines=SDPUtils.splitLines(mediaSection);lines=lines.concat(SDPUtils.splitLines(sessionpart));var iceParameters={usernameFragment:lines.filter(function(line){return line.indexOf('a=ice-ufrag:')===0;})[0].substr(12),password:lines.filter(function(line){return line.indexOf('a=ice-pwd:')===0;})[0].substr(10)};return iceParameters;};SDPUtils.writeIceParameters=function(params){return'a=ice-ufrag:'+params.usernameFragment+'\r\n'+'a=ice-pwd:'+params.password+'\r\n';};SDPUtils.parseRtpParameters=function(mediaSection){var description={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]};var lines=SDPUtils.splitLines(mediaSection);var mline=lines[0].split(' ');for(var i=3;i<mline.length;i++){var pt=mline[i];var rtpmapline=SDPUtils.matchPrefix(mediaSection,'a=rtpmap:'+pt+' ')[0];if(rtpmapline){var codec=SDPUtils.parseRtpMap(rtpmapline);var fmtps=SDPUtils.matchPrefix(mediaSection,'a=fmtp:'+pt+' ');codec.parameters=fmtps.length?SDPUtils.parseFmtp(fmtps[0]):{};codec.rtcpFeedback=SDPUtils.matchPrefix(mediaSection,'a=rtcp-fb:'+pt+' ').map(SDPUtils.parseRtcpFb);description.codecs.push(codec);switch(codec.name.toUpperCase()){case'RED':case'ULPFEC':description.fecMechanisms.push(codec.name.toUpperCase());break;default:break;}}}
|
|
||||||
SDPUtils.matchPrefix(mediaSection,'a=extmap:').forEach(function(line){description.headerExtensions.push(SDPUtils.parseExtmap(line));});return description;};SDPUtils.writeRtpDescription=function(kind,caps){var sdp='';sdp+='m='+kind+' ';sdp+=caps.codecs.length>0?'9':'0';sdp+=' UDP/TLS/RTP/SAVPF ';sdp+=caps.codecs.map(function(codec){if(codec.preferredPayloadType!==undefined){return codec.preferredPayloadType;}
|
|
||||||
return codec.payloadType;}).join(' ')+'\r\n';sdp+='c=IN IP4 0.0.0.0\r\n';sdp+='a=rtcp:9 IN IP4 0.0.0.0\r\n';caps.codecs.forEach(function(codec){sdp+=SDPUtils.writeRtpMap(codec);sdp+=SDPUtils.writeFmtp(codec);sdp+=SDPUtils.writeRtcpFb(codec);});var maxptime=0;caps.codecs.forEach(function(codec){if(codec.maxptime>maxptime){maxptime=codec.maxptime;}});if(maxptime>0){sdp+='a=maxptime:'+maxptime+'\r\n';}
|
|
||||||
sdp+='a=rtcp-mux\r\n';if(caps.headerExtensions){caps.headerExtensions.forEach(function(extension){sdp+=SDPUtils.writeExtmap(extension);});}
|
|
||||||
return sdp;};SDPUtils.parseRtpEncodingParameters=function(mediaSection){var encodingParameters=[];var description=SDPUtils.parseRtpParameters(mediaSection);var hasRed=description.fecMechanisms.indexOf('RED')!==-1;var hasUlpfec=description.fecMechanisms.indexOf('ULPFEC')!==-1;var ssrcs=SDPUtils.matchPrefix(mediaSection,'a=ssrc:').map(function(line){return SDPUtils.parseSsrcMedia(line);}).filter(function(parts){return parts.attribute==='cname';});var primarySsrc=ssrcs.length>0&&ssrcs[0].ssrc;var secondarySsrc;var flows=SDPUtils.matchPrefix(mediaSection,'a=ssrc-group:FID').map(function(line){var parts=line.substr(17).split(' ');return parts.map(function(part){return parseInt(part,10);});});if(flows.length>0&&flows[0].length>1&&flows[0][0]===primarySsrc){secondarySsrc=flows[0][1];}
|
|
||||||
description.codecs.forEach(function(codec){if(codec.name.toUpperCase()==='RTX'&&codec.parameters.apt){var encParam={ssrc:primarySsrc,codecPayloadType:parseInt(codec.parameters.apt,10)};if(primarySsrc&&secondarySsrc){encParam.rtx={ssrc:secondarySsrc};}
|
|
||||||
encodingParameters.push(encParam);if(hasRed){encParam=JSON.parse(JSON.stringify(encParam));encParam.fec={ssrc:primarySsrc,mechanism:hasUlpfec?'red+ulpfec':'red'};encodingParameters.push(encParam);}}});if(encodingParameters.length===0&&primarySsrc){encodingParameters.push({ssrc:primarySsrc});}
|
|
||||||
var bandwidth=SDPUtils.matchPrefix(mediaSection,'b=');if(bandwidth.length){if(bandwidth[0].indexOf('b=TIAS:')===0){bandwidth=parseInt(bandwidth[0].substr(7),10);}else if(bandwidth[0].indexOf('b=AS:')===0){bandwidth=parseInt(bandwidth[0].substr(5),10)*1000*0.95
|
|
||||||
-(50*40*8);}else{bandwidth=undefined;}
|
|
||||||
encodingParameters.forEach(function(params){params.maxBitrate=bandwidth;});}
|
|
||||||
return encodingParameters;};SDPUtils.parseRtcpParameters=function(mediaSection){var rtcpParameters={};var remoteSsrc=SDPUtils.matchPrefix(mediaSection,'a=ssrc:').map(function(line){return SDPUtils.parseSsrcMedia(line);}).filter(function(obj){return obj.attribute==='cname';})[0];if(remoteSsrc){rtcpParameters.cname=remoteSsrc.value;rtcpParameters.ssrc=remoteSsrc.ssrc;}
|
|
||||||
var rsize=SDPUtils.matchPrefix(mediaSection,'a=rtcp-rsize');rtcpParameters.reducedSize=rsize.length>0;rtcpParameters.compound=rsize.length===0;var mux=SDPUtils.matchPrefix(mediaSection,'a=rtcp-mux');rtcpParameters.mux=mux.length>0;return rtcpParameters;};SDPUtils.parseMsid=function(mediaSection){var parts;var spec=SDPUtils.matchPrefix(mediaSection,'a=msid:');if(spec.length===1){parts=spec[0].substr(7).split(' ');return{stream:parts[0],track:parts[1]};}
|
|
||||||
var planB=SDPUtils.matchPrefix(mediaSection,'a=ssrc:').map(function(line){return SDPUtils.parseSsrcMedia(line);}).filter(function(msidParts){return msidParts.attribute==='msid';});if(planB.length>0){parts=planB[0].value.split(' ');return{stream:parts[0],track:parts[1]};}};SDPUtils.generateSessionId=function(){return Math.random().toString().substr(2,21);};SDPUtils.writeSessionBoilerplate=function(sessId,sessVer,sessUser){var sessionId;var version=sessVer!==undefined?sessVer:2;if(sessId){sessionId=sessId;}else{sessionId=SDPUtils.generateSessionId();}
|
|
||||||
var user=sessUser||'thisisadapterortc';return'v=0\r\n'+'o='+user+' '+sessionId+' '+version+' IN IP4 127.0.0.1\r\n'+'s=-\r\n'+'t=0 0\r\n';};SDPUtils.writeMediaSection=function(transceiver,caps,type,stream){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters());sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),type==='offer'?'actpass':'active');sdp+='a=mid:'+transceiver.mid+'\r\n';if(transceiver.direction){sdp+='a='+transceiver.direction+'\r\n';}else if(transceiver.rtpSender&&transceiver.rtpReceiver){sdp+='a=sendrecv\r\n';}else if(transceiver.rtpSender){sdp+='a=sendonly\r\n';}else if(transceiver.rtpReceiver){sdp+='a=recvonly\r\n';}else{sdp+='a=inactive\r\n';}
|
|
||||||
if(transceiver.rtpSender){var msid='msid:'+stream.id+' '+
|
|
||||||
transceiver.rtpSender.track.id+'\r\n';sdp+='a='+msid;sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].ssrc+' '+msid;if(transceiver.sendEncodingParameters[0].rtx){sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].rtx.ssrc+' '+msid;sdp+='a=ssrc-group:FID '+
|
|
||||||
transceiver.sendEncodingParameters[0].ssrc+' '+
|
|
||||||
transceiver.sendEncodingParameters[0].rtx.ssrc+'\r\n';}}
|
|
||||||
sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].ssrc+' cname:'+SDPUtils.localCName+'\r\n';if(transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx){sdp+='a=ssrc:'+transceiver.sendEncodingParameters[0].rtx.ssrc+' cname:'+SDPUtils.localCName+'\r\n';}
|
|
||||||
return sdp;};SDPUtils.getDirection=function(mediaSection,sessionpart){var lines=SDPUtils.splitLines(mediaSection);for(var i=0;i<lines.length;i++){switch(lines[i]){case'a=sendrecv':case'a=sendonly':case'a=recvonly':case'a=inactive':return lines[i].substr(2);default:}}
|
|
||||||
if(sessionpart){return SDPUtils.getDirection(sessionpart);}
|
|
||||||
return'sendrecv';};SDPUtils.getKind=function(mediaSection){var lines=SDPUtils.splitLines(mediaSection);var mline=lines[0].split(' ');return mline[0].substr(2);};SDPUtils.isRejected=function(mediaSection){return mediaSection.split(' ',2)[1]==='0';};SDPUtils.parseMLine=function(mediaSection){var lines=SDPUtils.splitLines(mediaSection);var parts=lines[0].substr(2).split(' ');return{kind:parts[0],port:parseInt(parts[1],10),protocol:parts[2],fmt:parts.slice(3).join(' ')};};SDPUtils.parseOLine=function(mediaSection){var line=SDPUtils.matchPrefix(mediaSection,'o=')[0];var parts=line.substr(2).split(' ');return{username:parts[0],sessionId:parts[1],sessionVersion:parseInt(parts[2],10),netType:parts[3],addressType:parts[4],address:parts[5]};};SDPUtils.isValidSDP=function(blob){if(typeof blob!=='string'||blob.length===0){return false;}
|
|
||||||
var lines=SDPUtils.splitLines(blob);for(var i=0;i<lines.length;i++){if(lines[i].length<2||lines[i].charAt(1)!=='='){return false;}}
|
|
||||||
return true;};if(typeof module==='object'){module.exports=SDPUtils;}},{}]},{},[1])(1)});
|
|
|
@ -1,599 +0,0 @@
|
||||||
'use strict';
|
|
||||||
var cur_call = null;
|
|
||||||
var confMan = null;
|
|
||||||
var verto;
|
|
||||||
var ringing = false;
|
|
||||||
var autocall = false;
|
|
||||||
var chatting_with = false;
|
|
||||||
|
|
||||||
$( ".selector" ).pagecontainer({ "theme": "a" });
|
|
||||||
|
|
||||||
function display(msg) {
|
|
||||||
$("#calltitle").html(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearConfMan() {
|
|
||||||
if (confMan) {
|
|
||||||
confMan.destroy();
|
|
||||||
confMan = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#conf").hide();
|
|
||||||
$("#message").hide();
|
|
||||||
chatting_with = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function goto_dialog(where) {
|
|
||||||
$( ":mobile-pagecontainer" ).pagecontainer( "change", "#dialog-" + where, { role: "dialog" } );
|
|
||||||
}
|
|
||||||
|
|
||||||
function goto_page(where, force) {
|
|
||||||
$( ":mobile-pagecontainer" ).pagecontainer( "change", "#page-" + where);
|
|
||||||
}
|
|
||||||
|
|
||||||
var first_login = false;
|
|
||||||
var online_visible = false;
|
|
||||||
function online(on) {
|
|
||||||
if (on) {
|
|
||||||
$("#online").show();
|
|
||||||
$("#offline").hide();
|
|
||||||
first_login = true;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
$("#online").hide();
|
|
||||||
$("#offline").show();
|
|
||||||
}
|
|
||||||
|
|
||||||
online_visible = on;
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupChat() {
|
|
||||||
$("#chatwin").html("");
|
|
||||||
|
|
||||||
$("#chatsend").click(function() {
|
|
||||||
if (!cur_call && chatting_with) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur_call.message({to: chatting_with,
|
|
||||||
body: $("#chatmsg").val(),
|
|
||||||
from_msg_name: cur_call.params.caller_id_name,
|
|
||||||
from_msg_number: cur_call.params.caller_id_number
|
|
||||||
});
|
|
||||||
$("#chatmsg").val("");
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#chatmsg").keyup(function (event) {
|
|
||||||
if (event.keyCode == 13 && !event.shiftKey) {
|
|
||||||
$( "#chatsend" ).trigger( "click" );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_vid() {
|
|
||||||
var use_vid = $("#use_vid").is(':checked');
|
|
||||||
return use_vid;
|
|
||||||
}
|
|
||||||
|
|
||||||
function messageTextToJQ(body) {
|
|
||||||
// Builds a jQuery collection from body text, linkifies http/https links, imageifies http/https links to images, and doesn't allow script injection
|
|
||||||
|
|
||||||
var match, $link, img_url, $body_parts = $(), rx = /(https?:\/\/[^ \n\r]+|\n\r|\n|\r)/;
|
|
||||||
|
|
||||||
while ((match = rx.exec(body)) !== null) {
|
|
||||||
if (match.index !== 0) {
|
|
||||||
$body_parts = $body_parts.add(document.createTextNode(body.substr(0, match.index)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match[0].match(/^(\n|\r|\n\r)$/)) {
|
|
||||||
// Make a BR from a newline
|
|
||||||
$body_parts = $body_parts.add($('<br />'));
|
|
||||||
body = body.substr(match.index + match[0].length);
|
|
||||||
} else {
|
|
||||||
// Make a link (or image)
|
|
||||||
$link = $('<a target="_blank" />').attr('href', match[0]);
|
|
||||||
|
|
||||||
if (match[0].search(/\.(gif|jpe?g|png)/) > -1) {
|
|
||||||
// Make an image
|
|
||||||
img_url = match[0];
|
|
||||||
|
|
||||||
// Handle dropbox links
|
|
||||||
if (img_url.indexOf('dropbox.com') !== -1) {
|
|
||||||
if (img_url.indexOf('?dl=1') === -1 && img_url.indexOf('?dl=0') === -1) {
|
|
||||||
img_url += '?dl=1';
|
|
||||||
} else if (img_url.indexOf('?dl=0') !== -1) {
|
|
||||||
img_url = img_url.replace(/dl=0$/, 'dl=1');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$link.append($('<img border="0" class="chatimg" />').attr('src', img_url));
|
|
||||||
} else {
|
|
||||||
// Make a link
|
|
||||||
$link.text(match[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
body = body.substr(match.index + match[0].length);
|
|
||||||
$body_parts = $body_parts.add($link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (body) {
|
|
||||||
$body_parts = $body_parts.add(document.createTextNode(body));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $body_parts;
|
|
||||||
} // END function messageTextToJQ
|
|
||||||
|
|
||||||
var callbacks = {
|
|
||||||
|
|
||||||
onMessage: function(verto, dialog, msg, data) {
|
|
||||||
|
|
||||||
switch (msg) {
|
|
||||||
case $.verto.enum.message.pvtEvent:
|
|
||||||
// console.error("pvtEvent", data.pvtData);
|
|
||||||
if (data.pvtData) {
|
|
||||||
switch (data.pvtData.action) {
|
|
||||||
|
|
||||||
case "conference-liveArray-part":
|
|
||||||
clearConfMan();
|
|
||||||
break;
|
|
||||||
case "conference-liveArray-join":
|
|
||||||
clearConfMan();
|
|
||||||
confMan = new $.verto.confMan(verto, {
|
|
||||||
tableID: "#conf_list",
|
|
||||||
statusID: "#conf_count",
|
|
||||||
mainModID: "#conf_mod",
|
|
||||||
displayID: "#conf_display",
|
|
||||||
dialog: dialog,
|
|
||||||
hasVid: check_vid(),
|
|
||||||
laData: data.pvtData
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#conf").show();
|
|
||||||
$("#chatwin").html("");
|
|
||||||
$("#message").show();
|
|
||||||
|
|
||||||
chatting_with = data.pvtData.chatID;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case $.verto.enum.message.clientReady:
|
|
||||||
// console.error("clientReady", data);
|
|
||||||
break;
|
|
||||||
case $.verto.enum.message.info:
|
|
||||||
var body = data.body;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// This section has been replaced with messageTextToJQ function
|
|
||||||
|
|
||||||
if (body.match(/\.gif|\.jpg|\.jpeg|\.png/)) {
|
|
||||||
var mod = "";
|
|
||||||
if (body.match(/dropbox.com/)) {
|
|
||||||
mod = "?dl=1";
|
|
||||||
}
|
|
||||||
body = body.replace(/(http[s]{0,1}:\/\/\S+)/g, "<a target='_blank' href='$1'>$1<br><img border='0' class='chatimg' src='$1'" + mod + "><\/a>");
|
|
||||||
} else {
|
|
||||||
body = body.replace(/(http[s]{0,1}:\/\/\S+)/g, "<a target='_blank' href='$1'>$1<\/a>");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (body.slice(-1) !== "\n") {
|
|
||||||
body += "\n";
|
|
||||||
}
|
|
||||||
body = body.replace(/(?:\r\n|\r|\n)/g, '<br />');
|
|
||||||
|
|
||||||
var from = data.from_msg_name || data.from;
|
|
||||||
|
|
||||||
$("#chatwin").append("<span class=chatuid>" + from + ":</span><br>" + body);
|
|
||||||
$('#chatwin').animate({"scrollTop": $('#chatwin')[0].scrollHeight}, "fast");
|
|
||||||
*/
|
|
||||||
|
|
||||||
var from = data.from_msg_name || data.from;
|
|
||||||
|
|
||||||
$('#chatwin')
|
|
||||||
.append($('<span class="chatuid" />').text(from + ':'))
|
|
||||||
.append($('<br />'))
|
|
||||||
.append(messageTextToJQ(body))
|
|
||||||
.append($('<br />'));
|
|
||||||
$('#chatwin').animate({"scrollTop": $('#chatwin')[0].scrollHeight}, "fast");
|
|
||||||
|
|
||||||
break;
|
|
||||||
case $.verto.enum.message.display:
|
|
||||||
var party = dialog.params.remote_caller_id_name + "<" + dialog.params.remote_caller_id_number + ">";
|
|
||||||
display("Talking to: " + dialog.cidString());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onDialogState: function(d) {
|
|
||||||
cur_call = d;
|
|
||||||
|
|
||||||
if (d.state == $.verto.enum.state.ringing) {
|
|
||||||
ringing = true;
|
|
||||||
} else {
|
|
||||||
ringing = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (d.state) {
|
|
||||||
case $.verto.enum.state.ringing:
|
|
||||||
display("Call From: " + d.cidString());
|
|
||||||
|
|
||||||
$("#ansbtn").click(function() {
|
|
||||||
cur_call.answer({
|
|
||||||
useStereo: $("#use_stereo").is(':checked'),
|
|
||||||
callee_id_name: $("#name").val(),
|
|
||||||
callee_id_number: $("#cid").val(),
|
|
||||||
});
|
|
||||||
$('#dialog-incoming-call').dialog('close');
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#declinebtn").click(function() {
|
|
||||||
cur_call.hangup({"cause": "CALL_REJECTED"});
|
|
||||||
$('#dialog-incoming-call').dialog('close');
|
|
||||||
});
|
|
||||||
|
|
||||||
goto_dialog("incoming-call");
|
|
||||||
$("#dialog-incoming-call-txt").text("Incoming call from: " + d.cidString());
|
|
||||||
|
|
||||||
if (d.params.wantVideo) {
|
|
||||||
$("#vansbtn").click(function() {
|
|
||||||
$("#use_vid").prop("checked", true);
|
|
||||||
cur_call.answer({
|
|
||||||
useVideo: true,
|
|
||||||
useStereo: $("#use_stereo").is(':checked')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
// the buttons in this jquery mobile wont hide .. gotta wrap them in a div as a workaround
|
|
||||||
$("#vansdiv").show();
|
|
||||||
} else {
|
|
||||||
$("#vansdiv").hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $.verto.enum.state.trying:
|
|
||||||
display("Calling: " + d.cidString());
|
|
||||||
goto_page("incall");
|
|
||||||
break;
|
|
||||||
case $.verto.enum.state.early:
|
|
||||||
case $.verto.enum.state.active:
|
|
||||||
display("Talking to: " + d.cidString());
|
|
||||||
goto_page("incall");
|
|
||||||
break;
|
|
||||||
case $.verto.enum.state.hangup:
|
|
||||||
$("#main_info").html("Call ended with cause: " + d.cause);
|
|
||||||
goto_page("main");
|
|
||||||
case $.verto.enum.state.destroy:
|
|
||||||
$("#hangup_cause").html("");
|
|
||||||
clearConfMan();
|
|
||||||
|
|
||||||
cur_call = null;
|
|
||||||
break;
|
|
||||||
case $.verto.enum.state.held:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
display("");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onWSLogin: function(v, success) {
|
|
||||||
display("");
|
|
||||||
|
|
||||||
cur_call = null;
|
|
||||||
ringing = false;
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
online(true);
|
|
||||||
|
|
||||||
/*
|
|
||||||
verto.subscribe("presence", {
|
|
||||||
handler: function(v, e) {
|
|
||||||
console.error("PRESENCE:", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!window.location.hash) {
|
|
||||||
goto_page("main");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (autocall) {
|
|
||||||
autocall = false;
|
|
||||||
docall();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto_page("main");
|
|
||||||
goto_dialog("login-error");
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
onWSClose: function(v, success) {
|
|
||||||
display("");
|
|
||||||
online(false);
|
|
||||||
var today = new Date();
|
|
||||||
$("#errordisplay").html("Connection Error.<br>Last Attempt: " + today);
|
|
||||||
goto_page("main");
|
|
||||||
},
|
|
||||||
|
|
||||||
onEvent: function(v, e) {
|
|
||||||
console.debug("GOT EVENT", e);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
$("#hold").click(function(e) {
|
|
||||||
cur_call.toggleHold();
|
|
||||||
goto_dialog("hold");
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#cancelxferbtn").click(function(e) {
|
|
||||||
$("#xferto").val("");
|
|
||||||
$("#xferdiv").hide();
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".startxferbtn").click(function(e) {
|
|
||||||
if ($('#xferdiv').is(':visible')) {
|
|
||||||
var xfer = $("#xferto").val();
|
|
||||||
if (xfer) {
|
|
||||||
cur_call.transfer(xfer);
|
|
||||||
}
|
|
||||||
$("#xferto").val("");
|
|
||||||
$("#xferdiv").hide();
|
|
||||||
} else {
|
|
||||||
$("#xferdiv").show();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#clearbtn").click(function(e) {
|
|
||||||
$("#ext").val("");
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".dialbtn").click(function(e) {
|
|
||||||
$("#ext").val($("#ext").val() + e.currentTarget.textContent);
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".dtmf").click(function(e) {
|
|
||||||
if ($('#xferdiv').is(':visible')) {
|
|
||||||
$("#xferto").val($("#xferto").val() + e.currentTarget.textContent);
|
|
||||||
} else {
|
|
||||||
cur_call.dtmf(e.currentTarget.textContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#hupbtn").click(function() {
|
|
||||||
verto.hangup();
|
|
||||||
cur_call = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#webcam").click(function() {
|
|
||||||
check_vid();
|
|
||||||
});
|
|
||||||
|
|
||||||
function docall() {
|
|
||||||
$('#ext').trigger('change');
|
|
||||||
|
|
||||||
if (cur_call) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#main_info").html("Trying");
|
|
||||||
|
|
||||||
cur_call = verto.newCall({
|
|
||||||
destination_number: $("#ext").val(),
|
|
||||||
caller_id_name: $("#name").val(),
|
|
||||||
caller_id_number: $("#cid").val(),
|
|
||||||
useVideo: check_vid(),
|
|
||||||
useStereo: $("#use_stereo").is(':checked')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#callbtn").click(function() {
|
|
||||||
docall();
|
|
||||||
});
|
|
||||||
|
|
||||||
function pop(id, cname, dft) {
|
|
||||||
var tmp = $.cookie(cname) || dft;
|
|
||||||
$.cookie(cname, tmp, {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
$(id).val(tmp).change(function() {
|
|
||||||
$.cookie(cname, $(id).val(), {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
cur_call = null;
|
|
||||||
|
|
||||||
if (!autocall) {
|
|
||||||
pop("#ext", "verto_demo_ext", "3500");
|
|
||||||
}
|
|
||||||
|
|
||||||
pop("#name", "verto_demo_name", "FreeSWITCH User");
|
|
||||||
pop("#cid", "verto_demo_cid", "1008");
|
|
||||||
pop("#textto", "verto_demo_textto", "1000");
|
|
||||||
|
|
||||||
pop("#login", "verto_demo_login", "1008");
|
|
||||||
pop("#passwd", "verto_demo_passwd", "1234");
|
|
||||||
|
|
||||||
pop("#hostName", "verto_demo_hostname", window.location.hostname);
|
|
||||||
pop("#wsURL", "verto_demo_wsurl", "wss://" + window.location.hostname + ":8082");
|
|
||||||
|
|
||||||
var tmp = $.cookie("verto_demo_vid_checked") || "false";
|
|
||||||
$.cookie("verto_demo_vid_checked", tmp, {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#use_vid").prop("checked", tmp === "true").change(function(e) {
|
|
||||||
tmp = $("#use_vid").is(':checked');
|
|
||||||
$.cookie("verto_demo_vid_checked", tmp ? "true" : "false", {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
tmp = $.cookie("verto_demo_stereo_checked") || "false";
|
|
||||||
$.cookie("verto_demo_stereo_checked", tmp, {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#use_stereo").prop("checked", tmp === "true").change(function(e) {
|
|
||||||
tmp = $("#use_stereo").is(':checked');
|
|
||||||
$.cookie("verto_demo_stereo_checked", tmp ? "true" : "false", {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
tmp = $.cookie("verto_demo_stun_checked") || "true";
|
|
||||||
$.cookie("verto_demo_stun_checked", tmp, {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#use_stun").prop("checked", tmp === "true").change(function(e) {
|
|
||||||
tmp = $("#use_stun").is(':checked');
|
|
||||||
$.cookie("verto_demo_stun_checked", tmp ? "true" : "false", {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
if (verto) {
|
|
||||||
verto.iceServers(tmp);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
verto = new $.verto({
|
|
||||||
login: $("#login").val() + "@" + $("#hostName").val(),
|
|
||||||
passwd: $("#passwd").val(),
|
|
||||||
socketUrl: $("#wsURL").val(),
|
|
||||||
tag: "webcam",
|
|
||||||
ringFile: "sounds/bell_ring2.wav",
|
|
||||||
videoParams: {
|
|
||||||
"minWidth": "1280",
|
|
||||||
"minHeight": "720",
|
|
||||||
"minFrameRate": 30
|
|
||||||
},
|
|
||||||
audioParams: {
|
|
||||||
googAutoGainControl: false,
|
|
||||||
googNoiseSuppression: false,
|
|
||||||
googHighpassFilter: false
|
|
||||||
},
|
|
||||||
iceServers: $("#use_stun").is(':checked')
|
|
||||||
},callbacks);
|
|
||||||
|
|
||||||
$("#login").change(function(e) {
|
|
||||||
$("#cid").val(e.currentTarget.value);
|
|
||||||
$.cookie("verto_demo_cid", e.currentTarget.value, {
|
|
||||||
expires: 365
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#vtxtbtn").click(function() {
|
|
||||||
verto.message({
|
|
||||||
to: $("#textto").val(),
|
|
||||||
body: $("#textmsg").val()
|
|
||||||
});
|
|
||||||
$("#textmsg").val("");
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#logoutbtn").click(function() {
|
|
||||||
verto.logout();
|
|
||||||
online(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#loginbtn").click(function() {
|
|
||||||
online(false);
|
|
||||||
verto.loginData({
|
|
||||||
login: $("#login").val() + "@" + $("#hostName").val(),
|
|
||||||
passwd: $("#passwd").val()
|
|
||||||
});
|
|
||||||
verto.login();
|
|
||||||
goto_page("main");
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#xferdiv").hide();
|
|
||||||
$("#webcam").hide();
|
|
||||||
|
|
||||||
online(false);
|
|
||||||
|
|
||||||
setupChat();
|
|
||||||
|
|
||||||
$("#ext").keyup(function (event) {
|
|
||||||
if (event.keyCode == 13) {
|
|
||||||
$( "#callbtn" ).trigger( "click" );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).keypress(function(event) {
|
|
||||||
if (!(cur_call && event.target.id == "page-incall")) return;
|
|
||||||
var key = String.fromCharCode(event.keyCode);
|
|
||||||
var i = parseInt(key);
|
|
||||||
|
|
||||||
|
|
||||||
if (key === "#" || key === "*" || key === "0" || (i > 0 && i <= 9)) {
|
|
||||||
cur_call.dtmf(key);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (window.location.hostname !== "webrtc.freeswitch.org") {
|
|
||||||
$("#directory").hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).ready(function() {
|
|
||||||
var hash = window.location.hash.substring(1);
|
|
||||||
var a = [];
|
|
||||||
|
|
||||||
if (hash && hash.indexOf("page-") == -1) {
|
|
||||||
window.location.hash = "";
|
|
||||||
$("#ext").val(hash);
|
|
||||||
autocall = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash && (a = hash.split("&"))) {
|
|
||||||
window.location.hash = a[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
init();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var lastTo = 0;
|
|
||||||
|
|
||||||
$(document).bind("pagecontainerchange", function(e, data) {
|
|
||||||
|
|
||||||
if (lastTo) {
|
|
||||||
clearTimeout(lastTo);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (window.location.hash) {
|
|
||||||
|
|
||||||
case "#page-incall":
|
|
||||||
lastTo = setTimeout(function() {
|
|
||||||
if (!cur_call) {
|
|
||||||
goto_page("main");
|
|
||||||
}
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "#page-main":
|
|
||||||
if (cur_call) {
|
|
||||||
goto_page("incall");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "#page-login":
|
|
||||||
|
|
||||||
lastTo = setTimeout(function() {
|
|
||||||
if (online_visible) {
|
|
||||||
goto_page("main");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
1000);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
jsmin
|
|
||||||
node_modules
|
|
||||||
verto-max.js
|
|
||||||
verto-min.js
|
|
|
@ -1,30 +0,0 @@
|
||||||
module.exports = function(grunt) {
|
|
||||||
|
|
||||||
grunt.initConfig({
|
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
|
||||||
|
|
||||||
jshint: {
|
|
||||||
files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'],
|
|
||||||
options: {
|
|
||||||
// options here to override JSHint defaults
|
|
||||||
globals: {
|
|
||||||
jQuery: true,
|
|
||||||
console: true,
|
|
||||||
module: true,
|
|
||||||
document: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
|
||||||
files: ['<%= jshint.files %>'],
|
|
||||||
tasks: ['jshint']
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
|
||||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
|
||||||
|
|
||||||
grunt.registerTask('default', ['jshint']);
|
|
||||||
|
|
||||||
};
|
|
|
@ -1,29 +0,0 @@
|
||||||
JSFILES=src/jquery.FSRTC.js src/jquery.jsonrpcclient.js src/jquery.verto.js src/vendor/adapter-latest.js
|
|
||||||
|
|
||||||
all: jsmin verto-min.js
|
|
||||||
|
|
||||||
jsmin: jsmin.c
|
|
||||||
$(CC) $< -o $@
|
|
||||||
|
|
||||||
verto-min.js: jsmin $(JSFILES)
|
|
||||||
cat $(JSFILES) | ./jsmin > $@
|
|
||||||
|
|
||||||
verto-max.js: jsmin $(JSFILES)
|
|
||||||
cat $(JSFILES) > $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f verto-min.js verto-max.js jsmin *~
|
|
||||||
|
|
||||||
install-demo: all
|
|
||||||
cp verto-min.js ../demo/js
|
|
||||||
|
|
||||||
install-maxdemo: all verto-max.js
|
|
||||||
cp verto-max.js ../demo/js/verto-min.js
|
|
||||||
|
|
||||||
install-video_demo: all
|
|
||||||
cp verto-min.js ../video_demo/js
|
|
||||||
cp verto-min.js ../video_demo-live_canvas/js
|
|
||||||
|
|
||||||
install-video_maxdemo: all verto-max.js
|
|
||||||
cp verto-max.js ../video_demo/js/verto-min.js
|
|
||||||
cp verto-max.js ../video_demo-live_canvas/js/verto-min.js
|
|
|
@ -1,10 +0,0 @@
|
||||||
This file needs to say more.
|
|
||||||
Documentation for the api needs to be developed with jsdoc-toolkit http://pulkitgoyal.in/documenting-jquery-plugins-jsdoc-toolkit/
|
|
||||||
|
|
||||||
Dependancies for DEMO
|
|
||||||
jquery-2.0.3.min.js
|
|
||||||
jquery-2.0.3.min.map
|
|
||||||
jquery.cookie.js
|
|
||||||
jquery.dataTables.js
|
|
||||||
jquery.json-2.4.min.js
|
|
||||||
jquery.mobile-1.3.2.min.js
|
|
|
@ -1,306 +0,0 @@
|
||||||
/* jsmin.c
|
|
||||||
2013-03-29
|
|
||||||
|
|
||||||
Copyright (c) 2002 Douglas Crockford (www.crockford.com)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
static int theA;
|
|
||||||
static int theB;
|
|
||||||
static int theLookahead = EOF;
|
|
||||||
static int theX = EOF;
|
|
||||||
static int theY = EOF;
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
error(char* s)
|
|
||||||
{
|
|
||||||
fputs("JSMIN Error: ", stderr);
|
|
||||||
fputs(s, stderr);
|
|
||||||
fputc('\n', stderr);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* isAlphanum -- return true if the character is a letter, digit, underscore,
|
|
||||||
dollar sign, or non-ASCII character.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
isAlphanum(int c)
|
|
||||||
{
|
|
||||||
return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
|
|
||||||
(c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' ||
|
|
||||||
c > 126);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* get -- return the next character from stdin. Watch out for lookahead. If
|
|
||||||
the character is a control character, translate it to a space or
|
|
||||||
linefeed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
get()
|
|
||||||
{
|
|
||||||
int c = theLookahead;
|
|
||||||
theLookahead = EOF;
|
|
||||||
if (c == EOF) {
|
|
||||||
c = getc(stdin);
|
|
||||||
}
|
|
||||||
if (c >= ' ' || c == '\n' || c == EOF) {
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
if (c == '\r') {
|
|
||||||
return '\n';
|
|
||||||
}
|
|
||||||
return ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* peek -- get the next character without getting it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
peek()
|
|
||||||
{
|
|
||||||
theLookahead = get();
|
|
||||||
return theLookahead;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* next -- get the next character, excluding comments. peek() is used to see
|
|
||||||
if a '/' is followed by a '/' or '*'.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
next()
|
|
||||||
{
|
|
||||||
int c = get();
|
|
||||||
if (c == '/') {
|
|
||||||
switch (peek()) {
|
|
||||||
case '/':
|
|
||||||
for (;;) {
|
|
||||||
c = get();
|
|
||||||
if (c <= '\n') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '*':
|
|
||||||
get();
|
|
||||||
while (c != ' ') {
|
|
||||||
switch (get()) {
|
|
||||||
case '*':
|
|
||||||
if (peek() == '/') {
|
|
||||||
get();
|
|
||||||
c = ' ';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EOF:
|
|
||||||
error("Unterminated comment.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
theY = theX;
|
|
||||||
theX = c;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* action -- do something! What you do is determined by the argument:
|
|
||||||
1 Output A. Copy B to A. Get the next B.
|
|
||||||
2 Copy B to A. Get the next B. (Delete A).
|
|
||||||
3 Get the next B. (Delete B).
|
|
||||||
action treats a string as a single character. Wow!
|
|
||||||
action recognizes a regular expression if it is preceded by ( or , or =.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
action(int d)
|
|
||||||
{
|
|
||||||
switch (d) {
|
|
||||||
case 1:
|
|
||||||
putc(theA, stdout);
|
|
||||||
if (
|
|
||||||
(theY == '\n' || theY == ' ') &&
|
|
||||||
(theA == '+' || theA == '-' || theA == '*' || theA == '/') &&
|
|
||||||
(theB == '+' || theB == '-' || theB == '*' || theB == '/')
|
|
||||||
) {
|
|
||||||
putc(theY, stdout);
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
theA = theB;
|
|
||||||
if (theA == '\'' || theA == '"' || theA == '`') {
|
|
||||||
for (;;) {
|
|
||||||
putc(theA, stdout);
|
|
||||||
theA = get();
|
|
||||||
if (theA == theB) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (theA == '\\') {
|
|
||||||
putc(theA, stdout);
|
|
||||||
theA = get();
|
|
||||||
}
|
|
||||||
if (theA == EOF) {
|
|
||||||
error("Unterminated string literal.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case 3:
|
|
||||||
theB = next();
|
|
||||||
if (theB == '/' && (
|
|
||||||
theA == '(' || theA == ',' || theA == '=' || theA == ':' ||
|
|
||||||
theA == '[' || theA == '!' || theA == '&' || theA == '|' ||
|
|
||||||
theA == '?' || theA == '+' || theA == '-' || theA == '~' ||
|
|
||||||
theA == '*' || theA == '/' || theA == '{' || theA == '\n'
|
|
||||||
)) {
|
|
||||||
putc(theA, stdout);
|
|
||||||
if (theA == '/' || theA == '*') {
|
|
||||||
putc(' ', stdout);
|
|
||||||
}
|
|
||||||
putc(theB, stdout);
|
|
||||||
for (;;) {
|
|
||||||
theA = get();
|
|
||||||
if (theA == '[') {
|
|
||||||
for (;;) {
|
|
||||||
putc(theA, stdout);
|
|
||||||
theA = get();
|
|
||||||
if (theA == ']') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (theA == '\\') {
|
|
||||||
putc(theA, stdout);
|
|
||||||
theA = get();
|
|
||||||
}
|
|
||||||
if (theA == EOF) {
|
|
||||||
error("Unterminated set in Regular Expression literal.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (theA == '/') {
|
|
||||||
switch (peek()) {
|
|
||||||
case '/':
|
|
||||||
case '*':
|
|
||||||
error("Unterminated set in Regular Expression literal.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
} else if (theA =='\\') {
|
|
||||||
putc(theA, stdout);
|
|
||||||
theA = get();
|
|
||||||
}
|
|
||||||
if (theA == EOF) {
|
|
||||||
error("Unterminated Regular Expression literal.");
|
|
||||||
}
|
|
||||||
putc(theA, stdout);
|
|
||||||
}
|
|
||||||
theB = next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* jsmin -- Copy the input to the output, deleting the characters which are
|
|
||||||
insignificant to JavaScript. Comments will be removed. Tabs will be
|
|
||||||
replaced with spaces. Carriage returns will be replaced with linefeeds.
|
|
||||||
Most spaces and linefeeds will be removed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
jsmin()
|
|
||||||
{
|
|
||||||
if (peek() == 0xEF) {
|
|
||||||
get();
|
|
||||||
get();
|
|
||||||
get();
|
|
||||||
}
|
|
||||||
theA = '\n';
|
|
||||||
action(3);
|
|
||||||
while (theA != EOF) {
|
|
||||||
switch (theA) {
|
|
||||||
case ' ':
|
|
||||||
action(isAlphanum(theB) ? 1 : 2);
|
|
||||||
break;
|
|
||||||
case '\n':
|
|
||||||
switch (theB) {
|
|
||||||
case '{':
|
|
||||||
case '[':
|
|
||||||
case '(':
|
|
||||||
case '+':
|
|
||||||
case '-':
|
|
||||||
case '!':
|
|
||||||
case '~':
|
|
||||||
action(1);
|
|
||||||
break;
|
|
||||||
case ' ':
|
|
||||||
action(3);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
action(isAlphanum(theB) ? 1 : 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
switch (theB) {
|
|
||||||
case ' ':
|
|
||||||
action(isAlphanum(theA) ? 1 : 3);
|
|
||||||
break;
|
|
||||||
case '\n':
|
|
||||||
switch (theA) {
|
|
||||||
case '}':
|
|
||||||
case ']':
|
|
||||||
case ')':
|
|
||||||
case '+':
|
|
||||||
case '-':
|
|
||||||
case '"':
|
|
||||||
case '\'':
|
|
||||||
case '`':
|
|
||||||
action(1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
action(isAlphanum(theA) ? 1 : 3);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
action(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* main -- Output any command line arguments as comments
|
|
||||||
and then minify the input.
|
|
||||||
*/
|
|
||||||
extern int
|
|
||||||
main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 1; i < argc; i += 1) {
|
|
||||||
fprintf(stdout, "// %s\n", argv[i]);
|
|
||||||
}
|
|
||||||
jsmin();
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"name": "verto",
|
|
||||||
"version": "0.0.2",
|
|
||||||
"devDependencies": {
|
|
||||||
"grunt": "~0.4.5",
|
|
||||||
"grunt-contrib-jshint": "~0.10.0",
|
|
||||||
"grunt-contrib-watch": "*"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,731 +0,0 @@
|
||||||
/*
|
|
||||||
* Verto HTML5/Javascript Telephony Signaling and Control Protocol Stack for FreeSWITCH
|
|
||||||
* Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
|
|
||||||
*
|
|
||||||
* Version: MPL 1.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is jquery.jsonrpclient.js modified for Verto HTML5/Javascript Telephony Signaling and Control Protocol Stack for FreeSWITCH
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Textalk AB http://textalk.se/
|
|
||||||
* Portions created by the Initial Developer are Copyright (C)
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
*
|
|
||||||
* Anthony Minessale II <anthm@freeswitch.org>
|
|
||||||
*
|
|
||||||
* jquery.jsonrpclient.js - JSON RPC client code
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* This plugin requires jquery.json.js to be available, or at least the methods $.toJSON and
|
|
||||||
* $.parseJSON.
|
|
||||||
*
|
|
||||||
* The plan is to make use of websockets if they are available, but work just as well with only
|
|
||||||
* http if not.
|
|
||||||
*
|
|
||||||
* Usage example:
|
|
||||||
*
|
|
||||||
* var foo = new $.JsonRpcClient({ ajaxUrl: '/backend/jsonrpc' });
|
|
||||||
* foo.call(
|
|
||||||
* 'bar', [ 'A parameter', 'B parameter' ],
|
|
||||||
* function(result) { alert('Foo bar answered: ' + result.my_answer); },
|
|
||||||
* function(error) { console.log('There was an error', error); }
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* More examples are available in README.md
|
|
||||||
*/
|
|
||||||
(function($) {
|
|
||||||
/**
|
|
||||||
* @fn new
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*
|
|
||||||
* @param options An object stating the backends:
|
|
||||||
* ajaxUrl A url (relative or absolute) to a http(s) backend.
|
|
||||||
* socketUrl A url (relative of absolute) to a ws(s) backend.
|
|
||||||
* onmessage A socket message handler for other messages (non-responses).
|
|
||||||
* getSocket A function returning a WebSocket or null.
|
|
||||||
* It must take an onmessage_cb and bind it to the onmessage event
|
|
||||||
* (or chain it before/after some other onmessage handler).
|
|
||||||
* Or, it could return null if no socket is available.
|
|
||||||
* The returned instance must have readyState <= 1, and if less than 1,
|
|
||||||
* react to onopen binding.
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient = function(options) {
|
|
||||||
var self = this;
|
|
||||||
this.options = $.extend({
|
|
||||||
ajaxUrl : null,
|
|
||||||
socketUrl : null, ///< The ws-url for default getSocket.
|
|
||||||
onmessage : null, ///< Other onmessage-handler.
|
|
||||||
login : null, /// auth login
|
|
||||||
passwd : null, /// auth passwd
|
|
||||||
sessid : null,
|
|
||||||
loginParams : null,
|
|
||||||
userVariables : null,
|
|
||||||
getSocket : function(onmessage_cb) { return self._getSocket(onmessage_cb); }
|
|
||||||
}, options);
|
|
||||||
|
|
||||||
self.ws_cnt = 0;
|
|
||||||
|
|
||||||
// Declare an instance version of the onmessage callback to wrap 'this'.
|
|
||||||
this.wsOnMessage = function(event) { self._wsOnMessage(event); };
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Holding the WebSocket on default getsocket.
|
|
||||||
$.JsonRpcClient.prototype._ws_socket = null;
|
|
||||||
|
|
||||||
/// Object <id>: { success_cb: cb, error_cb: cb }
|
|
||||||
$.JsonRpcClient.prototype._ws_callbacks = {};
|
|
||||||
|
|
||||||
/// The next JSON-RPC request id.
|
|
||||||
$.JsonRpcClient.prototype._current_id = 1;
|
|
||||||
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype.speedTest = function (bytes, cb) {
|
|
||||||
var socket = this.options.getSocket(this.wsOnMessage);
|
|
||||||
if (socket !== null) {
|
|
||||||
this.speedCB = cb;
|
|
||||||
this.speedBytes = bytes;
|
|
||||||
socket.send("#SPU " + bytes);
|
|
||||||
|
|
||||||
var loops = bytes / 1024;
|
|
||||||
var rem = bytes % 1024;
|
|
||||||
var i;
|
|
||||||
var data = new Array(1024).join(".");
|
|
||||||
for (i = 0; i < loops; i++) {
|
|
||||||
socket.send("#SPB " + data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rem) {
|
|
||||||
socket.send("#SPB " + data);
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.send("#SPE");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @fn call
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*
|
|
||||||
* @param method The method to run on JSON-RPC server.
|
|
||||||
* @param params The params; an array or object.
|
|
||||||
* @param success_cb A callback for successful request.
|
|
||||||
* @param error_cb A callback for error.
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient.prototype.call = function(method, params, success_cb, error_cb) {
|
|
||||||
// Construct the JSON-RPC 2.0 request.
|
|
||||||
|
|
||||||
if (!params) {
|
|
||||||
params = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.sessid) {
|
|
||||||
params.sessid = this.options.sessid;
|
|
||||||
}
|
|
||||||
|
|
||||||
var request = {
|
|
||||||
jsonrpc : '2.0',
|
|
||||||
method : method,
|
|
||||||
params : params,
|
|
||||||
id : this._current_id++ // Increase the id counter to match request/response
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!success_cb) {
|
|
||||||
success_cb = function(e){console.log("Success: ", e);};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!error_cb) {
|
|
||||||
error_cb = function(e){console.log("Error: ", e);};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try making a WebSocket call.
|
|
||||||
var socket = this.options.getSocket(this.wsOnMessage);
|
|
||||||
if (socket !== null) {
|
|
||||||
this._wsCall(socket, request, success_cb, error_cb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No WebSocket, and no HTTP backend? This won't work.
|
|
||||||
if (this.options.ajaxUrl === null) {
|
|
||||||
throw "$.JsonRpcClient.call used with no websocket and no http endpoint.";
|
|
||||||
}
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
type : 'POST',
|
|
||||||
url : this.options.ajaxUrl,
|
|
||||||
data : $.toJSON(request),
|
|
||||||
dataType : 'json',
|
|
||||||
cache : false,
|
|
||||||
|
|
||||||
success : function(data) {
|
|
||||||
if ('error' in data) error_cb(data.error, this);
|
|
||||||
success_cb(data.result, this);
|
|
||||||
},
|
|
||||||
|
|
||||||
// JSON-RPC Server could return non-200 on error
|
|
||||||
error : function(jqXHR, textStatus, errorThrown) {
|
|
||||||
try {
|
|
||||||
var response = $.parseJSON(jqXHR.responseText);
|
|
||||||
|
|
||||||
if ('console' in window) console.log(response);
|
|
||||||
|
|
||||||
error_cb(response.error, this);
|
|
||||||
} catch (err) {
|
|
||||||
// Perhaps the responseText wasn't really a jsonrpc-error.
|
|
||||||
error_cb({ error: jqXHR.responseText }, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notify sends a command to the server that won't need a response. In http, there is probably
|
|
||||||
* an empty response - that will be dropped, but in ws there should be no response at all.
|
|
||||||
*
|
|
||||||
* This is very similar to call, but has no id and no handling of callbacks.
|
|
||||||
*
|
|
||||||
* @fn notify
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*
|
|
||||||
* @param method The method to run on JSON-RPC server.
|
|
||||||
* @param params The params; an array or object.
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient.prototype.notify = function(method, params) {
|
|
||||||
// Construct the JSON-RPC 2.0 request.
|
|
||||||
|
|
||||||
if (this.options.sessid) {
|
|
||||||
params.sessid = this.options.sessid;
|
|
||||||
}
|
|
||||||
|
|
||||||
var request = {
|
|
||||||
jsonrpc: '2.0',
|
|
||||||
method: method,
|
|
||||||
params: params
|
|
||||||
};
|
|
||||||
|
|
||||||
// Try making a WebSocket call.
|
|
||||||
var socket = this.options.getSocket(this.wsOnMessage);
|
|
||||||
if (socket !== null) {
|
|
||||||
this._wsCall(socket, request);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No WebSocket, and no HTTP backend? This won't work.
|
|
||||||
if (this.options.ajaxUrl === null) {
|
|
||||||
throw "$.JsonRpcClient.notify used with no websocket and no http endpoint.";
|
|
||||||
}
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
type : 'POST',
|
|
||||||
url : this.options.ajaxUrl,
|
|
||||||
data : $.toJSON(request),
|
|
||||||
dataType : 'json',
|
|
||||||
cache : false
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make a batch-call by using a callback.
|
|
||||||
*
|
|
||||||
* The callback will get an object "batch" as only argument. On batch, you can call the methods
|
|
||||||
* "call" and "notify" just as if it was a normal $.JsonRpcClient object, and all calls will be
|
|
||||||
* sent as a batch call then the callback is done.
|
|
||||||
*
|
|
||||||
* @fn batch
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*
|
|
||||||
* @param callback The main function which will get a batch handler to run call and notify on.
|
|
||||||
* @param all_done_cb A callback function to call after all results have been handled.
|
|
||||||
* @param error_cb A callback function to call if there is an error from the server.
|
|
||||||
* Note, that batch calls should always get an overall success, and the
|
|
||||||
* only error
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient.prototype.batch = function(callback, all_done_cb, error_cb) {
|
|
||||||
var batch = new $.JsonRpcClient._batchObject(this, all_done_cb, error_cb);
|
|
||||||
callback(batch);
|
|
||||||
batch._execute();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The default getSocket handler.
|
|
||||||
*
|
|
||||||
* @param onmessage_cb The callback to be bound to onmessage events on the socket.
|
|
||||||
*
|
|
||||||
* @fn _getSocket
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype.socketReady = function() {
|
|
||||||
if (this._ws_socket === null || this._ws_socket.readyState > 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype.closeSocket = function() {
|
|
||||||
var self = this;
|
|
||||||
if (self.socketReady()) {
|
|
||||||
self._ws_socket.onclose = function (w) {console.log("Closing Socket");};
|
|
||||||
self._ws_socket.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype.loginData = function(params) {
|
|
||||||
var self = this;
|
|
||||||
self.options.login = params.login;
|
|
||||||
self.options.passwd = params.passwd;
|
|
||||||
self.options.loginParams = params.loginParams;
|
|
||||||
self.options.userVariables = params.userVariables;
|
|
||||||
};
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype.connectSocket = function(onmessage_cb) {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
if (self.to) {
|
|
||||||
clearTimeout(self.to);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!self.socketReady()) {
|
|
||||||
self.authing = false;
|
|
||||||
|
|
||||||
if (self._ws_socket) {
|
|
||||||
delete self._ws_socket;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No socket, or dying socket, let's get a new one.
|
|
||||||
self._ws_socket = new WebSocket(self.options.socketUrl);
|
|
||||||
|
|
||||||
if (self._ws_socket) {
|
|
||||||
// Set up onmessage handler.
|
|
||||||
self._ws_socket.onmessage = onmessage_cb;
|
|
||||||
self._ws_socket.onclose = function (w) {
|
|
||||||
if (!self.ws_sleep) {
|
|
||||||
self.ws_sleep = 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.options.onWSClose) {
|
|
||||||
self.options.onWSClose(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.ws_cnt > 10 && self.options.wsFallbackURL) {
|
|
||||||
self.options.socketUrl = self.options.wsFallbackURL;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.error("Websocket Lost " + self.ws_cnt + " sleep: " + self.ws_sleep + "msec");
|
|
||||||
|
|
||||||
self.to = setTimeout(function() {
|
|
||||||
console.log("Attempting Reconnection....");
|
|
||||||
self.connectSocket(onmessage_cb);
|
|
||||||
}, self.ws_sleep);
|
|
||||||
|
|
||||||
self.ws_cnt++;
|
|
||||||
|
|
||||||
if (self.ws_sleep < 3000 && (self.ws_cnt % 10) === 0) {
|
|
||||||
self.ws_sleep += 1000;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set up sending of message for when the socket is open.
|
|
||||||
self._ws_socket.onopen = function() {
|
|
||||||
if (self.to) {
|
|
||||||
clearTimeout(self.to);
|
|
||||||
}
|
|
||||||
self.ws_sleep = 1000;
|
|
||||||
self.ws_cnt = 0;
|
|
||||||
if (self.options.onWSConnect) {
|
|
||||||
self.options.onWSConnect(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
var req;
|
|
||||||
// Send the requests.
|
|
||||||
while ((req = $.JsonRpcClient.q.pop())) {
|
|
||||||
self._ws_socket.send(req);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return self._ws_socket ? true : false;
|
|
||||||
};
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype.stopRetrying = function() {
|
|
||||||
if (self.to)
|
|
||||||
clearTimeout(self.to);
|
|
||||||
}
|
|
||||||
|
|
||||||
$.JsonRpcClient.prototype._getSocket = function(onmessage_cb) {
|
|
||||||
// If there is no ws url set, we don't have a socket.
|
|
||||||
// Likewise, if there is no window.WebSocket.
|
|
||||||
if (this.options.socketUrl === null || !("WebSocket" in window)) return null;
|
|
||||||
|
|
||||||
this.connectSocket(onmessage_cb);
|
|
||||||
|
|
||||||
return this._ws_socket;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Queue to save messages delivered when websocket is not ready
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient.q = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal handler to dispatch a JRON-RPC request through a websocket.
|
|
||||||
*
|
|
||||||
* @fn _wsCall
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient.prototype._wsCall = function(socket, request, success_cb, error_cb) {
|
|
||||||
var request_json = $.toJSON(request);
|
|
||||||
|
|
||||||
if (socket.readyState < 1) {
|
|
||||||
// The websocket is not open yet; we have to set sending of the message in onopen.
|
|
||||||
self = this; // In closure below, this is set to the WebSocket. Use self instead.
|
|
||||||
$.JsonRpcClient.q.push(request_json);
|
|
||||||
} else {
|
|
||||||
// We have a socket and it should be ready to send on.
|
|
||||||
socket.send(request_json);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup callbacks. If there is an id, this is a call and not a notify.
|
|
||||||
if ('id' in request && typeof success_cb !== 'undefined') {
|
|
||||||
this._ws_callbacks[request.id] = { request: request_json, request_obj: request, success_cb: success_cb, error_cb: error_cb };
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal handler for the websocket messages. It determines if the message is a JSON-RPC
|
|
||||||
* response, and if so, tries to couple it with a given callback. Otherwise, it falls back to
|
|
||||||
* given external onmessage-handler, if any.
|
|
||||||
*
|
|
||||||
* @param event The websocket onmessage-event.
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient.prototype._wsOnMessage = function(event) {
|
|
||||||
// Check if this could be a JSON RPC message.
|
|
||||||
var response;
|
|
||||||
|
|
||||||
// Special sub proto
|
|
||||||
if (event.data[0] == "#" && event.data[1] == "S" && event.data[2] == "P") {
|
|
||||||
if (event.data[3] == "U") {
|
|
||||||
this.up_dur = parseInt(event.data.substring(4));
|
|
||||||
} else if (this.speedCB && event.data[3] == "D") {
|
|
||||||
this.down_dur = parseInt(event.data.substring(4));
|
|
||||||
|
|
||||||
var up_kps = (((this.speedBytes * 8) / (this.up_dur / 1000)) / 1024).toFixed(0);
|
|
||||||
var down_kps = (((this.speedBytes * 8) / (this.down_dur / 1000)) / 1024).toFixed(0);
|
|
||||||
|
|
||||||
console.info("Speed Test: Up: " + up_kps + " Down: " + down_kps);
|
|
||||||
var cb = this.speedCB;
|
|
||||||
this.speedCB = null;
|
|
||||||
cb(event, {
|
|
||||||
upDur: this.up_dur,
|
|
||||||
downDur: this.down_dur,
|
|
||||||
upKPS: up_kps,
|
|
||||||
downKPS: down_kps
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
|
||||||
response = $.parseJSON(event.data);
|
|
||||||
|
|
||||||
/// @todo Make using the jsonrcp 2.0 check optional, to use this on JSON-RPC 1 backends.
|
|
||||||
|
|
||||||
if (typeof response === 'object' &&
|
|
||||||
'jsonrpc' in response &&
|
|
||||||
response.jsonrpc === '2.0') {
|
|
||||||
|
|
||||||
/// @todo Handle bad response (without id).
|
|
||||||
|
|
||||||
// If this is an object with result, it is a response.
|
|
||||||
if ('result' in response && this._ws_callbacks[response.id]) {
|
|
||||||
// Get the success callback.
|
|
||||||
var success_cb = this._ws_callbacks[response.id].success_cb;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// set the sessid if present
|
|
||||||
if ('sessid' in response.result && !this.options.sessid || (this.options.sessid != response.result.sessid)) {
|
|
||||||
this.options.sessid = response.result.sessid;
|
|
||||||
if (this.options.sessid) {
|
|
||||||
console.log("setting session UUID to: " + this.options.sessid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// Delete the callback from the storage.
|
|
||||||
delete this._ws_callbacks[response.id];
|
|
||||||
|
|
||||||
// Run callback with result as parameter.
|
|
||||||
success_cb(response.result, this);
|
|
||||||
return;
|
|
||||||
} else if ('error' in response && this._ws_callbacks[response.id]) {
|
|
||||||
// If this is an object with error, it is an error response.
|
|
||||||
|
|
||||||
// Get the error callback.
|
|
||||||
var error_cb = this._ws_callbacks[response.id].error_cb;
|
|
||||||
var orig_req = this._ws_callbacks[response.id].request;
|
|
||||||
|
|
||||||
// if this is an auth request, send the credentials and resend the failed request
|
|
||||||
if (!self.authing && response.error.code == -32000 && self.options.login && self.options.passwd) {
|
|
||||||
self.authing = true;
|
|
||||||
|
|
||||||
this.call("login", { login: self.options.login, passwd: self.options.passwd, loginParams: self.options.loginParams,
|
|
||||||
userVariables: self.options.userVariables},
|
|
||||||
this._ws_callbacks[response.id].request_obj.method == "login" ?
|
|
||||||
function(e) {
|
|
||||||
self.authing = false;
|
|
||||||
console.log("logged in");
|
|
||||||
delete self._ws_callbacks[response.id];
|
|
||||||
|
|
||||||
if (self.options.onWSLogin) {
|
|
||||||
self.options.onWSLogin(true, self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:
|
|
||||||
|
|
||||||
function(e) {
|
|
||||||
self.authing = false;
|
|
||||||
console.log("logged in, resending request id: " + response.id);
|
|
||||||
var socket = self.options.getSocket(self.wsOnMessage);
|
|
||||||
if (socket !== null) {
|
|
||||||
socket.send(orig_req);
|
|
||||||
}
|
|
||||||
if (self.options.onWSLogin) {
|
|
||||||
self.options.onWSLogin(true, self);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
function(e) {
|
|
||||||
console.log("error logging in, request id:", response.id);
|
|
||||||
delete self._ws_callbacks[response.id];
|
|
||||||
error_cb(response.error, this);
|
|
||||||
if (self.options.onWSLogin) {
|
|
||||||
self.options.onWSLogin(false, self);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the callback from the storage.
|
|
||||||
delete this._ws_callbacks[response.id];
|
|
||||||
|
|
||||||
// Run callback with the error object as parameter.
|
|
||||||
error_cb(response.error, this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// Probably an error while parsing a non json-string as json. All real JSON-RPC cases are
|
|
||||||
// handled above, and the fallback method is called below.
|
|
||||||
console.log("ERROR: "+ err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is not a JSON-RPC response. Call the fallback message handler, if given.
|
|
||||||
if (typeof this.options.onmessage === 'function') {
|
|
||||||
event.eventData = response;
|
|
||||||
if (!event.eventData) {
|
|
||||||
event.eventData = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
var reply = this.options.onmessage(event);
|
|
||||||
|
|
||||||
if (reply && typeof reply === "object" && event.eventData.id) {
|
|
||||||
var msg = {
|
|
||||||
jsonrpc: "2.0",
|
|
||||||
id: event.eventData.id,
|
|
||||||
result: reply
|
|
||||||
};
|
|
||||||
|
|
||||||
var socket = self.options.getSocket(self.wsOnMessage);
|
|
||||||
if (socket !== null) {
|
|
||||||
socket.send($.toJSON(msg));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************************************
|
|
||||||
* Batch object with methods
|
|
||||||
************************************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handling object for batch calls.
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient._batchObject = function(jsonrpcclient, all_done_cb, error_cb) {
|
|
||||||
// Array of objects to hold the call and notify requests. Each objects will have the request
|
|
||||||
// object, and unless it is a notify, success_cb and error_cb.
|
|
||||||
this._requests = [];
|
|
||||||
|
|
||||||
this.jsonrpcclient = jsonrpcclient;
|
|
||||||
this.all_done_cb = all_done_cb;
|
|
||||||
this.error_cb = typeof error_cb === 'function' ? error_cb : function() {};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @sa $.JsonRpcClient.prototype.call
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient._batchObject.prototype.call = function(method, params, success_cb, error_cb) {
|
|
||||||
|
|
||||||
if (!params) {
|
|
||||||
params = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.sessid) {
|
|
||||||
params.sessid = this.options.sessid;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!success_cb) {
|
|
||||||
success_cb = function(e){console.log("Success: ", e);};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!error_cb) {
|
|
||||||
error_cb = function(e){console.log("Error: ", e);};
|
|
||||||
}
|
|
||||||
|
|
||||||
this._requests.push({
|
|
||||||
request : {
|
|
||||||
jsonrpc : '2.0',
|
|
||||||
method : method,
|
|
||||||
params : params,
|
|
||||||
id : this.jsonrpcclient._current_id++ // Use the client's id series.
|
|
||||||
},
|
|
||||||
success_cb : success_cb,
|
|
||||||
error_cb : error_cb
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @sa $.JsonRpcClient.prototype.notify
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient._batchObject.prototype.notify = function(method, params) {
|
|
||||||
if (this.options.sessid) {
|
|
||||||
params.sessid = this.options.sessid;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._requests.push({
|
|
||||||
request : {
|
|
||||||
jsonrpc : '2.0',
|
|
||||||
method : method,
|
|
||||||
params : params
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes the batched up calls.
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient._batchObject.prototype._execute = function() {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
if (this._requests.length === 0) return; // All done :P
|
|
||||||
|
|
||||||
// Collect all request data and sort handlers by request id.
|
|
||||||
var batch_request = [];
|
|
||||||
var handlers = {};
|
|
||||||
var i = 0;
|
|
||||||
var call;
|
|
||||||
var success_cb;
|
|
||||||
var error_cb;
|
|
||||||
|
|
||||||
// If we have a WebSocket, just send the requests individually like normal calls.
|
|
||||||
var socket = self.jsonrpcclient.options.getSocket(self.jsonrpcclient.wsOnMessage);
|
|
||||||
if (socket !== null) {
|
|
||||||
for (i = 0; i < this._requests.length; i++) {
|
|
||||||
call = this._requests[i];
|
|
||||||
success_cb = ('success_cb' in call) ? call.success_cb : undefined;
|
|
||||||
error_cb = ('error_cb' in call) ? call.error_cb : undefined;
|
|
||||||
self.jsonrpcclient._wsCall(socket, call.request, success_cb, error_cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof all_done_cb === 'function') all_done_cb(result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < this._requests.length; i++) {
|
|
||||||
call = this._requests[i];
|
|
||||||
batch_request.push(call.request);
|
|
||||||
|
|
||||||
// If the request has an id, it should handle returns (otherwise it's a notify).
|
|
||||||
if ('id' in call.request) {
|
|
||||||
handlers[call.request.id] = {
|
|
||||||
success_cb : call.success_cb,
|
|
||||||
error_cb : call.error_cb
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
success_cb = function(data) { self._batchCb(data, handlers, self.all_done_cb); };
|
|
||||||
|
|
||||||
// No WebSocket, and no HTTP backend? This won't work.
|
|
||||||
if (self.jsonrpcclient.options.ajaxUrl === null) {
|
|
||||||
throw "$.JsonRpcClient.batch used with no websocket and no http endpoint.";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send request
|
|
||||||
$.ajax({
|
|
||||||
url : self.jsonrpcclient.options.ajaxUrl,
|
|
||||||
data : $.toJSON(batch_request),
|
|
||||||
dataType : 'json',
|
|
||||||
cache : false,
|
|
||||||
type : 'POST',
|
|
||||||
|
|
||||||
// Batch-requests should always return 200
|
|
||||||
error : function(jqXHR, textStatus, errorThrown) {
|
|
||||||
self.error_cb(jqXHR, textStatus, errorThrown);
|
|
||||||
},
|
|
||||||
success : success_cb
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal helper to match the result array from a batch call to their respective callbacks.
|
|
||||||
*
|
|
||||||
* @fn _batchCb
|
|
||||||
* @memberof $.JsonRpcClient
|
|
||||||
*/
|
|
||||||
$.JsonRpcClient._batchObject.prototype._batchCb = function(result, handlers, all_done_cb) {
|
|
||||||
for (var i = 0; i < result.length; i++) {
|
|
||||||
var response = result[i];
|
|
||||||
|
|
||||||
// Handle error
|
|
||||||
if ('error' in response) {
|
|
||||||
if (response.id === null || !(response.id in handlers)) {
|
|
||||||
// An error on a notify? Just log it to the console.
|
|
||||||
if ('console' in window) console.log(response);
|
|
||||||
} else {
|
|
||||||
handlers[response.id].error_cb(response.error, this);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Here we should always have a correct id and no error.
|
|
||||||
if (!(response.id in handlers) && 'console' in window) {
|
|
||||||
console.log(response);
|
|
||||||
} else {
|
|
||||||
handlers[response.id].success_cb(response.result, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof all_done_cb === 'function') all_done_cb(result);
|
|
||||||
};
|
|
||||||
|
|
||||||
})(jQuery);
|
|
|
@ -1,5 +0,0 @@
|
||||||
dist/
|
|
||||||
.tmp/
|
|
||||||
bower_components/
|
|
||||||
node_modules/
|
|
||||||
src/vertoControllers/controllers/AboutController.js
|
|
|
@ -1,62 +0,0 @@
|
||||||
{
|
|
||||||
"bitwise": true,
|
|
||||||
"camelcase": true,
|
|
||||||
"curly": true,
|
|
||||||
"eqeqeq": true,
|
|
||||||
"es3": false,
|
|
||||||
"forin": true,
|
|
||||||
"freeze": true,
|
|
||||||
"immed": true,
|
|
||||||
"indent": 4,
|
|
||||||
"latedef": "nofunc",
|
|
||||||
"newcap": true,
|
|
||||||
"noarg": true,
|
|
||||||
"noempty": true,
|
|
||||||
"nonbsp": true,
|
|
||||||
"nonew": true,
|
|
||||||
"plusplus": false,
|
|
||||||
"quotmark": "single",
|
|
||||||
"undef": true,
|
|
||||||
"unused": false,
|
|
||||||
"strict": false,
|
|
||||||
"maxparams": 10,
|
|
||||||
"maxdepth": 5,
|
|
||||||
"maxstatements": 40,
|
|
||||||
"maxcomplexity": 8,
|
|
||||||
"maxlen": 120,
|
|
||||||
|
|
||||||
"asi": false,
|
|
||||||
"boss": false,
|
|
||||||
"debug": false,
|
|
||||||
"eqnull": true,
|
|
||||||
"esnext": false,
|
|
||||||
"evil": false,
|
|
||||||
"expr": false,
|
|
||||||
"funcscope": false,
|
|
||||||
"globalstrict": false,
|
|
||||||
"iterator": false,
|
|
||||||
"lastsemic": false,
|
|
||||||
"laxbreak": false,
|
|
||||||
"laxcomma": false,
|
|
||||||
"loopfunc": true,
|
|
||||||
"maxerr": false,
|
|
||||||
"moz": false,
|
|
||||||
"multistr": false,
|
|
||||||
"notypeof": false,
|
|
||||||
"proto": false,
|
|
||||||
"scripturl": false,
|
|
||||||
"shadow": false,
|
|
||||||
"sub": true,
|
|
||||||
"supernew": false,
|
|
||||||
"validthis": false,
|
|
||||||
"noyield": false,
|
|
||||||
|
|
||||||
"browser": true,
|
|
||||||
"node": true,
|
|
||||||
|
|
||||||
"globals": {
|
|
||||||
"angular": false,
|
|
||||||
"$": false,
|
|
||||||
"jQuery": false
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,390 +0,0 @@
|
||||||
/*jslint node: true */
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// var pkg = require('./package.json');
|
|
||||||
|
|
||||||
module.exports = function (grunt) {
|
|
||||||
|
|
||||||
// Time how long tasks take. Can help when optimizing build times
|
|
||||||
require('time-grunt')(grunt);
|
|
||||||
|
|
||||||
// load all grunt tasks
|
|
||||||
require('jit-grunt')(grunt, {
|
|
||||||
includereplace: 'grunt-include-replace',
|
|
||||||
useminPrepare: 'grunt-usemin'
|
|
||||||
});
|
|
||||||
|
|
||||||
// Configurable paths
|
|
||||||
var config = {
|
|
||||||
app: './src',
|
|
||||||
dist: 'dist'
|
|
||||||
};
|
|
||||||
|
|
||||||
var ip = grunt.option('ip');
|
|
||||||
var debug = grunt.option('debug');
|
|
||||||
|
|
||||||
var uglify_config = {
|
|
||||||
options: {
|
|
||||||
sourceMap: true,
|
|
||||||
sourceMapIncludeSources:true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (debug) {
|
|
||||||
uglify_config['options']['mangle'] = debug ? false : true;
|
|
||||||
uglify_config['options']['beautify'] = debug ? false : true;
|
|
||||||
uglify_config['options']['compress'] = debug ? false : true;
|
|
||||||
}
|
|
||||||
// Project configuration.
|
|
||||||
grunt.initConfig({
|
|
||||||
uglify: uglify_config,
|
|
||||||
// Project settings
|
|
||||||
config: config,
|
|
||||||
|
|
||||||
// Watch things
|
|
||||||
watch: {
|
|
||||||
bower: {
|
|
||||||
files: ['bower.json'],
|
|
||||||
tasks: ['wiredep']
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
files: ['<%= config.app %>/css/{,*/}*.css'],
|
|
||||||
tasks: ['newer:copy:styles', 'postcss']
|
|
||||||
},
|
|
||||||
gruntfile: {
|
|
||||||
files: ['Gruntfile.js']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
wiredep: {
|
|
||||||
app: {
|
|
||||||
src: ['src/index.html'],
|
|
||||||
ignorePath: /\.\.\//
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
revision: {
|
|
||||||
options: {
|
|
||||||
property: 'meta.revision',
|
|
||||||
ref: 'HEAD',
|
|
||||||
short: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
preprocess: {
|
|
||||||
options: {
|
|
||||||
context: {
|
|
||||||
revision: '<%= meta.revision %>'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
js: {
|
|
||||||
src: 'src/vertoControllers/controllers/AboutController.source.js',
|
|
||||||
dest: 'src/vertoControllers/controllers/AboutController.js'
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
postcss: {
|
|
||||||
options: {
|
|
||||||
map: true,
|
|
||||||
processors: [
|
|
||||||
// Add vendor prefixed styles
|
|
||||||
require('autoprefixer-core')({
|
|
||||||
browsers: ['> 1%', 'last 2 versions', 'Firefox ESR', 'Opera 12.1']
|
|
||||||
})
|
|
||||||
]
|
|
||||||
},
|
|
||||||
dist: {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
cwd: '.tmp/css/',
|
|
||||||
src: '{,*/}*.css',
|
|
||||||
dest: '.tmp/css/'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
browserSync: {
|
|
||||||
options: {
|
|
||||||
notify: false,
|
|
||||||
background: true,
|
|
||||||
https: true,
|
|
||||||
open: false,
|
|
||||||
// logLevel: "debug",
|
|
||||||
ghostMode: false,
|
|
||||||
logConnections: true,
|
|
||||||
ui: false
|
|
||||||
},
|
|
||||||
livereload: {
|
|
||||||
options: {
|
|
||||||
files: [
|
|
||||||
'<%= config.app %>/**/*.html',
|
|
||||||
'.tmp/styles/{,*/}*.css',
|
|
||||||
'<%= config.app %>/images/{,*/}*',
|
|
||||||
'<%= config.app %>/locales/{,*/}*',
|
|
||||||
'.tmp/**/*.js',
|
|
||||||
'<%= config.app %>/**/*.js'
|
|
||||||
],
|
|
||||||
port: 9001,
|
|
||||||
server: {
|
|
||||||
baseDir: ['../js/src/', './js', '.'],
|
|
||||||
index: 'src/index.html',
|
|
||||||
middleware: [
|
|
||||||
require("connect-logger")(),
|
|
||||||
function(req, res, next) {
|
|
||||||
if (ip) {
|
|
||||||
var parsed = require("url").parse(req.url);
|
|
||||||
if (!parsed.pathname.match(/vertoService\.js$/)) {
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
grunt.log.writeln('Providing replaced data.');
|
|
||||||
var path = require('path');
|
|
||||||
var theFilePath = path.resolve('./src', 'vertoService', 'services', 'vertoService.js');
|
|
||||||
var f = require('fs').readFileSync(theFilePath).toString();
|
|
||||||
res.setHeader('Content-Type', 'text/javascript');
|
|
||||||
res.end(f.replace(/window\.location\.hostname/gi, ip));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
],
|
|
||||||
routes: {
|
|
||||||
'/partials': 'src/partials',
|
|
||||||
'/locales': 'src/locales',
|
|
||||||
'/config.json': 'src/config.json',
|
|
||||||
'/contributors.txt': 'src/contributors.txt',
|
|
||||||
'/bower_components': './bower_components',
|
|
||||||
'/js/src': '../js/src',
|
|
||||||
'/js': './js'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dist: {
|
|
||||||
options: {
|
|
||||||
port: 9001,
|
|
||||||
background: false,
|
|
||||||
server: {
|
|
||||||
baseDir: ['dist']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
jshint: {
|
|
||||||
options: {
|
|
||||||
jshintrc: '.jshintrc',
|
|
||||||
reporter: require('jshint-stylish'),
|
|
||||||
ignores: ['js/3rd-party/**/*.js'],
|
|
||||||
force: true // TODO: Remove this once we get files linted correctly!!!
|
|
||||||
},
|
|
||||||
all: {
|
|
||||||
src: [
|
|
||||||
'Gruntfile.js',
|
|
||||||
'src/**/*.js'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
clean: {
|
|
||||||
dist: {
|
|
||||||
files: [{
|
|
||||||
dot: true,
|
|
||||||
src: [
|
|
||||||
'.tmp',
|
|
||||||
'dist/{,*/}*',
|
|
||||||
'!dist/.git{,*/}*'
|
|
||||||
]
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Renames files for browser caching purposes
|
|
||||||
filerev: {
|
|
||||||
dist: {
|
|
||||||
src: [
|
|
||||||
'dist/scripts/{,*/}*.js',
|
|
||||||
'dist/css/{,*/}*.css',
|
|
||||||
'dist/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
|
|
||||||
'dist/css/fonts/*'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Reads HTML for usemin blocks to enable smart builds that automatically
|
|
||||||
// concat, minify and revision files. Creates configurations in memory so
|
|
||||||
// additional tasks can operate on them
|
|
||||||
useminPrepare: {
|
|
||||||
options: {
|
|
||||||
dest: '<%= config.dist %>'
|
|
||||||
},
|
|
||||||
html: '<%= config.app %>/index.html'
|
|
||||||
},
|
|
||||||
|
|
||||||
// Performs rewrites based on rev and the useminPrepare configuration
|
|
||||||
usemin: {
|
|
||||||
options: {
|
|
||||||
assetsDirs: [
|
|
||||||
'<%= config.dist %>',
|
|
||||||
'<%= config.dist %>/images',
|
|
||||||
'<%= config.dist %>/styles'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
html: ['<%= config.dist %>/**/*.html'],
|
|
||||||
css: ['<%= config.dist %>/styles/{,*/}*.css']
|
|
||||||
},
|
|
||||||
|
|
||||||
// The following *-min tasks produce minified files in the dist folder
|
|
||||||
imagemin: {
|
|
||||||
dist: {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
cwd: '<%= config.app %>/images',
|
|
||||||
src: '{,*/}*.{gif,jpeg,jpg,png}',
|
|
||||||
dest: '<%= config.dist %>/images'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
svgmin: {
|
|
||||||
dist: {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
cwd: '<%= config.app %>/images',
|
|
||||||
src: '{,*/}*.svg',
|
|
||||||
dest: '<%= config.dist %>/images'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// htmlmin: {
|
|
||||||
// dist: {
|
|
||||||
// options: {
|
|
||||||
// collapseBooleanAttributes: true,
|
|
||||||
// collapseWhitespace: true,
|
|
||||||
// conservativeCollapse: true,
|
|
||||||
// removeAttributeQuotes: true,
|
|
||||||
// removeCommentsFromCDATA: true,
|
|
||||||
// removeEmptyAttributes: true,
|
|
||||||
// removeOptionalTags: true,
|
|
||||||
// // true would impact styles with attribute selectors
|
|
||||||
// removeRedundantAttributes: false,
|
|
||||||
// useShortDoctype: true
|
|
||||||
// },
|
|
||||||
// files: [{
|
|
||||||
// expand: true,
|
|
||||||
// cwd: '<%= config.dist %>',
|
|
||||||
// src: '{,*/}*.html',
|
|
||||||
// dest: '<%= config.dist %>'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// expand: true,
|
|
||||||
// cwd: '<%= config.dist %>/partials',
|
|
||||||
// src: '{,*/}*.html',
|
|
||||||
// dest: '<%= config.dist %>/partials'
|
|
||||||
// }]
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// ng-annotate tries to make the code safe for minification automatically
|
|
||||||
// by using the Angular long form for dependency injection.
|
|
||||||
ngAnnotate: {
|
|
||||||
dist: {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
cwd: '.tmp/concat/scripts',
|
|
||||||
src: '*.js',
|
|
||||||
dest: '.tmp/concat/scripts'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Copies remaining files to places other tasks can use
|
|
||||||
copy: {
|
|
||||||
dist: {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
dot: true,
|
|
||||||
cwd: '<%= config.app %>',
|
|
||||||
dest: 'dist',
|
|
||||||
src: [
|
|
||||||
'*.{ico,png,txt}',
|
|
||||||
'*.html',
|
|
||||||
'*.json',
|
|
||||||
'partials/**/*.html',
|
|
||||||
'img/*.png',
|
|
||||||
'images/{,*/}*.{webp}',
|
|
||||||
'css/fonts/{,*/}*.*',
|
|
||||||
'sounds/*.*',
|
|
||||||
'locales/*.*'
|
|
||||||
]
|
|
||||||
}, {
|
|
||||||
expand: true,
|
|
||||||
cwd: '.tmp/images',
|
|
||||||
dest: 'dist/images',
|
|
||||||
src: ['generated/*']
|
|
||||||
}, {
|
|
||||||
expand: true,
|
|
||||||
cwd: 'bower_components/bootstrap/dist',
|
|
||||||
src: 'fonts/*',
|
|
||||||
dest: 'dist'
|
|
||||||
}, {
|
|
||||||
expand: true,
|
|
||||||
cwd: 'bower_components/bootstrap-material-design/dist',
|
|
||||||
src: 'fonts/*',
|
|
||||||
dest: 'dist'
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
expand: true,
|
|
||||||
cwd: '<%= config.app %>/css',
|
|
||||||
dest: '.tmp/css/',
|
|
||||||
src: '{,*/}*.css'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Run some tasks in parallel to speed up the build process
|
|
||||||
concurrent: {
|
|
||||||
server: [
|
|
||||||
'copy:styles'
|
|
||||||
],
|
|
||||||
dist: [
|
|
||||||
'copy:styles',
|
|
||||||
'imagemin',
|
|
||||||
'svgmin'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.loadNpmTasks('grunt-git-revision');
|
|
||||||
grunt.loadNpmTasks('grunt-preprocess');
|
|
||||||
|
|
||||||
grunt.registerTask('serve', function (target) {
|
|
||||||
var tasks = [
|
|
||||||
'wiredep',
|
|
||||||
'concurrent:server',
|
|
||||||
'postcss'];
|
|
||||||
|
|
||||||
|
|
||||||
tasks = tasks.concat(['browserSync:livereload',
|
|
||||||
'watch']);
|
|
||||||
|
|
||||||
grunt.task.run(tasks);
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.registerTask('default', ['build']);
|
|
||||||
|
|
||||||
grunt.registerTask('build', [
|
|
||||||
'clean:dist',
|
|
||||||
'revision',
|
|
||||||
'preprocess',
|
|
||||||
'wiredep',
|
|
||||||
'useminPrepare',
|
|
||||||
'concurrent:dist',
|
|
||||||
'postcss',
|
|
||||||
'concat',
|
|
||||||
'cssmin',
|
|
||||||
'ngAnnotate',
|
|
||||||
'uglify',
|
|
||||||
'copy:dist',
|
|
||||||
'filerev',
|
|
||||||
'usemin',
|
|
||||||
// 'htmlmin'
|
|
||||||
]);
|
|
||||||
|
|
||||||
};
|
|
|
@ -1,13 +0,0 @@
|
||||||
To install on Mac
|
|
||||||
|
|
||||||
brew install npm
|
|
||||||
|
|
||||||
npm install -g grunt grunt-cli bower
|
|
||||||
|
|
||||||
cd verto_communicator
|
|
||||||
npm install
|
|
||||||
bower install
|
|
||||||
grunt serve
|
|
||||||
|
|
||||||
to Install on Debian 8
|
|
||||||
./debian8_install.sh
|
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
"name": "verto_communicator",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"authors": [
|
|
||||||
"Jonatas Oliveira <jonatas@evolux.net.br>",
|
|
||||||
"Ítalo Rossi <italo@evolux.net.br>",
|
|
||||||
"Stefan Yohansson <stefan@evolux.net.br>",
|
|
||||||
"João Mesquita <jmesquita@indicium.com.ar>"
|
|
||||||
],
|
|
||||||
"description": "Verto Communicator",
|
|
||||||
"main": "index.html",
|
|
||||||
"keywords": [
|
|
||||||
"freeswitch",
|
|
||||||
"verto",
|
|
||||||
"webrtc"
|
|
||||||
],
|
|
||||||
"license": "MPL",
|
|
||||||
"homepage": "www.freeswitch.org",
|
|
||||||
"ignore": [
|
|
||||||
"**/.*",
|
|
||||||
"node_modules",
|
|
||||||
"bower_components",
|
|
||||||
"test",
|
|
||||||
"tests"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"jquery": "~2.1.4",
|
|
||||||
"jquery-cookie": "~1.4.1",
|
|
||||||
"jquery-json": "~2.5.1",
|
|
||||||
"angular-gravatar": "~0.4.1",
|
|
||||||
"bootstrap": "~3.3.4",
|
|
||||||
"angular-toastr": "~1.4.1",
|
|
||||||
"angular": "~1.3.15",
|
|
||||||
"angular-sanitize": "~1.3.15",
|
|
||||||
"angular-route": "~1.3.15",
|
|
||||||
"angular-prompt": "~1.1.1",
|
|
||||||
"angular-animate": "~1.3.15",
|
|
||||||
"angular-cookies": "~1.3.15",
|
|
||||||
"angular-directive.g-signin": "~0.1.2",
|
|
||||||
"angular-fullscreen": "~1.0.1",
|
|
||||||
"ngstorage": "~0.3.9",
|
|
||||||
"angular-timer": "~1.3.3",
|
|
||||||
"angular-tooltips": "~0.1.21",
|
|
||||||
"datatables": "~1.10.8",
|
|
||||||
"angular-bootstrap": "~0.14.3",
|
|
||||||
"bootstrap-material-design": "~0.3.0",
|
|
||||||
"angular-translate": "~2.10.0",
|
|
||||||
"angular-translate-loader-static-files": "~2.10.0",
|
|
||||||
"angular-click-outside": "~2.9.2"
|
|
||||||
},
|
|
||||||
"resolutions": {
|
|
||||||
"angular": "~1.3.15",
|
|
||||||
"angular-bootstrap": "~0.14.3"
|
|
||||||
},
|
|
||||||
"overrides": {
|
|
||||||
"bootstrap": {
|
|
||||||
"main": [
|
|
||||||
"dist/css/bootstrap.css",
|
|
||||||
"dist/js/bootstrap.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"jquery-json": {
|
|
||||||
"main": [
|
|
||||||
"src/jquery.json.js"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
apt-get update
|
|
||||||
apt-get -y install npm nodejs-legacy
|
|
||||||
npm install -g grunt grunt-cli bower
|
|
||||||
npm install
|
|
||||||
bower --allow-root install
|
|
||||||
grunt build
|
|
|
@ -1,230 +0,0 @@
|
||||||
// Last time updated at Oct 24, 2015, 08:32:23
|
|
||||||
|
|
||||||
// Latest file can be found here: https://cdn.webrtc-experiment.com/getScreenId.js
|
|
||||||
|
|
||||||
// Muaz Khan - www.MuazKhan.com
|
|
||||||
// MIT License - www.WebRTC-Experiment.com/licence
|
|
||||||
// Documentation - https://github.com/muaz-khan/getScreenId.
|
|
||||||
|
|
||||||
// ______________
|
|
||||||
// getScreenId.js
|
|
||||||
|
|
||||||
/*
|
|
||||||
getScreenId(function (error, sourceId, screen_constraints) {
|
|
||||||
// error == null || 'permission-denied' || 'not-installed' || 'installed-disabled' || 'not-chrome'
|
|
||||||
// sourceId == null || 'string' || 'firefox'
|
|
||||||
|
|
||||||
if(sourceId == 'firefox') {
|
|
||||||
navigator.mozGetUserMedia(screen_constraints, onSuccess, onFailure);
|
|
||||||
}
|
|
||||||
else navigator.webkitGetUserMedia(screen_constraints, onSuccess, onFailure);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
window.getScreenId = function(callback) {
|
|
||||||
// for Firefox:
|
|
||||||
// sourceId == 'firefox'
|
|
||||||
// screen_constraints = {...}
|
|
||||||
if (!!navigator.mozGetUserMedia) {
|
|
||||||
callback(null, 'firefox', {
|
|
||||||
video: {
|
|
||||||
mozMediaSource: 'window',
|
|
||||||
mediaSource: 'window'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
postMessage();
|
|
||||||
|
|
||||||
window.addEventListener('message', onIFrameCallback);
|
|
||||||
|
|
||||||
function onIFrameCallback(event) {
|
|
||||||
if (!event.data) return;
|
|
||||||
|
|
||||||
if (event.data.chromeMediaSourceId) {
|
|
||||||
if (event.data.chromeMediaSourceId === 'PermissionDeniedError') {
|
|
||||||
callback('permission-denied');
|
|
||||||
} else callback(null, event.data.chromeMediaSourceId, getScreenConstraints(null, event.data.chromeMediaSourceId));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.data.chromeExtensionStatus) {
|
|
||||||
callback(event.data.chromeExtensionStatus, null, getScreenConstraints(event.data.chromeExtensionStatus));
|
|
||||||
}
|
|
||||||
|
|
||||||
// this event listener is no more needed
|
|
||||||
window.removeEventListener('message', onIFrameCallback);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function getScreenConstraints(error, sourceId) {
|
|
||||||
var screen_constraints = {
|
|
||||||
audio: false,
|
|
||||||
video: {
|
|
||||||
mandatory: {
|
|
||||||
chromeMediaSource: error ? 'screen' : 'desktop',
|
|
||||||
maxWidth: window.screen.width > 1920 ? window.screen.width : 1920,
|
|
||||||
maxHeight: window.screen.height > 1080 ? window.screen.height : 1080
|
|
||||||
},
|
|
||||||
optional: []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (sourceId) {
|
|
||||||
screen_constraints.video.mandatory.chromeMediaSourceId = sourceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
return screen_constraints;
|
|
||||||
}
|
|
||||||
|
|
||||||
function postMessage() {
|
|
||||||
if (!iframe) {
|
|
||||||
loadIFrame(postMessage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!iframe.isLoaded) {
|
|
||||||
setTimeout(postMessage, 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe.contentWindow.postMessage({
|
|
||||||
captureSourceId: true
|
|
||||||
}, '*');
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadIFrame(loadCallback) {
|
|
||||||
if (iframe) {
|
|
||||||
loadCallback();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe = document.createElement('iframe');
|
|
||||||
iframe.onload = function() {
|
|
||||||
iframe.isLoaded = true;
|
|
||||||
|
|
||||||
loadCallback();
|
|
||||||
};
|
|
||||||
iframe.src = 'https://www.webrtc-experiment.com/getSourceId/'; // https://wwww.yourdomain.com/getScreenId.html
|
|
||||||
iframe.style.display = 'none';
|
|
||||||
(document.body || document.documentElement).appendChild(iframe);
|
|
||||||
}
|
|
||||||
|
|
||||||
var iframe;
|
|
||||||
|
|
||||||
// this function is used in v3.0
|
|
||||||
window.getScreenConstraints = function(callback) {
|
|
||||||
loadIFrame(function() {
|
|
||||||
getScreenId(function(error, sourceId, screen_constraints) {
|
|
||||||
callback(error, screen_constraints.video);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
if(document.domain.indexOf('webrtc-experiment.com') === -1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
window.getScreenId = function(callback) {
|
|
||||||
// for Firefox:
|
|
||||||
// sourceId == 'firefox'
|
|
||||||
// screen_constraints = {...}
|
|
||||||
if (!!navigator.mozGetUserMedia) {
|
|
||||||
callback(null, 'firefox', {
|
|
||||||
video: {
|
|
||||||
mozMediaSource: 'window',
|
|
||||||
mediaSource: 'window'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
postMessage();
|
|
||||||
|
|
||||||
window.addEventListener('message', onIFrameCallback);
|
|
||||||
|
|
||||||
function onIFrameCallback(event) {
|
|
||||||
if (!event.data) return;
|
|
||||||
|
|
||||||
if (event.data.chromeMediaSourceId) {
|
|
||||||
if (event.data.chromeMediaSourceId === 'PermissionDeniedError') {
|
|
||||||
callback('permission-denied');
|
|
||||||
} else callback(null, event.data.chromeMediaSourceId, getScreenConstraints(null, event.data.chromeMediaSourceId));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.data.chromeExtensionStatus) {
|
|
||||||
callback(event.data.chromeExtensionStatus, null, getScreenConstraints(event.data.chromeExtensionStatus));
|
|
||||||
}
|
|
||||||
|
|
||||||
// this event listener is no more needed
|
|
||||||
window.removeEventListener('message', onIFrameCallback);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function getScreenConstraints(error, sourceId) {
|
|
||||||
var screen_constraints = {
|
|
||||||
audio: false,
|
|
||||||
video: {
|
|
||||||
mandatory: {
|
|
||||||
chromeMediaSource: error ? 'screen' : 'desktop',
|
|
||||||
maxWidth: window.screen.width > 1920 ? window.screen.width : 1920,
|
|
||||||
maxHeight: window.screen.height > 1080 ? window.screen.height : 1080
|
|
||||||
},
|
|
||||||
optional: []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (sourceId) {
|
|
||||||
screen_constraints.video.mandatory.chromeMediaSourceId = sourceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
return screen_constraints;
|
|
||||||
}
|
|
||||||
|
|
||||||
function postMessage() {
|
|
||||||
if (!iframe) {
|
|
||||||
loadIFrame(postMessage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!iframe.isLoaded) {
|
|
||||||
setTimeout(postMessage, 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe.contentWindow.postMessage({
|
|
||||||
captureSourceId: true
|
|
||||||
}, '*');
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadIFrame(loadCallback) {
|
|
||||||
if (iframe) {
|
|
||||||
loadCallback();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe = document.createElement('iframe');
|
|
||||||
iframe.onload = function() {
|
|
||||||
iframe.isLoaded = true;
|
|
||||||
|
|
||||||
loadCallback();
|
|
||||||
};
|
|
||||||
iframe.src = 'https://www.webrtc-experiment.com/getSourceId/'; // https://wwww.yourdomain.com/getScreenId.html
|
|
||||||
iframe.style.display = 'none';
|
|
||||||
(document.body || document.documentElement).appendChild(iframe);
|
|
||||||
}
|
|
||||||
|
|
||||||
var iframe;
|
|
||||||
|
|
||||||
// this function is used in v3.0
|
|
||||||
window.getScreenConstraints = function(callback) {
|
|
||||||
loadIFrame(function() {
|
|
||||||
getScreenId(function(error, sourceId, screen_constraints) {
|
|
||||||
callback(error, screen_constraints.video);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
})();
|
|
|
@ -1,19 +0,0 @@
|
||||||
/*
|
|
||||||
* JavaScript MD5 1.0.1
|
|
||||||
* https://github.com/blueimp/JavaScript-MD5
|
|
||||||
*
|
|
||||||
* Copyright 2011, Sebastian Tschan
|
|
||||||
* https://blueimp.net
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license:
|
|
||||||
* http://www.opensource.org/licenses/MIT
|
|
||||||
*
|
|
||||||
* Based on
|
|
||||||
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
|
|
||||||
* Digest Algorithm, as defined in RFC 1321.
|
|
||||||
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
|
|
||||||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
|
||||||
* Distributed under the BSD License
|
|
||||||
* See http://pajhome.org.uk/crypt/md5 for more info.
|
|
||||||
*/
|
|
||||||
!function(a){"use strict";function b(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}function c(a,b){return a<<b|a>>>32-b}function d(a,d,e,f,g,h){return b(c(b(b(d,a),b(f,h)),g),e)}function e(a,b,c,e,f,g,h){return d(b&c|~b&e,a,b,f,g,h)}function f(a,b,c,e,f,g,h){return d(b&e|c&~e,a,b,f,g,h)}function g(a,b,c,e,f,g,h){return d(b^c^e,a,b,f,g,h)}function h(a,b,c,e,f,g,h){return d(c^(b|~e),a,b,f,g,h)}function i(a,c){a[c>>5]|=128<<c%32,a[(c+64>>>9<<4)+14]=c;var d,i,j,k,l,m=1732584193,n=-271733879,o=-1732584194,p=271733878;for(d=0;d<a.length;d+=16)i=m,j=n,k=o,l=p,m=e(m,n,o,p,a[d],7,-680876936),p=e(p,m,n,o,a[d+1],12,-389564586),o=e(o,p,m,n,a[d+2],17,606105819),n=e(n,o,p,m,a[d+3],22,-1044525330),m=e(m,n,o,p,a[d+4],7,-176418897),p=e(p,m,n,o,a[d+5],12,1200080426),o=e(o,p,m,n,a[d+6],17,-1473231341),n=e(n,o,p,m,a[d+7],22,-45705983),m=e(m,n,o,p,a[d+8],7,1770035416),p=e(p,m,n,o,a[d+9],12,-1958414417),o=e(o,p,m,n,a[d+10],17,-42063),n=e(n,o,p,m,a[d+11],22,-1990404162),m=e(m,n,o,p,a[d+12],7,1804603682),p=e(p,m,n,o,a[d+13],12,-40341101),o=e(o,p,m,n,a[d+14],17,-1502002290),n=e(n,o,p,m,a[d+15],22,1236535329),m=f(m,n,o,p,a[d+1],5,-165796510),p=f(p,m,n,o,a[d+6],9,-1069501632),o=f(o,p,m,n,a[d+11],14,643717713),n=f(n,o,p,m,a[d],20,-373897302),m=f(m,n,o,p,a[d+5],5,-701558691),p=f(p,m,n,o,a[d+10],9,38016083),o=f(o,p,m,n,a[d+15],14,-660478335),n=f(n,o,p,m,a[d+4],20,-405537848),m=f(m,n,o,p,a[d+9],5,568446438),p=f(p,m,n,o,a[d+14],9,-1019803690),o=f(o,p,m,n,a[d+3],14,-187363961),n=f(n,o,p,m,a[d+8],20,1163531501),m=f(m,n,o,p,a[d+13],5,-1444681467),p=f(p,m,n,o,a[d+2],9,-51403784),o=f(o,p,m,n,a[d+7],14,1735328473),n=f(n,o,p,m,a[d+12],20,-1926607734),m=g(m,n,o,p,a[d+5],4,-378558),p=g(p,m,n,o,a[d+8],11,-2022574463),o=g(o,p,m,n,a[d+11],16,1839030562),n=g(n,o,p,m,a[d+14],23,-35309556),m=g(m,n,o,p,a[d+1],4,-1530992060),p=g(p,m,n,o,a[d+4],11,1272893353),o=g(o,p,m,n,a[d+7],16,-155497632),n=g(n,o,p,m,a[d+10],23,-1094730640),m=g(m,n,o,p,a[d+13],4,681279174),p=g(p,m,n,o,a[d],11,-358537222),o=g(o,p,m,n,a[d+3],16,-722521979),n=g(n,o,p,m,a[d+6],23,76029189),m=g(m,n,o,p,a[d+9],4,-640364487),p=g(p,m,n,o,a[d+12],11,-421815835),o=g(o,p,m,n,a[d+15],16,530742520),n=g(n,o,p,m,a[d+2],23,-995338651),m=h(m,n,o,p,a[d],6,-198630844),p=h(p,m,n,o,a[d+7],10,1126891415),o=h(o,p,m,n,a[d+14],15,-1416354905),n=h(n,o,p,m,a[d+5],21,-57434055),m=h(m,n,o,p,a[d+12],6,1700485571),p=h(p,m,n,o,a[d+3],10,-1894986606),o=h(o,p,m,n,a[d+10],15,-1051523),n=h(n,o,p,m,a[d+1],21,-2054922799),m=h(m,n,o,p,a[d+8],6,1873313359),p=h(p,m,n,o,a[d+15],10,-30611744),o=h(o,p,m,n,a[d+6],15,-1560198380),n=h(n,o,p,m,a[d+13],21,1309151649),m=h(m,n,o,p,a[d+4],6,-145523070),p=h(p,m,n,o,a[d+11],10,-1120210379),o=h(o,p,m,n,a[d+2],15,718787259),n=h(n,o,p,m,a[d+9],21,-343485551),m=b(m,i),n=b(n,j),o=b(o,k),p=b(p,l);return[m,n,o,p]}function j(a){var b,c="";for(b=0;b<32*a.length;b+=8)c+=String.fromCharCode(a[b>>5]>>>b%32&255);return c}function k(a){var b,c=[];for(c[(a.length>>2)-1]=void 0,b=0;b<c.length;b+=1)c[b]=0;for(b=0;b<8*a.length;b+=8)c[b>>5]|=(255&a.charCodeAt(b/8))<<b%32;return c}function l(a){return j(i(k(a),8*a.length))}function m(a,b){var c,d,e=k(a),f=[],g=[];for(f[15]=g[15]=void 0,e.length>16&&(e=i(e,8*a.length)),c=0;16>c;c+=1)f[c]=909522486^e[c],g[c]=1549556828^e[c];return d=i(f.concat(k(b)),512+8*b.length),j(i(g.concat(d),640))}function n(a){var b,c,d="0123456789abcdef",e="";for(c=0;c<a.length;c+=1)b=a.charCodeAt(c),e+=d.charAt(b>>>4&15)+d.charAt(15&b);return e}function o(a){return unescape(encodeURIComponent(a))}function p(a){return l(o(a))}function q(a){return n(p(a))}function r(a,b){return m(o(a),o(b))}function s(a,b){return n(r(a,b))}function t(a,b,c){return b?c?r(b,a):s(b,a):c?p(a):q(a)}"function"==typeof define&&define.amd?define(function(){return t}):a.md5=t}(this);
|
|
|
@ -1,96 +0,0 @@
|
||||||
/*
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Chris Wilson
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
audioNode = createAudioMeter(audioContext,clipLevel,averaging,clipLag);
|
|
||||||
|
|
||||||
audioContext: the AudioContext you're using.
|
|
||||||
clipLevel: the level (0 to 1) that you would consider "clipping".
|
|
||||||
Defaults to 0.98.
|
|
||||||
averaging: how "smoothed" you would like the meter to be over time.
|
|
||||||
Should be between 0 and less than 1. Defaults to 0.95.
|
|
||||||
clipLag: how long you would like the "clipping" indicator to show
|
|
||||||
after clipping has occured, in milliseconds. Defaults to 750ms.
|
|
||||||
|
|
||||||
Access the clipping through node.checkClipping(); use node.shutdown to get rid of it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
function createAudioMeter(audioContext,clipLevel,averaging,clipLag) {
|
|
||||||
var processor = audioContext.createScriptProcessor(512);
|
|
||||||
processor.onaudioprocess = volumeAudioProcess;
|
|
||||||
processor.clipping = false;
|
|
||||||
processor.lastClip = 0;
|
|
||||||
processor.volume = 0;
|
|
||||||
processor.clipLevel = clipLevel || 0.98;
|
|
||||||
processor.averaging = averaging || 0.95;
|
|
||||||
processor.clipLag = clipLag || 750;
|
|
||||||
|
|
||||||
// this will have no effect, since we don't copy the input to the output,
|
|
||||||
// but works around a current Chrome bug.
|
|
||||||
processor.connect(audioContext.destination);
|
|
||||||
|
|
||||||
processor.checkClipping =
|
|
||||||
function(){
|
|
||||||
if (!this.clipping)
|
|
||||||
return false;
|
|
||||||
if ((this.lastClip + this.clipLag) < window.performance.now())
|
|
||||||
this.clipping = false;
|
|
||||||
return this.clipping;
|
|
||||||
};
|
|
||||||
|
|
||||||
processor.shutdown =
|
|
||||||
function(){
|
|
||||||
this.disconnect();
|
|
||||||
this.onaudioprocess = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
return processor;
|
|
||||||
}
|
|
||||||
|
|
||||||
function volumeAudioProcess( event ) {
|
|
||||||
var buf = event.inputBuffer.getChannelData(0);
|
|
||||||
var bufLength = buf.length;
|
|
||||||
var sum = 0;
|
|
||||||
var x;
|
|
||||||
|
|
||||||
// Do a root-mean-square on the samples: sum up the squares...
|
|
||||||
for (var i=0; i<bufLength; i++) {
|
|
||||||
x = buf[i];
|
|
||||||
if (Math.abs(x)>=this.clipLevel) {
|
|
||||||
this.clipping = true;
|
|
||||||
this.lastClip = window.performance.now();
|
|
||||||
}
|
|
||||||
sum += x * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ... then take the square root of the sum.
|
|
||||||
var rms = Math.sqrt(sum / bufLength);
|
|
||||||
|
|
||||||
// Now smooth this out with the averaging factor applied
|
|
||||||
// to the previous sample - take the max here because we
|
|
||||||
// want "fast attack, slow release."
|
|
||||||
this.volume = Math.max(rms, this.volume*this.averaging);
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
{
|
|
||||||
"name": "verto_communicator",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"license": "MPL-1.1",
|
|
||||||
"description": "HTML5 Based Communications application for use with FreeSWITCH and mod_verto",
|
|
||||||
"devDependencies": {
|
|
||||||
"autoprefixer-core": "^5.2.1",
|
|
||||||
"browser-sync": "^2.8.2",
|
|
||||||
"connect-logger": "0.0.1",
|
|
||||||
"grunt": "^0.4.5",
|
|
||||||
"grunt-cli": "^1.2.0",
|
|
||||||
"grunt-browser-sync": "^2.1.2",
|
|
||||||
"grunt-concurrent": "^1.0.0",
|
|
||||||
"grunt-contrib-clean": "^0.6.0",
|
|
||||||
"grunt-contrib-concat": "^0.5.0",
|
|
||||||
"grunt-contrib-copy": "^0.7.0",
|
|
||||||
"grunt-contrib-cssmin": "^0.12.0",
|
|
||||||
"grunt-contrib-htmlmin": "^0.4.0",
|
|
||||||
"grunt-contrib-imagemin": "^1.0.0",
|
|
||||||
"grunt-contrib-jshint": "^0.11.0",
|
|
||||||
"grunt-contrib-uglify": "^0.7.0",
|
|
||||||
"grunt-contrib-watch": "latest",
|
|
||||||
"grunt-preprocess": "latest",
|
|
||||||
"grunt-git-revision": "latest",
|
|
||||||
"grunt-filerev": "^2.1.2",
|
|
||||||
"grunt-newer": "^1.1.0",
|
|
||||||
"grunt-ng-annotate": "^0.9.2",
|
|
||||||
"grunt-postcss": "^0.5.3",
|
|
||||||
"grunt-svgmin": "^2.0.0",
|
|
||||||
"grunt-usemin": "^3.0.0",
|
|
||||||
"grunt-wiredep": "^2.0.0",
|
|
||||||
"jit-grunt": "^0.9.1",
|
|
||||||
"jshint-stylish": "^1.0.0",
|
|
||||||
"time-grunt": "^1.0.0"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/signalwire/freeswitch.git"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"login": "1008",
|
|
||||||
"password": "1234"
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
{
|
|
||||||
"extension": "3500",
|
|
||||||
"name": "Ken Rice",
|
|
||||||
"email": "krice@freeswitch.org",
|
|
||||||
"cid": "1008",
|
|
||||||
"textTo": "1000",
|
|
||||||
"login": "1008",
|
|
||||||
"password": "1234",
|
|
||||||
"autologin": "true",
|
|
||||||
"autocall": "3500",
|
|
||||||
"googlelogin": "true",
|
|
||||||
"wsURL": "wss://gamma.tollfreegateway.com/wss2",
|
|
||||||
"wsFallbackURL": "wss://gamma.tollfreegateway.com/wss2",
|
|
||||||
"turnServer": {
|
|
||||||
"urls": "turn:someturnserver.com:443?transport=tcp",
|
|
||||||
"credential": "1234",
|
|
||||||
"username": "username"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
[
|
|
||||||
"Jonatas Oliveira <jonatas@evolux.net.br>",
|
|
||||||
"Ítalo Rossi <italo@evolux.net.br>",
|
|
||||||
"Stefan Yohansson <stefan@evolux.net.br>",
|
|
||||||
"Victor Torres <victor@evolux.net.br>",
|
|
||||||
"João Mesquita <jmesquita@indicium.com.ar>",
|
|
||||||
"Ken Rice <krice@freeswitch.org>",
|
|
||||||
"Brian West <brian@freeswitch.org>"
|
|
||||||
]
|
|
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 186 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 11 KiB |
|
@ -1,159 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html ng-app="vertoApp" ng-controller="MainController" lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
|
||||||
|
|
||||||
<meta name="description" content="Verto (VER-to) RTC is a FreeSWITCH endpoint that implements a subset of a JSON-RPC connection designed for use over secure websockets.">
|
|
||||||
<meta name="author" content="FreeSWITCH">
|
|
||||||
<link rel="icon" href="favicon.ico">
|
|
||||||
|
|
||||||
<title ng-bind="'[' + title + '] ' + 'FreeSWITCH Verto™ Video Transcoding'"></title>
|
|
||||||
|
|
||||||
<!-- build:css(.) css/vendor.css -->
|
|
||||||
<!-- bower:css -->
|
|
||||||
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" />
|
|
||||||
<link rel="stylesheet" href="bower_components/angular-toastr/dist/angular-toastr.css" />
|
|
||||||
<link rel="stylesheet" href="bower_components/angular-tooltips/dist/angular-tooltips.min.css" />
|
|
||||||
<link rel="stylesheet" href="bower_components/datatables/media/css/jquery.dataTables.css" />
|
|
||||||
<link rel="stylesheet" href="bower_components/bootstrap-material-design/dist/css/material.css" />
|
|
||||||
<link rel="stylesheet" href="bower_components/bootstrap-material-design/dist/css/ripples.css" />
|
|
||||||
<!-- endbower -->
|
|
||||||
<!-- endbuild -->
|
|
||||||
|
|
||||||
<!-- CSS -->
|
|
||||||
<!-- build:css(.) css/verto.css -->
|
|
||||||
<link rel="stylesheet" type="text/css" href="src/css/verto.css">
|
|
||||||
<!-- endbuild -->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
|
||||||
<!--[if lt IE 9]>
|
|
||||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
|
||||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
||||||
<![endif]-->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
if (location.search) {
|
|
||||||
var tmp = location.search;
|
|
||||||
location.search = '';
|
|
||||||
location.href = getPathFromUrl(location.href) + (location.hash ? location.hash : '#/') + tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPathFromUrl(url) {
|
|
||||||
return url.split(/[?#]/)[0];
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div ng-include="'partials/menu.html'"></div>
|
|
||||||
<div ng-include="'partials/settings.html'"></div>
|
|
||||||
|
|
||||||
<div id="wrapper" class="toggled">
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<div id="sidebar-wrapper">
|
|
||||||
<div ng-include="'partials/chat.html'"></div>
|
|
||||||
</div>
|
|
||||||
<!-- /#sidebar-wrapper -->
|
|
||||||
|
|
||||||
<!-- Page Content -->
|
|
||||||
<div id="page-content-wrapper">
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="row" ng-view>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<video class="hide" id="webcam" autoplay="autoplay" style="width:100%; height:100%; object-fit:inherit;"></video>
|
|
||||||
|
|
||||||
|
|
||||||
<!--<script type="text/javascript" src="js/jquery/jquery.mobile.min.js"></script>-->
|
|
||||||
|
|
||||||
<!-- build:js(.) scripts/vendor.js -->
|
|
||||||
<!-- bower:js -->
|
|
||||||
<script src="bower_components/jquery/dist/jquery.js"></script>
|
|
||||||
<script src="bower_components/jquery-cookie/jquery.cookie.js"></script>
|
|
||||||
<script src="bower_components/jquery-json/src/jquery.json.js"></script>
|
|
||||||
<script src="bower_components/angular/angular.js"></script>
|
|
||||||
<script src="bower_components/angular-gravatar/build/angular-gravatar.js"></script>
|
|
||||||
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
|
|
||||||
<script src="bower_components/angular-toastr/dist/angular-toastr.tpls.js"></script>
|
|
||||||
<script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
|
|
||||||
<script src="bower_components/angular-route/angular-route.js"></script>
|
|
||||||
<script src="bower_components/angular-bootstrap/ui-bootstrap-tpls.js"></script>
|
|
||||||
<script src="bower_components/angular-prompt/dist/angular-prompt.js"></script>
|
|
||||||
<script src="bower_components/angular-animate/angular-animate.js"></script>
|
|
||||||
<script src="bower_components/angular-cookies/angular-cookies.js"></script>
|
|
||||||
<script src="bower_components/angular-directive.g-signin/google-plus-signin.js"></script>
|
|
||||||
<script src="bower_components/angular-fullscreen/src/angular-fullscreen.js"></script>
|
|
||||||
<script src="bower_components/ngstorage/ngStorage.js"></script>
|
|
||||||
<script src="bower_components/moment/moment.js"></script>
|
|
||||||
<script src="bower_components/humanize-duration/humanize-duration.js"></script>
|
|
||||||
<script src="bower_components/angular-timer/dist/angular-timer.js"></script>
|
|
||||||
<script src="bower_components/angular-tooltips/dist/angular-tooltips.min.js"></script>
|
|
||||||
<script src="bower_components/datatables/media/js/jquery.dataTables.js"></script>
|
|
||||||
<script src="bower_components/bootstrap-material-design/dist/js/material.js"></script>
|
|
||||||
<script src="bower_components/bootstrap-material-design/dist/js/ripples.js"></script>
|
|
||||||
<script src="bower_components/angular-translate/angular-translate.js"></script>
|
|
||||||
<script src="bower_components/angular-translate-loader-static-files/angular-translate-loader-static-files.js"></script>
|
|
||||||
<script src="bower_components/angular-click-outside/clickoutside.directive.js"></script>
|
|
||||||
<!-- endbower -->
|
|
||||||
<!-- endbuild -->
|
|
||||||
|
|
||||||
<!-- build:js(.) scripts/scripts.js -->
|
|
||||||
|
|
||||||
<script type="text/javascript" src="../js/src/jquery.jsonrpcclient.js"></script>
|
|
||||||
<script type="text/javascript" src="../js/src/jquery.FSRTC.js"></script>
|
|
||||||
<script type="text/javascript" src="../js/src/jquery.verto.js"></script>
|
|
||||||
<script type="text/javascript" src="../js/src/vendor/adapter-latest.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="js/3rd-party/getScreenId.js"></script>
|
|
||||||
<script type="text/javascript" src="js/3rd-party/md5.min.js"></script>
|
|
||||||
<script type="text/javascript" src="js/3rd-party/volume-meter.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="src/vertoApp/vertoApp.module.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/vertoControllers.module.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/SplashScreenController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/BrowserUpgradeController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/ChatController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/ContributorsController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/AboutController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/DialPadController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/InCallController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/LoginController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/MainController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/MenuController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/ModalDialpadController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/ModalWsReconnectController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/ModalLoginInformationController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/SettingsController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/PreviewController.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoControllers/controllers/LoadingController.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="src/vertoDirectives/vertoDirectives.module.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoDirectives/directives/autofocus.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoDirectives/directives/showControls.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoDirectives/directives/userStatus.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoDirectives/directives/videoTag.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="src/vertoFilters/vertoFilters.module.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoFilters/filters/picturify.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="src/vertoService/vertoService.module.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoService/services/vertoService.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoService/services/configService.js"></script>
|
|
||||||
<script type="text/javascript" src="src/vertoService/services/eventQueueService.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="src/storageService/storageService.module.js"></script>
|
|
||||||
<script type="text/javascript" src="src/storageService/services/storage.js"></script>
|
|
||||||
<script type="text/javascript" src="src/storageService/services/call_history.js"></script>
|
|
||||||
<script type="text/javascript" src="src/storageService/services/splash_screen.js"></script>
|
|
||||||
<!-- endbuild -->
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,142 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Ups, der er et aktivt opkald.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Du er allerede i et opkald. Vil du lægge på?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Det ser ud til du sidste gang var i et opkald. Vil du tilbage til det?",
|
|
||||||
"TITLE_INCOMING_CALL": "Indkommende kald",
|
|
||||||
"MESSAGE_INCOMING_CALL": "Fra ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Der er ikke noget opkald at lægge på.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Vær venlig at indtaste filnavnet",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Vil du slå video til for dette opkald?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Video vil være slået til for de næste opkald.",
|
|
||||||
"TITLE_INSERT_BANNER": "Vær venlig at indsætte bannerteksten",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Vær venlig at indsætte Canvas Id'et",
|
|
||||||
"TITLE_INSERT_LAYER": "Vær venlig at indsætte laget",
|
|
||||||
"TITLE_TRANSFER": "Viderestil gruppen?",
|
|
||||||
"MESSAGE_TRANSFER": "Til hvilken destination vil du viderestille opkaldet?",
|
|
||||||
"LABEL_TRANSFER": "Destination",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Det er ikke muligt at vise eksempelvisnings indstillinger under et kald",
|
|
||||||
"BUTTON_END_CALL": "Afslut kald",
|
|
||||||
"BUTTON_CLOSE": "Luk",
|
|
||||||
"MESSAGE_PLAY": "Afspil",
|
|
||||||
"MESSAGE_STOP": "Stop",
|
|
||||||
"MESSAGE_RECORD": "Optag",
|
|
||||||
"MESSAGE_STOP_RECORD": "Stop med at optage",
|
|
||||||
"MESSAGE_SNAPSHOT": "Snapshot",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Videotilstand",
|
|
||||||
"MESSAGE_MUTE_MIC": "Slå mikrofon til/fra",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "Slå video til/fra",
|
|
||||||
"MESSAGE_FULLSCREEN": "Skift fuldskærmstilstand",
|
|
||||||
"MESSAGE_SCREENSHARE": "Skærmdeling",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Åben/luk chat",
|
|
||||||
"MESSAGE_SPEAKER": "Højtaler",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Medlemmer",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "Der er ingen medlemmer at vise.",
|
|
||||||
"CHAT_GENERAL": "Generel",
|
|
||||||
"CHAT_TITLE_KICK": "Fjern",
|
|
||||||
"CHAT_KICK": "Fjern",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video niveau",
|
|
||||||
"CHAT_FLOOR": "Niveau",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Viderestil",
|
|
||||||
"CHAT_TRANSFER": "Viderestil",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Sæt",
|
|
||||||
"CHAT_SET": "Sæt",
|
|
||||||
"CHAT_TITLE_RESET": "Nulstil",
|
|
||||||
"CHAT_RESET": "Nulstil",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas ind",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas ud",
|
|
||||||
"CHAT_PREV": "Forrige",
|
|
||||||
"CHAT_NEXT": "Næste",
|
|
||||||
"CHAT_LAYER": "Lag",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Lyd/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Slå mikrofon til/fra",
|
|
||||||
"CHAT_MUTE_MIC": "Slå mikrofon fra",
|
|
||||||
"CHAT_UNMUTE_MIC": "Slå mikrofon til",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Slå video til/fra",
|
|
||||||
"CHAT_NO_MESSAGES": "Der er ingen beskeder at vise.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Send",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Skriv din besked her...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Bidragsydere",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Denne forbindelse er ikke til at stole på.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Vis/skjul navigation",
|
|
||||||
"BANDWIDTH_INFO": "Båndbredde information",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Indkommende:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Udgående:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Video opløsning:",
|
|
||||||
"IN_CALL": "I opkald:",
|
|
||||||
"LAST_CALL": "Sidste opkald:",
|
|
||||||
"OPEN_NEW_WINDOW": "Åben nyt vindue",
|
|
||||||
"CHANGE_LOGIN_INFO": "Rediger loginoplysninger",
|
|
||||||
"LOGOUT": "Log ud",
|
|
||||||
"ABOUT": "Om",
|
|
||||||
"HELP": "Hjælp",
|
|
||||||
"CONTRIBUTORS": "Bidragsydere",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Opsæt indstillinger for kamera og mikrofon",
|
|
||||||
"CAMERA__SETTNGS": "Kamera:",
|
|
||||||
"MIC_SETTINGS": "Mikrofon:",
|
|
||||||
"SAVE": "Gem",
|
|
||||||
"LOADING": "Henter",
|
|
||||||
"ERRORS" : "Fejl",
|
|
||||||
"CALLING_TO": "Ringer til ",
|
|
||||||
"CANCELLING": "Annullerer...",
|
|
||||||
"DETERMINING_SPEED": "Bestemmer din hastighed...",
|
|
||||||
"CALL_HISTORY": "Opkaldshistorik",
|
|
||||||
"CLEAR_CALL_HISTORY": "Ryd historik",
|
|
||||||
"NO_CALL_HISTORY": "Ingen opkaldshistorik.",
|
|
||||||
"ENTER_EXTENSION": "Skriv en udvidelse",
|
|
||||||
"CALL_EXTENSION": "Opkaldsudvidelse",
|
|
||||||
"LOGIN": "Log ind",
|
|
||||||
"LOGIN_INFORMATION": "Log ind oplysninger",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Gem log ind oplysninger",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Kontroller felterne nedenfor og prøv igen.",
|
|
||||||
"NAME": "Navn",
|
|
||||||
"YOUR_NAME": "Dit navn",
|
|
||||||
"EMAIL": "Email",
|
|
||||||
"YOUR_EMAIL": "Din email",
|
|
||||||
"USER": "Bruger",
|
|
||||||
"PASSWORD": "Adgangskode",
|
|
||||||
"CALLER_ID": "Den ringende parts ID",
|
|
||||||
"HOSTNAME": "Hostname",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Indstillinger",
|
|
||||||
"DEVICE_SETTINGS": "Enhedsindstillinger",
|
|
||||||
"SHARE_DEVICE": "Del enhed",
|
|
||||||
"SPEAKER": "Højtaler:",
|
|
||||||
"SPEAKER_FEATURE": "Din browser understøtter ikke denne funktion",
|
|
||||||
"PREVIEW_SETTINGS": "Vis indstillingerne",
|
|
||||||
"REFRESH_DEVICE_LIST": "Opdater enhedslisten",
|
|
||||||
"GENERAL_SETTINGS": "Generelle indstillinger:",
|
|
||||||
"USE_VIDEO": "Brug video",
|
|
||||||
"USE_STEREO_AUDIO": "Stereolyd",
|
|
||||||
"USE_STUN": "Brug STUN",
|
|
||||||
"SCALE_VIDEO": "Skalér video til at matche kameraopløsningen",
|
|
||||||
"ASK_BEFORE_RECOVER": "Spørg før genetablering af kald",
|
|
||||||
"BEST_FRAME_RATE": "Bedste billedhastighed:",
|
|
||||||
"AUDIO_SETTINGS": "Lydindstillinger:",
|
|
||||||
"ECHO_CANCEL": "Fjernelse af ekko",
|
|
||||||
"NOISE_SUPPRESSION": "Støjdæmpning",
|
|
||||||
"HIGHPASS_FILTER": "High-pass filter",
|
|
||||||
"VIDEO_SETTINGS": "Videoindstillinger:",
|
|
||||||
"REMOTE_ENCODER": "Dedikeret fjern-enkoder er aktiveret.",
|
|
||||||
"AUTO_SPEED_RES": "Bestem automatisk indstillinger for hastighed og opløsning",
|
|
||||||
"RECHECK_BANDWIDTH": "Tjek båndbredden før hvert udgående opkald",
|
|
||||||
"CHECK_NETWORK_SPEED": "Tjek netværkshastighed",
|
|
||||||
"VIDEO_QUALITY": "Videokvalitet:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Max indgående båndbredde:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Max udgående båndbredde:",
|
|
||||||
"FACTORY_RESET": "Nulstil til fabriksindstillinger",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Gem enhedsindstillinger",
|
|
||||||
"BROWSER_COMPATIBILITY": "Tjek browser kompatibilitet.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Opdater medieenhed.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Fejk: browseren understøtter ikke WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Tjekker medie tilladelser",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Konfiguration af provisionering.",
|
|
||||||
"CHECK_LOGIN": "Tjekker log ind oplysninger.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Tjek forbindelseshastighed.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Fejl: Medie tilladelse nægtet",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Fejl: Provisioneringen fejlede.",
|
|
||||||
"PLEASE_WAIT": "Vent venligst..."
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Oops, actives Gespräch in Bearbeitung.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Es wärst du bereits in einer Konversation. Konversation beenden?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Es scheint als warst du in einer Konversation bevor die Sitzung beendet wurde. Diese Konversation fortsetzen?",
|
|
||||||
"TITLE_INCOMING_CALL": "Eingehender Anruf",
|
|
||||||
"MESSAGE_INCOMING_CALL": "Von ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Es gibt keine Gespräche die beendet werden können.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Bitte, Dateinamen eingeben",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Video für dieses Gespräch aktivieren?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Video wird für die nächsten Gespräche aktiviert werden.",
|
|
||||||
"TITLE_INSERT_BANNER": "Bitte Banner text eingeben",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Bitte Canvas ID eingeben",
|
|
||||||
"TITLE_INSERT_LAYER": "Please insert the Layer",
|
|
||||||
"TITLE_TRANSFER": "Gespräch weiterleiten?",
|
|
||||||
"MESSAGE_TRANSFER": "Welches Ziel soll die Weiterleitung haben?",
|
|
||||||
"LABEL_TRANSFER": "Ziel",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Die Vorschau Einstellungen können während eines Gesprächs nicht angezeigt werden",
|
|
||||||
"BUTTON_END_CALL": "Anruf beenden",
|
|
||||||
"BUTTON_CLOSE": "Schließen",
|
|
||||||
"MESSAGE_PLAY": "Wiedergabe",
|
|
||||||
"MESSAGE_STOP": "Stoppen",
|
|
||||||
"MESSAGE_RECORD": "Aufnahme",
|
|
||||||
"MESSAGE_STOP_RECORD": "Aufnahme beenden",
|
|
||||||
"MESSAGE_SNAPSHOT": "Snapshot",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Video Modus",
|
|
||||||
"MESSAGE_MUTE_MIC": "Mikrofon ein/ausschalten",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "Video ein/ausschalten",
|
|
||||||
"MESSAGE_FULLSCREEN": "Vollbildmodus ein/ausschalten",
|
|
||||||
"MESSAGE_SCREENSHARE": "Bildschirm teilen",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Chat öffnen/schließen",
|
|
||||||
"MESSAGE_SPEAKER": "Lautsprecher",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Teilnehmer",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "Es gibt keine Mitglieder zum anzeigen.",
|
|
||||||
"CHAT_GENERAL": "Generell",
|
|
||||||
"CHAT_TITLE_KICK": "Kick",
|
|
||||||
"CHAT_KICK": "Kick",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Weiterleiten",
|
|
||||||
"CHAT_TRANSFER": "Weiterleiten",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Set",
|
|
||||||
"CHAT_SET": "Set",
|
|
||||||
"CHAT_TITLE_RESET": "Resetieren",
|
|
||||||
"CHAT_RESET": "Resetieren",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas In",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas Out",
|
|
||||||
"CHAT_PREV": "Zurück",
|
|
||||||
"CHAT_NEXT": "Weiter",
|
|
||||||
"CHAT_LAYER": "Layer",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Audio/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mikrofon ein/ausschalten",
|
|
||||||
"CHAT_MUTE_MIC": "stumm schalten",
|
|
||||||
"CHAT_UNMUTE_MIC": "stummschaltung deaktivieren",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Stummschaltung ein/ausschalten",
|
|
||||||
"CHAT_NO_MESSAGES": "Es gibt keine Nachrichten zum anzeigen.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Absenden",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Nachricht kann hier eingegeben werden...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Mitwirkende",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Die Verbindung ist ungesichert.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Navigation umschalten",
|
|
||||||
"BANDWIDTH_INFO": "Info Bandbreite",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Eingehend:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Ausgehend:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Video Auflösung:",
|
|
||||||
"IN_CALL": "Im Gespräch:",
|
|
||||||
"LAST_CALL": "Letzter Anruf:",
|
|
||||||
"OPEN_NEW_WINDOW": "Neues Fenster öffnen",
|
|
||||||
"CHANGE_LOGIN_INFO": "Anmeldedaten verändern",
|
|
||||||
"LOGOUT": "Abmelden",
|
|
||||||
"ABOUT": "Über",
|
|
||||||
"HELP": "Hilfe",
|
|
||||||
"CONTRIBUTORS": "Mitwirkende",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Kamera und Mikrofon Einstellungen",
|
|
||||||
"CAMERA_SETTINGS": "Kamera:",
|
|
||||||
"MIC_SETTINGS": "Mikrofon:",
|
|
||||||
"SAVE": "Speichern",
|
|
||||||
"LOADING": "Ladend",
|
|
||||||
"ERRORS" : "Fehler",
|
|
||||||
"CALLING_TO": "Gesprächsaufbau zu ",
|
|
||||||
"CANCELLING": "Abbrechen...",
|
|
||||||
"DETERMINING_SPEED": "Geschwindigkeit wird analysiert...",
|
|
||||||
"CALL_HISTORY": "Gesprächsverlauf",
|
|
||||||
"CLEAR_CALL_HISTORY": "Gesprächsverlauf löschen",
|
|
||||||
"NO_CALL_HISTORY": "Kein Gesprächsverlauf vorhanden.",
|
|
||||||
"ENTER_EXTENSION": "Nummer eingeben",
|
|
||||||
"CALL_EXTENSION": "Nummer anrufen",
|
|
||||||
"LOGIN": "Anmelden",
|
|
||||||
"LOGIN_INFORMATION": "Anmeldeinformationen",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Anmeldeinformationen speichern",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Bitte die unteren Felder kontrollieren und erneut versuchen.",
|
|
||||||
"NAME": "Name",
|
|
||||||
"YOUR_NAME": "Dein Name",
|
|
||||||
"EMAIL": "E-Mail",
|
|
||||||
"YOUR_EMAIL": "Deine E-Mail",
|
|
||||||
"USER": "Benutzer",
|
|
||||||
"PASSWORD": "Passwort",
|
|
||||||
"CALLER_ID": "Anrufer ID",
|
|
||||||
"HOSTNAME": "Hostname",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Einstellungen",
|
|
||||||
"DEVICE_SETTINGS": "Geräte Einstellungen",
|
|
||||||
"SHARE_DEVICE": "Gerät teilen",
|
|
||||||
"SPEAKER": "Lautsprecher:",
|
|
||||||
"SPEAKER_FEATURE": "Dein browser scheint diese Funktion nicht zu unterstützen",
|
|
||||||
"PREVIEW_SETTINGS": "Vorschau Einstellungen",
|
|
||||||
"REFRESH_DEVICE_LIST": "Aktualisieren Geräteliste",
|
|
||||||
"GENERAL_SETTINGS": "Generelle Einstellungen:",
|
|
||||||
"USE_VIDEO": "Video aktivieren",
|
|
||||||
"USE_STEREO_AUDIO": "Stereo Audio",
|
|
||||||
"USE_STUN": "STUN benützen",
|
|
||||||
"SCALE_VIDEO": "Entfernte Kamera skalieren damit die Auflösung zusammenpasst",
|
|
||||||
"ASK_BEFORE_RECOVER": "Nachfrage bevor das Gespräch wiederhergestellt wird",
|
|
||||||
"BEST_FRAME_RATE": "Beste frame rate:",
|
|
||||||
"AUDIO_SETTINGS": "Audio Einstellungen:",
|
|
||||||
"ECHO_CANCEL": "Echo Cancellation",
|
|
||||||
"NOISE_SUPPRESSION": "Noise Suppression",
|
|
||||||
"HIGHPASS_FILTER": "Highpass Filter",
|
|
||||||
"VIDEO_SETTINGS": "Video Einstellungen:",
|
|
||||||
"REMOTE_ENCODER": "Dedicated Remote Encoder enabled.",
|
|
||||||
"AUTO_SPEED_RES": "Automatisch geschwindigkeit messen und Auflösung einstellen",
|
|
||||||
"RECHECK_BANDWIDTH": "Recheck bandwidth before each outgoing call",
|
|
||||||
"CHECK_NETWORK_SPEED": "Netzwerk Geschwindigkeit messen",
|
|
||||||
"VIDEO_QUALITY": "Video Qualität:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Max eingehnde Bandbreite:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Max ausgehende Bandbreite:",
|
|
||||||
"FACTORY_RESET": "Werkseinstellungen",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Geräteeinstellungen speichern",
|
|
||||||
"BROWSER_COMPATIBILITY": "Browserkompatibilität prüfen.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Aktualisiern Medien Geräte.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Fehler: Browser unterstützt kein WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Medien berechtigungen prüfen",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Provisioning Konfiguration.",
|
|
||||||
"CHECK_LOGIN": "Anmeldung verifizieren.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Verbindungsgeschwindikeit prüfen.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Fehler: Medien Berechtigung fehlgeschlagen",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Fehler: Provisioning fehlgeschlagen.",
|
|
||||||
"PLEASE_WAIT": "Bitte warten...",
|
|
||||||
"CANCEL": "Abbrechen",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Lautstärke -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Lautstärke +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Gain -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Gain +",
|
|
||||||
"CHAT_VOL_MINUS": "Lautstärke -",
|
|
||||||
"CHAT_VOL_PLUS": "Lautstärke +",
|
|
||||||
"CHAT_GAIN_MINUS": "Gain -",
|
|
||||||
"CHAT_GAIN_PLUS": "Gain +"
|
|
||||||
}
|
|
|
@ -1,161 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Oops, Active Call in Course.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "It seems that you are in a call. Do you want to hang up?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "It seems you were in a call before leaving the last time. Wanna go back to that?",
|
|
||||||
"TITLE_INCOMING_CALL": "Incoming Call",
|
|
||||||
"MESSAGE_INCOMING_CALL": "from ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "There is no call to hangup.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Please, enter filename",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Would you like to activate video for this call?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Video will be active during the next calls.",
|
|
||||||
"TITLE_INSERT_BANNER": "Please insert the banner text",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Please insert the Canvas Id",
|
|
||||||
"TITLE_INSERT_LAYER": "Please insert the Layer",
|
|
||||||
"TITLE_TRANSFER": "Transfer party?",
|
|
||||||
"MESSAGE_TRANSFER": "To what destination would you like to transfer this call?",
|
|
||||||
"LABEL_TRANSFER": "Destination",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Can't display preview settings during a call",
|
|
||||||
"BUTTON_END_CALL": "End Call",
|
|
||||||
"BUTTON_CLOSE": "Close",
|
|
||||||
"MESSAGE_PLAY": "Play",
|
|
||||||
"MESSAGE_STOP": "Stop",
|
|
||||||
"MESSAGE_RECORD": "Record",
|
|
||||||
"MESSAGE_STOP_RECORD": "Stop Record",
|
|
||||||
"MESSAGE_SNAPSHOT": "Snapshot",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Video Mode",
|
|
||||||
"MESSAGE_MUTE_MIC": "(un)Mute Mic",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "(un)Mute Video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Toggle Fullscreen Mode",
|
|
||||||
"MESSAGE_SCREENSHARE": "Screenshare",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Open/Close Chat",
|
|
||||||
"MESSAGE_SPEAKER": "Speaker",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Members",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "There are no members to show.",
|
|
||||||
"CHAT_GENERAL": "General",
|
|
||||||
"CHAT_TITLE_KICK": "Kick",
|
|
||||||
"CHAT_KICK": "Kick",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Transfer",
|
|
||||||
"CHAT_TRANSFER": "Transfer",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Set",
|
|
||||||
"CHAT_SET": "Set",
|
|
||||||
"CHAT_TITLE_RESET": "Reset",
|
|
||||||
"CHAT_RESET": "Reset",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas In",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas Out",
|
|
||||||
"CHAT_PREV": "Prev",
|
|
||||||
"CHAT_NEXT": "Next",
|
|
||||||
"CHAT_LAYER": "Layer",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Audio/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Mic",
|
|
||||||
"CHAT_MUTE_MIC": "Mute",
|
|
||||||
"CHAT_UNMUTE_MIC": "Unmute",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Mute/Unmute Video",
|
|
||||||
"CHAT_NO_MESSAGES": "There are no messages to show.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Send",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Type your message here...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Contributors",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "This Connection is Untrusted.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Toggle navigation",
|
|
||||||
"BANDWIDTH_INFO": "Bandwidth Info",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Incoming:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Outgoing:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Video Resolution:",
|
|
||||||
"IN_CALL": "In Call:",
|
|
||||||
"LAST_CALL": "Last Call:",
|
|
||||||
"OPEN_NEW_WINDOW": "Open New Window",
|
|
||||||
"CHANGE_LOGIN_INFO": "Change Login Information",
|
|
||||||
"LOGOUT": "Logout",
|
|
||||||
"ABOUT": "About",
|
|
||||||
"HELP": "Help",
|
|
||||||
"CONTRIBUTORS": "Contributors",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Setup your camera and microphone settings",
|
|
||||||
"CAMERA_SETTINGS": "Camera:",
|
|
||||||
"MIC_SETTINGS": "Microphone:",
|
|
||||||
"SAVE": "Save",
|
|
||||||
"LOADING": "Loading",
|
|
||||||
"ERRORS" : "Errors",
|
|
||||||
"CALLING_TO": "Calling to ",
|
|
||||||
"CANCELLING": "Cancelling...",
|
|
||||||
"DETERMINING_SPEED": "Determining your speed...",
|
|
||||||
"CALL_HISTORY": "Call History",
|
|
||||||
"CLEAR_CALL_HISTORY": "Clear History",
|
|
||||||
"NO_CALL_HISTORY": "No history calls.",
|
|
||||||
"ENTER_EXTENSION": "Enter an extension",
|
|
||||||
"CALL_EXTENSION": "Call Extension",
|
|
||||||
"LOGIN": "Login",
|
|
||||||
"LOGIN_INFORMATION": "Login Information",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Save Login Information",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Verify the fields below and try again.",
|
|
||||||
"INVALID_SETTINGS_FIELDS": "Verify the settings below and try again.",
|
|
||||||
"NAME": "Name",
|
|
||||||
"YOUR_NAME": "Your name",
|
|
||||||
"EMAIL": "Email",
|
|
||||||
"YOUR_EMAIL": "Your email",
|
|
||||||
"USER": "User",
|
|
||||||
"PASSWORD": "Password",
|
|
||||||
"CALLER_ID": "Caller ID",
|
|
||||||
"HOSTNAME": "Hostname",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Settings",
|
|
||||||
"DEVICE_SETTINGS": "Device Settings",
|
|
||||||
"SHARE_DEVICE": "Share device",
|
|
||||||
"SPEAKER": "Speaker:",
|
|
||||||
"SPEAKER_FEATURE": "Your browser doesn't seem to support this feature",
|
|
||||||
"PREVIEW_SETTINGS": "Preview Settings",
|
|
||||||
"REFRESH_DEVICE_LIST": "Refresh device list",
|
|
||||||
"GENERAL_SETTINGS": "General settings:",
|
|
||||||
"USE_VIDEO": "Use Video",
|
|
||||||
"USE_STEREO_AUDIO": "Stereo Audio",
|
|
||||||
"USE_STUN": "Use STUN",
|
|
||||||
"SCALE_VIDEO": "Scale Remote Video To Match Camera Resolution",
|
|
||||||
"ASK_BEFORE_RECOVER": "Ask before recovering call",
|
|
||||||
"BEST_FRAME_RATE": "Best frame rate:",
|
|
||||||
"AUDIO_SETTINGS": "Audio settings:",
|
|
||||||
"ECHO_CANCEL": "Echo Cancellation",
|
|
||||||
"NOISE_SUPPRESSION": "Noise Suppression",
|
|
||||||
"HIGHPASS_FILTER": "Highpass Filter",
|
|
||||||
"VIDEO_SETTINGS": "Video settings:",
|
|
||||||
"REMOTE_ENCODER": "Dedicated Remote Encoder enabled.",
|
|
||||||
"AUTO_SPEED_RES": "Automatically determine speed and resolution settings",
|
|
||||||
"RECHECK_BANDWIDTH": "Recheck bandwidth before each outgoing call",
|
|
||||||
"CHECK_NETWORK_SPEED": "Check Network Speed",
|
|
||||||
"CHECKING_NETWORK_SPEED": "Checking Network Speed",
|
|
||||||
"VIDEO_QUALITY": "Video quality:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Max incoming bandwidth:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Max outgoing bandwidth:",
|
|
||||||
"FACTORY_RESET": "Factory reset",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Save Device Settings",
|
|
||||||
"BROWSER_COMPATIBILITY": "Checking browser compatibility.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Refresh Media Devices.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Error: browser doesn't support WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Checking media permissions",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Provisioning configuration.",
|
|
||||||
"CHECK_LOGIN": "Checking login.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Check Connection Speed.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Error: Media Permission Denied",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Error: Provision failed.",
|
|
||||||
"PLEASE_WAIT": "Please wait...",
|
|
||||||
"CANCEL": "Cancel",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Volume -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Volume +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Gain -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Gain +",
|
|
||||||
"CHAT_TITLE_DEAF_UNDEAF": "Deaf/Undeaf",
|
|
||||||
"CHAT_VOL_MINUS": "Vol -",
|
|
||||||
"CHAT_VOL_PLUS": "Vol +",
|
|
||||||
"CHAT_GAIN_MINUS": "Gain -",
|
|
||||||
"CHAT_GAIN_PLUS": "Gain +",
|
|
||||||
"CHAT_DEAF": "Deaf",
|
|
||||||
"CHAT_UNDEAF": "Undeaf",
|
|
||||||
"LANGUAGE": "Language:",
|
|
||||||
"BROWSER_LANGUAGE": "Browser Language",
|
|
||||||
"FACTORY_RESET_SETTINGS": "Factory Reset Settings",
|
|
||||||
"AUTOGAIN_CONTROL": "Auto Gain Control",
|
|
||||||
"WAITING_DEVICES": "Waiting for devices..."
|
|
||||||
}
|
|
|
@ -1,159 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Llamada en curso.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Estas en una llamada, ¿ quieres colgar ?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Wstabas en una llamada la última vez, ¿ quieres retomarla ?",
|
|
||||||
"TITLE_INCOMING_CALL": "Llamada entrante",
|
|
||||||
"MESSAGE_INCOMING_CALL": "desde ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "No hay llamada que colgar.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Por favor, indica el nombre del archivo.",
|
|
||||||
"TITLE_ENABLE_VIDEO": "¿ Quieres activar el vídeo para esta llamada ?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "El video estará activo durante las siguientes llamadas.",
|
|
||||||
"TITLE_INSERT_BANNER": "Por favor indica el texto para el banner",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Por favor, indica el idenficador del lienzo",
|
|
||||||
"TITLE_INSERT_LAYER": "Por favor, indica el título para la capa",
|
|
||||||
"TITLE_TRANSFER": "¿ Transferir llamada ?",
|
|
||||||
"MESSAGE_TRANSFER": "¿ A qué destino quieres transferir esta llamada? ",
|
|
||||||
"LABEL_TRANSFER": "Destino",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "No se puede mostrar la configuración de vista previa durante una llamada",
|
|
||||||
"BUTTON_END_CALL": "Finalizar llamada",
|
|
||||||
"BUTTON_CLOSE": "Cerrar",
|
|
||||||
"MESSAGE_PLAY": " Reproducir",
|
|
||||||
"MESSAGE_STOP": "Parar",
|
|
||||||
"MESSAGE_RECORD": "Grabar",
|
|
||||||
"MESSAGE_STOP_RECORD": "Parar de grabar",
|
|
||||||
"MESSAGE_SNAPSHOT": "Captura",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Modo de vídeo",
|
|
||||||
"MESSAGE_MUTE_MIC": "(des)activar el micrófono",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "(des)activar el video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Cambiar el modo de pantalla completa",
|
|
||||||
"MESSAGE_SCREENSHARE": "Compartir la pantalla",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Abrir/cerrar chat",
|
|
||||||
"MESSAGE_SPEAKER": "Altavoz",
|
|
||||||
"MESSAGE_POPUP": "Ventana emergente",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Participantes",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "No hay participantes para mostrar.",
|
|
||||||
"CHAT_GENERAL": "General",
|
|
||||||
"CHAT_TITLE_KICK": "Expulsar",
|
|
||||||
"CHAT_KICK": "Expulsar",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Fondo de vídeo",
|
|
||||||
"CHAT_FLOOR": "Fondo de chat",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Transferir",
|
|
||||||
"CHAT_TRANSFER": "Transferir",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Poner",
|
|
||||||
"CHAT_SET": "Poner",
|
|
||||||
"CHAT_TITLE_RESET": "Resetear",
|
|
||||||
"CHAT_RESET": "Resetear ",
|
|
||||||
"CHAT_CANVAS": "Lienzo",
|
|
||||||
"CHAT_CANVAS_IN": "Lienzo dentro",
|
|
||||||
"CHAT_CANVAS_OUT": "Lienzo afuera",
|
|
||||||
"CHAT_PREV": "Siguiente",
|
|
||||||
"CHAT_NEXT": "Próximo",
|
|
||||||
"CHAT_LAYER": "Capa",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Audio/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Activar/desactivar micrófono",
|
|
||||||
"CHAT_MUTE_MIC": "Silenciar ",
|
|
||||||
"CHAT_UNMUTE_MIC": "No silenciar",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Activar/desactivar vídeo",
|
|
||||||
"CHAT_NO_MESSAGES": "No hay mensajes para mostrar.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Enviar",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Escribe tu mensaje aquí...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Colaboradores",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Esta conexión no es de confianza.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Alternar la navegación",
|
|
||||||
"BANDWIDTH_INFO": "Información de ancho de banda",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Entrante:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Saliente:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Resolución de vídeo:",
|
|
||||||
"IN_CALL": "En llamada:",
|
|
||||||
"LAST_CALL": "Última llamada:",
|
|
||||||
"OPEN_NEW_WINDOW": "Abrir en ventana nueva",
|
|
||||||
"CHANGE_LOGIN_INFO": "Cambiar la información de inicio de sesión",
|
|
||||||
"LOGOUT": "Cerrar sesión",
|
|
||||||
"ABOUT": "Acerca de",
|
|
||||||
"HELP": "Ayuda",
|
|
||||||
"CONTRIBUTORS": "Colaboradores",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Configuración de la cámara y el micrófono",
|
|
||||||
"CAMERA_SETTINGS": "Cámara:",
|
|
||||||
"MIC_SETTINGS": "Micrófono:",
|
|
||||||
"SAVE": "Guardar",
|
|
||||||
"LOADING": "Cargando",
|
|
||||||
"ERRORS" : "Errores",
|
|
||||||
"CALLING_TO": "Llamar a ",
|
|
||||||
"CANCELLING": "Cancelando...",
|
|
||||||
"DETERMINING_SPEED": "Midiendo la velocidad...",
|
|
||||||
"CALL_HISTORY": "Historial de llamadas",
|
|
||||||
"CLEAR_CALL_HISTORY": "Borrar Historial",
|
|
||||||
"NO_CALL_HISTORY": "Sin historial de llamadas.",
|
|
||||||
"ENTER_EXTENSION": "Marca una extensión",
|
|
||||||
"CALL_EXTENSION": "Llamar a una extensión",
|
|
||||||
"LOGIN": "Inicio de sesión",
|
|
||||||
"LOGIN_INFORMATION": "Información de inicio de sesión",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Guardar información de inicio de sesión",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Corrige el formulario e inténtalo otra vez.",
|
|
||||||
"INVALID_SETTINGS_FIELDS": "Verifica los ajustes e inténtalo otra vez.",
|
|
||||||
"NAME": "Nombre",
|
|
||||||
"YOUR_NAME": "Tu nombre",
|
|
||||||
"EMAIL": " Correo electrónico",
|
|
||||||
"YOUR_EMAIL": "Tu correo electrónico",
|
|
||||||
"USER": "Usuario",
|
|
||||||
"PASSWORD": "Contraseña",
|
|
||||||
"CALLER_ID": "Identificador de llamada",
|
|
||||||
"HOSTNAME": "Servidor",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Configuración",
|
|
||||||
"DEVICE_SETTINGS": "Configuración de dispositivo",
|
|
||||||
"SHARE_DEVICE": "Compartir dispositivo",
|
|
||||||
"SPEAKER": "Altavoz:",
|
|
||||||
"SPEAKER_FEATURE": "Tu navegador no soporta esta característica",
|
|
||||||
"PREVIEW_SETTINGS": "Configuración de vista previa",
|
|
||||||
"REFRESH_DEVICE_LIST": "Actualizar la lista de dispositivos",
|
|
||||||
"GENERAL_SETTINGS": "Configuración general:",
|
|
||||||
"USE_VIDEO": "Utilizar vídeo",
|
|
||||||
"USE_STEREO_AUDIO": "Utilizar audio estéreo",
|
|
||||||
"USE_STUN": "Utilizar STUN",
|
|
||||||
"SCALE_VIDEO": "Escalar el vídeo remoto para que coincida con la resolución de la cámara",
|
|
||||||
"ASK_BEFORE_RECOVER": "Preguntar antes de recuperar la llamada",
|
|
||||||
"BEST_FRAME_RATE": "Mejor velocidad de vídeo:",
|
|
||||||
"AUDIO_SETTINGS": "Configuración de audio:",
|
|
||||||
"ECHO_CANCEL": "Cancelación de eco",
|
|
||||||
"NOISE_SUPPRESSION": "Supresión de Ruido",
|
|
||||||
"HIGHPASS_FILTER": "Filtro de paso alto",
|
|
||||||
"VIDEO_SETTINGS": "Configuración de vídeo:",
|
|
||||||
"REMOTE_ENCODER": "Codificador remoto activado",
|
|
||||||
"AUTO_SPEED_RES": "Determinar automáticamente la configuración de velocidad y resolución",
|
|
||||||
"RECHECK_BANDWIDTH": "Volver a comprobar el ancho de banda antes de cada llamada saliente",
|
|
||||||
"CHECK_NETWORK_SPEED": "Comprobar la velocidad de la red",
|
|
||||||
"VIDEO_QUALITY": "Calidad de vídeo:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Máximo ancho banda entrante:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Máximo ancho banda saliente:",
|
|
||||||
"FACTORY_RESET": "Reiniciar",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Guardar la configuración del dispositivo",
|
|
||||||
"BROWSER_COMPATIBILITY": "Comprobando la compatibilidad del navegador web",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Actualizando dispositivos multimedia",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Error: el navegador no soporta WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Comprobando permisos de los dispositivos multimedia",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Verificando configuración.",
|
|
||||||
"CHECK_LOGIN": "Verificando inicio de sesión.",
|
|
||||||
"CHECK_CONNECTION_SPEED": " Verificando la velocidad de conexión.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Error: permiso de dispositivos multimedia denegado",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Error: Provisión falló.",
|
|
||||||
"PLEASE_WAIT": "Por favor espere...",
|
|
||||||
"CANCEL": "Cancelar",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Volumen -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Volumen +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Ganancia -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Ganancia +",
|
|
||||||
"CHAT_TITLE_DEAF_UNDEAF": "Deaf/Undeaf",
|
|
||||||
"CHAT_VOL_MINUS": "Vol -",
|
|
||||||
"CHAT_VOL_PLUS": "Vol +",
|
|
||||||
"CHAT_GAIN_MINUS": "Gain -",
|
|
||||||
"CHAT_GAIN_PLUS": "Gain +",
|
|
||||||
"CHAT_DEAF": "Deaf",
|
|
||||||
"CHAT_UNDEAF": "Undeaf",
|
|
||||||
"LANGUAGE": "Idioma:",
|
|
||||||
"BROWSER_LANGUAGE": "Idioma del navegador",
|
|
||||||
"FACTORY_RESET_SETTINGS": "Inicializar ajustes",
|
|
||||||
"AUTOGAIN_CONTROL": "Control de ganancia automática"
|
|
||||||
}
|
|
|
@ -1,143 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Oups, appel actif déjà en cours",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Il semble que vous êtes déjà en communication. Voulez vous raccrocher ?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Il semblre que vous étiez déjà en appel avant de quitter la dernière fois, Voulez-vous retourner à cet appel ?",
|
|
||||||
"TITLE_INCOMING_CALL": "Appel entrant",
|
|
||||||
"MESSAGE_INCOMING_CALL": "De ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Il n'y as pas d'appels à raccrocher.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Veuillez entrer le nom de fichier",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Voulez vous activer la video pour cet appel?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "La vidéo sera activée pour les prochains appels.",
|
|
||||||
"TITLE_INSERT_BANNER": "Merci d'insérer le texte de bannière",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Merci d'insérer l'ID du Canvas",
|
|
||||||
"TITLE_INSERT_LAYER": "Merci d'insérer la couche",
|
|
||||||
"TITLE_TRANSFER": "Transferer le correspondant ?",
|
|
||||||
"MESSAGE_TRANSFER": "Vers quelle destination voulez vous transférer cet appel ?",
|
|
||||||
"LABEL_TRANSFER": "Destination",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Nous ne pouvons afficher les paramêtres de prévisualisation pendant un appel",
|
|
||||||
"BUTTON_END_CALL": "Terminer l'appel",
|
|
||||||
"BUTTON_CLOSE": "Fermer",
|
|
||||||
"MESSAGE_PLAY": "Jouer",
|
|
||||||
"MESSAGE_STOP": "Stop",
|
|
||||||
"MESSAGE_RECORD": "Enregistrer",
|
|
||||||
"MESSAGE_STOP_RECORD": "Arrêter l'enregistrement",
|
|
||||||
"MESSAGE_SNAPSHOT": "Capture d'écran",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Mode Video",
|
|
||||||
"MESSAGE_MUTE_MIC": "(des)activer Micro",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "(des)activer Video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Basculer en mode plein écran",
|
|
||||||
"MESSAGE_SCREENSHARE": "Partage d'écran",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Ouvrir/Fermer le chat",
|
|
||||||
"MESSAGE_SPEAKER": "Orateur",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Membres",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "Il n'y as pas de membres actuellement.",
|
|
||||||
"CHAT_GENERAL": "General",
|
|
||||||
"CHAT_TITLE_KICK": "Ejecter",
|
|
||||||
"CHAT_KICK": "Ejecter",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Transferer",
|
|
||||||
"CHAT_TRANSFER": "Transferer",
|
|
||||||
"CHAT_BANNER": "Bannière",
|
|
||||||
"CHAT_TITLE_SET": "Set",
|
|
||||||
"CHAT_SET": "Set",
|
|
||||||
"CHAT_TITLE_RESET": "Reset",
|
|
||||||
"CHAT_RESET": "Reset",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas In",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas Out",
|
|
||||||
"CHAT_PREV": "Précédent",
|
|
||||||
"CHAT_NEXT": "Suivant",
|
|
||||||
"CHAT_LAYER": "Couche",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Audio/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Activer/Désactiver micro",
|
|
||||||
"CHAT_MUTE_MIC": "Désactiver le micro",
|
|
||||||
"CHAT_UNMUTE_MIC": "Activer le micro",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Activer/Désactiver video",
|
|
||||||
"CHAT_NO_MESSAGES": "il n'y as pas de messages à afficher",
|
|
||||||
"CHAT_SEND_MESSAGE": "Envoyer",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Saisir votre message ici...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Contributeurs",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Cette connection n'est pas certifiée sûre.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Basculer la navigation",
|
|
||||||
"BANDWIDTH_INFO": "Information de bande passante",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Entrant:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Sortant:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Résolution vidéo:",
|
|
||||||
"IN_CALL": "Appel en cours:",
|
|
||||||
"LAST_CALL": "Dernier appel:",
|
|
||||||
"OPEN_NEW_WINDOW": "Ouvrir une nouvelle fenêtre",
|
|
||||||
"CHANGE_LOGIN_INFO": "Changer les informations utilisateur",
|
|
||||||
"LOGOUT": "Deconnection",
|
|
||||||
"ABOUT": "A propos",
|
|
||||||
"HELP": "Aide",
|
|
||||||
"CONTRIBUTORS": "Contributeurs",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Paramêtrer votre micro et caméra",
|
|
||||||
"CAMERA_SETTINGS": "Camera:",
|
|
||||||
"MIC_SETTINGS": "Microphone:",
|
|
||||||
"SAVE": "Sauvegarder",
|
|
||||||
"LOADING": "Chargement",
|
|
||||||
"ERRORS" : "Erreurs",
|
|
||||||
"CALLING_TO": "Appel sortant vers ",
|
|
||||||
"CANCELLING": "Annulation en cours...",
|
|
||||||
"DETERMINING_SPEED": "En train de déterminer votre bande passante...",
|
|
||||||
"CALL_HISTORY": "Historique d'appel",
|
|
||||||
"CLEAR_CALL_HISTORY": "Effacer l'historique",
|
|
||||||
"NO_CALL_HISTORY": "Pas d'historique d'appel",
|
|
||||||
"ENTER_EXTENSION": "Saisir une extension",
|
|
||||||
"CALL_EXTENSION": "Appeler une extension",
|
|
||||||
"LOGIN": "Nom d'utilisateur:",
|
|
||||||
"LOGIN_INFORMATION": "Information utilisateur",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Sauvegarder les informations utilisateurs",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Vérifiez les champs ci dessous et rééssayez.",
|
|
||||||
"NAME": "Nom",
|
|
||||||
"YOUR_NAME": "Votre nom",
|
|
||||||
"EMAIL": "Email",
|
|
||||||
"YOUR_EMAIL": "Votre email",
|
|
||||||
"USER": "Utilisateur",
|
|
||||||
"PASSWORD": "mot de passe",
|
|
||||||
"CALLER_ID": "Numéro Appelant",
|
|
||||||
"HOSTNAME": "Nom de domaine",
|
|
||||||
"WEBSOCKET_URL": "URL Websocket",
|
|
||||||
"SETTINGS": "Paramêtres",
|
|
||||||
"DEVICE_SETTINGS": "Paramêtres de l'appareil",
|
|
||||||
"SHARE_DEVICE": "Partager le périphérique",
|
|
||||||
"SPEAKER": "Orateur:",
|
|
||||||
"SPEAKER_FEATURE": "Votre navigateur ne semble pas supporter cette fonctionnalité",
|
|
||||||
"PREVIEW_SETTINGS": "Paramêtres de prévisualisation",
|
|
||||||
"REFRESH_DEVICE_LIST": "Rafraichir la liste des périphériques",
|
|
||||||
"GENERAL_SETTINGS": "Paramêtres généraux:",
|
|
||||||
"USE_VIDEO": "Utiliser la vidéo",
|
|
||||||
"USE_STEREO_AUDIO": "Audio stereo",
|
|
||||||
"USE_STUN": "Utiliser STUN",
|
|
||||||
"SCALE_VIDEO": "Ajuster la résolution de la vidéo distante pour correspondre à la résolution de la caméra",
|
|
||||||
"ASK_BEFORE_RECOVER": "Demander avant de récupérer un appel",
|
|
||||||
"BEST_FRAME_RATE": "Meilleur taux de rafraichissement:",
|
|
||||||
"AUDIO_SETTINGS": "Paramêtres audio:",
|
|
||||||
"ECHO_CANCEL": "Anti-echo",
|
|
||||||
"NOISE_SUPPRESSION": "Suppression du bruit",
|
|
||||||
"HIGHPASS_FILTER": "Filtre passe-haut:",
|
|
||||||
"VIDEO_SETTINGS": "Paramêtres vidéo:",
|
|
||||||
"REMOTE_ENCODER": "Encodeur distant dédié activé",
|
|
||||||
"AUTO_SPEED_RES": "Détecter automatiquement les paramêtres de bande passante et de résolution vidéo",
|
|
||||||
"RECHECK_BANDWIDTH": "Revérifier la bande passante avant chaque appel",
|
|
||||||
"CHECK_NETWORK_SPEED": "Verification de la vitesse de connection.",
|
|
||||||
"VIDEO_QUALITY": "Qualité vidéo:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Bande passante entrante maximale:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Bande passante sortante maximale:",
|
|
||||||
"FACTORY_RESET": "Remise aux paramêtres par défaut",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Sauvegarder les paramêtres de l'appareil.",
|
|
||||||
"BROWSER_COMPATIBILITY": "Vérification de la compatibilité du navigateur.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Rafraichir les périphériques multimédias.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Erreur: votre navigateur ne supporte pas WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Vérification des permissions multimédias",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Vérification de la configuration.",
|
|
||||||
"CHECK_LOGIN": "Vérification du nom d'utilisateur",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Vérifiez votre vitesse de connection à Internet.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Erreur: La permission d'accéder aux périphériques multimedia as été refusée",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Erreur: La configuration as échouée.",
|
|
||||||
"PLEASE_WAIT": "Merci de patienter...",
|
|
||||||
"CANCEL": "Annuler"
|
|
||||||
}
|
|
|
@ -1,143 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Waduh, Panggilan sedang berlangsung .",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Tampaknya kamu sedang dalam percakapan. Mau diputus?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Sebelum ini, Tampaknya kamu sedang dalam percakapan. Mau disambungkan lagi?",
|
|
||||||
"TITLE_INCOMING_CALL": "Panggilan masuk",
|
|
||||||
"MESSAGE_INCOMING_CALL": "dari ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Tidak ada panggilan yang perlu diputus.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Silahkan masukan nama file",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Apakah anda ingin mengaktifkan Video di panggilan ini?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Video akan diaktifkan di panggilan berikutnya.",
|
|
||||||
"TITLE_INSERT_BANNER": "Silahkan isi dengan teks banner",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Silahkan isi dengan id canvas",
|
|
||||||
"TITLE_INSERT_LAYER": "Silahkan isi dengan layer",
|
|
||||||
"TITLE_TRANSFER": "Panggilan dialihkan?",
|
|
||||||
"MESSAGE_TRANSFER": "Kemana panggilan anda ingin dialihkan?",
|
|
||||||
"LABEL_TRANSFER": "Tujuan",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Tidak dapat mereview setelan, selama dalam panggilan",
|
|
||||||
"BUTTON_END_CALL": "Mengakhiri Panggilan",
|
|
||||||
"BUTTON_CLOSE": "Tutup",
|
|
||||||
"MESSAGE_PLAY": "Mainkan",
|
|
||||||
"MESSAGE_STOP": "Hentikan",
|
|
||||||
"MESSAGE_RECORD": "Catat",
|
|
||||||
"MESSAGE_STOP_RECORD": "Hentikan Pencatatan",
|
|
||||||
"MESSAGE_SNAPSHOT": "Jepret",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Mode Video",
|
|
||||||
"MESSAGE_MUTE_MIC": "(tidak)Aktifkan Mic",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "(tidak)Aktifkan Video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Pilihan Mode Layar Penuh",
|
|
||||||
"MESSAGE_SCREENSHARE": "Berbagi Layar",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Buka/Tutup Obrolan",
|
|
||||||
"MESSAGE_SPEAKER": "Speaker",
|
|
||||||
"MESSAGE_POPUP": "Muncul",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Anggota",
|
|
||||||
"CHAT_TITLE": "Obrolan",
|
|
||||||
"CHAT_NO_MEMBERS": "Tidak ada anggota untuk ditampilkan.",
|
|
||||||
"CHAT_GENERAL": "Umum",
|
|
||||||
"CHAT_TITLE_KICK": "Tendang",
|
|
||||||
"CHAT_KICK": "Tendang",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video Latar",
|
|
||||||
"CHAT_FLOOR": "Latar",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Alihkan",
|
|
||||||
"CHAT_TRANSFER": "Alihkan",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Setelan",
|
|
||||||
"CHAT_SET": "Setelan",
|
|
||||||
"CHAT_TITLE_RESET": "Atur Ulang",
|
|
||||||
"CHAT_RESET": "Atur Ulang",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas Masuk",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas Keluar",
|
|
||||||
"CHAT_PREV": "Sebelumnya",
|
|
||||||
"CHAT_NEXT": "Berikutnya",
|
|
||||||
"CHAT_LAYER": "Layer",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Suara/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Matikan/Aktifkan Mic",
|
|
||||||
"CHAT_MUTE_MIC": "Matikan",
|
|
||||||
"CHAT_UNMUTE_MIC": "Aktifkan",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Matikan/Aktifkan Video",
|
|
||||||
"CHAT_NO_MESSAGES": "Tidak ada pesan yang perlu ditampilkan.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Kirim",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Ketik pesan kamu disini...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Penyumbang",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Sambungan ini tidak bisa dipercaya.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Pilihan navigasi",
|
|
||||||
"BANDWIDTH_INFO": "Info Bandwith",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Panggilan Masuk:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Panggilan Keluar:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Resolusi Video:",
|
|
||||||
"IN_CALL": "Dalam Panggilan:",
|
|
||||||
"LAST_CALL": "Panggilan Terakhir:",
|
|
||||||
"OPEN_NEW_WINDOW": "Buka Tampilan Baru",
|
|
||||||
"CHANGE_LOGIN_INFO": "Ganti Informasi Login",
|
|
||||||
"LOGOUT": "Keluar",
|
|
||||||
"ABOUT": "Tentang",
|
|
||||||
"HELP": "Bantuan",
|
|
||||||
"CONTRIBUTORS": "Penyumbang",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Setel Kamera dan Mikrophone kamu",
|
|
||||||
"CAMERA_SETTINGS": "Kamera:",
|
|
||||||
"MIC_SETTINGS": "Mikrophone:",
|
|
||||||
"SAVE": "Simpan",
|
|
||||||
"LOADING": "Sedang di muat",
|
|
||||||
"ERRORS" : "Kesalahan",
|
|
||||||
"CALLING_TO": "Panggilan ke ",
|
|
||||||
"CANCELLING": "Membatalkan...",
|
|
||||||
"DETERMINING_SPEED": "Mengukur kecepatan kamu...",
|
|
||||||
"CALL_HISTORY": "Riwayat Panggilan",
|
|
||||||
"CLEAR_CALL_HISTORY": "Hapus Riwayat",
|
|
||||||
"NO_CALL_HISTORY": "Tidak ada Riwayat Panggilan.",
|
|
||||||
"ENTER_EXTENSION": "Ketikkan Nomer Ekstensi",
|
|
||||||
"CALL_EXTENSION": "Panggilan Ke Nomer Ekstensi",
|
|
||||||
"LOGIN": "Login",
|
|
||||||
"LOGIN_INFORMATION": "Informasi Login",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Simpan Informasi Login",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Periksa isian dibawah ini dan periksa lagi.",
|
|
||||||
"NAME": "Nama",
|
|
||||||
"YOUR_NAME": "Nama kamu",
|
|
||||||
"EMAIL": "Email",
|
|
||||||
"YOUR_EMAIL": "Email kamu",
|
|
||||||
"USER": "User",
|
|
||||||
"PASSWORD": "Password",
|
|
||||||
"CALLER_ID": "ID Pemanggil",
|
|
||||||
"HOSTNAME": "Hostname",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Setelan",
|
|
||||||
"DEVICE_SETTINGS": "Setelan Perangkat",
|
|
||||||
"SHARE_DEVICE": "Berbagi Perangkat",
|
|
||||||
"SPEAKER": "Speaker:",
|
|
||||||
"SPEAKER_FEATURE": "Tampaknya browser kamu tidak mendukung feature ini",
|
|
||||||
"PREVIEW_SETTINGS": "Mereview Setelan",
|
|
||||||
"REFRESH_DEVICE_LIST": "Data ulang daftar perangkat",
|
|
||||||
"GENERAL_SETTINGS": "Setelan Umum:",
|
|
||||||
"USE_VIDEO": "Menggunakan Video",
|
|
||||||
"USE_STEREO_AUDIO": "Suara Stereo",
|
|
||||||
"USE_STUN": "Menggunakan STUN",
|
|
||||||
"SCALE_VIDEO": "Menyesuaikan skala video sisi jauh dengan resolusi kamera",
|
|
||||||
"ASK_BEFORE_RECOVER": "Bertanya sebelum memulihkan panggilan",
|
|
||||||
"BEST_FRAME_RATE": "Kecepatan frame terbaik:",
|
|
||||||
"AUDIO_SETTINGS": "Setelan Suara:",
|
|
||||||
"ECHO_CANCEL": "Membuang Gema",
|
|
||||||
"NOISE_SUPPRESSION": "Meminimalkan Gangguan",
|
|
||||||
"HIGHPASS_FILTER": "Highpass Filter",
|
|
||||||
"VIDEO_SETTINGS": "Setelan Video:",
|
|
||||||
"REMOTE_ENCODER": "Encoder sisi jauh diaktifkan.",
|
|
||||||
"AUTO_SPEED_RES": "Menentukan setelan kecepatan dan resolusi secara otomatis",
|
|
||||||
"RECHECK_BANDWIDTH": "Memastikan bandwidth sebelum setiap panggilan keluar",
|
|
||||||
"CHECK_NETWORK_SPEED": "Memastikan kecepatan Jaringan",
|
|
||||||
"VIDEO_QUALITY": "Kualitas Video:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Maksimum bandwith masuk:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Maksimum bandwith keluar:",
|
|
||||||
"FACTORY_RESET": "Kembali ke Setelan Pabrik",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Simpan Setelan Perngkat",
|
|
||||||
"BROWSER_COMPATIBILITY": "Memastikan kecocokan browser.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Mendata ulang perangkat media.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Salah: browser tidak mendukung WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Memastikan izin dari perangkat",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Konfigurasi Provisioning.",
|
|
||||||
"CHECK_LOGIN": "Memastikan login.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Memastikan kecepatan koneksi.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Salah: Izin media ditolak",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Salah: Provision gagal.",
|
|
||||||
"PLEASE_WAIT": "Tunggu..."
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,155 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Oops, Chiamata in corso.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Sembra che tu sia in conversazione. Vuoi chiudere la chiamata?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Sembra che eri in conversazione prima di abbandonare la sessione l'ultima volta. Vuoi tornare in quella conversazione?",
|
|
||||||
"TITLE_INCOMING_CALL": "Chiamata in arrivo",
|
|
||||||
"MESSAGE_INCOMING_CALL": "da ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Non ci sono chiamate da chiudere.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Per favore, inserisci il nome del file",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Vuoi attivare il video per questa chiamata?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Il video verrà attivato a partire dalla prossima chiamata.",
|
|
||||||
"TITLE_INSERT_BANNER": "Per favore inserisci il testo del banner",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Please insert the Canvas Id",
|
|
||||||
"TITLE_INSERT_LAYER": "Please insert the Layer",
|
|
||||||
"TITLE_TRANSFER": "Transfer party?",
|
|
||||||
"MESSAGE_TRANSFER": "To what destination would you like to transfer this call?",
|
|
||||||
"LABEL_TRANSFER": "Destinazione",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Non è possibile mostrare le configurazioni video durante una chiamata",
|
|
||||||
"BUTTON_END_CALL": "Termina la chiamata",
|
|
||||||
"BUTTON_CLOSE": "Chiudi",
|
|
||||||
"MESSAGE_PLAY": "Riproduci",
|
|
||||||
"MESSAGE_STOP": "Ferma",
|
|
||||||
"MESSAGE_RECORD": "Registra",
|
|
||||||
"MESSAGE_STOP_RECORD": "Ferma la registrazione",
|
|
||||||
"MESSAGE_SNAPSHOT": "Snapshot",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Video Mode",
|
|
||||||
"MESSAGE_MUTE_MIC": "(un)Mute Mic",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "(un)Mute Video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Abilita/Disabilita schermo intero",
|
|
||||||
"MESSAGE_SCREENSHARE": "Condividi lo schermo",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Apri/Chiudi Chat",
|
|
||||||
"MESSAGE_SPEAKER": "Speaker",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Membri",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "Non ci sono membri da mostrare.",
|
|
||||||
"CHAT_GENERAL": "Generale",
|
|
||||||
"CHAT_TITLE_KICK": "Kick",
|
|
||||||
"CHAT_KICK": "Kick",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRASFER": "Transfer",
|
|
||||||
"CHAT_TRANSFER": "Transfer",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Set",
|
|
||||||
"CHAT_SET": "Set",
|
|
||||||
"CHAT_TITLE_RESET": "Reset",
|
|
||||||
"CHAT_RESET": "Reset",
|
|
||||||
"CHAT_RESET": "Reset",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas In",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas Out",
|
|
||||||
"CHAT_PREV": "Precedente",
|
|
||||||
"CHAT_NEXT": "Successivo",
|
|
||||||
"CHAT_LAYER": "Layer",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Audio/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Mic",
|
|
||||||
"CHAT_MUTE_MIC": "Mute",
|
|
||||||
"CHAT_UNMUTE_MIC": "Unmute",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Mute/Unmute Video",
|
|
||||||
"CHAT_NO_MESSAGES": "Non ci sono messaggi da mostrare.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Invia",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Scrivi il tuo messaggio qui...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Contributori",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Questa connessione non è sicura.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Abilita/Disabilita navigazione",
|
|
||||||
"BANDWIDTH_INFO": "Informazioni sulla larghezza di banda",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Ingresso:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Uscita:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Risoluzione Video:",
|
|
||||||
"IN_CALL": "In chiamata: ",
|
|
||||||
"LAST_CALL": "Ultima chiamata: ",
|
|
||||||
"OPEN_NEW_WINDOW": "Apri Una Nuova Finestra",
|
|
||||||
"CHANGE_LOGIN_INFO": "Cambia le informazioni di login",
|
|
||||||
"LOGOUT": "Logout",
|
|
||||||
"ABOUT": "About",
|
|
||||||
"HELP": "Aiuto",
|
|
||||||
"CONTRIBUTORS": "Contributori",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Configura le impostazioni della tua video camera e del tuo microfono",
|
|
||||||
"CAMERA_SETTINGS": "Video Camera:",
|
|
||||||
"MIC_SETTINGS": "Microfono:",
|
|
||||||
"SAVE": "Salva",
|
|
||||||
"LOADING": "Caricamento",
|
|
||||||
"ERRORS" : "Errori",
|
|
||||||
"CALLING_TO": "Chiamata verso ",
|
|
||||||
"CANCELLING": "In annullamento",
|
|
||||||
"DETERMINING_SPEED": "Calcolo della tua velocità...",
|
|
||||||
"CALL_HISTORY": "Cronologia Chiamate",
|
|
||||||
"CLEAR_CALL_HISTORY": "Rimuovi la cronologia",
|
|
||||||
"NO_CALL_HISTORY": "Nessuna chiamata nella cronologia.",
|
|
||||||
"ENTER_EXTENSION": "Inserisci un numero",
|
|
||||||
"CALL_EXTENSION": "Chiama il numero",
|
|
||||||
"LOGIN": "Login",
|
|
||||||
"LOGIN_INFORMATION": "Informazioni di login",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Salva le informazioni di login",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Verifica i campi e prova di nuovo.",
|
|
||||||
"NAME": "Nome",
|
|
||||||
"YOUR_NAME": "Il tuo nome",
|
|
||||||
"EMAIL": "Email",
|
|
||||||
"YOUR_EMAIL": "Il tuo indirizzo email",
|
|
||||||
"USER": "Utente",
|
|
||||||
"PASSWORD": "Password",
|
|
||||||
"CALLER_ID": "Caller ID",
|
|
||||||
"HOSTNAME": "Hostname",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Impostazioni",
|
|
||||||
"DEVICE_SETTINGS": "Configurazione dei dispositivi",
|
|
||||||
"SHARE_DEVICE": "Dispositivo in condivisione",
|
|
||||||
"SPEAKER": "Altoparlante:",
|
|
||||||
"SPEAKER_FEATURE": "Il tuo browser sembra non supportare questa funzionalità",
|
|
||||||
"PREVIEW_SETTINGS": "Anteprima delle configurazioni",
|
|
||||||
"REFRESH_DEVICE_LIST": "Aggiorna la lista dei dispositivi",
|
|
||||||
"GENERAL_SETTINGS": "Configurazioni generali:",
|
|
||||||
"USE_VIDEO": "Abilita Video",
|
|
||||||
"USE_STEREO_AUDIO": "Abilita Audio Stereo",
|
|
||||||
"USE_STUN": "Abilita STUN",
|
|
||||||
"SCALE_VIDEO": "Scala il video remoto con la risoluzione della video camera",
|
|
||||||
"ASK_BEFORE_RECOVER": "Chiedi prima di recuperare una chiamata",
|
|
||||||
"BEST_FRAME_RATE": "Miglior frame rate:",
|
|
||||||
"AUDIO_SETTINGS": "Impostazioni audio:",
|
|
||||||
"ECHO_CANCEL": "Cancellatore d'eco",
|
|
||||||
"NOISE_SUPPRESSION": "Soppressione del rumore",
|
|
||||||
"HIGHPASS_FILTER": "Highpass Filter",
|
|
||||||
"VIDEO_SETTINGS": "Impostazioni video:",
|
|
||||||
"REMOTE_ENCODER": "Abilita codificatore remoto dedicato.",
|
|
||||||
"AUTO_SPEED_RES": "Rileva in modo automatico la velocità e le impostazioni",
|
|
||||||
"RECHECK_BANDWIDTH": "Controlla la larghezza di banda per ogni chiamata in uscita",
|
|
||||||
"CHECK_NETWORK_SPEED": "Controllo della velocità di rete",
|
|
||||||
"VIDEO_QUALITY": "Qualità video:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Massima larghezza di banda in ingresso:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Massima larghezza di banda in uscita:",
|
|
||||||
"FACTORY_RESET": "Reset ai valori di default",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Salva le impostazioni dei dispositivi",
|
|
||||||
"BROWSER_COMPATIBILITY": "Verifica compatibilità browser.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Aggiornamento dei dispositivi.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Errore: il browser non supporta WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Verifica permessi dispositivi",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Recupero della configurazione.",
|
|
||||||
"CHECK_LOGIN": "Verifica del login.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Verifica velocità connessione.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Errore: permesso sui dispositivi negato",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Errore: Recupero configurazione fallito.",
|
|
||||||
"PLEASE_WAIT": "Attendere prego...",
|
|
||||||
"CANCEL": "Cancella",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Volume -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Volume +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Guadagno -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Guadagno +",
|
|
||||||
"CHAT_VOL_MINUS": "Vol -",
|
|
||||||
"CHAT_VOL_PLUS": "Vol +",
|
|
||||||
"CHAT_GAIN_MINUS": "Guadagno -",
|
|
||||||
"CHAT_GAIN_PLUS": "Guadagno +",
|
|
||||||
"LANGUAGE": "Lingua:",
|
|
||||||
"BROWSER_LANGUAGE": "Lingua del browser"
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Ups, jesteś w trakcie Aktywnego Połączenia.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Wygląda na to że jesteś połączony. Czy chcesz się rozłączyć?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Wygląda na to że byłeś połączony. Czy chcesz do tego wrócić?",
|
|
||||||
"TITLE_INCOMING_CALL": "Przychodzące połaczenie",
|
|
||||||
"MESSAGE_INCOMING_CALL": "od ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Nie ma żadnego połączenia, które można by zakończyć.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Proszę, wpisz nazwę pliku",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Czy chcesz włączyć video w tym połączeniu?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Video będzie włączone w następnych połączeniach.",
|
|
||||||
"TITLE_INSERT_BANNER": "Proszę wpisz tekst transparentu",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Proszę wpisz Id Płótna",
|
|
||||||
"TITLE_INSERT_LAYER": "Proszę wpisz Warstwę",
|
|
||||||
"TITLE_TRANSFER": "Czy wykonać transfer?",
|
|
||||||
"MESSAGE_TRANSFER": "Dokąd chciałbyś wykonać transfer tego połączenia?",
|
|
||||||
"LABEL_TRANSFER": "Do",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Nie można wyświetlić podglądu ustawień podczas połączenia",
|
|
||||||
"BUTTON_END_CALL": "Zakończ Połączenie",
|
|
||||||
"BUTTON_CLOSE": "Zamknij",
|
|
||||||
"MESSAGE_PLAY": "Odtwórz",
|
|
||||||
"MESSAGE_STOP": "Zatrzymaj",
|
|
||||||
"MESSAGE_RECORD": "Nagraj",
|
|
||||||
"MESSAGE_STOP_RECORD": "Zatrzymaj Nagrywanie",
|
|
||||||
"MESSAGE_SNAPSHOT": "Zrzut ekranu",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Tryb Video",
|
|
||||||
"MESSAGE_MUTE_MIC": "Włącz/Wyłącz Mikrofon",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "Włącz/Wyłącz Video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Zmień Tryb Pełnego Ekranu",
|
|
||||||
"MESSAGE_SCREENSHARE": "Udostępnij ekran",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Otwórz/Zamknij Czat",
|
|
||||||
"MESSAGE_SPEAKER": "Głośnik",
|
|
||||||
"MESSAGE_POPUP": "Okienko",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Użytkownicy",
|
|
||||||
"CHAT_TITLE": "Czat",
|
|
||||||
"CHAT_NO_MEMBERS": "Nie ma żadnych użytkownikow do pokazania.",
|
|
||||||
"CHAT_GENERAL": "Ogólne",
|
|
||||||
"CHAT_TITLE_KICK": "Kopnij",
|
|
||||||
"CHAT_KICK": "Kopnij",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Podłoga Wideo",
|
|
||||||
"CHAT_FLOOR": "Podłoga",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Transfer",
|
|
||||||
"CHAT_TRANSFER": "Transfer",
|
|
||||||
"CHAT_BANNER": "Transparent",
|
|
||||||
"CHAT_TITLE_SET": "Ustaw",
|
|
||||||
"CHAT_SET": "Ustaw",
|
|
||||||
"CHAT_TITLE_RESET": "Zresetuj",
|
|
||||||
"CHAT_RESET": "Zresetuj",
|
|
||||||
"CHAT_CANVAS": "Płótno",
|
|
||||||
"CHAT_CANVAS_IN": "Płótno Wejściowe",
|
|
||||||
"CHAT_CANVAS_OUT": "Płótno Wyjściowe",
|
|
||||||
"CHAT_PREV": "Wstecz",
|
|
||||||
"CHAT_NEXT": "Dalej",
|
|
||||||
"CHAT_LAYER": "Warstwa",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Audio/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Wyłącz/Włącz Mikrofon",
|
|
||||||
"CHAT_MUTE_MIC": "Wyłącz",
|
|
||||||
"CHAT_UNMUTE_MIC": "Włącz",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Wyłącz/Włącz Wideo",
|
|
||||||
"CHAT_NO_MESSAGES": "Nie ma żadnych wiadomości do pokazania.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Wyślij",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Wpisz tutaj swoją wiadomość...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Kontrybutorzy",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "To Połączenie jest Niezaufane.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Zmień nawigację",
|
|
||||||
"BANDWIDTH_INFO": "Dane Przepustowości",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Przychodzące:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Wychodzące:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Roździelczość Video:",
|
|
||||||
"IN_CALL": "W Trakcie Połączenia:",
|
|
||||||
"LAST_CALL": "Ostatnie Połączenie:",
|
|
||||||
"OPEN_NEW_WINDOW": "Otwórz Nowe Okno",
|
|
||||||
"CHANGE_LOGIN_INFO": "Zmień Dane Logowania",
|
|
||||||
"LOGOUT": "Wyloguj Się",
|
|
||||||
"ABOUT": "O Programie",
|
|
||||||
"HELP": "Pomoc",
|
|
||||||
"CONTRIBUTORS": "Kontrybutorzy",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Skonfiguruj ustawienia kamery i mikrofonu.",
|
|
||||||
"CAMERA__SETTNGS": "Kamera:",
|
|
||||||
"MIC_SETTINGS": "Mikrofon:",
|
|
||||||
"SAVE": "Zapisz",
|
|
||||||
"LOADING": "Ładowanie",
|
|
||||||
"ERRORS" : "Błędy",
|
|
||||||
"CALLING_TO": "Dzwonię do ",
|
|
||||||
"CANCELLING": "Anuluję...",
|
|
||||||
"DETERMINING_SPEED": "Ustalanie prędkości Twojego połączenia...",
|
|
||||||
"CALL_HISTORY": "Historia rozmów",
|
|
||||||
"CLEAR_CALL_HISTORY": "Wyczyść Historię",
|
|
||||||
"NO_CALL_HISTORY": "Nie ma żadnych rozmów w historii.",
|
|
||||||
"ENTER_EXTENSION": "Wpisz numer wewnętrzny",
|
|
||||||
"CALL_EXTENSION": "Połącz się z numerem wewnętrznym",
|
|
||||||
"LOGIN": "Logowanie",
|
|
||||||
"LOGIN_INFORMATION": "Dane Logowania",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Zapisz Dane Logowania",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Sprawdź pola poniżej i spróbuj ponownie.",
|
|
||||||
"NAME": "Imię",
|
|
||||||
"YOUR_NAME": "Twoje imię",
|
|
||||||
"EMAIL": "Email",
|
|
||||||
"YOUR_EMAIL": "Twój adres email",
|
|
||||||
"USER": "Użytkownik",
|
|
||||||
"PASSWORD": "Hasło",
|
|
||||||
"CALLER_ID": "ID Rozmówcy",
|
|
||||||
"HOSTNAME": "Nazwa Hosta",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Ustawienia",
|
|
||||||
"DEVICE_SETTINGS": "Ustawienia Urządzenia",
|
|
||||||
"SHARE_DEVICE": "Udostępnij urządzenie",
|
|
||||||
"SPEAKER": "Głośnik:",
|
|
||||||
"SPEAKER_FEATURE": "Wygląda na to, że Twoja przeglądarka nie obsługuje tej funkcji",
|
|
||||||
"PREVIEW_SETTINGS": "Podgląd Ustawień",
|
|
||||||
"REFRESH_DEVICE_LIST": "Odśwież listę urządzeń",
|
|
||||||
"GENERAL_SETTINGS": "Ustawienia ogólne:",
|
|
||||||
"USE_VIDEO": "Włącz Video",
|
|
||||||
"USE_STEREO_AUDIO": "Stereo Audio",
|
|
||||||
"USE_STUN": "Włącz STUN",
|
|
||||||
"SCALE_VIDEO": "Zeskaluj Przychodzące Video Do Rozdzielczości Kamery",
|
|
||||||
"ASK_BEFORE_RECOVER": "Zapytaj zanim rozmowa będzie przywrócona",
|
|
||||||
"BEST_FRAME_RATE": "Najlepsza prędkość przesyłu klatek:",
|
|
||||||
"AUDIO_SETTINGS": "Ustawienia audio:",
|
|
||||||
"ECHO_CANCEL": "Wygaszanie Echa",
|
|
||||||
"NOISE_SUPPRESSION": "Tłumienie Zakłuceń",
|
|
||||||
"HIGHPASS_FILTER": "Filtr Górnoprzepustowy",
|
|
||||||
"VIDEO_SETTINGS": "Ustawienia video:",
|
|
||||||
"REMOTE_ENCODER": "Dedykowany Odległy Koder włączony.",
|
|
||||||
"AUTO_SPEED_RES": "Automatycznie ustal ustawienia prędkości i rozdzielczości",
|
|
||||||
"RECHECK_BANDWIDTH": "Sprawdź prepustowość przed każdym połączeniem wychodzącym",
|
|
||||||
"CHECK_NETWORK_SPEED": "Sprawdź Prędkość Sieci",
|
|
||||||
"VIDEO_QUALITY": "Jakość Video:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Maxymalna przepustowość przychodząca:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Maxymalna przepustowość wychodząca:",
|
|
||||||
"FACTORY_RESET": "Przywróć ustawienia fabryczne",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Zapisz Ustawienia Urządzenia",
|
|
||||||
"BROWSER_COMPATIBILITY": "Sprawdzanie kompatybilności przeglądarki.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Odśwież Urządzenia Multimedialne.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Błąd: przeglądarka nie obsługuje WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Sprawdzanie uprawnień multimediów",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Ustawienia uzyskania połączenia.",
|
|
||||||
"CHECK_LOGIN": "Sprawdzanie danych logowania.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Sprawdź Prędkość Połączenia.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Błąd: Uprawnienia multimedialne odmówione",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Błąd: Udostępnianie środków połączenia nie powiodło się.",
|
|
||||||
"PLEASE_WAIT": "Proszę czekać...",
|
|
||||||
"CANCEL": "Anuluj",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Głośność -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Głośność +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Wzmocnienie -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Wzmocnienie +",
|
|
||||||
"CHAT_VOL_MINUS": "Głośnosć -",
|
|
||||||
"CHAT_VOL_PLUS": "Głośnosć +",
|
|
||||||
"CHAT_GAIN_MINUS": "Wzmocnienie -",
|
|
||||||
"CHAT_GAIN_PLUS": "Wzmocnienie+"
|
|
||||||
}
|
|
|
@ -1,159 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Ops, já existe uma chamada ativa.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Parece que você está em uma chamada. Você quer desligar?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Parece que você estava em uma chamada antes de sair pela última vez. Quer voltar pra ela?",
|
|
||||||
"TITLE_INCOMING_CALL": "Nova Chamada",
|
|
||||||
"MESSAGE_INCOMING_CALL": "de ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Não há chamada para desligar.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Por favor, insira o nome do arquivo",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Deseja ativar o vídeo para esta chamada?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "O vídeo será ativado para as próximas chamadas.",
|
|
||||||
"TITLE_INSERT_BANNER": "Por favor, insira o texto do banner",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Por favor, insira o ID do Canvas",
|
|
||||||
"TITLE_INSERT_LAYER": "Por favor, insira o Layer",
|
|
||||||
"TITLE_TRANSFER": "Transferir?",
|
|
||||||
"MESSAGE_TRANSFER": "Para qual destino você deseja transferir esta chamada?",
|
|
||||||
"LABEL_TRANSFER": "Destino",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Não é possível mostrar a pré-visualização das configurações durante uma chamda",
|
|
||||||
"BUTTON_END_CALL": "Finalizar Chamada",
|
|
||||||
"BUTTON_CLOSE": "Fechar",
|
|
||||||
"MESSAGE_PLAY": "Reproduzir",
|
|
||||||
"MESSAGE_STOP": "Parar",
|
|
||||||
"MESSAGE_RECORD": "Gravar",
|
|
||||||
"MESSAGE_STOP_RECORD": "Parar Gravação",
|
|
||||||
"MESSAGE_SNAPSHOT": "Snapshot",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Modo de Vídeo",
|
|
||||||
"MESSAGE_MUTE_MIC": "Ativar/Desativar Mudo do Microfone",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "Ativar/Desativar Mudo do Vídeo",
|
|
||||||
"MESSAGE_FULLSCREEN": "Ativar/Desativar Modo Tela Cheia",
|
|
||||||
"MESSAGE_SCREENSHARE": "Compartilhar Tela",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Abrir/Fechar Chat",
|
|
||||||
"MESSAGE_SPEAKER": "Alto-falante",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Membros",
|
|
||||||
"CHAT_TITLE": "Chat",
|
|
||||||
"CHAT_NO_MEMBERS": "Não há membros para mostrar.",
|
|
||||||
"CHAT_GENERAL": "Geral",
|
|
||||||
"CHAT_TITLE_KICK": "Chutar",
|
|
||||||
"CHAT_KICK": "Chutar",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Floor do Vídeo",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Transferência",
|
|
||||||
"CHAT_TRANSFER": "Transferir",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Definir",
|
|
||||||
"CHAT_SET": "Definir",
|
|
||||||
"CHAT_TITLE_RESET": "Redefinir",
|
|
||||||
"CHAT_RESET": "Redefinir",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Colocar no Canvas",
|
|
||||||
"CHAT_CANVAS_OUT": "Remover do Canvas",
|
|
||||||
"CHAT_PREV": "Anterior",
|
|
||||||
"CHAT_NEXT": "Seguinte",
|
|
||||||
"CHAT_LAYER": "Layer",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Áudio/Vídeo",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Ativar/Desativar Microfone",
|
|
||||||
"CHAT_MUTE_MIC": "Ativar Mudo",
|
|
||||||
"CHAT_UNMUTE_MIC": "Desativar Mudo",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Ativar/Desativar Vídeo",
|
|
||||||
"CHAT_NO_MESSAGES": "Não há mensagens para mostrar.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Enviar",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Escreva sua mensagem aqui...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Contribuidores",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Esta conexão não é confiável.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Ativar/Desativar Navegação",
|
|
||||||
"BANDWIDTH_INFO": "Informações sobre largura de banda",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Entrada:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Saída:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Resolução de vídeo:",
|
|
||||||
"IN_CALL": "Em chamada:",
|
|
||||||
"LAST_CALL": "Última chamada:",
|
|
||||||
"OPEN_NEW_WINDOW": "Abrir nova janela",
|
|
||||||
"CHANGE_LOGIN_INFO": "Mudar informações de login",
|
|
||||||
"LOGOUT": "Sair",
|
|
||||||
"ABOUT": "Sobre",
|
|
||||||
"HELP": "Ajuda",
|
|
||||||
"CONTRIBUTORS": "Contribuidores",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Defina suas configurações de câmera e microfone",
|
|
||||||
"CAMERA_SETTINGS": "Câmera:",
|
|
||||||
"MIC_SETTINGS": "Microfone:",
|
|
||||||
"SAVE": "Salvar",
|
|
||||||
"LOADING": "Carregando",
|
|
||||||
"ERRORS" : "Erros",
|
|
||||||
"CALLING_TO": "Ligando para ",
|
|
||||||
"CANCELLING": "Cancelando...",
|
|
||||||
"DETERMINING_SPEED": "Determinando sua velocidade...",
|
|
||||||
"CALL_HISTORY": "Histórico de Chamadas",
|
|
||||||
"CLEAR_CALL_HISTORY": "Limpar Histórico",
|
|
||||||
"NO_CALL_HISTORY": "Não há chamadas no histórico.",
|
|
||||||
"ENTER_EXTENSION": "Insira um número",
|
|
||||||
"CALL_EXTENSION": "Ligar para número",
|
|
||||||
"LOGIN": "Login",
|
|
||||||
"LOGIN_INFORMATION": "Informações de login",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Salvar informações de login",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Verifique os campos abaixo e tente novamente.",
|
|
||||||
"INVALID_SETTINGS_FIELDS": "Verifique as configurações abaixo e tente novamente.",
|
|
||||||
"NAME": "Nome",
|
|
||||||
"YOUR_NAME": "Seu nome",
|
|
||||||
"EMAIL": "E-mail",
|
|
||||||
"YOUR_EMAIL": "Seu e-mail",
|
|
||||||
"USER": "Usuário",
|
|
||||||
"PASSWORD": "Senha",
|
|
||||||
"CALLER_ID": "Identificação de chamada",
|
|
||||||
"HOSTNAME": "Servidor",
|
|
||||||
"WEBSOCKET_URL": "Endereço do websocket",
|
|
||||||
"SETTINGS": "Configurações",
|
|
||||||
"DEVICE_SETTINGS": "Configurações de dispositivos",
|
|
||||||
"SHARE_DEVICE": "Dispositivo de compartilhamento",
|
|
||||||
"SPEAKER": "Alto-falante:",
|
|
||||||
"SPEAKER_FEATURE": "Seu navegador parece não oferecer suporte a esta funcionalidade",
|
|
||||||
"PREVIEW_SETTINGS": "Pré-visualizar configurações",
|
|
||||||
"REFRESH_DEVICE_LIST": "Atualizar lista de dispositivos",
|
|
||||||
"GENERAL_SETTINGS": "Configurações gerais:",
|
|
||||||
"USE_VIDEO": "Habilitar Vídeo",
|
|
||||||
"USE_STEREO_AUDIO": "Áudio Estéreo",
|
|
||||||
"USE_STUN": "Habilitar STUN",
|
|
||||||
"SCALE_VIDEO": "Redimensionar o vídeo remoto para bater com a resolução da câmera",
|
|
||||||
"ASK_BEFORE_RECOVER": "Perguntar antes de recuperar uma chamada",
|
|
||||||
"BEST_FRAME_RATE": "Melhor frame rate:",
|
|
||||||
"AUDIO_SETTINGS": "Configurações de áudio:",
|
|
||||||
"ECHO_CANCEL": "Cancelamento de eco",
|
|
||||||
"NOISE_SUPPRESSION": "Supressão de ruído",
|
|
||||||
"HIGHPASS_FILTER": "Filtro passa-alta",
|
|
||||||
"VIDEO_SETTINGS": "Configurações de vídeo:",
|
|
||||||
"REMOTE_ENCODER": "Encoder Remoto Dedicado habilitado.",
|
|
||||||
"AUTO_SPEED_RES": "Determinar automaticamente velocidade e configurações de resolução",
|
|
||||||
"RECHECK_BANDWIDTH": "Verificar novamente largura de banda antes de realizar cada chamada",
|
|
||||||
"CHECK_NETWORK_SPEED": "Verificar velocidade da rede",
|
|
||||||
"CHECKING_NETWORK_SPEED": "Verificando velocidade da rede",
|
|
||||||
"VIDEO_QUALITY": "Qualidade do vídeo:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Largura de banda de entrada máxima:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Largura de banda de saída máxima:",
|
|
||||||
"FACTORY_RESET": "Restaurar padrões de fábrica",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Salvar configurações de dispositivos",
|
|
||||||
"BROWSER_COMPATIBILITY": "Verificando compatibilidade do browser.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Atualizando dispositivos de mídia.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Erro: navegador não oferece suporte ao WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Verificando permissões de mídia",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Provisionando configurações.",
|
|
||||||
"CHECK_LOGIN": "Verificando login.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Verificando velocidade de conexão.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Erro: permissão de mídia negada.",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Erro: provisionamento falhou.",
|
|
||||||
"PLEASE_WAIT": "Por favor, aguarde...",
|
|
||||||
"CANCEL": "Cancelar",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Volume -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Volume +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Ganho -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Ganho +",
|
|
||||||
"CHAT_TITLE_DEAF_UNDEAF": "Ligar/Desligar Áudio",
|
|
||||||
"CHAT_VOL_MINUS": "Vol -",
|
|
||||||
"CHAT_VOL_PLUS": "Vol +",
|
|
||||||
"CHAT_GAIN_MINUS": "Ganho -",
|
|
||||||
"CHAT_GAIN_PLUS": "Ganho +",
|
|
||||||
"CHAT_DEAF": "Ligar Áudio",
|
|
||||||
"CHAT_UNDEAF": "Desligar Áudio",
|
|
||||||
"FACTORY_RESET_SETTINGS": "Redefinir configurações",
|
|
||||||
"AUTOGAIN_CONTROL": "Controle de Ganho Automático (AGC)",
|
|
||||||
"WAITING_DEVICES": "Aguardando dispositivos..."
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Упс, Уже имеется активный вызов.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Такое впечатление, что вы уже разговариваете. Хоитите ли Вы положить трубку?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Такое впечатление что Вы разговаривали когда отключились в прошлый раз. Хотите ли Вы вернутся к предыдущему собеседнику?",
|
|
||||||
"TITLE_INCOMING_CALL": "Входящий вызов",
|
|
||||||
"MESSAGE_INCOMING_CALL": "от ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Отсутствуют вызовы которые можно завершить.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Пожалуйста, укажите имя файла",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Хотите ли Вы начать передачу видео для этого звонка?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Для следующего звонка включена передача видео.",
|
|
||||||
"TITLE_INSERT_BANNER": "Пожалуйста укажите текст заголовка",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Пожалуйста укажите идентификатор канвы",
|
|
||||||
"TITLE_INSERT_LAYER": "Пожалуйста укажите слой",
|
|
||||||
"TITLE_TRANSFER": "Перевести вызов?",
|
|
||||||
"MESSAGE_TRANSFER": "На какой номер Вы хотите перевести этот вызов?",
|
|
||||||
"LABEL_TRANSFER": "Вызываемый номер",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Не могу отобразить параметры предпросмотра во время вызова",
|
|
||||||
"BUTTON_END_CALL": "Завершить вызов",
|
|
||||||
"BUTTON_CLOSE": "Закрыть",
|
|
||||||
"MESSAGE_PLAY": "Проиграть",
|
|
||||||
"MESSAGE_STOP": "Остановить",
|
|
||||||
"MESSAGE_RECORD": "Записать",
|
|
||||||
"MESSAGE_STOP_RECORD": "Остановить запись",
|
|
||||||
"MESSAGE_SNAPSHOT": "Снимок экрана",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Видеорежим",
|
|
||||||
"MESSAGE_MUTE_MIC": "вкл./выкл. Микрофон",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "вкл./выкл. Камеру",
|
|
||||||
"MESSAGE_FULLSCREEN": "Переключить полноэкранный режим",
|
|
||||||
"MESSAGE_SCREENSHARE": "Дать доступ к рабочему столу",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Открыть/Закрыть чат",
|
|
||||||
"MESSAGE_SPEAKER": "Динамик",
|
|
||||||
"MESSAGE_POPUP": "Всплывающее сообщение",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Участники",
|
|
||||||
"CHAT_TITLE": "Чат",
|
|
||||||
"CHAT_NO_MEMBERS": "Нет участников.",
|
|
||||||
"CHAT_GENERAL": "Общая",
|
|
||||||
"CHAT_TITLE_KICK": "Выкинуть",
|
|
||||||
"CHAT_KICK": "Выкинуть",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Видео мин.уровень",
|
|
||||||
"CHAT_FLOOR": "Мин.уровень",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Перевести",
|
|
||||||
"CHAT_TRANSFER": "Перевести",
|
|
||||||
"CHAT_BANNER": "Заголовок",
|
|
||||||
"CHAT_TITLE_SET": "Установить",
|
|
||||||
"CHAT_SET": "Установить",
|
|
||||||
"CHAT_TITLE_RESET": "Сбросить",
|
|
||||||
"CHAT_RESET": "Сбросить",
|
|
||||||
"CHAT_CANVAS": "Канва",
|
|
||||||
"CHAT_CANVAS_IN": "Канва при входе",
|
|
||||||
"CHAT_CANVAS_OUT": "Канва при выходе",
|
|
||||||
"CHAT_PREV": "Предыдущий",
|
|
||||||
"CHAT_NEXT": "Следующий",
|
|
||||||
"CHAT_LAYER": "Слой",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Аудио/Видео",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Вкл./Выкл. мик.",
|
|
||||||
"CHAT_MUTE_MIC": "Выкл.",
|
|
||||||
"CHAT_UNMUTE_MIC": "Вкл.",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Вкл./Выкл. видео",
|
|
||||||
"CHAT_NO_MESSAGES": "Нет сообщений для отображения.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Отправить",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Наберите ваше сообщение тут...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Помощники",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Данное соединение не доверенное.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Переключить навигацию",
|
|
||||||
"BANDWIDTH_INFO": "Информация о полосе пропускания",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "На прием:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "При передаче:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Видео разрешение:",
|
|
||||||
"IN_CALL": "Разговор с:",
|
|
||||||
"LAST_CALL": "Предыдущий вызов:",
|
|
||||||
"OPEN_NEW_WINDOW": "Открыть новое окно",
|
|
||||||
"CHANGE_LOGIN_INFO": "Изменить информацию о логине",
|
|
||||||
"LOGOUT": "Выйти",
|
|
||||||
"ABOUT": "О программе",
|
|
||||||
"HELP": "Помощь",
|
|
||||||
"CONTRIBUTORS": "Помощники",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Настройте камеру и параметры микрофона",
|
|
||||||
"CAMERA_SETTINGS": "Камера:",
|
|
||||||
"MIC_SETTINGS": "Микрофон:",
|
|
||||||
"SAVE": "Сохранить",
|
|
||||||
"LOADING": "Загружаю",
|
|
||||||
"ERRORS" : "Ошибки",
|
|
||||||
"CALLING_TO": "Вызываю ",
|
|
||||||
"CANCELLING": "Завершаю...",
|
|
||||||
"DETERMINING_SPEED": "Определяю скорость подключения ...",
|
|
||||||
"CALL_HISTORY": "История вызовов",
|
|
||||||
"CLEAR_CALL_HISTORY": "Очистить историю",
|
|
||||||
"NO_CALL_HISTORY": "История вызов пуста.",
|
|
||||||
"ENTER_EXTENSION": "Укажите вызываемый номер",
|
|
||||||
"CALL_EXTENSION": "Набрать внутрений номер",
|
|
||||||
"LOGIN": "Логин",
|
|
||||||
"LOGIN_INFORMATION": "Информация о логине",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Сохранить информацию о логине",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Проверьте поля указанные ниже и повторите снова.",
|
|
||||||
"NAME": "Имя",
|
|
||||||
"YOUR_NAME": "Ваше имя",
|
|
||||||
"EMAIL": "Почта",
|
|
||||||
"YOUR_EMAIL": "Ваша почта",
|
|
||||||
"USER": "Пользователь",
|
|
||||||
"PASSWORD": "Пароль",
|
|
||||||
"CALLER_ID": "АОН",
|
|
||||||
"HOSTNAME": "Имя хоста",
|
|
||||||
"WEBSOCKET_URL": "URL вебсокета",
|
|
||||||
"SETTINGS": "Параметры",
|
|
||||||
"DEVICE_SETTINGS": "Параметры устройства",
|
|
||||||
"SHARE_DEVICE": "Дать доступ к устройству",
|
|
||||||
"SPEAKER": "Динамик:",
|
|
||||||
"SPEAKER_FEATURE": "Вероятно Ваш браузер не поддерживают это функцию",
|
|
||||||
"PREVIEW_SETTINGS": "Параметры предпросмотра",
|
|
||||||
"REFRESH_DEVICE_LIST": "Обновить список устройств",
|
|
||||||
"GENERAL_SETTINGS": "Основные параметры:",
|
|
||||||
"USE_VIDEO": "Использовать видео",
|
|
||||||
"USE_STEREO_AUDIO": "Стереозвук",
|
|
||||||
"USE_STUN": "Использовать STUN",
|
|
||||||
"SCALE_VIDEO": "Маштабировать удаленное видео так чтобы соответствовать разрешению камеры",
|
|
||||||
"ASK_BEFORE_RECOVER": "Спросить перед востановлением вызова",
|
|
||||||
"BEST_FRAME_RATE": "Оптимальная частота кадров:",
|
|
||||||
"AUDIO_SETTINGS": "Параметры звука:",
|
|
||||||
"ECHO_CANCEL": "Эхо компенсация",
|
|
||||||
"NOISE_SUPPRESSION": "Шумоподавление",
|
|
||||||
"HIGHPASS_FILTER": "Высокочастотный фильтр",
|
|
||||||
"VIDEO_SETTINGS": "Параметры видео:",
|
|
||||||
"REMOTE_ENCODER": "Включен специализированный удаленный энкодер.",
|
|
||||||
"AUTO_SPEED_RES": "Автоматически определять скорость подключения и параметры разрешения",
|
|
||||||
"RECHECK_BANDWIDTH": "Определять полосу пропускания перед каждым исходящим вызовом",
|
|
||||||
"CHECK_NETWORK_SPEED": "Проверить скорость сети",
|
|
||||||
"VIDEO_QUALITY": "Качество видео:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Макс. полоса пропускания на вход:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Макс. полоса пропускания на выход:",
|
|
||||||
"FACTORY_RESET": "Сброс к заводским настройкам",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Сохранить параметры устройства",
|
|
||||||
"BROWSER_COMPATIBILITY": "Проверяю возможности браузера.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Обновить список медиа-устройств.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Ошибка: браузер не поддерживает WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Проверю разрешения доступа к медиа",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Подготовка конфигурации.",
|
|
||||||
"CHECK_LOGIN": "Проверка логина.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Проверка скорости подключения.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Ошибка: Отказано в доступе к медиа-устройствам",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Ошибка: Подготовить неудалось.",
|
|
||||||
"PLEASE_WAIT": "Пожалуйста подождите...",
|
|
||||||
"CANCEL": "Завершить",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Громкость -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Громкость +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Усиление -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Усиление +",
|
|
||||||
"CHAT_VOL_MINUS": "Гром. -",
|
|
||||||
"CHAT_VOL_PLUS": "Гром. +",
|
|
||||||
"CHAT_GAIN_MINUS": "Усил. -",
|
|
||||||
"CHAT_GAIN_PLUS": "Усил. +"
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "Hoppsan, Aktivt samtal pågår.",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "Det verkar som du är i ett samtal. Vill du lägga på?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "Det verkar som du var i ett samtal innan du lämnade senast, vill du gå tillbaka till det?",
|
|
||||||
"TITLE_INCOMING_CALL": "Inkommande Samtal",
|
|
||||||
"MESSAGE_INCOMING_CALL": "från ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "Det finns inget samtal att avsluta.",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "Ange filnamn",
|
|
||||||
"TITLE_ENABLE_VIDEO": "Vill du aktivera video i pågående samtal?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "Video kommer aktiveras i efterföljande samtal.",
|
|
||||||
"TITLE_INSERT_BANNER": "Lägg till banner text",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "Lägg till Canvas Id",
|
|
||||||
"TITLE_INSERT_LAYER": "Lägg till Lager",
|
|
||||||
"TITLE_TRANSFER": "Koppla samtal?",
|
|
||||||
"MESSAGE_TRANSFER": "Vilken destination vill du koppla samtalet till?",
|
|
||||||
"LABEL_TRANSFER": "Destination",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "Kan inte förhandsvisa inställningar under samtal",
|
|
||||||
"BUTTON_END_CALL": "Avsluta samtal",
|
|
||||||
"BUTTON_CLOSE": "Stäng",
|
|
||||||
"MESSAGE_PLAY": "Spela upp",
|
|
||||||
"MESSAGE_STOP": "Stoppa",
|
|
||||||
"MESSAGE_RECORD": "Spela in",
|
|
||||||
"MESSAGE_STOP_RECORD": "Avsluta inspelning",
|
|
||||||
"MESSAGE_SNAPSHOT": "Snapshot",
|
|
||||||
"MESSAGE_VIDEO_MODE": "Videoläge",
|
|
||||||
"MESSAGE_MUTE_MIC": "(av)Aktivera Mikrofon",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "(av)Aktivera Video",
|
|
||||||
"MESSAGE_FULLSCREEN": "Växla fullskärmsläge",
|
|
||||||
"MESSAGE_SCREENSHARE": "Skärmdelning",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "Öppna/stäng chatt",
|
|
||||||
"MESSAGE_SPEAKER": "Högtalare",
|
|
||||||
"MESSAGE_POPUP": "Popup",
|
|
||||||
"CHAT_TITLE_MEMBERS": "Medlemmar",
|
|
||||||
"CHAT_TITLE": "Chatt",
|
|
||||||
"CHAT_NO_MEMBERS": "Det finns inga medlemmar att visa.",
|
|
||||||
"CHAT_GENERAL": "Allmänt",
|
|
||||||
"CHAT_TITLE_KICK": "Sparka ut",
|
|
||||||
"CHAT_KICK": "Sparka ut",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRANSFER": "Koppla",
|
|
||||||
"CHAT_TRANSFER": "Koppla",
|
|
||||||
"CHAT_BANNER": "Banner",
|
|
||||||
"CHAT_TITLE_SET": "Sätt",
|
|
||||||
"CHAT_SET": "Sätt",
|
|
||||||
"CHAT_TITLE_RESET": "Reset",
|
|
||||||
"CHAT_RESET": "Reset",
|
|
||||||
"CHAT_CANVAS": "Canvas",
|
|
||||||
"CHAT_CANVAS_IN": "Canvas In",
|
|
||||||
"CHAT_CANVAS_OUT": "Canvas Ut",
|
|
||||||
"CHAT_PREV": "Föregående",
|
|
||||||
"CHAT_NEXT": "Nästa",
|
|
||||||
"CHAT_LAYER": "Lager",
|
|
||||||
"CHAT_AUDIO_VIDEO": "Ljud/Video",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Aktivera/Inaktivera Mikrofon",
|
|
||||||
"CHAT_MUTE_MIC": "Inaktivera",
|
|
||||||
"CHAT_UNMUTE_MIC": "Aktivera",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Aktivera/Inaktivera Video",
|
|
||||||
"CHAT_NO_MESSAGES": "Det finns inga meddelanden att visa.",
|
|
||||||
"CHAT_SEND_MESSAGE": "Skicka",
|
|
||||||
"CHAT_TYPE_MESSAGE": "Skriv ditt meddelande här...",
|
|
||||||
"TITLE_CONTRIBUTORS": "Contributors",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "Denna anslutning är opålitlig.",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "Toggla navigation",
|
|
||||||
"BANDWIDTH_INFO": "Bandbreddsinformation",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "Inkommande:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "Utgående:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "Videoupplösning:",
|
|
||||||
"IN_CALL": "I Samtal:",
|
|
||||||
"LAST_CALL": "Senaste Samtal:",
|
|
||||||
"OPEN_NEW_WINDOW": "Öppna nytt fönster",
|
|
||||||
"CHANGE_LOGIN_INFO": "Ändra inloggningsinformation",
|
|
||||||
"LOGOUT": "Logga ut",
|
|
||||||
"ABOUT": "Om",
|
|
||||||
"HELP": "Hjälp",
|
|
||||||
"CONTRIBUTORS": "Contributors",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "Inställningar för kamera och mikrofon",
|
|
||||||
"CAMERA_SETTINGS": "Kamera:",
|
|
||||||
"MIC_SETTINGS": "Mikrofon:",
|
|
||||||
"SAVE": "Spara",
|
|
||||||
"LOADING": "Laddar",
|
|
||||||
"ERRORS" : "Fel",
|
|
||||||
"CALLING_TO": "Ringer till ",
|
|
||||||
"CANCELLING": "Avbryter...",
|
|
||||||
"DETERMINING_SPEED": "Avgör din hastighet...",
|
|
||||||
"CALL_HISTORY": "Samtalshistorik",
|
|
||||||
"CLEAR_CALL_HISTORY": "Rensa Historik",
|
|
||||||
"NO_CALL_HISTORY": "Ingen samtalshistorik.",
|
|
||||||
"ENTER_EXTENSION": "Ange anknytning",
|
|
||||||
"CALL_EXTENSION": "Ring Anknytning",
|
|
||||||
"LOGIN": "Inloggning",
|
|
||||||
"LOGIN_INFORMATION": "Inloggningsinformation",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "Spara inloggningsinformation",
|
|
||||||
"INVALID_LOGIN_FIELDS": "Verifiera nedanstående fält och försök igen.",
|
|
||||||
"NAME": "Namn",
|
|
||||||
"YOUR_NAME": "Ditt namn",
|
|
||||||
"EMAIL": "Epost",
|
|
||||||
"YOUR_EMAIL": "Din epost",
|
|
||||||
"USER": "Användare",
|
|
||||||
"PASSWORD": "Lösenord",
|
|
||||||
"CALLER_ID": "Utringande ID",
|
|
||||||
"HOSTNAME": "Servernamn",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "Inställningar",
|
|
||||||
"DEVICE_SETTINGS": "Enhetsinställningar",
|
|
||||||
"SHARE_DEVICE": "Dela enhet",
|
|
||||||
"SPEAKER": "Högtalare:",
|
|
||||||
"SPEAKER_FEATURE": "Din browser verkar inte stödja denna funktion",
|
|
||||||
"PREVIEW_SETTINGS": "Förhandsgranska inställningar",
|
|
||||||
"REFRESH_DEVICE_LIST": "Uppdatera enhetslista",
|
|
||||||
"GENERAL_SETTINGS": "Generella inställningar:",
|
|
||||||
"USE_VIDEO": "Använd Video",
|
|
||||||
"USE_STEREO_AUDIO": "Stereoljud",
|
|
||||||
"USE_STUN": "Använd STUN",
|
|
||||||
"SCALE_VIDEO": "Skala fjärrvideo för att matcha kameraupplösning",
|
|
||||||
"ASK_BEFORE_RECOVER": "Fråga före återhämtning av samtal",
|
|
||||||
"BEST_FRAME_RATE": "Bästa framerate:",
|
|
||||||
"AUDIO_SETTINGS": "Ljudinställningar:",
|
|
||||||
"ECHO_CANCEL": "Echo Cancellation",
|
|
||||||
"NOISE_SUPPRESSION": "Brusreducering",
|
|
||||||
"HIGHPASS_FILTER": "Högpassfilter",
|
|
||||||
"VIDEO_SETTINGS": "Videoinställningar:",
|
|
||||||
"REMOTE_ENCODER": "Dedikerad Remote Encoder aktiverad.",
|
|
||||||
"AUTO_SPEED_RES": "Automatiska inställningar för hastighet och upplösning",
|
|
||||||
"RECHECK_BANDWIDTH": "Kontrollera bandbredd före varje utgående samtal",
|
|
||||||
"CHECK_NETWORK_SPEED": "Kontrollera nätverkshastighet",
|
|
||||||
"VIDEO_QUALITY": "Videokvalitet:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "Max inkommande bandbredd:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "Max utgående bandbredd:",
|
|
||||||
"FACTORY_RESET": "Fabriksåterställning",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "Spara inställningar",
|
|
||||||
"BROWSER_COMPATIBILITY": "Kontrollerar browserkompatibilitet.",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "Uppdatera mediaenheter.",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "Fel: browsern saknar stöd för WebRTC.",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "Kontrollerar mediarättigheter",
|
|
||||||
"CHECK_PROVISIONING_CONF": "Provisioneringskonfiguration.",
|
|
||||||
"CHECK_LOGIN": "Kontrollerar inloggning.",
|
|
||||||
"CHECK_CONNECTION_SPEED": "Kontrollera anslutningshastighet.",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "Fel: Mediaåtkomst nekad",
|
|
||||||
"ERROR_PROVISIONING_CONF": "Fel: Provisionering misslyckades.",
|
|
||||||
"PLEASE_WAIT": "Vänligen vänta...",
|
|
||||||
"CANCEL": "Avbryt",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "Volym -",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "Volym +",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "Förstärkning -",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "Förstärkning +",
|
|
||||||
"CHAT_VOL_MINUS": "Vol -",
|
|
||||||
"CHAT_VOL_PLUS": "Vol +",
|
|
||||||
"CHAT_GAIN_MINUS": "Förstärkning -",
|
|
||||||
"CHAT_GAIN_PLUS": "Förstärkning +"
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
{
|
|
||||||
"TITLE_ACTIVE_CALL": "囧,正在通话中",
|
|
||||||
"MESSAGE_ACTIVE_CALL_HANGUP": "好像正在通话中,你想挂断吗?",
|
|
||||||
"MESSAGE_ACTIVE_CALL_BACK": "好像上次还有个电话没有挂断?你想恢复上次的通话吗?",
|
|
||||||
"TITLE_INCOMING_CALL": "新来电",
|
|
||||||
"MESSAGE_INCOMING_CALL": "来自 ",
|
|
||||||
"MESSAGE_NO_HANGUP_CALL": "没有可挂断的电话",
|
|
||||||
"MESSAGE_ENTER_FILENAME": "请输入文件名",
|
|
||||||
"TITLE_ENABLE_VIDEO": "你想为当前通话开启视频吗?",
|
|
||||||
"MESSAGE_ENABLE_VIDEO": "开启视频将在下次通话生效",
|
|
||||||
"TITLE_INSERT_BANNER": "请输入标题文本",
|
|
||||||
"TITLE_INSERT_CANVAS_ID": "请选择一个画布ID",
|
|
||||||
"TITLE_INSERT_LAYER": "请输入一个层",
|
|
||||||
"TITLE_TRANSFER": "转移方?",
|
|
||||||
"MESSAGE_TRANSFER": "你想把该电话转移到什么号码?",
|
|
||||||
"LABEL_TRANSFER": "目的地",
|
|
||||||
"MESSAGE_DISPLAY_SETTINGS": "通话中不能预览",
|
|
||||||
"BUTTON_END_CALL": "挂断",
|
|
||||||
"BUTTON_CLOSE": "关闭",
|
|
||||||
"MESSAGE_PLAY": "播放",
|
|
||||||
"MESSAGE_STOP": "停止",
|
|
||||||
"MESSAGE_RECORD": "录音/录像",
|
|
||||||
"MESSAGE_STOP_RECORD": "停止录音/录像",
|
|
||||||
"MESSAGE_SNAPSHOT": "抓拍",
|
|
||||||
"MESSAGE_VIDEO_MODE": "停止发送视频",
|
|
||||||
"MESSAGE_MUTE_MIC": "静音/恢复",
|
|
||||||
"MESSAGE_MUTE_VIDEO": "停止视频/恢复",
|
|
||||||
"MESSAGE_FULLSCREEN": "全屏",
|
|
||||||
"MESSAGE_SCREENSHARE": "屏幕共享",
|
|
||||||
"MESSAGE_OPEN_CLOSE_CHAT": "打开/关闭聊天",
|
|
||||||
"MESSAGE_SPEAKER": "喇叭",
|
|
||||||
"MESSAGE_POPUP": "弹出",
|
|
||||||
"CHAT_TITLE_MEMBERS": "成员",
|
|
||||||
"CHAT_TITLE": "聊天",
|
|
||||||
"CHAT_NO_MEMBERS": "没有成员",
|
|
||||||
"CHAT_GENERAL": "一般",
|
|
||||||
"CHAT_TITLE_KICK": "踢出",
|
|
||||||
"CHAT_KICK": "踢出",
|
|
||||||
"CHAT_TITLE_VIDEO_FLOOR": "视频Floor",
|
|
||||||
"CHAT_FLOOR": "Floor",
|
|
||||||
"CHAT_TITLE_TRANSFER": "转移",
|
|
||||||
"CHAT_TRANSFER": "转移",
|
|
||||||
"CHAT_BANNER": "标题",
|
|
||||||
"CHAT_TITLE_SET": "设置",
|
|
||||||
"CHAT_SET": "设置",
|
|
||||||
"CHAT_TITLE_RESET": "重置",
|
|
||||||
"CHAT_RESET": "重置",
|
|
||||||
"CHAT_CANVAS": "画布",
|
|
||||||
"CHAT_CANVAS_IN": "入画布",
|
|
||||||
"CHAT_CANVAS_OUT": "出画布",
|
|
||||||
"CHAT_PREV": "上一个",
|
|
||||||
"CHAT_NEXT": "下一个",
|
|
||||||
"CHAT_LAYER": "层",
|
|
||||||
"CHAT_AUDIO_VIDEO": "音频/视频",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "静音/恢复",
|
|
||||||
"CHAT_MUTE_MIC": "静音",
|
|
||||||
"CHAT_UNMUTE_MIC": "恢复",
|
|
||||||
"CHAT_TITLE_MUTE_UNMUTE_MIC": "停止/恢复视频",
|
|
||||||
"CHAT_NO_MESSAGES": "没有可显示的消息",
|
|
||||||
"CHAT_SEND_MESSAGE": "发送",
|
|
||||||
"CHAT_TYPE_MESSAGE": "请在此输入消息",
|
|
||||||
"TITLE_CONTRIBUTORS": "贡献者",
|
|
||||||
"MESSAGE_CONNECTION_UNTRUSTED": "本连接不是可信的连接",
|
|
||||||
"MESSAGE_TOGGLE_NAVIGATION": "导航",
|
|
||||||
"BANDWIDTH_INFO": "带宽信息",
|
|
||||||
"BANDWIDTH_INFO_INCOMING": "接收:",
|
|
||||||
"BANDWIDTH_INFO_OUTGOING": "发送:",
|
|
||||||
"BANDWIDTH_INFO_VIDEO_RES": "视频分辨率:",
|
|
||||||
"IN_CALL": "通话中:",
|
|
||||||
"LAST_CALL": "最近通话:",
|
|
||||||
"OPEN_NEW_WINDOW": "打开新窗口",
|
|
||||||
"CHANGE_LOGIN_INFO": "修改登录信息",
|
|
||||||
"LOGOUT": "退出登录",
|
|
||||||
"ABOUT": "关于",
|
|
||||||
"HELP": "帮助",
|
|
||||||
"CONTRIBUTORS": "贡献者",
|
|
||||||
"TITLE_PREVIEW_SETTINGS": "设置摄像头和麦克风",
|
|
||||||
"CAMERA_SETTINGS": "摄像头:",
|
|
||||||
"MIC_SETTINGS": "麦克风",
|
|
||||||
"SAVE": "保存",
|
|
||||||
"LOADING": "加载中",
|
|
||||||
"ERRORS" : "错误",
|
|
||||||
"CALLING_TO": "正在呼叫 ",
|
|
||||||
"CANCELLING": "正在取消",
|
|
||||||
"DETERMINING_SPEED": "检查网速...",
|
|
||||||
"CALL_HISTORY": "通话历史",
|
|
||||||
"CLEAR_CALL_HISTORY": "清除历史记录",
|
|
||||||
"NO_CALL_HISTORY": "尚无任何通话",
|
|
||||||
"ENTER_EXTENSION": "输入号码",
|
|
||||||
"CALL_EXTENSION": "呼叫",
|
|
||||||
"LOGIN": "登录",
|
|
||||||
"LOGIN_INFORMATION": "登录信息",
|
|
||||||
"SAVE_LOGIN_INFORMATION": "保存登录信息",
|
|
||||||
"INVALID_LOGIN_FIELDS": "请检查下面的项目并重试",
|
|
||||||
"NAME": "姓名",
|
|
||||||
"YOUR_NAME": "你的姓名",
|
|
||||||
"EMAIL": "电子邮件",
|
|
||||||
"YOUR_EMAIL": "你的电子邮件",
|
|
||||||
"USER": "用户名",
|
|
||||||
"PASSWORD": "密码",
|
|
||||||
"CALLER_ID": "主叫号码",
|
|
||||||
"HOSTNAME": "主机名",
|
|
||||||
"WEBSOCKET_URL": "Websocket URL",
|
|
||||||
"SETTINGS": "设置",
|
|
||||||
"DEVICE_SETTINGS": "设备设置",
|
|
||||||
"SHARE_DEVICE": "共享设备",
|
|
||||||
"SPEAKER": "喇叭:",
|
|
||||||
"SPEAKER_FEATURE": "你的浏览器好像不支持该设置",
|
|
||||||
"PREVIEW_SETTINGS": "预览设置",
|
|
||||||
"REFRESH_DEVICE_LIST": "刷新设备列表",
|
|
||||||
"GENERAL_SETTINGS": "通话设置:",
|
|
||||||
"USE_VIDEO": "启用视频",
|
|
||||||
"USE_STEREO_AUDIO": "立体声",
|
|
||||||
"USE_STUN": "启用STUN",
|
|
||||||
"SCALE_VIDEO": "自动缩放远端视频到本地摄像头分辨率",
|
|
||||||
"ASK_BEFORE_RECOVER": "在恢复上一次通话前询问",
|
|
||||||
"BEST_FRAME_RATE": "最佳帧率:",
|
|
||||||
"AUDIO_SETTINGS": "音频设置:",
|
|
||||||
"ECHO_CANCEL": "回声消除",
|
|
||||||
"NOISE_SUPPRESSION": "噪声抑制",
|
|
||||||
"HIGHPASS_FILTER": "高通滤波",
|
|
||||||
"VIDEO_SETTINGS": "视频设置:",
|
|
||||||
"REMOTE_ENCODER": "已启用专用远端编码器",
|
|
||||||
"AUTO_SPEED_RES": "根据网速自动选择最佳分辨率",
|
|
||||||
"RECHECK_BANDWIDTH": "每次通话前重新检查网速",
|
|
||||||
"CHECK_NETWORK_SPEED": "检查网速",
|
|
||||||
"VIDEO_QUALITY": "视频质量:",
|
|
||||||
"MAX_INCOMING_BANDWIDTH": "最大接收带宽:",
|
|
||||||
"MAX_OUTGOING_BANDWIDTH": "最大发送带宽:",
|
|
||||||
"FACTORY_RESET": "恢复出厂设置",
|
|
||||||
"SAVE_DEVICE_SETTINGS": "保存设备设置",
|
|
||||||
"BROWSER_COMPATIBILITY": "检查浏览器兼容性",
|
|
||||||
"REFRESH_MEDIA_DEVICES": "检查媒体设备",
|
|
||||||
"BROWSER_WITHOUT_WEBRTC": "错误:浏览器不支持WebRTC",
|
|
||||||
"CHECK_PERMISSION_MEDIA": "检查媒体使用权限",
|
|
||||||
"CHECK_PROVISIONING_CONF": "自在自动配置",
|
|
||||||
"CHECK_LOGIN": "正在检查登录信息",
|
|
||||||
"CHECK_CONNECTION_SPEED": "检查网速",
|
|
||||||
"ERROR_PERMISSION_MEDIA": "错误:未授权使用麦克风或摄像头",
|
|
||||||
"ERROR_PROVISIONING_CONF": "错误:自动配置失败",
|
|
||||||
"PLEASE_WAIT": "请稍候...",
|
|
||||||
"CANCEL": "取消",
|
|
||||||
"CHAT_TITLE_VOL_MINUS": "音量-",
|
|
||||||
"CHAT_TITLE_VOL_PLUS": "音量+",
|
|
||||||
"CHAT_TITLE_GAIN_MINUS": "增益-",
|
|
||||||
"CHAT_TITLE_GAIN_PLUS": "增益+",
|
|
||||||
"CHAT_VOL_MINUS": "音量-",
|
|
||||||
"CHAT_VOL_PLUS": "音量+",
|
|
||||||
"CHAT_GAIN_MINUS": "增益-",
|
|
||||||
"CHAT_GAIN_PLUS": "增益+"
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
<div class="modal-header">
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<ul class="contributors">
|
|
||||||
<li>
|
|
||||||
<div class="clearfix"><img src="img/vc_logo.png"></div>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<div class="clearfix">Version: 0.1.0</div>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<div class="clearfix">Git Rev: {{ githash }}</div>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<div class="clearfix">Powered By: <a href="https://freeswitch.org/" target="_blank"><img src="img/fs_logo_small.png" height="30"></a></div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
</div>
|
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
<div>
|
|
||||||
<div class="modal-header">
|
|
||||||
<button type="button" class="close pull-right" ng-click="$dismiss()" aria-hidden="true">×</button>
|
|
||||||
<h4 class="modal-title">{{options.title}}</h4>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
|
|
||||||
<p ng-if="options.message">
|
|
||||||
{{options.message}}
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<form id="cgPromptForm" name="cgPromptForm" ng-if="options.input" ng-submit="submit()">
|
|
||||||
<div class="form-group" ng-class="{'has-error':cgPromptForm.$invalid && changed}">
|
|
||||||
<label for="cgPromptInput">{{options.label}}</label>
|
|
||||||
<input id="cgPromptInput" type="text" class="form-control" placeholder="{{options.label}}" ng-model="input.name" required ng-change="changed=true" ng-if="!options.values || options.values.length === 0"/ autofocus="autofocus">
|
|
||||||
<div class="input-group" ng-if="options.values">
|
|
||||||
<input id="cgPromptInput" type="text" class="form-control" placeholder="{{options.label}}" ng-model="input.name" required ng-change="changed=true" autofocus="autofocus"/>
|
|
||||||
|
|
||||||
<div class="input-group-btn" dropdown>
|
|
||||||
<button type="button" class="btn btn-default dropdown-toggle" dropdown-toggle data-toggle="dropdown"><span class="caret"></span></button>
|
|
||||||
<ul class="dropdown-menu pull-right">
|
|
||||||
<li ng-repeat="value in options.values"><a href="" ng-click="input.name = value">{{value}}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button ng-repeat="button in options.buttons track by button.label" class="btn btn-default {{button.class}}" ng-class="{'btn-primary':button.primary}" ng-click="buttonClicked(button)">{{button.label}}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,27 +0,0 @@
|
||||||
<div class="centered-block-frame" id="browser_upgrade">
|
|
||||||
<div class="col-md-6 centered-block">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body text-center">
|
|
||||||
<h2>Sorry, your browser is not supported.</h2>
|
|
||||||
<h3>Use one of the following supported browsers.</h3>
|
|
||||||
<ul class="browsers-supported">
|
|
||||||
<li>
|
|
||||||
<a href="https://www.google.com/chrome" target="_blank">
|
|
||||||
<img src="images/browser-logos/chrome_128x128.png" title="Chrome" alt="chrome" />
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">
|
|
||||||
<img src="images/browser-logos/firefox_128x128.png" title="Firefox" alt="firefox" />
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="http://www.opera.com/" target="_blank">
|
|
||||||
<img src="images/browser-logos/opera_128x128.png" title="Opera" alt="opera" />
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,206 +0,0 @@
|
||||||
<div id="incall-pane" class="sidebar-nav" ng-controller="ChatController">
|
|
||||||
<ul class="nav nav-tabs" role="tablist" ng-init="activePane = 'members'">
|
|
||||||
<li role="presentation" ng-class="{'active': activePane == 'members'}">
|
|
||||||
<a ng-click="activePane = 'members'" href="">
|
|
||||||
{{ 'CHAT_TITLE_MEMBERS' | translate}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li role="presentation" ng-class="{'active': activePane == 'chat'}">
|
|
||||||
<a ng-click="activePane = 'chat'" href="">
|
|
||||||
{{ 'CHAT_TITLE' | translate }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div class="chat-members" ng-show="activePane == 'members'">
|
|
||||||
<div ng-show="!members.length">
|
|
||||||
<p class="text-center text-muted">{{ 'CHAT_NO_MEMBERS' | translate }}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div ng-repeat="member in members" class="chat-member-item" ng-class="{ opened: $index == openId }">
|
|
||||||
<span class="chat-members-avatar">
|
|
||||||
<img gravatar-size="40" gravatar-src="::member.email" class="img-circle" ng-class="{'chat-member-talking': member.status.audio.talking, 'chat-member-muted': member.status.audio.muted}" />
|
|
||||||
</span>
|
|
||||||
<!-- FIXME(italo): Put this whole block in a flex box to avoid defining fixed width.-->
|
|
||||||
<h4 class="chat-members-name" ng-class="{ 'clickable': verto.data.confRole == 'moderator' }" ng-click="toggleModMenu($index)">
|
|
||||||
<div class="ellipsis members-name">{{ member.name }}</div>
|
|
||||||
<small class="ellipsis members-number">({{ member.number }})</small>
|
|
||||||
|
|
||||||
<div class="members-badges">
|
|
||||||
<div ng-if="member.status.video.floor" class="label badge-floor" ng-class="{'label-danger': member.status.video.floorLocked, 'label-info': !member.status.video.floorLocked}"><i class="mdi mdi-action-https lock-floor" ng-if="member.status.video.floorLocked"></i> <span>Floor</span></div>
|
|
||||||
<div class="label label-info text-capitalize">{{ member.status.video.reservationID }}</div>
|
|
||||||
<div ng-if="member.status.video.screenShare" class="label label-info">Screen Share</div>
|
|
||||||
</div>
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
<div class="pull-right resevartion-menu chat-members-action" ng-show="verto.data.confRole == 'moderator' && resIDs.length > 0">
|
|
||||||
<div class="btn-group">
|
|
||||||
<button type="button" class="btn btn-xs dropdown-toggle" data-toggle="dropdown">
|
|
||||||
<i class="mdi-action-picture-in-picture icon" style="margin-right: 0px;"></i>
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu slidedown pull-right">
|
|
||||||
<li ng-repeat="resID in resIDs">
|
|
||||||
<a href="" class="text-capitalize" ng-class="{ 'selected': resID == member.status.video.reservationID }" ng-click="confResID(member.id, resID)">
|
|
||||||
{{ resID }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<span class="chat-members-status pull-right">
|
|
||||||
<i ng-click="confMuteMic(member.id)" class="in-use" ng-class="{'clickable': verto.data.confRole == 'moderator', 'mdi-av-mic': !member.status.audio.muted, 'mdi-av-mic-off': member.status.audio.muted, 'mic_talking': member.status.audio.talking}"></i>
|
|
||||||
<i ng-click="confMuteVideo(member.id)" ng-class="{'clickable': verto.data.confRole == 'moderator', 'mdi-av-videocam': !member.status.video.muted, 'mdi-av-videocam-off': member.status.video.muted, 'in-use': (member.status.video && !member.status.video.muted), 'disabled': !member.status.video}"></i>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<div class="admin-controls" ng-if="verto.data.confRole == 'moderator'" ng-show="$index == $parent.openId">
|
|
||||||
<div>
|
|
||||||
<div class="col-md-12 ctrl-section">
|
|
||||||
<h3>{{ 'CHAT_GENERAL' | translate }}</h3>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confKick(member.id)" title="{{ 'CHAT_TITLE_KICK' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-av-not-interested"></i>
|
|
||||||
{{ 'CHAT_KICK' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confVideoFloor(member.id)" title="{{ 'CHAT_TITLE_VIDEO_FLOOR' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-aspect-ratio"></i>
|
|
||||||
{{ 'CHAT_FLOOR' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confTransfer(member.id)" title="{{ 'CHAT_TITLE_TRANSFER' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-communication-call-made"></i>
|
|
||||||
<span style="margin-left: -9px">{{ 'CHAT_TRANSFER' | translate }}</span>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confToggleDeaf(member)" title="{{ 'CHAT_TITLE_DEAF_UNDEAF' | translate }}">
|
|
||||||
<i class="mdi-fw" ng-class="member.status.audio.deaf ? 'mdi-content-clear' : 'mdi-av-hearing'"></i>
|
|
||||||
{{ member.status.audio.deaf ? 'CHAT_UNDEAF' : 'CHAT_DEAF' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-6 ctrl-section">
|
|
||||||
<h3>{{ 'CHAT_BANNER' | translate }}</h3>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confBanner(member.id)" title="{{ 'CHAT_TITLE_SET' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-toggle-radio-button-on"></i>
|
|
||||||
{{ 'CHAT_SET' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confResetBanner(member.id)" title="{{ 'CHAT_TITLE_RESET' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-content-clear"></i>
|
|
||||||
{{ 'CHAT_RESET' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="col-md-6 ctrl-section" ng-if="conf.canvasCount > 1">
|
|
||||||
<h3>{{ 'CHAT_CANVAS' | translate }}</h3>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id, 'prev')" title="{{ 'CHAT_CANVAS_IN' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-open-in-browser"></i>
|
|
||||||
{{ 'CHAT_PREV' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id)" title="{{ 'CHAT_CANVAS_IN' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-open-in-browser"></i>
|
|
||||||
Id
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id, 'next')" title="{{ 'CHAT_CANVAS_IN' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-open-in-browser"></i>
|
|
||||||
{{ 'CHAT_NEXT' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id, 'prev')" title="{{ 'CHAT_CANVAS_OUT' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i>
|
|
||||||
{{ 'CHAT_PREV' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id)" title="{{ 'CHAT_CANVAS_OUT' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i>
|
|
||||||
Id
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id, 'next')" title="{{ 'CHAT_CANVAS_OUT' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i>
|
|
||||||
{{ 'CHAT_NEXT' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confLayer(member.id, 'prev')" title="{{ 'CHAT_LAYER' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-view-carousel"></i>
|
|
||||||
{{ 'CHAT_PREV' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confLayer(member.id)" title="{{ 'CHAT_LAYER' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-view-carousel"></i>
|
|
||||||
Id
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confLayer(member.id, 'next')" title="{{ 'CHAT_LAYER' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-action-view-carousel"></i>
|
|
||||||
{{ 'CHAT_NEXT' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-6 ctrl-section">
|
|
||||||
<h3>{{ 'CHAT_AUDIO_VIDEO' | translate }}</h3>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confMuteMic(member.id)" title="{{ 'CHAT_TITLE_MUTE_UNMUTE_MIC' | translate }}">
|
|
||||||
<i class="mdi-fw" ng-class="member.status.audio.muted ? 'mdi-av-mic-off' : 'mdi-av-mic'"></i>
|
|
||||||
{{ member.status.audio.muted ? 'CHAT_UNMUTE_MIC' : 'CHAT_MUTE_MIC' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" ng-class="{ 'disabled': !member.status.video }" class="btn btn-xs" ng-click="confMuteVideo(member.id)" title="{{ 'CHAT_TITLE_MUTE_UNMUTE_VIDEO' | translate }}">
|
|
||||||
<i class="mdi-fw" ng-class="member.status.video.muted ? 'mdi-av-videocam-off' : 'mdi-av-videocam'"></i>
|
|
||||||
{{ member.status.video.muted ? 'CHAT_UNMUTE_MIC' : 'CHAT_MUTE_MIC' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confVolumeDown(member.id)" title="{{ 'CHAT_TITLE_VOL_MINUS' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-av-volume-down"></i>
|
|
||||||
{{ 'CHAT_VOL_MINUS' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confVolumeUp(member.id)" title="{{ 'CHAT_TITLE_VOL_MINUS' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-av-volume-up"></i>
|
|
||||||
{{ 'CHAT_VOL_PLUS' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="group btn-group-justified">
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confGainDown(member.id)" title="{{ 'CHAT_TITLE_VOL_MINUS' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-av-volume-down"></i>
|
|
||||||
{{ 'CHAT_GAIN_MINUS' | translate }}
|
|
||||||
</a>
|
|
||||||
<a href="" class="btn btn-xs" ng-click="confGainUp(member.id)" title="{{ 'CHAT_TITLE_VOL_MINUS' | translate }}">
|
|
||||||
<i class="mdi-fw mdi-av-volume-up"></i>
|
|
||||||
{{ 'CHAT_GAIN_PLUS' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-history" ng-show="activePane == 'chat'">
|
|
||||||
<div class="chat-messages">
|
|
||||||
<div class="chat-message" ng-show="!messages.length">
|
|
||||||
<p class="text-center text-muted">{{ 'CHAT_NO_MESSAGES' | translate }}</p>
|
|
||||||
</div>
|
|
||||||
<div class="chat-message" ng-repeat="message in messages" title="Sent at {{ message.created_at|date }}.">
|
|
||||||
<div class="chat-message-metadata">{{ message.from }}:</div>
|
|
||||||
<p class="chat-message-body" ng-bind-html="message.body | linky:'_blank' | picturify:150:3 "></p>
|
|
||||||
</div>
|
|
||||||
<div id="chat-message-bottom"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-message-input">
|
|
||||||
<form ng-submit="send()" >
|
|
||||||
<div class="chat-message-input-group">
|
|
||||||
<textarea ng-model="message" ng-keydown="($event.keyCode == 13 && $event.shiftKey !== true) && send($event)" required="required" class="form-control input-sm" placeholder="{{ 'CHAT_TYPE_MESSAGE' | translate }}"
|
|
||||||
ng-focus="disableOnKeydownDtmf()" ng-blur="enableOnKeydownDtmf()"></textarea>
|
|
||||||
<button class="btn btn-success btn-sm" type="submit">
|
|
||||||
{{ 'CHAT_SEND_MESSAGE' | translate }}
|
|
||||||
<span class="mdi-navigation-arrow-forward chat-message-input-group-icon-button"></span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,23 +0,0 @@
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title">{{ 'TITLE_CONTRIBUTORS' | translate}}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<ul class="contributors">
|
|
||||||
<li ng-repeat="contributor in contributors">
|
|
||||||
<div class="contributor-avatar">
|
|
||||||
<img gravatar-src="contributor.email" gravatar-size="75"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="contributor-info">
|
|
||||||
<h3>{{ contributor.name }}</h3>
|
|
||||||
<h5>{{ contributor.email }}</h5>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="clearfix"></div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
</div>
|
|
||||||
|
|