Files
QLC_Plus_configuration/doc/build/index.html
Dustin Brunner 423de19775 Update Documentation
- added screenshot
- added doc export using pandoc to html and pdf
2025-12-21 17:33:03 +01:00

26402 lines
1.2 MiB
Raw Blame History

<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!--[if lt IE 9]>
<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<!-- <link rel="stylesheet" type="text/css" href="template.css" /> -->
<style type="text/css">
.clearfix {
*zoom: 1;
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
line-height: 0;
}
.clearfix:after {
clear: both;
}
.hide-text {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.input-block-level {
display: block;
width: 100%;
min-height: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section {
display: block;
}
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
}
audio:not([controls]) {
display: none;
}
html {
font-size: 100%;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
a:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
a:hover,
a:active {
outline: 0;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
img {
max-width: 100%;
width: auto\9;
height: auto;
vertical-align: middle;
border: 0;
-ms-interpolation-mode: bicubic;
}
#map_canvas img,
.google-maps img {
max-width: none;
}
button,
input,
select,
textarea {
margin: 0;
font-size: 100%;
vertical-align: middle;
}
button,
input {
*overflow: visible;
line-height: normal;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button;
cursor: pointer;
}
label,
select,
button,
input[type="button"],
input[type="reset"],
input[type="submit"],
input[type="radio"],
input[type="checkbox"] {
cursor: pointer;
}
input[type="search"] {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
-webkit-appearance: none;
}
textarea {
overflow: auto;
vertical-align: top;
}
@media print {
* {
text-shadow: none !important;
color: #000 !important;
background: transparent !important;
box-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group;
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
body {
margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 20px;
color: #333333;
background-color: #ffffff;
}
a {
color: #0088cc;
text-decoration: none;
}
a:hover,
a:focus {
color: #005580;
text-decoration: underline;
}
.img-rounded {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
.img-polaroid {
padding: 4px;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.img-circle {
-webkit-border-radius: 500px;
-moz-border-radius: 500px;
border-radius: 500px;
}
.row {
margin-left: -20px;
*zoom: 1;
}
.row:before,
.row:after {
display: table;
content: "";
line-height: 0;
}
.row:after {
clear: both;
}
[class*="span"] {
float: left;
min-height: 1px;
margin-left: 20px;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
width: 940px;
}
.span12 {
width: 940px;
}
.span11 {
width: 860px;
}
.span10 {
width: 780px;
}
.span9 {
width: 700px;
}
.span8 {
width: 620px;
}
.span7 {
width: 540px;
}
.span6 {
width: 460px;
}
.span5 {
width: 380px;
}
.span4 {
width: 300px;
}
.span3 {
width: 220px;
}
.span2 {
width: 140px;
}
.span1 {
width: 60px;
}
.offset12 {
margin-left: 980px;
}
.offset11 {
margin-left: 900px;
}
.offset10 {
margin-left: 820px;
}
.offset9 {
margin-left: 740px;
}
.offset8 {
margin-left: 660px;
}
.offset7 {
margin-left: 580px;
}
.offset6 {
margin-left: 500px;
}
.offset5 {
margin-left: 420px;
}
.offset4 {
margin-left: 340px;
}
.offset3 {
margin-left: 260px;
}
.offset2 {
margin-left: 180px;
}
.offset1 {
margin-left: 100px;
}
.row-fluid {
width: 100%;
*zoom: 1;
}
.row-fluid:before,
.row-fluid:after {
display: table;
content: "";
line-height: 0;
}
.row-fluid:after {
clear: both;
}
.row-fluid [class*="span"] {
display: block;
width: 100%;
min-height: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
float: left;
margin-left: 2.127659574468085%;
*margin-left: 2.074468085106383%;
}
.row-fluid [class*="span"]:first-child {
margin-left: 0;
}
.row-fluid .controls-row [class*="span"] + [class*="span"] {
margin-left: 2.127659574468085%;
}
.row-fluid .span12 {
width: 100%;
*width: 99.94680851063829%;
}
.row-fluid .span11 {
width: 91.48936170212765%;
*width: 91.43617021276594%;
}
.row-fluid .span10 {
width: 82.97872340425532%;
*width: 82.92553191489361%;
}
.row-fluid .span9 {
width: 74.46808510638297%;
*width: 74.41489361702126%;
}
.row-fluid .span8 {
width: 65.95744680851064%;
*width: 65.90425531914893%;
}
.row-fluid .span7 {
width: 57.44680851063829%;
*width: 57.39361702127659%;
}
.row-fluid .span6 {
width: 48.93617021276595%;
*width: 48.88297872340425%;
}
.row-fluid .span5 {
width: 40.42553191489362%;
*width: 40.37234042553192%;
}
.row-fluid .span4 {
width: 31.914893617021278%;
*width: 31.861702127659576%;
}
.row-fluid .span3 {
width: 23.404255319148934%;
*width: 23.351063829787233%;
}
.row-fluid .span2 {
width: 14.893617021276595%;
*width: 14.840425531914894%;
}
.row-fluid .span1 {
width: 6.382978723404255%;
*width: 6.329787234042553%;
}
.row-fluid .offset12 {
margin-left: 104.25531914893617%;
*margin-left: 104.14893617021275%;
}
.row-fluid .offset12:first-child {
margin-left: 102.12765957446808%;
*margin-left: 102.02127659574467%;
}
.row-fluid .offset11 {
margin-left: 95.74468085106382%;
*margin-left: 95.6382978723404%;
}
.row-fluid .offset11:first-child {
margin-left: 93.61702127659574%;
*margin-left: 93.51063829787232%;
}
.row-fluid .offset10 {
margin-left: 87.23404255319149%;
*margin-left: 87.12765957446807%;
}
.row-fluid .offset10:first-child {
margin-left: 85.1063829787234%;
*margin-left: 84.99999999999999%;
}
.row-fluid .offset9 {
margin-left: 78.72340425531914%;
*margin-left: 78.61702127659572%;
}
.row-fluid .offset9:first-child {
margin-left: 76.59574468085106%;
*margin-left: 76.48936170212764%;
}
.row-fluid .offset8 {
margin-left: 70.2127659574468%;
*margin-left: 70.10638297872339%;
}
.row-fluid .offset8:first-child {
margin-left: 68.08510638297872%;
*margin-left: 67.9787234042553%;
}
.row-fluid .offset7 {
margin-left: 61.70212765957446%;
*margin-left: 61.59574468085106%;
}
.row-fluid .offset7:first-child {
margin-left: 59.574468085106375%;
*margin-left: 59.46808510638297%;
}
.row-fluid .offset6 {
margin-left: 53.191489361702125%;
*margin-left: 53.085106382978715%;
}
.row-fluid .offset6:first-child {
margin-left: 51.063829787234035%;
*margin-left: 50.95744680851063%;
}
.row-fluid .offset5 {
margin-left: 44.68085106382979%;
*margin-left: 44.57446808510638%;
}
.row-fluid .offset5:first-child {
margin-left: 42.5531914893617%;
*margin-left: 42.4468085106383%;
}
.row-fluid .offset4 {
margin-left: 36.170212765957444%;
*margin-left: 36.06382978723405%;
}
.row-fluid .offset4:first-child {
margin-left: 34.04255319148936%;
*margin-left: 33.93617021276596%;
}
.row-fluid .offset3 {
margin-left: 27.659574468085104%;
*margin-left: 27.5531914893617%;
}
.row-fluid .offset3:first-child {
margin-left: 25.53191489361702%;
*margin-left: 25.425531914893618%;
}
.row-fluid .offset2 {
margin-left: 19.148936170212764%;
*margin-left: 19.04255319148936%;
}
.row-fluid .offset2:first-child {
margin-left: 17.02127659574468%;
*margin-left: 16.914893617021278%;
}
.row-fluid .offset1 {
margin-left: 10.638297872340425%;
*margin-left: 10.53191489361702%;
}
.row-fluid .offset1:first-child {
margin-left: 8.51063829787234%;
*margin-left: 8.404255319148938%;
}
[class*="span"].hide,
.row-fluid [class*="span"].hide {
display: none;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
float: right;
}
.container {
margin-right: auto;
margin-left: auto;
*zoom: 1;
}
.container:before,
.container:after {
display: table;
content: "";
line-height: 0;
}
.container:after {
clear: both;
}
.container-fluid {
padding-right: 20px;
padding-left: 20px;
*zoom: 1;
}
.container-fluid:before,
.container-fluid:after {
display: table;
content: "";
line-height: 0;
}
.container-fluid:after {
clear: both;
}
p {
margin: 0 0 10px;
}
.lead {
margin-bottom: 20px;
font-size: 21px;
font-weight: 200;
line-height: 30px;
}
small {
font-size: 85%;
}
strong {
font-weight: bold;
}
em {
font-style: italic;
}
cite {
font-style: normal;
}
.muted {
color: #999999;
}
a.muted:hover,
a.muted:focus {
color: #808080;
}
.text-warning {
color: #c09853;
}
a.text-warning:hover,
a.text-warning:focus {
color: #a47e3c;
}
.text-error {
color: #b94a48;
}
a.text-error:hover,
a.text-error:focus {
color: #953b39;
}
.text-info {
color: #3a87ad;
}
a.text-info:hover,
a.text-info:focus {
color: #2d6987;
}
.text-success {
color: #468847;
}
a.text-success:hover,
a.text-success:focus {
color: #356635;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 10px 0;
font-family: inherit;
font-weight: bold;
line-height: 20px;
color: inherit;
text-rendering: optimizelegibility;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small {
font-weight: normal;
line-height: 1;
color: #999999;
}
h1,
h2,
h3 {
line-height: 40px;
}
h1 {
font-size: 38.5px;
}
h2 {
font-size: 31.5px;
}
h3 {
font-size: 24.5px;
}
h4 {
font-size: 17.5px;
}
h5 {
font-size: 14px;
}
h6 {
font-size: 11.9px;
}
h1 small {
font-size: 24.5px;
}
h2 small {
font-size: 17.5px;
}
h3 small {
font-size: 14px;
}
h4 small {
font-size: 14px;
}
.page-header {
padding-bottom: 9px;
margin: 20px 0 30px;
border-bottom: 1px solid #eeeeee;
}
ul,
ol {
padding: 0;
margin: 0 0 10px 25px;
}
ul ul,
ul ol,
ol ol,
ol ul {
margin-bottom: 0;
}
li {
line-height: 20px;
}
ul.unstyled,
ol.unstyled {
margin-left: 0;
list-style: none;
}
ul.inline,
ol.inline {
margin-left: 0;
list-style: none;
}
ul.inline > li,
ol.inline > li {
display: inline-block;
*display: inline;
*zoom: 1;
padding-left: 5px;
padding-right: 5px;
}
dl {
margin-bottom: 20px;
}
dt,
dd {
line-height: 20px;
}
dt {
font-weight: bold;
}
dd {
margin-left: 10px;
}
.dl-horizontal {
*zoom: 1;
}
.dl-horizontal:before,
.dl-horizontal:after {
display: table;
content: "";
line-height: 0;
}
.dl-horizontal:after {
clear: both;
}
.dl-horizontal dt {
float: left;
width: 160px;
clear: left;
text-align: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dl-horizontal dd {
margin-left: 180px;
}
hr {
margin: 20px 0;
border: 0;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #ffffff;
}
abbr[title],
abbr[data-original-title] {
cursor: help;
border-bottom: 1px dotted #999999;
}
abbr.initialism {
font-size: 90%;
text-transform: uppercase;
}
blockquote {
padding: 0 0 0 15px;
margin: 0 0 20px;
border-left: 5px solid #eeeeee;
}
blockquote p {
margin-bottom: 0;
font-size: 17.5px;
font-weight: 300;
line-height: 1.25;
}
blockquote small {
display: block;
line-height: 20px;
color: #999999;
}
blockquote small:before {
content: '\2014 \00A0';
}
blockquote.pull-right {
float: right;
padding-right: 15px;
padding-left: 0;
border-right: 5px solid #eeeeee;
border-left: 0;
}
blockquote.pull-right p,
blockquote.pull-right small {
text-align: right;
}
blockquote.pull-right small:before {
content: '';
}
blockquote.pull-right small:after {
content: '\00A0 \2014';
}
q:before,
q:after,
blockquote:before,
blockquote:after {
content: "";
}
address {
display: block;
margin-bottom: 20px;
font-style: normal;
line-height: 20px;
}
code,
pre {
padding: 0 3px 2px;
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
font-size: 12px;
color: #333333;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
code {
padding: 2px 4px;
color: #d14;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
white-space: nowrap;
}
pre {
display: block;
padding: 9.5px;
margin: 0 0 10px;
font-size: 13px;
line-height: 20px;
word-break: break-all;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
background-color: #f5f5f5;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.15);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
pre.prettyprint {
margin-bottom: 20px;
}
pre code {
padding: 0;
color: inherit;
white-space: pre;
white-space: pre-wrap;
background-color: transparent;
border: 0;
}
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}
table {
max-width: 100%;
background-color: transparent;
border-collapse: collapse;
border-spacing: 0;
}
.table {
width: 100%;
margin-bottom: 20px;
}
.table th,
.table td {
padding: 8px;
line-height: 20px;
text-align: left;
vertical-align: top;
border-top: 1px solid #dddddd;
}
.table th {
font-weight: bold;
}
.table thead th {
vertical-align: bottom;
}
.table caption + thead tr:first-child th,
.table caption + thead tr:first-child td,
.table colgroup + thead tr:first-child th,
.table colgroup + thead tr:first-child td,
.table thead:first-child tr:first-child th,
.table thead:first-child tr:first-child td {
border-top: 0;
}
.table tbody + tbody {
border-top: 2px solid #dddddd;
}
.table .table {
background-color: #ffffff;
}
.table-condensed th,
.table-condensed td {
padding: 4px 5px;
}
.table-bordered {
border: 1px solid #dddddd;
border-collapse: separate;
*border-collapse: collapse;
border-left: 0;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.table-bordered th,
.table-bordered td {
border-left: 1px solid #dddddd;
}
.table-bordered caption + thead tr:first-child th,
.table-bordered caption + tbody tr:first-child th,
.table-bordered caption + tbody tr:first-child td,
.table-bordered colgroup + thead tr:first-child th,
.table-bordered colgroup + tbody tr:first-child th,
.table-bordered colgroup + tbody tr:first-child td,
.table-bordered thead:first-child tr:first-child th,
.table-bordered tbody:first-child tr:first-child th,
.table-bordered tbody:first-child tr:first-child td {
border-top: 0;
}
.table-bordered thead:first-child tr:first-child > th:first-child,
.table-bordered tbody:first-child tr:first-child > td:first-child,
.table-bordered tbody:first-child tr:first-child > th:first-child {
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
}
.table-bordered thead:first-child tr:first-child > th:last-child,
.table-bordered tbody:first-child tr:first-child > td:last-child,
.table-bordered tbody:first-child tr:first-child > th:last-child {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
}
.table-bordered thead:last-child tr:last-child > th:first-child,
.table-bordered tbody:last-child tr:last-child > td:first-child,
.table-bordered tbody:last-child tr:last-child > th:first-child,
.table-bordered tfoot:last-child tr:last-child > td:first-child,
.table-bordered tfoot:last-child tr:last-child > th:first-child {
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
}
.table-bordered thead:last-child tr:last-child > th:last-child,
.table-bordered tbody:last-child tr:last-child > td:last-child,
.table-bordered tbody:last-child tr:last-child > th:last-child,
.table-bordered tfoot:last-child tr:last-child > td:last-child,
.table-bordered tfoot:last-child tr:last-child > th:last-child {
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
-webkit-border-bottom-left-radius: 0;
-moz-border-radius-bottomleft: 0;
border-bottom-left-radius: 0;
}
.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
-webkit-border-bottom-right-radius: 0;
-moz-border-radius-bottomright: 0;
border-bottom-right-radius: 0;
}
.table-bordered caption + thead tr:first-child th:first-child,
.table-bordered caption + tbody tr:first-child td:first-child,
.table-bordered colgroup + thead tr:first-child th:first-child,
.table-bordered colgroup + tbody tr:first-child td:first-child {
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
}
.table-bordered caption + thead tr:first-child th:last-child,
.table-bordered caption + tbody tr:first-child td:last-child,
.table-bordered colgroup + thead tr:first-child th:last-child,
.table-bordered colgroup + tbody tr:first-child td:last-child {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
}
.table-striped tbody > tr:nth-child(odd) > td,
.table-striped tbody > tr:nth-child(odd) > th {
background-color: #f9f9f9;
}
.table-hover tbody tr:hover > td,
.table-hover tbody tr:hover > th {
background-color: #f5f5f5;
}
table td[class*="span"],
table th[class*="span"],
.row-fluid table td[class*="span"],
.row-fluid table th[class*="span"] {
display: table-cell;
float: none;
margin-left: 0;
}
.table td.span1,
.table th.span1 {
float: none;
width: 44px;
margin-left: 0;
}
.table td.span2,
.table th.span2 {
float: none;
width: 124px;
margin-left: 0;
}
.table td.span3,
.table th.span3 {
float: none;
width: 204px;
margin-left: 0;
}
.table td.span4,
.table th.span4 {
float: none;
width: 284px;
margin-left: 0;
}
.table td.span5,
.table th.span5 {
float: none;
width: 364px;
margin-left: 0;
}
.table td.span6,
.table th.span6 {
float: none;
width: 444px;
margin-left: 0;
}
.table td.span7,
.table th.span7 {
float: none;
width: 524px;
margin-left: 0;
}
.table td.span8,
.table th.span8 {
float: none;
width: 604px;
margin-left: 0;
}
.table td.span9,
.table th.span9 {
float: none;
width: 684px;
margin-left: 0;
}
.table td.span10,
.table th.span10 {
float: none;
width: 764px;
margin-left: 0;
}
.table td.span11,
.table th.span11 {
float: none;
width: 844px;
margin-left: 0;
}
.table td.span12,
.table th.span12 {
float: none;
width: 924px;
margin-left: 0;
}
.table tbody tr.success > td {
background-color: #dff0d8;
}
.table tbody tr.error > td {
background-color: #f2dede;
}
.table tbody tr.warning > td {
background-color: #fcf8e3;
}
.table tbody tr.info > td {
background-color: #d9edf7;
}
.table-hover tbody tr.success:hover > td {
background-color: #d0e9c6;
}
.table-hover tbody tr.error:hover > td {
background-color: #ebcccc;
}
.table-hover tbody tr.warning:hover > td {
background-color: #faf2cc;
}
.table-hover tbody tr.info:hover > td {
background-color: #c4e3f3;
}
.nav {
margin-left: 0;
margin-bottom: 20px;
list-style: none;
}
.nav > li > a {
display: block;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: #eeeeee;
}
.nav > li > a > img {
max-width: none;
}
.nav > .pull-right {
float: right;
}
.nav-header {
display: block;
padding: 3px 15px;
font-size: 11px;
font-weight: bold;
line-height: 20px;
color: #999999;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
text-transform: uppercase;
}
.nav li + .nav-header {
margin-top: 9px;
}
.nav-list {
padding-left: 15px;
padding-right: 15px;
margin-bottom: 0;
}
.nav-list > li > a,
.nav-list .nav-header {
margin-left: -15px;
margin-right: -15px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}
.nav-list > li > a {
padding: 3px 15px;
}
.nav-list > .active > a,
.nav-list > .active > a:hover,
.nav-list > .active > a:focus {
color: #ffffff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
background-color: #0088cc;
}
.nav-list [class^="icon-"],
.nav-list [class*=" icon-"] {
margin-right: 2px;
}
.nav-list .divider {
*width: 100%;
height: 1px;
margin: 9px 1px;
*margin: -5px 0 5px;
overflow: hidden;
background-color: #e5e5e5;
border-bottom: 1px solid #ffffff;
}
.nav-tabs,
.nav-pills {
*zoom: 1;
}
.nav-tabs:before,
.nav-pills:before,
.nav-tabs:after,
.nav-pills:after {
display: table;
content: "";
line-height: 0;
}
.nav-tabs:after,
.nav-pills:after {
clear: both;
}
.nav-tabs > li,
.nav-pills > li {
float: left;
}
.nav-tabs > li > a,
.nav-pills > li > a {
padding-right: 12px;
padding-left: 12px;
margin-right: 2px;
line-height: 14px;
}
.nav-tabs {
border-bottom: 1px solid #ddd;
}
.nav-tabs > li {
margin-bottom: -1px;
}
.nav-tabs > li > a {
padding-top: 8px;
padding-bottom: 8px;
line-height: 20px;
border: 1px solid transparent;
-webkit-border-radius: 4px 4px 0 0;
-moz-border-radius: 4px 4px 0 0;
border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover,
.nav-tabs > li > a:focus {
border-color: #eeeeee #eeeeee #dddddd;
}
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
color: #555555;
background-color: #ffffff;
border: 1px solid #ddd;
border-bottom-color: transparent;
cursor: default;
}
.nav-pills > li > a {
padding-top: 8px;
padding-bottom: 8px;
margin-top: 2px;
margin-bottom: 2px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
.nav-pills > .active > a,
.nav-pills > .active > a:hover,
.nav-pills > .active > a:focus {
color: #ffffff;
background-color: #0088cc;
}
.nav-stacked > li {
float: none;
}
.nav-stacked > li > a {
margin-right: 0;
}
.nav-tabs.nav-stacked {
border-bottom: 0;
}
.nav-tabs.nav-stacked > li > a {
border: 1px solid #ddd;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.nav-tabs.nav-stacked > li:first-child > a {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
}
.nav-tabs.nav-stacked > li:last-child > a {
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
}
.nav-tabs.nav-stacked > li > a:hover,
.nav-tabs.nav-stacked > li > a:focus {
border-color: #ddd;
z-index: 2;
}
.nav-pills.nav-stacked > li > a {
margin-bottom: 3px;
}
.nav-pills.nav-stacked > li:last-child > a {
margin-bottom: 1px;
}
.nav-tabs .dropdown-menu {
-webkit-border-radius: 0 0 6px 6px;
-moz-border-radius: 0 0 6px 6px;
border-radius: 0 0 6px 6px;
}
.nav-pills .dropdown-menu {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
.nav .dropdown-toggle .caret {
border-top-color: #0088cc;
border-bottom-color: #0088cc;
margin-top: 6px;
}
.nav .dropdown-toggle:hover .caret,
.nav .dropdown-toggle:focus .caret {
border-top-color: #005580;
border-bottom-color: #005580;
}
.nav-tabs .dropdown-toggle .caret {
margin-top: 8px;
}
.nav .active .dropdown-toggle .caret {
border-top-color: #fff;
border-bottom-color: #fff;
}
.nav-tabs .active .dropdown-toggle .caret {
border-top-color: #555555;
border-bottom-color: #555555;
}
.nav > .dropdown.active > a:hover,
.nav > .dropdown.active > a:focus {
cursor: pointer;
}
.nav-tabs .open .dropdown-toggle,
.nav-pills .open .dropdown-toggle,
.nav > li.dropdown.open.active > a:hover,
.nav > li.dropdown.open.active > a:focus {
color: #ffffff;
background-color: #999999;
border-color: #999999;
}
.nav li.dropdown.open .caret,
.nav li.dropdown.open.active .caret,
.nav li.dropdown.open a:hover .caret,
.nav li.dropdown.open a:focus .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
opacity: 1;
filter: alpha(opacity=100);
}
.tabs-stacked .open > a:hover,
.tabs-stacked .open > a:focus {
border-color: #999999;
}
.tabbable {
*zoom: 1;
}
.tabbable:before,
.tabbable:after {
display: table;
content: "";
line-height: 0;
}
.tabbable:after {
clear: both;
}
.tab-content {
overflow: auto;
}
.tabs-below > .nav-tabs,
.tabs-right > .nav-tabs,
.tabs-left > .nav-tabs {
border-bottom: 0;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none;
}
.tab-content > .active,
.pill-content > .active {
display: block;
}
.tabs-below > .nav-tabs {
border-top: 1px solid #ddd;
}
.tabs-below > .nav-tabs > li {
margin-top: -1px;
margin-bottom: 0;
}
.tabs-below > .nav-tabs > li > a {
-webkit-border-radius: 0 0 4px 4px;
-moz-border-radius: 0 0 4px 4px;
border-radius: 0 0 4px 4px;
}
.tabs-below > .nav-tabs > li > a:hover,
.tabs-below > .nav-tabs > li > a:focus {
border-bottom-color: transparent;
border-top-color: #ddd;
}
.tabs-below > .nav-tabs > .active > a,
.tabs-below > .nav-tabs > .active > a:hover,
.tabs-below > .nav-tabs > .active > a:focus {
border-color: transparent #ddd #ddd #ddd;
}
.tabs-left > .nav-tabs > li,
.tabs-right > .nav-tabs > li {
float: none;
}
.tabs-left > .nav-tabs > li > a,
.tabs-right > .nav-tabs > li > a {
min-width: 74px;
margin-right: 0;
margin-bottom: 3px;
}
.tabs-left > .nav-tabs {
float: left;
margin-right: 19px;
border-right: 1px solid #ddd;
}
.tabs-left > .nav-tabs > li > a {
margin-right: -1px;
-webkit-border-radius: 4px 0 0 4px;
-moz-border-radius: 4px 0 0 4px;
border-radius: 4px 0 0 4px;
}
.tabs-left > .nav-tabs > li > a:hover,
.tabs-left > .nav-tabs > li > a:focus {
border-color: #eeeeee #dddddd #eeeeee #eeeeee;
}
.tabs-left > .nav-tabs .active > a,
.tabs-left > .nav-tabs .active > a:hover,
.tabs-left > .nav-tabs .active > a:focus {
border-color: #ddd transparent #ddd #ddd;
*border-right-color: #ffffff;
}
.tabs-right > .nav-tabs {
float: right;
margin-left: 19px;
border-left: 1px solid #ddd;
}
.tabs-right > .nav-tabs > li > a {
margin-left: -1px;
-webkit-border-radius: 0 4px 4px 0;
-moz-border-radius: 0 4px 4px 0;
border-radius: 0 4px 4px 0;
}
.tabs-right > .nav-tabs > li > a:hover,
.tabs-right > .nav-tabs > li > a:focus {
border-color: #eeeeee #eeeeee #eeeeee #dddddd;
}
.tabs-right > .nav-tabs .active > a,
.tabs-right > .nav-tabs .active > a:hover,
.tabs-right > .nav-tabs .active > a:focus {
border-color: #ddd #ddd #ddd transparent;
*border-left-color: #ffffff;
}
.nav > .disabled > a {
color: #999999;
}
.nav > .disabled > a:hover,
.nav > .disabled > a:focus {
text-decoration: none;
background-color: transparent;
cursor: default;
}
.navbar {
overflow: visible;
margin-bottom: 20px;
*position: relative;
*z-index: 2;
}
.navbar-inner {
min-height: 40px;
padding-left: 20px;
padding-right: 20px;
background-color: #fafafa;
background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
border: 1px solid #d4d4d4;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
*zoom: 1;
}
.navbar-inner:before,
.navbar-inner:after {
display: table;
content: "";
line-height: 0;
}
.navbar-inner:after {
clear: both;
}
.navbar .container {
width: auto;
}
.nav-collapse.collapse {
height: auto;
overflow: visible;
}
.navbar .brand {
float: left;
display: block;
padding: 10px 20px 10px;
margin-left: -20px;
font-size: 20px;
font-weight: 200;
color: #777777;
text-shadow: 0 1px 0 #ffffff;
}
.navbar .brand:hover,
.navbar .brand:focus {
text-decoration: none;
}
.navbar-text {
margin-bottom: 0;
line-height: 40px;
color: #777777;
}
.navbar-link {
color: #777777;
}
.navbar-link:hover,
.navbar-link:focus {
color: #333333;
}
.navbar .divider-vertical {
height: 40px;
margin: 0 9px;
border-left: 1px solid #f2f2f2;
border-right: 1px solid #ffffff;
}
.navbar .btn,
.navbar .btn-group {
margin-top: 5px;
}
.navbar .btn-group .btn,
.navbar .input-prepend .btn,
.navbar .input-append .btn,
.navbar .input-prepend .btn-group,
.navbar .input-append .btn-group {
margin-top: 0;
}
.navbar-form {
margin-bottom: 0;
*zoom: 1;
}
.navbar-form:before,
.navbar-form:after {
display: table;
content: "";
line-height: 0;
}
.navbar-form:after {
clear: both;
}
.navbar-form input,
.navbar-form select,
.navbar-form .radio,
.navbar-form .checkbox {
margin-top: 5px;
}
.navbar-form input,
.navbar-form select,
.navbar-form .btn {
display: inline-block;
margin-bottom: 0;
}
.navbar-form input[type="image"],
.navbar-form input[type="checkbox"],
.navbar-form input[type="radio"] {
margin-top: 3px;
}
.navbar-form .input-append,
.navbar-form .input-prepend {
margin-top: 5px;
white-space: nowrap;
}
.navbar-form .input-append input,
.navbar-form .input-prepend input {
margin-top: 0;
}
.navbar-search {
position: relative;
float: left;
margin-top: 5px;
margin-bottom: 0;
}
.navbar-search .search-query {
margin-bottom: 0;
padding: 4px 14px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
font-weight: normal;
line-height: 1;
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
border-radius: 15px;
}
.navbar-static-top {
position: static;
margin-bottom: 0;
}
.navbar-static-top .navbar-inner {
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
z-index: 1030;
margin-bottom: 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
border-width: 0 0 1px;
}
.navbar-fixed-bottom .navbar-inner {
border-width: 1px 0 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding-left: 0;
padding-right: 0;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
width: 940px;
}
.navbar-fixed-top {
top: 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
-webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);
-moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);
box-shadow: 0 1px 10px rgba(0,0,0,.1);
}
.navbar-fixed-bottom {
bottom: 0;
}
.navbar-fixed-bottom .navbar-inner {
-webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
-moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
box-shadow: 0 -1px 10px rgba(0,0,0,.1);
}
.navbar .nav {
position: relative;
left: 0;
display: block;
float: left;
margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
float: right;
margin-right: 0;
}
.navbar .nav > li {
float: left;
}
.navbar .nav > li > a {
float: none;
padding: 10px 15px 10px;
color: #777777;
text-decoration: none;
text-shadow: 0 1px 0 #ffffff;
}
.navbar .nav .dropdown-toggle .caret {
margin-top: 8px;
}
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
background-color: transparent;
color: #333333;
text-decoration: none;
}
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
color: #555555;
text-decoration: none;
background-color: #e5e5e5;
-webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
}
.navbar .btn-navbar {
display: none;
float: right;
padding: 7px 10px;
margin-left: 5px;
margin-right: 5px;
color: #ffffff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #ededed;
background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
border-color: #e5e5e5 #e5e5e5 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #e5e5e5;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
}
.navbar .btn-navbar:hover,
.navbar .btn-navbar:focus,
.navbar .btn-navbar:active,
.navbar .btn-navbar.active,
.navbar .btn-navbar.disabled,
.navbar .btn-navbar[disabled] {
color: #ffffff;
background-color: #e5e5e5;
*background-color: #d9d9d9;
}
.navbar .btn-navbar:active,
.navbar .btn-navbar.active {
background-color: #cccccc \9;
}
.navbar .btn-navbar .icon-bar {
display: block;
width: 18px;
height: 2px;
background-color: #f5f5f5;
-webkit-border-radius: 1px;
-moz-border-radius: 1px;
border-radius: 1px;
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
}
.btn-navbar .icon-bar + .icon-bar {
margin-top: 3px;
}
.navbar .nav > li > .dropdown-menu:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0, 0, 0, 0.2);
position: absolute;
top: -7px;
left: 9px;
}
.navbar .nav > li > .dropdown-menu:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
position: absolute;
top: -6px;
left: 10px;
}
.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
border-top: 7px solid #ccc;
border-top-color: rgba(0, 0, 0, 0.2);
border-bottom: 0;
bottom: -7px;
top: auto;
}
.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
border-top: 6px solid #ffffff;
border-bottom: 0;
bottom: -6px;
top: auto;
}
.navbar .nav li.dropdown > a:hover .caret,
.navbar .nav li.dropdown > a:focus .caret {
border-top-color: #333333;
border-bottom-color: #333333;
}
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
background-color: #e5e5e5;
color: #555555;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
border-top-color: #777777;
border-bottom-color: #777777;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: #555555;
border-bottom-color: #555555;
}
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
left: auto;
right: 0;
}
.navbar .pull-right > li > .dropdown-menu:before,
.navbar .nav > li > .dropdown-menu.pull-right:before {
left: auto;
right: 12px;
}
.navbar .pull-right > li > .dropdown-menu:after,
.navbar .nav > li > .dropdown-menu.pull-right:after {
left: auto;
right: 13px;
}
.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
left: auto;
right: 100%;
margin-left: 0;
margin-right: -1px;
-webkit-border-radius: 6px 0 6px 6px;
-moz-border-radius: 6px 0 6px 6px;
border-radius: 6px 0 6px 6px;
}
.navbar-inverse .navbar-inner {
background-color: #1b1b1b;
background-image: -moz-linear-gradient(top, #222222, #111111);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
background-image: -webkit-linear-gradient(top, #222222, #111111);
background-image: -o-linear-gradient(top, #222222, #111111);
background-image: linear-gradient(to bottom, #222222, #111111);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
border-color: #252525;
}
.navbar-inverse .brand,
.navbar-inverse .nav > li > a {
color: #999999;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.navbar-inverse .brand:hover,
.navbar-inverse .nav > li > a:hover,
.navbar-inverse .brand:focus,
.navbar-inverse .nav > li > a:focus {
color: #ffffff;
}
.navbar-inverse .brand {
color: #999999;
}
.navbar-inverse .navbar-text {
color: #999999;
}
.navbar-inverse .nav > li > a:focus,
.navbar-inverse .nav > li > a:hover {
background-color: transparent;
color: #ffffff;
}
.navbar-inverse .nav .active > a,
.navbar-inverse .nav .active > a:hover,
.navbar-inverse .nav .active > a:focus {
color: #ffffff;
background-color: #111111;
}
.navbar-inverse .navbar-link {
color: #999999;
}
.navbar-inverse .navbar-link:hover,
.navbar-inverse .navbar-link:focus {
color: #ffffff;
}
.navbar-inverse .divider-vertical {
border-left-color: #111111;
border-right-color: #222222;
}
.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
background-color: #111111;
color: #ffffff;
}
.navbar-inverse .nav li.dropdown > a:hover .caret,
.navbar-inverse .nav li.dropdown > a:focus .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
}
.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
border-top-color: #999999;
border-bottom-color: #999999;
}
.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
}
.navbar-inverse .navbar-search .search-query {
color: #ffffff;
background-color: #515151;
border-color: #111111;
-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
transition: none;
}
.navbar-inverse .navbar-search .search-query:-moz-placeholder {
color: #cccccc;
}
.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
color: #cccccc;
}
.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
color: #cccccc;
}
.navbar-inverse .navbar-search .search-query:focus,
.navbar-inverse .navbar-search .search-query.focused {
padding: 5px 15px;
color: #333333;
text-shadow: 0 1px 0 #ffffff;
background-color: #ffffff;
border: 0;
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
outline: 0;
}
.navbar-inverse .btn-navbar {
color: #ffffff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #0e0e0e;
background-image: -moz-linear-gradient(top, #151515, #040404);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
background-image: -webkit-linear-gradient(top, #151515, #040404);
background-image: -o-linear-gradient(top, #151515, #040404);
background-image: linear-gradient(to bottom, #151515, #040404);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
border-color: #040404 #040404 #000000;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #040404;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.navbar-inverse .btn-navbar:hover,
.navbar-inverse .btn-navbar:focus,
.navbar-inverse .btn-navbar:active,
.navbar-inverse .btn-navbar.active,
.navbar-inverse .btn-navbar.disabled,
.navbar-inverse .btn-navbar[disabled] {
color: #ffffff;
background-color: #040404;
*background-color: #000000;
}
.navbar-inverse .btn-navbar:active,
.navbar-inverse .btn-navbar.active {
background-color: #000000 \9;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}
.well blockquote {
border-color: #ddd;
border-color: rgba(0, 0, 0, 0.15);
}
.well-large {
padding: 24px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
.well-small {
padding: 9px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
@-ms-viewport {
width: device-width;
}
.hidden {
display: none;
visibility: hidden;
}
.visible-phone {
display: none !important;
}
.visible-tablet {
display: none !important;
}
.hidden-desktop {
display: none !important;
}
.visible-desktop {
display: inherit !important;
}
@media (min-width: 768px) and (max-width: 979px) {
.hidden-desktop {
display: inherit !important;
}
.visible-desktop {
display: none !important ;
}
.visible-tablet {
display: inherit !important;
}
.hidden-tablet {
display: none !important;
}
}
@media (max-width: 767px) {
.hidden-desktop {
display: inherit !important;
}
.visible-desktop {
display: none !important;
}
.visible-phone {
display: inherit !important;
}
.hidden-phone {
display: none !important;
}
}
.visible-print {
display: none !important;
}
@media print {
.visible-print {
display: inherit !important;
}
.hidden-print {
display: none !important;
}
}
@media (max-width: 767px) {
body {
padding-left: 20px;
padding-right: 20px;
}
.navbar-fixed-top,
.navbar-fixed-bottom,
.navbar-static-top {
margin-left: -20px;
margin-right: -20px;
}
.container-fluid {
padding: 0;
}
.dl-horizontal dt {
float: none;
clear: none;
width: auto;
text-align: left;
}
.dl-horizontal dd {
margin-left: 0;
}
.container {
width: auto;
}
.row-fluid {
width: 100%;
}
.row,
.thumbnails {
margin-left: 0;
}
.thumbnails > li {
float: none;
margin-left: 0;
}
[class*="span"],
.uneditable-input[class*="span"],
.row-fluid [class*="span"] {
float: none;
display: block;
width: 100%;
margin-left: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.span12,
.row-fluid .span12 {
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.row-fluid [class*="offset"]:first-child {
margin-left: 0;
}
.input-large,
.input-xlarge,
.input-xxlarge,
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input {
display: block;
width: 100%;
min-height: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.input-prepend input,
.input-append input,
.input-prepend input[class*="span"],
.input-append input[class*="span"] {
display: inline-block;
width: auto;
}
.controls-row [class*="span"] + [class*="span"] {
margin-left: 0;
}
.modal {
position: fixed;
top: 20px;
left: 20px;
right: 20px;
width: auto;
margin: 0;
}
.modal.fade {
top: -100px;
}
.modal.fade.in {
top: 20px;
}
}
@media (max-width: 480px) {
.nav-collapse {
-webkit-transform: translate3d(0, 0, 0);
}
.page-header h1 small {
display: block;
line-height: 20px;
}
input[type="checkbox"],
input[type="radio"] {
border: 1px solid #ccc;
}
.form-horizontal .control-label {
float: none;
width: auto;
padding-top: 0;
text-align: left;
}
.form-horizontal .controls {
margin-left: 0;
}
.form-horizontal .control-list {
padding-top: 0;
}
.form-horizontal .form-actions {
padding-left: 10px;
padding-right: 10px;
}
.media .pull-left,
.media .pull-right {
float: none;
display: block;
margin-bottom: 10px;
}
.media-object {
margin-right: 0;
margin-left: 0;
}
.modal {
top: 10px;
left: 10px;
right: 10px;
}
.modal-header .close {
padding: 10px;
margin: -10px;
}
.carousel-caption {
position: static;
}
}
@media (min-width: 768px) and (max-width: 979px) {
.row {
margin-left: -20px;
*zoom: 1;
}
.row:before,
.row:after {
display: table;
content: "";
line-height: 0;
}
.row:after {
clear: both;
}
[class*="span"] {
float: left;
min-height: 1px;
margin-left: 20px;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
width: 724px;
}
.span12 {
width: 724px;
}
.span11 {
width: 662px;
}
.span10 {
width: 600px;
}
.span9 {
width: 538px;
}
.span8 {
width: 476px;
}
.span7 {
width: 414px;
}
.span6 {
width: 352px;
}
.span5 {
width: 290px;
}
.span4 {
width: 228px;
}
.span3 {
width: 166px;
}
.span2 {
width: 104px;
}
.span1 {
width: 42px;
}
.offset12 {
margin-left: 764px;
}
.offset11 {
margin-left: 702px;
}
.offset10 {
margin-left: 640px;
}
.offset9 {
margin-left: 578px;
}
.offset8 {
margin-left: 516px;
}
.offset7 {
margin-left: 454px;
}
.offset6 {
margin-left: 392px;
}
.offset5 {
margin-left: 330px;
}
.offset4 {
margin-left: 268px;
}
.offset3 {
margin-left: 206px;
}
.offset2 {
margin-left: 144px;
}
.offset1 {
margin-left: 82px;
}
.row-fluid {
width: 100%;
*zoom: 1;
}
.row-fluid:before,
.row-fluid:after {
display: table;
content: "";
line-height: 0;
}
.row-fluid:after {
clear: both;
}
.row-fluid [class*="span"] {
display: block;
width: 100%;
min-height: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
float: left;
margin-left: 2.7624309392265194%;
*margin-left: 2.709239449864817%;
}
.row-fluid [class*="span"]:first-child {
margin-left: 0;
}
.row-fluid .controls-row [class*="span"] + [class*="span"] {
margin-left: 2.7624309392265194%;
}
.row-fluid .span12 {
width: 100%;
*width: 99.94680851063829%;
}
.row-fluid .span11 {
width: 91.43646408839778%;
*width: 91.38327259903608%;
}
.row-fluid .span10 {
width: 82.87292817679558%;
*width: 82.81973668743387%;
}
.row-fluid .span9 {
width: 74.30939226519337%;
*width: 74.25620077583166%;
}
.row-fluid .span8 {
width: 65.74585635359117%;
*width: 65.69266486422946%;
}
.row-fluid .span7 {
width: 57.18232044198895%;
*width: 57.12912895262725%;
}
.row-fluid .span6 {
width: 48.61878453038674%;
*width: 48.56559304102504%;
}
.row-fluid .span5 {
width: 40.05524861878453%;
*width: 40.00205712942283%;
}
.row-fluid .span4 {
width: 31.491712707182323%;
*width: 31.43852121782062%;
}
.row-fluid .span3 {
width: 22.92817679558011%;
*width: 22.87498530621841%;
}
.row-fluid .span2 {
width: 14.3646408839779%;
*width: 14.311449394616199%;
}
.row-fluid .span1 {
width: 5.801104972375691%;
*width: 5.747913483013988%;
}
.row-fluid .offset12 {
margin-left: 105.52486187845304%;
*margin-left: 105.41847889972962%;
}
.row-fluid .offset12:first-child {
margin-left: 102.76243093922652%;
*margin-left: 102.6560479605031%;
}
.row-fluid .offset11 {
margin-left: 96.96132596685082%;
*margin-left: 96.8549429881274%;
}
.row-fluid .offset11:first-child {
margin-left: 94.1988950276243%;
*margin-left: 94.09251204890089%;
}
.row-fluid .offset10 {
margin-left: 88.39779005524862%;
*margin-left: 88.2914070765252%;
}
.row-fluid .offset10:first-child {
margin-left: 85.6353591160221%;
*margin-left: 85.52897613729868%;
}
.row-fluid .offset9 {
margin-left: 79.8342541436464%;
*margin-left: 79.72787116492299%;
}
.row-fluid .offset9:first-child {
margin-left: 77.07182320441989%;
*margin-left: 76.96544022569647%;
}
.row-fluid .offset8 {
margin-left: 71.2707182320442%;
*margin-left: 71.16433525332079%;
}
.row-fluid .offset8:first-child {
margin-left: 68.50828729281768%;
*margin-left: 68.40190431409427%;
}
.row-fluid .offset7 {
margin-left: 62.70718232044199%;
*margin-left: 62.600799341718584%;
}
.row-fluid .offset7:first-child {
margin-left: 59.94475138121547%;
*margin-left: 59.838368402492065%;
}
.row-fluid .offset6 {
margin-left: 54.14364640883978%;
*margin-left: 54.037263430116376%;
}
.row-fluid .offset6:first-child {
margin-left: 51.38121546961326%;
*margin-left: 51.27483249088986%;
}
.row-fluid .offset5 {
margin-left: 45.58011049723757%;
*margin-left: 45.47372751851417%;
}
.row-fluid .offset5:first-child {
margin-left: 42.81767955801105%;
*margin-left: 42.71129657928765%;
}
.row-fluid .offset4 {
margin-left: 37.01657458563536%;
*margin-left: 36.91019160691196%;
}
.row-fluid .offset4:first-child {
margin-left: 34.25414364640884%;
*margin-left: 34.14776066768544%;
}
.row-fluid .offset3 {
margin-left: 28.45303867403315%;
*margin-left: 28.346655695309746%;
}
.row-fluid .offset3:first-child {
margin-left: 25.69060773480663%;
*margin-left: 25.584224756083227%;
}
.row-fluid .offset2 {
margin-left: 19.88950276243094%;
*margin-left: 19.783119783707537%;
}
.row-fluid .offset2:first-child {
margin-left: 17.12707182320442%;
*margin-left: 17.02068884448102%;
}
.row-fluid .offset1 {
margin-left: 11.32596685082873%;
*margin-left: 11.219583872105325%;
}
.row-fluid .offset1:first-child {
margin-left: 8.56353591160221%;
*margin-left: 8.457152932878806%;
}
input,
textarea,
.uneditable-input {
margin-left: 0;
}
.controls-row [class*="span"] + [class*="span"] {
margin-left: 20px;
}
input.span12,
textarea.span12,
.uneditable-input.span12 {
width: 710px;
}
input.span11,
textarea.span11,
.uneditable-input.span11 {
width: 648px;
}
input.span10,
textarea.span10,
.uneditable-input.span10 {
width: 586px;
}
input.span9,
textarea.span9,
.uneditable-input.span9 {
width: 524px;
}
input.span8,
textarea.span8,
.uneditable-input.span8 {
width: 462px;
}
input.span7,
textarea.span7,
.uneditable-input.span7 {
width: 400px;
}
input.span6,
textarea.span6,
.uneditable-input.span6 {
width: 338px;
}
input.span5,
textarea.span5,
.uneditable-input.span5 {
width: 276px;
}
input.span4,
textarea.span4,
.uneditable-input.span4 {
width: 214px;
}
input.span3,
textarea.span3,
.uneditable-input.span3 {
width: 152px;
}
input.span2,
textarea.span2,
.uneditable-input.span2 {
width: 90px;
}
input.span1,
textarea.span1,
.uneditable-input.span1 {
width: 28px;
}
}
@media (min-width: 1200px) {
.row {
margin-left: -30px;
*zoom: 1;
}
.row:before,
.row:after {
display: table;
content: "";
line-height: 0;
}
.row:after {
clear: both;
}
[class*="span"] {
float: left;
min-height: 1px;
margin-left: 30px;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
width: 1170px;
}
.span12 {
width: 1170px;
}
.span11 {
width: 1070px;
}
.span10 {
width: 970px;
}
.span9 {
width: 870px;
}
.span8 {
width: 770px;
}
.span7 {
width: 670px;
}
.span6 {
width: 570px;
}
.span5 {
width: 470px;
}
.span4 {
width: 370px;
}
.span3 {
width: 270px;
}
.span2 {
width: 170px;
}
.span1 {
width: 70px;
}
.offset12 {
margin-left: 1230px;
}
.offset11 {
margin-left: 1130px;
}
.offset10 {
margin-left: 1030px;
}
.offset9 {
margin-left: 930px;
}
.offset8 {
margin-left: 830px;
}
.offset7 {
margin-left: 730px;
}
.offset6 {
margin-left: 630px;
}
.offset5 {
margin-left: 530px;
}
.offset4 {
margin-left: 430px;
}
.offset3 {
margin-left: 330px;
}
.offset2 {
margin-left: 230px;
}
.offset1 {
margin-left: 130px;
}
.row-fluid {
width: 100%;
*zoom: 1;
}
.row-fluid:before,
.row-fluid:after {
display: table;
content: "";
line-height: 0;
}
.row-fluid:after {
clear: both;
}
.row-fluid [class*="span"] {
display: block;
width: 100%;
min-height: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
float: left;
margin-left: 2.564102564102564%;
*margin-left: 2.5109110747408616%;
}
.row-fluid [class*="span"]:first-child {
margin-left: 0;
}
.row-fluid .controls-row [class*="span"] + [class*="span"] {
margin-left: 2.564102564102564%;
}
.row-fluid .span12 {
width: 100%;
*width: 99.94680851063829%;
}
.row-fluid .span11 {
width: 91.45299145299145%;
*width: 91.39979996362975%;
}
.row-fluid .span10 {
width: 82.90598290598291%;
*width: 82.8527914166212%;
}
.row-fluid .span9 {
width: 74.35897435897436%;
*width: 74.30578286961266%;
}
.row-fluid .span8 {
width: 65.81196581196582%;
*width: 65.75877432260411%;
}
.row-fluid .span7 {
width: 57.26495726495726%;
*width: 57.21176577559556%;
}
.row-fluid .span6 {
width: 48.717948717948715%;
*width: 48.664757228587014%;
}
.row-fluid .span5 {
width: 40.17094017094017%;
*width: 40.11774868157847%;
}
.row-fluid .span4 {
width: 31.623931623931625%;
*width: 31.570740134569924%;
}
.row-fluid .span3 {
width: 23.076923076923077%;
*width: 23.023731587561375%;
}
.row-fluid .span2 {
width: 14.52991452991453%;
*width: 14.476723040552828%;
}
.row-fluid .span1 {
width: 5.982905982905983%;
*width: 5.929714493544281%;
}
.row-fluid .offset12 {
margin-left: 105.12820512820512%;
*margin-left: 105.02182214948171%;
}
.row-fluid .offset12:first-child {
margin-left: 102.56410256410257%;
*margin-left: 102.45771958537915%;
}
.row-fluid .offset11 {
margin-left: 96.58119658119658%;
*margin-left: 96.47481360247316%;
}
.row-fluid .offset11:first-child {
margin-left: 94.01709401709402%;
*margin-left: 93.91071103837061%;
}
.row-fluid .offset10 {
margin-left: 88.03418803418803%;
*margin-left: 87.92780505546462%;
}
.row-fluid .offset10:first-child {
margin-left: 85.47008547008548%;
*margin-left: 85.36370249136206%;
}
.row-fluid .offset9 {
margin-left: 79.48717948717949%;
*margin-left: 79.38079650845607%;
}
.row-fluid .offset9:first-child {
margin-left: 76.92307692307693%;
*margin-left: 76.81669394435352%;
}
.row-fluid .offset8 {
margin-left: 70.94017094017094%;
*margin-left: 70.83378796144753%;
}
.row-fluid .offset8:first-child {
margin-left: 68.37606837606839%;
*margin-left: 68.26968539734497%;
}
.row-fluid .offset7 {
margin-left: 62.393162393162385%;
*margin-left: 62.28677941443899%;
}
.row-fluid .offset7:first-child {
margin-left: 59.82905982905982%;
*margin-left: 59.72267685033642%;
}
.row-fluid .offset6 {
margin-left: 53.84615384615384%;
*margin-left: 53.739770867430444%;
}
.row-fluid .offset6:first-child {
margin-left: 51.28205128205128%;
*margin-left: 51.175668303327875%;
}
.row-fluid .offset5 {
margin-left: 45.299145299145295%;
*margin-left: 45.1927623204219%;
}
.row-fluid .offset5:first-child {
margin-left: 42.73504273504273%;
*margin-left: 42.62865975631933%;
}
.row-fluid .offset4 {
margin-left: 36.75213675213675%;
*margin-left: 36.645753773413354%;
}
.row-fluid .offset4:first-child {
margin-left: 34.18803418803419%;
*margin-left: 34.081651209310785%;
}
.row-fluid .offset3 {
margin-left: 28.205128205128204%;
*margin-left: 28.0987452264048%;
}
.row-fluid .offset3:first-child {
margin-left: 25.641025641025642%;
*margin-left: 25.53464266230224%;
}
.row-fluid .offset2 {
margin-left: 19.65811965811966%;
*margin-left: 19.551736679396257%;
}
.row-fluid .offset2:first-child {
margin-left: 17.094017094017094%;
*margin-left: 16.98763411529369%;
}
.row-fluid .offset1 {
margin-left: 11.11111111111111%;
*margin-left: 11.004728132387708%;
}
.row-fluid .offset1:first-child {
margin-left: 8.547008547008547%;
*margin-left: 8.440625568285142%;
}
input,
textarea,
.uneditable-input {
margin-left: 0;
}
.controls-row [class*="span"] + [class*="span"] {
margin-left: 30px;
}
input.span12,
textarea.span12,
.uneditable-input.span12 {
width: 1156px;
}
input.span11,
textarea.span11,
.uneditable-input.span11 {
width: 1056px;
}
input.span10,
textarea.span10,
.uneditable-input.span10 {
width: 956px;
}
input.span9,
textarea.span9,
.uneditable-input.span9 {
width: 856px;
}
input.span8,
textarea.span8,
.uneditable-input.span8 {
width: 756px;
}
input.span7,
textarea.span7,
.uneditable-input.span7 {
width: 656px;
}
input.span6,
textarea.span6,
.uneditable-input.span6 {
width: 556px;
}
input.span5,
textarea.span5,
.uneditable-input.span5 {
width: 456px;
}
input.span4,
textarea.span4,
.uneditable-input.span4 {
width: 356px;
}
input.span3,
textarea.span3,
.uneditable-input.span3 {
width: 256px;
}
input.span2,
textarea.span2,
.uneditable-input.span2 {
width: 156px;
}
input.span1,
textarea.span1,
.uneditable-input.span1 {
width: 56px;
}
.thumbnails {
margin-left: -30px;
}
.thumbnails > li {
margin-left: 30px;
}
.row-fluid .thumbnails {
margin-left: 0;
}
}
@media (max-width: 979px) {
body {
padding-top: 0;
}
.navbar-fixed-top,
.navbar-fixed-bottom {
position: static;
}
.navbar-fixed-top {
margin-bottom: 20px;
}
.navbar-fixed-bottom {
margin-top: 20px;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding: 5px;
}
.navbar .container {
width: auto;
padding: 0;
}
.navbar .brand {
padding-left: 10px;
padding-right: 10px;
margin: 0 0 0 -5px;
}
.nav-collapse {
clear: both;
}
.nav-collapse .nav {
float: none;
margin: 0 0 10px;
}
.nav-collapse .nav > li {
float: none;
}
.nav-collapse .nav > li > a {
margin-bottom: 2px;
}
.nav-collapse .nav > .divider-vertical {
display: none;
}
.nav-collapse .nav .nav-header {
color: #777777;
text-shadow: none;
}
.nav-collapse .nav > li > a,
.nav-collapse .dropdown-menu a {
padding: 9px 15px;
font-weight: bold;
color: #777777;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.nav-collapse .btn {
padding: 4px 10px 4px;
font-weight: normal;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.nav-collapse .dropdown-menu li + li a {
margin-bottom: 2px;
}
.nav-collapse .nav > li > a:hover,
.nav-collapse .nav > li > a:focus,
.nav-collapse .dropdown-menu a:hover,
.nav-collapse .dropdown-menu a:focus {
background-color: #f2f2f2;
}
.navbar-inverse .nav-collapse .nav > li > a,
.navbar-inverse .nav-collapse .dropdown-menu a {
color: #999999;
}
.navbar-inverse .nav-collapse .nav > li > a:hover,
.navbar-inverse .nav-collapse .nav > li > a:focus,
.navbar-inverse .nav-collapse .dropdown-menu a:hover,
.navbar-inverse .nav-collapse .dropdown-menu a:focus {
background-color: #111111;
}
.nav-collapse.in .btn-group {
margin-top: 5px;
padding: 0;
}
.nav-collapse .dropdown-menu {
position: static;
top: auto;
left: auto;
float: none;
display: none;
max-width: none;
margin: 0 15px;
padding: 0;
background-color: transparent;
border: none;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
.nav-collapse .open > .dropdown-menu {
display: block;
}
.nav-collapse .dropdown-menu:before,
.nav-collapse .dropdown-menu:after {
display: none;
}
.nav-collapse .dropdown-menu .divider {
display: none;
}
.nav-collapse .nav > li > .dropdown-menu:before,
.nav-collapse .nav > li > .dropdown-menu:after {
display: none;
}
.nav-collapse .navbar-form,
.nav-collapse .navbar-search {
float: none;
padding: 10px 15px;
margin: 10px 0;
border-top: 1px solid #f2f2f2;
border-bottom: 1px solid #f2f2f2;
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
}
.navbar-inverse .nav-collapse .navbar-form,
.navbar-inverse .nav-collapse .navbar-search {
border-top-color: #111111;
border-bottom-color: #111111;
}
.navbar .nav-collapse .nav.pull-right {
float: none;
margin-left: 0;
}
.nav-collapse,
.nav-collapse.collapse {
overflow: hidden;
height: 0;
}
.navbar .btn-navbar {
display: block;
}
.navbar-static .navbar-inner {
padding-left: 10px;
padding-right: 10px;
}
}
@media (min-width: 980px) {
.nav-collapse.collapse {
height: auto !important;
overflow: visible !important;
}
}
.doc-title { float: left; display: block; padding: 10px 20px 10px; margin-left: -20px;
font-size: 20px; font-weight: 200; color: #777777; text-shadow: 0 1px 0 #ffffff; }
.doc-info .navbar-text { padding: 0 15px; }
h1 a { color: #333; } h2 a { color: #333; } h3 a { color: #333; }
h4 a { color: #333; } h5 a { color: #333; } h6 a { color: #333; }
h1:hover a { color: #333; } h2:hover a { color: #333; } h3:hover a { color: #333; }
h4:hover a { color: #333; } h5:hover a { color: #333; } h6:hover a { color: #333; }
.toc { margin-top: 10px; }
.toc, .toc ul { padding: 0; }
.toc ul { margin-left: 0; margin-bottom: 20px; list-style: none; }
.toc ul > li > a { display: block; }
.toc ul > li > a:hover,
.toc ul > li > a:focus { text-decoration: none; background-color: #eeeeee; }
.toc ul { margin-bottom: 0; padding-left: 5px;padding-right: 5px;}
.toc ul > li > a, .toc ul > li > a { padding: 3px 15px; }
#TOC { overflow-y: scroll;
top: 0;
bottom: 0;
}
table {
min-width: 100%
}
.video-js {
min-width:100%; max-width:100%;
}
.vjs-fullscreen {
padding-top: 0px
}
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.1);
}
::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, 0.5);
}
</style>
<style type="text/css">@charset "UTF-8";
.video-js .vjs-big-play-button:before, .video-js .vjs-control:before, .video-js .vjs-modal-dialog, .vjs-modal-dialog .vjs-modal-dialog-content {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; }
.video-js .vjs-big-play-button:before, .video-js .vjs-control:before {
text-align: center; }
@font-face {
font-family: VideoJS;
src: url(data:application/vnd.ms-fontobject;base64,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AWHOA4DR/p/OIF1H0yc5ifCWcsh+OmB9hkNoniAMIB8YBhcUPVqX2aSDqu5XPSN1WR8yQnJVSTH+XkZrWwF86dEBYc7O/p8AAAcAAAAABwAEzwAOABcAKgA9AFAAWgBdAAABETYeAgcOAQcGJiMnJjcWNjc2JgcRFAUWNjc+ATcuAScjBh8BHgEXDgEXFjY3PgE3LgEnIwYfAR4BFxQGFxY2Nz4BNy4BJyMGHwEeARcOAQUzPwEVMxEjBgMlFScDHITNlFsIDauCR60IAQGqVGgKCXFjAX4iIQ4jKwECSzAdAQQKJDQCAT5jIiEOIiwBAkswHgEFCiQ0AT9jIiEOIiwBAkswHgEFCiQ0AQE++YPuQeGqzSzSASeOAckC/QUPZr2AisAPBQUDA8MCVUxncwX+lQfCBzUdPJZXfbk+CwkQP6hjcb1MBzUdPJZXfbk+CwkQP6hjcb1MBzUdPJZXfbk+CwkQP6hjcb1SZAFlAwxH/rWD+QEAAAAAABAAxgABAAAAAAABAAcAAAABAAAAAAACAAcABwABAAAAAAADAAcADgABAAAAAAAEAAcAFQABAAAAAAAFAAsAHAABAAAAAAAGAAcAJwABAAAAAAAKACsALgABAAAAAAALABMAWQADAAEECQABAA4AbAADAAEECQACAA4AegADAAEECQADAA4AiAADAAEECQAEAA4AlgADAAEECQAFABYApAADAAEECQAGAA4AugADAAEECQAKAFYAyAADAAEECQALACYBHlZpZGVvSlNSZWd1bGFyVmlkZW9KU1ZpZGVvSlNWZXJzaW9uIDEuMFZpZGVvSlNHZW5lcmF0ZWQgYnkgc3ZnMnR0ZiBmcm9tIEZvbnRlbGxvIHByb2plY3QuaHR0cDovL2ZvbnRlbGxvLmNvbQBWAGkAZABlAG8ASgBTAFIAZQBnAHUAbABhAHIAVgBpAGQAZQBvAEoAUwBWAGkAZABlAG8ASgBTAFYAZQByAHMAaQBvAG4AIAAxAC4AMABWAGkAZABlAG8ASgBTAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AaAB0AHQAcAA6AC8ALwBmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQAAAAIAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgRwbGF5C3BsYXktY2lyY2xlBXBhdXNlC3ZvbHVtZS1tdXRlCnZvbHVtZS1sb3cKdm9sdW1lLW1pZAt2b2x1bWUtaGlnaBBmdWxsc2NyZWVuLWVudGVyD2Z1bGxzY3JlZW4tZXhpdAZzcXVhcmUHc3Bpbm5lcglzdWJ0aXRsZXMIY2FwdGlvbnMIY2hhcHRlcnMFc2hhcmUDY29nBmNpcmNsZQ5jaXJjbGUtb3V0bGluZRNjaXJjbGUtaW5uZXItY2lyY2xlAmhkBmNhbmNlbAZyZXBsYXkIZmFjZWJvb2sFZ3BsdXMIbGlua2VkaW4HdHdpdHRlcgZ0dW1ibHIJcGludGVyZXN0EWF1ZGlvLWRlc2NyaXB0aW9uAAAAAAA=) format("eot"); }
@font-face {
font-family: VideoJS;
src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAA4wAAoAAAAAFfAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWUZFeBGNtYXAAAAE0AAAAOgAAAUriLxC2Z2x5ZgAAAXAAAAnnAAAO5OV/F/5oZWFkAAALWAAAACoAAAA2CsZ2fWhoZWEAAAuEAAAAGAAAACQOogcfaG10eAAAC5wAAAAPAAAAeNIAAABsb2NhAAALrAAAAD4AAAA+MMgtQm1heHAAAAvsAAAAHwAAACABLwB5bmFtZQAADAwAAAElAAACCtXH9aBwb3N0AAANNAAAAPkAAAF5vawAenicY2BkZ2CcwMDKwMFSyPKMgYHhF4RmjmEIZzzHwMDEwMrMgBUEpLmmMDh8ZPwoyw7iLmSHCDOCCADu/Qo9AAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGD7K/v8PUvCREUTzM0DVAwEjG8OIBwCOWgbUAAB4nI1XfVBU1xV/574vlsUlj/14grDs48FuAgaR3X2LEnY3UZSgEkTwAySAgkIwI8bRfFDjTszYCWRMW9lNa4y2meokmq+2k5ia0dpkmknbkWgSSW3GyaaNf0RTx0wxX7A3Pe/tQmIgHXf3vXvvueeee+45v3POXQYY/PCD/CBDGAYkIE2sxg+OXSJmhmH1OaFX6MU5C5PDMCZi5Rg2i+ELGSthwM14NCbgYGSBIZfhFA1H6Zu0OS0NDkMVfg+npdFm+maCvigI0JBIQIMg0BdJGdTj9ylj7nr+b97+Hl8C1+H2xNAvjPqxjIgaKtItICkSnIISeo40QQls4xxjlzgHsnGGvi7BxQiMlSlkPMhfCh67rAUEUQ6CHxW2O7JARCkKnlUQ7UEIyAEQZe4MdDW9xr5OPFuKbubpRxcPDY8da4MOelDfAYJLW+sGKn/Vlmjfv5+NdB4oOfTazJn3tGxZtL9xFNZX7PPRUbjcRg/SMB2EL+gblXn7shbO/WUbF9u/H5XQ9eKO8iMMr9tY35qYoRi20wGuXV/CHaGDk2fdgHwCk5HUXQpCcgHfBV2NjV3jkq4PHTSUSBwuOQALvxPAps6fiftk6P6yJpcm5bB4dFkgoh195mbiSTnkL3jupq7jh4ZZdvjQRVB4PPx3SsVTu5D/6kd85RU66ttXAeuuXYN1E/Y2sMMzZkZiZNRZlRS/ynr9Xr8Cql2RVNbutXslYo7B9ngsFqcDbCQO22PxeIxcpgMxkh6PjUdwkvw6hvRpZeoCFKshDQzJVr++DWyLx+hAXJcGp3TJMV1ME45xCNvHLsWRrpOZSduOoG0zERuIIwuIkhNkBREglQKLiODD45FQE0BTiE214xE2wp8zOt9NjH3GRtDMk7Ehoq2tzCzGxdyMEQJuD0qGIrQ58ApoWQE3D2h1h6zwuB14wYFIDAA5CZ11jT+92gFZ7B7/p7+hV8jFxBl4aG03wLiVXtBbCylLfIJzkPUAvWAw0yvsVdKdBbC6nnruP/RFkHqWJLZ2Auxdtgy+6qTf7l1WswTJcJ6mGVxwXj92UtfU2WXUNX+qBUCxK6D4FR4f/cufG1sZbiSkMcwdMdoxBxTTEXIp4SCXMNhHoFjvTTFP4vkoPReNRmPRCTwa+3qY0DR7qn7Vjh612wRRTaI04HWCnZ+gIzvS/ZJP0+mynphCui4hzmG0id6+aLSv2BV3FQMYDTHrlGQ/SZ+q4ZdF8aLa5Ar8GW3tVNKEj13cF0buMaesx1i9CL/Uo1tM0h+74o9HjQ+UcPaxy8mH9ccwK8KpKA3rHdIUjTKpfIBxuokpxUGBIILm84ATvHh8tAIe2iZj8KvYwUOXawHMVNgxZvlwSa0z8Zkokkxn3ey2nYTsbMO3mPh8cji7zklsPLD9a9f2s2w/uSt/FgSytWzw5bmS3PielU1P56aGrlz6NzlnbT8h/Wtb+1OxIqxBbC9g7kINUbtAEDxsKWSCe46eltCPmaiUxy2IrODIB8EmixaQrU4IAQ6THg6BFpAdWsCquT16DkL9ccIC/FGeP5AuiDExe8bx+QtzWVsmHcm0kdzqecdn5IhRkTc/zfNPm3ns5sw4Pq86l9gyofh6jkTF5iFChjYbbzZQWFvYb8qZAWyGiV9ya+5bFgnzpuWt3FuX8KYMmsiYZepPseBgGhZcOMt0+4Q8fDOTftJjHIuhdaLsFXFM9AclTi9jbGRq8ZvIOykZei77kfo53eoppVPovbGiyV63p/p/dkWETTjmhjTIm8RP284b04bcNYlRsvO6Gp2JeaiIueVHsgJGF2aASlCQLuG8EsBomzb++/AXmwhaOoLhL7iQ4/uc449gWJ56/XWDARn74v/PL1bRBB4TBEyYrqezSkUPHaWjPWCm13ogAzJ66LVpbTEuXccDZlyXxBQ/IrzKOPS7gAkkIyZ0N6joE6M246aDsO1kgucTJ/EdFWA5pbAcTfoSP4hJeBCni7nEn5IclL4kpDgmMMuH8Kpk0+WrBUIeKCyWS0nPVz7NW86Hnl55GxR5KB3+9tszL+wVRulXNTUn6D8SJvIl3PzP46eZST/tQTllTDXTzmxCaTYna7eJAqcWuD1ulBXQsMz5fQEBCfowCF5FVDF/2yysB9OW5veVEtRAFOy41FoeJEiAOZhDiFstsKAwJ8Hijs72q1jWvWx+uKU5XFZDLx189OK8ojW1u0By5dtLHUN/rwkte68PnhnYVbt0bvWiub9w1+f4C0L3hIuXZ8+xlVSt0eb3tgQsmVZnem5R3U0uf/fmFdqiLTvY3nPnet5/v4f9pLB6QX2krnnFQ1tXtN+2ePlAaUNWcfiWwrncn4ca9ml3hFeHHm+u2bq4MhxUZs3bMH/3jgaPUtlVunFjg2/8yRzf3cHsssKZqlnOqyCWworWykW9lXnspk0ffrjpfCreIpjPWbwnFxt3PAkcQgkUuH1auUMf+txJQ0hK1k1zsNaqQdaLMxfoq9AGGxtJQ+fGw53cE/TY8pWhJruZHiMAcCexFS/eGDp6hntiXGE/gvI7163b29ExfiHxNsnqub/a6/QmPoAn4GpZ2c9cZRX5/57IWUNYuubiQBAddhuxAKe6PA5vuV5dkk0VXkMM3zk42W3Awrgka8LQgjZY+tQIffd5+vnHasnHL/cczldyS4r79i6su6Nu9oPQ8lbaid2Pt9/bXtTTynevq7bkPkITV47d+3NugOzo4M3y77Zxbnb2nhWrl0T/kO4u3H1ig33e1lD6JDYjiKkCHOioF0pZv6T6gxxipxLNhFc8xERA48vq5ZfXdL/QV6c8W3PfwjIsZyI3Csvo72e4FpTVwTv/UYNAKtY+8MB84vogZ1Xr5lW38iJdPZ74xunzO4Gk7BARIkytjlyCoPVoIb3IluMfAYRhEoAO2aGXKc2TNAJaSwdzQEeq7jC7TWYF2Y2jrEIXlyVEhunBs5t7K62a7Z6qB0923/+vPT2v7mwpqV/mTEsTiCB5zz735HOP9VbVWtKKZK08uDJ7vcQN02HogGegY5iNnKUHh12ti9/zzHvsauy+tx+e375j94LuA64MV/5MQbZVNT95/re7jlxZVaVuW5Nffsd9TXfOpXcv6m2Bn3x6FgXg/oz+P0h/ce8g2mTEWxVTzzQzrTruNCcRdbu6VY87gLVXc4uSjXfosak7XxWM4oyl+ockmzCFhJXaGwK8e6sCW2T3sLmPnh5qSZtx9JHFL6QBHGnsTjdtWQ8PFygWtQTIkrI84NILfQSC65FUMFsnOYFHEoSmUCD49a4rt3985PTsd8GzB/5KEnzmhhORgVOZPM+yb5KmpRu38jQqviH6826Lrdrxx6DZdFPo2fVbTiy9AUpDJ3SxGYvpK7u+Rhz8D4BCxssAeJxjYGRgYABiwcIjbvH8Nl8ZuNkZQOBSiOgBZJqdASzOwcAEogDqtAdOAAB4nGNgZGBgZwCChWASxGZkQAVyABOTANd4nGNnYGBgHwAMADNUANMAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IAAHicY2BkYGCQY8hlYGcAASYg5gJCBob/YD4DABa6AakAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2P2XLCMAxFfYE4CWlZSveFP8hHOY4gHhw79VLav68hMNOH6kG60mg5YhM22pr9b1vGMMEUM2TgyFGgxBwVbnCLBZZYYY07bHCPBzziCc94wSve8I4PbGeDFj/VydVSOakpG0T0VH1ZHXuq+xhoftHaHq+yV+21o1P7brWLWnvpiExNJpBb/i18q8D9ZxSOcj8oY8iVPjZBBU2+kGIIypokuqTI+cx3qXMq7Z6PQIsx1DYGrQxtLul50YV50rVcCiNJc0enX4qdkNRYe8j2g46+SIMHapXJw1GFdIWH2DfalQknZeTDWsRW2bqlBK3ORIz9AqJUapQAAAA=) format("woff"), url(data:application/x-font-ttf;charset=utf-8;base64,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ATcuAScjBh8BHgEXDgEFMz8BFTMRIwYDJRUnAxyEzZRbCA2rgketCAEBqlRoCglxYwF+IiEOIysBAkswHQEECiQ0AgE+YyIhDiIsAQJLMB4BBQokNAE/YyIhDiIsAQJLMB4BBQokNAEBPvmD7kHhqs0s0gEnjgHJAv0FD2a9gIrADwUFAwPDAlVMZ3MF/pUHwgc1HTyWV325PgsJED+oY3G9TAc1HTyWV325PgsJED+oY3G9TAc1HTyWV325PgsJED+oY3G9UmQBZQMMR/61g/kBAAAAAAAQAMYAAQAAAAAAAQAHAAAAAQAAAAAAAgAHAAcAAQAAAAAAAwAHAA4AAQAAAAAABAAHABUAAQAAAAAABQALABwAAQAAAAAABgAHACcAAQAAAAAACgArAC4AAQAAAAAACwATAFkAAwABBAkAAQAOAGwAAwABBAkAAgAOAHoAAwABBAkAAwAOAIgAAwABBAkABAAOAJYAAwABBAkABQAWAKQAAwABBAkABgAOALoAAwABBAkACgBWAMgAAwABBAkACwAmAR5WaWRlb0pTUmVndWxhclZpZGVvSlNWaWRlb0pTVmVyc2lvbiAxLjBWaWRlb0pTR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AVgBpAGQAZQBvAEoAUwBSAGUAZwB1AGwAYQByAFYAaQBkAGUAbwBKAFMAVgBpAGQAZQBvAEoAUwBWAGUAcgBzAGkAbwBuACAAMQAuADAAVgBpAGQAZQBvAEoAUwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAACAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4EcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgAAAAAA) format("truetype");
font-weight: normal;
font-style: normal; }
.vjs-icon-play, .video-js .vjs-big-play-button, .video-js .vjs-play-control {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-play:before, .video-js .vjs-big-play-button:before, .video-js .vjs-play-control:before {
content: ""; }
.vjs-icon-play-circle {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-play-circle:before {
content: ""; }
.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing:before {
content: ""; }
.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0,
.video-js .vjs-volume-menu-button.vjs-vol-0 {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0:before,
.video-js .vjs-volume-menu-button.vjs-vol-0:before {
content: ""; }
.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1,
.video-js .vjs-volume-menu-button.vjs-vol-1 {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1:before,
.video-js .vjs-volume-menu-button.vjs-vol-1:before {
content: ""; }
.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2,
.video-js .vjs-volume-menu-button.vjs-vol-2 {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2:before,
.video-js .vjs-volume-menu-button.vjs-vol-2:before {
content: ""; }
.vjs-icon-volume-high, .video-js .vjs-mute-control,
.video-js .vjs-volume-menu-button {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-volume-high:before, .video-js .vjs-mute-control:before,
.video-js .vjs-volume-menu-button:before {
content: ""; }
.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control:before {
content: ""; }
.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control:before {
content: ""; }
.vjs-icon-square {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-square:before {
content: ""; }
.vjs-icon-spinner {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-spinner:before {
content: ""; }
.vjs-icon-subtitles, .video-js .vjs-subtitles-button {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-subtitles:before, .video-js .vjs-subtitles-button:before {
content: ""; }
.vjs-icon-captions, .video-js .vjs-captions-button {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-captions:before, .video-js .vjs-captions-button:before {
content: ""; }
.vjs-icon-chapters, .video-js .vjs-chapters-button {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-chapters:before, .video-js .vjs-chapters-button:before {
content: ""; }
.vjs-icon-share {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-share:before {
content: ""; }
.vjs-icon-cog {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-cog:before {
content: ""; }
.vjs-icon-circle, .video-js .vjs-mouse-display, .video-js .vjs-play-progress, .video-js .vjs-volume-level {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-circle:before, .video-js .vjs-mouse-display:before, .video-js .vjs-play-progress:before, .video-js .vjs-volume-level:before {
content: ""; }
.vjs-icon-circle-outline {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-circle-outline:before {
content: ""; }
.vjs-icon-circle-inner-circle {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-circle-inner-circle:before {
content: ""; }
.vjs-icon-hd {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-hd:before {
content: ""; }
.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button:before {
content: ""; }
.vjs-icon-replay {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-replay:before {
content: ""; }
.vjs-icon-facebook {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-facebook:before {
content: ""; }
.vjs-icon-gplus {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-gplus:before {
content: ""; }
.vjs-icon-linkedin {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-linkedin:before {
content: ""; }
.vjs-icon-twitter {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-twitter:before {
content: ""; }
.vjs-icon-tumblr {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-tumblr:before {
content: ""; }
.vjs-icon-pinterest {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-pinterest:before {
content: ""; }
.vjs-icon-audio-description {
font-family: VideoJS;
font-weight: normal;
font-style: normal; }
.vjs-icon-audio-description:before {
content: ""; }
.video-js {
display: block;
vertical-align: top;
box-sizing: border-box;
color: #fff;
background-color: #000;
position: relative;
padding: 0;
font-size: 10px;
line-height: 1;
font-weight: normal;
font-style: normal;
font-family: Arial, Helvetica, sans-serif;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.video-js:-moz-full-screen {
position: absolute; }
.video-js:-webkit-full-screen {
width: 100% !important;
height: 100% !important; }
.video-js *,
.video-js *:before,
.video-js *:after {
box-sizing: inherit; }
.video-js ul {
font-family: inherit;
font-size: inherit;
line-height: inherit;
list-style-position: outside;
margin-left: 0;
margin-right: 0;
margin-top: 0;
margin-bottom: 0; }
.video-js.vjs-fluid,
.video-js.vjs-16-9,
.video-js.vjs-4-3 {
width: 100%;
max-width: 100%;
height: 0; }
.video-js.vjs-16-9 {
padding-top: 56.25%; }
.video-js.vjs-4-3 {
padding-top: 75%; }
.video-js.vjs-fill {
width: 100%;
height: 100%; }
.video-js .vjs-tech {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; }
body.vjs-full-window {
padding: 0;
margin: 0;
height: 100%;
overflow-y: auto; }
.vjs-full-window .video-js.vjs-fullscreen {
position: fixed;
overflow: hidden;
z-index: 1000;
left: 0;
top: 0;
bottom: 0;
right: 0; }
.video-js.vjs-fullscreen {
width: 100% !important;
height: 100% !important;
padding-top: 0 !important; }
.video-js.vjs-fullscreen.vjs-user-inactive {
cursor: none; }
.vjs-hidden {
display: none !important; }
.video-js .vjs-offscreen {
height: 1px;
left: -9999px;
position: absolute;
top: 0;
width: 1px; }
.vjs-lock-showing {
display: block !important;
opacity: 1;
visibility: visible; }
.vjs-no-js {
padding: 20px;
color: #fff;
background-color: #000;
font-size: 18px;
font-family: Arial, Helvetica, sans-serif;
text-align: center;
width: 300px;
height: 150px;
margin: 0px auto; }
.vjs-no-js a,
.vjs-no-js a:visited {
color: #66A8CC; }
.video-js .vjs-big-play-button {
font-size: 3em;
line-height: 1.5em;
height: 1.5em;
width: 3em;
display: block;
position: absolute;
top: 10px;
left: 10px;
padding: 0;
cursor: pointer;
opacity: 1;
border: 0.06666em solid #fff;
background-color: #2B333F;
background-color: rgba(43, 51, 63, 0.7);
-webkit-border-radius: 0.3em;
-moz-border-radius: 0.3em;
border-radius: 0.3em;
-webkit-transition: all 0.4s;
-moz-transition: all 0.4s;
-o-transition: all 0.4s;
transition: all 0.4s; }
.vjs-big-play-centered .vjs-big-play-button {
top: 50%;
left: 50%;
margin-top: -0.75em;
margin-left: -1.5em; }
.video-js:hover .vjs-big-play-button,
.video-js .vjs-big-play-button:focus {
outline: 0;
border-color: #fff;
background-color: #73859f;
background-color: rgba(115, 133, 159, 0.5);
-webkit-transition: all 0s;
-moz-transition: all 0s;
-o-transition: all 0s;
transition: all 0s; }
.vjs-controls-disabled .vjs-big-play-button,
.vjs-has-started .vjs-big-play-button,
.vjs-using-native-controls .vjs-big-play-button,
.vjs-error .vjs-big-play-button {
display: none; }
.video-js button {
background: none;
border: none;
color: inherit;
display: inline-block;
overflow: visible;
font-size: inherit;
line-height: inherit;
text-transform: none;
text-decoration: none;
transition: none;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none; }
.video-js .vjs-control.vjs-close-button {
cursor: pointer;
height: 3em;
position: absolute;
right: 0;
top: 0.5em;
z-index: 2; }
.vjs-menu-button {
cursor: pointer; }
.vjs-menu .vjs-menu-content {
display: block;
padding: 0;
margin: 0;
overflow: auto; }
.vjs-scrubbing .vjs-menu-button:hover .vjs-menu {
display: none; }
.vjs-menu li {
list-style: none;
margin: 0;
padding: 0.2em 0;
line-height: 1.4em;
font-size: 1.2em;
text-align: center;
text-transform: lowercase; }
.vjs-menu li:focus,
.vjs-menu li:hover {
outline: 0;
background-color: #73859f;
background-color: rgba(115, 133, 159, 0.5); }
.vjs-menu li.vjs-selected,
.vjs-menu li.vjs-selected:focus,
.vjs-menu li.vjs-selected:hover {
background-color: #fff;
color: #2B333F; }
.vjs-menu li.vjs-menu-title {
text-align: center;
text-transform: uppercase;
font-size: 1em;
line-height: 2em;
padding: 0;
margin: 0 0 0.3em 0;
font-weight: bold;
cursor: default; }
.vjs-menu-button-popup .vjs-menu {
display: none;
position: absolute;
bottom: 0;
width: 10em;
left: -3em;
height: 0em;
margin-bottom: 1.5em;
border-top-color: rgba(43, 51, 63, 0.7); }
.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
background-color: #2B333F;
background-color: rgba(43, 51, 63, 0.7);
position: absolute;
width: 100%;
bottom: 1.5em;
max-height: 15em; }
.vjs-menu-button-popup:hover .vjs-menu,
.vjs-menu-button-popup .vjs-menu.vjs-lock-showing {
display: block; }
.video-js .vjs-menu-button-inline {
-webkit-transition: all 0.4s;
-moz-transition: all 0.4s;
-o-transition: all 0.4s;
transition: all 0.4s;
overflow: hidden; }
.video-js .vjs-menu-button-inline:before {
width: 2.222222222em; }
.video-js .vjs-menu-button-inline:hover,
.video-js .vjs-menu-button-inline:focus,
.video-js .vjs-menu-button-inline.vjs-slider-active,
.video-js.vjs-no-flex .vjs-menu-button-inline {
width: 12em; }
.video-js .vjs-menu-button-inline.vjs-slider-active {
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
transition: none; }
.vjs-menu-button-inline .vjs-menu {
opacity: 0;
height: 100%;
width: auto;
position: absolute;
left: 2.2222222em;
top: 0;
padding: 0;
margin: 0;
-webkit-transition: all 0.4s;
-moz-transition: all 0.4s;
-o-transition: all 0.4s;
transition: all 0.4s; }
.vjs-menu-button-inline:hover .vjs-menu,
.vjs-menu-button-inline:focus .vjs-menu,
.vjs-menu-button-inline.vjs-slider-active .vjs-menu {
display: block;
opacity: 1; }
.vjs-no-flex .vjs-menu-button-inline .vjs-menu {
display: block;
opacity: 1;
position: relative;
width: auto; }
.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu,
.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,
.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu {
width: auto; }
.vjs-menu-button-inline .vjs-menu-content {
width: auto;
height: 100%;
margin: 0;
overflow: hidden; }
.video-js .vjs-control-bar {
display: none;
width: 100%;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 3.0em;
background-color: #2B333F;
background-color: rgba(43, 51, 63, 0.7); }
.vjs-has-started .vjs-control-bar {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
visibility: visible;
opacity: 1;
-webkit-transition: visibility 0.1s, opacity 0.1s;
-moz-transition: visibility 0.1s, opacity 0.1s;
-o-transition: visibility 0.1s, opacity 0.1s;
transition: visibility 0.1s, opacity 0.1s; }
.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
visibility: hidden;
opacity: 0;
-webkit-transition: visibility 1s, opacity 1s;
-moz-transition: visibility 1s, opacity 1s;
-o-transition: visibility 1s, opacity 1s;
transition: visibility 1s, opacity 1s; }
.vjs-controls-disabled .vjs-control-bar,
.vjs-using-native-controls .vjs-control-bar,
.vjs-error .vjs-control-bar {
display: none !important; }
.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
opacity: 1;
visibility: visible; }
@media <20>screen {
.vjs-user-inactive.vjs-playing .vjs-control-bar :before {
content: ""; } }
.vjs-has-started.vjs-no-flex .vjs-control-bar {
display: table; }
.video-js .vjs-control {
outline: none;
position: relative;
text-align: center;
margin: 0;
padding: 0;
height: 100%;
width: 4em;
-webkit-box-flex: none;
-moz-box-flex: none;
-webkit-flex: none;
-ms-flex: none;
flex: none; }
.video-js .vjs-control:before {
font-size: 1.8em;
line-height: 1.67; }
.video-js .vjs-control:focus:before,
.video-js .vjs-control:hover:before,
.video-js .vjs-control:focus {
text-shadow: 0em 0em 1em white; }
.video-js .vjs-control-text {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px; }
.vjs-no-flex .vjs-control {
display: table-cell;
vertical-align: middle; }
.video-js .vjs-custom-control-spacer {
display: none; }
.video-js .vjs-progress-control {
-webkit-box-flex: auto;
-moz-box-flex: auto;
-webkit-flex: auto;
-ms-flex: auto;
flex: auto;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center; }
.vjs-live .vjs-progress-control {
display: none; }
.video-js .vjs-progress-holder {
-webkit-box-flex: auto;
-moz-box-flex: auto;
-webkit-flex: auto;
-ms-flex: auto;
flex: auto;
-webkit-transition: all 0.2s;
-moz-transition: all 0.2s;
-o-transition: all 0.2s;
transition: all 0.2s;
height: 0.3em; }
.video-js .vjs-progress-control:hover .vjs-progress-holder {
font-size: 1.666666666666666666em; }
.video-js .vjs-progress-control:hover .vjs-mouse-display:after,
.video-js .vjs-progress-control:hover .vjs-play-progress:after {
display: block;
font-size: 0.6em; }
.video-js .vjs-progress-holder .vjs-play-progress,
.video-js .vjs-progress-holder .vjs-load-progress,
.video-js .vjs-progress-holder .vjs-load-progress div {
position: absolute;
display: block;
height: 0.3em;
margin: 0;
padding: 0;
width: 0;
left: 0;
top: 0; }
.video-js .vjs-mouse-display:before {
display: none; }
.video-js .vjs-play-progress {
background-color: #fff; }
.video-js .vjs-play-progress:before {
position: absolute;
top: -0.333333333333333em;
right: -0.5em;
font-size: 0.9em; }
.video-js .vjs-mouse-display:after,
.video-js .vjs-play-progress:after {
display: none;
position: absolute;
top: -2.4em;
right: -1.5em;
font-size: 0.9em;
color: #000;
content: attr(data-current-time);
padding: 0.2em 0.5em;
background-color: #fff;
background-color: rgba(255, 255, 255, 0.8);
-webkit-border-radius: 0.3em;
-moz-border-radius: 0.3em;
border-radius: 0.3em; }
.video-js .vjs-play-progress:before,
.video-js .vjs-play-progress:after {
z-index: 1; }
.video-js .vjs-load-progress {
background: ligthen(#73859f, 25%);
background: rgba(115, 133, 159, 0.5); }
.video-js .vjs-load-progress div {
background: ligthen(#73859f, 50%);
background: rgba(115, 133, 159, 0.75); }
.video-js.vjs-no-flex .vjs-progress-control {
width: auto; }
.video-js .vjs-progress-control .vjs-mouse-display {
display: none;
position: absolute;
width: 1px;
height: 100%;
background-color: #000;
z-index: 1; }
.vjs-no-flex .vjs-progress-control .vjs-mouse-display {
z-index: 0; }
.video-js .vjs-progress-control:hover .vjs-mouse-display {
display: block; }
.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,
.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display:after {
visibility: hidden;
opacity: 0;
-webkit-transition: visibility 1s, opacity 1s;
-moz-transition: visibility 1s, opacity 1s;
-o-transition: visibility 1s, opacity 1s;
transition: visibility 1s, opacity 1s; }
.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display,
.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after {
display: none; }
.video-js .vjs-progress-control .vjs-mouse-display:after {
color: #fff;
background-color: #000;
background-color: rgba(0, 0, 0, 0.8); }
.video-js .vjs-slider {
outline: 0;
position: relative;
cursor: pointer;
padding: 0;
margin: 0 0.45em 0 0.45em;
background-color: #73859f;
background-color: rgba(115, 133, 159, 0.5); }
.video-js .vjs-slider:focus {
text-shadow: 0em 0em 1em white;
-webkit-box-shadow: 0 0 1em #fff;
-moz-box-shadow: 0 0 1em #fff;
box-shadow: 0 0 1em #fff; }
.video-js .vjs-mute-control,
.video-js .vjs-volume-menu-button {
cursor: pointer;
-webkit-box-flex: none;
-moz-box-flex: none;
-webkit-flex: none;
-ms-flex: none;
flex: none; }
.video-js .vjs-volume-control {
width: 5em;
-webkit-box-flex: none;
-moz-box-flex: none;
-webkit-flex: none;
-ms-flex: none;
flex: none;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center; }
.video-js .vjs-volume-bar {
margin: 1.35em; }
.vjs-volume-bar.vjs-slider-horizontal {
width: 5em;
height: 0.3em; }
.vjs-volume-bar.vjs-slider-vertical {
width: 0.3em;
height: 5em; }
.video-js .vjs-volume-level {
position: absolute;
bottom: 0;
left: 0;
background-color: #fff; }
.video-js .vjs-volume-level:before {
position: absolute;
font-size: 0.9em; }
.vjs-slider-vertical .vjs-volume-level {
width: 0.3em; }
.vjs-slider-vertical .vjs-volume-level:before {
top: -0.5em;
left: -0.3em; }
.vjs-slider-horizontal .vjs-volume-level {
height: 0.3em; }
.vjs-slider-horizontal .vjs-volume-level:before {
top: -0.3em;
right: -0.5em; }
.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {
height: 100%; }
.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {
width: 100%; }
.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu {
display: block;
width: 0;
height: 0;
border-top-color: transparent; }
.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu {
left: 0.5em;
height: 8em; }
.vjs-menu-button-popup.vjs-volume-menu-button-horizontal .vjs-menu {
left: -2em; }
.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu-content {
height: 0;
width: 0;
overflow-x: hidden;
overflow-y: hidden; }
.vjs-volume-menu-button-vertical:hover .vjs-menu-content,
.vjs-volume-menu-button-vertical .vjs-lock-showing .vjs-menu-content {
height: 8em;
width: 2.9em; }
.vjs-volume-menu-button-horizontal:hover .vjs-menu-content,
.vjs-volume-menu-button-horizontal .vjs-lock-showing .vjs-menu-content {
height: 2.9em;
width: 8em; }
.vjs-volume-menu-button.vjs-menu-button-inline .vjs-menu-content {
background-color: transparent !important; }
.vjs-poster {
display: inline-block;
vertical-align: middle;
background-repeat: no-repeat;
background-position: 50% 50%;
background-size: contain;
cursor: pointer;
margin: 0;
padding: 0;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
height: 100%; }
.vjs-poster img {
display: block;
vertical-align: middle;
margin: 0 auto;
max-height: 100%;
padding: 0;
width: 100%; }
.vjs-has-started .vjs-poster {
display: none; }
.vjs-audio.vjs-has-started .vjs-poster {
display: block; }
.vjs-controls-disabled .vjs-poster {
display: none; }
.vjs-using-native-controls .vjs-poster {
display: none; }
.video-js .vjs-live-control {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: flex-start;
-webkit-align-items: flex-start;
-ms-flex-align: flex-start;
align-items: flex-start;
-webkit-box-flex: auto;
-moz-box-flex: auto;
-webkit-flex: auto;
-ms-flex: auto;
flex: auto;
font-size: 1em;
line-height: 3em; }
.vjs-no-flex .vjs-live-control {
display: table-cell;
width: auto;
text-align: left; }
.video-js .vjs-time-control {
-webkit-box-flex: none;
-moz-box-flex: none;
-webkit-flex: none;
-ms-flex: none;
flex: none;
font-size: 1em;
line-height: 3em; }
.vjs-live .vjs-time-control {
display: none; }
.video-js .vjs-current-time,
.vjs-no-flex .vjs-current-time {
display: none; }
.video-js .vjs-duration,
.vjs-no-flex .vjs-duration {
display: none; }
.vjs-time-divider {
display: none;
line-height: 3em; }
.vjs-live .vjs-time-divider {
display: none; }
.video-js .vjs-play-control {
cursor: pointer;
-webkit-box-flex: none;
-moz-box-flex: none;
-webkit-flex: none;
-ms-flex: none;
flex: none; }
.vjs-text-track-display {
position: absolute;
bottom: 3em;
left: 0;
right: 0;
top: 0;
pointer-events: none; }
.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {
bottom: 1em; }
.video-js .vjs-text-track {
font-size: 1.4em;
text-align: center;
margin-bottom: 0.1em;
background-color: #000;
background-color: rgba(0, 0, 0, 0.5); }
.vjs-subtitles {
color: #fff; }
.vjs-captions {
color: #fc6; }
.vjs-tt-cue {
display: block; }
video::-webkit-media-text-track-display {
-moz-transform: translateY(-3em);
-ms-transform: translateY(-3em);
-o-transform: translateY(-3em);
-webkit-transform: translateY(-3em);
transform: translateY(-3em); }
.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display {
-moz-transform: translateY(-1.5em);
-ms-transform: translateY(-1.5em);
-o-transform: translateY(-1.5em);
-webkit-transform: translateY(-1.5em);
transform: translateY(-1.5em); }
.video-js .vjs-fullscreen-control {
width: 3.8em;
cursor: pointer;
-webkit-box-flex: none;
-moz-box-flex: none;
-webkit-flex: none;
-ms-flex: none;
flex: none; }
.vjs-playback-rate .vjs-playback-rate-value {
font-size: 1.5em;
line-height: 2;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
text-align: center; }
.vjs-playback-rate .vjs-menu {
width: 4em;
left: 0em; }
.vjs-error .vjs-error-display .vjs-modal-dialog-content {
font-size: 1.4em;
text-align: center; }
.vjs-error .vjs-error-display:before {
color: #fff;
content: 'X';
font-family: Arial, Helvetica, sans-serif;
font-size: 4em;
left: 0;
line-height: 1;
margin-top: -0.5em;
position: absolute;
text-shadow: 0.05em 0.05em 0.1em #000;
text-align: center;
top: 50%;
vertical-align: middle;
width: 100%; }
.vjs-loading-spinner {
display: none;
position: absolute;
top: 50%;
left: 50%;
margin: -25px 0 0 -25px;
opacity: 0.85;
text-align: left;
border: 6px solid rgba(43, 51, 63, 0.7);
box-sizing: border-box;
background-clip: padding-box;
width: 50px;
height: 50px;
border-radius: 25px; }
.vjs-seeking .vjs-loading-spinner,
.vjs-waiting .vjs-loading-spinner {
display: block; }
.vjs-loading-spinner:before,
.vjs-loading-spinner:after {
content: "";
position: absolute;
margin: -6px;
box-sizing: inherit;
width: inherit;
height: inherit;
border-radius: inherit;
opacity: 1;
border: inherit;
border-color: transparent;
border-top-color: white; }
.vjs-seeking .vjs-loading-spinner:before,
.vjs-seeking .vjs-loading-spinner:after,
.vjs-waiting .vjs-loading-spinner:before,
.vjs-waiting .vjs-loading-spinner:after {
-webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;
animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite; }
.vjs-seeking .vjs-loading-spinner:before,
.vjs-waiting .vjs-loading-spinner:before {
border-top-color: white; }
.vjs-seeking .vjs-loading-spinner:after,
.vjs-waiting .vjs-loading-spinner:after {
border-top-color: white;
-webkit-animation-delay: 0.44s;
animation-delay: 0.44s; }
@keyframes vjs-spinner-spin {
100% {
transform: rotate(360deg); } }
@-webkit-keyframes vjs-spinner-spin {
100% {
-webkit-transform: rotate(360deg); } }
@keyframes vjs-spinner-fade {
0% {
border-top-color: #73859f; }
20% {
border-top-color: #73859f; }
35% {
border-top-color: white; }
60% {
border-top-color: #73859f; }
100% {
border-top-color: #73859f; } }
@-webkit-keyframes vjs-spinner-fade {
0% {
border-top-color: #73859f; }
20% {
border-top-color: #73859f; }
35% {
border-top-color: white; }
60% {
border-top-color: #73859f; }
100% {
border-top-color: #73859f; } }
.vjs-chapters-button .vjs-menu {
left: -10em;
width: 0; }
.vjs-chapters-button .vjs-menu ul {
width: 24em; }
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer {
-webkit-box-flex: auto;
-moz-box-flex: auto;
-webkit-flex: auto;
-ms-flex: auto;
flex: auto; }
.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer {
width: auto; }
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider,
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate,
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,
.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-menu-button {
display: none; }
.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider,
.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,
.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button,
.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-fullscreen-control {
display: none; }
.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider,
.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate,
.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button,
.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button {
display: none; }
.vjs-caption-settings {
position: relative;
top: 1em;
background-color: #2B333F;
background-color: rgba(43, 51, 63, 0.75);
color: #fff;
margin: 0 auto;
padding: 0.5em;
height: 15em;
font-size: 12px;
width: 40em; }
.vjs-caption-settings .vjs-tracksettings {
top: 0;
bottom: 2em;
left: 0;
right: 0;
position: absolute;
overflow: auto; }
.vjs-caption-settings .vjs-tracksettings-colors,
.vjs-caption-settings .vjs-tracksettings-font {
float: left; }
.vjs-caption-settings .vjs-tracksettings-colors:after,
.vjs-caption-settings .vjs-tracksettings-font:after,
.vjs-caption-settings .vjs-tracksettings-controls:after {
clear: both; }
.vjs-caption-settings .vjs-tracksettings-controls {
position: absolute;
bottom: 1em;
right: 1em; }
.vjs-caption-settings .vjs-tracksetting {
margin: 5px;
padding: 3px;
min-height: 40px; }
.vjs-caption-settings .vjs-tracksetting label {
display: block;
width: 100px;
margin-bottom: 5px; }
.vjs-caption-settings .vjs-tracksetting span {
display: inline;
margin-left: 5px; }
.vjs-caption-settings .vjs-tracksetting > div {
margin-bottom: 5px;
min-height: 20px; }
.vjs-caption-settings .vjs-tracksetting > div:last-child {
margin-bottom: 0;
padding-bottom: 0;
min-height: 0; }
.vjs-caption-settings label > input {
margin-right: 10px; }
.vjs-caption-settings input[type="button"] {
width: 40px;
height: 40px; }
.video-js .vjs-modal-dialog {
background: rgba(0, 0, 0, 0.8);
background: -webkit-linear-gradient(-90deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));
background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0)); }
.vjs-modal-dialog .vjs-modal-dialog-content {
font-size: 1.2em;
line-height: 1.5;
padding: 20px 24px;
z-index: 1; }
</style>
<script>/*! jQuery v2.2.1 | (c) jQuery Foundation | jquery.org/license */
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c);
}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ca(b),i="border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),0>=g||null==g){if(g=Fa(b,c,h),(0>g||null==g)&&(g=b.style[c]),Ba.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+Oa(b,c,e||(i?"border":"content"),f,h)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,
e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){return n.trim(a.value)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var hb=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!hb.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,hb.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var ib=a.location,jb=n.now(),kb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return(!c||c.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+b),c};var lb=/#.*$/,mb=/([?&])_=[^&]*/,nb=/^(.*?):[ \t]*([^\r\n]*)$/gm,ob=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,pb=/^(?:GET|HEAD)$/,qb=/^\/\//,rb={},sb={},tb="*/".concat("*"),ub=d.createElement("a");ub.href=ib.href;function vb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function wb(a,b,c,d){var e={},f=a===sb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function xb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function yb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function zb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ib.href,type:"GET",isLocal:ob.test(ib.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":tb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?xb(xb(a,n.ajaxSettings),b):xb(n.ajaxSettings,a)},ajaxPrefilter:vb(rb),ajaxTransport:vb(sb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=nb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||ib.href)+"").replace(lb,"").replace(qb,ib.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=ub.protocol+"//"+ub.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),wb(rb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!pb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(kb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=mb.test(f)?f.replace(mb,"$1_="+jb++):f+(kb.test(f)?"&":"?")+"_="+jb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+tb+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=wb(sb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=yb(m,x,d)),u=zb(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,(b||!y)&&(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Ab=/%20/g,Bb=/\[\]$/,Cb=/\r?\n/g,Db=/^(?:submit|button|image|reset|file)$/i,Eb=/^(?:input|select|textarea|keygen)/i;function Fb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Bb.test(a)?d(a,e):Fb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Fb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Fb(c,a[c],b,e);return d.join("&").replace(Ab,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Eb.test(this.nodeName)&&!Db.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Cb,"\r\n")}}):{name:b.name,value:c.replace(Cb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Gb={0:200,1223:204},Hb=n.ajaxSettings.xhr();l.cors=!!Hb&&"withCredentials"in Hb,l.ajax=Hb=!!Hb,n.ajaxTransport(function(b){var c,d;return l.cors||Hb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Gb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Ib=[],Jb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Ib.pop()||n.expando+"_"+jb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Jb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Jb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Jb,"$1"+e):b.jsonp!==!1&&(b.url+=(kb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Ib.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Kb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Kb)return Kb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Lb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Lb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Lb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Mb=a.jQuery,Nb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Nb),b&&a.jQuery===n&&(a.jQuery=Mb),n},b||(a.jQuery=a.$=n),n});
</script>
<!-- <script type='text/javascript' src='menu/js/jquery.cookie.js'></script> -->
<!-- <script type='text/javascript' src='menu/js/jquery.hoverIntent.minified.js'></script> -->
<!-- <script type='text/javascript' src='menu/js/jquery.dcjqaccordion.2.7.min.js'></script> -->
<!-- <link href="menu/css/skins/blue.css" rel="stylesheet" type="text/css" /> -->
<!-- <link href="menu/css/skins/graphite.css" rel="stylesheet" type="text/css" /> -->
<!-- <link href="menu/css/skins/grey.css" rel="stylesheet" type="text/css" /> -->
<!-- <script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<!-- <script src="script.js"></script> -->
<!-- <script src="jquery.sticky-kit.js "></script> -->
<script type="text/javascript">/**
* Cookie plugin
*
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/
/**
* Create a cookie with the given name and value and other optional parameters.
*
* @example $.cookie('the_cookie', 'the_value');
* @desc Set the value of a cookie.
* @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
* @desc Create a cookie with all available options.
* @example $.cookie('the_cookie', 'the_value');
* @desc Create a session cookie.
* @example $.cookie('the_cookie', null);
* @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
* used when the cookie was set.
*
* @param String name The name of the cookie.
* @param String value The value of the cookie.
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
* If set to null or omitted, the cookie will be a session cookie and will not be retained
* when the the browser exits.
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
* require a secure protocol (like HTTPS).
* @type undefined
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.hartl@stilbuero.de
*/
/**
* Get the value of a cookie with the given name.
*
* @example $.cookie('the_cookie');
* @desc Get the value of a cookie.
*
* @param String name The name of the cookie.
* @return The value of the cookie.
* @type String
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.hartl@stilbuero.de
*/
jQuery.cookie = function(name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
// CAUTION: Needed to parenthesize options.path and options.domain
// in the following expressions, otherwise they evaluate to undefined
// in the packed version for some reason...
var path = options.path ? '; path=' + (options.path) : '';
var domain = options.domain ? '; domain=' + (options.domain) : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};</script>
<script type="text/javascript">/**
* hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+
* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
*
* @param f onMouseOver function || An object with configuration options
* @param g onMouseOut function || Nothing (use configuration options object)
* @author Brian Cherne <brian@cherne.net>
*/
(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY;};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev]);}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev]);};var handleHover=function(e){var p=(e.type=="mouseover"?e.fromElement:e.toElement)||e.relatedTarget;while(p&&p!=this){try{p=p.parentNode;}catch(e){p=this;}}if(p==this){return false;}var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);}if(e.type=="mouseover"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob);},cfg.timeout);}}};return this.mouseover(handleHover).mouseout(handleHover);};})(jQuery);</script>
<script type="text/javascript">(function($){$.fn.dcAccordion=function(options){var defaults={classParent:'dcjq-parent',classActive:'active',classArrow:'dcjq-icon',classCount:'dcjq-count',classExpand:'dcjq-current-parent',eventType:'click',hoverDelay:300,menuClose:true,autoClose:true,autoExpand:false,speed:'slow',saveState:true,disableLink:true,showCount:false,cookie:'dcjq-accordion'};var options=$.extend(defaults,options);this.each(function(options){var obj=this;setUpAccordion();if(defaults.saveState==true){checkCookie(defaults.cookie,obj)}if(defaults.autoExpand==true){$('li.'+defaults.classExpand+' > a').addClass(defaults.classActive)}resetAccordion();if(defaults.eventType=='hover'){var config={sensitivity:2,interval:defaults.hoverDelay,over:linkOver,timeout:defaults.hoverDelay,out:linkOut};$('li a',obj).hoverIntent(config);var configMenu={sensitivity:2,interval:1000,over:menuOver,timeout:1000,out:menuOut};$(obj).hoverIntent(configMenu);if(defaults.disableLink==true){$('li a',obj).click(function(e){if($(this).siblings('ul').length>0){e.preventDefault()}})}}else{$('li a',obj).click(function(e){$activeLi=$(this).parent('li');$parentsLi=$activeLi.parents('li');$parentsUl=$activeLi.parents('ul');if(defaults.disableLink==true){if($(this).siblings('ul').length>0){e.preventDefault()}}if(defaults.autoClose==true){autoCloseAccordion($parentsLi,$parentsUl)}if($('> ul',$activeLi).is(':visible')){$('ul',$activeLi).slideUp(defaults.speed);$('a',$activeLi).removeClass(defaults.classActive)}else{$(this).siblings('ul').slideToggle(defaults.speed);$('> a',$activeLi).addClass(defaults.classActive)}if(defaults.saveState==true){createCookie(defaults.cookie,obj)}})}function setUpAccordion(){$arrow='<span class="'+defaults.classArrow+'"></span>';var classParentLi=defaults.classParent+'-li';$('> ul',obj).show();$('li',obj).each(function(){if($('> ul',this).length>0){$(this).addClass(classParentLi);$('> a',this).addClass(defaults.classParent).append($arrow)}});$('> ul',obj).hide();if(defaults.showCount==true){$('li.'+classParentLi,obj).each(function(){if(defaults.disableLink==true){var getCount=parseInt($('ul a:not(.'+defaults.classParent+')',this).length)}else{var getCount=parseInt($('ul a',this).length)}$('> a',this).append(' <span class="'+defaults.classCount+'">('+getCount+')</span>')})}}function linkOver(){$activeLi=$(this).parent('li');$parentsLi=$activeLi.parents('li');$parentsUl=$activeLi.parents('ul');if(defaults.autoClose==true){autoCloseAccordion($parentsLi,$parentsUl)}if($('> ul',$activeLi).is(':visible')){$('ul',$activeLi).slideUp(defaults.speed);$('a',$activeLi).removeClass(defaults.classActive)}else{$(this).siblings('ul').slideToggle(defaults.speed);$('> a',$activeLi).addClass(defaults.classActive)}if(defaults.saveState==true){createCookie(defaults.cookie,obj)}}function linkOut(){}function menuOver(){}function menuOut(){if(defaults.menuClose==true){$('ul',obj).slideUp(defaults.speed);$('a',obj).removeClass(defaults.classActive);createCookie(defaults.cookie,obj)}}function autoCloseAccordion($parentsLi,$parentsUl){$('ul',obj).not($parentsUl).slideUp(defaults.speed);$('a',obj).removeClass(defaults.classActive);$('> a',$parentsLi).addClass(defaults.classActive)}function resetAccordion(){$('ul',obj).hide();$allActiveLi=$('a.'+defaults.classActive,obj);$allActiveLi.siblings('ul').show()}});function checkCookie(cookieId,obj){var cookieVal=$.cookie(cookieId);if(cookieVal!=null){var activeArray=cookieVal.split(',');$.each(activeArray,function(index,value){var $cookieLi=$('li:eq('+value+')',obj);$('> a',$cookieLi).addClass(defaults.classActive);var $parentsLi=$cookieLi.parents('li');$('> a',$parentsLi).addClass(defaults.classActive)})}}function createCookie(cookieId,obj){var activeIndex=[];$('li a.'+defaults.classActive,obj).each(function(i){var $arrayItem=$(this).parent('li');var itemIndex=$('li',obj).index($arrayItem);activeIndex.push(itemIndex)});$.cookie(cookieId,activeIndex,{path:'/'})}}})(jQuery);</script>
<style type="text/css">.blue .accordion{ border-top: 1px solid #013d6c; border-right: 1px solid #013d6c; border-left: 1px solid #013d6c;}.blue .accordion, .blue .accordion li {margin: 0; padding: 0; border: none;}.blue .accordion a {padding: 10px 10px 10px 15px; background: #0D5995; text-decoration:none; display: block; color: #fff; border-bottom: 1px solid #013d6c; border-top: 1px solid #4695d3;}.blue .accordion ul a {padding: 10px 10px 10px 25px;}.blue .accordion a.dcjq-parent, .blue .accordion a.dcjq-parent:hover {padding: 10px 10px 10px 15px;}.blue .accordion a.dcjq-parent.active {background: #0D5995 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAgSURBVHjaYvz//78aAwTcAhFMDGiAEagCxlbDqgIgwABijwcnzTZbgwAAAABJRU5ErkJggg==) repeat 0 0;}.blue .accordion a:hover {background: #05477c;}.blue .accordion a:active{}</style>
<style type="text/css">.graphite .accordion{font: bold 14px Arial, sans-serif; border-top: 1px solid #111; border-right: 1px solid #111; border-left: 1px solid #111;}.graphite .accordion, .graphite .accordion li {margin: 0; padding: 0; border: none;}.graphite .accordion a {padding: 10px 10px 10px 50px; background: #0C0C0C url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABBSURBVHjaYnL19GVi+P+f6T82/O8f0z8w+x+Q/R/IRqaBcmB5qBiUD1ILZ6OoAbH/o6iBm49mD1geyR1Q9wEEGAAgh3x7DxrMZwAAAABJRU5ErkJggg==) repeat-x 0 -1px; text-decoration:none; display: block; color: #ddd; border-bottom: 1px solid #222; border-top: 1px solid #777; position: relative;}.graphite .accordion ul a {background: #424549;}.graphite .accordion a.dcjq-parent, .graphite .accordion a.dcjq-parent:hover {background: #0C0C0C url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABBSURBVHjaYnL19GVi+P+f6T82/O8f0z8w+x+Q/R/IRqaBcmB5qBiUD1ILZ6OoAbH/o6iBm49mD1geyR1Q9wEEGAAgh3x7DxrMZwAAAABJRU5ErkJggg==) repeat-x 0 -1px;}.graphite .accordion a.dcjq-parent.active {}.graphite .accordion a .dcjq-icon {position: absolute; top: 50%; left: 14px; width: 34px; margin-top: -17px; height: 34px; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAApCAYAAAArpDnNAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH4SURBVHja7FdNSwJRFH1vnEIpCEQ3IurGRVsLWrdSQQhcBAqBtIg2rdMkwUVKusuQlhlDiH/DNv2Gln0QQgSSqaPzXueNGtHSmXExOHJ5eK/O4Zx73n0zlHNOrLwSe8nsR+edycTqi/MAY0yVLMeZrtICGBHRHusZLYHmN8PkszTDXEDYsHZixBYExKbSyV6vd7fb7e5Mp7hjNBo9Y20hBv8lmE86pv9XbrVa6+12uzQej6nD4SCdTocoirIJ8HP8bmxKjwSjYDD4EA6HFUrpgSRJRICFQqFssVgkvV7v7M8ANmQGWdO0z36/fwwdNYBlECSdThOs2UKhQFHLGjPDRDpJ3BjxDTYnSNyJ4mAwIKlUioDVqcvlujBynMz2kTwcDme5L8SRqqoruHlKyCiYgXGuVCo9oXZrSLpIJPKbhOM4esYbjQbx+/0EspFkMkkTiQSd395swggMZrk1t9t9nc/n0wJEFEVA1kun06mYtWFdHo/nqlKpZGKxmF6AZCJfReTwfWTGrNsAk3q5XD6Mx+NE9Ax7SgcRzjNu74kyUiAQ2K/VaploNKr3RIAAoAoz5IXEZg1Vudlsyj6f7x5MNCRWAfCI+o3whimzjnE9qNVPqpGt7frb64tqtxN2IQcf051nI0Y2fSRmS+mWQNPXFm7H15YfAQYAeBuQdTNLxSkAAAAASUVORK5CYII=) no-repeat 0 center;}.graphite .accordion a.dcjq-parent.active .dcjq-icon {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAApCAYAAAArpDnNAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFuSURBVHjaYvz//z8DLYGPf1DF21cv/rEw0Br8/y/379+/X0w0twdKM9HBRwyg6KG9j0YtIj8xQOBoYiDLImCGHU4++kcni/7Bgo6RkdEJihmIwPxAXEda0P2D+KisrMzCyspqG1DMiYAefgEBgb319fXRJMcRyEecnJxsM2bMYCdgGdiSOXPmGGtqagqQnRg4ODgY8FgGt0RPT4+MxPAPNTHgsIwiS1DykbW19Q0clgVis0RaWvoBWUGnoKCw6+/fv5fRLXN1dV2HbglQ3S9xcfF60pL3P7CPQG2Gd8zMzA5//vzZx8LCog+zbOrUqSgaQJYA1fkDmTsoybDvgJY4AQ27gNVV//79JMcSXGUd2GfoloEsYWJi8iXHEliGxVaofoRadhbJEi8gczctClWQZc5A+iDUkn0UlXX//oMxi6qqKjb5j0DsQJ1q4h8YD7cali4VHx2Djj4+GqZN4n+jQTdqEbTb8n84dlsAAgwAASNROHTqzS8AAAAASUVORK5CYII=) no-repeat 0 center;}.graphite .accordion a:hover {background: #232323; color: #fff;}.graphite .accordion a:active{}</style>
<style type="text/css">.grey .accordion{font: bold 14px Arial, sans-serif; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-left: 1px solid #ccc;}.grey .accordion, .grey .accordion li {margin: 0; padding: 0; border: none;}.grey .accordion a {padding: 10px 10px 10px 50px; background: #ececec; text-decoration:none; display: block; color: #333; border-bottom: 1px solid #ccc; border-top: 1px solid #fff; position: relative; text-shadow: 1px 1px 1px #fff;}.grey .accordion a.dcjq-parent, .grey .accordion a.dcjq-parent:hover {background: #D7D4D4 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAsSURBVHjaYvr9+zfTly9fmP7//8/EwMCAQuNjI2Nc4sSqI2QfiGZjZgYIMACVNF/W6EF1XQAAAABJRU5ErkJggg==) repeat-x 0 -1px;}.grey .accordion a.dcjq-parent.active {}.grey .accordion a .dcjq-icon {position: absolute; top: 50%; left: 14px; width: 34px; margin-top: -17px; height: 34px; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAApCAYAAAArpDnNAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFWSURBVHjaYvz//z8DLcHLFy/KuHl4mFgYaAz+/f8vBaTYmGhtEQM0xJhob8+oRUPBIhAeRj7692+YWfQPSo8GHdmpjsXExMQJSKsgyd0E4oPoGs6cOUNeHAF9BM5HkyZNEuLj42sCis0EYUZGxt1AOoSK1QQk6KysrI6sWLHii7y8PMyrrExMTMupZRlyHL0QExOzmT59+l2YZUDvslDLMvSSgWaW/cOS6sCWNTY2PgBagGzZUiBTmtKgA6U6FAl2dvZ/cFcALWxtbWVwdXWlyEeg4ENunEiwsLAc/PnzpxLMkra2tn8uLi7RQO5TasUR2JI/f/6ooVkSDuSuoVYc0cwSlDgSFxdPNTIyEuXk5AQLWFtb/7O3t6eKJShF0NatWz8B6dVIcluBeBPVSgaYj4B4Ik3rI3qW3vRpnNCtKqd3xTfariO/hh1t5A9aHzEM23wEEGAA9Cve7kRFQ2MAAAAASUVORK5CYII=) no-repeat 0 center;}.grey .accordion a.dcjq-parent.active .dcjq-icon {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAApCAYAAAArpDnNAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFoSURBVHjaYvz//z8DLcHLFy/KuHl4mFgYaAz+/f8vBaTYmGhtEQM0xJhob8+oRUPBIhAeRj7692+YWfQPSo8GHdmpjsXExEQaSD8lQo8oEH8/c+bMF5LiCOgjcD7i4uKaA+R7E7KEhYXloJmZmSwZ1QQk6JSVlQ2YmJg2ANl++Cz58+ePpoaGBj/ZccTIyMgE9B4L0LK1WCyDW0K1kgGLZRRbAosjsEXe3t5PgBagW5aMbomzszNDTEzMS7KDLjg4uL2tre0fsmVAag66JU1NTeuEhIQekeMjWOm9xsXFJRzZMmQAs4SdnT0SyP1LaRxhtQzNkl+UxBG8YoLikN27d/81NTX9X1ZW9v/Hjx9rgWJsaGpIwqeOHp3w4cOHaejtOrDPxMTEVqqrq2+gxCcYRRAWuTV6eno2QPospZYgBx2ulupxqtVH9Cy96dM4oVtVTu+Kb7RdR05HbLSRP8h9xDBs8xFAgAEASssocmC2zyUAAAAASUVORK5CYII=) no-repeat 0 center;}.grey .accordion a:hover {background: #fff; color: #990000;}.grey .accordion a:active{}</style>
<script>/*
* /MathJax.js
*
* Copyright (c) 2009-2018 The MathJax Consortium
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
if(document.getElementById&&document.childNodes&&document.createElement){if(!(window.MathJax&&MathJax.Hub)){if(window.MathJax){window.MathJax={AuthorConfig:window.MathJax}}else{window.MathJax={}}MathJax.isPacked=true;MathJax.version="2.7.4";MathJax.fileversion="2.7.4";MathJax.cdnVersion="2.7.4";MathJax.cdnFileVersions={};(function(d){var b=window[d];if(!b){b=window[d]={}}var e=[];var c=function(f){var g=f.constructor;if(!g){g=function(){}}for(var h in f){if(h!=="constructor"&&f.hasOwnProperty(h)){g[h]=f[h]}}return g};var a=function(){return function(){return arguments.callee.Init.call(this,arguments)}};b.Object=c({constructor:a(),Subclass:function(f,h){var g=a();g.SUPER=this;g.Init=this.Init;g.Subclass=this.Subclass;g.Augment=this.Augment;g.protoFunction=this.protoFunction;g.can=this.can;g.has=this.has;g.isa=this.isa;g.prototype=new this(e);g.prototype.constructor=g;g.Augment(f,h);return g},Init:function(f){var g=this;if(f.length===1&&f[0]===e){return g}if(!(g instanceof f.callee)){g=new f.callee(e)}return g.Init.apply(g,f)||g},Augment:function(f,g){var h;if(f!=null){for(h in f){if(f.hasOwnProperty(h)){this.protoFunction(h,f[h])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){this.protoFunction("toString",f.toString)}}if(g!=null){for(h in g){if(g.hasOwnProperty(h)){this[h]=g[h]}}}return this},protoFunction:function(g,f){this.prototype[g]=f;if(typeof f==="function"){f.SUPER=this.SUPER.prototype}},prototype:{Init:function(){},SUPER:function(f){return f.callee.SUPER},can:function(f){return typeof(this[f])==="function"},has:function(f){return typeof(this[f])!=="undefined"},isa:function(f){return(f instanceof Object)&&(this instanceof f)}},can:function(f){return this.prototype.can.call(this,f)},has:function(f){return this.prototype.has.call(this,f)},isa:function(g){var f=this;while(f){if(f===g){return true}else{f=f.SUPER}}return false},SimpleSUPER:c({constructor:function(f){return this.SimpleSUPER.define(f)},define:function(f){var h={};if(f!=null){for(var g in f){if(f.hasOwnProperty(g)){h[g]=this.wrap(g,f[g])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){h.toString=this.wrap("toString",f.toString)}}return h},wrap:function(i,h){if(typeof(h)!=="function"||!h.toString().match(/\.\s*SUPER\s*\(/)){return h}var g=function(){this.SUPER=g.SUPER[i];try{var f=h.apply(this,arguments)}catch(j){delete this.SUPER;throw j}delete this.SUPER;return f};g.toString=function(){return h.toString.apply(h,arguments)};return g}})});b.Object.isArray=Array.isArray||function(f){return Object.prototype.toString.call(f)==="[object Array]"};b.Object.Array=Array})("MathJax");(function(BASENAME){var BASE=window[BASENAME];if(!BASE){BASE=window[BASENAME]={}}var isArray=BASE.Object.isArray;var CALLBACK=function(data){var cb=function(){return arguments.callee.execute.apply(arguments.callee,arguments)};for(var id in CALLBACK.prototype){if(CALLBACK.prototype.hasOwnProperty(id)){if(typeof(data[id])!=="undefined"){cb[id]=data[id]}else{cb[id]=CALLBACK.prototype[id]}}}cb.toString=CALLBACK.prototype.toString;return cb};CALLBACK.prototype={isCallback:true,hook:function(){},data:[],object:window,execute:function(){if(!this.called||this.autoReset){this.called=!this.autoReset;return this.hook.apply(this.object,this.data.concat([].slice.call(arguments,0)))}},reset:function(){delete this.called},toString:function(){return this.hook.toString.apply(this.hook,arguments)}};var ISCALLBACK=function(f){return(typeof(f)==="function"&&f.isCallback)};var EVAL=function(code){return eval.call(window,code)};var TESTEVAL=function(){EVAL("var __TeSt_VaR__ = 1");if(window.__TeSt_VaR__){try{delete window.__TeSt_VaR__}catch(error){window.__TeSt_VaR__=null}}else{if(window.execScript){EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";window.execScript(code);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}else{EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";var head=(document.getElementsByTagName("head"))[0];if(!head){head=document.body}var script=document.createElement("script");script.appendChild(document.createTextNode(code));head.appendChild(script);head.removeChild(script);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}}TESTEVAL=null};var USING=function(args,i){if(arguments.length>1){if(arguments.length===2&&!(typeof arguments[0]==="function")&&arguments[0] instanceof Object&&typeof arguments[1]==="number"){args=[].slice.call(args,i)}else{args=[].slice.call(arguments,0)}}if(isArray(args)&&args.length===1&&typeof(args[0])==="function"){args=args[0]}if(typeof args==="function"){if(args.execute===CALLBACK.prototype.execute){return args}return CALLBACK({hook:args})}else{if(isArray(args)){if(typeof(args[0])==="string"&&args[1] instanceof Object&&typeof args[1][args[0]]==="function"){return CALLBACK({hook:args[1][args[0]],object:args[1],data:args.slice(2)})}else{if(typeof args[0]==="function"){return CALLBACK({hook:args[0],data:args.slice(1)})}else{if(typeof args[1]==="function"){return CALLBACK({hook:args[1],object:args[0],data:args.slice(2)})}}}}else{if(typeof(args)==="string"){if(TESTEVAL){TESTEVAL()}return CALLBACK({hook:EVAL,data:[args]})}else{if(args instanceof Object){return CALLBACK(args)}else{if(typeof(args)==="undefined"){return CALLBACK({})}}}}}throw Error("Can't make callback from given data")};var DELAY=function(time,callback){callback=USING(callback);callback.timeout=setTimeout(callback,time);return callback};var WAITFOR=function(callback,signal){callback=USING(callback);if(!callback.called){WAITSIGNAL(callback,signal);signal.pending++}};var WAITEXECUTE=function(){var signals=this.signal;delete this.signal;this.execute=this.oldExecute;delete this.oldExecute;var result=this.execute.apply(this,arguments);if(ISCALLBACK(result)&&!result.called){WAITSIGNAL(result,signals)}else{for(var i=0,m=signals.length;i<m;i++){signals[i].pending--;if(signals[i].pending<=0){signals[i].call()}}}};var WAITSIGNAL=function(callback,signals){if(!isArray(signals)){signals=[signals]}if(!callback.signal){callback.oldExecute=callback.execute;callback.execute=WAITEXECUTE;callback.signal=signals}else{if(signals.length===1){callback.signal.push(signals[0])}else{callback.signal=callback.signal.concat(signals)}}};var AFTER=function(callback){callback=USING(callback);callback.pending=0;for(var i=1,m=arguments.length;i<m;i++){if(arguments[i]){WAITFOR(arguments[i],callback)}}if(callback.pending===0){var result=callback();if(ISCALLBACK(result)){callback=result}}return callback};var HOOKS=MathJax.Object.Subclass({Init:function(reset){this.hooks=[];this.remove=[];this.reset=reset;this.running=false},Add:function(hook,priority){if(priority==null){priority=10}if(!ISCALLBACK(hook)){hook=USING(hook)}hook.priority=priority;var i=this.hooks.length;while(i>0&&priority<this.hooks[i-1].priority){i--}this.hooks.splice(i,0,hook);return hook},Remove:function(hook){for(var i=0,m=this.hooks.length;i<m;i++){if(this.hooks[i]===hook){if(this.running){this.remove.push(i)}else{this.hooks.splice(i,1)}return}}},Execute:function(){var callbacks=[{}];this.running=true;for(var i=0,m=this.hooks.length;i<m;i++){if(this.reset){this.hooks[i].reset()}var result=this.hooks[i].apply(window,arguments);if(ISCALLBACK(result)&&!result.called){callbacks.push(result)}}this.running=false;if(this.remove.length){this.RemovePending()}if(callbacks.length===1){return null}if(callbacks.length===2){return callbacks[1]}return AFTER.apply({},callbacks)},RemovePending:function(){this.remove=this.remove.sort();for(var i=this.remove.length-1;i>=0;i--){this.hooks.splice(i,1)}this.remove=[]}});var EXECUTEHOOKS=function(hooks,data,reset){if(!hooks){return null}if(!isArray(hooks)){hooks=[hooks]}if(!isArray(data)){data=(data==null?[]:[data])}var handler=HOOKS(reset);for(var i=0,m=hooks.length;i<m;i++){handler.Add(hooks[i])}return handler.Execute.apply(handler,data)};var QUEUE=BASE.Object.Subclass({Init:function(){this.pending=this.running=0;this.queue=[];this.Push.apply(this,arguments)},Push:function(){var callback;for(var i=0,m=arguments.length;i<m;i++){callback=USING(arguments[i]);if(callback===arguments[i]&&!callback.called){callback=USING(["wait",this,callback])}this.queue.push(callback)}if(!this.running&&!this.pending){this.Process()}return callback},Process:function(queue){while(!this.running&&!this.pending&&this.queue.length){var callback=this.queue[0];queue=this.queue.slice(1);this.queue=[];this.Suspend();var result=callback();this.Resume();if(queue.length){this.queue=queue.concat(this.queue)}if(ISCALLBACK(result)&&!result.called){WAITFOR(result,this)}}},Suspend:function(){this.running++},Resume:function(){if(this.running){this.running--}},call:function(){this.Process.apply(this,arguments)},wait:function(callback){return callback}});var SIGNAL=QUEUE.Subclass({Init:function(name){QUEUE.prototype.Init.call(this);this.name=name;this.posted=[];this.listeners=HOOKS(true);this.posting=false;this.callback=null},Post:function(message,callback,forget){callback=USING(callback);if(this.posting||this.pending){this.Push(["Post",this,message,callback,forget])}else{this.callback=callback;callback.reset();if(!forget){this.posted.push(message)}this.Suspend();this.posting=true;var result=this.listeners.Execute(message);if(ISCALLBACK(result)&&!result.called){WAITFOR(result,this)}this.Resume();this.posting=false;if(!this.pending){this.call()}}return callback},Clear:function(callback){callback=USING(callback);if(this.posting||this.pending){callback=this.Push(["Clear",this,callback])}else{this.posted=[];callback()}return callback},call:function(){this.callback(this);this.Process()},Interest:function(callback,ignorePast,priority){callback=USING(callback);this.listeners.Add(callback,priority);if(!ignorePast){for(var i=0,m=this.posted.length;i<m;i++){callback.reset();var result=callback(this.posted[i]);if(ISCALLBACK(result)&&i===this.posted.length-1){WAITFOR(result,this)}}}return callback},NoInterest:function(callback){this.listeners.Remove(callback)},MessageHook:function(msg,callback,priority){callback=USING(callback);if(!this.hooks){this.hooks={};this.Interest(["ExecuteHooks",this])}if(!this.hooks[msg]){this.hooks[msg]=HOOKS(true)}this.hooks[msg].Add(callback,priority);for(var i=0,m=this.posted.length;i<m;i++){if(this.posted[i]==msg){callback.reset();callback(this.posted[i])}}callback.msg=msg;return callback},ExecuteHooks:function(msg){var type=(isArray(msg)?msg[0]:msg);if(!this.hooks[type]){return null}return this.hooks[type].Execute(msg)},RemoveHook:function(hook){this.hooks[hook.msg].Remove(hook)}},{signals:{},find:function(name){if(!SIGNAL.signals[name]){SIGNAL.signals[name]=new SIGNAL(name)}return SIGNAL.signals[name]}});BASE.Callback=BASE.CallBack=USING;BASE.Callback.Delay=DELAY;BASE.Callback.After=AFTER;BASE.Callback.Queue=QUEUE;BASE.Callback.Signal=SIGNAL.find;BASE.Callback.Hooks=HOOKS;BASE.Callback.ExecuteHooks=EXECUTEHOOKS})("MathJax");(function(e){var a=window[e];if(!a){a=window[e]={}}var d=(navigator.vendor==="Apple Computer, Inc."&&typeof navigator.vendorSub==="undefined");var g=0;var h=function(i){if(document.styleSheets&&document.styleSheets.length>g){g=document.styleSheets.length}if(!i){i=document.head||((document.getElementsByTagName("head"))[0]);if(!i){i=document.body}}return i};var f=[];var c=function(){for(var k=0,j=f.length;k<j;k++){a.Ajax.head.removeChild(f[k])}f=[]};var b={};b[e]="";b.a11y="[MathJax]/extensions/a11y";b.Contrib="https://cdn.mathjax.org/mathjax/contrib";a.Ajax={loaded:{},loading:{},loadHooks:{},timeout:15*1000,styleDelay:1,config:{root:"",path:b},params:{},STATUS:{OK:1,ERROR:-1},fileURL:function(j){var i;while((i=j.match(/^\[([-._a-z0-9]+)\]/i))&&b.hasOwnProperty(i[1])){j=(b[i[1]]||this.config.root)+j.substr(i[1].length+2)}return j},fileName:function(j){var i=this.config.root;if(j.substr(0,i.length)===i){j="["+e+"]"+j.substr(i.length)}do{var k=false;for(var l in b){if(b.hasOwnProperty(l)&&b[l]){if(j.substr(0,b[l].length)===b[l]){j="["+l+"]"+j.substr(b[l].length);k=true;break}}}}while(k);return j},fileRev:function(j){var i=a.cdnFileVersions[j]||a.cdnVersion||"";if(i){i="?V="+i}return i},urlRev:function(i){return this.fileURL(i)+this.fileRev(i)},Require:function(k,n){n=a.Callback(n);var l;if(k instanceof Object){for(var j in k){if(k.hasOwnProperty(j)){l=j.toUpperCase();k=k[j]}}}else{l=k.split(/\./).pop().toUpperCase()}if(this.params.noContrib&&k.substr(0,9)==="[Contrib]"){n(this.STATUS.ERROR)}else{k=this.fileURL(k);if(this.loaded[k]){n(this.loaded[k])}else{var m={};m[l]=k;this.Load(m,n)}}return n},Load:function(k,m){m=a.Callback(m);var l;if(k instanceof Object){for(var j in k){if(k.hasOwnProperty(j)){l=j.toUpperCase();k=k[j]}}}else{l=k.split(/\./).pop().toUpperCase()}k=this.fileURL(k);if(this.loading[k]){this.addHook(k,m)}else{this.head=h(this.head);if(this.loader[l]){this.loader[l].call(this,k,m)}else{throw Error("Can't load files of type "+l)}}return m},LoadHook:function(l,m,k){m=a.Callback(m);if(l instanceof Object){for(var j in l){if(l.hasOwnProperty(j)){l=l[j]}}}l=this.fileURL(l);if(this.loaded[l]){m(this.loaded[l])}else{this.addHook(l,m,k)}return m},addHook:function(j,k,i){if(!this.loadHooks[j]){this.loadHooks[j]=MathJax.Callback.Hooks()}this.loadHooks[j].Add(k,i);k.file=j},removeHook:function(i){if(this.loadHooks[i.file]){this.loadHooks[i.file].Remove(i);if(!this.loadHooks[i.file].hooks.length){delete this.loadHooks[i.file]}}},Preloading:function(){for(var l=0,j=arguments.length;l<j;l++){var k=this.fileURL(arguments[l]);if(!this.loading[k]){this.loading[k]={preloaded:true}}}},loader:{JS:function(k,m){var j=this.fileName(k);var i=document.createElement("script");var l=a.Callback(["loadTimeout",this,k]);this.loading[k]={callback:m,timeout:setTimeout(l,this.timeout),status:this.STATUS.OK,script:i};this.loading[k].message=a.Message.File(j);i.onerror=l;i.type="text/javascript";i.src=k+this.fileRev(j);this.head.appendChild(i)},CSS:function(j,l){var i=this.fileName(j);var k=document.createElement("link");k.rel="stylesheet";k.type="text/css";k.href=j+this.fileRev(i);this.loading[j]={callback:l,message:a.Message.File(i),status:this.STATUS.OK};this.head.appendChild(k);this.timer.create.call(this,[this.timer.file,j],k)}},timer:{create:function(j,i){j=a.Callback(j);if(i.nodeName==="STYLE"&&i.styleSheet&&typeof(i.styleSheet.cssText)!=="undefined"){j(this.STATUS.OK)}else{if(window.chrome&&i.nodeName==="LINK"){j(this.STATUS.OK)}else{if(d){this.timer.start(this,[this.timer.checkSafari2,g++,j],this.styleDelay)}else{this.timer.start(this,[this.timer.checkLength,i,j],this.styleDelay)}}}return j},start:function(j,i,k,l){i=a.Callback(i);i.execute=this.execute;i.time=this.time;i.STATUS=j.STATUS;i.timeout=l||j.timeout;i.delay=i.total=k||0;if(k){setTimeout(i,k)}else{i()}},time:function(i){this.total+=this.delay;this.delay=Math.floor(this.delay*1.05+5);if(this.total>=this.timeout){i(this.STATUS.ERROR);return 1}return 0},file:function(j,i){if(i<0){a.Ajax.loadTimeout(j)}else{a.Ajax.loadComplete(j)}},execute:function(){this.hook.call(this.object,this,this.data[0],this.data[1])},checkSafari2:function(i,j,k){if(i.time(k)){return}if(document.styleSheets.length>j&&document.styleSheets[j].cssRules&&document.styleSheets[j].cssRules.length){k(i.STATUS.OK)}else{setTimeout(i,i.delay)}},checkLength:function(i,l,n){if(i.time(n)){return}var m=0;var j=(l.sheet||l.styleSheet);try{if((j.cssRules||j.rules||[]).length>0){m=1}}catch(k){if(k.message.match(/protected variable|restricted URI/)){m=1}else{if(k.message.match(/Security error/)){m=1}}}if(m){setTimeout(a.Callback([n,i.STATUS.OK]),0)}else{setTimeout(i,i.delay)}}},loadComplete:function(i){i=this.fileURL(i);var j=this.loading[i];if(j&&!j.preloaded){a.Message.Clear(j.message);clearTimeout(j.timeout);if(j.script){if(f.length===0){setTimeout(c,0)}f.push(j.script)}this.loaded[i]=j.status;delete this.loading[i];this.addHook(i,j.callback)}else{if(j){delete this.loading[i]}this.loaded[i]=this.STATUS.OK;j={status:this.STATUS.OK}}if(!this.loadHooks[i]){return null}return this.loadHooks[i].Execute(j.status)},loadTimeout:function(i){if(this.loading[i].timeout){clearTimeout(this.loading[i].timeout)}this.loading[i].status=this.STATUS.ERROR;this.loadError(i);this.loadComplete(i)},loadError:function(i){a.Message.Set(["LoadFailed","File failed to load: %1",i],null,2000);a.Hub.signal.Post(["file load error",i])},Styles:function(k,l){var i=this.StyleString(k);if(i===""){l=a.Callback(l);l()}else{var j=document.createElement("style");j.type="text/css";this.head=h(this.head);this.head.appendChild(j);if(j.styleSheet&&typeof(j.styleSheet.cssText)!=="undefined"){j.styleSheet.cssText=i}else{j.appendChild(document.createTextNode(i))}l=this.timer.create.call(this,l,j)}return l},StyleString:function(n){if(typeof(n)==="string"){return n}var k="",o,m;for(o in n){if(n.hasOwnProperty(o)){if(typeof n[o]==="string"){k+=o+" {"+n[o]+"}\n"}else{if(a.Object.isArray(n[o])){for(var l=0;l<n[o].length;l++){m={};m[o]=n[o][l];k+=this.StyleString(m)}}else{if(o.substr(0,6)==="@media"){k+=o+" {"+this.StyleString(n[o])+"}\n"}else{if(n[o]!=null){m=[];for(var j in n[o]){if(n[o].hasOwnProperty(j)){if(n[o][j]!=null){m[m.length]=j+": "+n[o][j]}}}k+=o+" {"+m.join("; ")+"}\n"}}}}}}return k}}})("MathJax");MathJax.HTML={Element:function(d,f,e){var g=document.createElement(d),h;if(f){if(f.hasOwnProperty("style")){var c=f.style;f.style={};for(h in c){if(c.hasOwnProperty(h)){f.style[h.replace(/-([a-z])/g,this.ucMatch)]=c[h]}}}MathJax.Hub.Insert(g,f);for(h in f){if(h==="role"||h.substr(0,5)==="aria-"){g.setAttribute(h,f[h])}}}if(e){if(!MathJax.Object.isArray(e)){e=[e]}for(var b=0,a=e.length;b<a;b++){if(MathJax.Object.isArray(e[b])){g.appendChild(this.Element(e[b][0],e[b][1],e[b][2]))}else{if(d==="script"){this.setScript(g,e[b])}else{g.appendChild(document.createTextNode(e[b]))}}}}return g},ucMatch:function(a,b){return b.toUpperCase()},addElement:function(b,a,d,c){return b.appendChild(this.Element(a,d,c))},TextNode:function(a){return document.createTextNode(a)},addText:function(a,b){return a.appendChild(this.TextNode(b))},setScript:function(a,b){if(this.setScriptBug){a.text=b}else{while(a.firstChild){a.removeChild(a.firstChild)}this.addText(a,b)}},getScript:function(a){var b=(a.text===""?a.innerHTML:a.text);return b.replace(/^\s+/,"").replace(/\s+$/,"")},Cookie:{prefix:"mjx",expires:365,Set:function(a,e){var d=[];if(e){for(var g in e){if(e.hasOwnProperty(g)){d.push(g+":"+e[g].toString().replace(/&/g,"&&"))}}}var b=this.prefix+"."+a+"="+escape(d.join("&;"));if(this.expires){var f=new Date();f.setDate(f.getDate()+this.expires);b+="; expires="+f.toGMTString()}try{document.cookie=b+"; path=/"}catch(c){}},Get:function(a,d){if(!d){d={}}var g=new RegExp("(?:^|;\\s*)"+this.prefix+"\\."+a+"=([^;]*)(?:;|$)");var f;try{f=g.exec(document.cookie)}catch(c){}if(f&&f[1]!==""){var j=unescape(f[1]).split("&;");for(var e=0,b=j.length;e<b;e++){f=j[e].match(/([^:]+):(.*)/);var h=f[2].replace(/&&/g,"&");if(h==="true"){h=true}else{if(h==="false"){h=false}else{if(h.match(/^-?(\d+(\.\d+)?|\.\d+)$/)){h=parseFloat(h)}}}d[f[1]]=h}}return d}}};MathJax.Localization={locale:"en",directory:"[MathJax]/localization",strings:{ar:{menuTitle:"\u0627\u0644\u0639\u0631\u0628\u064A\u0629"},ast:{menuTitle:"asturianu"},bg:{menuTitle:"\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438"},bcc:{menuTitle:"\u0628\u0644\u0648\u0686\u06CC"},br:{menuTitle:"brezhoneg"},ca:{menuTitle:"catal\u00E0"},cdo:{menuTitle:"M\u00ECng-d\u0115\u0324ng-ng\u1E73\u0304"},cs:{menuTitle:"\u010De\u0161tina"},da:{menuTitle:"dansk"},de:{menuTitle:"Deutsch"},diq:{menuTitle:"Zazaki"},en:{menuTitle:"English",isLoaded:true},eo:{menuTitle:"Esperanto"},es:{menuTitle:"espa\u00F1ol"},fa:{menuTitle:"\u0641\u0627\u0631\u0633\u06CC"},fi:{menuTitle:"suomi"},fr:{menuTitle:"fran\u00E7ais"},gl:{menuTitle:"galego"},he:{menuTitle:"\u05E2\u05D1\u05E8\u05D9\u05EA"},ia:{menuTitle:"interlingua"},it:{menuTitle:"italiano"},ja:{menuTitle:"\u65E5\u672C\u8A9E"},kn:{menuTitle:"\u0C95\u0CA8\u0CCD\u0CA8\u0CA1"},ko:{menuTitle:"\uD55C\uAD6D\uC5B4"},lb:{menuTitle:"L\u00EBtzebuergesch"},lki:{menuTitle:"\u0644\u06D5\u06A9\u06CC"},lt:{menuTitle:"lietuvi\u0173"},mk:{menuTitle:"\u043C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438"},nl:{menuTitle:"Nederlands"},oc:{menuTitle:"occitan"},pl:{menuTitle:"polski"},pt:{menuTitle:"portugu\u00EAs"},"pt-br":{menuTitle:"portugu\u00EAs do Brasil"},ru:{menuTitle:"\u0440\u0443\u0441\u0441\u043A\u0438\u0439"},sco:{menuTitle:"Scots"},scn:{menuTitle:"sicilianu"},sk:{menuTitle:"sloven\u010Dina"},sl:{menuTitle:"sloven\u0161\u010Dina"},sv:{menuTitle:"svenska"},th:{menuTitle:"\u0E44\u0E17\u0E22"},tr:{menuTitle:"T\u00FCrk\u00E7e"},uk:{menuTitle:"\u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430"},vi:{menuTitle:"Ti\u1EBFng Vi\u1EC7t"},"zh-hans":{menuTitle:"\u4E2D\u6587\uFF08\u7B80\u4F53\uFF09"},"zh-hant":{menuTitle:"\u6C49\u8BED"}},pattern:/%(\d+|\{\d+\}|\{[a-z]+:\%\d+(?:\|(?:%\{\d+\}|%.|[^\}])*)+\}|.)/g,SPLIT:("axb".split(/(x)/).length===3?function(a,b){return a.split(b)}:function(c,e){var a=[],b,d=0;e.lastIndex=0;while((b=e.exec(c))){a.push(c.substr(d,b.index-d));a.push.apply(a,b.slice(1));d=b.index+b[0].length}a.push(c.substr(d));return a}),_:function(b,a){if(MathJax.Object.isArray(a)){return this.processSnippet(b,a)}return this.processString(this.lookupPhrase(b,a),[].slice.call(arguments,2))},processString:function(l,p,g){var j,e,o=MathJax.Object.isArray;for(j=0,e=p.length;j<e;j++){if(g&&o(p[j])){p[j]=this.processSnippet(g,p[j])}}var f=this.SPLIT(l,this.pattern);for(j=1,e=f.length;j<e;j+=2){var q=f[j].charAt(0);if(q>="0"&&q<="9"){f[j]=p[f[j]-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{if(q==="{"){q=f[j].substr(1);if(q>="0"&&q<="9"){f[j]=p[f[j].substr(1,f[j].length-2)-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{var k=f[j].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/);if(k){if(k[1]==="plural"){var d=p[k[2]-1];if(typeof d==="undefined"){f[j]="???"}else{d=this.plural(d)-1;var h=k[3].replace(/(^|[^%])(%%)*%\|/g,"$1$2%\uEFEF").split(/\|/);if(d>=0&&d<h.length){f[j]=this.processString(h[d].replace(/\uEFEF/g,"|"),p,g)}else{f[j]="???"}}}else{f[j]="%"+f[j]}}}}}if(f[j]==null){f[j]="???"}}if(!g){return f.join("")}var a=[],b="";for(j=0;j<e;j++){b+=f[j];j++;if(j<e){if(o(f[j])){a.push(b);a=a.concat(f[j]);b=""}else{b+=f[j]}}}if(b!==""){a.push(b)}return a},processSnippet:function(g,e){var c=[];for(var d=0,b=e.length;d<b;d++){if(MathJax.Object.isArray(e[d])){var f=e[d];if(typeof f[1]==="string"){var h=f[0];if(!MathJax.Object.isArray(h)){h=[g,h]}var a=this.lookupPhrase(h,f[1]);c=c.concat(this.processMarkdown(a,f.slice(2),g))}else{if(MathJax.Object.isArray(f[1])){c=c.concat(this.processSnippet.apply(this,f))}else{if(f.length>=3){c.push([f[0],f[1],this.processSnippet(g,f[2])])}else{c.push(e[d])}}}}else{c.push(e[d])}}return c},markdownPattern:/(%.)|(\*{1,3})((?:%.|.)+?)\2|(`+)((?:%.|.)+?)\4|\[((?:%.|.)+?)\]\(([^\s\)]+)\)/,processMarkdown:function(b,h,d){var j=[],e;var c=b.split(this.markdownPattern);var g=c[0];for(var f=1,a=c.length;f<a;f+=8){if(c[f+1]){e=this.processString(c[f+2],h,d);if(!MathJax.Object.isArray(e)){e=[e]}e=[["b","i","i"][c[f+1].length-1],{},e];if(c[f+1].length===3){e=["b",{},e]}}else{if(c[f+3]){e=this.processString(c[f+4].replace(/^\s/,"").replace(/\s$/,""),h,d);if(!MathJax.Object.isArray(e)){e=[e]}e=["code",{},e]}else{if(c[f+5]){e=this.processString(c[f+5],h,d);if(!MathJax.Object.isArray(e)){e=[e]}e=["a",{href:this.processString(c[f+6],h),target:"_blank"},e]}else{g+=c[f];e=null}}}if(e){j=this.concatString(j,g,h,d);j.push(e);g=""}if(c[f+7]!==""){g+=c[f+7]}}j=this.concatString(j,g,h,d);return j},concatString:function(a,c,b,d){if(c!=""){c=this.processString(c,b,d);if(!MathJax.Object.isArray(c)){c=[c]}a=a.concat(c)}return a},lookupPhrase:function(f,a,d){if(!d){d="_"}if(MathJax.Object.isArray(f)){d=(f[0]||"_");f=(f[1]||"")}var c=this.loadDomain(d);if(c){MathJax.Hub.RestartAfter(c)}var b=this.strings[this.locale];if(b){if(b.domains&&d in b.domains){var e=b.domains[d];if(e.strings&&f in e.strings){a=e.strings[f]}}}return a},loadFile:function(b,d,e){e=MathJax.Callback(e);b=(d.file||b);if(!b.match(/\.js$/)){b+=".js"}if(!b.match(/^([a-z]+:|\[MathJax\])/)){var a=(this.strings[this.locale].directory||this.directory+"/"+this.locale||"[MathJax]/localization/"+this.locale);b=a+"/"+b}var c=MathJax.Ajax.Require(b,function(){d.isLoaded=true;return e()});return(c.called?null:c)},loadDomain:function(c,e){var b,a=this.strings[this.locale];if(a){if(!a.isLoaded){b=this.loadFile(this.locale,a);if(b){return MathJax.Callback.Queue(b,["loadDomain",this,c]).Push(e||{})}}if(a.domains&&c in a.domains){var d=a.domains[c];if(!d.isLoaded){b=this.loadFile(c,d);if(b){return MathJax.Callback.Queue(b).Push(e)}}}}return MathJax.Callback(e)()},Try:function(a){a=MathJax.Callback(a);a.autoReset=true;try{a()}catch(b){if(!b.restart){throw b}MathJax.Callback.After(["Try",this,a],b.restart)}},resetLocale:function(a){if(!a){return}a=a.toLowerCase();while(!this.strings[a]){var c=a.lastIndexOf("-");if(c===-1){return}a=a.substring(0,c)}var b=this.strings[a].remap;this.locale=b?b:a;MathJax.Callback.Signal("Hub").Post(["Locale Reset",this.locale])},setLocale:function(a){this.resetLocale(a);if(MathJax.Menu){this.loadDomain("MathMenu")}},addTranslation:function(b,e,c){var d=this.strings[b],a=false;if(!d){d=this.strings[b]={};a=true}if(!d.domains){d.domains={}}if(e){if(!d.domains[e]){d.domains[e]={}}d=d.domains[e]}MathJax.Hub.Insert(d,c);if(a&&MathJax.Menu.menu){MathJax.Menu.CreateLocaleMenu()}},setCSS:function(b){var a=this.strings[this.locale];if(a){if(a.fontFamily){b.style.fontFamily=a.fontFamily}if(a.fontDirection){b.style.direction=a.fontDirection;if(a.fontDirection==="rtl"){b.style.textAlign="right"}}}return b},fontFamily:function(){var a=this.strings[this.locale];return(a?a.fontFamily:null)},fontDirection:function(){var a=this.strings[this.locale];return(a?a.fontDirection:null)},plural:function(b){var a=this.strings[this.locale];if(a&&a.plural){return a.plural(b)}if(b==1){return 1}return 2},number:function(b){var a=this.strings[this.locale];if(a&&a.number){return a.number(b)}return b}};MathJax.Message={ready:false,log:[{}],current:null,textNodeBug:(navigator.vendor==="Apple Computer, Inc."&&typeof navigator.vendorSub==="undefined")||(window.hasOwnProperty&&window.hasOwnProperty("konqueror")),styles:{"#MathJax_Message":{position:"fixed",left:"1px",bottom:"2px","background-color":"#E6E6E6",border:"1px solid #959595",margin:"0px",padding:"2px 8px","z-index":"102",color:"black","font-size":"80%",width:"auto","white-space":"nowrap"},"#MathJax_MSIE_Frame":{position:"absolute",top:0,left:0,width:"0px","z-index":101,border:"0px",margin:"0px",padding:"0px"}},browsers:{MSIE:function(a){MathJax.Message.msieFixedPositionBug=((document.documentMode||0)<7);if(MathJax.Message.msieFixedPositionBug){MathJax.Hub.config.styles["#MathJax_Message"].position="absolute"}MathJax.Message.quirks=(document.compatMode==="BackCompat")},Chrome:function(a){MathJax.Hub.config.styles["#MathJax_Message"].bottom="1.5em";MathJax.Hub.config.styles["#MathJax_Message"].left="1em"}},Init:function(a){if(a){this.ready=true}if(!document.body||!this.ready){return false}if(this.div&&this.div.parentNode==null){this.div=document.getElementById("MathJax_Message");this.text=(this.div?this.div.firstChild:null)}if(!this.div){var b=document.body;if(this.msieFixedPositionBug&&window.attachEvent){b=this.frame=this.addDiv(document.body);b.removeAttribute("id");b.style.position="absolute";b.style.border=b.style.margin=b.style.padding="0px";b.style.zIndex="101";b.style.height="0px";b=this.addDiv(b);b.id="MathJax_MSIE_Frame";window.attachEvent("onscroll",this.MoveFrame);window.attachEvent("onresize",this.MoveFrame);this.MoveFrame()}this.div=this.addDiv(b);this.div.style.display="none"}if(!this.text){this.text=this.div.appendChild(document.createTextNode(""))}return true},addDiv:function(a){var b=document.createElement("div");b.id="MathJax_Message";if(a.firstChild){a.insertBefore(b,a.firstChild)}else{a.appendChild(b)}return b},MoveFrame:function(){var a=(MathJax.Message.quirks?document.body:document.documentElement);var b=MathJax.Message.frame;b.style.left=a.scrollLeft+"px";b.style.top=a.scrollTop+"px";b.style.width=a.clientWidth+"px";b=b.firstChild;b.style.height=a.clientHeight+"px"},localize:function(a){return MathJax.Localization._(a,a)},filterText:function(a,c,b){if(MathJax.Hub.config.messageStyle==="simple"){if(b==="LoadFile"){if(!this.loading){this.loading=this.localize("Loading")+" "}a=this.loading;this.loading+="."}else{if(b==="ProcessMath"){if(!this.processing){this.processing=this.localize("Processing")+" "}a=this.processing;this.processing+="."}else{if(b==="TypesetMath"){if(!this.typesetting){this.typesetting=this.localize("Typesetting")+" "}a=this.typesetting;this.typesetting+="."}}}}return a},clearCounts:function(){delete this.loading;delete this.processing;delete this.typesetting},Set:function(c,e,b){if(e==null){e=this.log.length;this.log[e]={}}var d="";if(MathJax.Object.isArray(c)){d=c[0];if(MathJax.Object.isArray(d)){d=d[1]}try{c=MathJax.Localization._.apply(MathJax.Localization,c)}catch(a){if(!a.restart){throw a}if(!a.restart.called){if(this.log[e].restarted==null){this.log[e].restarted=0}this.log[e].restarted++;delete this.log[e].cleared;MathJax.Callback.After(["Set",this,c,e,b],a.restart);return e}}}if(this.timer){clearTimeout(this.timer);delete this.timer}this.log[e].text=c;this.log[e].filteredText=c=this.filterText(c,e,d);if(typeof(this.log[e].next)==="undefined"){this.log[e].next=this.current;if(this.current!=null){this.log[this.current].prev=e}this.current=e}if(this.current===e&&MathJax.Hub.config.messageStyle!=="none"){if(this.Init()){if(this.textNodeBug){this.div.innerHTML=c}else{this.text.nodeValue=c}this.div.style.display="";if(this.status){window.status="";delete this.status}}else{window.status=c;this.status=true}}if(this.log[e].restarted){if(this.log[e].cleared){b=0}if(--this.log[e].restarted===0){delete this.log[e].cleared}}if(b){setTimeout(MathJax.Callback(["Clear",this,e]),b)}else{if(b==0){this.Clear(e,0)}}return e},Clear:function(b,a){if(this.log[b].prev!=null){this.log[this.log[b].prev].next=this.log[b].next}if(this.log[b].next!=null){this.log[this.log[b].next].prev=this.log[b].prev}if(this.current===b){this.current=this.log[b].next;if(this.text){if(this.div.parentNode==null){this.Init()}if(this.current==null){if(this.timer){clearTimeout(this.timer);delete this.timer}if(a==null){a=600}if(a===0){this.Remove()}else{this.timer=setTimeout(MathJax.Callback(["Remove",this]),a)}}else{if(MathJax.Hub.config.messageStyle!=="none"){if(this.textNodeBug){this.div.innerHTML=this.log[this.current].filteredText}else{this.text.nodeValue=this.log[this.current].filteredText}}}if(this.status){window.status="";delete this.status}}else{if(this.status){window.status=(this.current==null?"":this.log[this.current].text)}}}delete this.log[b].next;delete this.log[b].prev;delete this.log[b].filteredText;if(this.log[b].restarted){this.log[b].cleared=true}},Remove:function(){this.text.nodeValue="";this.div.style.display="none"},File:function(a){return this.Set(["LoadFile","Loading %1",a],null,null)},Log:function(){var b=[];for(var c=1,a=this.log.length;c<a;c++){b[c]=this.log[c].text}return b.join("\n")}};MathJax.Hub={config:{root:"",config:[],styleSheets:[],styles:{".MathJax_Preview":{color:"#888"}},jax:[],extensions:[],preJax:null,postJax:null,displayAlign:"center",displayIndent:"0",preRemoveClass:"MathJax_Preview",showProcessingMessages:true,messageStyle:"normal",delayStartupUntil:"none",skipStartupTypeset:false,elements:[],positionToHash:true,showMathMenu:true,showMathMenuMSIE:true,menuSettings:{zoom:"None",CTRL:false,ALT:false,CMD:false,Shift:false,discoverable:false,zscale:"200%",renderer:null,font:"Auto",context:"MathJax",locale:null,mpContext:false,mpMouse:false,texHints:true,FastPreview:null,assistiveMML:null,inTabOrder:true,semantics:false},errorSettings:{message:["[",["MathProcessingError","Math Processing Error"],"]"],style:{color:"#CC0000","font-style":"italic"}},ignoreMMLattributes:{}},preProcessors:MathJax.Callback.Hooks(true),inputJax:{},outputJax:{order:{}},processSectionDelay:50,processUpdateTime:250,processUpdateDelay:10,signal:MathJax.Callback.Signal("Hub"),Config:function(a){this.Insert(this.config,a);if(this.config.Augment){this.Augment(this.config.Augment)}},CombineConfig:function(c,f){var b=this.config,g,e;c=c.split(/\./);for(var d=0,a=c.length;d<a;d++){g=c[d];if(!b[g]){b[g]={}}e=b;b=b[g]}e[g]=b=this.Insert(f,b);return b},Register:{PreProcessor:function(){return MathJax.Hub.preProcessors.Add.apply(MathJax.Hub.preProcessors,arguments)},MessageHook:function(){return MathJax.Hub.signal.MessageHook.apply(MathJax.Hub.signal,arguments)},StartupHook:function(){return MathJax.Hub.Startup.signal.MessageHook.apply(MathJax.Hub.Startup.signal,arguments)},LoadHook:function(){return MathJax.Ajax.LoadHook.apply(MathJax.Ajax,arguments)}},UnRegister:{PreProcessor:function(a){MathJax.Hub.preProcessors.Remove(a)},MessageHook:function(a){MathJax.Hub.signal.RemoveHook(a)},StartupHook:function(a){MathJax.Hub.Startup.signal.RemoveHook(a)},LoadHook:function(a){MathJax.Ajax.removeHook(a)}},getAllJax:function(e){var c=[],b=this.elementScripts(e);for(var d=0,a=b.length;d<a;d++){if(b[d].MathJax&&b[d].MathJax.elementJax){c.push(b[d].MathJax.elementJax)}}return c},getJaxByType:function(f,e){var c=[],b=this.elementScripts(e);for(var d=0,a=b.length;d<a;d++){if(b[d].MathJax&&b[d].MathJax.elementJax&&b[d].MathJax.elementJax.mimeType===f){c.push(b[d].MathJax.elementJax)}}return c},getJaxByInputType:function(f,e){var c=[],b=this.elementScripts(e);for(var d=0,a=b.length;d<a;d++){if(b[d].MathJax&&b[d].MathJax.elementJax&&b[d].type&&b[d].type.replace(/ *;(.|\s)*/,"")===f){c.push(b[d].MathJax.elementJax)}}return c},getJaxFor:function(a){if(typeof(a)==="string"){a=document.getElementById(a)}if(a&&a.MathJax){return a.MathJax.elementJax}if(this.isMathJaxNode(a)){if(!a.isMathJax){a=a.firstChild}while(a&&!a.jaxID){a=a.parentNode}if(a){return MathJax.OutputJax[a.jaxID].getJaxFromMath(a)}}return null},isJax:function(a){if(typeof(a)==="string"){a=document.getElementById(a)}if(this.isMathJaxNode(a)){return 1}if(a&&(a.tagName||"").toLowerCase()==="script"){if(a.MathJax){return(a.MathJax.state===MathJax.ElementJax.STATE.PROCESSED?1:-1)}if(a.type&&this.inputJax[a.type.replace(/ *;(.|\s)*/,"")]){return -1}}return 0},isMathJaxNode:function(a){return !!a&&(a.isMathJax||(a.className||"")==="MathJax_MathML")},setRenderer:function(d,c){if(!d){return}if(!MathJax.OutputJax[d]){this.config.menuSettings.renderer="";var b="[MathJax]/jax/output/"+d+"/config.js";return MathJax.Ajax.Require(b,["setRenderer",this,d,c])}else{this.config.menuSettings.renderer=d;if(c==null){c="jax/mml"}var a=this.outputJax;if(a[c]&&a[c].length){if(d!==a[c][0].id){a[c].unshift(MathJax.OutputJax[d]);return this.signal.Post(["Renderer Selected",d])}}return null}},Queue:function(){return this.queue.Push.apply(this.queue,arguments)},Typeset:function(c,d){if(!MathJax.isReady){return null}var b=this.elementCallback(c,d);if(b.count){var a=MathJax.Callback.Queue(["PreProcess",this,b.elements],["Process",this,b.elements])}return a.Push(b.callback)},PreProcess:function(e,g){var c=this.elementCallback(e,g);var b=MathJax.Callback.Queue();if(c.count){var f=(c.count===1?[c.elements]:c.elements);b.Push(["Post",this.signal,["Begin PreProcess",c.elements]]);for(var d=0,a=f.length;d<a;d++){if(f[d]){b.Push(["Execute",this.preProcessors,f[d]])}}b.Push(["Post",this.signal,["End PreProcess",c.elements]])}return b.Push(c.callback)},Process:function(a,b){return this.takeAction("Process",a,b)},Update:function(a,b){return this.takeAction("Update",a,b)},Reprocess:function(a,b){return this.takeAction("Reprocess",a,b)},Rerender:function(a,b){return this.takeAction("Rerender",a,b)},takeAction:function(g,d,h){var c=this.elementCallback(d,h);var f=c.elements;var a=MathJax.Callback.Queue(["Clear",this.signal]);var e={scripts:[],start:new Date().getTime(),i:0,j:0,jax:{},jaxIDs:[]};if(c.count){var b=["Delay",MathJax.Callback,this.processSectionDelay];if(!b[2]){b={}}a.Push(["clearCounts",MathJax.Message],["Post",this.signal,["Begin "+g,f]],["Post",this.signal,["Begin Math",f,g]],["prepareScripts",this,g,f,e],["Post",this.signal,["Begin Math Input",f,g]],["processInput",this,e],["Post",this.signal,["End Math Input",f,g]],b,["prepareOutput",this,e,"preProcess"],b,["Post",this.signal,["Begin Math Output",f,g]],["processOutput",this,e],["Post",this.signal,["End Math Output",f,g]],b,["prepareOutput",this,e,"postProcess"],b,["Post",this.signal,["End Math",f,g]],["Post",this.signal,["End "+g,f]],["clearCounts",MathJax.Message])}return a.Push(c.callback)},scriptAction:{Process:function(a){},Update:function(b){var a=b.MathJax.elementJax;if(a&&a.needsUpdate()){a.Remove(true);b.MathJax.state=a.STATE.UPDATE}else{b.MathJax.state=a.STATE.PROCESSED}},Reprocess:function(b){var a=b.MathJax.elementJax;if(a){a.Remove(true);b.MathJax.state=a.STATE.UPDATE}},Rerender:function(b){var a=b.MathJax.elementJax;if(a){a.Remove(true);b.MathJax.state=a.STATE.OUTPUT}}},prepareScripts:function(h,e,g){if(arguments.callee.disabled){return}var b=this.elementScripts(e);var f=MathJax.ElementJax.STATE;for(var d=0,a=b.length;d<a;d++){var c=b[d];if(c.type&&this.inputJax[c.type.replace(/ *;(.|\n)*/,"")]){if(c.MathJax){if(c.MathJax.elementJax&&c.MathJax.elementJax.hover){MathJax.Extension.MathEvents.Hover.ClearHover(c.MathJax.elementJax)}if(c.MathJax.state!==f.PENDING){this.scriptAction[h](c)}}if(!c.MathJax){c.MathJax={state:f.PENDING}}if(c.MathJax.error){delete c.MathJax.error}if(c.MathJax.state!==f.PROCESSED){g.scripts.push(c)}}}},checkScriptSiblings:function(a){if(a.MathJax.checked){return}var b=this.config,f=a.previousSibling;if(f&&f.nodeName==="#text"){var d,e,c=a.nextSibling;if(c&&c.nodeName!=="#text"){c=null}if(b.preJax){if(typeof(b.preJax)==="string"){b.preJax=new RegExp(b.preJax+"$")}d=f.nodeValue.match(b.preJax)}if(b.postJax&&c){if(typeof(b.postJax)==="string"){b.postJax=new RegExp("^"+b.postJax)}e=c.nodeValue.match(b.postJax)}if(d&&(!b.postJax||e)){f.nodeValue=f.nodeValue.replace(b.preJax,(d.length>1?d[1]:""));f=null}if(e&&(!b.preJax||d)){c.nodeValue=c.nodeValue.replace(b.postJax,(e.length>1?e[1]:""))}if(f&&!f.nodeValue.match(/\S/)){f=f.previousSibling}}if(b.preRemoveClass&&f&&f.className===b.preRemoveClass){a.MathJax.preview=f}a.MathJax.checked=1},processInput:function(a){var b,i=MathJax.ElementJax.STATE;var h,e,d=a.scripts.length;try{while(a.i<d){h=a.scripts[a.i];if(!h){a.i++;continue}e=h.previousSibling;if(e&&e.className==="MathJax_Error"){e.parentNode.removeChild(e)}if(!h.parentNode||!h.MathJax||h.MathJax.state===i.PROCESSED){a.i++;continue}if(!h.MathJax.elementJax||h.MathJax.state===i.UPDATE){this.checkScriptSiblings(h);var g=h.type.replace(/ *;(.|\s)*/,"");var j=this.inputJax[g];b=j.Process(h,a);if(typeof b==="function"){if(b.called){continue}this.RestartAfter(b)}b=b.Attach(h,j.id);this.saveScript(b,a,h,i);this.postInputHooks.Execute(b,j.id,h)}else{if(h.MathJax.state===i.OUTPUT){this.saveScript(h.MathJax.elementJax,a,h,i)}}a.i++;var c=new Date().getTime();if(c-a.start>this.processUpdateTime&&a.i<a.scripts.length){a.start=c;this.RestartAfter(MathJax.Callback.Delay(1))}}}catch(f){return this.processError(f,a,"Input")}if(a.scripts.length&&this.config.showProcessingMessages){MathJax.Message.Set(["ProcessMath","Processing math: %1%%",100],0)}a.start=new Date().getTime();a.i=a.j=0;return null},postInputHooks:MathJax.Callback.Hooks(true),saveScript:function(a,d,b,c){if(!this.outputJax[a.mimeType]){b.MathJax.state=c.UPDATE;throw Error("No output jax registered for "+a.mimeType)}a.outputJax=this.outputJax[a.mimeType][0].id;if(!d.jax[a.outputJax]){if(d.jaxIDs.length===0){d.jax[a.outputJax]=d.scripts}else{if(d.jaxIDs.length===1){d.jax[d.jaxIDs[0]]=d.scripts.slice(0,d.i)}d.jax[a.outputJax]=[]}d.jaxIDs.push(a.outputJax)}if(d.jaxIDs.length>1){d.jax[a.outputJax].push(b)}b.MathJax.state=c.OUTPUT},prepareOutput:function(c,f){while(c.j<c.jaxIDs.length){var e=c.jaxIDs[c.j],d=MathJax.OutputJax[e];if(d[f]){try{var a=d[f](c);if(typeof a==="function"){if(a.called){continue}this.RestartAfter(a)}}catch(b){if(!b.restart){MathJax.Message.Set(["PrepError","Error preparing %1 output (%2)",e,f],null,600);MathJax.Hub.lastPrepError=b;c.j++}return MathJax.Callback.After(["prepareOutput",this,c,f],b.restart)}}c.j++}return null},processOutput:function(h){var b,g=MathJax.ElementJax.STATE,d,a=h.scripts.length;try{while(h.i<a){d=h.scripts[h.i];if(!d||!d.parentNode||!d.MathJax||d.MathJax.error){h.i++;continue}var c=d.MathJax.elementJax;if(!c){h.i++;continue}b=MathJax.OutputJax[c.outputJax].Process(d,h);if(b!==false){d.MathJax.state=g.PROCESSED;if(d.MathJax.preview){d.MathJax.preview.innerHTML="";d.MathJax.preview.style.display="none"}this.signal.Post(["New Math",c.inputID])}h.i++;var e=new Date().getTime();if(e-h.start>this.processUpdateTime&&h.i<h.scripts.length){h.start=e;this.RestartAfter(MathJax.Callback.Delay(this.processUpdateDelay))}}}catch(f){return this.processError(f,h,"Output")}if(h.scripts.length&&this.config.showProcessingMessages){MathJax.Message.Set(["TypesetMath","Typesetting math: %1%%",100],0);MathJax.Message.Clear(0)}h.i=h.j=0;return null},processMessage:function(d,b){var a=Math.floor(d.i/(d.scripts.length)*100);var c=(b==="Output"?["TypesetMath","Typesetting math: %1%%"]:["ProcessMath","Processing math: %1%%"]);if(this.config.showProcessingMessages){MathJax.Message.Set(c.concat(a),0)}},processError:function(b,c,a){if(!b.restart){if(!this.config.errorSettings.message){throw b}this.formatError(c.scripts[c.i],b);c.i++}this.processMessage(c,a);return MathJax.Callback.After(["process"+a,this,c],b.restart)},formatError:function(b,f){var h=function(l,k,j,i){return MathJax.Localization._(l,k,j,i)};var e=h("ErrorMessage","Error: %1",f.message)+"\n";if(f.sourceURL||f.fileName){e+="\n"+h("ErrorFile","file: %1",f.sourceURL||f.fileName)}if(f.line||f.lineNumber){e+="\n"+h("ErrorLine","line: %1",f.line||f.lineNumber)}e+="\n\n"+h("ErrorTips","Debugging tips: use %1, inspect %2 in the browser console","'unpacked/MathJax.js'","'MathJax.Hub.lastError'");b.MathJax.error=MathJax.OutputJax.Error.Jax(e,b);if(b.MathJax.elementJax){b.MathJax.error.inputID=b.MathJax.elementJax.inputID}var g=this.config.errorSettings;var a=h(g.messageId,g.message);var c=MathJax.HTML.Element("span",{className:"MathJax_Error",jaxID:"Error",isMathJax:true,id:b.MathJax.error.inputID+"-Frame"},[["span",null,a]]);MathJax.Ajax.Require("[MathJax]/extensions/MathEvents.js",function(){var j=MathJax.Extension.MathEvents.Event,i=MathJax.Hub;c.oncontextmenu=j.Menu;c.onmousedown=j.Mousedown;c.onkeydown=j.Keydown;c.tabIndex=i.getTabOrder(i.getJaxFor(b))});var d=document.getElementById(c.id);if(d){d.parentNode.removeChild(d)}if(b.parentNode){b.parentNode.insertBefore(c,b)}if(b.MathJax.preview){b.MathJax.preview.innerHTML="";b.MathJax.preview.style.display="none"}this.lastError=f;this.signal.Post(["Math Processing Error",b,f])},RestartAfter:function(a){throw this.Insert(Error("restart"),{restart:MathJax.Callback(a)})},elementCallback:function(c,f){if(f==null&&(MathJax.Object.isArray(c)||typeof c==="function")){try{MathJax.Callback(c);f=c;c=null}catch(d){}}if(c==null){c=this.config.elements||[]}if(this.isHTMLCollection(c)){c=this.HTMLCollection2Array(c)}if(!MathJax.Object.isArray(c)){c=[c]}c=[].concat(c);for(var b=0,a=c.length;b<a;b++){if(typeof(c[b])==="string"){c[b]=document.getElementById(c[b])}}if(!document.body){document.body=document.getElementsByTagName("body")[0]}if(c.length==0){c.push(document.body)}if(!f){f={}}return{count:c.length,elements:(c.length===1?c[0]:c),callback:f}},elementScripts:function(e){var b=[];if(MathJax.Object.isArray(e)||this.isHTMLCollection(e)){for(var d=0,a=e.length;d<a;d++){var f=0;for(var c=0;c<d&&!f;c++){f=e[c].contains(e[d])}if(!f){b.push.apply(b,this.elementScripts(e[d]))}}return b}if(typeof(e)==="string"){e=document.getElementById(e)}if(!document.body){document.body=document.getElementsByTagName("body")[0]}if(e==null){e=document.body}if(e.tagName!=null&&e.tagName.toLowerCase()==="script"){return[e]}b=e.getElementsByTagName("script");if(this.msieHTMLCollectionBug){b=this.HTMLCollection2Array(b)}return b},isHTMLCollection:function(a){return("HTMLCollection" in window&&typeof(a)==="object"&&a instanceof HTMLCollection)},HTMLCollection2Array:function(c){if(!this.msieHTMLCollectionBug){return[].slice.call(c)}var b=[];for(var d=0,a=c.length;d<a;d++){b[d]=c[d]}return b},Insert:function(c,a){for(var b in a){if(a.hasOwnProperty(b)){if(typeof a[b]==="object"&&!(MathJax.Object.isArray(a[b]))&&(typeof c[b]==="object"||typeof c[b]==="function")){this.Insert(c[b],a[b])}else{c[b]=a[b]}}}return c},getTabOrder:function(a){return this.config.menuSettings.inTabOrder?0:-1},SplitList:("trim" in String.prototype?function(a){return a.trim().split(/\s+/)}:function(a){return a.replace(/^\s+/,"").replace(/\s+$/,"").split(/\s+/)})};MathJax.Hub.Insert(MathJax.Hub.config.styles,MathJax.Message.styles);MathJax.Hub.Insert(MathJax.Hub.config.styles,{".MathJax_Error":MathJax.Hub.config.errorSettings.style});MathJax.Extension={};MathJax.Hub.Configured=MathJax.Callback({});MathJax.Hub.Startup={script:"",queue:MathJax.Callback.Queue(),signal:MathJax.Callback.Signal("Startup"),params:{},Config:function(){this.queue.Push(["Post",this.signal,"Begin Config"]);if(MathJax.AuthorConfig&&MathJax.AuthorConfig.root){MathJax.Ajax.config.root=MathJax.AuthorConfig.root}if(this.params.locale){MathJax.Localization.resetLocale(this.params.locale);MathJax.Hub.config.menuSettings.locale=this.params.locale}if(this.params.config){var c=this.params.config.split(/,/);for(var b=0,a=c.length;b<a;b++){if(!c[b].match(/\.js$/)){c[b]+=".js"}this.queue.Push(["Require",MathJax.Ajax,this.URL("config",c[b])])}}this.queue.Push(["Config",MathJax.Hub,MathJax.AuthorConfig]);if(this.script.match(/\S/)){this.queue.Push(this.script+";\n1;")}this.queue.Push(["ConfigDelay",this],["ConfigBlocks",this],[function(d){return d.loadArray(MathJax.Hub.config.config,"config",null,true)},this],["Post",this.signal,"End Config"])},ConfigDelay:function(){var a=this.params.delayStartupUntil||MathJax.Hub.config.delayStartupUntil;if(a==="onload"){return this.onload}if(a==="configured"){return MathJax.Hub.Configured}return a},ConfigBlocks:function(){var c=document.getElementsByTagName("script");var b=MathJax.Callback.Queue();for(var d=0,a=c.length;d<a;d++){var e=String(c[d].type).replace(/ /g,"");if(e.match(/^text\/x-mathjax-config(;.*)?$/)&&!e.match(/;executed=true/)){c[d].type+=";executed=true";b.Push(c[d].innerHTML+";\n1;")}}return b.Push(function(){MathJax.Ajax.config.root=MathJax.Hub.config.root})},Cookie:function(){return this.queue.Push(["Post",this.signal,"Begin Cookie"],["Get",MathJax.HTML.Cookie,"menu",MathJax.Hub.config.menuSettings],[function(e){var d=e.menuSettings;if(d.locale){MathJax.Localization.resetLocale(d.locale)}var g=e.menuSettings.renderer,b=e.jax;if(g){var c="output/"+g;b.sort();for(var f=0,a=b.length;f<a;f++){if(b[f].substr(0,7)==="output/"){break}}if(f==a-1){b.pop()}else{while(f<a){if(b[f]===c){b.splice(f,1);break}f++}}b.unshift(c)}if(d.CHTMLpreview!=null){if(d.FastPreview==null){d.FastPreview=d.CHTMLpreview}delete d.CHTMLpreview}if(d.FastPreview&&!MathJax.Extension["fast-preview"]){MathJax.Hub.config.extensions.push("fast-preview.js")}if(e.menuSettings.assistiveMML&&!MathJax.Extension.AssistiveMML){MathJax.Hub.config.extensions.push("AssistiveMML.js")}},MathJax.Hub.config],["Post",this.signal,"End Cookie"])},Styles:function(){return this.queue.Push(["Post",this.signal,"Begin Styles"],["loadArray",this,MathJax.Hub.config.styleSheets,"config"],["Styles",MathJax.Ajax,MathJax.Hub.config.styles],["Post",this.signal,"End Styles"])},Jax:function(){var f=MathJax.Hub.config,c=MathJax.Hub.outputJax;for(var g=0,b=f.jax.length,d=0;g<b;g++){var e=f.jax[g].substr(7);if(f.jax[g].substr(0,7)==="output/"&&c.order[e]==null){c.order[e]=d;d++}}var a=MathJax.Callback.Queue();return a.Push(["Post",this.signal,"Begin Jax"],["loadArray",this,f.jax,"jax","config.js"],["Post",this.signal,"End Jax"])},Extensions:function(){var a=MathJax.Callback.Queue();return a.Push(["Post",this.signal,"Begin Extensions"],["loadArray",this,MathJax.Hub.config.extensions,"extensions"],["Post",this.signal,"End Extensions"])},Message:function(){MathJax.Message.Init(true)},Menu:function(){var b=MathJax.Hub.config.menuSettings,a=MathJax.Hub.outputJax,d;for(var c in a){if(a.hasOwnProperty(c)){if(a[c].length){d=a[c];break}}}if(d&&d.length){if(b.renderer&&b.renderer!==d[0].id){d.unshift(MathJax.OutputJax[b.renderer])}b.renderer=d[0].id}},Hash:function(){if(MathJax.Hub.config.positionToHash&&document.location.hash&&document.body&&document.body.scrollIntoView){var d=decodeURIComponent(document.location.hash.substr(1));var f=document.getElementById(d);if(!f){var c=document.getElementsByTagName("a");for(var e=0,b=c.length;e<b;e++){if(c[e].name===d){f=c[e];break}}}if(f){while(!f.scrollIntoView){f=f.parentNode}f=this.HashCheck(f);if(f&&f.scrollIntoView){setTimeout(function(){f.scrollIntoView(true)},1)}}}},HashCheck:function(b){var a=MathJax.Hub.getJaxFor(b);if(a&&MathJax.OutputJax[a.outputJax].hashCheck){b=MathJax.OutputJax[a.outputJax].hashCheck(b)}return b},MenuZoom:function(){if(MathJax.Hub.config.showMathMenu){if(!MathJax.Extension.MathMenu){setTimeout(function(){MathJax.Callback.Queue(["Require",MathJax.Ajax,"[MathJax]/extensions/MathMenu.js",{}],["loadDomain",MathJax.Localization,"MathMenu"])},1000)}else{setTimeout(MathJax.Callback(["loadDomain",MathJax.Localization,"MathMenu"]),1000)}if(!MathJax.Extension.MathZoom){setTimeout(MathJax.Callback(["Require",MathJax.Ajax,"[MathJax]/extensions/MathZoom.js",{}]),2000)}}},onLoad:function(){var a=this.onload=MathJax.Callback(function(){MathJax.Hub.Startup.signal.Post("onLoad")});if(document.body&&document.readyState){if(MathJax.Hub.Browser.isMSIE){if(document.readyState==="complete"){return[a]}}else{if(document.readyState!=="loading"){return[a]}}}if(window.addEventListener){window.addEventListener("load",a,false);if(!this.params.noDOMContentEvent){window.addEventListener("DOMContentLoaded",a,false)}}else{if(window.attachEvent){window.attachEvent("onload",a)}else{window.onload=a}}return a},Typeset:function(a,b){if(MathJax.Hub.config.skipStartupTypeset){return function(){}}return this.queue.Push(["Post",this.signal,"Begin Typeset"],["Typeset",MathJax.Hub,a,b],["Post",this.signal,"End Typeset"])},URL:function(b,a){if(!a.match(/^([a-z]+:\/\/|\[|\/)/)){a="[MathJax]/"+b+"/"+a}return a},loadArray:function(b,f,c,a){if(b){if(!MathJax.Object.isArray(b)){b=[b]}if(b.length){var h=MathJax.Callback.Queue(),j={},e;for(var g=0,d=b.length;g<d;g++){e=this.URL(f,b[g]);if(c){e+="/"+c}if(a){h.Push(["Require",MathJax.Ajax,e,j])}else{h.Push(MathJax.Ajax.Require(e,j))}}return h.Push({})}}return null}};(function(d){var b=window[d],e="["+d+"]";var c=b.Hub,a=b.Ajax,f=b.Callback;var g=MathJax.Object.Subclass({JAXFILE:"jax.js",require:null,config:{},Init:function(i,h){if(arguments.length===0){return this}return(this.constructor.Subclass(i,h))()},Augment:function(k,j){var i=this.constructor,h={};if(k!=null){for(var l in k){if(k.hasOwnProperty(l)){if(typeof k[l]==="function"){i.protoFunction(l,k[l])}else{h[l]=k[l]}}}if(k.toString!==i.prototype.toString&&k.toString!=={}.toString){i.protoFunction("toString",k.toString)}}c.Insert(i.prototype,h);i.Augment(null,j);return this},Translate:function(h,i){throw Error(this.directory+"/"+this.JAXFILE+" failed to define the Translate() method")},Register:function(h){},Config:function(){this.config=c.CombineConfig(this.id,this.config);if(this.config.Augment){this.Augment(this.config.Augment)}},Startup:function(){},loadComplete:function(i){if(i==="config.js"){return a.loadComplete(this.directory+"/"+i)}else{var h=f.Queue();h.Push(c.Register.StartupHook("End Config",{}),["Post",c.Startup.signal,this.id+" Jax Config"],["Config",this],["Post",c.Startup.signal,this.id+" Jax Require"],[function(j){return MathJax.Hub.Startup.loadArray(j.require,this.directory)},this],[function(j,k){return MathJax.Hub.Startup.loadArray(j.extensions,"extensions/"+k)},this.config||{},this.id],["Post",c.Startup.signal,this.id+" Jax Startup"],["Startup",this],["Post",c.Startup.signal,this.id+" Jax Ready"]);if(this.copyTranslate){h.Push([function(j){j.preProcess=j.preTranslate;j.Process=j.Translate;j.postProcess=j.postTranslate},this.constructor.prototype])}return h.Push(["loadComplete",a,this.directory+"/"+i])}}},{id:"Jax",version:"2.7.4",directory:e+"/jax",extensionDir:e+"/extensions"});b.InputJax=g.Subclass({elementJax:"mml",sourceMenuTitle:["Original","Original Form"],copyTranslate:true,Process:function(l,q){var j=f.Queue(),o;var k=this.elementJax;if(!b.Object.isArray(k)){k=[k]}for(var n=0,h=k.length;n<h;n++){o=b.ElementJax.directory+"/"+k[n]+"/"+this.JAXFILE;if(!this.require){this.require=[]}else{if(!b.Object.isArray(this.require)){this.require=[this.require]}}this.require.push(o);j.Push(a.Require(o))}o=this.directory+"/"+this.JAXFILE;var p=j.Push(a.Require(o));if(!p.called){this.constructor.prototype.Process=function(){if(!p.called){return p}throw Error(o+" failed to load properly")}}k=c.outputJax["jax/"+k[0]];if(k){j.Push(a.Require(k[0].directory+"/"+this.JAXFILE))}return j.Push({})},needsUpdate:function(h){var i=h.SourceElement();return(h.originalText!==b.HTML.getScript(i))},Register:function(h){if(!c.inputJax){c.inputJax={}}c.inputJax[h]=this}},{id:"InputJax",version:"2.7.4",directory:g.directory+"/input",extensionDir:g.extensionDir});b.OutputJax=g.Subclass({copyTranslate:true,preProcess:function(j){var i,h=this.directory+"/"+this.JAXFILE;this.constructor.prototype.preProcess=function(k){if(!i.called){return i}throw Error(h+" failed to load properly")};i=a.Require(h);return i},Register:function(i){var h=c.outputJax;if(!h[i]){h[i]=[]}if(h[i].length&&(this.id===c.config.menuSettings.renderer||(h.order[this.id]||0)<(h.order[h[i][0].id]||0))){h[i].unshift(this)}else{h[i].push(this)}if(!this.require){this.require=[]}else{if(!b.Object.isArray(this.require)){this.require=[this.require]}}this.require.push(b.ElementJax.directory+"/"+(i.split(/\//)[1])+"/"+this.JAXFILE)},Remove:function(h){}},{id:"OutputJax",version:"2.7.4",directory:g.directory+"/output",extensionDir:g.extensionDir,fontDir:e+(b.isPacked?"":"/..")+"/fonts",imageDir:e+(b.isPacked?"":"/..")+"/images"});b.ElementJax=g.Subclass({Init:function(i,h){return this.constructor.Subclass(i,h)},inputJax:null,outputJax:null,inputID:null,originalText:"",mimeType:"",sourceMenuTitle:["MathMLcode","MathML Code"],Text:function(i,j){var h=this.SourceElement();b.HTML.setScript(h,i);h.MathJax.state=this.STATE.UPDATE;return c.Update(h,j)},Reprocess:function(i){var h=this.SourceElement();h.MathJax.state=this.STATE.UPDATE;return c.Reprocess(h,i)},Update:function(h){return this.Rerender(h)},Rerender:function(i){var h=this.SourceElement();h.MathJax.state=this.STATE.OUTPUT;return c.Process(h,i)},Remove:function(h){if(this.hover){this.hover.clear(this)}b.OutputJax[this.outputJax].Remove(this);if(!h){c.signal.Post(["Remove Math",this.inputID]);this.Detach()}},needsUpdate:function(){return b.InputJax[this.inputJax].needsUpdate(this)},SourceElement:function(){return document.getElementById(this.inputID)},Attach:function(i,j){var h=i.MathJax.elementJax;if(i.MathJax.state===this.STATE.UPDATE){h.Clone(this)}else{h=i.MathJax.elementJax=this;if(i.id){this.inputID=i.id}else{i.id=this.inputID=b.ElementJax.GetID();this.newID=1}}h.originalText=b.HTML.getScript(i);h.inputJax=j;if(h.root){h.root.inputID=h.inputID}return h},Detach:function(){var h=this.SourceElement();if(!h){return}try{delete h.MathJax}catch(i){h.MathJax=null}if(this.newID){h.id=""}},Clone:function(h){var i;for(i in this){if(!this.hasOwnProperty(i)){continue}if(typeof(h[i])==="undefined"&&i!=="newID"){delete this[i]}}for(i in h){if(!h.hasOwnProperty(i)){continue}if(typeof(this[i])==="undefined"||(this[i]!==h[i]&&i!=="inputID")){this[i]=h[i]}}}},{id:"ElementJax",version:"2.7.4",directory:g.directory+"/element",extensionDir:g.extensionDir,ID:0,STATE:{PENDING:1,PROCESSED:2,UPDATE:3,OUTPUT:4},GetID:function(){this.ID++;return"MathJax-Element-"+this.ID},Subclass:function(){var h=g.Subclass.apply(this,arguments);h.loadComplete=this.prototype.loadComplete;return h}});b.ElementJax.prototype.STATE=b.ElementJax.STATE;b.OutputJax.Error={id:"Error",version:"2.7.4",config:{},errors:0,ContextMenu:function(){return b.Extension.MathEvents.Event.ContextMenu.apply(b.Extension.MathEvents.Event,arguments)},Mousedown:function(){return b.Extension.MathEvents.Event.AltContextMenu.apply(b.Extension.MathEvents.Event,arguments)},getJaxFromMath:function(h){return(h.nextSibling.MathJax||{}).error},Jax:function(j,i){var h=MathJax.Hub.inputJax[i.type.replace(/ *;(.|\s)*/,"")];this.errors++;return{inputJax:(h||{id:"Error"}).id,outputJax:"Error",inputID:"MathJax-Error-"+this.errors,sourceMenuTitle:["ErrorMessage","Error Message"],sourceMenuFormat:"Error",originalText:MathJax.HTML.getScript(i),errorText:j}}};b.InputJax.Error={id:"Error",version:"2.7.4",config:{},sourceMenuTitle:["Original","Original Form"]}})("MathJax");(function(o){var h=window[o];if(!h){h=window[o]={}}var d=h.Hub;var s=d.Startup;var w=d.config;var g=document.head||(document.getElementsByTagName("head")[0]);if(!g){g=document.childNodes[0]}var b=(document.documentElement||document).getElementsByTagName("script");if(b.length===0&&g.namespaceURI){b=document.getElementsByTagNameNS(g.namespaceURI,"script")}var f=new RegExp("(^|/)"+o+"\\.js(\\?.*)?$");for(var q=b.length-1;q>=0;q--){if((b[q].src||"").match(f)){s.script=b[q].innerHTML;if(RegExp.$2){var t=RegExp.$2.substr(1).split(/\&/);for(var p=0,l=t.length;p<l;p++){var n=t[p].match(/(.*)=(.*)/);if(n){s.params[unescape(n[1])]=unescape(n[2])}else{s.params[t[p]]=true}}}w.root=b[q].src.replace(/(^|\/)[^\/]*(\?.*)?$/,"");h.Ajax.config.root=w.root;h.Ajax.params=s.params;break}}var k=navigator.userAgent;var a={isMac:(navigator.platform.substr(0,3)==="Mac"),isPC:(navigator.platform.substr(0,3)==="Win"),isMSIE:("ActiveXObject" in window&&"clipboardData" in window),isEdge:("MSGestureEvent" in window&&"chrome" in window&&window.chrome.loadTimes==null),isFirefox:(!!k.match(/Gecko\//)&&!k.match(/like Gecko/)),isSafari:(!!k.match(/ (Apple)?WebKit\//)&&!k.match(/ like iPhone /)&&(!window.chrome||window.chrome.app==null)),isChrome:("chrome" in window&&window.chrome.loadTimes!=null),isOpera:("opera" in window&&window.opera.version!=null),isKonqueror:("konqueror" in window&&navigator.vendor=="KDE"),versionAtLeast:function(y){var x=(this.version).split(".");y=(new String(y)).split(".");for(var z=0,j=y.length;z<j;z++){if(x[z]!=y[z]){return parseInt(x[z]||"0")>=parseInt(y[z])}}return true},Select:function(j){var i=j[d.Browser];if(i){return i(d.Browser)}return null}};var e=k.replace(/^Mozilla\/(\d+\.)+\d+ /,"").replace(/[a-z][-a-z0-9._: ]+\/\d+[^ ]*-[^ ]*\.([a-z][a-z])?\d+ /i,"").replace(/Gentoo |Ubuntu\/(\d+\.)*\d+ (\([^)]*\) )?/,"");d.Browser=d.Insert(d.Insert(new String("Unknown"),{version:"0.0"}),a);for(var v in a){if(a.hasOwnProperty(v)){if(a[v]&&v.substr(0,2)==="is"){v=v.slice(2);if(v==="Mac"||v==="PC"){continue}d.Browser=d.Insert(new String(v),a);var r=new RegExp(".*(Version/| Trident/.*; rv:)((?:\\d+\\.)+\\d+)|.*("+v+")"+(v=="MSIE"?" ":"/")+"((?:\\d+\\.)*\\d+)|(?:^|\\(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:\\d+\\.)+\\d+)");var u=r.exec(e)||["","","","unknown","0.0"];d.Browser.name=(u[1]!=""?v:(u[3]||u[5]));d.Browser.version=u[2]||u[4]||u[6];break}}}try{d.Browser.Select({Safari:function(j){var i=parseInt((String(j.version).split("."))[0]);if(i>85){j.webkit=j.version}if(i>=538){j.version="8.0"}else{if(i>=537){j.version="7.0"}else{if(i>=536){j.version="6.0"}else{if(i>=534){j.version="5.1"}else{if(i>=533){j.version="5.0"}else{if(i>=526){j.version="4.0"}else{if(i>=525){j.version="3.1"}else{if(i>500){j.version="3.0"}else{if(i>400){j.version="2.0"}else{if(i>85){j.version="1.0"}}}}}}}}}}j.webkit=(navigator.appVersion.match(/WebKit\/(\d+)\./))[1];j.isMobile=(navigator.appVersion.match(/Mobile/i)!=null);j.noContextMenu=j.isMobile},Firefox:function(j){if((j.version==="0.0"||k.match(/Firefox/)==null)&&navigator.product==="Gecko"){var m=k.match(/[\/ ]rv:(\d+\.\d.*?)[\) ]/);if(m){j.version=m[1]}else{var i=(navigator.buildID||navigator.productSub||"0").substr(0,8);if(i>="20111220"){j.version="9.0"}else{if(i>="20111120"){j.version="8.0"}else{if(i>="20110927"){j.version="7.0"}else{if(i>="20110816"){j.version="6.0"}else{if(i>="20110621"){j.version="5.0"}else{if(i>="20110320"){j.version="4.0"}else{if(i>="20100121"){j.version="3.6"}else{if(i>="20090630"){j.version="3.5"}else{if(i>="20080617"){j.version="3.0"}else{if(i>="20061024"){j.version="2.0"}}}}}}}}}}}}j.isMobile=(navigator.appVersion.match(/Android/i)!=null||k.match(/ Fennec\//)!=null||k.match(/Mobile/)!=null)},Chrome:function(i){i.noContextMenu=i.isMobile=!!navigator.userAgent.match(/ Mobile[ \/]/)},Opera:function(i){i.version=opera.version()},Edge:function(i){i.isMobile=!!navigator.userAgent.match(/ Phone/)},MSIE:function(j){j.isMobile=!!navigator.userAgent.match(/ Phone/);j.isIE9=!!(document.documentMode&&(window.performance||window.msPerformance));MathJax.HTML.setScriptBug=!j.isIE9||document.documentMode<9;MathJax.Hub.msieHTMLCollectionBug=(document.documentMode<9);if(document.documentMode<10&&!s.params.NoMathPlayer){try{new ActiveXObject("MathPlayer.Factory.1");j.hasMathPlayer=true}catch(m){}try{if(j.hasMathPlayer){var i=document.createElement("object");i.id="mathplayer";i.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";g.appendChild(i);document.namespaces.add("m","http://www.w3.org/1998/Math/MathML");j.mpNamespace=true;if(document.readyState&&(document.readyState==="loading"||document.readyState==="interactive")){document.write('<?import namespace="m" implementation="#MathPlayer">');j.mpImported=true}}else{document.namespaces.add("mjx_IE_fix","http://www.w3.org/1999/xlink")}}catch(m){}}}})}catch(c){console.error(c.message)}d.Browser.Select(MathJax.Message.browsers);if(h.AuthorConfig&&typeof h.AuthorConfig.AuthorInit==="function"){h.AuthorConfig.AuthorInit()}d.queue=h.Callback.Queue();d.queue.Push(["Post",s.signal,"Begin"],["Config",s],["Cookie",s],["Styles",s],["Message",s],function(){var i=h.Callback.Queue(s.Jax(),s.Extensions());return i.Push({})},["Menu",s],s.onLoad(),function(){MathJax.isReady=true},["Typeset",s],["Hash",s],["MenuZoom",s],["Post",s.signal,"End"])})("MathJax")}};
</script>
<script>MathJax.Hub.Config({
tex2jax: {
preview: "none",
inlineMath: [['$', '$'], ["\\(", "\\)"]],
processEscapes: true
},
messageStyle: "none"
});
function setStickyMenu () {
var options = {
bottoming: false,
inner_scrolling: false
};
var sticky = "#TOC";
var width = $(window).width();
if (width >= 768) {
console.log('fold in');
//$(sticky).hide();
//$(sticky).show();
$(sticky).stick_in_parent(options);
// $(".well ul").addClass('menu');
$(".well ul").attr('id', 'accordion-1');
} else {
$(".well ul").attr('id', '');
$(sticky).trigger("sticky_kit:detach");
console.log('fold out');
}
};
$(document).ready(function () {
$(window).on('resize', function () {
setStickyMenu();
});
});
function doAccordion () {
$("#accordion-1").dcAccordion({
eventType: 'click',
autoClose: false,
saveState: false,
disableLink: false,
speed: 0,
showCount: true,
autoExpand: true,
cookie: 'dcjq-accordion-1',
classExpand: 'dcjq-current-parent'
});
}
$(document).ready(function () {
setStickyMenu();
doAccordion();
});
$(document).ready(function () {
$( 'table' ).addClass( "table" );
});
/*
$(window).resize(function() {
if(this.resizeTO) clearTimeout(this.resizeTO);
this.resizeTO = setTimeout(function() {
$(this).trigger('resizeEnd');
}, 200);
});
$(window).bind('resizeEnd', function() {
//do something, window hasn't changed size in 500ms
//window.location = location.pathname + location.hash;
//location.reload();
setStickyMenu();
});*/
</script>
<script>// Generated by CoffeeScript 1.9.2
/**
@license Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net
*/
(function() {
var $, win;
$ = this.jQuery || window.jQuery;
win = $(window);
$.fn.stick_in_parent = function(opts) {
var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, parent_selector, recalc_every, sticky_class;
if (opts == null) {
opts = {};
}
sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming;
if (offset_top == null) {
offset_top = 0;
}
if (parent_selector == null) {
parent_selector = void 0;
}
if (inner_scrolling == null) {
inner_scrolling = true;
}
if (sticky_class == null) {
sticky_class = "is_stuck";
}
doc = $(document);
if (enable_bottoming == null) {
enable_bottoming = true;
}
fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
if (elm.data("sticky_kit")) {
return;
}
elm.data("sticky_kit", true);
last_scroll_height = doc.height();
parent = elm.parent();
if (parent_selector != null) {
parent = parent.closest(parent_selector);
}
if (!parent.length) {
throw "failed to find stick parent";
}
fixed = false;
bottomed = false;
spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />");
if (spacer) {
spacer.css('position', elm.css('position'));
}
recalc = function() {
var border_top, padding_top, restore;
if (detached) {
return;
}
last_scroll_height = doc.height();
border_top = parseInt(parent.css("border-top-width"), 10);
padding_top = parseInt(parent.css("padding-top"), 10);
padding_bottom = parseInt(parent.css("padding-bottom"), 10);
parent_top = parent.offset().top + border_top + padding_top;
parent_height = parent.height();
if (fixed) {
fixed = false;
bottomed = false;
if (manual_spacer == null) {
elm.insertAfter(spacer);
spacer.detach();
}
elm.css({
position: "",
top: "",
width: "",
bottom: ""
}).removeClass(sticky_class);
restore = true;
}
top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top;
height = elm.outerHeight(true);
el_float = elm.css("float");
if (spacer) {
spacer.css({
width: elm.outerWidth(true),
height: height,
display: elm.css("display"),
"vertical-align": elm.css("vertical-align"),
"float": el_float
});
}
if (restore) {
return tick();
}
};
recalc();
if (height === parent_height) {
return;
}
last_pos = void 0;
offset = offset_top;
recalc_counter = recalc_every;
tick = function() {
var css, delta, recalced, scroll, will_bottom, win_height;
if (detached) {
return;
}
recalced = false;
if (recalc_counter != null) {
recalc_counter -= 1;
if (recalc_counter <= 0) {
recalc_counter = recalc_every;
recalc();
recalced = true;
}
}
if (!recalced && doc.height() !== last_scroll_height) {
recalc();
recalced = true;
}
scroll = win.scrollTop();
if (last_pos != null) {
delta = scroll - last_pos;
}
last_pos = scroll;
if (fixed) {
if (enable_bottoming) {
will_bottom = scroll + height + offset > parent_height + parent_top;
if (bottomed && !will_bottom) {
bottomed = false;
elm.css({
position: "fixed",
bottom: "",
top: offset
}).trigger("sticky_kit:unbottom");
}
}
if (scroll < top) {
fixed = false;
offset = offset_top;
if (manual_spacer == null) {
if (el_float === "left" || el_float === "right") {
elm.insertAfter(spacer);
}
spacer.detach();
}
css = {
position: "",
width: "",
top: ""
};
elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick");
}
if (inner_scrolling) {
win_height = win.height();
if (height + offset_top > win_height) {
if (!bottomed) {
offset -= delta;
offset = Math.max(win_height - height, offset);
offset = Math.min(offset_top, offset);
if (fixed) {
elm.css({
top: offset + "px"
});
}
}
}
}
} else {
if (scroll > top) {
fixed = true;
css = {
position: "fixed",
top: offset
};
css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px";
elm.css(css).addClass(sticky_class);
if (manual_spacer == null) {
elm.after(spacer);
if (el_float === "left" || el_float === "right") {
spacer.append(elm);
}
}
elm.trigger("sticky_kit:stick");
}
}
if (fixed && enable_bottoming) {
if (will_bottom == null) {
will_bottom = scroll + height + offset > parent_height + parent_top;
}
if (!bottomed && will_bottom) {
bottomed = true;
if (parent.css("position") === "static") {
parent.css({
position: "relative"
});
}
return elm.css({
position: "absolute",
bottom: padding_bottom,
top: "auto"
}).trigger("sticky_kit:bottom");
}
}
};
recalc_and_tick = function() {
recalc();
return tick();
};
detach = function() {
detached = true;
win.off("touchmove", tick);
win.off("scroll", tick);
win.off("resize", recalc_and_tick);
$(document.body).off("sticky_kit:recalc", recalc_and_tick);
elm.off("sticky_kit:detach", detach);
elm.removeData("sticky_kit");
elm.css({
position: "",
bottom: "",
top: "",
width: ""
});
parent.position("position", "");
if (fixed) {
if (manual_spacer == null) {
if (el_float === "left" || el_float === "right") {
elm.insertAfter(spacer);
}
spacer.remove();
}
return elm.removeClass(sticky_class);
}
};
win.on("touchmove", tick);
win.on("scroll", tick);
win.on("resize", recalc_and_tick);
$(document.body).on("sticky_kit:recalc", recalc_and_tick);
elm.on("sticky_kit:detach", detach);
return setTimeout(tick, 0);
};
for (i = 0, len = this.length; i < len; i++) {
elm = this[i];
fn($(elm));
}
return this;
};
}).call(this);
</script>
<meta name="generator" content="pandoc" />
<title>QLC Plus configuration</title>
<style type="text/css">code{white-space: pre;}</style>
</head>
<body>
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container">
<span class="doc-title">QLC Plus configuration</span>
<ul class="nav pull-right doc-info">
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div id="TOC" class="span3">
<div class="well toc">
<ul>
<li><a href="#qlc-plus-configuration" id="toc-qlc-plus-configuration">QLC Plus configuration</a>
<ul>
<li><a href="#setup" id="toc-setup">Setup</a></li>
<li><a href="#advanced-information" id="toc-advanced-information">Advanced Information</a>
<ul>
<li><a href="#device-patch" id="toc-device-patch">Device
patch</a></li>
<li><a href="#concept-of-operation" id="toc-concept-of-operation">Concept of operation</a></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
<div class="span9">
<h1 id="qlc-plus-configuration">QLC Plus configuration</h1>
<p>This repository contains all files needed to setup the lighting
console using <a href="https://www.qlcplus.org/">Q Light Controller
+</a>.</p>
<p>Tested with QLC+ Version 4.12.7 (<a href="https://www.qlcplus.org/downloads/4.12.7/QLC+_4.12.7-1.exe">download</a>)</p>
<p><img role="img" src="data:image/png;base64,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" /></p>
<h2 id="setup">Setup</h2>
<p>Before opening the preset, import the fixtures first. See <a href="user_folder_QLC+/README.MD"><code>user_folder_QLC+</code></a> for
details.</p>
<h2 id="advanced-information">Advanced Information</h2>
<h3 id="device-patch">Device patch</h3>
<table>
<colgroup>
<col style="width: 17%" />
<col style="width: 12%" />
<col style="width: 16%" />
<col style="width: 22%" />
<col style="width: 31%" />
</colgroup>
<thead>
<tr>
<th>start address</th>
<th>range</th>
<th>end address</th>
<th>name</th>
<th>type</th>
</tr>
</thead>
<tbody>
<tr>
<td>001</td>
<td>6</td>
<td>006</td>
<td>RGB-PAR cz1</td>
<td>n.a.</td>
</tr>
<tr>
<td>007</td>
<td>6</td>
<td>012</td>
<td>Beamz Jely Ball 1</td>
<td>beamZ Magic Jelly DJ Ball</td>
</tr>
<tr>
<td>.</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>019</td>
<td>8</td>
<td>026</td>
<td>FG LED Pot 12x1 RGBW 1</td>
<td>Fun Generation LED Pot 12x1W RGBW (15°)</td>
</tr>
<tr>
<td>027</td>
<td>8</td>
<td>034</td>
<td>FG LED Pot 12x1 RGBW 2</td>
<td>Fun Generation LED Pot 12x1W RGBW (15°)</td>
</tr>
<tr>
<td>035</td>
<td>8</td>
<td>042</td>
<td>FG SePAR rgbw 1</td>
<td>Fun-Generation SePar Quad LED RGBW</td>
</tr>
<tr>
<td>043</td>
<td>8</td>
<td>050</td>
<td>FG SePAR rgbw 2</td>
<td>Fun-Generation SePar Quad LED RGBW</td>
</tr>
<tr>
<td>051</td>
<td>4</td>
<td>054</td>
<td>Derby 1</td>
<td>Showtec Techno Derby</td>
</tr>
<tr>
<td>055</td>
<td>8</td>
<td>062</td>
<td>FG LED Pot 12x1 RGBW BAT 1</td>
<td>Fun Generation Battery LED Pot QCL 15°</td>
</tr>
<tr>
<td>063</td>
<td>8</td>
<td>070</td>
<td>FG LED Pot 12x1 RGBW BAT 2</td>
<td>Fun Generation Battery LED Pot QCL 15°</td>
</tr>
<tr>
<td>.</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><del>100</del></td>
<td><del>10</del></td>
<td><del>110</del></td>
<td><del>Moving Head 1</del></td>
<td><del>n.a.</del></td>
</tr>
<tr>
<td>111</td>
<td>11</td>
<td>121</td>
<td>MH2 FG PicoSpot 20</td>
<td>Fun Generation PicoSpot 20 LED</td>
</tr>
<tr>
<td>122</td>
<td>11</td>
<td>132</td>
<td>MH3 FG PicoSpot 20</td>
<td>Fun Generation PicoSpot 20 LED</td>
</tr>
</tbody>
</table>
<h3 id="concept-of-operation">Concept of operation</h3>
<p>…</p>
<blockquote>
<p>[!NOTE]<br />
TODO: Describe Concept of operation</p>
</blockquote>
</div>
</div>
</div>
<script>/**
* @license
* Video.js 5.4.4 <http://videojs.com/>
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
* Available under Apache License Version 2.0
* <https://github.com/videojs/video.js/blob/master/LICENSE>
*
* Includes vtt.js <https://github.com/mozilla/vtt.js>
* Available under Apache License Version 2.0
* <https://github.com/mozilla/vtt.js/blob/master/LICENSE>
*/
(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.videojs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
(function (global){
var topLevel = typeof global !== 'undefined' ? global :
typeof window !== 'undefined' ? window : {}
var minDoc = _dereq_('min-document');
if (typeof document !== 'undefined') {
module.exports = document;
} else {
var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
if (!doccy) {
doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
}
module.exports = doccy;
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19
},{"min-document":3}],2:[function(_dereq_,module,exports){
(function (global){
if (typeof window !== "undefined") {
module.exports = window;
} else if (typeof global !== "undefined") {
module.exports = global;
} else if (typeof self !== "undefined"){
module.exports = self;
} else {
module.exports = {};
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19
},{}],3:[function(_dereq_,module,exports){
},{}],4:[function(_dereq_,module,exports){
var getNative = _dereq_('../internal/getNative');
/* Native method references for those with the same name as other `lodash` methods. */
var nativeNow = getNative(Date, 'now');
/**
* Gets the number of milliseconds that have elapsed since the Unix epoch
* (1 January 1970 00:00:00 UTC).
*
* @static
* @memberOf _
* @category Date
* @example
*
* _.defer(function(stamp) {
* console.log(_.now() - stamp);
* }, _.now());
* // => logs the number of milliseconds it took for the deferred function to be invoked
*/
var now = nativeNow || function() {
return new Date().getTime();
};
module.exports = now;
},{"../internal/getNative":20}],5:[function(_dereq_,module,exports){
var isObject = _dereq_('../lang/isObject'),
now = _dereq_('../date/now');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
* invoked. The debounced function comes with a `cancel` method to cancel
* delayed invocations. Provide an options object to indicate that `func`
* should be invoked on the leading and/or trailing edge of the `wait` timeout.
* Subsequent calls to the debounced function return the result of the last
* `func` invocation.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
* on the trailing edge of the timeout only if the the debounced function is
* invoked more than once during the `wait` timeout.
*
* See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
* for details over the differences between `_.debounce` and `_.throttle`.
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to debounce.
* @param {number} [wait=0] The number of milliseconds to delay.
* @param {Object} [options] The options object.
* @param {boolean} [options.leading=false] Specify invoking on the leading
* edge of the timeout.
* @param {number} [options.maxWait] The maximum time `func` is allowed to be
* delayed before it's invoked.
* @param {boolean} [options.trailing=true] Specify invoking on the trailing
* edge of the timeout.
* @returns {Function} Returns the new debounced function.
* @example
*
* // avoid costly calculations while the window size is in flux
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
*
* // invoke `sendMail` when the click event is fired, debouncing subsequent calls
* jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
* 'leading': true,
* 'trailing': false
* }));
*
* // ensure `batchLog` is invoked once after 1 second of debounced calls
* var source = new EventSource('/stream');
* jQuery(source).on('message', _.debounce(batchLog, 250, {
* 'maxWait': 1000
* }));
*
* // cancel a debounced call
* var todoChanges = _.debounce(batchLog, 1000);
* Object.observe(models.todo, todoChanges);
*
* Object.observe(models, function(changes) {
* if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
* todoChanges.cancel();
* }
* }, ['delete']);
*
* // ...at some point `models.todo` is changed
* models.todo.completed = true;
*
* // ...before 1 second has passed `models.todo` is deleted
* // which cancels the debounced `todoChanges` call
* delete models.todo;
*/
function debounce(func, wait, options) {
var args,
maxTimeoutId,
result,
stamp,
thisArg,
timeoutId,
trailingCall,
lastCalled = 0,
maxWait = false,
trailing = true;
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = wait < 0 ? 0 : (+wait || 0);
if (options === true) {
var leading = true;
trailing = false;
} else if (isObject(options)) {
leading = !!options.leading;
maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
trailing = 'trailing' in options ? !!options.trailing : trailing;
}
function cancel() {
if (timeoutId) {
clearTimeout(timeoutId);
}
if (maxTimeoutId) {
clearTimeout(maxTimeoutId);
}
lastCalled = 0;
maxTimeoutId = timeoutId = trailingCall = undefined;
}
function complete(isCalled, id) {
if (id) {
clearTimeout(id);
}
maxTimeoutId = timeoutId = trailingCall = undefined;
if (isCalled) {
lastCalled = now();
result = func.apply(thisArg, args);
if (!timeoutId && !maxTimeoutId) {
args = thisArg = undefined;
}
}
}
function delayed() {
var remaining = wait - (now() - stamp);
if (remaining <= 0 || remaining > wait) {
complete(trailingCall, maxTimeoutId);
} else {
timeoutId = setTimeout(delayed, remaining);
}
}
function maxDelayed() {
complete(trailing, timeoutId);
}
function debounced() {
args = arguments;
stamp = now();
thisArg = this;
trailingCall = trailing && (timeoutId || !leading);
if (maxWait === false) {
var leadingCall = leading && !timeoutId;
} else {
if (!maxTimeoutId && !leading) {
lastCalled = stamp;
}
var remaining = maxWait - (stamp - lastCalled),
isCalled = remaining <= 0 || remaining > maxWait;
if (isCalled) {
if (maxTimeoutId) {
maxTimeoutId = clearTimeout(maxTimeoutId);
}
lastCalled = stamp;
result = func.apply(thisArg, args);
}
else if (!maxTimeoutId) {
maxTimeoutId = setTimeout(maxDelayed, remaining);
}
}
if (isCalled && timeoutId) {
timeoutId = clearTimeout(timeoutId);
}
else if (!timeoutId && wait !== maxWait) {
timeoutId = setTimeout(delayed, wait);
}
if (leadingCall) {
isCalled = true;
result = func.apply(thisArg, args);
}
if (isCalled && !timeoutId && !maxTimeoutId) {
args = thisArg = undefined;
}
return result;
}
debounced.cancel = cancel;
return debounced;
}
module.exports = debounce;
},{"../date/now":4,"../lang/isObject":33}],6:[function(_dereq_,module,exports){
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* Creates a function that invokes `func` with the `this` binding of the
* created function and arguments from `start` and beyond provided as an array.
*
* **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to apply a rest parameter to.
* @param {number} [start=func.length-1] The start position of the rest parameter.
* @returns {Function} Returns the new function.
* @example
*
* var say = _.restParam(function(what, names) {
* return what + ' ' + _.initial(names).join(', ') +
* (_.size(names) > 1 ? ', & ' : '') + _.last(names);
* });
*
* say('hello', 'fred', 'barney', 'pebbles');
* // => 'hello fred, barney, & pebbles'
*/
function restParam(func, start) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
return function() {
var args = arguments,
index = -1,
length = nativeMax(args.length - start, 0),
rest = Array(length);
while (++index < length) {
rest[index] = args[start + index];
}
switch (start) {
case 0: return func.call(this, rest);
case 1: return func.call(this, args[0], rest);
case 2: return func.call(this, args[0], args[1], rest);
}
var otherArgs = Array(start + 1);
index = -1;
while (++index < start) {
otherArgs[index] = args[index];
}
otherArgs[start] = rest;
return func.apply(this, otherArgs);
};
}
module.exports = restParam;
},{}],7:[function(_dereq_,module,exports){
var debounce = _dereq_('./debounce'),
isObject = _dereq_('../lang/isObject');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/**
* Creates a throttled function that only invokes `func` at most once per
* every `wait` milliseconds. The throttled function comes with a `cancel`
* method to cancel delayed invocations. Provide an options object to indicate
* that `func` should be invoked on the leading and/or trailing edge of the
* `wait` timeout. Subsequent calls to the throttled function return the
* result of the last `func` call.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
* on the trailing edge of the timeout only if the the throttled function is
* invoked more than once during the `wait` timeout.
*
* See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
* for details over the differences between `_.throttle` and `_.debounce`.
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to throttle.
* @param {number} [wait=0] The number of milliseconds to throttle invocations to.
* @param {Object} [options] The options object.
* @param {boolean} [options.leading=true] Specify invoking on the leading
* edge of the timeout.
* @param {boolean} [options.trailing=true] Specify invoking on the trailing
* edge of the timeout.
* @returns {Function} Returns the new throttled function.
* @example
*
* // avoid excessively updating the position while scrolling
* jQuery(window).on('scroll', _.throttle(updatePosition, 100));
*
* // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
* jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
* 'trailing': false
* }));
*
* // cancel a trailing throttled call
* jQuery(window).on('popstate', throttled.cancel);
*/
function throttle(func, wait, options) {
var leading = true,
trailing = true;
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
if (options === false) {
leading = false;
} else if (isObject(options)) {
leading = 'leading' in options ? !!options.leading : leading;
trailing = 'trailing' in options ? !!options.trailing : trailing;
}
return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
}
module.exports = throttle;
},{"../lang/isObject":33,"./debounce":5}],8:[function(_dereq_,module,exports){
/**
* Copies the values of `source` to `array`.
*
* @private
* @param {Array} source The array to copy values from.
* @param {Array} [array=[]] The array to copy values to.
* @returns {Array} Returns `array`.
*/
function arrayCopy(source, array) {
var index = -1,
length = source.length;
array || (array = Array(length));
while (++index < length) {
array[index] = source[index];
}
return array;
}
module.exports = arrayCopy;
},{}],9:[function(_dereq_,module,exports){
/**
* A specialized version of `_.forEach` for arrays without support for callback
* shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns `array`.
*/
function arrayEach(array, iteratee) {
var index = -1,
length = array.length;
while (++index < length) {
if (iteratee(array[index], index, array) === false) {
break;
}
}
return array;
}
module.exports = arrayEach;
},{}],10:[function(_dereq_,module,exports){
/**
* Copies properties of `source` to `object`.
*
* @private
* @param {Object} source The object to copy properties from.
* @param {Array} props The property names to copy.
* @param {Object} [object={}] The object to copy properties to.
* @returns {Object} Returns `object`.
*/
function baseCopy(source, props, object) {
object || (object = {});
var index = -1,
length = props.length;
while (++index < length) {
var key = props[index];
object[key] = source[key];
}
return object;
}
module.exports = baseCopy;
},{}],11:[function(_dereq_,module,exports){
var createBaseFor = _dereq_('./createBaseFor');
/**
* The base implementation of `baseForIn` and `baseForOwn` which iterates
* over `object` properties returned by `keysFunc` invoking `iteratee` for
* each property. Iteratee functions may exit iteration early by explicitly
* returning `false`.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
var baseFor = createBaseFor();
module.exports = baseFor;
},{"./createBaseFor":18}],12:[function(_dereq_,module,exports){
var baseFor = _dereq_('./baseFor'),
keysIn = _dereq_('../object/keysIn');
/**
* The base implementation of `_.forIn` without support for callback
* shorthands and `this` binding.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForIn(object, iteratee) {
return baseFor(object, iteratee, keysIn);
}
module.exports = baseForIn;
},{"../object/keysIn":39,"./baseFor":11}],13:[function(_dereq_,module,exports){
var arrayEach = _dereq_('./arrayEach'),
baseMergeDeep = _dereq_('./baseMergeDeep'),
isArray = _dereq_('../lang/isArray'),
isArrayLike = _dereq_('./isArrayLike'),
isObject = _dereq_('../lang/isObject'),
isObjectLike = _dereq_('./isObjectLike'),
isTypedArray = _dereq_('../lang/isTypedArray'),
keys = _dereq_('../object/keys');
/**
* The base implementation of `_.merge` without support for argument juggling,
* multiple sources, and `this` binding `customizer` functions.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @param {Function} [customizer] The function to customize merged values.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates values with source counterparts.
* @returns {Object} Returns `object`.
*/
function baseMerge(object, source, customizer, stackA, stackB) {
if (!isObject(object)) {
return object;
}
var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
props = isSrcArr ? undefined : keys(source);
arrayEach(props || source, function(srcValue, key) {
if (props) {
key = srcValue;
srcValue = source[key];
}
if (isObjectLike(srcValue)) {
stackA || (stackA = []);
stackB || (stackB = []);
baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
}
else {
var value = object[key],
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
isCommon = result === undefined;
if (isCommon) {
result = srcValue;
}
if ((result !== undefined || (isSrcArr && !(key in object))) &&
(isCommon || (result === result ? (result !== value) : (value === value)))) {
object[key] = result;
}
}
});
return object;
}
module.exports = baseMerge;
},{"../lang/isArray":30,"../lang/isObject":33,"../lang/isTypedArray":36,"../object/keys":38,"./arrayEach":9,"./baseMergeDeep":14,"./isArrayLike":21,"./isObjectLike":26}],14:[function(_dereq_,module,exports){
var arrayCopy = _dereq_('./arrayCopy'),
isArguments = _dereq_('../lang/isArguments'),
isArray = _dereq_('../lang/isArray'),
isArrayLike = _dereq_('./isArrayLike'),
isPlainObject = _dereq_('../lang/isPlainObject'),
isTypedArray = _dereq_('../lang/isTypedArray'),
toPlainObject = _dereq_('../lang/toPlainObject');
/**
* A specialized version of `baseMerge` for arrays and objects which performs
* deep merges and tracks traversed objects enabling objects with circular
* references to be merged.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @param {string} key The key of the value to merge.
* @param {Function} mergeFunc The function to merge values.
* @param {Function} [customizer] The function to customize merged values.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates values with source counterparts.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
var length = stackA.length,
srcValue = source[key];
while (length--) {
if (stackA[length] == srcValue) {
object[key] = stackB[length];
return;
}
}
var value = object[key],
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
isCommon = result === undefined;
if (isCommon) {
result = srcValue;
if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
result = isArray(value)
? value
: (isArrayLike(value) ? arrayCopy(value) : []);
}
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
result = isArguments(value)
? toPlainObject(value)
: (isPlainObject(value) ? value : {});
}
else {
isCommon = false;
}
}
// Add the source value to the stack of traversed objects and associate
// it with its merged value.
stackA.push(srcValue);
stackB.push(result);
if (isCommon) {
// Recursively merge objects and arrays (susceptible to call stack limits).
object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
} else if (result === result ? (result !== value) : (value === value)) {
object[key] = result;
}
}
module.exports = baseMergeDeep;
},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isPlainObject":34,"../lang/isTypedArray":36,"../lang/toPlainObject":37,"./arrayCopy":8,"./isArrayLike":21}],15:[function(_dereq_,module,exports){
var toObject = _dereq_('./toObject');
/**
* The base implementation of `_.property` without support for deep paths.
*
* @private
* @param {string} key The key of the property to get.
* @returns {Function} Returns the new function.
*/
function baseProperty(key) {
return function(object) {
return object == null ? undefined : toObject(object)[key];
};
}
module.exports = baseProperty;
},{"./toObject":28}],16:[function(_dereq_,module,exports){
var identity = _dereq_('../utility/identity');
/**
* A specialized version of `baseCallback` which only supports `this` binding
* and specifying the number of arguments to provide to `func`.
*
* @private
* @param {Function} func The function to bind.
* @param {*} thisArg The `this` binding of `func`.
* @param {number} [argCount] The number of arguments to provide to `func`.
* @returns {Function} Returns the callback.
*/
function bindCallback(func, thisArg, argCount) {
if (typeof func != 'function') {
return identity;
}
if (thisArg === undefined) {
return func;
}
switch (argCount) {
case 1: return function(value) {
return func.call(thisArg, value);
};
case 3: return function(value, index, collection) {
return func.call(thisArg, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(thisArg, accumulator, value, index, collection);
};
case 5: return function(value, other, key, object, source) {
return func.call(thisArg, value, other, key, object, source);
};
}
return function() {
return func.apply(thisArg, arguments);
};
}
module.exports = bindCallback;
},{"../utility/identity":42}],17:[function(_dereq_,module,exports){
var bindCallback = _dereq_('./bindCallback'),
isIterateeCall = _dereq_('./isIterateeCall'),
restParam = _dereq_('../function/restParam');
/**
* Creates a `_.assign`, `_.defaults`, or `_.merge` function.
*
* @private
* @param {Function} assigner The function to assign values.
* @returns {Function} Returns the new assigner function.
*/
function createAssigner(assigner) {
return restParam(function(object, sources) {
var index = -1,
length = object == null ? 0 : sources.length,
customizer = length > 2 ? sources[length - 2] : undefined,
guard = length > 2 ? sources[2] : undefined,
thisArg = length > 1 ? sources[length - 1] : undefined;
if (typeof customizer == 'function') {
customizer = bindCallback(customizer, thisArg, 5);
length -= 2;
} else {
customizer = typeof thisArg == 'function' ? thisArg : undefined;
length -= (customizer ? 1 : 0);
}
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
customizer = length < 3 ? undefined : customizer;
length = 1;
}
while (++index < length) {
var source = sources[index];
if (source) {
assigner(object, source, customizer);
}
}
return object;
});
}
module.exports = createAssigner;
},{"../function/restParam":6,"./bindCallback":16,"./isIterateeCall":24}],18:[function(_dereq_,module,exports){
var toObject = _dereq_('./toObject');
/**
* Creates a base function for `_.forIn` or `_.forInRight`.
*
* @private
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var iterable = toObject(object),
props = keysFunc(object),
length = props.length,
index = fromRight ? length : -1;
while ((fromRight ? index-- : ++index < length)) {
var key = props[index];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
module.exports = createBaseFor;
},{"./toObject":28}],19:[function(_dereq_,module,exports){
var baseProperty = _dereq_('./baseProperty');
/**
* Gets the "length" property value of `object`.
*
* **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
* that affects Safari on at least iOS 8.1-8.3 ARM64.
*
* @private
* @param {Object} object The object to query.
* @returns {*} Returns the "length" value.
*/
var getLength = baseProperty('length');
module.exports = getLength;
},{"./baseProperty":15}],20:[function(_dereq_,module,exports){
var isNative = _dereq_('../lang/isNative');
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = object == null ? undefined : object[key];
return isNative(value) ? value : undefined;
}
module.exports = getNative;
},{"../lang/isNative":32}],21:[function(_dereq_,module,exports){
var getLength = _dereq_('./getLength'),
isLength = _dereq_('./isLength');
/**
* Checks if `value` is array-like.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
*/
function isArrayLike(value) {
return value != null && isLength(getLength(value));
}
module.exports = isArrayLike;
},{"./getLength":19,"./isLength":25}],22:[function(_dereq_,module,exports){
/**
* Checks if `value` is a host object in IE < 9.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
*/
var isHostObject = (function() {
try {
Object({ 'toString': 0 } + '');
} catch(e) {
return function() { return false; };
}
return function(value) {
// IE < 9 presents many host objects as `Object` objects that can coerce
// to strings despite having improperly defined `toString` methods.
return typeof value.toString != 'function' && typeof (value + '') == 'string';
};
}());
module.exports = isHostObject;
},{}],23:[function(_dereq_,module,exports){
/** Used to detect unsigned integer values. */
var reIsUint = /^\d+$/;
/**
* Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
* of an array-like value.
*/
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
length = length == null ? MAX_SAFE_INTEGER : length;
return value > -1 && value % 1 == 0 && value < length;
}
module.exports = isIndex;
},{}],24:[function(_dereq_,module,exports){
var isArrayLike = _dereq_('./isArrayLike'),
isIndex = _dereq_('./isIndex'),
isObject = _dereq_('../lang/isObject');
/**
* Checks if the provided arguments are from an iteratee call.
*
* @private
* @param {*} value The potential iteratee value argument.
* @param {*} index The potential iteratee index or key argument.
* @param {*} object The potential iteratee object argument.
* @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
*/
function isIterateeCall(value, index, object) {
if (!isObject(object)) {
return false;
}
var type = typeof index;
if (type == 'number'
? (isArrayLike(object) && isIndex(index, object.length))
: (type == 'string' && index in object)) {
var other = object[index];
return value === value ? (value === other) : (other !== other);
}
return false;
}
module.exports = isIterateeCall;
},{"../lang/isObject":33,"./isArrayLike":21,"./isIndex":23}],25:[function(_dereq_,module,exports){
/**
* Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
* of an array-like value.
*/
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
*/
function isLength(value) {
return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module.exports = isLength;
},{}],26:[function(_dereq_,module,exports){
/**
* Checks if `value` is object-like.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
*/
function isObjectLike(value) {
return !!value && typeof value == 'object';
}
module.exports = isObjectLike;
},{}],27:[function(_dereq_,module,exports){
var isArguments = _dereq_('../lang/isArguments'),
isArray = _dereq_('../lang/isArray'),
isIndex = _dereq_('./isIndex'),
isLength = _dereq_('./isLength'),
isString = _dereq_('../lang/isString'),
keysIn = _dereq_('../object/keysIn');
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* A fallback implementation of `Object.keys` which creates an array of the
* own enumerable property names of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function shimKeys(object) {
var props = keysIn(object),
propsLength = props.length,
length = propsLength && object.length;
var allowIndexes = !!length && isLength(length) &&
(isArray(object) || isArguments(object) || isString(object));
var index = -1,
result = [];
while (++index < propsLength) {
var key = props[index];
if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
result.push(key);
}
}
return result;
}
module.exports = shimKeys;
},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isString":35,"../object/keysIn":39,"./isIndex":23,"./isLength":25}],28:[function(_dereq_,module,exports){
var isObject = _dereq_('../lang/isObject'),
isString = _dereq_('../lang/isString'),
support = _dereq_('../support');
/**
* Converts `value` to an object if it's not one.
*
* @private
* @param {*} value The value to process.
* @returns {Object} Returns the object.
*/
function toObject(value) {
if (support.unindexedChars && isString(value)) {
var index = -1,
length = value.length,
result = Object(value);
while (++index < length) {
result[index] = value.charAt(index);
}
return result;
}
return isObject(value) ? value : Object(value);
}
module.exports = toObject;
},{"../lang/isObject":33,"../lang/isString":35,"../support":41}],29:[function(_dereq_,module,exports){
var isArrayLike = _dereq_('../internal/isArrayLike'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Native method references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/**
* Checks if `value` is classified as an `arguments` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
return isObjectLike(value) && isArrayLike(value) &&
hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
}
module.exports = isArguments;
},{"../internal/isArrayLike":21,"../internal/isObjectLike":26}],30:[function(_dereq_,module,exports){
var getNative = _dereq_('../internal/getNative'),
isLength = _dereq_('../internal/isLength'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** `Object#toString` result references. */
var arrayTag = '[object Array]';
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeIsArray = getNative(Array, 'isArray');
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(function() { return arguments; }());
* // => false
*/
var isArray = nativeIsArray || function(value) {
return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
};
module.exports = isArray;
},{"../internal/getNative":20,"../internal/isLength":25,"../internal/isObjectLike":26}],31:[function(_dereq_,module,exports){
var isObject = _dereq_('./isObject');
/** `Object#toString` result references. */
var funcTag = '[object Function]';
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in older versions of Chrome and Safari which return 'function' for regexes
// and Safari 8 which returns 'object' for typed array constructors.
return isObject(value) && objToString.call(value) == funcTag;
}
module.exports = isFunction;
},{"./isObject":33}],32:[function(_dereq_,module,exports){
var isFunction = _dereq_('./isFunction'),
isHostObject = _dereq_('../internal/isHostObject'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** Used to detect host constructors (Safari > 5). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var fnToString = Function.prototype.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* Checks if `value` is a native function.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function, else `false`.
* @example
*
* _.isNative(Array.prototype.push);
* // => true
*
* _.isNative(_);
* // => false
*/
function isNative(value) {
if (value == null) {
return false;
}
if (isFunction(value)) {
return reIsNative.test(fnToString.call(value));
}
return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
}
module.exports = isNative;
},{"../internal/isHostObject":22,"../internal/isObjectLike":26,"./isFunction":31}],33:[function(_dereq_,module,exports){
/**
* Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(1);
* // => false
*/
function isObject(value) {
// Avoid a V8 JIT bug in Chrome 19-20.
// See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
module.exports = isObject;
},{}],34:[function(_dereq_,module,exports){
var baseForIn = _dereq_('../internal/baseForIn'),
isArguments = _dereq_('./isArguments'),
isHostObject = _dereq_('../internal/isHostObject'),
isObjectLike = _dereq_('../internal/isObjectLike'),
support = _dereq_('../support');
/** `Object#toString` result references. */
var objectTag = '[object Object]';
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is a plain object, that is, an object created by the
* `Object` constructor or one with a `[[Prototype]]` of `null`.
*
* **Note:** This method assumes objects created by the `Object` constructor
* have no inherited enumerable properties.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
* @example
*
* function Foo() {
* this.a = 1;
* }
*
* _.isPlainObject(new Foo);
* // => false
*
* _.isPlainObject([1, 2, 3]);
* // => false
*
* _.isPlainObject({ 'x': 0, 'y': 0 });
* // => true
*
* _.isPlainObject(Object.create(null));
* // => true
*/
function isPlainObject(value) {
var Ctor;
// Exit early for non `Object` objects.
if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||
(!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
return false;
}
// IE < 9 iterates inherited properties before own properties. If the first
// iterated property is an object's own property then there are no inherited
// enumerable properties.
var result;
if (support.ownLast) {
baseForIn(value, function(subValue, key, object) {
result = hasOwnProperty.call(object, key);
return false;
});
return result !== false;
}
// In most environments an object's own properties are iterated before
// its inherited properties. If the last iterated property is an object's
// own property then there are no inherited enumerable properties.
baseForIn(value, function(subValue, key) {
result = key;
});
return result === undefined || hasOwnProperty.call(value, result);
}
module.exports = isPlainObject;
},{"../internal/baseForIn":12,"../internal/isHostObject":22,"../internal/isObjectLike":26,"../support":41,"./isArguments":29}],35:[function(_dereq_,module,exports){
var isObjectLike = _dereq_('../internal/isObjectLike');
/** `Object#toString` result references. */
var stringTag = '[object String]';
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is classified as a `String` primitive or object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isString('abc');
* // => true
*
* _.isString(1);
* // => false
*/
function isString(value) {
return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
}
module.exports = isString;
},{"../internal/isObjectLike":26}],36:[function(_dereq_,module,exports){
var isLength = _dereq_('../internal/isLength'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dateTag] = typedArrayTags[errorTag] =
typedArrayTags[funcTag] = typedArrayTags[mapTag] =
typedArrayTags[numberTag] = typedArrayTags[objectTag] =
typedArrayTags[regexpTag] = typedArrayTags[setTag] =
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is classified as a typed array.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
* // => true
*
* _.isTypedArray([]);
* // => false
*/
function isTypedArray(value) {
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
}
module.exports = isTypedArray;
},{"../internal/isLength":25,"../internal/isObjectLike":26}],37:[function(_dereq_,module,exports){
var baseCopy = _dereq_('../internal/baseCopy'),
keysIn = _dereq_('../object/keysIn');
/**
* Converts `value` to a plain object flattening inherited enumerable
* properties of `value` to own properties of the plain object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to convert.
* @returns {Object} Returns the converted plain object.
* @example
*
* function Foo() {
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.assign({ 'a': 1 }, new Foo);
* // => { 'a': 1, 'b': 2 }
*
* _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
* // => { 'a': 1, 'b': 2, 'c': 3 }
*/
function toPlainObject(value) {
return baseCopy(value, keysIn(value));
}
module.exports = toPlainObject;
},{"../internal/baseCopy":10,"../object/keysIn":39}],38:[function(_dereq_,module,exports){
var getNative = _dereq_('../internal/getNative'),
isArrayLike = _dereq_('../internal/isArrayLike'),
isObject = _dereq_('../lang/isObject'),
shimKeys = _dereq_('../internal/shimKeys'),
support = _dereq_('../support');
/* Native method references for those with the same name as other `lodash` methods. */
var nativeKeys = getNative(Object, 'keys');
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
* for more details.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
var keys = !nativeKeys ? shimKeys : function(object) {
var Ctor = object == null ? undefined : object.constructor;
if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
(typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {
return shimKeys(object);
}
return isObject(object) ? nativeKeys(object) : [];
};
module.exports = keys;
},{"../internal/getNative":20,"../internal/isArrayLike":21,"../internal/shimKeys":27,"../lang/isObject":33,"../support":41}],39:[function(_dereq_,module,exports){
var arrayEach = _dereq_('../internal/arrayEach'),
isArguments = _dereq_('../lang/isArguments'),
isArray = _dereq_('../lang/isArray'),
isFunction = _dereq_('../lang/isFunction'),
isIndex = _dereq_('../internal/isIndex'),
isLength = _dereq_('../internal/isLength'),
isObject = _dereq_('../lang/isObject'),
isString = _dereq_('../lang/isString'),
support = _dereq_('../support');
/** `Object#toString` result references. */
var arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
stringTag = '[object String]';
/** Used to fix the JScript `[[DontEnum]]` bug. */
var shadowProps = [
'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
'toLocaleString', 'toString', 'valueOf'
];
/** Used for native method references. */
var errorProto = Error.prototype,
objectProto = Object.prototype,
stringProto = String.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/** Used to avoid iterating over non-enumerable properties in IE < 9. */
var nonEnumProps = {};
nonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
nonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };
nonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };
nonEnumProps[objectTag] = { 'constructor': true };
arrayEach(shadowProps, function(key) {
for (var tag in nonEnumProps) {
if (hasOwnProperty.call(nonEnumProps, tag)) {
var props = nonEnumProps[tag];
props[key] = hasOwnProperty.call(props, key);
}
}
});
/**
* Creates an array of the own and inherited enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keysIn(new Foo);
* // => ['a', 'b', 'c'] (iteration order is not guaranteed)
*/
function keysIn(object) {
if (object == null) {
return [];
}
if (!isObject(object)) {
object = Object(object);
}
var length = object.length;
length = (length && isLength(length) &&
(isArray(object) || isArguments(object) || isString(object)) && length) || 0;
var Ctor = object.constructor,
index = -1,
proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,
isProto = proto === object,
result = Array(length),
skipIndexes = length > 0,
skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),
skipProto = support.enumPrototypes && isFunction(object);
while (++index < length) {
result[index] = (index + '');
}
// lodash skips the `constructor` property when it infers it's iterating
// over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
// attribute of an existing property and the `constructor` property of a
// prototype defaults to non-enumerable.
for (var key in object) {
if (!(skipProto && key == 'prototype') &&
!(skipErrorProps && (key == 'message' || key == 'name')) &&
!(skipIndexes && isIndex(key, length)) &&
!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
result.push(key);
}
}
if (support.nonEnumShadows && object !== objectProto) {
var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),
nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];
if (tag == objectTag) {
proto = objectProto;
}
length = shadowProps.length;
while (length--) {
key = shadowProps[length];
var nonEnum = nonEnums[key];
if (!(isProto && nonEnum) &&
(nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {
result.push(key);
}
}
}
return result;
}
module.exports = keysIn;
},{"../internal/arrayEach":9,"../internal/isIndex":23,"../internal/isLength":25,"../lang/isArguments":29,"../lang/isArray":30,"../lang/isFunction":31,"../lang/isObject":33,"../lang/isString":35,"../support":41}],40:[function(_dereq_,module,exports){
var baseMerge = _dereq_('../internal/baseMerge'),
createAssigner = _dereq_('../internal/createAssigner');
/**
* Recursively merges own enumerable properties of the source object(s), that
* don't resolve to `undefined` into the destination object. Subsequent sources
* overwrite property assignments of previous sources. If `customizer` is
* provided it's invoked to produce the merged values of the destination and
* source properties. If `customizer` returns `undefined` merging is handled
* by the method instead. The `customizer` is bound to `thisArg` and invoked
* with five arguments: (objectValue, sourceValue, key, object, source).
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The destination object.
* @param {...Object} [sources] The source objects.
* @param {Function} [customizer] The function to customize assigned values.
* @param {*} [thisArg] The `this` binding of `customizer`.
* @returns {Object} Returns `object`.
* @example
*
* var users = {
* 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
* };
*
* var ages = {
* 'data': [{ 'age': 36 }, { 'age': 40 }]
* };
*
* _.merge(users, ages);
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
*
* // using a customizer callback
* var object = {
* 'fruits': ['apple'],
* 'vegetables': ['beet']
* };
*
* var other = {
* 'fruits': ['banana'],
* 'vegetables': ['carrot']
* };
*
* _.merge(object, other, function(a, b) {
* if (_.isArray(a)) {
* return a.concat(b);
* }
* });
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
*/
var merge = createAssigner(baseMerge);
module.exports = merge;
},{"../internal/baseMerge":13,"../internal/createAssigner":17}],41:[function(_dereq_,module,exports){
/** Used for native method references. */
var arrayProto = Array.prototype,
errorProto = Error.prototype,
objectProto = Object.prototype;
/** Native method references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable,
splice = arrayProto.splice;
/**
* An object environment feature flags.
*
* @static
* @memberOf _
* @type Object
*/
var support = {};
(function(x) {
var Ctor = function() { this.x = x; },
object = { '0': x, 'length': x },
props = [];
Ctor.prototype = { 'valueOf': x, 'y': x };
for (var key in new Ctor) { props.push(key); }
/**
* Detect if `name` or `message` properties of `Error.prototype` are
* enumerable by default (IE < 9, Safari < 5.1).
*
* @memberOf _.support
* @type boolean
*/
support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||
propertyIsEnumerable.call(errorProto, 'name');
/**
* Detect if `prototype` properties are enumerable by default.
*
* Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
* (if the prototype or a property on the prototype has been set)
* incorrectly set the `[[Enumerable]]` value of a function's `prototype`
* property to `true`.
*
* @memberOf _.support
* @type boolean
*/
support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
/**
* Detect if properties shadowing those on `Object.prototype` are non-enumerable.
*
* In IE < 9 an object's own properties, shadowing non-enumerable ones,
* are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).
*
* @memberOf _.support
* @type boolean
*/
support.nonEnumShadows = !/valueOf/.test(props);
/**
* Detect if own properties are iterated after inherited properties (IE < 9).
*
* @memberOf _.support
* @type boolean
*/
support.ownLast = props[0] != 'x';
/**
* Detect if `Array#shift` and `Array#splice` augment array-like objects
* correctly.
*
* Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array
* `shift()` and `splice()` functions that fail to remove the last element,
* `value[0]`, of array-like objects even though the "length" property is
* set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,
* while `splice()` is buggy regardless of mode in IE < 9.
*
* @memberOf _.support
* @type boolean
*/
support.spliceObjects = (splice.call(object, 0, 1), !object[0]);
/**
* Detect lack of support for accessing string characters by index.
*
* IE < 8 can't access characters by index. IE 8 can only access characters
* by index on string literals, not string objects.
*
* @memberOf _.support
* @type boolean
*/
support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
}(1, 0));
module.exports = support;
},{}],42:[function(_dereq_,module,exports){
/**
* This method returns the first argument provided to it.
*
* @static
* @memberOf _
* @category Utility
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'user': 'fred' };
*
* _.identity(object) === object;
* // => true
*/
function identity(value) {
return value;
}
module.exports = identity;
},{}],43:[function(_dereq_,module,exports){
'use strict';
var keys = _dereq_('object-keys');
module.exports = function hasSymbols() {
if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
if (typeof Symbol.iterator === 'symbol') { return true; }
var obj = {};
var sym = Symbol('test');
if (typeof sym === 'string') { return false; }
// temp disabled per https://github.com/ljharb/object.assign/issues/17
// if (sym instanceof Symbol) { return false; }
// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
// if (!(Object(sym) instanceof Symbol)) { return false; }
var symVal = 42;
obj[sym] = symVal;
for (sym in obj) { return false; }
if (keys(obj).length !== 0) { return false; }
if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
var syms = Object.getOwnPropertySymbols(obj);
if (syms.length !== 1 || syms[0] !== sym) { return false; }
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
if (typeof Object.getOwnPropertyDescriptor === 'function') {
var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
}
return true;
};
},{"object-keys":49}],44:[function(_dereq_,module,exports){
'use strict';
// modified from https://github.com/es-shims/es6-shim
var keys = _dereq_('object-keys');
var bind = _dereq_('function-bind');
var canBeObject = function (obj) {
return typeof obj !== 'undefined' && obj !== null;
};
var hasSymbols = _dereq_('./hasSymbols')();
var toObject = Object;
var push = bind.call(Function.call, Array.prototype.push);
var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
module.exports = function assign(target, source1) {
if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
var objTarget = toObject(target);
var s, source, i, props, syms, value, key;
for (s = 1; s < arguments.length; ++s) {
source = toObject(arguments[s]);
props = keys(source);
if (hasSymbols && Object.getOwnPropertySymbols) {
syms = Object.getOwnPropertySymbols(source);
for (i = 0; i < syms.length; ++i) {
key = syms[i];
if (propIsEnumerable(source, key)) {
push(props, key);
}
}
}
for (i = 0; i < props.length; ++i) {
key = props[i];
value = source[key];
if (propIsEnumerable(source, key)) {
objTarget[key] = value;
}
}
}
return objTarget;
};
},{"./hasSymbols":43,"function-bind":48,"object-keys":49}],45:[function(_dereq_,module,exports){
'use strict';
var defineProperties = _dereq_('define-properties');
var implementation = _dereq_('./implementation');
var getPolyfill = _dereq_('./polyfill');
var shim = _dereq_('./shim');
defineProperties(implementation, {
implementation: implementation,
getPolyfill: getPolyfill,
shim: shim
});
module.exports = implementation;
},{"./implementation":44,"./polyfill":51,"./shim":52,"define-properties":46}],46:[function(_dereq_,module,exports){
'use strict';
var keys = _dereq_('object-keys');
var foreach = _dereq_('foreach');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
var toStr = Object.prototype.toString;
var isFunction = function (fn) {
return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};
var arePropertyDescriptorsSupported = function () {
var obj = {};
try {
Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
/* eslint-disable no-unused-vars, no-restricted-syntax */
for (var _ in obj) { return false; }
/* eslint-enable no-unused-vars, no-restricted-syntax */
return obj.x === obj;
} catch (e) { /* this is IE 8. */
return false;
}
};
var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
var defineProperty = function (object, name, value, predicate) {
if (name in object && (!isFunction(predicate) || !predicate())) {
return;
}
if (supportsDescriptors) {
Object.defineProperty(object, name, {
configurable: true,
enumerable: false,
value: value,
writable: true
});
} else {
object[name] = value;
}
};
var defineProperties = function (object, map) {
var predicates = arguments.length > 2 ? arguments[2] : {};
var props = keys(map);
if (hasSymbols) {
props = props.concat(Object.getOwnPropertySymbols(map));
}
foreach(props, function (name) {
defineProperty(object, name, map[name], predicates[name]);
});
};
defineProperties.supportsDescriptors = !!supportsDescriptors;
module.exports = defineProperties;
},{"foreach":47,"object-keys":49}],47:[function(_dereq_,module,exports){
var hasOwn = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;
module.exports = function forEach (obj, fn, ctx) {
if (toString.call(fn) !== '[object Function]') {
throw new TypeError('iterator must be a function');
}
var l = obj.length;
if (l === +l) {
for (var i = 0; i < l; i++) {
fn.call(ctx, obj[i], i, obj);
}
} else {
for (var k in obj) {
if (hasOwn.call(obj, k)) {
fn.call(ctx, obj[k], k, obj);
}
}
}
};
},{}],48:[function(_dereq_,module,exports){
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';
module.exports = function bind(that) {
var target = this;
if (typeof target !== 'function' || toStr.call(target) !== funcType) {
throw new TypeError(ERROR_MESSAGE + target);
}
var args = slice.call(arguments, 1);
var binder = function () {
if (this instanceof bound) {
var result = target.apply(
this,
args.concat(slice.call(arguments))
);
if (Object(result) === result) {
return result;
}
return this;
} else {
return target.apply(
that,
args.concat(slice.call(arguments))
);
}
};
var boundLength = Math.max(0, target.length - args.length);
var boundArgs = [];
for (var i = 0; i < boundLength; i++) {
boundArgs.push('$' + i);
}
var bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
if (target.prototype) {
var Empty = function Empty() {};
Empty.prototype = target.prototype;
bound.prototype = new Empty();
Empty.prototype = null;
}
return bound;
};
},{}],49:[function(_dereq_,module,exports){
'use strict';
// modified from https://github.com/es-shims/es5-shim
var has = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var slice = Array.prototype.slice;
var isArgs = _dereq_('./isArguments');
var hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');
var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
var dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
];
var equalsConstructorPrototype = function (o) {
var ctor = o.constructor;
return ctor && ctor.prototype === o;
};
var blacklistedKeys = {
$console: true,
$frame: true,
$frameElement: true,
$frames: true,
$parent: true,
$self: true,
$webkitIndexedDB: true,
$webkitStorageInfo: true,
$window: true
};
var hasAutomationEqualityBug = (function () {
/* global window */
if (typeof window === 'undefined') { return false; }
for (var k in window) {
try {
if (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
try {
equalsConstructorPrototype(window[k]);
} catch (e) {
return true;
}
}
} catch (e) {
return true;
}
}
return false;
}());
var equalsConstructorPrototypeIfNotBuggy = function (o) {
/* global window */
if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
return equalsConstructorPrototype(o);
}
try {
return equalsConstructorPrototype(o);
} catch (e) {
return false;
}
};
var keysShim = function keys(object) {
var isObject = object !== null && typeof object === 'object';
var isFunction = toStr.call(object) === '[object Function]';
var isArguments = isArgs(object);
var isString = isObject && toStr.call(object) === '[object String]';
var theKeys = [];
if (!isObject && !isFunction && !isArguments) {
throw new TypeError('Object.keys called on a non-object');
}
var skipProto = hasProtoEnumBug && isFunction;
if (isString && object.length > 0 && !has.call(object, 0)) {
for (var i = 0; i < object.length; ++i) {
theKeys.push(String(i));
}
}
if (isArguments && object.length > 0) {
for (var j = 0; j < object.length; ++j) {
theKeys.push(String(j));
}
} else {
for (var name in object) {
if (!(skipProto && name === 'prototype') && has.call(object, name)) {
theKeys.push(String(name));
}
}
}
if (hasDontEnumBug) {
var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
for (var k = 0; k < dontEnums.length; ++k) {
if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
theKeys.push(dontEnums[k]);
}
}
}
return theKeys;
};
keysShim.shim = function shimObjectKeys() {
if (Object.keys) {
var keysWorksWithArguments = (function () {
// Safari 5.0 bug
return (Object.keys(arguments) || '').length === 2;
}(1, 2));
if (!keysWorksWithArguments) {
var originalKeys = Object.keys;
Object.keys = function keys(object) {
if (isArgs(object)) {
return originalKeys(slice.call(object));
} else {
return originalKeys(object);
}
};
}
} else {
Object.keys = keysShim;
}
return Object.keys || keysShim;
};
module.exports = keysShim;
},{"./isArguments":50}],50:[function(_dereq_,module,exports){
'use strict';
var toStr = Object.prototype.toString;
module.exports = function isArguments(value) {
var str = toStr.call(value);
var isArgs = str === '[object Arguments]';
if (!isArgs) {
isArgs = str !== '[object Array]' &&
value !== null &&
typeof value === 'object' &&
typeof value.length === 'number' &&
value.length >= 0 &&
toStr.call(value.callee) === '[object Function]';
}
return isArgs;
};
},{}],51:[function(_dereq_,module,exports){
'use strict';
var implementation = _dereq_('./implementation');
var lacksProperEnumerationOrder = function () {
if (!Object.assign) {
return false;
}
// v8, specifically in node 4.x, has a bug with incorrect property enumeration order
// note: this does not detect the bug unless there's 20 characters
var str = 'abcdefghijklmnopqrst';
var letters = str.split('');
var map = {};
for (var i = 0; i < letters.length; ++i) {
map[letters[i]] = letters[i];
}
var obj = Object.assign({}, map);
var actual = '';
for (var k in obj) {
actual += k;
}
return str !== actual;
};
var assignHasPendingExceptions = function () {
if (!Object.assign || !Object.preventExtensions) {
return false;
}
// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
// which is 72% slower than our shim, and Firefox 40's native implementation.
var thrower = Object.preventExtensions({ 1: 2 });
try {
Object.assign(thrower, 'xy');
} catch (e) {
return thrower[1] === 'y';
}
};
module.exports = function getPolyfill() {
if (!Object.assign) {
return implementation;
}
if (lacksProperEnumerationOrder()) {
return implementation;
}
if (assignHasPendingExceptions()) {
return implementation;
}
return Object.assign;
};
},{"./implementation":44}],52:[function(_dereq_,module,exports){
'use strict';
var define = _dereq_('define-properties');
var getPolyfill = _dereq_('./polyfill');
module.exports = function shimAssign() {
var polyfill = getPolyfill();
define(
Object,
{ assign: polyfill },
{ assign: function () { return Object.assign !== polyfill; } }
);
return polyfill;
};
},{"./polyfill":51,"define-properties":46}],53:[function(_dereq_,module,exports){
module.exports = SafeParseTuple
function SafeParseTuple(obj, reviver) {
var json
var error = null
try {
json = JSON.parse(obj, reviver)
} catch (err) {
error = err
}
return [error, json]
}
},{}],54:[function(_dereq_,module,exports){
function clean (s) {
return s.replace(/\n\r?\s*/g, '')
}
module.exports = function tsml (sa) {
var s = ''
, i = 0
for (; i < arguments.length; i++)
s += clean(sa[i]) + (arguments[i + 1] || '')
return s
}
},{}],55:[function(_dereq_,module,exports){
"use strict";
var window = _dereq_("global/window")
var once = _dereq_("once")
var isFunction = _dereq_("is-function")
var parseHeaders = _dereq_("parse-headers")
var xtend = _dereq_("xtend")
module.exports = createXHR
createXHR.XMLHttpRequest = window.XMLHttpRequest || noop
createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest
forEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) {
createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) {
options = initParams(uri, options, callback)
options.method = method.toUpperCase()
return _createXHR(options)
}
})
function forEachArray(array, iterator) {
for (var i = 0; i < array.length; i++) {
iterator(array[i])
}
}
function isEmpty(obj){
for(var i in obj){
if(obj.hasOwnProperty(i)) return false
}
return true
}
function initParams(uri, options, callback) {
var params = uri
if (isFunction(options)) {
callback = options
if (typeof uri === "string") {
params = {uri:uri}
}
} else {
params = xtend(options, {uri: uri})
}
params.callback = callback
return params
}
function createXHR(uri, options, callback) {
options = initParams(uri, options, callback)
return _createXHR(options)
}
function _createXHR(options) {
var callback = options.callback
if(typeof callback === "undefined"){
throw new Error("callback argument missing")
}
callback = once(callback)
function readystatechange() {
if (xhr.readyState === 4) {
loadFunc()
}
}
function getBody() {
// Chrome with requestType=blob throws errors arround when even testing access to responseText
var body = undefined
if (xhr.response) {
body = xhr.response
} else if (xhr.responseType === "text" || !xhr.responseType) {
body = xhr.responseText || xhr.responseXML
}
if (isJson) {
try {
body = JSON.parse(body)
} catch (e) {}
}
return body
}
var failureResponse = {
body: undefined,
headers: {},
statusCode: 0,
method: method,
url: uri,
rawRequest: xhr
}
function errorFunc(evt) {
clearTimeout(timeoutTimer)
if(!(evt instanceof Error)){
evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )
}
evt.statusCode = 0
callback(evt, failureResponse)
}
// will load the data & process the response in a special response object
function loadFunc() {
if (aborted) return
var status
clearTimeout(timeoutTimer)
if(options.useXDR && xhr.status===undefined) {
//IE8 CORS GET successful response doesn't have a status field, but body is fine
status = 200
} else {
status = (xhr.status === 1223 ? 204 : xhr.status)
}
var response = failureResponse
var err = null
if (status !== 0){
response = {
body: getBody(),
statusCode: status,
method: method,
headers: {},
url: uri,
rawRequest: xhr
}
if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
response.headers = parseHeaders(xhr.getAllResponseHeaders())
}
} else {
err = new Error("Internal XMLHttpRequest Error")
}
callback(err, response, response.body)
}
var xhr = options.xhr || null
if (!xhr) {
if (options.cors || options.useXDR) {
xhr = new createXHR.XDomainRequest()
}else{
xhr = new createXHR.XMLHttpRequest()
}
}
var key
var aborted
var uri = xhr.url = options.uri || options.url
var method = xhr.method = options.method || "GET"
var body = options.body || options.data || null
var headers = xhr.headers = options.headers || {}
var sync = !!options.sync
var isJson = false
var timeoutTimer
if ("json" in options) {
isJson = true
headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user
if (method !== "GET" && method !== "HEAD") {
headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user
body = JSON.stringify(options.json)
}
}
xhr.onreadystatechange = readystatechange
xhr.onload = loadFunc
xhr.onerror = errorFunc
// IE9 must have onprogress be set to a unique function.
xhr.onprogress = function () {
// IE must die
}
xhr.ontimeout = errorFunc
xhr.open(method, uri, !sync, options.username, options.password)
//has to be after open
if(!sync) {
xhr.withCredentials = !!options.withCredentials
}
// Cannot set timeout with sync request
// not setting timeout on the xhr object, because of old webkits etc. not handling that correctly
// both npm's request and jquery 1.x use this kind of timeout, so this is being consistent
if (!sync && options.timeout > 0 ) {
timeoutTimer = setTimeout(function(){
aborted=true//IE9 may still call readystatechange
xhr.abort("timeout")
var e = new Error("XMLHttpRequest timeout")
e.code = "ETIMEDOUT"
errorFunc(e)
}, options.timeout )
}
if (xhr.setRequestHeader) {
for(key in headers){
if(headers.hasOwnProperty(key)){
xhr.setRequestHeader(key, headers[key])
}
}
} else if (options.headers && !isEmpty(options.headers)) {
throw new Error("Headers cannot be set on an XDomainRequest object")
}
if ("responseType" in options) {
xhr.responseType = options.responseType
}
if ("beforeSend" in options &&
typeof options.beforeSend === "function"
) {
options.beforeSend(xhr)
}
xhr.send(body)
return xhr
}
function noop() {}
},{"global/window":2,"is-function":56,"once":57,"parse-headers":60,"xtend":61}],56:[function(_dereq_,module,exports){
module.exports = isFunction
var toString = Object.prototype.toString
function isFunction (fn) {
var string = toString.call(fn)
return string === '[object Function]' ||
(typeof fn === 'function' && string !== '[object RegExp]') ||
(typeof window !== 'undefined' &&
// IE8 and below
(fn === window.setTimeout ||
fn === window.alert ||
fn === window.confirm ||
fn === window.prompt))
};
},{}],57:[function(_dereq_,module,exports){
module.exports = once
once.proto = once(function () {
Object.defineProperty(Function.prototype, 'once', {
value: function () {
return once(this)
},
configurable: true
})
})
function once (fn) {
var called = false
return function () {
if (called) return
called = true
return fn.apply(this, arguments)
}
}
},{}],58:[function(_dereq_,module,exports){
var isFunction = _dereq_('is-function')
module.exports = forEach
var toString = Object.prototype.toString
var hasOwnProperty = Object.prototype.hasOwnProperty
function forEach(list, iterator, context) {
if (!isFunction(iterator)) {
throw new TypeError('iterator must be a function')
}
if (arguments.length < 3) {
context = this
}
if (toString.call(list) === '[object Array]')
forEachArray(list, iterator, context)
else if (typeof list === 'string')
forEachString(list, iterator, context)
else
forEachObject(list, iterator, context)
}
function forEachArray(array, iterator, context) {
for (var i = 0, len = array.length; i < len; i++) {
if (hasOwnProperty.call(array, i)) {
iterator.call(context, array[i], i, array)
}
}
}
function forEachString(string, iterator, context) {
for (var i = 0, len = string.length; i < len; i++) {
// no such thing as a sparse string.
iterator.call(context, string.charAt(i), i, string)
}
}
function forEachObject(object, iterator, context) {
for (var k in object) {
if (hasOwnProperty.call(object, k)) {
iterator.call(context, object[k], k, object)
}
}
}
},{"is-function":56}],59:[function(_dereq_,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],60:[function(_dereq_,module,exports){
var trim = _dereq_('trim')
, forEach = _dereq_('for-each')
, isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
}
module.exports = function (headers) {
if (!headers)
return {}
var result = {}
forEach(
trim(headers).split('\n')
, function (row) {
var index = row.indexOf(':')
, key = trim(row.slice(0, index)).toLowerCase()
, value = trim(row.slice(index + 1))
if (typeof(result[key]) === 'undefined') {
result[key] = value
} else if (isArray(result[key])) {
result[key].push(value)
} else {
result[key] = [ result[key], value ]
}
}
)
return result
}
},{"for-each":58,"trim":59}],61:[function(_dereq_,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],62:[function(_dereq_,module,exports){
/**
* @file big-play-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('./button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('./component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Initial play button. Shows before the video has played. The hiding of the
* big play button is done via CSS and player states.
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Button
* @class BigPlayButton
*/
var BigPlayButton = (function (_Button) {
_inherits(BigPlayButton, _Button);
function BigPlayButton(player, options) {
_classCallCheck(this, BigPlayButton);
_Button.call(this, player, options);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-big-play-button';
};
/**
* Handles click for play
*
* @method handleClick
*/
BigPlayButton.prototype.handleClick = function handleClick() {
this.player_.play();
};
return BigPlayButton;
})(_buttonJs2['default']);
BigPlayButton.prototype.controlText_ = 'Play Video';
_componentJs2['default'].registerComponent('BigPlayButton', BigPlayButton);
exports['default'] = BigPlayButton;
module.exports = exports['default'];
},{"./button.js":63,"./component.js":65}],63:[function(_dereq_,module,exports){
/**
* @file button.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* Base class for all buttons
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Component
* @class Button
*/
var Button = (function (_Component) {
_inherits(Button, _Component);
function Button(player, options) {
_classCallCheck(this, Button);
_Component.call(this, player, options);
this.emitTapEvents();
this.on('tap', this.handleClick);
this.on('click', this.handleClick);
this.on('focus', this.handleFocus);
this.on('blur', this.handleBlur);
}
/**
* Create the component's DOM element
*
* @param {String=} type Element's node type. e.g. 'div'
* @param {Object=} props An object of element attributes that should be set on the element Tag name
* @return {Element}
* @method createEl
*/
Button.prototype.createEl = function createEl() {
var tag = arguments.length <= 0 || arguments[0] === undefined ? 'button' : arguments[0];
var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
props = _objectAssign2['default']({
className: this.buildCSSClass(),
tabIndex: 0
}, props);
// Add standard Aria info
attributes = _objectAssign2['default']({
role: 'button',
type: 'button', // Necessary since the default button type is "submit"
'aria-live': 'polite' // let the screen reader user know that the text of the button may change
}, attributes);
var el = _Component.prototype.createEl.call(this, tag, props, attributes);
this.controlTextEl_ = Dom.createEl('span', {
className: 'vjs-control-text'
});
el.appendChild(this.controlTextEl_);
this.controlText(this.controlText_);
return el;
};
/**
* Controls text - both request and localize
*
* @param {String} text Text for button
* @return {String}
* @method controlText
*/
Button.prototype.controlText = function controlText(text) {
if (!text) return this.controlText_ || 'Need Text';
this.controlText_ = text;
this.controlTextEl_.innerHTML = this.localize(this.controlText_);
return this;
};
/**
* Allows sub components to stack CSS class names
*
* @return {String}
* @method buildCSSClass
*/
Button.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);
};
/**
* Handle Click - Override with specific functionality for button
*
* @method handleClick
*/
Button.prototype.handleClick = function handleClick() {};
/**
* Handle Focus - Add keyboard functionality to element
*
* @method handleFocus
*/
Button.prototype.handleFocus = function handleFocus() {
Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
};
/**
* Handle KeyPress (document level) - Trigger click when keys are pressed
*
* @method handleKeyPress
*/
Button.prototype.handleKeyPress = function handleKeyPress(event) {
// Check for space bar (32) or enter (13) keys
if (event.which === 32 || event.which === 13) {
event.preventDefault();
this.handleClick(event);
}
};
/**
* Handle Blur - Remove keyboard triggers
*
* @method handleBlur
*/
Button.prototype.handleBlur = function handleBlur() {
Events.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
};
return Button;
})(_component2['default']);
_component2['default'].registerComponent('Button', Button);
exports['default'] = Button;
module.exports = exports['default'];
},{"./component":65,"./utils/dom.js":128,"./utils/events.js":129,"./utils/fn.js":130,"global/document":1,"object.assign":45}],64:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _button = _dereq_('./button');
var _button2 = _interopRequireDefault(_button);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
/**
* The `CloseButton` component is a button which fires a "close" event
* when it is activated.
*
* @extends Button
* @class CloseButton
*/
var CloseButton = (function (_Button) {
_inherits(CloseButton, _Button);
function CloseButton(player, options) {
_classCallCheck(this, CloseButton);
_Button.call(this, player, options);
this.controlText(options && options.controlText || this.localize('Close'));
}
CloseButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this);
};
CloseButton.prototype.handleClick = function handleClick() {
this.trigger({ type: 'close', bubbles: false });
};
return CloseButton;
})(_button2['default']);
_component2['default'].registerComponent('CloseButton', CloseButton);
exports['default'] = CloseButton;
module.exports = exports['default'];
},{"./button":63,"./component":65}],65:[function(_dereq_,module,exports){
/**
* @file component.js
*
* Player Component - Base class for all UI objects
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsGuidJs = _dereq_('./utils/guid.js');
var Guid = _interopRequireWildcard(_utilsGuidJs);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
/**
* Base UI Component class
* Components are embeddable UI objects that are represented by both a
* javascript object and an element in the DOM. They can be children of other
* components, and can have many children themselves.
* ```js
* // adding a button to the player
* var button = player.addChild('button');
* button.el(); // -> button element
* ```
* ```html
* <div class="video-js">
* <div class="vjs-button">Button</div>
* </div>
* ```
* Components are also event targets.
* ```js
* button.on('click', function(){
* console.log('Button Clicked!');
* });
* button.trigger('customevent');
* ```
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @class Component
*/
var Component = (function () {
function Component(player, options, ready) {
_classCallCheck(this, Component);
// The component might be the player itself and we can't pass `this` to super
if (!player && this.play) {
this.player_ = player = this; // eslint-disable-line
} else {
this.player_ = player;
}
// Make a copy of prototype.options_ to protect against overriding defaults
this.options_ = _utilsMergeOptionsJs2['default']({}, this.options_);
// Updated options with supplied options
options = this.options_ = _utilsMergeOptionsJs2['default'](this.options_, options);
// Get ID from options or options element if one is supplied
this.id_ = options.id || options.el && options.el.id;
// If there was no ID from the options, generate one
if (!this.id_) {
// Don't require the player ID function in the case of mock players
var id = player && player.id && player.id() || 'no_player';
this.id_ = id + '_component_' + Guid.newGUID();
}
this.name_ = options.name || null;
// Create element if one wasn't provided in options
if (options.el) {
this.el_ = options.el;
} else if (options.createEl !== false) {
this.el_ = this.createEl();
}
this.children_ = [];
this.childIndex_ = {};
this.childNameIndex_ = {};
// Add any child components in options
if (options.initChildren !== false) {
this.initChildren();
}
this.ready(ready);
// Don't want to trigger ready here or it will before init is actually
// finished for all children that run this constructor
if (options.reportTouchActivity !== false) {
this.enableTouchActivity();
}
}
/**
* Dispose of the component and all child components
*
* @method dispose
*/
Component.prototype.dispose = function dispose() {
this.trigger({ type: 'dispose', bubbles: false });
// Dispose all children.
if (this.children_) {
for (var i = this.children_.length - 1; i >= 0; i--) {
if (this.children_[i].dispose) {
this.children_[i].dispose();
}
}
}
// Delete child references
this.children_ = null;
this.childIndex_ = null;
this.childNameIndex_ = null;
// Remove all event listeners.
this.off();
// Remove element from DOM
if (this.el_.parentNode) {
this.el_.parentNode.removeChild(this.el_);
}
Dom.removeElData(this.el_);
this.el_ = null;
};
/**
* Return the component's player
*
* @return {Player}
* @method player
*/
Component.prototype.player = function player() {
return this.player_;
};
/**
* Deep merge of options objects
* Whenever a property is an object on both options objects
* the two properties will be merged using mergeOptions.
*
* ```js
* Parent.prototype.options_ = {
* optionSet: {
* 'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
* 'childTwo': {},
* 'childThree': {}
* }
* }
* newOptions = {
* optionSet: {
* 'childOne': { 'foo': 'baz', 'abc': '123' }
* 'childTwo': null,
* 'childFour': {}
* }
* }
*
* this.options(newOptions);
* ```
* RESULT
* ```js
* {
* optionSet: {
* 'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
* 'childTwo': null, // Disabled. Won't be initialized.
* 'childThree': {},
* 'childFour': {}
* }
* }
* ```
*
* @param {Object} obj Object of new option values
* @return {Object} A NEW object of this.options_ and obj merged
* @method options
*/
Component.prototype.options = function options(obj) {
_utilsLogJs2['default'].warn('this.options() has been deprecated and will be moved to the constructor in 6.0');
if (!obj) {
return this.options_;
}
this.options_ = _utilsMergeOptionsJs2['default'](this.options_, obj);
return this.options_;
};
/**
* Get the component's DOM element
* ```js
* var domEl = myComponent.el();
* ```
*
* @return {Element}
* @method el
*/
Component.prototype.el = function el() {
return this.el_;
};
/**
* Create the component's DOM element
*
* @param {String=} tagName Element's node type. e.g. 'div'
* @param {Object=} properties An object of properties that should be set
* @param {Object=} attributes An object of attributes that should be set
* @return {Element}
* @method createEl
*/
Component.prototype.createEl = function createEl(tagName, properties, attributes) {
return Dom.createEl(tagName, properties, attributes);
};
Component.prototype.localize = function localize(string) {
var code = this.player_.language && this.player_.language();
var languages = this.player_.languages && this.player_.languages();
if (!code || !languages) {
return string;
}
var language = languages[code];
if (language && language[string]) {
return language[string];
}
var primaryCode = code.split('-')[0];
var primaryLang = languages[primaryCode];
if (primaryLang && primaryLang[string]) {
return primaryLang[string];
}
return string;
};
/**
* Return the component's DOM element where children are inserted.
* Will either be the same as el() or a new element defined in createEl().
*
* @return {Element}
* @method contentEl
*/
Component.prototype.contentEl = function contentEl() {
return this.contentEl_ || this.el_;
};
/**
* Get the component's ID
* ```js
* var id = myComponent.id();
* ```
*
* @return {String}
* @method id
*/
Component.prototype.id = function id() {
return this.id_;
};
/**
* Get the component's name. The name is often used to reference the component.
* ```js
* var name = myComponent.name();
* ```
*
* @return {String}
* @method name
*/
Component.prototype.name = function name() {
return this.name_;
};
/**
* Get an array of all child components
* ```js
* var kids = myComponent.children();
* ```
*
* @return {Array} The children
* @method children
*/
Component.prototype.children = function children() {
return this.children_;
};
/**
* Returns a child component with the provided ID
*
* @return {Component}
* @method getChildById
*/
Component.prototype.getChildById = function getChildById(id) {
return this.childIndex_[id];
};
/**
* Returns a child component with the provided name
*
* @return {Component}
* @method getChild
*/
Component.prototype.getChild = function getChild(name) {
return this.childNameIndex_[name];
};
/**
* Adds a child component inside this component
* ```js
* myComponent.el();
* // -> <div class='my-component'></div>
* myComponent.children();
* // [empty array]
*
* var myButton = myComponent.addChild('MyButton');
* // -> <div class='my-component'><div class="my-button">myButton<div></div>
* // -> myButton === myComponent.children()[0];
* ```
* Pass in options for child constructors and options for children of the child
* ```js
* var myButton = myComponent.addChild('MyButton', {
* text: 'Press Me',
* buttonChildExample: {
* buttonChildOption: true
* }
* });
* ```
*
* @param {String|Component} child The class name or instance of a child to add
* @param {Object=} options Options, including options to be passed to children of the child.
* @return {Component} The child component (created by this process if a string was used)
* @method addChild
*/
Component.prototype.addChild = function addChild(child) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var component = undefined;
var componentName = undefined;
// If child is a string, create nt with options
if (typeof child === 'string') {
componentName = child;
// Options can also be specified as a boolean, so convert to an empty object if false.
if (!options) {
options = {};
}
// Same as above, but true is deprecated so show a warning.
if (options === true) {
_utilsLogJs2['default'].warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');
options = {};
}
// If no componentClass in options, assume componentClass is the name lowercased
// (e.g. playButton)
var componentClassName = options.componentClass || _utilsToTitleCaseJs2['default'](componentName);
// Set name through options
options.name = componentName;
// Create a new object & element for this controls set
// If there's no .player_, this is a player
var ComponentClass = Component.getComponent(componentClassName);
if (!ComponentClass) {
throw new Error('Component ' + componentClassName + ' does not exist');
}
// data stored directly on the videojs object may be
// misidentified as a component to retain
// backwards-compatibility with 4.x. check to make sure the
// component class can be instantiated.
if (typeof ComponentClass !== 'function') {
return null;
}
component = new ComponentClass(this.player_ || this, options);
// child is a component instance
} else {
component = child;
}
this.children_.push(component);
if (typeof component.id === 'function') {
this.childIndex_[component.id()] = component;
}
// If a name wasn't used to create the component, check if we can use the
// name function of the component
componentName = componentName || component.name && component.name();
if (componentName) {
this.childNameIndex_[componentName] = component;
}
// Add the UI object's element to the container div (box)
// Having an element is not required
if (typeof component.el === 'function' && component.el()) {
this.contentEl().appendChild(component.el());
}
// Return so it can stored on parent object if desired.
return component;
};
/**
* Remove a child component from this component's list of children, and the
* child component's element from this component's element
*
* @param {Component} component Component to remove
* @method removeChild
*/
Component.prototype.removeChild = function removeChild(component) {
if (typeof component === 'string') {
component = this.getChild(component);
}
if (!component || !this.children_) {
return;
}
var childFound = false;
for (var i = this.children_.length - 1; i >= 0; i--) {
if (this.children_[i] === component) {
childFound = true;
this.children_.splice(i, 1);
break;
}
}
if (!childFound) {
return;
}
this.childIndex_[component.id()] = null;
this.childNameIndex_[component.name()] = null;
var compEl = component.el();
if (compEl && compEl.parentNode === this.contentEl()) {
this.contentEl().removeChild(component.el());
}
};
/**
* Add and initialize default child components from options
* ```js
* // when an instance of MyComponent is created, all children in options
* // will be added to the instance by their name strings and options
* MyComponent.prototype.options_ = {
* children: [
* 'myChildComponent'
* ],
* myChildComponent: {
* myChildOption: true
* }
* };
*
* // Or when creating the component
* var myComp = new MyComponent(player, {
* children: [
* 'myChildComponent'
* ],
* myChildComponent: {
* myChildOption: true
* }
* });
* ```
* The children option can also be an array of
* child options objects (that also include a 'name' key).
* This can be used if you have two child components of the
* same type that need different options.
* ```js
* var myComp = new MyComponent(player, {
* children: [
* 'button',
* {
* name: 'button',
* someOtherOption: true
* },
* {
* name: 'button',
* someOtherOption: false
* }
* ]
* });
* ```
*
* @method initChildren
*/
Component.prototype.initChildren = function initChildren() {
var _this = this;
var children = this.options_.children;
if (children) {
(function () {
// `this` is `parent`
var parentOptions = _this.options_;
var handleAdd = function handleAdd(child) {
var name = child.name;
var opts = child.opts;
// Allow options for children to be set at the parent options
// e.g. videojs(id, { controlBar: false });
// instead of videojs(id, { children: { controlBar: false });
if (parentOptions[name] !== undefined) {
opts = parentOptions[name];
}
// Allow for disabling default components
// e.g. options['children']['posterImage'] = false
if (opts === false) {
return;
}
// Allow options to be passed as a simple boolean if no configuration
// is necessary.
if (opts === true) {
opts = {};
}
// We also want to pass the original player options to each component as well so they don't need to
// reach back into the player for options later.
opts.playerOptions = _this.options_.playerOptions;
// Create and add the child component.
// Add a direct reference to the child by name on the parent instance.
// If two of the same component are used, different names should be supplied
// for each
var newChild = _this.addChild(name, opts);
if (newChild) {
_this[name] = newChild;
}
};
// Allow for an array of children details to passed in the options
var workingChildren = undefined;
var Tech = Component.getComponent('Tech');
if (Array.isArray(children)) {
workingChildren = children;
} else {
workingChildren = Object.keys(children);
}
workingChildren
// children that are in this.options_ but also in workingChildren would
// give us extra children we do not want. So, we want to filter them out.
.concat(Object.keys(_this.options_).filter(function (child) {
return !workingChildren.some(function (wchild) {
if (typeof wchild === 'string') {
return child === wchild;
} else {
return child === wchild.name;
}
});
})).map(function (child) {
var name = undefined,
opts = undefined;
if (typeof child === 'string') {
name = child;
opts = children[name] || _this.options_[name] || {};
} else {
name = child.name;
opts = child;
}
return { name: name, opts: opts };
}).filter(function (child) {
// we have to make sure that child.name isn't in the techOrder since
// techs are registerd as Components but can't aren't compatible
// See https://github.com/videojs/video.js/issues/2772
var c = Component.getComponent(child.opts.componentClass || _utilsToTitleCaseJs2['default'](child.name));
return c && !Tech.isTech(c);
}).forEach(handleAdd);
})();
}
};
/**
* Allows sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
Component.prototype.buildCSSClass = function buildCSSClass() {
// Child classes can include a function that does:
// return 'CLASS NAME' + this._super();
return '';
};
/**
* Add an event listener to this component's element
* ```js
* var myFunc = function(){
* var myComponent = this;
* // Do something when the event is fired
* };
*
* myComponent.on('eventType', myFunc);
* ```
* The context of myFunc will be myComponent unless previously bound.
* Alternatively, you can add a listener to another element or component.
* ```js
* myComponent.on(otherElement, 'eventName', myFunc);
* myComponent.on(otherComponent, 'eventName', myFunc);
* ```
* The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`
* and `otherComponent.on('eventName', myFunc)` is that this way the listeners
* will be automatically cleaned up when either component is disposed.
* It will also bind myComponent as the context of myFunc.
* **NOTE**: When using this on elements in the page other than window
* and document (both permanent), if you remove the element from the DOM
* you need to call `myComponent.trigger(el, 'dispose')` on it to clean up
* references to it and allow the browser to garbage collect it.
*
* @param {String|Component} first The event type or other component
* @param {Function|String} second The event handler or event type
* @param {Function} third The event handler
* @return {Component}
* @method on
*/
Component.prototype.on = function on(first, second, third) {
var _this2 = this;
if (typeof first === 'string' || Array.isArray(first)) {
Events.on(this.el_, first, Fn.bind(this, second));
// Targeting another component or element
} else {
(function () {
var target = first;
var type = second;
var fn = Fn.bind(_this2, third);
// When this component is disposed, remove the listener from the other component
var removeOnDispose = function removeOnDispose() {
return _this2.off(target, type, fn);
};
// Use the same function ID so we can remove it later it using the ID
// of the original listener
removeOnDispose.guid = fn.guid;
_this2.on('dispose', removeOnDispose);
// If the other component is disposed first we need to clean the reference
// to the other component in this component's removeOnDispose listener
// Otherwise we create a memory leak.
var cleanRemover = function cleanRemover() {
return _this2.off('dispose', removeOnDispose);
};
// Add the same function ID so we can easily remove it later
cleanRemover.guid = fn.guid;
// Check if this is a DOM node
if (first.nodeName) {
// Add the listener to the other element
Events.on(target, type, fn);
Events.on(target, 'dispose', cleanRemover);
// Should be a component
// Not using `instanceof Component` because it makes mock players difficult
} else if (typeof first.on === 'function') {
// Add the listener to the other component
target.on(type, fn);
target.on('dispose', cleanRemover);
}
})();
}
return this;
};
/**
* Remove an event listener from this component's element
* ```js
* myComponent.off('eventType', myFunc);
* ```
* If myFunc is excluded, ALL listeners for the event type will be removed.
* If eventType is excluded, ALL listeners will be removed from the component.
* Alternatively you can use `off` to remove listeners that were added to other
* elements or components using `myComponent.on(otherComponent...`.
* In this case both the event type and listener function are REQUIRED.
* ```js
* myComponent.off(otherElement, 'eventType', myFunc);
* myComponent.off(otherComponent, 'eventType', myFunc);
* ```
*
* @param {String=|Component} first The event type or other component
* @param {Function=|String} second The listener function or event type
* @param {Function=} third The listener for other component
* @return {Component}
* @method off
*/
Component.prototype.off = function off(first, second, third) {
if (!first || typeof first === 'string' || Array.isArray(first)) {
Events.off(this.el_, first, second);
} else {
var target = first;
var type = second;
// Ensure there's at least a guid, even if the function hasn't been used
var fn = Fn.bind(this, third);
// Remove the dispose listener on this component,
// which was given the same guid as the event listener
this.off('dispose', fn);
if (first.nodeName) {
// Remove the listener
Events.off(target, type, fn);
// Remove the listener for cleaning the dispose listener
Events.off(target, 'dispose', fn);
} else {
target.off(type, fn);
target.off('dispose', fn);
}
}
return this;
};
/**
* Add an event listener to be triggered only once and then removed
* ```js
* myComponent.one('eventName', myFunc);
* ```
* Alternatively you can add a listener to another element or component
* that will be triggered only once.
* ```js
* myComponent.one(otherElement, 'eventName', myFunc);
* myComponent.one(otherComponent, 'eventName', myFunc);
* ```
*
* @param {String|Component} first The event type or other component
* @param {Function|String} second The listener function or event type
* @param {Function=} third The listener function for other component
* @return {Component}
* @method one
*/
Component.prototype.one = function one(first, second, third) {
var _this3 = this,
_arguments = arguments;
if (typeof first === 'string' || Array.isArray(first)) {
Events.one(this.el_, first, Fn.bind(this, second));
} else {
(function () {
var target = first;
var type = second;
var fn = Fn.bind(_this3, third);
var newFunc = function newFunc() {
_this3.off(target, type, newFunc);
fn.apply(null, _arguments);
};
// Keep the same function ID so we can remove it later
newFunc.guid = fn.guid;
_this3.on(target, type, newFunc);
})();
}
return this;
};
/**
* Trigger an event on an element
* ```js
* myComponent.trigger('eventName');
* myComponent.trigger({'type':'eventName'});
* myComponent.trigger('eventName', {data: 'some data'});
* myComponent.trigger({'type':'eventName'}, {data: 'some data'});
* ```
*
* @param {Event|Object|String} event A string (the type) or an event object with a type attribute
* @param {Object} [hash] data hash to pass along with the event
* @return {Component} self
* @method trigger
*/
Component.prototype.trigger = function trigger(event, hash) {
Events.trigger(this.el_, event, hash);
return this;
};
/**
* Bind a listener to the component's ready state.
* Different from event listeners in that if the ready event has already happened
* it will trigger the function immediately.
*
* @param {Function} fn Ready listener
* @param {Boolean} sync Exec the listener synchronously if component is ready
* @return {Component}
* @method ready
*/
Component.prototype.ready = function ready(fn) {
var sync = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
if (fn) {
if (this.isReady_) {
if (sync) {
fn.call(this);
} else {
// Call the function asynchronously by default for consistency
this.setTimeout(fn, 1);
}
} else {
this.readyQueue_ = this.readyQueue_ || [];
this.readyQueue_.push(fn);
}
}
return this;
};
/**
* Trigger the ready listeners
*
* @return {Component}
* @method triggerReady
*/
Component.prototype.triggerReady = function triggerReady() {
this.isReady_ = true;
// Ensure ready is triggerd asynchronously
this.setTimeout(function () {
var readyQueue = this.readyQueue_;
// Reset Ready Queue
this.readyQueue_ = [];
if (readyQueue && readyQueue.length > 0) {
readyQueue.forEach(function (fn) {
fn.call(this);
}, this);
}
// Allow for using event listeners also
this.trigger('ready');
}, 1);
};
/**
* Finds a single DOM element matching `selector` within the component's
* `contentEl` or another custom context.
*
* @method $
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelector`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {Element|null}
*/
Component.prototype.$ = function $(selector, context) {
return Dom.$(selector, context || this.contentEl());
};
/**
* Finds a all DOM elements matching `selector` within the component's
* `contentEl` or another custom context.
*
* @method $$
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelectorAll`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {NodeList}
*/
Component.prototype.$$ = function $$(selector, context) {
return Dom.$$(selector, context || this.contentEl());
};
/**
* Check if a component's element has a CSS class name
*
* @param {String} classToCheck Classname to check
* @return {Component}
* @method hasClass
*/
Component.prototype.hasClass = function hasClass(classToCheck) {
return Dom.hasElClass(this.el_, classToCheck);
};
/**
* Add a CSS class name to the component's element
*
* @param {String} classToAdd Classname to add
* @return {Component}
* @method addClass
*/
Component.prototype.addClass = function addClass(classToAdd) {
Dom.addElClass(this.el_, classToAdd);
return this;
};
/**
* Remove a CSS class name from the component's element
*
* @param {String} classToRemove Classname to remove
* @return {Component}
* @method removeClass
*/
Component.prototype.removeClass = function removeClass(classToRemove) {
Dom.removeElClass(this.el_, classToRemove);
return this;
};
/**
* Add or remove a CSS class name from the component's element
*
* @param {String} classToToggle
* @param {Boolean|Function} [predicate]
* Can be a function that returns a Boolean. If `true`, the class
* will be added; if `false`, the class will be removed. If not
* given, the class will be added if not present and vice versa.
*
* @return {Component}
* @method toggleClass
*/
Component.prototype.toggleClass = function toggleClass(classToToggle, predicate) {
Dom.toggleElClass(this.el_, classToToggle, predicate);
return this;
};
/**
* Show the component element if hidden
*
* @return {Component}
* @method show
*/
Component.prototype.show = function show() {
this.removeClass('vjs-hidden');
return this;
};
/**
* Hide the component element if currently showing
*
* @return {Component}
* @method hide
*/
Component.prototype.hide = function hide() {
this.addClass('vjs-hidden');
return this;
};
/**
* Lock an item in its visible state
* To be used with fadeIn/fadeOut.
*
* @return {Component}
* @private
* @method lockShowing
*/
Component.prototype.lockShowing = function lockShowing() {
this.addClass('vjs-lock-showing');
return this;
};
/**
* Unlock an item to be hidden
* To be used with fadeIn/fadeOut.
*
* @return {Component}
* @private
* @method unlockShowing
*/
Component.prototype.unlockShowing = function unlockShowing() {
this.removeClass('vjs-lock-showing');
return this;
};
/**
* Set or get the width of the component (CSS values)
* Setting the video tag dimension values only works with values in pixels.
* Percent values will not work.
* Some percents can be used, but width()/height() will return the number + %,
* not the actual computed width/height.
*
* @param {Number|String=} num Optional width number
* @param {Boolean} skipListeners Skip the 'resize' event trigger
* @return {Component} This component, when setting the width
* @return {Number|String} The width, when getting
* @method width
*/
Component.prototype.width = function width(num, skipListeners) {
return this.dimension('width', num, skipListeners);
};
/**
* Get or set the height of the component (CSS values)
* Setting the video tag dimension values only works with values in pixels.
* Percent values will not work.
* Some percents can be used, but width()/height() will return the number + %,
* not the actual computed width/height.
*
* @param {Number|String=} num New component height
* @param {Boolean=} skipListeners Skip the resize event trigger
* @return {Component} This component, when setting the height
* @return {Number|String} The height, when getting
* @method height
*/
Component.prototype.height = function height(num, skipListeners) {
return this.dimension('height', num, skipListeners);
};
/**
* Set both width and height at the same time
*
* @param {Number|String} width Width of player
* @param {Number|String} height Height of player
* @return {Component} The component
* @method dimensions
*/
Component.prototype.dimensions = function dimensions(width, height) {
// Skip resize listeners on width for optimization
return this.width(width, true).height(height);
};
/**
* Get or set width or height
* This is the shared code for the width() and height() methods.
* All for an integer, integer + 'px' or integer + '%';
* Known issue: Hidden elements officially have a width of 0. We're defaulting
* to the style.width value and falling back to computedStyle which has the
* hidden element issue. Info, but probably not an efficient fix:
* http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
*
* @param {String} widthOrHeight 'width' or 'height'
* @param {Number|String=} num New dimension
* @param {Boolean=} skipListeners Skip resize event trigger
* @return {Component} The component if a dimension was set
* @return {Number|String} The dimension if nothing was set
* @private
* @method dimension
*/
Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {
if (num !== undefined) {
// Set to zero if null or literally NaN (NaN !== NaN)
if (num === null || num !== num) {
num = 0;
}
// Check if using css width/height (% or px) and adjust
if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {
this.el_.style[widthOrHeight] = num;
} else if (num === 'auto') {
this.el_.style[widthOrHeight] = '';
} else {
this.el_.style[widthOrHeight] = num + 'px';
}
// skipListeners allows us to avoid triggering the resize event when setting both width and height
if (!skipListeners) {
this.trigger('resize');
}
// Return component
return this;
}
// Not setting a value, so getting it
// Make sure element exists
if (!this.el_) {
return 0;
}
// Get dimension value from style
var val = this.el_.style[widthOrHeight];
var pxIndex = val.indexOf('px');
if (pxIndex !== -1) {
// Return the pixel value with no 'px'
return parseInt(val.slice(0, pxIndex), 10);
}
// No px so using % or no style was set, so falling back to offsetWidth/height
// If component has display:none, offset will return 0
// TODO: handle display:none and no dimension style using px
return parseInt(this.el_['offset' + _utilsToTitleCaseJs2['default'](widthOrHeight)], 10);
};
/**
* Emit 'tap' events when touch events are supported
* This is used to support toggling the controls through a tap on the video.
* We're requiring them to be enabled because otherwise every component would
* have this extra overhead unnecessarily, on mobile devices where extra
* overhead is especially bad.
*
* @private
* @method emitTapEvents
*/
Component.prototype.emitTapEvents = function emitTapEvents() {
// Track the start time so we can determine how long the touch lasted
var touchStart = 0;
var firstTouch = null;
// Maximum movement allowed during a touch event to still be considered a tap
// Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.
var tapMovementThreshold = 10;
// The maximum length a touch can be while still being considered a tap
var touchTimeThreshold = 200;
var couldBeTap = undefined;
this.on('touchstart', function (event) {
// If more than one finger, don't consider treating this as a click
if (event.touches.length === 1) {
// Copy the touches object to prevent modifying the original
firstTouch = _objectAssign2['default']({}, event.touches[0]);
// Record start time so we can detect a tap vs. "touch and hold"
touchStart = new Date().getTime();
// Reset couldBeTap tracking
couldBeTap = true;
}
});
this.on('touchmove', function (event) {
// If more than one finger, don't consider treating this as a click
if (event.touches.length > 1) {
couldBeTap = false;
} else if (firstTouch) {
// Some devices will throw touchmoves for all but the slightest of taps.
// So, if we moved only a small distance, this could still be a tap
var xdiff = event.touches[0].pageX - firstTouch.pageX;
var ydiff = event.touches[0].pageY - firstTouch.pageY;
var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);
if (touchDistance > tapMovementThreshold) {
couldBeTap = false;
}
}
});
var noTap = function noTap() {
couldBeTap = false;
};
// TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
this.on('touchleave', noTap);
this.on('touchcancel', noTap);
// When the touch ends, measure how long it took and trigger the appropriate
// event
this.on('touchend', function (event) {
firstTouch = null;
// Proceed only if the touchmove/leave/cancel event didn't happen
if (couldBeTap === true) {
// Measure how long the touch lasted
var touchTime = new Date().getTime() - touchStart;
// Make sure the touch was less than the threshold to be considered a tap
if (touchTime < touchTimeThreshold) {
// Don't let browser turn this into a click
event.preventDefault();
this.trigger('tap');
// It may be good to copy the touchend event object and change the
// type to tap, if the other event properties aren't exact after
// Events.fixEvent runs (e.g. event.target)
}
}
});
};
/**
* Report user touch activity when touch events occur
* User activity is used to determine when controls should show/hide. It's
* relatively simple when it comes to mouse events, because any mouse event
* should show the controls. So we capture mouse events that bubble up to the
* player and report activity when that happens.
* With touch events it isn't as easy. We can't rely on touch events at the
* player level, because a tap (touchstart + touchend) on the video itself on
* mobile devices is meant to turn controls off (and on). User activity is
* checked asynchronously, so what could happen is a tap event on the video
* turns the controls off, then the touchend event bubbles up to the player,
* which if it reported user activity, would turn the controls right back on.
* (We also don't want to completely block touch events from bubbling up)
* Also a touchmove, touch+hold, and anything other than a tap is not supposed
* to turn the controls back on on a mobile device.
* Here we're setting the default component behavior to report user activity
* whenever touch events happen, and this can be turned off by components that
* want touch events to act differently.
*
* @method enableTouchActivity
*/
Component.prototype.enableTouchActivity = function enableTouchActivity() {
// Don't continue if the root player doesn't support reporting user activity
if (!this.player() || !this.player().reportUserActivity) {
return;
}
// listener for reporting that the user is active
var report = Fn.bind(this.player(), this.player().reportUserActivity);
var touchHolding = undefined;
this.on('touchstart', function () {
report();
// For as long as the they are touching the device or have their mouse down,
// we consider them active even if they're not moving their finger or mouse.
// So we want to continue to update that they are active
this.clearInterval(touchHolding);
// report at the same interval as activityCheck
touchHolding = this.setInterval(report, 250);
});
var touchEnd = function touchEnd(event) {
report();
// stop the interval that maintains activity if the touch is holding
this.clearInterval(touchHolding);
};
this.on('touchmove', report);
this.on('touchend', touchEnd);
this.on('touchcancel', touchEnd);
};
/**
* Creates timeout and sets up disposal automatically.
*
* @param {Function} fn The function to run after the timeout.
* @param {Number} timeout Number of ms to delay before executing specified function.
* @return {Number} Returns the timeout ID
* @method setTimeout
*/
Component.prototype.setTimeout = function setTimeout(fn, timeout) {
fn = Fn.bind(this, fn);
// window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.
var timeoutId = _globalWindow2['default'].setTimeout(fn, timeout);
var disposeFn = function disposeFn() {
this.clearTimeout(timeoutId);
};
disposeFn.guid = 'vjs-timeout-' + timeoutId;
this.on('dispose', disposeFn);
return timeoutId;
};
/**
* Clears a timeout and removes the associated dispose listener
*
* @param {Number} timeoutId The id of the timeout to clear
* @return {Number} Returns the timeout ID
* @method clearTimeout
*/
Component.prototype.clearTimeout = function clearTimeout(timeoutId) {
_globalWindow2['default'].clearTimeout(timeoutId);
var disposeFn = function disposeFn() {};
disposeFn.guid = 'vjs-timeout-' + timeoutId;
this.off('dispose', disposeFn);
return timeoutId;
};
/**
* Creates an interval and sets up disposal automatically.
*
* @param {Function} fn The function to run every N seconds.
* @param {Number} interval Number of ms to delay before executing specified function.
* @return {Number} Returns the interval ID
* @method setInterval
*/
Component.prototype.setInterval = function setInterval(fn, interval) {
fn = Fn.bind(this, fn);
var intervalId = _globalWindow2['default'].setInterval(fn, interval);
var disposeFn = function disposeFn() {
this.clearInterval(intervalId);
};
disposeFn.guid = 'vjs-interval-' + intervalId;
this.on('dispose', disposeFn);
return intervalId;
};
/**
* Clears an interval and removes the associated dispose listener
*
* @param {Number} intervalId The id of the interval to clear
* @return {Number} Returns the interval ID
* @method clearInterval
*/
Component.prototype.clearInterval = function clearInterval(intervalId) {
_globalWindow2['default'].clearInterval(intervalId);
var disposeFn = function disposeFn() {};
disposeFn.guid = 'vjs-interval-' + intervalId;
this.off('dispose', disposeFn);
return intervalId;
};
/**
* Registers a component
*
* @param {String} name Name of the component to register
* @param {Object} comp The component to register
* @static
* @method registerComponent
*/
Component.registerComponent = function registerComponent(name, comp) {
if (!Component.components_) {
Component.components_ = {};
}
Component.components_[name] = comp;
return comp;
};
/**
* Gets a component by name
*
* @param {String} name Name of the component to get
* @return {Component}
* @static
* @method getComponent
*/
Component.getComponent = function getComponent(name) {
if (Component.components_ && Component.components_[name]) {
return Component.components_[name];
}
if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) {
_utilsLogJs2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)');
return _globalWindow2['default'].videojs[name];
}
};
/**
* Sets up the constructor using the supplied init method
* or uses the init of the parent object
*
* @param {Object} props An object of properties
* @static
* @deprecated
* @method extend
*/
Component.extend = function extend(props) {
props = props || {};
_utilsLogJs2['default'].warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');
// Set up the constructor using the supplied init method
// or using the init of the parent object
// Make sure to check the unobfuscated version for external libs
var init = props.init || props.init || this.prototype.init || this.prototype.init || function () {};
// In Resig's simple class inheritance (previously used) the constructor
// is a function that calls `this.init.apply(arguments)`
// However that would prevent us from using `ParentObject.call(this);`
// in a Child constructor because the `this` in `this.init`
// would still refer to the Child and cause an infinite loop.
// We would instead have to do
// `ParentObject.prototype.init.apply(this, arguments);`
// Bleh. We're not creating a _super() function, so it's good to keep
// the parent constructor reference simple.
var subObj = function subObj() {
init.apply(this, arguments);
};
// Inherit from this object's prototype
subObj.prototype = Object.create(this.prototype);
// Reset the constructor property for subObj otherwise
// instances of subObj would have the constructor of the parent Object
subObj.prototype.constructor = subObj;
// Make the class extendable
subObj.extend = Component.extend;
// Extend subObj's prototype with functions and other properties from props
for (var _name in props) {
if (props.hasOwnProperty(_name)) {
subObj.prototype[_name] = props[_name];
}
}
return subObj;
};
return Component;
})();
Component.registerComponent('Component', Component);
exports['default'] = Component;
module.exports = exports['default'];
},{"./utils/dom.js":128,"./utils/events.js":129,"./utils/fn.js":130,"./utils/guid.js":132,"./utils/log.js":133,"./utils/merge-options.js":134,"./utils/to-title-case.js":137,"global/window":2,"object.assign":45}],66:[function(_dereq_,module,exports){
/**
* @file control-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
// Required children
var _playToggleJs = _dereq_('./play-toggle.js');
var _playToggleJs2 = _interopRequireDefault(_playToggleJs);
var _timeControlsCurrentTimeDisplayJs = _dereq_('./time-controls/current-time-display.js');
var _timeControlsCurrentTimeDisplayJs2 = _interopRequireDefault(_timeControlsCurrentTimeDisplayJs);
var _timeControlsDurationDisplayJs = _dereq_('./time-controls/duration-display.js');
var _timeControlsDurationDisplayJs2 = _interopRequireDefault(_timeControlsDurationDisplayJs);
var _timeControlsTimeDividerJs = _dereq_('./time-controls/time-divider.js');
var _timeControlsTimeDividerJs2 = _interopRequireDefault(_timeControlsTimeDividerJs);
var _timeControlsRemainingTimeDisplayJs = _dereq_('./time-controls/remaining-time-display.js');
var _timeControlsRemainingTimeDisplayJs2 = _interopRequireDefault(_timeControlsRemainingTimeDisplayJs);
var _liveDisplayJs = _dereq_('./live-display.js');
var _liveDisplayJs2 = _interopRequireDefault(_liveDisplayJs);
var _progressControlProgressControlJs = _dereq_('./progress-control/progress-control.js');
var _progressControlProgressControlJs2 = _interopRequireDefault(_progressControlProgressControlJs);
var _fullscreenToggleJs = _dereq_('./fullscreen-toggle.js');
var _fullscreenToggleJs2 = _interopRequireDefault(_fullscreenToggleJs);
var _volumeControlVolumeControlJs = _dereq_('./volume-control/volume-control.js');
var _volumeControlVolumeControlJs2 = _interopRequireDefault(_volumeControlVolumeControlJs);
var _volumeMenuButtonJs = _dereq_('./volume-menu-button.js');
var _volumeMenuButtonJs2 = _interopRequireDefault(_volumeMenuButtonJs);
var _muteToggleJs = _dereq_('./mute-toggle.js');
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
var _textTrackControlsChaptersButtonJs = _dereq_('./text-track-controls/chapters-button.js');
var _textTrackControlsChaptersButtonJs2 = _interopRequireDefault(_textTrackControlsChaptersButtonJs);
var _textTrackControlsSubtitlesButtonJs = _dereq_('./text-track-controls/subtitles-button.js');
var _textTrackControlsSubtitlesButtonJs2 = _interopRequireDefault(_textTrackControlsSubtitlesButtonJs);
var _textTrackControlsCaptionsButtonJs = _dereq_('./text-track-controls/captions-button.js');
var _textTrackControlsCaptionsButtonJs2 = _interopRequireDefault(_textTrackControlsCaptionsButtonJs);
var _playbackRateMenuPlaybackRateMenuButtonJs = _dereq_('./playback-rate-menu/playback-rate-menu-button.js');
var _playbackRateMenuPlaybackRateMenuButtonJs2 = _interopRequireDefault(_playbackRateMenuPlaybackRateMenuButtonJs);
var _spacerControlsCustomControlSpacerJs = _dereq_('./spacer-controls/custom-control-spacer.js');
var _spacerControlsCustomControlSpacerJs2 = _interopRequireDefault(_spacerControlsCustomControlSpacerJs);
/**
* Container of main controls
*
* @extends Component
* @class ControlBar
*/
var ControlBar = (function (_Component) {
_inherits(ControlBar, _Component);
function ControlBar() {
_classCallCheck(this, ControlBar);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
ControlBar.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-control-bar'
});
};
return ControlBar;
})(_componentJs2['default']);
ControlBar.prototype.options_ = {
loadEvent: 'play',
children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'subtitlesButton', 'captionsButton', 'fullscreenToggle']
};
_componentJs2['default'].registerComponent('ControlBar', ControlBar);
exports['default'] = ControlBar;
module.exports = exports['default'];
},{"../component.js":65,"./fullscreen-toggle.js":67,"./live-display.js":68,"./mute-toggle.js":69,"./play-toggle.js":70,"./playback-rate-menu/playback-rate-menu-button.js":71,"./progress-control/progress-control.js":76,"./spacer-controls/custom-control-spacer.js":78,"./text-track-controls/captions-button.js":81,"./text-track-controls/chapters-button.js":82,"./text-track-controls/subtitles-button.js":85,"./time-controls/current-time-display.js":88,"./time-controls/duration-display.js":89,"./time-controls/remaining-time-display.js":90,"./time-controls/time-divider.js":91,"./volume-control/volume-control.js":93,"./volume-menu-button.js":95}],67:[function(_dereq_,module,exports){
/**
* @file fullscreen-toggle.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Toggle fullscreen video
*
* @extends Button
* @class FullscreenToggle
*/
var FullscreenToggle = (function (_Button) {
_inherits(FullscreenToggle, _Button);
function FullscreenToggle() {
_classCallCheck(this, FullscreenToggle);
_Button.apply(this, arguments);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Handles click for full screen
*
* @method handleClick
*/
FullscreenToggle.prototype.handleClick = function handleClick() {
if (!this.player_.isFullscreen()) {
this.player_.requestFullscreen();
this.controlText('Non-Fullscreen');
} else {
this.player_.exitFullscreen();
this.controlText('Fullscreen');
}
};
return FullscreenToggle;
})(_buttonJs2['default']);
FullscreenToggle.prototype.controlText_ = 'Fullscreen';
_componentJs2['default'].registerComponent('FullscreenToggle', FullscreenToggle);
exports['default'] = FullscreenToggle;
module.exports = exports['default'];
},{"../button.js":63,"../component.js":65}],68:[function(_dereq_,module,exports){
/**
* @file live-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* Displays the live indicator
* TODO - Future make it click to snap to live
*
* @extends Component
* @class LiveDisplay
*/
var LiveDisplay = (function (_Component) {
_inherits(LiveDisplay, _Component);
function LiveDisplay(player, options) {
_classCallCheck(this, LiveDisplay);
_Component.call(this, player, options);
this.updateShowing();
this.on(this.player(), 'durationchange', this.updateShowing);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
LiveDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-live-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-live-display',
innerHTML: '<span class="vjs-control-text">' + this.localize('Stream Type') + '</span>' + this.localize('LIVE')
}, {
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
LiveDisplay.prototype.updateShowing = function updateShowing() {
if (this.player().duration() === Infinity) {
this.show();
} else {
this.hide();
}
};
return LiveDisplay;
})(_component2['default']);
_component2['default'].registerComponent('LiveDisplay', LiveDisplay);
exports['default'] = LiveDisplay;
module.exports = exports['default'];
},{"../component":65,"../utils/dom.js":128}],69:[function(_dereq_,module,exports){
/**
* @file mute-toggle.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _button = _dereq_('../button');
var _button2 = _interopRequireDefault(_button);
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* A button component for muting the audio
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class MuteToggle
*/
var MuteToggle = (function (_Button) {
_inherits(MuteToggle, _Button);
function MuteToggle(player, options) {
_classCallCheck(this, MuteToggle);
_Button.call(this, player, options);
this.on(player, 'volumechange', this.update);
// hide mute toggle if the current tech doesn't support volume control
if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
}
this.on(player, 'loadstart', function () {
this.update(); // We need to update the button to account for a default muted state.
if (player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
} else {
this.removeClass('vjs-hidden');
}
});
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
MuteToggle.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Handle click on mute
*
* @method handleClick
*/
MuteToggle.prototype.handleClick = function handleClick() {
this.player_.muted(this.player_.muted() ? false : true);
};
/**
* Update volume
*
* @method update
*/
MuteToggle.prototype.update = function update() {
var vol = this.player_.volume(),
level = 3;
if (vol === 0 || this.player_.muted()) {
level = 0;
} else if (vol < 0.33) {
level = 1;
} else if (vol < 0.67) {
level = 2;
}
// Don't rewrite the button text if the actual text doesn't change.
// This causes unnecessary and confusing information for screen reader users.
// This check is needed because this function gets called every time the volume level is changed.
var toMute = this.player_.muted() ? 'Unmute' : 'Mute';
var localizedMute = this.localize(toMute);
if (this.controlText() !== localizedMute) {
this.controlText(localizedMute);
}
/* TODO improve muted icon classes */
for (var i = 0; i < 4; i++) {
Dom.removeElClass(this.el_, 'vjs-vol-' + i);
}
Dom.addElClass(this.el_, 'vjs-vol-' + level);
};
return MuteToggle;
})(_button2['default']);
MuteToggle.prototype.controlText_ = 'Mute';
_component2['default'].registerComponent('MuteToggle', MuteToggle);
exports['default'] = MuteToggle;
module.exports = exports['default'];
},{"../button":63,"../component":65,"../utils/dom.js":128}],70:[function(_dereq_,module,exports){
/**
* @file play-toggle.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Button to toggle between play and pause
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class PlayToggle
*/
var PlayToggle = (function (_Button) {
_inherits(PlayToggle, _Button);
function PlayToggle(player, options) {
_classCallCheck(this, PlayToggle);
_Button.call(this, player, options);
this.on(player, 'play', this.handlePlay);
this.on(player, 'pause', this.handlePause);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
PlayToggle.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Handle click to toggle between play and pause
*
* @method handleClick
*/
PlayToggle.prototype.handleClick = function handleClick() {
if (this.player_.paused()) {
this.player_.play();
} else {
this.player_.pause();
}
};
/**
* Add the vjs-playing class to the element so it can change appearance
*
* @method handlePlay
*/
PlayToggle.prototype.handlePlay = function handlePlay() {
this.removeClass('vjs-paused');
this.addClass('vjs-playing');
this.controlText('Pause'); // change the button text to "Pause"
};
/**
* Add the vjs-paused class to the element so it can change appearance
*
* @method handlePause
*/
PlayToggle.prototype.handlePause = function handlePause() {
this.removeClass('vjs-playing');
this.addClass('vjs-paused');
this.controlText('Play'); // change the button text to "Play"
};
return PlayToggle;
})(_buttonJs2['default']);
PlayToggle.prototype.controlText_ = 'Play';
_componentJs2['default'].registerComponent('PlayToggle', PlayToggle);
exports['default'] = PlayToggle;
module.exports = exports['default'];
},{"../button.js":63,"../component.js":65}],71:[function(_dereq_,module,exports){
/**
* @file playback-rate-menu-button.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _menuMenuJs = _dereq_('../../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _playbackRateMenuItemJs = _dereq_('./playback-rate-menu-item.js');
var _playbackRateMenuItemJs2 = _interopRequireDefault(_playbackRateMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* The component for controlling the playback rate
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuButton
* @class PlaybackRateMenuButton
*/
var PlaybackRateMenuButton = (function (_MenuButton) {
_inherits(PlaybackRateMenuButton, _MenuButton);
function PlaybackRateMenuButton(player, options) {
_classCallCheck(this, PlaybackRateMenuButton);
_MenuButton.call(this, player, options);
this.updateVisibility();
this.updateLabel();
this.on(player, 'loadstart', this.updateVisibility);
this.on(player, 'ratechange', this.updateLabel);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
PlaybackRateMenuButton.prototype.createEl = function createEl() {
var el = _MenuButton.prototype.createEl.call(this);
this.labelEl_ = Dom.createEl('div', {
className: 'vjs-playback-rate-value',
innerHTML: 1.0
});
el.appendChild(this.labelEl_);
return el;
};
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);
};
/**
* Create the playback rate menu
*
* @return {Menu} Menu object populated with items
* @method createMenu
*/
PlaybackRateMenuButton.prototype.createMenu = function createMenu() {
var menu = new _menuMenuJs2['default'](this.player());
var rates = this.playbackRates();
if (rates) {
for (var i = rates.length - 1; i >= 0; i--) {
menu.addChild(new _playbackRateMenuItemJs2['default'](this.player(), { 'rate': rates[i] + 'x' }));
}
}
return menu;
};
/**
* Updates ARIA accessibility attributes
*
* @method updateARIAAttributes
*/
PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {
// Current playback rate
this.el().setAttribute('aria-valuenow', this.player().playbackRate());
};
/**
* Handle menu item click
*
* @method handleClick
*/
PlaybackRateMenuButton.prototype.handleClick = function handleClick() {
// select next rate option
var currentRate = this.player().playbackRate();
var rates = this.playbackRates();
// this will select first one if the last one currently selected
var newRate = rates[0];
for (var i = 0; i < rates.length; i++) {
if (rates[i] > currentRate) {
newRate = rates[i];
break;
}
}
this.player().playbackRate(newRate);
};
/**
* Get possible playback rates
*
* @return {Array} Possible playback rates
* @method playbackRates
*/
PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {
return this.options_['playbackRates'] || this.options_.playerOptions && this.options_.playerOptions['playbackRates'];
};
/**
* Get supported playback rates
*
* @return {Array} Supported playback rates
* @method playbackRateSupported
*/
PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {
return this.player().tech_ && this.player().tech_['featuresPlaybackRate'] && this.playbackRates() && this.playbackRates().length > 0;
};
/**
* Hide playback rate controls when they're no playback rate options to select
*
* @method updateVisibility
*/
PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility() {
if (this.playbackRateSupported()) {
this.removeClass('vjs-hidden');
} else {
this.addClass('vjs-hidden');
}
};
/**
* Update button label when rate changed
*
* @method updateLabel
*/
PlaybackRateMenuButton.prototype.updateLabel = function updateLabel() {
if (this.playbackRateSupported()) {
this.labelEl_.innerHTML = this.player().playbackRate() + 'x';
}
};
return PlaybackRateMenuButton;
})(_menuMenuButtonJs2['default']);
PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';
_componentJs2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);
exports['default'] = PlaybackRateMenuButton;
module.exports = exports['default'];
},{"../../component.js":65,"../../menu/menu-button.js":102,"../../menu/menu.js":104,"../../utils/dom.js":128,"./playback-rate-menu-item.js":72}],72:[function(_dereq_,module,exports){
/**
* @file playback-rate-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The specific menu item type for selecting a playback rate
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class PlaybackRateMenuItem
*/
var PlaybackRateMenuItem = (function (_MenuItem) {
_inherits(PlaybackRateMenuItem, _MenuItem);
function PlaybackRateMenuItem(player, options) {
_classCallCheck(this, PlaybackRateMenuItem);
var label = options['rate'];
var rate = parseFloat(label, 10);
// Modify options for parent MenuItem class's init.
options['label'] = label;
options['selected'] = rate === 1;
_MenuItem.call(this, player, options);
this.label = label;
this.rate = rate;
this.on(player, 'ratechange', this.update);
}
/**
* Handle click on menu item
*
* @method handleClick
*/
PlaybackRateMenuItem.prototype.handleClick = function handleClick() {
_MenuItem.prototype.handleClick.call(this);
this.player().playbackRate(this.rate);
};
/**
* Update playback rate with selected rate
*
* @method update
*/
PlaybackRateMenuItem.prototype.update = function update() {
this.selected(this.player().playbackRate() === this.rate);
};
return PlaybackRateMenuItem;
})(_menuMenuItemJs2['default']);
PlaybackRateMenuItem.prototype.contentElType = 'button';
_componentJs2['default'].registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);
exports['default'] = PlaybackRateMenuItem;
module.exports = exports['default'];
},{"../../component.js":65,"../../menu/menu-item.js":103}],73:[function(_dereq_,module,exports){
/**
* @file load-progress-bar.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* Shows load progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class LoadProgressBar
*/
var LoadProgressBar = (function (_Component) {
_inherits(LoadProgressBar, _Component);
function LoadProgressBar(player, options) {
_classCallCheck(this, LoadProgressBar);
_Component.call(this, player, options);
this.on(player, 'progress', this.update);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
LoadProgressBar.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-load-progress',
innerHTML: '<span class="vjs-control-text"><span>' + this.localize('Loaded') + '</span>: 0%</span>'
});
};
/**
* Update progress bar
*
* @method update
*/
LoadProgressBar.prototype.update = function update() {
var buffered = this.player_.buffered();
var duration = this.player_.duration();
var bufferedEnd = this.player_.bufferedEnd();
var children = this.el_.children;
// get the percent width of a time compared to the total end
var percentify = function percentify(time, end) {
var percent = time / end || 0; // no NaN
return (percent >= 1 ? 1 : percent) * 100 + '%';
};
// update the width of the progress bar
this.el_.style.width = percentify(bufferedEnd, duration);
// add child elements to represent the individual buffered time ranges
for (var i = 0; i < buffered.length; i++) {
var start = buffered.start(i);
var end = buffered.end(i);
var part = children[i];
if (!part) {
part = this.el_.appendChild(Dom.createEl());
}
// set the percent based on the width of the progress bar (bufferedEnd)
part.style.left = percentify(start, bufferedEnd);
part.style.width = percentify(end - start, bufferedEnd);
}
// remove unused buffered range elements
for (var i = children.length; i > buffered.length; i--) {
this.el_.removeChild(children[i - 1]);
}
};
return LoadProgressBar;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('LoadProgressBar', LoadProgressBar);
exports['default'] = LoadProgressBar;
module.exports = exports['default'];
},{"../../component.js":65,"../../utils/dom.js":128}],74:[function(_dereq_,module,exports){
/**
* @file mouse-time-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle');
var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle);
/**
* The Mouse Time Display component shows the time you will seek to
* when hovering over the progress bar
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class MouseTimeDisplay
*/
var MouseTimeDisplay = (function (_Component) {
_inherits(MouseTimeDisplay, _Component);
function MouseTimeDisplay(player, options) {
var _this = this;
_classCallCheck(this, MouseTimeDisplay);
_Component.call(this, player, options);
this.update(0, 0);
player.on('ready', function () {
_this.on(player.controlBar.progressControl.el(), 'mousemove', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleMouseMove), 25));
});
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
MouseTimeDisplay.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-mouse-display'
});
};
MouseTimeDisplay.prototype.handleMouseMove = function handleMouseMove(event) {
var duration = this.player_.duration();
var newTime = this.calculateDistance(event) * duration;
var position = event.pageX - Dom.findElPosition(this.el().parentNode).left;
this.update(newTime, position);
};
MouseTimeDisplay.prototype.update = function update(newTime, position) {
var time = _utilsFormatTimeJs2['default'](newTime, this.player_.duration());
this.el().style.left = position + 'px';
this.el().setAttribute('data-current-time', time);
};
MouseTimeDisplay.prototype.calculateDistance = function calculateDistance(event) {
return Dom.getPointerPosition(this.el().parentNode, event).x;
};
return MouseTimeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay);
exports['default'] = MouseTimeDisplay;
module.exports = exports['default'];
},{"../../component.js":65,"../../utils/dom.js":128,"../../utils/fn.js":130,"../../utils/format-time.js":131,"lodash-compat/function/throttle":7}],75:[function(_dereq_,module,exports){
/**
* @file play-progress-bar.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Shows play progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class PlayProgressBar
*/
var PlayProgressBar = (function (_Component) {
_inherits(PlayProgressBar, _Component);
function PlayProgressBar(player, options) {
_classCallCheck(this, PlayProgressBar);
_Component.call(this, player, options);
this.updateDataAttr();
this.on(player, 'timeupdate', this.updateDataAttr);
player.ready(Fn.bind(this, this.updateDataAttr));
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
PlayProgressBar.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-play-progress vjs-slider-bar',
innerHTML: '<span class="vjs-control-text"><span>' + this.localize('Progress') + '</span>: 0%</span>'
});
};
PlayProgressBar.prototype.updateDataAttr = function updateDataAttr() {
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
this.el_.setAttribute('data-current-time', _utilsFormatTimeJs2['default'](time, this.player_.duration()));
};
return PlayProgressBar;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('PlayProgressBar', PlayProgressBar);
exports['default'] = PlayProgressBar;
module.exports = exports['default'];
},{"../../component.js":65,"../../utils/fn.js":130,"../../utils/format-time.js":131}],76:[function(_dereq_,module,exports){
/**
* @file progress-control.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _seekBarJs = _dereq_('./seek-bar.js');
var _seekBarJs2 = _interopRequireDefault(_seekBarJs);
var _mouseTimeDisplayJs = _dereq_('./mouse-time-display.js');
var _mouseTimeDisplayJs2 = _interopRequireDefault(_mouseTimeDisplayJs);
/**
* The Progress Control component contains the seek bar, load progress,
* and play progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class ProgressControl
*/
var ProgressControl = (function (_Component) {
_inherits(ProgressControl, _Component);
function ProgressControl() {
_classCallCheck(this, ProgressControl);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
ProgressControl.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-progress-control vjs-control'
});
};
return ProgressControl;
})(_componentJs2['default']);
ProgressControl.prototype.options_ = {
children: ['seekBar']
};
_componentJs2['default'].registerComponent('ProgressControl', ProgressControl);
exports['default'] = ProgressControl;
module.exports = exports['default'];
},{"../../component.js":65,"./mouse-time-display.js":74,"./seek-bar.js":77}],77:[function(_dereq_,module,exports){
/**
* @file seek-bar.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _sliderSliderJs = _dereq_('../../slider/slider.js');
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _loadProgressBarJs = _dereq_('./load-progress-bar.js');
var _loadProgressBarJs2 = _interopRequireDefault(_loadProgressBarJs);
var _playProgressBarJs = _dereq_('./play-progress-bar.js');
var _playProgressBarJs2 = _interopRequireDefault(_playProgressBarJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* Seek Bar and holder for the progress bars
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Slider
* @class SeekBar
*/
var SeekBar = (function (_Slider) {
_inherits(SeekBar, _Slider);
function SeekBar(player, options) {
_classCallCheck(this, SeekBar);
_Slider.call(this, player, options);
this.on(player, 'timeupdate', this.updateARIAAttributes);
player.ready(Fn.bind(this, this.updateARIAAttributes));
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
SeekBar.prototype.createEl = function createEl() {
return _Slider.prototype.createEl.call(this, 'div', {
className: 'vjs-progress-holder'
}, {
'aria-label': 'video progress bar'
});
};
/**
* Update ARIA accessibility attributes
*
* @method updateARIAAttributes
*/
SeekBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
// Allows for smooth scrubbing, when player can't keep up.
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)
this.el_.setAttribute('aria-valuetext', _utilsFormatTimeJs2['default'](time, this.player_.duration())); // human readable value of progress bar (time complete)
};
/**
* Get percentage of video played
*
* @return {Number} Percentage played
* @method getPercent
*/
SeekBar.prototype.getPercent = function getPercent() {
var percent = this.player_.currentTime() / this.player_.duration();
return percent >= 1 ? 1 : percent;
};
/**
* Handle mouse down on seek bar
*
* @method handleMouseDown
*/
SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {
_Slider.prototype.handleMouseDown.call(this, event);
this.player_.scrubbing(true);
this.videoWasPlaying = !this.player_.paused();
this.player_.pause();
};
/**
* Handle mouse move on seek bar
*
* @method handleMouseMove
*/
SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {
var newTime = this.calculateDistance(event) * this.player_.duration();
// Don't let video end while scrubbing.
if (newTime === this.player_.duration()) {
newTime = newTime - 0.1;
}
// Set new time (tell player to seek to new time)
this.player_.currentTime(newTime);
};
/**
* Handle mouse up on seek bar
*
* @method handleMouseUp
*/
SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {
_Slider.prototype.handleMouseUp.call(this, event);
this.player_.scrubbing(false);
if (this.videoWasPlaying) {
this.player_.play();
}
};
/**
* Move more quickly fast forward for keyboard-only users
*
* @method stepForward
*/
SeekBar.prototype.stepForward = function stepForward() {
this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
};
/**
* Move more quickly rewind for keyboard-only users
*
* @method stepBack
*/
SeekBar.prototype.stepBack = function stepBack() {
this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
};
return SeekBar;
})(_sliderSliderJs2['default']);
SeekBar.prototype.options_ = {
children: ['loadProgressBar', 'mouseTimeDisplay', 'playProgressBar'],
'barName': 'playProgressBar'
};
SeekBar.prototype.playerEvent = 'timeupdate';
_componentJs2['default'].registerComponent('SeekBar', SeekBar);
exports['default'] = SeekBar;
module.exports = exports['default'];
},{"../../component.js":65,"../../slider/slider.js":110,"../../utils/fn.js":130,"../../utils/format-time.js":131,"./load-progress-bar.js":73,"./play-progress-bar.js":75,"object.assign":45}],78:[function(_dereq_,module,exports){
/**
* @file custom-control-spacer.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _spacerJs = _dereq_('./spacer.js');
var _spacerJs2 = _interopRequireDefault(_spacerJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Spacer specifically meant to be used as an insertion point for new plugins, etc.
*
* @extends Spacer
* @class CustomControlSpacer
*/
var CustomControlSpacer = (function (_Spacer) {
_inherits(CustomControlSpacer, _Spacer);
function CustomControlSpacer() {
_classCallCheck(this, CustomControlSpacer);
_Spacer.apply(this, arguments);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
CustomControlSpacer.prototype.createEl = function createEl() {
var el = _Spacer.prototype.createEl.call(this, {
className: this.buildCSSClass()
});
// No-flex/table-cell mode requires there be some content
// in the cell to fill the remaining space of the table.
el.innerHTML = '&nbsp;';
return el;
};
return CustomControlSpacer;
})(_spacerJs2['default']);
_componentJs2['default'].registerComponent('CustomControlSpacer', CustomControlSpacer);
exports['default'] = CustomControlSpacer;
module.exports = exports['default'];
},{"../../component.js":65,"./spacer.js":79}],79:[function(_dereq_,module,exports){
/**
* @file spacer.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Just an empty spacer element that can be used as an append point for plugins, etc.
* Also can be used to create space between elements when necessary.
*
* @extends Component
* @class Spacer
*/
var Spacer = (function (_Component) {
_inherits(Spacer, _Component);
function Spacer() {
_classCallCheck(this, Spacer);
_Component.apply(this, arguments);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
Spacer.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Spacer.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass()
});
};
return Spacer;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Spacer', Spacer);
exports['default'] = Spacer;
module.exports = exports['default'];
},{"../../component.js":65}],80:[function(_dereq_,module,exports){
/**
* @file caption-settings-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The menu item for caption track settings menu
*
* @param {Player|Object} player
* @param {Object=} options
* @extends TextTrackMenuItem
* @class CaptionSettingsMenuItem
*/
var CaptionSettingsMenuItem = (function (_TextTrackMenuItem) {
_inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);
function CaptionSettingsMenuItem(player, options) {
_classCallCheck(this, CaptionSettingsMenuItem);
options['track'] = {
'kind': options['kind'],
'player': player,
'label': options['kind'] + ' settings',
'default': false,
mode: 'disabled'
};
_TextTrackMenuItem.call(this, player, options);
this.addClass('vjs-texttrack-settings');
}
/**
* Handle click on menu item
*
* @method handleClick
*/
CaptionSettingsMenuItem.prototype.handleClick = function handleClick() {
this.player().getChild('textTrackSettings').show();
};
return CaptionSettingsMenuItem;
})(_textTrackMenuItemJs2['default']);
_componentJs2['default'].registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);
exports['default'] = CaptionSettingsMenuItem;
module.exports = exports['default'];
},{"../../component.js":65,"./text-track-menu-item.js":87}],81:[function(_dereq_,module,exports){
/**
* @file captions-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _captionSettingsMenuItemJs = _dereq_('./caption-settings-menu-item.js');
var _captionSettingsMenuItemJs2 = _interopRequireDefault(_captionSettingsMenuItemJs);
/**
* The button component for toggling and selecting captions
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class CaptionsButton
*/
var CaptionsButton = (function (_TextTrackButton) {
_inherits(CaptionsButton, _TextTrackButton);
function CaptionsButton(player, options, ready) {
_classCallCheck(this, CaptionsButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Captions Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
/**
* Update caption menu items
*
* @method update
*/
CaptionsButton.prototype.update = function update() {
var threshold = 2;
_TextTrackButton.prototype.update.call(this);
// if native, then threshold is 1 because no settings button
if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {
threshold = 1;
}
if (this.items && this.items.length > threshold) {
this.show();
} else {
this.hide();
}
};
/**
* Create caption menu items
*
* @return {Array} Array of menu items
* @method createItems
*/
CaptionsButton.prototype.createItems = function createItems() {
var items = [];
if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {
items.push(new _captionSettingsMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
}
return _TextTrackButton.prototype.createItems.call(this, items);
};
return CaptionsButton;
})(_textTrackButtonJs2['default']);
CaptionsButton.prototype.kind_ = 'captions';
CaptionsButton.prototype.controlText_ = 'Captions';
_componentJs2['default'].registerComponent('CaptionsButton', CaptionsButton);
exports['default'] = CaptionsButton;
module.exports = exports['default'];
},{"../../component.js":65,"./caption-settings-menu-item.js":80,"./text-track-button.js":86}],82:[function(_dereq_,module,exports){
/**
* @file chapters-button.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _chaptersTrackMenuItemJs = _dereq_('./chapters-track-menu-item.js');
var _chaptersTrackMenuItemJs2 = _interopRequireDefault(_chaptersTrackMenuItemJs);
var _menuMenuJs = _dereq_('../../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsToTitleCaseJs = _dereq_('../../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* The button component for toggling and selecting chapters
* Chapters act much differently than other text tracks
* Cues are navigation vs. other tracks of alternative languages
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class ChaptersButton
*/
var ChaptersButton = (function (_TextTrackButton) {
_inherits(ChaptersButton, _TextTrackButton);
function ChaptersButton(player, options, ready) {
_classCallCheck(this, ChaptersButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Chapters Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
/**
* Create a menu item for each text track
*
* @return {Array} Array of menu items
* @method createItems
*/
ChaptersButton.prototype.createItems = function createItems() {
var items = [];
var tracks = this.player_.textTracks();
if (!tracks) {
return items;
}
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
if (track['kind'] === this.kind_) {
items.push(new _textTrackMenuItemJs2['default'](this.player_, {
'track': track
}));
}
}
return items;
};
/**
* Create menu from chapter buttons
*
* @return {Menu} Menu of chapter buttons
* @method createMenu
*/
ChaptersButton.prototype.createMenu = function createMenu() {
var _this = this;
var tracks = this.player_.textTracks() || [];
var chaptersTrack = undefined;
var items = this.items = [];
for (var i = 0, _length = tracks.length; i < _length; i++) {
var track = tracks[i];
if (track['kind'] === this.kind_) {
chaptersTrack = track;
break;
}
}
var menu = this.menu;
if (menu === undefined) {
menu = new _menuMenuJs2['default'](this.player_);
menu.contentEl().appendChild(Dom.createEl('li', {
className: 'vjs-menu-title',
innerHTML: _utilsToTitleCaseJs2['default'](this.kind_),
tabIndex: -1
}));
}
if (chaptersTrack && chaptersTrack.cues == null) {
chaptersTrack['mode'] = 'hidden';
var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(chaptersTrack);
if (remoteTextTrackEl) {
remoteTextTrackEl.addEventListener('load', function (event) {
return _this.update();
});
}
}
if (chaptersTrack && chaptersTrack.cues && chaptersTrack.cues.length > 0) {
var cues = chaptersTrack['cues'],
cue = undefined;
for (var i = 0, l = cues.length; i < l; i++) {
cue = cues[i];
var mi = new _chaptersTrackMenuItemJs2['default'](this.player_, {
'track': chaptersTrack,
'cue': cue
});
items.push(mi);
menu.addChild(mi);
}
this.addChild(menu);
}
if (this.items.length > 0) {
this.show();
}
return menu;
};
return ChaptersButton;
})(_textTrackButtonJs2['default']);
ChaptersButton.prototype.kind_ = 'chapters';
ChaptersButton.prototype.controlText_ = 'Chapters';
_componentJs2['default'].registerComponent('ChaptersButton', ChaptersButton);
exports['default'] = ChaptersButton;
module.exports = exports['default'];
},{"../../component.js":65,"../../menu/menu.js":104,"../../utils/dom.js":128,"../../utils/fn.js":130,"../../utils/to-title-case.js":137,"./chapters-track-menu-item.js":83,"./text-track-button.js":86,"./text-track-menu-item.js":87,"global/window":2}],83:[function(_dereq_,module,exports){
/**
* @file chapters-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
/**
* The chapter track menu item
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class ChaptersTrackMenuItem
*/
var ChaptersTrackMenuItem = (function (_MenuItem) {
_inherits(ChaptersTrackMenuItem, _MenuItem);
function ChaptersTrackMenuItem(player, options) {
_classCallCheck(this, ChaptersTrackMenuItem);
var track = options['track'];
var cue = options['cue'];
var currentTime = player.currentTime();
// Modify options for parent MenuItem class's init.
options['label'] = cue.text;
options['selected'] = cue['startTime'] <= currentTime && currentTime < cue['endTime'];
_MenuItem.call(this, player, options);
this.track = track;
this.cue = cue;
track.addEventListener('cuechange', Fn.bind(this, this.update));
}
/**
* Handle click on menu item
*
* @method handleClick
*/
ChaptersTrackMenuItem.prototype.handleClick = function handleClick() {
_MenuItem.prototype.handleClick.call(this);
this.player_.currentTime(this.cue.startTime);
this.update(this.cue.startTime);
};
/**
* Update chapter menu item
*
* @method update
*/
ChaptersTrackMenuItem.prototype.update = function update() {
var cue = this.cue;
var currentTime = this.player_.currentTime();
// vjs.log(currentTime, cue.startTime);
this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);
};
return ChaptersTrackMenuItem;
})(_menuMenuItemJs2['default']);
_componentJs2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);
exports['default'] = ChaptersTrackMenuItem;
module.exports = exports['default'];
},{"../../component.js":65,"../../menu/menu-item.js":103,"../../utils/fn.js":130}],84:[function(_dereq_,module,exports){
/**
* @file off-text-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* A special menu item for turning of a specific type of text track
*
* @param {Player|Object} player
* @param {Object=} options
* @extends TextTrackMenuItem
* @class OffTextTrackMenuItem
*/
var OffTextTrackMenuItem = (function (_TextTrackMenuItem) {
_inherits(OffTextTrackMenuItem, _TextTrackMenuItem);
function OffTextTrackMenuItem(player, options) {
_classCallCheck(this, OffTextTrackMenuItem);
// Create pseudo track info
// Requires options['kind']
options['track'] = {
'kind': options['kind'],
'player': player,
'label': options['kind'] + ' off',
'default': false,
'mode': 'disabled'
};
_TextTrackMenuItem.call(this, player, options);
this.selected(true);
}
/**
* Handle text track change
*
* @param {Object} event Event object
* @method handleTracksChange
*/
OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
var tracks = this.player().textTracks();
var selected = true;
for (var i = 0, l = tracks.length; i < l; i++) {
var track = tracks[i];
if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {
selected = false;
break;
}
}
this.selected(selected);
};
return OffTextTrackMenuItem;
})(_textTrackMenuItemJs2['default']);
_componentJs2['default'].registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);
exports['default'] = OffTextTrackMenuItem;
module.exports = exports['default'];
},{"../../component.js":65,"./text-track-menu-item.js":87}],85:[function(_dereq_,module,exports){
/**
* @file subtitles-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The button component for toggling and selecting subtitles
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class SubtitlesButton
*/
var SubtitlesButton = (function (_TextTrackButton) {
_inherits(SubtitlesButton, _TextTrackButton);
function SubtitlesButton(player, options, ready) {
_classCallCheck(this, SubtitlesButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Subtitles Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
return SubtitlesButton;
})(_textTrackButtonJs2['default']);
SubtitlesButton.prototype.kind_ = 'subtitles';
SubtitlesButton.prototype.controlText_ = 'Subtitles';
_componentJs2['default'].registerComponent('SubtitlesButton', SubtitlesButton);
exports['default'] = SubtitlesButton;
module.exports = exports['default'];
},{"../../component.js":65,"./text-track-button.js":86}],86:[function(_dereq_,module,exports){
/**
* @file text-track-button.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _offTextTrackMenuItemJs = _dereq_('./off-text-track-menu-item.js');
var _offTextTrackMenuItemJs2 = _interopRequireDefault(_offTextTrackMenuItemJs);
/**
* The base class for buttons that toggle specific text track types (e.g. subtitles)
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuButton
* @class TextTrackButton
*/
var TextTrackButton = (function (_MenuButton) {
_inherits(TextTrackButton, _MenuButton);
function TextTrackButton(player, options) {
_classCallCheck(this, TextTrackButton);
_MenuButton.call(this, player, options);
var tracks = this.player_.textTracks();
if (this.items.length <= 1) {
this.hide();
}
if (!tracks) {
return;
}
var updateHandler = Fn.bind(this, this.update);
tracks.addEventListener('removetrack', updateHandler);
tracks.addEventListener('addtrack', updateHandler);
this.player_.on('dispose', function () {
tracks.removeEventListener('removetrack', updateHandler);
tracks.removeEventListener('addtrack', updateHandler);
});
}
// Create a menu item for each text track
TextTrackButton.prototype.createItems = function createItems() {
var items = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
// Add an OFF menu item to turn all tracks off
items.push(new _offTextTrackMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
var tracks = this.player_.textTracks();
if (!tracks) {
return items;
}
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
// only add tracks that are of the appropriate kind and have a label
if (track['kind'] === this.kind_) {
items.push(new _textTrackMenuItemJs2['default'](this.player_, {
'track': track
}));
}
}
return items;
};
return TextTrackButton;
})(_menuMenuButtonJs2['default']);
_componentJs2['default'].registerComponent('TextTrackButton', TextTrackButton);
exports['default'] = TextTrackButton;
module.exports = exports['default'];
},{"../../component.js":65,"../../menu/menu-button.js":102,"../../utils/fn.js":130,"./off-text-track-menu-item.js":84,"./text-track-menu-item.js":87}],87:[function(_dereq_,module,exports){
/**
* @file text-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* The specific menu item type for selecting a language within a text track kind
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class TextTrackMenuItem
*/
var TextTrackMenuItem = (function (_MenuItem) {
_inherits(TextTrackMenuItem, _MenuItem);
function TextTrackMenuItem(player, options) {
var _this = this;
_classCallCheck(this, TextTrackMenuItem);
var track = options['track'];
var tracks = player.textTracks();
// Modify options for parent MenuItem class's init.
options['label'] = track['label'] || track['language'] || 'Unknown';
options['selected'] = track['default'] || track['mode'] === 'showing';
_MenuItem.call(this, player, options);
this.track = track;
if (tracks) {
(function () {
var changeHandler = Fn.bind(_this, _this.handleTracksChange);
tracks.addEventListener('change', changeHandler);
_this.on('dispose', function () {
tracks.removeEventListener('change', changeHandler);
});
})();
}
// iOS7 doesn't dispatch change events to TextTrackLists when an
// associated track's mode changes. Without something like
// Object.observe() (also not present on iOS7), it's not
// possible to detect changes to the mode attribute and polyfill
// the change event. As a poor substitute, we manually dispatch
// change events whenever the controls modify the mode.
if (tracks && tracks.onchange === undefined) {
(function () {
var event = undefined;
_this.on(['tap', 'click'], function () {
if (typeof _globalWindow2['default'].Event !== 'object') {
// Android 2.3 throws an Illegal Constructor error for window.Event
try {
event = new _globalWindow2['default'].Event('change');
} catch (err) {}
}
if (!event) {
event = _globalDocument2['default'].createEvent('Event');
event.initEvent('change', true, true);
}
tracks.dispatchEvent(event);
});
})();
}
}
/**
* Handle click on text track
*
* @method handleClick
*/
TextTrackMenuItem.prototype.handleClick = function handleClick(event) {
var kind = this.track['kind'];
var tracks = this.player_.textTracks();
_MenuItem.prototype.handleClick.call(this, event);
if (!tracks) return;
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
if (track['kind'] !== kind) {
continue;
}
if (track === this.track) {
track['mode'] = 'showing';
} else {
track['mode'] = 'disabled';
}
}
};
/**
* Handle text track change
*
* @method handleTracksChange
*/
TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
this.selected(this.track['mode'] === 'showing');
};
return TextTrackMenuItem;
})(_menuMenuItemJs2['default']);
_componentJs2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem);
exports['default'] = TextTrackMenuItem;
module.exports = exports['default'];
},{"../../component.js":65,"../../menu/menu-item.js":103,"../../utils/fn.js":130,"global/document":1,"global/window":2}],88:[function(_dereq_,module,exports){
/**
* @file current-time-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Displays the current time
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class CurrentTimeDisplay
*/
var CurrentTimeDisplay = (function (_Component) {
_inherits(CurrentTimeDisplay, _Component);
function CurrentTimeDisplay(player, options) {
_classCallCheck(this, CurrentTimeDisplay);
_Component.call(this, player, options);
this.on(player, 'timeupdate', this.updateContent);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
CurrentTimeDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-current-time vjs-time-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-current-time-display',
// label the current time for screen reader users
innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00'
}, {
// tell screen readers not to automatically read the time as it changes
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
/**
* Update current time display
*
* @method updateContent
*/
CurrentTimeDisplay.prototype.updateContent = function updateContent() {
// Allows for smooth scrubbing, when player can't keep up.
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
var localizedText = this.localize('Current Time');
var formattedTime = _utilsFormatTimeJs2['default'](time, this.player_.duration());
this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> ' + formattedTime;
};
return CurrentTimeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);
exports['default'] = CurrentTimeDisplay;
module.exports = exports['default'];
},{"../../component.js":65,"../../utils/dom.js":128,"../../utils/format-time.js":131}],89:[function(_dereq_,module,exports){
/**
* @file duration-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Displays the duration
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class DurationDisplay
*/
var DurationDisplay = (function (_Component) {
_inherits(DurationDisplay, _Component);
function DurationDisplay(player, options) {
_classCallCheck(this, DurationDisplay);
_Component.call(this, player, options);
// this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,
// however the durationchange event fires before this.player_.duration() is set,
// so the value cannot be written out using this method.
// Once the order of durationchange and this.player_.duration() being set is figured out,
// this can be updated.
this.on(player, 'timeupdate', this.updateContent);
this.on(player, 'loadedmetadata', this.updateContent);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
DurationDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-duration vjs-time-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-duration-display',
// label the duration time for screen reader users
innerHTML: '<span class="vjs-control-text">' + this.localize('Duration Time') + '</span> 0:00'
}, {
// tell screen readers not to automatically read the time as it changes
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
/**
* Update duration time display
*
* @method updateContent
*/
DurationDisplay.prototype.updateContent = function updateContent() {
var duration = this.player_.duration();
if (duration) {
var localizedText = this.localize('Duration Time');
var formattedTime = _utilsFormatTimeJs2['default'](duration);
this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> ' + formattedTime; // label the duration time for screen reader users
}
};
return DurationDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('DurationDisplay', DurationDisplay);
exports['default'] = DurationDisplay;
module.exports = exports['default'];
},{"../../component.js":65,"../../utils/dom.js":128,"../../utils/format-time.js":131}],90:[function(_dereq_,module,exports){
/**
* @file remaining-time-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Displays the time left in the video
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class RemainingTimeDisplay
*/
var RemainingTimeDisplay = (function (_Component) {
_inherits(RemainingTimeDisplay, _Component);
function RemainingTimeDisplay(player, options) {
_classCallCheck(this, RemainingTimeDisplay);
_Component.call(this, player, options);
this.on(player, 'timeupdate', this.updateContent);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
RemainingTimeDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-remaining-time vjs-time-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-remaining-time-display',
// label the remaining time for screen reader users
innerHTML: '<span class="vjs-control-text">' + this.localize('Remaining Time') + '</span> -0:00'
}, {
// tell screen readers not to automatically read the time as it changes
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
/**
* Update remaining time display
*
* @method updateContent
*/
RemainingTimeDisplay.prototype.updateContent = function updateContent() {
if (this.player_.duration()) {
var localizedText = this.localize('Remaining Time');
var formattedTime = _utilsFormatTimeJs2['default'](this.player_.remainingTime());
this.contentEl_.innerHTML = '<span class="vjs-control-text">' + localizedText + '</span> -' + formattedTime;
}
// Allows for smooth scrubbing, when player can't keep up.
// var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
// this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());
};
return RemainingTimeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);
exports['default'] = RemainingTimeDisplay;
module.exports = exports['default'];
},{"../../component.js":65,"../../utils/dom.js":128,"../../utils/format-time.js":131}],91:[function(_dereq_,module,exports){
/**
* @file time-divider.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The separator between the current time and duration.
* Can be hidden if it's not needed in the design.
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class TimeDivider
*/
var TimeDivider = (function (_Component) {
_inherits(TimeDivider, _Component);
function TimeDivider() {
_classCallCheck(this, TimeDivider);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TimeDivider.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-time-control vjs-time-divider',
innerHTML: '<div><span>/</span></div>'
});
};
return TimeDivider;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('TimeDivider', TimeDivider);
exports['default'] = TimeDivider;
module.exports = exports['default'];
},{"../../component.js":65}],92:[function(_dereq_,module,exports){
/**
* @file volume-bar.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _sliderSliderJs = _dereq_('../../slider/slider.js');
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
// Required children
var _volumeLevelJs = _dereq_('./volume-level.js');
var _volumeLevelJs2 = _interopRequireDefault(_volumeLevelJs);
/**
* The bar that contains the volume level and can be clicked on to adjust the level
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Slider
* @class VolumeBar
*/
var VolumeBar = (function (_Slider) {
_inherits(VolumeBar, _Slider);
function VolumeBar(player, options) {
_classCallCheck(this, VolumeBar);
_Slider.call(this, player, options);
this.on(player, 'volumechange', this.updateARIAAttributes);
player.ready(Fn.bind(this, this.updateARIAAttributes));
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeBar.prototype.createEl = function createEl() {
return _Slider.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-bar vjs-slider-bar'
}, {
'aria-label': 'volume level'
});
};
/**
* Handle mouse move on volume bar
*
* @method handleMouseMove
*/
VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {
if (this.player_.muted()) {
this.player_.muted(false);
}
this.player_.volume(this.calculateDistance(event));
};
/**
* Get percent of volume level
*
* @retun {Number} Volume level percent
* @method getPercent
*/
VolumeBar.prototype.getPercent = function getPercent() {
if (this.player_.muted()) {
return 0;
} else {
return this.player_.volume();
}
};
/**
* Increase volume level for keyboard users
*
* @method stepForward
*/
VolumeBar.prototype.stepForward = function stepForward() {
this.player_.volume(this.player_.volume() + 0.1);
};
/**
* Decrease volume level for keyboard users
*
* @method stepBack
*/
VolumeBar.prototype.stepBack = function stepBack() {
this.player_.volume(this.player_.volume() - 0.1);
};
/**
* Update ARIA accessibility attributes
*
* @method updateARIAAttributes
*/
VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
// Current value of volume bar as a percentage
var volume = (this.player_.volume() * 100).toFixed(2);
this.el_.setAttribute('aria-valuenow', volume);
this.el_.setAttribute('aria-valuetext', volume + '%');
};
return VolumeBar;
})(_sliderSliderJs2['default']);
VolumeBar.prototype.options_ = {
children: ['volumeLevel'],
'barName': 'volumeLevel'
};
VolumeBar.prototype.playerEvent = 'volumechange';
_componentJs2['default'].registerComponent('VolumeBar', VolumeBar);
exports['default'] = VolumeBar;
module.exports = exports['default'];
},{"../../component.js":65,"../../slider/slider.js":110,"../../utils/fn.js":130,"./volume-level.js":94}],93:[function(_dereq_,module,exports){
/**
* @file volume-control.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
// Required children
var _volumeBarJs = _dereq_('./volume-bar.js');
var _volumeBarJs2 = _interopRequireDefault(_volumeBarJs);
/**
* The component for controlling the volume level
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class VolumeControl
*/
var VolumeControl = (function (_Component) {
_inherits(VolumeControl, _Component);
function VolumeControl(player, options) {
_classCallCheck(this, VolumeControl);
_Component.call(this, player, options);
// hide volume controls when they're not supported by the current tech
if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
}
this.on(player, 'loadstart', function () {
if (player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
} else {
this.removeClass('vjs-hidden');
}
});
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeControl.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-control vjs-control'
});
};
return VolumeControl;
})(_componentJs2['default']);
VolumeControl.prototype.options_ = {
children: ['volumeBar']
};
_componentJs2['default'].registerComponent('VolumeControl', VolumeControl);
exports['default'] = VolumeControl;
module.exports = exports['default'];
},{"../../component.js":65,"./volume-bar.js":92}],94:[function(_dereq_,module,exports){
/**
* @file volume-level.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Shows volume level
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class VolumeLevel
*/
var VolumeLevel = (function (_Component) {
_inherits(VolumeLevel, _Component);
function VolumeLevel() {
_classCallCheck(this, VolumeLevel);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeLevel.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-level',
innerHTML: '<span class="vjs-control-text"></span>'
});
};
return VolumeLevel;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('VolumeLevel', VolumeLevel);
exports['default'] = VolumeLevel;
module.exports = exports['default'];
},{"../../component.js":65}],95:[function(_dereq_,module,exports){
/**
* @file volume-menu-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _menuMenuJs = _dereq_('../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _muteToggleJs = _dereq_('./mute-toggle.js');
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
var _volumeControlVolumeBarJs = _dereq_('./volume-control/volume-bar.js');
var _volumeControlVolumeBarJs2 = _interopRequireDefault(_volumeControlVolumeBarJs);
/**
* Button for volume menu
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuButton
* @class VolumeMenuButton
*/
var VolumeMenuButton = (function (_MenuButton) {
_inherits(VolumeMenuButton, _MenuButton);
function VolumeMenuButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, VolumeMenuButton);
// Default to inline
if (options.inline === undefined) {
options.inline = true;
}
// If the vertical option isn't passed at all, default to true.
if (options.vertical === undefined) {
// If an inline volumeMenuButton is used, we should default to using
// a horizontal slider for obvious reasons.
if (options.inline) {
options.vertical = false;
} else {
options.vertical = true;
}
}
// The vertical option needs to be set on the volumeBar as well,
// since that will need to be passed along to the VolumeBar constructor
options.volumeBar = options.volumeBar || {};
options.volumeBar.vertical = !!options.vertical;
_MenuButton.call(this, player, options);
// Same listeners as MuteToggle
this.on(player, 'volumechange', this.volumeUpdate);
this.on(player, 'loadstart', this.volumeUpdate);
// hide mute toggle if the current tech doesn't support volume control
function updateVisibility() {
if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
} else {
this.removeClass('vjs-hidden');
}
}
updateVisibility.call(this);
this.on(player, 'loadstart', updateVisibility);
this.on(this.volumeBar, ['slideractive', 'focus'], function () {
this.addClass('vjs-slider-active');
});
this.on(this.volumeBar, ['sliderinactive', 'blur'], function () {
this.removeClass('vjs-slider-active');
});
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
VolumeMenuButton.prototype.buildCSSClass = function buildCSSClass() {
var orientationClass = '';
if (!!this.options_.vertical) {
orientationClass = 'vjs-volume-menu-button-vertical';
} else {
orientationClass = 'vjs-volume-menu-button-horizontal';
}
return 'vjs-volume-menu-button ' + _MenuButton.prototype.buildCSSClass.call(this) + ' ' + orientationClass;
};
/**
* Allow sub components to stack CSS class names
*
* @return {Menu} The volume menu button
* @method createMenu
*/
VolumeMenuButton.prototype.createMenu = function createMenu() {
var menu = new _menuMenuJs2['default'](this.player_, {
contentElType: 'div'
});
var vb = new _volumeControlVolumeBarJs2['default'](this.player_, this.options_.volumeBar);
menu.addChild(vb);
this.volumeBar = vb;
return menu;
};
/**
* Handle click on volume menu and calls super
*
* @method handleClick
*/
VolumeMenuButton.prototype.handleClick = function handleClick() {
_muteToggleJs2['default'].prototype.handleClick.call(this);
_MenuButton.prototype.handleClick.call(this);
};
return VolumeMenuButton;
})(_menuMenuButtonJs2['default']);
VolumeMenuButton.prototype.volumeUpdate = _muteToggleJs2['default'].prototype.update;
VolumeMenuButton.prototype.controlText_ = 'Mute';
_componentJs2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton);
exports['default'] = VolumeMenuButton;
module.exports = exports['default'];
},{"../button.js":63,"../component.js":65,"../menu/menu-button.js":102,"../menu/menu.js":104,"./mute-toggle.js":69,"./volume-control/volume-bar.js":92}],96:[function(_dereq_,module,exports){
/**
* @file error-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _modalDialog = _dereq_('./modal-dialog');
var _modalDialog2 = _interopRequireDefault(_modalDialog);
var _utilsDom = _dereq_('./utils/dom');
var Dom = _interopRequireWildcard(_utilsDom);
var _utilsMergeOptions = _dereq_('./utils/merge-options');
var _utilsMergeOptions2 = _interopRequireDefault(_utilsMergeOptions);
/**
* Display that an error has occurred making the video unplayable.
*
* @extends ModalDialog
* @class ErrorDisplay
*/
var ErrorDisplay = (function (_ModalDialog) {
_inherits(ErrorDisplay, _ModalDialog);
/**
* Constructor for error display modal.
*
* @param {Player} player
* @param {Object} [options]
*/
function ErrorDisplay(player, options) {
_classCallCheck(this, ErrorDisplay);
_ModalDialog.call(this, player, options);
this.on(player, 'error', this.open);
}
/**
* Include the old class for backward-compatibility.
*
* This can be removed in 6.0.
*
* @method buildCSSClass
* @deprecated
* @return {String}
*/
ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this);
};
/**
* Generates the modal content based on the player error.
*
* @return {String|Null}
*/
ErrorDisplay.prototype.content = function content() {
var error = this.player().error();
return error ? this.localize(error.message) : '';
};
return ErrorDisplay;
})(_modalDialog2['default']);
ErrorDisplay.prototype.options_ = _utilsMergeOptions2['default'](_modalDialog2['default'].prototype.options_, {
fillAlways: true,
uncloseable: true
});
_component2['default'].registerComponent('ErrorDisplay', ErrorDisplay);
exports['default'] = ErrorDisplay;
module.exports = exports['default'];
},{"./component":65,"./modal-dialog":105,"./utils/dom":128,"./utils/merge-options":134}],97:[function(_dereq_,module,exports){
/**
* @file event-target.js
*/
'use strict';
exports.__esModule = true;
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 _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var EventTarget = function EventTarget() {};
EventTarget.prototype.allowedEvents_ = {};
EventTarget.prototype.on = function (type, fn) {
// Remove the addEventListener alias before calling Events.on
// so we don't get into an infinite type loop
var ael = this.addEventListener;
this.addEventListener = Function.prototype;
Events.on(this, type, fn);
this.addEventListener = ael;
};
EventTarget.prototype.addEventListener = EventTarget.prototype.on;
EventTarget.prototype.off = function (type, fn) {
Events.off(this, type, fn);
};
EventTarget.prototype.removeEventListener = EventTarget.prototype.off;
EventTarget.prototype.one = function (type, fn) {
Events.one(this, type, fn);
};
EventTarget.prototype.trigger = function (event) {
var type = event.type || event;
if (typeof event === 'string') {
event = {
type: type
};
}
event = Events.fixEvent(event);
if (this.allowedEvents_[type] && this['on' + type]) {
this['on' + type](event);
}
Events.trigger(this, event);
};
// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()
EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;
exports['default'] = EventTarget;
module.exports = exports['default'];
},{"./utils/events.js":129}],98:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _utilsLog = _dereq_('./utils/log');
var _utilsLog2 = _interopRequireDefault(_utilsLog);
/*
* @file extend.js
*
* A combination of node inherits and babel's inherits (after transpile).
* Both work the same but node adds `super_` to the subClass
* and Bable adds the superClass as __proto__. Both seem useful.
*/
var _inherits = function _inherits(subClass, superClass) {
if (typeof superClass !== 'function' && superClass !== null) {
throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) {
// node
subClass.super_ = superClass;
}
};
/*
* Function for subclassing using the same inheritance that
* videojs uses internally
* ```js
* var Button = videojs.getComponent('Button');
* ```
* ```js
* var MyButton = videojs.extend(Button, {
* constructor: function(player, options) {
* Button.call(this, player, options);
* },
* onClick: function() {
* // doSomething
* }
* });
* ```
*/
var extendFn = function extendFn(superClass) {
var subClassMethods = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var subClass = function subClass() {
superClass.apply(this, arguments);
};
var methods = {};
if (typeof subClassMethods === 'object') {
if (typeof subClassMethods.init === 'function') {
_utilsLog2['default'].warn('Constructor logic via init() is deprecated; please use constructor() instead.');
subClassMethods.constructor = subClassMethods.init;
}
if (subClassMethods.constructor !== Object.prototype.constructor) {
subClass = subClassMethods.constructor;
}
methods = subClassMethods;
} else if (typeof subClassMethods === 'function') {
subClass = subClassMethods;
}
_inherits(subClass, superClass);
// Extend subObj's prototype with functions and other properties from props
for (var name in methods) {
if (methods.hasOwnProperty(name)) {
subClass.prototype[name] = methods[name];
}
}
return subClass;
};
exports['default'] = extendFn;
module.exports = exports['default'];
},{"./utils/log":133}],99:[function(_dereq_,module,exports){
/**
* @file fullscreen-api.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/*
* Store the browser-specific methods for the fullscreen API
* @type {Object|undefined}
* @private
*/
var FullscreenApi = {};
// browser API methods
// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js
var apiMap = [
// Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],
// WebKit
['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],
// Old WebKit (Safari 5.1)
['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],
// Mozilla
['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],
// Microsoft
['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
var specApi = apiMap[0];
var browserApi = undefined;
// determine the supported set of functions
for (var i = 0; i < apiMap.length; i++) {
// check for exitFullscreen function
if (apiMap[i][1] in _globalDocument2['default']) {
browserApi = apiMap[i];
break;
}
}
// map the browser API names to the spec API names
if (browserApi) {
for (var i = 0; i < browserApi.length; i++) {
FullscreenApi[specApi[i]] = browserApi[i];
}
}
exports['default'] = FullscreenApi;
module.exports = exports['default'];
},{"global/document":1}],100:[function(_dereq_,module,exports){
/**
* @file loading-spinner.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
/* Loading Spinner
================================================================================ */
/**
* Loading spinner for waiting events
*
* @extends Component
* @class LoadingSpinner
*/
var LoadingSpinner = (function (_Component) {
_inherits(LoadingSpinner, _Component);
function LoadingSpinner() {
_classCallCheck(this, LoadingSpinner);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @method createEl
*/
LoadingSpinner.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-loading-spinner'
});
};
return LoadingSpinner;
})(_component2['default']);
_component2['default'].registerComponent('LoadingSpinner', LoadingSpinner);
exports['default'] = LoadingSpinner;
module.exports = exports['default'];
},{"./component":65}],101:[function(_dereq_,module,exports){
/**
* @file media-error.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/*
* Custom MediaError to mimic the HTML5 MediaError
*
* @param {Number} code The media error code
*/
var MediaError = function MediaError(code) {
if (typeof code === 'number') {
this.code = code;
} else if (typeof code === 'string') {
// default code is zero, so this is a custom error
this.message = code;
} else if (typeof code === 'object') {
// object
_objectAssign2['default'](this, code);
}
if (!this.message) {
this.message = MediaError.defaultMessages[this.code] || '';
}
};
/*
* The error code that refers two one of the defined
* MediaError types
*
* @type {Number}
*/
MediaError.prototype.code = 0;
/*
* An optional message to be shown with the error.
* Message is not part of the HTML5 video spec
* but allows for more informative custom errors.
*
* @type {String}
*/
MediaError.prototype.message = '';
/*
* An optional status code that can be set by plugins
* to allow even more detail about the error.
* For example the HLS plugin might provide the specific
* HTTP status code that was returned when the error
* occurred, then allowing a custom error overlay
* to display more information.
*
* @type {Array}
*/
MediaError.prototype.status = null;
MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', // = 0
'MEDIA_ERR_ABORTED', // = 1
'MEDIA_ERR_NETWORK', // = 2
'MEDIA_ERR_DECODE', // = 3
'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4
'MEDIA_ERR_ENCRYPTED' // = 5
];
MediaError.defaultMessages = {
1: 'You aborted the media playback',
2: 'A network error caused the media download to fail part-way.',
3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',
4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',
5: 'The media is encrypted and we do not have the keys to decrypt it.'
};
// Add types as properties on MediaError
// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {
MediaError[MediaError.errorTypes[errNum]] = errNum;
// values should be accessible on both the class and instance
MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
}
exports['default'] = MediaError;
module.exports = exports['default'];
},{"object.assign":45}],102:[function(_dereq_,module,exports){
/**
* @file menu-button.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _menuJs = _dereq_('./menu.js');
var _menuJs2 = _interopRequireDefault(_menuJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
/**
* A button class with a popup menu
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class MenuButton
*/
var MenuButton = (function (_Button) {
_inherits(MenuButton, _Button);
function MenuButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, MenuButton);
_Button.call(this, player, options);
this.update();
this.on('keydown', this.handleKeyPress);
this.el_.setAttribute('aria-haspopup', true);
this.el_.setAttribute('role', 'button');
}
/**
* Update menu
*
* @method update
*/
MenuButton.prototype.update = function update() {
var menu = this.createMenu();
if (this.menu) {
this.removeChild(this.menu);
}
this.menu = menu;
this.addChild(menu);
/**
* Track the state of the menu button
*
* @type {Boolean}
* @private
*/
this.buttonPressed_ = false;
if (this.items && this.items.length === 0) {
this.hide();
} else if (this.items && this.items.length > 1) {
this.show();
}
};
/**
* Create menu
*
* @return {Menu} The constructed menu
* @method createMenu
*/
MenuButton.prototype.createMenu = function createMenu() {
var menu = new _menuJs2['default'](this.player_);
// Add a title list item to the top
if (this.options_.title) {
menu.contentEl().appendChild(Dom.createEl('li', {
className: 'vjs-menu-title',
innerHTML: _utilsToTitleCaseJs2['default'](this.options_.title),
tabIndex: -1
}));
}
this.items = this['createItems']();
if (this.items) {
// Add menu items to the menu
for (var i = 0; i < this.items.length; i++) {
menu.addItem(this.items[i]);
}
}
return menu;
};
/**
* Create the list of menu items. Specific to each subclass.
*
* @method createItems
*/
MenuButton.prototype.createItems = function createItems() {};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
MenuButton.prototype.createEl = function createEl() {
return _Button.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass()
});
};
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
MenuButton.prototype.buildCSSClass = function buildCSSClass() {
var menuButtonClass = 'vjs-menu-button';
// If the inline option is passed, we want to use different styles altogether.
if (this.options_.inline === true) {
menuButtonClass += '-inline';
} else {
menuButtonClass += '-popup';
}
return 'vjs-menu-button ' + menuButtonClass + ' ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Focus - Add keyboard functionality to element
* This function is not needed anymore. Instead, the
* keyboard functionality is handled by
* treating the button as triggering a submenu.
* When the button is pressed, the submenu
* appears. Pressing the button again makes
* the submenu disappear.
*
* @method handleFocus
*/
MenuButton.prototype.handleFocus = function handleFocus() {};
/**
* Can't turn off list display that we turned
* on with focus, because list would go away.
*
* @method handleBlur
*/
MenuButton.prototype.handleBlur = function handleBlur() {};
/**
* When you click the button it adds focus, which
* will show the menu indefinitely.
* So we'll remove focus when the mouse leaves the button.
* Focus is needed for tab navigation.
* Allow sub components to stack CSS class names
*
* @method handleClick
*/
MenuButton.prototype.handleClick = function handleClick() {
this.one('mouseout', Fn.bind(this, function () {
this.menu.unlockShowing();
this.el_.blur();
}));
if (this.buttonPressed_) {
this.unpressButton();
} else {
this.pressButton();
}
};
/**
* Handle key press on menu
*
* @param {Object} Key press event
* @method handleKeyPress
*/
MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {
// Check for space bar (32) or enter (13) keys
if (event.which === 32 || event.which === 13) {
if (this.buttonPressed_) {
this.unpressButton();
} else {
this.pressButton();
}
event.preventDefault();
// Check for escape (27) key
} else if (event.which === 27) {
if (this.buttonPressed_) {
this.unpressButton();
}
event.preventDefault();
}
};
/**
* Makes changes based on button pressed
*
* @method pressButton
*/
MenuButton.prototype.pressButton = function pressButton() {
this.buttonPressed_ = true;
this.menu.lockShowing();
this.el_.setAttribute('aria-pressed', true);
if (this.items && this.items.length > 0) {
this.items[0].el().focus(); // set the focus to the title of the submenu
}
};
/**
* Makes changes based on button unpressed
*
* @method unpressButton
*/
MenuButton.prototype.unpressButton = function unpressButton() {
this.buttonPressed_ = false;
this.menu.unlockShowing();
this.el_.setAttribute('aria-pressed', false);
};
return MenuButton;
})(_buttonJs2['default']);
_componentJs2['default'].registerComponent('MenuButton', MenuButton);
exports['default'] = MenuButton;
module.exports = exports['default'];
},{"../button.js":63,"../component.js":65,"../utils/dom.js":128,"../utils/fn.js":130,"../utils/to-title-case.js":137,"./menu.js":104}],103:[function(_dereq_,module,exports){
/**
* @file menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* The component for a menu item. `<li>`
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class MenuItem
*/
var MenuItem = (function (_Button) {
_inherits(MenuItem, _Button);
function MenuItem(player, options) {
_classCallCheck(this, MenuItem);
_Button.call(this, player, options);
this.selected(options['selected']);
}
/**
* Create the component's DOM element
*
* @param {String=} type Desc
* @param {Object=} props Desc
* @return {Element}
* @method createEl
*/
MenuItem.prototype.createEl = function createEl(type, props, attrs) {
return _Button.prototype.createEl.call(this, 'li', _objectAssign2['default']({
className: 'vjs-menu-item',
innerHTML: this.localize(this.options_['label'])
}, props), attrs);
};
/**
* Handle a click on the menu item, and set it to selected
*
* @method handleClick
*/
MenuItem.prototype.handleClick = function handleClick() {
this.selected(true);
};
/**
* Set this menu item as selected or not
*
* @param {Boolean} selected
* @method selected
*/
MenuItem.prototype.selected = function selected(_selected) {
if (_selected) {
this.addClass('vjs-selected');
this.el_.setAttribute('aria-selected', true);
} else {
this.removeClass('vjs-selected');
this.el_.setAttribute('aria-selected', false);
}
};
return MenuItem;
})(_buttonJs2['default']);
_componentJs2['default'].registerComponent('MenuItem', MenuItem);
exports['default'] = MenuItem;
module.exports = exports['default'];
},{"../button.js":63,"../component.js":65,"object.assign":45}],104:[function(_dereq_,module,exports){
/**
* @file menu.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsEventsJs = _dereq_('../utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
/**
* The Menu component is used to build pop up menus, including subtitle and
* captions selection menus.
*
* @extends Component
* @class Menu
*/
var Menu = (function (_Component) {
_inherits(Menu, _Component);
function Menu() {
_classCallCheck(this, Menu);
_Component.apply(this, arguments);
}
/**
* Add a menu item to the menu
*
* @param {Object|String} component Component or component type to add
* @method addItem
*/
Menu.prototype.addItem = function addItem(component) {
this.addChild(component);
component.on('click', Fn.bind(this, function () {
this.unlockShowing();
}));
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Menu.prototype.createEl = function createEl() {
var contentElType = this.options_.contentElType || 'ul';
this.contentEl_ = Dom.createEl(contentElType, {
className: 'vjs-menu-content'
});
var el = _Component.prototype.createEl.call(this, 'div', {
append: this.contentEl_,
className: 'vjs-menu'
});
el.appendChild(this.contentEl_);
// Prevent clicks from bubbling up. Needed for Menu Buttons,
// where a click on the parent is significant
Events.on(el, 'click', function (event) {
event.preventDefault();
event.stopImmediatePropagation();
});
return el;
};
return Menu;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Menu', Menu);
exports['default'] = Menu;
module.exports = exports['default'];
},{"../component.js":65,"../utils/dom.js":128,"../utils/events.js":129,"../utils/fn.js":130}],105:[function(_dereq_,module,exports){
/**
* @file modal-dialog.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _utilsDom = _dereq_('./utils/dom');
var Dom = _interopRequireWildcard(_utilsDom);
var _utilsFn = _dereq_('./utils/fn');
var Fn = _interopRequireWildcard(_utilsFn);
var _utilsLog = _dereq_('./utils/log');
var _utilsLog2 = _interopRequireDefault(_utilsLog);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _closeButton = _dereq_('./close-button');
var _closeButton2 = _interopRequireDefault(_closeButton);
var MODAL_CLASS_NAME = 'vjs-modal-dialog';
var ESC = 27;
/**
* The `ModalDialog` displays over the video and its controls, which blocks
* interaction with the player until it is closed.
*
* Modal dialogs include a "Close" button and will close when that button
* is activated - or when ESC is pressed anywhere.
*
* @extends Component
* @class ModalDialog
*/
var ModalDialog = (function (_Component) {
_inherits(ModalDialog, _Component);
/**
* Constructor for modals.
*
* @param {Player} player
* @param {Object} [options]
* @param {Mixed} [options.content=undefined]
* Provide customized content for this modal.
*
* @param {String} [options.description]
* A text description for the modal, primarily for accessibility.
*
* @param {Boolean} [options.fillAlways=false]
* Normally, modals are automatically filled only the first time
* they open. This tells the modal to refresh its content
* every time it opens.
*
* @param {String} [options.label]
* A text label for the modal, primarily for accessibility.
*
* @param {Boolean} [options.temporary=true]
* If `true`, the modal can only be opened once; it will be
* disposed as soon as it's closed.
*
* @param {Boolean} [options.uncloseable=false]
* If `true`, the user will not be able to close the modal
* through the UI in the normal ways. Programmatic closing is
* still possible.
*
*/
function ModalDialog(player, options) {
_classCallCheck(this, ModalDialog);
_Component.call(this, player, options);
this.opened_ = this.hasBeenOpened_ = this.hasBeenFilled_ = false;
this.closeable(!this.options_.uncloseable);
this.content(this.options_.content);
// Make sure the contentEl is defined AFTER any children are initialized
// because we only want the contents of the modal in the contentEl
// (not the UI elements like the close button).
this.contentEl_ = Dom.createEl('div', {
className: MODAL_CLASS_NAME + '-content'
}, {
role: 'document'
});
this.descEl_ = Dom.createEl('p', {
className: MODAL_CLASS_NAME + '-description vjs-offscreen',
id: this.el().getAttribute('aria-describedby')
});
Dom.textContent(this.descEl_, this.description());
this.el_.appendChild(this.descEl_);
this.el_.appendChild(this.contentEl_);
}
/*
* Modal dialog default options.
*
* @type {Object}
* @private
*/
/**
* Create the modal's DOM element
*
* @method createEl
* @return {Element}
*/
ModalDialog.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass(),
tabIndex: -1
}, {
'aria-describedby': this.id() + '_description',
'aria-hidden': 'true',
'aria-label': this.label(),
role: 'dialog'
});
};
/**
* Build the modal's CSS class.
*
* @method buildCSSClass
* @return {String}
*/
ModalDialog.prototype.buildCSSClass = function buildCSSClass() {
return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this);
};
/**
* Handles key presses on the document, looking for ESC, which closes
* the modal.
*
* @method handleKeyPress
* @param {Event} e
*/
ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) {
if (e.which === ESC && this.closeable()) {
this.close();
}
};
/**
* Returns the label string for this modal. Primarily used for accessibility.
*
* @return {String}
*/
ModalDialog.prototype.label = function label() {
return this.options_.label || this.localize('Modal Window');
};
/**
* Returns the description string for this modal. Primarily used for
* accessibility.
*
* @return {String}
*/
ModalDialog.prototype.description = function description() {
var desc = this.options_.description || this.localize('This is a modal window.');
// Append a universal closeability message if the modal is closeable.
if (this.closeable()) {
desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.');
}
return desc;
};
/**
* Opens the modal.
*
* @method open
* @return {ModalDialog}
*/
ModalDialog.prototype.open = function open() {
if (!this.opened_) {
var player = this.player();
this.trigger('beforemodalopen');
this.opened_ = true;
// Fill content if the modal has never opened before and
// never been filled.
if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) {
this.fill();
}
// If the player was playing, pause it and take note of its previously
// playing state.
this.wasPlaying_ = !player.paused();
if (this.wasPlaying_) {
player.pause();
}
if (this.closeable()) {
this.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
}
player.controls(false);
this.show();
this.el().setAttribute('aria-hidden', 'false');
this.trigger('modalopen');
this.hasBeenOpened_ = true;
}
return this;
};
/**
* Whether or not the modal is opened currently.
*
* @method opened
* @param {Boolean} [value]
* If given, it will open (`true`) or close (`false`) the modal.
*
* @return {Boolean}
*/
ModalDialog.prototype.opened = function opened(value) {
if (typeof value === 'boolean') {
this[value ? 'open' : 'close']();
}
return this.opened_;
};
/**
* Closes the modal.
*
* @method close
* @return {ModalDialog}
*/
ModalDialog.prototype.close = function close() {
if (this.opened_) {
var player = this.player();
this.trigger('beforemodalclose');
this.opened_ = false;
if (this.wasPlaying_) {
player.play();
}
if (this.closeable()) {
this.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
}
player.controls(true);
this.hide();
this.el().setAttribute('aria-hidden', 'true');
this.trigger('modalclose');
if (this.options_.temporary) {
this.dispose();
}
}
return this;
};
/**
* Whether or not the modal is closeable via the UI.
*
* @method closeable
* @param {Boolean} [value]
* If given as a Boolean, it will set the `closeable` option.
*
* @return {Boolean}
*/
ModalDialog.prototype.closeable = function closeable(value) {
if (typeof value === 'boolean') {
var closeable = this.closeable_ = !!value;
var _close = this.getChild('closeButton');
// If this is being made closeable and has no close button, add one.
if (closeable && !_close) {
// The close button should be a child of the modal - not its
// content element, so temporarily change the content element.
var temp = this.contentEl_;
this.contentEl_ = this.el_;
_close = this.addChild('closeButton');
this.contentEl_ = temp;
this.on(_close, 'close', this.close);
}
// If this is being made uncloseable and has a close button, remove it.
if (!closeable && _close) {
this.off(_close, 'close', this.close);
this.removeChild(_close);
_close.dispose();
}
}
return this.closeable_;
};
/**
* Fill the modal's content element with the modal's "content" option.
*
* The content element will be emptied before this change takes place.
*
* @method fill
* @return {ModalDialog}
*/
ModalDialog.prototype.fill = function fill() {
return this.fillWith(this.content());
};
/**
* Fill the modal's content element with arbitrary content.
*
* The content element will be emptied before this change takes place.
*
* @method fillWith
* @param {Mixed} [content]
* The same rules apply to this as apply to the `content` option.
*
* @return {ModalDialog}
*/
ModalDialog.prototype.fillWith = function fillWith(content) {
var contentEl = this.contentEl();
var parentEl = contentEl.parentNode;
var nextSiblingEl = contentEl.nextSibling;
this.trigger('beforemodalfill');
this.hasBeenFilled_ = true;
// Detach the content element from the DOM before performing
// manipulation to avoid modifying the live DOM multiple times.
parentEl.removeChild(contentEl);
this.empty();
Dom.insertContent(contentEl, content);
this.trigger('modalfill');
// Re-inject the re-filled content element.
if (nextSiblingEl) {
parentEl.insertBefore(contentEl, nextSiblingEl);
} else {
parentEl.appendChild(contentEl);
}
return this;
};
/**
* Empties the content element.
*
* This happens automatically anytime the modal is filled.
*
* @method empty
* @return {ModalDialog}
*/
ModalDialog.prototype.empty = function empty() {
this.trigger('beforemodalempty');
Dom.emptyEl(this.contentEl());
this.trigger('modalempty');
return this;
};
/**
* Gets or sets the modal content, which gets normalized before being
* rendered into the DOM.
*
* This does not update the DOM or fill the modal, but it is called during
* that process.
*
* @method content
* @param {Mixed} [value]
* If defined, sets the internal content value to be used on the
* next call(s) to `fill`. This value is normalized before being
* inserted. To "clear" the internal content value, pass `null`.
*
* @return {Mixed}
*/
ModalDialog.prototype.content = function content(value) {
if (typeof value !== 'undefined') {
this.content_ = value;
}
return this.content_;
};
return ModalDialog;
})(_component2['default']);
ModalDialog.prototype.options_ = {
temporary: true
};
_component2['default'].registerComponent('ModalDialog', ModalDialog);
exports['default'] = ModalDialog;
module.exports = exports['default'];
},{"./close-button":64,"./component":65,"./utils/dom":128,"./utils/fn":130,"./utils/log":133,"global/document":1}],106:[function(_dereq_,module,exports){
/**
* @file player.js
*/
// Subclasses Component
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('./component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsGuidJs = _dereq_('./utils/guid.js');
var Guid = _interopRequireWildcard(_utilsGuidJs);
var _utilsBrowserJs = _dereq_('./utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
var _utilsBufferJs = _dereq_('./utils/buffer.js');
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
var _fullscreenApiJs = _dereq_('./fullscreen-api.js');
var _fullscreenApiJs2 = _interopRequireDefault(_fullscreenApiJs);
var _mediaErrorJs = _dereq_('./media-error.js');
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
var _tracksTextTrackListConverterJs = _dereq_('./tracks/text-track-list-converter.js');
var _tracksTextTrackListConverterJs2 = _interopRequireDefault(_tracksTextTrackListConverterJs);
// Include required child components (importing also registers them)
var _techLoaderJs = _dereq_('./tech/loader.js');
var _techLoaderJs2 = _interopRequireDefault(_techLoaderJs);
var _posterImageJs = _dereq_('./poster-image.js');
var _posterImageJs2 = _interopRequireDefault(_posterImageJs);
var _tracksTextTrackDisplayJs = _dereq_('./tracks/text-track-display.js');
var _tracksTextTrackDisplayJs2 = _interopRequireDefault(_tracksTextTrackDisplayJs);
var _loadingSpinnerJs = _dereq_('./loading-spinner.js');
var _loadingSpinnerJs2 = _interopRequireDefault(_loadingSpinnerJs);
var _bigPlayButtonJs = _dereq_('./big-play-button.js');
var _bigPlayButtonJs2 = _interopRequireDefault(_bigPlayButtonJs);
var _controlBarControlBarJs = _dereq_('./control-bar/control-bar.js');
var _controlBarControlBarJs2 = _interopRequireDefault(_controlBarControlBarJs);
var _errorDisplayJs = _dereq_('./error-display.js');
var _errorDisplayJs2 = _interopRequireDefault(_errorDisplayJs);
var _tracksTextTrackSettingsJs = _dereq_('./tracks/text-track-settings.js');
var _tracksTextTrackSettingsJs2 = _interopRequireDefault(_tracksTextTrackSettingsJs);
var _modalDialog = _dereq_('./modal-dialog');
var _modalDialog2 = _interopRequireDefault(_modalDialog);
// Require html5 tech, at least for disposing the original video tag
var _techTechJs = _dereq_('./tech/tech.js');
var _techTechJs2 = _interopRequireDefault(_techTechJs);
var _techHtml5Js = _dereq_('./tech/html5.js');
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
/**
* An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.
* ```js
* var myPlayer = videojs('example_video_1');
* ```
* In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
* ```html
* <video id="example_video_1" data-setup='{}' controls>
* <source src="my-source.mp4" type="video/mp4">
* </video>
* ```
* After an instance has been created it can be accessed globally using `Video('example_video_1')`.
*
* @param {Element} tag The original video tag used for configuring options
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Component
* @class Player
*/
var Player = (function (_Component) {
_inherits(Player, _Component);
/**
* player's constructor function
*
* @constructs
* @method init
* @param {Element} tag The original video tag used for configuring options
* @param {Object=} options Player options
* @param {Function=} ready Ready callback function
*/
function Player(tag, options, ready) {
var _this = this;
_classCallCheck(this, Player);
// Make sure tag ID exists
tag.id = tag.id || 'vjs_video_' + Guid.newGUID();
// Set Options
// The options argument overrides options set in the video tag
// which overrides globally set options.
// This latter part coincides with the load order
// (tag must exist before Player)
options = _objectAssign2['default'](Player.getTagSettings(tag), options);
// Delay the initialization of children because we need to set up
// player properties first, and can't use `this` before `super()`
options.initChildren = false;
// Same with creating the element
options.createEl = false;
// we don't want the player to report touch activity on itself
// see enableTouchActivity in Component
options.reportTouchActivity = false;
// Run base component initializing with new options
_Component.call(this, null, options, ready);
// if the global option object was accidentally blown away by
// someone, bail early with an informative error
if (!this.options_ || !this.options_.techOrder || !this.options_.techOrder.length) {
throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');
}
this.tag = tag; // Store the original tag used to set options
// Store the tag attributes used to restore html5 element
this.tagAttributes = tag && Dom.getElAttributes(tag);
// Update current language
this.language(this.options_.language);
// Update Supported Languages
if (options.languages) {
(function () {
// Normalise player option languages to lowercase
var languagesToLower = {};
Object.getOwnPropertyNames(options.languages).forEach(function (name) {
languagesToLower[name.toLowerCase()] = options.languages[name];
});
_this.languages_ = languagesToLower;
})();
} else {
this.languages_ = Player.prototype.options_.languages;
}
// Cache for video property values.
this.cache_ = {};
// Set poster
this.poster_ = options.poster || '';
// Set controls
this.controls_ = !!options.controls;
// Original tag settings stored in options
// now remove immediately so native controls don't flash.
// May be turned back on by HTML5 tech if nativeControlsForTouch is true
tag.controls = false;
/*
* Store the internal state of scrubbing
*
* @private
* @return {Boolean} True if the user is scrubbing
*/
this.scrubbing_ = false;
this.el_ = this.createEl();
// We also want to pass the original player options to each component and plugin
// as well so they don't need to reach back into the player for options later.
// We also need to do another copy of this.options_ so we don't end up with
// an infinite loop.
var playerOptionsCopy = _utilsMergeOptionsJs2['default'](this.options_);
// Load plugins
if (options.plugins) {
(function () {
var plugins = options.plugins;
Object.getOwnPropertyNames(plugins).forEach(function (name) {
if (typeof this[name] === 'function') {
this[name](plugins[name]);
} else {
_utilsLogJs2['default'].error('Unable to find plugin:', name);
}
}, _this);
})();
}
this.options_.playerOptions = playerOptionsCopy;
this.initChildren();
// Set isAudio based on whether or not an audio tag was used
this.isAudio(tag.nodeName.toLowerCase() === 'audio');
// Update controls className. Can't do this when the controls are initially
// set because the element doesn't exist yet.
if (this.controls()) {
this.addClass('vjs-controls-enabled');
} else {
this.addClass('vjs-controls-disabled');
}
if (this.isAudio()) {
this.addClass('vjs-audio');
}
if (this.flexNotSupported_()) {
this.addClass('vjs-no-flex');
}
// TODO: Make this smarter. Toggle user state between touching/mousing
// using events, since devices can have both touch and mouse events.
// if (browser.TOUCH_ENABLED) {
// this.addClass('vjs-touch-enabled');
// }
// Make player easily findable by ID
Player.players[this.id_] = this;
// When the player is first initialized, trigger activity so components
// like the control bar show themselves if needed
this.userActive(true);
this.reportUserActivity();
this.listenForUserActivity_();
this.on('fullscreenchange', this.handleFullscreenChange_);
this.on('stageclick', this.handleStageClick_);
}
/*
* Global player list
*
* @type {Object}
*/
/**
* Destroys the video player and does any necessary cleanup
* ```js
* myPlayer.dispose();
* ```
* This is especially helpful if you are dynamically adding and removing videos
* to/from the DOM.
*
* @method dispose
*/
Player.prototype.dispose = function dispose() {
this.trigger('dispose');
// prevent dispose from being called twice
this.off('dispose');
if (this.styleEl_) {
this.styleEl_.parentNode.removeChild(this.styleEl_);
}
// Kill reference to this player
Player.players[this.id_] = null;
if (this.tag && this.tag.player) {
this.tag.player = null;
}
if (this.el_ && this.el_.player) {
this.el_.player = null;
}
if (this.tech_) {
this.tech_.dispose();
}
_Component.prototype.dispose.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Player.prototype.createEl = function createEl() {
var el = this.el_ = _Component.prototype.createEl.call(this, 'div');
var tag = this.tag;
// Remove width/height attrs from tag so CSS can make it 100% width/height
tag.removeAttribute('width');
tag.removeAttribute('height');
// Copy over all the attributes from the tag, including ID and class
// ID will now reference player box, not the video tag
var attrs = Dom.getElAttributes(tag);
Object.getOwnPropertyNames(attrs).forEach(function (attr) {
// workaround so we don't totally break IE7
// http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7
if (attr === 'class') {
el.className = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
});
// Update tag id/class for use as HTML5 playback tech
// Might think we should do this after embedding in container so .vjs-tech class
// doesn't flash 100% width/height, but class only applies with .video-js parent
tag.id += '_html5_api';
tag.className = 'vjs-tech';
// Make player findable on elements
tag.player = el.player = this;
// Default state of video is paused
this.addClass('vjs-paused');
// Add a style element in the player that we'll use to set the width/height
// of the player in a way that's still overrideable by CSS, just like the
// video element
this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');
var defaultsStyleEl = Dom.$('.vjs-styles-defaults');
var head = Dom.$('head');
head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);
// Pass in the width/height/aspectRatio options which will update the style el
this.width(this.options_.width);
this.height(this.options_.height);
this.fluid(this.options_.fluid);
this.aspectRatio(this.options_.aspectRatio);
// insertElFirst seems to cause the networkState to flicker from 3 to 2, so
// keep track of the original for later so we can know if the source originally failed
tag.initNetworkState_ = tag.networkState;
// Wrap video tag in div (el/box) container
if (tag.parentNode) {
tag.parentNode.insertBefore(el, tag);
}
Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
this.el_ = el;
return el;
};
/**
* Get/set player width
*
* @param {Number=} value Value for width
* @return {Number} Width when getting
* @method width
*/
Player.prototype.width = function width(value) {
return this.dimension('width', value);
};
/**
* Get/set player height
*
* @param {Number=} value Value for height
* @return {Number} Height when getting
* @method height
*/
Player.prototype.height = function height(value) {
return this.dimension('height', value);
};
/**
* Get/set dimension for player
*
* @param {String} dimension Either width or height
* @param {Number=} value Value for dimension
* @return {Component}
* @method dimension
*/
Player.prototype.dimension = function dimension(_dimension, value) {
var privDimension = _dimension + '_';
if (value === undefined) {
return this[privDimension] || 0;
}
if (value === '') {
// If an empty string is given, reset the dimension to be automatic
this[privDimension] = undefined;
} else {
var parsedVal = parseFloat(value);
if (isNaN(parsedVal)) {
_utilsLogJs2['default'].error('Improper value "' + value + '" supplied for for ' + _dimension);
return this;
}
this[privDimension] = parsedVal;
}
this.updateStyleEl_();
return this;
};
/**
* Add/remove the vjs-fluid class
*
* @param {Boolean} bool Value of true adds the class, value of false removes the class
* @method fluid
*/
Player.prototype.fluid = function fluid(bool) {
if (bool === undefined) {
return !!this.fluid_;
}
this.fluid_ = !!bool;
if (bool) {
this.addClass('vjs-fluid');
} else {
this.removeClass('vjs-fluid');
}
};
/**
* Get/Set the aspect ratio
*
* @param {String=} ratio Aspect ratio for player
* @return aspectRatio
* @method aspectRatio
*/
Player.prototype.aspectRatio = function aspectRatio(ratio) {
if (ratio === undefined) {
return this.aspectRatio_;
}
// Check for width:height format
if (!/^\d+\:\d+$/.test(ratio)) {
throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');
}
this.aspectRatio_ = ratio;
// We're assuming if you set an aspect ratio you want fluid mode,
// because in fixed mode you could calculate width and height yourself.
this.fluid(true);
this.updateStyleEl_();
};
/**
* Update styles of the player element (height, width and aspect ratio)
*
* @method updateStyleEl_
*/
Player.prototype.updateStyleEl_ = function updateStyleEl_() {
var width = undefined;
var height = undefined;
var aspectRatio = undefined;
var idClass = undefined;
// The aspect ratio is either used directly or to calculate width and height.
if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {
// Use any aspectRatio that's been specifically set
aspectRatio = this.aspectRatio_;
} else if (this.videoWidth()) {
// Otherwise try to get the aspect ratio from the video metadata
aspectRatio = this.videoWidth() + ':' + this.videoHeight();
} else {
// Or use a default. The video element's is 2:1, but 16:9 is more common.
aspectRatio = '16:9';
}
// Get the ratio as a decimal we can use to calculate dimensions
var ratioParts = aspectRatio.split(':');
var ratioMultiplier = ratioParts[1] / ratioParts[0];
if (this.width_ !== undefined) {
// Use any width that's been specifically set
width = this.width_;
} else if (this.height_ !== undefined) {
// Or calulate the width from the aspect ratio if a height has been set
width = this.height_ / ratioMultiplier;
} else {
// Or use the video's metadata, or use the video el's default of 300
width = this.videoWidth() || 300;
}
if (this.height_ !== undefined) {
// Use any height that's been specifically set
height = this.height_;
} else {
// Otherwise calculate the height from the ratio and the width
height = width * ratioMultiplier;
}
// Ensure the CSS class is valid by starting with an alpha character
if (/^[^a-zA-Z]/.test(this.id())) {
idClass = 'dimensions-' + this.id();
} else {
idClass = this.id() + '-dimensions';
}
// Ensure the right class is still on the player for the style element
this.addClass(idClass);
stylesheet.setTextContent(this.styleEl_, '\n .' + idClass + ' {\n width: ' + width + 'px;\n height: ' + height + 'px;\n }\n\n .' + idClass + '.vjs-fluid {\n padding-top: ' + ratioMultiplier * 100 + '%;\n }\n ');
};
/**
* Load the Media Playback Technology (tech)
* Load/Create an instance of playback technology including element and API methods
* And append playback element in player div.
*
* @param {String} techName Name of the playback technology
* @param {String} source Video source
* @method loadTech_
* @private
*/
Player.prototype.loadTech_ = function loadTech_(techName, source) {
// Pause and remove current playback technology
if (this.tech_) {
this.unloadTech_();
}
// get rid of the HTML5 video tag as soon as we are using another tech
if (techName !== 'Html5' && this.tag) {
_techTechJs2['default'].getTech('Html5').disposeMediaElement(this.tag);
this.tag.player = null;
this.tag = null;
}
this.techName_ = techName;
// Turn off API access because we're loading a new tech that might load asynchronously
this.isReady_ = false;
// Grab tech-specific options from player options and add source and parent element to use.
var techOptions = _objectAssign2['default']({
'nativeControlsForTouch': this.options_.nativeControlsForTouch,
'source': source,
'playerId': this.id(),
'techId': this.id() + '_' + techName + '_api',
'textTracks': this.textTracks_,
'autoplay': this.options_.autoplay,
'preload': this.options_.preload,
'loop': this.options_.loop,
'muted': this.options_.muted,
'poster': this.poster(),
'language': this.language(),
'vtt.js': this.options_['vtt.js']
}, this.options_[techName.toLowerCase()]);
if (this.tag) {
techOptions.tag = this.tag;
}
if (source) {
this.currentType_ = source.type;
if (source.src === this.cache_.src && this.cache_.currentTime > 0) {
techOptions.startTime = this.cache_.currentTime;
}
this.cache_.src = source.src;
}
// Initialize tech instance
var techComponent = _techTechJs2['default'].getTech(techName);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!techComponent) {
techComponent = _componentJs2['default'].getComponent(techName);
}
this.tech_ = new techComponent(techOptions);
// player.triggerReady is always async, so don't need this to be async
this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);
_tracksTextTrackListConverterJs2['default'].jsonToTextTracks(this.textTracksJson_ || [], this.tech_);
// Listen to all HTML5-defined events and trigger them on the player
this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);
this.on(this.tech_, 'waiting', this.handleTechWaiting_);
this.on(this.tech_, 'canplay', this.handleTechCanPlay_);
this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);
this.on(this.tech_, 'playing', this.handleTechPlaying_);
this.on(this.tech_, 'ended', this.handleTechEnded_);
this.on(this.tech_, 'seeking', this.handleTechSeeking_);
this.on(this.tech_, 'seeked', this.handleTechSeeked_);
this.on(this.tech_, 'play', this.handleTechPlay_);
this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);
this.on(this.tech_, 'pause', this.handleTechPause_);
this.on(this.tech_, 'progress', this.handleTechProgress_);
this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);
this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);
this.on(this.tech_, 'error', this.handleTechError_);
this.on(this.tech_, 'suspend', this.handleTechSuspend_);
this.on(this.tech_, 'abort', this.handleTechAbort_);
this.on(this.tech_, 'emptied', this.handleTechEmptied_);
this.on(this.tech_, 'stalled', this.handleTechStalled_);
this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);
this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);
this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);
this.on(this.tech_, 'ratechange', this.handleTechRateChange_);
this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);
this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);
this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);
this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);
this.usingNativeControls(this.techGet_('controls'));
if (this.controls() && !this.usingNativeControls()) {
this.addTechControlsListeners_();
}
// Add the tech element in the DOM if it was not already there
// Make sure to not insert the original video element if using Html5
if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {
Dom.insertElFirst(this.tech_.el(), this.el());
}
// Get rid of the original video tag reference after the first tech is loaded
if (this.tag) {
this.tag.player = null;
this.tag = null;
}
};
/**
* Unload playback technology
*
* @method unloadTech_
* @private
*/
Player.prototype.unloadTech_ = function unloadTech_() {
// Save the current text tracks so that we can reuse the same text tracks with the next tech
this.textTracks_ = this.textTracks();
this.textTracksJson_ = _tracksTextTrackListConverterJs2['default'].textTracksToJson(this.tech_);
this.isReady_ = false;
this.tech_.dispose();
this.tech_ = false;
};
/**
* Return a reference to the current tech.
* It will only return a reference to the tech if given an object with the
* `IWillNotUseThisInPlugins` property on it. This is try and prevent misuse
* of techs by plugins.
*
* @param {Object}
* @return {Object} The Tech
* @method tech
*/
Player.prototype.tech = function tech(safety) {
if (safety && safety.IWillNotUseThisInPlugins) {
return this.tech_;
}
var errorText = '\n Please make sure that you are not using this inside of a plugin.\n To disable this alert and error, please pass in an object with\n `IWillNotUseThisInPlugins` to the `tech` method. See\n https://github.com/videojs/video.js/issues/2617 for more info.\n ';
_globalWindow2['default'].alert(errorText);
throw new Error(errorText);
};
/**
* Set up click and touch listeners for the playback element
*
* On desktops, a click on the video itself will toggle playback,
* on a mobile device a click on the video toggles controls.
* (toggling controls is done by toggling the user state between active and
* inactive)
* A tap can signal that a user has become active, or has become inactive
* e.g. a quick tap on an iPhone movie should reveal the controls. Another
* quick tap should hide them again (signaling the user is in an inactive
* viewing state)
* In addition to this, we still want the user to be considered inactive after
* a few seconds of inactivity.
* Note: the only part of iOS interaction we can't mimic with this setup
* is a touch and hold on the video element counting as activity in order to
* keep the controls showing, but that shouldn't be an issue. A touch and hold
* on any controls will still keep the user active
*
* @private
* @method addTechControlsListeners_
*/
Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {
// Make sure to remove all the previous listeners in case we are called multiple times.
this.removeTechControlsListeners_();
// Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
// trigger mousedown/up.
// http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
// Any touch events are set to block the mousedown event from happening
this.on(this.tech_, 'mousedown', this.handleTechClick_);
// If the controls were hidden we don't want that to change without a tap event
// so we'll check if the controls were already showing before reporting user
// activity
this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);
this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);
this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);
// The tap listener needs to come after the touchend listener because the tap
// listener cancels out any reportedUserActivity when setting userActive(false)
this.on(this.tech_, 'tap', this.handleTechTap_);
};
/**
* Remove the listeners used for click and tap controls. This is needed for
* toggling to controls disabled, where a tap/touch should do nothing.
*
* @method removeTechControlsListeners_
* @private
*/
Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {
// We don't want to just use `this.off()` because there might be other needed
// listeners added by techs that extend this.
this.off(this.tech_, 'tap', this.handleTechTap_);
this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);
this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);
this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);
this.off(this.tech_, 'mousedown', this.handleTechClick_);
};
/**
* Player waits for the tech to be ready
*
* @method handleTechReady_
* @private
*/
Player.prototype.handleTechReady_ = function handleTechReady_() {
this.triggerReady();
// Keep the same volume as before
if (this.cache_.volume) {
this.techCall_('setVolume', this.cache_.volume);
}
// Look if the tech found a higher resolution poster while loading
this.handleTechPosterChange_();
// Update the duration if available
this.handleTechDurationChange_();
// Chrome and Safari both have issues with autoplay.
// In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
// In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
// This fixes both issues. Need to wait for API, so it updates displays correctly
if (this.tag && this.options_.autoplay && this.paused()) {
delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.
this.play();
}
};
/**
* Fired when the user agent begins looking for media data
*
* @private
* @method handleTechLoadStart_
*/
Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {
// TODO: Update to use `emptied` event instead. See #1277.
this.removeClass('vjs-ended');
// reset the error state
this.error(null);
// If it's already playing we want to trigger a firstplay event now.
// The firstplay event relies on both the play and loadstart events
// which can happen in any order for a new source
if (!this.paused()) {
this.trigger('loadstart');
this.trigger('firstplay');
} else {
// reset the hasStarted state
this.hasStarted(false);
this.trigger('loadstart');
}
};
/**
* Add/remove the vjs-has-started class
*
* @param {Boolean} hasStarted The value of true adds the class the value of false remove the class
* @return {Boolean} Boolean value if has started
* @private
* @method hasStarted
*/
Player.prototype.hasStarted = function hasStarted(_hasStarted) {
if (_hasStarted !== undefined) {
// only update if this is a new value
if (this.hasStarted_ !== _hasStarted) {
this.hasStarted_ = _hasStarted;
if (_hasStarted) {
this.addClass('vjs-has-started');
// trigger the firstplay event if this newly has played
this.trigger('firstplay');
} else {
this.removeClass('vjs-has-started');
}
}
return this;
}
return !!this.hasStarted_;
};
/**
* Fired whenever the media begins or resumes playback
*
* @private
* @method handleTechPlay_
*/
Player.prototype.handleTechPlay_ = function handleTechPlay_() {
this.removeClass('vjs-ended');
this.removeClass('vjs-paused');
this.addClass('vjs-playing');
// hide the poster when the user hits play
// https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play
this.hasStarted(true);
this.trigger('play');
};
/**
* Fired whenever the media begins waiting
*
* @private
* @method handleTechWaiting_
*/
Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {
this.addClass('vjs-waiting');
this.trigger('waiting');
};
/**
* A handler for events that signal that waiting has ended
* which is not consistent between browsers. See #1351
*
* @private
* @method handleTechCanPlay_
*/
Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {
this.removeClass('vjs-waiting');
this.trigger('canplay');
};
/**
* A handler for events that signal that waiting has ended
* which is not consistent between browsers. See #1351
*
* @private
* @method handleTechCanPlayThrough_
*/
Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {
this.removeClass('vjs-waiting');
this.trigger('canplaythrough');
};
/**
* A handler for events that signal that waiting has ended
* which is not consistent between browsers. See #1351
*
* @private
* @method handleTechPlaying_
*/
Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {
this.removeClass('vjs-waiting');
this.trigger('playing');
};
/**
* Fired whenever the player is jumping to a new time
*
* @private
* @method handleTechSeeking_
*/
Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {
this.addClass('vjs-seeking');
this.trigger('seeking');
};
/**
* Fired when the player has finished jumping to a new time
*
* @private
* @method handleTechSeeked_
*/
Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {
this.removeClass('vjs-seeking');
this.trigger('seeked');
};
/**
* Fired the first time a video is played
* Not part of the HLS spec, and we're not sure if this is the best
* implementation yet, so use sparingly. If you don't have a reason to
* prevent playback, use `myPlayer.one('play');` instead.
*
* @private
* @method handleTechFirstPlay_
*/
Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {
//If the first starttime attribute is specified
//then we will start at the given offset in seconds
if (this.options_.starttime) {
this.currentTime(this.options_.starttime);
}
this.addClass('vjs-has-started');
this.trigger('firstplay');
};
/**
* Fired whenever the media has been paused
*
* @private
* @method handleTechPause_
*/
Player.prototype.handleTechPause_ = function handleTechPause_() {
this.removeClass('vjs-playing');
this.addClass('vjs-paused');
this.trigger('pause');
};
/**
* Fired while the user agent is downloading media data
*
* @private
* @method handleTechProgress_
*/
Player.prototype.handleTechProgress_ = function handleTechProgress_() {
this.trigger('progress');
};
/**
* Fired when the end of the media resource is reached (currentTime == duration)
*
* @private
* @method handleTechEnded_
*/
Player.prototype.handleTechEnded_ = function handleTechEnded_() {
this.addClass('vjs-ended');
if (this.options_.loop) {
this.currentTime(0);
this.play();
} else if (!this.paused()) {
this.pause();
}
this.trigger('ended');
};
/**
* Fired when the duration of the media resource is first known or changed
*
* @private
* @method handleTechDurationChange_
*/
Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {
this.duration(this.techGet_('duration'));
};
/**
* Handle a click on the media element to play/pause
*
* @param {Object=} event Event object
* @private
* @method handleTechClick_
*/
Player.prototype.handleTechClick_ = function handleTechClick_(event) {
// We're using mousedown to detect clicks thanks to Flash, but mousedown
// will also be triggered with right-clicks, so we need to prevent that
if (event.button !== 0) return;
// When controls are disabled a click should not toggle playback because
// the click is considered a control
if (this.controls()) {
if (this.paused()) {
this.play();
} else {
this.pause();
}
}
};
/**
* Handle a tap on the media element. It will toggle the user
* activity state, which hides and shows the controls.
*
* @private
* @method handleTechTap_
*/
Player.prototype.handleTechTap_ = function handleTechTap_() {
this.userActive(!this.userActive());
};
/**
* Handle touch to start
*
* @private
* @method handleTechTouchStart_
*/
Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {
this.userWasActive = this.userActive();
};
/**
* Handle touch to move
*
* @private
* @method handleTechTouchMove_
*/
Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {
if (this.userWasActive) {
this.reportUserActivity();
}
};
/**
* Handle touch to end
*
* @private
* @method handleTechTouchEnd_
*/
Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {
// Stop the mouse events from also happening
event.preventDefault();
};
/**
* Fired when the player switches in or out of fullscreen mode
*
* @private
* @method handleFullscreenChange_
*/
Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {
if (this.isFullscreen()) {
this.addClass('vjs-fullscreen');
} else {
this.removeClass('vjs-fullscreen');
}
};
/**
* native click events on the SWF aren't triggered on IE11, Win8.1RT
* use stageclick events triggered from inside the SWF instead
*
* @private
* @method handleStageClick_
*/
Player.prototype.handleStageClick_ = function handleStageClick_() {
this.reportUserActivity();
};
/**
* Handle Tech Fullscreen Change
*
* @private
* @method handleTechFullscreenChange_
*/
Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {
if (data) {
this.isFullscreen(data.isFullscreen);
}
this.trigger('fullscreenchange');
};
/**
* Fires when an error occurred during the loading of an audio/video
*
* @private
* @method handleTechError_
*/
Player.prototype.handleTechError_ = function handleTechError_() {
var error = this.tech_.error();
this.error(error && error.code);
};
/**
* Fires when the browser is intentionally not getting media data
*
* @private
* @method handleTechSuspend_
*/
Player.prototype.handleTechSuspend_ = function handleTechSuspend_() {
this.trigger('suspend');
};
/**
* Fires when the loading of an audio/video is aborted
*
* @private
* @method handleTechAbort_
*/
Player.prototype.handleTechAbort_ = function handleTechAbort_() {
this.trigger('abort');
};
/**
* Fires when the current playlist is empty
*
* @private
* @method handleTechEmptied_
*/
Player.prototype.handleTechEmptied_ = function handleTechEmptied_() {
this.trigger('emptied');
};
/**
* Fires when the browser is trying to get media data, but data is not available
*
* @private
* @method handleTechStalled_
*/
Player.prototype.handleTechStalled_ = function handleTechStalled_() {
this.trigger('stalled');
};
/**
* Fires when the browser has loaded meta data for the audio/video
*
* @private
* @method handleTechLoadedMetaData_
*/
Player.prototype.handleTechLoadedMetaData_ = function handleTechLoadedMetaData_() {
this.trigger('loadedmetadata');
};
/**
* Fires when the browser has loaded the current frame of the audio/video
*
* @private
* @method handleTechLoadedData_
*/
Player.prototype.handleTechLoadedData_ = function handleTechLoadedData_() {
this.trigger('loadeddata');
};
/**
* Fires when the current playback position has changed
*
* @private
* @method handleTechTimeUpdate_
*/
Player.prototype.handleTechTimeUpdate_ = function handleTechTimeUpdate_() {
this.trigger('timeupdate');
};
/**
* Fires when the playing speed of the audio/video is changed
*
* @private
* @method handleTechRateChange_
*/
Player.prototype.handleTechRateChange_ = function handleTechRateChange_() {
this.trigger('ratechange');
};
/**
* Fires when the volume has been changed
*
* @private
* @method handleTechVolumeChange_
*/
Player.prototype.handleTechVolumeChange_ = function handleTechVolumeChange_() {
this.trigger('volumechange');
};
/**
* Fires when the text track has been changed
*
* @private
* @method handleTechTextTrackChange_
*/
Player.prototype.handleTechTextTrackChange_ = function handleTechTextTrackChange_() {
this.trigger('texttrackchange');
};
/**
* Get object for cached values.
*
* @return {Object}
* @method getCache
*/
Player.prototype.getCache = function getCache() {
return this.cache_;
};
/**
* Pass values to the playback tech
*
* @param {String=} method Method
* @param {Object=} arg Argument
* @private
* @method techCall_
*/
Player.prototype.techCall_ = function techCall_(method, arg) {
// If it's not ready yet, call method when it is
if (this.tech_ && !this.tech_.isReady_) {
this.tech_.ready(function () {
this[method](arg);
}, true);
// Otherwise call method now
} else {
try {
this.tech_[method](arg);
} catch (e) {
_utilsLogJs2['default'](e);
throw e;
}
}
};
/**
* Get calls can't wait for the tech, and sometimes don't need to.
*
* @param {String} method Tech method
* @return {Method}
* @private
* @method techGet_
*/
Player.prototype.techGet_ = function techGet_(method) {
if (this.tech_ && this.tech_.isReady_) {
// Flash likes to die and reload when you hide or reposition it.
// In these cases the object methods go away and we get errors.
// When that happens we'll catch the errors and inform tech that it's not ready any more.
try {
return this.tech_[method]();
} catch (e) {
// When building additional tech libs, an expected method may not be defined yet
if (this.tech_[method] === undefined) {
_utilsLogJs2['default']('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);
} else {
// When a method isn't available on the object it throws a TypeError
if (e.name === 'TypeError') {
_utilsLogJs2['default']('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);
this.tech_.isReady_ = false;
} else {
_utilsLogJs2['default'](e);
}
}
throw e;
}
}
return;
};
/**
* start media playback
* ```js
* myPlayer.play();
* ```
*
* @return {Player} self
* @method play
*/
Player.prototype.play = function play() {
this.techCall_('play');
return this;
};
/**
* Pause the video playback
* ```js
* myPlayer.pause();
* ```
*
* @return {Player} self
* @method pause
*/
Player.prototype.pause = function pause() {
this.techCall_('pause');
return this;
};
/**
* Check if the player is paused
* ```js
* var isPaused = myPlayer.paused();
* var isPlaying = !myPlayer.paused();
* ```
*
* @return {Boolean} false if the media is currently playing, or true otherwise
* @method paused
*/
Player.prototype.paused = function paused() {
// The initial state of paused should be true (in Safari it's actually false)
return this.techGet_('paused') === false ? false : true;
};
/**
* Returns whether or not the user is "scrubbing". Scrubbing is when the user
* has clicked the progress bar handle and is dragging it along the progress bar.
*
* @param {Boolean} isScrubbing True/false the user is scrubbing
* @return {Boolean} The scrubbing status when getting
* @return {Object} The player when setting
* @method scrubbing
*/
Player.prototype.scrubbing = function scrubbing(isScrubbing) {
if (isScrubbing !== undefined) {
this.scrubbing_ = !!isScrubbing;
if (isScrubbing) {
this.addClass('vjs-scrubbing');
} else {
this.removeClass('vjs-scrubbing');
}
return this;
}
return this.scrubbing_;
};
/**
* Get or set the current time (in seconds)
* ```js
* // get
* var whereYouAt = myPlayer.currentTime();
* // set
* myPlayer.currentTime(120); // 2 minutes into the video
* ```
*
* @param {Number|String=} seconds The time to seek to
* @return {Number} The time in seconds, when not setting
* @return {Player} self, when the current time is set
* @method currentTime
*/
Player.prototype.currentTime = function currentTime(seconds) {
if (seconds !== undefined) {
this.techCall_('setCurrentTime', seconds);
return this;
}
// cache last currentTime and return. default to 0 seconds
//
// Caching the currentTime is meant to prevent a massive amount of reads on the tech's
// currentTime when scrubbing, but may not provide much performance benefit afterall.
// Should be tested. Also something has to read the actual current time or the cache will
// never get updated.
return this.cache_.currentTime = this.techGet_('currentTime') || 0;
};
/**
* Get the length in time of the video in seconds
* ```js
* var lengthOfVideo = myPlayer.duration();
* ```
* **NOTE**: The video must have started loading before the duration can be
* known, and in the case of Flash, may not be known until the video starts
* playing.
*
* @param {Number} seconds Duration when setting
* @return {Number} The duration of the video in seconds when getting
* @method duration
*/
Player.prototype.duration = function duration(seconds) {
if (seconds === undefined) {
return this.cache_.duration || 0;
}
seconds = parseFloat(seconds) || 0;
// Standardize on Inifity for signaling video is live
if (seconds < 0) {
seconds = Infinity;
}
if (seconds !== this.cache_.duration) {
// Cache the last set value for optimized scrubbing (esp. Flash)
this.cache_.duration = seconds;
if (seconds === Infinity) {
this.addClass('vjs-live');
} else {
this.removeClass('vjs-live');
}
this.trigger('durationchange');
}
return this;
};
/**
* Calculates how much time is left.
* ```js
* var timeLeft = myPlayer.remainingTime();
* ```
* Not a native video element function, but useful
*
* @return {Number} The time remaining in seconds
* @method remainingTime
*/
Player.prototype.remainingTime = function remainingTime() {
return this.duration() - this.currentTime();
};
// http://dev.w3.org/html5/spec/video.html#dom-media-buffered
// Buffered returns a timerange object.
// Kind of like an array of portions of the video that have been downloaded.
/**
* Get a TimeRange object with the times of the video that have been downloaded
* If you just want the percent of the video that's been downloaded,
* use bufferedPercent.
* ```js
* // Number of different ranges of time have been buffered. Usually 1.
* numberOfRanges = bufferedTimeRange.length,
* // Time in seconds when the first range starts. Usually 0.
* firstRangeStart = bufferedTimeRange.start(0),
* // Time in seconds when the first range ends
* firstRangeEnd = bufferedTimeRange.end(0),
* // Length in seconds of the first time range
* firstRangeLength = firstRangeEnd - firstRangeStart;
* ```
*
* @return {Object} A mock TimeRange object (following HTML spec)
* @method buffered
*/
Player.prototype.buffered = function buffered() {
var buffered = this.techGet_('buffered');
if (!buffered || !buffered.length) {
buffered = _utilsTimeRangesJs.createTimeRange(0, 0);
}
return buffered;
};
/**
* Get the percent (as a decimal) of the video that's been downloaded
* ```js
* var howMuchIsDownloaded = myPlayer.bufferedPercent();
* ```
* 0 means none, 1 means all.
* (This method isn't in the HTML5 spec, but it's very convenient)
*
* @return {Number} A decimal between 0 and 1 representing the percent
* @method bufferedPercent
*/
Player.prototype.bufferedPercent = function bufferedPercent() {
return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration());
};
/**
* Get the ending time of the last buffered time range
* This is used in the progress bar to encapsulate all time ranges.
*
* @return {Number} The end of the last buffered time range
* @method bufferedEnd
*/
Player.prototype.bufferedEnd = function bufferedEnd() {
var buffered = this.buffered(),
duration = this.duration(),
end = buffered.end(buffered.length - 1);
if (end > duration) {
end = duration;
}
return end;
};
/**
* Get or set the current volume of the media
* ```js
* // get
* var howLoudIsIt = myPlayer.volume();
* // set
* myPlayer.volume(0.5); // Set volume to half
* ```
* 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
*
* @param {Number} percentAsDecimal The new volume as a decimal percent
* @return {Number} The current volume when getting
* @return {Player} self when setting
* @method volume
*/
Player.prototype.volume = function volume(percentAsDecimal) {
var vol = undefined;
if (percentAsDecimal !== undefined) {
vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
this.cache_.volume = vol;
this.techCall_('setVolume', vol);
return this;
}
// Default to 1 when returning current volume.
vol = parseFloat(this.techGet_('volume'));
return isNaN(vol) ? 1 : vol;
};
/**
* Get the current muted state, or turn mute on or off
* ```js
* // get
* var isVolumeMuted = myPlayer.muted();
* // set
* myPlayer.muted(true); // mute the volume
* ```
*
* @param {Boolean=} muted True to mute, false to unmute
* @return {Boolean} True if mute is on, false if not when getting
* @return {Player} self when setting mute
* @method muted
*/
Player.prototype.muted = function muted(_muted) {
if (_muted !== undefined) {
this.techCall_('setMuted', _muted);
return this;
}
return this.techGet_('muted') || false; // Default to false
};
// Check if current tech can support native fullscreen
// (e.g. with built in controls like iOS, so not our flash swf)
/**
* Check to see if fullscreen is supported
*
* @return {Boolean}
* @method supportsFullScreen
*/
Player.prototype.supportsFullScreen = function supportsFullScreen() {
return this.techGet_('supportsFullScreen') || false;
};
/**
* Check if the player is in fullscreen mode
* ```js
* // get
* var fullscreenOrNot = myPlayer.isFullscreen();
* // set
* myPlayer.isFullscreen(true); // tell the player it's in fullscreen
* ```
* NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official
* property and instead document.fullscreenElement is used. But isFullscreen is
* still a valuable property for internal player workings.
*
* @param {Boolean=} isFS Update the player's fullscreen state
* @return {Boolean} true if fullscreen false if not when getting
* @return {Player} self when setting
* @method isFullscreen
*/
Player.prototype.isFullscreen = function isFullscreen(isFS) {
if (isFS !== undefined) {
this.isFullscreen_ = !!isFS;
return this;
}
return !!this.isFullscreen_;
};
/**
* Increase the size of the video to full screen
* ```js
* myPlayer.requestFullscreen();
* ```
* In some browsers, full screen is not supported natively, so it enters
* "full window mode", where the video fills the browser window.
* In browsers and devices that support native full screen, sometimes the
* browser's default controls will be shown, and not the Video.js custom skin.
* This includes most mobile devices (iOS, Android) and older versions of
* Safari.
*
* @return {Player} self
* @method requestFullscreen
*/
Player.prototype.requestFullscreen = function requestFullscreen() {
var fsApi = _fullscreenApiJs2['default'];
this.isFullscreen(true);
if (fsApi.requestFullscreen) {
// the browser supports going fullscreen at the element level so we can
// take the controls fullscreen as well as the video
// Trigger fullscreenchange event after change
// We have to specifically add this each time, and remove
// when canceling fullscreen. Otherwise if there's multiple
// players on a page, they would all be reacting to the same fullscreen
// events
Events.on(_globalDocument2['default'], fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e) {
this.isFullscreen(_globalDocument2['default'][fsApi.fullscreenElement]);
// If cancelling fullscreen, remove event listener.
if (this.isFullscreen() === false) {
Events.off(_globalDocument2['default'], fsApi.fullscreenchange, documentFullscreenChange);
}
this.trigger('fullscreenchange');
}));
this.el_[fsApi.requestFullscreen]();
} else if (this.tech_.supportsFullScreen()) {
// we can't take the video.js controls fullscreen but we can go fullscreen
// with native controls
this.techCall_('enterFullScreen');
} else {
// fullscreen isn't supported so we'll just stretch the video element to
// fill the viewport
this.enterFullWindow();
this.trigger('fullscreenchange');
}
return this;
};
/**
* Return the video to its normal size after having been in full screen mode
* ```js
* myPlayer.exitFullscreen();
* ```
*
* @return {Player} self
* @method exitFullscreen
*/
Player.prototype.exitFullscreen = function exitFullscreen() {
var fsApi = _fullscreenApiJs2['default'];
this.isFullscreen(false);
// Check for browser element fullscreen support
if (fsApi.requestFullscreen) {
_globalDocument2['default'][fsApi.exitFullscreen]();
} else if (this.tech_.supportsFullScreen()) {
this.techCall_('exitFullScreen');
} else {
this.exitFullWindow();
this.trigger('fullscreenchange');
}
return this;
};
/**
* When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
*
* @method enterFullWindow
*/
Player.prototype.enterFullWindow = function enterFullWindow() {
this.isFullWindow = true;
// Storing original doc overflow value to return to when fullscreen is off
this.docOrigOverflow = _globalDocument2['default'].documentElement.style.overflow;
// Add listener for esc key to exit fullscreen
Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.fullWindowOnEscKey));
// Hide any scroll bars
_globalDocument2['default'].documentElement.style.overflow = 'hidden';
// Apply fullscreen styles
Dom.addElClass(_globalDocument2['default'].body, 'vjs-full-window');
this.trigger('enterFullWindow');
};
/**
* Check for call to either exit full window or full screen on ESC key
*
* @param {String} event Event to check for key press
* @method fullWindowOnEscKey
*/
Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {
if (event.keyCode === 27) {
if (this.isFullscreen() === true) {
this.exitFullscreen();
} else {
this.exitFullWindow();
}
}
};
/**
* Exit full window
*
* @method exitFullWindow
*/
Player.prototype.exitFullWindow = function exitFullWindow() {
this.isFullWindow = false;
Events.off(_globalDocument2['default'], 'keydown', this.fullWindowOnEscKey);
// Unhide scroll bars.
_globalDocument2['default'].documentElement.style.overflow = this.docOrigOverflow;
// Remove fullscreen styles
Dom.removeElClass(_globalDocument2['default'].body, 'vjs-full-window');
// Resize the box, controller, and poster to original sizes
// this.positionAll();
this.trigger('exitFullWindow');
};
/**
* Check whether the player can play a given mimetype
*
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
* @method canPlayType
*/
Player.prototype.canPlayType = function canPlayType(type) {
var can = undefined;
// Loop through each playback technology in the options order
for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {
var techName = _utilsToTitleCaseJs2['default'](j[i]);
var tech = _techTechJs2['default'].getTech(techName);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!tech) {
tech = _componentJs2['default'].getComponent(techName);
}
// Check if the current tech is defined before continuing
if (!tech) {
_utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.');
continue;
}
// Check if the browser supports this technology
if (tech.isSupported()) {
can = tech.canPlayType(type);
if (can) {
return can;
}
}
}
return '';
};
/**
* Select source based on tech-order or source-order
* Uses source-order selection if `options.sourceOrder` is truthy. Otherwise,
* defaults to tech-order selection
*
* @param {Array} sources The sources for a media asset
* @return {Object|Boolean} Object of source and tech order, otherwise false
* @method selectSource
*/
Player.prototype.selectSource = function selectSource(sources) {
// Get only the techs specified in `techOrder` that exist and are supported by the
// current platform
var techs = this.options_.techOrder.map(_utilsToTitleCaseJs2['default']).map(function (techName) {
// `Component.getComponent(...)` is for support of old behavior of techs
// being registered as components.
// Remove once that deprecated behavior is removed.
return [techName, _techTechJs2['default'].getTech(techName) || _componentJs2['default'].getComponent(techName)];
}).filter(function (_ref) {
var techName = _ref[0];
var tech = _ref[1];
// Check if the current tech is defined before continuing
if (tech) {
// Check if the browser supports this technology
return tech.isSupported();
}
_utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.');
return false;
});
// Iterate over each `innerArray` element once per `outerArray` element and execute
// `tester` with both. If `tester` returns a non-falsy value, exit early and return
// that value.
var findFirstPassingTechSourcePair = function findFirstPassingTechSourcePair(outerArray, innerArray, tester) {
var found = undefined;
outerArray.some(function (outerChoice) {
return innerArray.some(function (innerChoice) {
found = tester(outerChoice, innerChoice);
if (found) {
return true;
}
});
});
return found;
};
var foundSourceAndTech = undefined;
var flip = function flip(fn) {
return function (a, b) {
return fn(b, a);
};
};
var finder = function finder(_ref2, source) {
var techName = _ref2[0];
var tech = _ref2[1];
if (tech.canPlaySource(source)) {
return { source: source, tech: techName };
}
};
// Depending on the truthiness of `options.sourceOrder`, we swap the order of techs and sources
// to select from them based on their priority.
if (this.options_.sourceOrder) {
// Source-first ordering
foundSourceAndTech = findFirstPassingTechSourcePair(sources, techs, flip(finder));
} else {
// Tech-first ordering
foundSourceAndTech = findFirstPassingTechSourcePair(techs, sources, finder);
}
return foundSourceAndTech || false;
};
/**
* The source function updates the video source
* There are three types of variables you can pass as the argument.
* **URL String**: A URL to the the video file. Use this method if you are sure
* the current playback technology (HTML5/Flash) can support the source you
* provide. Currently only MP4 files can be used in both HTML5 and Flash.
* ```js
* myPlayer.src("http://www.example.com/path/to/video.mp4");
* ```
* **Source Object (or element):* * A javascript object containing information
* about the source file. Use this method if you want the player to determine if
* it can support the file using the type information.
* ```js
* myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
* ```
* **Array of Source Objects:* * To provide multiple versions of the source so
* that it can be played using HTML5 across browsers you can use an array of
* source objects. Video.js will detect which version is supported and load that
* file.
* ```js
* myPlayer.src([
* { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
* { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
* { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
* ]);
* ```
*
* @param {String|Object|Array=} source The source URL, object, or array of sources
* @return {String} The current video source when getting
* @return {String} The player when setting
* @method src
*/
Player.prototype.src = function src(source) {
if (source === undefined) {
return this.techGet_('src');
}
var currentTech = _techTechJs2['default'].getTech(this.techName_);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!currentTech) {
currentTech = _componentJs2['default'].getComponent(this.techName_);
}
// case: Array of source objects to choose from and pick the best to play
if (Array.isArray(source)) {
this.sourceList_(source);
// case: URL String (http://myvideo...)
} else if (typeof source === 'string') {
// create a source object from the string
this.src({ src: source });
// case: Source object { src: '', type: '' ... }
} else if (source instanceof Object) {
// check if the source has a type and the loaded tech cannot play the source
// if there's no type we'll just try the current tech
if (source.type && !currentTech.canPlaySource(source)) {
// create a source list with the current source and send through
// the tech loop to check for a compatible technology
this.sourceList_([source]);
} else {
this.cache_.src = source.src;
this.currentType_ = source.type || '';
// wait until the tech is ready to set the source
this.ready(function () {
// The setSource tech method was added with source handlers
// so older techs won't support it
// We need to check the direct prototype for the case where subclasses
// of the tech do not support source handlers
if (currentTech.prototype.hasOwnProperty('setSource')) {
this.techCall_('setSource', source);
} else {
this.techCall_('src', source.src);
}
if (this.options_.preload === 'auto') {
this.load();
}
if (this.options_.autoplay) {
this.play();
}
// Set the source synchronously if possible (#2326)
}, true);
}
}
return this;
};
/**
* Handle an array of source objects
*
* @param {Array} sources Array of source objects
* @private
* @method sourceList_
*/
Player.prototype.sourceList_ = function sourceList_(sources) {
var sourceTech = this.selectSource(sources);
if (sourceTech) {
if (sourceTech.tech === this.techName_) {
// if this technology is already loaded, set the source
this.src(sourceTech.source);
} else {
// load this technology with the chosen source
this.loadTech_(sourceTech.tech, sourceTech.source);
}
} else {
// We need to wrap this in a timeout to give folks a chance to add error event handlers
this.setTimeout(function () {
this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });
}, 0);
// we could not find an appropriate tech, but let's still notify the delegate that this is it
// this needs a better comment about why this is needed
this.triggerReady();
}
};
/**
* Begin loading the src data.
*
* @return {Player} Returns the player
* @method load
*/
Player.prototype.load = function load() {
this.techCall_('load');
return this;
};
/**
* Reset the player. Loads the first tech in the techOrder,
* and calls `reset` on the tech`.
*
* @return {Player} Returns the player
* @method reset
*/
Player.prototype.reset = function reset() {
this.loadTech_(_utilsToTitleCaseJs2['default'](this.options_.techOrder[0]), null);
this.techCall_('reset');
return this;
};
/**
* Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4
* Can be used in conjuction with `currentType` to assist in rebuilding the current source object.
*
* @return {String} The current source
* @method currentSrc
*/
Player.prototype.currentSrc = function currentSrc() {
return this.techGet_('currentSrc') || this.cache_.src || '';
};
/**
* Get the current source type e.g. video/mp4
* This can allow you rebuild the current source object so that you could load the same
* source and tech later
*
* @return {String} The source MIME type
* @method currentType
*/
Player.prototype.currentType = function currentType() {
return this.currentType_ || '';
};
/**
* Get or set the preload attribute
*
* @param {Boolean} value Boolean to determine if preload should be used
* @return {String} The preload attribute value when getting
* @return {Player} Returns the player when setting
* @method preload
*/
Player.prototype.preload = function preload(value) {
if (value !== undefined) {
this.techCall_('setPreload', value);
this.options_.preload = value;
return this;
}
return this.techGet_('preload');
};
/**
* Get or set the autoplay attribute.
*
* @param {Boolean} value Boolean to determine if preload should be used
* @return {String} The autoplay attribute value when getting
* @return {Player} Returns the player when setting
* @method autoplay
*/
Player.prototype.autoplay = function autoplay(value) {
if (value !== undefined) {
this.techCall_('setAutoplay', value);
this.options_.autoplay = value;
return this;
}
return this.techGet_('autoplay', value);
};
/**
* Get or set the loop attribute on the video element.
*
* @param {Boolean} value Boolean to determine if preload should be used
* @return {String} The loop attribute value when getting
* @return {Player} Returns the player when setting
* @method loop
*/
Player.prototype.loop = function loop(value) {
if (value !== undefined) {
this.techCall_('setLoop', value);
this.options_['loop'] = value;
return this;
}
return this.techGet_('loop');
};
/**
* Get or set the poster image source url
*
* ##### EXAMPLE:
* ```js
* // get
* var currentPoster = myPlayer.poster();
* // set
* myPlayer.poster('http://example.com/myImage.jpg');
* ```
*
* @param {String=} src Poster image source URL
* @return {String} poster URL when getting
* @return {Player} self when setting
* @method poster
*/
Player.prototype.poster = function poster(src) {
if (src === undefined) {
return this.poster_;
}
// The correct way to remove a poster is to set as an empty string
// other falsey values will throw errors
if (!src) {
src = '';
}
// update the internal poster variable
this.poster_ = src;
// update the tech's poster
this.techCall_('setPoster', src);
// alert components that the poster has been set
this.trigger('posterchange');
return this;
};
/**
* Some techs (e.g. YouTube) can provide a poster source in an
* asynchronous way. We want the poster component to use this
* poster source so that it covers up the tech's controls.
* (YouTube's play button). However we only want to use this
* soruce if the player user hasn't set a poster through
* the normal APIs.
*
* @private
* @method handleTechPosterChange_
*/
Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {
if (!this.poster_ && this.tech_ && this.tech_.poster) {
this.poster_ = this.tech_.poster() || '';
// Let components know the poster has changed
this.trigger('posterchange');
}
};
/**
* Get or set whether or not the controls are showing.
*
* @param {Boolean} bool Set controls to showing or not
* @return {Boolean} Controls are showing
* @method controls
*/
Player.prototype.controls = function controls(bool) {
if (bool !== undefined) {
bool = !!bool; // force boolean
// Don't trigger a change event unless it actually changed
if (this.controls_ !== bool) {
this.controls_ = bool;
if (this.usingNativeControls()) {
this.techCall_('setControls', bool);
}
if (bool) {
this.removeClass('vjs-controls-disabled');
this.addClass('vjs-controls-enabled');
this.trigger('controlsenabled');
if (!this.usingNativeControls()) {
this.addTechControlsListeners_();
}
} else {
this.removeClass('vjs-controls-enabled');
this.addClass('vjs-controls-disabled');
this.trigger('controlsdisabled');
if (!this.usingNativeControls()) {
this.removeTechControlsListeners_();
}
}
}
return this;
}
return !!this.controls_;
};
/**
* Toggle native controls on/off. Native controls are the controls built into
* devices (e.g. default iPhone controls), Flash, or other techs
* (e.g. Vimeo Controls)
* **This should only be set by the current tech, because only the tech knows
* if it can support native controls**
*
* @param {Boolean} bool True signals that native controls are on
* @return {Player} Returns the player
* @private
* @method usingNativeControls
*/
Player.prototype.usingNativeControls = function usingNativeControls(bool) {
if (bool !== undefined) {
bool = !!bool; // force boolean
// Don't trigger a change event unless it actually changed
if (this.usingNativeControls_ !== bool) {
this.usingNativeControls_ = bool;
if (bool) {
this.addClass('vjs-using-native-controls');
/**
* player is using the native device controls
*
* @event usingnativecontrols
* @memberof Player
* @instance
* @private
*/
this.trigger('usingnativecontrols');
} else {
this.removeClass('vjs-using-native-controls');
/**
* player is using the custom HTML controls
*
* @event usingcustomcontrols
* @memberof Player
* @instance
* @private
*/
this.trigger('usingcustomcontrols');
}
}
return this;
}
return !!this.usingNativeControls_;
};
/**
* Set or get the current MediaError
*
* @param {*} err A MediaError or a String/Number to be turned into a MediaError
* @return {MediaError|null} when getting
* @return {Player} when setting
* @method error
*/
Player.prototype.error = function error(err) {
if (err === undefined) {
return this.error_ || null;
}
// restoring to default
if (err === null) {
this.error_ = err;
this.removeClass('vjs-error');
this.errorDisplay.close();
return this;
}
// error instance
if (err instanceof _mediaErrorJs2['default']) {
this.error_ = err;
} else {
this.error_ = new _mediaErrorJs2['default'](err);
}
// add the vjs-error classname to the player
this.addClass('vjs-error');
// log the name of the error type and any message
// ie8 just logs "[object object]" if you just log the error object
_utilsLogJs2['default'].error('(CODE:' + this.error_.code + ' ' + _mediaErrorJs2['default'].errorTypes[this.error_.code] + ')', this.error_.message, this.error_);
// fire an error event on the player
this.trigger('error');
return this;
};
/**
* Returns whether or not the player is in the "ended" state.
*
* @return {Boolean} True if the player is in the ended state, false if not.
* @method ended
*/
Player.prototype.ended = function ended() {
return this.techGet_('ended');
};
/**
* Returns whether or not the player is in the "seeking" state.
*
* @return {Boolean} True if the player is in the seeking state, false if not.
* @method seeking
*/
Player.prototype.seeking = function seeking() {
return this.techGet_('seeking');
};
/**
* Returns the TimeRanges of the media that are currently available
* for seeking to.
*
* @return {TimeRanges} the seekable intervals of the media timeline
* @method seekable
*/
Player.prototype.seekable = function seekable() {
return this.techGet_('seekable');
};
/**
* Report user activity
*
* @param {Object} event Event object
* @method reportUserActivity
*/
Player.prototype.reportUserActivity = function reportUserActivity(event) {
this.userActivity_ = true;
};
/**
* Get/set if user is active
*
* @param {Boolean} bool Value when setting
* @return {Boolean} Value if user is active user when getting
* @method userActive
*/
Player.prototype.userActive = function userActive(bool) {
if (bool !== undefined) {
bool = !!bool;
if (bool !== this.userActive_) {
this.userActive_ = bool;
if (bool) {
// If the user was inactive and is now active we want to reset the
// inactivity timer
this.userActivity_ = true;
this.removeClass('vjs-user-inactive');
this.addClass('vjs-user-active');
this.trigger('useractive');
} else {
// We're switching the state to inactive manually, so erase any other
// activity
this.userActivity_ = false;
// Chrome/Safari/IE have bugs where when you change the cursor it can
// trigger a mousemove event. This causes an issue when you're hiding
// the cursor when the user is inactive, and a mousemove signals user
// activity. Making it impossible to go into inactive mode. Specifically
// this happens in fullscreen when we really need to hide the cursor.
//
// When this gets resolved in ALL browsers it can be removed
// https://code.google.com/p/chromium/issues/detail?id=103041
if (this.tech_) {
this.tech_.one('mousemove', function (e) {
e.stopPropagation();
e.preventDefault();
});
}
this.removeClass('vjs-user-active');
this.addClass('vjs-user-inactive');
this.trigger('userinactive');
}
}
return this;
}
return this.userActive_;
};
/**
* Listen for user activity based on timeout value
*
* @private
* @method listenForUserActivity_
*/
Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {
var mouseInProgress = undefined,
lastMoveX = undefined,
lastMoveY = undefined;
var handleActivity = Fn.bind(this, this.reportUserActivity);
var handleMouseMove = function handleMouseMove(e) {
// #1068 - Prevent mousemove spamming
// Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970
if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {
lastMoveX = e.screenX;
lastMoveY = e.screenY;
handleActivity();
}
};
var handleMouseDown = function handleMouseDown() {
handleActivity();
// For as long as the they are touching the device or have their mouse down,
// we consider them active even if they're not moving their finger or mouse.
// So we want to continue to update that they are active
this.clearInterval(mouseInProgress);
// Setting userActivity=true now and setting the interval to the same time
// as the activityCheck interval (250) should ensure we never miss the
// next activityCheck
mouseInProgress = this.setInterval(handleActivity, 250);
};
var handleMouseUp = function handleMouseUp(event) {
handleActivity();
// Stop the interval that maintains activity if the mouse/touch is down
this.clearInterval(mouseInProgress);
};
// Any mouse movement will be considered user activity
this.on('mousedown', handleMouseDown);
this.on('mousemove', handleMouseMove);
this.on('mouseup', handleMouseUp);
// Listen for keyboard navigation
// Shouldn't need to use inProgress interval because of key repeat
this.on('keydown', handleActivity);
this.on('keyup', handleActivity);
// Run an interval every 250 milliseconds instead of stuffing everything into
// the mousemove/touchmove function itself, to prevent performance degradation.
// `this.reportUserActivity` simply sets this.userActivity_ to true, which
// then gets picked up by this loop
// http://ejohn.org/blog/learning-from-twitter/
var inactivityTimeout = undefined;
var activityCheck = this.setInterval(function () {
// Check to see if mouse/touch activity has happened
if (this.userActivity_) {
// Reset the activity tracker
this.userActivity_ = false;
// If the user state was inactive, set the state to active
this.userActive(true);
// Clear any existing inactivity timeout to start the timer over
this.clearTimeout(inactivityTimeout);
var timeout = this.options_['inactivityTimeout'];
if (timeout > 0) {
// In <timeout> milliseconds, if no more activity has occurred the
// user will be considered inactive
inactivityTimeout = this.setTimeout(function () {
// Protect against the case where the inactivityTimeout can trigger just
// before the next user activity is picked up by the activityCheck loop
// causing a flicker
if (!this.userActivity_) {
this.userActive(false);
}
}, timeout);
}
}
}, 250);
};
/**
* Gets or sets the current playback rate. A playback rate of
* 1.0 represents normal speed and 0.5 would indicate half-speed
* playback, for instance.
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate
*
* @param {Number} rate New playback rate to set.
* @return {Number} Returns the new playback rate when setting
* @return {Number} Returns the current playback rate when getting
* @method playbackRate
*/
Player.prototype.playbackRate = function playbackRate(rate) {
if (rate !== undefined) {
this.techCall_('setPlaybackRate', rate);
return this;
}
if (this.tech_ && this.tech_['featuresPlaybackRate']) {
return this.techGet_('playbackRate');
} else {
return 1.0;
}
};
/**
* Gets or sets the audio flag
*
* @param {Boolean} bool True signals that this is an audio player.
* @return {Boolean} Returns true if player is audio, false if not when getting
* @return {Player} Returns the player if setting
* @private
* @method isAudio
*/
Player.prototype.isAudio = function isAudio(bool) {
if (bool !== undefined) {
this.isAudio_ = !!bool;
return this;
}
return !!this.isAudio_;
};
/**
* Returns the current state of network activity for the element, from
* the codes in the list below.
* - NETWORK_EMPTY (numeric value 0)
* The element has not yet been initialised. All attributes are in
* their initial states.
* - NETWORK_IDLE (numeric value 1)
* The element's resource selection algorithm is active and has
* selected a resource, but it is not actually using the network at
* this time.
* - NETWORK_LOADING (numeric value 2)
* The user agent is actively trying to download data.
* - NETWORK_NO_SOURCE (numeric value 3)
* The element's resource selection algorithm is active, but it has
* not yet found a resource to use.
*
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states
* @return {Number} the current network activity state
* @method networkState
*/
Player.prototype.networkState = function networkState() {
return this.techGet_('networkState');
};
/**
* Returns a value that expresses the current state of the element
* with respect to rendering the current playback position, from the
* codes in the list below.
* - HAVE_NOTHING (numeric value 0)
* No information regarding the media resource is available.
* - HAVE_METADATA (numeric value 1)
* Enough of the resource has been obtained that the duration of the
* resource is available.
* - HAVE_CURRENT_DATA (numeric value 2)
* Data for the immediate current playback position is available.
* - HAVE_FUTURE_DATA (numeric value 3)
* Data for the immediate current playback position is available, as
* well as enough data for the user agent to advance the current
* playback position in the direction of playback.
* - HAVE_ENOUGH_DATA (numeric value 4)
* The user agent estimates that enough data is available for
* playback to proceed uninterrupted.
*
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate
* @return {Number} the current playback rendering state
* @method readyState
*/
Player.prototype.readyState = function readyState() {
return this.techGet_('readyState');
};
/*
* Text tracks are tracks of timed text events.
* Captions - text displayed over the video for the hearing impaired
* Subtitles - text displayed over the video for those who don't understand language in the video
* Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
* Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
*/
/**
* Get an array of associated text tracks. captions, subtitles, chapters, descriptions
* http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
*
* @return {Array} Array of track objects
* @method textTracks
*/
Player.prototype.textTracks = function textTracks() {
// cannot use techGet_ directly because it checks to see whether the tech is ready.
// Flash is unlikely to be ready in time but textTracks should still work.
return this.tech_ && this.tech_['textTracks']();
};
/**
* Get an array of remote text tracks
*
* @return {Array}
* @method remoteTextTracks
*/
Player.prototype.remoteTextTracks = function remoteTextTracks() {
return this.tech_ && this.tech_['remoteTextTracks']();
};
/**
* Get an array of remote html track elements
*
* @return {HTMLTrackElement[]}
* @method remoteTextTrackEls
*/
Player.prototype.remoteTextTrackEls = function remoteTextTrackEls() {
return this.tech_ && this.tech_['remoteTextTrackEls']();
};
/**
* Add a text track
* In addition to the W3C settings we allow adding additional info through options.
* http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
*
* @param {String} kind Captions, subtitles, chapters, descriptions, or metadata
* @param {String=} label Optional label
* @param {String=} language Optional language
* @method addTextTrack
*/
Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {
return this.tech_ && this.tech_['addTextTrack'](kind, label, language);
};
/**
* Add a remote text track
*
* @param {Object} options Options for remote text track
* @method addRemoteTextTrack
*/
Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
return this.tech_ && this.tech_['addRemoteTextTrack'](options);
};
/**
* Remove a remote text track
*
* @param {Object} track Remote text track to remove
* @method removeRemoteTextTrack
*/
Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
this.tech_ && this.tech_['removeRemoteTextTrack'](track);
};
/**
* Get video width
*
* @return {Number} Video width
* @method videoWidth
*/
Player.prototype.videoWidth = function videoWidth() {
return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;
};
/**
* Get video height
*
* @return {Number} Video height
* @method videoHeight
*/
Player.prototype.videoHeight = function videoHeight() {
return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;
};
// Methods to add support for
// initialTime: function(){ return this.techCall_('initialTime'); },
// startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },
// played: function(){ return this.techCall_('played'); },
// videoTracks: function(){ return this.techCall_('videoTracks'); },
// audioTracks: function(){ return this.techCall_('audioTracks'); },
// defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },
// defaultMuted: function(){ return this.techCall_('defaultMuted'); }
/**
* The player's language code
* NOTE: The language should be set in the player options if you want the
* the controls to be built with a specific language. Changing the lanugage
* later will not update controls text.
*
* @param {String} code The locale string
* @return {String} The locale string when getting
* @return {Player} self when setting
* @method language
*/
Player.prototype.language = function language(code) {
if (code === undefined) {
return this.language_;
}
this.language_ = ('' + code).toLowerCase();
return this;
};
/**
* Get the player's language dictionary
* Merge every time, because a newly added plugin might call videojs.addLanguage() at any time
* Languages specified directly in the player options have precedence
*
* @return {Array} Array of languages
* @method languages
*/
Player.prototype.languages = function languages() {
return _utilsMergeOptionsJs2['default'](Player.prototype.options_.languages, this.languages_);
};
/**
* Converts track info to JSON
*
* @return {Object} JSON object of options
* @method toJSON
*/
Player.prototype.toJSON = function toJSON() {
var options = _utilsMergeOptionsJs2['default'](this.options_);
var tracks = options.tracks;
options.tracks = [];
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
// deep merge tracks and null out player so no circular references
track = _utilsMergeOptionsJs2['default'](track);
track.player = undefined;
options.tracks[i] = track;
}
return options;
};
/**
* Creates a simple modal dialog (an instance of the `ModalDialog`
* component) that immediately overlays the player with arbitrary
* content and removes itself when closed.
*
* @param {String|Function|Element|Array|Null} content
* Same as `ModalDialog#content`'s param of the same name.
*
* The most straight-forward usage is to provide a string or DOM
* element.
*
* @param {Object} [options]
* Extra options which will be passed on to the `ModalDialog`.
*
* @return {ModalDialog}
*/
Player.prototype.createModal = function createModal(content, options) {
var player = this;
options = options || {};
options.content = content || '';
var modal = new _modalDialog2['default'](player, options);
player.addChild(modal);
modal.on('dispose', function () {
player.removeChild(modal);
});
return modal.open();
};
/**
* Gets tag settings
*
* @param {Element} tag The player tag
* @return {Array} An array of sources and track objects
* @static
* @method getTagSettings
*/
Player.getTagSettings = function getTagSettings(tag) {
var baseOptions = {
'sources': [],
'tracks': []
};
var tagOptions = Dom.getElAttributes(tag);
var dataSetup = tagOptions['data-setup'];
// Check if data-setup attr exists.
if (dataSetup !== null) {
// Parse options JSON
var _safeParseTuple = _safeJsonParseTuple2['default'](dataSetup || '{}');
var err = _safeParseTuple[0];
var data = _safeParseTuple[1];
if (err) {
_utilsLogJs2['default'].error(err);
}
_objectAssign2['default'](tagOptions, data);
}
_objectAssign2['default'](baseOptions, tagOptions);
// Get tag children settings
if (tag.hasChildNodes()) {
var children = tag.childNodes;
for (var i = 0, j = children.length; i < j; i++) {
var child = children[i];
// Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
var childName = child.nodeName.toLowerCase();
if (childName === 'source') {
baseOptions.sources.push(Dom.getElAttributes(child));
} else if (childName === 'track') {
baseOptions.tracks.push(Dom.getElAttributes(child));
}
}
}
return baseOptions;
};
return Player;
})(_componentJs2['default']);
Player.players = {};
var navigator = _globalWindow2['default'].navigator;
/*
* Player instance options, surfaced using options
* options = Player.prototype.options_
* Make changes in options, not here.
*
* @type {Object}
* @private
*/
Player.prototype.options_ = {
// Default order of fallback technology
techOrder: ['html5', 'flash'],
// techOrder: ['flash','html5'],
html5: {},
flash: {},
// defaultVolume: 0.85,
defaultVolume: 0.00, // The freakin seaguls are driving me crazy!
// default inactivity timeout
inactivityTimeout: 2000,
// default playback rates
playbackRates: [],
// Add playback rate selection by adding rates
// 'playbackRates': [0.5, 1, 1.5, 2],
// Included control sets
children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],
language: _globalDocument2['default'].getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',
// locales and their language translations
languages: {},
// Default message to show when a video cannot be played.
notSupportedMessage: 'No compatible source was found for this video.'
};
/**
* Fired when the player has initial duration and dimension information
*
* @event loadedmetadata
*/
Player.prototype.handleLoadedMetaData_;
/**
* Fired when the player has downloaded data at the current playback position
*
* @event loadeddata
*/
Player.prototype.handleLoadedData_;
/**
* Fired when the user is active, e.g. moves the mouse over the player
*
* @event useractive
*/
Player.prototype.handleUserActive_;
/**
* Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction
*
* @event userinactive
*/
Player.prototype.handleUserInactive_;
/**
* Fired when the current playback position has changed *
* During playback this is fired every 15-250 milliseconds, depending on the
* playback technology in use.
*
* @event timeupdate
*/
Player.prototype.handleTimeUpdate_;
/**
* Fired when video playback ends
*
* @event ended
*/
Player.prototype.handleTechEnded_;
/**
* Fired when the volume changes
*
* @event volumechange
*/
Player.prototype.handleVolumeChange_;
/**
* Fired when an error occurs
*
* @event error
*/
Player.prototype.handleError_;
Player.prototype.flexNotSupported_ = function () {
var elem = _globalDocument2['default'].createElement('i');
// Note: We don't actually use flexBasis (or flexOrder), but it's one of the more
// common flex features that we can rely on when checking for flex support.
return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style || 'msFlexOrder' in elem.style) /* IE10-specific (2012 flex spec) */;
};
_componentJs2['default'].registerComponent('Player', Player);
exports['default'] = Player;
module.exports = exports['default'];
// If empty string, make it a parsable json object.
},{"./big-play-button.js":62,"./component.js":65,"./control-bar/control-bar.js":66,"./error-display.js":96,"./fullscreen-api.js":99,"./loading-spinner.js":100,"./media-error.js":101,"./modal-dialog":105,"./poster-image.js":108,"./tech/html5.js":113,"./tech/loader.js":114,"./tech/tech.js":115,"./tracks/text-track-display.js":119,"./tracks/text-track-list-converter.js":121,"./tracks/text-track-settings.js":123,"./utils/browser.js":125,"./utils/buffer.js":126,"./utils/dom.js":128,"./utils/events.js":129,"./utils/fn.js":130,"./utils/guid.js":132,"./utils/log.js":133,"./utils/merge-options.js":134,"./utils/stylesheet.js":135,"./utils/time-ranges.js":136,"./utils/to-title-case.js":137,"global/document":1,"global/window":2,"object.assign":45,"safe-json-parse/tuple":53}],107:[function(_dereq_,module,exports){
/**
* @file plugins.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _playerJs = _dereq_('./player.js');
var _playerJs2 = _interopRequireDefault(_playerJs);
/**
* The method for registering a video.js plugin
*
* @param {String} name The name of the plugin
* @param {Function} init The function that is run when the player inits
* @method plugin
*/
var plugin = function plugin(name, init) {
_playerJs2['default'].prototype[name] = init;
};
exports['default'] = plugin;
module.exports = exports['default'];
},{"./player.js":106}],108:[function(_dereq_,module,exports){
/**
* @file poster-image.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('./button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('./component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsBrowserJs = _dereq_('./utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
/**
* The component that handles showing the poster image.
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class PosterImage
*/
var PosterImage = (function (_Button) {
_inherits(PosterImage, _Button);
function PosterImage(player, options) {
_classCallCheck(this, PosterImage);
_Button.call(this, player, options);
this.update();
player.on('posterchange', Fn.bind(this, this.update));
}
/**
* Clean up the poster image
*
* @method dispose
*/
PosterImage.prototype.dispose = function dispose() {
this.player().off('posterchange', this.update);
_Button.prototype.dispose.call(this);
};
/**
* Create the poster's image element
*
* @return {Element}
* @method createEl
*/
PosterImage.prototype.createEl = function createEl() {
var el = Dom.createEl('div', {
className: 'vjs-poster',
// Don't want poster to be tabbable.
tabIndex: -1
});
// To ensure the poster image resizes while maintaining its original aspect
// ratio, use a div with `background-size` when available. For browsers that
// do not support `background-size` (e.g. IE8), fall back on using a regular
// img element.
if (!browser.BACKGROUND_SIZE_SUPPORTED) {
this.fallbackImg_ = Dom.createEl('img');
el.appendChild(this.fallbackImg_);
}
return el;
};
/**
* Event handler for updates to the player's poster source
*
* @method update
*/
PosterImage.prototype.update = function update() {
var url = this.player().poster();
this.setSrc(url);
// If there's no poster source we should display:none on this component
// so it's not still clickable or right-clickable
if (url) {
this.show();
} else {
this.hide();
}
};
/**
* Set the poster source depending on the display method
*
* @param {String} url The URL to the poster source
* @method setSrc
*/
PosterImage.prototype.setSrc = function setSrc(url) {
if (this.fallbackImg_) {
this.fallbackImg_.src = url;
} else {
var backgroundImage = '';
// Any falsey values should stay as an empty string, otherwise
// this will throw an extra error
if (url) {
backgroundImage = 'url("' + url + '")';
}
this.el_.style.backgroundImage = backgroundImage;
}
};
/**
* Event handler for clicks on the poster image
*
* @method handleClick
*/
PosterImage.prototype.handleClick = function handleClick() {
// We don't want a click to trigger playback when controls are disabled
// but CSS should be hiding the poster to prevent that from happening
if (this.player_.paused()) {
this.player_.play();
} else {
this.player_.pause();
}
};
return PosterImage;
})(_buttonJs2['default']);
_componentJs2['default'].registerComponent('PosterImage', PosterImage);
exports['default'] = PosterImage;
module.exports = exports['default'];
},{"./button.js":63,"./component.js":65,"./utils/browser.js":125,"./utils/dom.js":128,"./utils/fn.js":130}],109:[function(_dereq_,module,exports){
/**
* @file setup.js
*
* Functions for automatically setting up a player
* based on the data-setup attribute of the video tag
*/
'use strict';
exports.__esModule = true;
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; } }
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _windowLoaded = false;
var videojs = undefined;
// Automatically set up any tags that have a data-setup attribute
var autoSetup = function autoSetup() {
// One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*
// var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));
// var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
// var mediaEls = vids.concat(audios);
// Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements
// to build up a new, combined list of elements.
var vids = _globalDocument2['default'].getElementsByTagName('video');
var audios = _globalDocument2['default'].getElementsByTagName('audio');
var mediaEls = [];
if (vids && vids.length > 0) {
for (var i = 0, e = vids.length; i < e; i++) {
mediaEls.push(vids[i]);
}
}
if (audios && audios.length > 0) {
for (var i = 0, e = audios.length; i < e; i++) {
mediaEls.push(audios[i]);
}
}
// Check if any media elements exist
if (mediaEls && mediaEls.length > 0) {
for (var i = 0, e = mediaEls.length; i < e; i++) {
var mediaEl = mediaEls[i];
// Check if element exists, has getAttribute func.
// IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
if (mediaEl && mediaEl.getAttribute) {
// Make sure this player hasn't already been set up.
if (mediaEl['player'] === undefined) {
var options = mediaEl.getAttribute('data-setup');
// Check if data-setup attr exists.
// We only auto-setup if they've added the data-setup attr.
if (options !== null) {
// Create new video.js instance.
var player = videojs(mediaEl);
}
}
// If getAttribute isn't defined, we need to wait for the DOM.
} else {
autoSetupTimeout(1);
break;
}
}
// No videos were found, so keep looping unless page is finished loading.
} else if (!_windowLoaded) {
autoSetupTimeout(1);
}
};
// Pause to let the DOM keep processing
var autoSetupTimeout = function autoSetupTimeout(wait, vjs) {
videojs = vjs;
setTimeout(autoSetup, wait);
};
if (_globalDocument2['default'].readyState === 'complete') {
_windowLoaded = true;
} else {
Events.one(_globalWindow2['default'], 'load', function () {
_windowLoaded = true;
});
}
var hasLoaded = function hasLoaded() {
return _windowLoaded;
};
exports.autoSetup = autoSetup;
exports.autoSetupTimeout = autoSetupTimeout;
exports.hasLoaded = hasLoaded;
},{"./utils/events.js":129,"global/document":1,"global/window":2}],110:[function(_dereq_,module,exports){
/**
* @file slider.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* The base functionality for sliders like the volume bar and seek bar
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class Slider
*/
var Slider = (function (_Component) {
_inherits(Slider, _Component);
function Slider(player, options) {
_classCallCheck(this, Slider);
_Component.call(this, player, options);
// Set property names to bar to match with the child Slider class is looking for
this.bar = this.getChild(this.options_.barName);
// Set a horizontal or vertical class on the slider depending on the slider type
this.vertical(!!this.options_.vertical);
this.on('mousedown', this.handleMouseDown);
this.on('touchstart', this.handleMouseDown);
this.on('focus', this.handleFocus);
this.on('blur', this.handleBlur);
this.on('click', this.handleClick);
this.on(player, 'controlsvisible', this.update);
this.on(player, this.playerEvent, this.update);
}
/**
* Create the component's DOM element
*
* @param {String} type Type of element to create
* @param {Object=} props List of properties in Object form
* @return {Element}
* @method createEl
*/
Slider.prototype.createEl = function createEl(type) {
var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
// Add the slider element class to all sub classes
props.className = props.className + ' vjs-slider';
props = _objectAssign2['default']({
tabIndex: 0
}, props);
attributes = _objectAssign2['default']({
'role': 'slider',
'aria-valuenow': 0,
'aria-valuemin': 0,
'aria-valuemax': 100,
tabIndex: 0
}, attributes);
return _Component.prototype.createEl.call(this, type, props, attributes);
};
/**
* Handle mouse down on slider
*
* @param {Object} event Mouse down event object
* @method handleMouseDown
*/
Slider.prototype.handleMouseDown = function handleMouseDown(event) {
event.preventDefault();
Dom.blockTextSelection();
this.addClass('vjs-sliding');
this.trigger('slideractive');
this.on(_globalDocument2['default'], 'mousemove', this.handleMouseMove);
this.on(_globalDocument2['default'], 'mouseup', this.handleMouseUp);
this.on(_globalDocument2['default'], 'touchmove', this.handleMouseMove);
this.on(_globalDocument2['default'], 'touchend', this.handleMouseUp);
this.handleMouseMove(event);
};
/**
* To be overridden by a subclass
*
* @method handleMouseMove
*/
Slider.prototype.handleMouseMove = function handleMouseMove() {};
/**
* Handle mouse up on Slider
*
* @method handleMouseUp
*/
Slider.prototype.handleMouseUp = function handleMouseUp() {
Dom.unblockTextSelection();
this.removeClass('vjs-sliding');
this.trigger('sliderinactive');
this.off(_globalDocument2['default'], 'mousemove', this.handleMouseMove);
this.off(_globalDocument2['default'], 'mouseup', this.handleMouseUp);
this.off(_globalDocument2['default'], 'touchmove', this.handleMouseMove);
this.off(_globalDocument2['default'], 'touchend', this.handleMouseUp);
this.update();
};
/**
* Update slider
*
* @method update
*/
Slider.prototype.update = function update() {
// In VolumeBar init we have a setTimeout for update that pops and update to the end of the
// execution stack. The player is destroyed before then update will cause an error
if (!this.el_) return;
// If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
// On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
// var progress = (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
var progress = this.getPercent();
var bar = this.bar;
// If there's no bar...
if (!bar) return;
// Protect against no duration and other division issues
if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {
progress = 0;
}
// Convert to a percentage for setting
var percentage = (progress * 100).toFixed(2) + '%';
// Set the new bar width or height
if (this.vertical()) {
bar.el().style.height = percentage;
} else {
bar.el().style.width = percentage;
}
};
/**
* Calculate distance for slider
*
* @param {Object} event Event object
* @method calculateDistance
*/
Slider.prototype.calculateDistance = function calculateDistance(event) {
var position = Dom.getPointerPosition(this.el_, event);
if (this.vertical()) {
return position.y;
}
return position.x;
};
/**
* Handle on focus for slider
*
* @method handleFocus
*/
Slider.prototype.handleFocus = function handleFocus() {
this.on(_globalDocument2['default'], 'keydown', this.handleKeyPress);
};
/**
* Handle key press for slider
*
* @param {Object} event Event object
* @method handleKeyPress
*/
Slider.prototype.handleKeyPress = function handleKeyPress(event) {
if (event.which === 37 || event.which === 40) {
// Left and Down Arrows
event.preventDefault();
this.stepBack();
} else if (event.which === 38 || event.which === 39) {
// Up and Right Arrows
event.preventDefault();
this.stepForward();
}
};
/**
* Handle on blur for slider
*
* @method handleBlur
*/
Slider.prototype.handleBlur = function handleBlur() {
this.off(_globalDocument2['default'], 'keydown', this.handleKeyPress);
};
/**
* Listener for click events on slider, used to prevent clicks
* from bubbling up to parent elements like button menus.
*
* @param {Object} event Event object
* @method handleClick
*/
Slider.prototype.handleClick = function handleClick(event) {
event.stopImmediatePropagation();
event.preventDefault();
};
/**
* Get/set if slider is horizontal for vertical
*
* @param {Boolean} bool True if slider is vertical, false is horizontal
* @return {Boolean} True if slider is vertical, false is horizontal
* @method vertical
*/
Slider.prototype.vertical = function vertical(bool) {
if (bool === undefined) {
return this.vertical_ || false;
}
this.vertical_ = !!bool;
if (this.vertical_) {
this.addClass('vjs-slider-vertical');
} else {
this.addClass('vjs-slider-horizontal');
}
return this;
};
return Slider;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Slider', Slider);
exports['default'] = Slider;
module.exports = exports['default'];
},{"../component.js":65,"../utils/dom.js":128,"global/document":1,"object.assign":45}],111:[function(_dereq_,module,exports){
/**
* @file flash-rtmp.js
*/
'use strict';
exports.__esModule = true;
function FlashRtmpDecorator(Flash) {
Flash.streamingFormats = {
'rtmp/mp4': 'MP4',
'rtmp/flv': 'FLV'
};
Flash.streamFromParts = function (connection, stream) {
return connection + '&' + stream;
};
Flash.streamToParts = function (src) {
var parts = {
connection: '',
stream: ''
};
if (!src) return parts;
// Look for the normal URL separator we expect, '&'.
// If found, we split the URL into two pieces around the
// first '&'.
var connEnd = src.search(/&(?!\w+=)/);
var streamBegin = undefined;
if (connEnd !== -1) {
streamBegin = connEnd + 1;
} else {
// If there's not a '&', we use the last '/' as the delimiter.
connEnd = streamBegin = src.lastIndexOf('/') + 1;
if (connEnd === 0) {
// really, there's not a '/'?
connEnd = streamBegin = src.length;
}
}
parts.connection = src.substring(0, connEnd);
parts.stream = src.substring(streamBegin, src.length);
return parts;
};
Flash.isStreamingType = function (srcType) {
return srcType in Flash.streamingFormats;
};
// RTMP has four variations, any string starting
// with one of these protocols should be valid
Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
Flash.isStreamingSrc = function (src) {
return Flash.RTMP_RE.test(src);
};
/**
* A source handler for RTMP urls
* @type {Object}
*/
Flash.rtmpSourceHandler = {};
/**
* Check if Flash can play the given videotype
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.rtmpSourceHandler.canPlayType = function (type) {
if (Flash.isStreamingType(type)) {
return 'maybe';
}
return '';
};
/**
* Check if Flash can handle the source natively
* @param {Object} source The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.rtmpSourceHandler.canHandleSource = function (source) {
var can = Flash.rtmpSourceHandler.canPlayType(source.type);
if (can) {
return can;
}
if (Flash.isStreamingSrc(source.src)) {
return 'maybe';
}
return '';
};
/**
* Pass the source to the flash object
* Adaptive source handlers will have more complicated workflows before passing
* video data to the video element
* @param {Object} source The source object
* @param {Flash} tech The instance of the Flash tech
*/
Flash.rtmpSourceHandler.handleSource = function (source, tech) {
var srcParts = Flash.streamToParts(source.src);
tech['setRtmpConnection'](srcParts.connection);
tech['setRtmpStream'](srcParts.stream);
};
// Register the native source handler
Flash.registerSourceHandler(Flash.rtmpSourceHandler);
return Flash;
}
exports['default'] = FlashRtmpDecorator;
module.exports = exports['default'];
},{}],112:[function(_dereq_,module,exports){
/**
* @file flash.js
* VideoJS-SWF - Custom Flash Player with HTML5-ish API
* https://github.com/zencoder/video-js-swf
* Not using setupTriggers. Using global onEvent func to distribute events
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _tech = _dereq_('./tech');
var _tech2 = _interopRequireDefault(_tech);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsUrlJs = _dereq_('../utils/url.js');
var Url = _interopRequireWildcard(_utilsUrlJs);
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
var _flashRtmp = _dereq_('./flash-rtmp');
var _flashRtmp2 = _interopRequireDefault(_flashRtmp);
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var navigator = _globalWindow2['default'].navigator;
/**
* Flash Media Controller - Wrapper for fallback SWF API
*
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Tech
* @class Flash
*/
var Flash = (function (_Tech) {
_inherits(Flash, _Tech);
function Flash(options, ready) {
_classCallCheck(this, Flash);
_Tech.call(this, options, ready);
// Set the source when ready
if (options.source) {
this.ready(function () {
this.setSource(options.source);
}, true);
}
// Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
// This allows resetting the playhead when we catch the reload
if (options.startTime) {
this.ready(function () {
this.load();
this.play();
this.currentTime(options.startTime);
}, true);
}
// Add global window functions that the swf expects
// A 4.x workflow we weren't able to solve for in 5.0
// because of the need to hard code these functions
// into the swf for security reasons
_globalWindow2['default'].videojs = _globalWindow2['default'].videojs || {};
_globalWindow2['default'].videojs.Flash = _globalWindow2['default'].videojs.Flash || {};
_globalWindow2['default'].videojs.Flash.onReady = Flash.onReady;
_globalWindow2['default'].videojs.Flash.onEvent = Flash.onEvent;
_globalWindow2['default'].videojs.Flash.onError = Flash.onError;
this.on('seeked', function () {
this.lastSeekTarget_ = undefined;
});
}
// Create setters and getters for attributes
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Flash.prototype.createEl = function createEl() {
var options = this.options_;
// If video.js is hosted locally you should also set the location
// for the hosted swf, which should be relative to the page (not video.js)
// Otherwise this adds a CDN url.
// The CDN also auto-adds a swf URL for that specific version.
if (!options.swf) {
options.swf = '//vjs.zencdn.net/swf/5.0.1/video-js.swf';
}
// Generate ID for swf object
var objId = options.techId;
// Merge default flashvars with ones passed in to init
var flashVars = _objectAssign2['default']({
// SWF Callback Functions
'readyFunction': 'videojs.Flash.onReady',
'eventProxyFunction': 'videojs.Flash.onEvent',
'errorEventProxyFunction': 'videojs.Flash.onError',
// Player Settings
'autoplay': options.autoplay,
'preload': options.preload,
'loop': options.loop,
'muted': options.muted
}, options.flashVars);
// Merge default parames with ones passed in
var params = _objectAssign2['default']({
'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
}, options.params);
// Merge default attributes with ones passed in
var attributes = _objectAssign2['default']({
'id': objId,
'name': objId, // Both ID and Name needed or swf to identify itself
'class': 'vjs-tech'
}, options.attributes);
this.el_ = Flash.embed(options.swf, flashVars, params, attributes);
this.el_.tech = this;
return this.el_;
};
/**
* Play for flash tech
*
* @method play
*/
Flash.prototype.play = function play() {
if (this.ended()) {
this.setCurrentTime(0);
}
this.el_.vjs_play();
};
/**
* Pause for flash tech
*
* @method pause
*/
Flash.prototype.pause = function pause() {
this.el_.vjs_pause();
};
/**
* Get/set video
*
* @param {Object=} src Source object
* @return {Object}
* @method src
*/
Flash.prototype.src = function src(_src) {
if (_src === undefined) {
return this.currentSrc();
}
// Setting src through `src` not `setSrc` will be deprecated
return this.setSrc(_src);
};
/**
* Set video
*
* @param {Object=} src Source object
* @deprecated
* @method setSrc
*/
Flash.prototype.setSrc = function setSrc(src) {
// Make sure source URL is absolute.
src = Url.getAbsoluteURL(src);
this.el_.vjs_src(src);
// Currently the SWF doesn't autoplay if you load a source later.
// e.g. Load player w/ no source, wait 2s, set src.
if (this.autoplay()) {
var tech = this;
this.setTimeout(function () {
tech.play();
}, 0);
}
};
/**
* Returns true if the tech is currently seeking.
* @return {boolean} true if seeking
*/
Flash.prototype.seeking = function seeking() {
return this.lastSeekTarget_ !== undefined;
};
/**
* Set current time
*
* @param {Number} time Current time of video
* @method setCurrentTime
*/
Flash.prototype.setCurrentTime = function setCurrentTime(time) {
var seekable = this.seekable();
if (seekable.length) {
// clamp to the current seekable range
time = time > seekable.start(0) ? time : seekable.start(0);
time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);
this.lastSeekTarget_ = time;
this.trigger('seeking');
this.el_.vjs_setProperty('currentTime', time);
_Tech.prototype.setCurrentTime.call(this);
}
};
/**
* Get current time
*
* @param {Number=} time Current time of video
* @return {Number} Current time
* @method currentTime
*/
Flash.prototype.currentTime = function currentTime(time) {
// when seeking make the reported time keep up with the requested time
// by reading the time we're seeking to
if (this.seeking()) {
return this.lastSeekTarget_ || 0;
}
return this.el_.vjs_getProperty('currentTime');
};
/**
* Get current source
*
* @method currentSrc
*/
Flash.prototype.currentSrc = function currentSrc() {
if (this.currentSource_) {
return this.currentSource_.src;
} else {
return this.el_.vjs_getProperty('currentSrc');
}
};
/**
* Load media into player
*
* @method load
*/
Flash.prototype.load = function load() {
this.el_.vjs_load();
};
/**
* Get poster
*
* @method poster
*/
Flash.prototype.poster = function poster() {
this.el_.vjs_getProperty('poster');
};
/**
* Poster images are not handled by the Flash tech so make this a no-op
*
* @method setPoster
*/
Flash.prototype.setPoster = function setPoster() {};
/**
* Determine if can seek in media
*
* @return {TimeRangeObject}
* @method seekable
*/
Flash.prototype.seekable = function seekable() {
var duration = this.duration();
if (duration === 0) {
return _utilsTimeRangesJs.createTimeRange();
}
return _utilsTimeRangesJs.createTimeRange(0, duration);
};
/**
* Get buffered time range
*
* @return {TimeRangeObject}
* @method buffered
*/
Flash.prototype.buffered = function buffered() {
var ranges = this.el_.vjs_getProperty('buffered');
if (ranges.length === 0) {
return _utilsTimeRangesJs.createTimeRange();
}
return _utilsTimeRangesJs.createTimeRange(ranges[0][0], ranges[0][1]);
};
/**
* Get fullscreen support -
* Flash does not allow fullscreen through javascript
* so always returns false
*
* @return {Boolean} false
* @method supportsFullScreen
*/
Flash.prototype.supportsFullScreen = function supportsFullScreen() {
return false; // Flash does not allow fullscreen through javascript
};
/**
* Request to enter fullscreen
* Flash does not allow fullscreen through javascript
* so always returns false
*
* @return {Boolean} false
* @method enterFullScreen
*/
Flash.prototype.enterFullScreen = function enterFullScreen() {
return false;
};
return Flash;
})(_tech2['default']);
var _api = Flash.prototype;
var _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(',');
var _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(',');
function _createSetter(attr) {
var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
_api['set' + attrUpper] = function (val) {
return this.el_.vjs_setProperty(attr, val);
};
}
function _createGetter(attr) {
_api[attr] = function () {
return this.el_.vjs_getProperty(attr);
};
}
// Create getter and setters for all read/write attributes
for (var i = 0; i < _readWrite.length; i++) {
_createGetter(_readWrite[i]);
_createSetter(_readWrite[i]);
}
// Create getters for read-only attributes
for (var i = 0; i < _readOnly.length; i++) {
_createGetter(_readOnly[i]);
}
/* Flash Support Testing -------------------------------------------------------- */
Flash.isSupported = function () {
return Flash.version()[0] >= 10;
// return swfobject.hasFlashPlayerVersion('10');
};
// Add Source Handler pattern functions to this tech
_tech2['default'].withSourceHandlers(Flash);
/*
* The default native source handler.
* This simply passes the source to the video element. Nothing fancy.
*
* @param {Object} source The source object
* @param {Flash} tech The instance of the Flash tech
*/
Flash.nativeSourceHandler = {};
/**
* Check if Flash can play the given videotype
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.nativeSourceHandler.canPlayType = function (type) {
if (type in Flash.formats) {
return 'maybe';
}
return '';
};
/*
* Check Flash can handle the source natively
*
* @param {Object} source The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.nativeSourceHandler.canHandleSource = function (source) {
var type;
function guessMimeType(src) {
var ext = Url.getFileExtension(src);
if (ext) {
return 'video/' + ext;
}
return '';
}
if (!source.type) {
type = guessMimeType(source.src);
} else {
// Strip code information from the type because we don't get that specific
type = source.type.replace(/;.*/, '').toLowerCase();
}
return Flash.nativeSourceHandler.canPlayType(type);
};
/*
* Pass the source to the flash object
* Adaptive source handlers will have more complicated workflows before passing
* video data to the video element
*
* @param {Object} source The source object
* @param {Flash} tech The instance of the Flash tech
*/
Flash.nativeSourceHandler.handleSource = function (source, tech) {
tech.setSrc(source.src);
};
/*
* Clean up the source handler when disposing the player or switching sources..
* (no cleanup is needed when supporting the format natively)
*/
Flash.nativeSourceHandler.dispose = function () {};
// Register the native source handler
Flash.registerSourceHandler(Flash.nativeSourceHandler);
Flash.formats = {
'video/flv': 'FLV',
'video/x-flv': 'FLV',
'video/mp4': 'MP4',
'video/m4v': 'MP4'
};
Flash.onReady = function (currSwf) {
var el = Dom.getEl(currSwf);
var tech = el && el.tech;
// if there is no el then the tech has been disposed
// and the tech element was removed from the player div
if (tech && tech.el()) {
// check that the flash object is really ready
Flash.checkReady(tech);
}
};
// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.
// If it's not ready, we set a timeout to check again shortly.
Flash.checkReady = function (tech) {
// stop worrying if the tech has been disposed
if (!tech.el()) {
return;
}
// check if API property exists
if (tech.el().vjs_getProperty) {
// tell tech it's ready
tech.triggerReady();
} else {
// wait longer
this.setTimeout(function () {
Flash['checkReady'](tech);
}, 50);
}
};
// Trigger events from the swf on the player
Flash.onEvent = function (swfID, eventName) {
var tech = Dom.getEl(swfID).tech;
tech.trigger(eventName);
};
// Log errors from the swf
Flash.onError = function (swfID, err) {
var tech = Dom.getEl(swfID).tech;
// trigger MEDIA_ERR_SRC_NOT_SUPPORTED
if (err === 'srcnotfound') {
return tech.error(4);
}
// trigger a custom error
tech.error('FLASH: ' + err);
};
// Flash Version Check
Flash.version = function () {
var version = '0,0,0';
// IE
try {
version = new _globalWindow2['default'].ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
// other browsers
} catch (e) {
try {
if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
}
} catch (err) {}
}
return version.split(',');
};
// Flash embedding method. Only used in non-iframe mode
Flash.embed = function (swf, flashVars, params, attributes) {
var code = Flash.getEmbedCode(swf, flashVars, params, attributes);
// Get element by embedding code and retrieving created element
var obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];
return obj;
};
Flash.getEmbedCode = function (swf, flashVars, params, attributes) {
var objTag = '<object type="application/x-shockwave-flash" ';
var flashVarsString = '';
var paramsString = '';
var attrsString = '';
// Convert flash vars to string
if (flashVars) {
Object.getOwnPropertyNames(flashVars).forEach(function (key) {
flashVarsString += key + '=' + flashVars[key] + '&amp;';
});
}
// Add swf, flashVars, and other default params
params = _objectAssign2['default']({
'movie': swf,
'flashvars': flashVarsString,
'allowScriptAccess': 'always', // Required to talk to swf
'allowNetworking': 'all' // All should be default, but having security issues.
}, params);
// Create param tags string
Object.getOwnPropertyNames(params).forEach(function (key) {
paramsString += '<param name="' + key + '" value="' + params[key] + '" />';
});
attributes = _objectAssign2['default']({
// Add swf to attributes (need both for IE and Others to work)
'data': swf,
// Default to 100% width/height
'width': '100%',
'height': '100%'
}, attributes);
// Create Attributes string
Object.getOwnPropertyNames(attributes).forEach(function (key) {
attrsString += key + '="' + attributes[key] + '" ';
});
return '' + objTag + attrsString + '>' + paramsString + '</object>';
};
// Run Flash through the RTMP decorator
_flashRtmp2['default'](Flash);
_component2['default'].registerComponent('Flash', Flash);
_tech2['default'].registerTech('Flash', Flash);
exports['default'] = Flash;
module.exports = exports['default'];
},{"../component":65,"../utils/dom.js":128,"../utils/time-ranges.js":136,"../utils/url.js":138,"./flash-rtmp":111,"./tech":115,"global/window":2,"object.assign":45}],113:[function(_dereq_,module,exports){
/**
* @file html5.js
* HTML5 Media Controller - Wrapper for HTML5 Media API
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _techJs = _dereq_('./tech.js');
var _techJs2 = _interopRequireDefault(_techJs);
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsUrlJs = _dereq_('../utils/url.js');
var Url = _interopRequireWildcard(_utilsUrlJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
/**
* HTML5 Media Controller - Wrapper for HTML5 Media API
*
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Tech
* @class Html5
*/
var Html5 = (function (_Tech) {
_inherits(Html5, _Tech);
function Html5(options, ready) {
_classCallCheck(this, Html5);
_Tech.call(this, options, ready);
var source = options.source;
// Set the source if one is provided
// 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)
// 2) Check to see if the network state of the tag was failed at init, and if so, reset the source
// anyway so the error gets fired.
if (source && (this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {
this.setSource(source);
} else {
this.handleLateInit_(this.el_);
}
if (this.el_.hasChildNodes()) {
var nodes = this.el_.childNodes;
var nodesLength = nodes.length;
var removeNodes = [];
while (nodesLength--) {
var node = nodes[nodesLength];
var nodeName = node.nodeName.toLowerCase();
if (nodeName === 'track') {
if (!this.featuresNativeTextTracks) {
// Empty video tag tracks so the built-in player doesn't use them also.
// This may not be fast enough to stop HTML5 browsers from reading the tags
// so we'll need to turn off any default tracks if we're manually doing
// captions and subtitles. videoElement.textTracks
removeNodes.push(node);
} else {
// store HTMLTrackElement and TextTrack to remote list
this.remoteTextTrackEls().addTrackElement_(node);
this.remoteTextTracks().addTrack_(node.track);
}
}
}
for (var i = 0; i < removeNodes.length; i++) {
this.el_.removeChild(removeNodes[i]);
}
}
if (this.featuresNativeTextTracks) {
this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);
this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);
this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);
this.proxyNativeTextTracks_();
}
// Determine if native controls should be used
// Our goal should be to get the custom controls on mobile solid everywhere
// so we can remove this all together. Right now this will block custom
// controls on touch enabled laptops like the Chrome Pixel
if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true || browser.IS_IPHONE || browser.IS_NATIVE_ANDROID) {
this.setControls(true);
}
this.triggerReady();
}
/* HTML5 Support Testing ---------------------------------------------------- */
/*
* Element for testing browser HTML5 video capabilities
*
* @type {Element}
* @constant
* @private
*/
/**
* Dispose of html5 media element
*
* @method dispose
*/
Html5.prototype.dispose = function dispose() {
var tt = this.el().textTracks;
var emulatedTt = this.textTracks();
// remove native event listeners
if (tt && tt.removeEventListener) {
tt.removeEventListener('change', this.handleTextTrackChange_);
tt.removeEventListener('addtrack', this.handleTextTrackAdd_);
tt.removeEventListener('removetrack', this.handleTextTrackRemove_);
}
// clearout the emulated text track list.
var i = emulatedTt.length;
while (i--) {
emulatedTt.removeTrack_(emulatedTt[i]);
}
Html5.disposeMediaElement(this.el_);
_Tech.prototype.dispose.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Html5.prototype.createEl = function createEl() {
var el = this.options_.tag;
// Check if this browser supports moving the element into the box.
// On the iPhone video will break if you move the element,
// So we have to create a brand new element.
if (!el || this['movingMediaElementInDOM'] === false) {
// If the original tag is still there, clone and remove it.
if (el) {
var clone = el.cloneNode(true);
el.parentNode.insertBefore(clone, el);
Html5.disposeMediaElement(el);
el = clone;
} else {
el = _globalDocument2['default'].createElement('video');
// determine if native controls should be used
var tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);
var attributes = _utilsMergeOptionsJs2['default']({}, tagAttributes);
if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {
delete attributes.controls;
}
Dom.setElAttributes(el, _objectAssign2['default'](attributes, {
id: this.options_.techId,
'class': 'vjs-tech'
}));
}
}
// Update specific tag settings, in case they were overridden
var settingsAttrs = ['autoplay', 'preload', 'loop', 'muted'];
for (var i = settingsAttrs.length - 1; i >= 0; i--) {
var attr = settingsAttrs[i];
var overwriteAttrs = {};
if (typeof this.options_[attr] !== 'undefined') {
overwriteAttrs[attr] = this.options_[attr];
}
Dom.setElAttributes(el, overwriteAttrs);
}
return el;
// jenniisawesome = true;
};
// If we're loading the playback object after it has started loading
// or playing the video (often with autoplay on) then the loadstart event
// has already fired and we need to fire it manually because many things
// rely on it.
Html5.prototype.handleLateInit_ = function handleLateInit_(el) {
var _this = this;
if (el.networkState === 0 || el.networkState === 3) {
// The video element hasn't started loading the source yet
// or didn't find a source
return;
}
if (el.readyState === 0) {
var _ret = (function () {
// NetworkState is set synchronously BUT loadstart is fired at the
// end of the current stack, usually before setInterval(fn, 0).
// So at this point we know loadstart may have already fired or is
// about to fire, and either way the player hasn't seen it yet.
// We don't want to fire loadstart prematurely here and cause a
// double loadstart so we'll wait and see if it happens between now
// and the next loop, and fire it if not.
// HOWEVER, we also want to make sure it fires before loadedmetadata
// which could also happen between now and the next loop, so we'll
// watch for that also.
var loadstartFired = false;
var setLoadstartFired = function setLoadstartFired() {
loadstartFired = true;
};
_this.on('loadstart', setLoadstartFired);
var triggerLoadstart = function triggerLoadstart() {
// We did miss the original loadstart. Make sure the player
// sees loadstart before loadedmetadata
if (!loadstartFired) {
this.trigger('loadstart');
}
};
_this.on('loadedmetadata', triggerLoadstart);
_this.ready(function () {
this.off('loadstart', setLoadstartFired);
this.off('loadedmetadata', triggerLoadstart);
if (!loadstartFired) {
// We did miss the original native loadstart. Fire it now.
this.trigger('loadstart');
}
});
return {
v: undefined
};
})();
if (typeof _ret === 'object') return _ret.v;
}
// From here on we know that loadstart already fired and we missed it.
// The other readyState events aren't as much of a problem if we double
// them, so not going to go to as much trouble as loadstart to prevent
// that unless we find reason to.
var eventsToTrigger = ['loadstart'];
// loadedmetadata: newly equal to HAVE_METADATA (1) or greater
eventsToTrigger.push('loadedmetadata');
// loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater
if (el.readyState >= 2) {
eventsToTrigger.push('loadeddata');
}
// canplay: newly increased to HAVE_FUTURE_DATA (3) or greater
if (el.readyState >= 3) {
eventsToTrigger.push('canplay');
}
// canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)
if (el.readyState >= 4) {
eventsToTrigger.push('canplaythrough');
}
// We still need to give the player time to add event listeners
this.ready(function () {
eventsToTrigger.forEach(function (type) {
this.trigger(type);
}, this);
});
};
Html5.prototype.proxyNativeTextTracks_ = function proxyNativeTextTracks_() {
var tt = this.el().textTracks;
if (tt && tt.addEventListener) {
tt.addEventListener('change', this.handleTextTrackChange_);
tt.addEventListener('addtrack', this.handleTextTrackAdd_);
tt.addEventListener('removetrack', this.handleTextTrackRemove_);
}
};
Html5.prototype.handleTextTrackChange = function handleTextTrackChange(e) {
var tt = this.textTracks();
this.textTracks().trigger({
type: 'change',
target: tt,
currentTarget: tt,
srcElement: tt
});
};
Html5.prototype.handleTextTrackAdd = function handleTextTrackAdd(e) {
this.textTracks().addTrack_(e.track);
};
Html5.prototype.handleTextTrackRemove = function handleTextTrackRemove(e) {
this.textTracks().removeTrack_(e.track);
};
/**
* Play for html5 tech
*
* @method play
*/
Html5.prototype.play = function play() {
this.el_.play();
};
/**
* Pause for html5 tech
*
* @method pause
*/
Html5.prototype.pause = function pause() {
this.el_.pause();
};
/**
* Paused for html5 tech
*
* @return {Boolean}
* @method paused
*/
Html5.prototype.paused = function paused() {
return this.el_.paused;
};
/**
* Get current time
*
* @return {Number}
* @method currentTime
*/
Html5.prototype.currentTime = function currentTime() {
return this.el_.currentTime;
};
/**
* Set current time
*
* @param {Number} seconds Current time of video
* @method setCurrentTime
*/
Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {
try {
this.el_.currentTime = seconds;
} catch (e) {
_utilsLogJs2['default'](e, 'Video is not ready. (Video.js)');
// this.warning(VideoJS.warnings.videoNotReady);
}
};
/**
* Get duration
*
* @return {Number}
* @method duration
*/
Html5.prototype.duration = function duration() {
return this.el_.duration || 0;
};
/**
* Get a TimeRange object that represents the intersection
* of the time ranges for which the user agent has all
* relevant media
*
* @return {TimeRangeObject}
* @method buffered
*/
Html5.prototype.buffered = function buffered() {
return this.el_.buffered;
};
/**
* Get volume level
*
* @return {Number}
* @method volume
*/
Html5.prototype.volume = function volume() {
return this.el_.volume;
};
/**
* Set volume level
*
* @param {Number} percentAsDecimal Volume percent as a decimal
* @method setVolume
*/
Html5.prototype.setVolume = function setVolume(percentAsDecimal) {
this.el_.volume = percentAsDecimal;
};
/**
* Get if muted
*
* @return {Boolean}
* @method muted
*/
Html5.prototype.muted = function muted() {
return this.el_.muted;
};
/**
* Set muted
*
* @param {Boolean} If player is to be muted or note
* @method setMuted
*/
Html5.prototype.setMuted = function setMuted(muted) {
this.el_.muted = muted;
};
/**
* Get player width
*
* @return {Number}
* @method width
*/
Html5.prototype.width = function width() {
return this.el_.offsetWidth;
};
/**
* Get player height
*
* @return {Number}
* @method height
*/
Html5.prototype.height = function height() {
return this.el_.offsetHeight;
};
/**
* Get if there is fullscreen support
*
* @return {Boolean}
* @method supportsFullScreen
*/
Html5.prototype.supportsFullScreen = function supportsFullScreen() {
if (typeof this.el_.webkitEnterFullScreen === 'function') {
var userAgent = _globalWindow2['default'].navigator.userAgent;
// Seems to be broken in Chromium/Chrome && Safari in Leopard
if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {
return true;
}
}
return false;
};
/**
* Request to enter fullscreen
*
* @method enterFullScreen
*/
Html5.prototype.enterFullScreen = function enterFullScreen() {
var video = this.el_;
if ('webkitDisplayingFullscreen' in video) {
this.one('webkitbeginfullscreen', function () {
this.one('webkitendfullscreen', function () {
this.trigger('fullscreenchange', { isFullscreen: false });
});
this.trigger('fullscreenchange', { isFullscreen: true });
});
}
if (video.paused && video.networkState <= video.HAVE_METADATA) {
// attempt to prime the video element for programmatic access
// this isn't necessary on the desktop but shouldn't hurt
this.el_.play();
// playing and pausing synchronously during the transition to fullscreen
// can get iOS ~6.1 devices into a play/pause loop
this.setTimeout(function () {
video.pause();
video.webkitEnterFullScreen();
}, 0);
} else {
video.webkitEnterFullScreen();
}
};
/**
* Request to exit fullscreen
*
* @method exitFullScreen
*/
Html5.prototype.exitFullScreen = function exitFullScreen() {
this.el_.webkitExitFullScreen();
};
/**
* Get/set video
*
* @param {Object=} src Source object
* @return {Object}
* @method src
*/
Html5.prototype.src = function src(_src) {
if (_src === undefined) {
return this.el_.src;
} else {
// Setting src through `src` instead of `setSrc` will be deprecated
this.setSrc(_src);
}
};
/**
* Set video
*
* @param {Object} src Source object
* @deprecated
* @method setSrc
*/
Html5.prototype.setSrc = function setSrc(src) {
this.el_.src = src;
};
/**
* Load media into player
*
* @method load
*/
Html5.prototype.load = function load() {
this.el_.load();
};
/**
* Reset the tech. Removes all sources and calls `load`.
*
* @method reset
*/
Html5.prototype.reset = function reset() {
Html5.resetMediaElement(this.el_);
};
/**
* Get current source
*
* @return {Object}
* @method currentSrc
*/
Html5.prototype.currentSrc = function currentSrc() {
if (this.currentSource_) {
return this.currentSource_.src;
} else {
return this.el_.currentSrc;
}
};
/**
* Get poster
*
* @return {String}
* @method poster
*/
Html5.prototype.poster = function poster() {
return this.el_.poster;
};
/**
* Set poster
*
* @param {String} val URL to poster image
* @method
*/
Html5.prototype.setPoster = function setPoster(val) {
this.el_.poster = val;
};
/**
* Get preload attribute
*
* @return {String}
* @method preload
*/
Html5.prototype.preload = function preload() {
return this.el_.preload;
};
/**
* Set preload attribute
*
* @param {String} val Value for preload attribute
* @method setPreload
*/
Html5.prototype.setPreload = function setPreload(val) {
this.el_.preload = val;
};
/**
* Get autoplay attribute
*
* @return {String}
* @method autoplay
*/
Html5.prototype.autoplay = function autoplay() {
return this.el_.autoplay;
};
/**
* Set autoplay attribute
*
* @param {String} val Value for preload attribute
* @method setAutoplay
*/
Html5.prototype.setAutoplay = function setAutoplay(val) {
this.el_.autoplay = val;
};
/**
* Get controls attribute
*
* @return {String}
* @method controls
*/
Html5.prototype.controls = function controls() {
return this.el_.controls;
};
/**
* Set controls attribute
*
* @param {String} val Value for controls attribute
* @method setControls
*/
Html5.prototype.setControls = function setControls(val) {
this.el_.controls = !!val;
};
/**
* Get loop attribute
*
* @return {String}
* @method loop
*/
Html5.prototype.loop = function loop() {
return this.el_.loop;
};
/**
* Set loop attribute
*
* @param {String} val Value for loop attribute
* @method setLoop
*/
Html5.prototype.setLoop = function setLoop(val) {
this.el_.loop = val;
};
/**
* Get error value
*
* @return {String}
* @method error
*/
Html5.prototype.error = function error() {
return this.el_.error;
};
/**
* Get whether or not the player is in the "seeking" state
*
* @return {Boolean}
* @method seeking
*/
Html5.prototype.seeking = function seeking() {
return this.el_.seeking;
};
/**
* Get a TimeRanges object that represents the
* ranges of the media resource to which it is possible
* for the user agent to seek.
*
* @return {TimeRangeObject}
* @method seekable
*/
Html5.prototype.seekable = function seekable() {
return this.el_.seekable;
};
/**
* Get if video ended
*
* @return {Boolean}
* @method ended
*/
Html5.prototype.ended = function ended() {
return this.el_.ended;
};
/**
* Get the value of the muted content attribute
* This attribute has no dynamic effect, it only
* controls the default state of the element
*
* @return {Boolean}
* @method defaultMuted
*/
Html5.prototype.defaultMuted = function defaultMuted() {
return this.el_.defaultMuted;
};
/**
* Get desired speed at which the media resource is to play
*
* @return {Number}
* @method playbackRate
*/
Html5.prototype.playbackRate = function playbackRate() {
return this.el_.playbackRate;
};
/**
* Returns a TimeRanges object that represents the ranges of the
* media resource that the user agent has played.
* @return {TimeRangeObject} the range of points on the media
* timeline that has been reached through normal playback
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played
*/
Html5.prototype.played = function played() {
return this.el_.played;
};
/**
* Set desired speed at which the media resource is to play
*
* @param {Number} val Speed at which the media resource is to play
* @method setPlaybackRate
*/
Html5.prototype.setPlaybackRate = function setPlaybackRate(val) {
this.el_.playbackRate = val;
};
/**
* Get the current state of network activity for the element, from
* the list below
* NETWORK_EMPTY (numeric value 0)
* NETWORK_IDLE (numeric value 1)
* NETWORK_LOADING (numeric value 2)
* NETWORK_NO_SOURCE (numeric value 3)
*
* @return {Number}
* @method networkState
*/
Html5.prototype.networkState = function networkState() {
return this.el_.networkState;
};
/**
* Get a value that expresses the current state of the element
* with respect to rendering the current playback position, from
* the codes in the list below
* HAVE_NOTHING (numeric value 0)
* HAVE_METADATA (numeric value 1)
* HAVE_CURRENT_DATA (numeric value 2)
* HAVE_FUTURE_DATA (numeric value 3)
* HAVE_ENOUGH_DATA (numeric value 4)
*
* @return {Number}
* @method readyState
*/
Html5.prototype.readyState = function readyState() {
return this.el_.readyState;
};
/**
* Get width of video
*
* @return {Number}
* @method videoWidth
*/
Html5.prototype.videoWidth = function videoWidth() {
return this.el_.videoWidth;
};
/**
* Get height of video
*
* @return {Number}
* @method videoHeight
*/
Html5.prototype.videoHeight = function videoHeight() {
return this.el_.videoHeight;
};
/**
* Get text tracks
*
* @return {TextTrackList}
* @method textTracks
*/
Html5.prototype.textTracks = function textTracks() {
return _Tech.prototype.textTracks.call(this);
};
/**
* Creates and returns a text track object
*
* @param {String} kind Text track kind (subtitles, captions, descriptions
* chapters and metadata)
* @param {String=} label Label to identify the text track
* @param {String=} language Two letter language abbreviation
* @return {TextTrackObject}
* @method addTextTrack
*/
Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {
if (!this['featuresNativeTextTracks']) {
return _Tech.prototype.addTextTrack.call(this, kind, label, language);
}
return this.el_.addTextTrack(kind, label, language);
};
/**
* Creates a remote text track object and returns a html track element
*
* @param {Object} options The object should contain values for
* kind, language, label and src (location of the WebVTT file)
* @return {HTMLTrackElement}
* @method addRemoteTextTrack
*/
Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
if (!this['featuresNativeTextTracks']) {
return _Tech.prototype.addRemoteTextTrack.call(this, options);
}
var htmlTrackElement = _globalDocument2['default'].createElement('track');
if (options.kind) {
htmlTrackElement.kind = options.kind;
}
if (options.label) {
htmlTrackElement.label = options.label;
}
if (options.language || options.srclang) {
htmlTrackElement.srclang = options.language || options.srclang;
}
if (options['default']) {
htmlTrackElement['default'] = options['default'];
}
if (options.id) {
htmlTrackElement.id = options.id;
}
if (options.src) {
htmlTrackElement.src = options.src;
}
this.el().appendChild(htmlTrackElement);
// store HTMLTrackElement and TextTrack to remote list
this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);
this.remoteTextTracks().addTrack_(htmlTrackElement.track);
return htmlTrackElement;
};
/**
* Remove remote text track from TextTrackList object
*
* @param {TextTrackObject} track Texttrack object to remove
* @method removeRemoteTextTrack
*/
Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
if (!this['featuresNativeTextTracks']) {
return _Tech.prototype.removeRemoteTextTrack.call(this, track);
}
var tracks = undefined,
i = undefined;
var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);
// remove HTMLTrackElement and TextTrack from remote list
this.remoteTextTrackEls().removeTrackElement_(trackElement);
this.remoteTextTracks().removeTrack_(track);
tracks = this.$$('track');
i = tracks.length;
while (i--) {
if (track === tracks[i] || track === tracks[i].track) {
this.el().removeChild(tracks[i]);
}
}
};
return Html5;
})(_techJs2['default']);
Html5.TEST_VID = _globalDocument2['default'].createElement('video');
var track = _globalDocument2['default'].createElement('track');
track.kind = 'captions';
track.srclang = 'en';
track.label = 'English';
Html5.TEST_VID.appendChild(track);
/*
* Check if HTML5 video is supported by this browser/device
*
* @return {Boolean}
*/
Html5.isSupported = function () {
// IE9 with no Media Player is a LIAR! (#984)
try {
Html5.TEST_VID['volume'] = 0.5;
} catch (e) {
return false;
}
return !!Html5.TEST_VID.canPlayType;
};
// Add Source Handler pattern functions to this tech
_techJs2['default'].withSourceHandlers(Html5);
/*
* The default native source handler.
* This simply passes the source to the video element. Nothing fancy.
*
* @param {Object} source The source object
* @param {Html5} tech The instance of the HTML5 tech
*/
Html5.nativeSourceHandler = {};
/*
* Check if the video element can play the given videotype
*
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Html5.nativeSourceHandler.canPlayType = function (type) {
// IE9 on Windows 7 without MediaPlayer throws an error here
// https://github.com/videojs/video.js/issues/519
try {
return Html5.TEST_VID.canPlayType(type);
} catch (e) {
return '';
}
};
/*
* Check if the video element can handle the source natively
*
* @param {Object} source The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Html5.nativeSourceHandler.canHandleSource = function (source) {
var match, ext;
// If a type was provided we should rely on that
if (source.type) {
return Html5.nativeSourceHandler.canPlayType(source.type);
} else if (source.src) {
// If no type, fall back to checking 'video/[EXTENSION]'
ext = Url.getFileExtension(source.src);
return Html5.nativeSourceHandler.canPlayType('video/' + ext);
}
return '';
};
/*
* Pass the source to the video element
* Adaptive source handlers will have more complicated workflows before passing
* video data to the video element
*
* @param {Object} source The source object
* @param {Html5} tech The instance of the Html5 tech
*/
Html5.nativeSourceHandler.handleSource = function (source, tech) {
tech.setSrc(source.src);
};
/*
* Clean up the source handler when disposing the player or switching sources..
* (no cleanup is needed when supporting the format natively)
*/
Html5.nativeSourceHandler.dispose = function () {};
// Register the native source handler
Html5.registerSourceHandler(Html5.nativeSourceHandler);
/*
* Check if the volume can be changed in this browser/device.
* Volume cannot be changed in a lot of mobile devices.
* Specifically, it can't be changed from 1 on iOS.
*
* @return {Boolean}
*/
Html5.canControlVolume = function () {
var volume = Html5.TEST_VID.volume;
Html5.TEST_VID.volume = volume / 2 + 0.1;
return volume !== Html5.TEST_VID.volume;
};
/*
* Check if playbackRate is supported in this browser/device.
*
* @return {Number} [description]
*/
Html5.canControlPlaybackRate = function () {
var playbackRate = Html5.TEST_VID.playbackRate;
Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;
return playbackRate !== Html5.TEST_VID.playbackRate;
};
/*
* Check to see if native text tracks are supported by this browser/device
*
* @return {Boolean}
*/
Html5.supportsNativeTextTracks = function () {
var supportsTextTracks;
// Figure out native text track support
// If mode is a number, we cannot change it because it'll disappear from view.
// Browsers with numeric modes include IE10 and older (<=2013) samsung android models.
// Firefox isn't playing nice either with modifying the mode
// TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862
supportsTextTracks = !!Html5.TEST_VID.textTracks;
if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {
supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';
}
if (supportsTextTracks && browser.IS_FIREFOX) {
supportsTextTracks = false;
}
if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {
supportsTextTracks = false;
}
return supportsTextTracks;
};
/**
* An array of events available on the Html5 tech.
*
* @private
* @type {Array}
*/
Html5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'volumechange'];
/*
* Set the tech's volume control support status
*
* @type {Boolean}
*/
Html5.prototype['featuresVolumeControl'] = Html5.canControlVolume();
/*
* Set the tech's playbackRate support status
*
* @type {Boolean}
*/
Html5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();
/*
* Set the tech's status on moving the video element.
* In iOS, if you move a video element in the DOM, it breaks video playback.
*
* @type {Boolean}
*/
Html5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;
/*
* Set the the tech's fullscreen resize support status.
* HTML video is able to automatically resize when going to fullscreen.
* (No longer appears to be used. Can probably be removed.)
*/
Html5.prototype['featuresFullscreenResize'] = true;
/*
* Set the tech's progress event support status
* (this disables the manual progress events of the Tech)
*/
Html5.prototype['featuresProgressEvents'] = true;
/*
* Sets the tech's status on native text track support
*
* @type {Boolean}
*/
Html5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();
// HTML5 Feature detection and Device Fixes --------------------------------- //
var canPlayType = undefined;
var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
var mp4RE = /^video\/mp4/i;
Html5.patchCanPlayType = function () {
// Android 4.0 and above can play HLS to some extent but it reports being unable to do so
if (browser.ANDROID_VERSION >= 4.0) {
if (!canPlayType) {
canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
}
Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
if (type && mpegurlRE.test(type)) {
return 'maybe';
}
return canPlayType.call(this, type);
};
}
// Override Android 2.2 and less canPlayType method which is broken
if (browser.IS_OLD_ANDROID) {
if (!canPlayType) {
canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
}
Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
if (type && mp4RE.test(type)) {
return 'maybe';
}
return canPlayType.call(this, type);
};
}
};
Html5.unpatchCanPlayType = function () {
var r = Html5.TEST_VID.constructor.prototype.canPlayType;
Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;
canPlayType = null;
return r;
};
// by default, patch the video element
Html5.patchCanPlayType();
Html5.disposeMediaElement = function (el) {
if (!el) {
return;
}
if (el.parentNode) {
el.parentNode.removeChild(el);
}
// remove any child track or source nodes to prevent their loading
while (el.hasChildNodes()) {
el.removeChild(el.firstChild);
}
// remove any src reference. not setting `src=''` because that causes a warning
// in firefox
el.removeAttribute('src');
// force the media element to update its loading state by calling load()
// however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)
if (typeof el.load === 'function') {
// wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
(function () {
try {
el.load();
} catch (e) {
// not supported
}
})();
}
};
Html5.resetMediaElement = function (el) {
if (!el) {
return;
}
var sources = el.querySelectorAll('source');
var i = sources.length;
while (i--) {
el.removeChild(sources[i]);
}
// remove any src reference.
// not setting `src=''` because that throws an error
el.removeAttribute('src');
if (typeof el.load === 'function') {
// wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
(function () {
try {
el.load();
} catch (e) {}
})();
}
};
_component2['default'].registerComponent('Html5', Html5);
_techJs2['default'].registerTech('Html5', Html5);
exports['default'] = Html5;
module.exports = exports['default'];
},{"../component":65,"../utils/browser.js":125,"../utils/dom.js":128,"../utils/fn.js":130,"../utils/log.js":133,"../utils/merge-options.js":134,"../utils/url.js":138,"./tech.js":115,"global/document":1,"global/window":2,"object.assign":45}],114:[function(_dereq_,module,exports){
/**
* @file loader.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _techJs = _dereq_('./tech.js');
var _techJs2 = _interopRequireDefault(_techJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
/**
* The Media Loader is the component that decides which playback technology to load
* when the player is initialized.
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Component
* @class MediaLoader
*/
var MediaLoader = (function (_Component) {
_inherits(MediaLoader, _Component);
function MediaLoader(player, options, ready) {
_classCallCheck(this, MediaLoader);
_Component.call(this, player, options, ready);
// If there are no sources when the player is initialized,
// load the first supported playback technology.
if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {
for (var i = 0, j = options.playerOptions['techOrder']; i < j.length; i++) {
var techName = _utilsToTitleCaseJs2['default'](j[i]);
var tech = _techJs2['default'].getTech(techName);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!techName) {
tech = _componentJs2['default'].getComponent(techName);
}
// Check if the browser supports this technology
if (tech && tech.isSupported()) {
player.loadTech_(techName);
break;
}
}
} else {
// // Loop through playback technologies (HTML5, Flash) and check for support.
// // Then load the best source.
// // A few assumptions here:
// // All playback technologies respect preload false.
player.src(options.playerOptions['sources']);
}
}
return MediaLoader;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('MediaLoader', MediaLoader);
exports['default'] = MediaLoader;
module.exports = exports['default'];
},{"../component.js":65,"../utils/to-title-case.js":137,"./tech.js":115,"global/window":2}],115:[function(_dereq_,module,exports){
/**
* @file tech.js
* Media Technology Controller - Base class for media playback
* technology controllers like Flash and HTML5
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _tracksHtmlTrackElement = _dereq_('../tracks/html-track-element');
var _tracksHtmlTrackElement2 = _interopRequireDefault(_tracksHtmlTrackElement);
var _tracksHtmlTrackElementList = _dereq_('../tracks/html-track-element-list');
var _tracksHtmlTrackElementList2 = _interopRequireDefault(_tracksHtmlTrackElementList);
var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
var _tracksTextTrack = _dereq_('../tracks/text-track');
var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack);
var _tracksTextTrackList = _dereq_('../tracks/text-track-list');
var _tracksTextTrackList2 = _interopRequireDefault(_tracksTextTrackList);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
var _utilsBufferJs = _dereq_('../utils/buffer.js');
var _mediaErrorJs = _dereq_('../media-error.js');
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* Base class for media (HTML5 Video, Flash) controllers
*
* @param {Object=} options Options object
* @param {Function=} ready Ready callback function
* @extends Component
* @class Tech
*/
var Tech = (function (_Component) {
_inherits(Tech, _Component);
function Tech() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var ready = arguments.length <= 1 || arguments[1] === undefined ? function () {} : arguments[1];
_classCallCheck(this, Tech);
// we don't want the tech to report user activity automatically.
// This is done manually in addControlsListeners
options.reportTouchActivity = false;
_Component.call(this, null, options, ready);
// keep track of whether the current source has played at all to
// implement a very limited played()
this.hasStarted_ = false;
this.on('playing', function () {
this.hasStarted_ = true;
});
this.on('loadstart', function () {
this.hasStarted_ = false;
});
this.textTracks_ = options.textTracks;
// Manually track progress in cases where the browser/flash player doesn't report it.
if (!this.featuresProgressEvents) {
this.manualProgressOn();
}
// Manually track timeupdates in cases where the browser/flash player doesn't report it.
if (!this.featuresTimeupdateEvents) {
this.manualTimeUpdatesOn();
}
if (options.nativeCaptions === false || options.nativeTextTracks === false) {
this.featuresNativeTextTracks = false;
}
if (!this.featuresNativeTextTracks) {
this.on('ready', this.emulateTextTracks);
}
this.initTextTrackListeners();
// Turn on component tap events
this.emitTapEvents();
}
/*
* List of associated text tracks
*
* @type {Array}
* @private
*/
/* Fallbacks for unsupported event types
================================================================================ */
// Manually trigger progress events based on changes to the buffered amount
// Many flash players and older HTML5 browsers don't send progress or progress-like events
/**
* Turn on progress events
*
* @method manualProgressOn
*/
Tech.prototype.manualProgressOn = function manualProgressOn() {
this.on('durationchange', this.onDurationChange);
this.manualProgress = true;
// Trigger progress watching when a source begins loading
this.one('ready', this.trackProgress);
};
/**
* Turn off progress events
*
* @method manualProgressOff
*/
Tech.prototype.manualProgressOff = function manualProgressOff() {
this.manualProgress = false;
this.stopTrackingProgress();
this.off('durationchange', this.onDurationChange);
};
/**
* Track progress
*
* @method trackProgress
*/
Tech.prototype.trackProgress = function trackProgress() {
this.stopTrackingProgress();
this.progressInterval = this.setInterval(Fn.bind(this, function () {
// Don't trigger unless buffered amount is greater than last time
var numBufferedPercent = this.bufferedPercent();
if (this.bufferedPercent_ !== numBufferedPercent) {
this.trigger('progress');
}
this.bufferedPercent_ = numBufferedPercent;
if (numBufferedPercent === 1) {
this.stopTrackingProgress();
}
}), 500);
};
/**
* Update duration
*
* @method onDurationChange
*/
Tech.prototype.onDurationChange = function onDurationChange() {
this.duration_ = this.duration();
};
/**
* Create and get TimeRange object for buffering
*
* @return {TimeRangeObject}
* @method buffered
*/
Tech.prototype.buffered = function buffered() {
return _utilsTimeRangesJs.createTimeRange(0, 0);
};
/**
* Get buffered percent
*
* @return {Number}
* @method bufferedPercent
*/
Tech.prototype.bufferedPercent = function bufferedPercent() {
return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration_);
};
/**
* Stops tracking progress by clearing progress interval
*
* @method stopTrackingProgress
*/
Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {
this.clearInterval(this.progressInterval);
};
/*! Time Tracking -------------------------------------------------------------- */
/**
* Set event listeners for on play and pause and tracking current time
*
* @method manualTimeUpdatesOn
*/
Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {
this.manualTimeUpdates = true;
this.on('play', this.trackCurrentTime);
this.on('pause', this.stopTrackingCurrentTime);
};
/**
* Remove event listeners for on play and pause and tracking current time
*
* @method manualTimeUpdatesOff
*/
Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {
this.manualTimeUpdates = false;
this.stopTrackingCurrentTime();
this.off('play', this.trackCurrentTime);
this.off('pause', this.stopTrackingCurrentTime);
};
/**
* Tracks current time
*
* @method trackCurrentTime
*/
Tech.prototype.trackCurrentTime = function trackCurrentTime() {
if (this.currentTimeInterval) {
this.stopTrackingCurrentTime();
}
this.currentTimeInterval = this.setInterval(function () {
this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
}, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
};
/**
* Turn off play progress tracking (when paused or dragging)
*
* @method stopTrackingCurrentTime
*/
Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {
this.clearInterval(this.currentTimeInterval);
// #1002 - if the video ends right before the next timeupdate would happen,
// the progress bar won't make it all the way to the end
this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
};
/**
* Turn off any manual progress or timeupdate tracking
*
* @method dispose
*/
Tech.prototype.dispose = function dispose() {
// clear out text tracks because we can't reuse them between techs
var textTracks = this.textTracks();
if (textTracks) {
var i = textTracks.length;
while (i--) {
this.removeRemoteTextTrack(textTracks[i]);
}
}
// Turn off any manual progress or timeupdate tracking
if (this.manualProgress) {
this.manualProgressOff();
}
if (this.manualTimeUpdates) {
this.manualTimeUpdatesOff();
}
_Component.prototype.dispose.call(this);
};
/**
* Reset the tech. Removes all sources and resets readyState.
*
* @method reset
*/
Tech.prototype.reset = function reset() {};
/**
* When invoked without an argument, returns a MediaError object
* representing the current error state of the player or null if
* there is no error. When invoked with an argument, set the current
* error state of the player.
* @param {MediaError=} err Optional an error object
* @return {MediaError} the current error object or null
* @method error
*/
Tech.prototype.error = function error(err) {
if (err !== undefined) {
if (err instanceof _mediaErrorJs2['default']) {
this.error_ = err;
} else {
this.error_ = new _mediaErrorJs2['default'](err);
}
this.trigger('error');
}
return this.error_;
};
/**
* Return the time ranges that have been played through for the
* current source. This implementation is incomplete. It does not
* track the played time ranges, only whether the source has played
* at all or not.
* @return {TimeRangeObject} a single time range if this video has
* played or an empty set of ranges if not.
* @method played
*/
Tech.prototype.played = function played() {
if (this.hasStarted_) {
return _utilsTimeRangesJs.createTimeRange(0, 0);
}
return _utilsTimeRangesJs.createTimeRange();
};
/**
* Set current time
*
* @method setCurrentTime
*/
Tech.prototype.setCurrentTime = function setCurrentTime() {
// improve the accuracy of manual timeupdates
if (this.manualTimeUpdates) {
this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
}
};
/**
* Initialize texttrack listeners
*
* @method initTextTrackListeners
*/
Tech.prototype.initTextTrackListeners = function initTextTrackListeners() {
var textTrackListChanges = Fn.bind(this, function () {
this.trigger('texttrackchange');
});
var tracks = this.textTracks();
if (!tracks) return;
tracks.addEventListener('removetrack', textTrackListChanges);
tracks.addEventListener('addtrack', textTrackListChanges);
this.on('dispose', Fn.bind(this, function () {
tracks.removeEventListener('removetrack', textTrackListChanges);
tracks.removeEventListener('addtrack', textTrackListChanges);
}));
};
/**
* Emulate texttracks
*
* @method emulateTextTracks
*/
Tech.prototype.emulateTextTracks = function emulateTextTracks() {
var _this = this;
var tracks = this.textTracks();
if (!tracks) {
return;
}
if (!_globalWindow2['default']['WebVTT'] && this.el().parentNode != null) {
var script = _globalDocument2['default'].createElement('script');
script.src = this.options_['vtt.js'] || 'https://cdn.rawgit.com/gkatsev/vtt.js/vjs-v0.12.1/dist/vtt.min.js';
this.el().parentNode.appendChild(script);
_globalWindow2['default']['WebVTT'] = true;
}
var updateDisplay = function updateDisplay() {
return _this.trigger('texttrackchange');
};
var textTracksChanges = function textTracksChanges() {
updateDisplay();
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
track.removeEventListener('cuechange', updateDisplay);
if (track.mode === 'showing') {
track.addEventListener('cuechange', updateDisplay);
}
}
};
textTracksChanges();
tracks.addEventListener('change', textTracksChanges);
this.on('dispose', function () {
tracks.removeEventListener('change', textTracksChanges);
});
};
/*
* Provide default methods for text tracks.
*
* Html5 tech overrides these.
*/
/**
* Get texttracks
*
* @returns {TextTrackList}
* @method textTracks
*/
Tech.prototype.textTracks = function textTracks() {
this.textTracks_ = this.textTracks_ || new _tracksTextTrackList2['default']();
return this.textTracks_;
};
/**
* Get remote texttracks
*
* @returns {TextTrackList}
* @method remoteTextTracks
*/
Tech.prototype.remoteTextTracks = function remoteTextTracks() {
this.remoteTextTracks_ = this.remoteTextTracks_ || new _tracksTextTrackList2['default']();
return this.remoteTextTracks_;
};
/**
* Get remote htmltrackelements
*
* @returns {HTMLTrackElementList}
* @method remoteTextTrackEls
*/
Tech.prototype.remoteTextTrackEls = function remoteTextTrackEls() {
this.remoteTextTrackEls_ = this.remoteTextTrackEls_ || new _tracksHtmlTrackElementList2['default']();
return this.remoteTextTrackEls_;
};
/**
* Creates and returns a remote text track object
*
* @param {String} kind Text track kind (subtitles, captions, descriptions
* chapters and metadata)
* @param {String=} label Label to identify the text track
* @param {String=} language Two letter language abbreviation
* @return {TextTrackObject}
* @method addTextTrack
*/
Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {
if (!kind) {
throw new Error('TextTrack kind is required but was not provided');
}
return createTrackHelper(this, kind, label, language);
};
/**
* Creates a remote text track object and returns a emulated html track element
*
* @param {Object} options The object should contain values for
* kind, language, label and src (location of the WebVTT file)
* @return {HTMLTrackElement}
* @method addRemoteTextTrack
*/
Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
var track = _utilsMergeOptionsJs2['default'](options, {
tech: this
});
var htmlTrackElement = new _tracksHtmlTrackElement2['default'](track);
// store HTMLTrackElement and TextTrack to remote list
this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);
this.remoteTextTracks().addTrack_(htmlTrackElement.track);
// must come after remoteTextTracks()
this.textTracks().addTrack_(htmlTrackElement.track);
return htmlTrackElement;
};
/**
* Remove remote texttrack
*
* @param {TextTrackObject} track Texttrack to remove
* @method removeRemoteTextTrack
*/
Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
this.textTracks().removeTrack_(track);
var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);
// remove HTMLTrackElement and TextTrack from remote list
this.remoteTextTrackEls().removeTrackElement_(trackElement);
this.remoteTextTracks().removeTrack_(track);
};
/**
* Provide a default setPoster method for techs
* Poster support for techs should be optional, so we don't want techs to
* break if they don't have a way to set a poster.
*
* @method setPoster
*/
Tech.prototype.setPoster = function setPoster() {};
/*
* Check if the tech can support the given type
*
* The base tech does not support any type, but source handlers might
* overwrite this.
*
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Tech.prototype.canPlayType = function canPlayType() {
return '';
};
/*
* Return whether the argument is a Tech or not.
* Can be passed either a Class like `Html5` or a instance like `player.tech_`
*
* @param {Object} component An item to check
* @return {Boolean} Whether it is a tech or not
*/
Tech.isTech = function isTech(component) {
return component.prototype instanceof Tech || component instanceof Tech || component === Tech;
};
/**
* Registers a Tech
*
* @param {String} name Name of the Tech to register
* @param {Object} tech The tech to register
* @static
* @method registerComponent
*/
Tech.registerTech = function registerTech(name, tech) {
if (!Tech.techs_) {
Tech.techs_ = {};
}
if (!Tech.isTech(tech)) {
throw new Error('Tech ' + name + ' must be a Tech');
}
Tech.techs_[name] = tech;
return tech;
};
/**
* Gets a component by name
*
* @param {String} name Name of the component to get
* @return {Component}
* @static
* @method getComponent
*/
Tech.getTech = function getTech(name) {
if (Tech.techs_ && Tech.techs_[name]) {
return Tech.techs_[name];
}
if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) {
_utilsLogJs2['default'].warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)');
return _globalWindow2['default'].videojs[name];
}
};
return Tech;
})(_component2['default']);
Tech.prototype.textTracks_;
var createTrackHelper = function createTrackHelper(self, kind, label, language) {
var options = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4];
var tracks = self.textTracks();
options.kind = kind;
if (label) {
options.label = label;
}
if (language) {
options.language = language;
}
options.tech = self;
var track = new _tracksTextTrack2['default'](options);
tracks.addTrack_(track);
return track;
};
Tech.prototype.featuresVolumeControl = true;
// Resizing plugins using request fullscreen reloads the plugin
Tech.prototype.featuresFullscreenResize = false;
Tech.prototype.featuresPlaybackRate = false;
// Optional events that we can manually mimic with timers
// currently not triggered by video-js-swf
Tech.prototype.featuresProgressEvents = false;
Tech.prototype.featuresTimeupdateEvents = false;
Tech.prototype.featuresNativeTextTracks = false;
/*
* A functional mixin for techs that want to use the Source Handler pattern.
*
* ##### EXAMPLE:
*
* Tech.withSourceHandlers.call(MyTech);
*
*/
Tech.withSourceHandlers = function (_Tech) {
/*
* Register a source handler
* Source handlers are scripts for handling specific formats.
* The source handler pattern is used for adaptive formats (HLS, DASH) that
* manually load video data and feed it into a Source Buffer (Media Source Extensions)
* @param {Function} handler The source handler
* @param {Boolean} first Register it before any existing handlers
*/
_Tech.registerSourceHandler = function (handler, index) {
var handlers = _Tech.sourceHandlers;
if (!handlers) {
handlers = _Tech.sourceHandlers = [];
}
if (index === undefined) {
// add to the end of the list
index = handlers.length;
}
handlers.splice(index, 0, handler);
};
/*
* Check if the tech can support the given type
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
_Tech.canPlayType = function (type) {
var handlers = _Tech.sourceHandlers || [];
var can = undefined;
for (var i = 0; i < handlers.length; i++) {
can = handlers[i].canPlayType(type);
if (can) {
return can;
}
}
return '';
};
/*
* Return the first source handler that supports the source
* TODO: Answer question: should 'probably' be prioritized over 'maybe'
* @param {Object} source The source object
* @returns {Object} The first source handler that supports the source
* @returns {null} Null if no source handler is found
*/
_Tech.selectSourceHandler = function (source) {
var handlers = _Tech.sourceHandlers || [];
var can = undefined;
for (var i = 0; i < handlers.length; i++) {
can = handlers[i].canHandleSource(source);
if (can) {
return handlers[i];
}
}
return null;
};
/*
* Check if the tech can support the given source
* @param {Object} srcObj The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
_Tech.canPlaySource = function (srcObj) {
var sh = _Tech.selectSourceHandler(srcObj);
if (sh) {
return sh.canHandleSource(srcObj);
}
return '';
};
/*
* When using a source handler, prefer its implementation of
* any function normally provided by the tech.
*/
var deferrable = ['seekable', 'duration'];
deferrable.forEach(function (fnName) {
var originalFn = this[fnName];
if (typeof originalFn !== 'function') {
return;
}
this[fnName] = function () {
if (this.sourceHandler_ && this.sourceHandler_[fnName]) {
return this.sourceHandler_[fnName].apply(this.sourceHandler_, arguments);
}
return originalFn.apply(this, arguments);
};
}, _Tech.prototype);
/*
* Create a function for setting the source using a source object
* and source handlers.
* Should never be called unless a source handler was found.
* @param {Object} source A source object with src and type keys
* @return {Tech} self
*/
_Tech.prototype.setSource = function (source) {
var sh = _Tech.selectSourceHandler(source);
if (!sh) {
// Fall back to a native source hander when unsupported sources are
// deliberately set
if (_Tech.nativeSourceHandler) {
sh = _Tech.nativeSourceHandler;
} else {
_utilsLogJs2['default'].error('No source hander found for the current source.');
}
}
// Dispose any existing source handler
this.disposeSourceHandler();
this.off('dispose', this.disposeSourceHandler);
this.currentSource_ = source;
this.sourceHandler_ = sh.handleSource(source, this);
this.on('dispose', this.disposeSourceHandler);
return this;
};
/*
* Clean up any existing source handler
*/
_Tech.prototype.disposeSourceHandler = function () {
if (this.sourceHandler_ && this.sourceHandler_.dispose) {
this.sourceHandler_.dispose();
}
};
};
_component2['default'].registerComponent('Tech', Tech);
// Old name for Tech
_component2['default'].registerComponent('MediaTechController', Tech);
Tech.registerTech('Tech', Tech);
exports['default'] = Tech;
module.exports = exports['default'];
},{"../component":65,"../media-error.js":101,"../tracks/html-track-element":117,"../tracks/html-track-element-list":116,"../tracks/text-track":124,"../tracks/text-track-list":122,"../utils/buffer.js":126,"../utils/fn.js":130,"../utils/log.js":133,"../utils/merge-options.js":134,"../utils/time-ranges.js":136,"global/document":1,"global/window":2}],116:[function(_dereq_,module,exports){
/**
* @file html-track-element.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var HtmlTrackElementList = (function () {
function HtmlTrackElementList() {
var trackElements = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
_classCallCheck(this, HtmlTrackElementList);
var list = this;
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in HtmlTrackElementList.prototype) {
if (prop !== 'constructor') {
list[prop] = HtmlTrackElementList.prototype[prop];
}
}
}
list.trackElements_ = [];
Object.defineProperty(list, 'length', {
get: function get() {
return this.trackElements_.length;
}
});
for (var i = 0, _length = trackElements.length; i < _length; i++) {
list.addTrackElement_(trackElements[i]);
}
if (browser.IS_IE8) {
return list;
}
}
HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) {
this.trackElements_.push(trackElement);
};
HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) {
var trackElement_ = undefined;
for (var i = 0, _length2 = this.trackElements_.length; i < _length2; i++) {
if (track === this.trackElements_[i].track) {
trackElement_ = this.trackElements_[i];
break;
}
}
return trackElement_;
};
HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) {
for (var i = 0, _length3 = this.trackElements_.length; i < _length3; i++) {
if (trackElement === this.trackElements_[i]) {
this.trackElements_.splice(i, 1);
break;
}
}
};
return HtmlTrackElementList;
})();
exports['default'] = HtmlTrackElementList;
module.exports = exports['default'];
},{"../utils/browser.js":125,"global/document":1}],117:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _eventTarget = _dereq_('../event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _tracksTextTrack = _dereq_('../tracks/text-track');
var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack);
var NONE = 0;
var LOADING = 1;
var LOADED = 2;
var ERROR = 3;
/**
* https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement
*
* interface HTMLTrackElement : HTMLElement {
* attribute DOMString kind;
* attribute DOMString src;
* attribute DOMString srclang;
* attribute DOMString label;
* attribute boolean default;
*
* const unsigned short NONE = 0;
* const unsigned short LOADING = 1;
* const unsigned short LOADED = 2;
* const unsigned short ERROR = 3;
* readonly attribute unsigned short readyState;
*
* readonly attribute TextTrack track;
* };
*
* @param {Object} options TextTrack configuration
* @class HTMLTrackElement
*/
var HTMLTrackElement = (function (_EventTarget) {
_inherits(HTMLTrackElement, _EventTarget);
function HTMLTrackElement() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, HTMLTrackElement);
_EventTarget.call(this);
var readyState = undefined,
trackElement = this;
if (browser.IS_IE8) {
trackElement = _globalDocument2['default'].createElement('custom');
for (var prop in HTMLTrackElement.prototype) {
if (prop !== 'constructor') {
trackElement[prop] = HTMLTrackElement.prototype[prop];
}
}
}
var track = new _tracksTextTrack2['default'](options);
trackElement.kind = track.kind;
trackElement.src = track.src;
trackElement.srclang = track.language;
trackElement.label = track.label;
trackElement['default'] = track['default'];
Object.defineProperty(trackElement, 'readyState', {
get: function get() {
return readyState;
}
});
Object.defineProperty(trackElement, 'track', {
get: function get() {
return track;
}
});
readyState = NONE;
track.addEventListener('loadeddata', function () {
readyState = LOADED;
trackElement.trigger({
type: 'load',
target: trackElement
});
});
if (browser.IS_IE8) {
return trackElement;
}
}
return HTMLTrackElement;
})(_eventTarget2['default']);
HTMLTrackElement.prototype.allowedEvents_ = {
load: 'load'
};
HTMLTrackElement.NONE = NONE;
HTMLTrackElement.LOADING = LOADING;
HTMLTrackElement.LOADED = LOADED;
HTMLTrackElement.ERROR = ERROR;
exports['default'] = HTMLTrackElement;
module.exports = exports['default'];
},{"../event-target":97,"../tracks/text-track":124,"../utils/browser.js":125,"global/document":1}],118:[function(_dereq_,module,exports){
/**
* @file text-track-cue-list.js
*/
'use strict';
exports.__esModule = true;
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; } }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/*
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist
*
* interface TextTrackCueList {
* readonly attribute unsigned long length;
* getter TextTrackCue (unsigned long index);
* TextTrackCue? getCueById(DOMString id);
* };
*/
var TextTrackCueList = function TextTrackCueList(cues) {
var list = this;
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in TextTrackCueList.prototype) {
if (prop !== 'constructor') {
list[prop] = TextTrackCueList.prototype[prop];
}
}
}
TextTrackCueList.prototype.setCues_.call(list, cues);
Object.defineProperty(list, 'length', {
get: function get() {
return this.length_;
}
});
if (browser.IS_IE8) {
return list;
}
};
TextTrackCueList.prototype.setCues_ = function (cues) {
var oldLength = this.length || 0;
var i = 0;
var l = cues.length;
this.cues_ = cues;
this.length_ = cues.length;
var defineProp = function defineProp(i) {
if (!('' + i in this)) {
Object.defineProperty(this, '' + i, {
get: function get() {
return this.cues_[i];
}
});
}
};
if (oldLength < l) {
i = oldLength;
for (; i < l; i++) {
defineProp.call(this, i);
}
}
};
TextTrackCueList.prototype.getCueById = function (id) {
var result = null;
for (var i = 0, l = this.length; i < l; i++) {
var cue = this[i];
if (cue.id === id) {
result = cue;
break;
}
}
return result;
};
exports['default'] = TextTrackCueList;
module.exports = exports['default'];
},{"../utils/browser.js":125,"global/document":1}],119:[function(_dereq_,module,exports){
/**
* @file text-track-display.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _menuMenuJs = _dereq_('../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _menuMenuItemJs = _dereq_('../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var darkGray = '#222';
var lightGray = '#ccc';
var fontMap = {
monospace: 'monospace',
sansSerif: 'sans-serif',
serif: 'serif',
monospaceSansSerif: '"Andale Mono", "Lucida Console", monospace',
monospaceSerif: '"Courier New", monospace',
proportionalSansSerif: 'sans-serif',
proportionalSerif: 'serif',
casual: '"Comic Sans MS", Impact, fantasy',
script: '"Monotype Corsiva", cursive',
smallcaps: '"Andale Mono", "Lucida Console", monospace, sans-serif'
};
/**
* The component for displaying text track cues
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Component
* @class TextTrackDisplay
*/
var TextTrackDisplay = (function (_Component) {
_inherits(TextTrackDisplay, _Component);
function TextTrackDisplay(player, options, ready) {
_classCallCheck(this, TextTrackDisplay);
_Component.call(this, player, options, ready);
player.on('loadstart', Fn.bind(this, this.toggleDisplay));
player.on('texttrackchange', Fn.bind(this, this.updateDisplay));
// This used to be called during player init, but was causing an error
// if a track should show by default and the display hadn't loaded yet.
// Should probably be moved to an external track loader when we support
// tracks that don't need a display.
player.ready(Fn.bind(this, function () {
if (player.tech_ && player.tech_['featuresNativeTextTracks']) {
this.hide();
return;
}
player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));
var tracks = this.options_.playerOptions['tracks'] || [];
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
this.player_.addRemoteTextTrack(track);
}
}));
}
/**
* Add cue HTML to display
*
* @param {Number} color Hex number for color, like #f0e
* @param {Number} opacity Value for opacity,0.0 - 1.0
* @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'
* @method constructColor
*/
/**
* Toggle display texttracks
*
* @method toggleDisplay
*/
TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {
if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {
this.hide();
} else {
this.show();
}
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TextTrackDisplay.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-text-track-display'
});
};
/**
* Clear display texttracks
*
* @method clearDisplay
*/
TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {
if (typeof _globalWindow2['default']['WebVTT'] === 'function') {
_globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], [], this.el_);
}
};
/**
* Update display texttracks
*
* @method updateDisplay
*/
TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {
var tracks = this.player_.textTracks();
this.clearDisplay();
if (!tracks) {
return;
}
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
if (track['mode'] === 'showing') {
this.updateForTrack(track);
}
}
};
/**
* Add texttrack to texttrack list
*
* @param {TextTrackObject} track Texttrack object to be added to list
* @method updateForTrack
*/
TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {
if (typeof _globalWindow2['default']['WebVTT'] !== 'function' || !track['activeCues']) {
return;
}
var overrides = this.player_['textTrackSettings'].getValues();
var cues = [];
for (var _i = 0; _i < track['activeCues'].length; _i++) {
cues.push(track['activeCues'][_i]);
}
_globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], track['activeCues'], this.el_);
var i = cues.length;
while (i--) {
var cue = cues[i];
if (!cue) {
continue;
}
var cueDiv = cue.displayState;
if (overrides.color) {
cueDiv.firstChild.style.color = overrides.color;
}
if (overrides.textOpacity) {
tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));
}
if (overrides.backgroundColor) {
cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;
}
if (overrides.backgroundOpacity) {
tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));
}
if (overrides.windowColor) {
if (overrides.windowOpacity) {
tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));
} else {
cueDiv.style.backgroundColor = overrides.windowColor;
}
}
if (overrides.edgeStyle) {
if (overrides.edgeStyle === 'dropshadow') {
cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;
} else if (overrides.edgeStyle === 'raised') {
cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;
} else if (overrides.edgeStyle === 'depressed') {
cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;
} else if (overrides.edgeStyle === 'uniform') {
cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;
}
}
if (overrides.fontPercent && overrides.fontPercent !== 1) {
var fontSize = _globalWindow2['default'].parseFloat(cueDiv.style.fontSize);
cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';
cueDiv.style.height = 'auto';
cueDiv.style.top = 'auto';
cueDiv.style.bottom = '2px';
}
if (overrides.fontFamily && overrides.fontFamily !== 'default') {
if (overrides.fontFamily === 'small-caps') {
cueDiv.firstChild.style.fontVariant = 'small-caps';
} else {
cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];
}
}
}
};
return TextTrackDisplay;
})(_component2['default']);
function constructColor(color, opacity) {
return 'rgba(' +
// color looks like "#f0e"
parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')';
}
/**
* Try to update style
* Some style changes will throw an error, particularly in IE8. Those should be noops.
*
* @param {Element} el The element to be styles
* @param {CSSProperty} style The CSS property to be styled
* @param {CSSStyle} rule The actual style to be applied to the property
* @method tryUpdateStyle
*/
function tryUpdateStyle(el, style, rule) {
//
try {
el.style[style] = rule;
} catch (e) {}
}
_component2['default'].registerComponent('TextTrackDisplay', TextTrackDisplay);
exports['default'] = TextTrackDisplay;
module.exports = exports['default'];
},{"../component":65,"../menu/menu-button.js":102,"../menu/menu-item.js":103,"../menu/menu.js":104,"../utils/fn.js":130,"global/document":1,"global/window":2}],120:[function(_dereq_,module,exports){
/**
* @file text-track-enums.js
*
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode
*
* enum TextTrackMode { "disabled", "hidden", "showing" };
*/
'use strict';
exports.__esModule = true;
var TextTrackMode = {
'disabled': 'disabled',
'hidden': 'hidden',
'showing': 'showing'
};
/*
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind
*
* enum TextTrackKind { "subtitles", "captions", "descriptions", "chapters", "metadata" };
*/
var TextTrackKind = {
'subtitles': 'subtitles',
'captions': 'captions',
'descriptions': 'descriptions',
'chapters': 'chapters',
'metadata': 'metadata'
};
exports.TextTrackMode = TextTrackMode;
exports.TextTrackKind = TextTrackKind;
},{}],121:[function(_dereq_,module,exports){
/**
* Utilities for capturing text track state and re-creating tracks
* based on a capture.
*
* @file text-track-list-converter.js
*/
/**
* Examine a single text track and return a JSON-compatible javascript
* object that represents the text track's state.
* @param track {TextTrackObject} the text track to query
* @return {Object} a serializable javascript representation of the
* @private
*/
'use strict';
exports.__esModule = true;
var trackToJson_ = function trackToJson_(track) {
var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) {
if (track[prop]) {
acc[prop] = track[prop];
}
return acc;
}, {
cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {
return {
startTime: cue.startTime,
endTime: cue.endTime,
text: cue.text,
id: cue.id
};
})
});
return ret;
};
/**
* Examine a tech and return a JSON-compatible javascript array that
* represents the state of all text tracks currently configured. The
* return array is compatible with `jsonToTextTracks`.
* @param tech {tech} the tech object to query
* @return {Array} a serializable javascript representation of the
* @function textTracksToJson
*/
var textTracksToJson = function textTracksToJson(tech) {
var trackEls = tech.$$('track');
var trackObjs = Array.prototype.map.call(trackEls, function (t) {
return t.track;
});
var tracks = Array.prototype.map.call(trackEls, function (trackEl) {
var json = trackToJson_(trackEl.track);
if (trackEl.src) {
json.src = trackEl.src;
}
return json;
});
return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {
return trackObjs.indexOf(track) === -1;
}).map(trackToJson_));
};
/**
* Creates a set of remote text tracks on a tech based on an array of
* javascript text track representations.
* @param json {Array} an array of text track representation objects,
* like those that would be produced by `textTracksToJson`
* @param tech {tech} the tech to create text tracks on
* @function jsonToTextTracks
*/
var jsonToTextTracks = function jsonToTextTracks(json, tech) {
json.forEach(function (track) {
var addedTrack = tech.addRemoteTextTrack(track).track;
if (!track.src && track.cues) {
track.cues.forEach(function (cue) {
return addedTrack.addCue(cue);
});
}
});
return tech.textTracks();
};
exports['default'] = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };
module.exports = exports['default'];
},{}],122:[function(_dereq_,module,exports){
/**
* @file text-track-list.js
*/
'use strict';
exports.__esModule = true;
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 }; }
var _eventTarget = _dereq_('../event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/*
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist
*
* interface TextTrackList : EventTarget {
* readonly attribute unsigned long length;
* getter TextTrack (unsigned long index);
* TextTrack? getTrackById(DOMString id);
*
* attribute EventHandler onchange;
* attribute EventHandler onaddtrack;
* attribute EventHandler onremovetrack;
* };
*/
var TextTrackList = function TextTrackList(tracks) {
var list = this;
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in TextTrackList.prototype) {
if (prop !== 'constructor') {
list[prop] = TextTrackList.prototype[prop];
}
}
}
tracks = tracks || [];
list.tracks_ = [];
Object.defineProperty(list, 'length', {
get: function get() {
return this.tracks_.length;
}
});
for (var i = 0; i < tracks.length; i++) {
list.addTrack_(tracks[i]);
}
if (browser.IS_IE8) {
return list;
}
};
TextTrackList.prototype = Object.create(_eventTarget2['default'].prototype);
TextTrackList.prototype.constructor = TextTrackList;
/*
* change - One or more tracks in the track list have been enabled or disabled.
* addtrack - A track has been added to the track list.
* removetrack - A track has been removed from the track list.
*/
TextTrackList.prototype.allowedEvents_ = {
'change': 'change',
'addtrack': 'addtrack',
'removetrack': 'removetrack'
};
// emulate attribute EventHandler support to allow for feature detection
for (var _event in TextTrackList.prototype.allowedEvents_) {
TextTrackList.prototype['on' + _event] = null;
}
/**
* Add TextTrack from TextTrackList
*
* @param {TextTrack} track
* @method addTrack_
* @private
*/
TextTrackList.prototype.addTrack_ = function (track) {
var index = this.tracks_.length;
if (!('' + index in this)) {
Object.defineProperty(this, index, {
get: function get() {
return this.tracks_[index];
}
});
}
track.addEventListener('modechange', Fn.bind(this, function () {
this.trigger('change');
}));
this.tracks_.push(track);
this.trigger({
type: 'addtrack',
track: track
});
};
/**
* Remove TextTrack from TextTrackList
* NOTE: Be mindful of what is passed in as it may be a HTMLTrackElement
*
* @param {TextTrack} rtrack
* @method removeTrack_
* @private
*/
TextTrackList.prototype.removeTrack_ = function (rtrack) {
var track = undefined;
for (var i = 0, l = this.length; i < l; i++) {
if (this[i] === rtrack) {
track = this[i];
this.tracks_.splice(i, 1);
break;
}
}
if (!track) {
return;
}
this.trigger({
type: 'removetrack',
track: track
});
};
TextTrackList.prototype.getTrackById = function (id) {
var result = null;
for (var i = 0, l = this.length; i < l; i++) {
var track = this[i];
if (track.id === id) {
result = track;
break;
}
}
return result;
};
exports['default'] = TextTrackList;
module.exports = exports['default'];
},{"../event-target":97,"../utils/browser.js":125,"../utils/fn.js":130,"global/document":1}],123:[function(_dereq_,module,exports){
/**
* @file text-track-settings.js
*/
'use strict';
exports.__esModule = true;
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsEventsJs = _dereq_('../utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* Manipulate settings of texttracks
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Component
* @class TextTrackSettings
*/
var TextTrackSettings = (function (_Component) {
_inherits(TextTrackSettings, _Component);
function TextTrackSettings(player, options) {
_classCallCheck(this, TextTrackSettings);
_Component.call(this, player, options);
this.hide();
// Grab `persistTextTrackSettings` from the player options if not passed in child options
if (options.persistTextTrackSettings === undefined) {
this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;
}
Events.on(this.$('.vjs-done-button'), 'click', Fn.bind(this, function () {
this.saveSettings();
this.hide();
}));
Events.on(this.$('.vjs-default-button'), 'click', Fn.bind(this, function () {
this.$('.vjs-fg-color > select').selectedIndex = 0;
this.$('.vjs-bg-color > select').selectedIndex = 0;
this.$('.window-color > select').selectedIndex = 0;
this.$('.vjs-text-opacity > select').selectedIndex = 0;
this.$('.vjs-bg-opacity > select').selectedIndex = 0;
this.$('.vjs-window-opacity > select').selectedIndex = 0;
this.$('.vjs-edge-style select').selectedIndex = 0;
this.$('.vjs-font-family select').selectedIndex = 0;
this.$('.vjs-font-percent select').selectedIndex = 2;
this.updateDisplay();
}));
Events.on(this.$('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));
if (this.options_.persistTextTrackSettings) {
this.restoreSettings();
}
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TextTrackSettings.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-caption-settings vjs-modal-overlay',
innerHTML: captionOptionsMenuTemplate()
});
};
/**
* Get texttrack settings
* Settings are
* .vjs-edge-style
* .vjs-font-family
* .vjs-fg-color
* .vjs-text-opacity
* .vjs-bg-color
* .vjs-bg-opacity
* .window-color
* .vjs-window-opacity
*
* @return {Object}
* @method getValues
*/
TextTrackSettings.prototype.getValues = function getValues() {
var textEdge = getSelectedOptionValue(this.$('.vjs-edge-style select'));
var fontFamily = getSelectedOptionValue(this.$('.vjs-font-family select'));
var fgColor = getSelectedOptionValue(this.$('.vjs-fg-color > select'));
var textOpacity = getSelectedOptionValue(this.$('.vjs-text-opacity > select'));
var bgColor = getSelectedOptionValue(this.$('.vjs-bg-color > select'));
var bgOpacity = getSelectedOptionValue(this.$('.vjs-bg-opacity > select'));
var windowColor = getSelectedOptionValue(this.$('.window-color > select'));
var windowOpacity = getSelectedOptionValue(this.$('.vjs-window-opacity > select'));
var fontPercent = _globalWindow2['default']['parseFloat'](getSelectedOptionValue(this.$('.vjs-font-percent > select')));
var result = {
'backgroundOpacity': bgOpacity,
'textOpacity': textOpacity,
'windowOpacity': windowOpacity,
'edgeStyle': textEdge,
'fontFamily': fontFamily,
'color': fgColor,
'backgroundColor': bgColor,
'windowColor': windowColor,
'fontPercent': fontPercent
};
for (var _name in result) {
if (result[_name] === '' || result[_name] === 'none' || _name === 'fontPercent' && result[_name] === 1.00) {
delete result[_name];
}
}
return result;
};
/**
* Set texttrack settings
* Settings are
* .vjs-edge-style
* .vjs-font-family
* .vjs-fg-color
* .vjs-text-opacity
* .vjs-bg-color
* .vjs-bg-opacity
* .window-color
* .vjs-window-opacity
*
* @param {Object} values Object with texttrack setting values
* @method setValues
*/
TextTrackSettings.prototype.setValues = function setValues(values) {
setSelectedOption(this.$('.vjs-edge-style select'), values.edgeStyle);
setSelectedOption(this.$('.vjs-font-family select'), values.fontFamily);
setSelectedOption(this.$('.vjs-fg-color > select'), values.color);
setSelectedOption(this.$('.vjs-text-opacity > select'), values.textOpacity);
setSelectedOption(this.$('.vjs-bg-color > select'), values.backgroundColor);
setSelectedOption(this.$('.vjs-bg-opacity > select'), values.backgroundOpacity);
setSelectedOption(this.$('.window-color > select'), values.windowColor);
setSelectedOption(this.$('.vjs-window-opacity > select'), values.windowOpacity);
var fontPercent = values.fontPercent;
if (fontPercent) {
fontPercent = fontPercent.toFixed(2);
}
setSelectedOption(this.$('.vjs-font-percent > select'), fontPercent);
};
/**
* Restore texttrack settings
*
* @method restoreSettings
*/
TextTrackSettings.prototype.restoreSettings = function restoreSettings() {
var _safeParseTuple = _safeJsonParseTuple2['default'](_globalWindow2['default'].localStorage.getItem('vjs-text-track-settings'));
var err = _safeParseTuple[0];
var values = _safeParseTuple[1];
if (err) {
_utilsLogJs2['default'].error(err);
}
if (values) {
this.setValues(values);
}
};
/**
* Save texttrack settings to local storage
*
* @method saveSettings
*/
TextTrackSettings.prototype.saveSettings = function saveSettings() {
if (!this.options_.persistTextTrackSettings) {
return;
}
var values = this.getValues();
try {
if (Object.getOwnPropertyNames(values).length > 0) {
_globalWindow2['default'].localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));
} else {
_globalWindow2['default'].localStorage.removeItem('vjs-text-track-settings');
}
} catch (e) {}
};
/**
* Update display of texttrack settings
*
* @method updateDisplay
*/
TextTrackSettings.prototype.updateDisplay = function updateDisplay() {
var ttDisplay = this.player_.getChild('textTrackDisplay');
if (ttDisplay) {
ttDisplay.updateDisplay();
}
};
return TextTrackSettings;
})(_component2['default']);
_component2['default'].registerComponent('TextTrackSettings', TextTrackSettings);
function getSelectedOptionValue(target) {
var selectedOption = undefined;
// not all browsers support selectedOptions, so, fallback to options
if (target.selectedOptions) {
selectedOption = target.selectedOptions[0];
} else if (target.options) {
selectedOption = target.options[target.options.selectedIndex];
}
return selectedOption.value;
}
function setSelectedOption(target, value) {
if (!value) {
return;
}
var i = undefined;
for (i = 0; i < target.options.length; i++) {
var option = target.options[i];
if (option.value === value) {
break;
}
}
target.selectedIndex = i;
}
function captionOptionsMenuTemplate() {
var template = '<div class="vjs-tracksettings">\n <div class="vjs-tracksettings-colors">\n <div class="vjs-fg-color vjs-tracksetting">\n <label class="vjs-label">Foreground</label>\n <select>\n <option value="">---</option>\n <option value="#FFF">White</option>\n <option value="#000">Black</option>\n <option value="#F00">Red</option>\n <option value="#0F0">Green</option>\n <option value="#00F">Blue</option>\n <option value="#FF0">Yellow</option>\n <option value="#F0F">Magenta</option>\n <option value="#0FF">Cyan</option>\n </select>\n <span class="vjs-text-opacity vjs-opacity">\n <select>\n <option value="">---</option>\n <option value="1">Opaque</option>\n <option value="0.5">Semi-Opaque</option>\n </select>\n </span>\n </div> <!-- vjs-fg-color -->\n <div class="vjs-bg-color vjs-tracksetting">\n <label class="vjs-label">Background</label>\n <select>\n <option value="">---</option>\n <option value="#FFF">White</option>\n <option value="#000">Black</option>\n <option value="#F00">Red</option>\n <option value="#0F0">Green</option>\n <option value="#00F">Blue</option>\n <option value="#FF0">Yellow</option>\n <option value="#F0F">Magenta</option>\n <option value="#0FF">Cyan</option>\n </select>\n <span class="vjs-bg-opacity vjs-opacity">\n <select>\n <option value="">---</option>\n <option value="1">Opaque</option>\n <option value="0.5">Semi-Transparent</option>\n <option value="0">Transparent</option>\n </select>\n </span>\n </div> <!-- vjs-bg-color -->\n <div class="window-color vjs-tracksetting">\n <label class="vjs-label">Window</label>\n <select>\n <option value="">---</option>\n <option value="#FFF">White</option>\n <option value="#000">Black</option>\n <option value="#F00">Red</option>\n <option value="#0F0">Green</option>\n <option value="#00F">Blue</option>\n <option value="#FF0">Yellow</option>\n <option value="#F0F">Magenta</option>\n <option value="#0FF">Cyan</option>\n </select>\n <span class="vjs-window-opacity vjs-opacity">\n <select>\n <option value="">---</option>\n <option value="1">Opaque</option>\n <option value="0.5">Semi-Transparent</option>\n <option value="0">Transparent</option>\n </select>\n </span>\n </div> <!-- vjs-window-color -->\n </div> <!-- vjs-tracksettings -->\n <div class="vjs-tracksettings-font">\n <div class="vjs-font-percent vjs-tracksetting">\n <label class="vjs-label">Font Size</label>\n <select>\n <option value="0.50">50%</option>\n <option value="0.75">75%</option>\n <option value="1.00" selected>100%</option>\n <option value="1.25">125%</option>\n <option value="1.50">150%</option>\n <option value="1.75">175%</option>\n <option value="2.00">200%</option>\n <option value="3.00">300%</option>\n <option value="4.00">400%</option>\n </select>\n </div> <!-- vjs-font-percent -->\n <div class="vjs-edge-style vjs-tracksetting">\n <label class="vjs-label">Text Edge Style</label>\n <select>\n <option value="none">None</option>\n <option value="raised">Raised</option>\n <option value="depressed">Depressed</option>\n <option value="uniform">Uniform</option>\n <option value="dropshadow">Dropshadow</option>\n </select>\n </div> <!-- vjs-edge-style -->\n <div class="vjs-font-family vjs-tracksetting">\n <label class="vjs-label">Font Family</label>\n <select>\n <option value="">Default</option>\n <option value="monospaceSerif">Monospace Serif</option>\n <option value="proportionalSerif">Proportional Serif</option>\n <option value="monospaceSansSerif">Monospace Sans-Serif</option>\n <option value="proportionalSansSerif">Proportional Sans-Serif</option>\n <option value="casual">Casual</option>\n <option value="script">Script</option>\n <option value="small-caps">Small Caps</option>\n </select>\n </div> <!-- vjs-font-family -->\n </div>\n </div>\n <div class="vjs-tracksettings-controls">\n <button class="vjs-default-button">Defaults</button>\n <button class="vjs-done-button">Done</button>\n </div>';
return template;
}
exports['default'] = TextTrackSettings;
module.exports = exports['default'];
},{"../component":65,"../utils/events.js":129,"../utils/fn.js":130,"../utils/log.js":133,"global/window":2,"safe-json-parse/tuple":53}],124:[function(_dereq_,module,exports){
/**
* @file text-track.js
*/
'use strict';
exports.__esModule = true;
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 }; }
var _textTrackCueList = _dereq_('./text-track-cue-list');
var _textTrackCueList2 = _interopRequireDefault(_textTrackCueList);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsGuidJs = _dereq_('../utils/guid.js');
var Guid = _interopRequireWildcard(_utilsGuidJs);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _textTrackEnums = _dereq_('./text-track-enums');
var TextTrackEnum = _interopRequireWildcard(_textTrackEnums);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _eventTarget = _dereq_('../event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsUrlJs = _dereq_('../utils/url.js');
var _xhr = _dereq_('xhr');
var _xhr2 = _interopRequireDefault(_xhr);
/*
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack
*
* interface TextTrack : EventTarget {
* readonly attribute TextTrackKind kind;
* readonly attribute DOMString label;
* readonly attribute DOMString language;
*
* readonly attribute DOMString id;
* readonly attribute DOMString inBandMetadataTrackDispatchType;
*
* attribute TextTrackMode mode;
*
* readonly attribute TextTrackCueList? cues;
* readonly attribute TextTrackCueList? activeCues;
*
* void addCue(TextTrackCue cue);
* void removeCue(TextTrackCue cue);
*
* attribute EventHandler oncuechange;
* };
*/
var TextTrack = function TextTrack() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
if (!options.tech) {
throw new Error('A tech was not provided.');
}
var tt = this;
if (browser.IS_IE8) {
tt = _globalDocument2['default'].createElement('custom');
for (var prop in TextTrack.prototype) {
if (prop !== 'constructor') {
tt[prop] = TextTrack.prototype[prop];
}
}
}
tt.tech_ = options.tech;
var mode = TextTrackEnum.TextTrackMode[options['mode']] || 'disabled';
var kind = TextTrackEnum.TextTrackKind[options['kind']] || 'subtitles';
var label = options['label'] || '';
var language = options['language'] || options['srclang'] || '';
var id = options['id'] || 'vjs_text_track_' + Guid.newGUID();
if (kind === 'metadata' || kind === 'chapters') {
mode = 'hidden';
}
tt.cues_ = [];
tt.activeCues_ = [];
var cues = new _textTrackCueList2['default'](tt.cues_);
var activeCues = new _textTrackCueList2['default'](tt.activeCues_);
var changed = false;
var timeupdateHandler = Fn.bind(tt, function () {
this['activeCues'];
if (changed) {
this['trigger']('cuechange');
changed = false;
}
});
if (mode !== 'disabled') {
tt.tech_.on('timeupdate', timeupdateHandler);
}
Object.defineProperty(tt, 'kind', {
get: function get() {
return kind;
},
set: Function.prototype
});
Object.defineProperty(tt, 'label', {
get: function get() {
return label;
},
set: Function.prototype
});
Object.defineProperty(tt, 'language', {
get: function get() {
return language;
},
set: Function.prototype
});
Object.defineProperty(tt, 'id', {
get: function get() {
return id;
},
set: Function.prototype
});
Object.defineProperty(tt, 'mode', {
get: function get() {
return mode;
},
set: function set(newMode) {
if (!TextTrackEnum.TextTrackMode[newMode]) {
return;
}
mode = newMode;
if (mode === 'showing') {
this.tech_.on('timeupdate', timeupdateHandler);
}
this.trigger('modechange');
}
});
Object.defineProperty(tt, 'cues', {
get: function get() {
if (!this.loaded_) {
return null;
}
return cues;
},
set: Function.prototype
});
Object.defineProperty(tt, 'activeCues', {
get: function get() {
if (!this.loaded_) {
return null;
}
if (this['cues'].length === 0) {
return activeCues; // nothing to do
}
var ct = this.tech_.currentTime();
var active = [];
for (var i = 0, l = this['cues'].length; i < l; i++) {
var cue = this['cues'][i];
if (cue['startTime'] <= ct && cue['endTime'] >= ct) {
active.push(cue);
} else if (cue['startTime'] === cue['endTime'] && cue['startTime'] <= ct && cue['startTime'] + 0.5 >= ct) {
active.push(cue);
}
}
changed = false;
if (active.length !== this.activeCues_.length) {
changed = true;
} else {
for (var i = 0; i < active.length; i++) {
if (indexOf.call(this.activeCues_, active[i]) === -1) {
changed = true;
}
}
}
this.activeCues_ = active;
activeCues.setCues_(this.activeCues_);
return activeCues;
},
set: Function.prototype
});
if (options.src) {
tt.src = options.src;
loadTrack(options.src, tt);
} else {
tt.loaded_ = true;
}
if (browser.IS_IE8) {
return tt;
}
};
TextTrack.prototype = Object.create(_eventTarget2['default'].prototype);
TextTrack.prototype.constructor = TextTrack;
/*
* cuechange - One or more cues in the track have become active or stopped being active.
*/
TextTrack.prototype.allowedEvents_ = {
'cuechange': 'cuechange'
};
TextTrack.prototype.addCue = function (cue) {
var tracks = this.tech_.textTracks();
if (tracks) {
for (var i = 0; i < tracks.length; i++) {
if (tracks[i] !== this) {
tracks[i].removeCue(cue);
}
}
}
this.cues_.push(cue);
this['cues'].setCues_(this.cues_);
};
TextTrack.prototype.removeCue = function (removeCue) {
var removed = false;
for (var i = 0, l = this.cues_.length; i < l; i++) {
var cue = this.cues_[i];
if (cue === removeCue) {
this.cues_.splice(i, 1);
removed = true;
}
}
if (removed) {
this.cues.setCues_(this.cues_);
}
};
/*
* Downloading stuff happens below this point
*/
var parseCues = function parseCues(srcContent, track) {
var parser = new _globalWindow2['default'].WebVTT.Parser(_globalWindow2['default'], _globalWindow2['default'].vttjs, _globalWindow2['default'].WebVTT.StringDecoder());
parser.oncue = function (cue) {
track.addCue(cue);
};
parser.onparsingerror = function (error) {
_utilsLogJs2['default'].error(error);
};
parser.onflush = function () {
track.trigger({
type: 'loadeddata',
target: track
});
};
parser.parse(srcContent);
parser.flush();
};
var loadTrack = function loadTrack(src, track) {
var opts = {
uri: src
};
var crossOrigin = _utilsUrlJs.isCrossOrigin(src);
if (crossOrigin) {
opts.cors = crossOrigin;
}
_xhr2['default'](opts, Fn.bind(this, function (err, response, responseBody) {
if (err) {
return _utilsLogJs2['default'].error(err, response);
}
track.loaded_ = true;
// NOTE: this is only used for the alt/video.novtt.js build
if (typeof _globalWindow2['default'].WebVTT !== 'function') {
_globalWindow2['default'].setTimeout(function () {
parseCues(responseBody, track);
}, 100);
} else {
parseCues(responseBody, track);
}
}));
};
var indexOf = function indexOf(searchElement, fromIndex) {
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var O = Object(this);
var len = O.length >>> 0;
if (len === 0) {
return -1;
}
var n = +fromIndex || 0;
if (Math.abs(n) === Infinity) {
n = 0;
}
if (n >= len) {
return -1;
}
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
while (k < len) {
if (k in O && O[k] === searchElement) {
return k;
}
k++;
}
return -1;
};
exports['default'] = TextTrack;
module.exports = exports['default'];
},{"../event-target":97,"../utils/browser.js":125,"../utils/fn.js":130,"../utils/guid.js":132,"../utils/log.js":133,"../utils/url.js":138,"./text-track-cue-list":118,"./text-track-enums":120,"global/document":1,"global/window":2,"xhr":55}],125:[function(_dereq_,module,exports){
/**
* @file browser.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var USER_AGENT = _globalWindow2['default'].navigator.userAgent;
var webkitVersionMap = /AppleWebKit\/([\d.]+)/i.exec(USER_AGENT);
var appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;
/*
* Device is an iPhone
*
* @type {Boolean}
* @constant
* @private
*/
var IS_IPHONE = /iPhone/i.test(USER_AGENT);
exports.IS_IPHONE = IS_IPHONE;
var IS_IPAD = /iPad/i.test(USER_AGENT);
exports.IS_IPAD = IS_IPAD;
var IS_IPOD = /iPod/i.test(USER_AGENT);
exports.IS_IPOD = IS_IPOD;
var IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;
exports.IS_IOS = IS_IOS;
var IOS_VERSION = (function () {
var match = USER_AGENT.match(/OS (\d+)_/i);
if (match && match[1]) {
return match[1];
}
})();
exports.IOS_VERSION = IOS_VERSION;
var IS_ANDROID = /Android/i.test(USER_AGENT);
exports.IS_ANDROID = IS_ANDROID;
var ANDROID_VERSION = (function () {
// This matches Android Major.Minor.Patch versions
// ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
major,
minor;
if (!match) {
return null;
}
major = match[1] && parseFloat(match[1]);
minor = match[2] && parseFloat(match[2]);
if (major && minor) {
return parseFloat(match[1] + '.' + match[2]);
} else if (major) {
return major;
} else {
return null;
}
})();
exports.ANDROID_VERSION = ANDROID_VERSION;
// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
var IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;
exports.IS_OLD_ANDROID = IS_OLD_ANDROID;
var IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;
exports.IS_NATIVE_ANDROID = IS_NATIVE_ANDROID;
var IS_FIREFOX = /Firefox/i.test(USER_AGENT);
exports.IS_FIREFOX = IS_FIREFOX;
var IS_CHROME = /Chrome/i.test(USER_AGENT);
exports.IS_CHROME = IS_CHROME;
var IS_IE8 = /MSIE\s8\.0/.test(USER_AGENT);
exports.IS_IE8 = IS_IE8;
var TOUCH_ENABLED = !!('ontouchstart' in _globalWindow2['default'] || _globalWindow2['default'].DocumentTouch && _globalDocument2['default'] instanceof _globalWindow2['default'].DocumentTouch);
exports.TOUCH_ENABLED = TOUCH_ENABLED;
var BACKGROUND_SIZE_SUPPORTED = ('backgroundSize' in _globalDocument2['default'].createElement('video').style);
exports.BACKGROUND_SIZE_SUPPORTED = BACKGROUND_SIZE_SUPPORTED;
},{"global/document":1,"global/window":2}],126:[function(_dereq_,module,exports){
/**
* @file buffer.js
*/
'use strict';
exports.__esModule = true;
exports.bufferedPercent = bufferedPercent;
var _timeRangesJs = _dereq_('./time-ranges.js');
/**
* Compute how much your video has been buffered
*
* @param {Object} Buffered object
* @param {Number} Total duration
* @return {Number} Percent buffered of the total duration
* @private
* @function bufferedPercent
*/
function bufferedPercent(buffered, duration) {
var bufferedDuration = 0,
start,
end;
if (!duration) {
return 0;
}
if (!buffered || !buffered.length) {
buffered = _timeRangesJs.createTimeRange(0, 0);
}
for (var i = 0; i < buffered.length; i++) {
start = buffered.start(i);
end = buffered.end(i);
// buffered end can be bigger than duration by a very small fraction
if (end > duration) {
end = duration;
}
bufferedDuration += end - start;
}
return bufferedDuration / duration;
}
},{"./time-ranges.js":136}],127:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _logJs = _dereq_('./log.js');
var _logJs2 = _interopRequireDefault(_logJs);
/**
* Object containing the default behaviors for available handler methods.
*
* @private
* @type {Object}
*/
var defaultBehaviors = {
get: function get(obj, key) {
return obj[key];
},
set: function set(obj, key, value) {
obj[key] = value;
return true;
}
};
/**
* Expose private objects publicly using a Proxy to log deprecation warnings.
*
* Browsers that do not support Proxy objects will simply return the `target`
* object, so it can be directly exposed.
*
* @param {Object} target The target object.
* @param {Object} messages Messages to display from a Proxy. Only operations
* with an associated message will be proxied.
* @param {String} [messages.get]
* @param {String} [messages.set]
* @return {Object} A Proxy if supported or the `target` argument.
*/
exports['default'] = function (target) {
var messages = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
if (typeof Proxy === 'function') {
var _ret = (function () {
var handler = {};
// Build a handler object based on those keys that have both messages
// and default behaviors.
Object.keys(messages).forEach(function (key) {
if (defaultBehaviors.hasOwnProperty(key)) {
handler[key] = function () {
_logJs2['default'].warn(messages[key]);
return defaultBehaviors[key].apply(this, arguments);
};
}
});
return {
v: new Proxy(target, handler)
};
})();
if (typeof _ret === 'object') return _ret.v;
}
return target;
};
module.exports = exports['default'];
},{"./log.js":133}],128:[function(_dereq_,module,exports){
/**
* @file dom.js
*/
'use strict';
exports.__esModule = true;
exports.getEl = getEl;
exports.createEl = createEl;
exports.textContent = textContent;
exports.insertElFirst = insertElFirst;
exports.getElData = getElData;
exports.hasElData = hasElData;
exports.removeElData = removeElData;
exports.hasElClass = hasElClass;
exports.addElClass = addElClass;
exports.removeElClass = removeElClass;
exports.toggleElClass = toggleElClass;
exports.setElAttributes = setElAttributes;
exports.getElAttributes = getElAttributes;
exports.blockTextSelection = blockTextSelection;
exports.unblockTextSelection = unblockTextSelection;
exports.findElPosition = findElPosition;
exports.getPointerPosition = getPointerPosition;
exports.isEl = isEl;
exports.isTextNode = isTextNode;
exports.emptyEl = emptyEl;
exports.normalizeContent = normalizeContent;
exports.appendContent = appendContent;
exports.insertContent = insertContent;
var _templateObject = _taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);
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 _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _guidJs = _dereq_('./guid.js');
var Guid = _interopRequireWildcard(_guidJs);
var _logJs = _dereq_('./log.js');
var _logJs2 = _interopRequireDefault(_logJs);
var _tsml = _dereq_('tsml');
var _tsml2 = _interopRequireDefault(_tsml);
/**
* Detect if a value is a string with any non-whitespace characters.
*
* @param {String} str
* @return {Boolean}
*/
function isNonBlankString(str) {
return typeof str === 'string' && /\S/.test(str);
}
/**
* Throws an error if the passed string has whitespace. This is used by
* class methods to be relatively consistent with the classList API.
*
* @param {String} str
* @return {Boolean}
*/
function throwIfWhitespace(str) {
if (/\s/.test(str)) {
throw new Error('class has illegal whitespace characters');
}
}
/**
* Produce a regular expression for matching a class name.
*
* @param {String} className
* @return {RegExp}
*/
function classRegExp(className) {
return new RegExp('(^|\\s)' + className + '($|\\s)');
}
/**
* Creates functions to query the DOM using a given method.
*
* @function createQuerier
* @private
* @param {String} method
* @return {Function}
*/
function createQuerier(method) {
return function (selector, context) {
if (!isNonBlankString(selector)) {
return _globalDocument2['default'][method](null);
}
if (isNonBlankString(context)) {
context = _globalDocument2['default'].querySelector(context);
}
return (isEl(context) ? context : _globalDocument2['default'])[method](selector);
};
}
/**
* Shorthand for document.getElementById()
* Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
*
* @param {String} id Element ID
* @return {Element} Element with supplied ID
* @function getEl
*/
function getEl(id) {
if (id.indexOf('#') === 0) {
id = id.slice(1);
}
return _globalDocument2['default'].getElementById(id);
}
/**
* Creates an element and applies properties.
*
* @param {String=} tagName Name of tag to be created.
* @param {Object=} properties Element properties to be applied.
* @return {Element}
* @function createEl
*/
function createEl() {
var tagName = arguments.length <= 0 || arguments[0] === undefined ? 'div' : arguments[0];
var properties = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var el = _globalDocument2['default'].createElement(tagName);
Object.getOwnPropertyNames(properties).forEach(function (propName) {
var val = properties[propName];
// See #2176
// We originally were accepting both properties and attributes in the
// same object, but that doesn't work so well.
if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {
_logJs2['default'].warn(_tsml2['default'](_templateObject, propName, val));
el.setAttribute(propName, val);
} else {
el[propName] = val;
}
});
Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
var val = attributes[attrName];
el.setAttribute(attrName, attributes[attrName]);
});
return el;
}
/**
* Injects text into an element, replacing any existing contents entirely.
*
* @param {Element} el
* @param {String} text
* @return {Element}
* @function textContent
*/
function textContent(el, text) {
if (typeof el.textContent === 'undefined') {
el.innerText = text;
} else {
el.textContent = text;
}
}
/**
* Insert an element as the first child node of another
*
* @param {Element} child Element to insert
* @param {Element} parent Element to insert child into
* @private
* @function insertElFirst
*/
function insertElFirst(child, parent) {
if (parent.firstChild) {
parent.insertBefore(child, parent.firstChild);
} else {
parent.appendChild(child);
}
}
/**
* Element Data Store. Allows for binding data to an element without putting it directly on the element.
* Ex. Event listeners are stored here.
* (also from jsninja.com, slightly modified and updated for closure compiler)
*
* @type {Object}
* @private
*/
var elData = {};
/*
* Unique attribute name to store an element's guid in
*
* @type {String}
* @constant
* @private
*/
var elIdAttr = 'vdata' + new Date().getTime();
/**
* Returns the cache object where data for an element is stored
*
* @param {Element} el Element to store data for.
* @return {Object}
* @function getElData
*/
function getElData(el) {
var id = el[elIdAttr];
if (!id) {
id = el[elIdAttr] = Guid.newGUID();
}
if (!elData[id]) {
elData[id] = {};
}
return elData[id];
}
/**
* Returns whether or not an element has cached data
*
* @param {Element} el A dom element
* @return {Boolean}
* @private
* @function hasElData
*/
function hasElData(el) {
var id = el[elIdAttr];
if (!id) {
return false;
}
return !!Object.getOwnPropertyNames(elData[id]).length;
}
/**
* Delete data for the element from the cache and the guid attr from getElementById
*
* @param {Element} el Remove data for an element
* @private
* @function removeElData
*/
function removeElData(el) {
var id = el[elIdAttr];
if (!id) {
return;
}
// Remove all stored data
delete elData[id];
// Remove the elIdAttr property from the DOM node
try {
delete el[elIdAttr];
} catch (e) {
if (el.removeAttribute) {
el.removeAttribute(elIdAttr);
} else {
// IE doesn't appear to support removeAttribute on the document element
el[elIdAttr] = null;
}
}
}
/**
* Check if an element has a CSS class
*
* @function hasElClass
* @param {Element} element Element to check
* @param {String} classToCheck Classname to check
*/
function hasElClass(element, classToCheck) {
if (element.classList) {
return element.classList.contains(classToCheck);
} else {
throwIfWhitespace(classToCheck);
return classRegExp(classToCheck).test(element.className);
}
}
/**
* Add a CSS class name to an element
*
* @function addElClass
* @param {Element} element Element to add class name to
* @param {String} classToAdd Classname to add
*/
function addElClass(element, classToAdd) {
if (element.classList) {
element.classList.add(classToAdd);
// Don't need to `throwIfWhitespace` here because `hasElClass` will do it
// in the case of classList not being supported.
} else if (!hasElClass(element, classToAdd)) {
element.className = (element.className + ' ' + classToAdd).trim();
}
return element;
}
/**
* Remove a CSS class name from an element
*
* @function removeElClass
* @param {Element} element Element to remove from class name
* @param {String} classToRemove Classname to remove
*/
function removeElClass(element, classToRemove) {
if (element.classList) {
element.classList.remove(classToRemove);
} else {
throwIfWhitespace(classToRemove);
element.className = element.className.split(/\s+/).filter(function (c) {
return c !== classToRemove;
}).join(' ');
}
return element;
}
/**
* Adds or removes a CSS class name on an element depending on an optional
* condition or the presence/absence of the class name.
*
* @function toggleElClass
* @param {Element} element
* @param {String} classToToggle
* @param {Boolean|Function} [predicate]
* Can be a function that returns a Boolean. If `true`, the class
* will be added; if `false`, the class will be removed. If not
* given, the class will be added if not present and vice versa.
*/
function toggleElClass(element, classToToggle, predicate) {
// This CANNOT use `classList` internally because IE does not support the
// second parameter to the `classList.toggle()` method! Which is fine because
// `classList` will be used by the add/remove functions.
var has = hasElClass(element, classToToggle);
if (typeof predicate === 'function') {
predicate = predicate(element, classToToggle);
}
if (typeof predicate !== 'boolean') {
predicate = !has;
}
// If the necessary class operation matches the current state of the
// element, no action is required.
if (predicate === has) {
return;
}
if (predicate) {
addElClass(element, classToToggle);
} else {
removeElClass(element, classToToggle);
}
return element;
}
/**
* Apply attributes to an HTML element.
*
* @param {Element} el Target element.
* @param {Object=} attributes Element attributes to be applied.
* @private
* @function setElAttributes
*/
function setElAttributes(el, attributes) {
Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
var attrValue = attributes[attrName];
if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {
el.removeAttribute(attrName);
} else {
el.setAttribute(attrName, attrValue === true ? '' : attrValue);
}
});
}
/**
* Get an element's attribute values, as defined on the HTML tag
* Attributes are not the same as properties. They're defined on the tag
* or with setAttribute (which shouldn't be used with HTML)
* This will return true or false for boolean attributes.
*
* @param {Element} tag Element from which to get tag attributes
* @return {Object}
* @private
* @function getElAttributes
*/
function getElAttributes(tag) {
var obj, knownBooleans, attrs, attrName, attrVal;
obj = {};
// known boolean attributes
// we can check for matching boolean properties, but older browsers
// won't know about HTML5 boolean attributes that we still read from
knownBooleans = ',' + 'autoplay,controls,loop,muted,default' + ',';
if (tag && tag.attributes && tag.attributes.length > 0) {
attrs = tag.attributes;
for (var i = attrs.length - 1; i >= 0; i--) {
attrName = attrs[i].name;
attrVal = attrs[i].value;
// check for known booleans
// the matching element property will return a value for typeof
if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {
// the value of an included boolean attribute is typically an empty
// string ('') which would equal false if we just check for a false value.
// we also don't want support bad code like autoplay='false'
attrVal = attrVal !== null ? true : false;
}
obj[attrName] = attrVal;
}
}
return obj;
}
/**
* Attempt to block the ability to select text while dragging controls
*
* @return {Boolean}
* @function blockTextSelection
*/
function blockTextSelection() {
_globalDocument2['default'].body.focus();
_globalDocument2['default'].onselectstart = function () {
return false;
};
}
/**
* Turn off text selection blocking
*
* @return {Boolean}
* @function unblockTextSelection
*/
function unblockTextSelection() {
_globalDocument2['default'].onselectstart = function () {
return true;
};
}
/**
* Offset Left
* getBoundingClientRect technique from
* John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
*
* @function findElPosition
* @param {Element} el Element from which to get offset
* @return {Object}
*/
function findElPosition(el) {
var box = undefined;
if (el.getBoundingClientRect && el.parentNode) {
box = el.getBoundingClientRect();
}
if (!box) {
return {
left: 0,
top: 0
};
}
var docEl = _globalDocument2['default'].documentElement;
var body = _globalDocument2['default'].body;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var scrollLeft = _globalWindow2['default'].pageXOffset || body.scrollLeft;
var left = box.left + scrollLeft - clientLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var scrollTop = _globalWindow2['default'].pageYOffset || body.scrollTop;
var top = box.top + scrollTop - clientTop;
// Android sometimes returns slightly off decimal values, so need to round
return {
left: Math.round(left),
top: Math.round(top)
};
}
/**
* Get pointer position in element
* Returns an object with x and y coordinates.
* The base on the coordinates are the bottom left of the element.
*
* @function getPointerPosition
* @param {Element} el Element on which to get the pointer position on
* @param {Event} event Event object
* @return {Object} This object will have x and y coordinates corresponding to the mouse position
*/
function getPointerPosition(el, event) {
var position = {};
var box = findElPosition(el);
var boxW = el.offsetWidth;
var boxH = el.offsetHeight;
var boxY = box.top;
var boxX = box.left;
var pageY = event.pageY;
var pageX = event.pageX;
if (event.changedTouches) {
pageX = event.changedTouches[0].pageX;
pageY = event.changedTouches[0].pageY;
}
position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));
position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));
return position;
}
/**
* Determines, via duck typing, whether or not a value is a DOM element.
*
* @function isEl
* @param {Mixed} value
* @return {Boolean}
*/
function isEl(value) {
return !!value && typeof value === 'object' && value.nodeType === 1;
}
/**
* Determines, via duck typing, whether or not a value is a text node.
*
* @param {Mixed} value
* @return {Boolean}
*/
function isTextNode(value) {
return !!value && typeof value === 'object' && value.nodeType === 3;
}
/**
* Empties the contents of an element.
*
* @function emptyEl
* @param {Element} el
* @return {Element}
*/
function emptyEl(el) {
while (el.firstChild) {
el.removeChild(el.firstChild);
}
return el;
}
/**
* Normalizes content for eventual insertion into the DOM.
*
* This allows a wide range of content definition methods, but protects
* from falling into the trap of simply writing to `innerHTML`, which is
* an XSS concern.
*
* The content for an element can be passed in multiple types and
* combinations, whose behavior is as follows:
*
* - String
* Normalized into a text node.
*
* - Element, TextNode
* Passed through.
*
* - Array
* A one-dimensional array of strings, elements, nodes, or functions (which
* return single strings, elements, or nodes).
*
* - Function
* If the sole argument, is expected to produce a string, element,
* node, or array.
*
* @function normalizeContent
* @param {String|Element|TextNode|Array|Function} content
* @return {Array}
*/
function normalizeContent(content) {
// First, invoke content if it is a function. If it produces an array,
// that needs to happen before normalization.
if (typeof content === 'function') {
content = content();
}
// Next up, normalize to an array, so one or many items can be normalized,
// filtered, and returned.
return (Array.isArray(content) ? content : [content]).map(function (value) {
// First, invoke value if it is a function to produce a new value,
// which will be subsequently normalized to a Node of some kind.
if (typeof value === 'function') {
value = value();
}
if (isEl(value) || isTextNode(value)) {
return value;
}
if (typeof value === 'string' && /\S/.test(value)) {
return _globalDocument2['default'].createTextNode(value);
}
}).filter(function (value) {
return value;
});
}
/**
* Normalizes and appends content to an element.
*
* @function appendContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* See: `normalizeContent`
* @return {Element}
*/
function appendContent(el, content) {
normalizeContent(content).forEach(function (node) {
return el.appendChild(node);
});
return el;
}
/**
* Normalizes and inserts content into an element; this is identical to
* `appendContent()`, except it empties the element first.
*
* @function insertContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* See: `normalizeContent`
* @return {Element}
*/
function insertContent(el, content) {
return appendContent(emptyEl(el), content);
}
/**
* Finds a single DOM element matching `selector` within the optional
* `context` of another DOM element (defaulting to `document`).
*
* @function $
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelector`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {Element|null}
*/
var $ = createQuerier('querySelector');
exports.$ = $;
/**
* Finds a all DOM elements matching `selector` within the optional
* `context` of another DOM element (defaulting to `document`).
*
* @function $$
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelectorAll`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {NodeList}
*/
var $$ = createQuerier('querySelectorAll');
exports.$$ = $$;
},{"./guid.js":132,"./log.js":133,"global/document":1,"global/window":2,"tsml":54}],129:[function(_dereq_,module,exports){
/**
* @file events.js
*
* Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
* (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
* This should work very similarly to jQuery's events, however it's based off the book version which isn't as
* robust as jquery's, so there's probably some differences.
*/
'use strict';
exports.__esModule = true;
exports.on = on;
exports.off = off;
exports.trigger = trigger;
exports.one = one;
exports.fixEvent = fixEvent;
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; } }
var _domJs = _dereq_('./dom.js');
var Dom = _interopRequireWildcard(_domJs);
var _guidJs = _dereq_('./guid.js');
var Guid = _interopRequireWildcard(_guidJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* Add an event listener to element
* It stores the handler function in a separate cache object
* and adds a generic handler to the element's event,
* along with a unique id (guid) to the element.
*
* @param {Element|Object} elem Element or object to bind listeners to
* @param {String|Array} type Type of event to bind to.
* @param {Function} fn Event listener.
* @method on
*/
function on(elem, type, fn) {
if (Array.isArray(type)) {
return _handleMultipleEvents(on, elem, type, fn);
}
var data = Dom.getElData(elem);
// We need a place to store all our handler data
if (!data.handlers) data.handlers = {};
if (!data.handlers[type]) data.handlers[type] = [];
if (!fn.guid) fn.guid = Guid.newGUID();
data.handlers[type].push(fn);
if (!data.dispatcher) {
data.disabled = false;
data.dispatcher = function (event, hash) {
if (data.disabled) return;
event = fixEvent(event);
var handlers = data.handlers[event.type];
if (handlers) {
// Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
var handlersCopy = handlers.slice(0);
for (var m = 0, n = handlersCopy.length; m < n; m++) {
if (event.isImmediatePropagationStopped()) {
break;
} else {
handlersCopy[m].call(elem, event, hash);
}
}
}
};
}
if (data.handlers[type].length === 1) {
if (elem.addEventListener) {
elem.addEventListener(type, data.dispatcher, false);
} else if (elem.attachEvent) {
elem.attachEvent('on' + type, data.dispatcher);
}
}
}
/**
* Removes event listeners from an element
*
* @param {Element|Object} elem Object to remove listeners from
* @param {String|Array=} type Type of listener to remove. Don't include to remove all events from element.
* @param {Function} fn Specific listener to remove. Don't include to remove listeners for an event type.
* @method off
*/
function off(elem, type, fn) {
// Don't want to add a cache object through getElData if not needed
if (!Dom.hasElData(elem)) return;
var data = Dom.getElData(elem);
// If no events exist, nothing to unbind
if (!data.handlers) {
return;
}
if (Array.isArray(type)) {
return _handleMultipleEvents(off, elem, type, fn);
}
// Utility function
var removeType = function removeType(t) {
data.handlers[t] = [];
_cleanUpEvents(elem, t);
};
// Are we removing all bound events?
if (!type) {
for (var t in data.handlers) {
removeType(t);
}return;
}
var handlers = data.handlers[type];
// If no handlers exist, nothing to unbind
if (!handlers) return;
// If no listener was provided, remove all listeners for type
if (!fn) {
removeType(type);
return;
}
// We're only removing a single handler
if (fn.guid) {
for (var n = 0; n < handlers.length; n++) {
if (handlers[n].guid === fn.guid) {
handlers.splice(n--, 1);
}
}
}
_cleanUpEvents(elem, type);
}
/**
* Trigger an event for an element
*
* @param {Element|Object} elem Element to trigger an event on
* @param {Event|Object|String} event A string (the type) or an event object with a type attribute
* @param {Object} [hash] data hash to pass along with the event
* @return {Boolean=} Returned only if default was prevented
* @method trigger
*/
function trigger(elem, event, hash) {
// Fetches element data and a reference to the parent (for bubbling).
// Don't want to add a data object to cache for every parent,
// so checking hasElData first.
var elemData = Dom.hasElData(elem) ? Dom.getElData(elem) : {};
var parent = elem.parentNode || elem.ownerDocument;
// type = event.type || event,
// handler;
// If an event name was passed as a string, creates an event out of it
if (typeof event === 'string') {
event = { type: event, target: elem };
}
// Normalizes the event properties.
event = fixEvent(event);
// If the passed element has a dispatcher, executes the established handlers.
if (elemData.dispatcher) {
elemData.dispatcher.call(elem, event, hash);
}
// Unless explicitly stopped or the event does not bubble (e.g. media events)
// recursively calls this function to bubble the event up the DOM.
if (parent && !event.isPropagationStopped() && event.bubbles === true) {
trigger.call(null, parent, event, hash);
// If at the top of the DOM, triggers the default action unless disabled.
} else if (!parent && !event.defaultPrevented) {
var targetData = Dom.getElData(event.target);
// Checks if the target has a default action for this event.
if (event.target[event.type]) {
// Temporarily disables event dispatching on the target as we have already executed the handler.
targetData.disabled = true;
// Executes the default action.
if (typeof event.target[event.type] === 'function') {
event.target[event.type]();
}
// Re-enables event dispatching.
targetData.disabled = false;
}
}
// Inform the triggerer if the default was prevented by returning false
return !event.defaultPrevented;
}
/**
* Trigger a listener only once for an event
*
* @param {Element|Object} elem Element or object to
* @param {String|Array} type Name/type of event
* @param {Function} fn Event handler function
* @method one
*/
function one(elem, type, fn) {
if (Array.isArray(type)) {
return _handleMultipleEvents(one, elem, type, fn);
}
var func = function func() {
off(elem, type, func);
fn.apply(this, arguments);
};
// copy the guid to the new function so it can removed using the original function's ID
func.guid = fn.guid = fn.guid || Guid.newGUID();
on(elem, type, func);
}
/**
* Fix a native event to have standard property values
*
* @param {Object} event Event object to fix
* @return {Object}
* @private
* @method fixEvent
*/
function fixEvent(event) {
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
// Test if fixing up is needed
// Used to check if !event.stopPropagation instead of isPropagationStopped
// But native events return true for stopPropagation, but don't have
// other expected methods like isPropagationStopped. Seems to be a problem
// with the Javascript Ninja code. So we're just overriding all events now.
if (!event || !event.isPropagationStopped) {
var old = event || _globalWindow2['default'].event;
event = {};
// Clone the old object so that we can modify the values event = {};
// IE8 Doesn't like when you mess with native event properties
// Firefox returns false for event.hasOwnProperty('type') and other props
// which makes copying more difficult.
// TODO: Probably best to create a whitelist of event props
for (var key in old) {
// Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
// Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation
// and webkitMovementX/Y
if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {
// Chrome 32+ warns if you try to copy deprecated returnValue, but
// we still want to if preventDefault isn't supported (IE8).
if (!(key === 'returnValue' && old.preventDefault)) {
event[key] = old[key];
}
}
}
// The event occurred on this element
if (!event.target) {
event.target = event.srcElement || _globalDocument2['default'];
}
// Handle which other element the event is related to
if (!event.relatedTarget) {
event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
}
// Stop the default browser action
event.preventDefault = function () {
if (old.preventDefault) {
old.preventDefault();
}
event.returnValue = false;
old.returnValue = false;
event.defaultPrevented = true;
};
event.defaultPrevented = false;
// Stop the event from bubbling
event.stopPropagation = function () {
if (old.stopPropagation) {
old.stopPropagation();
}
event.cancelBubble = true;
old.cancelBubble = true;
event.isPropagationStopped = returnTrue;
};
event.isPropagationStopped = returnFalse;
// Stop the event from bubbling and executing other handlers
event.stopImmediatePropagation = function () {
if (old.stopImmediatePropagation) {
old.stopImmediatePropagation();
}
event.isImmediatePropagationStopped = returnTrue;
event.stopPropagation();
};
event.isImmediatePropagationStopped = returnFalse;
// Handle mouse position
if (event.clientX != null) {
var doc = _globalDocument2['default'].documentElement,
body = _globalDocument2['default'].body;
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
}
// Handle key presses
event.which = event.charCode || event.keyCode;
// Fix button for mouse clicks:
// 0 == left; 1 == middle; 2 == right
if (event.button != null) {
event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;
}
}
// Returns fixed-up instance
return event;
}
/**
* Clean up the listener cache and dispatchers
*
* @param {Element|Object} elem Element to clean up
* @param {String} type Type of event to clean up
* @private
* @method _cleanUpEvents
*/
function _cleanUpEvents(elem, type) {
var data = Dom.getElData(elem);
// Remove the events of a particular type if there are none left
if (data.handlers[type].length === 0) {
delete data.handlers[type];
// data.handlers[type] = null;
// Setting to null was causing an error with data.handlers
// Remove the meta-handler from the element
if (elem.removeEventListener) {
elem.removeEventListener(type, data.dispatcher, false);
} else if (elem.detachEvent) {
elem.detachEvent('on' + type, data.dispatcher);
}
}
// Remove the events object if there are no types left
if (Object.getOwnPropertyNames(data.handlers).length <= 0) {
delete data.handlers;
delete data.dispatcher;
delete data.disabled;
}
// Finally remove the element data if there is no data left
if (Object.getOwnPropertyNames(data).length === 0) {
Dom.removeElData(elem);
}
}
/**
* Loops through an array of event types and calls the requested method for each type.
*
* @param {Function} fn The event method we want to use.
* @param {Element|Object} elem Element or object to bind listeners to
* @param {String} type Type of event to bind to.
* @param {Function} callback Event listener.
* @private
* @function _handleMultipleEvents
*/
function _handleMultipleEvents(fn, elem, types, callback) {
types.forEach(function (type) {
//Call the event method for each one of the types
fn(elem, type, callback);
});
}
},{"./dom.js":128,"./guid.js":132,"global/document":1,"global/window":2}],130:[function(_dereq_,module,exports){
/**
* @file fn.js
*/
'use strict';
exports.__esModule = true;
var _guidJs = _dereq_('./guid.js');
/**
* Bind (a.k.a proxy or Context). A simple method for changing the context of a function
* It also stores a unique id on the function so it can be easily removed from events
*
* @param {*} context The object to bind as scope
* @param {Function} fn The function to be bound to a scope
* @param {Number=} uid An optional unique ID for the function to be set
* @return {Function}
* @private
* @method bind
*/
var bind = function bind(context, fn, uid) {
// Make sure the function has a unique ID
if (!fn.guid) {
fn.guid = _guidJs.newGUID();
}
// Create the new function that changes the context
var ret = function ret() {
return fn.apply(context, arguments);
};
// Allow for the ability to individualize this function
// Needed in the case where multiple objects might share the same prototype
// IF both items add an event listener with the same function, then you try to remove just one
// it will remove both because they both have the same guid.
// when using this, you need to use the bind method when you remove the listener as well.
// currently used in text tracks
ret.guid = uid ? uid + '_' + fn.guid : fn.guid;
return ret;
};
exports.bind = bind;
},{"./guid.js":132}],131:[function(_dereq_,module,exports){
/**
* @file format-time.js
*
* Format seconds as a time string, H:MM:SS or M:SS
* Supplying a guide (in seconds) will force a number of leading zeros
* to cover the length of the guide
*
* @param {Number} seconds Number of seconds to be turned into a string
* @param {Number} guide Number (in seconds) to model the string after
* @return {String} Time formatted as H:MM:SS or M:SS
* @private
* @function formatTime
*/
'use strict';
exports.__esModule = true;
function formatTime(seconds) {
var guide = arguments.length <= 1 || arguments[1] === undefined ? seconds : arguments[1];
return (function () {
seconds = seconds < 0 ? 0 : seconds;
var s = Math.floor(seconds % 60);
var m = Math.floor(seconds / 60 % 60);
var h = Math.floor(seconds / 3600);
var gm = Math.floor(guide / 60 % 60);
var gh = Math.floor(guide / 3600);
// handle invalid times
if (isNaN(seconds) || seconds === Infinity) {
// '-' is false for all relational operators (e.g. <, >=) so this setting
// will add the minimum number of fields specified by the guide
h = m = s = '-';
}
// Check if we need to show hours
h = h > 0 || gh > 0 ? h + ':' : '';
// If hours are showing, we may need to add a leading zero.
// Always show at least one digit of minutes.
m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';
// Check if leading zero is need for seconds
s = s < 10 ? '0' + s : s;
return h + m + s;
})();
}
exports['default'] = formatTime;
module.exports = exports['default'];
},{}],132:[function(_dereq_,module,exports){
/**
* @file guid.js
*
* Unique ID for an element or function
* @type {Number}
* @private
*/
"use strict";
exports.__esModule = true;
exports.newGUID = newGUID;
var _guid = 1;
/**
* Get the next unique ID
*
* @return {String}
* @function newGUID
*/
function newGUID() {
return _guid++;
}
},{}],133:[function(_dereq_,module,exports){
/**
* @file log.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* Log plain debug messages
*/
var log = function log() {
_logType(null, arguments);
};
/**
* Keep a history of log messages
* @type {Array}
*/
log.history = [];
/**
* Log error messages
*/
log.error = function () {
_logType('error', arguments);
};
/**
* Log warning messages
*/
log.warn = function () {
_logType('warn', arguments);
};
/**
* Log messages to the console and history based on the type of message
*
* @param {String} type The type of message, or `null` for `log`
* @param {Object} args The args to be passed to the log
* @private
* @method _logType
*/
function _logType(type, args) {
// convert args to an array to get array functions
var argsArray = Array.prototype.slice.call(args);
// if there's no console then don't try to output messages
// they will still be stored in log.history
// Was setting these once outside of this function, but containing them
// in the function makes it easier to test cases where console doesn't exist
var noop = function noop() {};
var console = _globalWindow2['default']['console'] || {
'log': noop,
'warn': noop,
'error': noop
};
if (type) {
// add the type to the front of the message
argsArray.unshift(type.toUpperCase() + ':');
} else {
// default to log with no prefix
type = 'log';
}
// add to history
log.history.push(argsArray);
// add console prefix after adding to history
argsArray.unshift('VIDEOJS:');
// call appropriate log function
if (console[type].apply) {
console[type].apply(console, argsArray);
} else {
// ie8 doesn't allow error.apply, but it will just join() the array anyway
console[type](argsArray.join(' '));
}
}
exports['default'] = log;
module.exports = exports['default'];
},{"global/window":2}],134:[function(_dereq_,module,exports){
/**
* @file merge-options.js
*/
'use strict';
exports.__esModule = true;
exports['default'] = mergeOptions;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
function isPlain(obj) {
return !!obj && typeof obj === 'object' && obj.toString() === '[object Object]' && obj.constructor === Object;
}
/**
* Merge customizer. video.js simply overwrites non-simple objects
* (like arrays) instead of attempting to overlay them.
* @see https://lodash.com/docs#merge
*/
var customizer = function customizer(destination, source) {
// If we're not working with a plain object, copy the value as is
// If source is an array, for instance, it will replace destination
if (!isPlain(source)) {
return source;
}
// If the new value is a plain object but the first object value is not
// we need to create a new object for the first object to merge with.
// This makes it consistent with how merge() works by default
// and also protects from later changes the to first object affecting
// the second object's values.
if (!isPlain(destination)) {
return mergeOptions(source);
}
};
/**
* Merge one or more options objects, recursively merging **only**
* plain object properties. Previously `deepMerge`.
*
* @param {...Object} source One or more objects to merge
* @returns {Object} a new object that is the union of all
* provided objects
* @function mergeOptions
*/
function mergeOptions() {
// contruct the call dynamically to handle the variable number of
// objects to merge
var args = Array.prototype.slice.call(arguments);
// unshift an empty object into the front of the call as the target
// of the merge
args.unshift({});
// customize conflict resolution to match our historical merge behavior
args.push(customizer);
_lodashCompatObjectMerge2['default'].apply(null, args);
// return the mutated result object
return args[0];
}
module.exports = exports['default'];
},{"lodash-compat/object/merge":40}],135:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var createStyleElement = function createStyleElement(className) {
var style = _globalDocument2['default'].createElement('style');
style.className = className;
return style;
};
exports.createStyleElement = createStyleElement;
var setTextContent = function setTextContent(el, content) {
if (el.styleSheet) {
el.styleSheet.cssText = content;
} else {
el.textContent = content;
}
};
exports.setTextContent = setTextContent;
},{"global/document":1}],136:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
exports.createTimeRanges = createTimeRanges;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _logJs = _dereq_('./log.js');
var _logJs2 = _interopRequireDefault(_logJs);
/**
* @file time-ranges.js
*
* Should create a fake TimeRange object
* Mimics an HTML5 time range instance, which has functions that
* return the start and end times for a range
* TimeRanges are returned by the buffered() method
*
* @param {(Number|Array)} Start of a single range or an array of ranges
* @param {Number} End of a single range
* @private
* @method createTimeRanges
*/
function createTimeRanges(start, end) {
if (Array.isArray(start)) {
return createTimeRangesObj(start);
} else if (start === undefined || end === undefined) {
return createTimeRangesObj();
}
return createTimeRangesObj([[start, end]]);
}
exports.createTimeRange = createTimeRanges;
function createTimeRangesObj(ranges) {
if (ranges === undefined || ranges.length === 0) {
return {
length: 0,
start: function start() {
throw new Error('This TimeRanges object is empty');
},
end: function end() {
throw new Error('This TimeRanges object is empty');
}
};
}
return {
length: ranges.length,
start: getRange.bind(null, 'start', 0, ranges),
end: getRange.bind(null, 'end', 1, ranges)
};
}
function getRange(fnName, valueIndex, ranges, rangeIndex) {
if (rangeIndex === undefined) {
_logJs2['default'].warn('DEPRECATED: Function \'' + fnName + '\' on \'TimeRanges\' called without an index argument.');
rangeIndex = 0;
}
rangeCheck(fnName, rangeIndex, ranges.length - 1);
return ranges[rangeIndex][valueIndex];
}
function rangeCheck(fnName, index, maxIndex) {
if (index < 0 || index > maxIndex) {
throw new Error('Failed to execute \'' + fnName + '\' on \'TimeRanges\': The index provided (' + index + ') is greater than or equal to the maximum bound (' + maxIndex + ').');
}
}
},{"./log.js":133}],137:[function(_dereq_,module,exports){
/**
* @file to-title-case.js
*
* Uppercase the first letter of a string
*
* @param {String} string String to be uppercased
* @return {String}
* @private
* @method toTitleCase
*/
"use strict";
exports.__esModule = true;
function toTitleCase(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
exports["default"] = toTitleCase;
module.exports = exports["default"];
},{}],138:[function(_dereq_,module,exports){
/**
* @file url.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* Resolve and parse the elements of a URL
*
* @param {String} url The url to parse
* @return {Object} An object of url details
* @method parseUrl
*/
var parseUrl = function parseUrl(url) {
var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];
// add the url to an anchor and let the browser parse the URL
var a = _globalDocument2['default'].createElement('a');
a.href = url;
// IE8 (and 9?) Fix
// ie8 doesn't parse the URL correctly until the anchor is actually
// added to the body, and an innerHTML is needed to trigger the parsing
var addToBody = a.host === '' && a.protocol !== 'file:';
var div = undefined;
if (addToBody) {
div = _globalDocument2['default'].createElement('div');
div.innerHTML = '<a href="' + url + '"></a>';
a = div.firstChild;
// prevent the div from affecting layout
div.setAttribute('style', 'display:none; position:absolute;');
_globalDocument2['default'].body.appendChild(div);
}
// Copy the specific URL properties to a new object
// This is also needed for IE8 because the anchor loses its
// properties when it's removed from the dom
var details = {};
for (var i = 0; i < props.length; i++) {
details[props[i]] = a[props[i]];
}
// IE9 adds the port to the host property unlike everyone else. If
// a port identifier is added for standard ports, strip it.
if (details.protocol === 'http:') {
details.host = details.host.replace(/:80$/, '');
}
if (details.protocol === 'https:') {
details.host = details.host.replace(/:443$/, '');
}
if (addToBody) {
_globalDocument2['default'].body.removeChild(div);
}
return details;
};
exports.parseUrl = parseUrl;
/**
* Get absolute version of relative URL. Used to tell flash correct URL.
* http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
*
* @param {String} url URL to make absolute
* @return {String} Absolute URL
* @private
* @method getAbsoluteURL
*/
var getAbsoluteURL = function getAbsoluteURL(url) {
// Check if absolute URL
if (!url.match(/^https?:\/\//)) {
// Convert to absolute URL. Flash hosted off-site needs an absolute URL.
var div = _globalDocument2['default'].createElement('div');
div.innerHTML = '<a href="' + url + '">x</a>';
url = div.firstChild.href;
}
return url;
};
exports.getAbsoluteURL = getAbsoluteURL;
/**
* Returns the extension of the passed file name. It will return an empty string if you pass an invalid path
*
* @param {String} path The fileName path like '/path/to/file.mp4'
* @returns {String} The extension in lower case or an empty string if no extension could be found.
* @method getFileExtension
*/
var getFileExtension = function getFileExtension(path) {
if (typeof path === 'string') {
var splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i;
var pathParts = splitPathRe.exec(path);
if (pathParts) {
return pathParts.pop().toLowerCase();
}
}
return '';
};
exports.getFileExtension = getFileExtension;
/**
* Returns whether the url passed is a cross domain request or not.
*
* @param {String} url The url to check
* @return {Boolean} Whether it is a cross domain request or not
* @method isCrossOrigin
*/
var isCrossOrigin = function isCrossOrigin(url) {
var winLoc = _globalWindow2['default'].location;
var urlInfo = parseUrl(url);
// IE8 protocol relative urls will return ':' for protocol
var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;
// Check if url is for another domain/origin
// IE8 doesn't know location.origin, so we won't rely on it here
var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;
return crossOrigin;
};
exports.isCrossOrigin = isCrossOrigin;
},{"global/document":1,"global/window":2}],139:[function(_dereq_,module,exports){
/**
* @file video.js
*/
'use strict';
exports.__esModule = true;
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 }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _setup = _dereq_('./setup');
var setup = _interopRequireWildcard(_setup);
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _eventTarget = _dereq_('./event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _player = _dereq_('./player');
var _player2 = _interopRequireDefault(_player);
var _pluginsJs = _dereq_('./plugins.js');
var _pluginsJs2 = _interopRequireDefault(_pluginsJs);
var _srcJsUtilsMergeOptionsJs = _dereq_('../../src/js/utils/merge-options.js');
var _srcJsUtilsMergeOptionsJs2 = _interopRequireDefault(_srcJsUtilsMergeOptionsJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _tracksTextTrackJs = _dereq_('./tracks/text-track.js');
var _tracksTextTrackJs2 = _interopRequireDefault(_tracksTextTrackJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
var _utilsFormatTimeJs = _dereq_('./utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsBrowserJs = _dereq_('./utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _utilsUrlJs = _dereq_('./utils/url.js');
var Url = _interopRequireWildcard(_utilsUrlJs);
var _extendJs = _dereq_('./extend.js');
var _extendJs2 = _interopRequireDefault(_extendJs);
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
var _utilsCreateDeprecationProxyJs = _dereq_('./utils/create-deprecation-proxy.js');
var _utilsCreateDeprecationProxyJs2 = _interopRequireDefault(_utilsCreateDeprecationProxyJs);
var _xhr = _dereq_('xhr');
var _xhr2 = _interopRequireDefault(_xhr);
// Include the built-in techs
var _techTechJs = _dereq_('./tech/tech.js');
var _techTechJs2 = _interopRequireDefault(_techTechJs);
var _techHtml5Js = _dereq_('./tech/html5.js');
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
var _techFlashJs = _dereq_('./tech/flash.js');
var _techFlashJs2 = _interopRequireDefault(_techFlashJs);
// HTML5 Element Shim for IE8
if (typeof HTMLVideoElement === 'undefined') {
_globalDocument2['default'].createElement('video');
_globalDocument2['default'].createElement('audio');
_globalDocument2['default'].createElement('track');
}
/**
* Doubles as the main function for users to create a player instance and also
* the main library object.
* The `videojs` function can be used to initialize or retrieve a player.
* ```js
* var myPlayer = videojs('my_video_id');
* ```
*
* @param {String|Element} id Video element or video element ID
* @param {Object=} options Optional options object for config/settings
* @param {Function=} ready Optional ready callback
* @return {Player} A player instance
* @mixes videojs
* @method videojs
*/
var videojs = function videojs(id, options, ready) {
var tag; // Element of ID
// Allow for element or ID to be passed in
// String ID
if (typeof id === 'string') {
// Adjust for jQuery ID syntax
if (id.indexOf('#') === 0) {
id = id.slice(1);
}
// If a player instance has already been created for this ID return it.
if (videojs.getPlayers()[id]) {
// If options or ready funtion are passed, warn
if (options) {
_utilsLogJs2['default'].warn('Player "' + id + '" is already initialised. Options will not be applied.');
}
if (ready) {
videojs.getPlayers()[id].ready(ready);
}
return videojs.getPlayers()[id];
// Otherwise get element for ID
} else {
tag = Dom.getEl(id);
}
// ID is a media element
} else {
tag = id;
}
// Check for a useable element
if (!tag || !tag.nodeName) {
// re: nodeName, could be a box div also
throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
}
// Element may have a player attr referring to an already created player instance.
// If not, set up a new player and return the instance.
return tag['player'] || new _player2['default'](tag, options, ready);
};
// Add default styles
var style = Dom.$('.vjs-styles-defaults');
if (!style) {
style = stylesheet.createStyleElement('vjs-styles-defaults');
var head = Dom.$('head');
head.insertBefore(style, head.firstChild);
stylesheet.setTextContent(style, '\n .video-js {\n width: 300px;\n height: 150px;\n }\n\n .vjs-fluid {\n padding-top: 56.25%\n }\n ');
}
// Run Auto-load players
// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
setup.autoSetupTimeout(1, videojs);
/*
* Current software version (semver)
*
* @type {String}
*/
videojs.VERSION = '5.4.4';
/**
* The global options object. These are the settings that take effect
* if no overrides are specified when the player is created.
*
* ```js
* videojs.options.autoplay = true
* // -> all players will autoplay by default
* ```
*
* @type {Object}
*/
videojs.options = _player2['default'].prototype.options_;
/**
* Get an object with the currently created players, keyed by player ID
*
* @return {Object} The created players
* @mixes videojs
* @method getPlayers
*/
videojs.getPlayers = function () {
return _player2['default'].players;
};
/**
* For backward compatibility, expose players object.
*
* @deprecated
* @memberOf videojs
* @property {Object|Proxy} players
*/
videojs.players = _utilsCreateDeprecationProxyJs2['default'](_player2['default'].players, {
get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',
set: 'Modification of videojs.players is deprecated'
});
/**
* Get a component class object by name
* ```js
* var VjsButton = videojs.getComponent('Button');
* // Create a new instance of the component
* var myButton = new VjsButton(myPlayer);
* ```
*
* @return {Component} Component identified by name
* @mixes videojs
* @method getComponent
*/
videojs.getComponent = _component2['default'].getComponent;
/**
* Register a component so it can referred to by name
* Used when adding to other
* components, either through addChild
* `component.addChild('myComponent')`
* or through default children options
* `{ children: ['myComponent'] }`.
* ```js
* // Get a component to subclass
* var VjsButton = videojs.getComponent('Button');
* // Subclass the component (see 'extend' doc for more info)
* var MySpecialButton = videojs.extend(VjsButton, {});
* // Register the new component
* VjsButton.registerComponent('MySepcialButton', MySepcialButton);
* // (optionally) add the new component as a default player child
* myPlayer.addChild('MySepcialButton');
* ```
* NOTE: You could also just initialize the component before adding.
* `component.addChild(new MyComponent());`
*
* @param {String} The class name of the component
* @param {Component} The component class
* @return {Component} The newly registered component
* @mixes videojs
* @method registerComponent
*/
videojs.registerComponent = function (name, comp) {
if (_techTechJs2['default'].isTech(comp)) {
_utilsLogJs2['default'].warn('The ' + name + ' tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)');
}
_component2['default'].registerComponent.call(_component2['default'], name, comp);
};
/**
* Get a Tech class object by name
* ```js
* var Html5 = videojs.getTech('Html5');
* // Create a new instance of the component
* var html5 = new Html5(options);
* ```
*
* @return {Tech} Tech identified by name
* @mixes videojs
* @method getComponent
*/
videojs.getTech = _techTechJs2['default'].getTech;
/**
* Register a Tech so it can referred to by name.
* This is used in the tech order for the player.
*
* ```js
* // get the Html5 Tech
* var Html5 = videojs.getTech('Html5');
* var MyTech = videojs.extend(Html5, {});
* // Register the new Tech
* VjsButton.registerTech('Tech', MyTech);
* var player = videojs('myplayer', {
* techOrder: ['myTech', 'html5']
* });
* ```
*
* @param {String} The class name of the tech
* @param {Tech} The tech class
* @return {Tech} The newly registered Tech
* @mixes videojs
* @method registerTech
*/
videojs.registerTech = _techTechJs2['default'].registerTech;
/**
* A suite of browser and device tests
*
* @type {Object}
* @private
*/
videojs.browser = browser;
/**
* Whether or not the browser supports touch events. Included for backward
* compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`
* instead going forward.
*
* @deprecated
* @type {Boolean}
*/
videojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;
/**
* Subclass an existing class
* Mimics ES6 subclassing with the `extend` keyword
* ```js
* // Create a basic javascript 'class'
* function MyClass(name){
* // Set a property at initialization
* this.myName = name;
* }
* // Create an instance method
* MyClass.prototype.sayMyName = function(){
* alert(this.myName);
* };
* // Subclass the exisitng class and change the name
* // when initializing
* var MySubClass = videojs.extend(MyClass, {
* constructor: function(name) {
* // Call the super class constructor for the subclass
* MyClass.call(this, name)
* }
* });
* // Create an instance of the new sub class
* var myInstance = new MySubClass('John');
* myInstance.sayMyName(); // -> should alert "John"
* ```
*
* @param {Function} The Class to subclass
* @param {Object} An object including instace methods for the new class
* Optionally including a `constructor` function
* @return {Function} The newly created subclass
* @mixes videojs
* @method extend
*/
videojs.extend = _extendJs2['default'];
/**
* Merge two options objects recursively
* Performs a deep merge like lodash.merge but **only merges plain objects**
* (not arrays, elements, anything else)
* Other values will be copied directly from the second object.
* ```js
* var defaultOptions = {
* foo: true,
* bar: {
* a: true,
* b: [1,2,3]
* }
* };
* var newOptions = {
* foo: false,
* bar: {
* b: [4,5,6]
* }
* };
* var result = videojs.mergeOptions(defaultOptions, newOptions);
* // result.foo = false;
* // result.bar.a = true;
* // result.bar.b = [4,5,6];
* ```
*
* @param {Object} defaults The options object whose values will be overriden
* @param {Object} overrides The options object with values to override the first
* @param {Object} etc Any number of additional options objects
*
* @return {Object} a new object with the merged values
* @mixes videojs
* @method mergeOptions
*/
videojs.mergeOptions = _srcJsUtilsMergeOptionsJs2['default'];
/**
* Change the context (this) of a function
*
* videojs.bind(newContext, function(){
* this === newContext
* });
*
* NOTE: as of v5.0 we require an ES5 shim, so you should use the native
* `function(){}.bind(newContext);` instead of this.
*
* @param {*} context The object to bind as scope
* @param {Function} fn The function to be bound to a scope
* @param {Number=} uid An optional unique ID for the function to be set
* @return {Function}
*/
videojs.bind = Fn.bind;
/**
* Create a Video.js player plugin
* Plugins are only initialized when options for the plugin are included
* in the player options, or the plugin function on the player instance is
* called.
* **See the plugin guide in the docs for a more detailed example**
* ```js
* // Make a plugin that alerts when the player plays
* videojs.plugin('myPlugin', function(myPluginOptions) {
* myPluginOptions = myPluginOptions || {};
*
* var player = this;
* var alertText = myPluginOptions.text || 'Player is playing!'
*
* player.on('play', function(){
* alert(alertText);
* });
* });
* // USAGE EXAMPLES
* // EXAMPLE 1: New player with plugin options, call plugin immediately
* var player1 = videojs('idOne', {
* myPlugin: {
* text: 'Custom text!'
* }
* });
* // Click play
* // --> Should alert 'Custom text!'
* // EXAMPLE 3: New player, initialize plugin later
* var player3 = videojs('idThree');
* // Click play
* // --> NO ALERT
* // Click pause
* // Initialize plugin using the plugin function on the player instance
* player3.myPlugin({
* text: 'Plugin added later!'
* });
* // Click play
* // --> Should alert 'Plugin added later!'
* ```
*
* @param {String} name The plugin name
* @param {Function} fn The plugin function that will be called with options
* @mixes videojs
* @method plugin
*/
videojs.plugin = _pluginsJs2['default'];
/**
* Adding languages so that they're available to all players.
* ```js
* videojs.addLanguage('es', { 'Hello': 'Hola' });
* ```
*
* @param {String} code The language code or dictionary property
* @param {Object} data The data values to be translated
* @return {Object} The resulting language dictionary object
* @mixes videojs
* @method addLanguage
*/
videojs.addLanguage = function (code, data) {
var _merge;
code = ('' + code).toLowerCase();
return _lodashCompatObjectMerge2['default'](videojs.options.languages, (_merge = {}, _merge[code] = data, _merge))[code];
};
/**
* Log debug messages.
*
* @param {...Object} messages One or more messages to log
*/
videojs.log = _utilsLogJs2['default'];
/**
* Creates an emulated TimeRange object.
*
* @param {Number|Array} start Start time in seconds or an array of ranges
* @param {Number} end End time in seconds
* @return {Object} Fake TimeRange object
* @method createTimeRange
*/
videojs.createTimeRange = videojs.createTimeRanges = _utilsTimeRangesJs.createTimeRanges;
/**
* Format seconds as a time string, H:MM:SS or M:SS
* Supplying a guide (in seconds) will force a number of leading zeros
* to cover the length of the guide
*
* @param {Number} seconds Number of seconds to be turned into a string
* @param {Number} guide Number (in seconds) to model the string after
* @return {String} Time formatted as H:MM:SS or M:SS
* @method formatTime
*/
videojs.formatTime = _utilsFormatTimeJs2['default'];
/**
* Resolve and parse the elements of a URL
*
* @param {String} url The url to parse
* @return {Object} An object of url details
* @method parseUrl
*/
videojs.parseUrl = Url.parseUrl;
/**
* Returns whether the url passed is a cross domain request or not.
*
* @param {String} url The url to check
* @return {Boolean} Whether it is a cross domain request or not
* @method isCrossOrigin
*/
videojs.isCrossOrigin = Url.isCrossOrigin;
/**
* Event target class.
*
* @type {Function}
*/
videojs.EventTarget = _eventTarget2['default'];
/**
* Add an event listener to element
* It stores the handler function in a separate cache object
* and adds a generic handler to the element's event,
* along with a unique id (guid) to the element.
*
* @param {Element|Object} elem Element or object to bind listeners to
* @param {String|Array} type Type of event to bind to.
* @param {Function} fn Event listener.
* @method on
*/
videojs.on = Events.on;
/**
* Trigger a listener only once for an event
*
* @param {Element|Object} elem Element or object to
* @param {String|Array} type Name/type of event
* @param {Function} fn Event handler function
* @method one
*/
videojs.one = Events.one;
/**
* Removes event listeners from an element
*
* @param {Element|Object} elem Object to remove listeners from
* @param {String|Array=} type Type of listener to remove. Don't include to remove all events from element.
* @param {Function} fn Specific listener to remove. Don't include to remove listeners for an event type.
* @method off
*/
videojs.off = Events.off;
/**
* Trigger an event for an element
*
* @param {Element|Object} elem Element to trigger an event on
* @param {Event|Object|String} event A string (the type) or an event object with a type attribute
* @param {Object} [hash] data hash to pass along with the event
* @return {Boolean=} Returned only if default was prevented
* @method trigger
*/
videojs.trigger = Events.trigger;
/**
* A cross-browser XMLHttpRequest wrapper. Here's a simple example:
*
* videojs.xhr({
* body: someJSONString,
* uri: "/foo",
* headers: {
* "Content-Type": "application/json"
* }
* }, function (err, resp, body) {
* // check resp.statusCode
* });
*
* Check out the [full
* documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)
* for more options.
*
* @param {Object} options settings for the request.
* @return {XMLHttpRequest|XDomainRequest} the request object.
* @see https://github.com/Raynos/xhr
*/
videojs.xhr = _xhr2['default'];
/**
* TextTrack class
*
* @type {Function}
*/
videojs.TextTrack = _tracksTextTrackJs2['default'];
/**
* Determines, via duck typing, whether or not a value is a DOM element.
*
* @method isEl
* @param {Mixed} value
* @return {Boolean}
*/
videojs.isEl = Dom.isEl;
/**
* Determines, via duck typing, whether or not a value is a text node.
*
* @method isTextNode
* @param {Mixed} value
* @return {Boolean}
*/
videojs.isTextNode = Dom.isTextNode;
/**
* Check if an element has a CSS class
*
* @method hasClass
* @param {Element} element Element to check
* @param {String} classToCheck Classname to check
*/
videojs.hasClass = Dom.hasElClass;
/**
* Add a CSS class name to an element
*
* @method addClass
* @param {Element} element Element to add class name to
* @param {String} classToAdd Classname to add
*/
videojs.addClass = Dom.addElClass;
/**
* Remove a CSS class name from an element
*
* @method removeClass
* @param {Element} element Element to remove from class name
* @param {String} classToRemove Classname to remove
*/
videojs.removeClass = Dom.removeElClass;
/**
* Adds or removes a CSS class name on an element depending on an optional
* condition or the presence/absence of the class name.
*
* @method toggleElClass
* @param {Element} element
* @param {String} classToToggle
* @param {Boolean|Function} [predicate]
* Can be a function that returns a Boolean. If `true`, the class
* will be added; if `false`, the class will be removed. If not
* given, the class will be added if not present and vice versa.
*/
videojs.toggleClass = Dom.toggleElClass;
/**
* Apply attributes to an HTML element.
*
* @method setAttributes
* @param {Element} el Target element.
* @param {Object=} attributes Element attributes to be applied.
*/
videojs.setAttributes = Dom.setElAttributes;
/**
* Get an element's attribute values, as defined on the HTML tag
* Attributes are not the same as properties. They're defined on the tag
* or with setAttribute (which shouldn't be used with HTML)
* This will return true or false for boolean attributes.
*
* @method getAttributes
* @param {Element} tag Element from which to get tag attributes
* @return {Object}
*/
videojs.getAttributes = Dom.getElAttributes;
/**
* Empties the contents of an element.
*
* @method emptyEl
* @param {Element} el
* @return {Element}
*/
videojs.emptyEl = Dom.emptyEl;
/**
* Normalizes and appends content to an element.
*
* The content for an element can be passed in multiple types and
* combinations, whose behavior is as follows:
*
* - String
* Normalized into a text node.
*
* - Element, TextNode
* Passed through.
*
* - Array
* A one-dimensional array of strings, elements, nodes, or functions (which
* return single strings, elements, or nodes).
*
* - Function
* If the sole argument, is expected to produce a string, element,
* node, or array.
*
* @method appendContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* @return {Element}
*/
videojs.appendContent = Dom.appendContent;
/**
* Normalizes and inserts content into an element; this is identical to
* `appendContent()`, except it empties the element first.
*
* The content for an element can be passed in multiple types and
* combinations, whose behavior is as follows:
*
* - String
* Normalized into a text node.
*
* - Element, TextNode
* Passed through.
*
* - Array
* A one-dimensional array of strings, elements, nodes, or functions (which
* return single strings, elements, or nodes).
*
* - Function
* If the sole argument, is expected to produce a string, element,
* node, or array.
*
* @method insertContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* @return {Element}
*/
videojs.insertContent = Dom.insertContent;
/*
* Custom Universal Module Definition (UMD)
*
* Video.js will never be a non-browser lib so we can simplify UMD a bunch and
* still support requirejs and browserify. This also needs to be closure
* compiler compatible, so string keys are used.
*/
if (typeof define === 'function' && define['amd']) {
define('videojs', [], function () {
return videojs;
});
// checking that module is an object too because of umdjs/umd#35
} else if (typeof exports === 'object' && typeof module === 'object') {
module['exports'] = videojs;
}
exports['default'] = videojs;
module.exports = exports['default'];
},{"../../src/js/utils/merge-options.js":134,"./component":65,"./event-target":97,"./extend.js":98,"./player":106,"./plugins.js":107,"./setup":109,"./tech/flash.js":112,"./tech/html5.js":113,"./tech/tech.js":115,"./tracks/text-track.js":124,"./utils/browser.js":125,"./utils/create-deprecation-proxy.js":127,"./utils/dom.js":128,"./utils/events.js":129,"./utils/fn.js":130,"./utils/format-time.js":131,"./utils/log.js":133,"./utils/stylesheet.js":135,"./utils/time-ranges.js":136,"./utils/url.js":138,"global/document":1,"lodash-compat/object/merge":40,"object.assign":45,"xhr":55}]},{},[139])(139)
});
//# sourceMappingURL=video.js.map
/* vtt.js - v0.12.1 (https://github.com/mozilla/vtt.js) built on 08-07-2015 */
(function(root) {
var vttjs = root.vttjs = {};
var cueShim = vttjs.VTTCue;
var regionShim = vttjs.VTTRegion;
var oldVTTCue = root.VTTCue;
var oldVTTRegion = root.VTTRegion;
vttjs.shim = function() {
vttjs.VTTCue = cueShim;
vttjs.VTTRegion = regionShim;
};
vttjs.restore = function() {
vttjs.VTTCue = oldVTTCue;
vttjs.VTTRegion = oldVTTRegion;
};
}(this));
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function(root, vttjs) {
var autoKeyword = "auto";
var directionSetting = {
"": true,
"lr": true,
"rl": true
};
var alignSetting = {
"start": true,
"middle": true,
"end": true,
"left": true,
"right": true
};
function findDirectionSetting(value) {
if (typeof value !== "string") {
return false;
}
var dir = directionSetting[value.toLowerCase()];
return dir ? value.toLowerCase() : false;
}
function findAlignSetting(value) {
if (typeof value !== "string") {
return false;
}
var align = alignSetting[value.toLowerCase()];
return align ? value.toLowerCase() : false;
}
function extend(obj) {
var i = 1;
for (; i < arguments.length; i++) {
var cobj = arguments[i];
for (var p in cobj) {
obj[p] = cobj[p];
}
}
return obj;
}
function VTTCue(startTime, endTime, text) {
var cue = this;
var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
var baseObj = {};
if (isIE8) {
cue = document.createElement('custom');
} else {
baseObj.enumerable = true;
}
/**
* Shim implementation specific properties. These properties are not in
* the spec.
*/
// Lets us know when the VTTCue's data has changed in such a way that we need
// to recompute its display state. This lets us compute its display state
// lazily.
cue.hasBeenReset = false;
/**
* VTTCue and TextTrackCue properties
* http://dev.w3.org/html5/webvtt/#vttcue-interface
*/
var _id = "";
var _pauseOnExit = false;
var _startTime = startTime;
var _endTime = endTime;
var _text = text;
var _region = null;
var _vertical = "";
var _snapToLines = true;
var _line = "auto";
var _lineAlign = "start";
var _position = 50;
var _positionAlign = "middle";
var _size = 50;
var _align = "middle";
Object.defineProperty(cue,
"id", extend({}, baseObj, {
get: function() {
return _id;
},
set: function(value) {
_id = "" + value;
}
}));
Object.defineProperty(cue,
"pauseOnExit", extend({}, baseObj, {
get: function() {
return _pauseOnExit;
},
set: function(value) {
_pauseOnExit = !!value;
}
}));
Object.defineProperty(cue,
"startTime", extend({}, baseObj, {
get: function() {
return _startTime;
},
set: function(value) {
if (typeof value !== "number") {
throw new TypeError("Start time must be set to a number.");
}
_startTime = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"endTime", extend({}, baseObj, {
get: function() {
return _endTime;
},
set: function(value) {
if (typeof value !== "number") {
throw new TypeError("End time must be set to a number.");
}
_endTime = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"text", extend({}, baseObj, {
get: function() {
return _text;
},
set: function(value) {
_text = "" + value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"region", extend({}, baseObj, {
get: function() {
return _region;
},
set: function(value) {
_region = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"vertical", extend({}, baseObj, {
get: function() {
return _vertical;
},
set: function(value) {
var setting = findDirectionSetting(value);
// Have to check for false because the setting an be an empty string.
if (setting === false) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_vertical = setting;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"snapToLines", extend({}, baseObj, {
get: function() {
return _snapToLines;
},
set: function(value) {
_snapToLines = !!value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"line", extend({}, baseObj, {
get: function() {
return _line;
},
set: function(value) {
if (typeof value !== "number" && value !== autoKeyword) {
throw new SyntaxError("An invalid number or illegal string was specified.");
}
_line = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"lineAlign", extend({}, baseObj, {
get: function() {
return _lineAlign;
},
set: function(value) {
var setting = findAlignSetting(value);
if (!setting) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_lineAlign = setting;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"position", extend({}, baseObj, {
get: function() {
return _position;
},
set: function(value) {
if (value < 0 || value > 100) {
throw new Error("Position must be between 0 and 100.");
}
_position = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"positionAlign", extend({}, baseObj, {
get: function() {
return _positionAlign;
},
set: function(value) {
var setting = findAlignSetting(value);
if (!setting) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_positionAlign = setting;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"size", extend({}, baseObj, {
get: function() {
return _size;
},
set: function(value) {
if (value < 0 || value > 100) {
throw new Error("Size must be between 0 and 100.");
}
_size = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"align", extend({}, baseObj, {
get: function() {
return _align;
},
set: function(value) {
var setting = findAlignSetting(value);
if (!setting) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_align = setting;
this.hasBeenReset = true;
}
}));
/**
* Other <track> spec defined properties
*/
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state
cue.displayState = undefined;
if (isIE8) {
return cue;
}
}
/**
* VTTCue methods
*/
VTTCue.prototype.getCueAsHTML = function() {
// Assume WebVTT.convertCueToDOMTree is on the global.
return WebVTT.convertCueToDOMTree(window, this.text);
};
root.VTTCue = root.VTTCue || VTTCue;
vttjs.VTTCue = VTTCue;
}(this, (this.vttjs || {})));
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function(root, vttjs) {
var scrollSetting = {
"": true,
"up": true
};
function findScrollSetting(value) {
if (typeof value !== "string") {
return false;
}
var scroll = scrollSetting[value.toLowerCase()];
return scroll ? value.toLowerCase() : false;
}
function isValidPercentValue(value) {
return typeof value === "number" && (value >= 0 && value <= 100);
}
// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface
function VTTRegion() {
var _width = 100;
var _lines = 3;
var _regionAnchorX = 0;
var _regionAnchorY = 100;
var _viewportAnchorX = 0;
var _viewportAnchorY = 100;
var _scroll = "";
Object.defineProperties(this, {
"width": {
enumerable: true,
get: function() {
return _width;
},
set: function(value) {
if (!isValidPercentValue(value)) {
throw new Error("Width must be between 0 and 100.");
}
_width = value;
}
},
"lines": {
enumerable: true,
get: function() {
return _lines;
},
set: function(value) {
if (typeof value !== "number") {
throw new TypeError("Lines must be set to a number.");
}
_lines = value;
}
},
"regionAnchorY": {
enumerable: true,
get: function() {
return _regionAnchorY;
},
set: function(value) {
if (!isValidPercentValue(value)) {
throw new Error("RegionAnchorX must be between 0 and 100.");
}
_regionAnchorY = value;
}
},
"regionAnchorX": {
enumerable: true,
get: function() {
return _regionAnchorX;
},
set: function(value) {
if(!isValidPercentValue(value)) {
throw new Error("RegionAnchorY must be between 0 and 100.");
}
_regionAnchorX = value;
}
},
"viewportAnchorY": {
enumerable: true,
get: function() {
return _viewportAnchorY;
},
set: function(value) {
if (!isValidPercentValue(value)) {
throw new Error("ViewportAnchorY must be between 0 and 100.");
}
_viewportAnchorY = value;
}
},
"viewportAnchorX": {
enumerable: true,
get: function() {
return _viewportAnchorX;
},
set: function(value) {
if (!isValidPercentValue(value)) {
throw new Error("ViewportAnchorX must be between 0 and 100.");
}
_viewportAnchorX = value;
}
},
"scroll": {
enumerable: true,
get: function() {
return _scroll;
},
set: function(value) {
var setting = findScrollSetting(value);
// Have to check for false as an empty string is a legal value.
if (setting === false) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_scroll = setting;
}
}
});
}
root.VTTRegion = root.VTTRegion || VTTRegion;
vttjs.VTTRegion = VTTRegion;
}(this, (this.vttjs || {})));
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
(function(global) {
var _objCreate = Object.create || (function() {
function F() {}
return function(o) {
if (arguments.length !== 1) {
throw new Error('Object.create shim only accepts one parameter.');
}
F.prototype = o;
return new F();
};
})();
// Creates a new ParserError object from an errorData object. The errorData
// object should have default code and message properties. The default message
// property can be overriden by passing in a message parameter.
// See ParsingError.Errors below for acceptable errors.
function ParsingError(errorData, message) {
this.name = "ParsingError";
this.code = errorData.code;
this.message = message || errorData.message;
}
ParsingError.prototype = _objCreate(Error.prototype);
ParsingError.prototype.constructor = ParsingError;
// ParsingError metadata for acceptable ParsingErrors.
ParsingError.Errors = {
BadSignature: {
code: 0,
message: "Malformed WebVTT signature."
},
BadTimeStamp: {
code: 1,
message: "Malformed time stamp."
}
};
// Try to parse input as a time stamp.
function parseTimeStamp(input) {
function computeSeconds(h, m, s, f) {
return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;
}
var m = input.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);
if (!m) {
return null;
}
if (m[3]) {
// Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]
return computeSeconds(m[1], m[2], m[3].replace(":", ""), m[4]);
} else if (m[1] > 59) {
// Timestamp takes the form of [hours]:[minutes].[milliseconds]
// First position is hours as it's over 59.
return computeSeconds(m[1], m[2], 0, m[4]);
} else {
// Timestamp takes the form of [minutes]:[seconds].[milliseconds]
return computeSeconds(0, m[1], m[2], m[4]);
}
}
// A settings object holds key/value pairs and will ignore anything but the first
// assignment to a specific key.
function Settings() {
this.values = _objCreate(null);
}
Settings.prototype = {
// Only accept the first assignment to any key.
set: function(k, v) {
if (!this.get(k) && v !== "") {
this.values[k] = v;
}
},
// Return the value for a key, or a default value.
// If 'defaultKey' is passed then 'dflt' is assumed to be an object with
// a number of possible default values as properties where 'defaultKey' is
// the key of the property that will be chosen; otherwise it's assumed to be
// a single value.
get: function(k, dflt, defaultKey) {
if (defaultKey) {
return this.has(k) ? this.values[k] : dflt[defaultKey];
}
return this.has(k) ? this.values[k] : dflt;
},
// Check whether we have a value for a key.
has: function(k) {
return k in this.values;
},
// Accept a setting if its one of the given alternatives.
alt: function(k, v, a) {
for (var n = 0; n < a.length; ++n) {
if (v === a[n]) {
this.set(k, v);
break;
}
}
},
// Accept a setting if its a valid (signed) integer.
integer: function(k, v) {
if (/^-?\d+$/.test(v)) { // integer
this.set(k, parseInt(v, 10));
}
},
// Accept a setting if its a valid percentage.
percent: function(k, v) {
var m;
if ((m = v.match(/^([\d]{1,3})(\.[\d]*)?%$/))) {
v = parseFloat(v);
if (v >= 0 && v <= 100) {
this.set(k, v);
return true;
}
}
return false;
}
};
// Helper function to parse input into groups separated by 'groupDelim', and
// interprete each group as a key/value pair separated by 'keyValueDelim'.
function parseOptions(input, callback, keyValueDelim, groupDelim) {
var groups = groupDelim ? input.split(groupDelim) : [input];
for (var i in groups) {
if (typeof groups[i] !== "string") {
continue;
}
var kv = groups[i].split(keyValueDelim);
if (kv.length !== 2) {
continue;
}
var k = kv[0];
var v = kv[1];
callback(k, v);
}
}
function parseCue(input, cue, regionList) {
// Remember the original input if we need to throw an error.
var oInput = input;
// 4.1 WebVTT timestamp
function consumeTimeStamp() {
var ts = parseTimeStamp(input);
if (ts === null) {
throw new ParsingError(ParsingError.Errors.BadTimeStamp,
"Malformed timestamp: " + oInput);
}
// Remove time stamp from input.
input = input.replace(/^[^\sa-zA-Z-]+/, "");
return ts;
}
// 4.4.2 WebVTT cue settings
function consumeCueSettings(input, cue) {
var settings = new Settings();
parseOptions(input, function (k, v) {
switch (k) {
case "region":
// Find the last region we parsed with the same region id.
for (var i = regionList.length - 1; i >= 0; i--) {
if (regionList[i].id === v) {
settings.set(k, regionList[i].region);
break;
}
}
break;
case "vertical":
settings.alt(k, v, ["rl", "lr"]);
break;
case "line":
var vals = v.split(","),
vals0 = vals[0];
settings.integer(k, vals0);
settings.percent(k, vals0) ? settings.set("snapToLines", false) : null;
settings.alt(k, vals0, ["auto"]);
if (vals.length === 2) {
settings.alt("lineAlign", vals[1], ["start", "middle", "end"]);
}
break;
case "position":
vals = v.split(",");
settings.percent(k, vals[0]);
if (vals.length === 2) {
settings.alt("positionAlign", vals[1], ["start", "middle", "end"]);
}
break;
case "size":
settings.percent(k, v);
break;
case "align":
settings.alt(k, v, ["start", "middle", "end", "left", "right"]);
break;
}
}, /:/, /\s/);
// Apply default values for any missing fields.
cue.region = settings.get("region", null);
cue.vertical = settings.get("vertical", "");
cue.line = settings.get("line", "auto");
cue.lineAlign = settings.get("lineAlign", "start");
cue.snapToLines = settings.get("snapToLines", true);
cue.size = settings.get("size", 100);
cue.align = settings.get("align", "middle");
cue.position = settings.get("position", {
start: 0,
left: 0,
middle: 50,
end: 100,
right: 100
}, cue.align);
cue.positionAlign = settings.get("positionAlign", {
start: "start",
left: "start",
middle: "middle",
end: "end",
right: "end"
}, cue.align);
}
function skipWhitespace() {
input = input.replace(/^\s+/, "");
}
// 4.1 WebVTT cue timings.
skipWhitespace();
cue.startTime = consumeTimeStamp(); // (1) collect cue start time
skipWhitespace();
if (input.substr(0, 3) !== "-->") { // (3) next characters must match "-->"
throw new ParsingError(ParsingError.Errors.BadTimeStamp,
"Malformed time stamp (time stamps must be separated by '-->'): " +
oInput);
}
input = input.substr(3);
skipWhitespace();
cue.endTime = consumeTimeStamp(); // (5) collect cue end time
// 4.1 WebVTT cue settings list.
skipWhitespace();
consumeCueSettings(input, cue);
}
var ESCAPE = {
"&amp;": "&",
"&lt;": "<",
"&gt;": ">",
"&lrm;": "\u200e",
"&rlm;": "\u200f",
"&nbsp;": "\u00a0"
};
var TAG_NAME = {
c: "span",
i: "i",
b: "b",
u: "u",
ruby: "ruby",
rt: "rt",
v: "span",
lang: "span"
};
var TAG_ANNOTATION = {
v: "title",
lang: "lang"
};
var NEEDS_PARENT = {
rt: "ruby"
};
// Parse content into a document fragment.
function parseContent(window, input) {
function nextToken() {
// Check for end-of-string.
if (!input) {
return null;
}
// Consume 'n' characters from the input.
function consume(result) {
input = input.substr(result.length);
return result;
}
var m = input.match(/^([^<]*)(<[^>]+>?)?/);
// If there is some text before the next tag, return it, otherwise return
// the tag.
return consume(m[1] ? m[1] : m[2]);
}
// Unescape a string 's'.
function unescape1(e) {
return ESCAPE[e];
}
function unescape(s) {
while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {
s = s.replace(m[0], unescape1);
}
return s;
}
function shouldAdd(current, element) {
return !NEEDS_PARENT[element.localName] ||
NEEDS_PARENT[element.localName] === current.localName;
}
// Create an element for this tag.
function createElement(type, annotation) {
var tagName = TAG_NAME[type];
if (!tagName) {
return null;
}
var element = window.document.createElement(tagName);
element.localName = tagName;
var name = TAG_ANNOTATION[type];
if (name && annotation) {
element[name] = annotation.trim();
}
return element;
}
var rootDiv = window.document.createElement("div"),
current = rootDiv,
t,
tagStack = [];
while ((t = nextToken()) !== null) {
if (t[0] === '<') {
if (t[1] === "/") {
// If the closing tag matches, move back up to the parent node.
if (tagStack.length &&
tagStack[tagStack.length - 1] === t.substr(2).replace(">", "")) {
tagStack.pop();
current = current.parentNode;
}
// Otherwise just ignore the end tag.
continue;
}
var ts = parseTimeStamp(t.substr(1, t.length - 2));
var node;
if (ts) {
// Timestamps are lead nodes as well.
node = window.document.createProcessingInstruction("timestamp", ts);
current.appendChild(node);
continue;
}
var m = t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);
// If we can't parse the tag, skip to the next tag.
if (!m) {
continue;
}
// Try to construct an element, and ignore the tag if we couldn't.
node = createElement(m[1], m[3]);
if (!node) {
continue;
}
// Determine if the tag should be added based on the context of where it
// is placed in the cuetext.
if (!shouldAdd(current, node)) {
continue;
}
// Set the class list (as a list of classes, separated by space).
if (m[2]) {
node.className = m[2].substr(1).replace('.', ' ');
}
// Append the node to the current node, and enter the scope of the new
// node.
tagStack.push(m[1]);
current.appendChild(node);
current = node;
continue;
}
// Text nodes are leaf nodes.
current.appendChild(window.document.createTextNode(unescape(t)));
}
return rootDiv;
}
// This is a list of all the Unicode characters that have a strong
// right-to-left category. What this means is that these characters are
// written right-to-left for sure. It was generated by pulling all the strong
// right-to-left characters out of the Unicode data table. That table can
// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
var strongRTLChars = [0x05BE, 0x05C0, 0x05C3, 0x05C6, 0x05D0, 0x05D1,
0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA,
0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3,
0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x05F0, 0x05F1,
0x05F2, 0x05F3, 0x05F4, 0x0608, 0x060B, 0x060D, 0x061B, 0x061E, 0x061F,
0x0620, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628,
0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631,
0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A,
0x063B, 0x063C, 0x063D, 0x063E, 0x063F, 0x0640, 0x0641, 0x0642, 0x0643,
0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x066D, 0x066E,
0x066F, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0x0677, 0x0678,
0x0679, 0x067A, 0x067B, 0x067C, 0x067D, 0x067E, 0x067F, 0x0680, 0x0681,
0x0682, 0x0683, 0x0684, 0x0685, 0x0686, 0x0687, 0x0688, 0x0689, 0x068A,
0x068B, 0x068C, 0x068D, 0x068E, 0x068F, 0x0690, 0x0691, 0x0692, 0x0693,
0x0694, 0x0695, 0x0696, 0x0697, 0x0698, 0x0699, 0x069A, 0x069B, 0x069C,
0x069D, 0x069E, 0x069F, 0x06A0, 0x06A1, 0x06A2, 0x06A3, 0x06A4, 0x06A5,
0x06A6, 0x06A7, 0x06A8, 0x06A9, 0x06AA, 0x06AB, 0x06AC, 0x06AD, 0x06AE,
0x06AF, 0x06B0, 0x06B1, 0x06B2, 0x06B3, 0x06B4, 0x06B5, 0x06B6, 0x06B7,
0x06B8, 0x06B9, 0x06BA, 0x06BB, 0x06BC, 0x06BD, 0x06BE, 0x06BF, 0x06C0,
0x06C1, 0x06C2, 0x06C3, 0x06C4, 0x06C5, 0x06C6, 0x06C7, 0x06C8, 0x06C9,
0x06CA, 0x06CB, 0x06CC, 0x06CD, 0x06CE, 0x06CF, 0x06D0, 0x06D1, 0x06D2,
0x06D3, 0x06D4, 0x06D5, 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FB,
0x06FC, 0x06FD, 0x06FE, 0x06FF, 0x0700, 0x0701, 0x0702, 0x0703, 0x0704,
0x0705, 0x0706, 0x0707, 0x0708, 0x0709, 0x070A, 0x070B, 0x070C, 0x070D,
0x070F, 0x0710, 0x0712, 0x0713, 0x0714, 0x0715, 0x0716, 0x0717, 0x0718,
0x0719, 0x071A, 0x071B, 0x071C, 0x071D, 0x071E, 0x071F, 0x0720, 0x0721,
0x0722, 0x0723, 0x0724, 0x0725, 0x0726, 0x0727, 0x0728, 0x0729, 0x072A,
0x072B, 0x072C, 0x072D, 0x072E, 0x072F, 0x074D, 0x074E, 0x074F, 0x0750,
0x0751, 0x0752, 0x0753, 0x0754, 0x0755, 0x0756, 0x0757, 0x0758, 0x0759,
0x075A, 0x075B, 0x075C, 0x075D, 0x075E, 0x075F, 0x0760, 0x0761, 0x0762,
0x0763, 0x0764, 0x0765, 0x0766, 0x0767, 0x0768, 0x0769, 0x076A, 0x076B,
0x076C, 0x076D, 0x076E, 0x076F, 0x0770, 0x0771, 0x0772, 0x0773, 0x0774,
0x0775, 0x0776, 0x0777, 0x0778, 0x0779, 0x077A, 0x077B, 0x077C, 0x077D,
0x077E, 0x077F, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0786,
0x0787, 0x0788, 0x0789, 0x078A, 0x078B, 0x078C, 0x078D, 0x078E, 0x078F,
0x0790, 0x0791, 0x0792, 0x0793, 0x0794, 0x0795, 0x0796, 0x0797, 0x0798,
0x0799, 0x079A, 0x079B, 0x079C, 0x079D, 0x079E, 0x079F, 0x07A0, 0x07A1,
0x07A2, 0x07A3, 0x07A4, 0x07A5, 0x07B1, 0x07C0, 0x07C1, 0x07C2, 0x07C3,
0x07C4, 0x07C5, 0x07C6, 0x07C7, 0x07C8, 0x07C9, 0x07CA, 0x07CB, 0x07CC,
0x07CD, 0x07CE, 0x07CF, 0x07D0, 0x07D1, 0x07D2, 0x07D3, 0x07D4, 0x07D5,
0x07D6, 0x07D7, 0x07D8, 0x07D9, 0x07DA, 0x07DB, 0x07DC, 0x07DD, 0x07DE,
0x07DF, 0x07E0, 0x07E1, 0x07E2, 0x07E3, 0x07E4, 0x07E5, 0x07E6, 0x07E7,
0x07E8, 0x07E9, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x0800, 0x0801, 0x0802,
0x0803, 0x0804, 0x0805, 0x0806, 0x0807, 0x0808, 0x0809, 0x080A, 0x080B,
0x080C, 0x080D, 0x080E, 0x080F, 0x0810, 0x0811, 0x0812, 0x0813, 0x0814,
0x0815, 0x081A, 0x0824, 0x0828, 0x0830, 0x0831, 0x0832, 0x0833, 0x0834,
0x0835, 0x0836, 0x0837, 0x0838, 0x0839, 0x083A, 0x083B, 0x083C, 0x083D,
0x083E, 0x0840, 0x0841, 0x0842, 0x0843, 0x0844, 0x0845, 0x0846, 0x0847,
0x0848, 0x0849, 0x084A, 0x084B, 0x084C, 0x084D, 0x084E, 0x084F, 0x0850,
0x0851, 0x0852, 0x0853, 0x0854, 0x0855, 0x0856, 0x0857, 0x0858, 0x085E,
0x08A0, 0x08A2, 0x08A3, 0x08A4, 0x08A5, 0x08A6, 0x08A7, 0x08A8, 0x08A9,
0x08AA, 0x08AB, 0x08AC, 0x200F, 0xFB1D, 0xFB1F, 0xFB20, 0xFB21, 0xFB22,
0xFB23, 0xFB24, 0xFB25, 0xFB26, 0xFB27, 0xFB28, 0xFB2A, 0xFB2B, 0xFB2C,
0xFB2D, 0xFB2E, 0xFB2F, 0xFB30, 0xFB31, 0xFB32, 0xFB33, 0xFB34, 0xFB35,
0xFB36, 0xFB38, 0xFB39, 0xFB3A, 0xFB3B, 0xFB3C, 0xFB3E, 0xFB40, 0xFB41,
0xFB43, 0xFB44, 0xFB46, 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C,
0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52, 0xFB53, 0xFB54, 0xFB55,
0xFB56, 0xFB57, 0xFB58, 0xFB59, 0xFB5A, 0xFB5B, 0xFB5C, 0xFB5D, 0xFB5E,
0xFB5F, 0xFB60, 0xFB61, 0xFB62, 0xFB63, 0xFB64, 0xFB65, 0xFB66, 0xFB67,
0xFB68, 0xFB69, 0xFB6A, 0xFB6B, 0xFB6C, 0xFB6D, 0xFB6E, 0xFB6F, 0xFB70,
0xFB71, 0xFB72, 0xFB73, 0xFB74, 0xFB75, 0xFB76, 0xFB77, 0xFB78, 0xFB79,
0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, 0xFB7E, 0xFB7F, 0xFB80, 0xFB81, 0xFB82,
0xFB83, 0xFB84, 0xFB85, 0xFB86, 0xFB87, 0xFB88, 0xFB89, 0xFB8A, 0xFB8B,
0xFB8C, 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91, 0xFB92, 0xFB93, 0xFB94,
0xFB95, 0xFB96, 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C, 0xFB9D,
0xFB9E, 0xFB9F, 0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3, 0xFBA4, 0xFBA5, 0xFBA6,
0xFBA7, 0xFBA8, 0xFBA9, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD, 0xFBAE, 0xFBAF,
0xFBB0, 0xFBB1, 0xFBB2, 0xFBB3, 0xFBB4, 0xFBB5, 0xFBB6, 0xFBB7, 0xFBB8,
0xFBB9, 0xFBBA, 0xFBBB, 0xFBBC, 0xFBBD, 0xFBBE, 0xFBBF, 0xFBC0, 0xFBC1,
0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6, 0xFBD7, 0xFBD8, 0xFBD9, 0xFBDA, 0xFBDB,
0xFBDC, 0xFBDD, 0xFBDE, 0xFBDF, 0xFBE0, 0xFBE1, 0xFBE2, 0xFBE3, 0xFBE4,
0xFBE5, 0xFBE6, 0xFBE7, 0xFBE8, 0xFBE9, 0xFBEA, 0xFBEB, 0xFBEC, 0xFBED,
0xFBEE, 0xFBEF, 0xFBF0, 0xFBF1, 0xFBF2, 0xFBF3, 0xFBF4, 0xFBF5, 0xFBF6,
0xFBF7, 0xFBF8, 0xFBF9, 0xFBFA, 0xFBFB, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF,
0xFC00, 0xFC01, 0xFC02, 0xFC03, 0xFC04, 0xFC05, 0xFC06, 0xFC07, 0xFC08,
0xFC09, 0xFC0A, 0xFC0B, 0xFC0C, 0xFC0D, 0xFC0E, 0xFC0F, 0xFC10, 0xFC11,
0xFC12, 0xFC13, 0xFC14, 0xFC15, 0xFC16, 0xFC17, 0xFC18, 0xFC19, 0xFC1A,
0xFC1B, 0xFC1C, 0xFC1D, 0xFC1E, 0xFC1F, 0xFC20, 0xFC21, 0xFC22, 0xFC23,
0xFC24, 0xFC25, 0xFC26, 0xFC27, 0xFC28, 0xFC29, 0xFC2A, 0xFC2B, 0xFC2C,
0xFC2D, 0xFC2E, 0xFC2F, 0xFC30, 0xFC31, 0xFC32, 0xFC33, 0xFC34, 0xFC35,
0xFC36, 0xFC37, 0xFC38, 0xFC39, 0xFC3A, 0xFC3B, 0xFC3C, 0xFC3D, 0xFC3E,
0xFC3F, 0xFC40, 0xFC41, 0xFC42, 0xFC43, 0xFC44, 0xFC45, 0xFC46, 0xFC47,
0xFC48, 0xFC49, 0xFC4A, 0xFC4B, 0xFC4C, 0xFC4D, 0xFC4E, 0xFC4F, 0xFC50,
0xFC51, 0xFC52, 0xFC53, 0xFC54, 0xFC55, 0xFC56, 0xFC57, 0xFC58, 0xFC59,
0xFC5A, 0xFC5B, 0xFC5C, 0xFC5D, 0xFC5E, 0xFC5F, 0xFC60, 0xFC61, 0xFC62,
0xFC63, 0xFC64, 0xFC65, 0xFC66, 0xFC67, 0xFC68, 0xFC69, 0xFC6A, 0xFC6B,
0xFC6C, 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70, 0xFC71, 0xFC72, 0xFC73, 0xFC74,
0xFC75, 0xFC76, 0xFC77, 0xFC78, 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D,
0xFC7E, 0xFC7F, 0xFC80, 0xFC81, 0xFC82, 0xFC83, 0xFC84, 0xFC85, 0xFC86,
0xFC87, 0xFC88, 0xFC89, 0xFC8A, 0xFC8B, 0xFC8C, 0xFC8D, 0xFC8E, 0xFC8F,
0xFC90, 0xFC91, 0xFC92, 0xFC93, 0xFC94, 0xFC95, 0xFC96, 0xFC97, 0xFC98,
0xFC99, 0xFC9A, 0xFC9B, 0xFC9C, 0xFC9D, 0xFC9E, 0xFC9F, 0xFCA0, 0xFCA1,
0xFCA2, 0xFCA3, 0xFCA4, 0xFCA5, 0xFCA6, 0xFCA7, 0xFCA8, 0xFCA9, 0xFCAA,
0xFCAB, 0xFCAC, 0xFCAD, 0xFCAE, 0xFCAF, 0xFCB0, 0xFCB1, 0xFCB2, 0xFCB3,
0xFCB4, 0xFCB5, 0xFCB6, 0xFCB7, 0xFCB8, 0xFCB9, 0xFCBA, 0xFCBB, 0xFCBC,
0xFCBD, 0xFCBE, 0xFCBF, 0xFCC0, 0xFCC1, 0xFCC2, 0xFCC3, 0xFCC4, 0xFCC5,
0xFCC6, 0xFCC7, 0xFCC8, 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE,
0xFCCF, 0xFCD0, 0xFCD1, 0xFCD2, 0xFCD3, 0xFCD4, 0xFCD5, 0xFCD6, 0xFCD7,
0xFCD8, 0xFCD9, 0xFCDA, 0xFCDB, 0xFCDC, 0xFCDD, 0xFCDE, 0xFCDF, 0xFCE0,
0xFCE1, 0xFCE2, 0xFCE3, 0xFCE4, 0xFCE5, 0xFCE6, 0xFCE7, 0xFCE8, 0xFCE9,
0xFCEA, 0xFCEB, 0xFCEC, 0xFCED, 0xFCEE, 0xFCEF, 0xFCF0, 0xFCF1, 0xFCF2,
0xFCF3, 0xFCF4, 0xFCF5, 0xFCF6, 0xFCF7, 0xFCF8, 0xFCF9, 0xFCFA, 0xFCFB,
0xFCFC, 0xFCFD, 0xFCFE, 0xFCFF, 0xFD00, 0xFD01, 0xFD02, 0xFD03, 0xFD04,
0xFD05, 0xFD06, 0xFD07, 0xFD08, 0xFD09, 0xFD0A, 0xFD0B, 0xFD0C, 0xFD0D,
0xFD0E, 0xFD0F, 0xFD10, 0xFD11, 0xFD12, 0xFD13, 0xFD14, 0xFD15, 0xFD16,
0xFD17, 0xFD18, 0xFD19, 0xFD1A, 0xFD1B, 0xFD1C, 0xFD1D, 0xFD1E, 0xFD1F,
0xFD20, 0xFD21, 0xFD22, 0xFD23, 0xFD24, 0xFD25, 0xFD26, 0xFD27, 0xFD28,
0xFD29, 0xFD2A, 0xFD2B, 0xFD2C, 0xFD2D, 0xFD2E, 0xFD2F, 0xFD30, 0xFD31,
0xFD32, 0xFD33, 0xFD34, 0xFD35, 0xFD36, 0xFD37, 0xFD38, 0xFD39, 0xFD3A,
0xFD3B, 0xFD3C, 0xFD3D, 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55,
0xFD56, 0xFD57, 0xFD58, 0xFD59, 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D, 0xFD5E,
0xFD5F, 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65, 0xFD66, 0xFD67,
0xFD68, 0xFD69, 0xFD6A, 0xFD6B, 0xFD6C, 0xFD6D, 0xFD6E, 0xFD6F, 0xFD70,
0xFD71, 0xFD72, 0xFD73, 0xFD74, 0xFD75, 0xFD76, 0xFD77, 0xFD78, 0xFD79,
0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D, 0xFD7E, 0xFD7F, 0xFD80, 0xFD81, 0xFD82,
0xFD83, 0xFD84, 0xFD85, 0xFD86, 0xFD87, 0xFD88, 0xFD89, 0xFD8A, 0xFD8B,
0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD92, 0xFD93, 0xFD94, 0xFD95, 0xFD96,
0xFD97, 0xFD98, 0xFD99, 0xFD9A, 0xFD9B, 0xFD9C, 0xFD9D, 0xFD9E, 0xFD9F,
0xFDA0, 0xFDA1, 0xFDA2, 0xFDA3, 0xFDA4, 0xFDA5, 0xFDA6, 0xFDA7, 0xFDA8,
0xFDA9, 0xFDAA, 0xFDAB, 0xFDAC, 0xFDAD, 0xFDAE, 0xFDAF, 0xFDB0, 0xFDB1,
0xFDB2, 0xFDB3, 0xFDB4, 0xFDB5, 0xFDB6, 0xFDB7, 0xFDB8, 0xFDB9, 0xFDBA,
0xFDBB, 0xFDBC, 0xFDBD, 0xFDBE, 0xFDBF, 0xFDC0, 0xFDC1, 0xFDC2, 0xFDC3,
0xFDC4, 0xFDC5, 0xFDC6, 0xFDC7, 0xFDF0, 0xFDF1, 0xFDF2, 0xFDF3, 0xFDF4,
0xFDF5, 0xFDF6, 0xFDF7, 0xFDF8, 0xFDF9, 0xFDFA, 0xFDFB, 0xFDFC, 0xFE70,
0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE76, 0xFE77, 0xFE78, 0xFE79, 0xFE7A,
0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, 0xFE80, 0xFE81, 0xFE82, 0xFE83,
0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C,
0xFE8D, 0xFE8E, 0xFE8F, 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95,
0xFE96, 0xFE97, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E,
0xFE9F, 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7,
0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, 0xFEB0,
0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9,
0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0, 0xFEC1, 0xFEC2,
0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9, 0xFECA, 0xFECB,
0xFECC, 0xFECD, 0xFECE, 0xFECF, 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4,
0xFED5, 0xFED6, 0xFED7, 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD,
0xFEDE, 0xFEDF, 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6,
0xFEE7, 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF,
0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8,
0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0x10800, 0x10801, 0x10802, 0x10803,
0x10804, 0x10805, 0x10808, 0x1080A, 0x1080B, 0x1080C, 0x1080D, 0x1080E,
0x1080F, 0x10810, 0x10811, 0x10812, 0x10813, 0x10814, 0x10815, 0x10816,
0x10817, 0x10818, 0x10819, 0x1081A, 0x1081B, 0x1081C, 0x1081D, 0x1081E,
0x1081F, 0x10820, 0x10821, 0x10822, 0x10823, 0x10824, 0x10825, 0x10826,
0x10827, 0x10828, 0x10829, 0x1082A, 0x1082B, 0x1082C, 0x1082D, 0x1082E,
0x1082F, 0x10830, 0x10831, 0x10832, 0x10833, 0x10834, 0x10835, 0x10837,
0x10838, 0x1083C, 0x1083F, 0x10840, 0x10841, 0x10842, 0x10843, 0x10844,
0x10845, 0x10846, 0x10847, 0x10848, 0x10849, 0x1084A, 0x1084B, 0x1084C,
0x1084D, 0x1084E, 0x1084F, 0x10850, 0x10851, 0x10852, 0x10853, 0x10854,
0x10855, 0x10857, 0x10858, 0x10859, 0x1085A, 0x1085B, 0x1085C, 0x1085D,
0x1085E, 0x1085F, 0x10900, 0x10901, 0x10902, 0x10903, 0x10904, 0x10905,
0x10906, 0x10907, 0x10908, 0x10909, 0x1090A, 0x1090B, 0x1090C, 0x1090D,
0x1090E, 0x1090F, 0x10910, 0x10911, 0x10912, 0x10913, 0x10914, 0x10915,
0x10916, 0x10917, 0x10918, 0x10919, 0x1091A, 0x1091B, 0x10920, 0x10921,
0x10922, 0x10923, 0x10924, 0x10925, 0x10926, 0x10927, 0x10928, 0x10929,
0x1092A, 0x1092B, 0x1092C, 0x1092D, 0x1092E, 0x1092F, 0x10930, 0x10931,
0x10932, 0x10933, 0x10934, 0x10935, 0x10936, 0x10937, 0x10938, 0x10939,
0x1093F, 0x10980, 0x10981, 0x10982, 0x10983, 0x10984, 0x10985, 0x10986,
0x10987, 0x10988, 0x10989, 0x1098A, 0x1098B, 0x1098C, 0x1098D, 0x1098E,
0x1098F, 0x10990, 0x10991, 0x10992, 0x10993, 0x10994, 0x10995, 0x10996,
0x10997, 0x10998, 0x10999, 0x1099A, 0x1099B, 0x1099C, 0x1099D, 0x1099E,
0x1099F, 0x109A0, 0x109A1, 0x109A2, 0x109A3, 0x109A4, 0x109A5, 0x109A6,
0x109A7, 0x109A8, 0x109A9, 0x109AA, 0x109AB, 0x109AC, 0x109AD, 0x109AE,
0x109AF, 0x109B0, 0x109B1, 0x109B2, 0x109B3, 0x109B4, 0x109B5, 0x109B6,
0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A10, 0x10A11, 0x10A12, 0x10A13,
0x10A15, 0x10A16, 0x10A17, 0x10A19, 0x10A1A, 0x10A1B, 0x10A1C, 0x10A1D,
0x10A1E, 0x10A1F, 0x10A20, 0x10A21, 0x10A22, 0x10A23, 0x10A24, 0x10A25,
0x10A26, 0x10A27, 0x10A28, 0x10A29, 0x10A2A, 0x10A2B, 0x10A2C, 0x10A2D,
0x10A2E, 0x10A2F, 0x10A30, 0x10A31, 0x10A32, 0x10A33, 0x10A40, 0x10A41,
0x10A42, 0x10A43, 0x10A44, 0x10A45, 0x10A46, 0x10A47, 0x10A50, 0x10A51,
0x10A52, 0x10A53, 0x10A54, 0x10A55, 0x10A56, 0x10A57, 0x10A58, 0x10A60,
0x10A61, 0x10A62, 0x10A63, 0x10A64, 0x10A65, 0x10A66, 0x10A67, 0x10A68,
0x10A69, 0x10A6A, 0x10A6B, 0x10A6C, 0x10A6D, 0x10A6E, 0x10A6F, 0x10A70,
0x10A71, 0x10A72, 0x10A73, 0x10A74, 0x10A75, 0x10A76, 0x10A77, 0x10A78,
0x10A79, 0x10A7A, 0x10A7B, 0x10A7C, 0x10A7D, 0x10A7E, 0x10A7F, 0x10B00,
0x10B01, 0x10B02, 0x10B03, 0x10B04, 0x10B05, 0x10B06, 0x10B07, 0x10B08,
0x10B09, 0x10B0A, 0x10B0B, 0x10B0C, 0x10B0D, 0x10B0E, 0x10B0F, 0x10B10,
0x10B11, 0x10B12, 0x10B13, 0x10B14, 0x10B15, 0x10B16, 0x10B17, 0x10B18,
0x10B19, 0x10B1A, 0x10B1B, 0x10B1C, 0x10B1D, 0x10B1E, 0x10B1F, 0x10B20,
0x10B21, 0x10B22, 0x10B23, 0x10B24, 0x10B25, 0x10B26, 0x10B27, 0x10B28,
0x10B29, 0x10B2A, 0x10B2B, 0x10B2C, 0x10B2D, 0x10B2E, 0x10B2F, 0x10B30,
0x10B31, 0x10B32, 0x10B33, 0x10B34, 0x10B35, 0x10B40, 0x10B41, 0x10B42,
0x10B43, 0x10B44, 0x10B45, 0x10B46, 0x10B47, 0x10B48, 0x10B49, 0x10B4A,
0x10B4B, 0x10B4C, 0x10B4D, 0x10B4E, 0x10B4F, 0x10B50, 0x10B51, 0x10B52,
0x10B53, 0x10B54, 0x10B55, 0x10B58, 0x10B59, 0x10B5A, 0x10B5B, 0x10B5C,
0x10B5D, 0x10B5E, 0x10B5F, 0x10B60, 0x10B61, 0x10B62, 0x10B63, 0x10B64,
0x10B65, 0x10B66, 0x10B67, 0x10B68, 0x10B69, 0x10B6A, 0x10B6B, 0x10B6C,
0x10B6D, 0x10B6E, 0x10B6F, 0x10B70, 0x10B71, 0x10B72, 0x10B78, 0x10B79,
0x10B7A, 0x10B7B, 0x10B7C, 0x10B7D, 0x10B7E, 0x10B7F, 0x10C00, 0x10C01,
0x10C02, 0x10C03, 0x10C04, 0x10C05, 0x10C06, 0x10C07, 0x10C08, 0x10C09,
0x10C0A, 0x10C0B, 0x10C0C, 0x10C0D, 0x10C0E, 0x10C0F, 0x10C10, 0x10C11,
0x10C12, 0x10C13, 0x10C14, 0x10C15, 0x10C16, 0x10C17, 0x10C18, 0x10C19,
0x10C1A, 0x10C1B, 0x10C1C, 0x10C1D, 0x10C1E, 0x10C1F, 0x10C20, 0x10C21,
0x10C22, 0x10C23, 0x10C24, 0x10C25, 0x10C26, 0x10C27, 0x10C28, 0x10C29,
0x10C2A, 0x10C2B, 0x10C2C, 0x10C2D, 0x10C2E, 0x10C2F, 0x10C30, 0x10C31,
0x10C32, 0x10C33, 0x10C34, 0x10C35, 0x10C36, 0x10C37, 0x10C38, 0x10C39,
0x10C3A, 0x10C3B, 0x10C3C, 0x10C3D, 0x10C3E, 0x10C3F, 0x10C40, 0x10C41,
0x10C42, 0x10C43, 0x10C44, 0x10C45, 0x10C46, 0x10C47, 0x10C48, 0x1EE00,
0x1EE01, 0x1EE02, 0x1EE03, 0x1EE05, 0x1EE06, 0x1EE07, 0x1EE08, 0x1EE09,
0x1EE0A, 0x1EE0B, 0x1EE0C, 0x1EE0D, 0x1EE0E, 0x1EE0F, 0x1EE10, 0x1EE11,
0x1EE12, 0x1EE13, 0x1EE14, 0x1EE15, 0x1EE16, 0x1EE17, 0x1EE18, 0x1EE19,
0x1EE1A, 0x1EE1B, 0x1EE1C, 0x1EE1D, 0x1EE1E, 0x1EE1F, 0x1EE21, 0x1EE22,
0x1EE24, 0x1EE27, 0x1EE29, 0x1EE2A, 0x1EE2B, 0x1EE2C, 0x1EE2D, 0x1EE2E,
0x1EE2F, 0x1EE30, 0x1EE31, 0x1EE32, 0x1EE34, 0x1EE35, 0x1EE36, 0x1EE37,
0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE4D, 0x1EE4E,
0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D,
0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE67, 0x1EE68, 0x1EE69, 0x1EE6A,
0x1EE6C, 0x1EE6D, 0x1EE6E, 0x1EE6F, 0x1EE70, 0x1EE71, 0x1EE72, 0x1EE74,
0x1EE75, 0x1EE76, 0x1EE77, 0x1EE79, 0x1EE7A, 0x1EE7B, 0x1EE7C, 0x1EE7E,
0x1EE80, 0x1EE81, 0x1EE82, 0x1EE83, 0x1EE84, 0x1EE85, 0x1EE86, 0x1EE87,
0x1EE88, 0x1EE89, 0x1EE8B, 0x1EE8C, 0x1EE8D, 0x1EE8E, 0x1EE8F, 0x1EE90,
0x1EE91, 0x1EE92, 0x1EE93, 0x1EE94, 0x1EE95, 0x1EE96, 0x1EE97, 0x1EE98,
0x1EE99, 0x1EE9A, 0x1EE9B, 0x1EEA1, 0x1EEA2, 0x1EEA3, 0x1EEA5, 0x1EEA6,
0x1EEA7, 0x1EEA8, 0x1EEA9, 0x1EEAB, 0x1EEAC, 0x1EEAD, 0x1EEAE, 0x1EEAF,
0x1EEB0, 0x1EEB1, 0x1EEB2, 0x1EEB3, 0x1EEB4, 0x1EEB5, 0x1EEB6, 0x1EEB7,
0x1EEB8, 0x1EEB9, 0x1EEBA, 0x1EEBB, 0x10FFFD];
function determineBidi(cueDiv) {
var nodeStack = [],
text = "",
charCode;
if (!cueDiv || !cueDiv.childNodes) {
return "ltr";
}
function pushNodes(nodeStack, node) {
for (var i = node.childNodes.length - 1; i >= 0; i--) {
nodeStack.push(node.childNodes[i]);
}
}
function nextTextNode(nodeStack) {
if (!nodeStack || !nodeStack.length) {
return null;
}
var node = nodeStack.pop(),
text = node.textContent || node.innerText;
if (text) {
// TODO: This should match all unicode type B characters (paragraph
// separator characters). See issue #115.
var m = text.match(/^.*(\n|\r)/);
if (m) {
nodeStack.length = 0;
return m[0];
}
return text;
}
if (node.tagName === "ruby") {
return nextTextNode(nodeStack);
}
if (node.childNodes) {
pushNodes(nodeStack, node);
return nextTextNode(nodeStack);
}
}
pushNodes(nodeStack, cueDiv);
while ((text = nextTextNode(nodeStack))) {
for (var i = 0; i < text.length; i++) {
charCode = text.charCodeAt(i);
for (var j = 0; j < strongRTLChars.length; j++) {
if (strongRTLChars[j] === charCode) {
return "rtl";
}
}
}
}
return "ltr";
}
function computeLinePos(cue) {
if (typeof cue.line === "number" &&
(cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {
return cue.line;
}
if (!cue.track || !cue.track.textTrackList ||
!cue.track.textTrackList.mediaElement) {
return -1;
}
var track = cue.track,
trackList = track.textTrackList,
count = 0;
for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {
if (trackList[i].mode === "showing") {
count++;
}
}
return ++count * -1;
}
function StyleBox() {
}
// Apply styles to a div. If there is no div passed then it defaults to the
// div on 'this'.
StyleBox.prototype.applyStyles = function(styles, div) {
div = div || this.div;
for (var prop in styles) {
if (styles.hasOwnProperty(prop)) {
div.style[prop] = styles[prop];
}
}
};
StyleBox.prototype.formatStyle = function(val, unit) {
return val === 0 ? 0 : val + unit;
};
// Constructs the computed display state of the cue (a div). Places the div
// into the overlay which should be a block level element (usually a div).
function CueStyleBox(window, cue, styleOptions) {
var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
var color = "rgba(255, 255, 255, 1)";
var backgroundColor = "rgba(0, 0, 0, 0.8)";
if (isIE8) {
color = "rgb(255, 255, 255)";
backgroundColor = "rgb(0, 0, 0)";
}
StyleBox.call(this);
this.cue = cue;
// Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will
// have inline positioning and will function as the cue background box.
this.cueDiv = parseContent(window, cue.text);
var styles = {
color: color,
backgroundColor: backgroundColor,
position: "relative",
left: 0,
right: 0,
top: 0,
bottom: 0,
display: "inline"
};
if (!isIE8) {
styles.writingMode = cue.vertical === "" ? "horizontal-tb"
: cue.vertical === "lr" ? "vertical-lr"
: "vertical-rl";
styles.unicodeBidi = "plaintext";
}
this.applyStyles(styles, this.cueDiv);
// Create an absolutely positioned div that will be used to position the cue
// div. Note, all WebVTT cue-setting alignments are equivalent to the CSS
// mirrors of them except "middle" which is "center" in CSS.
this.div = window.document.createElement("div");
styles = {
textAlign: cue.align === "middle" ? "center" : cue.align,
font: styleOptions.font,
whiteSpace: "pre-line",
position: "absolute"
};
if (!isIE8) {
styles.direction = determineBidi(this.cueDiv);
styles.writingMode = cue.vertical === "" ? "horizontal-tb"
: cue.vertical === "lr" ? "vertical-lr"
: "vertical-rl".
stylesunicodeBidi = "plaintext";
}
this.applyStyles(styles);
this.div.appendChild(this.cueDiv);
// Calculate the distance from the reference edge of the viewport to the text
// position of the cue box. The reference edge will be resolved later when
// the box orientation styles are applied.
var textPos = 0;
switch (cue.positionAlign) {
case "start":
textPos = cue.position;
break;
case "middle":
textPos = cue.position - (cue.size / 2);
break;
case "end":
textPos = cue.position - cue.size;
break;
}
// Horizontal box orientation; textPos is the distance from the left edge of the
// area to the left edge of the box and cue.size is the distance extending to
// the right from there.
if (cue.vertical === "") {
this.applyStyles({
left: this.formatStyle(textPos, "%"),
width: this.formatStyle(cue.size, "%")
});
// Vertical box orientation; textPos is the distance from the top edge of the
// area to the top edge of the box and cue.size is the height extending
// downwards from there.
} else {
this.applyStyles({
top: this.formatStyle(textPos, "%"),
height: this.formatStyle(cue.size, "%")
});
}
this.move = function(box) {
this.applyStyles({
top: this.formatStyle(box.top, "px"),
bottom: this.formatStyle(box.bottom, "px"),
left: this.formatStyle(box.left, "px"),
right: this.formatStyle(box.right, "px"),
height: this.formatStyle(box.height, "px"),
width: this.formatStyle(box.width, "px")
});
};
}
CueStyleBox.prototype = _objCreate(StyleBox.prototype);
CueStyleBox.prototype.constructor = CueStyleBox;
// Represents the co-ordinates of an Element in a way that we can easily
// compute things with such as if it overlaps or intersects with another Element.
// Can initialize it with either a StyleBox or another BoxPosition.
function BoxPosition(obj) {
var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
// Either a BoxPosition was passed in and we need to copy it, or a StyleBox
// was passed in and we need to copy the results of 'getBoundingClientRect'
// as the object returned is readonly. All co-ordinate values are in reference
// to the viewport origin (top left).
var lh, height, width, top;
if (obj.div) {
height = obj.div.offsetHeight;
width = obj.div.offsetWidth;
top = obj.div.offsetTop;
var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&
rects.getClientRects && rects.getClientRects();
obj = obj.div.getBoundingClientRect();
// In certain cases the outter div will be slightly larger then the sum of
// the inner div's lines. This could be due to bold text, etc, on some platforms.
// In this case we should get the average line height and use that. This will
// result in the desired behaviour.
lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)
: 0;
}
this.left = obj.left;
this.right = obj.right;
this.top = obj.top || top;
this.height = obj.height || height;
this.bottom = obj.bottom || (top + (obj.height || height));
this.width = obj.width || width;
this.lineHeight = lh !== undefined ? lh : obj.lineHeight;
if (isIE8 && !this.lineHeight) {
this.lineHeight = 13;
}
}
// Move the box along a particular axis. Optionally pass in an amount to move
// the box. If no amount is passed then the default is the line height of the
// box.
BoxPosition.prototype.move = function(axis, toMove) {
toMove = toMove !== undefined ? toMove : this.lineHeight;
switch (axis) {
case "+x":
this.left += toMove;
this.right += toMove;
break;
case "-x":
this.left -= toMove;
this.right -= toMove;
break;
case "+y":
this.top += toMove;
this.bottom += toMove;
break;
case "-y":
this.top -= toMove;
this.bottom -= toMove;
break;
}
};
// Check if this box overlaps another box, b2.
BoxPosition.prototype.overlaps = function(b2) {
return this.left < b2.right &&
this.right > b2.left &&
this.top < b2.bottom &&
this.bottom > b2.top;
};
// Check if this box overlaps any other boxes in boxes.
BoxPosition.prototype.overlapsAny = function(boxes) {
for (var i = 0; i < boxes.length; i++) {
if (this.overlaps(boxes[i])) {
return true;
}
}
return false;
};
// Check if this box is within another box.
BoxPosition.prototype.within = function(container) {
return this.top >= container.top &&
this.bottom <= container.bottom &&
this.left >= container.left &&
this.right <= container.right;
};
// Check if this box is entirely within the container or it is overlapping
// on the edge opposite of the axis direction passed. For example, if "+x" is
// passed and the box is overlapping on the left edge of the container, then
// return true.
BoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {
switch (axis) {
case "+x":
return this.left < container.left;
case "-x":
return this.right > container.right;
case "+y":
return this.top < container.top;
case "-y":
return this.bottom > container.bottom;
}
};
// Find the percentage of the area that this box is overlapping with another
// box.
BoxPosition.prototype.intersectPercentage = function(b2) {
var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),
y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),
intersectArea = x * y;
return intersectArea / (this.height * this.width);
};
// Convert the positions from this box to CSS compatible positions using
// the reference container's positions. This has to be done because this
// box's positions are in reference to the viewport origin, whereas, CSS
// values are in referecne to their respective edges.
BoxPosition.prototype.toCSSCompatValues = function(reference) {
return {
top: this.top - reference.top,
bottom: reference.bottom - this.bottom,
left: this.left - reference.left,
right: reference.right - this.right,
height: this.height,
width: this.width
};
};
// Get an object that represents the box's position without anything extra.
// Can pass a StyleBox, HTMLElement, or another BoxPositon.
BoxPosition.getSimpleBoxPosition = function(obj) {
var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;
var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;
var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;
obj = obj.div ? obj.div.getBoundingClientRect() :
obj.tagName ? obj.getBoundingClientRect() : obj;
var ret = {
left: obj.left,
right: obj.right,
top: obj.top || top,
height: obj.height || height,
bottom: obj.bottom || (top + (obj.height || height)),
width: obj.width || width
};
return ret;
};
// Move a StyleBox to its specified, or next best, position. The containerBox
// is the box that contains the StyleBox, such as a div. boxPositions are
// a list of other boxes that the styleBox can't overlap with.
function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {
// Find the best position for a cue box, b, on the video. The axis parameter
// is a list of axis, the order of which, it will move the box along. For example:
// Passing ["+x", "-x"] will move the box first along the x axis in the positive
// direction. If it doesn't find a good position for it there it will then move
// it along the x axis in the negative direction.
function findBestPosition(b, axis) {
var bestPosition,
specifiedPosition = new BoxPosition(b),
percentage = 1; // Highest possible so the first thing we get is better.
for (var i = 0; i < axis.length; i++) {
while (b.overlapsOppositeAxis(containerBox, axis[i]) ||
(b.within(containerBox) && b.overlapsAny(boxPositions))) {
b.move(axis[i]);
}
// We found a spot where we aren't overlapping anything. This is our
// best position.
if (b.within(containerBox)) {
return b;
}
var p = b.intersectPercentage(containerBox);
// If we're outside the container box less then we were on our last try
// then remember this position as the best position.
if (percentage > p) {
bestPosition = new BoxPosition(b);
percentage = p;
}
// Reset the box position to the specified position.
b = new BoxPosition(specifiedPosition);
}
return bestPosition || specifiedPosition;
}
var boxPosition = new BoxPosition(styleBox),
cue = styleBox.cue,
linePos = computeLinePos(cue),
axis = [];
// If we have a line number to align the cue to.
if (cue.snapToLines) {
var size;
switch (cue.vertical) {
case "":
axis = [ "+y", "-y" ];
size = "height";
break;
case "rl":
axis = [ "+x", "-x" ];
size = "width";
break;
case "lr":
axis = [ "-x", "+x" ];
size = "width";
break;
}
var step = boxPosition.lineHeight,
position = step * Math.round(linePos),
maxPosition = containerBox[size] + step,
initialAxis = axis[0];
// If the specified intial position is greater then the max position then
// clamp the box to the amount of steps it would take for the box to
// reach the max position.
if (Math.abs(position) > maxPosition) {
position = position < 0 ? -1 : 1;
position *= Math.ceil(maxPosition / step) * step;
}
// If computed line position returns negative then line numbers are
// relative to the bottom of the video instead of the top. Therefore, we
// need to increase our initial position by the length or width of the
// video, depending on the writing direction, and reverse our axis directions.
if (linePos < 0) {
position += cue.vertical === "" ? containerBox.height : containerBox.width;
axis = axis.reverse();
}
// Move the box to the specified position. This may not be its best
// position.
boxPosition.move(initialAxis, position);
} else {
// If we have a percentage line value for the cue.
var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;
switch (cue.lineAlign) {
case "middle":
linePos -= (calculatedPercentage / 2);
break;
case "end":
linePos -= calculatedPercentage;
break;
}
// Apply initial line position to the cue box.
switch (cue.vertical) {
case "":
styleBox.applyStyles({
top: styleBox.formatStyle(linePos, "%")
});
break;
case "rl":
styleBox.applyStyles({
left: styleBox.formatStyle(linePos, "%")
});
break;
case "lr":
styleBox.applyStyles({
right: styleBox.formatStyle(linePos, "%")
});
break;
}
axis = [ "+y", "-x", "+x", "-y" ];
// Get the box position again after we've applied the specified positioning
// to it.
boxPosition = new BoxPosition(styleBox);
}
var bestPosition = findBestPosition(boxPosition, axis);
styleBox.move(bestPosition.toCSSCompatValues(containerBox));
}
function WebVTT() {
// Nothing
}
// Helper to allow strings to be decoded instead of the default binary utf8 data.
WebVTT.StringDecoder = function() {
return {
decode: function(data) {
if (!data) {
return "";
}
if (typeof data !== "string") {
throw new Error("Error - expected string data.");
}
return decodeURIComponent(encodeURIComponent(data));
}
};
};
WebVTT.convertCueToDOMTree = function(window, cuetext) {
if (!window || !cuetext) {
return null;
}
return parseContent(window, cuetext);
};
var FONT_SIZE_PERCENT = 0.05;
var FONT_STYLE = "sans-serif";
var CUE_BACKGROUND_PADDING = "1.5%";
// Runs the processing model over the cues and regions passed to it.
// @param overlay A block level element (usually a div) that the computed cues
// and regions will be placed into.
WebVTT.processCues = function(window, cues, overlay) {
if (!window || !cues || !overlay) {
return null;
}
// Remove all previous children.
while (overlay.firstChild) {
overlay.removeChild(overlay.firstChild);
}
var paddedOverlay = window.document.createElement("div");
paddedOverlay.style.position = "absolute";
paddedOverlay.style.left = "0";
paddedOverlay.style.right = "0";
paddedOverlay.style.top = "0";
paddedOverlay.style.bottom = "0";
paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;
overlay.appendChild(paddedOverlay);
// Determine if we need to compute the display states of the cues. This could
// be the case if a cue's state has been changed since the last computation or
// if it has not been computed yet.
function shouldCompute(cues) {
for (var i = 0; i < cues.length; i++) {
if (cues[i].hasBeenReset || !cues[i].displayState) {
return true;
}
}
return false;
}
// We don't need to recompute the cues' display states. Just reuse them.
if (!shouldCompute(cues)) {
for (var i = 0; i < cues.length; i++) {
paddedOverlay.appendChild(cues[i].displayState);
}
return;
}
var boxPositions = [],
containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),
fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;
var styleOptions = {
font: fontSize + "px " + FONT_STYLE
};
(function() {
var styleBox, cue;
for (var i = 0; i < cues.length; i++) {
cue = cues[i];
// Compute the intial position and styles of the cue div.
styleBox = new CueStyleBox(window, cue, styleOptions);
paddedOverlay.appendChild(styleBox.div);
// Move the cue div to it's correct line position.
moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);
// Remember the computed div so that we don't have to recompute it later
// if we don't have too.
cue.displayState = styleBox.div;
boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));
}
})();
};
WebVTT.Parser = function(window, vttjs, decoder) {
if (!decoder) {
decoder = vttjs;
vttjs = {};
}
if (!vttjs) {
vttjs = {};
}
this.window = window;
this.vttjs = vttjs;
this.state = "INITIAL";
this.buffer = "";
this.decoder = decoder || new TextDecoder("utf8");
this.regionList = [];
};
WebVTT.Parser.prototype = {
// If the error is a ParsingError then report it to the consumer if
// possible. If it's not a ParsingError then throw it like normal.
reportOrThrowError: function(e) {
if (e instanceof ParsingError) {
this.onparsingerror && this.onparsingerror(e);
} else {
throw e;
}
},
parse: function (data) {
var self = this;
// If there is no data then we won't decode it, but will just try to parse
// whatever is in buffer already. This may occur in circumstances, for
// example when flush() is called.
if (data) {
// Try to decode the data that we received.
self.buffer += self.decoder.decode(data, {stream: true});
}
function collectNextLine() {
var buffer = self.buffer;
var pos = 0;
while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') {
++pos;
}
var line = buffer.substr(0, pos);
// Advance the buffer early in case we fail below.
if (buffer[pos] === '\r') {
++pos;
}
if (buffer[pos] === '\n') {
++pos;
}
self.buffer = buffer.substr(pos);
return line;
}
// 3.4 WebVTT region and WebVTT region settings syntax
function parseRegion(input) {
var settings = new Settings();
parseOptions(input, function (k, v) {
switch (k) {
case "id":
settings.set(k, v);
break;
case "width":
settings.percent(k, v);
break;
case "lines":
settings.integer(k, v);
break;
case "regionanchor":
case "viewportanchor":
var xy = v.split(',');
if (xy.length !== 2) {
break;
}
// We have to make sure both x and y parse, so use a temporary
// settings object here.
var anchor = new Settings();
anchor.percent("x", xy[0]);
anchor.percent("y", xy[1]);
if (!anchor.has("x") || !anchor.has("y")) {
break;
}
settings.set(k + "X", anchor.get("x"));
settings.set(k + "Y", anchor.get("y"));
break;
case "scroll":
settings.alt(k, v, ["up"]);
break;
}
}, /=/, /\s/);
// Create the region, using default values for any values that were not
// specified.
if (settings.has("id")) {
var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();
region.width = settings.get("width", 100);
region.lines = settings.get("lines", 3);
region.regionAnchorX = settings.get("regionanchorX", 0);
region.regionAnchorY = settings.get("regionanchorY", 100);
region.viewportAnchorX = settings.get("viewportanchorX", 0);
region.viewportAnchorY = settings.get("viewportanchorY", 100);
region.scroll = settings.get("scroll", "");
// Register the region.
self.onregion && self.onregion(region);
// Remember the VTTRegion for later in case we parse any VTTCues that
// reference it.
self.regionList.push({
id: settings.get("id"),
region: region
});
}
}
// 3.2 WebVTT metadata header syntax
function parseHeader(input) {
parseOptions(input, function (k, v) {
switch (k) {
case "Region":
// 3.3 WebVTT region metadata header syntax
parseRegion(v);
break;
}
}, /:/);
}
// 5.1 WebVTT file parsing.
try {
var line;
if (self.state === "INITIAL") {
// We can't start parsing until we have the first line.
if (!/\r\n|\n/.test(self.buffer)) {
return this;
}
line = collectNextLine();
var m = line.match(/^WEBVTT([ \t].*)?$/);
if (!m || !m[0]) {
throw new ParsingError(ParsingError.Errors.BadSignature);
}
self.state = "HEADER";
}
var alreadyCollectedLine = false;
while (self.buffer) {
// We can't parse a line until we have the full line.
if (!/\r\n|\n/.test(self.buffer)) {
return this;
}
if (!alreadyCollectedLine) {
line = collectNextLine();
} else {
alreadyCollectedLine = false;
}
switch (self.state) {
case "HEADER":
// 13-18 - Allow a header (metadata) under the WEBVTT line.
if (/:/.test(line)) {
parseHeader(line);
} else if (!line) {
// An empty line terminates the header and starts the body (cues).
self.state = "ID";
}
continue;
case "NOTE":
// Ignore NOTE blocks.
if (!line) {
self.state = "ID";
}
continue;
case "ID":
// Check for the start of NOTE blocks.
if (/^NOTE($|[ \t])/.test(line)) {
self.state = "NOTE";
break;
}
// 19-29 - Allow any number of line terminators, then initialize new cue values.
if (!line) {
continue;
}
self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, "");
self.state = "CUE";
// 30-39 - Check if self line contains an optional identifier or timing data.
if (line.indexOf("-->") === -1) {
self.cue.id = line;
continue;
}
// Process line as start of a cue.
/*falls through*/
case "CUE":
// 40 - Collect cue timings and settings.
try {
parseCue(line, self.cue, self.regionList);
} catch (e) {
self.reportOrThrowError(e);
// In case of an error ignore rest of the cue.
self.cue = null;
self.state = "BADCUE";
continue;
}
self.state = "CUETEXT";
continue;
case "CUETEXT":
var hasSubstring = line.indexOf("-->") !== -1;
// 34 - If we have an empty line then report the cue.
// 35 - If we have the special substring '-->' then report the cue,
// but do not collect the line as we need to process the current
// one as a new cue.
if (!line || hasSubstring && (alreadyCollectedLine = true)) {
// We are done parsing self cue.
self.oncue && self.oncue(self.cue);
self.cue = null;
self.state = "ID";
continue;
}
if (self.cue.text) {
self.cue.text += "\n";
}
self.cue.text += line;
continue;
case "BADCUE": // BADCUE
// 54-62 - Collect and discard the remaining cue.
if (!line) {
self.state = "ID";
}
continue;
}
}
} catch (e) {
self.reportOrThrowError(e);
// If we are currently parsing a cue, report what we have.
if (self.state === "CUETEXT" && self.cue && self.oncue) {
self.oncue(self.cue);
}
self.cue = null;
// Enter BADWEBVTT state if header was not parsed correctly otherwise
// another exception occurred so enter BADCUE state.
self.state = self.state === "INITIAL" ? "BADWEBVTT" : "BADCUE";
}
return this;
},
flush: function () {
var self = this;
try {
// Finish decoding the stream.
self.buffer += self.decoder.decode();
// Synthesize the end of the current cue or region.
if (self.cue || self.state === "HEADER") {
self.buffer += "\n\n";
self.parse();
}
// If we've flushed, parsed, and we're still on the INITIAL state then
// that means we don't have enough of the stream to parse the first
// line.
if (self.state === "INITIAL") {
throw new ParsingError(ParsingError.Errors.BadSignature);
}
} catch(e) {
self.reportOrThrowError(e);
}
self.onflush && self.onflush();
return this;
}
};
global.WebVTT = WebVTT;
}(this, (this.vttjs || {})));
!function(){!function(a){var b=a&&a.videojs;if(b){b.CDN_VERSION="5.4.4";var c="https:"===a.location.protocol?"https://":"http://";b.options.flash.swf=c+"vjs.zencdn.net/swf/5.0.1/video-js.swf"}}(window),function(a,b,c,d,e,f,g){b&&b.HELP_IMPROVE_VIDEOJS!==!1&&(e.random()>.01||(f=b.location,g=b.videojs||{},a.src="//www.google-analytics.com/__utm.gif?utmwv=5.4.2&utmac=UA-16505296-3&utmn=1&utmhn="+d(f.hostname)+"&utmsr="+b.screen.availWidth+"x"+b.screen.availHeight+"&utmul="+(c.language||c.userLanguage||"").toLowerCase()+"&utmr="+d(f.href)+"&utmp="+d(f.hostname+f.pathname)+"&utmcc=__utma%3D1."+e.floor(1e10*e.random())+".1.1.1.1%3B&utme=8(vjsv*cdnv)9("+g.VERSION+"*"+g.CDN_VERSION+")"))}(new Image,window,navigator,encodeURIComponent,Math)}();</script>
</body>
</html>