From 7ca7fa14f51ef7a3550a764fe3a577f92fdd2308 Mon Sep 17 00:00:00 2001 From: "real3t@gmail.com" <> Date: Sun, 2 Apr 2017 17:05:29 +0000 Subject: [PATCH] =?UTF-8?q?refs=20#3692=20:=20Int=C3=A9gration=20de=20la?= =?UTF-8?q?=20library=20MediaElement=20en=204.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Testé sous Windows 10 avec Edge, FireFox et Chrome en utilisant les .mp4, .ogg et .mp3 utilisés par http://www.mediaelementjs.com/ Pas testé les skins. --- .gitattributes | 16 - ...T CHANGE THESE FILES. USE -src- FOLDER.txt | 0 lib/mejs/background.png | Bin 166 -> 0 bytes lib/mejs/bigplay.fw.png | Bin 79426 -> 0 bytes lib/mejs/bigplay.png | Bin 3001 -> 0 bytes lib/mejs/bigplay.svg | 14 - lib/mejs/controls-ted.png | Bin 1559 -> 0 bytes lib/mejs/controls-wmp-bg.png | Bin 1960 -> 0 bytes lib/mejs/controls-wmp.png | Bin 5511 -> 0 bytes lib/mejs/controls.fw.png | Bin 80753 -> 0 bytes lib/mejs/controls.png | Bin 1892 -> 0 bytes lib/mejs/controls.svg | 1 - lib/mejs/flashmediaelement-cdn.swf | Bin 57058 -> 0 bytes lib/mejs/flashmediaelement.swf | Bin 57052 -> 0 bytes lib/mejs/loading.gif | Bin 6224 -> 0 bytes lib/mejs/mediaelement-and-player.js | 13124 ++++++++++------ lib/mejs/mediaelement-and-player.min.js | 209 +- lib/mejs/mediaelement.js | 5978 ++++--- lib/mejs/mediaelement.min.js | 104 +- lib/mejs/mediaelementplayer.css | 1395 +- lib/mejs/mediaelementplayer.js | 9806 ++++++++---- lib/mejs/mediaelementplayer.min.css | 2 +- lib/mejs/mediaelementplayer.min.js | 134 +- lib/mejs/mejs-skins.css | 289 - lib/mejs/silverlightmediaelement.xap | Bin 12461 -> 0 bytes modeles/video.html | 8 +- paquet.xml | 2 +- 27 files changed, 20342 insertions(+), 10740 deletions(-) delete mode 100644 lib/mejs/DO NOT CHANGE THESE FILES. USE -src- FOLDER.txt delete mode 100644 lib/mejs/background.png delete mode 100644 lib/mejs/bigplay.fw.png delete mode 100644 lib/mejs/bigplay.png delete mode 100644 lib/mejs/bigplay.svg delete mode 100644 lib/mejs/controls-ted.png delete mode 100644 lib/mejs/controls-wmp-bg.png delete mode 100644 lib/mejs/controls-wmp.png delete mode 100644 lib/mejs/controls.fw.png delete mode 100644 lib/mejs/controls.png delete mode 100644 lib/mejs/controls.svg delete mode 100644 lib/mejs/flashmediaelement-cdn.swf delete mode 100644 lib/mejs/flashmediaelement.swf delete mode 100644 lib/mejs/loading.gif delete mode 100644 lib/mejs/mejs-skins.css delete mode 100644 lib/mejs/silverlightmediaelement.xap diff --git a/.gitattributes b/.gitattributes index dc8a3146..44b23e97 100644 --- a/.gitattributes +++ b/.gitattributes @@ -200,20 +200,6 @@ lib/getid3/write.metaflac.php -text lib/getid3/write.php -text lib/getid3/write.real.php -text lib/getid3/write.vorbiscomment.php -text -lib/mejs/DO[!!-~]NOT[!!-~]CHANGE[!!-~]THESE[!!-~]FILES.[!!-~]USE[!!-~]-src-[!!-~]FOLDER.txt -text -lib/mejs/background.png -text -lib/mejs/bigplay.fw.png -text -lib/mejs/bigplay.png -text -lib/mejs/bigplay.svg -text -lib/mejs/controls-ted.png -text -lib/mejs/controls-wmp-bg.png -text -lib/mejs/controls-wmp.png -text -lib/mejs/controls.fw.png -text -lib/mejs/controls.png -text -lib/mejs/controls.svg -text -lib/mejs/flashmediaelement-cdn.swf -text -lib/mejs/flashmediaelement.swf -text -lib/mejs/loading.gif -text lib/mejs/mediaelement-and-player.js -text lib/mejs/mediaelement-and-player.min.js -text lib/mejs/mediaelement.js -text @@ -222,8 +208,6 @@ lib/mejs/mediaelementplayer.css -text lib/mejs/mediaelementplayer.js -text lib/mejs/mediaelementplayer.min.css -text lib/mejs/mediaelementplayer.min.js -text -lib/mejs/mejs-skins.css -text -lib/mejs/silverlightmediaelement.xap -text /medias_administrations.php -text /medias_autoriser.php -text /medias_fonctions.php -text diff --git a/lib/mejs/DO NOT CHANGE THESE FILES. USE -src- FOLDER.txt b/lib/mejs/DO NOT CHANGE THESE FILES. USE -src- FOLDER.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/mejs/background.png b/lib/mejs/background.png deleted file mode 100644 index fd428412ae26af13dab448ec833b1cb603e37ee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G9-c0aAr-gYoHrC?P~c(M$o@YsOF*1w?-55oQ{94SCl?~X dlYaFB3@*Kl;yd0~_5jUf@O1TaS?83{1OV-(FBAX( diff --git a/lib/mejs/bigplay.fw.png b/lib/mejs/bigplay.fw.png deleted file mode 100644 index 66d0e3cb73ceec0b1ffc7cdd4c1bc5edaf960556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79426 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 diff --git a/lib/mejs/bigplay.png b/lib/mejs/bigplay.png deleted file mode 100644 index 694553e31c387188b6bde397a5200c212aff2dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3001 zcmY*bc{G%78y@@E$G#25HuhyKF`}BmWY5?NW#6Vk%!n-cHO9Ub5>Xh0LXv%?$k?+c zNmQ00Tal8G?=9y$-|xH5dG6<4u5&-vKks$kBpd6~oNS_OAP|Vt%+%NxxV?eX3uXYK z;#~bV;9|g|&FsNo@bsrMAAxer#?s#8@bGYOa1f~e9pAip1C*koq7Vp#g@px}&d$yP zO=o9kEEa2SZjM5skVvGKmX@NTqLh>rz@*V=04FLc3XjKMx^&6c*Y}A0<;xdfl$V#6 zot>SUno1&(0M1dfp`oF=y1KNq6qxSp>;O&RQ7V<%-rf$3fX<N&pabMb0syr@e)QH+ zezfW+KZ@BW>umtV7=o>}9f*fVT3SoX_%9s(2SDCmgdHLAF8~<;9s;0HD1el~82}p_ zhlk=O%KE@Y)+?q?co2x4_s^jlo4LLZG@%5Oa|F8}UqYBihz|(m9pvc)!{9=E!h%9B z;bBI0+RSz1MF3Cm56>vX$Af?i3WV9?0(?LSggOGLj?hrWQxL%RIWuFFeR#q8-AEVF z7SR_0COM0mr%?~9?p$cBE?DVL1}EAG`gMOfylt%(l&Py_1{Yy2d^+s)`yvkhylrQ} ziks_1ch8md;g%;c=m}`MtE#Tj0t_wA*;UDS>w=s7dg>@-eXxR=0W5=B%I=0Sy3|JM zx&-m*kI7Ee__^(6+KHCPT+a{4($>mc-#72c7L2V5F_`kD)0kUd$n`P@$MQ^CsJs+& zm=w$LyOxHy!I8df*5y)nf5uhAXj?rgT2?<VlnMS1Q8=U4zU}^b?a<+i7Y3VPwp+rM zbj-UOA<91@$Su_i=U=(=J$|n}%irfu6rP@zNM=L+44Ppr%-;8Bw&C~cd)__)(oszr zjX}mfQ#nw~3~r<q{%GJJCUg;E>MDn4`8$@iFk5HU%#x&#-so>Ed^A5dn|)!cq2@uj zLiB5IjSGnWUxNwgllH0WN!pkbQ|27y1sbRKr#$(aI#1oCY2gP>gjC#BEJ8f!Q8-hL z#**sbmg(&q_1*QGPE3J?*g$rH?h`OXE-YRtnFg&;kl%hv^463$2BVv@3lghX%$puK z7uQ|gBig#M8`C|~@|oFefsXx-yt>l$!aDGF=Vb_lWcKVb?k18uDj!E;bJkYMYPaBr zkRlw%GCKyUw97HSe1$MJ>7SVkq2w3Ff{tOC#W2~R^DYSDR&PL%025;|E;y1|O`3@3 zQjDp|!|dgLiASbg;D0+1O1x*tU{;3XVErcr9Z*OJAj7D#<(-pwNM@nhpzzOj3*BA+ z6oGT;LwOa9*$I$w;TfkjKg>kHs8C|05!2_&v|L!1Hav_OYwf8y-(RJki{5#HL0lq1 zQakPiw})%2vO7*o2Z+Cw@|M3AhQYg~{X&oa{&D<WyZ{=i<0blude(kS9Uk35qGX#y z&ah;{`3~AtlX<@13xY>4T9Ww#;ubVHg%@w{54@)<b_k<!_uYK}$9F$vl3u$mL@yQT z_@J_~^<pYNf3i?G9~Dx7(_2v9-IUZ_sFnmv>F>oqRA{~<mg&DZ&W^VHDp^$PeAp;y zdUt;&=jQdf_>o<Tk%26ZX<D|VriP`o>Cvah<LKV$S2b$;)gW~2=G95}(gao)jdly? z;+y65L`JiTPv$qZCxY@Rr4b>igz^a2`g;5|_faxl-EI}z(7I)DDYIpNPJ|*Z>+G0i zS`t;RTqG@dRo1iEbk4Ay08Lt1ccY##hi+VqOE@0IU_P{f=@++)(Mzw?3Et!rXzsd^ zAF%cM`bWpJ2{9_=5jzt%tPRQ{3#RJjOp2*|AH+M=P}~INo*@ee9;L+A;*tG)2+4Sh zJhIZqd*1M;=PzZe+ESPk)2O<|V$ItO^NE_swu^%2NxJOk<QbOOwMY~&1!QDFR-;J7 z1!PD>(Y%+17C$m`1z`@H-ly<p%VV(XHLXts%0k=pyl9gSkNO&oTh|rMv36-q8#%5A zC=bC|nx*&45AP(Z@ZFqV1_R3>=u!p0Dx<pwjUyDaDuYd$^=w1j)r(RL4f=)G#?}R! zE<Y}!OmExfSYMkn3nuHooa%Tt=0-#0{~X!!D{?##C-h22#H&S!zgy<k_^d{{p*VTT zbaNnoFpEL*mDuK2x~1f=ehIA+e6S4zN-t!neYlGOyH##_e3oOKu1r}%z1Mbiaei`O z<IbDU6K+{@*Gq9Z?#shgJ#0p27rx+^6Rr*0szxgm`Ur0ay5Y~@(aqC=)Ax%G;yeNg zhHguGeGwsPXdS3j+^yWJt9$#qx1amMrze+ocb+z;D|Cz?LbF&_an=0v9)r;H^!+ki z_I)<rv0@G|!q9Jt13BO4htYJwTP6C$G&`M7UQwwTn~2|K^LBx2g*G|~kHd1s1VSL6 z!2h<)wEweA4N<GJ`MK%Z>AH_TYh)IT35y4xnCY5g2y4sZB3R-Oy-N2syQA>1g5ZR| zju{&VXK=XlV}}azq8EYkC>poj1wKtFGTu}2`<^y$E{M%D)uZyKPt^TTRZsaFA}n_Q zpmZ8|BG>%`l@ASaJK@LvI3*Q?I938SiG%Jpf#K8=NV2EO>q)jN6+Vbmr=NDRGR~W4 zWK?56N+Iq!z)bwEAnIl1;ul6lWZ;8Jy!<CI^Kl5~+*|5S2}-&23fo3MM%h|Yk$^3F zGtm;2YY<JHB-kJ=AB=om445L^GaL6rfruDFT*l33v7NUT5wLyBQsmxYV=`L6AW+5^ zD{>Da1)i~e&*Q|M9ca~n_K_W~eI<}c@A&+*C*E}4b@7x8^Hoh-w|6iYILnz)@YDn8 zfLtpX@j`tcXp1o&s=|+|6rOkcfjzeoMT6LROfNK%o-c2rECUAS338{pKbLK6N+vRT z+-H&+x?Vu*x5M~(>JH-8$mbYGVVWgNaXjSI0!LJGQXGs0X?nN4ARqBH+E^FaNM%!z zr=6njH-hagX@s8?OKCs#z8Ib;g0}Pu@q@%6bE(^=F6s)tX%Hf!S!+mW$2Yp;qF8A) z!*SA@?3baqU!9}rb_M@6I)+Cv9VDKNA2O1O1_6~1uPH?P`Hu-{_OYd`5CM<V?0-$? zRF)SWYSf#qJzi1QT6?Msj*)`A(oRr{5mC)RZ$g8}!bC031P((O7Dj6R264b%QP(xb ztDOWRP%H{n6>F@S-8-DDNuIi-p%3D7a%L4)<`t`k9FP4-b!uzGHACSKa@B1vL}*#w z%ga|D2Jx2x{xv6_oI_CiR=jN3uYMoff$H?<#qrbTP2D_BOIKFodu}aPY_gviV3ye6 zV&@L~$xIq_+{o1rf!Zz7*)T>YG3>nEaA8?dp}Z*OC4@p6x<c8}eowdVz#gopf8#B! z!PmuLH$$zpX3)b`_l3sYTnhv{>_$zHUy}{3$H~f#vnqPrL4vi9K0d5<`f6qspVM_~ zErP$%klg%YrB$I!RIg3s`{`hHwk78G8=6hz`t-9sO#(jt;X0RF`?V*+R|7vyNM_#} zaJflc?~oZ1Uf~#q%i46;xvgF%q%)N?BP*~)s%=~TQ(Seb)6&f3uOxvC0r>Io3^C`= zJ9Hec=Oj=G`>xM+y;;+SqHEGNIz}WIU13!9c+Pp@<OFWLg}9T)p*pX}F|B#Ng~!On z5$|rYzRNGh>d$Qw+ly7YU!wSR$Q>~~DMH((<A7fj=0o5<kF9>iW<7KMWpkoWBN4M( zj)YZVYD7P(b8yFfwn*oD+)Xj0Gxy-S-NaR%!Wr`_RX5*6E+bE$*1Oi3uFsc>z+Yii z$k4NqGnzOZV1Hu-xfi*8C->m@4pUcO#tQhD^#tjU&A9a(f|6s!%zo#WnFIfWATtwd J;~KO(@jp;uhBg2I diff --git a/lib/mejs/bigplay.svg b/lib/mejs/bigplay.svg deleted file mode 100644 index 2b781700..00000000 --- a/lib/mejs/bigplay.svg +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<svg id="bigplay" viewBox="0 0 100 200" style="background-color:#ffffff00" version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" - x="0px" y="0px" width="100px" height="200px" -> - <g id="dark"> - <path id="Polygon" d="M 72.5 49.5 L 38.75 68.9856 L 38.75 30.0144 L 72.5 49.5 Z" fill="#ffffff" opacity="0.75" /> - <path id="Ellipse" d="M 13 50.5 C 13 29.7891 29.7891 13 50.5 13 C 71.2109 13 88 29.7891 88 50.5 C 88 71.2109 71.2109 88 50.5 88 C 29.7891 88 13 71.2109 13 50.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="0.75"/> - </g> - <g id="light"> - <path id="Polygon2" d="M 72.5 149.5 L 38.75 168.9856 L 38.75 130.0144 L 72.5 149.5 Z" fill="#ffffff" opacity="1.0" /> - <path id="Ellipse2" d="M 13 150.5 C 13 129.7891 29.7891 113 50.5 113 C 71.2109 113 88 129.7891 88 150.5 C 88 171.211 71.2109 188 50.5 188 C 29.7891 188 13 171.211 13 150.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="1.0"/> - </g> -</svg> \ No newline at end of file diff --git a/lib/mejs/controls-ted.png b/lib/mejs/controls-ted.png deleted file mode 100644 index 3aac05aa83cb7fed54831a19d85a8c267e939720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1559 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 JPDHLkV1l~`FgySN diff --git a/lib/mejs/controls-wmp-bg.png b/lib/mejs/controls-wmp-bg.png deleted file mode 100644 index 89bb9b95602ecfca6290f6006f817da365da7b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1960 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 A)c^nh diff --git a/lib/mejs/controls-wmp.png b/lib/mejs/controls-wmp.png deleted file mode 100644 index 4775ef5b02faf2b826d35dfc72511b6b27fea87b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5511 zcmV;26?p22P)<h;3K|Lk000e1NJLTq003kF003kN1^@s6aN?Cz000$ENkl<Zc-rk; ze?(;6A5KFn6Jsi}5h>9hLyBQ4hN&GAyCPy3!zfCIF;tR_%QPgZWEhGVlEmz8l0-uy zA|i<-A{&Xwilx`S&-eM9+Szt@>YeGk?YsMSKRnL8=iGBneV+R{zh<7vdaTtrS~QEp zgQ{0P)HL^@zEy+W6^5g2SY2CR_rv1!!{YF2HI7y->j}(itIesgT4AfJ$7AZ_|FEpz z#VYL{&DuPmdHpd&r#G>>vXAZU6CCWH;b{LHhs43&8FscmU~TmPGqG*>`sY#iMni?Y zUHf@t*j~)e&SHOmA41Ca<#qM;Y#~b0{~{qI!mBm9#uN$LboTMd750xlVsqyds~g8y zTsuO1<xt`M>Je7fkFde#_6{#`e0+ty-801Iw$aiaB{7}a{~H;hPzawte^&7O19W`7 z;Y(Sg&6ekLIuUyP8j{Mr<bU7J-+%v&N8;Zjq}txfh|sjjsZH$i?cY1P#0m+B#rF`M z+d*V@J2hfAh|ca{W?>JDi6iWgoCDU6&F{e8I;vUfT^SQ2Z@jaq2_HXxOcD~0$H9mZ zybuzu{C*%1NJ8$JugdSX^;pNU-sgXXjEZ`X=IWY3V)IxzGtMXw5+>>B3Bl|Q#$tD| zrPA@+XC~Ei>Ru5ww|s!D{R<UYzQMRwQJ-G4h%>9JYw`%JuC3v(zy3;MXJ-eNsw!yB z%}El@2L|wAd>p62U@}k2??wvAyq6G`{YBtA{Pm^m*OO7#q4kHBvCXJh-ui&(!fw*( zqjdVPU}g*9nN184A;I)5Ztqzp&!}fdlORbXHNJkVh#8G;pwb@r$2XNki1Sn8!-o&3 zvsB@#yBqNN6s`sbljR4onB+;h8otsY<hK0!J3_9%<o{waIyG%{9a{$%m|Z<oP8=b` zv0*w`qocKHg2PyFY6F9G>VU%fEtn@@8O!BaVhf>La@dx_)Z#ui_Ab=WR_O@fp9s0W zzD@}tB+}9Xa40+XcyQ%%sp~7ZJ4woEd%MaD*43f5?q<GW{)2tCwY9Z=N4_FL(qB4E z^@mrm$+vfU=>TCmix6ij#|8;;v?74$k0j6+Stk<c6{vfaCt&#<f~FNY(pIwFNzO%U zJLim)O-}aRc!-em^YfJ0-QC4oyB)~S$013Oyeo@E-G5{%_Xi|O?jvPo$v!0i-bD=U z<mBZ0zRsjf(qA@#yL_|S`tCWVmk;SU5<#bFGh0a_`sr9YI_dnL$u$H76N1$nj7xfx z-xFC&KHGmAJ#0(08B*ZfLQ+<D&JfU+P+9Lrri94Sce17itcVY{1SnF9i&fsok`kO% zRH*A<X=$?kv$M05eVNT>)7I7&SgxYaN8|OWK+0A6E6n<ONLyS#)?$fcXhH@Nq|*lJ zzyXrcOK0{d5)#VUK04kvwn8u+m1}j+Yn7+qA14$!tVbdVMd|?C{7MX0V~ob7%@1(8 zqp;eWwN!-A5h)>r)RkA@Dmz;_eY>|eS$0c`K$SOIEJa`1q_ck@#9%OF&&|yV5vpB> z!(qSk{7Eu>YO`>|7m93X@3+qt87eAfgow>sBGwTg{I^7Sg0pZ1CeY>|hr53Uox{t- zQW9Mw%L?5@k{pSi$SpB4+_7zvEu^bH=QlVP%<XcL_aVh93nWD#%iM1WSzlkjS!I=! zCY^uGNIB-J>a@H(naA>PR#_a9e&}a#aBx8KS65e2T3T9?%2zBuesV(Uxi5H2hm0=l z(MekZahN#nmWTv=eABz>*ltEZt8W|^msj}o=^E1u3AA*N!bM`*!;1<Xg5gDU3P=jU zdaFXFkgAALq(nE9{e`(_dAE6r){YrQ$!o`b`;f+0PHr}jlZ4E~Vqf<mB_+v7xf>bG z|6v~@ZAkiE-cf{RG#Yc0nJJ!m;^=T`er*+VbjE-XLG(qxlHns6-Q#QMA`#-)4x+hp z_?w;UhqDW4lM86^O`@$o22UssZ|E(&L+@`0QjtSq*aq8DZTcnZ*heq>>Q^to7G@GB z7@FMVT+)GucIpG%XPlm%Ds=mNsJ**W=dk22D@T|lNGkWKcIt<Rhj@&?SnuG8k41X5 z@z@?l-t8;r^f5BTQNG9qx+fCo99t7d(y7bhTsnCXO&#HsM+#fJN9Y)g;*CE7*Wf%n zS{xn{;~A33SrTHTEooEQW*-TXenUzR`wcTfqwzyjJBLu`a5^5^C`O}EBoc|#XIUi3 z#^tS~_qB0wZ~$We5x~<<=1pT-<lPYlV%sEwWJGSsm=rQr(Lo1#NrsmW<r_~2zat^T zvQbJ2S+g&!Y%*F#(GrNlErcji-oYb;h9$~K3Wu;RA!U+7qC}%aikje$(cCtJYI}>8 z&S`J0oc8`#tcpkDuUcminm^zhy2W8+lSFKwlaA^bTO(EpMT!hnBxZ?DeGexigwB5u zmmjY%9$Q9J*C<*!zj$SSVH>I~l99w%f_=)+D5OY~9H7lRFH2w&^2|(*)0<mo(KEdR zADz)PzK$+BraK~O0-h00;Dd2A1?FJy<YeoKqS_Tfslz8uPYZho$8ZHAu(W8X^+w<f z%%X*DdWK1i%uVd8bAlL`$mEb2+d*5$JCxbF@$3kZW0J-<vm83M5a7hxO^0|!6KLvt zi)zmd%3e>PxM3JY_7Do|gUGKVY6oGmc;wh3Bg9v>U~vXeU=849!w}mZSA95p<0O8K zeQ&_edBhjpLW?_&Qa+d72UI`K6SmsA9IMp^S(W`+gw*>qn_~v`-Z)(0H8^~6lr%?> zXA8q<)sRP+Z5r}zK@`>oQB*fbVg`|4<>8X|Q^vTw{0MDg0cJ}(Owzu<Hl+Hr`xeyS z;PfxS))+&1Z9g8G)MW!F6D&zFe#w{BmfTNHM%4bKwY3#O+@C{;y+^a!r;%GRf?Uh6 z!i%a99TkG9b_fOaAx4Lm#7l)B3aY*GnZ%<}+cKyk&0Kram$8PZ8iKK!e@EpAs%%rJ zWIy+QKs7XkFXj*2d_W~+^l+E%<w2rEM{8RfuCA^i&kBKm2q6Kj#y*7?rD5chX(VKb z4hq9m7e;<P39;WH#PJpRHC|j?Tx5*XvvUN;=22MP!M52B31?ptk&2L<at(%(5UT5h zkU`w{0TmscTx!SPz7>a~-fov@!TZHUtR)iaekiP#=PDH<{{TXKn*8%dMo3PDMyK33 z$7ClQ!^n4pQ9u+nkeFAuaE6d??T}q^Mwoq<fTgL2^H6|oYN~BBA${f5l8|b?6qO;o zC=06ysi^Nmst>5>>?9e4oc1arTyD3D3Py_RZ*Ol;Mat&pmYTy_T3SfbZ$76~I@+}= zTLh+xv6~2?Q;c=P$a9Rq)Hnk3s}bZoM^NY-Mq$$pikj$1Tc_-j(?Vi%2hMhqYY(8X zQA0r!ui2j2dDBN;!zl9X!yLB4@=~amqskfuqZfA$7w=ugNwl=NT<GoVSM!v|<3%tS zRArH96dcCX^}@o!?>}@|94^gb9YcX7LTB*pw9+y5Q5c;Q$ZH;liO5$NLt*nM3SW;A zqcGR|z(ckNvA2JSj^Gpugoq|h>M0bk9cj<ZcJrFpk8>PG#~5;LBPv47mE*9~OrX-y zp`}9zp+3fKYHpTmbxO-&O|Iq4D|sz1M|Dk2-tRwbSv8bdV=z<>Bd2y0xs8)B%1Wyx z3KL;&i6EaSXpNxo7G^q`|7=Pe9vvYRmDO55@`Z@jNg`QSwPjX_BJWL9^_A=73sFA` z0~Zw~H8E7y48zjk($e|FP;hy9DZ`UoOT?tS7O<V)pODg8Kdg-l$m6(es2#(LCOWBQ z8b<EmO+3Ody9lQFZPO@dn?j*$3Z_^6IHKdf$L!)ds@+@=ybj+Gpq`&5q^<(nk@jNJ zHv158mDe1F!OlpjjiRP8j&fT+()>Imc?9otHpw;Tj7{)FSgs{<lGlu!KO{ozUd{Sy z8kMdD430_UyrzTbFr#Z8d7gQg6y{*|%p%_tLjhrG3WBGeNvv*cqd5@e+aIRWNdz~1 zg>J$VOV*Lp?4Fgjh?};J?s@h#iyXcHhK2~r+E!5CJcm+#8|6Df?wzCfBB=d_&+k`5 zrHk`PAkd@AMn*>DG+13v&&>Q8%io%YR;{eIPiyjTqsaXp1`_hZy#S;4EsP!Sk=OoK z!PF6lxqSiogsEj1>sve6-rYm@=se7CLX4y+3fkvWBL7Rh_PBuUy@RoRk$8t(&jJiB z5{>hC71-f&H-v}22E@tv?p!4wCaF~xzmy=v$j)6NL!w6IzkB~)4W-SmUnf^tzrB^# zd9=E=IW!EPAeUqqh}_O)<aV#Z=(|B4Ve+jIOE574@>@p)j2sR_-S1Iw2l>85<`KL$ zck_9HZ<%eZ5Ypb7w8=hJVDP+y!L<OJb_i$33W}{>6&(+KK*ixFIcH5xO(pjsOjRVz z&Cknb5q<sr>Y09~f7Fg$tk~MEwT1U#8#|$s7Gdb3!vY(~?caoPU<*b``!<o+yP;t2 zNf2u)&1ZTS%uB-5yH2o9-v*4gZRHAjHj(4wFzH=FWoRER_FG!pi*&w9+S}KcoVPl= zx*)rB0k35VtS0g|EiJM~QKYD$>QA%^ho*JUU7~vO2nOFe4E;OE4ecQ>v<uVFF3h1F zm;~Am%-S~0!L5hEX9Olf)eG+`7>D+d6WoO%u!+*}9y%62qPitQLfmP8lW}}}0!vFv zDbKP72ZNAuMw3BB#-C~>Hjh@r)lu)-Csfa#BU{^targj*<A-=Td5GeP0~C+%<E3DX z7~MrN@p5!eu9J}a;x8E6XFXz)b=gMI#34+h2QV-y%A+6POI*Xzy?~ci4;~>$FxK98 z+ABo-7p%C(t<`#_plx5HdF=}3$T9MX(&=NA&)lFwFnx4`=%GUSltS`8Sw15;zQqZO zqQ|Pux}^&Y?tI4Uz9kgac#);sL-UDSv$joOZ08a^N1tI`zCcOr3}v&Yuq>RSYT*pk zlFonl2Gt7cn&pC1N!9Ze^JgfIvHsh0bRPVLiGyo2`R8;p(zQ~XTdQasgtokosZW6K z_%rGgA5ro40+#m|s3A$V<#W`n+@MyjiTc}n8zDqm7SB-;=k>}Zyoc9_e)=0@TPLt` zg;reS(aFfv3adM{mVr4$_fIkR85sWf8J_)X*f&1Gnz%v@Vf_}#Jb9*V?;6_0XUy_s zcJ}lV?W0R5vii6i=h296kBk-$VI}nev;}7o*`!K}q`U(VBPRLAhv{(b79nE%>N93Y zKpeo*6)?SXLL%ZQYv@C9wMQr7=Mm%4ifmn|X$`@p%^^6qfyl-IV!IzOe{`-8+dD;+ zq=n*}@D4Aa&OMCcx^9%PuEp+hWa;)4-&S!u$|zkZ=9eT&>^`mB;nymf0t)2~ewA0u z^Qf|VFZj)t(k$I{`%hXyLFLQx3QKMZow|WKb&Wc8jXHIW+H{RNb&Wc8bxobRMxDBL zpH7`^8nSfz|4oJ;>eTT_oqA=KZa+<@UQV5Q?N89DJE>E*Wa;*3nOh!p>eeUFsn=4c zUi4MdXUWde?OQXMDoquY7Q-C@XxS6%)KO9YHCm)^{td;?ngol*k!`UwWT()nTYjNV zz54t9<!|EOrbo>U8J$J{f==C<rCUm!y7^z!sq2&dcN2KdZ=h2z$<i&UQ!k-T9qH)Q zJBQ+M^+u`29fPYUigs=Ou1;O<Reqa)4DQ}3bcN&T>eOFl>85n*ChF9Yj!xYxhl*6( z9vz=S?2zf;_&nSLGon$KRPI$iO`enIrCz!^b$#ffPQ4^uoqDT(0vFT|-Zjyzzv&(o zm9C`f{;u(P)|<>kr=I<cqr+v)K&MWJk06ybwTDFpt<qFRqB7B`S3FZXGS{g$cMPZ0 zs5`wOxPl9krYvvn9LYqdZhxk9WUf<hx`&Wg?Ic9IpAgo|RHvTv?8u-_{Y9oa^`_3$ zKN?_n2hq|$%T!BQ&Y$DZb?Q%{Q?GCaQaZf2t^?)GRMggWrYx^)?vXY!(WyIhoq8HN zb!ya8{q`aA-6*W<m-L=;k7`4yc^ik*(WyTtLLRSEH&><p(SX7l4~iWFRM@62H(R_Y zWc>oRV`h74=+vJfA(`vcMWZfKu^%9Wlr#)TnzB5f^^$GXvmN3ebn4G(4tcyzJ-?=1 zG<`py(8>sTHOSPPvYho;KS{2%{ZBge=SWEAI(2H)Q~ekv^V{*#Nk=nHRc>azqDIa| zL_xz)dOG#zV~^LVQ=^_zc$v@qqUJEmJ5rT1zf0<8rc-}D_IRB-HR`Fvm(1@*(VG!T z?<x0Xu2X-GMxDBriB8>Q52XB|0J9^2B9=2vS<ZTy>(rm4QKznDqEk1$>Pz{90cPeG zxu%$=E;lvyXQWfNHoS2>&j_)5jhX1wO-+L-e>6by3sw2RJ>|hnbm~=E&)KL`FG^RZ zZh8~O=JxL09}bXv<`0P`UDA8Xhtt-nTO4iXXH5uo>Uq?uYw76J^W?are@2`vzv!mY zCf=KwPmQ`to4zgQ^D*RkiS%^p)mgeJoq8d4>RMVl^)AjiZcfUsNtK#A=f2UYn>y#e zmV20X#naZQGdgm!bd$Nno%<W;)C;n7`$ngpN1eL%FX_~|+H2Ki3Mq8zChF9+U#wHt zs$c0t)k8Y<JnGc7U!YUhNQOB}x3qNXM(WhHC)BBH)TwJ<RaKRSva-q?xpui+`p}j7 zBVN~wC(x;D)TwLKsp~`3W2~ydl}(+xfjaf#pP*AWQKz1hrQ6Rl>eP#=Q-7I(PQ8RW z^_SGC8?$tKI-^cKhdT8_YSN3SQ!k`OU4c4vl}DX=A$97xKMaG_^?HQ-Zf3LDa~d0* z`ow*onXH{~_!r?B-G-O&e2ZkBozIx8UHUKhJf+oiFJg6%3fZ$y*g3v>5c?lKVR`2Q ztfQ0i6jto$!4k<>J-otr;vC^sV}uzYd<BNj+Xv7=Wf<!4)K<QVJce?eQlK>NZu z+G51)MQX6jGk=Z&60>r`eMtYBPRP%;iuN5?g2ym+A0b=dJ4UwuBqdlzoFKRR7*(MY zRCqRYLVmWH>`Tb*JS29IJ$Qy3?fgL)2G2>{E}uVu!4lO8`PpV^7((UbB^>LYVOzaM z-P*&bB^ozAt2(T!6Y>=H!WM;Z<650l%>$TA4Jngn)U&xZJvyG$a!NW-(zXm+&kn4D z!1lLb9?R4-Ii(#s8M^7Fn{K-4rkifM>86`*y6L8yZo2(y`yb9PTcN(KP|W}U002ov JPDHLkV1kZU;|2f# diff --git a/lib/mejs/controls.fw.png b/lib/mejs/controls.fw.png deleted file mode 100644 index e27682ae107408748ac91805eee0e1554d618cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80753 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 MQc9BL;$H&(KQ_Ao-2eap diff --git a/lib/mejs/controls.png b/lib/mejs/controls.png deleted file mode 100644 index f6a857d800b64264443af4609e0ebf7175593d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1892 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 C_uXs& diff --git a/lib/mejs/controls.svg b/lib/mejs/controls.svg deleted file mode 100644 index af3bd416..00000000 --- a/lib/mejs/controls.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!-- Generator: Adobe Fireworks CS6, Export SVG Extension by Aaron Beall (http://fireworks.abeall.com) . Version: 0.6.1 --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg id="controls.fw-Page%201" viewBox="0 0 144 32" style="background-color:#ffffff00" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" x="0px" y="0px" width="144px" height="32px" > <defs> <radialGradient id="gradient1" cx="50%" cy="50%" r="50%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#f2f2f2" stop-opacity="0.2" offset="100%"/> </radialGradient> <linearGradient id="gradient2" x1="50%" y1="-7.8652%" x2="50%" y2="249.6629%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient3" x1="50%" y1="0%" x2="50%" y2="238.75%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient4" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient5" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient6" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient7" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient8" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient9" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient10" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient11" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient12" x1="50%" y1="0%" x2="50%" y2="238.75%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient13" x1="40%" y1="-140%" x2="40%" y2="98.75%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient14" x1="50%" y1="0%" x2="50%" y2="238.75%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient15" x1="60%" y1="-140%" x2="60%" y2="98.75%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient16" x1="50%" y1="0%" x2="50%" y2="298.4375%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient17" x1="50%" y1="0%" x2="50%" y2="238.75%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient18" x1="50%" y1="-200%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient19" x1="50%" y1="-200%" x2="50%" y2="110.9375%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient20" x1="55%" y1="0%" x2="55%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/> </linearGradient> <linearGradient id="gradient21" x1="50%" y1="0%" x2="50%" y2="100%"> <stop stop-color="#ffffff" stop-opacity="1" offset="0%"/> <stop stop-color="#c8c8c8" stop-opacity="1" offset="99.4444%"/> </linearGradient> </defs> <g id="BG"> </g> <g id="controls"> <path id="Line" d="M 98.5 7.5 L 109.5 7.5 " stroke="#ffffff" stroke-width="1" fill="none"/> <path id="Line2" d="M 98.5 3.5 L 109.5 3.5 " stroke="#ffffff" stroke-width="1" fill="none"/> <path id="Line3" d="M 98.5 11.5 L 109.5 11.5 " stroke="#ffffff" stroke-width="1" fill="none"/> <path id="Ellipse" d="M 108 11.5 C 108 10.6716 108.4477 10 109 10 C 109.5523 10 110 10.6716 110 11.5 C 110 12.3284 109.5523 13 109 13 C 108.4477 13 108 12.3284 108 11.5 Z" fill="#ffffff"/> <path id="Ellipse2" d="M 104 7.5 C 104 6.6716 104.4477 6 105 6 C 105.5523 6 106 6.6716 106 7.5 C 106 8.3284 105.5523 9 105 9 C 104.4477 9 104 8.3284 104 7.5 Z" fill="#ffffff"/> <path id="Ellipse3" d="M 108 3.5 C 108 2.6716 108.4477 2 109 2 C 109.5523 2 110 2.6716 110 3.5 C 110 4.3284 109.5523 5 109 5 C 108.4477 5 108 4.3284 108 3.5 Z" fill="#ffffff"/> </g> <g id="backlight"> <g id="off"> <rect x="83" y="21" width="10" height="6" stroke="#ffffff" stroke-width="1" fill="#333333"/> </g> <g id="on"> <path id="Ellipse4" d="M 81 8 C 81 5.2385 84.134 3 88 3 C 91.866 3 95 5.2385 95 8 C 95 10.7615 91.866 13 88 13 C 84.134 13 81 10.7615 81 8 Z" fill="url(#gradient1)"/> <rect x="83" y="5" width="10" height="6" stroke="#ffffff" stroke-width="1" fill="#333333"/> </g> </g> <g id="loop"> <g id="on2"> <path d="M 73.795 4.205 C 75.2155 4.8785 76.2 6.3234 76.2 8 C 76.2 10.3196 74.3196 12.2 72 12.2 C 69.6804 12.2 67.8 10.3196 67.8 8 C 67.8 6.3234 68.7845 4.8785 70.205 4.205 L 68.875 2.875 C 67.1501 3.9289 66 5.8306 66 8 C 66 11.3138 68.6862 14 72 14 C 75.3138 14 78 11.3138 78 8 C 78 5.8306 76.8499 3.9289 75.125 2.875 L 73.795 4.205 Z" fill="url(#gradient2)"/> <path d="M 71 2 L 66 2 L 71 7 L 71 2 Z" fill="url(#gradient3)"/> </g> <g id="off2"> <path d="M 73.795 20.205 C 75.2155 20.8785 76.2 22.3234 76.2 24 C 76.2 26.3196 74.3196 28.2 72 28.2 C 69.6804 28.2 67.8 26.3196 67.8 24 C 67.8 22.3234 68.7845 20.8785 70.205 20.205 L 68.875 18.875 C 67.1501 19.9289 66 21.8306 66 24 C 66 27.3138 68.6862 30 72 30 C 75.3138 30 78 27.3138 78 24 C 78 21.8306 76.8499 19.9289 75.125 18.875 L 73.795 20.205 Z" fill="#a8a8b7"/> <path d="M 71 18 L 66 18 L 71 23 L 71 18 Z" fill="#a8a8b7"/> </g> </g> <g id="cc"> <rect visibility="hidden" x="49" y="2" width="14" height="12" stroke="#b0b0b0" stroke-width="1" fill="none"/> <text visibility="hidden" x="49" y="17" width="14" fill="#ffffff" style="font-size: 10px; color: #ffffff; font-family: Arial; text-align: center; "><tspan><![CDATA[cc]]></tspan></text> <path d="M 55 7 C 50.2813 3.7813 50.063 12.9405 55 10 " stroke="#ffffff" stroke-width="1" fill="none"/> <path d="M 60 7 C 55.2813 3.7813 55.063 12.9405 60 10 " stroke="#ffffff" stroke-width="1" fill="none"/> <path d="M 50 3 L 62 3 L 62 13 L 50 13 L 50 3 ZM 49 2 L 49 14 L 63 14 L 63 2 L 49 2 Z" fill="url(#gradient4)"/> <rect x="49" y="2" width="14" height="12" fill="none"/> </g> <g id="volume"> <g id="no%20sound"> <rect x="17" y="5" width="5" height="6" fill="url(#gradient5)"/> <path d="M 21 5 L 25 2 L 25 14 L 21 11.0625 L 21 5 Z" fill="url(#gradient6)"/> </g> <g id="sound%20bars"> <rect x="17" y="21" width="5" height="6" fill="url(#gradient7)"/> <path d="M 21 21 L 25 18 L 25 30 L 21 27.0625 L 21 21 Z" fill="url(#gradient8)"/> <path d="M 27 18 C 27 18 30.0625 17.375 30 24 C 29.9375 30.625 27 30 27 30 " stroke="#ffffff" stroke-width="1" fill="none"/> <path d="M 26 21.0079 C 26 21.0079 28.041 20.6962 27.9994 24 C 27.9577 27.3038 26 26.9921 26 26.9921 " stroke="#ffffff" stroke-width="1" fill="none"/> </g> </g> <g id="play/pause"> <g id="play"> <path id="Polygon" d="M 14 8.5 L 3 14 L 3 3 L 14 8.5 Z" fill="url(#gradient9)"/> </g> <g id="pause"> <rect x="3" y="18" width="3" height="12" fill="url(#gradient10)"/> <rect x="10" y="18" width="3" height="12" fill="url(#gradient11)"/> </g> </g> <g id="fullscreen"> <g id="enter%201"> <path d="M 34 2 L 39 2 L 34 7 L 34 2 Z" fill="url(#gradient12)"/> <path d="M 34 14 L 39 14 L 34 9 L 34 14 Z" fill="url(#gradient13)"/> <path d="M 46 2 L 41 2 L 46 7 L 46 2 Z" fill="url(#gradient14)"/> <path d="M 46 14 L 41 14 L 46 9 L 46 14 Z" fill="url(#gradient15)"/> </g> <g id="exit"> <path d="M 42 22 L 46 22 L 42 18 L 42 22 Z" fill="url(#gradient16)"/> <path d="M 38 22 L 38 18 L 34 22 L 38 22 Z" fill="url(#gradient17)"/> <path d="M 38 26 L 34 26 L 38 30 L 38 26 Z" fill="url(#gradient18)"/> <path d="M 42 26 L 42 30 L 46 26 L 42 26 Z" fill="url(#gradient19)"/> </g> </g> <g id="stop"> <rect x="115" y="3" width="10" height="10" fill="url(#gradient20)"/> </g> <g id="chooser"> <path d="M 135.2346 6.1522 C 136.2551 5.7295 137.4251 6.2141 137.8478 7.2346 C 138.2704 8.2551 137.7859 9.425 136.7654 9.8478 C 135.7449 10.2705 134.5749 9.7859 134.1522 8.7654 C 133.7295 7.7449 134.2141 6.5749 135.2346 6.1522 ZM 133.2735 1.4176 L 136 4.0054 L 138.7265 1.4176 L 138.8246 5.1754 L 142.5824 5.2735 L 139.9946 8 L 142.5824 10.7265 L 138.8246 10.8246 L 138.7265 14.5824 L 136 11.9946 L 133.2735 14.5824 L 133.1754 10.8246 L 129.4176 10.7265 L 132.0054 8 L 129.4176 5.2735 L 133.1754 5.1754 L 133.2735 1.4176 Z" fill="url(#gradient21)"/> </g> </svg> \ No newline at end of file diff --git a/lib/mejs/flashmediaelement-cdn.swf b/lib/mejs/flashmediaelement-cdn.swf deleted file mode 100644 index 9b222e9cf6799975243bf9621ebe76bdcecbf6b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57058 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 diff --git a/lib/mejs/flashmediaelement.swf b/lib/mejs/flashmediaelement.swf deleted file mode 100644 index 5998d67699f32fb155a763f7e92373f4c1879aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57052 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%0DiD4qDy(djNgcgT9N~JvepQZWRK_yZwY! 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 diff --git a/lib/mejs/loading.gif b/lib/mejs/loading.gif deleted file mode 100644 index 612222be5e474c36c345042dd6f697fa1d16a6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6224 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 a%CSF@A_b&47t_EYjD0%aV6(nOxBn04F1xn? diff --git a/lib/mejs/mediaelement-and-player.js b/lib/mejs/mediaelement-and-player.js index bbdd6766..8d7ad3c2 100644 --- a/lib/mejs/mediaelement-and-player.js +++ b/lib/mejs/mediaelement-and-player.js @@ -1,5291 +1,9181 @@ /*! -* MediaElement.js -* HTML5 <video> and <audio> shim and player -* http://mediaelementjs.com/ -* -* Creates a JavaScript object that mimics HTML5 MediaElement API -* for browsers that don't understand HTML5 or can't play the provided codec -* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3 -* -* Copyright 2010-2014, John Dyer (http://j.hn) -* License: MIT -* -*/ + * MediaElement.js + * http://www.mediaelementjs.com/ + * + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) + * License: MIT + * + */(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){ + +},{}],2:[function(_dereq_,module,exports){ +(function (global){ +var topLevel = typeof global !== 'undefined' ? global : + typeof window !== 'undefined' ? window : {} +var minDoc = _dereq_(1); + +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 : {}) +},{"1":1}],3:[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 : {}) +},{}],4:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _en = _dereq_(14); + +var _general = _dereq_(25); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Locale. + * + * This object manages translations with pluralization. Also deals with WordPress compatibility. + * @type {Object} + */ +var i18n = { lang: 'en', en: _en.EN }; + +/** + * Language setter/getter + * + * @param {*} args Can pass the language code and/or the translation strings as an Object + * @return {string} + */ +i18n.language = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (args !== null && args !== undefined && args.length) { + + if (typeof args[0] !== 'string') { + throw new TypeError('Language code must be a string value'); + } + + if (!args[0].match(/^[a-z]{2}(\-[a-z]{2})?$/i)) { + throw new TypeError('Language code must have format `xx` or `xx-xx`'); + } + + i18n.lang = args[0]; + + // Check if language strings were added; otherwise, check the second argument or set to English as default + if (i18n[args[0]] === undefined) { + args[1] = args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object' ? args[1] : {}; + i18n[args[0]] = !(0, _general.isObjectEmpty)(args[1]) ? args[1] : _en.EN; + } else if (args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object') { + i18n[args[0]] = args[1]; + } + } + + return i18n.lang; +}; + +/** + * Translate a string in the language set up (or English by default) + * + * @param {string} message + * @param {number} pluralParam + * @return {string} + */ +i18n.t = function (message) { + var pluralParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + + if (typeof message === 'string' && message.length) { + + var str = void 0, + pluralForm = void 0; + + var language = i18n.language(); + + /** + * Modify string using algorithm to detect plural forms. + * + * @private + * @see http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings + * @param {String|String[]} input - String or array of strings to pick the plural form + * @param {Number} number - Number to determine the proper plural form + * @param {Number} form - Number of language family to apply plural form + * @return {String} + */ + var _plural = function _plural(input, number, form) { + + if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) !== 'object' || typeof number !== 'number' || typeof form !== 'number') { + return input; + } + + /** + * + * @return {Function[]} + * @private + */ + var _pluralForms = function () { + return [ + // 0: Chinese, Japanese, Korean, Persian, Turkish, Thai, Lao, Aymará, + // Tibetan, Chiga, Dzongkha, Indonesian, Lojban, Georgian, Kazakh, Khmer, Kyrgyz, Malay, + // Burmese, Yakut, Sundanese, Tatar, Uyghur, Vietnamese, Wolof + function () { + return arguments.length <= 1 ? undefined : arguments[1]; + }, + + // 1: Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish, Estonian, Finnish, + // Hungarian, Basque, Greek, Hebrew, Italian, Portuguese, Spanish, Catalan, Afrikaans, + // Angika, Assamese, Asturian, Azerbaijani, Bulgarian, Bengali, Bodo, Aragonese, Dogri, + // Esperanto, Argentinean Spanish, Fulah, Friulian, Galician, Gujarati, Hausa, + // Hindi, Chhattisgarhi, Armenian, Interlingua, Greenlandic, Kannada, Kurdish, Letzeburgesch, + // Maithili, Malayalam, Mongolian, Manipuri, Marathi, Nahuatl, Neapolitan, Norwegian Bokmal, + // Nepali, Norwegian Nynorsk, Norwegian (old code), Northern Sotho, Oriya, Punjabi, Papiamento, + // Piemontese, Pashto, Romansh, Kinyarwanda, Santali, Scots, Sindhi, Northern Sami, Sinhala, + // Somali, Songhay, Albanian, Swahili, Tamil, Telugu, Turkmen, Urdu, Yoruba + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // 2: French, Brazilian Portuguese, Acholi, Akan, Amharic, Mapudungun, Breton, Filipino, + // Gun, Lingala, Mauritian Creole, Malagasy, Maori, Occitan, Tajik, Tigrinya, Uzbek, Walloon + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // 3: Latvian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 0) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 4: Scottish Gaelic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1 || (arguments.length <= 0 ? undefined : arguments[0]) === 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2 || (arguments.length <= 0 ? undefined : arguments[0]) === 12) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 20) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 5: Romanian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 0 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 6: Lithuanian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return [3]; + } + }, + + // 7: Belarusian, Bosnian, Croatian, Serbian, Russian, Ukrainian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 8: Slovak, Czech + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) <= 4) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 9: Polish + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 10: Slovenian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 2) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 3 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 === 4) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else { + return arguments.length <= 1 ? undefined : arguments[1]; + } + }, + + // 11: Irish Gaelic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 7) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 6 && (arguments.length <= 0 ? undefined : arguments[0]) < 11) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else { + return arguments.length <= 5 ? undefined : arguments[5]; + } + }, + + // 12: Arabic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 3 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 <= 10) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 11) { + return arguments.length <= 5 ? undefined : arguments[5]; + } else { + return arguments.length <= 6 ? undefined : arguments[6]; + } + }, + + // 13: Maltese + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 11) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 > 10 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 14: Macedonian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 15: Icelandic + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) !== 11 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // New additions + + // 16: Kashubian + // In https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of__pluralRules + // Breton is listed as #16 but in the Localization Guide it belongs to the group 2 + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 17: Welsh + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 8 && (arguments.length <= 0 ? undefined : arguments[0]) !== 11) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 18: Javanese + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 0 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // 19: Cornish + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 3) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 20: Mandinka + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }]; + }(); + + // Perform plural form or return original text + return _pluralForms[form].apply(null, [number].concat(input)); + }; + + // Fetch the localized version of the string + if (i18n[language] !== undefined) { + str = i18n[language][message]; + if (pluralParam !== null && typeof pluralParam === 'number') { + pluralForm = i18n[language]['mejs.plural-form']; + str = _plural.apply(null, [str, pluralParam, pluralForm]); + } + } + + // Fallback to default language if requested uid is not translated + if (!str && i18n.en) { + str = i18n.en[message]; + if (pluralParam !== null && typeof pluralParam === 'number') { + pluralForm = i18n.en['mejs.plural-form']; + str = _plural.apply(null, [str, pluralParam, pluralForm]); + } + } + + // As a last resort, use the requested uid, to mimic original behavior of i18n utils + // (in which uid was the english text) + str = str || message; + + // Replace token + if (pluralParam !== null && typeof pluralParam === 'number') { + str = str.replace('%1', pluralParam); + } + + return (0, _general.escapeHTML)(str); + } + + return message; +}; + +_mejs2.default.i18n = i18n; + +// `i18n` compatibility workflow with WordPress +if (typeof mejsL10n !== 'undefined') { + _mejs2.default.i18n.language(mejsL10n.language, mejsL10n.strings); +} + +exports.default = i18n; + +},{"14":14,"25":25,"6":6}],5:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _general = _dereq_(25); + +var _media = _dereq_(26); + +var _renderer = _dereq_(7); + +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"); } } + +/** + * Media Core + * + * This class is the foundation to create/render different media formats. + * @class MediaElement + */ +var MediaElement = function MediaElement(idOrNode, options) { + var _this = this; + + _classCallCheck(this, MediaElement); + + var t = this; + + t.defaults = { + /** + * List of the renderers to use + * @type {String[]} + */ + renderers: [], + /** + * Name of MediaElement container + * @type {String} + */ + fakeNodeName: 'mediaelementwrapper', + /** + * The path where shims are located + * @type {String} + */ + pluginPath: 'build/', + /** + * Flag in `<object>` and `<embed>` to determine whether to use local or CDN + * Possible values: 'always' (CDN version) or 'sameDomain' (local files) + */ + shimScriptAccess: 'sameDomain', + /** + * If error happens, set up HTML message + * @type {String} + */ + customError: '' + }; + + options = Object.assign(t.defaults, options); + + // create our node (note: older versions of iOS don't support Object.defineProperty on DOM nodes) + t.mediaElement = _document2.default.createElement(options.fakeNodeName); + t.mediaElement.options = options; + + var id = idOrNode, + error = false; + + if (typeof idOrNode === 'string') { + t.mediaElement.originalNode = _document2.default.getElementById(idOrNode); + } else { + t.mediaElement.originalNode = idOrNode; + id = idOrNode.id; + } + + id = id || 'mejs_' + Math.random().toString().slice(2); + + if (t.mediaElement.originalNode !== undefined && t.mediaElement.originalNode !== null && t.mediaElement.appendChild) { + // change id + t.mediaElement.originalNode.setAttribute('id', id + '_from_mejs'); + + // to avoid some issues with Javascript interactions in the plugin, set `preload=none` if not set + // only if video/audio tags are detected + var tagName = t.mediaElement.originalNode.tagName.toLowerCase(); + if (['video', 'audio'].includes(tagName) && !t.mediaElement.originalNode.getAttribute('preload')) { + t.mediaElement.originalNode.setAttribute('preload', 'none'); + } + + // add next to this one + t.mediaElement.originalNode.parentNode.insertBefore(t.mediaElement, t.mediaElement.originalNode); + + // insert this one inside + t.mediaElement.appendChild(t.mediaElement.originalNode); + } else { + // TODO: where to put the node? + } + + t.mediaElement.id = id; + t.mediaElement.renderers = {}; + t.mediaElement.renderer = null; + t.mediaElement.rendererName = null; + /** + * Determine whether the renderer was found or not + * + * @public + * @param {String} rendererName + * @param {Object[]} mediaFiles + * @return {Boolean} + */ + t.mediaElement.changeRenderer = function (rendererName, mediaFiles) { + + var t = _this; + + // check for a match on the current renderer + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && t.mediaElement.renderer.name === rendererName) { + t.mediaElement.renderer.pause(); + if (t.mediaElement.renderer.stop) { + t.mediaElement.renderer.stop(); + } + t.mediaElement.renderer.show(); + t.mediaElement.renderer.setSrc(mediaFiles[0].src); + return true; + } + + // if existing renderer is not the right one, then hide it + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer.pause(); + if (t.mediaElement.renderer.stop) { + t.mediaElement.renderer.stop(); + } + t.mediaElement.renderer.hide(); + } + + // see if we have the renderer already created + var newRenderer = t.mediaElement.renderers[rendererName], + newRendererType = null; + + if (newRenderer !== undefined && newRenderer !== null) { + newRenderer.show(); + newRenderer.setSrc(mediaFiles[0].src); + t.mediaElement.renderer = newRenderer; + t.mediaElement.rendererName = rendererName; + return true; + } + + var rendererArray = t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : _renderer.renderer.order; + + // find the desired renderer in the array of possible ones + for (var i = 0, total = rendererArray.length; i < total; i++) { + + var index = rendererArray[i]; + + if (index === rendererName) { + + // create the renderer + var rendererList = _renderer.renderer.renderers; + newRendererType = rendererList[index]; + + var renderOptions = Object.assign(newRendererType.options, t.mediaElement.options); + newRenderer = newRendererType.create(t.mediaElement, renderOptions, mediaFiles); + newRenderer.name = rendererName; + + // store for later + t.mediaElement.renderers[newRendererType.name] = newRenderer; + t.mediaElement.renderer = newRenderer; + t.mediaElement.rendererName = rendererName; + + newRenderer.show(); + + return true; + } + } + + return false; + }; + + /** + * Set the element dimensions based on selected renderer's setSize method + * + * @public + * @param {number} width + * @param {number} height + */ + t.mediaElement.setSize = function (width, height) { + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer.setSize(width, height); + } + }; + + /** + * + * @param {Object[]} urlList + */ + t.mediaElement.createErrorMessage = function (urlList) { + + urlList = Array.isArray(urlList) ? urlList : []; + + var errorContainer = _document2.default.createElement('div'); + errorContainer.className = 'me_cannotplay'; + errorContainer.style.width = '100%'; + errorContainer.style.height = '100%'; + + var errorContent = t.mediaElement.options.customError; + + if (!errorContent) { + + var poster = t.mediaElement.originalNode.getAttribute('poster'); + if (poster) { + errorContent += '<img src="' + poster + '" width="100%" height="100%" alt="' + _mejs2.default.i18n.t('mejs.download-file') + '">'; + } + + for (var i = 0, total = urlList.length; i < total; i++) { + var url = urlList[i]; + errorContent += '<a href="' + url.src + '" data-type="' + url.type + '"><span>' + _mejs2.default.i18n.t('mejs.download-file') + ': ' + url.src + '</span></a>'; + } + } + + errorContainer.innerHTML = errorContent; + + t.mediaElement.originalNode.parentNode.insertBefore(errorContainer, t.mediaElement.originalNode); + t.mediaElement.originalNode.style.display = 'none'; + error = true; + }; + + var props = _mejs2.default.html5media.properties, + methods = _mejs2.default.html5media.methods, + addProperty = function addProperty(obj, name, onGet, onSet) { + + // wrapper functions + var oldValue = obj[name]; + var getFn = function getFn() { + return onGet.apply(obj, [oldValue]); + }, + setFn = function setFn(newValue) { + oldValue = onSet.apply(obj, [newValue]); + return oldValue; + }; + + Object.defineProperty(obj, name, { + get: getFn, + set: setFn + }); + }, + assignGettersSetters = function assignGettersSetters(propName) { + if (propName !== 'src') { + (function () { + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1), + getFn = function getFn() { + return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer['get' + capName]() : null; + }, + setFn = function setFn(value) { + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer['set' + capName](value); + } + }; + + addProperty(t.mediaElement, propName, getFn, setFn); + t.mediaElement['get' + capName] = getFn; + t.mediaElement['set' + capName] = setFn; + })(); + } + }, + + // `src` is a property separated from the others since it carries the logic to set the proper renderer + // based on the media files detected + getSrc = function getSrc() { + return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer.getSrc() : null; + }, + setSrc = function setSrc(value) { + + var mediaFiles = []; + + // clean up URLs + if (typeof value === 'string') { + mediaFiles.push({ + src: value, + type: value ? (0, _media.getTypeFromFile)(value) : '' + }); + } else { + for (var i = 0, total = value.length; i < total; i++) { + + var src = (0, _media.absolutizeUrl)(value[i].src), + type = value[i].type; + + mediaFiles.push({ + src: src, + type: (type === '' || type === null || type === undefined) && src ? (0, _media.getTypeFromFile)(src) : type + }); + } + } + + // find a renderer and URL match + var renderInfo = _renderer.renderer.select(mediaFiles, t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : []), + event = void 0; + + // Ensure that the original gets the first source found + if (!t.mediaElement.paused) { + t.mediaElement.pause(); + event = (0, _general.createEvent)('pause', t.mediaElement); + t.mediaElement.dispatchEvent(event); + } + + t.mediaElement.originalNode.setAttribute('src', mediaFiles[0].src || ''); + + if (t.mediaElement.querySelector('.me_cannotplay')) { + t.mediaElement.querySelector('.me_cannotplay').remove(); + } + + // did we find a renderer? + if (renderInfo === null) { + t.mediaElement.createErrorMessage(mediaFiles); + event = (0, _general.createEvent)('error', t.mediaElement); + event.message = 'No renderer found'; + t.mediaElement.dispatchEvent(event); + return; + } + + // turn on the renderer (this checks for the existing renderer already) + t.mediaElement.changeRenderer(renderInfo.rendererName, mediaFiles); + + if (t.mediaElement.renderer === undefined || t.mediaElement.renderer === null) { + event = (0, _general.createEvent)('error', t.mediaElement); + event.message = 'Error creating renderer'; + t.mediaElement.dispatchEvent(event); + t.mediaElement.createErrorMessage(mediaFiles); + return; + } + }, + assignMethods = function assignMethods(methodName) { + // run the method on the current renderer + t.mediaElement[methodName] = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer[methodName] === 'function') { + try { + t.mediaElement.renderer[methodName](args); + } catch (e) { + t.mediaElement.createErrorMessage(); + } + } + return null; + }; + }; + + // Assign all methods/properties/events to fake node if renderer was found + addProperty(t.mediaElement, 'src', getSrc, setSrc); + t.mediaElement.getSrc = getSrc; + t.mediaElement.setSrc = setSrc; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } + + // IE && iOS + t.mediaElement.events = {}; + + // start: fake events + t.mediaElement.addEventListener = function (eventName, callback) { + // create or find the array of callbacks for this eventName + t.mediaElement.events[eventName] = t.mediaElement.events[eventName] || []; + + // push the callback into the stack + t.mediaElement.events[eventName].push(callback); + }; + t.mediaElement.removeEventListener = function (eventName, callback) { + // no eventName means remove all listeners + if (!eventName) { + t.mediaElement.events = {}; + return true; + } + + // see if we have any callbacks for this eventName + var callbacks = t.mediaElement.events[eventName]; + + if (!callbacks) { + return true; + } + + // check for a specific callback + if (!callback) { + t.mediaElement.events[eventName] = []; + return true; + } + + // remove the specific callback + for (var _i2 = 0; _i2 < callbacks.length; _i2++) { + if (callbacks[_i2] === callback) { + t.mediaElement.events[eventName].splice(_i2, 1); + return true; + } + } + return false; + }; + + /** + * + * @param {Event} event + */ + t.mediaElement.dispatchEvent = function (event) { + + var callbacks = t.mediaElement.events[event.type]; + + if (callbacks) { + for (var _i3 = 0; _i3 < callbacks.length; _i3++) { + callbacks[_i3].apply(null, [event]); + } + } + }; + + if (t.mediaElement.originalNode !== null) { + var mediaFiles = []; + + switch (t.mediaElement.originalNode.nodeName.toLowerCase()) { + + case 'iframe': + mediaFiles.push({ + type: '', + src: t.mediaElement.originalNode.getAttribute('src') + }); + + break; + + case 'audio': + case 'video': + var n = void 0, + src = void 0, + type = void 0, + sources = t.mediaElement.originalNode.childNodes.length, + nodeSource = t.mediaElement.originalNode.getAttribute('src'); + + // Consider if node contains the `src` and `type` attributes + if (nodeSource) { + var node = t.mediaElement.originalNode; + mediaFiles.push({ + type: (0, _media.formatType)(nodeSource, node.getAttribute('type')), + src: nodeSource + }); + } + + // test <source> types to see if they are usable + for (var _i4 = 0; _i4 < sources; _i4++) { + n = t.mediaElement.originalNode.childNodes[_i4]; + if (n.nodeType === Node.ELEMENT_NODE && n.tagName.toLowerCase() === 'source') { + src = n.getAttribute('src'); + type = (0, _media.formatType)(src, n.getAttribute('type')); + mediaFiles.push({ type: type, src: src }); + } + } + break; + } + + if (mediaFiles.length > 0) { + t.mediaElement.src = mediaFiles; + } + } + + if (t.mediaElement.options.success) { + t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode); + } + + if (error && t.mediaElement.options.error) { + t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode); + } + + return t.mediaElement; +}; + +_window2.default.MediaElement = MediaElement; + +exports.default = MediaElement; + +},{"2":2,"25":25,"26":26,"3":3,"6":6,"7":7}],6:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + // Namespace -var mejs = mejs || {}; +var mejs = {}; + +// version number +mejs.version = '4.0.2'; + +// Basic HTML5 settings +mejs.html5media = { + /** + * @type {String[]} + */ + properties: [ + // GET/SET + 'volume', 'src', 'currentTime', 'muted', + + // GET only + 'duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable', + + // OTHERS + 'currentSrc', 'preload', 'bufferedBytes', 'bufferedTime', 'initialTime', 'startOffsetTime', 'defaultPlaybackRate', 'playbackRate', 'played', 'autoplay', 'loop', 'controls'], + readOnlyProperties: ['duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable'], + /** + * @type {String[]} + */ + methods: ['load', 'play', 'pause', 'canPlayType'], + /** + * @type {String[]} + */ + events: ['loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange'], + /** + * @type {String[]} + */ + mediaTypes: ['audio/mp3', 'audio/ogg', 'audio/oga', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav', 'audio/mpeg', 'audio/mp4', 'video/mp4', 'video/webm', 'video/ogg'] +}; + +_window2.default.mejs = mejs; + +exports.default = mejs; + +},{"3":3}],7:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.renderer = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +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"); } } + +/** + * + * Class to manage renderer selection and addition. + * @class Renderer + */ +var Renderer = function () { + function Renderer() { + _classCallCheck(this, Renderer); + + this.renderers = {}; + this.order = []; + } + + /** + * Register a new renderer. + * + * @param {Object} renderer - An object with all the rendered information (name REQUIRED) + * @method add + */ + + + _createClass(Renderer, [{ + key: 'add', + value: function add(renderer) { + + if (renderer.name === undefined) { + throw new TypeError('renderer must contain at least `name` property'); + } + + this.renderers[renderer.name] = renderer; + this.order.push(renderer.name); + } + + /** + * Iterate a list of renderers to determine which one should the player use. + * + * @param {Object[]} mediaFiles - A list of source and type obtained from video/audio/source tags: [{src:'',type:''}] + * @param {?String[]} renderers - Optional list of pre-selected renderers + * @return {?Object} The renderer's name and source selected + * @method select + */ + + }, { + key: 'select', + value: function select(mediaFiles) { + var renderers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + + + var renderersLength = renderers.length; + + renderers = renderers.length ? renderers : this.order; + + // If renderers are not set, set a default order: + // 1) Native renderers (HTML5, HLS, M(PEG)-DASH, FLV) + // 2) Flash shims (RTMP, FLV, HLS, M(PEG)-DASH, MP3, OGG) + // 3) Iframe renderers (YouTube, SoundCloud, Facebook. etc.) + if (!renderersLength) { + (function () { + var rendererIndicator = [/^(html5|native)/, /^flash/, /iframe$/], + rendererRanking = function rendererRanking(renderer) { + for (var i = 0, total = rendererIndicator.length; i < total; i++) { + if (renderer.match(rendererIndicator[i]) !== null) { + return i; + } + } + return rendererIndicator.length; + }; + + renderers.sort(function (a, b) { + return rendererRanking(a) - rendererRanking(b); + }); + })(); + } + + for (var i = 0, total = renderers.length; i < total; i++) { + var key = renderers[i], + _renderer = this.renderers[key]; + + if (_renderer !== null && _renderer !== undefined) { + for (var j = 0, jl = mediaFiles.length; j < jl; j++) { + if (typeof _renderer.canPlayType === 'function' && typeof mediaFiles[j].type === 'string' && _renderer.canPlayType(mediaFiles[j].type)) { + return { + rendererName: _renderer.name, + src: mediaFiles[j].src + }; + } + } + } + } + + return null; + } + + // Setters/getters + + }, { + key: 'order', + set: function set(order) { + + if (!Array.isArray(order)) { + throw new TypeError('order must be an array of strings.'); + } + + this._order = order; + }, + get: function get() { + return this._order; + } + }, { + key: 'renderers', + set: function set(renderers) { + + if (renderers !== null && (typeof renderers === 'undefined' ? 'undefined' : _typeof(renderers)) !== 'object') { + throw new TypeError('renderers must be an array of objects.'); + } + + this._renderers = renderers; + }, + get: function get() { + return this._renderers; + } + }]); + + return Renderer; +}(); + +var renderer = exports.renderer = new Renderer(); + +_mejs2.default.Renderers = renderer; + +},{"6":6}],8:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _constants = _dereq_(23); + +var Features = _interopRequireWildcard(_constants); + +var _general = _dereq_(25); + +var _dom = _dereq_(24); + +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 }; } + +/** + * Fullscreen button + * + * This feature creates a button to toggle fullscreen on video; it considers a letiety of possibilities when dealing with it + * since it is not consistent across browsers. It also accounts for triggering the event through Flash shim. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * @type {Boolean} + */ + usePluginFullScreen: true, + /** + * @type {?String} + */ + fullscreenText: null +}); + +Object.assign(_player2.default.prototype, { + + /** + * @type {Boolean} + */ + isFullScreen: false, + /** + * @type {Boolean} + */ + isNativeFullScreen: false, + /** + * @type {Boolean} + */ + isInIframe: false, + /** + * @type {Boolean} + */ + isPluginClickThroughCreated: false, + /** + * Possible modes + * (1) 'native-native' HTML5 video + browser fullscreen (IE10+, etc.) + * (2) 'plugin-native' plugin video + browser fullscreen (fails in some versions of Firefox) + * (3) 'fullwindow' Full window (retains all UI) + * + * @type {String} + */ + fullscreenMode: '', + /** + * + */ + containerSizeTimeout: null, + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildfullscreen: function buildfullscreen(player, controls, layers, media) { + + if (!player.isVideo) { + return; + } + + player.isInIframe = _window2.default.location !== _window2.default.parent.location; + + // detect on start + media.addEventListener('loadstart', function () { + player.detectFullscreenMode(); + }); + + var t = this, + fullscreenTitle = (0, _general.isString)(t.options.fullscreenText) ? t.options.fullscreenText : _i18n2.default.t('mejs.fullscreen'), + fullscreenBtn = _document2.default.createElement('div'); + + fullscreenBtn.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'fullscreen-button'; + fullscreenBtn.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + fullscreenTitle + '" aria-label="' + fullscreenTitle + '" tabindex="0"></button>'; + t.addControlElement(fullscreenBtn, 'fullscreen'); + + fullscreenBtn.addEventListener('click', function () { + // toggle fullscreen + var isFullScreen = Features.HAS_TRUE_NATIVE_FULLSCREEN && Features.IS_FULLSCREEN || player.isFullScreen; + + if (isFullScreen) { + player.exitFullScreen(); + } else { + player.enterFullScreen(); + } + }); + + player.fullscreenBtn = fullscreenBtn; + + t.globalBind('keydown', function (e) { + var key = e.which || e.keyCode || 0; + if (key === 27 && (Features.HAS_TRUE_NATIVE_FULLSCREEN && Features.IS_FULLSCREEN || t.isFullScreen)) { + player.exitFullScreen(); + } + }); + + t.normalHeight = 0; + t.normalWidth = 0; + + // setup native fullscreen event + if (Features.HAS_TRUE_NATIVE_FULLSCREEN) { + + // + /** + * Detect any changes on fullscreen + * + * Chrome doesn't always fire this in an `<iframe>` + * @private + */ + var fullscreenChanged = function fullscreenChanged() { + if (player.isFullScreen) { + if (Features.isFullScreen()) { + player.isNativeFullScreen = true; + // reset the controls once we are fully in full screen + player.setControlsSize(); + } else { + player.isNativeFullScreen = false; + // when a user presses ESC + // make sure to put the player back into place + player.exitFullScreen(); + } + } + }; + + player.globalBind(Features.FULLSCREEN_EVENT_NAME, fullscreenChanged); + } + }, + + + /** + * Detect the type of fullscreen based on browser's capabilities + * + * @return {String} + */ + detectFullscreenMode: function detectFullscreenMode() { + + var t = this, + isNative = t.media.rendererName !== null && t.media.rendererName.match(/(native|html5)/) !== null; + + var mode = ''; + + if (Features.HAS_TRUE_NATIVE_FULLSCREEN && isNative) { + mode = 'native-native'; + } else if (Features.HAS_TRUE_NATIVE_FULLSCREEN && !isNative) { + mode = 'plugin-native'; + } else if (t.usePluginFullScreen && Features.SUPPORT_POINTER_EVENTS) { + mode = 'plugin-click'; + } else { + mode = 'fullwindow'; + } + + t.fullscreenMode = mode; + return mode; + }, + + + /** + * Feature destructor. + * + * Always has to be prefixed with `clean` and the name that was used in features list + * @param {MediaElementPlayer} player + */ + cleanfullscreen: function cleanfullscreen(player) { + player.exitFullScreen(); + }, + + + /** + * + */ + enterFullScreen: function enterFullScreen() { + + var t = this, + isNative = t.media.rendererName !== null && t.media.rendererName.match(/(html5|native)/) !== null, + containerStyles = getComputedStyle(t.container); + + if (Features.IS_IOS && Features.HAS_IOS_FULLSCREEN && typeof t.media.webkitEnterFullscreen === 'function') { + t.media.webkitEnterFullscreen(); + return; + } + + // set it to not show scroll bars so 100% will work + (0, _dom.addClass)(_document2.default.documentElement, t.options.classPrefix + 'fullscreen'); + (0, _dom.addClass)(t.container, t.options.classPrefix + 'container-fullscreen'); + + // store sizing + t.normalHeight = parseFloat(containerStyles.height); + t.normalWidth = parseFloat(containerStyles.width); + + // attempt to do true fullscreen + if (t.fullscreenMode === 'native-native' || t.fullscreenMode === 'plugin-native') { + + Features.requestFullScreen(t.container); + + if (t.isInIframe) { + // sometimes exiting from fullscreen doesn't work + // notably in Chrome <iframe>. Fixed in version 17 + setTimeout(function checkFullscreen() { + + if (t.isNativeFullScreen) { + var percentErrorMargin = 0.002, + // 0.2% + windowWidth = _window2.default.innerWidth || _document2.default.documentElement.clientWidth || _document2.default.body.clientWidth, + screenWidth = screen.width, + absDiff = Math.abs(screenWidth - windowWidth), + marginError = screenWidth * percentErrorMargin; + + // check if the video is suddenly not really fullscreen + if (absDiff > marginError) { + // manually exit + t.exitFullScreen(); + } else { + // test again + setTimeout(checkFullscreen, 500); + } + } + }, 1000); + } + } else if (t.fullscreeMode === 'fullwindow') {} + // move into position + + // make full size + t.container.style.width = '100%'; + t.container.style.height = '100%'; + + // Only needed for safari 5.1 native full screen, can cause display issues elsewhere + // Actually, it seems to be needed for IE8, too + t.containerSizeTimeout = setTimeout(function () { + t.container.style.width = '100%'; + t.container.style.height = '100%'; + t.setControlsSize(); + }, 500); + + if (isNative) { + t.node.style.width = '100%'; + t.node.style.height = '100%'; + } else { + var elements = t.container.querySelectorAll('iframe, embed, object, video'), + _total = elements.length; + for (var i = 0; i < _total; i++) { + elements[i].style.width = '100%'; + elements[i].style.height = '100%'; + } + } + + if (t.options.setDimensions && typeof t.media.setSize === 'function') { + t.media.setSize(screen.width, screen.height); + } + + var layers = t.layers.childNodes, + total = layers.length; + for (var _i = 0; _i < total; _i++) { + layers[_i].style.width = '100%'; + layers[_i].style.height = '100%'; + } + + if (t.fullscreenBtn) { + (0, _dom.removeClass)(t.fullscreenBtn, t.options.classPrefix + 'fullscreen'); + (0, _dom.addClass)(t.fullscreenBtn, t.options.classPrefix + 'unfullscreen'); + } + + t.setControlsSize(); + t.isFullScreen = true; + + var zoomFactor = Math.min(screen.width / t.width, screen.height / t.height), + captionText = t.container.querySelector('.' + t.options.classPrefix + 'captions-text'); + if (captionText) { + captionText.style.fontSize = zoomFactor * 100 + '%'; + captionText.style.lineHeight = 'normal'; + t.container.querySelector('.' + t.options.classPrefix + 'captions-position').style.bottom = '45px'; + } + var event = (0, _general.createEvent)('enteredfullscreen', t.container); + t.container.dispatchEvent(event); + }, + + + /** + * + */ + exitFullScreen: function exitFullScreen() { + + var t = this, + isNative = t.media.rendererName !== null && t.media.rendererName.match(/(native|html5)/) !== null; + + // Prevent container from attempting to stretch a second time + clearTimeout(t.containerSizeTimeout); + + // come out of native fullscreen + if (Features.HAS_TRUE_NATIVE_FULLSCREEN && (Features.IS_FULLSCREEN || t.isFullScreen)) { + Features.cancelFullScreen(); + } + + // restore scroll bars to document + (0, _dom.removeClass)(_document2.default.documentElement, t.options.classPrefix + 'fullscreen'); + (0, _dom.removeClass)(t.container, t.options.classPrefix + 'container-fullscreen'); + + if (t.options.setDimensions) { + t.container.style.width = t.normalWidth + 'px'; + t.container.style.height = t.normalHeight + 'px'; + + if (isNative) { + t.node.style.width = t.normalWidth + 'px'; + t.node.style.height = t.normalHeight + 'px'; + } else { + var elements = t.container.querySelectorAll('iframe, embed, object, video'), + _total2 = elements.length; + for (var i = 0; i < _total2; i++) { + elements[i].style.width = t.normalWidth + 'px'; + elements[i].style.height = t.normalHeight + 'px'; + } + } + + if (typeof t.media.setSize === 'function') { + t.media.setSize(t.normalWidth, t.normalHeight); + } + + var layers = t.layers.childNodes, + total = layers.length; + for (var _i2 = 0; _i2 < total; _i2++) { + layers[_i2].style.width = t.normalWidth + 'px'; + layers[_i2].style.height = t.normalHeight + 'px'; + } + } + + (0, _dom.removeClass)(t.fullscreenBtn, t.options.classPrefix + 'unfullscreen'); + (0, _dom.addClass)(t.fullscreenBtn, t.options.classPrefix + 'fullscreen'); + + t.setControlsSize(); + t.isFullScreen = false; + + var captionText = t.container.querySelector('.' + t.options.classPrefix + 'captions-text'); + if (captionText) { + captionText.style.fontSize = ''; + captionText.style.lineHeight = ''; + t.container.querySelector('.' + t.options.classPrefix + 'captions-position').style.bottom = ''; + } + var event = (0, _general.createEvent)('exitedfullscreen', t.container); + t.container.dispatchEvent(event); + } +}); + +},{"16":16,"2":2,"23":23,"24":24,"25":25,"3":3,"4":4}],9:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _general = _dereq_(25); + +var _dom = _dereq_(24); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Play/Pause button + * + * This feature enables the displaying of a Play button in the control bar, and also contains logic to toggle its state + * between paused and playing. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * @type {?String} + */ + playText: null, + /** + * @type {?String} + */ + pauseText: null +}); + +Object.assign(_player2.default.prototype, { + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + * @public + */ + buildplaypause: function buildplaypause(player, controls, layers, media) { + + var t = this, + op = t.options, + playTitle = (0, _general.isString)(op.playText) ? op.playText : _i18n2.default.t('mejs.play'), + pauseTitle = (0, _general.isString)(op.pauseText) ? op.pauseText : _i18n2.default.t('mejs.pause'), + play = _document2.default.createElement('div'); + + play.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'playpause-button ' + t.options.classPrefix + 'play'; + play.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + playTitle + '" aria-label="' + pauseTitle + '" tabindex="0"></button>'; + play.addEventListener('click', function () { + if (media.paused) { + media.play(); + } else { + media.pause(); + } + }); + + var playBtn = play.querySelector('button'); + t.addControlElement(play, 'playpause'); + + /** + * @private + * @param {String} which - token to determine new state of button + */ + function togglePlayPause(which) { + if ('play' === which) { + (0, _dom.removeClass)(play, t.options.classPrefix + 'play'); + (0, _dom.removeClass)(play, t.options.classPrefix + 'replay'); + (0, _dom.addClass)(play, t.options.classPrefix + 'pause'); + playBtn.setAttribute('title', pauseTitle); + playBtn.setAttribute('aria-label', pauseTitle); + } else { + + (0, _dom.removeClass)(play, t.options.classPrefix + 'pause'); + (0, _dom.removeClass)(play, t.options.classPrefix + 'replay'); + (0, _dom.addClass)(play, t.options.classPrefix + 'play'); + playBtn.setAttribute('title', playTitle); + playBtn.setAttribute('aria-label', playTitle); + } + } + + togglePlayPause('pse'); + + media.addEventListener('loadedmetadata', function () { + togglePlayPause('pse'); + }); + + media.addEventListener('play', function () { + togglePlayPause('play'); + }); + media.addEventListener('playing', function () { + togglePlayPause('play'); + }); + + media.addEventListener('pause', function () { + togglePlayPause('pse'); + }); + media.addEventListener('paused', function () { + togglePlayPause('pse'); + }); + + media.addEventListener('ended', function () { + + if (!player.options.loop) { + (0, _dom.removeClass)(play, t.options.classPrefix + 'pause'); + (0, _dom.removeClass)(play, t.options.classPrefix + 'play'); + (0, _dom.addClass)(play, t.options.classPrefix + 'replay'); + playBtn.setAttribute('title', playTitle); + playBtn.setAttribute('aria-label', playTitle); + } + }); + } +}); + +},{"16":16,"2":2,"24":24,"25":25,"4":4}],10:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _constants = _dereq_(23); + +var _time = _dereq_(28); + +var _dom = _dereq_(24); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Progress/loaded bar + * + * This feature creates a progress bar with a slider in the control bar, and updates it based on native events. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * Enable tooltip that shows time in progress bar + * @type {Boolean} + */ + enableProgressTooltip: true +}); + +Object.assign(_player2.default.prototype, { + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildprogress: function buildprogress(player, controls, layers, media) { + + var lastKeyPressTime = 0, + mouseIsDown = false, + startedPaused = false; + + var t = this, + autoRewindInitial = player.options.autoRewind, + tooltip = player.options.enableProgressTooltip ? '<span class="' + t.options.classPrefix + 'time-float">' + ('<span class="' + t.options.classPrefix + 'time-float-current">00:00</span>') + ('<span class="' + t.options.classPrefix + 'time-float-corner"></span>') + '</span>' : "", + rail = _document2.default.createElement('div'); + + rail.className = t.options.classPrefix + 'time-rail'; + rail.innerHTML = '<span class="' + t.options.classPrefix + 'time-total ' + t.options.classPrefix + 'time-slider">' + ('<span class="' + t.options.classPrefix + 'time-buffering"></span>') + ('<span class="' + t.options.classPrefix + 'time-loaded"></span>') + ('<span class="' + t.options.classPrefix + 'time-current"></span>') + ('<span class="' + t.options.classPrefix + 'time-handle"></span>') + ('' + tooltip) + '</span>'; + + t.addControlElement(rail, 'progress'); + + controls.querySelector('.' + t.options.classPrefix + 'time-buffering').style.display = 'none'; + + t.rail = controls.querySelector('.' + t.options.classPrefix + 'time-rail'); + t.total = controls.querySelector('.' + t.options.classPrefix + 'time-total'); + t.loaded = controls.querySelector('.' + t.options.classPrefix + 'time-loaded'); + t.current = controls.querySelector('.' + t.options.classPrefix + 'time-current'); + t.handle = controls.querySelector('.' + t.options.classPrefix + 'time-handle'); + t.timefloat = controls.querySelector('.' + t.options.classPrefix + 'time-float'); + t.timefloatcurrent = controls.querySelector('.' + t.options.classPrefix + 'time-float-current'); + t.slider = controls.querySelector('.' + t.options.classPrefix + 'time-slider'); + t.newTime = 0; + t.forcedHandlePause = false; + + /** + * + * @private + * @param {Event} e + */ + var handleMouseMove = function handleMouseMove(e) { + + var totalStyles = getComputedStyle(t.total), + offsetStyles = (0, _dom.offset)(t.total), + width = parseFloat(totalStyles.width); + + var percentage = 0, + pos = 0, + x = void 0; + + // mouse or touch position relative to the object + if (e.originalEvent && e.originalEvent.changedTouches) { + x = e.originalEvent.changedTouches[0].pageX; + } else if (e.changedTouches) { + // for Zepto + x = e.changedTouches[0].pageX; + } else { + x = e.pageX; + } + + if (media.duration) { + if (x < offsetStyles.left) { + x = offsetStyles.left; + } else if (x > width + offsetStyles.left) { + x = width + offsetStyles.left; + } + + pos = x - offsetStyles.left; + percentage = pos / width; + t.newTime = percentage <= 0.02 ? 0 : percentage * media.duration; + + // fake seek to where the mouse is + if (mouseIsDown && media.currentTime !== null && t.newTime.toFixed(4) !== media.currentTime.toFixed(4)) { + t.setCurrentRailHandle(t.newTime); + t.updateCurrent(t.newTime); + } + + // position floating time box + if (!_constants.IS_IOS && !_constants.IS_ANDROID && t.timefloat) { + t.timefloat.style.left = pos + 'px'; + t.timefloatcurrent.innerHTML = (0, _time.secondsToTimeCode)(t.newTime, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength); + t.timefloat.style.display = 'block'; + } + } + }, + + /** + * Update elements in progress bar for accessibility purposes only when player is paused. + * + * This is to avoid attempts to repeat the time over and over again when media is playing. + * @private + */ + updateSlider = function updateSlider() { + + var seconds = media.currentTime, + timeSliderText = _i18n2.default.t('mejs.time-slider'), + time = (0, _time.secondsToTimeCode)(seconds, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength), + duration = media.duration; + + t.slider.setAttribute('role', 'slider'); + t.slider.tabIndex = 0; + + if (media.paused) { + t.slider.setAttribute('aria-label', timeSliderText); + t.slider.setAttribute('aria-valuemin', 0); + t.slider.setAttribute('aria-valuemax', duration); + t.slider.setAttribute('aria-valuenow', seconds); + t.slider.setAttribute('aria-valuetext', time); + } else { + t.slider.removeAttribute('aria-label'); + t.slider.removeAttribute('aria-valuemin'); + t.slider.removeAttribute('aria-valuemax'); + t.slider.removeAttribute('aria-valuenow'); + t.slider.removeAttribute('aria-valuetext'); + } + }, + + /** + * + * @private + */ + restartPlayer = function restartPlayer() { + var now = new Date(); + if (now - lastKeyPressTime >= 1000) { + media.play(); + } + }, + handleMouseup = function handleMouseup() { + + if (mouseIsDown && media.currentTime !== null && t.newTime.toFixed(4) !== media.currentTime.toFixed(4)) { + media.setCurrentTime(t.newTime); + player.setCurrentRail(); + t.updateCurrent(t.newTime); + } + if (t.forcedHandlePause) { + t.media.play(); + } + t.forcedHandlePause = false; + }; + + // Events + t.slider.addEventListener('focus', function () { + player.options.autoRewind = false; + }); + t.slider.addEventListener('blur', function () { + player.options.autoRewind = autoRewindInitial; + }); + t.slider.addEventListener('keydown', function (e) { + + if (new Date() - lastKeyPressTime >= 1000) { + startedPaused = media.paused; + } + + if (t.options.keyActions.length) { + + var keyCode = e.which || e.keyCode || 0, + duration = media.duration, + seekForward = player.options.defaultSeekForwardInterval(media), + seekBackward = player.options.defaultSeekBackwardInterval(media); + + var seekTime = media.currentTime; + + switch (keyCode) { + case 37: // left + case 40: + // Down + if (media.duration !== Infinity) { + seekTime -= seekBackward; + } + break; + case 39: // Right + case 38: + // Up + if (media.duration !== Infinity) { + seekTime += seekForward; + } + break; + case 36: + // Home + seekTime = 0; + break; + case 35: + // end + seekTime = duration; + break; + case 32: + // space + if (!_constants.IS_FIREFOX) { + if (media.paused) { + media.play(); + } else { + media.pause(); + } + } + return; + case 13: + // enter + if (media.paused) { + media.play(); + } else { + media.pause(); + } + return; + default: + return; + } + + seekTime = seekTime < 0 ? 0 : seekTime >= duration ? duration : Math.floor(seekTime); + lastKeyPressTime = new Date(); + if (!startedPaused) { + media.pause(); + } + + if (seekTime < media.duration && !startedPaused) { + setTimeout(restartPlayer, 1100); + } + + media.setCurrentTime(seekTime); + + e.preventDefault(); + e.stopPropagation(); + } + }); + + var events = ['mousedown', 'touchstart']; + + // Required to manipulate mouse movements that require drag 'n' drop properly + t.slider.addEventListener('dragstart', function () { + return false; + }); + + for (var i = 0, total = events.length; i < total; i++) { + t.slider.addEventListener(events[i], function (e) { + t.forcedHandlePause = false; + if (media.duration !== Infinity) { + // only handle left clicks or touch + if (e.which === 1 || e.which === 0) { + + if (!media.paused) { + t.media.pause(); + t.forcedHandlePause = true; + } + + mouseIsDown = true; + handleMouseMove(e); + t.globalBind('mousemove.dur touchmove.dur', function (event) { + var target = event.target; + if (target === t.slider || target.closest('.' + t.options.classPrefix + 'time-slider')) { + handleMouseMove(event); + } + }); + t.globalBind('mouseup.dur touchend.dur', function () { + handleMouseup(); + mouseIsDown = false; + if (t.timefloat) { + t.timefloat.style.display = 'none'; + } + t.globalUnbind('mousemove.dur touchmove.dur mouseup.dur touchend.dur'); + }); + } + } + }); + } + t.slider.addEventListener('mouseenter', function (e) { + if (e.target === t.slider && media.duration !== Infinity) { + t.globalBind('mousemove.dur', function (event) { + var target = event.target; + if (target === t.slider || target.closest('.' + t.options.classPrefix + 'time-slider')) { + handleMouseMove(event); + } + }); + if (t.timefloat && !_constants.IS_IOS && !_constants.IS_ANDROID) { + t.timefloat.style.display = 'block'; + } + } + }); + t.slider.addEventListener('mouseleave', function () { + if (media.duration !== Infinity) { + if (!mouseIsDown) { + t.globalUnbind('mousemove.dur'); + if (t.timefloat) { + t.timefloat.style.display = 'none'; + } + } + } + }); + + // loading + // If media is does not have a finite duration, remove progress bar interaction + // and indicate that is a live broadcast + media.addEventListener('progress', function (e) { + var broadcast = controls.querySelector('.' + t.options.classPrefix + 'broadcast'); + if (media.duration !== Infinity) { + if (broadcast) { + t.slider.style.display = ''; + broadcast.remove(); + } + + player.setProgressRail(e); + if (!t.forcedHandlePause) { + player.setCurrentRail(e); + } + } else if (!broadcast) { + var label = _document2.default.createElement('span'); + label.className = t.options.classPrefix + 'broadcast'; + label.innerText = _i18n2.default.t('mejs.live-broadcast'); + t.slider.style.display = 'none'; + } + }); + + // current time + media.addEventListener('timeupdate', function (e) { + var broadcast = controls.querySelector('.' + t.options.classPrefix + 'broadcast'); + if (media.duration !== Infinity) { + if (broadcast) { + t.slider.style.display = ''; + broadcast.remove(); + } + + player.setProgressRail(e); + if (!t.forcedHandlePause) { + player.setCurrentRail(e); + } + updateSlider(e); + } else if (!broadcast) { + var label = _document2.default.createElement('span'); + label.className = t.options.classPrefix + 'broadcast'; + label.innerText = _i18n2.default.t('mejs.live-broadcast'); + controls.querySelector('.' + t.options.classPrefix + 'time-rail').appendChild(label); + t.slider.style.display = 'none'; + } + }); + + t.container.addEventListener('controlsresize', function (e) { + if (media.duration !== Infinity) { + player.setProgressRail(e); + if (!t.forcedHandlePause) { + player.setCurrentRail(e); + } + } + }); + }, + + + /** + * Calculate the progress on the media and update progress bar's width + * + * @param {Event} e + */ + setProgressRail: function setProgressRail(e) { + + var percent = null; + + var t = this, + target = e !== undefined ? e.target : t.media; + + // newest HTML5 spec has buffered array (FF4, Webkit) + if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) { + // account for a real array with multiple values - always read the end of the last buffer + percent = target.buffered.end(target.buffered.length - 1) / target.duration; + } + // Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end() + // to be anything other than 0. If the byte count is available we use this instead. + // Browsers that support the else if do not seem to have the bufferedBytes value and + // should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8. + else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) { + percent = target.bufferedBytes / target.bytesTotal; + } + // Firefox 3 with an Ogg file seems to go this way + else if (e && e.lengthComputable && e.total !== 0) { + percent = e.loaded / e.total; + } + + // finally update the progress bar + if (percent !== null) { + percent = Math.min(1, Math.max(0, percent)); + // update loaded bar + if (t.loaded && t.total) { + t.loaded.style.width = percent * 100 + '%'; + } + } + }, + + /** + * Update the slider's width depending on the time assigned + * + * @param {Number} fakeTime + */ + setCurrentRailHandle: function setCurrentRailHandle(fakeTime) { + var t = this; + t.setCurrentRailMain(t, fakeTime); + }, + + /** + * Update the slider's width depending on the current time + * + */ + setCurrentRail: function setCurrentRail() { + var t = this; + t.setCurrentRailMain(t); + }, + + /** + * Method that handles the calculation of the width of the rail. + * + * @param {MediaElementPlayer} t + * @param {?Number} fakeTime + */ + setCurrentRailMain: function setCurrentRailMain(t, fakeTime) { + if (t.media.currentTime !== undefined && t.media.duration) { + var nTime = typeof fakeTime === 'undefined' ? t.media.currentTime : fakeTime; + + // update bar and handle + if (t.total && t.handle) { + var newWidth = Math.round(parseFloat(getComputedStyle(t.total).width) * nTime / t.media.duration), + handlePos = newWidth - Math.round(t.handle.offsetWidth / 2); + + newWidth = nTime / t.media.duration * 100; + t.current.style.width = newWidth + '%'; + t.handle.style.left = handlePos + 'px'; + } + } + } +}); + +},{"16":16,"2":2,"23":23,"24":24,"28":28,"4":4}],11:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _time = _dereq_(28); + +var _dom = _dereq_(24); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Current/duration times + * + * This feature creates/updates the duration and progress times in the control bar, based on native events. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * The initial duration + * @type {Number} + */ + duration: 0, + /** + * @type {String} + */ + timeAndDurationSeparator: '<span> | </span>' +}); + +Object.assign(_player2.default.prototype, { + + /** + * Current time constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildcurrent: function buildcurrent(player, controls, layers, media) { + var t = this, + time = _document2.default.createElement('div'); + + time.className = t.options.classPrefix + 'time'; + time.setAttribute('role', 'timer'); + time.setAttribute('aria-live', 'off'); + time.innerHTML = '<span class="' + t.options.classPrefix + 'currenttime">' + (0, _time.secondsToTimeCode)(0, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength) + '</span>'; + + t.addControlElement(time, 'current'); + + media.addEventListener('timeupdate', function () { + if (t.controlsAreVisible) { + player.updateCurrent(); + } + }); + }, + + + /** + * Duration time constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildduration: function buildduration(player, controls, layers, media) { + + var t = this, + currTime = controls.lastChild.querySelector('.' + t.options.classPrefix + 'currenttime'); + + if (currTime) { + controls.querySelector('.' + t.options.classPrefix + 'time').innerHTML += t.options.timeAndDurationSeparator + '<span class="' + t.options.classPrefix + 'duration">' + ((0, _time.secondsToTimeCode)(t.options.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength) + '</span>'); + } else { + + // add class to current time + if (controls.querySelector('.' + t.options.classPrefix + 'currenttime')) { + (0, _dom.addClass)(controls.querySelector('.' + t.options.classPrefix + 'currenttime').parentNode, t.options.classPrefix + 'currenttime-container'); + } + + var duration = _document2.default.createElement('div'); + duration.className = t.options.classPrefix + 'time ' + t.options.classPrefix + 'duration-container'; + duration.innerHTML = '<span class="' + t.options.classPrefix + 'duration">' + ((0, _time.secondsToTimeCode)(t.options.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength) + '</span>'); + + t.addControlElement(duration, 'duration'); + } + + media.addEventListener('timeupdate', function () { + if (t.controlsAreVisible) { + player.updateDuration(); + } + }); + }, + + + /** + * Update the current time and output it in format 00:00 + * + */ + updateCurrent: function updateCurrent() { + var t = this; + + var currentTime = t.media.currentTime; + + if (isNaN(currentTime)) { + currentTime = 0; + } + + if (t.controls.querySelector('.' + t.options.classPrefix + 'currenttime')) { + t.controls.querySelector('.' + t.options.classPrefix + 'currenttime').innerText = (0, _time.secondsToTimeCode)(currentTime, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength); + } + }, + + + /** + * Update the duration time and output it in format 00:00 + * + */ + updateDuration: function updateDuration() { + var t = this; + + var duration = t.media.duration; + + if (isNaN(duration) || duration === Infinity || duration < 0) { + t.media.duration = t.options.duration = duration = 0; + } + + if (t.options.duration > 0) { + duration = t.options.duration; + } + + var timecode = (0, _time.secondsToTimeCode)(duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength); + + // Toggle long-video class if time code is >5 digits (MM:SS) + if (timecode.length > 5) { + (0, _dom.toggleClass)(t.container, t.options.classPrefix + 'long-video'); + } + + if (t.controls.querySelector('.' + t.options.classPrefix + 'duration') && duration > 0) { + t.controls.querySelector('.' + t.options.classPrefix + 'duration').innerHTML = timecode; + } + } +}); + +},{"16":16,"2":2,"24":24,"28":28}],12:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _time = _dereq_(28); + +var _general = _dereq_(25); + +var _dom = _dereq_(24); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Closed Captions (CC) button + * + * This feature enables the displaying of a CC button in the control bar, and also contains the methods to start media + * with a certain language (if available), toggle captions, etc. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * Default language to start media using ISO 639-2 Language Code List (en, es, it, etc.) + * If there are multiple tracks for one language, the last track node found is activated + * @see https://www.loc.gov/standards/iso639-2/php/code_list.php + * @type {String} + */ + startLanguage: '', + /** + * @type {?String} + */ + tracksText: null, + /** + * @type {?String} + */ + chaptersText: null, + /** + * Avoid to screen reader speak captions over an audio track. + * + * @type {Boolean} + */ + tracksAriaLive: false, + /** + * Remove the [cc] button when no track nodes are present + * @type {Boolean} + */ + hideCaptionsButtonWhenEmpty: true, + /** + * Change captions to pop-up if true and only one track node is found + * @type {Boolean} + */ + toggleCaptionsButtonWhenOnlyOne: false, + /** + * @type {String} + */ + slidesSelector: '' +}); + +Object.assign(_player2.default.prototype, { + + /** + * @type {Boolean} + */ + hasChapters: false, + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildtracks: function buildtracks(player, controls, layers, media) { + if (player.tracks.length === 0) { + return; + } + + var t = this, + attr = t.options.tracksAriaLive ? ' role="log" aria-live="assertive" aria-atomic="false"' : '', + tracksTitle = (0, _general.isString)(t.options.tracksText) ? t.options.tracksText : _i18n2.default.t('mejs.captions-subtitles'), + chaptersTitle = (0, _general.isString)(t.options.chaptersText) ? t.options.chaptersText : _i18n2.default.t('mejs.captions-chapters'), + total = player.tracks.length; + + // If browser will do native captions, prefer mejs captions, loop through tracks and hide + if (t.domNode.textTracks) { + for (var i = t.domNode.textTracks.length - 1; i >= 0; i--) { + t.domNode.textTracks[i].mode = 'hidden'; + } + } + + t.cleartracks(player); + + player.captions = _document2.default.createElement('div'); + player.captions.className = t.options.classPrefix + 'captions-layer ' + t.options.classPrefix + 'layer'; + player.captions.innerHTML = '<div class="' + t.options.classPrefix + 'captions-position ' + t.options.classPrefix + 'captions-position-hover"' + attr + '>' + ('<span class="' + t.options.classPrefix + 'captions-text"></span>') + '</div>'; + player.captions.style.display = 'none'; + layers.insertBefore(player.captions, layers.firstChild); + + player.captionsText = player.captions.querySelector('.' + t.options.classPrefix + 'captions-text'); + + player.captionsButton = _document2.default.createElement('div'); + player.captionsButton.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'captions-button'; + player.captionsButton.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + tracksTitle + '" aria-label="' + tracksTitle + '" tabindex="0"></button>' + ('<div class="' + t.options.classPrefix + 'captions-selector ' + t.options.classPrefix + 'offscreen">') + ('<ul class="' + t.options.classPrefix + 'captions-selector-list">') + ('<li class="' + t.options.classPrefix + 'captions-selector-list-item">') + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + player.id + '_captions" id="' + player.id + '_captions_none" ') + 'value="none" checked disabled>' + ('<label class="' + t.options.classPrefix + 'captions-selector-label ') + (t.options.classPrefix + 'captions-selected" ') + ('for="' + player.id + '_captions_none">' + _i18n2.default.t('mejs.none') + '</label>') + '</li>' + '</ul>' + '</div>'; + + t.addControlElement(player.captionsButton, 'tracks'); + + player.captionsButton.querySelector('.' + t.options.classPrefix + 'captions-selector-list-item').disabled = false; + + player.chaptersButton = _document2.default.createElement('div'); + player.chaptersButton.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'chapters-button'; + player.chaptersButton.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + chaptersTitle + '" aria-label="' + chaptersTitle + '" tabindex="0"></button>' + ('<div class="' + t.options.classPrefix + 'chapters-selector ' + t.options.classPrefix + 'offscreen">') + ('<ul class="' + t.options.classPrefix + 'chapters-selector-list"></ul>') + '</div>'; + + var subtitleCount = 0; + + for (var _i = 0; _i < total; _i++) { + var kind = player.tracks[_i].kind; + if (kind === 'subtitles' || kind === 'captions') { + subtitleCount++; + } else if (kind === 'chapters' && !controls.querySelector('.' + t.options.classPrefix + 'chapter-selector')) { + player.captionsButton.parentNode.insertBefore(player.chaptersButton, player.captionsButton); + } + } + + player.trackToLoad = -1; + player.selectedTrack = null; + player.isLoadingTrack = false; + + // add to list + for (var _i2 = 0; _i2 < total; _i2++) { + var _kind = player.tracks[_i2].kind; + if (_kind === 'subtitles' || _kind === 'captions') { + player.addTrackButton(player.tracks[_i2].trackId, player.tracks[_i2].srclang, player.tracks[_i2].label); + } + } + + // start loading tracks + player.loadNextTrack(); + + var inEvents = ['mouseenter', 'focusin'], + outEvents = ['mouseleave', 'focusout']; + + // if only one language then just make the button a toggle + if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount === 1) { + // click + player.captionsButton.addEventListener('click', function () { + var trackId = 'none'; + if (player.selectedTrack === null) { + trackId = player.tracks[0].trackId; + } + player.setTrack(trackId); + }); + } else { + var labels = player.captionsButton.querySelectorAll('.' + t.options.classPrefix + 'captions-selector-label'), + captions = player.captionsButton.querySelectorAll('input[type=radio]'); + // hover or keyboard focus + for (var _i3 = 0, _total = inEvents.length; _i3 < _total; _i3++) { + player.captionsButton.addEventListener(inEvents[_i3], function () { + (0, _dom.removeClass)(this.querySelector('.' + t.options.classPrefix + 'captions-selector'), t.options.classPrefix + 'offscreen'); + }); + } + + for (var _i4 = 0, _total2 = outEvents.length; _i4 < _total2; _i4++) { + player.captionsButton.addEventListener(outEvents[_i4], function () { + (0, _dom.addClass)(this.querySelector('.' + t.options.classPrefix + 'captions-selector'), t.options.classPrefix + 'offscreen'); + }); + } + + // handle clicks to the language radio buttons + for (var _i5 = 0, _total3 = captions.length; _i5 < _total3; _i5++) { + captions[_i5].addEventListener('click', function () { + // value is trackId, same as the actual id, and we're using it here + // because the "none" checkbox doesn't have a trackId + // to use, but we want to know when "none" is clicked + player.setTrack(this.value); + }); + } + + for (var _i6 = 0, _total4 = labels.length; _i6 < _total4; _i6++) { + labels[_i6].addEventListener('click', function () { + var radio = (0, _dom.siblings)(this, function (el) { + return el.tagName === 'INPUT'; + })[0], + event = (0, _general.createEvent)('click', radio); + radio.dispatchEvent(event); + }); + } + + //Allow up/down arrow to change the selected radio without changing the volume. + player.captionsButton.addEventListener('keydown', function (e) { + e.stopPropagation(); + }); + } + + for (var _i7 = 0, _total5 = inEvents.length; _i7 < _total5; _i7++) { + player.chaptersButton.addEventListener(inEvents[_i7], function () { + if (this.querySelector('.' + t.options.classPrefix + 'chapters-selector-list').childNodes.length) { + (0, _dom.removeClass)(this.querySelector('.' + t.options.classPrefix + 'chapters-selector'), t.options.classPrefix + 'offscreen'); + } + }); + } + + for (var _i8 = 0, _total6 = outEvents.length; _i8 < _total6; _i8++) { + player.chaptersButton.addEventListener(outEvents[_i8], function () { + (0, _dom.addClass)(this.querySelector('.' + t.options.classPrefix + 'chapters-selector'), t.options.classPrefix + 'offscreen'); + }); + } + + //Allow up/down arrow to change the selected radio without changing the volume. + player.chaptersButton.addEventListener('keydown', function (e) { + e.stopPropagation(); + }); + + if (!player.options.alwaysShowControls) { + // move with controls + player.container.addEventListener('controlsshown', function () { + // push captions above controls + (0, _dom.addClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover'); + }); + + player.container.addEventListener('controlshidden', function () { + if (!media.paused) { + // move back to normal place + (0, _dom.removeClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover'); + } + }); + } else { + (0, _dom.addClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover'); + } + + media.addEventListener('timeupdate', function () { + player.displayCaptions(); + }); + + if (player.options.slidesSelector !== '') { + player.slidesContainer = _document2.default.querySelectorAll(player.options.slidesSelector); + + media.addEventListener('timeupdate', function () { + player.displaySlides(); + }); + } + }, + + + /** + * Feature destructor. + * + * Always has to be prefixed with `clean` and the name that was used in MepDefaults.features list + * @param {MediaElementPlayer} player + */ + cleartracks: function cleartracks(player) { + if (player) { + if (player.captions) { + player.captions.remove(); + } + if (player.chapters) { + player.chapters.remove(); + } + if (player.captionsText) { + player.captionsText.remove(); + } + if (player.captionsButton) { + player.captionsButton.remove(); + } + if (player.chaptersButton) { + player.chaptersButton.remove(); + } + } + }, + rebuildtracks: function rebuildtracks() { + var t = this; + t.findTracks(); + t.buildtracks(t, t.controls, t.layers, t.media); + }, + findTracks: function findTracks() { + var t = this, + tracktags = t.node.querySelectorAll('track'), + total = tracktags.length; + + // store for use by plugins + t.tracks = []; + for (var i = 0; i < total; i++) { + var track = tracktags[i], + srclang = track.getAttribute('srclang').toLowerCase() || '', + trackId = t.id + '_track_' + i + '_' + track.getAttribute('kind') + '_' + srclang; + t.tracks.push({ + trackId: trackId, + srclang: srclang, + src: track.getAttribute('src'), + kind: track.getAttribute('kind'), + label: track.getAttribute('label') || '', + entries: [], + isLoaded: false + }); + } + }, + + + /** + * + * @param {String} trackId, or "none" to disable captions + */ + setTrack: function setTrack(trackId) { + + var t = this, + radios = t.captionsButton.querySelectorAll('input[type="radio"]'), + captions = t.captionsButton.querySelectorAll('.' + t.options.classPrefix + 'captions-selected'), + track = t.captionsButton.querySelector('input[value="' + trackId + '"]'); + + for (var i = 0, total = radios.length; i < total; i++) { + radios[i].checked = false; + } + + for (var _i9 = 0, _total7 = captions.length; _i9 < _total7; _i9++) { + (0, _dom.removeClass)(captions[_i9], t.options.classPrefix + 'captions-selected'); + } + + track.checked = true; + var labels = (0, _dom.siblings)(track, function (el) { + return (0, _dom.hasClass)(el, t.options.classPrefix + 'captions-selector-label'); + }); + for (var _i10 = 0, _total8 = labels.length; _i10 < _total8; _i10++) { + (0, _dom.addClass)(labels[_i10], t.options.classPrefix + 'captions-selected'); + } + + if (trackId === 'none') { + t.selectedTrack = null; + (0, _dom.removeClass)(t.captionsButton, t.options.classPrefix + 'captions-enabled'); + } else { + for (var _i11 = 0, _total9 = t.tracks.length; _i11 < _total9; _i11++) { + var _track = t.tracks[_i11]; + if (_track.trackId === trackId) { + if (t.selectedTrack === null) { + (0, _dom.addClass)(t.captionsButton, t.options.classPrefix + 'captions-enabled'); + } + t.selectedTrack = _track; + t.captions.setAttribute('lang', t.selectedTrack.srclang); + t.displayCaptions(); + break; + } + } + } + + var event = (0, _general.createEvent)('captionschange', t.media); + event.detail.caption = t.selectedTrack; + t.media.dispatchEvent(event); + }, + + + /** + * + */ + loadNextTrack: function loadNextTrack() { + var t = this; + + t.trackToLoad++; + if (t.trackToLoad < t.tracks.length) { + t.isLoadingTrack = true; + t.loadTrack(t.trackToLoad); + } else { + // add done? + t.isLoadingTrack = false; + t.checkForTracks(); + } + }, + + + /** + * + * @param index + */ + loadTrack: function loadTrack(index) { + var t = this, + track = t.tracks[index]; + + if (track !== undefined && (track.src !== undefined || track.src !== "")) { + (0, _dom.ajax)(track.src, 'text', function (d) { + + // parse the loaded file + track.entries = typeof d === 'string' && /<tt\s+xml/ig.exec(d) ? _mejs2.default.TrackFormatParser.dfxp.parse(d) : _mejs2.default.TrackFormatParser.webvtt.parse(d); + + track.isLoaded = true; + + t.enableTrackButton(track); + t.loadNextTrack(); + + if (track.kind === 'slides') { + t.setupSlides(track); + } + // Load by default the first track with `chapters` kind + else if (track.kind === 'chapters' && !t.hasChapters) { + t.drawChapters(track); + t.hasChapters = true; + } + }, function () { + t.removeTrackButton(track.trackId); + t.loadNextTrack(); + }); + } + }, + + + /** + * + * @param {String} track - The language code + */ + enableTrackButton: function enableTrackButton(track) { + var t = this, + lang = track.srclang, + target = _document2.default.getElementById('' + track.trackId); + + if (!target) { + return; + } + + var label = track.label; + + if (label === '') { + label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang; + } + target.disabled = false; + var targetSiblings = (0, _dom.siblings)(target, function (el) { + return (0, _dom.hasClass)(el, t.options.classPrefix + 'captions-selector-label'); + }); + for (var i = 0, total = targetSiblings.length; i < total; i++) { + targetSiblings[i].innerHTML = label; + } + + // auto select + if (t.options.startLanguage === lang) { + target.checked = true; + var event = (0, _general.createEvent)('click', target); + target.dispatchEvent(event); + } + }, + + + /** + * + * @param {String} trackId + */ + removeTrackButton: function removeTrackButton(trackId) { + + var element = _document2.default.getElementById('' + trackId); + + if (element) { + var button = element.closest('li'); + if (button) { + button.remove(); + } + } + }, + + + /** + * + * @param {String} trackId + * @param {String} lang - The language code + * @param {String} label + */ + addTrackButton: function addTrackButton(trackId, lang, label) { + var t = this; + if (label === '') { + label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang; + } + + // trackId is used in the value, too, because the "none" + // caption option doesn't have a trackId but we need to be able + // to set it, too + t.captionsButton.querySelector('ul').innerHTML += '<li class="' + t.options.classPrefix + 'captions-selector-list-item">' + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + t.id + '_captions" id="' + trackId + '" value="' + trackId + '" disabled>') + ('<label class="' + t.options.classPrefix + 'captions-selector-label">' + label + ' (loading)</label>') + '</li>'; + }, + + + /** + * + */ + checkForTracks: function checkForTracks() { + var t = this; + + var hasSubtitles = false; + + // check if any subtitles + if (t.options.hideCaptionsButtonWhenEmpty) { + for (var i = 0, total = t.tracks.length; i < total; i++) { + var kind = t.tracks[i].kind; + if ((kind === 'subtitles' || kind === 'captions') && t.tracks[i].isLoaded) { + hasSubtitles = true; + break; + } + } + + t.captionsButton.style.display = hasSubtitles ? '' : 'none'; + t.setControlsSize(); + } + }, + + + /** + * + */ + displayCaptions: function displayCaptions() { + + if (this.tracks === undefined) { + return; + } + + var t = this, + track = t.selectedTrack, + sanitize = function sanitize(html) { + + var div = _document2.default.createElement('div'); + div.innerHTML = html; + + // Remove all `<script>` tags first + var scripts = div.getElementsByTagName('script'); + var i = scripts.length; + while (i--) { + scripts[i].remove(); + } + + // Loop the elements and remove anything that contains value="javascript:" or an `on*` attribute + // (`onerror`, `onclick`, etc.) + var allElements = div.getElementsByTagName('*'); + for (var _i12 = 0, n = allElements.length; _i12 < n; _i12++) { + var attributesObj = allElements[_i12].attributes, + attributes = Array.prototype.slice.call(attributesObj); + + for (var j = 0, total = attributes.length; j < total; j++) { + if (attributes[j].name.startsWith('on') || attributes[j].value.startsWith('javascript')) { + allElements[_i12].remove(); + } else if (attributes[j].name === 'style') { + allElements[_i12].removeAttribute(attributes[j].name); + } + } + } + return div.innerHTML; + }; + + if (track !== null && track.isLoaded) { + var i = t.searchTrackPosition(track.entries, t.media.currentTime); + if (i > -1) { + // Set the line before the timecode as a class so the cue can be targeted if needed + t.captionsText.innerHTML = sanitize(track.entries[i].text); + t.captionsText.className = t.options.classPrefix + 'captions-text ' + (track.entries[i].identifier || ''); + t.captions.style.display = ''; + t.captions.style.height = '0px'; + return; // exit out if one is visible; + } + + t.captions.style.display = 'none'; + } else { + t.captions.style.display = 'none'; + } + }, + + + /** + * + * @param {HTMLElement} track + */ + setupSlides: function setupSlides(track) { + var t = this; + + t.slides = track; + t.slides.entries.imgs = [t.slides.entries.length]; + t.showSlide(0); + }, + + + /** + * + * @param {Number} index + */ + showSlide: function showSlide(index) { + var _this = this; + + var t = this; + + if (t.tracks === undefined || t.slidesContainer === undefined) { + return; + } + + var url = t.slides.entries[index].text; + + var img = t.slides.entries[index].imgs; + + if (img === undefined || img.fadeIn === undefined) { + (function () { + + var image = _document2.default.createElement('img'); + image.src = url; + image.addEventListener('load', function () { + var self = _this, + visible = (0, _dom.siblings)(self, function (el) { + return visible(el); + }); + self.style.display = 'none'; + t.slidesContainer.innerHTML += self.innerHTML; + (0, _dom.fadeIn)(t.slidesContainer.querySelector(image)); + for (var i = 0, total = visible.length; i < total; i++) { + (0, _dom.fadeOut)(visible[i], 400); + } + }); + t.slides.entries[index].imgs = img = image; + })(); + } else if (!(0, _dom.visible)(img)) { + (function () { + var visible = (0, _dom.siblings)(self, function (el) { + return visible(el); + }); + (0, _dom.fadeIn)(t.slidesContainer.querySelector(img)); + for (var i = 0, total = visible.length; i < total; i++) { + (0, _dom.fadeOut)(visible[i]); + } + })(); + } + }, + + + /** + * + */ + displaySlides: function displaySlides() { + var t = this; + + if (this.slides === undefined) { + return; + } + + var slides = t.slides, + i = t.searchTrackPosition(slides.entries, t.media.currentTime); + + if (i > -1) { + t.showSlide(i); + return; // exit out if one is visible; + } + }, + + + /** + * + * @param {Object} chapters + */ + drawChapters: function drawChapters(chapters) { + var t = this, + total = chapters.entries.length; + + if (!total) { + return; + } + + t.chaptersButton.querySelector('ul').innerHTML = ''; + + for (var i = 0; i < total; i++) { + t.chaptersButton.querySelector('ul').innerHTML += '<li class="' + t.options.classPrefix + 'chapters-selector-list-item" ' + 'role="menuitemcheckbox" aria-live="polite" aria-disabled="false" aria-checked="false">' + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + t.id + '_chapters" value="' + chapters.entries[i].start + '" disabled>') + ('<label class="' + t.options.classPrefix + 'chapters-selector-label">' + chapters.entries[i].text + '</label>') + '</li>'; + } + + var radios = t.chaptersButton.querySelectorAll('input[type="radio"]'), + labels = t.chaptersButton.querySelectorAll('.' + t.options.classPrefix + 'chapters-selector-label'); + + for (var _i13 = 0, _total10 = radios.length; _i13 < _total10; _i13++) { + radios[_i13].disabled = false; + radios[_i13].checked = false; + radios[_i13].addEventListener('click', function () { + var self = this, + listItems = t.chaptersButton.querySelectorAll('li'), + label = (0, _dom.siblings)(self, function (el) { + return (0, _dom.hasClass)(el, t.options.classPrefix + 'chapters-selector-label'); + })[0]; + + self.checked = true; + self.parentNode.setAttribute('aria-checked', true); + (0, _dom.addClass)(label, t.options.classPrefix + 'chapters-selected'); + (0, _dom.removeClass)(t.chaptersButton.querySelector('.' + t.options.classPrefix + 'chapters-selected'), t.options.classPrefix + 'chapters-selected'); + + for (var _i14 = 0, _total11 = listItems.length; _i14 < _total11; _i14++) { + listItems[_i14].setAttribute('aria-checked', false); + } + + t.media.setCurrentTime(parseFloat(self.value)); + if (t.media.paused) { + t.media.play(); + } + }); + } + + for (var _i15 = 0, _total12 = labels.length; _i15 < _total12; _i15++) { + labels[_i15].addEventListener('click', function () { + var radio = (0, _dom.siblings)(this, function (el) { + return el.tagName === 'INPUT'; + })[0], + event = (0, _general.createEvent)('click', radio); + radio.dispatchEvent(event); + }); + } + }, + + /** + * Perform binary search to look for proper track index + * + * @param {Object[]} tracks + * @param {Number} currentTime + * @return {Number} + */ + searchTrackPosition: function searchTrackPosition(tracks, currentTime) { + var lo = 0, + hi = tracks.length - 1, + mid = void 0, + start = void 0, + stop = void 0; + + while (lo <= hi) { + mid = lo + hi >> 1; + start = tracks[mid].start; + stop = tracks[mid].stop; + + if (currentTime >= start && currentTime < stop) { + return mid; + } else if (start < currentTime) { + lo = mid + 1; + } else if (start > currentTime) { + hi = mid - 1; + } + } + + return -1; + } +}); + +/** + * Map all possible languages with their respective code + * + * @constructor + */ +_mejs2.default.language = { + codes: { + af: 'mejs.afrikaans', + sq: 'mejs.albanian', + ar: 'mejs.arabic', + be: 'mejs.belarusian', + bg: 'mejs.bulgarian', + ca: 'mejs.catalan', + zh: 'mejs.chinese', + 'zh-cn': 'mejs.chinese-simplified', + 'zh-tw': 'mejs.chines-traditional', + hr: 'mejs.croatian', + cs: 'mejs.czech', + da: 'mejs.danish', + nl: 'mejs.dutch', + en: 'mejs.english', + et: 'mejs.estonian', + fl: 'mejs.filipino', + fi: 'mejs.finnish', + fr: 'mejs.french', + gl: 'mejs.galician', + de: 'mejs.german', + el: 'mejs.greek', + ht: 'mejs.haitian-creole', + iw: 'mejs.hebrew', + hi: 'mejs.hindi', + hu: 'mejs.hungarian', + is: 'mejs.icelandic', + id: 'mejs.indonesian', + ga: 'mejs.irish', + it: 'mejs.italian', + ja: 'mejs.japanese', + ko: 'mejs.korean', + lv: 'mejs.latvian', + lt: 'mejs.lithuanian', + mk: 'mejs.macedonian', + ms: 'mejs.malay', + mt: 'mejs.maltese', + no: 'mejs.norwegian', + fa: 'mejs.persian', + pl: 'mejs.polish', + pt: 'mejs.portuguese', + ro: 'mejs.romanian', + ru: 'mejs.russian', + sr: 'mejs.serbian', + sk: 'mejs.slovak', + sl: 'mejs.slovenian', + es: 'mejs.spanish', + sw: 'mejs.swahili', + sv: 'mejs.swedish', + tl: 'mejs.tagalog', + th: 'mejs.thai', + tr: 'mejs.turkish', + uk: 'mejs.ukrainian', + vi: 'mejs.vietnamese', + cy: 'mejs.welsh', + yi: 'mejs.yiddish' + } +}; + +/* + Parses WebVTT format which should be formatted as + ================================ + WEBVTT + + 1 + 00:00:01,1 --> 00:00:05,000 + A line of text + + 2 + 00:01:15,1 --> 00:02:05,000 + A second line of text + + =============================== + + Adapted from: http://www.delphiki.com/html5/playr + */ +_mejs2.default.TrackFormatParser = { + webvtt: { + /** + * @type {String} + */ + pattern: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/, + + /** + * + * @param {String} trackText + * @returns {{text: Array, times: Array}} + */ + parse: function parse(trackText) { + var lines = trackText.split(/\r?\n/), + entries = []; + + var timecode = void 0, + text = void 0, + identifier = void 0; + + for (var i = 0, total = lines.length; i < total; i++) { + timecode = this.pattern.exec(lines[i]); + + if (timecode && i < lines.length) { + if (i - 1 >= 0 && lines[i - 1] !== '') { + identifier = lines[i - 1]; + } + i++; + // grab all the (possibly multi-line) text that follows + text = lines[i]; + i++; + while (lines[i] !== '' && i < lines.length) { + text = text + '\n' + lines[i]; + i++; + } + text = text.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); + entries.push({ + identifier: identifier, + start: (0, _time.convertSMPTEtoSeconds)(timecode[1]) === 0 ? 0.200 : (0, _time.convertSMPTEtoSeconds)(timecode[1]), + stop: (0, _time.convertSMPTEtoSeconds)(timecode[3]), + text: text, + settings: timecode[5] + }); + } + identifier = ''; + } + return entries; + } + }, + // Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420 + dfxp: { + /** + * + * @param {String} trackText + * @returns {{text: Array, times: Array}} + */ + parse: function parse(trackText) { + trackText = $(trackText).filter('tt'); + var container = trackText.firstChild, + lines = container.querySelectorAll('p'), + styleNode = trackText.getElementById('' + container.attr('style')), + entries = []; + + var styles = void 0; + + if (styleNode.length) { + styleNode.removeAttribute('id'); + var attributes = styleNode.attributes; + if (attributes.length) { + styles = {}; + for (var i = 0, total = attributes.length; i < total; i++) { + styles[attributes[i].name.split(":")[1]] = attributes[i].value; + } + } + } + + for (var _i16 = 0, _total13 = lines.length; _i16 < _total13; _i16++) { + var style = void 0, + _temp = { + start: null, + stop: null, + style: null, + text: null + }; + + if (lines.eq(_i16).attr('begin')) { + _temp.start = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16).attr('begin')); + } + if (!_temp.start && lines.eq(_i16 - 1).attr('end')) { + _temp.start = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16 - 1).attr('end')); + } + if (lines.eq(_i16).attr('end')) { + _temp.stop = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16).attr('end')); + } + if (!_temp.stop && lines.eq(_i16 + 1).attr('begin')) { + _temp.stop = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16 + 1).attr('begin')); + } + + if (styles) { + style = ''; + for (var _style in styles) { + style += _style + ':' + styles[_style] + ';'; + } + } + if (style) { + _temp.style = style; + } + if (_temp.start === 0) { + _temp.start = 0.200; + } + _temp.text = lines.eq(_i16).innerHTML.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); + entries.push(_temp); + } + return entries; + } + } +}; + +},{"16":16,"2":2,"24":24,"25":25,"28":28,"4":4,"6":6}],13:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _constants = _dereq_(23); + +var _general = _dereq_(25); + +var _dom = _dereq_(24); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Volume button + * + * This feature enables the displaying of a Volume button in the control bar, and also contains logic to manipulate its + * events, such as sliding up/down (or left/right, if vertical), muting/unmuting media, etc. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * @type {?String} + */ + muteText: null, + /** + * @type {?String} + */ + unmuteText: null, + /** + * @type {?String} + */ + allyVolumeControlText: null, + /** + * @type {Boolean} + */ + hideVolumeOnTouchDevices: true, + /** + * @type {String} + */ + audioVolume: 'horizontal', + /** + * @type {String} + */ + videoVolume: 'vertical' +}); + +Object.assign(_player2.default.prototype, { + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + * @public + */ + buildvolume: function buildvolume(player, controls, layers, media) { + + // Android and iOS don't support volume controls + if ((_constants.IS_ANDROID || _constants.IS_IOS) && this.options.hideVolumeOnTouchDevices) { + return; + } + + var t = this, + mode = t.isVideo ? t.options.videoVolume : t.options.audioVolume, + muteText = (0, _general.isString)(t.options.muteText) ? t.options.muteText : _i18n2.default.t('mejs.mute'), + unmuteText = (0, _general.isString)(t.options.unmuteText) ? t.options.unmuteText : _i18n2.default.t('mejs.unmute'), + volumeControlText = (0, _general.isString)(t.options.allyVolumeControlText) ? t.options.allyVolumeControlText : _i18n2.default.t('mejs.volume-help-text'), + mute = _document2.default.createElement('div'); + + mute.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'volume-button ' + t.options.classPrefix + 'mute'; + mute.innerHTML = mode === 'horizontal' ? '<button type="button" aria-controls="' + t.id + '" title="' + muteText + '" aria-label="' + muteText + '" tabindex="0"></button>' : '<button type="button" aria-controls="' + t.id + '" title="' + muteText + '" aria-label="' + muteText + '" tabindex="0"></button>' + ('<a href="javascript:void(0);" class="' + t.options.classPrefix + 'volume-slider">') + ('<span class="' + t.options.classPrefix + 'offscreen">' + volumeControlText + '</span>') + ('<div class="' + t.options.classPrefix + 'volume-total">') + ('<div class="' + t.options.classPrefix + 'volume-current"></div>') + ('<div class="' + t.options.classPrefix + 'volume-handle"></div>') + '</div>' + '</a>'; + + t.addControlElement(mute, 'volume'); + + // horizontal version + if (mode === 'horizontal') { + var anchor = _document2.default.createElement('a'); + anchor.className = t.options.classPrefix + 'horizontal-volume-slider'; + anchor.href = 'javascript:void(0);'; + anchor.innerHTML += '<span class="' + t.options.classPrefix + 'offscreen">' + volumeControlText + '</span>' + ('<div class="' + t.options.classPrefix + 'horizontal-volume-total">') + ('<div class="' + t.options.classPrefix + 'horizontal-volume-current"></div>') + ('<div class="' + t.options.classPrefix + 'horizontal-volume-handle"></div>') + '</div>'; + mute.parentNode.insertBefore(anchor, mute.nextSibling); + } + + var volumeSlider = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-slider') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-slider'), + volumeTotal = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-total') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-total'), + volumeCurrent = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-current') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-current'), + volumeHandle = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-handle') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-handle'), + button = mute.firstElementChild, + + + /** + * @private + * @param {Number} volume + */ + positionVolumeHandle = function positionVolumeHandle(volume) { + + // correct to 0-1 + volume = Math.max(0, volume); + volume = Math.min(volume, 1); + + // adjust mute button style + if (volume === 0) { + (0, _dom.removeClass)(mute, t.options.classPrefix + 'mute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'unmute'); + var _button = mute.firstElementChild; + _button.setAttribute('title', unmuteText); + _button.setAttribute('aria-label', unmuteText); + } else { + (0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'mute'); + var _button2 = mute.firstElementChild; + _button2.setAttribute('title', muteText); + _button2.setAttribute('aria-label', muteText); + } + + var volumePercentage = volume * 100 + '%', + volumeStyles = getComputedStyle(volumeHandle); + + // position slider + if (mode === 'vertical') { + volumeCurrent.style.bottom = 0; + volumeCurrent.style.height = volumePercentage; + volumeHandle.style.bottom = volumePercentage; + volumeHandle.style.marginBottom = -parseFloat(volumeStyles.height) / 2 + 'px'; + } else { + volumeCurrent.style.left = 0; + volumeCurrent.style.width = volumePercentage; + volumeHandle.style.left = volumePercentage; + volumeHandle.style.marginLeft = -parseFloat(volumeStyles.width) / 2 + 'px'; + } + }, + + /** + * @private + */ + handleVolumeMove = function handleVolumeMove(e) { + + var totalOffset = (0, _dom.offset)(volumeTotal), + volumeStyles = getComputedStyle(volumeTotal); + + var volume = null; + + // calculate the new volume based on the most recent position + if (mode === 'vertical') { + + var railHeight = parseFloat(volumeStyles.height), + newY = e.pageY - totalOffset.top; + + volume = (railHeight - newY) / railHeight; + + // the controls just hide themselves (usually when mouse moves too far up) + if (totalOffset.top === 0 || totalOffset.left === 0) { + return; + } + } else { + var railWidth = parseFloat(volumeStyles.width), + newX = e.pageX - totalOffset.left; + + volume = newX / railWidth; + } + + // ensure the volume isn't outside 0-1 + volume = Math.max(0, volume); + volume = Math.min(volume, 1); + + // position the slider and handle + positionVolumeHandle(volume); + + // set the media object (this will trigger the `volumechanged` event) + if (volume === 0) { + media.setMuted(true); + } else { + media.setMuted(false); + } + media.setVolume(volume); + + e.preventDefault(); + e.stopPropagation(); + }; + + mute.addEventListener('mouseenter', function (e) { + if (e.target === mute) { + volumeSlider.style.display = 'block'; + mouseIsOver = true; + e.preventDefault(); + e.stopPropagation(); + } + }); + mute.addEventListener('focusin', function () { + volumeSlider.style.display = 'block'; + mouseIsOver = true; + }); + mute.addEventListener('mouseleave', function () { + mouseIsOver = false; + if (!mouseIsDown && mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + mute.addEventListener('focusout', function () { + mouseIsOver = false; + if (!mouseIsDown && mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + mute.addEventListener('keydown', function (e) { + + if (t.options.keyActions.length) { + var keyCode = e.which || e.keyCode || 0, + volume = media.volume; + switch (keyCode) { + case 38: + // Up + volume = Math.min(volume + 0.1, 1); + break; + case 40: + // Down + volume = Math.max(0, volume - 0.1); + break; + default: + return true; + } + + mouseIsDown = false; + positionVolumeHandle(volume); + media.setVolume(volume); + + e.preventDefault(); + e.stopPropagation(); + } + }); + + var mouseIsDown = false, + mouseIsOver = false, + + + /** + * @private + */ + updateVolumeSlider = function updateVolumeSlider() { + var volume = Math.floor(media.volume * 100); + volumeSlider.setAttribute('aria-label', _i18n2.default.t('mejs.volume-slider')); + volumeSlider.setAttribute('aria-valuemin', 0); + volumeSlider.setAttribute('aria-valuemax', 100); + volumeSlider.setAttribute('aria-valuenow', volume); + volumeSlider.setAttribute('aria-valuetext', volume + '%'); + volumeSlider.setAttribute('role', 'slider'); + volumeSlider.tabIndex = -1; + }; + + // Events + volumeSlider.addEventListener('dragstart', function () { + return false; + }); + + volumeSlider.addEventListener('mouseover', function () { + mouseIsOver = true; + }); + volumeSlider.addEventListener('mousedown', function (e) { + handleVolumeMove(e); + t.globalBind('mousemove.vol', function (event) { + var target = event.target; + if (mouseIsDown && (target === volumeSlider || target.closest(mode === 'vertical' ? '.' + t.options.classPrefix + 'volume-slider' : '.' + t.options.classPrefix + 'horizontal-volume-slider'))) { + handleVolumeMove(event); + } + }); + t.globalBind('mouseup.vol', function () { + mouseIsDown = false; + t.globalUnbind('mousemove.vol mouseup.vol'); + + if (!mouseIsOver && mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + mouseIsDown = true; + + e.preventDefault(); + e.stopPropagation(); + }); + + // MUTE button + button.addEventListener('click', function () { + media.setMuted(!media.muted); + var event = (0, _general.createEvent)('volumechange', media); + media.dispatchEvent(event); + }); + button.addEventListener('focus', function () { + if (mode === 'vertical') { + volumeSlider.style.display = 'block'; + } + }); + button.addEventListener('blur', function () { + if (mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + + // listen for volume change events from other sources + media.addEventListener('volumechange', function (e) { + if (!mouseIsDown) { + if (media.muted) { + positionVolumeHandle(0); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'mute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'unmute'); + } else { + positionVolumeHandle(media.volume); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'mute'); + } + } + updateVolumeSlider(e); + }); + + // mutes the media and sets the volume icon muted if the initial volume is set to 0 + if (player.options.startVolume === 0) { + media.setMuted(true); + } + + // shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements + var isNative = t.media.rendererName !== null && t.media.rendererName.match(/(native|html5)/) !== null; + + if (isNative) { + media.setVolume(player.options.startVolume); + } + + t.container.addEventListener('controlsresize', function () { + if (media.muted) { + positionVolumeHandle(0); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'mute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'unmute'); + } else { + positionVolumeHandle(media.volume); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'mute'); + } + }); + } +}); + +},{"16":16,"2":2,"23":23,"24":24,"25":25,"4":4}],14:[function(_dereq_,module,exports){ +'use strict'; + +/*! + * This is a `i18n` language object. + * + * English; This can serve as a template for other languages to translate + * + * @author + * TBD + * Sascha Greuel (Twitter: @SoftCreatR) + * + * @see core/i18n.js + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var EN = exports.EN = { + "mejs.plural-form": 1, + + // core/mediaelement.js + "mejs.download-file": "Download File", + + // renderers/flash.js + "mejs.install-flash": "You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/", + + // features/fullscreen.js + "mejs.fullscreen": "Fullscreen", + + // features/playpause.js + "mejs.play": "Play", + "mejs.pause": "Pause", + + // features/progress.js + "mejs.time-slider": "Time Slider", + "mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.", + "mejs.live-broadcast": "Live Broadcast", + + // features/volume.js + "mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.", + "mejs.unmute": "Unmute", + "mejs.mute": "Mute", + "mejs.volume-slider": "Volume Slider", + + // core/player.js + "mejs.video-player": "Video Player", + "mejs.audio-player": "Audio Player", + + // features/tracks.js + "mejs.captions-subtitles": "Captions/Subtitles", + "mejs.captions-chapters": "Chapters", + "mejs.none": "None", + "mejs.afrikaans": "Afrikaans", + "mejs.albanian": "Albanian", + "mejs.arabic": "Arabic", + "mejs.belarusian": "Belarusian", + "mejs.bulgarian": "Bulgarian", + "mejs.catalan": "Catalan", + "mejs.chinese": "Chinese", + "mejs.chinese-simplified": "Chinese (Simplified)", + "mejs.chinese-traditional": "Chinese (Traditional)", + "mejs.croatian": "Croatian", + "mejs.czech": "Czech", + "mejs.danish": "Danish", + "mejs.dutch": "Dutch", + "mejs.english": "English", + "mejs.estonian": "Estonian", + "mejs.filipino": "Filipino", + "mejs.finnish": "Finnish", + "mejs.french": "French", + "mejs.galician": "Galician", + "mejs.german": "German", + "mejs.greek": "Greek", + "mejs.haitian-creole": "Haitian Creole", + "mejs.hebrew": "Hebrew", + "mejs.hindi": "Hindi", + "mejs.hungarian": "Hungarian", + "mejs.icelandic": "Icelandic", + "mejs.indonesian": "Indonesian", + "mejs.irish": "Irish", + "mejs.italian": "Italian", + "mejs.japanese": "Japanese", + "mejs.korean": "Korean", + "mejs.latvian": "Latvian", + "mejs.lithuanian": "Lithuanian", + "mejs.macedonian": "Macedonian", + "mejs.malay": "Malay", + "mejs.maltese": "Maltese", + "mejs.norwegian": "Norwegian", + "mejs.persian": "Persian", + "mejs.polish": "Polish", + "mejs.portuguese": "Portuguese", + "mejs.romanian": "Romanian", + "mejs.russian": "Russian", + "mejs.serbian": "Serbian", + "mejs.slovak": "Slovak", + "mejs.slovenian": "Slovenian", + "mejs.spanish": "Spanish", + "mejs.swahili": "Swahili", + "mejs.swedish": "Swedish", + "mejs.tagalog": "Tagalog", + "mejs.thai": "Thai", + "mejs.turkish": "Turkish", + "mejs.ukrainian": "Ukrainian", + "mejs.vietnamese": "Vietnamese", + "mejs.welsh": "Welsh", + "mejs.yiddish": "Yiddish" +}; + +},{}],15:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +if (typeof jQuery !== 'undefined') { + _mejs2.default.$ = _window2.default.jQuery = _window2.default.$ = jQuery; +} else if (typeof Zepto !== 'undefined') { + _mejs2.default.$ = _window2.default.Zepto = _window2.default.$ = Zepto; +} else if (typeof ender !== 'undefined') { + _mejs2.default.$ = _window2.default.ender = _window2.default.$ = ender; +} + +},{"3":3,"6":6}],16:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.config = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _mediaelement = _dereq_(5); + +var _mediaelement2 = _interopRequireDefault(_mediaelement); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _constants = _dereq_(23); + +var _general = _dereq_(25); + +var _time = _dereq_(28); + +var _media = _dereq_(26); + +var _dom = _dereq_(24); + +var dom = _interopRequireWildcard(_dom); + +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"); } } + +_mejs2.default.mepIndex = 0; + +_mejs2.default.players = {}; + +// default player values +var config = exports.config = { + // url to poster (to fix iOS 3.x) + poster: '', + // When the video is ended, show the poster. + showPosterWhenEnded: false, + // When the video is paused, show the poster. + showPosterWhenPaused: false, + // Default if the <video width> is not specified + defaultVideoWidth: 480, + // Default if the <video height> is not specified + defaultVideoHeight: 270, + // If set, overrides <video width> + videoWidth: -1, + // If set, overrides <video height> + videoHeight: -1, + // Default if the user doesn't specify + defaultAudioWidth: 400, + // Default if the user doesn't specify + defaultAudioHeight: 40, + // Default amount to move back when back key is pressed + defaultSeekBackwardInterval: function defaultSeekBackwardInterval(media) { + return media.duration * 0.05; + }, + // Default amount to move forward when forward key is pressed + defaultSeekForwardInterval: function defaultSeekForwardInterval(media) { + return media.duration * 0.05; + }, + // Set dimensions via JS instead of CSS + setDimensions: true, + // Width of audio player + audioWidth: -1, + // Height of audio player + audioHeight: -1, + // Initial volume when the player starts (overridden by user cookie) + startVolume: 0.8, + // Useful for <audio> player loops + loop: false, + // Rewind to beginning when media ends + autoRewind: true, + // Resize to media dimensions + enableAutosize: true, + /* + * Time format to use. Default: 'mm:ss' + * Supported units: + * h: hour + * m: minute + * s: second + * f: frame count + * When using 'hh', 'mm', 'ss' or 'ff' we always display 2 digits. + * If you use 'h', 'm', 's' or 'f' we display 1 digit if possible. + * + * Example to display 75 seconds: + * Format 'mm:ss': 01:15 + * Format 'm:ss': 1:15 + * Format 'm:s': 1:15 + */ + timeFormat: '', + // Force the hour marker (##:00:00) + alwaysShowHours: false, + // Show framecount in timecode (##:00:00:00) + showTimecodeFrameCount: false, + // Used when showTimecodeFrameCount is set to true + framesPerSecond: 25, + // Hide controls when playing and mouse is not over the video + alwaysShowControls: false, + // Display the video control when media is loading + hideVideoControlsOnLoad: false, + // Display the video controls when media is paused + hideVideoControlsOnPause: false, + // Enable click video element to toggle play/pause + clickToPlayPause: true, + // Time in ms to hide controls + controlsTimeoutDefault: 1500, + // Time in ms to trigger the timer when mouse moves + controlsTimeoutMouseEnter: 2500, + // Time in ms to trigger the timer when mouse leaves + controlsTimeoutMouseLeave: 1000, + // Force iPad's native controls + iPadUseNativeControls: false, + // Force iPhone's native controls + iPhoneUseNativeControls: false, + // Force Android's native controls + AndroidUseNativeControls: false, + // Features to show + features: ['playpause', 'current', 'progress', 'duration', 'tracks', 'volume', 'fullscreen'], + // Only for dynamic + isVideo: true, + // Stretching modes (auto, fill, responsive, none) + stretching: 'auto', + // Prefix class names on elements + classPrefix: 'mejs__', + // Turn keyboard support on and off for this instance + enableKeyboard: true, + // When this player starts, it will pause other players + pauseOtherPlayers: true, + // Number of decimal places to show if frames are shown + secondsDecimalLength: 0, + // Array of keyboard actions such as play/pause + keyActions: [{ + keys: [32, // SPACE + 179 // GOOGLE play/pause button + ], + action: function action(player, media) { + + if (!_constants.IS_FIREFOX) { + if (media.paused || media.ended) { + media.play(); + } else { + media.pause(); + } + } + } + }, { + keys: [38], // UP + action: function action(player, media) { + + if (player.container.querySelector('.' + config.classPrefix + 'volume-button>button').matches(':focus') || player.container.querySelector('.' + config.classPrefix + 'volume-slider').matches(':focus')) { + player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = ''; + } + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + var newVolume = Math.min(media.volume + 0.1, 1); + media.setVolume(newVolume); + if (newVolume > 0) { + media.setMuted(false); + } + } + }, { + keys: [40], // DOWN + action: function action(player, media) { + + if (player.container.querySelector('.' + config.classPrefix + 'volume-button>button').matches(':focus') || player.container.querySelector('.' + config.classPrefix + 'volume-slider').matches(':focus')) { + player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = ''; + } + + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + var newVolume = Math.max(media.volume - 0.1, 0); + media.setVolume(newVolume); + + if (newVolume <= 0.1) { + media.setMuted(true); + } + } + }, { + keys: [37, // LEFT + 227 // Google TV rewind + ], + action: function action(player, media) { + if (!isNaN(media.duration) && media.duration > 0) { + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + // 5% + var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0); + media.setCurrentTime(newTime); + } + } + }, { + keys: [39, // RIGHT + 228 // Google TV forward + ], + action: function action(player, media) { + + if (!isNaN(media.duration) && media.duration > 0) { + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + // 5% + var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration); + media.setCurrentTime(newTime); + } + } + }, { + keys: [70], // F + action: function action(player, media, key, event) { + if (!event.ctrlKey) { + if (typeof player.enterFullScreen !== 'undefined') { + if (player.isFullScreen) { + player.exitFullScreen(); + } else { + player.enterFullScreen(); + } + } + } + } + }, { + keys: [77], // M + action: function action(player) { + + player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = ''; + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + if (player.media.muted) { + player.setMuted(false); + } else { + player.setMuted(true); + } + } + }] +}; + +_mejs2.default.MepDefaults = config; + +/** + * Wrap a MediaElement object in player controls + * + * @constructor + * @param {HTMLElement|String} node + * @param {Object} o + * @return {?MediaElementPlayer} + */ + +var MediaElementPlayer = function () { + function MediaElementPlayer(node, o) { + _classCallCheck(this, MediaElementPlayer); + + var t = this, + element = typeof node === 'string' ? _document2.default.getElementById(node) : node; + + t.hasFocus = false; + + t.controlsAreVisible = true; + + t.controlsEnabled = true; + + t.controlsTimer = null; + + // enforce object, even without "new" (via John Resig) + if (!(t instanceof MediaElementPlayer)) { + return new MediaElementPlayer(element, o); + } + + // these will be reset after the MediaElement.success fires + // t.media will be the fake node to emulate all HTML5 events, methods, etc + // t.node will be the node to be restored + t.node = t.media = element; + + if (!t.node) { + return; + } + + // check for existing player + if (t.media.player !== undefined) { + return t.media.player; + } + + // try to get options from data-mejsoptions + if (o === undefined) { + o = t.node.getAttribute('data-mejsoptions'); + } + + // extend default options + t.options = Object.assign({}, config, o); + + if (!t.options.timeFormat) { + // Generate the time format according to options + t.options.timeFormat = 'mm:ss'; + if (t.options.alwaysShowHours) { + t.options.timeFormat = 'hh:mm:ss'; + } + if (t.options.showTimecodeFrameCount) { + t.options.timeFormat += ':ff'; + } + } + + (0, _time.calculateTimeFormat)(0, t.options, t.options.framesPerSecond || 25); + + // unique ID + t.id = 'mep_' + _mejs2.default.mepIndex++; + + // add to player array (for focus events) + _mejs2.default.players[t.id] = t; + + // start up + var meOptions = Object.assign({}, t.options, { + success: function success(media, domNode) { + t._meReady(media, domNode); + }, + error: function error(e) { + t._handleError(e); + } + }), + tagName = t.node.tagName.toLowerCase(); + + // get video from src or href? + t.isDynamic = tagName !== 'audio' && tagName !== 'video'; + t.isVideo = t.isDynamic ? t.options.isVideo : tagName !== 'audio' && t.options.isVideo; + + // use native controls in iPad, iPhone, and Android + if (_constants.IS_IPAD && t.options.iPadUseNativeControls || _constants.IS_IPHONE && t.options.iPhoneUseNativeControls) { + + // add controls and stop + t.node.setAttribute('controls', true); + + // override Apple's autoplay override for iPads + if (_constants.IS_IPAD && t.node.getAttribute('autoplay')) { + t.play(); + } + } else if ((t.isVideo || !t.isVideo && t.options.features.length) && !(_constants.IS_ANDROID && t.options.AndroidUseNativeControls)) { + + // DESKTOP: use MediaElementPlayer controls + + // remove native controls + t.node.removeAttribute('controls'); + var videoPlayerTitle = t.isVideo ? _i18n2.default.t('mejs.video-player') : _i18n2.default.t('mejs.audio-player'); + // insert description for screen readers + var offscreen = _document2.default.createElement('span'); + offscreen.className = t.options.classPrefix + 'offscreen'; + offscreen.innerText = videoPlayerTitle; + t.media.parentNode.insertBefore(offscreen, t.media); + + // build container + t.container = _document2.default.createElement('div'); + t.container.id = t.id; + t.container.className = t.options.classPrefix + 'container ' + t.options.classPrefix + 'container-keyboard-inactive ' + t.media.className; + t.container.tabIndex = 0; + t.container.setAttribute('role', 'application'); + t.container.setAttribute('aria-label', videoPlayerTitle); + t.container.innerHTML = '<div class="' + t.options.classPrefix + 'inner">' + ('<div class="' + t.options.classPrefix + 'layers"></div>') + ('<div class="' + t.options.classPrefix + 'controls"></div>') + ('<div class="' + t.options.classPrefix + 'mediaelement"></div>') + ('<div class="' + t.options.classPrefix + 'clear"></div>') + '</div>'; + t.container.addEventListener('focus', function (e) { + if (!t.controlsAreVisible && !t.hasFocus && t.controlsEnabled) { + t.showControls(true); + // In versions older than IE11, the focus causes the playbar to be displayed + // if user clicks on the Play/Pause button in the control bar once it attempts + // to hide it + if (!_constants.HAS_MS_NATIVE_FULLSCREEN) { + // If e.relatedTarget appears before container, send focus to play button, + // else send focus to last control button. + var btnSelector = (0, _general.isNodeAfter)(e.relatedTarget, t.container) ? '.' + t.options.classPrefix + 'controls .' + t.options.classPrefix + 'button:last-child > button' : '.' + t.options.classPrefix + 'playpause-button > button', + button = t.container.querySelector(btnSelector); + + button.focus(); + } + } + }); + t.node.parentNode.insertBefore(t.container, t.node); + + // When no elements in controls, hide bar completely + if (!t.options.features.length) { + t.container.style.background = 'transparent'; + t.container.querySelector('.' + t.options.classPrefix + 'controls').style.display = 'none'; + } + + if (t.isVideo && t.options.stretching === 'fill' && !dom.hasClass(t.container.parentNode, t.options.classPrefix + 'fill-container')) { + // outer container + t.outerContainer = t.media.parentNode; + + var wrapper = _document2.default.createElement('div'); + wrapper.className = t.options.classPrefix + 'fill-container'; + t.container.parentNode.insertBefore(wrapper, t.container); + wrapper.appendChild(t.container); + } + + // add classes for user and content + if (_constants.IS_ANDROID) { + dom.addClass(t.container, t.options.classPrefix + 'android'); + } + if (_constants.IS_IOS) { + dom.addClass(t.container, t.options.classPrefix + 'ios'); + } + if (_constants.IS_IPAD) { + dom.addClass(t.container, t.options.classPrefix + 'ipad'); + } + if (_constants.IS_IPHONE) { + dom.addClass(t.container, t.options.classPrefix + 'iphone'); + } + dom.addClass(t.container, t.isVideo ? t.options.classPrefix + 'video' : t.options.classPrefix + 'audio'); + + // move the <video/video> tag into the right spot + t.container.querySelector('.' + t.options.classPrefix + 'mediaelement').appendChild(t.node); + + // needs to be assigned here, after iOS remap + t.media.player = t; + + // find parts + t.controls = t.container.querySelector('.' + t.options.classPrefix + 'controls'); + t.layers = t.container.querySelector('.' + t.options.classPrefix + 'layers'); + + // determine the size + + /* size priority: + (1) videoWidth (forced), + (2) style="width;height;" + (3) width attribute, + (4) defaultVideoWidth (for unspecified cases) + */ + + var tagType = t.isVideo ? 'video' : 'audio', + capsTagName = tagType.substring(0, 1).toUpperCase() + tagType.substring(1); + + if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) { + t.width = t.options[tagType + 'Width']; + } else if (t.node.style.width !== '' && t.node.style.width !== null) { + t.width = t.node.style.width; + } else if (t.node.getAttribute('width')) { + t.width = t.node.getAttribute('width'); + } else { + t.width = t.options['default' + capsTagName + 'Width']; + } + + if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) { + t.height = t.options[tagType + 'Height']; + } else if (t.node.style.height !== '' && t.node.style.height !== null) { + t.height = t.node.style.height; + } else if (t.node.getAttribute('height')) { + t.height = t.node.getAttribute('height'); + } else { + t.height = t.options['default' + capsTagName + 'Height']; + } + + t.initialAspectRatio = t.height >= t.width ? t.width / t.height : t.height / t.width; + + // set the size, while we wait for the plugins to load below + t.setPlayerSize(t.width, t.height); + + // create MediaElementShim + meOptions.pluginWidth = t.width; + meOptions.pluginHeight = t.height; + } + // Hide media completely for audio that doesn't have any features + else if (!t.isVideo && !t.options.features.length) { + t.node.style.display = 'none'; + } + + // create MediaElement shim + new _mediaelement2.default(t.media, meOptions); + + if (t.container !== undefined && t.options.features.length && t.controlsAreVisible && !t.options.hideVideoControlsOnLoad) { + // controls are shown when loaded + var event = (0, _general.createEvent)('controlsshown', t.container); + t.container.dispatchEvent(event); + } + + return t; + } + + _createClass(MediaElementPlayer, [{ + key: 'showControls', + value: function showControls(doAnimation) { + var t = this; + + doAnimation = doAnimation === undefined || doAnimation; + + if (t.controlsAreVisible) { + return; + } + + if (doAnimation) { + (function () { + dom.removeClass(t.controls, t.options.classPrefix + 'offscreen'); + dom.fadeIn(t.controls, 200, function () { + var event = (0, _general.createEvent)('controlsshown', t.container); + t.container.dispatchEvent(event); + }); + + // any additional controls people might add and want to hide + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + + var _loop = function _loop(i, total) { + dom.fadeIn(controls[i], 200, function () { + dom.removeClass(controls[i], t.options.classPrefix + 'offscreen'); + }); + }; + + for (var i = 0, total = controls.length; i < total; i++) { + _loop(i, total); + } + })(); + } else { + dom.removeClass(t.controls, t.options.classPrefix + 'offscreen'); + t.controls.style.display = ''; + + // any additional controls people might add and want to hide + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + for (var i = 0, total = controls.length; i < total; i++) { + dom.removeClass(controls[i], t.options.classPrefix + 'offscreen'); + controls[i].style.display = ''; + } + + var event = (0, _general.createEvent)('controlsshown', t.container); + t.container.dispatchEvent(event); + } + + t.controlsAreVisible = true; + t.setControlsSize(); + } + }, { + key: 'hideControls', + value: function hideControls(doAnimation, forceHide) { + var t = this; + + doAnimation = doAnimation === undefined || doAnimation; + + if (forceHide !== true && (!t.controlsAreVisible || t.options.alwaysShowControls || t.keyboardAction || t.media.paused && t.media.readyState === 4 && (!t.options.hideVideoControlsOnLoad && t.media.currentTime <= 0 || !t.options.hideVideoControlsOnPause && t.media.currentTime > 0) || t.isVideo && !t.options.hideVideoControlsOnLoad && !t.media.readyState || t.media.ended)) { + return; + } + + if (doAnimation) { + (function () { + // fade out main controls + dom.fadeOut(t.controls, 200, function () { + dom.addClass(t.controls, t.options.classPrefix + 'offscreen'); + t.controls.style.display = ''; + var event = (0, _general.createEvent)('controlshidden', t.container); + t.container.dispatchEvent(event); + }); + + // any additional controls people might add and want to hide + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + + var _loop2 = function _loop2(i, total) { + dom.fadeOut(controls[i], 200, function () { + dom.addClass(controls[i], t.options.classPrefix + 'offscreen'); + controls[i].style.display = ''; + }); + }; + + for (var i = 0, total = controls.length; i < total; i++) { + _loop2(i, total); + } + })(); + } else { + + // hide main controls + dom.addClass(t.controls, t.options.classPrefix + 'offscreen'); + t.controls.style.display = ''; + + // hide others + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + for (var i = 0, total = controls.length; i < total; i++) { + dom.addClass(controls[i], t.options.classPrefix + 'offscreen'); + controls[i].style.display = ''; + } + + var event = (0, _general.createEvent)('controlshidden', t.container); + t.container.dispatchEvent(event); + } + + t.controlsAreVisible = false; + } + }, { + key: 'startControlsTimer', + value: function startControlsTimer(timeout) { + + var t = this; + + timeout = typeof timeout !== 'undefined' ? timeout : t.options.controlsTimeoutDefault; + + t.killControlsTimer('start'); + + t.controlsTimer = setTimeout(function () { + t.hideControls(); + t.killControlsTimer('hide'); + }, timeout); + } + }, { + key: 'killControlsTimer', + value: function killControlsTimer() { + + var t = this; + + if (t.controlsTimer !== null) { + clearTimeout(t.controlsTimer); + delete t.controlsTimer; + t.controlsTimer = null; + } + } + }, { + key: 'disableControls', + value: function disableControls() { + var t = this; + + t.killControlsTimer(); + t.controlsEnabled = true; + t.hideControls(false, true); + } + }, { + key: 'enableControls', + value: function enableControls() { + var t = this; + + t.controlsEnabled = true; + t.showControls(false); + } + + /** + * Set up all controls and events + * + * @param media + * @param domNode + * @private + */ + + }, { + key: '_meReady', + value: function _meReady(media, domNode) { + + var t = this, + autoplayAttr = domNode.getAttribute('autoplay'), + autoplay = !(autoplayAttr === undefined || autoplayAttr === null || autoplayAttr === 'false'), + isNative = media.rendererName !== null && media.rendererName.match(/(native|html5)/) !== null; + + if (t.controls) { + t.enableControls(); + } + + if (t.container.querySelector('.' + t.options.classPrefix + 'overlay-play')) { + t.container.querySelector('.' + t.options.classPrefix + 'overlay-play').style.display = ''; + } + + // make sure it can't create itself again if a plugin reloads + if (t.created) { + return; + } + + t.created = true; + t.media = media; + t.domNode = domNode; + + if (!(_constants.IS_ANDROID && t.options.AndroidUseNativeControls) && !(_constants.IS_IPAD && t.options.iPadUseNativeControls) && !(_constants.IS_IPHONE && t.options.iPhoneUseNativeControls)) { + var _ret5 = function () { + + // In the event that no features are specified for audio, + // create only MediaElement instance rather than + // doing all the work to create a full player + if (!t.isVideo && !t.options.features.length) { + + // force autoplay for HTML5 + if (autoplay && isNative) { + t.play(); + } + + if (t.options.success) { + + if (typeof t.options.success === 'string') { + _window2.default[t.options.success](t.media, t.domNode, t); + } else { + t.options.success(t.media, t.domNode, t); + } + } + + return { + v: void 0 + }; + } + + // two built in features + t.buildposter(t, t.controls, t.layers, t.media); + t.buildkeyboard(t, t.controls, t.layers, t.media); + t.buildoverlays(t, t.controls, t.layers, t.media); + + // grab for use by features + t.findTracks(); + + // cache container to store control elements' original position + t.featurePosition = {}; + + // add user-defined features/controls + for (var i = 0, total = t.options.features.length; i < total; i++) { + var feature = t.options.features[i]; + if (t['build' + feature]) { + try { + t['build' + feature](t, t.controls, t.layers, t.media); + } catch (e) { + // TODO: report control error + console.error('error building ' + feature, e); + } + } + } + + var event = (0, _general.createEvent)('controlsready', t.container); + t.container.dispatchEvent(event); + + // reset all layers and controls + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + + // controls fade + if (t.isVideo) { + + // create callback here since it needs access to current + // MediaElement object + t.clickToPlayPauseCallback = function () { + + if (t.options.clickToPlayPause) { + var button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'), + pressed = button.getAttribute('aria-pressed'); + + if (t.media.paused && pressed) { + t.pause(); + } else if (t.media.paused) { + t.play(); + } else { + t.pause(); + } + + button.setAttribute('aria-pressed', !pressed); + } + }; + + t.createIframeLayer(); + + // click to play/pause + t.media.addEventListener('click', t.clickToPlayPauseCallback); + + if ((_constants.IS_ANDROID || _constants.IS_IOS) && !t.options.alwaysShowControls) { + + // for touch devices (iOS, Android) + // show/hide without animation on touch + t.node.addEventListener('touchstart', function () { + + // toggle controls + if (t.controlsAreVisible) { + t.hideControls(false); + } else { + if (t.controlsEnabled) { + t.showControls(false); + } + } + }); + } else { + + // show/hide controls + t.container.addEventListener('mouseenter', function () { + if (t.controlsEnabled) { + if (!t.options.alwaysShowControls) { + t.killControlsTimer('enter'); + t.showControls(); + t.startControlsTimer(t.options.controlsTimeoutMouseEnter); + } + } + }); + t.container.addEventListener('mousemove', function () { + if (t.controlsEnabled) { + if (!t.controlsAreVisible) { + t.showControls(); + } + if (!t.options.alwaysShowControls) { + t.startControlsTimer(t.options.controlsTimeoutMouseEnter); + } + } + }); + t.container.addEventListener('mouseleave', function () { + if (t.controlsEnabled) { + if (!t.media.paused && !t.options.alwaysShowControls) { + t.startControlsTimer(t.options.controlsTimeoutMouseLeave); + } + } + }); + } + + if (t.options.hideVideoControlsOnLoad) { + t.hideControls(false); + } + + // check for autoplay + if (autoplay && !t.options.alwaysShowControls) { + t.hideControls(); + } + + // resizer + if (t.options.enableAutosize) { + t.media.addEventListener('loadedmetadata', function (e) { + // if the <video height> was not set and the options.videoHeight was not set + // then resize to the real dimensions + if (t.options.videoHeight <= 0 && !t.domNode.getAttribute('height') && e.target !== null && !isNaN(e.target.videoHeight)) { + t.setPlayerSize(e.target.videoWidth, e.target.videoHeight); + t.setControlsSize(); + t.media.setSize(e.target.videoWidth, e.target.videoHeight); + } + }); + } + } + + // EVENTS + + // FOCUS: when a video starts playing, it takes focus from other players (possibly pausing them) + t.media.addEventListener('play', function () { + t.hasFocus = true; + + // go through all other players + for (var playerIndex in _mejs2.default.players) { + if (_mejs2.default.players.hasOwnProperty(playerIndex)) { + var p = _mejs2.default.players[playerIndex]; + + if (p.id !== t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) { + p.pause(); + p.hasFocus = false; + } + } + } + }); + + // ended for all + t.media.addEventListener('ended', function () { + if (t.options.autoRewind) { + try { + t.media.setCurrentTime(0); + // Fixing an Android stock browser bug, where "seeked" isn't fired correctly after + // ending the video and jumping to the beginning + setTimeout(function () { + t.container.querySelector('.' + t.options.classPrefix + 'overlay-loading').parentNode.style.display = 'none'; + }, 20); + } catch (exp) { + + } + } + + if (typeof t.media.stop === 'function') { + t.media.stop(); + } else { + t.media.pause(); + } + + if (t.setProgressRail) { + t.setProgressRail(); + } + if (t.setCurrentRail) { + t.setCurrentRail(); + } + + if (t.options.loop) { + t.play(); + } else if (!t.options.alwaysShowControls && t.controlsEnabled) { + t.showControls(); + } + }); + + // resize on the first play + t.media.addEventListener('loadedmetadata', function () { + + (0, _time.calculateTimeFormat)(t.duration, t.options, t.options.framesPerSecond || 25); + + if (t.updateDuration) { + t.updateDuration(); + } + if (t.updateCurrent) { + t.updateCurrent(); + } + + if (!t.isFullScreen) { + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + } + }); + + // Only change the time format when necessary + var duration = null; + t.media.addEventListener('timeupdate', function () { + if (duration !== t.media.duration) { + duration = t.media.duration; + (0, _time.calculateTimeFormat)(duration, t.options, t.options.framesPerSecond || 25); + + // make sure to fill in and resize the controls (e.g., 00:00 => 01:13:15 + if (t.updateDuration) { + t.updateDuration(); + } + if (t.updateCurrent) { + t.updateCurrent(); + } + t.setControlsSize(); + } + }); + + t.container.addEventListener('focusout', function (e) { + setTimeout(function () { + //FF is working on supporting focusout https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + if (e.relatedTarget) { + if (t.keyboardAction && !e.relatedTarget.closest('.mejs-container')) { + t.keyboardAction = false; + if (t.isVideo && !t.options.alwaysShowControls) { + t.hideControls(true); + } + } + } + }, 0); + }); + + // webkit has trouble doing this without a delay + setTimeout(function () { + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + }, 0); + + // adjust controls whenever window sizes (used to be in fullscreen only) + t.globalBind('resize', function () { + + // don't resize for fullscreen mode + if (!(t.isFullScreen || _constants.HAS_TRUE_NATIVE_FULLSCREEN && _document2.default.webkitIsFullScreen)) { + t.setPlayerSize(t.width, t.height); + } + + // always adjust controls + t.setControlsSize(); + }); + + // Disable focus outline to improve look-and-feel for regular users + t.globalBind('click', function (e) { + if (e.target.matches('.' + t.options.classPrefix + 'container')) { + dom.addClass(e.target, t.options.classPrefix + 'container-keyboard-inactive'); + } else if (e.target.closest('.' + t.options.classPrefix + 'container')) { + dom.addClass(e.target.closest('.' + t.options.classPrefix + 'container'), t.options.classPrefix + 'container-keyboard-inactive'); + } + }); + + // Enable focus outline for Accessibility purposes + t.globalBind('keydown', function (e) { + if (e.target.matches('.' + t.options.classPrefix + 'container')) { + dom.removeClass(e.target, t.options.classPrefix + 'container-keyboard-inactive'); + } else if (e.target.closest('.' + t.options.classPrefix + 'container')) { + dom.removeClass(event.target.closest('.' + t.options.classPrefix + 'container'), t.options.classPrefix + 'container-keyboard-inactive'); + } + }); + }(); + + if ((typeof _ret5 === 'undefined' ? 'undefined' : _typeof(_ret5)) === "object") return _ret5.v; + } + + // force autoplay for HTML5 + if (autoplay && isNative) { + t.play(); + } + + if (t.options.success) { + + if (typeof t.options.success === 'string') { + _window2.default[t.options.success](t.media, t.domNode, t); + } else { + t.options.success(t.media, t.domNode, t); + } + } + } + + /** + * + * @param {Event} e + * @private + */ + + }, { + key: '_handleError', + value: function _handleError(e) { + var t = this; + + if (t.controls) { + t.disableControls(); + } + + var play = t.layers.querySelector('.' + t.options.classPrefix + 'overlay-play'); + + if (play) { + play.style.display = 'none'; + } + + // Tell user that the file cannot be played + if (t.options.error) { + t.options.error(e); + } + } + }, { + key: 'setPlayerSize', + value: function setPlayerSize(width, height) { + var t = this; + + if (!t.options.setDimensions) { + return false; + } + + if (typeof width !== 'undefined') { + t.width = width; + } + + if (typeof height !== 'undefined') { + t.height = height; + } + + if (typeof FB !== 'undefined' && t.isVideo) { + FB.Event.subscribe('xfbml.ready', function () { + var target = t.media.firstChild; + + t.width = parseFloat(target.offsetWidth); + t.height = parseFloat(target.offsetHeight); + t.setDimensions(t.width, t.height); + return false; + }); + + var target = t.media.firstChild; + + if (target.length) { + t.width = target.offsetWidth; + t.height = target.offsetHeight; + } + } + + // check stretching modes + switch (t.options.stretching) { + case 'fill': + // The 'fill' effect only makes sense on video; for audio we will set the dimensions + if (t.isVideo) { + t.setFillMode(); + } else { + t.setDimensions(t.width, t.height); + } + break; + case 'responsive': + t.setResponsiveMode(); + break; + case 'none': + t.setDimensions(t.width, t.height); + break; + // This is the 'auto' mode + default: + if (t.hasFluidMode() === true) { + t.setResponsiveMode(); + } else { + t.setDimensions(t.width, t.height); + } + break; + } + } + }, { + key: 'hasFluidMode', + value: function hasFluidMode() { + var t = this; + + // detect 100% mode - use currentStyle for IE since css() doesn't return percentages + return t.height.toString().includes('%') || t.node.style.maxWidth && t.node.style.maxWidth !== 'none' && t.node.style.maxWidth !== t.width || t.node.currentStyle && t.node.currentStyle.maxWidth === '100%'; + } + }, { + key: 'setResponsiveMode', + value: function setResponsiveMode() { + var t = this, + parent = function () { + + var parentEl = void 0, + el = t.container; + + // traverse parents to find the closest visible one + while (el) { + parentEl = el.parentElement; + if (parentEl && dom.visible(parentEl)) { + return parentEl; + } + el = parentEl; + } + + return null; + }(), + parentStyles = getComputedStyle(parent, null), + nativeWidth = function () { + if (t.isVideo) { + if (t.media.videoWidth && t.media.videoWidth > 0) { + return t.media.videoWidth; + } else if (t.node.getAttribute('width')) { + return t.node.getAttribute('width'); + } else { + return t.options.defaultVideoWidth; + } + } else { + return t.options.defaultAudioWidth; + } + }(), + nativeHeight = function () { + if (t.isVideo) { + if (t.media.videoHeight && t.media.videoHeight > 0) { + return t.media.videoHeight; + } else if (t.node.getAttribute('height')) { + return t.node.getAttribute('height'); + } else { + return t.options.defaultVideoHeight; + } + } else { + return t.options.defaultAudioHeight; + } + }(), + aspectRatio = function () { + var ratio = 1; + if (!t.isVideo) { + return ratio; + } + + if (t.media.videoWidth && t.media.videoWidth > 0 && t.media.videoHeight && t.media.videoHeight > 0) { + ratio = t.height >= t.width ? t.media.videoWidth / t.media.videoHeight : t.media.videoHeight / t.media.videoWidth; + } else { + ratio = t.initialAspectRatio; + } + + if (isNaN(ratio) || ratio < 0.01 || ratio > 100) { + ratio = 1; + } + + return ratio; + }(), + parentHeight = parseFloat(parentStyles.height); + + var newHeight = void 0, + parentWidth = parseFloat(parentStyles.width); + + if (t.isVideo) { + // Responsive video is based on width: 100% and height: 100% + if (t.height === '100%') { + newHeight = parseInt(parentWidth * nativeHeight / nativeWidth, 10); + } else { + newHeight = t.height >= t.width ? parseInt(parentWidth / aspectRatio, 10) : parseInt(parentWidth * aspectRatio, 10); + } + } else { + newHeight = nativeHeight; + } -// version number -mejs.version = '2.15.1'; - - -// player number (for missing, same id attr) -mejs.meIndex = 0; - -// media types accepted by plugins -mejs.plugins = { - silverlight: [ - {version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']} - ], - flash: [ - {version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a','audio/mpeg', 'video/youtube', 'video/x-youtube', 'application/x-mpegURL']} - //,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!) - ], - youtube: [ - {version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']} - ], - vimeo: [ - {version: null, types: ['video/vimeo', 'video/x-vimeo']} - ] -}; + // If we were unable to compute newHeight, get the container height instead + if (isNaN(newHeight)) { + newHeight = parentHeight; + } -/* -Utility methods -*/ -mejs.Utility = { - encodeUrl: function(url) { - return encodeURIComponent(url); //.replace(/\?/gi,'%3F').replace(/=/gi,'%3D').replace(/&/gi,'%26'); - }, - escapeHTML: function(s) { - return s.toString().split('&').join('&').split('<').join('<').split('"').join('"'); - }, - absolutizeUrl: function(url) { - var el = document.createElement('div'); - el.innerHTML = '<a href="' + this.escapeHTML(url) + '">x</a>'; - return el.firstChild.href; - }, - getScriptPath: function(scriptNames) { - var - i = 0, - j, - codePath = '', - testname = '', - slashPos, - filenamePos, - scriptUrl, - scriptPath, - scriptFilename, - scripts = document.getElementsByTagName('script'), - il = scripts.length, - jl = scriptNames.length; - - // go through all <script> tags - for (; i < il; i++) { - scriptUrl = scripts[i].src; - slashPos = scriptUrl.lastIndexOf('/'); - if (slashPos > -1) { - scriptFilename = scriptUrl.substring(slashPos + 1); - scriptPath = scriptUrl.substring(0, slashPos + 1); - } else { - scriptFilename = scriptUrl; - scriptPath = ''; - } - - // see if any <script> tags have a file name that matches the - for (j = 0; j < jl; j++) { - testname = scriptNames[j]; - filenamePos = scriptFilename.indexOf(testname); - if (filenamePos > -1) { - codePath = scriptPath; - break; - } + if (t.container.parentNode.length > 0 && t.container.parentNode.tagName.toLowerCase() === 'body') { + parentWidth = _window2.default.innerWidth || _document2.default.documentElement.clientWidth || _document2.default.body.clientWidth; + newHeight = _window2.default.innerHeight || _document2.default.documentElement.clientHeight || _document2.default.body.clientHeight; } - - // if we found a path, then break and return it - if (codePath !== '') { - break; + + if (newHeight && parentWidth) { + + // set outer container size + t.container.style.width = parentWidth + 'px'; + t.container.style.height = newHeight + 'px'; + + // set native <video> or <audio> and shims + t.node.style.width = '100%'; + t.node.style.height = '100%'; + + // if shim is ready, send the size to the embedded plugin + if (t.isVideo && t.media.setSize) { + t.media.setSize(parentWidth, newHeight); + } + + // set the layers + var layerChildren = t.layers.childNodes; + for (var i = 0, total = layerChildren.length; i < total; i++) { + layerChildren[i].style.width = '100%'; + layerChildren[i].style.height = '100%'; + } } } - - // send the best path back - return codePath; - }, - secondsToTimeCode: function(time, forceHours, showFrameCount, fps) { - //add framecount - if (typeof showFrameCount == 'undefined') { - showFrameCount=false; - } else if(typeof fps == 'undefined') { - fps = 25; - } - - var hours = Math.floor(time / 3600) % 24, - minutes = Math.floor(time / 60) % 60, - seconds = Math.floor(time % 60), - frames = Math.floor(((time % 1)*fps).toFixed(3)), - result = - ( (forceHours || hours > 0) ? (hours < 10 ? '0' + hours : hours) + ':' : '') - + (minutes < 10 ? '0' + minutes : minutes) + ':' - + (seconds < 10 ? '0' + seconds : seconds) - + ((showFrameCount) ? ':' + (frames < 10 ? '0' + frames : frames) : ''); - - return result; - }, - - timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){ - if (typeof showFrameCount == 'undefined') { - showFrameCount=false; - } else if(typeof fps == 'undefined') { - fps = 25; - } - - var tc_array = hh_mm_ss_ff.split(":"), - tc_hh = parseInt(tc_array[0], 10), - tc_mm = parseInt(tc_array[1], 10), - tc_ss = parseInt(tc_array[2], 10), - tc_ff = 0, - tc_in_seconds = 0; - - if (showFrameCount) { - tc_ff = parseInt(tc_array[3])/fps; - } - - tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff; - - return tc_in_seconds; - }, - + }, { + key: 'setFillMode', + value: function setFillMode() { + var t = this, + parent = t.outerContainer; - convertSMPTEtoSeconds: function (SMPTE) { - if (typeof SMPTE != 'string') - return false; + var parentStyles = getComputedStyle(parent); - SMPTE = SMPTE.replace(',', '.'); - - var secs = 0, - decimalLen = (SMPTE.indexOf('.') != -1) ? SMPTE.split('.')[1].length : 0, - multiplier = 1; - - SMPTE = SMPTE.split(':').reverse(); - - for (var i = 0; i < SMPTE.length; i++) { - multiplier = 1; - if (i > 0) { - multiplier = Math.pow(60, i); - } - secs += Number(SMPTE[i]) * multiplier; - } - return Number(secs.toFixed(decimalLen)); - }, - - /* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */ - removeSwf: function(id) { - var obj = document.getElementById(id); - if (obj && /object|embed/i.test(obj.nodeName)) { - if (mejs.MediaFeatures.isIE) { - obj.style.display = "none"; - (function(){ - if (obj.readyState == 4) { - mejs.Utility.removeObjectInIE(id); - } else { - setTimeout(arguments.callee, 10); - } - })(); - } else { - obj.parentNode.removeChild(obj); + // Remove the responsive attributes in the event they are there + if (t.node.style.height !== 'none' && t.node.style.height !== t.height) { + t.node.style.height = ''; } - } - }, - removeObjectInIE: function(id) { - var obj = document.getElementById(id); - if (obj) { - for (var i in obj) { - if (typeof obj[i] == "function") { - obj[i] = null; - } + if (t.node.style.maxWidth !== 'none' && t.node.style.maxWidth !== t.width) { + t.node.style.maxWidth = ''; } - obj.parentNode.removeChild(obj); - } - } -}; - -// Core detector, plugins are added below -mejs.PluginDetector = { + if (t.node.style.maxHeight !== 'none' && t.node.style.maxHeight !== t.height) { + t.node.style.maxHeight = ''; + } - // main public function to test a plug version number PluginDetector.hasPluginVersion('flash',[9,0,125]); - hasPluginVersion: function(plugin, v) { - var pv = this.plugins[plugin]; - v[1] = v[1] || 0; - v[2] = v[2] || 0; - return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; - }, + if (t.node.currentStyle) { + if (t.node.currentStyle.height === '100%') { + t.node.currentStyle.height = ''; + } + if (t.node.currentStyle.maxWidth === '100%') { + t.node.currentStyle.maxWidth = ''; + } + if (t.node.currentStyle.maxHeight === '100%') { + t.node.currentStyle.maxHeight = ''; + } + } - // cached values - nav: window.navigator, - ua: window.navigator.userAgent.toLowerCase(), + if (!parseFloat(parentStyles.width)) { + parent.style.width = t.media.offsetWidth + 'px'; + } - // stored version numbers - plugins: [], + if (!parseFloat(parentStyles.height)) { + parent.style.height = t.media.offsetHeight + 'px'; + } - // runs detectPlugin() and stores the version number - addPlugin: function(p, pluginName, mimeType, activeX, axDetect) { - this.plugins[p] = this.detectPlugin(pluginName, mimeType, activeX, axDetect); - }, + parentStyles = getComputedStyle(parent); - // get the version number from the mimetype (all but IE) or ActiveX (IE) - detectPlugin: function(pluginName, mimeType, activeX, axDetect) { + var parentWidth = parseFloat(parentStyles.width), + parentHeight = parseFloat(parentStyles.height); - var version = [0,0,0], - description, - i, - ax; + t.setDimensions('100%', '100%'); - // Firefox, Webkit, Opera - if (typeof(this.nav.plugins) != 'undefined' && typeof this.nav.plugins[pluginName] == 'object') { - description = this.nav.plugins[pluginName].description; - if (description && !(typeof this.nav.mimeTypes != 'undefined' && this.nav.mimeTypes[mimeType] && !this.nav.mimeTypes[mimeType].enabledPlugin)) { - version = description.replace(pluginName, '').replace(/^\s+/,'').replace(/\sr/gi,'.').split('.'); - for (i=0; i<version.length; i++) { - version[i] = parseInt(version[i].match(/\d+/), 10); - } + // This prevents an issue when displaying poster + var poster = t.container.querySelector(t.options.classPrefix + 'poster img'); + if (poster) { + poster.style.display = ''; } - // Internet Explorer / ActiveX - } else if (typeof(window.ActiveXObject) != 'undefined') { - try { - ax = new ActiveXObject(activeX); - if (ax) { - version = axDetect(ax); + + // calculate new width and height + var targetElement = t.container.querySelectorAll('object, embed, iframe, video'), + initHeight = t.height, + initWidth = t.width, + + // scale to the target width + scaleX1 = parentWidth, + scaleY1 = initHeight * parentWidth / initWidth, + + // scale to the target height + scaleX2 = initWidth * parentHeight / initHeight, + scaleY2 = parentHeight, + + // now figure out which one we should use + bScaleOnWidth = scaleX2 > parentWidth === false, + finalWidth = bScaleOnWidth ? Math.floor(scaleX1) : Math.floor(scaleX2), + finalHeight = bScaleOnWidth ? Math.floor(scaleY1) : Math.floor(scaleY2), + width = bScaleOnWidth ? parentWidth + 'px' : finalWidth + 'px', + height = bScaleOnWidth ? finalHeight + 'px' : parentHeight + 'px'; + + for (var i = 0, total = targetElement.length; i < total; i++) { + targetElement[i].style.height = height; + targetElement[i].style.width = width; + if (t.media.setSize) { + t.media.setSize(width, height); } + + targetElement[i].style.marginLeft = Math.floor((parentWidth - finalWidth) / 2) + 'px'; + targetElement[i].style.marginTop = 0; } - catch (e) { } } - return version; - } -}; + }, { + key: 'setDimensions', + value: function setDimensions(width, height) { + var t = this; -// Add Flash detection -mejs.PluginDetector.addPlugin('flash','Shockwave Flash','application/x-shockwave-flash','ShockwaveFlash.ShockwaveFlash', function(ax) { - // adapted from SWFObject - var version = [], - d = ax.GetVariable("$version"); - if (d) { - d = d.split(" ")[1].split(","); - version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; - } - return version; -}); + width = (0, _general.isString)(width) && width.includes('%') ? width : parseFloat(width) + 'px'; + height = (0, _general.isString)(height) && height.includes('%') ? height : parseFloat(height) + 'px'; -// Add Silverlight detection -mejs.PluginDetector.addPlugin('silverlight','Silverlight Plug-In','application/x-silverlight-2','AgControl.AgControl', function (ax) { - // Silverlight cannot report its version number to IE - // but it does have a isVersionSupported function, so we have to loop through it to get a version number. - // adapted from http://www.silverlightversion.com/ - var v = [0,0,0,0], - loopMatch = function(ax, v, i, n) { - while(ax.isVersionSupported(v[0]+ "."+ v[1] + "." + v[2] + "." + v[3])){ - v[i]+=n; - } - v[i] -= n; - }; - loopMatch(ax, v, 0, 1); - loopMatch(ax, v, 1, 1); - loopMatch(ax, v, 2, 10000); // the third place in the version number is usually 5 digits (4.0.xxxxx) - loopMatch(ax, v, 2, 1000); - loopMatch(ax, v, 2, 100); - loopMatch(ax, v, 2, 10); - loopMatch(ax, v, 2, 1); - loopMatch(ax, v, 3, 1); - - return v; -}); -// add adobe acrobat -/* -PluginDetector.addPlugin('acrobat','Adobe Acrobat','application/pdf','AcroPDF.PDF', function (ax) { - var version = [], - d = ax.GetVersions().split(',')[0].split('=')[1].split('.'); + t.container.style.width = width; + t.container.style.height = height; - if (d) { - version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; - } - return version; -}); -*/ -// necessary detection (fixes for <IE9) -mejs.MediaFeatures = { - init: function() { - var - t = this, - d = document, - nav = mejs.PluginDetector.nav, - ua = mejs.PluginDetector.ua.toLowerCase(), - i, - v, - html5Elements = ['source','track','audio','video']; - - // detect browsers (only the ones that have some kind of quirk we need to work around) - t.isiPad = (ua.match(/ipad/i) !== null); - t.isiPhone = (ua.match(/iphone/i) !== null); - t.isiOS = t.isiPhone || t.isiPad; - t.isAndroid = (ua.match(/android/i) !== null); - t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null); - t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null)); - t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null); - t.isChrome = (ua.match(/chrome/gi) !== null); - t.isChromium = (ua.match(/chromium/gi) !== null); - t.isFirefox = (ua.match(/firefox/gi) !== null); - t.isWebkit = (ua.match(/webkit/gi) !== null); - t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE; - t.isOpera = (ua.match(/opera/gi) !== null); - t.hasTouch = ('ontouchstart' in window); // && window.ontouchstart != null); // this breaks iOS 7 - - // borrowed from Modernizr - t.svg = !! document.createElementNS && - !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect; - - // create HTML5 media elements for IE before 9, get a <video> element for fullscreen detection - for (i=0; i<html5Elements.length; i++) { - v = document.createElement(html5Elements[i]); - } - - t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid); - - // Fix for IE9 on Windows 7N / Windows 7KN (Media Player not installer) - try{ - v.canPlayType("video/mp4"); - }catch(e){ - t.supportsMediaTag = false; - } - - // detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails) - - // iOS - t.hasSemiNativeFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined'); - - // W3C - t.hasNativeFullscreen = (typeof v.requestFullscreen !== 'undefined'); - - // webkit/firefox/IE11+ - t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined'); - t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined'); - t.hasMsNativeFullScreen = (typeof v.msRequestFullscreen !== 'undefined'); - - t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen || t.hasMsNativeFullScreen); - t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen; - - // Enabled? - if (t.hasMozNativeFullScreen) { - t.nativeFullScreenEnabled = document.mozFullScreenEnabled; - } else if (t.hasMsNativeFullScreen) { - t.nativeFullScreenEnabled = document.msFullscreenEnabled; - } - - if (t.isChrome) { - t.hasSemiNativeFullScreen = false; - } - - if (t.hasTrueNativeFullScreen) { - - t.fullScreenEventName = ''; - if (t.hasWebkitNativeFullScreen) { - t.fullScreenEventName = 'webkitfullscreenchange'; - - } else if (t.hasMozNativeFullScreen) { - t.fullScreenEventName = 'mozfullscreenchange'; - - } else if (t.hasMsNativeFullScreen) { - t.fullScreenEventName = 'MSFullscreenChange'; + var layers = t.layers.childNodes; + for (var i = 0, total = layers.length; i < total; i++) { + layers[i].style.width = width; + layers[i].style.height = height; } - - t.isFullScreen = function() { - if (t.hasMozNativeFullScreen) { - return d.mozFullScreen; - - } else if (t.hasWebkitNativeFullScreen) { - return d.webkitIsFullScreen; - - } else if (t.hasMsNativeFullScreen) { - return d.msFullscreenElement !== null; - } + } + }, { + key: 'setControlsSize', + value: function setControlsSize() { + var t = this; + + // skip calculation if hidden + if (!dom.visible(t.container) || !t.rail || !dom.visible(t.rail)) { + return; } - - t.requestFullScreen = function(el) { - - if (t.hasWebkitNativeFullScreen) { - el.webkitRequestFullScreen(); - - } else if (t.hasMozNativeFullScreen) { - el.mozRequestFullScreen(); - } else if (t.hasMsNativeFullScreen) { - el.msRequestFullscreen(); + var railStyles = getComputedStyle(t.rail), + totalStyles = getComputedStyle(t.total), + railMargin = parseFloat(railStyles.marginLeft) + parseFloat(railStyles.marginRight), + totalMargin = parseFloat(totalStyles.marginLeft) + parseFloat(totalStyles.marginRight) || 0; - } + var siblingsWidth = 0; + + var siblings = dom.siblings(t.rail, function (el) { + return el !== t.rail; + }), + total = siblings.length; + for (var i = 0; i < total; i++) { + siblingsWidth += siblings[i].offsetWidth; } - - t.cancelFullScreen = function() { - if (t.hasWebkitNativeFullScreen) { - document.webkitCancelFullScreen(); - - } else if (t.hasMozNativeFullScreen) { - document.mozCancelFullScreen(); - - } else if (t.hasMsNativeFullScreen) { - document.msExitFullscreen(); - - } - } - - } - - - // OS X 10.5 can't do this even if it says it can :( - if (t.hasSemiNativeFullScreen && ua.match(/mac os x 10_5/i)) { - t.hasNativeFullScreen = false; - t.hasSemiNativeFullScreen = false; - } - - } -}; -mejs.MediaFeatures.init(); -/* -extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below) -*/ -mejs.HtmlMediaElement = { - pluginType: 'native', - isFullScreen: false, + siblingsWidth += totalMargin + (totalMargin === 0 ? railMargin * 2 : railMargin) + 1; - setCurrentTime: function (time) { - this.currentTime = time; - }, + // Substract the width of the feature siblings from time rail + var controlsWidth = parseFloat(t.controls.offsetWidth); + t.rail.style.width = (siblingsWidth > controlsWidth ? 0 : controlsWidth - siblingsWidth) + 'px'; - setMuted: function (muted) { - this.muted = muted; - }, + var event = (0, _general.createEvent)('controlsresize', t.container); + t.container.dispatchEvent(event); + } - setVolume: function (volume) { - this.volume = volume; - }, + /** + * Add featured control element and cache its position in case features are reset + * + * @param {HTMLElement} element + * @param {String} key + */ - // for parity with the plugin versions - stop: function () { - this.pause(); - }, + }, { + key: 'addControlElement', + value: function addControlElement(element, key) { - // This can be a url string - // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}] - setSrc: function (url) { - - // Fix for IE9 which can't set .src when there are <source> elements. Awesome, right? - var - existingSources = this.getElementsByTagName('source'); - while (existingSources.length > 0){ - this.removeChild(existingSources[0]); - } - - if (typeof url == 'string') { - this.src = url; - } else { - var i, media; + var t = this; - for (i=0; i<url.length; i++) { - media = url[i]; - if (this.canPlayType(media.type)) { - this.src = media.src; - break; + if (t.featurePosition[key] !== undefined) { + var child = t.controls.childNodes[t.featurePosition[key] - 1]; + child.parentNode.insertBefore(element, child.nextSibling); + } else { + t.controls.appendChild(element); + var children = t.controls.childNodes; + for (var i = 0, total = children.length; i < total; i++) { + if (element == children[i]) { + t.featurePosition[key] = i; + break; + } } } } - }, - setVideoSize: function (width, height) { - this.width = width; - this.height = height; - } -}; + /** + * Append layer to manipulate `<iframe>` elements safely. + * + * This allows the user to trigger events properly given that mouse/click don't get lost in the `<iframe>`. + */ -/* -Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember] -*/ -mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) { - this.id = pluginid; - this.pluginType = pluginType; - this.src = mediaUrl; - this.events = {}; - this.attributes = {}; -}; + }, { + key: 'createIframeLayer', + value: function createIframeLayer() { -// JavaScript values and ExternalInterface methods that match HTML5 video properties methods -// http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html -// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html -mejs.PluginMediaElement.prototype = { + var t = this; - // special - pluginElement: null, - pluginType: '', - isFullScreen: false, + if (t.isVideo && t.media.rendererName !== null && t.media.rendererName.match(/iframe/i) !== null && !_document2.default.getElementById(t.media.id + '-iframe-overlay')) { - // not implemented :( - playbackRate: -1, - defaultPlaybackRate: -1, - seekable: [], - played: [], + var layer = _document2.default.createElement('div'), + target = _document2.default.getElementById(t.media.id + '_' + t.media.rendererName); - // HTML5 read-only properties - paused: true, - ended: false, - seeking: false, - duration: 0, - error: null, - tagName: '', - - // HTML5 get/set properties, but only set (updated by event handlers) - muted: false, - volume: 1, - currentTime: 0, - - // HTML5 methods - play: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.playVideo(); - } else { - this.pluginApi.playMedia(); - } - this.paused = false; - } - }, - load: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - } else { - this.pluginApi.loadMedia(); + layer.id = t.media.id + '-iframe-overlay'; + layer.className = t.options.classPrefix + 'iframe-overlay'; + layer.addEventListener('click', function (e) { + if (t.options.clickToPlayPause) { + if (t.media.paused) { + t.media.play(); + } else { + t.media.pause(); + } + + e.preventDefault(); + e.stopPropagation(); + } + }); + + target.parentNode.insertBefore(layer, target); } - - this.paused = false; } - }, - pause: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.pauseVideo(); - } else { - this.pluginApi.pauseMedia(); - } - - - this.paused = true; - } - }, - stop: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.stopVideo(); - } else { - this.pluginApi.stopMedia(); - } - this.paused = true; + }, { + key: 'resetSize', + value: function resetSize() { + var t = this; + // webkit has trouble doing this without a delay + setTimeout(function () { + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + }, 50); } - }, - canPlayType: function(type) { - var i, - j, - pluginInfo, - pluginVersions = mejs.plugins[this.pluginType]; - - for (i=0; i<pluginVersions.length; i++) { - pluginInfo = pluginVersions[i]; - - // test if user has the correct plugin version - if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) { - - // test for plugin playback types - for (j=0; j<pluginInfo.types.length; j++) { - // find plugin that can play the type - if (type == pluginInfo.types[j]) { - return 'probably'; - } - } + }, { + key: 'setPoster', + value: function setPoster(url) { + var t = this, + posterDiv = t.container.querySelector('.' + t.options.classPrefix + 'poster'); + + var posterImg = posterDiv.querySelector('img'); + + if (!posterImg) { + posterImg = _document2.default.createElement('img'); + posterImg.className = t.options.classPrefix + 'poster-img'; + posterImg.width = '100%'; + posterImg.height = '100%'; + posterDiv.appendChild(posterImg); } - } - return ''; - }, - - positionFullscreenButton: function(x,y,visibleAndAbove) { - if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) { - this.pluginApi.positionFullscreenButton(Math.floor(x),Math.floor(y),visibleAndAbove); + posterImg.setAttribute('src', url); + posterDiv.style.backgroundImage = 'url("' + url + '")'; } - }, - - hideFullscreenButton: function() { - if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) { - this.pluginApi.hideFullscreenButton(); - } - }, - - - // custom methods since not all JavaScript implementations support get/set - - // This can be a url string - // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}] - setSrc: function (url) { - if (typeof url == 'string') { - this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url)); - this.src = mejs.Utility.absolutizeUrl(url); - } else { - var i, media; + }, { + key: 'changeSkin', + value: function changeSkin(className) { + var t = this; - for (i=0; i<url.length; i++) { - media = url[i]; - if (this.canPlayType(media.type)) { - this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src)); - this.src = mejs.Utility.absolutizeUrl(url); - break; + t.container.className = t.options.classPrefix + 'container ' + className; + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + } + }, { + key: 'globalBind', + value: function globalBind(events, callback) { + var t = this, + doc = t.node ? t.node.ownerDocument : _document2.default; + + events = (0, _general.splitEvents)(events, t.id); + if (events.d) { + var eventList = events.d.split(' '); + for (var i = 0, total = eventList.length; i < total; i++) { + eventList[i].split('.').reduce(function (part, e) { + doc.addEventListener(e, callback, false); + return e; + }, ''); + } + } + if (events.w) { + var _eventList = events.w.split(' '); + for (var _i = 0, _total = _eventList.length; _i < _total; _i++) { + _eventList[_i].split('.').reduce(function (part, e) { + _window2.default.addEventListener(e, callback, false); + return e; + }, ''); } } } + }, { + key: 'globalUnbind', + value: function globalUnbind(events, callback) { - }, - setCurrentTime: function (time) { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.seekTo(time); - } else { - this.pluginApi.setCurrentTime(time); - } - - - - this.currentTime = time; - } - }, - setVolume: function (volume) { - if (this.pluginApi != null) { - // same on YouTube and MEjs - if (this.pluginType == 'youtube') { - this.pluginApi.setVolume(volume * 100); - } else { - this.pluginApi.setVolume(volume); + var t = this, + doc = t.node ? t.node.ownerDocument : _document2.default; + + events = (0, _general.splitEvents)(events, t.id); + if (events.d) { + var eventList = events.d.split(' '); + for (var i = 0, total = eventList.length; i < total; i++) { + eventList[i].split('.').reduce(function (part, e) { + doc.removeEventListener(e, callback, false); + return e; + }, ''); + } } - this.volume = volume; - } - }, - setMuted: function (muted) { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube') { - if (muted) { - this.pluginApi.mute(); - } else { - this.pluginApi.unMute(); + if (events.w) { + var _eventList2 = events.d.split(' '); + for (var _i2 = 0, _total2 = _eventList2.length; _i2 < _total2; _i2++) { + _eventList2[_i2].split('.').reduce(function (part, e) { + _window2.default.removeEventListener(e, callback, false); + return e; + }, ''); } - this.muted = muted; - this.dispatchEvent('volumechange'); - } else { - this.pluginApi.setMuted(muted); } - this.muted = muted; } - }, + }, { + key: 'buildposter', + value: function buildposter(player, controls, layers, media) { + + var t = this, + poster = _document2.default.createElement('div'); + + poster.className = t.options.classPrefix + 'poster ' + t.options.classPrefix + 'layer'; + layers.appendChild(poster); - // additional non-HTML5 methods - setVideoSize: function (width, height) { - - //if (this.pluginType == 'flash' || this.pluginType == 'silverlight') { - if (this.pluginElement && this.pluginElement.style) { - this.pluginElement.style.width = width + 'px'; - this.pluginElement.style.height = height + 'px'; + var posterUrl = player.media.getAttribute('poster'); + + // priority goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster) + if (player.options.poster !== '') { + posterUrl = player.options.poster; } - if (this.pluginApi != null && this.pluginApi.setVideoSize) { - this.pluginApi.setVideoSize(width, height); + + // second, try the real poster + if (posterUrl) { + t.setPoster(posterUrl); + } else { + poster.style.display = 'none'; } - //} - }, - setFullscreen: function (fullscreen) { - if (this.pluginApi != null && this.pluginApi.setFullscreen) { - this.pluginApi.setFullscreen(fullscreen); - } - }, - - enterFullScreen: function() { - if (this.pluginApi != null && this.pluginApi.setFullscreen) { - this.setFullscreen(true); - } - - }, - - exitFullScreen: function() { - if (this.pluginApi != null && this.pluginApi.setFullscreen) { - this.setFullscreen(false); - } - }, + media.addEventListener('play', function () { + poster.style.display = 'none'; + }); - // start: fake events - addEventListener: function (eventName, callback, bubble) { - this.events[eventName] = this.events[eventName] || []; - this.events[eventName].push(callback); - }, - removeEventListener: function (eventName, callback) { - if (!eventName) { this.events = {}; return true; } - var callbacks = this.events[eventName]; - if (!callbacks) return true; - if (!callback) { this.events[eventName] = []; return true; } - for (var i = 0; i < callbacks.length; i++) { - if (callbacks[i] === callback) { - this.events[eventName].splice(i, 1); - return true; + media.addEventListener('playing', function () { + poster.style.display = 'none'; + }); + + if (player.options.showPosterWhenEnded && player.options.autoRewind) { + media.addEventListener('ended', function () { + poster.style.display = ''; + }); } - } - return false; - }, - dispatchEvent: function (eventName) { - var i, - args, - callbacks = this.events[eventName]; - if (callbacks) { - args = Array.prototype.slice.call(arguments, 1); - for (i = 0; i < callbacks.length; i++) { - callbacks[i].apply(null, args); + media.addEventListener('error', function () { + poster.style.display = 'none'; + }); + + if (player.options.showPosterWhenPaused) { + media.addEventListener('pause', function () { + // To avoid displaying the poster when video ended, since it + // triggers a pause event as well + if (!media.ended) { + poster.style.display = ''; + } + }); } } - }, - // end: fake events - - // fake DOM attribute methods - hasAttribute: function(name){ - return (name in this.attributes); - }, - removeAttribute: function(name){ - delete this.attributes[name]; - }, - getAttribute: function(name){ - if (this.hasAttribute(name)) { - return this.attributes[name]; + }, { + key: 'buildoverlays', + value: function buildoverlays(player, controls, layers, media) { + + if (!player.isVideo) { + return; + } + + var t = this, + loading = _document2.default.createElement('div'), + error = _document2.default.createElement('div'), + + // this needs to come last so it's on top + bigPlay = _document2.default.createElement('div'), + buffer = controls.querySelector('.' + t.options.classPrefix + 'time-buffering'); + + loading.style.display = 'none'; // start out hidden + loading.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer'; + loading.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-loading">' + ('<span class="' + t.options.classPrefix + 'overlay-loading-bg-img"></span>') + '</div>'; + layers.appendChild(loading); + + error.style.display = 'none'; + error.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer'; + error.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-error"></div>'; + layers.appendChild(error); + + bigPlay.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer ' + t.options.classPrefix + 'overlay-play'; + bigPlay.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-button" role="button" tabindex="0"' + ('aria-label="' + _i18n2.default.t('mejs.play') + '" aria-pressed="false"></div>'); + bigPlay.addEventListener('click', function () { + // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay + // started and immediately stopped the video + if (t.options.clickToPlayPause) { + + var button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'), + pressed = button.getAttribute('aria-pressed'); + + if (media.paused) { + media.play(); + } else { + media.pause(); + } + + button.setAttribute('aria-pressed', !!pressed); + } + }); + layers.appendChild(bigPlay); + + if (t.media.rendererName !== null && (t.media.rendererName.match(/(youtube|facebook)/) && !(player.media.originalNode.getAttribute('poster') || player.options.poster) || _constants.IS_STOCK_ANDROID)) { + bigPlay.style.display = 'none'; + } + + // show/hide big play button + media.addEventListener('play', function () { + bigPlay.style.display = 'none'; + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + error.style.display = 'none'; + }); + + media.addEventListener('playing', function () { + bigPlay.style.display = 'none'; + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + error.style.display = 'none'; + }); + + media.addEventListener('seeking', function () { + bigPlay.style.display = 'none'; + loading.style.display = ''; + if (buffer) { + buffer.style.display = ''; + } + }); + + media.addEventListener('seeked', function () { + bigPlay.style.display = ''; + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = ''; + } + }); + + media.addEventListener('pause', function () { + loading.style.display = 'none'; + if (!_constants.IS_STOCK_ANDROID) { + bigPlay.style.display = ''; + } + if (buffer) { + buffer.style.display = 'none'; + } + }); + + media.addEventListener('waiting', function () { + loading.style.display = ''; + if (buffer) { + buffer.style.display = ''; + } + }); + + // show/hide loading + media.addEventListener('loadeddata', function () { + loading.style.display = ''; + if (buffer) { + buffer.style.display = ''; + } + + // Firing the 'canplay' event after a timeout which isn't getting fired on some Android 4.1 devices + // (https://github.com/johndyer/mediaelement/issues/1305) + if (_constants.IS_ANDROID) { + media.canplayTimeout = setTimeout(function () { + if (_document2.default.createEvent) { + var evt = _document2.default.createEvent('HTMLEvents'); + evt.initEvent('canplay', true, true); + return media.dispatchEvent(evt); + } + }, 300); + } + }); + media.addEventListener('canplay', function () { + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + // Clear timeout inside 'loadeddata' to prevent 'canplay' from firing twice + clearTimeout(media.canplayTimeout); + }); + + // error handling + media.addEventListener('error', function (e) { + t._handleError(e); + loading.style.display = 'none'; + bigPlay.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + error.style.display = 'block'; + error.querySelector('.' + t.options.classPrefix + 'overlay-error').innerHTML = e.message; + }); + + media.addEventListener('keydown', function (e) { + t.onkeydown(player, media, e); + }); } - return ''; - }, - setAttribute: function(name, value){ - this.attributes[name] = value; - }, + }, { + key: 'buildkeyboard', + value: function buildkeyboard(player, controls, layers, media) { - remove: function() { - mejs.Utility.removeSwf(this.pluginElement.id); - mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id); - } -}; + var t = this; -// Handles calls from Flash/Silverlight and reports them as native <video/audio> events and properties -mejs.MediaPluginBridge = { + t.container.addEventListener('keydown', function () { + t.keyboardAction = true; + }); - pluginMediaElements:{}, - htmlMediaElements:{}, + // listen for key presses + t.globalBind('keydown', function (event) { + var container = _document2.default.activeElement.closest('.' + t.options.classPrefix + 'container'), + target = t.media.closest('.' + t.options.classPrefix + 'container'); + t.hasFocus = !!(container && target && container.id === target.id); + return t.onkeydown(player, media, event); + }); - registerPluginElement: function (id, pluginMediaElement, htmlMediaElement) { - this.pluginMediaElements[id] = pluginMediaElement; - this.htmlMediaElements[id] = htmlMediaElement; - }, + // check if someone clicked outside a player region, then kill its focus + t.globalBind('click', function (event) { + t.hasFocus = !!event.target.closest('.' + t.options.classPrefix + 'container'); + }); + } + }, { + key: 'onkeydown', + value: function onkeydown(player, media, e) { - unregisterPluginElement: function (id) { - delete this.pluginMediaElements[id]; - delete this.htmlMediaElements[id]; - }, + if (player.hasFocus && player.options.enableKeyboard) { + // find a matching key + for (var i = 0, total = player.options.keyActions.length; i < total; i++) { + var keyAction = player.options.keyActions[i]; - // when Flash/Silverlight is ready, it calls out to this method - initPlugin: function (id) { + for (var j = 0, jl = keyAction.keys.length; j < jl; j++) { + if (e.keyCode === keyAction.keys[j]) { + keyAction.action(player, media, e.keyCode, e); + e.preventDefault(); + e.stopPropagation(); + } + } + } + } - var pluginMediaElement = this.pluginMediaElements[id], - htmlMediaElement = this.htmlMediaElements[id]; + return true; + } + }, { + key: 'play', + value: function play() { + var t = this; - if (pluginMediaElement) { - // find the javascript bridge - switch (pluginMediaElement.pluginType) { - case "flash": - pluginMediaElement.pluginElement = pluginMediaElement.pluginApi = document.getElementById(id); - break; - case "silverlight": - pluginMediaElement.pluginElement = document.getElementById(pluginMediaElement.id); - pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS; - break; + // only load if the current time is 0 to ensure proper playing + if (t.media.getCurrentTime() <= 0) { + t.load(); } - - if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) { - pluginMediaElement.success(pluginMediaElement, htmlMediaElement); + t.media.play(); + } + }, { + key: 'pause', + value: function pause() { + try { + this.media.pause(); + } catch (e) { + } } - }, + }, { + key: 'load', + value: function load() { + var t = this; - // receives events from Flash/Silverlight and sends them out as HTML5 media events - // http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html - fireEvent: function (id, eventName, values) { - - var - e, - i, - bufferedTime, - pluginMediaElement = this.pluginMediaElements[id]; - - if(!pluginMediaElement){ - return; - } - - // fake event object to mimic real HTML media event. - e = { - type: eventName, - target: pluginMediaElement - }; + if (!t.isLoaded) { + t.media.load(); + } - // attach all values to element and event object - for (i in values) { - pluginMediaElement[i] = values[i]; - e[i] = values[i]; + t.isLoaded = true; } + }, { + key: 'setMuted', + value: function setMuted(muted) { + this.media.setMuted(muted); + } + }, { + key: 'setCurrentTime', + value: function setCurrentTime(time) { + this.media.setCurrentTime(time); + } + }, { + key: 'getCurrentTime', + value: function getCurrentTime() { + return this.media.currentTime; + } + }, { + key: 'setVolume', + value: function setVolume(volume) { + this.media.setVolume(volume); + } + }, { + key: 'getVolume', + value: function getVolume() { + return this.media.volume; + } + }, { + key: 'setSrc', + value: function setSrc(src) { + var t = this, + layer = _document2.default.getElementById(t.media.id + '-iframe-overlay'); - // fake the newer W3C buffered TimeRange (loaded and total have been removed) - bufferedTime = values.bufferedTime || 0; - - e.target.buffered = e.buffered = { - start: function(index) { - return 0; - }, - end: function (index) { - return bufferedTime; - }, - length: 1 - }; + if (layer) { + layer.remove(); + } - pluginMediaElement.dispatchEvent(e.type, e); - } -}; + t.media.setSrc(src); -/* -Default options -*/ -mejs.MediaElementDefaults = { - // allows testing on HTML5, flash, silverlight - // auto: attempts to detect what the browser can do - // auto_plugin: prefer plugins and then attempt native HTML5 - // native: forces HTML5 playback - // shim: disallows HTML5, will attempt either Flash or Silverlight - // none: forces fallback view - mode: 'auto', - // remove or reorder to change plugin priority and availability - plugins: ['flash','silverlight','youtube','vimeo'], - // shows debug errors on screen - enablePluginDebug: false, - // use plugin for browsers that have trouble with Basic Authentication on HTTPS sites - httpsBasicAuthSite: false, - // overrides the type specified, useful for dynamic instantiation - type: '', - // path to Flash and Silverlight plugins - pluginPath: mejs.Utility.getScriptPath(['mediaelement.js','mediaelement.min.js','mediaelement-and-player.js','mediaelement-and-player.min.js']), - // name of flash file - flashName: 'flashmediaelement.swf', - // streamer for RTMP streaming - flashStreamer: '', - // turns on the smoothing filter in Flash - enablePluginSmoothing: false, - // enabled pseudo-streaming (seek) on .mp4 files - enablePseudoStreaming: false, - // start query parameter sent to server for pseudo-streaming - pseudoStreamingStartQueryParam: 'start', - // name of silverlight file - silverlightName: 'silverlightmediaelement.xap', - // default if the <video width> is not specified - defaultVideoWidth: 480, - // default if the <video height> is not specified - defaultVideoHeight: 270, - // overrides <video width> - pluginWidth: -1, - // overrides <video height> - pluginHeight: -1, - // additional plugin variables in 'key=value' form - pluginVars: [], - // rate in milliseconds for Flash and Silverlight to fire the timeupdate event - // larger number is less accurate, but less strain on plugin->JavaScript bridge - timerRate: 250, - // initial volume for player - startVolume: 0.8, - success: function () { }, - error: function () { } -}; + t.createIframeLayer(); + } + }, { + key: 'remove', + value: function remove() { -/* -Determines if a browser supports the <video> or <audio> element -and returns either the native element or a Flash/Silverlight version that -mimics HTML5 MediaElement -*/ -mejs.MediaElement = function (el, o) { - return mejs.HtmlMediaElementShim.create(el,o); -}; + var t = this, + rendererName = t.media.rendererName; -mejs.HtmlMediaElementShim = { - - create: function(el, o) { - var - options = mejs.MediaElementDefaults, - htmlMediaElement = (typeof(el) == 'string') ? document.getElementById(el) : el, - tagName = htmlMediaElement.tagName.toLowerCase(), - isMediaTag = (tagName === 'audio' || tagName === 'video'), - src = (isMediaTag) ? htmlMediaElement.getAttribute('src') : htmlMediaElement.getAttribute('href'), - poster = htmlMediaElement.getAttribute('poster'), - autoplay = htmlMediaElement.getAttribute('autoplay'), - preload = htmlMediaElement.getAttribute('preload'), - controls = htmlMediaElement.getAttribute('controls'), - playback, - prop; - - // extend options - for (prop in o) { - options[prop] = o[prop]; - } - - // clean up attributes - src = (typeof src == 'undefined' || src === null || src == '') ? null : src; - poster = (typeof poster == 'undefined' || poster === null) ? '' : poster; - preload = (typeof preload == 'undefined' || preload === null || preload === 'false') ? 'none' : preload; - autoplay = !(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false'); - controls = !(typeof controls == 'undefined' || controls === null || controls === 'false'); - - // test for HTML5 and plugin capabilities - playback = this.determinePlayback(htmlMediaElement, options, mejs.MediaFeatures.supportsMediaTag, isMediaTag, src); - playback.url = (playback.url !== null) ? mejs.Utility.absolutizeUrl(playback.url) : ''; - - if (playback.method == 'native') { - // second fix for android - if (mejs.MediaFeatures.isBustedAndroid) { - htmlMediaElement.src = playback.url; - htmlMediaElement.addEventListener('click', function() { - htmlMediaElement.play(); - }, false); - } - - // add methods to native HTMLMediaElement - return this.updateNative(playback, options, autoplay, preload); - } else if (playback.method !== '') { - // create plugin to mimic HTMLMediaElement - - return this.createPlugin( playback, options, poster, autoplay, preload, controls); - } else { - // boo, no HTML5, no Flash, no Silverlight. - this.createErrorMessage( playback, options, poster ); - - return this; - } - }, - - determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) { - var - mediaFiles = [], - i, - j, - k, - l, - n, - type, - result = { method: '', url: '', htmlMediaElement: htmlMediaElement, isVideo: (htmlMediaElement.tagName.toLowerCase() != 'audio')}, - pluginName, - pluginVersions, - pluginInfo, - dummy, - media; - - // STEP 1: Get URL and type from <video src> or <source src> - - // supplied type overrides <video type> and <source type> - if (typeof options.type != 'undefined' && options.type !== '') { - - // accept either string or array of types - if (typeof options.type == 'string') { - mediaFiles.push({type:options.type, url:src}); - } else { - - for (i=0; i<options.type.length; i++) { - mediaFiles.push({type:options.type[i], url:src}); - } + // Stop completely media playing + if (!t.media.paused) { + t.media.pause(); } - // test for src attribute first - } else if (src !== null) { - type = this.formatType(src, htmlMediaElement.getAttribute('type')); - mediaFiles.push({type:type, url:src}); + var src = t.media.originalNode.getAttribute('src'); + t.media.setSrc(''); - // then test for <source> elements - } else { - // test <source> types to see if they are usable - for (i = 0; i < htmlMediaElement.childNodes.length; i++) { - n = htmlMediaElement.childNodes[i]; - if (n.nodeType == 1 && n.tagName.toLowerCase() == 'source') { - src = n.getAttribute('src'); - type = this.formatType(src, n.getAttribute('type')); - media = n.getAttribute('media'); - - if (!media || !window.matchMedia || (window.matchMedia && window.matchMedia(media).matches)) { - mediaFiles.push({type:type, url:src}); + // invoke features cleanup + for (var featureIndex in t.options.features) { + var feature = t.options.features[featureIndex]; + if (t['clean' + feature]) { + try { + t['clean' + feature](t); + } catch (e) { + // @todo: report control error + console.error('error cleaning ' + feature, e); } } } - } - - // in the case of dynamicly created players - // check for audio types - if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) { - result.isVideo = false; - } - - - // STEP 2: Test for playback method - - // special case for Android which sadly doesn't implement the canPlayType function (always returns '') - if (mejs.MediaFeatures.isBustedAndroid) { - htmlMediaElement.canPlayType = function(type) { - return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : ''; - }; - } - - // special case for Chromium to specify natively supported video codecs (i.e. WebM and Theora) - if (mejs.MediaFeatures.isChromium) { - htmlMediaElement.canPlayType = function(type) { - return (type.match(/video\/(webm|ogv|ogg)/gi) !== null) ? 'maybe' : ''; - }; - } - // test for native playback first - if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native') && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) { - - if (!isMediaTag) { - - // create a real HTML5 Media Element - dummy = document.createElement( result.isVideo ? 'video' : 'audio'); - htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement); - htmlMediaElement.style.display = 'none'; - - // use this one from now on - result.htmlMediaElement = htmlMediaElement = dummy; - } - - for (i=0; i<mediaFiles.length; i++) { - // normal check - if (mediaFiles[i].type == "video/m3u8" || htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== '' - // special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg') - || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== '' - // special case for m4a supported by detecting mp4 support - || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/m4a/,'mp4')).replace(/no/, '') !== '') { - result.method = 'native'; - result.url = mediaFiles[i].url; - break; + // reset dimensions + var nativeWidth = t.node.getAttribute('width'), + nativeHeight = t.node.getAttribute('height'); + if (nativeWidth) { + if (nativeWidth.match('%') === null) { + nativeWidth = nativeWidth + 'px'; } - } - - if (result.method === 'native') { - if (result.url !== null) { - htmlMediaElement.src = result.url; - } - - // if `auto_plugin` mode, then cache the native result but try plugins. - if (options.mode !== 'auto_plugin') { - return result; + } else { + nativeWidth = 'auto'; + } + if (nativeHeight) { + if (nativeHeight.match('%') === null) { + nativeHeight = nativeHeight + 'px'; } + } else { + nativeHeight = 'auto'; } - } + t.node.style.width = nativeWidth; + t.node.style.height = nativeHeight; - // if native playback didn't work, then test plugins - if (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'shim') { - for (i=0; i<mediaFiles.length; i++) { - type = mediaFiles[i].type; + // grab video and put it back in place + if (!t.isDynamic) { + t.node.setAttribute('controls', true); + t.node.setAttribute('id', t.node.getAttribute('id').replace('_' + rendererName, '').replace('_from_mejs', '')); - // test all plugins in order of preference [silverlight, flash] - for (j=0; j<options.plugins.length; j++) { + // Remove `autoplay` (not worth bringing it back once player is destroyed) + delete t.node.autoplay; - pluginName = options.plugins[j]; - - // test version of plugin (for future features) - pluginVersions = mejs.plugins[pluginName]; - - for (k=0; k<pluginVersions.length; k++) { - pluginInfo = pluginVersions[k]; - - // test if user has the correct plugin version - - // for youtube/vimeo - if (pluginInfo.version == null || - - mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) { - - // test for plugin playback types - for (l=0; l<pluginInfo.types.length; l++) { - // find plugin that can play the type - if (type == pluginInfo.types[l]) { - result.method = pluginName; - result.url = mediaFiles[i].url; - return result; - } - } - } - } + // Reintegrate file if it can be played + if (t.media.canPlayType((0, _media.getTypeFromFile)(src))) { + t.node.setAttribute('src', src); } - } - } - - // at this point, being in 'auto_plugin' mode implies that we tried plugins but failed. - // if we have native support then return that. - if (options.mode === 'auto_plugin' && result.method === 'native') { - return result; - } - // what if there's nothing to play? just grab the first available - if (result.method === '' && mediaFiles.length > 0) { - result.url = mediaFiles[0].url; - } - - return result; - }, - - formatType: function(url, type) { - var ext; + // If <iframe>, remove overlay + if (rendererName.match(/iframe/i) !== null) { + var layer = _document2.default.getElementById(t.media.id + '-iframe-overlay'); + layer.remove(); + } - // if no type is supplied, fake it with the extension - if (url && !type) { - return this.getTypeFromFile(url); - } else { - // only return the mime part of the type in case the attribute contains the codec - // see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element - // `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4` - - if (type && ~type.indexOf(';')) { - return type.substr(0, type.indexOf(';')); + var node = t.node.cloneNode(true); + t.container.parentNode.insertBefore(node, t.container); + t.node.remove(); + delete t.node; } else { - return type; + t.container.parentNode.insertBefore(t.node, t.container); } - } - }, - - getTypeFromFile: function(url) { - url = url.split('?')[0]; - var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(); - return (/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + this.getTypeFromExtension(ext); - }, - - getTypeFromExtension: function(ext) { - - switch (ext) { - case 'mp4': - case 'm4v': - case 'm4a': - return 'mp4'; - case 'webm': - case 'webma': - case 'webmv': - return 'webm'; - case 'ogg': - case 'oga': - case 'ogv': - return 'ogg'; - default: - return ext; - } - }, - - createErrorMessage: function(playback, options, poster) { - var - htmlMediaElement = playback.htmlMediaElement, - errorContainer = document.createElement('div'); - - errorContainer.className = 'me-cannotplay'; - - try { - errorContainer.style.width = htmlMediaElement.width + 'px'; - errorContainer.style.height = htmlMediaElement.height + 'px'; - } catch (e) {} - - if (options.customError) { - errorContainer.innerHTML = options.customError; - } else { - errorContainer.innerHTML = (poster !== '') ? - '<a href="' + playback.url + '"><img src="' + poster + '" width="100%" height="100%" /></a>' : - '<a href="' + playback.url + '"><span>' + mejs.i18n.t('Download File') + '</span></a>'; - } - htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement); - htmlMediaElement.style.display = 'none'; + if (typeof t.media.destroy === 'function') { + t.media.destroy(); + } - options.error(htmlMediaElement); - }, + // Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to + // pause a non existent Flash API. + delete _mejs2.default.players[t.id]; - createPlugin:function(playback, options, poster, autoplay, preload, controls) { - var - htmlMediaElement = playback.htmlMediaElement, - width = 1, - height = 1, - pluginid = 'me_' + playback.method + '_' + (mejs.meIndex++), - pluginMediaElement = new mejs.PluginMediaElement(pluginid, playback.method, playback.url), - container = document.createElement('div'), - specialIEContainer, - node, - initVars; - - // copy tagName from html media element - pluginMediaElement.tagName = htmlMediaElement.tagName - - // copy attributes from html media element to plugin media element - for (var i = 0; i < htmlMediaElement.attributes.length; i++) { - var attribute = htmlMediaElement.attributes[i]; - if (attribute.specified == true) { - pluginMediaElement.setAttribute(attribute.name, attribute.value); - } - } - - // check for placement inside a <p> tag (sometimes WYSIWYG editors do this) - node = htmlMediaElement.parentNode; - while (node !== null && node.tagName.toLowerCase() !== 'body' && node.parentNode != null) { - if (node.parentNode.tagName.toLowerCase() === 'p') { - node.parentNode.parentNode.insertBefore(node, node.parentNode); - break; + if (_typeof(t.container) === 'object') { + var offscreen = t.container.parentNode.querySelector('.' + t.options.classPrefix + 'offscreen'); + offscreen.remove(); + t.container.remove(); } - node = node.parentNode; - } + t.globalUnbind(); - if (playback.isVideo) { - width = (options.pluginWidth > 0) ? options.pluginWidth : (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth; - height = (options.pluginHeight > 0) ? options.pluginHeight : (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight; - - // in case of '%' make sure it's encoded - width = mejs.Utility.encodeUrl(width); - height = mejs.Utility.encodeUrl(height); - - } else { - if (options.enablePluginDebug) { - width = 320; - height = 240; - } + delete t.media.player; } + }]); - // register plugin - pluginMediaElement.success = options.success; - mejs.MediaPluginBridge.registerPluginElement(pluginid, pluginMediaElement, htmlMediaElement); + return MediaElementPlayer; +}(); - // add container (must be added to DOM before inserting HTML for IE) - container.className = 'me-plugin'; - container.id = pluginid + '_container'; - - if (playback.isVideo) { - htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement); - } else { - document.body.insertBefore(container, document.body.childNodes[0]); - } - - // flash/silverlight vars - initVars = [ - 'id=' + pluginid, - 'isvideo=' + ((playback.isVideo) ? "true" : "false"), - 'autoplay=' + ((autoplay) ? "true" : "false"), - 'preload=' + preload, - 'width=' + width, - 'startvolume=' + options.startVolume, - 'timerrate=' + options.timerRate, - 'flashstreamer=' + options.flashStreamer, - 'height=' + height, - 'pseudostreamstart=' + options.pseudoStreamingStartQueryParam]; - - if (playback.url !== null) { - if (playback.method == 'flash') { - initVars.push('file=' + mejs.Utility.encodeUrl(playback.url)); - } else { - initVars.push('file=' + playback.url); - } - } - if (options.enablePluginDebug) { - initVars.push('debug=true'); - } - if (options.enablePluginSmoothing) { - initVars.push('smoothing=true'); - } - if (options.enablePseudoStreaming) { - initVars.push('pseudostreaming=true'); - } - if (controls) { - initVars.push('controls=true'); // shows controls in the plugin if desired - } - if (options.pluginVars) { - initVars = initVars.concat(options.pluginVars); - } - - switch (playback.method) { - case 'silverlight': - container.innerHTML = -'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' + -'<param name="initParams" value="' + initVars.join(',') + '" />' + -'<param name="windowless" value="true" />' + -'<param name="background" value="black" />' + -'<param name="minRuntimeVersion" value="3.0.0.0" />' + -'<param name="autoUpgrade" value="true" />' + -'<param name="source" value="' + options.pluginPath + options.silverlightName + '" />' + -'</object>'; - break; +_window2.default.MediaElementPlayer = MediaElementPlayer; - case 'flash': - - if (mejs.MediaFeatures.isIE) { - specialIEContainer = document.createElement('div'); - container.appendChild(specialIEContainer); - specialIEContainer.outerHTML = -'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' + -'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' + -'<param name="movie" value="' + options.pluginPath + options.flashName + '?x=' + (new Date()) + '" />' + -'<param name="flashvars" value="' + initVars.join('&') + '" />' + -'<param name="quality" value="high" />' + -'<param name="bgcolor" value="#000000" />' + -'<param name="wmode" value="transparent" />' + -'<param name="allowScriptAccess" value="always" />' + -'<param name="allowFullScreen" value="true" />' + -'<param name="scale" value="default" />' + -'</object>'; +exports.default = MediaElementPlayer; - } else { +// turn into plugin - container.innerHTML = -'<embed id="' + pluginid + '" name="' + pluginid + '" ' + -'play="true" ' + -'loop="false" ' + -'quality="high" ' + -'bgcolor="#000000" ' + -'wmode="transparent" ' + -'allowScriptAccess="always" ' + -'allowFullScreen="true" ' + -'type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" ' + -'src="' + options.pluginPath + options.flashName + '" ' + -'flashvars="' + initVars.join('&') + '" ' + -'width="' + width + '" ' + -'height="' + height + '" ' + -'scale="default"' + -'class="mejs-shim"></embed>'; - } - break; - - case 'youtube': - - - var videoId; - // youtu.be url from share button - if (playback.url.lastIndexOf("youtu.be") != -1) { - videoId = playback.url.substr(playback.url.lastIndexOf('/')+1); - if (videoId.indexOf('?') != -1) { - videoId = videoId.substr(0, videoId.indexOf('?')); +(function ($) { + + if (typeof $ !== 'undefined') { + $.fn.mediaelementplayer = function (options) { + if (options === false) { + this.each(function () { + var player = $(this).data('mediaelementplayer'); + if (player) { + player.remove(); } - } - else { - videoId = playback.url.substr(playback.url.lastIndexOf('=')+1); - } - youtubeSettings = { - container: container, - containerId: container.id, - pluginMediaElement: pluginMediaElement, - pluginId: pluginid, - videoId: videoId, - height: height, - width: width - }; - - if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) { - mejs.YouTubeApi.createFlash(youtubeSettings); - } else { - mejs.YouTubeApi.enqueueIframe(youtubeSettings); - } - - break; - - // DEMO Code. Does NOT work. - case 'vimeo': - var player_id = pluginid + "_player"; - pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1); - - container.innerHTML ='<iframe src="//player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '"></iframe>'; - if (typeof($f) == 'function') { // froogaloop available - var player = $f(container.childNodes[0]); - player.addEvent('ready', function() { - $.extend( player, { - playVideo: function() { - player.api( 'play' ); - }, - stopVideo: function() { - player.api( 'unload' ); - }, - pauseVideo: function() { - player.api( 'pause' ); - }, - seekTo: function( seconds ) { - player.api( 'seekTo', seconds ); - }, - setVolume: function( volume ) { - player.api( 'setVolume', volume ); - }, - setMuted: function( muted ) { - if( muted ) { - player.lastVolume = player.api( 'getVolume' ); - player.api( 'setVolume', 0 ); - } else { - player.api( 'setVolume', player.lastVolume ); - delete player.lastVolume; - } - } - }); + $(this).removeData('mediaelementplayer'); + }); + } else { + this.each(function () { + $(this).data('mediaelementplayer', new MediaElementPlayer(this, options)); + }); + } + return this; + }; - function createEvent(player, pluginMediaElement, eventName, e) { - var obj = { - type: eventName, - target: pluginMediaElement - }; - if (eventName == 'timeupdate') { - pluginMediaElement.currentTime = obj.currentTime = e.seconds; - pluginMediaElement.duration = obj.duration = e.duration; - } - pluginMediaElement.dispatchEvent(obj.type, obj); - } + $(_document2.default).ready(function () { + // auto enable using JSON attribute + $('.' + config.classPrefix + 'player').mediaelementplayer(); + }); + } +})(_mejs2.default.$); - player.addEvent('play', function() { - createEvent(player, pluginMediaElement, 'play'); - createEvent(player, pluginMediaElement, 'playing'); - }); +},{"2":2,"23":23,"24":24,"25":25,"26":26,"28":28,"3":3,"4":4,"5":5,"6":6}],17:[function(_dereq_,module,exports){ +'use strict'; - player.addEvent('pause', function() { - createEvent(player, pluginMediaElement, 'pause'); - }); +var _window = _dereq_(3); - player.addEvent('finish', function() { - createEvent(player, pluginMediaElement, 'ended'); - }); +var _window2 = _interopRequireDefault(_window); - player.addEvent('playProgress', function(e) { - createEvent(player, pluginMediaElement, 'timeupdate', e); - }); +var _document = _dereq_(2); - pluginMediaElement.pluginElement = container; - pluginMediaElement.pluginApi = player; +var _document2 = _interopRequireDefault(_document); - // init mejs - mejs.MediaPluginBridge.initPlugin(pluginid); - }); - } - else { - console.warn("You need to include froogaloop for vimeo to work"); - } - break; - } - // hide original element - htmlMediaElement.style.display = 'none'; - // prevent browser from autoplaying when using a plugin - htmlMediaElement.removeAttribute('autoplay'); +var _mejs = _dereq_(6); - // FYI: options.success will be fired by the MediaPluginBridge - - return pluginMediaElement; - }, +var _mejs2 = _interopRequireDefault(_mejs); - updateNative: function(playback, options, autoplay, preload) { - - var htmlMediaElement = playback.htmlMediaElement, - m; - - - // add methods to video object to bring it into parity with Flash Object - for (m in mejs.HtmlMediaElement) { - htmlMediaElement[m] = mejs.HtmlMediaElement[m]; - } - - /* - Chrome now supports preload="none" - if (mejs.MediaFeatures.isChrome) { - - // special case to enforce preload attribute (Chrome doesn't respect this) - if (preload === 'none' && !autoplay) { - - // forces the browser to stop loading (note: fails in IE9) - htmlMediaElement.src = ''; - htmlMediaElement.load(); - htmlMediaElement.canceledPreload = true; - - htmlMediaElement.addEventListener('play',function() { - if (htmlMediaElement.canceledPreload) { - htmlMediaElement.src = playback.url; - htmlMediaElement.load(); - htmlMediaElement.play(); - htmlMediaElement.canceledPreload = false; - } - }, false); - // for some reason Chrome forgets how to autoplay sometimes. - } else if (autoplay) { - htmlMediaElement.load(); - htmlMediaElement.play(); - } - } - */ +var _renderer = _dereq_(7); - // fire success code - options.success(htmlMediaElement, htmlMediaElement); - - return htmlMediaElement; - } -}; +var _general = _dereq_(25); -/* - - test on IE (object vs. embed) - - determine when to use iframe (Firefox, Safari, Mobile) vs. Flash (Chrome, IE) - - fullscreen? -*/ +var _media = _dereq_(26); -// YouTube Flash and Iframe API -mejs.YouTubeApi = { - isIframeStarted: false, - isIframeLoaded: false, - loadIframeApi: function() { - if (!this.isIframeStarted) { - var tag = document.createElement('script'); - tag.src = "//www.youtube.com/player_api"; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - this.isIframeStarted = true; - } - }, - iframeQueue: [], - enqueueIframe: function(yt) { - - if (this.isLoaded) { - this.createIframe(yt); - } else { - this.loadIframeApi(); - this.iframeQueue.push(yt); - } - }, - createIframe: function(settings) { - - var - pluginMediaElement = settings.pluginMediaElement, - player = new YT.Player(settings.containerId, { - height: settings.height, - width: settings.width, - videoId: settings.videoId, - playerVars: {controls:0}, - events: { - 'onReady': function() { - - // hook up iframe object to MEjs - settings.pluginMediaElement.pluginApi = player; - - // init mejs - mejs.MediaPluginBridge.initPlugin(settings.pluginId); - - // create timer - setInterval(function() { - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate'); - }, 250); - }, - 'onStateChange': function(e) { - - mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement); - - } - } - }); - }, - - createEvent: function (player, pluginMediaElement, eventName) { - var obj = { - type: eventName, - target: pluginMediaElement - }; +var _constants = _dereq_(23); - if (player && player.getDuration) { - - // time - pluginMediaElement.currentTime = obj.currentTime = player.getCurrentTime(); - pluginMediaElement.duration = obj.duration = player.getDuration(); - - // state - obj.paused = pluginMediaElement.paused; - obj.ended = pluginMediaElement.ended; - - // sound - obj.muted = player.isMuted(); - obj.volume = player.getVolume() / 100; - - // progress - obj.bytesTotal = player.getVideoBytesTotal(); - obj.bufferedBytes = player.getVideoBytesLoaded(); - - // fake the W3C buffered TimeRange - var bufferedTime = obj.bufferedBytes / obj.bytesTotal * obj.duration; - - obj.target.buffered = obj.buffered = { - start: function(index) { - return 0; - }, - end: function (index) { - return bufferedTime; - }, - length: 1 - }; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - } - - // send event up the chain - pluginMediaElement.dispatchEvent(obj.type, obj); - }, - - iFrameReady: function() { - - this.isLoaded = true; - this.isIframeLoaded = true; - - while (this.iframeQueue.length > 0) { - var settings = this.iframeQueue.pop(); - this.createIframe(settings); - } - }, - - // FLASH! - flashPlayers: {}, - createFlash: function(settings) { - - this.flashPlayers[settings.pluginId] = settings; - - /* - settings.container.innerHTML = - '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="//www.youtube.com/apiplayer?enablejsapi=1&playerapiid=' + settings.pluginId + '&version=3&autoplay=0&controls=0&modestbranding=1&loop=0" ' + - 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' + - '<param name="allowScriptAccess" value="always">' + - '<param name="wmode" value="transparent">' + - '</object>'; - */ - - var specialIEContainer, - youtubeUrl = '//www.youtube.com/apiplayer?enablejsapi=1&playerapiid=' + settings.pluginId + '&version=3&autoplay=0&controls=0&modestbranding=1&loop=0'; - - if (mejs.MediaFeatures.isIE) { - - specialIEContainer = document.createElement('div'); - settings.container.appendChild(specialIEContainer); - specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' + -'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' + - '<param name="movie" value="' + youtubeUrl + '" />' + - '<param name="wmode" value="transparent" />' + - '<param name="allowScriptAccess" value="always" />' + - '<param name="allowFullScreen" value="true" />' + -'</object>'; +/** + * Native M(PEG)-Dash renderer + * + * Uses dash.js, a reference client implementation for the playback of M(PEG)-DASH via Javascript and compliant browsers. + * It relies on HTML5 video and MediaSource Extensions for playback. + * This renderer integrates new events associated with mpd files. + * @see https://github.com/Dash-Industry-Forum/dash.js + * + */ +var NativeDash = { + /** + * @type {Boolean} + */ + isMediaLoaded: false, + /** + * @type {Array} + */ + creationQueue: [], + + /** + * Create a queue to prepare the loading of an DASH source + * + * @param {Object} settings - an object with settings needed to load an DASH player instance + */ + prepareSettings: function prepareSettings(settings) { + if (NativeDash.isLoaded) { + NativeDash.createInstance(settings); } else { - settings.container.innerHTML = - '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' + - 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' + - '<param name="allowScriptAccess" value="always">' + - '<param name="wmode" value="transparent">' + - '</object>'; - } - - }, - - flashReady: function(id) { - var - settings = this.flashPlayers[id], - player = document.getElementById(id), - pluginMediaElement = settings.pluginMediaElement; - - // hook up and return to MediaELementPlayer.success - pluginMediaElement.pluginApi = - pluginMediaElement.pluginElement = player; - mejs.MediaPluginBridge.initPlugin(id); - - // load the youtube video - player.cueVideoById(settings.videoId); - - var callbackName = settings.containerId + '_callback'; - - window[callbackName] = function(e) { - mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement); - } - - player.addEventListener('onStateChange', callbackName); - - setInterval(function() { - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate'); - }, 250); - - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay'); + NativeDash.loadScript(settings); + NativeDash.creationQueue.push(settings); + } }, - - handleStateChange: function(youTubeState, player, pluginMediaElement) { - switch (youTubeState) { - case -1: // not started - pluginMediaElement.paused = true; - pluginMediaElement.ended = true; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'loadedmetadata'); - //createYouTubeEvent(player, pluginMediaElement, 'loadeddata'); - break; - case 0: - pluginMediaElement.paused = false; - pluginMediaElement.ended = true; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'ended'); - break; - case 1: - pluginMediaElement.paused = false; - pluginMediaElement.ended = false; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play'); - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing'); - break; - case 2: - pluginMediaElement.paused = true; - pluginMediaElement.ended = false; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause'); - break; - case 3: // buffering - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'progress'); - break; - case 5: - // cued? - break; - - } - - } -} -// IFRAME -function onYouTubePlayerAPIReady() { - mejs.YouTubeApi.iFrameReady(); -} -// FLASH -function onYouTubePlayerReady(id) { - mejs.YouTubeApi.flashReady(id); -} -window.mejs = mejs; -window.MediaElement = mejs.MediaElement; + /** + * Load dash.mediaplayer.js script on the header of the document + * + * @param {Object} settings - an object with settings needed to load an DASH player instance + */ + loadScript: function loadScript(settings) { -/*! - * Adds Internationalization and localization to mediaelement. - * - * This file does not contain translations, you have to add the manually. - * The schema is always the same: me-i18n-locale-[ISO_639-1 Code].js - * - * Examples are provided both for german and chinese translation. - * - * - * What is the concept beyond i18n? - * http://en.wikipedia.org/wiki/Internationalization_and_localization - * - * What langcode should i use? - * http://en.wikipedia.org/wiki/ISO_639-1 - * - * - * License? - * - * The i18n file uses methods from the Drupal project (drupal.js): - * - i18n.methods.t() (modified) - * - i18n.methods.checkPlain() (full copy) - * - * The Drupal project is (like mediaelementjs) licensed under GPLv2. - * - http://drupal.org/licensing/faq/#q1 - * - https://github.com/johndyer/mediaelement - * - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * - * - * @author - * Tim Latz (latz.tim@gmail.com) - * - * - * @params - * - context - document, iframe .. - * - exports - CommonJS, window .. - * - */ -;(function(context, exports, undefined) { - "use strict"; - var i18n = { - "locale": { - "language" : '', - "strings" : {} - }, - "methods" : {} - }; -// start i18n - - - /** - * Get language, fallback to browser's language if empty - */ - i18n.getLanguage = function () { - var language = i18n.locale.language || window.navigator.userLanguage || window.navigator.language; - // convert to iso 639-1 (2-letters, lower case) - return language.substr(0, 2).toLowerCase(); - }; - - // i18n fixes for compatibility with WordPress - if ( typeof mejsL10n != 'undefined' ) { - i18n.locale.language = mejsL10n.language; - } + // Skip script loading since it is already loaded + if (typeof dashjs !== 'undefined') { + NativeDash.createInstance(settings); + } else if (!NativeDash.isScriptLoaded) { + (function () { + settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : '//cdn.dashjs.org/latest/dash.mediaplayer.min.js'; + var script = _document2.default.createElement('script'), + firstScriptTag = _document2.default.getElementsByTagName('script')[0]; - /** - * Encode special characters in a plain-text string for display as HTML. - */ - i18n.methods.checkPlain = function (str) { - var character, regex, - replace = { - '&': '&', - '"': '"', - '<': '<', - '>': '>' - }; - str = String(str); - for (character in replace) { - if (replace.hasOwnProperty(character)) { - regex = new RegExp(character, 'g'); - str = str.replace(regex, replace[character]); - } - } - return str; - }; - - /** - * Translate strings to the page language or a given language. - * - * - * @param str - * A string containing the English string to translate. - * - * @param options - * - 'context' (defaults to the default context): The context the source string - * belongs to. - * - * @return - * The translated string, escaped via i18n.methods.checkPlain() - */ - i18n.methods.t = function (str, options) { - - // Fetch the localized version of the string. - if (i18n.locale.strings && i18n.locale.strings[options.context] && i18n.locale.strings[options.context][str]) { - str = i18n.locale.strings[options.context][str]; - } - - return i18n.methods.checkPlain(str); - }; - - - /** - * Wrapper for i18n.methods.t() - * - * @see i18n.methods.t() - * @throws InvalidArgumentException - */ - i18n.t = function(str, options) { - - if (typeof str === 'string' && str.length > 0) { - - // check every time due language can change for - // different reasons (translation, lang switcher ..) - var language = i18n.getLanguage(); - - options = options || { - "context" : language - }; - - return i18n.methods.t(str, options); - } - else { - throw { - "name" : 'InvalidArgumentException', - "message" : 'First argument is either not a string or empty.' - }; - } - }; - -// end i18n - exports.i18n = i18n; -}(document, mejs)); - -// i18n fixes for compatibility with WordPress -;(function(exports, undefined) { - - "use strict"; - - if ( typeof mejsL10n != 'undefined' ) { - exports[mejsL10n.language] = mejsL10n.strings; - } + var done = false; -}(mejs.i18n.locale.strings)); + script.src = settings.options.path; -/*! - * This is a i18n.locale language object. - * - * German translation by Tim Latz, latz.tim@gmail.com - * - * @author - * Tim Latz (latz.tim@gmail.com) - * - * @see - * me-i18n.js - * - * @params - * - exports - CommonJS, window .. - */ -;(function(exports, undefined) { + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function () { + if (!done && (!this.readyState || this.readyState === undefined || this.readyState === 'loaded' || this.readyState === 'complete')) { + done = true; + NativeDash.mediaReady(); + script.onload = script.onreadystatechange = null; + } + }; + + firstScriptTag.parentNode.insertBefore(script, firstScriptTag); - "use strict"; + NativeDash.isScriptLoaded = true; + })(); + } + }, - if (typeof exports.de === 'undefined') { - exports.de = { - "Fullscreen" : "Vollbild", - "Go Fullscreen" : "Vollbild an", - "Turn off Fullscreen" : "Vollbild aus", - "Close" : "Schließen" - }; - } + /** + * Process queue of DASH player creation + * + */ + mediaReady: function mediaReady() { -}(mejs.i18n.locale.strings)); -/*! - * This is a i18n.locale language object. - * - * Traditional chinese translation by Tim Latz, latz.tim@gmail.com - * - * @author - * Tim Latz (latz.tim@gmail.com) - * - * @see - * me-i18n.js - * - * @params - * - exports - CommonJS, window .. - */ -;(function(exports, undefined) { + NativeDash.isLoaded = true; + NativeDash.isScriptLoaded = true; - "use strict"; + while (NativeDash.creationQueue.length > 0) { + var settings = NativeDash.creationQueue.pop(); + NativeDash.createInstance(settings); + } + }, - if (typeof exports.zh === 'undefined') { - exports.zh = { - "Fullscreen" : "全螢幕", - "Go Fullscreen" : "å…¨å±æ¨¡å¼", - "Turn off Fullscreen" : "退出全å±æ¨¡å¼", - "Close" : "關閉" - }; - } + /** + * Create a new instance of DASH player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to instantiate DASH object + */ + createInstance: function createInstance(settings) { -}(mejs.i18n.locale.strings)); + var player = dashjs.MediaPlayer().create(); + _window2.default['__ready__' + settings.id](player); + } +}; +var DashNativeRenderer = { + name: 'native_dash', -/*! - * MediaElementPlayer - * http://mediaelementjs.com/ - * - * Creates a controller bar for HTML5 <video> add <audio> tags - * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper) - * - * Copyright 2010-2013, John Dyer (http://j.hn/) - * License: MIT - * - */ -if (typeof jQuery != 'undefined') { - mejs.$ = jQuery; -} else if (typeof ender != 'undefined') { - mejs.$ = ender; -} -(function ($) { + options: { + prefix: 'native_dash', + dash: { + // Special config: used to set the local path/URL of dash.js player library + path: '//cdn.dashjs.org/latest/dash.mediaplayer.min.js', + debug: false + } + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return _constants.HAS_MSE && ['application/dash+xml'].includes(type); + }, - // default player values - mejs.MepDefaults = { - // url to poster (to fix iOS 3.x) - poster: '', - // When the video is ended, we can show the poster. - showPosterWhenEnded: false, - // default if the <video width> is not specified - defaultVideoWidth: 480, - // default if the <video height> is not specified - defaultVideoHeight: 270, - // if set, overrides <video width> - videoWidth: -1, - // if set, overrides <video height> - videoHeight: -1, - // default if the user doesn't specify - defaultAudioWidth: 400, - // default if the user doesn't specify - defaultAudioHeight: 30, - - // default amount to move back when back key is pressed - defaultSeekBackwardInterval: function(media) { - return (media.duration * 0.05); - }, - // default amount to move forward when forward key is pressed - defaultSeekForwardInterval: function(media) { - return (media.duration * 0.05); - }, + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var originalNode = mediaElement.originalNode, + id = mediaElement.id + '_' + options.prefix, + preload = originalNode.getAttribute('preload'), + autoplay = originalNode.autoplay; + + var node = null, + dashPlayer = null; + + node = originalNode.cloneNode(true); + options = Object.assign(options, mediaElement.options); + + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + node['get' + capName] = function () { + return dashPlayer !== null ? node[propName] : null; + }; - // set dimensions via JS instead of CSS - setDimensions: true, - - // width of audio player - audioWidth: -1, - // height of audio player - audioHeight: -1, - // initial volume when the player starts (overrided by user cookie) - startVolume: 0.8, - // useful for <audio> player loops - loop: false, - // rewind to beginning when media ends - autoRewind: true, - // resize to media dimensions - enableAutosize: true, - // forces the hour marker (##:00:00) - alwaysShowHours: false, - - // show framecount in timecode (##:00:00:00) - showTimecodeFrameCount: false, - // used when showTimecodeFrameCount is set to true - framesPerSecond: 25, - - // automatically calculate the width of the progress bar based on the sizes of other elements - autosizeProgress : true, - // Hide controls when playing and mouse is not over the video - alwaysShowControls: false, - // Display the video control - hideVideoControlsOnLoad: false, - // Enable click video element to toggle play/pause - clickToPlayPause: true, - // force iPad's native controls - iPadUseNativeControls: false, - // force iPhone's native controls - iPhoneUseNativeControls: false, - // force Android's native controls - AndroidUseNativeControls: false, - // features to show - features: ['playpause','current','progress','duration','tracks','volume','fullscreen'], - // only for dynamic - isVideo: true, - - // turns keyboard support on and off for this instance - enableKeyboard: true, - - // whenthis player starts, it will pause other players - pauseOtherPlayers: true, - - // array of keyboard actions such as play pause - keyActions: [ - { - keys: [ - 32, // SPACE - 179 // GOOGLE play/pause button - ], - action: function(player, media) { - if (media.paused || media.ended) { - player.play(); - } else { - player.pause(); - } - } - }, - { - keys: [38], // UP - action: function(player, media) { - player.container.find('.mejs-volume-slider').css('display','block'); - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + if (dashPlayer !== null) { + if (propName === 'src') { - var newVolume = Math.min(media.volume + 0.1, 1); - media.setVolume(newVolume); + dashPlayer.attachSource(value); + if (autoplay) { + node.play(); + } } - }, - { - keys: [40], // DOWN - action: function(player, media) { - player.container.find('.mejs-volume-slider').css('display','block'); - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - var newVolume = Math.max(media.volume - 0.1, 0); - media.setVolume(newVolume); - } - }, - { - keys: [ - 37, // LEFT - 227 // Google TV rewind - ], - action: function(player, media) { - if (!isNaN(media.duration) && media.duration > 0) { - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - - // 5% - var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0); - media.setCurrentTime(newTime); - } - } - }, - { - keys: [ - 39, // RIGHT - 228 // Google TV forward - ], - action: function(player, media) { - if (!isNaN(media.duration) && media.duration > 0) { - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - - // 5% - var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration); - media.setCurrentTime(newTime); - } - } - }, - { - keys: [70], // F - action: function(player, media) { - if (typeof player.enterFullScreen != 'undefined') { - if (player.isFullScreen) { - player.exitFullScreen(); - } else { - player.enterFullScreen(); - } - } - } - }, - { - keys: [77], // M - action: function(player, media) { - player.container.find('.mejs-volume-slider').css('display','block'); - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - if (player.media.muted) { - player.setMuted(false); - } else { - player.setMuted(true); - } - } + node[propName] = value; + } } - ] - }; + }; + }; - mejs.mepIndex = 0; + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } - mejs.players = {}; + // Initial method to register all M-Dash events + _window2.default['__ready__' + id] = function (_dashPlayer) { - // wraps a MediaElement object in player controls - mejs.MediaElementPlayer = function(node, o) { - // enforce object, even without "new" (via John Resig) - if ( !(this instanceof mejs.MediaElementPlayer) ) { - return new mejs.MediaElementPlayer(node, o); - } + mediaElement.dashPlayer = dashPlayer = _dashPlayer; - var t = this; + dashPlayer.getDebug().setLogToBrowserConsole(options.dash.debug); + dashPlayer.setAutoPlay(preload && preload === 'auto' || autoplay); + dashPlayer.setScheduleWhilePaused(preload && preload === 'auto' || autoplay); - // these will be reset after the MediaElement.success fires - t.$media = t.$node = $(node); - t.node = t.media = t.$media[0]; + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + dashEvents = dashjs.MediaPlayer.events, + assignEvents = function assignEvents(eventName) { - // check for existing player - if (typeof t.node.player != 'undefined') { - return t.node.player; - } else { - // attach player to DOM node for reference - t.node.player = t; - } + if (eventName === 'loadedmetadata') { + dashPlayer.initialize(node, node.src, false); + } + node.addEventListener(eventName, function (e) { + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; - // try to get options from data-mejsoptions - if (typeof o == 'undefined') { - o = t.$node.data('mejsoptions'); + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); + } + + /** + * Custom M(PEG)-DASH events + * + * These events can be attached to the original node using addEventListener and the name of the event, + * not using dashjs.MediaPlayer.events object + * @see http://cdn.dashjs.org/latest/jsdoc/MediaPlayerEvents.html + */ + var assignMdashEvents = function assignMdashEvents(e) { + var event = (0, _general.createEvent)(e.type, node); + event.data = e; + mediaElement.dispatchEvent(event); + + if (e.type.toLowerCase() === 'error') { + console.error(e); + } + }; + + for (var eventType in dashEvents) { + if (dashEvents.hasOwnProperty(eventType)) { + dashPlayer.on(dashEvents[eventType], assignMdashEvents); + } + } + }; + + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } } - // extend default options - t.options = $.extend({},mejs.MepDefaults,o); + node.setAttribute('id', id); - // unique ID - t.id = 'mep_' + mejs.mepIndex++; + originalNode.parentNode.insertBefore(node, originalNode); + originalNode.autoplay = false; + originalNode.style.display = 'none'; - // add to player array (for focus events) - mejs.players[t.id] = t; + NativeDash.prepareSettings({ + options: options.dash, + id: id + }); - // start up - t.init(); + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; - return t; - }; + node.hide = function () { + node.pause(); + node.style.display = 'none'; + return node; + }; + + node.show = function () { + node.style.display = ''; + return node; + }; - // actual player - mejs.MediaElementPlayer.prototype = { + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); - hasFocus: false, + return node; + } +}; - controlsAreVisible: true, +/** + * Register Native M(PEG)-Dash type based on URL structure + * + */ +_media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('.mpd') ? 'application/dash+xml' : null; +}); - init: function() { +_renderer.renderer.add(DashNativeRenderer); - var - t = this, - mf = mejs.MediaFeatures, - // options for MediaElement (shim) - meOptions = $.extend(true, {}, t.options, { - success: function(media, domNode) { t.meReady(media, domNode); }, - error: function(e) { t.handleError(e);} - }), - tagName = t.media.tagName.toLowerCase(); +},{"2":2,"23":23,"25":25,"26":26,"3":3,"6":6,"7":7}],18:[function(_dereq_,module,exports){ +'use strict'; - t.isDynamic = (tagName !== 'audio' && tagName !== 'video'); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PluginDetector = undefined; - if (t.isDynamic) { - // get video from src or href? - t.isVideo = t.options.isVideo; - } else { - t.isVideo = (tagName !== 'audio' && t.options.isVideo); - } +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - // use native controls in iPad, iPhone, and Android - if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) { +var _window = _dereq_(3); - // add controls and stop - t.$media.attr('controls', 'controls'); +var _window2 = _interopRequireDefault(_window); - // attempt to fix iOS 3 bug - //t.$media.removeAttr('poster'); - // no Issue found on iOS3 -ttroxell +var _document = _dereq_(2); - // override Apple's autoplay override for iPads - if (mf.isiPad && t.media.getAttribute('autoplay') !== null) { - t.play(); - } +var _document2 = _interopRequireDefault(_document); - } else if (mf.isAndroid && t.options.AndroidUseNativeControls) { +var _mejs = _dereq_(6); - // leave default player +var _mejs2 = _interopRequireDefault(_mejs); - } else { +var _i18n = _dereq_(4); - // DESKTOP: use MediaElementPlayer controls +var _i18n2 = _interopRequireDefault(_i18n); - // remove native controls - t.$media.removeAttr('controls'); +var _renderer = _dereq_(7); - // build container - t.container = - $('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svg ? 'svg' : 'no-svg') + '">'+ - '<div class="mejs-inner">'+ - '<div class="mejs-mediaelement"></div>'+ - '<div class="mejs-layers"></div>'+ - '<div class="mejs-controls"></div>'+ - '<div class="mejs-clear"></div>'+ - '</div>' + - '</div>') - .addClass(t.$media[0].className) - .insertBefore(t.$media); +var _general = _dereq_(25); - // add classes for user and content - t.container.addClass( - (mf.isAndroid ? 'mejs-android ' : '') + - (mf.isiOS ? 'mejs-ios ' : '') + - (mf.isiPad ? 'mejs-ipad ' : '') + - (mf.isiPhone ? 'mejs-iphone ' : '') + - (t.isVideo ? 'mejs-video ' : 'mejs-audio ') - ); +var _constants = _dereq_(23); +var _media = _dereq_(26); - // move the <video/video> tag into the right spot - if (mf.isiOS) { +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // sadly, you can't move nodes in iOS, so we have to destroy and recreate it! - var $newMedia = t.$media.clone(); +/** + * Shim that falls back to Flash if a media type is not supported. + * + * Any format not supported natively, including, RTMP, FLV, HLS and M(PEG)-DASH (if browser does not support MSE), + * will play using Flash. + */ - t.container.find('.mejs-mediaelement').append($newMedia); +/** + * Core detector, plugins are added below + * + */ +var PluginDetector = exports.PluginDetector = { + /** + * Cached version numbers + * @type {Array} + */ + plugins: [], - t.$media.remove(); - t.$node = t.$media = $newMedia; - t.node = t.media = $newMedia[0] + /** + * Test a plugin version number + * @param {String} plugin - In this scenario 'flash' will be tested + * @param {Array} v - An array containing the version up to 3 numbers (major, minor, revision) + * @return {Boolean} + */ + hasPluginVersion: function hasPluginVersion(plugin, v) { + var pv = PluginDetector.plugins[plugin]; + v[1] = v[1] || 0; + v[2] = v[2] || 0; + return pv[0] > v[0] || pv[0] === v[0] && pv[1] > v[1] || pv[0] === v[0] && pv[1] === v[1] && pv[2] >= v[2]; + }, - } else { + /** + * Detect plugin and store its version number + * + * @see PluginDetector.detectPlugin + * @param {String} p + * @param {String} pluginName + * @param {String} mimeType + * @param {String} activeX + * @param {Function} axDetect + */ + addPlugin: function addPlugin(p, pluginName, mimeType, activeX, axDetect) { + PluginDetector.plugins[p] = PluginDetector.detectPlugin(pluginName, mimeType, activeX, axDetect); + }, - // normal way of moving it into place (doesn't work on iOS) - t.container.find('.mejs-mediaelement').append(t.$media); + /** + * Obtain version number from the mime-type (all but IE) or ActiveX (IE) + * + * @param {String} pluginName + * @param {String} mimeType + * @param {String} activeX + * @param {Function} axDetect + * @return {int[]} + */ + detectPlugin: function detectPlugin(pluginName, mimeType, activeX, axDetect) { + + var version = [0, 0, 0], + description = void 0, + ax = void 0; + + // Firefox, Webkit, Opera; avoid MS Edge since `plugins` cannot be accessed + if (_constants.NAV.plugins !== null && _constants.NAV.plugins !== undefined && _typeof(_constants.NAV.plugins[pluginName]) === 'object') { + description = _constants.NAV.plugins[pluginName].description; + if (description && !(typeof _constants.NAV.mimeTypes !== 'undefined' && _constants.NAV.mimeTypes[mimeType] && !_constants.NAV.mimeTypes[mimeType].enabledPlugin)) { + version = description.replace(pluginName, '').replace(/^\s+/, '').replace(/\sr/gi, '.').split('.'); + for (var i = 0, total = version.length; i < total; i++) { + version[i] = parseInt(version[i].match(/\d+/), 10); + } + } + // Internet Explorer / ActiveX + } else if (_window2.default.ActiveXObject !== undefined) { + try { + ax = new ActiveXObject(activeX); + if (ax) { + version = axDetect(ax); } + } catch (e) { + + } + } + return version; + } +}; - // find parts - t.controls = t.container.find('.mejs-controls'); - t.layers = t.container.find('.mejs-layers'); +/** + * Add Flash detection + * + */ +PluginDetector.addPlugin('flash', 'Shockwave Flash', 'application/x-shockwave-flash', 'ShockwaveFlash.ShockwaveFlash', function (ax) { + // adapted from SWFObject + var version = [], + d = ax.GetVariable("$version"); - // determine the size + if (d) { + d = d.split(" ")[1].split(","); + version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + return version; +}); - /* size priority: - (1) videoWidth (forced), - (2) style="width;height;" - (3) width attribute, - (4) defaultVideoWidth (for unspecified cases) - */ +var FlashMediaElementRenderer = { + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var flash = {}; + + // store main variable + flash.options = options; + flash.id = mediaElement.id + '_' + flash.options.prefix; + flash.mediaElement = mediaElement; + + // insert data + flash.flashState = {}; + flash.flashApi = null; + flash.flashApiStack = []; + + // mediaElements for get/set + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + + // add to flash state that we will store + flash.flashState[propName] = null; + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + flash['get' + capName] = function () { + + if (flash.flashApi !== null) { + + if (flash.flashApi['get_' + propName] !== undefined) { + var _ret = function () { + var value = flash.flashApi['get_' + propName](); + + // special case for buffered to conform to HTML5's newest + if (propName === 'buffered') { + return { + v: { + start: function start() { + return 0; + }, + end: function end() { + return value; + }, + length: 1 + } + }; + } - var tagType = (t.isVideo ? 'video' : 'audio'), - capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1); + return { + v: value + }; + }(); + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + } else { + return null; + } + } else { + return null; + } + }; + flash['set' + capName] = function (value) { + if (propName === 'src') { + value = (0, _media.absolutizeUrl)(value); + } - if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) { - t.width = t.options[tagType + 'Width']; - } else if (t.media.style.width !== '' && t.media.style.width !== null) { - t.width = t.media.style.width; - } else if (t.media.getAttribute('width') !== null) { - t.width = t.$media.attr('width'); + // send value to Flash + if (flash.flashApi !== null && flash.flashApi['set_' + propName] !== undefined) { + flash.flashApi['set_' + propName](value); } else { - t.width = t.options['default' + capsTagName + 'Width']; + // store for after "READY" event fires + flash.flashApiStack.push({ + type: 'set', + propName: propName, + value: value + }); } + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // add mediaElements for native methods + var methods = _mejs2.default.html5media.methods, + assignMethods = function assignMethods(methodName) { + + // run the method on the native HTMLMediaElement + flash[methodName] = function () { + + if (flash.flashApi !== null) { - if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) { - t.height = t.options[tagType + 'Height']; - } else if (t.media.style.height !== '' && t.media.style.height !== null) { - t.height = t.media.style.height; - } else if (t.$media[0].getAttribute('height') !== null) { - t.height = t.$media.attr('height'); + // send call up to Flash ExternalInterface API + if (flash.flashApi['fire_' + methodName]) { + try { + flash.flashApi['fire_' + methodName](); + } catch (e) { + + } + } else { + + } } else { - t.height = t.options['default' + capsTagName + 'Height']; + // store for after "READY" event fires + flash.flashApiStack.push({ + type: 'call', + methodName: methodName + }); } + }; + }; + methods.push('stop'); + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } - // set the size, while we wait for the plugins to load below - t.setPlayerSize(t.width, t.height); + // give initial events like in others renderers + var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay', 'error']; - // create MediaElementShim - meOptions.pluginWidth = t.width; - meOptions.pluginHeight = t.height; - } + for (var _i2 = 0, _total2 = initEvents.length; _i2 < _total2; _i2++) { + var event = (0, _general.createEvent)(initEvents[_i2], flash); + mediaElement.dispatchEvent(event); + } + + // add a ready method that Flash can call to + _window2.default['__ready__' + flash.id] = function () { + + flash.flashReady = true; + flash.flashApi = _document2.default.getElementById('__' + flash.id); - // create MediaElement shim - mejs.MediaElement(t.$media[0], meOptions); + // do call stack + if (flash.flashApiStack.length) { + for (var _i3 = 0, _total3 = flash.flashApiStack.length; _i3 < _total3; _i3++) { - if (typeof(t.container) != 'undefined' && t.controlsAreVisible){ - // controls are shown when loaded - t.container.trigger('controlsshown'); + var stackItem = flash.flashApiStack[_i3]; + + if (stackItem.type === 'set') { + var propName = stackItem.propName, + capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + flash['set' + capName](stackItem.value); + } else if (stackItem.type === 'call') { + flash[stackItem.methodName](); + } + } } - }, + }; - showControls: function(doAnimation) { - var t = this; + _window2.default['__event__' + flash.id] = function (eventName, message) { - doAnimation = typeof doAnimation == 'undefined' || doAnimation; + var event = (0, _general.createEvent)(eventName, flash); + event.message = message || ''; - if (t.controlsAreVisible) - return; + // send event from Flash up to the mediaElement + flash.mediaElement.dispatchEvent(event); + }; - if (doAnimation) { - t.controls - .css('visibility','visible') - .stop(true, true).fadeIn(200, function() { - t.controlsAreVisible = true; - t.container.trigger('controlsshown'); - }); + // insert Flash object + flash.flashWrapper = _document2.default.createElement('div'); - // any additional controls people might add and want to hide - t.container.find('.mejs-control') - .css('visibility','visible') - .stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;}); + // If the access script flag does not have any of the valid values, set to `sameDomain` by default + if (!['always', 'sameDomain'].includes(flash.options.shimScriptAccess)) { + flash.options.shimScriptAccess = 'sameDomain'; + } - } else { - t.controls - .css('visibility','visible') - .css('display','block'); + var autoplay = mediaElement.originalNode.autoplay, + flashVars = ['uid=' + flash.id, 'autoplay=' + autoplay, 'allowScriptAccess=' + flash.options.shimScriptAccess], + isVideo = mediaElement.originalNode !== null && mediaElement.originalNode.tagName.toLowerCase() === 'video', + flashHeight = isVideo ? mediaElement.originalNode.height : 1, + flashWidth = isVideo ? mediaElement.originalNode.width : 1; - // any additional controls people might add and want to hide - t.container.find('.mejs-control') - .css('visibility','visible') - .css('display','block'); + if (mediaElement.originalNode.getAttribute('src')) { + flashVars.push('src=' + mediaElement.originalNode.getAttribute('src')); + } - t.controlsAreVisible = true; - t.container.trigger('controlsshown'); - } + if (flash.options.enablePseudoStreaming === true) { + flashVars.push('pseudostreamstart=' + flash.options.pseudoStreamingStartQueryParam); + flashVars.push('pseudostreamtype=' + flash.options.pseudoStreamingType); + } - t.setControlsSize(); + mediaElement.appendChild(flash.flashWrapper); - }, + if (mediaElement.originalNode !== null) { + mediaElement.originalNode.style.display = 'none'; + } - hideControls: function(doAnimation) { - var t = this; + var settings = []; - doAnimation = typeof doAnimation == 'undefined' || doAnimation; + if (_constants.IS_IE) { + var specialIEContainer = _document2.default.createElement('div'); + flash.flashWrapper.appendChild(specialIEContainer); - if (!t.controlsAreVisible || t.options.alwaysShowControls) - return; + settings = ['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"', 'codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"', 'id="__' + flash.id + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"']; - if (doAnimation) { - // fade out main controls - t.controls.stop(true, true).fadeOut(200, function() { - $(this) - .css('visibility','hidden') - .css('display','block'); - - t.controlsAreVisible = false; - t.container.trigger('controlshidden'); - }); + if (!isVideo) { + settings.push('style="clip: rect(0 0 0 0); position: absolute;"'); + } - // any additional controls people might add and want to hide - t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() { - $(this) - .css('visibility','hidden') - .css('display','block'); - }); - } else { + specialIEContainer.outerHTML = '<object ' + settings.join(' ') + '>' + ('<param name="movie" value="' + flash.options.pluginPath + flash.options.filename + '?x=' + new Date() + '" />') + ('<param name="flashvars" value="' + flashVars.join('&') + '" />') + '<param name="quality" value="high" />' + '<param name="bgcolor" value="#000000" />' + '<param name="wmode" value="transparent" />' + ('<param name="allowScriptAccess" value="' + flash.options.shimScriptAccess + '" />') + '<param name="allowFullScreen" value="true" />' + ('<div>' + _i18n2.default.t('mejs.install-flash') + '</div>') + '</object>'; + } else { - // hide main controls - t.controls - .css('visibility','hidden') - .css('display','block'); + settings = ['id="__' + flash.id + '"', 'name="__' + flash.id + '"', 'play="true"', 'loop="false"', 'quality="high"', 'bgcolor="#000000"', 'wmode="transparent"', 'allowScriptAccess="' + flash.options.shimScriptAccess + '"', 'allowFullScreen="true"', 'type="application/x-shockwave-flash"', 'pluginspage="//www.macromedia.com/go/getflashplayer"', 'src="' + flash.options.pluginPath + flash.options.filename + '"', 'flashvars="' + flashVars.join('&') + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"']; - // hide others - t.container.find('.mejs-control') - .css('visibility','hidden') - .css('display','block'); + if (!isVideo) { + settings.push('style="clip: rect(0 0 0 0); position: absolute;"'); + } + + flash.flashWrapper.innerHTML = '<embed ' + settings.join(' ') + '>'; + } + + flash.flashNode = flash.flashWrapper.lastChild; - t.controlsAreVisible = false; - t.container.trigger('controlshidden'); + flash.hide = function () { + if (isVideo) { + flash.flashNode.style.position = 'absolute'; + flash.flashNode.style.width = '1px'; + flash.flashNode.style.height = '1px'; + try { + flash.flashNode.style.clip = 'rect(0 0 0 0);'; + } catch (e) { + + } } - }, + }; + flash.show = function () { + if (isVideo) { + flash.flashNode.style.position = ''; + flash.flashNode.style.width = ''; + flash.flashNode.style.height = ''; + try { + flash.flashNode.style.clip = ''; + } catch (e) { + + } + } + }; + flash.setSize = function (width, height) { + flash.flashNode.style.width = width + 'px'; + flash.flashNode.style.height = height + 'px'; - controlsTimer: null, + if (flash.flashApi !== null && typeof flash.flashApi.fire_setSize === 'function') { + flash.flashApi.fire_setSize(width, height); + } + }; - startControlsTimer: function(timeout) { + flash.destroy = function () { + flash.flashNode.remove(); + }; - var t = this; + if (mediaFiles && mediaFiles.length > 0) { + for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) { + flash.setSrc(mediaFiles[_i4].src); + break; + } + } + } - timeout = typeof timeout != 'undefined' ? timeout : 1500; + return flash; + } +}; - t.killControlsTimer('start'); +var hasFlash = PluginDetector.hasPluginVersion('flash', [10, 0, 0]); - t.controlsTimer = setTimeout(function() { - // - t.hideControls(); - t.killControlsTimer('hide'); - }, timeout); - }, +if (hasFlash) { - killControlsTimer: function(src) { + /** + * Register media type based on URL structure if Flash is detected + * + */ + _media.typeChecks.push(function (url) { - var t = this; + url = url.toLowerCase(); - if (t.controlsTimer !== null) { - clearTimeout(t.controlsTimer); - delete t.controlsTimer; - t.controlsTimer = null; + if (url.startsWith('rtmp')) { + if (url.includes('.mp3')) { + return 'audio/rtmp'; + } else { + return 'video/rtmp'; } + } else if (url.includes('.oga') || url.includes('.ogg')) { + return 'audio/ogg'; + } else if (url.includes('.m3u8')) { + return 'application/x-mpegURL'; + } else if (url.includes('.mpd')) { + return 'application/dash+xml'; + } else if (url.includes('.flv')) { + return 'video/flv'; + } else { + return null; + } + }); + + // VIDEO + var FlashMediaElementVideoRenderer = { + name: 'flash_video', + + options: { + prefix: 'flash_video', + filename: 'mediaelement-flash-video.swf', + enablePseudoStreaming: false, + // start query parameter sent to server for pseudo-streaming + pseudoStreamingStartQueryParam: 'start', + // pseudo streaming type: use `time` for time based seeking (MP4) or `byte` for file byte position (FLV) + pseudoStreamingType: 'byte' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['video/mp4', 'video/rtmp', 'audio/rtmp', 'rtmp/mp4', 'audio/mp4', 'video/flv', 'video/x-flv'].includes(type.toLowerCase()); }, - controlsEnabled: true, + create: FlashMediaElementRenderer.create - disableControls: function() { - var t= this; + }; + _renderer.renderer.add(FlashMediaElementVideoRenderer); - t.killControlsTimer(); - t.hideControls(false); - this.controlsEnabled = false; + // HLS + var FlashMediaElementHlsVideoRenderer = { + name: 'flash_hls', + + options: { + prefix: 'flash_hls', + filename: 'mediaelement-flash-video-hls.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()); }, - enableControls: function() { - var t= this; + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementHlsVideoRenderer); - t.showControls(false); + // M(PEG)-DASH + var FlashMediaElementMdashVideoRenderer = { + name: 'flash_dash', - t.controlsEnabled = true; + options: { + prefix: 'flash_dash', + filename: 'mediaelement-flash-video-mdash.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['application/dash+xml'].includes(type.toLowerCase()); + }, + + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementMdashVideoRenderer); + + // AUDIO + var FlashMediaElementAudioRenderer = { + name: 'flash_audio', + + options: { + prefix: 'flash_audio', + filename: 'mediaelement-flash-audio.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['audio/mp3'].includes(type.toLowerCase()); }, + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementAudioRenderer); - // Sets up all controls and events - meReady: function(media, domNode) { + // AUDIO - ogg + var FlashMediaElementAudioOggRenderer = { + name: 'flash_audio_ogg', + options: { + prefix: 'flash_audio_ogg', + filename: 'mediaelement-flash-audio-ogg.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['audio/ogg', 'audio/oga', 'audio/ogv'].includes(type.toLowerCase()); + }, - var t = this, - mf = mejs.MediaFeatures, - autoplayAttr = domNode.getAttribute('autoplay'), - autoplay = !(typeof autoplayAttr == 'undefined' || autoplayAttr === null || autoplayAttr === 'false'), - featureIndex, - feature; + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementAudioOggRenderer); +} - // make sure it can't create itself again if a plugin reloads - if (t.created) { - return; - } else { - t.created = true; - } +},{"2":2,"23":23,"25":25,"26":26,"3":3,"4":4,"6":6,"7":7}],19:[function(_dereq_,module,exports){ +'use strict'; - t.media = media; - t.domNode = domNode; +var _window = _dereq_(3); - if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) { +var _window2 = _interopRequireDefault(_window); - // two built in features - t.buildposter(t, t.controls, t.layers, t.media); - t.buildkeyboard(t, t.controls, t.layers, t.media); - t.buildoverlays(t, t.controls, t.layers, t.media); +var _document = _dereq_(2); - // grab for use by features - t.findTracks(); +var _document2 = _interopRequireDefault(_document); - // add user-defined features/controls - for (featureIndex in t.options.features) { - feature = t.options.features[featureIndex]; - if (t['build' + feature]) { - try { - t['build' + feature](t, t.controls, t.layers, t.media); - } catch (e) { - // TODO: report control error - //throw e; - - - } - } - } +var _mejs = _dereq_(6); - t.container.trigger('controlsready'); +var _mejs2 = _interopRequireDefault(_mejs); - // reset all layers and controls - t.setPlayerSize(t.width, t.height); - t.setControlsSize(); +var _renderer = _dereq_(7); +var _general = _dereq_(25); - // controls fade - if (t.isVideo) { +var _constants = _dereq_(23); - if (mejs.MediaFeatures.hasTouch) { +var _media = _dereq_(26); - // for touch devices (iOS, Android) - // show/hide without animation on touch +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - t.$media.bind('touchstart', function() { +/** + * Native FLV renderer + * + * Uses flv.js, which is a JavaScript library which implements mechanisms to play flv files inspired by flv.js. + * It relies on HTML5 video and MediaSource Extensions for playback. + * Currently, it can only play files with the same origin. + * + * @see https://github.com/Bilibili/flv.js + * + */ +var NativeFlv = { + /** + * @type {Boolean} + */ + isMediaStarted: false, + /** + * @type {Boolean} + */ + isMediaLoaded: false, + /** + * @type {Array} + */ + creationQueue: [], + + /** + * Create a queue to prepare the loading of an FLV source + * @param {Object} settings - an object with settings needed to load an FLV player instance + */ + prepareSettings: function prepareSettings(settings) { + if (NativeFlv.isLoaded) { + NativeFlv.createInstance(settings); + } else { + NativeFlv.loadScript(settings); + NativeFlv.creationQueue.push(settings); + } + }, + /** + * Load flv.js script on the header of the document + * + * @param {Object} settings - an object with settings needed to load an FLV player instance + */ + loadScript: function loadScript(settings) { - // toggle controls - if (t.controlsAreVisible) { - t.hideControls(false); - } else { - if (t.controlsEnabled) { - t.showControls(false); - } - } - }); + // Skip script loading since it is already loaded + if (typeof flvjs !== 'undefined') { + NativeFlv.createInstance(settings); + } else if (!NativeFlv.isMediaStarted) { + (function () { - } else { + settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : '//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js'; - // create callback here since it needs access to current - // MediaElement object - t.clickToPlayPauseCallback = function() { - // + var script = _document2.default.createElement('script'), + firstScriptTag = _document2.default.getElementsByTagName('script')[0]; - if (t.options.clickToPlayPause) { - if (t.media.paused) { - t.play(); - } else { - t.pause(); - } - } - }; + var done = false; - // click to play/pause - t.media.addEventListener('click', t.clickToPlayPauseCallback, false); + script.src = settings.options.path; - // show/hide controls - t.container - .bind('mouseenter mouseover', function () { - if (t.controlsEnabled) { - if (!t.options.alwaysShowControls ) { - t.killControlsTimer('enter'); - t.showControls(); - t.startControlsTimer(2500); - } - } - }) - .bind('mousemove', function() { - if (t.controlsEnabled) { - if (!t.controlsAreVisible) { - t.showControls(); - } - if (!t.options.alwaysShowControls) { - t.startControlsTimer(2500); - } - } - }) - .bind('mouseleave', function () { - if (t.controlsEnabled) { - if (!t.media.paused && !t.options.alwaysShowControls) { - t.startControlsTimer(1000); - } - } - }); + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function () { + if (!done && (!this.readyState || this.readyState === undefined || this.readyState === 'loaded' || this.readyState === 'complete')) { + done = true; + NativeFlv.mediaReady(); + script.onload = script.onreadystatechange = null; } + }; - if(t.options.hideVideoControlsOnLoad) { - t.hideControls(false); - } + firstScriptTag.parentNode.insertBefore(script, firstScriptTag); + NativeFlv.isMediaStarted = true; + })(); + } + }, - // check for autoplay - if (autoplay && !t.options.alwaysShowControls) { - t.hideControls(); - } + /** + * Process queue of FLV player creation + * + */ + mediaReady: function mediaReady() { + NativeFlv.isLoaded = true; + NativeFlv.isMediaLoaded = true; + + while (NativeFlv.creationQueue.length > 0) { + var settings = NativeFlv.creationQueue.pop(); + NativeFlv.createInstance(settings); + } + }, - // resizer - if (t.options.enableAutosize) { - t.media.addEventListener('loadedmetadata', function(e) { - // if the <video height> was not set and the options.videoHeight was not set - // then resize to the real dimensions - if (t.options.videoHeight <= 0 && t.domNode.getAttribute('height') === null && !isNaN(e.target.videoHeight)) { - t.setPlayerSize(e.target.videoWidth, e.target.videoHeight); - t.setControlsSize(); - t.media.setVideoSize(e.target.videoWidth, e.target.videoHeight); - } - }, false); - } - } + /** + * Create a new instance of FLV player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to instantiate FLV object + */ + createInstance: function createInstance(settings) { + var player = flvjs.createPlayer(settings.options); + _window2.default['__ready__' + settings.id](player); + } +}; - // EVENTS +var FlvNativeRenderer = { + name: 'native_flv', + + options: { + prefix: 'native_flv', + flv: { + // Special config: used to set the local path/URL of flv.js library + path: '//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js', + // To modify more elements from FLV player, + // see https://github.com/Bilibili/flv.js/blob/master/docs/api.md#config + cors: true + } + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return _constants.HAS_MSE && ['video/x-flv', 'video/flv'].includes(type); + }, - // FOCUS: when a video starts playing, it takes focus from other players (possibily pausing them) - media.addEventListener('play', function() { - var playerIndex; + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { - // go through all other players - for (playerIndex in mejs.players) { - var p = mejs.players[playerIndex]; - if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) { - p.pause(); - } - p.hasFocus = false; - } + var originalNode = mediaElement.originalNode, + id = mediaElement.id + '_' + options.prefix; - t.hasFocus = true; - },false); + var node = null, + flvPlayer = null; + node = originalNode.cloneNode(true); + options = Object.assign(options, mediaElement.options); - // ended for all - t.media.addEventListener('ended', function (e) { - if(t.options.autoRewind) { - try{ - t.media.setCurrentTime(0); - } catch (exp) { + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); - } - } - t.media.pause(); + node['get' + capName] = function () { + return flvPlayer !== null ? node[propName] : null; + }; - if (t.setProgressRail) { - t.setProgressRail(); - } - if (t.setCurrentRail) { - t.setCurrentRail(); - } + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + if (flvPlayer !== null) { + node[propName] = value; - if (t.options.loop) { - t.play(); - } else if (!t.options.alwaysShowControls && t.controlsEnabled) { - t.showControls(); + if (propName === 'src') { + flvPlayer.unload(); + flvPlayer.detachMediaElement(); + flvPlayer.attachMediaElement(node); + flvPlayer.load(); + } } - }, false); + } + }; + }; - // resize on the first play - t.media.addEventListener('loadedmetadata', function(e) { - if (t.updateDuration) { - t.updateDuration(); - } - if (t.updateCurrent) { - t.updateCurrent(); - } + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } - if (!t.isFullScreen) { - t.setPlayerSize(t.width, t.height); - t.setControlsSize(); - } - }, false); + // Initial method to register all FLV events + _window2.default['__ready__' + id] = function (_flvPlayer) { + mediaElement.flvPlayer = flvPlayer = _flvPlayer; - // webkit has trouble doing this without a delay - setTimeout(function () { - t.setPlayerSize(t.width, t.height); - t.setControlsSize(); - }, 50); + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + assignEvents = function assignEvents(eventName) { - // adjust controls whenever window sizes (used to be in fullscreen only) - t.globalBind('resize', function() { + if (eventName === 'loadedmetadata') { - // don't resize for fullscreen mode - if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) { - t.setPlayerSize(t.width, t.height); - } + flvPlayer.unload(); + flvPlayer.detachMediaElement(); + flvPlayer.attachMediaElement(node); + flvPlayer.load(); + } - // always adjust controls - t.setControlsSize(); + node.addEventListener(eventName, function (e) { + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); }); + }; - // TEMP: needs to be moved somewhere else - if (t.media.pluginType == 'youtube' && t.options.autoplay) { - //LOK-Soft: added t.options.autoplay to if -- I can only guess this is for hiding play button when autoplaying youtube, general hiding play button layer causes missing button on player load - t.container.find('.mejs-overlay-play').hide(); - } + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); } + }; - // force autoplay for HTML5 - if (autoplay && media.pluginType == 'native') { - t.play(); + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } } + } + node.setAttribute('id', id); - if (t.options.success) { + originalNode.parentNode.insertBefore(node, originalNode); + originalNode.autoplay = false; + originalNode.style.display = 'none'; - if (typeof t.options.success == 'string') { - window[t.options.success](t.media, t.domNode, t); - } else { - t.options.success(t.media, t.domNode, t); - } - } - }, + // Options that cannot be overridden + options.flv.type = 'flv'; + options.flv.url = node.getAttribute('src'); - handleError: function(e) { - var t = this; + NativeFlv.prepareSettings({ + options: options.flv, + id: id + }); - t.controls.hide(); + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; - // Tell user that the file cannot be played - if (t.options.error) { - t.options.error(e); + node.hide = function () { + if (flvPlayer !== null) { + flvPlayer.pause(); } - }, + node.style.display = 'none'; + return node; + }; - setPlayerSize: function(width,height) { - var t = this; + node.show = function () { + node.style.display = ''; + return node; + }; - if( !t.options.setDimensions ) { - return false; + node.destroy = function () { + if (flvPlayer !== null) { + flvPlayer.destroy(); } + }; - if (typeof width != 'undefined') { - t.width = width; - } + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); - if (typeof height != 'undefined') { - t.height = height; - } + return node; + } +}; - // detect 100% mode - use currentStyle for IE since css() doesn't return percentages - if (t.height.toString().indexOf('%') > 0 || t.$node.css('max-width') === '100%' || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%')) { +/** + * Register Native FLV type based on URL structure + * + */ +_media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('.flv') ? 'video/flv' : null; +}); - // do we have the native dimensions yet? - var nativeWidth = (function() { - if (t.isVideo) { - if (t.media.videoWidth && t.media.videoWidth > 0) { - return t.media.videoWidth; - } else if (t.media.getAttribute('width') !== null) { - return t.media.getAttribute('width'); - } else { - return t.options.defaultVideoWidth; - } - } else { - return t.options.defaultAudioWidth; - } - })(); +_renderer.renderer.add(FlvNativeRenderer); - var nativeHeight = (function() { - if (t.isVideo) { - if (t.media.videoHeight && t.media.videoHeight > 0) { - return t.media.videoHeight; - } else if (t.media.getAttribute('height') !== null) { - return t.media.getAttribute('height'); - } else { - return t.options.defaultVideoHeight; - } - } else { - return t.options.defaultAudioHeight; - } - })(); +},{"2":2,"23":23,"25":25,"26":26,"3":3,"6":6,"7":7}],20:[function(_dereq_,module,exports){ +'use strict'; - var - parentWidth = t.container.parent().closest(':visible').width(), - parentHeight = t.container.parent().closest(':visible').height(), - newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight; +var _window = _dereq_(3); - // When we use percent, the newHeight can't be calculated so we get the container height - if(isNaN(newHeight) || ( parentHeight != 0 && newHeight > parentHeight )) { - newHeight = parentHeight; - } +var _window2 = _interopRequireDefault(_window); - if (t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) { - parentWidth = $(window).width(); - newHeight = $(window).height(); - } +var _document = _dereq_(2); - if ( newHeight != 0 && parentWidth != 0 ) { - // set outer container size - t.container - .width(parentWidth) - .height(newHeight); +var _document2 = _interopRequireDefault(_document); - // set native <video> or <audio> and shims - t.$media.add(t.container.find('.mejs-shim')) - .width('100%') - .height('100%'); +var _mejs = _dereq_(6); - // if shim is ready, send the size to the embeded plugin - if (t.isVideo) { - if (t.media.setVideoSize) { - t.media.setVideoSize(parentWidth, newHeight); - } +var _mejs2 = _interopRequireDefault(_mejs); + +var _renderer = _dereq_(7); + +var _general = _dereq_(25); + +var _constants = _dereq_(23); + +var _media = _dereq_(26); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Native HLS renderer + * + * Uses DailyMotion's hls.js, which is a JavaScript library which implements an HTTP Live Streaming client. + * It relies on HTML5 video and MediaSource Extensions for playback. + * This renderer integrates new events associated with m3u8 files the same way Flash version of Hls does. + * @see https://github.com/dailymotion/hls.js + * + */ +var NativeHls = { + /** + * @type {Boolean} + */ + isMediaStarted: false, + /** + * @type {Boolean} + */ + isMediaLoaded: false, + /** + * @type {Array} + */ + creationQueue: [], + + /** + * Create a queue to prepare the loading of an HLS source + * + * @param {Object} settings - an object with settings needed to load an HLS player instance + */ + prepareSettings: function prepareSettings(settings) { + if (NativeHls.isLoaded) { + NativeHls.createInstance(settings); + } else { + NativeHls.loadScript(settings); + NativeHls.creationQueue.push(settings); + } + }, + + /** + * Load hls.js script on the header of the document + * + * @param {Object} settings - an object with settings needed to load an HLS player instance + */ + loadScript: function loadScript(settings) { + + // Skip script loading since it is already loaded + if (typeof Hls !== 'undefined') { + NativeHls.createInstance(settings); + } else if (!NativeHls.isMediaStarted) { + (function () { + + settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : '//cdn.jsdelivr.net/hls.js/latest/hls.min.js'; + + var script = _document2.default.createElement('script'), + firstScriptTag = _document2.default.getElementsByTagName('script')[0]; + + var done = false; + + script.src = settings.options.path; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function () { + if (!done && (!this.readyState || this.readyState === undefined || this.readyState === 'loaded' || this.readyState === 'complete')) { + done = true; + NativeHls.mediaReady(); + script.onload = script.onreadystatechange = null; } + }; - // set the layers - t.layers.children('.mejs-layer') - .width('100%') - .height('100%'); - } + firstScriptTag.parentNode.insertBefore(script, firstScriptTag); + NativeHls.isMediaStarted = true; + })(); + } + }, + /** + * Process queue of HLS player creation + * + */ + mediaReady: function mediaReady() { + NativeHls.isLoaded = true; + NativeHls.isMediaLoaded = true; + + while (NativeHls.creationQueue.length > 0) { + var settings = NativeHls.creationQueue.pop(); + NativeHls.createInstance(settings); + } + }, - } else { + /** + * Create a new instance of HLS player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to instantiate HLS object + * @return {Hls} + */ + createInstance: function createInstance(settings) { + var player = new Hls(settings.options); + _window2.default['__ready__' + settings.id](player); + return player; + } +}; - t.container - .width(t.width) - .height(t.height); +var HlsNativeRenderer = { + name: 'native_hls', + + options: { + prefix: 'native_hls', + hls: { + // Special config: used to set the local path/URL of hls.js library + path: '//cdn.jsdelivr.net/hls.js/latest/hls.min.js', + // To modify more elements from hls.js, + // see https://github.com/dailymotion/hls.js/blob/master/API.md#user-content-fine-tuning + autoStartLoad: false, + debug: false + } + }, - t.layers.children('.mejs-layer') - .width(t.width) - .height(t.height); + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return _constants.HAS_MSE && ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()); + }, - } + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var originalNode = mediaElement.originalNode, + id = mediaElement.id + '_' + options.prefix, + preload = originalNode.getAttribute('preload'), + autoplay = originalNode.autoplay; + + var hlsPlayer = null, + node = null; + + node = originalNode.cloneNode(true); + options = Object.assign(options, mediaElement.options); + options.hls.autoStartLoad = preload && preload !== 'none' || autoplay; + + // WRAPPERS for PROPs + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + node['get' + capName] = function () { + return hlsPlayer !== null ? node[propName] : null; + }; - // special case for big play button so it doesn't go over the controls area - var playLayer = t.layers.find('.mejs-overlay-play'), - playButton = playLayer.find('.mejs-overlay-button'); + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + if (hlsPlayer !== null) { + node[propName] = value; - playLayer.height(t.container.height() - t.controls.height()); - playButton.css('margin-top', '-' + (playButton.height()/2 - t.controls.height()/2).toString() + 'px' ); + if (propName === 'src') { - }, + hlsPlayer.destroy(); + hlsPlayer = NativeHls.createInstance({ + options: options.hls, + id: id + }); - setControlsSize: function() { - var t = this, - usedWidth = 0, - railWidth = 0, - rail = t.controls.find('.mejs-time-rail'), - total = t.controls.find('.mejs-time-total'), - current = t.controls.find('.mejs-time-current'), - loaded = t.controls.find('.mejs-time-loaded'), - others = rail.siblings(), - lastControl = others.last(), - lastControlPosition = null; + hlsPlayer.loadSource(value); + hlsPlayer.attachMedia(node); + } + } + } + }; + }; - // skip calculation if hidden - if (!t.container.is(':visible') || !rail.length || !rail.is(':visible')) { - return; - } + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // Initial method to register all HLS events + _window2.default['__ready__' + id] = function (_hlsPlayer) { + + mediaElement.hlsPlayer = hlsPlayer = _hlsPlayer; + + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + hlsEvents = Hls.Events, + assignEvents = function assignEvents(eventName) { + + if (eventName === 'loadedmetadata') { + + hlsPlayer.detachMedia(); + + var url = node.src; + + hlsPlayer.loadSource(url); + hlsPlayer.attachMedia(node); + } + node.addEventListener(eventName, function (e) { + // copy event + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; - // allow the size to come from custom CSS - if (t.options && !t.options.autosizeProgress) { - // Also, frontends devs can be more flexible - // due the opportunity of absolute positioning. - railWidth = parseInt(rail.css('width')); + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); } - // attempt to autosize - if (railWidth === 0 || !railWidth) { + /** + * Custom HLS events + * + * These events can be attached to the original node using addEventListener and the name of the event, + * not using Hls.Events object + * @see https://github.com/dailymotion/hls.js/blob/master/src/events.js + * @see https://github.com/dailymotion/hls.js/blob/master/src/errors.js + * @see https://github.com/dailymotion/hls.js/blob/master/API.md#runtime-events + * @see https://github.com/dailymotion/hls.js/blob/master/API.md#errors + */ + var recoverDecodingErrorDate = void 0, + recoverSwapAudioCodecDate = void 0; + var assignHlsEvents = function assignHlsEvents(e, data) { + var event = (0, _general.createEvent)(e, node); + event.data = data; + mediaElement.dispatchEvent(event); + + if (e === 'hlsError') { + console.warn(e, data); + + // borrowed from http://dailymotion.github.io/hls.js/demo/ + if (data.fatal) { + switch (data.type) { + case 'mediaError': + var now = new Date().getTime(); + if (!recoverDecodingErrorDate || now - recoverDecodingErrorDate > 3000) { + recoverDecodingErrorDate = new Date().getTime(); + hlsPlayer.recoverMediaError(); + } else if (!recoverSwapAudioCodecDate || now - recoverSwapAudioCodecDate > 3000) { + recoverSwapAudioCodecDate = new Date().getTime(); + console.warn('Attempting to swap Audio Codec and recover from media error'); + hlsPlayer.swapAudioCodec(); + hlsPlayer.recoverMediaError(); + } else { + console.error('Cannot recover, last media error recovery failed'); + } + break; + case 'networkError': + console.error('Network error'); + break; + default: + hlsPlayer.destroy(); + break; - // find the size of all the other controls besides the rail - others.each(function() { - var $this = $(this); - if ($this.css('position') != 'absolute' && $this.is(':visible')) { - usedWidth += $(this).outerWidth(true); + } } - }); + } + }; - // fit the rail into the remaining space - railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width()); + for (var eventType in hlsEvents) { + if (hlsEvents.hasOwnProperty(eventType)) { + hlsPlayer.on(hlsEvents[eventType], assignHlsEvents); + } } + }; - // resize the rail, - // but then check if the last control (say, the fullscreen button) got pushed down - // this often happens when zoomed - do { - // outer area - rail.width(railWidth); - // dark space - total.width(railWidth - (total.outerWidth(true) - total.width())); + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } - if (lastControl.css('position') != 'absolute') { - lastControlPosition = lastControl.position(); - railWidth--; + if (preload !== 'auto' && !autoplay) { + node.addEventListener('play', function () { + if (hlsPlayer !== null) { + hlsPlayer.startLoad(); } - } while (lastControlPosition != null && lastControlPosition.top > 0 && railWidth > 0); + }); - if (t.setProgressRail) - t.setProgressRail(); - if (t.setCurrentRail) - t.setCurrentRail(); - }, + node.addEventListener('pause', function () { + if (hlsPlayer !== null) { + hlsPlayer.stopLoad(); + } + }); + } + node.setAttribute('id', id); - buildposter: function(player, controls, layers, media) { - var t = this, - poster = - $('<div class="mejs-poster mejs-layer">' + - '</div>') - .appendTo(layers), - posterUrl = player.$media.attr('poster'); + originalNode.parentNode.insertBefore(node, originalNode); + originalNode.autoplay = false; + originalNode.style.display = 'none'; - // prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster) - if (player.options.poster !== '') { - posterUrl = player.options.poster; - } + NativeHls.prepareSettings({ + options: options.hls, + id: id + }); - // second, try the real poster - if (posterUrl !== '' && posterUrl != null) { - t.setPoster(posterUrl); - } else { - poster.hide(); - } + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; - media.addEventListener('play',function() { - poster.hide(); - }, false); + node.hide = function () { + node.pause(); + node.style.display = 'none'; + return node; + }; - if(player.options.showPosterWhenEnded && player.options.autoRewind){ - media.addEventListener('ended',function() { - poster.show(); - }, false); - } - }, + node.show = function () { + node.style.display = ''; + return node; + }; - setPoster: function(url) { - var t = this, - posterDiv = t.container.find('.mejs-poster'), - posterImg = posterDiv.find('img'); + node.destroy = function () { + if (hlsPlayer !== null) { + hlsPlayer.destroy(); + } + }; - if (posterImg.length == 0) { - posterImg = $('<img width="100%" height="100%" />').appendTo(posterDiv); + node.stop = function () { + if (hlsPlayer !== null) { + hlsPlayer.stopLoad(); } + }; - posterImg.attr('src', url); - posterDiv.css({'background-image' : 'url(' + url + ')'}); - }, + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); - buildoverlays: function(player, controls, layers, media) { - var t = this; - if (!player.isVideo) - return; + return node; + } +}; - var - loading = - $('<div class="mejs-overlay mejs-layer">'+ - '<div class="mejs-overlay-loading"><span></span></div>'+ - '</div>') - .hide() // start out hidden - .appendTo(layers), - error = - $('<div class="mejs-overlay mejs-layer">'+ - '<div class="mejs-overlay-error"></div>'+ - '</div>') - .hide() // start out hidden - .appendTo(layers), - // this needs to come last so it's on top - bigPlay = - $('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+ - '<div class="mejs-overlay-button"></div>'+ - '</div>') - .appendTo(layers) - .bind('click', function() { // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay started and immediately stopped the video - if (t.options.clickToPlayPause) { - if (media.paused) { - media.play(); - } - } - }); +/** + * Register Native HLS type based on URL structure + * + */ +_media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('.m3u8') ? 'application/x-mpegURL' : null; +}); - /* - if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) { - bigPlay.remove(); - loading.remove(); - } - */ +_renderer.renderer.add(HlsNativeRenderer); +},{"2":2,"23":23,"25":25,"26":26,"3":3,"6":6,"7":7}],21:[function(_dereq_,module,exports){ +'use strict'; - // show/hide big play button - media.addEventListener('play',function() { - bigPlay.hide(); - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - error.hide(); - }, false); - - media.addEventListener('playing', function() { - bigPlay.hide(); - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - error.hide(); - }, false); - - media.addEventListener('seeking', function() { - loading.show(); - controls.find('.mejs-time-buffering').show(); - }, false); - - media.addEventListener('seeked', function() { - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - }, false); - - media.addEventListener('pause',function() { - if (!mejs.MediaFeatures.isiPhone) { - bigPlay.show(); - } - }, false); +var _window = _dereq_(3); - media.addEventListener('waiting', function() { - loading.show(); - controls.find('.mejs-time-buffering').show(); - }, false); +var _window2 = _interopRequireDefault(_window); +var _document = _dereq_(2); - // show/hide loading - media.addEventListener('loadeddata',function() { - // for some reason Chrome is firing this event - //if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none') - // return; - - loading.show(); - controls.find('.mejs-time-buffering').show(); - }, false); - media.addEventListener('canplay',function() { - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - }, false); +var _document2 = _interopRequireDefault(_document); - // error handling - media.addEventListener('error',function() { - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - error.show(); - error.find('mejs-overlay-error').html("Error loading this resource"); - }, false); - - media.addEventListener('keydown', function(e) { - t.onkeydown(player, media, e); - }, false); - }, +var _mejs = _dereq_(6); - buildkeyboard: function(player, controls, layers, media) { +var _mejs2 = _interopRequireDefault(_mejs); - var t = this; +var _renderer = _dereq_(7); - // listen for key presses - t.globalBind('keydown', function(e) { - return t.onkeydown(player, media, e); - }); +var _general = _dereq_(25); - // check if someone clicked outside a player region, then kill its focus - t.globalBind('click', function(event) { - player.hasFocus = $(event.target).closest('.mejs-container').length != 0; - }); +var _constants = _dereq_(23); - }, - onkeydown: function(player, media, e) { - if (player.hasFocus && player.options.enableKeyboard) { - // find a matching key - for (var i = 0, il = player.options.keyActions.length; i < il; i++) { - var keyAction = player.options.keyActions[i]; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - for (var j = 0, jl = keyAction.keys.length; j < jl; j++) { - if (e.keyCode == keyAction.keys[j]) { - if (typeof(e.preventDefault) == "function") e.preventDefault(); - keyAction.action(player, media, e.keyCode); - return false; - } - } - } - } +/** + * Native HTML5 Renderer + * + * Wraps the native HTML5 <audio> or <video> tag and bubbles its properties, events, and methods up to the mediaElement. + */ +var HtmlMediaElement = { - return true; - }, + name: 'html5', - findTracks: function() { - var t = this, - tracktags = t.$media.find('track'); + options: { + prefix: 'html5' + }, - // store for use by plugins - t.tracks = []; - tracktags.each(function(index, track) { + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {String} + */ + canPlayType: function canPlayType(type) { + + var mediaElement = _document2.default.createElement('video'); + + // Due to an issue on Webkit, force the MP3 and MP4 on Android and consider native support for HLS; + // also consider URLs that might have obfuscated URLs + if (_constants.IS_ANDROID && type.match(/\/mp(3|4)$/gi) !== null || ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()) && _constants.SUPPORTS_NATIVE_HLS) { + return 'yes'; + } else if (mediaElement.canPlayType) { + return mediaElement.canPlayType(type).replace(/no/, ''); + } else { + return ''; + } + }, + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var id = mediaElement.id + '_' + options.prefix; + + var node = null; + + // CREATE NODE + if (mediaElement.originalNode === undefined || mediaElement.originalNode === null) { + node = _document2.default.createElement('audio'); + mediaElement.appendChild(node); + } else { + node = mediaElement.originalNode; + } - track = $(track); + node.setAttribute('id', id); - t.tracks.push({ - srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '', - src: track.attr('src'), - kind: track.attr('kind'), - label: track.attr('label') || '', - entries: [], - isLoaded: false - }); - }); - }, - changeSkin: function(className) { - this.container[0].className = 'mejs-container ' + className; - this.setPlayerSize(this.width, this.height); - this.setControlsSize(); - }, - play: function() { - this.load(); - this.media.play(); - }, - pause: function() { - try { - this.media.pause(); - } catch (e) {} - }, - load: function() { - if (!this.isLoaded) { - this.media.load(); - } + // WRAPPERS for PROPs + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); - this.isLoaded = true; - }, - setMuted: function(muted) { - this.media.setMuted(muted); - }, - setCurrentTime: function(time) { - this.media.setCurrentTime(time); - }, - getCurrentTime: function() { - return this.media.currentTime; - }, - setVolume: function(volume) { - this.media.setVolume(volume); - }, - getVolume: function() { - return this.media.volume; - }, - setSrc: function(src) { - this.media.setSrc(src); - }, - remove: function() { - var t = this, featureIndex, feature; + node['get' + capName] = function () { + return node[propName]; + }; - // invoke features cleanup - for (featureIndex in t.options.features) { - feature = t.options.features[featureIndex]; - if (t['clean' + feature]) { - try { - t['clean' + feature](t); - } catch (e) { - // TODO: report control error - //throw e; - // - // - } + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + node[propName] = value; } - } - - // grab video and put it back in place - if (!t.isDynamic) { - t.$media.prop('controls', true); - // detach events from the video - // TODO: detach event listeners better than this; - // also detach ONLY the events attached by this plugin! - t.$node.clone().insertBefore(t.container).show(); - t.$node.remove(); - } else { - t.$node.insertBefore(t.container); - } + }; + }; - if (t.media.pluginType !== 'native') { - t.media.remove(); - } + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } - // Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api. - delete mejs.players[t.id]; + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + assignEvents = function assignEvents(eventName) { - if (typeof t.container == 'object') { - t.container.remove(); - } - t.globalUnbind(); - delete t.node.player; - } - }; + node.addEventListener(eventName, function (e) { + // copy event - (function(){ - var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/; - - function splitEvents(events, id) { - // add player ID as an event namespace so it's easier to unbind them all later - var ret = {d: [], w: []}; - $.each((events || '').split(' '), function(k, v){ - var eventname = v + '.' + id; - if (eventname.indexOf('.') === 0) { - ret.d.push(eventname); - ret.w.push(eventname); - } - else { - ret[rwindow.test(v) ? 'w' : 'd'].push(eventname); - } + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); }); - ret.d = ret.d.join(' '); - ret.w = ret.w.join(' '); - return ret; + }; + + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); } - mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) { - var t = this; - events = splitEvents(events, t.id); - if (events.d) $(document).bind(events.d, data, callback); - if (events.w) $(window).bind(events.w, data, callback); + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; }; - mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) { - var t = this; - events = splitEvents(events, t.id); - if (events.d) $(document).unbind(events.d, callback); - if (events.w) $(window).unbind(events.w, callback); + node.hide = function () { + node.style.display = 'none'; + + return node; }; - })(); - // turn into jQuery plugin - if (typeof $ != 'undefined') { - $.fn.mediaelementplayer = function (options) { - if (options === false) { - this.each(function () { - var player = $(this).data('mediaelementplayer'); - if (player) { - player.remove(); - } - $(this).removeData('mediaelementplayer'); - }); - } - else { - this.each(function () { - $(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options)); - }); - } - return this; + node.show = function () { + node.style.display = ''; + + return node; }; + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } - $(document).ready(function() { - // auto enable using JSON attribute - $('.mejs-player').mediaelementplayer(); - }); + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); + + return node; } +}; - // push out to window - window.MediaElementPlayer = mejs.MediaElementPlayer; +_window2.default.HtmlMediaElement = _mejs2.default.HtmlMediaElement = HtmlMediaElement; -})(mejs.$); +_renderer.renderer.add(HtmlMediaElement); -(function($) { +},{"2":2,"23":23,"25":25,"3":3,"6":6,"7":7}],22:[function(_dereq_,module,exports){ +'use strict'; - $.extend(mejs.MepDefaults, { - playpauseText: mejs.i18n.t('Play/Pause') - }); +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - // PLAY/pause BUTTON - $.extend(MediaElementPlayer.prototype, { - buildplaypause: function(player, controls, layers, media) { - var - t = this, - play = - $('<div class="mejs-button mejs-playpause-button mejs-play" >' + - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.playpauseText + '" aria-label="' + t.options.playpauseText + '"></button>' + - '</div>') - .appendTo(controls) - .click(function(e) { - e.preventDefault(); - - if (media.paused) { - media.play(); - } else { - media.pause(); - } - - return false; - }); +var _window = _dereq_(3); - media.addEventListener('play',function() { - play.removeClass('mejs-play').addClass('mejs-pause'); - }, false); - media.addEventListener('playing',function() { - play.removeClass('mejs-play').addClass('mejs-pause'); - }, false); +var _window2 = _interopRequireDefault(_window); +var _document = _dereq_(2); - media.addEventListener('pause',function() { - play.removeClass('mejs-pause').addClass('mejs-play'); - }, false); - media.addEventListener('paused',function() { - play.removeClass('mejs-pause').addClass('mejs-play'); - }, false); - } - }); - -})(mejs.$); +var _document2 = _interopRequireDefault(_document); -(function($) { +var _mejs = _dereq_(6); - $.extend(mejs.MepDefaults, { - stopText: 'Stop' - }); +var _mejs2 = _interopRequireDefault(_mejs); - // STOP BUTTON - $.extend(MediaElementPlayer.prototype, { - buildstop: function(player, controls, layers, media) { - var t = this, - stop = - $('<div class="mejs-button mejs-stop-button mejs-stop">' + - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '" aria-label="' + t.options.stopText + '"></button>' + - '</div>') - .appendTo(controls) - .click(function() { - if (!media.paused) { - media.pause(); - } - if (media.currentTime > 0) { - media.setCurrentTime(0); - media.pause(); - controls.find('.mejs-time-current').width('0px'); - controls.find('.mejs-time-handle').css('left', '0px'); - controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0) ); - controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0) ); - layers.find('.mejs-poster').show(); - } - }); - } - }); - -})(mejs.$); - -(function($) { - // progress/loaded bar - $.extend(MediaElementPlayer.prototype, { - buildprogress: function(player, controls, layers, media) { - - $('<div class="mejs-time-rail">'+ - '<span class="mejs-time-total">'+ - '<span class="mejs-time-buffering"></span>'+ - '<span class="mejs-time-loaded"></span>'+ - '<span class="mejs-time-current"></span>'+ - '<span class="mejs-time-handle"></span>'+ - '<span class="mejs-time-float">' + - '<span class="mejs-time-float-current">00:00</span>' + - '<span class="mejs-time-float-corner"></span>' + - '</span>'+ - '</span>'+ - '</div>') - .appendTo(controls); - controls.find('.mejs-time-buffering').hide(); - - var - t = this, - total = controls.find('.mejs-time-total'), - loaded = controls.find('.mejs-time-loaded'), - current = controls.find('.mejs-time-current'), - handle = controls.find('.mejs-time-handle'), - timefloat = controls.find('.mejs-time-float'), - timefloatcurrent = controls.find('.mejs-time-float-current'), - handleMouseMove = function (e) { - // mouse or touch position relative to the object - if (e.originalEvent.changedTouches) { - var x = e.originalEvent.changedTouches[0].pageX; - }else{ - var x = e.pageX; - } - - var offset = total.offset(), - width = total.outerWidth(true), - percentage = 0, - newTime = 0, - pos = 0; - - - if (media.duration) { - if (x < offset.left) { - x = offset.left; - } else if (x > width + offset.left) { - x = width + offset.left; - } - - pos = x - offset.left; - percentage = (pos / width); - newTime = (percentage <= 0.02) ? 0 : percentage * media.duration; +var _renderer = _dereq_(7); - // seek to where the mouse is - if (mouseIsDown && newTime !== media.currentTime) { - media.setCurrentTime(newTime); - } +var _general = _dereq_(25); - // position floating time box - if (!mejs.MediaFeatures.hasTouch) { - timefloat.css('left', pos); - timefloatcurrent.html( mejs.Utility.secondsToTimeCode(newTime) ); - timefloat.show(); - } - } - }, - mouseIsDown = false, - mouseIsOver = false; +var _media = _dereq_(26); - // handle clicks - //controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove); - total - .bind('mousedown touchstart', function (e) { - // only handle left clicks or touch - if (e.which === 1 || e.which === 0) { - mouseIsDown = true; - handleMouseMove(e); - t.globalBind('mousemove.dur touchmove.dur', function(e) { - handleMouseMove(e); - }); - t.globalBind('mouseup.dur touchend.dur', function (e) { - mouseIsDown = false; - timefloat.hide(); - t.globalUnbind('.dur'); - }); - return false; - } - }) - .bind('mouseenter', function(e) { - mouseIsOver = true; - t.globalBind('mousemove.dur', function(e) { - handleMouseMove(e); - }); - if (!mejs.MediaFeatures.hasTouch) { - timefloat.show(); - } - }) - .bind('mouseleave',function(e) { - mouseIsOver = false; - if (!mouseIsDown) { - t.globalUnbind('.dur'); - timefloat.hide(); - } - }); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // loading - media.addEventListener('progress', function (e) { - player.setProgressRail(e); - player.setCurrentRail(e); - }, false); +/** + * YouTube renderer + * + * Uses <iframe> approach and uses YouTube API to manipulate it. + * Note: IE6-7 don't have postMessage so don't support <iframe> API, and IE8 doesn't fire the onReady event, + * so it doesn't work - not sure if Google problem or not. + * @see https://developers.google.com/youtube/iframe_api_reference + */ +var YouTubeApi = { + /** + * @type {Boolean} + */ + isIframeStarted: false, + /** + * @type {Boolean} + */ + isIframeLoaded: false, + /** + * @type {Array} + */ + iframeQueue: [], - // current time - media.addEventListener('timeupdate', function(e) { - player.setProgressRail(e); - player.setCurrentRail(e); - }, false); - - - // store for later use - t.loaded = loaded; - t.total = total; - t.current = current; - t.handle = handle; - }, - setProgressRail: function(e) { - - var - t = this, - target = (e != undefined) ? e.target : t.media, - percent = null; - - // newest HTML5 spec has buffered array (FF4, Webkit) - if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) { - // TODO: account for a real array with multiple values (only Firefox 4 has this so far) - percent = target.buffered.end(0) / target.duration; - } - // Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end() - // to be anything other than 0. If the byte count is available we use this instead. - // Browsers that support the else if do not seem to have the bufferedBytes value and - // should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8. - else if (target && target.bytesTotal != undefined && target.bytesTotal > 0 && target.bufferedBytes != undefined) { - percent = target.bufferedBytes / target.bytesTotal; - } - // Firefox 3 with an Ogg file seems to go this way - else if (e && e.lengthComputable && e.total != 0) { - percent = e.loaded/e.total; - } + /** + * Create a queue to prepare the creation of <iframe> + * + * @param {Object} settings - an object with settings needed to create <iframe> + */ + enqueueIframe: function enqueueIframe(settings) { - // finally update the progress bar - if (percent !== null) { - percent = Math.min(1, Math.max(0, percent)); - // update loaded bar - if (t.loaded && t.total) { - t.loaded.width(t.total.width() * percent); - } - } - }, - setCurrentRail: function() { + // Check whether YouTube API is already loaded. + YouTubeApi.isLoaded = typeof YT !== 'undefined' && YT.loaded; - var t = this; - - if (t.media.currentTime != undefined && t.media.duration) { + if (YouTubeApi.isLoaded) { + YouTubeApi.createIframe(settings); + } else { + YouTubeApi.loadIframeApi(); + YouTubeApi.iframeQueue.push(settings); + } + }, - // update bar and handle - if (t.total && t.handle) { - var - newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration), - handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2); + /** + * Load YouTube API script on the header of the document + * + */ + loadIframeApi: function loadIframeApi() { + if (!YouTubeApi.isIframeStarted) { + var tag = _document2.default.createElement('script'); + tag.src = '//www.youtube.com/player_api'; + var firstScriptTag = _document2.default.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + YouTubeApi.isIframeStarted = true; + } + }, - t.current.width(newWidth); - t.handle.css('left', handlePos); - } - } + /** + * Process queue of YouTube <iframe> element creation + * + */ + iFrameReady: function iFrameReady() { - } - }); -})(mejs.$); - -(function($) { - - // options - $.extend(mejs.MepDefaults, { - duration: -1, - timeAndDurationSeparator: '<span> | </span>' - }); + YouTubeApi.isLoaded = true; + YouTubeApi.isIframeLoaded = true; + + while (YouTubeApi.iframeQueue.length > 0) { + var settings = YouTubeApi.iframeQueue.pop(); + YouTubeApi.createIframe(settings); + } + }, + /** + * Create a new instance of YouTube API player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to create <iframe> + */ + createIframe: function createIframe(settings) { + return new YT.Player(settings.containerId, settings); + }, - // current and duration 00:00 / 00:00 - $.extend(MediaElementPlayer.prototype, { - buildcurrent: function(player, controls, layers, media) { - var t = this; - - $('<div class="mejs-time">'+ - '<span class="mejs-currenttime">' + (player.options.alwaysShowHours ? '00:' : '') - + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')+ '</span>'+ - '</div>') - .appendTo(controls); - - t.currenttime = t.controls.find('.mejs-currenttime'); - - media.addEventListener('timeupdate',function() { - player.updateCurrent(); - }, false); - }, + /** + * Extract ID from YouTube's URL to be loaded through API + * Valid URL format(s): + * - http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + * - http://www.youtube.com/v/VIDEO_ID?version=3 + * - http://youtu.be/Djd6tPrxc08 + * - http://www.youtube-nocookie.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + * + * @param {String} url + * @return {string} + */ + getYouTubeId: function getYouTubeId(url) { + + var youTubeId = ''; + + if (url.indexOf('?') > 0) { + // assuming: http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + youTubeId = YouTubeApi.getYouTubeIdFromParam(url); + + // if it's http://www.youtube.com/v/VIDEO_ID?version=3 + if (youTubeId === '') { + youTubeId = YouTubeApi.getYouTubeIdFromUrl(url); + } + } else { + youTubeId = YouTubeApi.getYouTubeIdFromUrl(url); + } + return youTubeId; + }, - buildduration: function(player, controls, layers, media) { - var t = this; - - if (controls.children().last().find('.mejs-currenttime').length > 0) { - $(t.options.timeAndDurationSeparator + - '<span class="mejs-duration">' + - (t.options.duration > 0 ? - mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25) : - ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')) - ) + - '</span>') - .appendTo(controls.find('.mejs-time')); - } else { + /** + * Get ID from URL with format: http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + * + * @param {String} url + * @returns {string} + */ + getYouTubeIdFromParam: function getYouTubeIdFromParam(url) { - // add class to current time - controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container'); - - $('<div class="mejs-time mejs-duration-container">'+ - '<span class="mejs-duration">' + - (t.options.duration > 0 ? - mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25) : - ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')) - ) + - '</span>' + - '</div>') - .appendTo(controls); - } - - t.durationD = t.controls.find('.mejs-duration'); - - media.addEventListener('timeupdate',function() { - player.updateDuration(); - }, false); - }, - - updateCurrent: function() { - var t = this; + if (url === undefined || url === null || !url.trim().length) { + return null; + } + + var parts = url.split('?'), + parameters = parts[1].split('&'); - if (t.currenttime) { - t.currenttime.html(mejs.Utility.secondsToTimeCode(t.media.currentTime, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25)); + var youTubeId = ''; + + for (var i = 0, total = parameters.length; i < total; i++) { + var paramParts = parameters[i].split('='); + if (paramParts[0] === 'v') { + youTubeId = paramParts[1]; + break; } - }, - - updateDuration: function() { - var t = this; + } + + return youTubeId; + }, - //Toggle the long video class if the video is longer than an hour. - t.container.toggleClass("mejs-long-video", t.media.duration > 3600); - - if (t.durationD && (t.options.duration > 0 || t.media.duration)) { - t.durationD.html(mejs.Utility.secondsToTimeCode(t.options.duration > 0 ? t.options.duration : t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25)); - } + /** + * Get ID from URL with formats + * - http://www.youtube.com/v/VIDEO_ID?version=3 + * - http://youtu.be/Djd6tPrxc08 + * @param {String} url + * @return {?String} + */ + getYouTubeIdFromUrl: function getYouTubeIdFromUrl(url) { + + if (url === undefined || url === null || !url.trim().length) { + return null; } - }); -})(mejs.$); + var parts = url.split('?'); + url = parts[0]; + return url.substring(url.lastIndexOf('/') + 1); + }, -(function($) { + /** + * Inject `no-cookie` element to URL. Only works with format: http://www.youtube.com/v/VIDEO_ID?version=3 + * @param {String} url + * @return {?String} + */ + getYouTubeNoCookieUrl: function getYouTubeNoCookieUrl(url) { + if (url === undefined || url === null || !url.trim().length || !url.includes('//www.youtube')) { + return url; + } - $.extend(mejs.MepDefaults, { - muteText: mejs.i18n.t('Mute Toggle'), - hideVolumeOnTouchDevices: true, - - audioVolume: 'horizontal', - videoVolume: 'vertical' - }); + var parts = url.split('/'); + parts[2] = parts[2].replace('.com', '-nocookie.com'); + return parts.join('/'); + } +}; - $.extend(MediaElementPlayer.prototype, { - buildvolume: function(player, controls, layers, media) { - - // Android and iOS don't support volume controls - if ((mejs.MediaFeatures.isAndroid || mejs.MediaFeatures.isiOS) && this.options.hideVolumeOnTouchDevices) - return; - - var t = this, - mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume, - mute = (mode == 'horizontal') ? - - // horizontal version - $('<div class="mejs-button mejs-volume-button mejs-mute">'+ - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '" aria-label="' + t.options.muteText + '"></button>'+ - '</div>' + - '<div class="mejs-horizontal-volume-slider">'+ // outer background - '<div class="mejs-horizontal-volume-total"></div>'+ // line background - '<div class="mejs-horizontal-volume-current"></div>'+ // current volume - '<div class="mejs-horizontal-volume-handle"></div>'+ // handle - '</div>' - ) - .appendTo(controls) : - - // vertical version - $('<div class="mejs-button mejs-volume-button mejs-mute">'+ - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '" aria-label="' + t.options.muteText + '"></button>'+ - '<div class="mejs-volume-slider">'+ // outer background - '<div class="mejs-volume-total"></div>'+ // line background - '<div class="mejs-volume-current"></div>'+ // current volume - '<div class="mejs-volume-handle"></div>'+ // handle - '</div>'+ - '</div>') - .appendTo(controls), - volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'), - volumeTotal = t.container.find('.mejs-volume-total, .mejs-horizontal-volume-total'), - volumeCurrent = t.container.find('.mejs-volume-current, .mejs-horizontal-volume-current'), - volumeHandle = t.container.find('.mejs-volume-handle, .mejs-horizontal-volume-handle'), - - positionVolumeHandle = function(volume, secondTry) { - - if (!volumeSlider.is(':visible') && typeof secondTry == 'undefined') { - volumeSlider.show(); - positionVolumeHandle(volume, true); - volumeSlider.hide() - return; - } - - // correct to 0-1 - volume = Math.max(0,volume); - volume = Math.min(volume,1); - - // ajust mute button style - if (volume == 0) { - mute.removeClass('mejs-mute').addClass('mejs-unmute'); - } else { - mute.removeClass('mejs-unmute').addClass('mejs-mute'); - } +var YouTubeIframeRenderer = { + name: 'youtube_iframe', + + options: { + prefix: 'youtube_iframe', + /** + * Custom configuration for YouTube player + * + * @see https://developers.google.com/youtube/player_parameters#Parameters + * @type {Object} + */ + youtube: { + autoplay: 0, + controls: 0, + disablekb: 1, + end: 0, + loop: 0, + modestbranding: 0, + playsinline: 0, + rel: 0, + showinfo: 0, + start: 0, + iv_load_policy: 3, + // custom to inject `-nocookie` element in URL + nocookie: false + } + }, - // position slider - if (mode == 'vertical') { - var - - // height of the full size volume slider background - totalHeight = volumeTotal.height(), - - // top/left of full size volume slider background - totalPosition = volumeTotal.position(), - - // the new top position based on the current volume - // 70% volume on 100px height == top:30px - newTop = totalHeight - (totalHeight * volume); - - // handle - volumeHandle.css('top', Math.round(totalPosition.top + newTop - (volumeHandle.height() / 2))); - - // show the current visibility - volumeCurrent.height(totalHeight - newTop ); - volumeCurrent.css('top', totalPosition.top + newTop); - } else { - var - - // height of the full size volume slider background - totalWidth = volumeTotal.width(), - - // top/left of full size volume slider background - totalPosition = volumeTotal.position(), - - // the new left position based on the current volume - newLeft = totalWidth * volume; - - // handle - volumeHandle.css('left', Math.round(totalPosition.left + newLeft - (volumeHandle.width() / 2))); - - // rezize the current part of the volume bar - volumeCurrent.width( Math.round(newLeft) ); - } - }, - handleVolumeMove = function(e) { - - var volume = null, - totalOffset = volumeTotal.offset(); - - // calculate the new volume based on the moust position - if (mode == 'vertical') { - - var - railHeight = volumeTotal.height(), - totalTop = parseInt(volumeTotal.css('top').replace(/px/,''),10), - newY = e.pageY - totalOffset.top; - - volume = (railHeight - newY) / railHeight; - - // the controls just hide themselves (usually when mouse moves too far up) - if (totalOffset.top == 0 || totalOffset.left == 0) - return; - + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['video/youtube', 'video/x-youtube'].includes(type); + }, + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + // API objects + var youtube = {}, + apiStack = [], + readyState = 4; + + var youTubeApi = null, + paused = true, + ended = false, + youTubeIframe = null, + volume = 1; + + youtube.options = options; + youtube.id = mediaElement.id + '_' + options.prefix; + youtube.mediaElement = mediaElement; + + // wrappers for get/set + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + + // add to flash state that we will store + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + youtube['get' + capName] = function () { + if (youTubeApi !== null) { + var value = null; + + // figure out how to get youtube dta here + + var _ret = function () { + switch (propName) { + case 'currentTime': + return { + v: youTubeApi.getCurrentTime() + }; + + case 'duration': + return { + v: youTubeApi.getDuration() + }; + + case 'volume': + volume = youTubeApi.getVolume() / 100; + return { + v: volume + }; + + case 'paused': + return { + v: paused + }; + + case 'ended': + return { + v: ended + }; + + case 'muted': + return { + v: youTubeApi.isMuted() + }; + + case 'buffered': + var percentLoaded = youTubeApi.getVideoLoadedFraction(), + duration = youTubeApi.getDuration(); + return { + v: { + start: function start() { + return 0; + }, + end: function end() { + return percentLoaded * duration; + }, + length: 1 + } + }; + case 'src': + return { + v: youTubeApi.getVideoUrl() + }; + + case 'readyState': + return { + v: readyState + }; + } + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + return value; } else { - var - railWidth = volumeTotal.width(), - newX = e.pageX - totalOffset.left; - - volume = newX / railWidth; + return null; } - - // ensure the volume isn't outside 0-1 - volume = Math.max(0,volume); - volume = Math.min(volume,1); - - // position the slider and handle - positionVolumeHandle(volume); - - // set the media object (this will trigger the volumechanged event) - if (volume == 0) { - media.setMuted(true); + }; + + youtube['set' + capName] = function (value) { + + if (youTubeApi !== null) { + + // do something + switch (propName) { + + case 'src': + var url = typeof value === 'string' ? value : value[0].src, + _videoId = YouTubeApi.getYouTubeId(url); + + if (mediaElement.originalNode.autoplay) { + youTubeApi.loadVideoById(_videoId); + } else { + youTubeApi.cueVideoById(_videoId); + } + break; + + case 'currentTime': + youTubeApi.seekTo(value); + break; + + case 'muted': + if (value) { + youTubeApi.mute(); + } else { + youTubeApi.unMute(); + } + setTimeout(function () { + var event = (0, _general.createEvent)('volumechange', youtube); + mediaElement.dispatchEvent(event); + }, 50); + break; + + case 'volume': + volume = value; + youTubeApi.setVolume(value * 100); + setTimeout(function () { + var event = (0, _general.createEvent)('volumechange', youtube); + mediaElement.dispatchEvent(event); + }, 50); + break; + case 'readyState': + var event = (0, _general.createEvent)('canplay', youtube); + mediaElement.dispatchEvent(event); + break; + + default: + + break; + } } else { - media.setMuted(false); + // store for after "READY" event fires + apiStack.push({ type: 'set', propName: propName, value: value }); } - media.setVolume(volume); - }, - mouseIsDown = false, - mouseIsOver = false; + }; + }; - // SLIDER - - mute - .hover(function() { - volumeSlider.show(); - mouseIsOver = true; - }, function() { - mouseIsOver = false; - - if (!mouseIsDown && mode == 'vertical') { - volumeSlider.hide(); - } - }); - - volumeSlider - .bind('mouseover', function() { - mouseIsOver = true; - }) - .bind('mousedown', function (e) { - handleVolumeMove(e); - t.globalBind('mousemove.vol', function(e) { - handleVolumeMove(e); - }); - t.globalBind('mouseup.vol', function () { - mouseIsDown = false; - t.globalUnbind('.vol'); + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } - if (!mouseIsOver && mode == 'vertical') { - volumeSlider.hide(); - } - }); - mouseIsDown = true; - - return false; - }); + // add wrappers for native methods + var methods = _mejs2.default.html5media.methods, + assignMethods = function assignMethods(methodName) { + // run the method on the native HTMLMediaElement + youtube[methodName] = function () { - // MUTE button - mute.find('button').click(function() { - media.setMuted( !media.muted ); - }); + if (youTubeApi !== null) { + + // DO method + switch (methodName) { + case 'play': + paused = false; + return youTubeApi.playVideo(); + case 'pause': + paused = true; + return youTubeApi.pauseVideo(); + case 'load': + return null; - // listen for volume change events from other sources - media.addEventListener('volumechange', function(e) { - if (!mouseIsDown) { - if (media.muted) { - positionVolumeHandle(0); - mute.removeClass('mejs-mute').addClass('mejs-unmute'); - } else { - positionVolumeHandle(media.volume); - mute.removeClass('mejs-unmute').addClass('mejs-mute'); } + } else { + apiStack.push({ type: 'call', methodName: methodName }); } - }, false); + }; + }; - if (t.container.is(':visible')) { - // set initial volume - positionVolumeHandle(player.options.startVolume); + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } - // mutes the media and sets the volume icon muted if the initial volume is set to 0 - if (player.options.startVolume === 0) { - media.setMuted(true); - } + // CREATE YouTube + var youtubeContainer = _document2.default.createElement('div'); + youtubeContainer.id = youtube.id; - // shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements - if (media.pluginType === 'native') { - media.setVolume(player.options.startVolume); - } - } + // If `nocookie` feature was enabled, modify original URL + if (youtube.options.youtube.nocookie) { + mediaElement.originalNode.setAttribute('src', YouTubeApi.getYouTubeNoCookieUrl(mediaFiles[0].src)); } - }); - -})(mejs.$); -(function($) { + mediaElement.originalNode.parentNode.insertBefore(youtubeContainer, mediaElement.originalNode); + mediaElement.originalNode.style.display = 'none'; + + var isAudio = mediaElement.originalNode.tagName.toLowerCase() === 'audio', + height = isAudio ? '0' : mediaElement.originalNode.height, + width = isAudio ? '0' : mediaElement.originalNode.width, + videoId = YouTubeApi.getYouTubeId(mediaFiles[0].src), + youtubeSettings = { + id: youtube.id, + containerId: youtubeContainer.id, + videoId: videoId, + height: height, + width: width, + playerVars: Object.assign({ + controls: 0, + rel: 0, + disablekb: 1, + showinfo: 0, + modestbranding: 0, + html5: 1, + playsinline: 0, + start: 0, + end: 0, + iv_load_policy: 3 + }, youtube.options.youtube), + origin: _window2.default.location.host, + events: { + onReady: function onReady(e) { + mediaElement.youTubeApi = youTubeApi = e.target; + mediaElement.youTubeState = { + paused: true, + ended: false + }; - $.extend(mejs.MepDefaults, { - usePluginFullScreen: true, - newWindowCallback: function() { return '';}, - fullscreenText: mejs.i18n.t('Fullscreen') - }); + // do call stack + if (apiStack.length) { + for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) { - $.extend(MediaElementPlayer.prototype, { + var stackItem = apiStack[_i2]; - isFullScreen: false, + if (stackItem.type === 'set') { + var propName = stackItem.propName, + capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); - isNativeFullScreen: false, + youtube['set' + capName](stackItem.value); + } else if (stackItem.type === 'call') { + youtube[stackItem.methodName](); + } + } + } - isInIframe: false, + // a few more events + youTubeIframe = youTubeApi.getIframe(); - buildfullscreen: function(player, controls, layers, media) { + var events = ['mouseover', 'mouseout'], + assignEvents = function assignEvents(e) { - if (!player.isVideo) - return; + var newEvent = (0, _general.createEvent)(e.type, youtube); + mediaElement.dispatchEvent(newEvent); + }; - player.isInIframe = (window.location != window.parent.location); + for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) { + youTubeIframe.addEventListener(events[_i3], assignEvents, false); + } - // native events - if (mejs.MediaFeatures.hasTrueNativeFullScreen) { + // send init events + var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay']; - // chrome doesn't alays fire this in an iframe - var func = function(e) { - if (player.isFullScreen) { - if (mejs.MediaFeatures.isFullScreen()) { - player.isNativeFullScreen = true; - // reset the controls once we are fully in full screen - player.setControlsSize(); - } else { - player.isNativeFullScreen = false; - // when a user presses ESC - // make sure to put the player back into place - player.exitFullScreen(); - } + for (var _i4 = 0, _total4 = initEvents.length; _i4 < _total4; _i4++) { + var event = (0, _general.createEvent)(initEvents[_i4], youtube); + mediaElement.dispatchEvent(event); + } + }, + onStateChange: function onStateChange(e) { + + // translate events + var events = []; + + switch (e.data) { + case -1: + // not started + events = ['loadedmetadata']; + paused = true; + ended = false; + break; + + case 0: + // YT.PlayerState.ENDED + events = ['ended']; + paused = false; + ended = true; + + youtube.stopInterval(); + break; + + case 1: + // YT.PlayerState.PLAYING + events = ['play', 'playing']; + paused = false; + ended = false; + + youtube.startInterval(); + + break; + + case 2: + // YT.PlayerState.PAUSED + events = ['pause']; + paused = true; + ended = false; + + youtube.stopInterval(); + break; + + case 3: + // YT.PlayerState.BUFFERING + events = ['progress']; + ended = false; + + break; + case 5: + // YT.PlayerState.CUED + events = ['loadeddata', 'loadedmetadata', 'canplay']; + paused = true; + ended = false; + + break; } - }; - player.globalBind(mejs.MediaFeatures.fullScreenEventName, func); + // send events up + for (var _i5 = 0, _total5 = events.length; _i5 < _total5; _i5++) { + var event = (0, _general.createEvent)(events[_i5], youtube); + mediaElement.dispatchEvent(event); + } + }, + onError: function onError(e) { + var event = (0, _general.createEvent)('error', youtube); + event.data = e.data; + mediaElement.dispatchEvent(event); + } } + }; - var t = this, - normalHeight = 0, - normalWidth = 0, - container = player.container, - fullscreenBtn = - $('<div class="mejs-button mejs-fullscreen-button">' + - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.fullscreenText + '" aria-label="' + t.options.fullscreenText + '"></button>' + - '</div>') - .appendTo(controls); - - if (t.media.pluginType === 'native' || (!t.options.usePluginFullScreen && !mejs.MediaFeatures.isFirefox)) { - - fullscreenBtn.click(function() { - var isFullScreen = (mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || player.isFullScreen; - - if (isFullScreen) { - player.exitFullScreen(); - } else { - player.enterFullScreen(); - } - }); + // The following will prevent that in mobile devices, YouTube is displayed in fullscreen when using audio + if (isAudio) { + youtubeSettings.playerVars.playsinline = 1; + } - } else { + // send it off for async loading and creation + YouTubeApi.enqueueIframe(youtubeSettings); - var hideTimeout = null, - supportsPointerEvents = (function() { - // TAKEN FROM MODERNIZR - var element = document.createElement('x'), - documentElement = document.documentElement, - getComputedStyle = window.getComputedStyle, - supports; - if(!('pointerEvents' in element.style)){ - return false; - } - element.style.pointerEvents = 'auto'; - element.style.pointerEvents = 'x'; - documentElement.appendChild(element); - supports = getComputedStyle && - getComputedStyle(element, '').pointerEvents === 'auto'; - documentElement.removeChild(element); - return !!supports; - })(); - - // - - if (supportsPointerEvents && !mejs.MediaFeatures.isOpera) { // opera doesn't allow this :( - - // allows clicking through the fullscreen button and controls down directly to Flash - - /* - When a user puts his mouse over the fullscreen button, the controls are disabled - So we put a div over the video and another one on iether side of the fullscreen button - that caputre mouse movement - and restore the controls once the mouse moves outside of the fullscreen button - */ - - var fullscreenIsDisabled = false, - restoreControls = function() { - if (fullscreenIsDisabled) { - // hide the hovers - for (var i in hoverDivs) { - hoverDivs[i].hide(); - } + youtube.onEvent = function (eventName, player, _youTubeState) { + if (_youTubeState !== null && _youTubeState !== undefined) { + mediaElement.youTubeState = _youTubeState; + } + }; - // restore the control bar - fullscreenBtn.css('pointer-events', ''); - t.controls.css('pointer-events', ''); + youtube.setSize = function (width, height) { + if (youTubeApi !== null) { + youTubeApi.setSize(width, height); + } + }; + youtube.hide = function () { + youtube.stopInterval(); + youtube.pause(); + if (youTubeIframe) { + youTubeIframe.style.display = 'none'; + } + }; + youtube.show = function () { + if (youTubeIframe) { + youTubeIframe.style.display = ''; + } + }; + youtube.destroy = function () { + youTubeApi.destroy(); + }; + youtube.interval = null; - // prevent clicks from pausing video - t.media.removeEventListener('click', t.clickToPlayPauseCallback); + youtube.startInterval = function () { + // create timer + youtube.interval = setInterval(function () { - // store for later - fullscreenIsDisabled = false; - } - }, - hoverDivs = {}, - hoverDivNames = ['top', 'left', 'right', 'bottom'], - i, len, - positionHoverDivs = function() { - var fullScreenBtnOffsetLeft = fullscreenBtn.offset().left - t.container.offset().left, - fullScreenBtnOffsetTop = fullscreenBtn.offset().top - t.container.offset().top, - fullScreenBtnWidth = fullscreenBtn.outerWidth(true), - fullScreenBtnHeight = fullscreenBtn.outerHeight(true), - containerWidth = t.container.width(), - containerHeight = t.container.height(); - - for (i in hoverDivs) { - hoverDivs[i].css({position: 'absolute', top: 0, left: 0}); //, backgroundColor: '#f00'}); - } + var event = (0, _general.createEvent)('timeupdate', youtube); + mediaElement.dispatchEvent(event); + }, 250); + }; + youtube.stopInterval = function () { + if (youtube.interval) { + clearInterval(youtube.interval); + } + }; - // over video, but not controls - hoverDivs['top'] - .width( containerWidth ) - .height( fullScreenBtnOffsetTop ); - - // over controls, but not the fullscreen button - hoverDivs['left'] - .width( fullScreenBtnOffsetLeft ) - .height( fullScreenBtnHeight ) - .css({top: fullScreenBtnOffsetTop}); - - // after the fullscreen button - hoverDivs['right'] - .width( containerWidth - fullScreenBtnOffsetLeft - fullScreenBtnWidth ) - .height( fullScreenBtnHeight ) - .css({top: fullScreenBtnOffsetTop, - left: fullScreenBtnOffsetLeft + fullScreenBtnWidth}); - - // under the fullscreen button - hoverDivs['bottom'] - .width( containerWidth ) - .height( containerHeight - fullScreenBtnHeight - fullScreenBtnOffsetTop ) - .css({top: fullScreenBtnOffsetTop + fullScreenBtnHeight}); - }; + return youtube; + } +}; - t.globalBind('resize', function() { - positionHoverDivs(); - }); +if (_window2.default.postMessage && _typeof(_window2.default.addEventListener)) { - for (i = 0, len = hoverDivNames.length; i < len; i++) { - hoverDivs[hoverDivNames[i]] = $('<div class="mejs-fullscreen-hover" />').appendTo(t.container).mouseover(restoreControls).hide(); - } + _window2.default.onYouTubePlayerAPIReady = function () { + YouTubeApi.iFrameReady(); + }; - // on hover, kill the fullscreen button's HTML handling, allowing clicks down to Flash - fullscreenBtn.on('mouseover',function() { + _media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('//www.youtube') || url.includes('//youtu.be') ? 'video/x-youtube' : null; + }); - if (!t.isFullScreen) { + _renderer.renderer.add(YouTubeIframeRenderer); +} - var buttonPos = fullscreenBtn.offset(), - containerPos = player.container.offset(); +},{"2":2,"25":25,"26":26,"3":3,"6":6,"7":7}],23:[function(_dereq_,module,exports){ +'use strict'; - // move the button in Flash into place - media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, false); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.cancelFullScreen = exports.requestFullScreen = exports.isFullScreen = exports.FULLSCREEN_EVENT_NAME = exports.HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = exports.SUPPORTS_NATIVE_HLS = exports.SUPPORT_POINTER_EVENTS = exports.HAS_MSE = exports.IS_STOCK_ANDROID = exports.IS_SAFARI = exports.IS_FIREFOX = exports.IS_CHROME = exports.IS_EDGE = exports.IS_IE = exports.IS_ANDROID = exports.IS_IOS = exports.IS_IPHONE = exports.IS_IPAD = exports.UA = exports.NAV = undefined; - // allows click through - fullscreenBtn.css('pointer-events', 'none'); - t.controls.css('pointer-events', 'none'); +var _window = _dereq_(3); - // restore click-to-play - t.media.addEventListener('click', t.clickToPlayPauseCallback); +var _window2 = _interopRequireDefault(_window); - // show the divs that will restore things - for (i in hoverDivs) { - hoverDivs[i].show(); - } +var _document = _dereq_(2); - positionHoverDivs(); +var _document2 = _interopRequireDefault(_document); - fullscreenIsDisabled = true; - } +var _mejs = _dereq_(6); - }); +var _mejs2 = _interopRequireDefault(_mejs); - // restore controls anytime the user enters or leaves fullscreen - media.addEventListener('fullscreenchange', function(e) { - t.isFullScreen = !t.isFullScreen; - // don't allow plugin click to pause video - messes with - // plugin's controls - if (t.isFullScreen) { - t.media.removeEventListener('click', t.clickToPlayPauseCallback); - } else { - t.media.addEventListener('click', t.clickToPlayPauseCallback); - } - restoreControls(); - }); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var NAV = exports.NAV = _window2.default.navigator; +var UA = exports.UA = NAV.userAgent.toLowerCase(); - // the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events - // so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button +var IS_IPAD = exports.IS_IPAD = UA.match(/ipad/i) !== null; +var IS_IPHONE = exports.IS_IPHONE = UA.match(/iphone/i) !== null; +var IS_IOS = exports.IS_IOS = IS_IPHONE || IS_IPAD; +var IS_ANDROID = exports.IS_ANDROID = UA.match(/android/i) !== null; +var IS_IE = exports.IS_IE = NAV.appName.toLowerCase().includes('microsoft') || NAV.appName.toLowerCase().match(/trident/gi) !== null; +var IS_EDGE = exports.IS_EDGE = 'msLaunchUri' in NAV && !('documentMode' in _document2.default); +var IS_CHROME = exports.IS_CHROME = UA.match(/chrome/gi) !== null; +var IS_FIREFOX = exports.IS_FIREFOX = UA.match(/firefox/gi) !== null; +var IS_SAFARI = exports.IS_SAFARI = UA.match(/safari/gi) !== null && !IS_CHROME; +var IS_STOCK_ANDROID = exports.IS_STOCK_ANDROID = UA.match(/^mozilla\/\d+\.\d+\s\(linux;\su;/gi) !== null; - t.globalBind('mousemove', function(e) { +var HAS_MSE = exports.HAS_MSE = 'MediaSource' in _window2.default; +var SUPPORT_POINTER_EVENTS = exports.SUPPORT_POINTER_EVENTS = function () { + var element = _document2.default.createElement('x'), + documentElement = _document2.default.documentElement, + getComputedStyle = _window2.default.getComputedStyle; - // if the mouse is anywhere but the fullsceen button, then restore it all - if (fullscreenIsDisabled) { + if (!('pointerEvents' in element.style)) { + return false; + } - var fullscreenBtnPos = fullscreenBtn.offset(); + element.style.pointerEvents = 'auto'; + element.style.pointerEvents = 'x'; + documentElement.appendChild(element); + var supports = getComputedStyle && getComputedStyle(element, '').pointerEvents === 'auto'; + element.remove(); + return !!supports; +}(); +// for IE +var html5Elements = ['source', 'track', 'audio', 'video']; +var video = void 0; - if (e.pageY < fullscreenBtnPos.top || e.pageY > fullscreenBtnPos.top + fullscreenBtn.outerHeight(true) || - e.pageX < fullscreenBtnPos.left || e.pageX > fullscreenBtnPos.left + fullscreenBtn.outerWidth(true) - ) { +for (var i = 0, total = html5Elements.length; i < total; i++) { + video = _document2.default.createElement(html5Elements[i]); +} - fullscreenBtn.css('pointer-events', ''); - t.controls.css('pointer-events', ''); +// Test if browsers support HLS natively (right now Safari, Android's Chrome and Stock browsers, and MS Edge) +var SUPPORTS_NATIVE_HLS = exports.SUPPORTS_NATIVE_HLS = IS_SAFARI || IS_ANDROID && (IS_CHROME || IS_STOCK_ANDROID) || IS_IE && UA.match(/edge/gi) !== null; - fullscreenIsDisabled = false; - } - } - }); +// Detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails) +// iOS +var hasiOSFullScreen = video.webkitEnterFullscreen !== undefined; +// W3C +var hasNativeFullscreen = video.requestFullscreen !== undefined; - } else { +// OS X 10.5 can't do this even if it says it can :( +if (hasiOSFullScreen && UA.match(/mac os x 10_5/i)) { + hasNativeFullscreen = false; + hasiOSFullScreen = false; +} - // the hover state will show the fullscreen button in Flash to hover up and click +// webkit/firefox/IE11+ +var hasWebkitNativeFullScreen = video.webkitRequestFullScreen !== undefined; +var hasMozNativeFullScreen = video.mozRequestFullScreen !== undefined; +var hasMsNativeFullScreen = video.msRequestFullscreen !== undefined; + +var hasTrueNativeFullScreen = hasWebkitNativeFullScreen || hasMozNativeFullScreen || hasMsNativeFullScreen; +var nativeFullScreenEnabled = hasTrueNativeFullScreen; +var fullScreenEventName = ''; +var isFullScreen = void 0, + requestFullScreen = void 0, + cancelFullScreen = void 0; + +// Enabled? +if (hasMozNativeFullScreen) { + nativeFullScreenEnabled = _document2.default.mozFullScreenEnabled; +} else if (hasMsNativeFullScreen) { + nativeFullScreenEnabled = _document2.default.msFullscreenEnabled; +} - fullscreenBtn - .on('mouseover', function() { +if (IS_CHROME) { + hasiOSFullScreen = false; +} - if (hideTimeout !== null) { - clearTimeout(hideTimeout); - delete hideTimeout; - } +if (hasTrueNativeFullScreen) { - var buttonPos = fullscreenBtn.offset(), - containerPos = player.container.offset(); + if (hasWebkitNativeFullScreen) { + fullScreenEventName = 'webkitfullscreenchange'; + } else if (hasMozNativeFullScreen) { + fullScreenEventName = 'mozfullscreenchange'; + } else if (hasMsNativeFullScreen) { + fullScreenEventName = 'MSFullscreenChange'; + } - media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, true); + exports.isFullScreen = isFullScreen = function isFullScreen() { + if (hasMozNativeFullScreen) { + return _document2.default.mozFullScreen; + } else if (hasWebkitNativeFullScreen) { + return _document2.default.webkitIsFullScreen; + } else if (hasMsNativeFullScreen) { + return _document2.default.msFullscreenElement !== null; + } + }; - }) - .on('mouseout', function() { + exports.requestFullScreen = requestFullScreen = function requestFullScreen(el) { - if (hideTimeout !== null) { - clearTimeout(hideTimeout); - delete hideTimeout; - } + if (hasWebkitNativeFullScreen) { + el.webkitRequestFullScreen(); + } else if (hasMozNativeFullScreen) { + el.mozRequestFullScreen(); + } else if (hasMsNativeFullScreen) { + el.msRequestFullscreen(); + } + }; - hideTimeout = setTimeout(function() { - media.hideFullscreenButton(); - }, 1500); + exports.cancelFullScreen = cancelFullScreen = function cancelFullScreen() { + if (hasWebkitNativeFullScreen) { + _document2.default.webkitCancelFullScreen(); + } else if (hasMozNativeFullScreen) { + _document2.default.mozCancelFullScreen(); + } else if (hasMsNativeFullScreen) { + _document2.default.msExitFullscreen(); + } + }; +} +var HAS_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = hasNativeFullscreen; +var HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = hasWebkitNativeFullScreen; +var HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = hasMozNativeFullScreen; +var HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = hasMsNativeFullScreen; +var HAS_IOS_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = hasiOSFullScreen; +var HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_TRUE_NATIVE_FULLSCREEN = hasTrueNativeFullScreen; +var HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_NATIVE_FULLSCREEN_ENABLED = nativeFullScreenEnabled; +var FULLSCREEN_EVENT_NAME = exports.FULLSCREEN_EVENT_NAME = fullScreenEventName; + +exports.isFullScreen = isFullScreen; +exports.requestFullScreen = requestFullScreen; +exports.cancelFullScreen = cancelFullScreen; + + +_mejs2.default.Features = _mejs2.default.Features || {}; +_mejs2.default.Features.isiPad = IS_IPAD; +_mejs2.default.Features.isiPhone = IS_IPHONE; +_mejs2.default.Features.isiOS = _mejs2.default.Features.isiPhone || _mejs2.default.Features.isiPad; +_mejs2.default.Features.isAndroid = IS_ANDROID; +_mejs2.default.Features.isIE = IS_IE; +_mejs2.default.Features.isEdge = IS_EDGE; +_mejs2.default.Features.isChrome = IS_CHROME; +_mejs2.default.Features.isFirefox = IS_FIREFOX; +_mejs2.default.Features.isSafari = IS_SAFARI; +_mejs2.default.Features.isStockAndroid = IS_STOCK_ANDROID; +_mejs2.default.Features.hasMSE = HAS_MSE; +_mejs2.default.Features.supportsNativeHLS = SUPPORTS_NATIVE_HLS; + +_mejs2.default.Features.supportsPointerEvents = SUPPORT_POINTER_EVENTS; +_mejs2.default.Features.hasiOSFullScreen = HAS_IOS_FULLSCREEN; +_mejs2.default.Features.hasNativeFullscreen = HAS_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasWebkitNativeFullScreen = HAS_WEBKIT_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasMozNativeFullScreen = HAS_MOZ_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasMsNativeFullScreen = HAS_MS_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasTrueNativeFullScreen = HAS_TRUE_NATIVE_FULLSCREEN; +_mejs2.default.Features.nativeFullScreenEnabled = HAS_NATIVE_FULLSCREEN_ENABLED; +_mejs2.default.Features.fullScreenEventName = FULLSCREEN_EVENT_NAME; +_mejs2.default.Features.isFullScreen = isFullScreen; +_mejs2.default.Features.requestFullScreen = requestFullScreen; +_mejs2.default.Features.cancelFullScreen = cancelFullScreen; + +},{"2":2,"3":3,"6":6}],24:[function(_dereq_,module,exports){ +'use strict'; - }); - } - } +/** + * Most of the mtehods have been borrowed/adapted from https://plainjs.com/javascript, + * except fadeIn/fadeOut (from https://github.com/DimitriMikadze/vanilla-helpers/blob/master/js/vanillaHelpers.js) + */ - player.fullscreenBtn = fullscreenBtn; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.removeClass = exports.addClass = exports.hasClass = undefined; +exports.offset = offset; +exports.toggleClass = toggleClass; +exports.fadeOut = fadeOut; +exports.fadeIn = fadeIn; +exports.siblings = siblings; +exports.visible = visible; +exports.ajax = ajax; - t.globalBind('keydown',function (e) { - if (((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen) && e.keyCode == 27) { - player.exitFullScreen(); - } - }); +var _window = _dereq_(3); - }, +var _window2 = _interopRequireDefault(_window); - cleanfullscreen: function(player) { - player.exitFullScreen(); - }, +var _document = _dereq_(2); - containerSizeTimeout: null, +var _document2 = _interopRequireDefault(_document); - enterFullScreen: function() { +var _mejs = _dereq_(6); - var t = this; +var _mejs2 = _interopRequireDefault(_mejs); - // firefox+flash can't adjust plugin sizes without resetting :( - if (t.media.pluginType !== 'native' && (mejs.MediaFeatures.isFirefox || t.options.usePluginFullScreen)) { - //t.media.setFullscreen(true); - //player.isFullScreen = true; - return; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // set it to not show scroll bars so 100% will work - $(document.documentElement).addClass('mejs-fullscreen'); +function offset(el) { + var rect = el.getBoundingClientRect(), + scrollLeft = _window2.default.pageXOffset || _document2.default.documentElement.scrollLeft, + scrollTop = _window2.default.pageYOffset || _document2.default.documentElement.scrollTop; + return { top: rect.top + scrollTop, left: rect.left + scrollLeft }; +} - // store sizing - normalHeight = t.container.height(); - normalWidth = t.container.width(); +var hasClassMethod = void 0, + addClassMethod = void 0, + removeClassMethod = void 0; - // attempt to do true fullscreen (Safari 5.1 and Firefox Nightly only for now) - if (t.media.pluginType === 'native') { - if (mejs.MediaFeatures.hasTrueNativeFullScreen) { +if ('classList' in _document2.default.documentElement) { + hasClassMethod = function hasClassMethod(el, className) { + return el.classList !== undefined && el.classList.contains(className); + }; + addClassMethod = function addClassMethod(el, className) { + return el.classList.add(className); + }; + removeClassMethod = function removeClassMethod(el, className) { + return el.classList.remove(className); + }; +} else { + hasClassMethod = function hasClassMethod(el, className) { + return new RegExp('\\b' + className + '\\b').test(el.className); + }; + addClassMethod = function addClassMethod(el, className) { + if (!hasClass(el, className)) { + el.className += ' ' + className; + } + }; + removeClassMethod = function removeClassMethod(el, className) { + el.className = el.className.replace(new RegExp('\\b' + className + '\\b', 'g'), ''); + }; +} - mejs.MediaFeatures.requestFullScreen(t.container[0]); - //return; +var hasClass = exports.hasClass = hasClassMethod; +var addClass = exports.addClass = addClassMethod; +var removeClass = exports.removeClass = removeClassMethod; - if (t.isInIframe) { - // sometimes exiting from fullscreen doesn't work - // notably in Chrome <iframe>. Fixed in version 17 - setTimeout(function checkFullscreen() { +function toggleClass(el, className) { + hasClass(el, className) ? removeClass(el, className) : addClass(el, className); +} - if (t.isNativeFullScreen) { - var zoomMultiplier = window["devicePixelRatio"] || 1; - // Use a percent error margin since devicePixelRatio is a float and not exact. - var percentErrorMargin = 0.002; // 0.2% - var windowWidth = zoomMultiplier * $(window).width(); - var screenWidth = screen.width; - var absDiff = Math.abs(screenWidth - windowWidth); - var marginError = screenWidth * percentErrorMargin; +// fade an element from the current state to full opacity in "duration" ms +function fadeOut(el) { + var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400; + var callback = arguments[2]; - // check if the video is suddenly not really fullscreen - if (absDiff > marginError) { - // manually exit - t.exitFullScreen(); - } else { - // test again - setTimeout(checkFullscreen, 500); - } - } + if (!el.style.opacity) { + el.style.opacity = 1; + } + + var start = null; + _window2.default.requestAnimationFrame(function animate(timestamp) { + start = start || timestamp; + var progress = timestamp - start; + el.style.opacity = parseFloat(1 - progress / duration, 2); + if (progress > duration) { + if (callback && typeof callback === 'function') { + callback(); + } + } else { + _window2.default.requestAnimationFrame(animate); + } + }); +} +// fade out an element from the current state to full transparency in "duration" ms +// display is the display style the element is assigned after the animation is done +function fadeIn(el) { + var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400; + var callback = arguments[2]; - }, 500); - } + if (!el.style.opacity) { + el.style.opacity = 0; + } - } else if (mejs.MediaFeatures.hasSemiNativeFullScreen) { - t.media.webkitEnterFullscreen(); - return; - } + var start = null; + _window2.default.requestAnimationFrame(function animate(timestamp) { + start = start || timestamp; + var progress = timestamp - start; + el.style.opacity = parseFloat(progress / duration, 2); + if (progress > duration) { + if (callback && typeof callback === 'function') { + callback(); } + } else { + _window2.default.requestAnimationFrame(animate); + } + }); +} - // check for iframe launch - if (t.isInIframe) { - var url = t.options.newWindowCallback(this); +function siblings(el, filter) { + var siblings = []; + el = el.parentNode.firstChild; + do { + if (!filter || filter(el)) { + siblings.push(el); + } + } while (el = el.nextSibling); + return siblings; +} +function visible(elem) { + return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); +} - if (url !== '') { +function ajax(url, dataType, success, error) { + var xhr = _window2.default.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); + + var type = 'application/x-www-form-urlencoded; charset=UTF-8', + completed = false, + accept = '*/'.concat('*'); + + switch (dataType) { + case 'text': + type = 'text/plain'; + break; + case 'json': + type = 'application/json, text/javascript'; + break; + case 'html': + type = 'text/html'; + break; + case 'xml': + type = 'application/xml, text/xml'; + break; + } - // launch immediately - if (!mejs.MediaFeatures.hasTrueNativeFullScreen) { - t.pause(); - window.open(url, t.id, 'top=0,left=0,width=' + screen.availWidth + ',height=' + screen.availHeight + ',resizable=yes,scrollbars=no,status=no,toolbar=no'); - return; - } else { - setTimeout(function() { - if (!t.isNativeFullScreen) { - t.pause(); - window.open(url, t.id, 'top=0,left=0,width=' + screen.availWidth + ',height=' + screen.availHeight + ',resizable=yes,scrollbars=no,status=no,toolbar=no'); - } - }, 250); - } - } + if (!type.includes('application/x-www-form-urlencoded')) { + accept = type + ', */*; q=0.01'; + } + if (xhr) { + xhr.open('GET', url, true); + xhr.setRequestHeader('Accept', accept); + xhr.onreadystatechange = function () { + + // Ignore repeat invocations + if (completed) { + return; } - // full window code + if (xhr.readyState === 4) { + if (xhr.status === 200) { + completed = true; + var data = void 0; - // make full size - t.container - .addClass('mejs-container-fullscreen') - .width('100%') - .height('100%'); - //.css({position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, overflow: 'hidden', width: '100%', height: '100%', 'z-index': 1000}); + switch (dataType) { + case 'json': + data = JSON.parse(xhr.responseText); + break; + case 'xml': + data = xhr.responseXML; + break; + default: + data = xhr.responseText; + break; + } - // Only needed for safari 5.1 native full screen, can cause display issues elsewhere - // Actually, it seems to be needed for IE8, too - //if (mejs.MediaFeatures.hasTrueNativeFullScreen) { - t.containerSizeTimeout = setTimeout(function() { - t.container.css({width: '100%', height: '100%'}); - t.setControlsSize(); - }, 500); - //} + success(data); + } else if (typeof error === 'function') { + error(xhr.status); + } + } + }; - if (t.media.pluginType === 'native') { - t.$media - .width('100%') - .height('100%'); - } else { - t.container.find('.mejs-shim') - .width('100%') - .height('100%'); + xhr.send(); + } +} - //if (!mejs.MediaFeatures.hasTrueNativeFullScreen) { - t.media.setVideoSize($(window).width(),$(window).height()); - //} - } +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.offset = offset; +_mejs2.default.Utils.hasClass = hasClass; +_mejs2.default.Utils.addClass = addClass; +_mejs2.default.Utils.removeClass = removeClass; +_mejs2.default.Utils.toggleClass = toggleClass; +_mejs2.default.Utils.fadeIn = fadeIn; +_mejs2.default.Utils.fadeOut = fadeOut; +_mejs2.default.Utils.siblings = siblings; +_mejs2.default.Utils.visible = visible; +_mejs2.default.Utils.ajax = ajax; + +},{"2":2,"3":3,"6":6}],25:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.escapeHTML = escapeHTML; +exports.debounce = debounce; +exports.isObjectEmpty = isObjectEmpty; +exports.splitEvents = splitEvents; +exports.createEvent = createEvent; +exports.isNodeAfter = isNodeAfter; +exports.isString = isString; - t.layers.children('div') - .width('100%') - .height('100%'); +var _mejs = _dereq_(6); - if (t.fullscreenBtn) { - t.fullscreenBtn - .removeClass('mejs-fullscreen') - .addClass('mejs-unfullscreen'); - } +var _mejs2 = _interopRequireDefault(_mejs); - t.setControlsSize(); - t.isFullScreen = true; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - t.container.find('.mejs-captions-text').css('font-size', screen.width / t.width * 1.00 * 100 + '%'); - t.container.find('.mejs-captions-position').css('bottom', '45px'); - }, +/** + * + * @param {String} input + * @return {string} + */ +function escapeHTML(input) { - exitFullScreen: function() { + if (typeof input !== 'string') { + throw new Error('Argument passed must be a string'); + } - var t = this; + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"' + }; - // Prevent container from attempting to stretch a second time - clearTimeout(t.containerSizeTimeout); + return input.replace(/[&<>"]/g, function (c) { + return map[c]; + }); +} - // firefox can't adjust plugins - if (t.media.pluginType !== 'native' && mejs.MediaFeatures.isFirefox) { - t.media.setFullscreen(false); - //player.isFullScreen = false; - return; - } +// taken from underscore +function debounce(func, wait) { + var _this = this, + _arguments = arguments; - // come outo of native fullscreen - if (mejs.MediaFeatures.hasTrueNativeFullScreen && (mejs.MediaFeatures.isFullScreen() || t.isFullScreen)) { - mejs.MediaFeatures.cancelFullScreen(); - } + var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - // restore scroll bars to document - $(document.documentElement).removeClass('mejs-fullscreen'); - t.container - .removeClass('mejs-container-fullscreen') - .width(normalWidth) - .height(normalHeight); - //.css({position: '', left: '', top: '', right: '', bottom: '', overflow: 'inherit', width: normalWidth + 'px', height: normalHeight + 'px', 'z-index': 1}); + if (typeof func !== 'function') { + throw new Error('First argument must be a function'); + } - if (t.media.pluginType === 'native') { - t.$media - .width(normalWidth) - .height(normalHeight); - } else { - t.container.find('.mejs-shim') - .width(normalWidth) - .height(normalHeight); + if (typeof wait !== 'number') { + throw new Error('Second argument must be a numeric value'); + } - t.media.setVideoSize(normalWidth, normalHeight); + var timeout = void 0; + return function () { + var context = _this, + args = _arguments; + var later = function later() { + timeout = null; + if (!immediate) { + func.apply(context, args); } + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); - t.layers.children('div') - .width(normalWidth) - .height(normalHeight); - - t.fullscreenBtn - .removeClass('mejs-unfullscreen') - .addClass('mejs-fullscreen'); + if (callNow) { + func.apply(context, args); + } + }; +} - t.setControlsSize(); - t.isFullScreen = false; +/** + * Determine if an object contains any elements + * + * @see http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object + * @param {Object} instance + * @return {Boolean} + */ +function isObjectEmpty(instance) { + return Object.getOwnPropertyNames(instance).length <= 0; +} - t.container.find('.mejs-captions-text').css('font-size',''); - t.container.find('.mejs-captions-position').css('bottom', ''); +/** + * Group a string of events into `document` (d) and `window` (w) events + * + * @param {String} events List of space separated events + * @param {String} id Namespace appended to events + * @return {{d: Array, w: Array}} + */ +function splitEvents(events, id) { + // Global events + var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/; + // add player ID as an event namespace so it's easier to unbind them all later + var ret = { d: [], w: [] }; + (events || '').split(' ').forEach(function (v) { + var eventName = '' + v + (id ? '.' + id : ''); + + if (eventName.startsWith('.')) { + ret.d.push(eventName); + ret.w.push(eventName); + } else { + ret[rwindow.test(v) ? 'w' : 'd'].push(eventName); } }); -})(mejs.$); + ret.d = ret.d.join(' '); + ret.w = ret.w.join(' '); + return ret; +} -(function($) { +/** + * + * @param {string} eventName + * @param {*} target + * @return {Event|Object} + */ +function createEvent(eventName, target) { - // Speed - $.extend(mejs.MepDefaults, { + if (typeof eventName !== 'string') { + throw new Error('Event name must be a string'); + } - speeds: ['1.50', '1.25', '1.00', '0.75'], + var eventFrags = eventName.match(/[a-z]+\.([a-z]+)/), + detail = { + target: target + }; - defaultSpeed: '1.00' + if (eventFrags !== null) { + eventName = eventFrags[0]; + detail.namespace = eventFrags[1]; + } + return new window.CustomEvent(eventName, { + detail: detail }); +} - $.extend(MediaElementPlayer.prototype, { - - buildspeed: function(player, controls, layers, media) { - var t = this; - - if (t.media.pluginType == 'native') { - var s = '<div class="mejs-button mejs-speed-button"><button type="button">'+t.options.defaultSpeed+'x</button><div class="mejs-speed-selector"><ul>'; - var i, ss; +/** + * Returns true if targetNode appears after sourceNode in the dom. + * @param {HTMLElement} sourceNode - the source node for comparison + * @param {HTMLElement} targetNode - the node to compare against sourceNode + */ +function isNodeAfter(sourceNode, targetNode) { - if ($.inArray(t.options.defaultSpeed, t.options.speeds) === -1) { - t.options.speeds.push(t.options.defaultSpeed); - } + return !!(sourceNode && targetNode && sourceNode.compareDocumentPosition(targetNode) & 2 // 2 : Node.DOCUMENT_POSITION_PRECEDING + ); +} - t.options.speeds.sort(function(a, b) { - return parseFloat(b) - parseFloat(a); - }); +/** + * Determines if a value is a string + * + * @param {*} value to check + * @returns {Boolean} True if a value is a string + */ +function isString(value) { + return typeof value === 'string'; +} - for (i = 0; i < t.options.speeds.length; i++) { - s += '<li><input type="radio" name="speed" value="' + t.options.speeds[i] + '" id="' + t.options.speeds[i] + '" '; - if (t.options.speeds[i] == t.options.defaultSpeed) { - s += 'checked=true '; - s += '/><label for="' + t.options.speeds[i] + '" class="mejs-speed-selected">'+ t.options.speeds[i] + 'x</label></li>'; - } else { - s += '/><label for="' + t.options.speeds[i] + '">'+ t.options.speeds[i] + 'x</label></li>'; - } - } - s += '</ul></div></div>'; +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.escapeHTML = escapeHTML; +_mejs2.default.Utils.debounce = debounce; +_mejs2.default.Utils.isObjectEmpty = isObjectEmpty; +_mejs2.default.Utils.splitEvents = splitEvents; +_mejs2.default.Utils.createEvent = createEvent; +_mejs2.default.Utils.isNodeAfter = isNodeAfter; +_mejs2.default.Utils.isString = isString; - player.speedButton = $(s).appendTo(controls); +},{"6":6}],26:[function(_dereq_,module,exports){ +'use strict'; - player.playbackspeed = t.options.defaultSpeed; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.typeChecks = undefined; +exports.absolutizeUrl = absolutizeUrl; +exports.formatType = formatType; +exports.getMimeFromType = getMimeFromType; +exports.getTypeFromFile = getTypeFromFile; +exports.getExtension = getExtension; +exports.normalizeExtension = normalizeExtension; - player.speedButton - .on('click', 'input[type=radio]', function() { - player.playbackspeed = $(this).attr('value'); - media.playbackRate = parseFloat(player.playbackspeed); - player.speedButton.find('button').text(player.playbackspeed + 'x'); - player.speedButton.find('.mejs-speed-selected').removeClass('mejs-speed-selected'); - player.speedButton.find('input[type=radio]:checked').next().addClass('mejs-speed-selected'); - }); +var _mejs = _dereq_(6); - ss = player.speedButton.find('.mejs-speed-selector'); - ss.height(this.speedButton.find('.mejs-speed-selector ul').outerHeight(true) + player.speedButton.find('.mejs-speed-translations').outerHeight(true)); - ss.css('top', (-1 * ss.height()) + 'px'); - } - } - }); +var _mejs2 = _interopRequireDefault(_mejs); -})(mejs.$); +var _general = _dereq_(25); -(function($) { +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // add extra default options - $.extend(mejs.MepDefaults, { - // this will automatically turn on a <track> - startLanguage: '', +var typeChecks = exports.typeChecks = []; - tracksText: mejs.i18n.t('Captions/Subtitles'), +/** + * + * @param {String} url + * @return {String} + */ +function absolutizeUrl(url) { - // option to remove the [cc] button when no <track kind="subtitles"> are present - hideCaptionsButtonWhenEmpty: true, + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - // If true and we only have one track, change captions to popup - toggleCaptionsButtonWhenOnlyOne: false, + var el = document.createElement('div'); + el.innerHTML = '<a href="' + (0, _general.escapeHTML)(url) + '">x</a>'; + return el.firstChild.href; +} - // #id or .class - slidesSelector: '' - }); +/** + * Get the format of a specific media, based on URL and additionally its mime type + * + * @param {String} url + * @param {String} type + * @return {String} + */ +function formatType(url) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - $.extend(MediaElementPlayer.prototype, { + return url && !type ? getTypeFromFile(url) : getMimeFromType(type); +} - hasChapters: false, +/** + * Return the mime part of the type in case the attribute contains the codec + * (`video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`) + * + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element + * @param {String} type + * @return {String} + */ +function getMimeFromType(type) { - buildtracks: function(player, controls, layers, media) { - if (player.tracks.length === 0) - return; + if (typeof type !== 'string') { + throw new Error('`type` argument must be a string'); + } - var t = this, - i, - options = ''; + return type && ~type.indexOf(';') ? type.substr(0, type.indexOf(';')) : type; +} - if (t.domNode.textTracks) { // if browser will do native captions, prefer mejs captions, loop through tracks and hide - for (i = t.domNode.textTracks.length - 1; i >= 0; i--) { - t.domNode.textTracks[i].mode = "hidden"; - } - } - player.chapters = - $('<div class="mejs-chapters mejs-layer"></div>') - .prependTo(layers).hide(); - player.captions = - $('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>') - .prependTo(layers).hide(); - player.captionsText = player.captions.find('.mejs-captions-text'); - player.captionsButton = - $('<div class="mejs-button mejs-captions-button">'+ - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.tracksText + '" aria-label="' + t.options.tracksText + '"></button>'+ - '<div class="mejs-captions-selector">'+ - '<ul>'+ - '<li>'+ - '<input type="radio" name="' + player.id + '_captions" id="' + player.id + '_captions_none" value="none" checked="checked" />' + - '<label for="' + player.id + '_captions_none">' + mejs.i18n.t('None') +'</label>'+ - '</li>' + - '</ul>'+ - '</div>'+ - '</div>') - .appendTo(controls); - - - var subtitleCount = 0; - for (i=0; i<player.tracks.length; i++) { - if (player.tracks[i].kind == 'subtitles') { - subtitleCount++; - } - } +/** + * Get the type of media based on URL structure + * + * @param {String} url + * @return {String} + */ +function getTypeFromFile(url) { - // if only one language then just make the button a toggle - if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){ - // click - player.captionsButton.on('click',function() { - if (player.selectedTrack === null) { - lang = player.tracks[0].srclang; - } else { - lang = 'none'; - } - player.setTrack(lang); - }); - } else { - // hover or keyboard focus - player.captionsButton.on( 'mouseenter focusin', function() { - $(this).find('.mejs-captions-selector').css('visibility','visible'); - }) - - // handle clicks to the language radio buttons - .on('click','input[type=radio]',function() { - lang = this.value; - player.setTrack(lang); - }); + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - player.captionsButton.on( 'mouseleave focusout', function() { - $(this).find(".mejs-captions-selector").css("visibility","hidden"); - }); + for (var i = 0, total = typeChecks.length; i < total; i++) { + var type = typeChecks[i](url); - } + if (type) { + return type; + } + } - if (!player.options.alwaysShowControls) { - // move with controls - player.container - .bind('controlsshown', function () { - // push captions above controls - player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover'); + // the do standard extension check + var ext = getExtension(url), + normalizedExt = normalizeExtension(ext); - }) - .bind('controlshidden', function () { - if (!media.paused) { - // move back to normal place - player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover'); - } - }); - } else { - player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover'); - } + var mime = 'video/mp4'; - player.trackToLoad = -1; - player.selectedTrack = null; - player.isLoadingTrack = false; + // Obtain correct MIME types + if (normalizedExt) { + if (['mp4', 'm4v', 'ogg', 'ogv', 'webm', 'flv', 'mpeg', 'mov'].includes(normalizedExt)) { + mime = 'video/' + normalizedExt; + } else if (['mp3', 'oga', 'wav', 'mid', 'midi'].includes(normalizedExt)) { + mime = 'audio/' + normalizedExt; + } + } - // add to list - for (i=0; i<player.tracks.length; i++) { - if (player.tracks[i].kind == 'subtitles') { - player.addTrackButton(player.tracks[i].srclang, player.tracks[i].label); - } - } + return mime; +} - // start loading tracks - player.loadNextTrack(); +/** + * Get media file extension from URL + * + * @param {String} url + * @return {String} + */ +function getExtension(url) { - media.addEventListener('timeupdate',function(e) { - player.displayCaptions(); - }, false); + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - if (player.options.slidesSelector !== '') { - player.slidesContainer = $(player.options.slidesSelector); + var baseUrl = url.split('?')[0], + baseName = baseUrl.split('\\').pop().split('/').pop(); - media.addEventListener('timeupdate',function(e) { - player.displaySlides(); - }, false); + return baseName.indexOf('.') > -1 ? baseName.substring(baseName.lastIndexOf('.') + 1) : ''; +} - } +/** + * Get standard extension of a media file + * + * @param {String} extension + * @return {String} + */ +function normalizeExtension(extension) { - media.addEventListener('loadedmetadata', function(e) { - player.displayChapters(); - }, false); + if (typeof extension !== 'string') { + throw new Error('`extension` argument must be a string'); + } - player.container.hover( - function () { - // chapters - if (player.hasChapters) { - player.chapters.css('visibility','visible'); - player.chapters.fadeIn(200).height(player.chapters.find('.mejs-chapter').outerHeight()); - } - }, - function () { - if (player.hasChapters && !media.paused) { - player.chapters.fadeOut(200, function() { - $(this).css('visibility','hidden'); - $(this).css('display','block'); - }); - } - }); + switch (extension) { + case 'mp4': + case 'm4v': + return 'mp4'; + case 'webm': + case 'webma': + case 'webmv': + return 'webm'; + case 'ogg': + case 'oga': + case 'ogv': + return 'ogg'; + default: + return extension; + } +} - // check for autoplay - if (player.node.getAttribute('autoplay') !== null) { - player.chapters.css('visibility','hidden'); - } - }, +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.typeChecks = typeChecks; +_mejs2.default.Utils.absolutizeUrl = absolutizeUrl; +_mejs2.default.Utils.formatType = formatType; +_mejs2.default.Utils.getMimeFromType = getMimeFromType; +_mejs2.default.Utils.getTypeFromFile = getTypeFromFile; +_mejs2.default.Utils.getExtension = getExtension; +_mejs2.default.Utils.normalizeExtension = normalizeExtension; - setTrack: function(lang){ +},{"25":25,"6":6}],27:[function(_dereq_,module,exports){ +'use strict'; - var t = this, - i; +var _document = _dereq_(2); - if (lang == 'none') { - t.selectedTrack = null; - t.captionsButton.removeClass('mejs-captions-enabled'); - } else { - for (i=0; i<t.tracks.length; i++) { - if (t.tracks[i].srclang == lang) { - if (t.selectedTrack === null) - t.captionsButton.addClass('mejs-captions-enabled'); - t.selectedTrack = t.tracks[i]; - t.captions.attr('lang', t.selectedTrack.srclang); - t.displayCaptions(); - break; - } - } - } - }, +var _document2 = _interopRequireDefault(_document); - loadNextTrack: function() { - var t = this; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - t.trackToLoad++; - if (t.trackToLoad < t.tracks.length) { - t.isLoadingTrack = true; - t.loadTrack(t.trackToLoad); - } else { - // add done? - t.isLoadingTrack = false; +/** + * Polyfill + * + * Mimics the missing methods like Object.assign, Array.includes, etc., as a way to avoid including the whole list + * of polyfills provided by Babel. + */ - t.checkForTracks(); +// ChildNode.remove polyfill +// from: https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md +(function (arr) { + arr.forEach(function (item) { + if (item.hasOwnProperty('remove')) { + return; + } + Object.defineProperty(item, 'remove', { + configurable: true, + enumerable: true, + writable: true, + value: function remove() { + this.parentNode.removeChild(this); } - }, - - loadTrack: function(index){ - var - t = this, - track = t.tracks[index], - after = function() { + }); + }); +})([Element.prototype, CharacterData.prototype, DocumentType.prototype]); - track.isLoaded = true; +// CustomEvent polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent +(function () { - // create button - //t.addTrackButton(track.srclang); - t.enableTrackButton(track.srclang, track.label); + if (typeof window.CustomEvent === "function") return false; - t.loadNextTrack(); + function CustomEvent(event, params) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = _document2.default.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } - }; + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; +})(); - $.ajax({ - url: track.src, - dataType: "text", - success: function(d) { +// Object.assign polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill +if (typeof Object.assign !== 'function') { + Object.assign = function (target) { + // .length of function is 2 - // parse the loaded file - if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) { - track.entries = mejs.TrackFormatParser.dfxp.parse(d); - } else { - track.entries = mejs.TrackFormatParser.webvtt.parse(d); - } + if (target === null || target === undefined) { + // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } - after(); + var to = Object(target); - if (track.kind == 'chapters') { - t.media.addEventListener('play', function(e) { - if (t.media.duration > 0) { - t.displayChapters(track); - } - }, false); - } + for (var index = 1, total = arguments.length; index < total; index++) { + var nextSource = arguments[index]; - if (track.kind == 'slides') { - t.setupSlides(track); + if (nextSource !== null) { + // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; } - }, - error: function() { - t.loadNextTrack(); } - }); - }, - - enableTrackButton: function(lang, label) { - var t = this; - - if (label === '') { - label = mejs.language.codes[lang] || lang; } + } + return to; + }; +} - t.captionsButton - .find('input[value=' + lang + ']') - .prop('disabled',false) - .siblings('label') - .html( label ); +// Array.includes polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Polyfill +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, 'includes', { + value: function value(searchElement, fromIndex) { - // auto select - if (t.options.startLanguage == lang) { - $('#' + t.id + '_captions_' + lang).prop('checked', true).trigger('click'); + // 1. const O be ? ToObject(this value). + if (this === null || this === undefined) { + throw new TypeError('"this" is null or not defined'); } - t.adjustLanguageBox(); - }, + var o = Object(this); - addTrackButton: function(lang, label) { - var t = this; - if (label === '') { - label = mejs.language.codes[lang] || lang; - } + // 2. const len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; - t.captionsButton.find('ul').append( - $('<li>'+ - '<input type="radio" name="' + t.id + '_captions" id="' + t.id + '_captions_' + lang + '" value="' + lang + '" disabled="disabled" />' + - '<label for="' + t.id + '_captions_' + lang + '">' + label + ' (loading)' + '</label>'+ - '</li>') - ); + // 3. If len is 0, return false. + if (len === 0) { + return false; + } - t.adjustLanguageBox(); + // 4. const n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. const k be n. + // 6. Else n < 0, + // a. const k be len + n. + // b. If k < 0, const k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + // 7. Repeat, while k < len + while (k < len) { + // a. const elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(searchElement, elementK) is true, return true. + // c. Increase k by 1. + // NOTE: === provides the correct "SameValueZero" comparison needed here. + if (o[k] === searchElement) { + return true; + } + k++; + } - // remove this from the dropdownlist (if it exists) - t.container.find('.mejs-captions-translations option[value=' + lang + ']').remove(); - }, + // 8. Return false + return false; + } + }); +} - adjustLanguageBox:function() { - var t = this; - // adjust the size of the outer box - t.captionsButton.find('.mejs-captions-selector').height( - t.captionsButton.find('.mejs-captions-selector ul').outerHeight(true) + - t.captionsButton.find('.mejs-captions-translations').outerHeight(true) - ); - }, +// String.includes polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +if (!String.prototype.includes) { + String.prototype.includes = function (search, start) { + 'use strict'; - checkForTracks: function() { - var - t = this, - hasSubtitles = false; + if (typeof start !== 'number') { + start = 0; + } - // check if any subtitles - if (t.options.hideCaptionsButtonWhenEmpty) { - for (i=0; i<t.tracks.length; i++) { - if (t.tracks[i].kind == 'subtitles') { - hasSubtitles = true; - break; - } - } + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; +} - if (!hasSubtitles) { - t.captionsButton.hide(); - t.setControlsSize(); - } - } - }, +// String.startsWith polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; +} - displayCaptions: function() { +// Element.matches polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches +if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length - 1; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} - if (typeof this.tracks == 'undefined') - return; +// Element.closest polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest +if (window.Element && !Element.prototype.closest) { + Element.prototype.closest = function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = void 0, + el = this; + do { + i = matches.length; + while (--i >= 0 && matches.item(i) !== el) {} + } while (i < 0 && (el = el.parentElement)); + return el; + }; +} - var - t = this, - i, - track = t.selectedTrack; - - if (track !== null && track.isLoaded) { - for (i=0; i<track.entries.times.length; i++) { - if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop) { - // Set the line before the timecode as a class so the cue can be targeted if needed - t.captionsText.html(track.entries.text[i]).attr('class', 'mejs-captions-text ' + (track.entries.times[i].identifier || '')); - t.captions.show().height(0); - return; // exit out if one is visible; - } - } - t.captions.hide(); - } else { - t.captions.hide(); - } - }, +// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ +// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - setupSlides: function(track) { - var t = this; +// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel - t.slides = track; - t.slides.entries.imgs = [t.slides.entries.text.length]; - t.showSlide(0); +// MIT license - }, +(function () { + var lastTime = 0; + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } - showSlide: function(index) { - if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') { - return; - } + if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; - var t = this, - url = t.slides.entries.text[index], - img = t.slides.entries.imgs[index]; + if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; +})(); - if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') { +},{"2":2}],28:[function(_dereq_,module,exports){ +'use strict'; - t.slides.entries.imgs[index] = img = $('<img src="' + url + '">') - .on('load', function() { - img.appendTo(t.slidesContainer) - .hide() - .fadeIn() - .siblings(':visible') - .fadeOut(); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isDropFrame = isDropFrame; +exports.secondsToTimeCode = secondsToTimeCode; +exports.timeCodeToSeconds = timeCodeToSeconds; +exports.calculateTimeFormat = calculateTimeFormat; +exports.convertSMPTEtoSeconds = convertSMPTEtoSeconds; - }); +var _mejs = _dereq_(6); - } else { +var _mejs2 = _interopRequireDefault(_mejs); - if (!img.is(':visible') && !img.is(':animated')) { +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // +/** + * Indicate if FPS is dropFrame (typically non-integer frame rates: 29.976) + * + * @param {Number} fps - Frames per second + * @return {Boolean} + */ +function isDropFrame() { + var fps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 25; - img.fadeIn() - .siblings(':visible') - .fadeOut(); - } - } + return !(fps % 1 === 0); +} +/** + * Format a numeric time in format '00:00:00' + * + * @param {Number} time - Ideally a number, but if not or less than zero, is defaulted to zero + * @param {Boolean} forceHours + * @param {Boolean} showFrameCount + * @param {Number} fps - Frames per second + * @param {Number} secondsDecimalLength - Number of decimals to display if any + * @return {String} + */ +function secondsToTimeCode(time) { + var forceHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var showFrameCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var fps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 25; + var secondsDecimalLength = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + + + time = !time || typeof time !== 'number' || time < 0 ? 0 : time; + + var dropFrames = Math.round(fps * 0.066666), + // Number of drop frames to drop on the minute marks (6%) + timeBase = Math.round(fps), + framesPer24Hours = Math.round(fps * 3600) * 24, + framesPer10Minutes = Math.round(fps * 600), + frameSep = isDropFrame(fps) ? ';' : ':', + hours = void 0, + minutes = void 0, + seconds = void 0, + frames = void 0, + f = Math.round(time * fps); + + if (isDropFrame(fps)) { + + if (f < 0) { + f = framesPer24Hours + f; + } - }, + f = f % framesPer24Hours; - displaySlides: function() { + var d = Math.floor(f / framesPer10Minutes); + var m = f % framesPer10Minutes; + f = f + dropFrames * 9 * d; + if (m > dropFrames) { + f = f + dropFrames * Math.floor((m - dropFrames) / Math.round(timeBase * 60 - dropFrames)); + } - if (typeof this.slides == 'undefined') - return; + var timeBaseDivision = Math.floor(f / timeBase); - var - t = this, - slides = t.slides, - i; + hours = Math.floor(Math.floor(timeBaseDivision / 60) / 60); + minutes = Math.floor(timeBaseDivision / 60) % 60; - for (i=0; i<slides.entries.times.length; i++) { - if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){ + if (showFrameCount) { + seconds = timeBaseDivision % 60; + } else { + seconds = (f / timeBase % 60).toFixed(secondsDecimalLength); + } + } else { + hours = Math.floor(time / 3600) % 24; + minutes = Math.floor(time / 60) % 60; + if (showFrameCount) { + seconds = Math.floor(time % 60); + } else { + seconds = (time % 60).toFixed(secondsDecimalLength); + } + } + hours = hours <= 0 ? 0 : hours; + minutes = minutes <= 0 ? 0 : minutes; + seconds = seconds <= 0 ? 0 : seconds; + + var result = forceHours || hours > 0 ? (hours < 10 ? '0' + hours : hours) + ':' : ''; + result += (minutes < 10 ? '0' + minutes : minutes) + ':'; + result += '' + (seconds < 10 ? '0' + seconds : seconds); + + if (showFrameCount) { + frames = (f % timeBase).toFixed(0); + frames = frames <= 0 ? 0 : frames; + result += frames < 10 ? frameSep + '0' + frames : '' + frameSep + frames; + } - t.showSlide(i); + return result; +} - return; // exit out if one is visible; - } - } - }, +/** + * Convert a '00:00:00' time string into seconds + * + * @param {String} time + * @param {Number} fps - Frames per second + * @return {Number} + */ +function timeCodeToSeconds(time) { + var fps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 25; - displayChapters: function() { - var - t = this, - i; - for (i=0; i<t.tracks.length; i++) { - if (t.tracks[i].kind == 'chapters' && t.tracks[i].isLoaded) { - t.drawChapters(t.tracks[i]); - t.hasChapters = true; - break; - } - } - }, + if (typeof time !== 'string') { + throw new TypeError('Time must be a string'); + } - drawChapters: function(chapters) { - var - t = this, - i, - dur, - //width, - //left, - percent = 0, - usedPercent = 0; - - t.chapters.empty(); - - for (i=0; i<chapters.entries.times.length; i++) { - dur = chapters.entries.times[i].stop - chapters.entries.times[i].start; - percent = Math.floor(dur / t.media.duration * 100); - if (percent + usedPercent > 100 || // too large - i == chapters.entries.times.length-1 && percent + usedPercent < 100) // not going to fill it in - { - percent = 100 - usedPercent; - } - //width = Math.floor(t.width * dur / t.media.duration); - //left = Math.floor(t.width * chapters.entries.times[i].start / t.media.duration); - //if (left + width > t.width) { - // width = t.width - left; - //} - - t.chapters.append( $( - '<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' + - '<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' + - '<span class="ch-title">' + chapters.entries.text[i] + '</span>' + - '<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '–' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' + - '</div>' + - '</div>')); - usedPercent += percent; - } - - t.chapters.find('div.mejs-chapter').click(function() { - t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) ); - if (t.media.paused) { - t.media.play(); - } - }); + if (time.indexOf(';') > 0) { + time = time.replace(';', ':'); + } - t.chapters.show(); - } - }); + if (!time.match(/\d{2}(\:\d{2}){0,3}/)) { + throw new TypeError('Time code must have the format `00:00:00`'); + } + var parts = time.split(':'); + + var output = void 0, + hours = 0, + minutes = 0, + seconds = 0, + frames = 0, + totalMinutes = 0, + dropFrames = Math.round(fps * 0.066666), + // Number of drop frames to drop on the minute marks (6%) + timeBase = Math.round(fps), + hFrames = timeBase * 3600, + mFrames = timeBase * 60; + + switch (parts.length) { + default: + case 1: + seconds = parseInt(parts[0], 10); + break; + case 2: + minutes = parseInt(parts[0], 10); + seconds = parseInt(parts[1], 10); + break; + case 3: + hours = parseInt(parts[0], 10); + minutes = parseInt(parts[1], 10); + seconds = parseInt(parts[2], 10); + break; + case 4: + hours = parseInt(parts[0], 10); + minutes = parseInt(parts[1], 10); + seconds = parseInt(parts[2], 10); + frames = parseInt(parts[3], 10); + break; + } + if (isDropFrame(fps)) { + totalMinutes = 60 * hours + minutes; + output = hFrames * hours + mFrames * minutes + timeBase * seconds + frames - dropFrames * (totalMinutes - Math.floor(totalMinutes / 10)); + } else { + output = (hFrames * hours + mFrames * minutes + fps * seconds + frames) / fps; + } - mejs.language = { - codes: { - af:'Afrikaans', - sq:'Albanian', - ar:'Arabic', - be:'Belarusian', - bg:'Bulgarian', - ca:'Catalan', - zh:'Chinese', - 'zh-cn':'Chinese Simplified', - 'zh-tw':'Chinese Traditional', - hr:'Croatian', - cs:'Czech', - da:'Danish', - nl:'Dutch', - en:'English', - et:'Estonian', - fl:'Filipino', - fi:'Finnish', - fr:'French', - gl:'Galician', - de:'German', - el:'Greek', - ht:'Haitian Creole', - iw:'Hebrew', - hi:'Hindi', - hu:'Hungarian', - is:'Icelandic', - id:'Indonesian', - ga:'Irish', - it:'Italian', - ja:'Japanese', - ko:'Korean', - lv:'Latvian', - lt:'Lithuanian', - mk:'Macedonian', - ms:'Malay', - mt:'Maltese', - no:'Norwegian', - fa:'Persian', - pl:'Polish', - pt:'Portuguese', - // 'pt-pt':'Portuguese (Portugal)', - ro:'Romanian', - ru:'Russian', - sr:'Serbian', - sk:'Slovak', - sl:'Slovenian', - es:'Spanish', - sw:'Swahili', - sv:'Swedish', - tl:'Tagalog', - th:'Thai', - tr:'Turkish', - uk:'Ukrainian', - vi:'Vietnamese', - cy:'Welsh', - yi:'Yiddish' - } - }; + return parseFloat(output.toFixed(3)); +} - /* - Parses WebVTT format which should be formatted as - ================================ - WEBVTT - - 1 - 00:00:01,1 --> 00:00:05,000 - A line of text - - 2 - 00:01:15,1 --> 00:02:05,000 - A second line of text - - =============================== - - Adapted from: http://www.delphiki.com/html5/playr - */ - mejs.TrackFormatParser = { - webvtt: { - pattern_timecode: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/, - - parse: function(trackText) { - var - i = 0, - lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/), - entries = {text:[], times:[]}, - timecode, - text, - identifier; - for(; i<lines.length; i++) { - timecode = this.pattern_timecode.exec(lines[i]); - - if (timecode && i<lines.length) { - if ((i - 1) >= 0 && lines[i - 1] !== '') { - identifier = lines[i - 1]; - } - i++; - // grab all the (possibly multi-line) text that follows - text = lines[i]; - i++; - while(lines[i] !== '' && i<lines.length){ - text = text + '\n' + lines[i]; - i++; - } - text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); - // Text is in a different array so I can use .join - entries.text.push(text); - entries.times.push( - { - identifier: identifier, - start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) === 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]), - stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]), - settings: timecode[5] - }); - } - identifier = ''; +/** + * Calculate the time format to use + * + * There is a default format set in the options but it can be incomplete, so it is adjusted according to the media + * duration. Format: 'hh:mm:ss:ff' + * @param {*} time - Ideally a number, but if not or less than zero, is defaulted to zero + * @param {Object} options + * @param {Number} fps - Frames per second + */ +function calculateTimeFormat(time, options) { + var fps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25; + + + time = !time || typeof time !== 'number' || time < 0 ? 0 : time; + + var hours = Math.floor(time / 3600) % 24, + minutes = Math.floor(time / 60) % 60, + seconds = Math.floor(time % 60), + frames = Math.floor((time % 1 * fps).toFixed(3)), + lis = [[frames, 'f'], [seconds, 's'], [minutes, 'm'], [hours, 'h']]; + + var format = options.timeFormat, + firstTwoPlaces = format[1] === format[0], + separatorIndex = firstTwoPlaces ? 2 : 1, + separator = format.length < separatorIndex ? format[separatorIndex] : ':', + firstChar = format[0], + required = false; + + for (var i = 0, len = lis.length; i < len; i++) { + if (format.indexOf(lis[i][1]) > -1) { + required = true; + } else if (required) { + var hasNextValue = false; + for (var j = i; j < len; j++) { + if (lis[j][0] > 0) { + hasNextValue = true; + break; } - return entries; } - }, - // Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420 - dfxp: { - parse: function(trackText) { - trackText = $(trackText).filter("tt"); - var - i = 0, - container = trackText.children("div").eq(0), - lines = container.find("p"), - styleNode = trackText.find("#" + container.attr("style")), - styles, - begin, - end, - text, - entries = {text:[], times:[]}; - - - if (styleNode.length) { - var attributes = styleNode.removeAttr("id").get(0).attributes; - if (attributes.length) { - styles = {}; - for (i = 0; i < attributes.length; i++) { - styles[attributes[i].name.split(":")[1]] = attributes[i].value; - } - } - } - for(i = 0; i<lines.length; i++) { - var style; - var _temp_times = { - start: null, - stop: null, - style: null - }; - if (lines.eq(i).attr("begin")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("begin")); - if (!_temp_times.start && lines.eq(i-1).attr("end")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i-1).attr("end")); - if (lines.eq(i).attr("end")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("end")); - if (!_temp_times.stop && lines.eq(i+1).attr("begin")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i+1).attr("begin")); - if (styles) { - style = ""; - for (var _style in styles) { - style += _style + ":" + styles[_style] + ";"; - } - } - if (style) _temp_times.style = style; - if (_temp_times.start === 0) _temp_times.start = 0.200; - entries.times.push(_temp_times); - text = $.trim(lines.eq(i).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); - entries.text.push(text); - if (entries.times.start === 0) entries.times.start = 2; - } - return entries; + if (!hasNextValue) { + break; } - }, - split2: function (text, regex) { - // normal version for compliant browsers - // see below for IE fix - return text.split(regex); - } - }; - // test for browsers with bad String.split method. - if ('x\n\ny'.split(/\n/gi).length != 3) { - // add super slow IE8 and below version - mejs.TrackFormatParser.split2 = function(text, regex) { - var - parts = [], - chunk = '', - i; - - for (i=0; i<text.length; i++) { - chunk += text.substring(i,i+1); - if (regex.test(chunk)) { - parts.push(chunk.replace(regex, '')); - chunk = ''; - } + if (!firstTwoPlaces) { + format = firstChar + format; } - parts.push(chunk); - return parts; - }; - } - -})(mejs.$); - -/* -* ContextMenu Plugin -* -* -*/ - -(function($) { - -$.extend(mejs.MepDefaults, - { 'contextMenuItems': [ - // demo of a fullscreen option - { - render: function(player) { - - // check for fullscreen plugin - if (typeof player.enterFullScreen == 'undefined') - return null; - - if (player.isFullScreen) { - return mejs.i18n.t('Turn off Fullscreen'); - } else { - return mejs.i18n.t('Go Fullscreen'); - } - }, - click: function(player) { - if (player.isFullScreen) { - player.exitFullScreen(); - } else { - player.enterFullScreen(); - } + format = lis[i][1] + separator + format; + if (firstTwoPlaces) { + format = lis[i][1] + format; } + firstChar = lis[i][1]; } - , - // demo of a mute/unmute button - { - render: function(player) { - if (player.media.muted) { - return mejs.i18n.t('Unmute'); - } else { - return mejs.i18n.t('Mute'); - } - }, - click: function(player) { - if (player.media.muted) { - player.setMuted(false); - } else { - player.setMuted(true); - } - } - }, - // separator - { - isSeparator: true - } - , - // demo of simple download video - { - render: function(player) { - return mejs.i18n.t('Download Video'); - }, - click: function(player) { - window.location.href = player.media.currentSrc; - } - } - ]} -); - - - $.extend(MediaElementPlayer.prototype, { - buildcontextmenu: function(player, controls, layers, media) { - - // create context menu - player.contextMenu = $('<div class="mejs-contextmenu"></div>') - .appendTo($('body')) - .hide(); - - // create events for showing context menu - player.container.bind('contextmenu', function(e) { - if (player.isContextMenuEnabled) { - e.preventDefault(); - player.renderContextMenu(e.clientX-1, e.clientY-1); - return false; - } - }); - player.container.bind('click', function() { - player.contextMenu.hide(); - }); - player.contextMenu.bind('mouseleave', function() { + } - // - player.startContextMenuTimer(); - - }); - }, + options.currentTimeFormat = format; +} - cleancontextmenu: function(player) { - player.contextMenu.remove(); - }, - - isContextMenuEnabled: true, - enableContextMenu: function() { - this.isContextMenuEnabled = true; - }, - disableContextMenu: function() { - this.isContextMenuEnabled = false; - }, - - contextMenuTimeout: null, - startContextMenuTimer: function() { - // - - var t = this; - - t.killContextMenuTimer(); - - t.contextMenuTimer = setTimeout(function() { - t.hideContextMenu(); - t.killContextMenuTimer(); - }, 750); - }, - killContextMenuTimer: function() { - var timer = this.contextMenuTimer; - - // - - if (timer != null) { - clearTimeout(timer); - delete timer; - timer = null; - } - }, - - hideContextMenu: function() { - this.contextMenu.hide(); - }, - - renderContextMenu: function(x,y) { - - // alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly - var t = this, - html = '', - items = t.options.contextMenuItems; - - for (var i=0, il=items.length; i<il; i++) { - - if (items[i].isSeparator) { - html += '<div class="mejs-contextmenu-separator"></div>'; - } else { - - var rendered = items[i].render(t); - - // render can return null if the item doesn't need to be used at the moment - if (rendered != null) { - html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>'; - } - } - } - - // position and show the context menu - t.contextMenu - .empty() - .append($(html)) - .css({top:y, left:x}) - .show(); - - // bind events - t.contextMenu.find('.mejs-contextmenu-item').each(function() { - - // which one is this? - var $dom = $(this), - itemIndex = parseInt( $dom.data('itemindex'), 10 ), - item = t.options.contextMenuItems[itemIndex]; - - // bind extra functionality? - if (typeof item.show != 'undefined') - item.show( $dom , t); - - // bind click action - $dom.click(function() { - // perform click action - if (typeof item.click != 'undefined') - item.click(t); - - // close - t.contextMenu.hide(); - }); - }); - - // stop the controls from hiding - setTimeout(function() { - t.killControlsTimer('rev3'); - }, 100); - - } - }); - -})(mejs.$); /** - * Postroll plugin + * Convert Society of Motion Picture and Television Engineers (SMTPE) time code into seconds + * + * @param {String} SMPTE + * @return {Number} */ -(function($) { +function convertSMPTEtoSeconds(SMPTE) { - $.extend(mejs.MepDefaults, { - postrollCloseText: mejs.i18n.t('Close') - }); + if (typeof SMPTE !== 'string') { + throw new TypeError('Argument must be a string value'); + } - // Postroll - $.extend(MediaElementPlayer.prototype, { - buildpostroll: function(player, controls, layers, media) { - var - t = this, - postrollLink = t.container.find('link[rel="postroll"]').attr('href'); - - if (typeof postrollLink !== 'undefined') { - player.postroll = - $('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">' + t.options.postrollCloseText + '</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(layers).hide(); - - t.media.addEventListener('ended', function (e) { - $.ajax({ - dataType: 'html', - url: postrollLink, - success: function (data, textStatus) { - layers.find('.mejs-postroll-layer-content').html(data); - } - }); - player.postroll.show(); - }, false); - } + SMPTE = SMPTE.replace(',', '.'); + + var decimalLen = SMPTE.indexOf('.') > -1 ? SMPTE.split('.')[1].length : 0; + + var secs = 0, + multiplier = 1; + + SMPTE = SMPTE.split(':').reverse(); + + for (var i = 0, total = SMPTE.length; i < total; i++) { + multiplier = 1; + if (i > 0) { + multiplier = Math.pow(60, i); } - }); + secs += Number(SMPTE[i]) * multiplier; + } + return Number(secs.toFixed(decimalLen)); +} -})(mejs.$); +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.secondsToTimeCode = secondsToTimeCode; +_mejs2.default.Utils.timeCodeToSeconds = timeCodeToSeconds; +_mejs2.default.Utils.calculateTimeFormat = calculateTimeFormat; +_mejs2.default.Utils.convertSMPTEtoSeconds = convertSMPTEtoSeconds; +},{"6":6}]},{},[27,5,4,14,21,18,17,19,20,22,15,16,8,9,10,11,12,13]); diff --git a/lib/mejs/mediaelement-and-player.min.js b/lib/mejs/mediaelement-and-player.min.js index f8a16c4c..d64bffab 100644 --- a/lib/mejs/mediaelement-and-player.min.js +++ b/lib/mejs/mediaelement-and-player.min.js @@ -1,183 +1,36 @@ /*! -* MediaElement.js -* HTML5 <video> and <audio> shim and player -* http://mediaelementjs.com/ -* -* Creates a JavaScript object that mimics HTML5 MediaElement API -* for browsers that don't understand HTML5 or can't play the provided codec -* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3 -* -* Copyright 2010-2014, John Dyer (http://j.hn) -* License: MIT -* -*/var mejs=mejs||{};mejs.version="2.15.1";mejs.meIndex=0; -mejs.plugins={silverlight:[{version:[3,0],types:["video/mp4","video/m4v","video/mov","video/wmv","audio/wma","audio/m4a","audio/mp3","audio/wav","audio/mpeg"]}],flash:[{version:[9,0,124],types:["video/mp4","video/m4v","video/mov","video/flv","video/rtmp","video/x-flv","audio/flv","audio/x-flv","audio/mp3","audio/m4a","audio/mpeg","video/youtube","video/x-youtube","application/x-mpegURL"]}],youtube:[{version:null,types:["video/youtube","video/x-youtube","audio/youtube","audio/x-youtube"]}],vimeo:[{version:null, -types:["video/vimeo","video/x-vimeo"]}]}; -mejs.Utility={encodeUrl:function(a){return encodeURIComponent(a)},escapeHTML:function(a){return a.toString().split("&").join("&").split("<").join("<").split('"').join(""")},absolutizeUrl:function(a){var b=document.createElement("div");b.innerHTML='<a href="'+this.escapeHTML(a)+'">x</a>';return b.firstChild.href},getScriptPath:function(a){for(var b=0,c,d="",e="",g,f,i=document.getElementsByTagName("script"),k=i.length,h=a.length;b<k;b++){g=i[b].src;c=g.lastIndexOf("/");if(c>-1){f=g.substring(c+ -1);g=g.substring(0,c+1)}else{f=g;g=""}for(c=0;c<h;c++){e=a[c];e=f.indexOf(e);if(e>-1){d=g;break}}if(d!=="")break}return d},secondsToTimeCode:function(a,b,c,d){if(typeof c=="undefined")c=false;else if(typeof d=="undefined")d=25;var e=Math.floor(a/3600)%24,g=Math.floor(a/60)%60,f=Math.floor(a%60);a=Math.floor((a%1*d).toFixed(3));return(b||e>0?(e<10?"0"+e:e)+":":"")+(g<10?"0"+g:g)+":"+(f<10?"0"+f:f)+(c?":"+(a<10?"0"+a:a):"")},timeCodeToSeconds:function(a,b,c,d){if(typeof c=="undefined")c=false;else if(typeof d== -"undefined")d=25;a=a.split(":");b=parseInt(a[0],10);var e=parseInt(a[1],10),g=parseInt(a[2],10),f=0,i=0;if(c)f=parseInt(a[3])/d;return i=b*3600+e*60+g+f},convertSMPTEtoSeconds:function(a){if(typeof a!="string")return false;a=a.replace(",",".");var b=0,c=a.indexOf(".")!=-1?a.split(".")[1].length:0,d=1;a=a.split(":").reverse();for(var e=0;e<a.length;e++){d=1;if(e>0)d=Math.pow(60,e);b+=Number(a[e])*d}return Number(b.toFixed(c))},removeSwf:function(a){var b=document.getElementById(a);if(b&&/object|embed/i.test(b.nodeName))if(mejs.MediaFeatures.isIE){b.style.display= -"none";(function(){b.readyState==4?mejs.Utility.removeObjectInIE(a):setTimeout(arguments.callee,10)})()}else b.parentNode.removeChild(b)},removeObjectInIE:function(a){if(a=document.getElementById(a)){for(var b in a)if(typeof a[b]=="function")a[b]=null;a.parentNode.removeChild(a)}}}; -mejs.PluginDetector={hasPluginVersion:function(a,b){var c=this.plugins[a];b[1]=b[1]||0;b[2]=b[2]||0;return c[0]>b[0]||c[0]==b[0]&&c[1]>b[1]||c[0]==b[0]&&c[1]==b[1]&&c[2]>=b[2]?true:false},nav:window.navigator,ua:window.navigator.userAgent.toLowerCase(),plugins:[],addPlugin:function(a,b,c,d,e){this.plugins[a]=this.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var e=[0,0,0],g;if(typeof this.nav.plugins!="undefined"&&typeof this.nav.plugins[a]=="object"){if((c=this.nav.plugins[a].description)&& -!(typeof this.nav.mimeTypes!="undefined"&&this.nav.mimeTypes[b]&&!this.nav.mimeTypes[b].enabledPlugin)){e=c.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(a=0;a<e.length;a++)e[a]=parseInt(e[a].match(/\d+/),10)}}else if(typeof window.ActiveXObject!="undefined")try{if(g=new ActiveXObject(c))e=d(g)}catch(f){}return e}}; -mejs.PluginDetector.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[];if(a=a.GetVariable("$version")){a=a.split(" ")[1].split(",");b=[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]}return b}); -mejs.PluginDetector.addPlugin("silverlight","Silverlight Plug-In","application/x-silverlight-2","AgControl.AgControl",function(a){var b=[0,0,0,0],c=function(d,e,g,f){for(;d.isVersionSupported(e[0]+"."+e[1]+"."+e[2]+"."+e[3]);)e[g]+=f;e[g]-=f};c(a,b,0,1);c(a,b,1,1);c(a,b,2,1E4);c(a,b,2,1E3);c(a,b,2,100);c(a,b,2,10);c(a,b,2,1);c(a,b,3,1);return b}); -mejs.MediaFeatures={init:function(){var a=this,b=document,c=mejs.PluginDetector.nav,d=mejs.PluginDetector.ua.toLowerCase(),e,g=["source","track","audio","video"];a.isiPad=d.match(/ipad/i)!==null;a.isiPhone=d.match(/iphone/i)!==null;a.isiOS=a.isiPhone||a.isiPad;a.isAndroid=d.match(/android/i)!==null;a.isBustedAndroid=d.match(/android 2\.[12]/)!==null;a.isBustedNativeHTTPS=location.protocol==="https:"&&(d.match(/android [12]\./)!==null||d.match(/macintosh.* version.* safari/)!==null);a.isIE=c.appName.toLowerCase().indexOf("microsoft")!= --1||c.appName.toLowerCase().match(/trident/gi)!==null;a.isChrome=d.match(/chrome/gi)!==null;a.isChromium=d.match(/chromium/gi)!==null;a.isFirefox=d.match(/firefox/gi)!==null;a.isWebkit=d.match(/webkit/gi)!==null;a.isGecko=d.match(/gecko/gi)!==null&&!a.isWebkit&&!a.isIE;a.isOpera=d.match(/opera/gi)!==null;a.hasTouch="ontouchstart"in window;a.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect;for(c=0;c<g.length;c++)e=document.createElement(g[c]); -a.supportsMediaTag=typeof e.canPlayType!=="undefined"||a.isBustedAndroid;try{e.canPlayType("video/mp4")}catch(f){a.supportsMediaTag=false}a.hasSemiNativeFullScreen=typeof e.webkitEnterFullscreen!=="undefined";a.hasNativeFullscreen=typeof e.requestFullscreen!=="undefined";a.hasWebkitNativeFullScreen=typeof e.webkitRequestFullScreen!=="undefined";a.hasMozNativeFullScreen=typeof e.mozRequestFullScreen!=="undefined";a.hasMsNativeFullScreen=typeof e.msRequestFullscreen!=="undefined";a.hasTrueNativeFullScreen= -a.hasWebkitNativeFullScreen||a.hasMozNativeFullScreen||a.hasMsNativeFullScreen;a.nativeFullScreenEnabled=a.hasTrueNativeFullScreen;if(a.hasMozNativeFullScreen)a.nativeFullScreenEnabled=document.mozFullScreenEnabled;else if(a.hasMsNativeFullScreen)a.nativeFullScreenEnabled=document.msFullscreenEnabled;if(a.isChrome)a.hasSemiNativeFullScreen=false;if(a.hasTrueNativeFullScreen){a.fullScreenEventName="";if(a.hasWebkitNativeFullScreen)a.fullScreenEventName="webkitfullscreenchange";else if(a.hasMozNativeFullScreen)a.fullScreenEventName= -"mozfullscreenchange";else if(a.hasMsNativeFullScreen)a.fullScreenEventName="MSFullscreenChange";a.isFullScreen=function(){if(a.hasMozNativeFullScreen)return b.mozFullScreen;else if(a.hasWebkitNativeFullScreen)return b.webkitIsFullScreen;else if(a.hasMsNativeFullScreen)return b.msFullscreenElement!==null};a.requestFullScreen=function(i){if(a.hasWebkitNativeFullScreen)i.webkitRequestFullScreen();else if(a.hasMozNativeFullScreen)i.mozRequestFullScreen();else a.hasMsNativeFullScreen&&i.msRequestFullscreen()}; -a.cancelFullScreen=function(){if(a.hasWebkitNativeFullScreen)document.webkitCancelFullScreen();else if(a.hasMozNativeFullScreen)document.mozCancelFullScreen();else a.hasMsNativeFullScreen&&document.msExitFullscreen()}}if(a.hasSemiNativeFullScreen&&d.match(/mac os x 10_5/i)){a.hasNativeFullScreen=false;a.hasSemiNativeFullScreen=false}}};mejs.MediaFeatures.init(); -mejs.HtmlMediaElement={pluginType:"native",isFullScreen:false,setCurrentTime:function(a){this.currentTime=a},setMuted:function(a){this.muted=a},setVolume:function(a){this.volume=a},stop:function(){this.pause()},setSrc:function(a){for(var b=this.getElementsByTagName("source");b.length>0;)this.removeChild(b[0]);if(typeof a=="string")this.src=a;else{var c;for(b=0;b<a.length;b++){c=a[b];if(this.canPlayType(c.type)){this.src=c.src;break}}}},setVideoSize:function(a,b){this.width=a;this.height=b}}; -mejs.PluginMediaElement=function(a,b,c){this.id=a;this.pluginType=b;this.src=c;this.events={};this.attributes={}}; -mejs.PluginMediaElement.prototype={pluginElement:null,pluginType:"",isFullScreen:false,playbackRate:-1,defaultPlaybackRate:-1,seekable:[],played:[],paused:true,ended:false,seeking:false,duration:0,error:null,tagName:"",muted:false,volume:1,currentTime:0,play:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.playVideo():this.pluginApi.playMedia();this.paused=false}},load:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType== -"vimeo"||this.pluginApi.loadMedia();this.paused=false}},pause:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.pauseVideo():this.pluginApi.pauseMedia();this.paused=true}},stop:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.stopVideo():this.pluginApi.stopMedia();this.paused=true}},canPlayType:function(a){var b,c,d,e=mejs.plugins[this.pluginType];for(b=0;b<e.length;b++){d=e[b];if(mejs.PluginDetector.hasPluginVersion(this.pluginType, -d.version))for(c=0;c<d.types.length;c++)if(a==d.types[c])return"probably"}return""},positionFullscreenButton:function(a,b,c){this.pluginApi!=null&&this.pluginApi.positionFullscreenButton&&this.pluginApi.positionFullscreenButton(Math.floor(a),Math.floor(b),c)},hideFullscreenButton:function(){this.pluginApi!=null&&this.pluginApi.hideFullscreenButton&&this.pluginApi.hideFullscreenButton()},setSrc:function(a){if(typeof a=="string"){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(a));this.src=mejs.Utility.absolutizeUrl(a)}else{var b, -c;for(b=0;b<a.length;b++){c=a[b];if(this.canPlayType(c.type)){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(c.src));this.src=mejs.Utility.absolutizeUrl(a);break}}}},setCurrentTime:function(a){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.seekTo(a):this.pluginApi.setCurrentTime(a);this.currentTime=a}},setVolume:function(a){if(this.pluginApi!=null){this.pluginType=="youtube"?this.pluginApi.setVolume(a*100):this.pluginApi.setVolume(a);this.volume=a}}, -setMuted:function(a){if(this.pluginApi!=null){if(this.pluginType=="youtube"){a?this.pluginApi.mute():this.pluginApi.unMute();this.muted=a;this.dispatchEvent("volumechange")}else this.pluginApi.setMuted(a);this.muted=a}},setVideoSize:function(a,b){if(this.pluginElement&&this.pluginElement.style){this.pluginElement.style.width=a+"px";this.pluginElement.style.height=b+"px"}this.pluginApi!=null&&this.pluginApi.setVideoSize&&this.pluginApi.setVideoSize(a,b)},setFullscreen:function(a){this.pluginApi!=null&& -this.pluginApi.setFullscreen&&this.pluginApi.setFullscreen(a)},enterFullScreen:function(){this.pluginApi!=null&&this.pluginApi.setFullscreen&&this.setFullscreen(true)},exitFullScreen:function(){this.pluginApi!=null&&this.pluginApi.setFullscreen&&this.setFullscreen(false)},addEventListener:function(a,b){this.events[a]=this.events[a]||[];this.events[a].push(b)},removeEventListener:function(a,b){if(!a){this.events={};return true}var c=this.events[a];if(!c)return true;if(!b){this.events[a]=[];return true}for(var d= -0;d<c.length;d++)if(c[d]===b){this.events[a].splice(d,1);return true}return false},dispatchEvent:function(a){var b,c,d=this.events[a];if(d){c=Array.prototype.slice.call(arguments,1);for(b=0;b<d.length;b++)d[b].apply(null,c)}},hasAttribute:function(a){return a in this.attributes},removeAttribute:function(a){delete this.attributes[a]},getAttribute:function(a){if(this.hasAttribute(a))return this.attributes[a];return""},setAttribute:function(a,b){this.attributes[a]=b},remove:function(){mejs.Utility.removeSwf(this.pluginElement.id); -mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id)}}; -mejs.MediaPluginBridge={pluginMediaElements:{},htmlMediaElements:{},registerPluginElement:function(a,b,c){this.pluginMediaElements[a]=b;this.htmlMediaElements[a]=c},unregisterPluginElement:function(a){delete this.pluginMediaElements[a];delete this.htmlMediaElements[a]},initPlugin:function(a){var b=this.pluginMediaElements[a],c=this.htmlMediaElements[a];if(b){switch(b.pluginType){case "flash":b.pluginElement=b.pluginApi=document.getElementById(a);break;case "silverlight":b.pluginElement=document.getElementById(b.id); -b.pluginApi=b.pluginElement.Content.MediaElementJS}b.pluginApi!=null&&b.success&&b.success(b,c)}},fireEvent:function(a,b,c){var d,e;if(a=this.pluginMediaElements[a]){b={type:b,target:a};for(d in c){a[d]=c[d];b[d]=c[d]}e=c.bufferedTime||0;b.target.buffered=b.buffered={start:function(){return 0},end:function(){return e},length:1};a.dispatchEvent(b.type,b)}}}; -mejs.MediaElementDefaults={mode:"auto",plugins:["flash","silverlight","youtube","vimeo"],enablePluginDebug:false,httpsBasicAuthSite:false,type:"",pluginPath:mejs.Utility.getScriptPath(["mediaelement.js","mediaelement.min.js","mediaelement-and-player.js","mediaelement-and-player.min.js"]),flashName:"flashmediaelement.swf",flashStreamer:"",enablePluginSmoothing:false,enablePseudoStreaming:false,pseudoStreamingStartQueryParam:"start",silverlightName:"silverlightmediaelement.xap",defaultVideoWidth:480, -defaultVideoHeight:270,pluginWidth:-1,pluginHeight:-1,pluginVars:[],timerRate:250,startVolume:0.8,success:function(){},error:function(){}};mejs.MediaElement=function(a,b){return mejs.HtmlMediaElementShim.create(a,b)}; -mejs.HtmlMediaElementShim={create:function(a,b){var c=mejs.MediaElementDefaults,d=typeof a=="string"?document.getElementById(a):a,e=d.tagName.toLowerCase(),g=e==="audio"||e==="video",f=g?d.getAttribute("src"):d.getAttribute("href");e=d.getAttribute("poster");var i=d.getAttribute("autoplay"),k=d.getAttribute("preload"),h=d.getAttribute("controls"),j;for(j in b)c[j]=b[j];f=typeof f=="undefined"||f===null||f==""?null:f;e=typeof e=="undefined"||e===null?"":e;k=typeof k=="undefined"||k===null||k==="false"? -"none":k;i=!(typeof i=="undefined"||i===null||i==="false");h=!(typeof h=="undefined"||h===null||h==="false");j=this.determinePlayback(d,c,mejs.MediaFeatures.supportsMediaTag,g,f);j.url=j.url!==null?mejs.Utility.absolutizeUrl(j.url):"";if(j.method=="native"){if(mejs.MediaFeatures.isBustedAndroid){d.src=j.url;d.addEventListener("click",function(){d.play()},false)}return this.updateNative(j,c,i,k)}else if(j.method!=="")return this.createPlugin(j,c,e,i,k,h);else{this.createErrorMessage(j,c,e);return this}}, -determinePlayback:function(a,b,c,d,e){var g=[],f,i,k,h={method:"",url:"",htmlMediaElement:a,isVideo:a.tagName.toLowerCase()!="audio"},j;if(typeof b.type!="undefined"&&b.type!=="")if(typeof b.type=="string")g.push({type:b.type,url:e});else for(f=0;f<b.type.length;f++)g.push({type:b.type[f],url:e});else if(e!==null){k=this.formatType(e,a.getAttribute("type"));g.push({type:k,url:e})}else for(f=0;f<a.childNodes.length;f++){i=a.childNodes[f];if(i.nodeType==1&&i.tagName.toLowerCase()=="source"){e=i.getAttribute("src"); -k=this.formatType(e,i.getAttribute("type"));i=i.getAttribute("media");if(!i||!window.matchMedia||window.matchMedia&&window.matchMedia(i).matches)g.push({type:k,url:e})}}if(!d&&g.length>0&&g[0].url!==null&&this.getTypeFromFile(g[0].url).indexOf("audio")>-1)h.isVideo=false;if(mejs.MediaFeatures.isBustedAndroid)a.canPlayType=function(m){return m.match(/video\/(mp4|m4v)/gi)!==null?"maybe":""};if(mejs.MediaFeatures.isChromium)a.canPlayType=function(m){return m.match(/video\/(webm|ogv|ogg)/gi)!==null?"maybe": -""};if(c&&(b.mode==="auto"||b.mode==="auto_plugin"||b.mode==="native")&&!(mejs.MediaFeatures.isBustedNativeHTTPS&&b.httpsBasicAuthSite===true)){if(!d){f=document.createElement(h.isVideo?"video":"audio");a.parentNode.insertBefore(f,a);a.style.display="none";h.htmlMediaElement=a=f}for(f=0;f<g.length;f++)if(g[f].type=="video/m3u8"||a.canPlayType(g[f].type).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/mp3/,"mpeg")).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/m4a/,"mp4")).replace(/no/, -"")!==""){h.method="native";h.url=g[f].url;break}if(h.method==="native"){if(h.url!==null)a.src=h.url;if(b.mode!=="auto_plugin")return h}}if(b.mode==="auto"||b.mode==="auto_plugin"||b.mode==="shim")for(f=0;f<g.length;f++){k=g[f].type;for(a=0;a<b.plugins.length;a++){e=b.plugins[a];i=mejs.plugins[e];for(c=0;c<i.length;c++){j=i[c];if(j.version==null||mejs.PluginDetector.hasPluginVersion(e,j.version))for(d=0;d<j.types.length;d++)if(k==j.types[d]){h.method=e;h.url=g[f].url;return h}}}}if(b.mode==="auto_plugin"&& -h.method==="native")return h;if(h.method===""&&g.length>0)h.url=g[0].url;return h},formatType:function(a,b){return a&&!b?this.getTypeFromFile(a):b&&~b.indexOf(";")?b.substr(0,b.indexOf(";")):b},getTypeFromFile:function(a){a=a.split("?")[0];a=a.substring(a.lastIndexOf(".")+1).toLowerCase();return(/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(a)?"video":"audio")+"/"+this.getTypeFromExtension(a)},getTypeFromExtension:function(a){switch(a){case "mp4":case "m4v":case "m4a":return"mp4";case "webm":case "webma":case "webmv":return"webm"; -case "ogg":case "oga":case "ogv":return"ogg";default:return a}},createErrorMessage:function(a,b,c){var d=a.htmlMediaElement,e=document.createElement("div");e.className="me-cannotplay";try{e.style.width=d.width+"px";e.style.height=d.height+"px"}catch(g){}e.innerHTML=b.customError?b.customError:c!==""?'<a href="'+a.url+'"><img src="'+c+'" width="100%" height="100%" /></a>':'<a href="'+a.url+'"><span>'+mejs.i18n.t("Download File")+"</span></a>";d.parentNode.insertBefore(e,d);d.style.display="none";b.error(d)}, -createPlugin:function(a,b,c,d,e,g){c=a.htmlMediaElement;var f=1,i=1,k="me_"+a.method+"_"+mejs.meIndex++,h=new mejs.PluginMediaElement(k,a.method,a.url),j=document.createElement("div"),m;h.tagName=c.tagName;for(m=0;m<c.attributes.length;m++){var q=c.attributes[m];q.specified==true&&h.setAttribute(q.name,q.value)}for(m=c.parentNode;m!==null&&m.tagName.toLowerCase()!=="body"&&m.parentNode!=null;){if(m.parentNode.tagName.toLowerCase()==="p"){m.parentNode.parentNode.insertBefore(m,m.parentNode);break}m= -m.parentNode}if(a.isVideo){f=b.pluginWidth>0?b.pluginWidth:b.videoWidth>0?b.videoWidth:c.getAttribute("width")!==null?c.getAttribute("width"):b.defaultVideoWidth;i=b.pluginHeight>0?b.pluginHeight:b.videoHeight>0?b.videoHeight:c.getAttribute("height")!==null?c.getAttribute("height"):b.defaultVideoHeight;f=mejs.Utility.encodeUrl(f);i=mejs.Utility.encodeUrl(i)}else if(b.enablePluginDebug){f=320;i=240}h.success=b.success;mejs.MediaPluginBridge.registerPluginElement(k,h,c);j.className="me-plugin";j.id= -k+"_container";a.isVideo?c.parentNode.insertBefore(j,c):document.body.insertBefore(j,document.body.childNodes[0]);d=["id="+k,"isvideo="+(a.isVideo?"true":"false"),"autoplay="+(d?"true":"false"),"preload="+e,"width="+f,"startvolume="+b.startVolume,"timerrate="+b.timerRate,"flashstreamer="+b.flashStreamer,"height="+i,"pseudostreamstart="+b.pseudoStreamingStartQueryParam];if(a.url!==null)a.method=="flash"?d.push("file="+mejs.Utility.encodeUrl(a.url)):d.push("file="+a.url);b.enablePluginDebug&&d.push("debug=true"); -b.enablePluginSmoothing&&d.push("smoothing=true");b.enablePseudoStreaming&&d.push("pseudostreaming=true");g&&d.push("controls=true");if(b.pluginVars)d=d.concat(b.pluginVars);switch(a.method){case "silverlight":j.innerHTML='<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="'+k+'" name="'+k+'" width="'+f+'" height="'+i+'" class="mejs-shim"><param name="initParams" value="'+d.join(",")+'" /><param name="windowless" value="true" /><param name="background" value="black" /><param name="minRuntimeVersion" value="3.0.0.0" /><param name="autoUpgrade" value="true" /><param name="source" value="'+ -b.pluginPath+b.silverlightName+'" /></object>';break;case "flash":if(mejs.MediaFeatures.isIE){a=document.createElement("div");j.appendChild(a);a.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+k+'" width="'+f+'" height="'+i+'" class="mejs-shim"><param name="movie" value="'+b.pluginPath+b.flashName+"?x="+new Date+'" /><param name="flashvars" value="'+d.join("&")+'" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><param name="scale" value="default" /></object>'}else j.innerHTML= -'<embed id="'+k+'" name="'+k+'" play="true" loop="false" quality="high" bgcolor="#000000" wmode="transparent" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" src="'+b.pluginPath+b.flashName+'" flashvars="'+d.join("&")+'" width="'+f+'" height="'+i+'" scale="default"class="mejs-shim"></embed>';break;case "youtube":if(a.url.lastIndexOf("youtu.be")!=-1){a=a.url.substr(a.url.lastIndexOf("/")+1);if(a.indexOf("?")!= --1)a=a.substr(0,a.indexOf("?"))}else a=a.url.substr(a.url.lastIndexOf("=")+1);youtubeSettings={container:j,containerId:j.id,pluginMediaElement:h,pluginId:k,videoId:a,height:i,width:f};mejs.PluginDetector.hasPluginVersion("flash",[10,0,0])?mejs.YouTubeApi.createFlash(youtubeSettings):mejs.YouTubeApi.enqueueIframe(youtubeSettings);break;case "vimeo":b=k+"_player";h.vimeoid=a.url.substr(a.url.lastIndexOf("/")+1);j.innerHTML='<iframe src="//player.vimeo.com/video/'+h.vimeoid+"?api=1&portrait=0&byline=0&title=0&player_id="+ -b+'" width="'+f+'" height="'+i+'" frameborder="0" class="mejs-shim" id="'+b+'"></iframe>';if(typeof $f=="function"){var l=$f(j.childNodes[0]);l.addEvent("ready",function(){function o(n,p,r,s){n={type:r,target:p};if(r=="timeupdate"){p.currentTime=n.currentTime=s.seconds;p.duration=n.duration=s.duration}p.dispatchEvent(n.type,n)}$.extend(l,{playVideo:function(){l.api("play")},stopVideo:function(){l.api("unload")},pauseVideo:function(){l.api("pause")},seekTo:function(n){l.api("seekTo",n)},setVolume:function(n){l.api("setVolume", -n)},setMuted:function(n){if(n){l.lastVolume=l.api("getVolume");l.api("setVolume",0)}else{l.api("setVolume",l.lastVolume);delete l.lastVolume}}});l.addEvent("play",function(){o(l,h,"play");o(l,h,"playing")});l.addEvent("pause",function(){o(l,h,"pause")});l.addEvent("finish",function(){o(l,h,"ended")});l.addEvent("playProgress",function(n){o(l,h,"timeupdate",n)});h.pluginElement=j;h.pluginApi=l;mejs.MediaPluginBridge.initPlugin(k)})}else console.warn("You need to include froogaloop for vimeo to work")}c.style.display= -"none";c.removeAttribute("autoplay");return h},updateNative:function(a,b){var c=a.htmlMediaElement,d;for(d in mejs.HtmlMediaElement)c[d]=mejs.HtmlMediaElement[d];b.success(c,c);return c}}; -mejs.YouTubeApi={isIframeStarted:false,isIframeLoaded:false,loadIframeApi:function(){if(!this.isIframeStarted){var a=document.createElement("script");a.src="//www.youtube.com/player_api";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b);this.isIframeStarted=true}},iframeQueue:[],enqueueIframe:function(a){if(this.isLoaded)this.createIframe(a);else{this.loadIframeApi();this.iframeQueue.push(a)}},createIframe:function(a){var b=a.pluginMediaElement,c=new YT.Player(a.containerId, -{height:a.height,width:a.width,videoId:a.videoId,playerVars:{controls:0},events:{onReady:function(){a.pluginMediaElement.pluginApi=c;mejs.MediaPluginBridge.initPlugin(a.pluginId);setInterval(function(){mejs.YouTubeApi.createEvent(c,b,"timeupdate")},250)},onStateChange:function(d){mejs.YouTubeApi.handleStateChange(d.data,c,b)}}})},createEvent:function(a,b,c){c={type:c,target:b};if(a&&a.getDuration){b.currentTime=c.currentTime=a.getCurrentTime();b.duration=c.duration=a.getDuration();c.paused=b.paused; -c.ended=b.ended;c.muted=a.isMuted();c.volume=a.getVolume()/100;c.bytesTotal=a.getVideoBytesTotal();c.bufferedBytes=a.getVideoBytesLoaded();var d=c.bufferedBytes/c.bytesTotal*c.duration;c.target.buffered=c.buffered={start:function(){return 0},end:function(){return d},length:1}}b.dispatchEvent(c.type,c)},iFrameReady:function(){for(this.isIframeLoaded=this.isLoaded=true;this.iframeQueue.length>0;)this.createIframe(this.iframeQueue.pop())},flashPlayers:{},createFlash:function(a){this.flashPlayers[a.pluginId]= -a;var b,c="//www.youtube.com/apiplayer?enablejsapi=1&playerapiid="+a.pluginId+"&version=3&autoplay=0&controls=0&modestbranding=1&loop=0";if(mejs.MediaFeatures.isIE){b=document.createElement("div");a.container.appendChild(b);b.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+a.pluginId+'" width="'+a.width+'" height="'+a.height+'" class="mejs-shim"><param name="movie" value="'+ -c+'" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /></object>'}else a.container.innerHTML='<object type="application/x-shockwave-flash" id="'+a.pluginId+'" data="'+c+'" width="'+a.width+'" height="'+a.height+'" style="visibility: visible; " class="mejs-shim"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object>'},flashReady:function(a){var b=this.flashPlayers[a],c= -document.getElementById(a),d=b.pluginMediaElement;d.pluginApi=d.pluginElement=c;mejs.MediaPluginBridge.initPlugin(a);c.cueVideoById(b.videoId);a=b.containerId+"_callback";window[a]=function(e){mejs.YouTubeApi.handleStateChange(e,c,d)};c.addEventListener("onStateChange",a);setInterval(function(){mejs.YouTubeApi.createEvent(c,d,"timeupdate")},250);mejs.YouTubeApi.createEvent(c,d,"canplay")},handleStateChange:function(a,b,c){switch(a){case -1:c.paused=true;c.ended=true;mejs.YouTubeApi.createEvent(b, -c,"loadedmetadata");break;case 0:c.paused=false;c.ended=true;mejs.YouTubeApi.createEvent(b,c,"ended");break;case 1:c.paused=false;c.ended=false;mejs.YouTubeApi.createEvent(b,c,"play");mejs.YouTubeApi.createEvent(b,c,"playing");break;case 2:c.paused=true;c.ended=false;mejs.YouTubeApi.createEvent(b,c,"pause");break;case 3:mejs.YouTubeApi.createEvent(b,c,"progress")}}};function onYouTubePlayerAPIReady(){mejs.YouTubeApi.iFrameReady()}function onYouTubePlayerReady(a){mejs.YouTubeApi.flashReady(a)} -window.mejs=mejs;window.MediaElement=mejs.MediaElement; -(function(a,b){var c={locale:{language:"",strings:{}},methods:{}};c.getLanguage=function(){return(c.locale.language||window.navigator.userLanguage||window.navigator.language).substr(0,2).toLowerCase()};if(typeof mejsL10n!="undefined")c.locale.language=mejsL10n.language;c.methods.checkPlain=function(d){var e,g,f={"&":"&",'"':""","<":"<",">":">"};d=String(d);for(e in f)if(f.hasOwnProperty(e)){g=RegExp(e,"g");d=d.replace(g,f[e])}return d};c.methods.t=function(d,e){if(c.locale.strings&& -c.locale.strings[e.context]&&c.locale.strings[e.context][d])d=c.locale.strings[e.context][d];return c.methods.checkPlain(d)};c.t=function(d,e){if(typeof d==="string"&&d.length>0){var g=c.getLanguage();e=e||{context:g};return c.methods.t(d,e)}else throw{name:"InvalidArgumentException",message:"First argument is either not a string or empty."};};b.i18n=c})(document,mejs);(function(a){if(typeof mejsL10n!="undefined")a[mejsL10n.language]=mejsL10n.strings})(mejs.i18n.locale.strings); -(function(a){if(typeof a.de==="undefined")a.de={Fullscreen:"Vollbild","Go Fullscreen":"Vollbild an","Turn off Fullscreen":"Vollbild aus",Close:"Schlie\u00dfen"}})(mejs.i18n.locale.strings);(function(a){if(typeof a.zh==="undefined")a.zh={Fullscreen:"\u5168\u87a2\u5e55","Go Fullscreen":"\u5168\u5c4f\u6a21\u5f0f","Turn off Fullscreen":"\u9000\u51fa\u5168\u5c4f\u6a21\u5f0f",Close:"\u95dc\u9589"}})(mejs.i18n.locale.strings); - -/*! - * MediaElementPlayer - * http://mediaelementjs.com/ + * MediaElement.js + * http://www.mediaelementjs.com/ + * + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) + * License: MIT * - * Creates a controller bar for HTML5 <video> add <audio> tags - * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper) + *//*! + * MediaElement.js + * http://www.mediaelementjs.com/ * - * Copyright 2010-2013, John Dyer (http://j.hn/) + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) * License: MIT * - */if(typeof jQuery!="undefined")mejs.$=jQuery;else if(typeof ender!="undefined")mejs.$=ender; -(function(f){mejs.MepDefaults={poster:"",showPosterWhenEnded:false,defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:30,defaultSeekBackwardInterval:function(a){return a.duration*0.05},defaultSeekForwardInterval:function(a){return a.duration*0.05},setDimensions:true,audioWidth:-1,audioHeight:-1,startVolume:0.8,loop:false,autoRewind:true,enableAutosize:true,alwaysShowHours:false,showTimecodeFrameCount:false,framesPerSecond:25,autosizeProgress:true, -alwaysShowControls:false,hideVideoControlsOnLoad:false,clickToPlayPause:true,iPadUseNativeControls:false,iPhoneUseNativeControls:false,AndroidUseNativeControls:false,features:["playpause","current","progress","duration","tracks","volume","fullscreen"],isVideo:true,enableKeyboard:true,pauseOtherPlayers:true,keyActions:[{keys:[32,179],action:function(a,b){b.paused||b.ended?a.play():a.pause()}},{keys:[38],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls(); -a.startControlsTimer()}b.setVolume(Math.min(b.volume+0.1,1))}},{keys:[40],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();a.startControlsTimer()}b.setVolume(Math.max(b.volume-0.1,0))}},{keys:[37,227],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){if(a.isVideo){a.showControls();a.startControlsTimer()}var c=Math.max(b.currentTime-a.options.defaultSeekBackwardInterval(b),0);b.setCurrentTime(c)}}},{keys:[39,228],action:function(a, -b){if(!isNaN(b.duration)&&b.duration>0){if(a.isVideo){a.showControls();a.startControlsTimer()}var c=Math.min(b.currentTime+a.options.defaultSeekForwardInterval(b),b.duration);b.setCurrentTime(c)}}},{keys:[70],action:function(a){if(typeof a.enterFullScreen!="undefined")a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{keys:[77],action:function(a){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();a.startControlsTimer()}a.media.muted?a.setMuted(false): -a.setMuted(true)}}]};mejs.mepIndex=0;mejs.players={};mejs.MediaElementPlayer=function(a,b){if(!(this instanceof mejs.MediaElementPlayer))return new mejs.MediaElementPlayer(a,b);this.$media=this.$node=f(a);this.node=this.media=this.$media[0];if(typeof this.node.player!="undefined")return this.node.player;else this.node.player=this;if(typeof b=="undefined")b=this.$node.data("mejsoptions");this.options=f.extend({},mejs.MepDefaults,b);this.id="mep_"+mejs.mepIndex++;mejs.players[this.id]=this;this.init(); -return this};mejs.MediaElementPlayer.prototype={hasFocus:false,controlsAreVisible:true,init:function(){var a=this,b=mejs.MediaFeatures,c=f.extend(true,{},a.options,{success:function(d,g){a.meReady(d,g)},error:function(d){a.handleError(d)}}),e=a.media.tagName.toLowerCase();a.isDynamic=e!=="audio"&&e!=="video";a.isVideo=a.isDynamic?a.options.isVideo:e!=="audio"&&a.options.isVideo;if(b.isiPad&&a.options.iPadUseNativeControls||b.isiPhone&&a.options.iPhoneUseNativeControls){a.$media.attr("controls","controls"); -b.isiPad&&a.media.getAttribute("autoplay")!==null&&a.play()}else if(!(b.isAndroid&&a.options.AndroidUseNativeControls)){a.$media.removeAttr("controls");a.container=f('<div id="'+a.id+'" class="mejs-container '+(mejs.MediaFeatures.svg?"svg":"no-svg")+'"><div class="mejs-inner"><div class="mejs-mediaelement"></div><div class="mejs-layers"></div><div class="mejs-controls"></div><div class="mejs-clear"></div></div></div>').addClass(a.$media[0].className).insertBefore(a.$media);a.container.addClass((b.isAndroid? -"mejs-android ":"")+(b.isiOS?"mejs-ios ":"")+(b.isiPad?"mejs-ipad ":"")+(b.isiPhone?"mejs-iphone ":"")+(a.isVideo?"mejs-video ":"mejs-audio "));if(b.isiOS){b=a.$media.clone();a.container.find(".mejs-mediaelement").append(b);a.$media.remove();a.$node=a.$media=b;a.node=a.media=b[0]}else a.container.find(".mejs-mediaelement").append(a.$media);a.controls=a.container.find(".mejs-controls");a.layers=a.container.find(".mejs-layers");b=a.isVideo?"video":"audio";e=b.substring(0,1).toUpperCase()+b.substring(1); -a.width=a.options[b+"Width"]>0||a.options[b+"Width"].toString().indexOf("%")>-1?a.options[b+"Width"]:a.media.style.width!==""&&a.media.style.width!==null?a.media.style.width:a.media.getAttribute("width")!==null?a.$media.attr("width"):a.options["default"+e+"Width"];a.height=a.options[b+"Height"]>0||a.options[b+"Height"].toString().indexOf("%")>-1?a.options[b+"Height"]:a.media.style.height!==""&&a.media.style.height!==null?a.media.style.height:a.$media[0].getAttribute("height")!==null?a.$media.attr("height"): -a.options["default"+e+"Height"];a.setPlayerSize(a.width,a.height);c.pluginWidth=a.width;c.pluginHeight=a.height}mejs.MediaElement(a.$media[0],c);typeof a.container!="undefined"&&a.controlsAreVisible&&a.container.trigger("controlsshown")},showControls:function(a){var b=this;a=typeof a=="undefined"||a;if(!b.controlsAreVisible){if(a){b.controls.css("visibility","visible").stop(true,true).fadeIn(200,function(){b.controlsAreVisible=true;b.container.trigger("controlsshown")});b.container.find(".mejs-control").css("visibility", -"visible").stop(true,true).fadeIn(200,function(){b.controlsAreVisible=true})}else{b.controls.css("visibility","visible").css("display","block");b.container.find(".mejs-control").css("visibility","visible").css("display","block");b.controlsAreVisible=true;b.container.trigger("controlsshown")}b.setControlsSize()}},hideControls:function(a){var b=this;a=typeof a=="undefined"||a;if(!(!b.controlsAreVisible||b.options.alwaysShowControls))if(a){b.controls.stop(true,true).fadeOut(200,function(){f(this).css("visibility", -"hidden").css("display","block");b.controlsAreVisible=false;b.container.trigger("controlshidden")});b.container.find(".mejs-control").stop(true,true).fadeOut(200,function(){f(this).css("visibility","hidden").css("display","block")})}else{b.controls.css("visibility","hidden").css("display","block");b.container.find(".mejs-control").css("visibility","hidden").css("display","block");b.controlsAreVisible=false;b.container.trigger("controlshidden")}},controlsTimer:null,startControlsTimer:function(a){var b= -this;a=typeof a!="undefined"?a:1500;b.killControlsTimer("start");b.controlsTimer=setTimeout(function(){b.hideControls();b.killControlsTimer("hide")},a)},killControlsTimer:function(){if(this.controlsTimer!==null){clearTimeout(this.controlsTimer);delete this.controlsTimer;this.controlsTimer=null}},controlsEnabled:true,disableControls:function(){this.killControlsTimer();this.hideControls(false);this.controlsEnabled=false},enableControls:function(){this.showControls(false);this.controlsEnabled=true}, -meReady:function(a,b){var c=this,e=mejs.MediaFeatures,d=b.getAttribute("autoplay");d=!(typeof d=="undefined"||d===null||d==="false");var g;if(!c.created){c.created=true;c.media=a;c.domNode=b;if(!(e.isAndroid&&c.options.AndroidUseNativeControls)&&!(e.isiPad&&c.options.iPadUseNativeControls)&&!(e.isiPhone&&c.options.iPhoneUseNativeControls)){c.buildposter(c,c.controls,c.layers,c.media);c.buildkeyboard(c,c.controls,c.layers,c.media);c.buildoverlays(c,c.controls,c.layers,c.media);c.findTracks();for(g in c.options.features){e= -c.options.features[g];if(c["build"+e])try{c["build"+e](c,c.controls,c.layers,c.media)}catch(k){}}c.container.trigger("controlsready");c.setPlayerSize(c.width,c.height);c.setControlsSize();if(c.isVideo){if(mejs.MediaFeatures.hasTouch)c.$media.bind("touchstart",function(){if(c.controlsAreVisible)c.hideControls(false);else c.controlsEnabled&&c.showControls(false)});else{c.clickToPlayPauseCallback=function(){if(c.options.clickToPlayPause)c.media.paused?c.play():c.pause()};c.media.addEventListener("click", -c.clickToPlayPauseCallback,false);c.container.bind("mouseenter mouseover",function(){if(c.controlsEnabled)if(!c.options.alwaysShowControls){c.killControlsTimer("enter");c.showControls();c.startControlsTimer(2500)}}).bind("mousemove",function(){if(c.controlsEnabled){c.controlsAreVisible||c.showControls();c.options.alwaysShowControls||c.startControlsTimer(2500)}}).bind("mouseleave",function(){c.controlsEnabled&&!c.media.paused&&!c.options.alwaysShowControls&&c.startControlsTimer(1E3)})}c.options.hideVideoControlsOnLoad&& -c.hideControls(false);d&&!c.options.alwaysShowControls&&c.hideControls();c.options.enableAutosize&&c.media.addEventListener("loadedmetadata",function(j){if(c.options.videoHeight<=0&&c.domNode.getAttribute("height")===null&&!isNaN(j.target.videoHeight)){c.setPlayerSize(j.target.videoWidth,j.target.videoHeight);c.setControlsSize();c.media.setVideoSize(j.target.videoWidth,j.target.videoHeight)}},false)}a.addEventListener("play",function(){for(var j in mejs.players){var m=mejs.players[j];m.id!=c.id&& -c.options.pauseOtherPlayers&&!m.paused&&!m.ended&&m.pause();m.hasFocus=false}c.hasFocus=true},false);c.media.addEventListener("ended",function(){if(c.options.autoRewind)try{c.media.setCurrentTime(0)}catch(j){}c.media.pause();c.setProgressRail&&c.setProgressRail();c.setCurrentRail&&c.setCurrentRail();if(c.options.loop)c.play();else!c.options.alwaysShowControls&&c.controlsEnabled&&c.showControls()},false);c.media.addEventListener("loadedmetadata",function(){c.updateDuration&&c.updateDuration();c.updateCurrent&& -c.updateCurrent();if(!c.isFullScreen){c.setPlayerSize(c.width,c.height);c.setControlsSize()}},false);setTimeout(function(){c.setPlayerSize(c.width,c.height);c.setControlsSize()},50);c.globalBind("resize",function(){c.isFullScreen||mejs.MediaFeatures.hasTrueNativeFullScreen&&document.webkitIsFullScreen||c.setPlayerSize(c.width,c.height);c.setControlsSize()});c.media.pluginType=="youtube"&&c.options.autoplay&&c.container.find(".mejs-overlay-play").hide()}d&&a.pluginType=="native"&&c.play();if(c.options.success)typeof c.options.success== -"string"?window[c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c)}},handleError:function(a){this.controls.hide();this.options.error&&this.options.error(a)},setPlayerSize:function(a,b){if(!this.options.setDimensions)return false;if(typeof a!="undefined")this.width=a;if(typeof b!="undefined")this.height=b;if(this.height.toString().indexOf("%")>0||this.$node.css("max-width")==="100%"||this.$node[0].currentStyle&&this.$node[0].currentStyle.maxWidth==="100%"){var c=this.isVideo? -this.media.videoWidth&&this.media.videoWidth>0?this.media.videoWidth:this.media.getAttribute("width")!==null?this.media.getAttribute("width"):this.options.defaultVideoWidth:this.options.defaultAudioWidth,e=this.isVideo?this.media.videoHeight&&this.media.videoHeight>0?this.media.videoHeight:this.media.getAttribute("height")!==null?this.media.getAttribute("height"):this.options.defaultVideoHeight:this.options.defaultAudioHeight,d=this.container.parent().closest(":visible").width(),g=this.container.parent().closest(":visible").height(); -c=this.isVideo||!this.options.autosizeProgress?parseInt(d*e/c,10):e;if(isNaN(c)||g!=0&&c>g)c=g;if(this.container.parent()[0].tagName.toLowerCase()==="body"){d=f(window).width();c=f(window).height()}if(c!=0&&d!=0){this.container.width(d).height(c);this.$media.add(this.container.find(".mejs-shim")).width("100%").height("100%");this.isVideo&&this.media.setVideoSize&&this.media.setVideoSize(d,c);this.layers.children(".mejs-layer").width("100%").height("100%")}}else{this.container.width(this.width).height(this.height); -this.layers.children(".mejs-layer").width(this.width).height(this.height)}d=this.layers.find(".mejs-overlay-play");g=d.find(".mejs-overlay-button");d.height(this.container.height()-this.controls.height());g.css("margin-top","-"+(g.height()/2-this.controls.height()/2).toString()+"px")},setControlsSize:function(){var a=0,b=0,c=this.controls.find(".mejs-time-rail"),e=this.controls.find(".mejs-time-total");this.controls.find(".mejs-time-current");this.controls.find(".mejs-time-loaded");var d=c.siblings(), -g=d.last(),k=null;if(!(!this.container.is(":visible")||!c.length||!c.is(":visible"))){if(this.options&&!this.options.autosizeProgress)b=parseInt(c.css("width"));if(b===0||!b){d.each(function(){var j=f(this);if(j.css("position")!="absolute"&&j.is(":visible"))a+=f(this).outerWidth(true)});b=this.controls.width()-a-(c.outerWidth(true)-c.width())}do{c.width(b);e.width(b-(e.outerWidth(true)-e.width()));if(g.css("position")!="absolute"){k=g.position();b--}}while(k!=null&&k.top>0&&b>0);this.setProgressRail&& -this.setProgressRail();this.setCurrentRail&&this.setCurrentRail()}},buildposter:function(a,b,c,e){var d=f('<div class="mejs-poster mejs-layer"></div>').appendTo(c);b=a.$media.attr("poster");if(a.options.poster!=="")b=a.options.poster;b!==""&&b!=null?this.setPoster(b):d.hide();e.addEventListener("play",function(){d.hide()},false);a.options.showPosterWhenEnded&&a.options.autoRewind&&e.addEventListener("ended",function(){d.show()},false)},setPoster:function(a){var b=this.container.find(".mejs-poster"), -c=b.find("img");if(c.length==0)c=f('<img width="100%" height="100%" />').appendTo(b);c.attr("src",a);b.css({"background-image":"url("+a+")"})},buildoverlays:function(a,b,c,e){var d=this;if(a.isVideo){var g=f('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-loading"><span></span></div></div>').hide().appendTo(c),k=f('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-error"></div></div>').hide().appendTo(c),j=f('<div class="mejs-overlay mejs-layer mejs-overlay-play"><div class="mejs-overlay-button"></div></div>').appendTo(c).bind("click", -function(){d.options.clickToPlayPause&&e.paused&&e.play()});e.addEventListener("play",function(){j.hide();g.hide();b.find(".mejs-time-buffering").hide();k.hide()},false);e.addEventListener("playing",function(){j.hide();g.hide();b.find(".mejs-time-buffering").hide();k.hide()},false);e.addEventListener("seeking",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("seeked",function(){g.hide();b.find(".mejs-time-buffering").hide()},false);e.addEventListener("pause",function(){mejs.MediaFeatures.isiPhone|| -j.show()},false);e.addEventListener("waiting",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("loadeddata",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("canplay",function(){g.hide();b.find(".mejs-time-buffering").hide()},false);e.addEventListener("error",function(){g.hide();b.find(".mejs-time-buffering").hide();k.show();k.find("mejs-overlay-error").html("Error loading this resource")},false);e.addEventListener("keydown", -function(m){d.onkeydown(a,e,m)},false)}},buildkeyboard:function(a,b,c,e){var d=this;d.globalBind("keydown",function(g){return d.onkeydown(a,e,g)});d.globalBind("click",function(g){a.hasFocus=f(g.target).closest(".mejs-container").length!=0})},onkeydown:function(a,b,c){if(a.hasFocus&&a.options.enableKeyboard)for(var e=0,d=a.options.keyActions.length;e<d;e++)for(var g=a.options.keyActions[e],k=0,j=g.keys.length;k<j;k++)if(c.keyCode==g.keys[k]){typeof c.preventDefault=="function"&&c.preventDefault(); -g.action(a,b,c.keyCode);return false}return true},findTracks:function(){var a=this,b=a.$media.find("track");a.tracks=[];b.each(function(c,e){e=f(e);a.tracks.push({srclang:e.attr("srclang")?e.attr("srclang").toLowerCase():"",src:e.attr("src"),kind:e.attr("kind"),label:e.attr("label")||"",entries:[],isLoaded:false})})},changeSkin:function(a){this.container[0].className="mejs-container "+a;this.setPlayerSize(this.width,this.height);this.setControlsSize()},play:function(){this.load();this.media.play()}, -pause:function(){try{this.media.pause()}catch(a){}},load:function(){this.isLoaded||this.media.load();this.isLoaded=true},setMuted:function(a){this.media.setMuted(a)},setCurrentTime:function(a){this.media.setCurrentTime(a)},getCurrentTime:function(){return this.media.currentTime},setVolume:function(a){this.media.setVolume(a)},getVolume:function(){return this.media.volume},setSrc:function(a){this.media.setSrc(a)},remove:function(){var a,b;for(a in this.options.features){b=this.options.features[a];if(this["clean"+ -b])try{this["clean"+b](this)}catch(c){}}if(this.isDynamic)this.$node.insertBefore(this.container);else{this.$media.prop("controls",true);this.$node.clone().insertBefore(this.container).show();this.$node.remove()}this.media.pluginType!=="native"&&this.media.remove();delete mejs.players[this.id];typeof this.container=="object"&&this.container.remove();this.globalUnbind();delete this.node.player}};(function(){function a(c,e){var d={d:[],w:[]};f.each((c||"").split(" "),function(g,k){var j=k+"."+e;if(j.indexOf(".")=== -0){d.d.push(j);d.w.push(j)}else d[b.test(k)?"w":"d"].push(j)});d.d=d.d.join(" ");d.w=d.w.join(" ");return d}var b=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;mejs.MediaElementPlayer.prototype.globalBind=function(c,e,d){c=a(c,this.id);c.d&&f(document).bind(c.d,e,d);c.w&&f(window).bind(c.w,e,d)};mejs.MediaElementPlayer.prototype.globalUnbind=function(c,e){c=a(c,this.id);c.d&&f(document).unbind(c.d,e);c.w&&f(window).unbind(c.w,e)}})(); -if(typeof f!="undefined"){f.fn.mediaelementplayer=function(a){a===false?this.each(function(){var b=f(this).data("mediaelementplayer");b&&b.remove();f(this).removeData("mediaelementplayer")}):this.each(function(){f(this).data("mediaelementplayer",new mejs.MediaElementPlayer(this,a))});return this};f(document).ready(function(){f(".mejs-player").mediaelementplayer()})}window.MediaElementPlayer=mejs.MediaElementPlayer})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{playpauseText:mejs.i18n.t("Play/Pause")});f.extend(MediaElementPlayer.prototype,{buildplaypause:function(a,b,c,e){var d=f('<div class="mejs-button mejs-playpause-button mejs-play" ><button type="button" aria-controls="'+this.id+'" title="'+this.options.playpauseText+'" aria-label="'+this.options.playpauseText+'"></button></div>').appendTo(b).click(function(g){g.preventDefault();e.paused?e.play():e.pause();return false});e.addEventListener("play",function(){d.removeClass("mejs-play").addClass("mejs-pause")}, -false);e.addEventListener("playing",function(){d.removeClass("mejs-play").addClass("mejs-pause")},false);e.addEventListener("pause",function(){d.removeClass("mejs-pause").addClass("mejs-play")},false);e.addEventListener("paused",function(){d.removeClass("mejs-pause").addClass("mejs-play")},false)}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{stopText:"Stop"});f.extend(MediaElementPlayer.prototype,{buildstop:function(a,b,c,e){f('<div class="mejs-button mejs-stop-button mejs-stop"><button type="button" aria-controls="'+this.id+'" title="'+this.options.stopText+'" aria-label="'+this.options.stopText+'"></button></div>').appendTo(b).click(function(){e.paused||e.pause();if(e.currentTime>0){e.setCurrentTime(0);e.pause();b.find(".mejs-time-current").width("0px");b.find(".mejs-time-handle").css("left", -"0px");b.find(".mejs-time-float-current").html(mejs.Utility.secondsToTimeCode(0));b.find(".mejs-currenttime").html(mejs.Utility.secondsToTimeCode(0));c.find(".mejs-poster").show()}})}})})(mejs.$); -(function(f){f.extend(MediaElementPlayer.prototype,{buildprogress:function(a,b,c,e){f('<div class="mejs-time-rail"><span class="mejs-time-total"><span class="mejs-time-buffering"></span><span class="mejs-time-loaded"></span><span class="mejs-time-current"></span><span class="mejs-time-handle"></span><span class="mejs-time-float"><span class="mejs-time-float-current">00:00</span><span class="mejs-time-float-corner"></span></span></span></div>').appendTo(b);b.find(".mejs-time-buffering").hide();var d= -this,g=b.find(".mejs-time-total");c=b.find(".mejs-time-loaded");var k=b.find(".mejs-time-current"),j=b.find(".mejs-time-handle"),m=b.find(".mejs-time-float"),q=b.find(".mejs-time-float-current"),p=function(h){h=h.originalEvent.changedTouches?h.originalEvent.changedTouches[0].pageX:h.pageX;var l=g.offset(),r=g.outerWidth(true),n=0,o=n=0;if(e.duration){if(h<l.left)h=l.left;else if(h>r+l.left)h=r+l.left;o=h-l.left;n=o/r;n=n<=0.02?0:n*e.duration;t&&n!==e.currentTime&&e.setCurrentTime(n);if(!mejs.MediaFeatures.hasTouch){m.css("left", -o);q.html(mejs.Utility.secondsToTimeCode(n));m.show()}}},t=false;g.bind("mousedown touchstart",function(h){if(h.which===1||h.which===0){t=true;p(h);d.globalBind("mousemove.dur touchmove.dur",function(l){p(l)});d.globalBind("mouseup.dur touchend.dur",function(){t=false;m.hide();d.globalUnbind(".dur")});return false}}).bind("mouseenter",function(){d.globalBind("mousemove.dur",function(h){p(h)});mejs.MediaFeatures.hasTouch||m.show()}).bind("mouseleave",function(){if(!t){d.globalUnbind(".dur");m.hide()}}); -e.addEventListener("progress",function(h){a.setProgressRail(h);a.setCurrentRail(h)},false);e.addEventListener("timeupdate",function(h){a.setProgressRail(h);a.setCurrentRail(h)},false);d.loaded=c;d.total=g;d.current=k;d.handle=j},setProgressRail:function(a){var b=a!=undefined?a.target:this.media,c=null;if(b&&b.buffered&&b.buffered.length>0&&b.buffered.end&&b.duration)c=b.buffered.end(0)/b.duration;else if(b&&b.bytesTotal!=undefined&&b.bytesTotal>0&&b.bufferedBytes!=undefined)c=b.bufferedBytes/b.bytesTotal; -else if(a&&a.lengthComputable&&a.total!=0)c=a.loaded/a.total;if(c!==null){c=Math.min(1,Math.max(0,c));this.loaded&&this.total&&this.loaded.width(this.total.width()*c)}},setCurrentRail:function(){if(this.media.currentTime!=undefined&&this.media.duration)if(this.total&&this.handle){var a=Math.round(this.total.width()*this.media.currentTime/this.media.duration),b=a-Math.round(this.handle.outerWidth(true)/2);this.current.width(a);this.handle.css("left",b)}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{duration:-1,timeAndDurationSeparator:"<span> | </span>"});f.extend(MediaElementPlayer.prototype,{buildcurrent:function(a,b,c,e){f('<div class="mejs-time"><span class="mejs-currenttime">'+(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00")+"</span></div>").appendTo(b);this.currenttime=this.controls.find(".mejs-currenttime");e.addEventListener("timeupdate",function(){a.updateCurrent()},false)},buildduration:function(a,b, -c,e){if(b.children().last().find(".mejs-currenttime").length>0)f(this.options.timeAndDurationSeparator+'<span class="mejs-duration">'+(this.options.duration>0?mejs.Utility.secondsToTimeCode(this.options.duration,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25):(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00"))+"</span>").appendTo(b.find(".mejs-time"));else{b.find(".mejs-currenttime").parent().addClass("mejs-currenttime-container"); -f('<div class="mejs-time mejs-duration-container"><span class="mejs-duration">'+(this.options.duration>0?mejs.Utility.secondsToTimeCode(this.options.duration,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25):(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00"))+"</span></div>").appendTo(b)}this.durationD=this.controls.find(".mejs-duration");e.addEventListener("timeupdate",function(){a.updateDuration()}, -false)},updateCurrent:function(){if(this.currenttime)this.currenttime.html(mejs.Utility.secondsToTimeCode(this.media.currentTime,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25))},updateDuration:function(){this.container.toggleClass("mejs-long-video",this.media.duration>3600);if(this.durationD&&(this.options.duration>0||this.media.duration))this.durationD.html(mejs.Utility.secondsToTimeCode(this.options.duration>0?this.options.duration: -this.media.duration,this.options.alwaysShowHours,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25))}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{muteText:mejs.i18n.t("Mute Toggle"),hideVolumeOnTouchDevices:true,audioVolume:"horizontal",videoVolume:"vertical"});f.extend(MediaElementPlayer.prototype,{buildvolume:function(a,b,c,e){if(!((mejs.MediaFeatures.isAndroid||mejs.MediaFeatures.isiOS)&&this.options.hideVolumeOnTouchDevices)){var d=this,g=d.isVideo?d.options.videoVolume:d.options.audioVolume,k=g=="horizontal"?f('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+ -d.id+'" title="'+d.options.muteText+'" aria-label="'+d.options.muteText+'"></button></div><div class="mejs-horizontal-volume-slider"><div class="mejs-horizontal-volume-total"></div><div class="mejs-horizontal-volume-current"></div><div class="mejs-horizontal-volume-handle"></div></div>').appendTo(b):f('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+d.id+'" title="'+d.options.muteText+'" aria-label="'+d.options.muteText+'"></button><div class="mejs-volume-slider"><div class="mejs-volume-total"></div><div class="mejs-volume-current"></div><div class="mejs-volume-handle"></div></div></div>').appendTo(b), -j=d.container.find(".mejs-volume-slider, .mejs-horizontal-volume-slider"),m=d.container.find(".mejs-volume-total, .mejs-horizontal-volume-total"),q=d.container.find(".mejs-volume-current, .mejs-horizontal-volume-current"),p=d.container.find(".mejs-volume-handle, .mejs-horizontal-volume-handle"),t=function(n,o){if(!j.is(":visible")&&typeof o=="undefined"){j.show();t(n,true);j.hide()}else{n=Math.max(0,n);n=Math.min(n,1);n==0?k.removeClass("mejs-mute").addClass("mejs-unmute"):k.removeClass("mejs-unmute").addClass("mejs-mute"); -if(g=="vertical"){var s=m.height(),u=m.position(),v=s-s*n;p.css("top",Math.round(u.top+v-p.height()/2));q.height(s-v);q.css("top",u.top+v)}else{s=m.width();u=m.position();s=s*n;p.css("left",Math.round(u.left+s-p.width()/2));q.width(Math.round(s))}}},h=function(n){var o=null,s=m.offset();if(g=="vertical"){o=m.height();parseInt(m.css("top").replace(/px/,""),10);o=(o-(n.pageY-s.top))/o;if(s.top==0||s.left==0)return}else{o=m.width();o=(n.pageX-s.left)/o}o=Math.max(0,o);o=Math.min(o,1);t(o);o==0?e.setMuted(true): -e.setMuted(false);e.setVolume(o)},l=false,r=false;k.hover(function(){j.show();r=true},function(){r=false;!l&&g=="vertical"&&j.hide()});j.bind("mouseover",function(){r=true}).bind("mousedown",function(n){h(n);d.globalBind("mousemove.vol",function(o){h(o)});d.globalBind("mouseup.vol",function(){l=false;d.globalUnbind(".vol");!r&&g=="vertical"&&j.hide()});l=true;return false});k.find("button").click(function(){e.setMuted(!e.muted)});e.addEventListener("volumechange",function(){if(!l)if(e.muted){t(0); -k.removeClass("mejs-mute").addClass("mejs-unmute")}else{t(e.volume);k.removeClass("mejs-unmute").addClass("mejs-mute")}},false);if(d.container.is(":visible")){t(a.options.startVolume);a.options.startVolume===0&&e.setMuted(true);e.pluginType==="native"&&e.setVolume(a.options.startVolume)}}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{usePluginFullScreen:true,newWindowCallback:function(){return""},fullscreenText:mejs.i18n.t("Fullscreen")});f.extend(MediaElementPlayer.prototype,{isFullScreen:false,isNativeFullScreen:false,isInIframe:false,buildfullscreen:function(a,b,c,e){if(a.isVideo){a.isInIframe=window.location!=window.parent.location;mejs.MediaFeatures.hasTrueNativeFullScreen&&a.globalBind(mejs.MediaFeatures.fullScreenEventName,function(){if(a.isFullScreen)if(mejs.MediaFeatures.isFullScreen()){a.isNativeFullScreen= -true;a.setControlsSize()}else{a.isNativeFullScreen=false;a.exitFullScreen()}});var d=this,g=f('<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="'+d.id+'" title="'+d.options.fullscreenText+'" aria-label="'+d.options.fullscreenText+'"></button></div>').appendTo(b);if(d.media.pluginType==="native"||!d.options.usePluginFullScreen&&!mejs.MediaFeatures.isFirefox)g.click(function(){mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||a.isFullScreen? -a.exitFullScreen():a.enterFullScreen()});else{var k=null;if(function(){var h=document.createElement("x"),l=document.documentElement,r=window.getComputedStyle;if(!("pointerEvents"in h.style))return false;h.style.pointerEvents="auto";h.style.pointerEvents="x";l.appendChild(h);r=r&&r(h,"").pointerEvents==="auto";l.removeChild(h);return!!r}()&&!mejs.MediaFeatures.isOpera){var j=false,m=function(){if(j){for(var h in q)q[h].hide();g.css("pointer-events","");d.controls.css("pointer-events","");d.media.removeEventListener("click", -d.clickToPlayPauseCallback);j=false}},q={};b=["top","left","right","bottom"];var p,t=function(){var h=g.offset().left-d.container.offset().left,l=g.offset().top-d.container.offset().top,r=g.outerWidth(true),n=g.outerHeight(true),o=d.container.width(),s=d.container.height();for(p in q)q[p].css({position:"absolute",top:0,left:0});q.top.width(o).height(l);q.left.width(h).height(n).css({top:l});q.right.width(o-h-r).height(n).css({top:l,left:h+r});q.bottom.width(o).height(s-n-l).css({top:l+n})};d.globalBind("resize", -function(){t()});p=0;for(c=b.length;p<c;p++)q[b[p]]=f('<div class="mejs-fullscreen-hover" />').appendTo(d.container).mouseover(m).hide();g.on("mouseover",function(){if(!d.isFullScreen){var h=g.offset(),l=a.container.offset();e.positionFullscreenButton(h.left-l.left,h.top-l.top,false);g.css("pointer-events","none");d.controls.css("pointer-events","none");d.media.addEventListener("click",d.clickToPlayPauseCallback);for(p in q)q[p].show();t();j=true}});e.addEventListener("fullscreenchange",function(){d.isFullScreen= -!d.isFullScreen;d.isFullScreen?d.media.removeEventListener("click",d.clickToPlayPauseCallback):d.media.addEventListener("click",d.clickToPlayPauseCallback);m()});d.globalBind("mousemove",function(h){if(j){var l=g.offset();if(h.pageY<l.top||h.pageY>l.top+g.outerHeight(true)||h.pageX<l.left||h.pageX>l.left+g.outerWidth(true)){g.css("pointer-events","");d.controls.css("pointer-events","");j=false}}})}else g.on("mouseover",function(){if(k!==null){clearTimeout(k);delete k}var h=g.offset(),l=a.container.offset(); -e.positionFullscreenButton(h.left-l.left,h.top-l.top,true)}).on("mouseout",function(){if(k!==null){clearTimeout(k);delete k}k=setTimeout(function(){e.hideFullscreenButton()},1500)})}a.fullscreenBtn=g;d.globalBind("keydown",function(h){if((mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||d.isFullScreen)&&h.keyCode==27)a.exitFullScreen()})}},cleanfullscreen:function(a){a.exitFullScreen()},containerSizeTimeout:null,enterFullScreen:function(){var a=this;if(!(a.media.pluginType!== -"native"&&(mejs.MediaFeatures.isFirefox||a.options.usePluginFullScreen))){f(document.documentElement).addClass("mejs-fullscreen");normalHeight=a.container.height();normalWidth=a.container.width();if(a.media.pluginType==="native")if(mejs.MediaFeatures.hasTrueNativeFullScreen){mejs.MediaFeatures.requestFullScreen(a.container[0]);a.isInIframe&&setTimeout(function c(){if(a.isNativeFullScreen){var e=(window.devicePixelRatio||1)*f(window).width(),d=screen.width;Math.abs(d-e)>d*0.0020?a.exitFullScreen(): -setTimeout(c,500)}},500)}else if(mejs.MediaFeatures.hasSemiNativeFullScreen){a.media.webkitEnterFullscreen();return}if(a.isInIframe){var b=a.options.newWindowCallback(this);if(b!=="")if(mejs.MediaFeatures.hasTrueNativeFullScreen)setTimeout(function(){if(!a.isNativeFullScreen){a.pause();window.open(b,a.id,"top=0,left=0,width="+screen.availWidth+",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no")}},250);else{a.pause();window.open(b,a.id,"top=0,left=0,width="+screen.availWidth+ -",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no");return}}a.container.addClass("mejs-container-fullscreen").width("100%").height("100%");a.containerSizeTimeout=setTimeout(function(){a.container.css({width:"100%",height:"100%"});a.setControlsSize()},500);if(a.media.pluginType==="native")a.$media.width("100%").height("100%");else{a.container.find(".mejs-shim").width("100%").height("100%");a.media.setVideoSize(f(window).width(),f(window).height())}a.layers.children("div").width("100%").height("100%"); -a.fullscreenBtn&&a.fullscreenBtn.removeClass("mejs-fullscreen").addClass("mejs-unfullscreen");a.setControlsSize();a.isFullScreen=true;a.container.find(".mejs-captions-text").css("font-size",screen.width/a.width*1*100+"%");a.container.find(".mejs-captions-position").css("bottom","45px")}},exitFullScreen:function(){clearTimeout(this.containerSizeTimeout);if(this.media.pluginType!=="native"&&mejs.MediaFeatures.isFirefox)this.media.setFullscreen(false);else{if(mejs.MediaFeatures.hasTrueNativeFullScreen&& -(mejs.MediaFeatures.isFullScreen()||this.isFullScreen))mejs.MediaFeatures.cancelFullScreen();f(document.documentElement).removeClass("mejs-fullscreen");this.container.removeClass("mejs-container-fullscreen").width(normalWidth).height(normalHeight);if(this.media.pluginType==="native")this.$media.width(normalWidth).height(normalHeight);else{this.container.find(".mejs-shim").width(normalWidth).height(normalHeight);this.media.setVideoSize(normalWidth,normalHeight)}this.layers.children("div").width(normalWidth).height(normalHeight); -this.fullscreenBtn.removeClass("mejs-unfullscreen").addClass("mejs-fullscreen");this.setControlsSize();this.isFullScreen=false;this.container.find(".mejs-captions-text").css("font-size","");this.container.find(".mejs-captions-position").css("bottom","")}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{speeds:["1.50","1.25","1.00","0.75"],defaultSpeed:"1.00"});f.extend(MediaElementPlayer.prototype,{buildspeed:function(a,b,c,e){if(this.media.pluginType=="native"){c='<div class="mejs-button mejs-speed-button"><button type="button">'+this.options.defaultSpeed+'x</button><div class="mejs-speed-selector"><ul>';var d;f.inArray(this.options.defaultSpeed,this.options.speeds)===-1&&this.options.speeds.push(this.options.defaultSpeed);this.options.speeds.sort(function(g, -k){return parseFloat(k)-parseFloat(g)});for(d=0;d<this.options.speeds.length;d++){c+='<li><input type="radio" name="speed" value="'+this.options.speeds[d]+'" id="'+this.options.speeds[d]+'" ';if(this.options.speeds[d]==this.options.defaultSpeed){c+="checked=true ";c+='/><label for="'+this.options.speeds[d]+'" class="mejs-speed-selected">'+this.options.speeds[d]+"x</label></li>"}else c+='/><label for="'+this.options.speeds[d]+'">'+this.options.speeds[d]+"x</label></li>"}c+="</ul></div></div>";a.speedButton= -f(c).appendTo(b);a.playbackspeed=this.options.defaultSpeed;a.speedButton.on("click","input[type=radio]",function(){a.playbackspeed=f(this).attr("value");e.playbackRate=parseFloat(a.playbackspeed);a.speedButton.find("button").text(a.playbackspeed+"x");a.speedButton.find(".mejs-speed-selected").removeClass("mejs-speed-selected");a.speedButton.find("input[type=radio]:checked").next().addClass("mejs-speed-selected")});b=a.speedButton.find(".mejs-speed-selector");b.height(this.speedButton.find(".mejs-speed-selector ul").outerHeight(true)+ -a.speedButton.find(".mejs-speed-translations").outerHeight(true));b.css("top",-1*b.height()+"px")}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{startLanguage:"",tracksText:mejs.i18n.t("Captions/Subtitles"),hideCaptionsButtonWhenEmpty:true,toggleCaptionsButtonWhenOnlyOne:false,slidesSelector:""});f.extend(MediaElementPlayer.prototype,{hasChapters:false,buildtracks:function(a,b,c,e){if(a.tracks.length!==0){var d;if(this.domNode.textTracks)for(d=this.domNode.textTracks.length-1;d>=0;d--)this.domNode.textTracks[d].mode="hidden";a.chapters=f('<div class="mejs-chapters mejs-layer"></div>').prependTo(c).hide(); -a.captions=f('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>').prependTo(c).hide();a.captionsText=a.captions.find(".mejs-captions-text");a.captionsButton=f('<div class="mejs-button mejs-captions-button"><button type="button" aria-controls="'+this.id+'" title="'+this.options.tracksText+'" aria-label="'+this.options.tracksText+'"></button><div class="mejs-captions-selector"><ul><li><input type="radio" name="'+ -a.id+'_captions" id="'+a.id+'_captions_none" value="none" checked="checked" /><label for="'+a.id+'_captions_none">'+mejs.i18n.t("None")+"</label></li></ul></div></div>").appendTo(b);for(d=b=0;d<a.tracks.length;d++)a.tracks[d].kind=="subtitles"&&b++;if(this.options.toggleCaptionsButtonWhenOnlyOne&&b==1)a.captionsButton.on("click",function(){lang=a.selectedTrack===null?a.tracks[0].srclang:"none";a.setTrack(lang)});else{a.captionsButton.on("mouseenter focusin",function(){f(this).find(".mejs-captions-selector").css("visibility", -"visible")}).on("click","input[type=radio]",function(){lang=this.value;a.setTrack(lang)});a.captionsButton.on("mouseleave focusout",function(){f(this).find(".mejs-captions-selector").css("visibility","hidden")})}a.options.alwaysShowControls?a.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover"):a.container.bind("controlsshown",function(){a.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover")}).bind("controlshidden",function(){e.paused||a.container.find(".mejs-captions-position").removeClass("mejs-captions-position-hover")}); -a.trackToLoad=-1;a.selectedTrack=null;a.isLoadingTrack=false;for(d=0;d<a.tracks.length;d++)a.tracks[d].kind=="subtitles"&&a.addTrackButton(a.tracks[d].srclang,a.tracks[d].label);a.loadNextTrack();e.addEventListener("timeupdate",function(){a.displayCaptions()},false);if(a.options.slidesSelector!==""){a.slidesContainer=f(a.options.slidesSelector);e.addEventListener("timeupdate",function(){a.displaySlides()},false)}e.addEventListener("loadedmetadata",function(){a.displayChapters()},false);a.container.hover(function(){if(a.hasChapters){a.chapters.css("visibility", -"visible");a.chapters.fadeIn(200).height(a.chapters.find(".mejs-chapter").outerHeight())}},function(){a.hasChapters&&!e.paused&&a.chapters.fadeOut(200,function(){f(this).css("visibility","hidden");f(this).css("display","block")})});a.node.getAttribute("autoplay")!==null&&a.chapters.css("visibility","hidden")}},setTrack:function(a){var b;if(a=="none"){this.selectedTrack=null;this.captionsButton.removeClass("mejs-captions-enabled")}else for(b=0;b<this.tracks.length;b++)if(this.tracks[b].srclang==a){this.selectedTrack=== -null&&this.captionsButton.addClass("mejs-captions-enabled");this.selectedTrack=this.tracks[b];this.captions.attr("lang",this.selectedTrack.srclang);this.displayCaptions();break}},loadNextTrack:function(){this.trackToLoad++;if(this.trackToLoad<this.tracks.length){this.isLoadingTrack=true;this.loadTrack(this.trackToLoad)}else{this.isLoadingTrack=false;this.checkForTracks()}},loadTrack:function(a){var b=this,c=b.tracks[a];f.ajax({url:c.src,dataType:"text",success:function(e){c.entries=typeof e=="string"&& -/<tt\s+xml/ig.exec(e)?mejs.TrackFormatParser.dfxp.parse(e):mejs.TrackFormatParser.webvtt.parse(e);c.isLoaded=true;b.enableTrackButton(c.srclang,c.label);b.loadNextTrack();c.kind=="chapters"&&b.media.addEventListener("play",function(){b.media.duration>0&&b.displayChapters(c)},false);c.kind=="slides"&&b.setupSlides(c)},error:function(){b.loadNextTrack()}})},enableTrackButton:function(a,b){if(b==="")b=mejs.language.codes[a]||a;this.captionsButton.find("input[value="+a+"]").prop("disabled",false).siblings("label").html(b); -this.options.startLanguage==a&&f("#"+this.id+"_captions_"+a).prop("checked",true).trigger("click");this.adjustLanguageBox()},addTrackButton:function(a,b){if(b==="")b=mejs.language.codes[a]||a;this.captionsButton.find("ul").append(f('<li><input type="radio" name="'+this.id+'_captions" id="'+this.id+"_captions_"+a+'" value="'+a+'" disabled="disabled" /><label for="'+this.id+"_captions_"+a+'">'+b+" (loading)</label></li>"));this.adjustLanguageBox();this.container.find(".mejs-captions-translations option[value="+ -a+"]").remove()},adjustLanguageBox:function(){this.captionsButton.find(".mejs-captions-selector").height(this.captionsButton.find(".mejs-captions-selector ul").outerHeight(true)+this.captionsButton.find(".mejs-captions-translations").outerHeight(true))},checkForTracks:function(){var a=false;if(this.options.hideCaptionsButtonWhenEmpty){for(i=0;i<this.tracks.length;i++)if(this.tracks[i].kind=="subtitles"){a=true;break}if(!a){this.captionsButton.hide();this.setControlsSize()}}},displayCaptions:function(){if(typeof this.tracks!= -"undefined"){var a,b=this.selectedTrack;if(b!==null&&b.isLoaded)for(a=0;a<b.entries.times.length;a++)if(this.media.currentTime>=b.entries.times[a].start&&this.media.currentTime<=b.entries.times[a].stop){this.captionsText.html(b.entries.text[a]).attr("class","mejs-captions-text "+(b.entries.times[a].identifier||""));this.captions.show().height(0);return}this.captions.hide()}},setupSlides:function(a){this.slides=a;this.slides.entries.imgs=[this.slides.entries.text.length];this.showSlide(0)},showSlide:function(a){if(!(typeof this.tracks== -"undefined"||typeof this.slidesContainer=="undefined")){var b=this,c=b.slides.entries.text[a],e=b.slides.entries.imgs[a];if(typeof e=="undefined"||typeof e.fadeIn=="undefined")b.slides.entries.imgs[a]=e=f('<img src="'+c+'">').on("load",function(){e.appendTo(b.slidesContainer).hide().fadeIn().siblings(":visible").fadeOut()});else!e.is(":visible")&&!e.is(":animated")&&e.fadeIn().siblings(":visible").fadeOut()}},displaySlides:function(){if(typeof this.slides!="undefined"){var a=this.slides,b;for(b=0;b< -a.entries.times.length;b++)if(this.media.currentTime>=a.entries.times[b].start&&this.media.currentTime<=a.entries.times[b].stop){this.showSlide(b);break}}},displayChapters:function(){var a;for(a=0;a<this.tracks.length;a++)if(this.tracks[a].kind=="chapters"&&this.tracks[a].isLoaded){this.drawChapters(this.tracks[a]);this.hasChapters=true;break}},drawChapters:function(a){var b=this,c,e,d=e=0;b.chapters.empty();for(c=0;c<a.entries.times.length;c++){e=a.entries.times[c].stop-a.entries.times[c].start; -e=Math.floor(e/b.media.duration*100);if(e+d>100||c==a.entries.times.length-1&&e+d<100)e=100-d;b.chapters.append(f('<div class="mejs-chapter" rel="'+a.entries.times[c].start+'" style="left: '+d.toString()+"%;width: "+e.toString()+'%;"><div class="mejs-chapter-block'+(c==a.entries.times.length-1?" mejs-chapter-block-last":"")+'"><span class="ch-title">'+a.entries.text[c]+'</span><span class="ch-time">'+mejs.Utility.secondsToTimeCode(a.entries.times[c].start)+"–"+mejs.Utility.secondsToTimeCode(a.entries.times[c].stop)+ -"</span></div></div>"));d+=e}b.chapters.find("div.mejs-chapter").click(function(){b.media.setCurrentTime(parseFloat(f(this).attr("rel")));b.media.paused&&b.media.play()});b.chapters.show()}});mejs.language={codes:{af:"Afrikaans",sq:"Albanian",ar:"Arabic",be:"Belarusian",bg:"Bulgarian",ca:"Catalan",zh:"Chinese","zh-cn":"Chinese Simplified","zh-tw":"Chinese Traditional",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch",en:"English",et:"Estonian",fl:"Filipino",fi:"Finnish",fr:"French",gl:"Galician",de:"German", -el:"Greek",ht:"Haitian Creole",iw:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",ga:"Irish",it:"Italian",ja:"Japanese",ko:"Korean",lv:"Latvian",lt:"Lithuanian",mk:"Macedonian",ms:"Malay",mt:"Maltese",no:"Norwegian",fa:"Persian",pl:"Polish",pt:"Portuguese",ro:"Romanian",ru:"Russian",sr:"Serbian",sk:"Slovak",sl:"Slovenian",es:"Spanish",sw:"Swahili",sv:"Swedish",tl:"Tagalog",th:"Thai",tr:"Turkish",uk:"Ukrainian",vi:"Vietnamese",cy:"Welsh",yi:"Yiddish"}};mejs.TrackFormatParser={webvtt:{pattern_timecode:/^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/, -parse:function(a){var b=0;a=mejs.TrackFormatParser.split2(a,/\r?\n/);for(var c={text:[],times:[]},e,d,g;b<a.length;b++){if((e=this.pattern_timecode.exec(a[b]))&&b<a.length){if(b-1>=0&&a[b-1]!=="")g=a[b-1];b++;d=a[b];for(b++;a[b]!==""&&b<a.length;){d=d+"\n"+a[b];b++}d=f.trim(d).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a href='$1' target='_blank'>$1</a>");c.text.push(d);c.times.push({identifier:g,start:mejs.Utility.convertSMPTEtoSeconds(e[1])===0?0.2:mejs.Utility.convertSMPTEtoSeconds(e[1]), -stop:mejs.Utility.convertSMPTEtoSeconds(e[3]),settings:e[5]})}g=""}return c}},dfxp:{parse:function(a){a=f(a).filter("tt");var b=0;b=a.children("div").eq(0);var c=b.find("p");b=a.find("#"+b.attr("style"));var e,d;a={text:[],times:[]};if(b.length){d=b.removeAttr("id").get(0).attributes;if(d.length){e={};for(b=0;b<d.length;b++)e[d[b].name.split(":")[1]]=d[b].value}}for(b=0;b<c.length;b++){var g;d={start:null,stop:null,style:null};if(c.eq(b).attr("begin"))d.start=mejs.Utility.convertSMPTEtoSeconds(c.eq(b).attr("begin")); -if(!d.start&&c.eq(b-1).attr("end"))d.start=mejs.Utility.convertSMPTEtoSeconds(c.eq(b-1).attr("end"));if(c.eq(b).attr("end"))d.stop=mejs.Utility.convertSMPTEtoSeconds(c.eq(b).attr("end"));if(!d.stop&&c.eq(b+1).attr("begin"))d.stop=mejs.Utility.convertSMPTEtoSeconds(c.eq(b+1).attr("begin"));if(e){g="";for(var k in e)g+=k+":"+e[k]+";"}if(g)d.style=g;if(d.start===0)d.start=0.2;a.times.push(d);d=f.trim(c.eq(b).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, -"<a href='$1' target='_blank'>$1</a>");a.text.push(d);if(a.times.start===0)a.times.start=2}return a}},split2:function(a,b){return a.split(b)}};if("x\n\ny".split(/\n/gi).length!=3)mejs.TrackFormatParser.split2=function(a,b){var c=[],e="",d;for(d=0;d<a.length;d++){e+=a.substring(d,d+1);if(b.test(e)){c.push(e.replace(b,""));e=""}}c.push(e);return c}})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{contextMenuItems:[{render:function(a){if(typeof a.enterFullScreen=="undefined")return null;return a.isFullScreen?mejs.i18n.t("Turn off Fullscreen"):mejs.i18n.t("Go Fullscreen")},click:function(a){a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{render:function(a){return a.media.muted?mejs.i18n.t("Unmute"):mejs.i18n.t("Mute")},click:function(a){a.media.muted?a.setMuted(false):a.setMuted(true)}},{isSeparator:true},{render:function(){return mejs.i18n.t("Download Video")}, -click:function(a){window.location.href=a.media.currentSrc}}]});f.extend(MediaElementPlayer.prototype,{buildcontextmenu:function(a){a.contextMenu=f('<div class="mejs-contextmenu"></div>').appendTo(f("body")).hide();a.container.bind("contextmenu",function(b){if(a.isContextMenuEnabled){b.preventDefault();a.renderContextMenu(b.clientX-1,b.clientY-1);return false}});a.container.bind("click",function(){a.contextMenu.hide()});a.contextMenu.bind("mouseleave",function(){a.startContextMenuTimer()})},cleancontextmenu:function(a){a.contextMenu.remove()}, -isContextMenuEnabled:true,enableContextMenu:function(){this.isContextMenuEnabled=true},disableContextMenu:function(){this.isContextMenuEnabled=false},contextMenuTimeout:null,startContextMenuTimer:function(){var a=this;a.killContextMenuTimer();a.contextMenuTimer=setTimeout(function(){a.hideContextMenu();a.killContextMenuTimer()},750)},killContextMenuTimer:function(){var a=this.contextMenuTimer;if(a!=null){clearTimeout(a);delete a}},hideContextMenu:function(){this.contextMenu.hide()},renderContextMenu:function(a, -b){for(var c=this,e="",d=c.options.contextMenuItems,g=0,k=d.length;g<k;g++)if(d[g].isSeparator)e+='<div class="mejs-contextmenu-separator"></div>';else{var j=d[g].render(c);if(j!=null)e+='<div class="mejs-contextmenu-item" data-itemindex="'+g+'" id="element-'+Math.random()*1E6+'">'+j+"</div>"}c.contextMenu.empty().append(f(e)).css({top:b,left:a}).show();c.contextMenu.find(".mejs-contextmenu-item").each(function(){var m=f(this),q=parseInt(m.data("itemindex"),10),p=c.options.contextMenuItems[q];typeof p.show!= -"undefined"&&p.show(m,c);m.click(function(){typeof p.click!="undefined"&&p.click(c);c.contextMenu.hide()})});setTimeout(function(){c.killControlsTimer("rev3")},100)}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{postrollCloseText:mejs.i18n.t("Close")});f.extend(MediaElementPlayer.prototype,{buildpostroll:function(a,b,c){var e=this.container.find('link[rel="postroll"]').attr("href");if(typeof e!=="undefined"){a.postroll=f('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">'+this.options.postrollCloseText+'</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(c).hide();this.media.addEventListener("ended", -function(){f.ajax({dataType:"html",url:e,success:function(d){c.find(".mejs-postroll-layer-content").html(d)}});a.postroll.show()},false)}}})})(mejs.$); - + */ +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){},{}],2:[function(a,b,c){(function(c){var d="undefined"!=typeof c?c:"undefined"!=typeof window?window:{},e=a(1);if("undefined"!=typeof document)b.exports=document;else{var f=d["__GLOBAL_DOCUMENT_CACHE@4"];f||(f=d["__GLOBAL_DOCUMENT_CACHE@4"]=e),b.exports=f}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{1:1}],3:[function(a,b,c){(function(a){"undefined"!=typeof window?b.exports=window:"undefined"!=typeof a?b.exports=a:"undefined"!=typeof self?b.exports=self:b.exports={}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0});var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(6),g=d(f),h=a(14),i=a(25),j={lang:"en",en:h.EN};j.language=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];if(null!==b&&void 0!==b&&b.length){if("string"!=typeof b[0])throw new TypeError("Language code must be a string value");if(!b[0].match(/^[a-z]{2}(\-[a-z]{2})?$/i))throw new TypeError("Language code must have format `xx` or `xx-xx`");j.lang=b[0],void 0===j[b[0]]?(b[1]=null!==b[1]&&void 0!==b[1]&&"object"===e(b[1])?b[1]:{},j[b[0]]=i.isObjectEmpty(b[1])?h.EN:b[1]):null!==b[1]&&void 0!==b[1]&&"object"===e(b[1])&&(j[b[0]]=b[1])}return j.lang},j.t=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof a&&a.length){var c=void 0,d=void 0,f=j.language(),g=function(a,b,c){if("object"!==("undefined"==typeof a?"undefined":e(a))||"number"!=typeof b||"number"!=typeof c)return a;var d=function(){return[function(){return arguments.length<=1?void 0:arguments[1]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 0===(arguments.length<=0?void 0:arguments[0])||1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:0!==(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])||11===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])||12===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])>2&&(arguments.length<=0?void 0:arguments[0])<20?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:0===(arguments.length<=0?void 0:arguments[0])||(arguments.length<=0?void 0:arguments[0])%100>0&&(arguments.length<=0?void 0:arguments[0])%100<20?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:[3]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])>=2&&(arguments.length<=0?void 0:arguments[0])<=4?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return(arguments.length<=0?void 0:arguments[0])%100===1?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])%100===2?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])%100===3||(arguments.length<=0?void 0:arguments[0])%100===4?arguments.length<=4?void 0:arguments[4]:arguments.length<=1?void 0:arguments[1]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])>2&&(arguments.length<=0?void 0:arguments[0])<7?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])>6&&(arguments.length<=0?void 0:arguments[0])<11?arguments.length<=4?void 0:arguments[4]:arguments.length<=5?void 0:arguments[5]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])%100>=3&&(arguments.length<=0?void 0:arguments[0])%100<=10?arguments.length<=4?void 0:arguments[4]:(arguments.length<=0?void 0:arguments[0])%100>=11?arguments.length<=5?void 0:arguments[5]:arguments.length<=6?void 0:arguments[6]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:0===(arguments.length<=0?void 0:arguments[0])||(arguments.length<=0?void 0:arguments[0])%100>1&&(arguments.length<=0?void 0:arguments[0])%100<11?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])%100>10&&(arguments.length<=0?void 0:arguments[0])%100<20?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10===2?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 11!==(arguments.length<=0?void 0:arguments[0])&&(arguments.length<=0?void 0:arguments[0])%10===1?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:8!==(arguments.length<=0?void 0:arguments[0])&&11!==(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:3===(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]}]}();return d[c].apply(null,[b].concat(a))};return void 0!==j[f]&&(c=j[f][a],null!==b&&"number"==typeof b&&(d=j[f]["mejs.plural-form"],c=g.apply(null,[c,b,d]))),!c&&j.en&&(c=j.en[a],null!==b&&"number"==typeof b&&(d=j.en["mejs.plural-form"],c=g.apply(null,[c,b,d]))),c=c||a,null!==b&&"number"==typeof b&&(c=c.replace("%1",b)),i.escapeHTML(c)}return a},g["default"].i18n=j,"undefined"!=typeof mejsL10n&&g["default"].i18n.language(mejsL10n.language,mejsL10n.strings),c["default"]=j},{14:14,25:25,6:6}],5:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0});var f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(25),m=a(26),n=a(7),o=function p(a,b){var c=this;e(this,p);var d=this;d.defaults={renderers:[],fakeNodeName:"mediaelementwrapper",pluginPath:"build/",shimScriptAccess:"sameDomain",customError:""},b=Object.assign(d.defaults,b),d.mediaElement=i["default"].createElement(b.fakeNodeName),d.mediaElement.options=b;var f=a,g=!1;if("string"==typeof a?d.mediaElement.originalNode=i["default"].getElementById(a):(d.mediaElement.originalNode=a,f=a.id),f=f||"mejs_"+Math.random().toString().slice(2),void 0!==d.mediaElement.originalNode&&null!==d.mediaElement.originalNode&&d.mediaElement.appendChild){d.mediaElement.originalNode.setAttribute("id",f+"_from_mejs");var h=d.mediaElement.originalNode.tagName.toLowerCase();["video","audio"].includes(h)&&!d.mediaElement.originalNode.getAttribute("preload")&&d.mediaElement.originalNode.setAttribute("preload","none"),d.mediaElement.originalNode.parentNode.insertBefore(d.mediaElement,d.mediaElement.originalNode),d.mediaElement.appendChild(d.mediaElement.originalNode)}d.mediaElement.id=f,d.mediaElement.renderers={},d.mediaElement.renderer=null,d.mediaElement.rendererName=null,d.mediaElement.changeRenderer=function(a,b){var d=c;if(void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer.name===a)return d.mediaElement.renderer.pause(),d.mediaElement.renderer.stop&&d.mediaElement.renderer.stop(),d.mediaElement.renderer.show(),d.mediaElement.renderer.setSrc(b[0].src),!0;void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&(d.mediaElement.renderer.pause(),d.mediaElement.renderer.stop&&d.mediaElement.renderer.stop(),d.mediaElement.renderer.hide());var e=d.mediaElement.renderers[a],f=null;if(void 0!==e&&null!==e)return e.show(),e.setSrc(b[0].src),d.mediaElement.renderer=e,d.mediaElement.rendererName=a,!0;for(var g=d.mediaElement.options.renderers.length?d.mediaElement.options.renderers:n.renderer.order,h=0,i=g.length;i>h;h++){var j=g[h];if(j===a){var k=n.renderer.renderers;f=k[j];var l=Object.assign(f.options,d.mediaElement.options);return e=f.create(d.mediaElement,l,b),e.name=a,d.mediaElement.renderers[f.name]=e,d.mediaElement.renderer=e,d.mediaElement.rendererName=a,e.show(),!0}}return!1},d.mediaElement.setSize=function(a,b){void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer.setSize(a,b)},d.mediaElement.createErrorMessage=function(a){a=Array.isArray(a)?a:[];var b=i["default"].createElement("div");b.className="me_cannotplay",b.style.width="100%",b.style.height="100%";var c=d.mediaElement.options.customError;if(!c){var e=d.mediaElement.originalNode.getAttribute("poster");e&&(c+='<img src="'+e+'" width="100%" height="100%" alt="'+k["default"].i18n.t("mejs.download-file")+'">');for(var f=0,h=a.length;h>f;f++){var j=a[f];c+='<a href="'+j.src+'" data-type="'+j.type+'"><span>'+k["default"].i18n.t("mejs.download-file")+": "+j.src+"</span></a>"}}b.innerHTML=c,d.mediaElement.originalNode.parentNode.insertBefore(b,d.mediaElement.originalNode),d.mediaElement.originalNode.style.display="none",g=!0};var j=k["default"].html5media.properties,o=k["default"].html5media.methods,q=function(a,b,c,d){var e=a[b],f=function(){return c.apply(a,[e])},g=function(b){return e=d.apply(a,[b])};Object.defineProperty(a,b,{get:f,set:g})},r=function(a){"src"!==a&&!function(){var b=""+a.substring(0,1).toUpperCase()+a.substring(1),c=function(){return void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer?d.mediaElement.renderer["get"+b]():null},e=function(a){void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer["set"+b](a)};q(d.mediaElement,a,c,e),d.mediaElement["get"+b]=c,d.mediaElement["set"+b]=e}()},s=function(){return void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer?d.mediaElement.renderer.getSrc():null},t=function(a){var b=[];if("string"==typeof a)b.push({src:a,type:a?m.getTypeFromFile(a):""});else for(var c=0,e=a.length;e>c;c++){var f=m.absolutizeUrl(a[c].src),g=a[c].type;b.push({src:f,type:""!==g&&null!==g&&void 0!==g||!f?g:m.getTypeFromFile(f)})}var h=n.renderer.select(b,d.mediaElement.options.renderers.length?d.mediaElement.options.renderers:[]),i=void 0;return d.mediaElement.paused||(d.mediaElement.pause(),i=l.createEvent("pause",d.mediaElement),d.mediaElement.dispatchEvent(i)),d.mediaElement.originalNode.setAttribute("src",b[0].src||""),d.mediaElement.querySelector(".me_cannotplay")&&d.mediaElement.querySelector(".me_cannotplay").remove(),null===h?(d.mediaElement.createErrorMessage(b),i=l.createEvent("error",d.mediaElement),i.message="No renderer found",void d.mediaElement.dispatchEvent(i)):(d.mediaElement.changeRenderer(h.rendererName,b),void 0===d.mediaElement.renderer||null===d.mediaElement.renderer?(i=l.createEvent("error",d.mediaElement),i.message="Error creating renderer",d.mediaElement.dispatchEvent(i),void d.mediaElement.createErrorMessage(b)):void 0)},u=function(a){d.mediaElement[a]=function(){for(var b=arguments.length,c=Array(b),e=0;b>e;e++)c[e]=arguments[e];if(void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&"function"==typeof d.mediaElement.renderer[a])try{d.mediaElement.renderer[a](c)}catch(f){d.mediaElement.createErrorMessage()}return null}};q(d.mediaElement,"src",s,t),d.mediaElement.getSrc=s,d.mediaElement.setSrc=t;for(var v=0,w=j.length;w>v;v++)r(j[v]);for(var x=0,y=o.length;y>x;x++)u(o[x]);if(d.mediaElement.events={},d.mediaElement.addEventListener=function(a,b){d.mediaElement.events[a]=d.mediaElement.events[a]||[],d.mediaElement.events[a].push(b)},d.mediaElement.removeEventListener=function(a,b){if(!a)return d.mediaElement.events={},!0;var c=d.mediaElement.events[a];if(!c)return!0;if(!b)return d.mediaElement.events[a]=[],!0;for(var e=0;e<c.length;e++)if(c[e]===b)return d.mediaElement.events[a].splice(e,1),!0;return!1},d.mediaElement.dispatchEvent=function(a){var b=d.mediaElement.events[a.type];if(b)for(var c=0;c<b.length;c++)b[c].apply(null,[a])},null!==d.mediaElement.originalNode){var z=[];switch(d.mediaElement.originalNode.nodeName.toLowerCase()){case"iframe":z.push({type:"",src:d.mediaElement.originalNode.getAttribute("src")});break;case"audio":case"video":var A=void 0,B=void 0,C=void 0,D=d.mediaElement.originalNode.childNodes.length,E=d.mediaElement.originalNode.getAttribute("src");if(E){var F=d.mediaElement.originalNode;z.push({type:m.formatType(E,F.getAttribute("type")),src:E})}for(var G=0;D>G;G++)A=d.mediaElement.originalNode.childNodes[G],A.nodeType===Node.ELEMENT_NODE&&"source"===A.tagName.toLowerCase()&&(B=A.getAttribute("src"),C=m.formatType(B,A.getAttribute("type")),z.push({type:C,src:B}))}z.length>0&&(d.mediaElement.src=z)}return d.mediaElement.options.success&&d.mediaElement.options.success(d.mediaElement,d.mediaElement.originalNode),g&&d.mediaElement.options.error&&d.mediaElement.options.error(d.mediaElement,d.mediaElement.originalNode),d.mediaElement};g["default"].MediaElement=o,c["default"]=o},{2:2,25:25,26:26,3:3,6:6,7:7}],6:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0});var e=a(3),f=d(e),g={};g.version="4.0.2",g.html5media={properties:["volume","src","currentTime","muted","duration","paused","ended","buffered","error","networkState","readyState","seeking","seekable","currentSrc","preload","bufferedBytes","bufferedTime","initialTime","startOffsetTime","defaultPlaybackRate","playbackRate","played","autoplay","loop","controls"],readOnlyProperties:["duration","paused","ended","buffered","error","networkState","readyState","seeking","seekable"],methods:["load","play","pause","canPlayType"],events:["loadstart","progress","suspend","abort","error","emptied","stalled","play","pause","loadedmetadata","loadeddata","waiting","playing","canplay","canplaythrough","seeking","seeked","timeupdate","ended","ratechange","durationchange","volumechange"],mediaTypes:["audio/mp3","audio/ogg","audio/oga","audio/wav","audio/x-wav","audio/wave","audio/x-pn-wav","audio/mpeg","audio/mp4","video/mp4","video/webm","video/ogg"]},f["default"].mejs=g,c["default"]=g},{3:3}],7:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0}),c.renderer=void 0;var f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},g=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),h=a(6),i=d(h),j=function(){function a(){e(this,a),this.renderers={},this.order=[]}return g(a,[{key:"add",value:function(a){if(void 0===a.name)throw new TypeError("renderer must contain at least `name` property");this.renderers[a.name]=a,this.order.push(a.name)}},{key:"select",value:function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],c=b.length;b=b.length?b:this.order,c||!function(){var a=[/^(html5|native)/,/^flash/,/iframe$/],c=function(b){for(var c=0,d=a.length;d>c;c++)if(null!==b.match(a[c]))return c;return a.length};b.sort(function(a,b){return c(a)-c(b)})}();for(var d=0,e=b.length;e>d;d++){var f=b[d],g=this.renderers[f];if(null!==g&&void 0!==g)for(var h=0,i=a.length;i>h;h++)if("function"==typeof g.canPlayType&&"string"==typeof a[h].type&&g.canPlayType(a[h].type))return{rendererName:g.name,src:a[h].src}}return null}},{key:"order",set:function(a){if(!Array.isArray(a))throw new TypeError("order must be an array of strings.");this._order=a},get:function(){return this._order}},{key:"renderers",set:function(a){if(null!==a&&"object"!==("undefined"==typeof a?"undefined":f(a)))throw new TypeError("renderers must be an array of objects.");this._renderers=a},get:function(){return this._renderers}}]),a}(),k=c.renderer=new j;i["default"].Renderers=k},{6:6}],8:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}var f=a(3),g=e(f),h=a(2),i=e(h),j=a(4),k=e(j),l=a(16),m=e(l),n=a(23),o=d(n),p=a(25),q=a(24);Object.assign(l.config,{usePluginFullScreen:!0,fullscreenText:null}),Object.assign(m["default"].prototype,{isFullScreen:!1,isNativeFullScreen:!1,isInIframe:!1,isPluginClickThroughCreated:!1,fullscreenMode:"",containerSizeTimeout:null,buildfullscreen:function(a,b,c,d){if(a.isVideo){a.isInIframe=g["default"].location!==g["default"].parent.location,d.addEventListener("loadstart",function(){a.detectFullscreenMode()});var e=this,f=p.isString(e.options.fullscreenText)?e.options.fullscreenText:k["default"].t("mejs.fullscreen"),h=i["default"].createElement("div");if(h.className=e.options.classPrefix+"button "+e.options.classPrefix+"fullscreen-button",h.innerHTML='<button type="button" aria-controls="'+e.id+'" title="'+f+'" aria-label="'+f+'" tabindex="0"></button>',e.addControlElement(h,"fullscreen"),h.addEventListener("click",function(){var b=o.HAS_TRUE_NATIVE_FULLSCREEN&&o.IS_FULLSCREEN||a.isFullScreen;b?a.exitFullScreen():a.enterFullScreen()}),a.fullscreenBtn=h,e.globalBind("keydown",function(b){var c=b.which||b.keyCode||0;27===c&&(o.HAS_TRUE_NATIVE_FULLSCREEN&&o.IS_FULLSCREEN||e.isFullScreen)&&a.exitFullScreen()}),e.normalHeight=0,e.normalWidth=0,o.HAS_TRUE_NATIVE_FULLSCREEN){var j=function(){a.isFullScreen&&(o.isFullScreen()?(a.isNativeFullScreen=!0,a.setControlsSize()):(a.isNativeFullScreen=!1,a.exitFullScreen()))};a.globalBind(o.FULLSCREEN_EVENT_NAME,j)}}},detectFullscreenMode:function(){var a=this,b=null!==a.media.rendererName&&null!==a.media.rendererName.match(/(native|html5)/),c="";return c=o.HAS_TRUE_NATIVE_FULLSCREEN&&b?"native-native":o.HAS_TRUE_NATIVE_FULLSCREEN&&!b?"plugin-native":a.usePluginFullScreen&&o.SUPPORT_POINTER_EVENTS?"plugin-click":"fullwindow",a.fullscreenMode=c,c},cleanfullscreen:function(a){a.exitFullScreen()},enterFullScreen:function(){var a=this,b=null!==a.media.rendererName&&null!==a.media.rendererName.match(/(html5|native)/),c=getComputedStyle(a.container);if(o.IS_IOS&&o.HAS_IOS_FULLSCREEN&&"function"==typeof a.media.webkitEnterFullscreen)return void a.media.webkitEnterFullscreen();if(q.addClass(i["default"].documentElement,a.options.classPrefix+"fullscreen"),q.addClass(a.container,a.options.classPrefix+"container-fullscreen"),a.normalHeight=parseFloat(c.height),a.normalWidth=parseFloat(c.width),"native-native"===a.fullscreenMode||"plugin-native"===a.fullscreenMode?(o.requestFullScreen(a.container),a.isInIframe&&setTimeout(function r(){if(a.isNativeFullScreen){var b=.002,c=g["default"].innerWidth||i["default"].documentElement.clientWidth||i["default"].body.clientWidth,d=screen.width,e=Math.abs(d-c),f=d*b;e>f?a.exitFullScreen():setTimeout(r,500)}},1e3)):"fullwindow"===a.fullscreeMode,a.container.style.width="100%",a.container.style.height="100%",a.containerSizeTimeout=setTimeout(function(){a.container.style.width="100%",a.container.style.height="100%",a.setControlsSize()},500),b)a.node.style.width="100%",a.node.style.height="100%";else for(var d=a.container.querySelectorAll("iframe, embed, object, video"),e=d.length,f=0;e>f;f++)d[f].style.width="100%",d[f].style.height="100%";a.options.setDimensions&&"function"==typeof a.media.setSize&&a.media.setSize(screen.width,screen.height);for(var h=a.layers.childNodes,j=h.length,k=0;j>k;k++)h[k].style.width="100%",h[k].style.height="100%";a.fullscreenBtn&&(q.removeClass(a.fullscreenBtn,a.options.classPrefix+"fullscreen"),q.addClass(a.fullscreenBtn,a.options.classPrefix+"unfullscreen")),a.setControlsSize(),a.isFullScreen=!0;var l=Math.min(screen.width/a.width,screen.height/a.height),m=a.container.querySelector("."+a.options.classPrefix+"captions-text");m&&(m.style.fontSize=100*l+"%",m.style.lineHeight="normal",a.container.querySelector("."+a.options.classPrefix+"captions-position").style.bottom="45px");var n=p.createEvent("enteredfullscreen",a.container);a.container.dispatchEvent(n)},exitFullScreen:function(){var a=this,b=null!==a.media.rendererName&&null!==a.media.rendererName.match(/(native|html5)/);if(clearTimeout(a.containerSizeTimeout),o.HAS_TRUE_NATIVE_FULLSCREEN&&(o.IS_FULLSCREEN||a.isFullScreen)&&o.cancelFullScreen(),q.removeClass(i["default"].documentElement,a.options.classPrefix+"fullscreen"),q.removeClass(a.container,a.options.classPrefix+"container-fullscreen"),a.options.setDimensions){if(a.container.style.width=a.normalWidth+"px",a.container.style.height=a.normalHeight+"px",b)a.node.style.width=a.normalWidth+"px",a.node.style.height=a.normalHeight+"px";else for(var c=a.container.querySelectorAll("iframe, embed, object, video"),d=c.length,e=0;d>e;e++)c[e].style.width=a.normalWidth+"px",c[e].style.height=a.normalHeight+"px";"function"==typeof a.media.setSize&&a.media.setSize(a.normalWidth,a.normalHeight);for(var f=a.layers.childNodes,g=f.length,h=0;g>h;h++)f[h].style.width=a.normalWidth+"px",f[h].style.height=a.normalHeight+"px"}q.removeClass(a.fullscreenBtn,a.options.classPrefix+"unfullscreen"),q.addClass(a.fullscreenBtn,a.options.classPrefix+"fullscreen"),a.setControlsSize(),a.isFullScreen=!1;var j=a.container.querySelector("."+a.options.classPrefix+"captions-text");j&&(j.style.fontSize="",j.style.lineHeight="",a.container.querySelector("."+a.options.classPrefix+"captions-position").style.bottom="");var k=p.createEvent("exitedfullscreen",a.container);a.container.dispatchEvent(k)}})},{16:16,2:2,23:23,24:24,25:25,3:3,4:4}],9:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(4),j=d(i),k=a(25),l=a(24);Object.assign(g.config,{playText:null,pauseText:null}),Object.assign(h["default"].prototype,{buildplaypause:function(a,b,c,d){function e(a){"play"===a?(l.removeClass(n,g.options.classPrefix+"play"),l.removeClass(n,g.options.classPrefix+"replay"),l.addClass(n,g.options.classPrefix+"pause"),o.setAttribute("title",m),o.setAttribute("aria-label",m)):(l.removeClass(n,g.options.classPrefix+"pause"),l.removeClass(n,g.options.classPrefix+"replay"),l.addClass(n,g.options.classPrefix+"play"),o.setAttribute("title",i),o.setAttribute("aria-label",i))}var g=this,h=g.options,i=k.isString(h.playText)?h.playText:j["default"].t("mejs.play"),m=k.isString(h.pauseText)?h.pauseText:j["default"].t("mejs.pause"),n=f["default"].createElement("div");n.className=g.options.classPrefix+"button "+g.options.classPrefix+"playpause-button "+g.options.classPrefix+"play",n.innerHTML='<button type="button" aria-controls="'+g.id+'" title="'+i+'" aria-label="'+m+'" tabindex="0"></button>',n.addEventListener("click",function(){d.paused?d.play():d.pause()});var o=n.querySelector("button");g.addControlElement(n,"playpause"),e("pse"),d.addEventListener("loadedmetadata",function(){e("pse")}),d.addEventListener("play",function(){e("play")}),d.addEventListener("playing",function(){e("play")}),d.addEventListener("pause",function(){e("pse")}),d.addEventListener("paused",function(){e("pse")}),d.addEventListener("ended",function(){a.options.loop||(l.removeClass(n,g.options.classPrefix+"pause"),l.removeClass(n,g.options.classPrefix+"play"),l.addClass(n,g.options.classPrefix+"replay"),o.setAttribute("title",i),o.setAttribute("aria-label",i))})}})},{16:16,2:2,24:24,25:25,4:4}],10:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(4),j=d(i),k=a(23),l=a(28),m=a(24);Object.assign(g.config,{enableProgressTooltip:!0}),Object.assign(h["default"].prototype,{buildprogress:function(a,b,c,d){var e=0,g=!1,h=!1,i=this,n=a.options.autoRewind,o=a.options.enableProgressTooltip?'<span class="'+i.options.classPrefix+'time-float">'+('<span class="'+i.options.classPrefix+'time-float-current">00:00</span>')+('<span class="'+i.options.classPrefix+'time-float-corner"></span>')+"</span>":"",p=f["default"].createElement("div");p.className=i.options.classPrefix+"time-rail",p.innerHTML='<span class="'+i.options.classPrefix+"time-total "+i.options.classPrefix+'time-slider">'+('<span class="'+i.options.classPrefix+'time-buffering"></span>')+('<span class="'+i.options.classPrefix+'time-loaded"></span>')+('<span class="'+i.options.classPrefix+'time-current"></span>')+('<span class="'+i.options.classPrefix+'time-handle"></span>')+(""+o)+"</span>",i.addControlElement(p,"progress"),b.querySelector("."+i.options.classPrefix+"time-buffering").style.display="none",i.rail=b.querySelector("."+i.options.classPrefix+"time-rail"),i.total=b.querySelector("."+i.options.classPrefix+"time-total"),i.loaded=b.querySelector("."+i.options.classPrefix+"time-loaded"),i.current=b.querySelector("."+i.options.classPrefix+"time-current"),i.handle=b.querySelector("."+i.options.classPrefix+"time-handle"),i.timefloat=b.querySelector("."+i.options.classPrefix+"time-float"),i.timefloatcurrent=b.querySelector("."+i.options.classPrefix+"time-float-current"),i.slider=b.querySelector("."+i.options.classPrefix+"time-slider"),i.newTime=0,i.forcedHandlePause=!1;var q=function(b){var c=getComputedStyle(i.total),e=m.offset(i.total),f=parseFloat(c.width),h=0,j=0,n=void 0;n=b.originalEvent&&b.originalEvent.changedTouches?b.originalEvent.changedTouches[0].pageX:b.changedTouches?b.changedTouches[0].pageX:b.pageX,d.duration&&(n<e.left?n=e.left:n>f+e.left&&(n=f+e.left),j=n-e.left,h=j/f,i.newTime=.02>=h?0:h*d.duration,g&&null!==d.currentTime&&i.newTime.toFixed(4)!==d.currentTime.toFixed(4)&&(i.setCurrentRailHandle(i.newTime),i.updateCurrent(i.newTime)),k.IS_IOS||k.IS_ANDROID||!i.timefloat||(i.timefloat.style.left=j+"px",i.timefloatcurrent.innerHTML=l.secondsToTimeCode(i.newTime,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength),i.timefloat.style.display="block"))},r=function(){var b=d.currentTime,c=j["default"].t("mejs.time-slider"),e=l.secondsToTimeCode(b,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength),f=d.duration;i.slider.setAttribute("role","slider"),i.slider.tabIndex=0,d.paused?(i.slider.setAttribute("aria-label",c),i.slider.setAttribute("aria-valuemin",0),i.slider.setAttribute("aria-valuemax",f),i.slider.setAttribute("aria-valuenow",b),i.slider.setAttribute("aria-valuetext",e)):(i.slider.removeAttribute("aria-label"),i.slider.removeAttribute("aria-valuemin"),i.slider.removeAttribute("aria-valuemax"),i.slider.removeAttribute("aria-valuenow"),i.slider.removeAttribute("aria-valuetext"))},s=function(){var a=new Date;a-e>=1e3&&d.play()},t=function(){g&&null!==d.currentTime&&i.newTime.toFixed(4)!==d.currentTime.toFixed(4)&&(d.setCurrentTime(i.newTime),a.setCurrentRail(),i.updateCurrent(i.newTime)),i.forcedHandlePause&&i.media.play(),i.forcedHandlePause=!1};i.slider.addEventListener("focus",function(){a.options.autoRewind=!1}),i.slider.addEventListener("blur",function(){a.options.autoRewind=n}),i.slider.addEventListener("keydown",function(b){if(new Date-e>=1e3&&(h=d.paused),i.options.keyActions.length){var c=b.which||b.keyCode||0,f=d.duration,g=a.options.defaultSeekForwardInterval(d),j=a.options.defaultSeekBackwardInterval(d),l=d.currentTime;switch(c){case 37:case 40:d.duration!==1/0&&(l-=j);break;case 39:case 38:d.duration!==1/0&&(l+=g);break;case 36:l=0;break;case 35:l=f;break;case 32:return void(k.IS_FIREFOX||(d.paused?d.play():d.pause()));case 13:return void(d.paused?d.play():d.pause());default:return}l=0>l?0:l>=f?f:Math.floor(l),e=new Date,h||d.pause(),l<d.duration&&!h&&setTimeout(s,1100),d.setCurrentTime(l),b.preventDefault(),b.stopPropagation()}});var u=["mousedown","touchstart"];i.slider.addEventListener("dragstart",function(){return!1});for(var v=0,w=u.length;w>v;v++)i.slider.addEventListener(u[v],function(a){i.forcedHandlePause=!1,d.duration!==1/0&&(1===a.which||0===a.which)&&(d.paused||(i.media.pause(),i.forcedHandlePause=!0),g=!0,q(a),i.globalBind("mousemove.dur touchmove.dur",function(a){var b=a.target;(b===i.slider||b.closest("."+i.options.classPrefix+"time-slider"))&&q(a); +}),i.globalBind("mouseup.dur touchend.dur",function(){t(),g=!1,i.timefloat&&(i.timefloat.style.display="none"),i.globalUnbind("mousemove.dur touchmove.dur mouseup.dur touchend.dur")}))});i.slider.addEventListener("mouseenter",function(a){a.target===i.slider&&d.duration!==1/0&&(i.globalBind("mousemove.dur",function(a){var b=a.target;(b===i.slider||b.closest("."+i.options.classPrefix+"time-slider"))&&q(a)}),!i.timefloat||k.IS_IOS||k.IS_ANDROID||(i.timefloat.style.display="block"))}),i.slider.addEventListener("mouseleave",function(){d.duration!==1/0&&(g||(i.globalUnbind("mousemove.dur"),i.timefloat&&(i.timefloat.style.display="none")))}),d.addEventListener("progress",function(c){var e=b.querySelector("."+i.options.classPrefix+"broadcast");if(d.duration!==1/0)e&&(i.slider.style.display="",e.remove()),a.setProgressRail(c),i.forcedHandlePause||a.setCurrentRail(c);else if(!e){var g=f["default"].createElement("span");g.className=i.options.classPrefix+"broadcast",g.innerText=j["default"].t("mejs.live-broadcast"),i.slider.style.display="none"}}),d.addEventListener("timeupdate",function(c){var e=b.querySelector("."+i.options.classPrefix+"broadcast");if(d.duration!==1/0)e&&(i.slider.style.display="",e.remove()),a.setProgressRail(c),i.forcedHandlePause||a.setCurrentRail(c),r(c);else if(!e){var g=f["default"].createElement("span");g.className=i.options.classPrefix+"broadcast",g.innerText=j["default"].t("mejs.live-broadcast"),b.querySelector("."+i.options.classPrefix+"time-rail").appendChild(g),i.slider.style.display="none"}}),i.container.addEventListener("controlsresize",function(b){d.duration!==1/0&&(a.setProgressRail(b),i.forcedHandlePause||a.setCurrentRail(b))})},setProgressRail:function(a){var b=null,c=this,d=void 0!==a?a.target:c.media;d&&d.buffered&&d.buffered.length>0&&d.buffered.end&&d.duration?b=d.buffered.end(d.buffered.length-1)/d.duration:d&&void 0!==d.bytesTotal&&d.bytesTotal>0&&void 0!==d.bufferedBytes?b=d.bufferedBytes/d.bytesTotal:a&&a.lengthComputable&&0!==a.total&&(b=a.loaded/a.total),null!==b&&(b=Math.min(1,Math.max(0,b)),c.loaded&&c.total&&(c.loaded.style.width=100*b+"%"))},setCurrentRailHandle:function(a){var b=this;b.setCurrentRailMain(b,a)},setCurrentRail:function(){var a=this;a.setCurrentRailMain(a)},setCurrentRailMain:function(a,b){if(void 0!==a.media.currentTime&&a.media.duration){var c="undefined"==typeof b?a.media.currentTime:b;if(a.total&&a.handle){var d=Math.round(parseFloat(getComputedStyle(a.total).width)*c/a.media.duration),e=d-Math.round(a.handle.offsetWidth/2);d=c/a.media.duration*100,a.current.style.width=d+"%",a.handle.style.left=e+"px"}}}})},{16:16,2:2,23:23,24:24,28:28,4:4}],11:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(28),j=a(24);Object.assign(g.config,{duration:0,timeAndDurationSeparator:"<span> | </span>"}),Object.assign(h["default"].prototype,{buildcurrent:function(a,b,c,d){var e=this,g=f["default"].createElement("div");g.className=e.options.classPrefix+"time",g.setAttribute("role","timer"),g.setAttribute("aria-live","off"),g.innerHTML='<span class="'+e.options.classPrefix+'currenttime">'+i.secondsToTimeCode(0,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength)+"</span>",e.addControlElement(g,"current"),d.addEventListener("timeupdate",function(){e.controlsAreVisible&&a.updateCurrent()})},buildduration:function(a,b,c,d){var e=this,g=b.lastChild.querySelector("."+e.options.classPrefix+"currenttime");if(g)b.querySelector("."+e.options.classPrefix+"time").innerHTML+=e.options.timeAndDurationSeparator+'<span class="'+e.options.classPrefix+'duration">'+(i.secondsToTimeCode(e.options.duration,e.options.alwaysShowHours,e.options.showTimecodeFrameCount,e.options.framesPerSecond,e.options.secondsDecimalLength)+"</span>");else{b.querySelector("."+e.options.classPrefix+"currenttime")&&j.addClass(b.querySelector("."+e.options.classPrefix+"currenttime").parentNode,e.options.classPrefix+"currenttime-container");var h=f["default"].createElement("div");h.className=e.options.classPrefix+"time "+e.options.classPrefix+"duration-container",h.innerHTML='<span class="'+e.options.classPrefix+'duration">'+(i.secondsToTimeCode(e.options.duration,e.options.alwaysShowHours,e.options.showTimecodeFrameCount,e.options.framesPerSecond,e.options.secondsDecimalLength)+"</span>"),e.addControlElement(h,"duration")}d.addEventListener("timeupdate",function(){e.controlsAreVisible&&a.updateDuration()})},updateCurrent:function(){var a=this,b=a.media.currentTime;isNaN(b)&&(b=0),a.controls.querySelector("."+a.options.classPrefix+"currenttime")&&(a.controls.querySelector("."+a.options.classPrefix+"currenttime").innerText=i.secondsToTimeCode(b,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength))},updateDuration:function(){var a=this,b=a.media.duration;(isNaN(b)||b===1/0||0>b)&&(a.media.duration=a.options.duration=b=0),a.options.duration>0&&(b=a.options.duration);var c=i.secondsToTimeCode(b,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength);c.length>5&&j.toggleClass(a.container,a.options.classPrefix+"long-video"),a.controls.querySelector("."+a.options.classPrefix+"duration")&&b>0&&(a.controls.querySelector("."+a.options.classPrefix+"duration").innerHTML=c)}})},{16:16,2:2,24:24,28:28}],12:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(6),h=d(g),i=a(4),j=d(i),k=a(16),l=d(k),m=a(28),n=a(25),o=a(24);Object.assign(k.config,{startLanguage:"",tracksText:null,chaptersText:null,tracksAriaLive:!1,hideCaptionsButtonWhenEmpty:!0,toggleCaptionsButtonWhenOnlyOne:!1,slidesSelector:""}),Object.assign(l["default"].prototype,{hasChapters:!1,buildtracks:function(a,b,c,d){if(0!==a.tracks.length){var e=this,g=e.options.tracksAriaLive?' role="log" aria-live="assertive" aria-atomic="false"':"",h=n.isString(e.options.tracksText)?e.options.tracksText:j["default"].t("mejs.captions-subtitles"),i=n.isString(e.options.chaptersText)?e.options.chaptersText:j["default"].t("mejs.captions-chapters"),k=a.tracks.length;if(e.domNode.textTracks)for(var l=e.domNode.textTracks.length-1;l>=0;l--)e.domNode.textTracks[l].mode="hidden";e.cleartracks(a),a.captions=f["default"].createElement("div"),a.captions.className=e.options.classPrefix+"captions-layer "+e.options.classPrefix+"layer",a.captions.innerHTML='<div class="'+e.options.classPrefix+"captions-position "+e.options.classPrefix+'captions-position-hover"'+g+">"+('<span class="'+e.options.classPrefix+'captions-text"></span>')+"</div>",a.captions.style.display="none",c.insertBefore(a.captions,c.firstChild),a.captionsText=a.captions.querySelector("."+e.options.classPrefix+"captions-text"),a.captionsButton=f["default"].createElement("div"),a.captionsButton.className=e.options.classPrefix+"button "+e.options.classPrefix+"captions-button",a.captionsButton.innerHTML='<button type="button" aria-controls="'+e.id+'" title="'+h+'" aria-label="'+h+'" tabindex="0"></button>'+('<div class="'+e.options.classPrefix+"captions-selector "+e.options.classPrefix+'offscreen">')+('<ul class="'+e.options.classPrefix+'captions-selector-list">')+('<li class="'+e.options.classPrefix+'captions-selector-list-item">')+('<input type="radio" class="'+e.options.classPrefix+'captions-selector-input" ')+('name="'+a.id+'_captions" id="'+a.id+'_captions_none" ')+'value="none" checked disabled>'+('<label class="'+e.options.classPrefix+"captions-selector-label ")+(e.options.classPrefix+'captions-selected" ')+('for="'+a.id+'_captions_none">'+j["default"].t("mejs.none")+"</label>")+"</li></ul></div>",e.addControlElement(a.captionsButton,"tracks"),a.captionsButton.querySelector("."+e.options.classPrefix+"captions-selector-list-item").disabled=!1,a.chaptersButton=f["default"].createElement("div"),a.chaptersButton.className=e.options.classPrefix+"button "+e.options.classPrefix+"chapters-button",a.chaptersButton.innerHTML='<button type="button" aria-controls="'+e.id+'" title="'+i+'" aria-label="'+i+'" tabindex="0"></button>'+('<div class="'+e.options.classPrefix+"chapters-selector "+e.options.classPrefix+'offscreen">')+('<ul class="'+e.options.classPrefix+'chapters-selector-list"></ul>')+"</div>";for(var m=0,p=0;k>p;p++){var q=a.tracks[p].kind;"subtitles"===q||"captions"===q?m++:"chapters"!==q||b.querySelector("."+e.options.classPrefix+"chapter-selector")||a.captionsButton.parentNode.insertBefore(a.chaptersButton,a.captionsButton)}a.trackToLoad=-1,a.selectedTrack=null,a.isLoadingTrack=!1;for(var r=0;k>r;r++){var s=a.tracks[r].kind;("subtitles"===s||"captions"===s)&&a.addTrackButton(a.tracks[r].trackId,a.tracks[r].srclang,a.tracks[r].label)}a.loadNextTrack();var t=["mouseenter","focusin"],u=["mouseleave","focusout"];if(e.options.toggleCaptionsButtonWhenOnlyOne&&1===m)a.captionsButton.addEventListener("click",function(){var b="none";null===a.selectedTrack&&(b=a.tracks[0].trackId),a.setTrack(b)});else{for(var v=a.captionsButton.querySelectorAll("."+e.options.classPrefix+"captions-selector-label"),w=a.captionsButton.querySelectorAll("input[type=radio]"),x=0,y=t.length;y>x;x++)a.captionsButton.addEventListener(t[x],function(){o.removeClass(this.querySelector("."+e.options.classPrefix+"captions-selector"),e.options.classPrefix+"offscreen")});for(var z=0,A=u.length;A>z;z++)a.captionsButton.addEventListener(u[z],function(){o.addClass(this.querySelector("."+e.options.classPrefix+"captions-selector"),e.options.classPrefix+"offscreen")});for(var B=0,C=w.length;C>B;B++)w[B].addEventListener("click",function(){a.setTrack(this.value)});for(var D=0,E=v.length;E>D;D++)v[D].addEventListener("click",function(){var a=o.siblings(this,function(a){return"INPUT"===a.tagName})[0],b=n.createEvent("click",a);a.dispatchEvent(b)});a.captionsButton.addEventListener("keydown",function(a){a.stopPropagation()})}for(var F=0,G=t.length;G>F;F++)a.chaptersButton.addEventListener(t[F],function(){this.querySelector("."+e.options.classPrefix+"chapters-selector-list").childNodes.length&&o.removeClass(this.querySelector("."+e.options.classPrefix+"chapters-selector"),e.options.classPrefix+"offscreen")});for(var H=0,I=u.length;I>H;H++)a.chaptersButton.addEventListener(u[H],function(){o.addClass(this.querySelector("."+e.options.classPrefix+"chapters-selector"),e.options.classPrefix+"offscreen")});a.chaptersButton.addEventListener("keydown",function(a){a.stopPropagation()}),a.options.alwaysShowControls?o.addClass(a.container.querySelector("."+e.options.classPrefix+"captions-position"),e.options.classPrefix+"captions-position-hover"):(a.container.addEventListener("controlsshown",function(){o.addClass(a.container.querySelector("."+e.options.classPrefix+"captions-position"),e.options.classPrefix+"captions-position-hover")}),a.container.addEventListener("controlshidden",function(){d.paused||o.removeClass(a.container.querySelector("."+e.options.classPrefix+"captions-position"),e.options.classPrefix+"captions-position-hover")})),d.addEventListener("timeupdate",function(){a.displayCaptions()}),""!==a.options.slidesSelector&&(a.slidesContainer=f["default"].querySelectorAll(a.options.slidesSelector),d.addEventListener("timeupdate",function(){a.displaySlides()}))}},cleartracks:function(a){a&&(a.captions&&a.captions.remove(),a.chapters&&a.chapters.remove(),a.captionsText&&a.captionsText.remove(),a.captionsButton&&a.captionsButton.remove(),a.chaptersButton&&a.chaptersButton.remove())},rebuildtracks:function(){var a=this;a.findTracks(),a.buildtracks(a,a.controls,a.layers,a.media)},findTracks:function(){var a=this,b=a.node.querySelectorAll("track"),c=b.length;a.tracks=[];for(var d=0;c>d;d++){var e=b[d],f=e.getAttribute("srclang").toLowerCase()||"",g=a.id+"_track_"+d+"_"+e.getAttribute("kind")+"_"+f;a.tracks.push({trackId:g,srclang:f,src:e.getAttribute("src"),kind:e.getAttribute("kind"),label:e.getAttribute("label")||"",entries:[],isLoaded:!1})}},setTrack:function(a){for(var b=this,c=b.captionsButton.querySelectorAll('input[type="radio"]'),d=b.captionsButton.querySelectorAll("."+b.options.classPrefix+"captions-selected"),e=b.captionsButton.querySelector('input[value="'+a+'"]'),f=0,g=c.length;g>f;f++)c[f].checked=!1;for(var h=0,i=d.length;i>h;h++)o.removeClass(d[h],b.options.classPrefix+"captions-selected");e.checked=!0;for(var j=o.siblings(e,function(a){return o.hasClass(a,b.options.classPrefix+"captions-selector-label")}),k=0,l=j.length;l>k;k++)o.addClass(j[k],b.options.classPrefix+"captions-selected");if("none"===a)b.selectedTrack=null,o.removeClass(b.captionsButton,b.options.classPrefix+"captions-enabled");else for(var m=0,p=b.tracks.length;p>m;m++){var q=b.tracks[m];if(q.trackId===a){null===b.selectedTrack&&o.addClass(b.captionsButton,b.options.classPrefix+"captions-enabled"),b.selectedTrack=q,b.captions.setAttribute("lang",b.selectedTrack.srclang),b.displayCaptions();break}}var r=n.createEvent("captionschange",b.media);r.detail.caption=b.selectedTrack,b.media.dispatchEvent(r)},loadNextTrack:function(){var a=this;a.trackToLoad++,a.trackToLoad<a.tracks.length?(a.isLoadingTrack=!0,a.loadTrack(a.trackToLoad)):(a.isLoadingTrack=!1,a.checkForTracks())},loadTrack:function(a){var b=this,c=b.tracks[a];void 0===c||void 0===c.src&&""===c.src||o.ajax(c.src,"text",function(a){c.entries="string"==typeof a&&/<tt\s+xml/gi.exec(a)?h["default"].TrackFormatParser.dfxp.parse(a):h["default"].TrackFormatParser.webvtt.parse(a),c.isLoaded=!0,b.enableTrackButton(c),b.loadNextTrack(),"slides"===c.kind?b.setupSlides(c):"chapters"!==c.kind||b.hasChapters||(b.drawChapters(c),b.hasChapters=!0)},function(){b.removeTrackButton(c.trackId),b.loadNextTrack()})},enableTrackButton:function(a){var b=this,c=a.srclang,d=f["default"].getElementById(""+a.trackId);if(d){var e=a.label;""===e&&(e=j["default"].t(h["default"].language.codes[c])||c),d.disabled=!1;for(var g=o.siblings(d,function(a){return o.hasClass(a,b.options.classPrefix+"captions-selector-label")}),i=0,k=g.length;k>i;i++)g[i].innerHTML=e;if(b.options.startLanguage===c){d.checked=!0;var l=n.createEvent("click",d);d.dispatchEvent(l)}}},removeTrackButton:function(a){var b=f["default"].getElementById(""+a);if(b){var c=b.closest("li");c&&c.remove()}},addTrackButton:function(a,b,c){var d=this;""===c&&(c=j["default"].t(h["default"].language.codes[b])||b),d.captionsButton.querySelector("ul").innerHTML+='<li class="'+d.options.classPrefix+'captions-selector-list-item">'+('<input type="radio" class="'+d.options.classPrefix+'captions-selector-input" ')+('name="'+d.id+'_captions" id="'+a+'" value="'+a+'" disabled>')+('<label class="'+d.options.classPrefix+'captions-selector-label">'+c+" (loading)</label>")+"</li>"},checkForTracks:function(){var a=this,b=!1;if(a.options.hideCaptionsButtonWhenEmpty){for(var c=0,d=a.tracks.length;d>c;c++){var e=a.tracks[c].kind;if(("subtitles"===e||"captions"===e)&&a.tracks[c].isLoaded){b=!0;break}}a.captionsButton.style.display=b?"":"none",a.setControlsSize()}},displayCaptions:function(){if(void 0!==this.tracks){var a=this,b=a.selectedTrack,c=function(a){var b=f["default"].createElement("div");b.innerHTML=a;for(var c=b.getElementsByTagName("script"),d=c.length;d--;)c[d].remove();for(var e=b.getElementsByTagName("*"),g=0,h=e.length;h>g;g++)for(var i=e[g].attributes,j=Array.prototype.slice.call(i),k=0,l=j.length;l>k;k++)j[k].name.startsWith("on")||j[k].value.startsWith("javascript")?e[g].remove():"style"===j[k].name&&e[g].removeAttribute(j[k].name);return b.innerHTML};if(null!==b&&b.isLoaded){var d=a.searchTrackPosition(b.entries,a.media.currentTime);if(d>-1)return a.captionsText.innerHTML=c(b.entries[d].text),a.captionsText.className=a.options.classPrefix+"captions-text "+(b.entries[d].identifier||""),a.captions.style.display="",void(a.captions.style.height="0px");a.captions.style.display="none"}else a.captions.style.display="none"}},setupSlides:function(a){var b=this;b.slides=a,b.slides.entries.imgs=[b.slides.entries.length],b.showSlide(0)},showSlide:function(a){var b=this,c=this;if(void 0!==c.tracks&&void 0!==c.slidesContainer){var d=c.slides.entries[a].text,e=c.slides.entries[a].imgs;void 0===e||void 0===e.fadeIn?!function(){var g=f["default"].createElement("img");g.src=d,g.addEventListener("load",function(){var a=b,d=o.siblings(a,function(a){return d(a)});a.style.display="none",c.slidesContainer.innerHTML+=a.innerHTML,o.fadeIn(c.slidesContainer.querySelector(g));for(var e=0,f=d.length;f>e;e++)o.fadeOut(d[e],400)}),c.slides.entries[a].imgs=e=g}():o.visible(e)||!function(){var a=o.siblings(self,function(b){return a(b)});o.fadeIn(c.slidesContainer.querySelector(e));for(var b=0,d=a.length;d>b;b++)o.fadeOut(a[b])}()}},displaySlides:function(){var a=this;if(void 0!==this.slides){var b=a.slides,c=a.searchTrackPosition(b.entries,a.media.currentTime);return c>-1?void a.showSlide(c):void 0}},drawChapters:function(a){var b=this,c=a.entries.length;if(c){b.chaptersButton.querySelector("ul").innerHTML="";for(var d=0;c>d;d++)b.chaptersButton.querySelector("ul").innerHTML+='<li class="'+b.options.classPrefix+'chapters-selector-list-item" role="menuitemcheckbox" aria-live="polite" aria-disabled="false" aria-checked="false">'+('<input type="radio" class="'+b.options.classPrefix+'captions-selector-input" ')+('name="'+b.id+'_chapters" value="'+a.entries[d].start+'" disabled>')+('<label class="'+b.options.classPrefix+'chapters-selector-label">'+a.entries[d].text+"</label>")+"</li>";for(var e=b.chaptersButton.querySelectorAll('input[type="radio"]'),f=b.chaptersButton.querySelectorAll("."+b.options.classPrefix+"chapters-selector-label"),g=0,h=e.length;h>g;g++)e[g].disabled=!1,e[g].checked=!1,e[g].addEventListener("click",function(){var a=this,c=b.chaptersButton.querySelectorAll("li"),d=o.siblings(a,function(a){return o.hasClass(a,b.options.classPrefix+"chapters-selector-label")})[0];a.checked=!0,a.parentNode.setAttribute("aria-checked",!0),o.addClass(d,b.options.classPrefix+"chapters-selected"),o.removeClass(b.chaptersButton.querySelector("."+b.options.classPrefix+"chapters-selected"),b.options.classPrefix+"chapters-selected");for(var e=0,f=c.length;f>e;e++)c[e].setAttribute("aria-checked",!1);b.media.setCurrentTime(parseFloat(a.value)),b.media.paused&&b.media.play()});for(var i=0,j=f.length;j>i;i++)f[i].addEventListener("click",function(){var a=o.siblings(this,function(a){return"INPUT"===a.tagName})[0],b=n.createEvent("click",a);a.dispatchEvent(b)})}},searchTrackPosition:function(a,b){for(var c=0,d=a.length-1,e=void 0,f=void 0,g=void 0;d>=c;){if(e=c+d>>1,f=a[e].start,g=a[e].stop,b>=f&&g>b)return e;b>f?c=e+1:f>b&&(d=e-1)}return-1}}),h["default"].language={codes:{af:"mejs.afrikaans",sq:"mejs.albanian",ar:"mejs.arabic",be:"mejs.belarusian",bg:"mejs.bulgarian",ca:"mejs.catalan",zh:"mejs.chinese","zh-cn":"mejs.chinese-simplified","zh-tw":"mejs.chines-traditional",hr:"mejs.croatian",cs:"mejs.czech",da:"mejs.danish",nl:"mejs.dutch",en:"mejs.english",et:"mejs.estonian",fl:"mejs.filipino",fi:"mejs.finnish",fr:"mejs.french",gl:"mejs.galician",de:"mejs.german",el:"mejs.greek",ht:"mejs.haitian-creole",iw:"mejs.hebrew",hi:"mejs.hindi",hu:"mejs.hungarian",is:"mejs.icelandic",id:"mejs.indonesian",ga:"mejs.irish",it:"mejs.italian",ja:"mejs.japanese",ko:"mejs.korean",lv:"mejs.latvian",lt:"mejs.lithuanian",mk:"mejs.macedonian",ms:"mejs.malay",mt:"mejs.maltese",no:"mejs.norwegian",fa:"mejs.persian",pl:"mejs.polish",pt:"mejs.portuguese",ro:"mejs.romanian",ru:"mejs.russian",sr:"mejs.serbian",sk:"mejs.slovak",sl:"mejs.slovenian",es:"mejs.spanish",sw:"mejs.swahili",sv:"mejs.swedish",tl:"mejs.tagalog",th:"mejs.thai",tr:"mejs.turkish",uk:"mejs.ukrainian",vi:"mejs.vietnamese",cy:"mejs.welsh",yi:"mejs.yiddish"}},h["default"].TrackFormatParser={webvtt:{pattern:/^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,parse:function(a){for(var b=a.split(/\r?\n/),c=[],d=void 0,e=void 0,f=void 0,g=0,h=b.length;h>g;g++){if(d=this.pattern.exec(b[g]),d&&g<b.length){for(g-1>=0&&""!==b[g-1]&&(f=b[g-1]),g++,e=b[g],g++;""!==b[g]&&g<b.length;)e=e+"\n"+b[g],g++;e=e.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi,"<a href='$1' target='_blank'>$1</a>"),c.push({identifier:f,start:0===m.convertSMPTEtoSeconds(d[1])?.2:m.convertSMPTEtoSeconds(d[1]),stop:m.convertSMPTEtoSeconds(d[3]),text:e,settings:d[5]})}f=""}return c}},dfxp:{parse:function(a){a=$(a).filter("tt");var b=a.firstChild,c=b.querySelectorAll("p"),d=a.getElementById(""+b.attr("style")),e=[],f=void 0;if(d.length){d.removeAttribute("id");var g=d.attributes;if(g.length){f={};for(var h=0,i=g.length;i>h;h++)f[g[h].name.split(":")[1]]=g[h].value}}for(var j=0,k=c.length;k>j;j++){var l=void 0,n={start:null,stop:null,style:null,text:null};if(c.eq(j).attr("begin")&&(n.start=m.convertSMPTEtoSeconds(c.eq(j).attr("begin"))),!n.start&&c.eq(j-1).attr("end")&&(n.start=m.convertSMPTEtoSeconds(c.eq(j-1).attr("end"))),c.eq(j).attr("end")&&(n.stop=m.convertSMPTEtoSeconds(c.eq(j).attr("end"))),!n.stop&&c.eq(j+1).attr("begin")&&(n.stop=m.convertSMPTEtoSeconds(c.eq(j+1).attr("begin"))),f){l="";for(var o in f)l+=o+":"+f[o]+";"}l&&(n.style=l),0===n.start&&(n.start=.2),n.text=c.eq(j).innerHTML.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi,"<a href='$1' target='_blank'>$1</a>"),e.push(n)}return e}}}},{16:16,2:2,24:24,25:25,28:28,4:4,6:6}],13:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(4),j=d(i),k=a(23),l=a(25),m=a(24);Object.assign(g.config,{muteText:null,unmuteText:null,allyVolumeControlText:null,hideVolumeOnTouchDevices:!0,audioVolume:"horizontal",videoVolume:"vertical"}),Object.assign(h["default"].prototype,{buildvolume:function(a,b,c,d){if(!k.IS_ANDROID&&!k.IS_IOS||!this.options.hideVolumeOnTouchDevices){var e=this,g=e.isVideo?e.options.videoVolume:e.options.audioVolume,h=l.isString(e.options.muteText)?e.options.muteText:j["default"].t("mejs.mute"),i=l.isString(e.options.unmuteText)?e.options.unmuteText:j["default"].t("mejs.unmute"),n=l.isString(e.options.allyVolumeControlText)?e.options.allyVolumeControlText:j["default"].t("mejs.volume-help-text"),o=f["default"].createElement("div");if(o.className=e.options.classPrefix+"button "+e.options.classPrefix+"volume-button "+e.options.classPrefix+"mute",o.innerHTML="horizontal"===g?'<button type="button" aria-controls="'+e.id+'" title="'+h+'" aria-label="'+h+'" tabindex="0"></button>':'<button type="button" aria-controls="'+e.id+'" title="'+h+'" aria-label="'+h+'" tabindex="0"></button>'+('<a href="javascript:void(0);" class="'+e.options.classPrefix+'volume-slider">')+('<span class="'+e.options.classPrefix+'offscreen">'+n+"</span>")+('<div class="'+e.options.classPrefix+'volume-total">')+('<div class="'+e.options.classPrefix+'volume-current"></div>')+('<div class="'+e.options.classPrefix+'volume-handle"></div>')+"</div></a>",e.addControlElement(o,"volume"),"horizontal"===g){var p=f["default"].createElement("a");p.className=e.options.classPrefix+"horizontal-volume-slider",p.href="javascript:void(0);",p.innerHTML+='<span class="'+e.options.classPrefix+'offscreen">'+n+"</span>"+('<div class="'+e.options.classPrefix+'horizontal-volume-total">')+('<div class="'+e.options.classPrefix+'horizontal-volume-current"></div>')+('<div class="'+e.options.classPrefix+'horizontal-volume-handle"></div>')+"</div>",o.parentNode.insertBefore(p,o.nextSibling)}var q="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-slider"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-slider"),r="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-total"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-total"),s="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-current"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-current"),t="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-handle"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-handle"),u=o.firstElementChild,v=function(a){if(a=Math.max(0,a),a=Math.min(a,1),0===a){m.removeClass(o,e.options.classPrefix+"mute"),m.addClass(o,e.options.classPrefix+"unmute");var b=o.firstElementChild;b.setAttribute("title",i),b.setAttribute("aria-label",i)}else{m.removeClass(o,e.options.classPrefix+"unmute"),m.addClass(o,e.options.classPrefix+"mute");var c=o.firstElementChild;c.setAttribute("title",h),c.setAttribute("aria-label",h)}var d=100*a+"%",f=getComputedStyle(t);"vertical"===g?(s.style.bottom=0,s.style.height=d,t.style.bottom=d,t.style.marginBottom=-parseFloat(f.height)/2+"px"):(s.style.left=0,s.style.width=d,t.style.left=d,t.style.marginLeft=-parseFloat(f.width)/2+"px")},w=function(a){var b=m.offset(r),c=getComputedStyle(r),e=null;if("vertical"===g){var f=parseFloat(c.height),h=a.pageY-b.top;if(e=(f-h)/f,0===b.top||0===b.left)return}else{var i=parseFloat(c.width),j=a.pageX-b.left;e=j/i}e=Math.max(0,e),e=Math.min(e,1),v(e),0===e?d.setMuted(!0):d.setMuted(!1),d.setVolume(e),a.preventDefault(),a.stopPropagation()};o.addEventListener("mouseenter",function(a){a.target===o&&(q.style.display="block",y=!0,a.preventDefault(),a.stopPropagation())}),o.addEventListener("focusin",function(){q.style.display="block",y=!0}),o.addEventListener("mouseleave",function(){y=!1,x||"vertical"!==g||(q.style.display="none")}),o.addEventListener("focusout",function(){y=!1,x||"vertical"!==g||(q.style.display="none")}),o.addEventListener("keydown",function(a){if(e.options.keyActions.length){var b=a.which||a.keyCode||0,c=d.volume;switch(b){case 38:c=Math.min(c+.1,1);break;case 40:c=Math.max(0,c-.1);break;default:return!0}x=!1,v(c),d.setVolume(c),a.preventDefault(),a.stopPropagation()}});var x=!1,y=!1,z=function(){var a=Math.floor(100*d.volume);q.setAttribute("aria-label",j["default"].t("mejs.volume-slider")),q.setAttribute("aria-valuemin",0),q.setAttribute("aria-valuemax",100),q.setAttribute("aria-valuenow",a),q.setAttribute("aria-valuetext",a+"%"),q.setAttribute("role","slider"),q.tabIndex=-1};q.addEventListener("dragstart",function(){return!1}),q.addEventListener("mouseover",function(){y=!0}),q.addEventListener("mousedown",function(a){w(a),e.globalBind("mousemove.vol",function(a){var b=a.target;x&&(b===q||b.closest("vertical"===g?"."+e.options.classPrefix+"volume-slider":"."+e.options.classPrefix+"horizontal-volume-slider"))&&w(a)}),e.globalBind("mouseup.vol",function(){x=!1,e.globalUnbind("mousemove.vol mouseup.vol"),y||"vertical"!==g||(q.style.display="none")}),x=!0,a.preventDefault(),a.stopPropagation()}),u.addEventListener("click",function(){d.setMuted(!d.muted);var a=l.createEvent("volumechange",d);d.dispatchEvent(a)}),u.addEventListener("focus",function(){"vertical"===g&&(q.style.display="block")}),u.addEventListener("blur",function(){"vertical"===g&&(q.style.display="none")}),d.addEventListener("volumechange",function(a){x||(d.muted?(v(0),m.removeClass(o,e.options.classPrefix+"mute"),m.addClass(o,e.options.classPrefix+"unmute")):(v(d.volume),m.removeClass(o,e.options.classPrefix+"unmute"),m.addClass(o,e.options.classPrefix+"mute"))),z(a)}),0===a.options.startVolume&&d.setMuted(!0);var A=null!==e.media.rendererName&&null!==e.media.rendererName.match(/(native|html5)/);A&&d.setVolume(a.options.startVolume),e.container.addEventListener("controlsresize",function(){d.muted?(v(0),m.removeClass(o,e.options.classPrefix+"mute"),m.addClass(o,e.options.classPrefix+"unmute")):(v(d.volume),m.removeClass(o,e.options.classPrefix+"unmute"),m.addClass(o,e.options.classPrefix+"mute"))})}}})},{16:16,2:2,23:23,24:24,25:25,4:4}],14:[function(a,b,c){"use strict";/*! + * This is a `i18n` language object. + * + * English; This can serve as a template for other languages to translate + * + * @author + * TBD + * Sascha Greuel (Twitter: @SoftCreatR) + * + * @see core/i18n.js + */ +Object.defineProperty(c,"__esModule",{value:!0});c.EN={"mejs.plural-form":1,"mejs.download-file":"Download File","mejs.install-flash":"You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/","mejs.fullscreen":"Fullscreen","mejs.play":"Play","mejs.pause":"Pause","mejs.time-slider":"Time Slider","mejs.time-help-text":"Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.","mejs.live-broadcast":"Live Broadcast","mejs.volume-help-text":"Use Up/Down Arrow keys to increase or decrease volume.","mejs.unmute":"Unmute","mejs.mute":"Mute","mejs.volume-slider":"Volume Slider","mejs.video-player":"Video Player","mejs.audio-player":"Audio Player","mejs.captions-subtitles":"Captions/Subtitles","mejs.captions-chapters":"Chapters","mejs.none":"None","mejs.afrikaans":"Afrikaans","mejs.albanian":"Albanian","mejs.arabic":"Arabic","mejs.belarusian":"Belarusian","mejs.bulgarian":"Bulgarian","mejs.catalan":"Catalan","mejs.chinese":"Chinese","mejs.chinese-simplified":"Chinese (Simplified)","mejs.chinese-traditional":"Chinese (Traditional)","mejs.croatian":"Croatian","mejs.czech":"Czech","mejs.danish":"Danish","mejs.dutch":"Dutch","mejs.english":"English","mejs.estonian":"Estonian","mejs.filipino":"Filipino","mejs.finnish":"Finnish","mejs.french":"French","mejs.galician":"Galician","mejs.german":"German","mejs.greek":"Greek","mejs.haitian-creole":"Haitian Creole","mejs.hebrew":"Hebrew","mejs.hindi":"Hindi","mejs.hungarian":"Hungarian","mejs.icelandic":"Icelandic","mejs.indonesian":"Indonesian","mejs.irish":"Irish","mejs.italian":"Italian","mejs.japanese":"Japanese","mejs.korean":"Korean","mejs.latvian":"Latvian","mejs.lithuanian":"Lithuanian","mejs.macedonian":"Macedonian","mejs.malay":"Malay","mejs.maltese":"Maltese","mejs.norwegian":"Norwegian","mejs.persian":"Persian","mejs.polish":"Polish","mejs.portuguese":"Portuguese","mejs.romanian":"Romanian","mejs.russian":"Russian","mejs.serbian":"Serbian","mejs.slovak":"Slovak","mejs.slovenian":"Slovenian","mejs.spanish":"Spanish","mejs.swahili":"Swahili","mejs.swedish":"Swedish","mejs.tagalog":"Tagalog","mejs.thai":"Thai","mejs.turkish":"Turkish","mejs.ukrainian":"Ukrainian","mejs.vietnamese":"Vietnamese","mejs.welsh":"Welsh","mejs.yiddish":"Yiddish"}},{}],15:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(6),h=d(g);"undefined"!=typeof jQuery?h["default"].$=f["default"].jQuery=f["default"].$=jQuery:"undefined"!=typeof Zepto?h["default"].$=f["default"].Zepto=f["default"].$=Zepto:"undefined"!=typeof ender&&(h["default"].$=f["default"].ender=f["default"].$=ender)},{3:3,6:6}],16:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0}),c.config=void 0;var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},h=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),i=a(3),j=e(i),k=a(2),l=e(k),m=a(6),n=e(m),o=a(5),p=e(o),q=a(4),r=e(q),s=a(23),t=a(25),u=a(28),v=a(26),w=a(24),x=d(w);n["default"].mepIndex=0,n["default"].players={};var y=c.config={poster:"",showPosterWhenEnded:!1,showPosterWhenPaused:!1,defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:40,defaultSeekBackwardInterval:function(a){return.05*a.duration},defaultSeekForwardInterval:function(a){return.05*a.duration},setDimensions:!0,audioWidth:-1,audioHeight:-1,startVolume:.8,loop:!1,autoRewind:!0,enableAutosize:!0,timeFormat:"",alwaysShowHours:!1,showTimecodeFrameCount:!1,framesPerSecond:25,alwaysShowControls:!1,hideVideoControlsOnLoad:!1,hideVideoControlsOnPause:!1,clickToPlayPause:!0,controlsTimeoutDefault:1500,controlsTimeoutMouseEnter:2500,controlsTimeoutMouseLeave:1e3,iPadUseNativeControls:!1,iPhoneUseNativeControls:!1,AndroidUseNativeControls:!1,features:["playpause","current","progress","duration","tracks","volume","fullscreen"],isVideo:!0,stretching:"auto",classPrefix:"mejs__",enableKeyboard:!0,pauseOtherPlayers:!0,secondsDecimalLength:0,keyActions:[{keys:[32,179],action:function(a,b){s.IS_FIREFOX||(b.paused||b.ended?b.play():b.pause())}},{keys:[38],action:function(a,b){(a.container.querySelector("."+y.classPrefix+"volume-button>button").matches(":focus")||a.container.querySelector("."+y.classPrefix+"volume-slider").matches(":focus"))&&(a.container.querySelector("."+y.classPrefix+"volume-slider").style.display=""),a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.min(b.volume+.1,1);b.setVolume(c),c>0&&b.setMuted(!1)}},{keys:[40],action:function(a,b){(a.container.querySelector("."+y.classPrefix+"volume-button>button").matches(":focus")||a.container.querySelector("."+y.classPrefix+"volume-slider").matches(":focus"))&&(a.container.querySelector("."+y.classPrefix+"volume-slider").style.display=""),a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.max(b.volume-.1,0);b.setVolume(c),.1>=c&&b.setMuted(!0)}},{keys:[37,227],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.max(b.currentTime-a.options.defaultSeekBackwardInterval(b),0);b.setCurrentTime(c)}}},{keys:[39,228],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.min(b.currentTime+a.options.defaultSeekForwardInterval(b),b.duration);b.setCurrentTime(c)}}},{keys:[70],action:function(a,b,c,d){d.ctrlKey||"undefined"!=typeof a.enterFullScreen&&(a.isFullScreen?a.exitFullScreen():a.enterFullScreen())}},{keys:[77],action:function(a){a.container.querySelector("."+y.classPrefix+"volume-slider").style.display="",a.isVideo&&(a.showControls(),a.startControlsTimer()),a.media.muted?a.setMuted(!1):a.setMuted(!0)}}]};n["default"].MepDefaults=y;var z=function(){function a(b,c){f(this,a);var d=this,e="string"==typeof b?l["default"].getElementById(b):b;if(d.hasFocus=!1,d.controlsAreVisible=!0,d.controlsEnabled=!0,d.controlsTimer=null,!(d instanceof a))return new a(e,c);if(d.node=d.media=e,d.node){if(void 0!==d.media.player)return d.media.player;void 0===c&&(c=d.node.getAttribute("data-mejsoptions")),d.options=Object.assign({},y,c),d.options.timeFormat||(d.options.timeFormat="mm:ss",d.options.alwaysShowHours&&(d.options.timeFormat="hh:mm:ss"),d.options.showTimecodeFrameCount&&(d.options.timeFormat+=":ff")),u.calculateTimeFormat(0,d.options,d.options.framesPerSecond||25),d.id="mep_"+n["default"].mepIndex++,n["default"].players[d.id]=d;var g=Object.assign({},d.options,{success:function(a,b){d._meReady(a,b)},error:function(a){d._handleError(a)}}),h=d.node.tagName.toLowerCase();if(d.isDynamic="audio"!==h&&"video"!==h,d.isVideo=d.isDynamic?d.options.isVideo:"audio"!==h&&d.options.isVideo,s.IS_IPAD&&d.options.iPadUseNativeControls||s.IS_IPHONE&&d.options.iPhoneUseNativeControls)d.node.setAttribute("controls",!0),s.IS_IPAD&&d.node.getAttribute("autoplay")&&d.play();else if(!(d.isVideo||!d.isVideo&&d.options.features.length)||s.IS_ANDROID&&d.options.AndroidUseNativeControls)d.isVideo||d.options.features.length||(d.node.style.display="none");else{d.node.removeAttribute("controls");var i=d.isVideo?r["default"].t("mejs.video-player"):r["default"].t("mejs.audio-player"),j=l["default"].createElement("span");if(j.className=d.options.classPrefix+"offscreen",j.innerText=i,d.media.parentNode.insertBefore(j,d.media),d.container=l["default"].createElement("div"),d.container.id=d.id,d.container.className=d.options.classPrefix+"container "+d.options.classPrefix+"container-keyboard-inactive "+d.media.className,d.container.tabIndex=0,d.container.setAttribute("role","application"),d.container.setAttribute("aria-label",i),d.container.innerHTML='<div class="'+d.options.classPrefix+'inner">'+('<div class="'+d.options.classPrefix+'layers"></div>')+('<div class="'+d.options.classPrefix+'controls"></div>')+('<div class="'+d.options.classPrefix+'mediaelement"></div>')+('<div class="'+d.options.classPrefix+'clear"></div>')+"</div>",d.container.addEventListener("focus",function(a){if(!d.controlsAreVisible&&!d.hasFocus&&d.controlsEnabled&&(d.showControls(!0),!s.HAS_MS_NATIVE_FULLSCREEN)){var b=t.isNodeAfter(a.relatedTarget,d.container)?"."+d.options.classPrefix+"controls ."+d.options.classPrefix+"button:last-child > button":"."+d.options.classPrefix+"playpause-button > button",c=d.container.querySelector(b);c.focus()}}),d.node.parentNode.insertBefore(d.container,d.node),d.options.features.length||(d.container.style.background="transparent",d.container.querySelector("."+d.options.classPrefix+"controls").style.display="none"),d.isVideo&&"fill"===d.options.stretching&&!x.hasClass(d.container.parentNode,d.options.classPrefix+"fill-container")){d.outerContainer=d.media.parentNode;var k=l["default"].createElement("div");k.className=d.options.classPrefix+"fill-container",d.container.parentNode.insertBefore(k,d.container),k.appendChild(d.container)}s.IS_ANDROID&&x.addClass(d.container,d.options.classPrefix+"android"),s.IS_IOS&&x.addClass(d.container,d.options.classPrefix+"ios"),s.IS_IPAD&&x.addClass(d.container,d.options.classPrefix+"ipad"),s.IS_IPHONE&&x.addClass(d.container,d.options.classPrefix+"iphone"),x.addClass(d.container,d.isVideo?d.options.classPrefix+"video":d.options.classPrefix+"audio"),d.container.querySelector("."+d.options.classPrefix+"mediaelement").appendChild(d.node),d.media.player=d,d.controls=d.container.querySelector("."+d.options.classPrefix+"controls"),d.layers=d.container.querySelector("."+d.options.classPrefix+"layers");var m=d.isVideo?"video":"audio",o=m.substring(0,1).toUpperCase()+m.substring(1);d.options[m+"Width"]>0||d.options[m+"Width"].toString().indexOf("%")>-1?d.width=d.options[m+"Width"]:""!==d.node.style.width&&null!==d.node.style.width?d.width=d.node.style.width:d.node.getAttribute("width")?d.width=d.node.getAttribute("width"):d.width=d.options["default"+o+"Width"],d.options[m+"Height"]>0||d.options[m+"Height"].toString().indexOf("%")>-1?d.height=d.options[m+"Height"]:""!==d.node.style.height&&null!==d.node.style.height?d.height=d.node.style.height:d.node.getAttribute("height")?d.height=d.node.getAttribute("height"):d.height=d.options["default"+o+"Height"],d.initialAspectRatio=d.height>=d.width?d.width/d.height:d.height/d.width,d.setPlayerSize(d.width,d.height),g.pluginWidth=d.width,g.pluginHeight=d.height}if(new p["default"](d.media,g),void 0!==d.container&&d.options.features.length&&d.controlsAreVisible&&!d.options.hideVideoControlsOnLoad){var q=t.createEvent("controlsshown",d.container);d.container.dispatchEvent(q)}return d}}return h(a,[{key:"showControls",value:function(a){var b=this;if(a=void 0===a||a,!b.controlsAreVisible){if(a)!function(){x.removeClass(b.controls,b.options.classPrefix+"offscreen"),x.fadeIn(b.controls,200,function(){var a=t.createEvent("controlsshown",b.container);b.container.dispatchEvent(a)});for(var a=b.container.querySelectorAll("."+b.options.classPrefix+"control"),c=function(c,d){x.fadeIn(a[c],200,function(){x.removeClass(a[c],b.options.classPrefix+"offscreen")})},d=0,e=a.length;e>d;d++)c(d,e)}();else{x.removeClass(b.controls,b.options.classPrefix+"offscreen"),b.controls.style.display="";for(var c=b.container.querySelectorAll("."+b.options.classPrefix+"control"),d=0,e=c.length;e>d;d++)x.removeClass(c[d],b.options.classPrefix+"offscreen"),c[d].style.display="";var f=t.createEvent("controlsshown",b.container);b.container.dispatchEvent(f)}b.controlsAreVisible=!0,b.setControlsSize()}}},{key:"hideControls",value:function(a,b){var c=this;if(a=void 0===a||a,b===!0||!(!c.controlsAreVisible||c.options.alwaysShowControls||c.keyboardAction||c.media.paused&&4===c.media.readyState&&(!c.options.hideVideoControlsOnLoad&&c.media.currentTime<=0||!c.options.hideVideoControlsOnPause&&c.media.currentTime>0)||c.isVideo&&!c.options.hideVideoControlsOnLoad&&!c.media.readyState||c.media.ended)){if(a)!function(){x.fadeOut(c.controls,200,function(){x.addClass(c.controls,c.options.classPrefix+"offscreen"),c.controls.style.display="";var a=t.createEvent("controlshidden",c.container);c.container.dispatchEvent(a)});for(var a=c.container.querySelectorAll("."+c.options.classPrefix+"control"),b=function(b,d){x.fadeOut(a[b],200,function(){x.addClass(a[b],c.options.classPrefix+"offscreen"),a[b].style.display=""})},d=0,e=a.length;e>d;d++)b(d,e)}();else{x.addClass(c.controls,c.options.classPrefix+"offscreen"),c.controls.style.display="";for(var d=c.container.querySelectorAll("."+c.options.classPrefix+"control"),e=0,f=d.length;f>e;e++)x.addClass(d[e],c.options.classPrefix+"offscreen"),d[e].style.display="";var g=t.createEvent("controlshidden",c.container);c.container.dispatchEvent(g)}c.controlsAreVisible=!1}}},{key:"startControlsTimer",value:function(a){var b=this;a="undefined"!=typeof a?a:b.options.controlsTimeoutDefault,b.killControlsTimer("start"),b.controlsTimer=setTimeout(function(){b.hideControls(),b.killControlsTimer("hide")},a)}},{key:"killControlsTimer",value:function(){var a=this;null!==a.controlsTimer&&(clearTimeout(a.controlsTimer),delete a.controlsTimer,a.controlsTimer=null)}},{key:"disableControls",value:function(){var a=this;a.killControlsTimer(),a.controlsEnabled=!0,a.hideControls(!1,!0)}},{key:"enableControls",value:function(){var a=this;a.controlsEnabled=!0,a.showControls(!1)}},{key:"_meReady",value:function(a,b){var c=this,d=b.getAttribute("autoplay"),e=!(void 0===d||null===d||"false"===d),f=null!==a.rendererName&&null!==a.rendererName.match(/(native|html5)/);if(c.controls&&c.enableControls(),c.container.querySelector("."+c.options.classPrefix+"overlay-play")&&(c.container.querySelector("."+c.options.classPrefix+"overlay-play").style.display=""),!c.created){if(c.created=!0,c.media=a,c.domNode=b,!(s.IS_ANDROID&&c.options.AndroidUseNativeControls||s.IS_IPAD&&c.options.iPadUseNativeControls||s.IS_IPHONE&&c.options.iPhoneUseNativeControls)){var h=function(){if(!c.isVideo&&!c.options.features.length)return e&&f&&c.play(),c.options.success&&("string"==typeof c.options.success?j["default"][c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c)),{v:void 0};c.buildposter(c,c.controls,c.layers,c.media),c.buildkeyboard(c,c.controls,c.layers,c.media),c.buildoverlays(c,c.controls,c.layers,c.media),c.findTracks(),c.featurePosition={};for(var a=0,b=c.options.features.length;b>a;a++){var d=c.options.features[a];if(c["build"+d])try{c["build"+d](c,c.controls,c.layers,c.media)}catch(g){console.error("error building "+d,g)}}var h=t.createEvent("controlsready",c.container);c.container.dispatchEvent(h),c.setPlayerSize(c.width,c.height),c.setControlsSize(),c.isVideo&&(c.clickToPlayPauseCallback=function(){if(c.options.clickToPlayPause){var a=c.container.querySelector("."+c.options.classPrefix+"overlay-button"),b=a.getAttribute("aria-pressed");c.media.paused&&b?c.pause():c.media.paused?c.play():c.pause(),a.setAttribute("aria-pressed",!b)}},c.createIframeLayer(),c.media.addEventListener("click",c.clickToPlayPauseCallback),!s.IS_ANDROID&&!s.IS_IOS||c.options.alwaysShowControls?(c.container.addEventListener("mouseenter",function(){c.controlsEnabled&&(c.options.alwaysShowControls||(c.killControlsTimer("enter"),c.showControls(),c.startControlsTimer(c.options.controlsTimeoutMouseEnter)))}),c.container.addEventListener("mousemove",function(){c.controlsEnabled&&(c.controlsAreVisible||c.showControls(),c.options.alwaysShowControls||c.startControlsTimer(c.options.controlsTimeoutMouseEnter))}),c.container.addEventListener("mouseleave",function(){c.controlsEnabled&&(c.media.paused||c.options.alwaysShowControls||c.startControlsTimer(c.options.controlsTimeoutMouseLeave))})):c.node.addEventListener("touchstart",function(){c.controlsAreVisible?c.hideControls(!1):c.controlsEnabled&&c.showControls(!1)}),c.options.hideVideoControlsOnLoad&&c.hideControls(!1),e&&!c.options.alwaysShowControls&&c.hideControls(),c.options.enableAutosize&&c.media.addEventListener("loadedmetadata",function(a){c.options.videoHeight<=0&&!c.domNode.getAttribute("height")&&null!==a.target&&!isNaN(a.target.videoHeight)&&(c.setPlayerSize(a.target.videoWidth,a.target.videoHeight),c.setControlsSize(),c.media.setSize(a.target.videoWidth,a.target.videoHeight))})),c.media.addEventListener("play",function(){c.hasFocus=!0;for(var a in n["default"].players)if(n["default"].players.hasOwnProperty(a)){var b=n["default"].players[a];b.id===c.id||!c.options.pauseOtherPlayers||b.paused||b.ended||(b.pause(),b.hasFocus=!1)}}),c.media.addEventListener("ended",function(){if(c.options.autoRewind)try{c.media.setCurrentTime(0),setTimeout(function(){c.container.querySelector("."+c.options.classPrefix+"overlay-loading").parentNode.style.display="none"},20)}catch(a){}"function"==typeof c.media.stop?c.media.stop():c.media.pause(),c.setProgressRail&&c.setProgressRail(),c.setCurrentRail&&c.setCurrentRail(),c.options.loop?c.play():!c.options.alwaysShowControls&&c.controlsEnabled&&c.showControls()}),c.media.addEventListener("loadedmetadata",function(){u.calculateTimeFormat(c.duration,c.options,c.options.framesPerSecond||25),c.updateDuration&&c.updateDuration(),c.updateCurrent&&c.updateCurrent(),c.isFullScreen||(c.setPlayerSize(c.width,c.height),c.setControlsSize())});var i=null;c.media.addEventListener("timeupdate",function(){i!==c.media.duration&&(i=c.media.duration,u.calculateTimeFormat(i,c.options,c.options.framesPerSecond||25),c.updateDuration&&c.updateDuration(),c.updateCurrent&&c.updateCurrent(),c.setControlsSize())}),c.container.addEventListener("focusout",function(a){setTimeout(function(){a.relatedTarget&&c.keyboardAction&&!a.relatedTarget.closest(".mejs-container")&&(c.keyboardAction=!1,c.isVideo&&!c.options.alwaysShowControls&&c.hideControls(!0))},0)}),setTimeout(function(){c.setPlayerSize(c.width,c.height),c.setControlsSize()},0),c.globalBind("resize",function(){c.isFullScreen||s.HAS_TRUE_NATIVE_FULLSCREEN&&l["default"].webkitIsFullScreen||c.setPlayerSize(c.width,c.height),c.setControlsSize()}),c.globalBind("click",function(a){a.target.matches("."+c.options.classPrefix+"container")?x.addClass(a.target,c.options.classPrefix+"container-keyboard-inactive"):a.target.closest("."+c.options.classPrefix+"container")&&x.addClass(a.target.closest("."+c.options.classPrefix+"container"),c.options.classPrefix+"container-keyboard-inactive")}),c.globalBind("keydown",function(a){a.target.matches("."+c.options.classPrefix+"container")?x.removeClass(a.target,c.options.classPrefix+"container-keyboard-inactive"):a.target.closest("."+c.options.classPrefix+"container")&&x.removeClass(h.target.closest("."+c.options.classPrefix+"container"),c.options.classPrefix+"container-keyboard-inactive")})}();if("object"===("undefined"==typeof h?"undefined":g(h)))return h.v}e&&f&&c.play(),c.options.success&&("string"==typeof c.options.success?j["default"][c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c))}}},{key:"_handleError",value:function(a){var b=this;b.controls&&b.disableControls();var c=b.layers.querySelector("."+b.options.classPrefix+"overlay-play");c&&(c.style.display="none"),b.options.error&&b.options.error(a)}},{key:"setPlayerSize",value:function(a,b){var c=this;if(!c.options.setDimensions)return!1;if("undefined"!=typeof a&&(c.width=a),"undefined"!=typeof b&&(c.height=b),"undefined"!=typeof FB&&c.isVideo){FB.Event.subscribe("xfbml.ready",function(){var a=c.media.firstChild;return c.width=parseFloat(a.offsetWidth),c.height=parseFloat(a.offsetHeight),c.setDimensions(c.width,c.height),!1});var d=c.media.firstChild;d.length&&(c.width=d.offsetWidth,c.height=d.offsetHeight)}switch(c.options.stretching){case"fill":c.isVideo?c.setFillMode():c.setDimensions(c.width,c.height);break;case"responsive":c.setResponsiveMode();break;case"none":c.setDimensions(c.width,c.height);break;default:c.hasFluidMode()===!0?c.setResponsiveMode():c.setDimensions(c.width,c.height)}}},{key:"hasFluidMode",value:function(){var a=this;return a.height.toString().includes("%")||a.node.style.maxWidth&&"none"!==a.node.style.maxWidth&&a.node.style.maxWidth!==a.width||a.node.currentStyle&&"100%"===a.node.currentStyle.maxWidth}},{key:"setResponsiveMode",value:function(){var a=this,b=function(){for(var b=void 0,c=a.container;c;){if(b=c.parentElement,b&&x.visible(b))return b;c=b}return null}(),c=getComputedStyle(b,null),d=function(){return a.isVideo?a.media.videoWidth&&a.media.videoWidth>0?a.media.videoWidth:a.node.getAttribute("width")?a.node.getAttribute("width"):a.options.defaultVideoWidth:a.options.defaultAudioWidth}(),e=function(){return a.isVideo?a.media.videoHeight&&a.media.videoHeight>0?a.media.videoHeight:a.node.getAttribute("height")?a.node.getAttribute("height"):a.options.defaultVideoHeight:a.options.defaultAudioHeight}(),f=function(){var b=1;return a.isVideo?(b=a.media.videoWidth&&a.media.videoWidth>0&&a.media.videoHeight&&a.media.videoHeight>0?a.height>=a.width?a.media.videoWidth/a.media.videoHeight:a.media.videoHeight/a.media.videoWidth:a.initialAspectRatio,(isNaN(b)||.01>b||b>100)&&(b=1),b):b}(),g=parseFloat(c.height),h=void 0,i=parseFloat(c.width);if(h=a.isVideo?"100%"===a.height?parseInt(i*e/d,10):a.height>=a.width?parseInt(i/f,10):parseInt(i*f,10):e,isNaN(h)&&(h=g),a.container.parentNode.length>0&&"body"===a.container.parentNode.tagName.toLowerCase()&&(i=j["default"].innerWidth||l["default"].documentElement.clientWidth||l["default"].body.clientWidth,h=j["default"].innerHeight||l["default"].documentElement.clientHeight||l["default"].body.clientHeight),h&&i){a.container.style.width=i+"px",a.container.style.height=h+"px",a.node.style.width="100%",a.node.style.height="100%",a.isVideo&&a.media.setSize&&a.media.setSize(i,h);for(var k=a.layers.childNodes,m=0,n=k.length;n>m;m++)k[m].style.width="100%",k[m].style.height="100%"}}},{key:"setFillMode",value:function(){var a=this,b=a.outerContainer,c=getComputedStyle(b);"none"!==a.node.style.height&&a.node.style.height!==a.height&&(a.node.style.height=""),"none"!==a.node.style.maxWidth&&a.node.style.maxWidth!==a.width&&(a.node.style.maxWidth=""),"none"!==a.node.style.maxHeight&&a.node.style.maxHeight!==a.height&&(a.node.style.maxHeight=""),a.node.currentStyle&&("100%"===a.node.currentStyle.height&&(a.node.currentStyle.height=""),"100%"===a.node.currentStyle.maxWidth&&(a.node.currentStyle.maxWidth=""),"100%"===a.node.currentStyle.maxHeight&&(a.node.currentStyle.maxHeight="")),parseFloat(c.width)||(b.style.width=a.media.offsetWidth+"px"),parseFloat(c.height)||(b.style.height=a.media.offsetHeight+"px"),c=getComputedStyle(b);var d=parseFloat(c.width),e=parseFloat(c.height);a.setDimensions("100%","100%");var f=a.container.querySelector(a.options.classPrefix+"poster img");f&&(f.style.display="");for(var g=a.container.querySelectorAll("object, embed, iframe, video"),h=a.height,i=a.width,j=d,k=h*d/i,l=i*e/h,m=e,n=l>d==!1,o=n?Math.floor(j):Math.floor(l),p=n?Math.floor(k):Math.floor(m),q=n?d+"px":o+"px",r=n?p+"px":e+"px",s=0,t=g.length;t>s;s++)g[s].style.height=r,g[s].style.width=q,a.media.setSize&&a.media.setSize(q,r),g[s].style.marginLeft=Math.floor((d-o)/2)+"px",g[s].style.marginTop=0}},{key:"setDimensions",value:function(a,b){var c=this;a=t.isString(a)&&a.includes("%")?a:parseFloat(a)+"px",b=t.isString(b)&&b.includes("%")?b:parseFloat(b)+"px",c.container.style.width=a,c.container.style.height=b;for(var d=c.layers.childNodes,e=0,f=d.length;f>e;e++)d[e].style.width=a,d[e].style.height=b}},{key:"setControlsSize",value:function(){var a=this;if(x.visible(a.container)&&a.rail&&x.visible(a.rail)){for(var b=getComputedStyle(a.rail),c=getComputedStyle(a.total),d=parseFloat(b.marginLeft)+parseFloat(b.marginRight),e=parseFloat(c.marginLeft)+parseFloat(c.marginRight)||0,f=0,g=x.siblings(a.rail,function(b){return b!==a.rail}),h=g.length,i=0;h>i;i++)f+=g[i].offsetWidth;f+=e+(0===e?2*d:d)+1;var j=parseFloat(a.controls.offsetWidth);a.rail.style.width=(f>j?0:j-f)+"px";var k=t.createEvent("controlsresize",a.container);a.container.dispatchEvent(k)}}},{key:"addControlElement",value:function(a,b){var c=this;if(void 0!==c.featurePosition[b]){var d=c.controls.childNodes[c.featurePosition[b]-1];d.parentNode.insertBefore(a,d.nextSibling)}else{c.controls.appendChild(a);for(var e=c.controls.childNodes,f=0,g=e.length;g>f;f++)if(a==e[f]){c.featurePosition[b]=f;break}}}},{key:"createIframeLayer",value:function(){var a=this;if(a.isVideo&&null!==a.media.rendererName&&null!==a.media.rendererName.match(/iframe/i)&&!l["default"].getElementById(a.media.id+"-iframe-overlay")){var b=l["default"].createElement("div"),c=l["default"].getElementById(a.media.id+"_"+a.media.rendererName);b.id=a.media.id+"-iframe-overlay",b.className=a.options.classPrefix+"iframe-overlay",b.addEventListener("click",function(b){a.options.clickToPlayPause&&(a.media.paused?a.media.play():a.media.pause(),b.preventDefault(),b.stopPropagation())}),c.parentNode.insertBefore(b,c)}}},{key:"resetSize",value:function(){var a=this;setTimeout(function(){a.setPlayerSize(a.width,a.height),a.setControlsSize()},50)}},{key:"setPoster",value:function(a){var b=this,c=b.container.querySelector("."+b.options.classPrefix+"poster"),d=c.querySelector("img");d||(d=l["default"].createElement("img"),d.className=b.options.classPrefix+"poster-img",d.width="100%",d.height="100%",c.appendChild(d)),d.setAttribute("src",a),c.style.backgroundImage='url("'+a+'")'}},{key:"changeSkin",value:function(a){var b=this;b.container.className=b.options.classPrefix+"container "+a,b.setPlayerSize(b.width,b.height),b.setControlsSize()}},{key:"globalBind",value:function(a,b){var c=this,d=c.node?c.node.ownerDocument:l["default"];if(a=t.splitEvents(a,c.id),a.d)for(var e=a.d.split(" "),f=0,g=e.length;g>f;f++)e[f].split(".").reduce(function(a,c){return d.addEventListener(c,b,!1),c},"");if(a.w)for(var h=a.w.split(" "),i=0,k=h.length;k>i;i++)h[i].split(".").reduce(function(a,c){return j["default"].addEventListener(c,b,!1),c},"")}},{key:"globalUnbind",value:function(a,b){var c=this,d=c.node?c.node.ownerDocument:l["default"];if(a=t.splitEvents(a,c.id),a.d)for(var e=a.d.split(" "),f=0,g=e.length;g>f;f++)e[f].split(".").reduce(function(a,c){return d.removeEventListener(c,b,!1),c},"");if(a.w)for(var h=a.d.split(" "),i=0,k=h.length;k>i;i++)h[i].split(".").reduce(function(a,c){return j["default"].removeEventListener(c,b,!1),c},"")}},{key:"buildposter",value:function(a,b,c,d){var e=this,f=l["default"].createElement("div");f.className=e.options.classPrefix+"poster "+e.options.classPrefix+"layer",c.appendChild(f);var g=a.media.getAttribute("poster");""!==a.options.poster&&(g=a.options.poster),g?e.setPoster(g):f.style.display="none",d.addEventListener("play",function(){f.style.display="none"}),d.addEventListener("playing",function(){f.style.display="none"}),a.options.showPosterWhenEnded&&a.options.autoRewind&&d.addEventListener("ended",function(){f.style.display=""}),d.addEventListener("error",function(){f.style.display="none"}),a.options.showPosterWhenPaused&&d.addEventListener("pause",function(){d.ended||(f.style.display="")})}},{key:"buildoverlays",value:function(a,b,c,d){if(a.isVideo){var e=this,f=l["default"].createElement("div"),g=l["default"].createElement("div"),h=l["default"].createElement("div"),i=b.querySelector("."+e.options.classPrefix+"time-buffering");f.style.display="none",f.className=e.options.classPrefix+"overlay "+e.options.classPrefix+"layer",f.innerHTML='<div class="'+e.options.classPrefix+'overlay-loading">'+('<span class="'+e.options.classPrefix+'overlay-loading-bg-img"></span>')+"</div>",c.appendChild(f),g.style.display="none",g.className=e.options.classPrefix+"overlay "+e.options.classPrefix+"layer",g.innerHTML='<div class="'+e.options.classPrefix+'overlay-error"></div>',c.appendChild(g),h.className=e.options.classPrefix+"overlay "+e.options.classPrefix+"layer "+e.options.classPrefix+"overlay-play",h.innerHTML='<div class="'+e.options.classPrefix+'overlay-button" role="button" tabindex="0"'+('aria-label="'+r["default"].t("mejs.play")+'" aria-pressed="false"></div>'),h.addEventListener("click",function(){if(e.options.clickToPlayPause){var a=e.container.querySelector("."+e.options.classPrefix+"overlay-button"),b=a.getAttribute("aria-pressed");d.paused?d.play():d.pause(),a.setAttribute("aria-pressed",!!b)}}),c.appendChild(h),null!==e.media.rendererName&&(e.media.rendererName.match(/(youtube|facebook)/)&&!a.media.originalNode.getAttribute("poster")&&!a.options.poster||s.IS_STOCK_ANDROID)&&(h.style.display="none"),d.addEventListener("play",function(){h.style.display="none",f.style.display="none",i&&(i.style.display="none"),g.style.display="none"}),d.addEventListener("playing",function(){h.style.display="none",f.style.display="none",i&&(i.style.display="none"),g.style.display="none"}),d.addEventListener("seeking",function(){h.style.display="none",f.style.display="",i&&(i.style.display="")}),d.addEventListener("seeked",function(){h.style.display="",f.style.display="none",i&&(i.style.display="")}),d.addEventListener("pause",function(){f.style.display="none",s.IS_STOCK_ANDROID||(h.style.display=""),i&&(i.style.display="none")}),d.addEventListener("waiting",function(){f.style.display="",i&&(i.style.display="")}),d.addEventListener("loadeddata",function(){f.style.display="",i&&(i.style.display=""),s.IS_ANDROID&&(d.canplayTimeout=setTimeout(function(){if(l["default"].createEvent){var a=l["default"].createEvent("HTMLEvents");return a.initEvent("canplay",!0,!0),d.dispatchEvent(a)}},300))}),d.addEventListener("canplay",function(){f.style.display="none",i&&(i.style.display="none"),clearTimeout(d.canplayTimeout)}),d.addEventListener("error",function(a){e._handleError(a),f.style.display="none",h.style.display="none",i&&(i.style.display="none"),g.style.display="block",g.querySelector("."+e.options.classPrefix+"overlay-error").innerHTML=a.message}),d.addEventListener("keydown",function(b){e.onkeydown(a,d,b)})}}},{key:"buildkeyboard",value:function(a,b,c,d){var e=this;e.container.addEventListener("keydown",function(){e.keyboardAction=!0}),e.globalBind("keydown",function(b){var c=l["default"].activeElement.closest("."+e.options.classPrefix+"container"),f=e.media.closest("."+e.options.classPrefix+"container");return e.hasFocus=!(!c||!f||c.id!==f.id),e.onkeydown(a,d,b)}),e.globalBind("click",function(a){e.hasFocus=!!a.target.closest("."+e.options.classPrefix+"container")})}},{key:"onkeydown",value:function(a,b,c){if(a.hasFocus&&a.options.enableKeyboard)for(var d=0,e=a.options.keyActions.length;e>d;d++)for(var f=a.options.keyActions[d],g=0,h=f.keys.length;h>g;g++)c.keyCode===f.keys[g]&&(f.action(a,b,c.keyCode,c),c.preventDefault(),c.stopPropagation());return!0}},{key:"play",value:function(){var a=this;a.media.getCurrentTime()<=0&&a.load(),a.media.play()}},{key:"pause",value:function(){try{this.media.pause()}catch(a){}}},{key:"load",value:function(){var a=this;a.isLoaded||a.media.load(),a.isLoaded=!0}},{key:"setMuted",value:function(a){this.media.setMuted(a)}},{key:"setCurrentTime",value:function(a){this.media.setCurrentTime(a)}},{key:"getCurrentTime",value:function(){return this.media.currentTime}},{key:"setVolume",value:function(a){this.media.setVolume(a)}},{key:"getVolume",value:function(){return this.media.volume}},{key:"setSrc",value:function(a){var b=this,c=l["default"].getElementById(b.media.id+"-iframe-overlay");c&&c.remove(),b.media.setSrc(a),b.createIframeLayer()}},{key:"remove",value:function(){var a=this,b=a.media.rendererName;a.media.paused||a.media.pause(); +var c=a.media.originalNode.getAttribute("src");a.media.setSrc("");for(var d in a.options.features){var e=a.options.features[d];if(a["clean"+e])try{a["clean"+e](a)}catch(f){console.error("error cleaning "+e,f)}}var h=a.node.getAttribute("width"),i=a.node.getAttribute("height");if(h?null===h.match("%")&&(h+="px"):h="auto",i?null===i.match("%")&&(i+="px"):i="auto",a.node.style.width=h,a.node.style.height=i,a.isDynamic)a.container.parentNode.insertBefore(a.node,a.container);else{if(a.node.setAttribute("controls",!0),a.node.setAttribute("id",a.node.getAttribute("id").replace("_"+b,"").replace("_from_mejs","")),delete a.node.autoplay,a.media.canPlayType(v.getTypeFromFile(c))&&a.node.setAttribute("src",c),null!==b.match(/iframe/i)){var j=l["default"].getElementById(a.media.id+"-iframe-overlay");j.remove()}var k=a.node.cloneNode(!0);a.container.parentNode.insertBefore(k,a.container),a.node.remove(),delete a.node}if("function"==typeof a.media.destroy&&a.media.destroy(),delete n["default"].players[a.id],"object"===g(a.container)){var m=a.container.parentNode.querySelector("."+a.options.classPrefix+"offscreen");m.remove(),a.container.remove()}a.globalUnbind(),delete a.media.player}}]),a}();j["default"].MediaElementPlayer=z,c["default"]=z,function(a){"undefined"!=typeof a&&(a.fn.mediaelementplayer=function(b){return b===!1?this.each(function(){var b=a(this).data("mediaelementplayer");b&&b.remove(),a(this).removeData("mediaelementplayer")}):this.each(function(){a(this).data("mediaelementplayer",new z(this,b))}),this},a(l["default"]).ready(function(){a("."+y.classPrefix+"player").mediaelementplayer()}))}(n["default"].$)},{2:2,23:23,24:24,25:25,26:26,28:28,3:3,4:4,5:5,6:6}],17:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(25),m=a(26),n=a(23),o={isMediaLoaded:!1,creationQueue:[],prepareSettings:function(a){o.isLoaded?o.createInstance(a):(o.loadScript(a),o.creationQueue.push(a))},loadScript:function(a){"undefined"!=typeof dashjs?o.createInstance(a):o.isScriptLoaded||!function(){a.options.path="string"==typeof a.options.path?a.options.path:"//cdn.dashjs.org/latest/dash.mediaplayer.min.js";var b=h["default"].createElement("script"),c=h["default"].getElementsByTagName("script")[0],d=!1;b.src=a.options.path,b.onload=b.onreadystatechange=function(){d||this.readyState&&void 0!==this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,o.mediaReady(),b.onload=b.onreadystatechange=null)},c.parentNode.insertBefore(b,c),o.isScriptLoaded=!0}()},mediaReady:function(){for(o.isLoaded=!0,o.isScriptLoaded=!0;o.creationQueue.length>0;){var a=o.creationQueue.pop();o.createInstance(a)}},createInstance:function(a){var b=dashjs.MediaPlayer().create();f["default"]["__ready__"+a.id](b)}},p={name:"native_dash",options:{prefix:"native_dash",dash:{path:"//cdn.dashjs.org/latest/dash.mediaplayer.min.js",debug:!1}},canPlayType:function(a){return n.HAS_MSE&&["application/dash+xml"].includes(a)},create:function(a,b,c){var d=a.originalNode,e=a.id+"_"+b.prefix,g=d.getAttribute("preload"),i=d.autoplay,m=null,n=null;m=d.cloneNode(!0),b=Object.assign(b,a.options);for(var p=j["default"].html5media.properties,q=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);m["get"+b]=function(){return null!==n?m[a]:null},m["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||null!==n&&("src"===a&&(n.attachSource(b),i&&m.play()),m[a]=b)}},r=0,s=p.length;s>r;r++)q(p[r]);if(f["default"]["__ready__"+e]=function(c){a.dashPlayer=n=c,n.getDebug().setLogToBrowserConsole(b.dash.debug),n.setAutoPlay(g&&"auto"===g||i),n.setScheduleWhilePaused(g&&"auto"===g||i);for(var d=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),e=dashjs.MediaPlayer.events,f=function(b){"loadedmetadata"===b&&n.initialize(m,m.src,!1),m.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},k=0,o=d.length;o>k;k++)f(d[k]);var p=function(b){var c=l.createEvent(b.type,m);c.data=b,a.dispatchEvent(c),"error"===b.type.toLowerCase()&&console.error(b)};for(var q in e)e.hasOwnProperty(q)&&n.on(e[q],p)},c&&c.length>0)for(var t=0,u=c.length;u>t;t++)if(k.renderer.renderers[b.prefix].canPlayType(c[t].type)){m.setAttribute("src",c[t].src);break}m.setAttribute("id",e),d.parentNode.insertBefore(m,d),d.autoplay=!1,d.style.display="none",o.prepareSettings({options:b.dash,id:e}),m.setSize=function(a,b){return m.style.width=a+"px",m.style.height=b+"px",m},m.hide=function(){return m.pause(),m.style.display="none",m},m.show=function(){return m.style.display="",m};var v=l.createEvent("rendererready",m);return a.dispatchEvent(v),m}};m.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes(".mpd")?"application/dash+xml":null}),k.renderer.add(p)},{2:2,23:23,25:25,26:26,3:3,6:6,7:7}],18:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0}),c.PluginDetector=void 0;var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(4),m=d(l),n=a(7),o=a(25),p=a(23),q=a(26),r=c.PluginDetector={plugins:[],hasPluginVersion:function(a,b){var c=r.plugins[a];return b[1]=b[1]||0,b[2]=b[2]||0,c[0]>b[0]||c[0]===b[0]&&c[1]>b[1]||c[0]===b[0]&&c[1]===b[1]&&c[2]>=b[2]},addPlugin:function(a,b,c,d,e){r.plugins[a]=r.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var f=[0,0,0],h=void 0,i=void 0;if(null!==p.NAV.plugins&&void 0!==p.NAV.plugins&&"object"===e(p.NAV.plugins[a])){if(h=p.NAV.plugins[a].description,h&&("undefined"==typeof p.NAV.mimeTypes||!p.NAV.mimeTypes[b]||p.NAV.mimeTypes[b].enabledPlugin)){f=h.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(var j=0,k=f.length;k>j;j++)f[j]=parseInt(f[j].match(/\d+/),10)}}else if(void 0!==g["default"].ActiveXObject)try{i=new ActiveXObject(c),i&&(f=d(i))}catch(l){}return f}};r.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[],c=a.GetVariable("$version");return c&&(c=c.split(" ")[1].split(","),b=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]),b});var s={create:function(a,b,c){var d={};d.options=b,d.id=a.id+"_"+d.options.prefix,d.mediaElement=a,d.flashState={},d.flashApi=null,d.flashApiStack=[];for(var f=k["default"].html5media.properties,h=function(a){d.flashState[a]=null;var b=""+a.substring(0,1).toUpperCase()+a.substring(1);d["get"+b]=function(){if(null===d.flashApi)return null;if(void 0===d.flashApi["get_"+a])return null;var b=function(){var b=d.flashApi["get_"+a]();return"buffered"===a?{v:{start:function(){return 0},end:function(){return b},length:1}}:{v:b}}();return"object"===("undefined"==typeof b?"undefined":e(b))?b.v:void 0},d["set"+b]=function(b){"src"===a&&(b=q.absolutizeUrl(b)),null!==d.flashApi&&void 0!==d.flashApi["set_"+a]?d.flashApi["set_"+a](b):d.flashApiStack.push({type:"set",propName:a,value:b})}},j=0,l=f.length;l>j;j++)h(f[j]);var r=k["default"].html5media.methods,s=function(a){d[a]=function(){if(null!==d.flashApi){if(d.flashApi["fire_"+a])try{d.flashApi["fire_"+a]()}catch(b){}}else d.flashApiStack.push({type:"call",methodName:a})}};r.push("stop");for(var t=0,u=r.length;u>t;t++)s(r[t]);for(var v=["rendererready","loadeddata","loadedmetadata","canplay","error"],w=0,x=v.length;x>w;w++){var y=o.createEvent(v[w],d);a.dispatchEvent(y)}g["default"]["__ready__"+d.id]=function(){if(d.flashReady=!0,d.flashApi=i["default"].getElementById("__"+d.id),d.flashApiStack.length)for(var a=0,b=d.flashApiStack.length;b>a;a++){var c=d.flashApiStack[a];if("set"===c.type){var e=c.propName,f=""+e.substring(0,1).toUpperCase()+e.substring(1);d["set"+f](c.value)}else"call"===c.type&&d[c.methodName]()}},g["default"]["__event__"+d.id]=function(a,b){var c=o.createEvent(a,d);c.message=b||"",d.mediaElement.dispatchEvent(c)},d.flashWrapper=i["default"].createElement("div"),["always","sameDomain"].includes(d.options.shimScriptAccess)||(d.options.shimScriptAccess="sameDomain");var z=a.originalNode.autoplay,A=["uid="+d.id,"autoplay="+z,"allowScriptAccess="+d.options.shimScriptAccess],B=null!==a.originalNode&&"video"===a.originalNode.tagName.toLowerCase(),C=B?a.originalNode.height:1,D=B?a.originalNode.width:1;a.originalNode.getAttribute("src")&&A.push("src="+a.originalNode.getAttribute("src")),d.options.enablePseudoStreaming===!0&&(A.push("pseudostreamstart="+d.options.pseudoStreamingStartQueryParam),A.push("pseudostreamtype="+d.options.pseudoStreamingType)),a.appendChild(d.flashWrapper),null!==a.originalNode&&(a.originalNode.style.display="none");var E=[];if(p.IS_IE){var F=i["default"].createElement("div");d.flashWrapper.appendChild(F),E=['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"','codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"','id="__'+d.id+'"','width="'+D+'"','height="'+C+'"'],B||E.push('style="clip: rect(0 0 0 0); position: absolute;"'),F.outerHTML="<object "+E.join(" ")+">"+('<param name="movie" value="'+d.options.pluginPath+d.options.filename+"?x="+new Date+'" />')+('<param name="flashvars" value="'+A.join("&")+'" />')+'<param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" />'+('<param name="allowScriptAccess" value="'+d.options.shimScriptAccess+'" />')+'<param name="allowFullScreen" value="true" />'+("<div>"+m["default"].t("mejs.install-flash")+"</div>")+"</object>"}else E=['id="__'+d.id+'"','name="__'+d.id+'"','play="true"','loop="false"','quality="high"','bgcolor="#000000"','wmode="transparent"','allowScriptAccess="'+d.options.shimScriptAccess+'"','allowFullScreen="true"','type="application/x-shockwave-flash"','pluginspage="//www.macromedia.com/go/getflashplayer"','src="'+d.options.pluginPath+d.options.filename+'"','flashvars="'+A.join("&")+'"','width="'+D+'"','height="'+C+'"'],B||E.push('style="clip: rect(0 0 0 0); position: absolute;"'),d.flashWrapper.innerHTML="<embed "+E.join(" ")+">";if(d.flashNode=d.flashWrapper.lastChild,d.hide=function(){if(B){d.flashNode.style.position="absolute",d.flashNode.style.width="1px",d.flashNode.style.height="1px";try{d.flashNode.style.clip="rect(0 0 0 0);"}catch(a){}}},d.show=function(){if(B){d.flashNode.style.position="",d.flashNode.style.width="",d.flashNode.style.height="";try{d.flashNode.style.clip=""}catch(a){}}},d.setSize=function(a,b){d.flashNode.style.width=a+"px",d.flashNode.style.height=b+"px",null!==d.flashApi&&"function"==typeof d.flashApi.fire_setSize&&d.flashApi.fire_setSize(a,b)},d.destroy=function(){d.flashNode.remove()},c&&c.length>0)for(var G=0,H=c.length;H>G;G++)if(n.renderer.renderers[b.prefix].canPlayType(c[G].type)){d.setSrc(c[G].src);break}return d}},t=r.hasPluginVersion("flash",[10,0,0]);if(t){q.typeChecks.push(function(a){return a=a.toLowerCase(),a.startsWith("rtmp")?a.includes(".mp3")?"audio/rtmp":"video/rtmp":a.includes(".oga")||a.includes(".ogg")?"audio/ogg":a.includes(".m3u8")?"application/x-mpegURL":a.includes(".mpd")?"application/dash+xml":a.includes(".flv")?"video/flv":null});var u={name:"flash_video",options:{prefix:"flash_video",filename:"mediaelement-flash-video.swf",enablePseudoStreaming:!1,pseudoStreamingStartQueryParam:"start",pseudoStreamingType:"byte"},canPlayType:function(a){return["video/mp4","video/rtmp","audio/rtmp","rtmp/mp4","audio/mp4","video/flv","video/x-flv"].includes(a.toLowerCase())},create:s.create};n.renderer.add(u);var v={name:"flash_hls",options:{prefix:"flash_hls",filename:"mediaelement-flash-video-hls.swf"},canPlayType:function(a){return["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())},create:s.create};n.renderer.add(v);var w={name:"flash_dash",options:{prefix:"flash_dash",filename:"mediaelement-flash-video-mdash.swf"},canPlayType:function(a){return["application/dash+xml"].includes(a.toLowerCase())},create:s.create};n.renderer.add(w);var x={name:"flash_audio",options:{prefix:"flash_audio",filename:"mediaelement-flash-audio.swf"},canPlayType:function(a){return["audio/mp3"].includes(a.toLowerCase())},create:s.create};n.renderer.add(x);var y={name:"flash_audio_ogg",options:{prefix:"flash_audio_ogg",filename:"mediaelement-flash-audio-ogg.swf"},canPlayType:function(a){return["audio/ogg","audio/oga","audio/ogv"].includes(a.toLowerCase())},create:s.create};n.renderer.add(y)}},{2:2,23:23,25:25,26:26,3:3,4:4,6:6,7:7}],19:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(25),m=a(23),n=a(26),o={isMediaStarted:!1,isMediaLoaded:!1,creationQueue:[],prepareSettings:function(a){o.isLoaded?o.createInstance(a):(o.loadScript(a),o.creationQueue.push(a))},loadScript:function(a){"undefined"!=typeof flvjs?o.createInstance(a):o.isMediaStarted||!function(){a.options.path="string"==typeof a.options.path?a.options.path:"//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js";var b=h["default"].createElement("script"),c=h["default"].getElementsByTagName("script")[0],d=!1;b.src=a.options.path,b.onload=b.onreadystatechange=function(){d||this.readyState&&void 0!==this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,o.mediaReady(),b.onload=b.onreadystatechange=null)},c.parentNode.insertBefore(b,c),o.isMediaStarted=!0}()},mediaReady:function(){for(o.isLoaded=!0,o.isMediaLoaded=!0;o.creationQueue.length>0;){var a=o.creationQueue.pop();o.createInstance(a)}},createInstance:function(a){var b=flvjs.createPlayer(a.options);f["default"]["__ready__"+a.id](b)}},p={name:"native_flv",options:{prefix:"native_flv",flv:{path:"//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js",cors:!0}},canPlayType:function(a){return m.HAS_MSE&&["video/x-flv","video/flv"].includes(a)},create:function(a,b,c){var d=a.originalNode,e=a.id+"_"+b.prefix,g=null,i=null;g=d.cloneNode(!0),b=Object.assign(b,a.options);for(var m=j["default"].html5media.properties,n=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);g["get"+b]=function(){return null!==i?g[a]:null},g["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||null!==i&&(g[a]=b,"src"===a&&(i.unload(),i.detachMediaElement(),i.attachMediaElement(g),i.load()))}},p=0,q=m.length;q>p;p++)n(m[p]);if(f["default"]["__ready__"+e]=function(b){a.flvPlayer=i=b;for(var c=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),d=function(b){"loadedmetadata"===b&&(i.unload(),i.detachMediaElement(),i.attachMediaElement(g),i.load()),g.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},e=0,f=c.length;f>e;e++)d(c[e])},c&&c.length>0)for(var r=0,s=c.length;s>r;r++)if(k.renderer.renderers[b.prefix].canPlayType(c[r].type)){g.setAttribute("src",c[r].src);break}g.setAttribute("id",e),d.parentNode.insertBefore(g,d),d.autoplay=!1,d.style.display="none",b.flv.type="flv",b.flv.url=g.getAttribute("src"),o.prepareSettings({options:b.flv,id:e}),g.setSize=function(a,b){return g.style.width=a+"px",g.style.height=b+"px",g},g.hide=function(){return null!==i&&i.pause(),g.style.display="none",g},g.show=function(){return g.style.display="",g},g.destroy=function(){null!==i&&i.destroy()};var t=l.createEvent("rendererready",g);return a.dispatchEvent(t),g}};n.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes(".flv")?"video/flv":null}),k.renderer.add(p)},{2:2,23:23,25:25,26:26,3:3,6:6,7:7}],20:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(25),m=a(23),n=a(26),o={isMediaStarted:!1,isMediaLoaded:!1,creationQueue:[],prepareSettings:function(a){o.isLoaded?o.createInstance(a):(o.loadScript(a),o.creationQueue.push(a))},loadScript:function(a){"undefined"!=typeof Hls?o.createInstance(a):o.isMediaStarted||!function(){a.options.path="string"==typeof a.options.path?a.options.path:"//cdn.jsdelivr.net/hls.js/latest/hls.min.js";var b=h["default"].createElement("script"),c=h["default"].getElementsByTagName("script")[0],d=!1;b.src=a.options.path,b.onload=b.onreadystatechange=function(){d||this.readyState&&void 0!==this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,o.mediaReady(),b.onload=b.onreadystatechange=null)},c.parentNode.insertBefore(b,c),o.isMediaStarted=!0}()},mediaReady:function(){for(o.isLoaded=!0,o.isMediaLoaded=!0;o.creationQueue.length>0;){var a=o.creationQueue.pop();o.createInstance(a)}},createInstance:function(a){var b=new Hls(a.options);return f["default"]["__ready__"+a.id](b),b}},p={name:"native_hls",options:{prefix:"native_hls",hls:{path:"//cdn.jsdelivr.net/hls.js/latest/hls.min.js",autoStartLoad:!1,debug:!1}},canPlayType:function(a){return m.HAS_MSE&&["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())},create:function(a,b,c){var d=a.originalNode,e=a.id+"_"+b.prefix,g=d.getAttribute("preload"),i=d.autoplay,m=null,n=null;n=d.cloneNode(!0),b=Object.assign(b,a.options),b.hls.autoStartLoad=g&&"none"!==g||i;for(var p=j["default"].html5media.properties,q=function(a){var c=""+a.substring(0,1).toUpperCase()+a.substring(1);n["get"+c]=function(){return null!==m?n[a]:null},n["set"+c]=function(c){j["default"].html5media.readOnlyProperties.includes(a)||null!==m&&(n[a]=c,"src"===a&&(m.destroy(),m=o.createInstance({options:b.hls,id:e}),m.loadSource(c),m.attachMedia(n)))}},r=0,s=p.length;s>r;r++)q(p[r]);if(f["default"]["__ready__"+e]=function(b){a.hlsPlayer=m=b;for(var c=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),d=Hls.Events,e=function(b){if("loadedmetadata"===b){m.detachMedia();var c=n.src;m.loadSource(c),m.attachMedia(n)}n.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},f=0,g=c.length;g>f;f++)e(c[f]);var i=void 0,k=void 0,o=function(b,c){var d=l.createEvent(b,n);if(d.data=c,a.dispatchEvent(d),"hlsError"===b&&(console.warn(b,c),c.fatal))switch(c.type){case"mediaError":var e=(new Date).getTime();!i||e-i>3e3?(i=(new Date).getTime(),m.recoverMediaError()):!k||e-k>3e3?(k=(new Date).getTime(),console.warn("Attempting to swap Audio Codec and recover from media error"),m.swapAudioCodec(),m.recoverMediaError()):console.error("Cannot recover, last media error recovery failed");break;case"networkError":console.error("Network error");break;default:m.destroy()}};for(var p in d)d.hasOwnProperty(p)&&m.on(d[p],o)},c&&c.length>0)for(var t=0,u=c.length;u>t;t++)if(k.renderer.renderers[b.prefix].canPlayType(c[t].type)){n.setAttribute("src",c[t].src);break}"auto"===g||i||(n.addEventListener("play",function(){null!==m&&m.startLoad()}),n.addEventListener("pause",function(){null!==m&&m.stopLoad()})),n.setAttribute("id",e),d.parentNode.insertBefore(n,d),d.autoplay=!1,d.style.display="none",o.prepareSettings({options:b.hls,id:e}),n.setSize=function(a,b){return n.style.width=a+"px",n.style.height=b+"px",n},n.hide=function(){return n.pause(),n.style.display="none",n},n.show=function(){return n.style.display="",n},n.destroy=function(){null!==m&&m.destroy()},n.stop=function(){null!==m&&m.stopLoad()};var v=l.createEvent("rendererready",n);return a.dispatchEvent(v),n}};n.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes(".m3u8")?"application/x-mpegURL":null}),k.renderer.add(p)},{2:2,23:23,25:25,26:26,3:3,6:6,7:7}],21:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(25),m=a(23),n={name:"html5",options:{prefix:"html5"},canPlayType:function(a){var b=h["default"].createElement("video");return m.IS_ANDROID&&null!==a.match(/\/mp(3|4)$/gi)||["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())&&m.SUPPORTS_NATIVE_HLS?"yes":b.canPlayType?b.canPlayType(a).replace(/no/,""):""},create:function(a,b,c){var d=a.id+"_"+b.prefix,e=null;void 0===a.originalNode||null===a.originalNode?(e=h["default"].createElement("audio"),a.appendChild(e)):e=a.originalNode,e.setAttribute("id",d);for(var f=j["default"].html5media.properties,g=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);e["get"+b]=function(){return e[a]},e["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||(e[a]=b)}},i=0,m=f.length;m>i;i++)g(f[i]);for(var n=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),o=function(b){e.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},p=0,q=n.length;q>p;p++)o(n[p]);if(e.setSize=function(a,b){return e.style.width=a+"px",e.style.height=b+"px",e},e.hide=function(){return e.style.display="none",e},e.show=function(){return e.style.display="",e},c&&c.length>0)for(var r=0,s=c.length;s>r;r++)if(k.renderer.renderers[b.prefix].canPlayType(c[r].type)){e.setAttribute("src",c[r].src);break}var t=l.createEvent("rendererready",e);return a.dispatchEvent(t),e}};f["default"].HtmlMediaElement=j["default"].HtmlMediaElement=n,k.renderer.add(n)},{2:2,23:23,25:25,3:3,6:6,7:7}],22:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(7),m=a(25),n=a(26),o={isIframeStarted:!1,isIframeLoaded:!1,iframeQueue:[],enqueueIframe:function(a){o.isLoaded="undefined"!=typeof YT&&YT.loaded,o.isLoaded?o.createIframe(a):(o.loadIframeApi(),o.iframeQueue.push(a))},loadIframeApi:function(){if(!o.isIframeStarted){var a=i["default"].createElement("script");a.src="//www.youtube.com/player_api";var b=i["default"].getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b),o.isIframeStarted=!0}},iFrameReady:function(){for(o.isLoaded=!0,o.isIframeLoaded=!0;o.iframeQueue.length>0;){var a=o.iframeQueue.pop();o.createIframe(a)}},createIframe:function(a){return new YT.Player(a.containerId,a)},getYouTubeId:function(a){var b="";return a.indexOf("?")>0?(b=o.getYouTubeIdFromParam(a),""===b&&(b=o.getYouTubeIdFromUrl(a))):b=o.getYouTubeIdFromUrl(a),b},getYouTubeIdFromParam:function(a){if(void 0===a||null===a||!a.trim().length)return null;for(var b=a.split("?"),c=b[1].split("&"),d="",e=0,f=c.length;f>e;e++){var g=c[e].split("=");if("v"===g[0]){d=g[1];break}}return d},getYouTubeIdFromUrl:function(a){if(void 0===a||null===a||!a.trim().length)return null;var b=a.split("?");return a=b[0],a.substring(a.lastIndexOf("/")+1)},getYouTubeNoCookieUrl:function(a){if(void 0===a||null===a||!a.trim().length||!a.includes("//www.youtube"))return a;var b=a.split("/");return b[2]=b[2].replace(".com","-nocookie.com"),b.join("/")}},p={name:"youtube_iframe",options:{prefix:"youtube_iframe",youtube:{autoplay:0,controls:0,disablekb:1,end:0,loop:0,modestbranding:0,playsinline:0,rel:0,showinfo:0,start:0,iv_load_policy:3,nocookie:!1}},canPlayType:function(a){return["video/youtube","video/x-youtube"].includes(a)},create:function(a,b,c){var d={},f=[],h=4,j=null,l=!0,n=!1,p=null,q=1;d.options=b,d.id=a.id+"_"+b.prefix,d.mediaElement=a;for(var r=k["default"].html5media.properties,s=function(b){var c=""+b.substring(0,1).toUpperCase()+b.substring(1);d["get"+c]=function(){if(null!==j){var a=null,c=function(){switch(b){case"currentTime":return{v:j.getCurrentTime()};case"duration":return{v:j.getDuration()};case"volume":return q=j.getVolume()/100,{v:q};case"paused":return{v:l};case"ended":return{v:n};case"muted":return{v:j.isMuted()};case"buffered":var a=j.getVideoLoadedFraction(),c=j.getDuration();return{v:{start:function(){return 0},end:function(){return a*c},length:1}};case"src":return{v:j.getVideoUrl()};case"readyState":return{v:h}}}();return"object"===("undefined"==typeof c?"undefined":e(c))?c.v:a}return null},d["set"+c]=function(c){if(null!==j)switch(b){case"src":var e="string"==typeof c?c:c[0].src,g=o.getYouTubeId(e);a.originalNode.autoplay?j.loadVideoById(g):j.cueVideoById(g);break;case"currentTime":j.seekTo(c);break;case"muted":c?j.mute():j.unMute(),setTimeout(function(){var b=m.createEvent("volumechange",d);a.dispatchEvent(b)},50);break;case"volume":q=c,j.setVolume(100*c),setTimeout(function(){var b=m.createEvent("volumechange",d);a.dispatchEvent(b)},50);break;case"readyState":var h=m.createEvent("canplay",d);a.dispatchEvent(h)}else f.push({type:"set",propName:b,value:c})}},t=0,u=r.length;u>t;t++)s(r[t]);for(var v=k["default"].html5media.methods,w=function(a){d[a]=function(){if(null!==j)switch(a){case"play":return l=!1,j.playVideo();case"pause":return l=!0,j.pauseVideo();case"load":return null}else f.push({type:"call",methodName:a})}},x=0,y=v.length;y>x;x++)w(v[x]);var z=i["default"].createElement("div");z.id=d.id,d.options.youtube.nocookie&&a.originalNode.setAttribute("src",o.getYouTubeNoCookieUrl(c[0].src)),a.originalNode.parentNode.insertBefore(z,a.originalNode),a.originalNode.style.display="none";var A="audio"===a.originalNode.tagName.toLowerCase(),B=A?"0":a.originalNode.height,C=A?"0":a.originalNode.width,D=o.getYouTubeId(c[0].src),E={id:d.id,containerId:z.id,videoId:D,height:B,width:C,playerVars:Object.assign({controls:0,rel:0,disablekb:1,showinfo:0,modestbranding:0,html5:1,playsinline:0,start:0,end:0,iv_load_policy:3},d.options.youtube),origin:g["default"].location.host,events:{onReady:function(b){if(a.youTubeApi=j=b.target,a.youTubeState={paused:!0,ended:!1},f.length)for(var c=0,e=f.length;e>c;c++){var g=f[c];if("set"===g.type){var h=g.propName,i=""+h.substring(0,1).toUpperCase()+h.substring(1);d["set"+i](g.value)}else"call"===g.type&&d[g.methodName]()}p=j.getIframe();for(var k=["mouseover","mouseout"],l=function(b){var c=m.createEvent(b.type,d);a.dispatchEvent(c)},n=0,o=k.length;o>n;n++)p.addEventListener(k[n],l,!1);for(var q=["rendererready","loadeddata","loadedmetadata","canplay"],r=0,s=q.length;s>r;r++){var t=m.createEvent(q[r],d);a.dispatchEvent(t)}},onStateChange:function(b){var c=[];switch(b.data){case-1:c=["loadedmetadata"],l=!0,n=!1;break;case 0:c=["ended"],l=!1,n=!0,d.stopInterval();break;case 1:c=["play","playing"],l=!1,n=!1,d.startInterval();break;case 2:c=["pause"],l=!0,n=!1,d.stopInterval();break;case 3:c=["progress"],n=!1;break;case 5:c=["loadeddata","loadedmetadata","canplay"],l=!0,n=!1}for(var e=0,f=c.length;f>e;e++){var g=m.createEvent(c[e],d);a.dispatchEvent(g)}},onError:function(b){var c=m.createEvent("error",d);c.data=b.data,a.dispatchEvent(c)}}};return A&&(E.playerVars.playsinline=1),o.enqueueIframe(E),d.onEvent=function(b,c,d){null!==d&&void 0!==d&&(a.youTubeState=d)},d.setSize=function(a,b){null!==j&&j.setSize(a,b)},d.hide=function(){d.stopInterval(),d.pause(),p&&(p.style.display="none")},d.show=function(){p&&(p.style.display="")},d.destroy=function(){j.destroy()},d.interval=null,d.startInterval=function(){d.interval=setInterval(function(){var b=m.createEvent("timeupdate",d);a.dispatchEvent(b)},250)},d.stopInterval=function(){d.interval&&clearInterval(d.interval)},d}};g["default"].postMessage&&e(g["default"].addEventListener)&&(g["default"].onYouTubePlayerAPIReady=function(){o.iFrameReady()},n.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes("//www.youtube")||a.includes("//youtu.be")?"video/x-youtube":null}),l.renderer.add(p))},{2:2,25:25,26:26,3:3,6:6,7:7}],23:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0}),c.cancelFullScreen=c.requestFullScreen=c.isFullScreen=c.FULLSCREEN_EVENT_NAME=c.HAS_NATIVE_FULLSCREEN_ENABLED=c.HAS_TRUE_NATIVE_FULLSCREEN=c.HAS_IOS_FULLSCREEN=c.HAS_MS_NATIVE_FULLSCREEN=c.HAS_MOZ_NATIVE_FULLSCREEN=c.HAS_WEBKIT_NATIVE_FULLSCREEN=c.HAS_NATIVE_FULLSCREEN=c.SUPPORTS_NATIVE_HLS=c.SUPPORT_POINTER_EVENTS=c.HAS_MSE=c.IS_STOCK_ANDROID=c.IS_SAFARI=c.IS_FIREFOX=c.IS_CHROME=c.IS_EDGE=c.IS_IE=c.IS_ANDROID=c.IS_IOS=c.IS_IPHONE=c.IS_IPAD=c.UA=c.NAV=void 0;for(var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=c.NAV=f["default"].navigator,l=c.UA=k.userAgent.toLowerCase(),m=c.IS_IPAD=null!==l.match(/ipad/i),n=c.IS_IPHONE=null!==l.match(/iphone/i),o=(c.IS_IOS=n||m,c.IS_ANDROID=null!==l.match(/android/i)),p=c.IS_IE=k.appName.toLowerCase().includes("microsoft")||null!==k.appName.toLowerCase().match(/trident/gi),q=(c.IS_EDGE="msLaunchUri"in k&&!("documentMode"in h["default"])),r=c.IS_CHROME=null!==l.match(/chrome/gi),s=c.IS_FIREFOX=null!==l.match(/firefox/gi),t=c.IS_SAFARI=null!==l.match(/safari/gi)&&!r,u=c.IS_STOCK_ANDROID=null!==l.match(/^mozilla\/\d+\.\d+\s\(linux;\su;/gi),v=(c.HAS_MSE="MediaSource"in f["default"]),w=(c.SUPPORT_POINTER_EVENTS=function(){var a=h["default"].createElement("x"),b=h["default"].documentElement,c=f["default"].getComputedStyle;if(!("pointerEvents"in a.style))return!1;a.style.pointerEvents="auto",a.style.pointerEvents="x",b.appendChild(a);var d=c&&"auto"===c(a,"").pointerEvents;return a.remove(),!!d}()),x=["source","track","audio","video"],y=void 0,z=0,A=x.length;A>z;z++)y=h["default"].createElement(x[z]);var B=c.SUPPORTS_NATIVE_HLS=t||o&&(r||u)||p&&null!==l.match(/edge/gi),C=void 0!==y.webkitEnterFullscreen,D=void 0!==y.requestFullscreen;C&&l.match(/mac os x 10_5/i)&&(D=!1,C=!1);var E=void 0!==y.webkitRequestFullScreen,F=void 0!==y.mozRequestFullScreen,G=void 0!==y.msRequestFullscreen,H=E||F||G,I=H,J="",K=void 0,L=void 0,M=void 0;F?I=h["default"].mozFullScreenEnabled:G&&(I=h["default"].msFullscreenEnabled),r&&(C=!1),H&&(E?J="webkitfullscreenchange":F?J="mozfullscreenchange":G&&(J="MSFullscreenChange"),c.isFullScreen=K=function(){return F?h["default"].mozFullScreen:E?h["default"].webkitIsFullScreen:G?null!==h["default"].msFullscreenElement:void 0},c.requestFullScreen=L=function(a){E?a.webkitRequestFullScreen():F?a.mozRequestFullScreen():G&&a.msRequestFullscreen()},c.cancelFullScreen=M=function(){E?h["default"].webkitCancelFullScreen():F?h["default"].mozCancelFullScreen():G&&h["default"].msExitFullscreen()});var N=c.HAS_NATIVE_FULLSCREEN=D,O=c.HAS_WEBKIT_NATIVE_FULLSCREEN=E,P=c.HAS_MOZ_NATIVE_FULLSCREEN=F,Q=c.HAS_MS_NATIVE_FULLSCREEN=G,R=c.HAS_IOS_FULLSCREEN=C,S=c.HAS_TRUE_NATIVE_FULLSCREEN=H,T=c.HAS_NATIVE_FULLSCREEN_ENABLED=I,U=c.FULLSCREEN_EVENT_NAME=J;c.isFullScreen=K,c.requestFullScreen=L,c.cancelFullScreen=M,j["default"].Features=j["default"].Features||{},j["default"].Features.isiPad=m,j["default"].Features.isiPhone=n,j["default"].Features.isiOS=j["default"].Features.isiPhone||j["default"].Features.isiPad,j["default"].Features.isAndroid=o,j["default"].Features.isIE=p,j["default"].Features.isEdge=q,j["default"].Features.isChrome=r,j["default"].Features.isFirefox=s,j["default"].Features.isSafari=t,j["default"].Features.isStockAndroid=u,j["default"].Features.hasMSE=v,j["default"].Features.supportsNativeHLS=B,j["default"].Features.supportsPointerEvents=w,j["default"].Features.hasiOSFullScreen=R,j["default"].Features.hasNativeFullscreen=N,j["default"].Features.hasWebkitNativeFullScreen=O,j["default"].Features.hasMozNativeFullScreen=P,j["default"].Features.hasMsNativeFullScreen=Q,j["default"].Features.hasTrueNativeFullScreen=S,j["default"].Features.nativeFullScreenEnabled=T,j["default"].Features.fullScreenEventName=U,j["default"].Features.isFullScreen=K,j["default"].Features.requestFullScreen=L,j["default"].Features.cancelFullScreen=M},{2:2,3:3,6:6}],24:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){var b=a.getBoundingClientRect(),c=m["default"].pageXOffset||o["default"].documentElement.scrollLeft,d=m["default"].pageYOffset||o["default"].documentElement.scrollTop;return{top:b.top+d,left:b.left+c}}function f(a,b){u(a,b)?w(a,b):v(a,b)}function g(a){ +var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:400,c=arguments[2];a.style.opacity||(a.style.opacity=1);var d=null;m["default"].requestAnimationFrame(function e(f){d=d||f;var g=f-d;a.style.opacity=parseFloat(1-g/b,2),g>b?c&&"function"==typeof c&&c():m["default"].requestAnimationFrame(e)})}function h(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:400,c=arguments[2];a.style.opacity||(a.style.opacity=0);var d=null;m["default"].requestAnimationFrame(function e(f){d=d||f;var g=f-d;a.style.opacity=parseFloat(g/b,2),g>b?c&&"function"==typeof c&&c():m["default"].requestAnimationFrame(e)})}function i(a,b){var c=[];a=a.parentNode.firstChild;do(!b||b(a))&&c.push(a);while(a=a.nextSibling);return c}function j(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)}function k(a,b,c,d){var e=m["default"].XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),f="application/x-www-form-urlencoded; charset=UTF-8",g=!1,h="*/".concat("*");switch(b){case"text":f="text/plain";break;case"json":f="application/json, text/javascript";break;case"html":f="text/html";break;case"xml":f="application/xml, text/xml"}f.includes("application/x-www-form-urlencoded")||(h=f+", */*; q=0.01"),e&&(e.open("GET",a,!0),e.setRequestHeader("Accept",h),e.onreadystatechange=function(){if(!g&&4===e.readyState)if(200===e.status){g=!0;var a=void 0;switch(b){case"json":a=JSON.parse(e.responseText);break;case"xml":a=e.responseXML;break;default:a=e.responseText}c(a)}else"function"==typeof d&&d(e.status)},e.send())}Object.defineProperty(c,"__esModule",{value:!0}),c.removeClass=c.addClass=c.hasClass=void 0,c.offset=e,c.toggleClass=f,c.fadeOut=g,c.fadeIn=h,c.siblings=i,c.visible=j,c.ajax=k;var l=a(3),m=d(l),n=a(2),o=d(n),p=a(6),q=d(p),r=void 0,s=void 0,t=void 0;"classList"in o["default"].documentElement?(r=function(a,b){return void 0!==a.classList&&a.classList.contains(b)},s=function(a,b){return a.classList.add(b)},t=function(a,b){return a.classList.remove(b)}):(r=function(a,b){return new RegExp("\\b"+b+"\\b").test(a.className)},s=function(a,b){u(a,b)||(a.className+=" "+b)},t=function(a,b){a.className=a.className.replace(new RegExp("\\b"+b+"\\b","g"),"")});var u=c.hasClass=r,v=c.addClass=s,w=c.removeClass=t;q["default"].Utils=q["default"].Utils||{},q["default"].Utils.offset=e,q["default"].Utils.hasClass=u,q["default"].Utils.addClass=v,q["default"].Utils.removeClass=w,q["default"].Utils.toggleClass=f,q["default"].Utils.fadeIn=h,q["default"].Utils.fadeOut=g,q["default"].Utils.siblings=i,q["default"].Utils.visible=j,q["default"].Utils.ajax=k},{2:2,3:3,6:6}],25:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if("string"!=typeof a)throw new Error("Argument passed must be a string");var b={"&":"&","<":"<",">":">",'"':"""};return a.replace(/[&<>"]/g,function(a){return b[a]})}function f(a,b){var c=this,d=arguments,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!1;if("function"!=typeof a)throw new Error("First argument must be a function");if("number"!=typeof b)throw new Error("Second argument must be a numeric value");var f=void 0;return function(){var g=c,h=d,i=function(){f=null,e||a.apply(g,h)},j=e&&!f;clearTimeout(f),f=setTimeout(i,b),j&&a.apply(g,h)}}function g(a){return Object.getOwnPropertyNames(a).length<=0}function h(a,b){var c=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/,d={d:[],w:[]};return(a||"").split(" ").forEach(function(a){var e=""+a+(b?"."+b:"");e.startsWith(".")?(d.d.push(e),d.w.push(e)):d[c.test(a)?"w":"d"].push(e)}),d.d=d.d.join(" "),d.w=d.w.join(" "),d}function i(a,b){if("string"!=typeof a)throw new Error("Event name must be a string");var c=a.match(/[a-z]+\.([a-z]+)/),d={target:b};return null!==c&&(a=c[0],d.namespace=c[1]),new window.CustomEvent(a,{detail:d})}function j(a,b){return!!(a&&b&&2&a.compareDocumentPosition(b))}function k(a){return"string"==typeof a}Object.defineProperty(c,"__esModule",{value:!0}),c.escapeHTML=e,c.debounce=f,c.isObjectEmpty=g,c.splitEvents=h,c.createEvent=i,c.isNodeAfter=j,c.isString=k;var l=a(6),m=d(l);m["default"].Utils=m["default"].Utils||{},m["default"].Utils.escapeHTML=e,m["default"].Utils.debounce=f,m["default"].Utils.isObjectEmpty=g,m["default"].Utils.splitEvents=h,m["default"].Utils.createEvent=i,m["default"].Utils.isNodeAfter=j,m["default"].Utils.isString=k},{6:6}],26:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");var b=document.createElement("div");return b.innerHTML='<a href="'+m.escapeHTML(a)+'">x</a>',b.firstChild.href}function f(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return a&&!b?h(a):g(b)}function g(a){if("string"!=typeof a)throw new Error("`type` argument must be a string");return a&&~a.indexOf(";")?a.substr(0,a.indexOf(";")):a}function h(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");for(var b=0,c=n.length;c>b;b++){var d=n[b](a);if(d)return d}var e=i(a),f=j(e),g="video/mp4";return f&&(["mp4","m4v","ogg","ogv","webm","flv","mpeg","mov"].includes(f)?g="video/"+f:["mp3","oga","wav","mid","midi"].includes(f)&&(g="audio/"+f)),g}function i(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");var b=a.split("?")[0],c=b.split("\\").pop().split("/").pop();return c.indexOf(".")>-1?c.substring(c.lastIndexOf(".")+1):""}function j(a){if("string"!=typeof a)throw new Error("`extension` argument must be a string");switch(a){case"mp4":case"m4v":return"mp4";case"webm":case"webma":case"webmv":return"webm";case"ogg":case"oga":case"ogv":return"ogg";default:return a}}Object.defineProperty(c,"__esModule",{value:!0}),c.typeChecks=void 0,c.absolutizeUrl=e,c.formatType=f,c.getMimeFromType=g,c.getTypeFromFile=h,c.getExtension=i,c.normalizeExtension=j;var k=a(6),l=d(k),m=a(25),n=c.typeChecks=[];l["default"].Utils=l["default"].Utils||{},l["default"].Utils.typeChecks=n,l["default"].Utils.absolutizeUrl=e,l["default"].Utils.formatType=f,l["default"].Utils.getMimeFromType=g,l["default"].Utils.getTypeFromFile=h,l["default"].Utils.getExtension=i,l["default"].Utils.normalizeExtension=j},{25:25,6:6}],27:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e);!function(a){a.forEach(function(a){a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){this.parentNode.removeChild(this)}})})}([Element.prototype,CharacterData.prototype,DocumentType.prototype]),function(){function a(a,b){b=b||{bubbles:!1,cancelable:!1,detail:void 0};var c=f["default"].createEvent("CustomEvent");return c.initCustomEvent(a,b.bubbles,b.cancelable,b.detail),c}return"function"==typeof window.CustomEvent?!1:(a.prototype=window.Event.prototype,void(window.CustomEvent=a))}(),"function"!=typeof Object.assign&&(Object.assign=function(a){if(null===a||void 0===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1,d=arguments.length;d>c;c++){var e=arguments[c];if(null!==e)for(var f in e)Object.prototype.hasOwnProperty.call(e,f)&&(b[f]=e[f])}return b}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(a,b){if(null===this||void 0===this)throw new TypeError('"this" is null or not defined');var c=Object(this),d=c.length>>>0;if(0===d)return!1;for(var e=0|b,f=Math.max(e>=0?e:d-Math.abs(e),0);d>f;){if(c[f]===a)return!0;f++}return!1}}),String.prototype.includes||(String.prototype.includes=function(a,b){return"number"!=typeof b&&(b=0),b+a.length>this.length?!1:-1!==this.indexOf(a,b)}),String.prototype.startsWith||(String.prototype.startsWith=function(a,b){return b=b||0,this.substr(b,a.length)===a}),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(a){for(var b=(this.document||this.ownerDocument).querySelectorAll(a),c=b.length-1;--c>=0&&b.item(c)!==this;);return c>-1}),window.Element&&!Element.prototype.closest&&(Element.prototype.closest=function(a){var b=(this.document||this.ownerDocument).querySelectorAll(a),c=void 0,d=this;do for(c=b.length;--c>=0&&b.item(c)!==d;);while(0>c&&(d=d.parentElement));return d}),function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),d=Math.max(0,16-(c-a)),e=window.setTimeout(function(){b(c+d)},d);return a=c+d,e}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)})}()},{2:2}],28:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:25;return!(a%1===0)}function f(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:!1,c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!1,d=arguments.length>3&&void 0!==arguments[3]?arguments[3]:25,f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;a=!a||"number"!=typeof a||0>a?0:a;var g=Math.round(.066666*d),h=Math.round(d),i=24*Math.round(3600*d),j=Math.round(600*d),k=e(d)?";":":",l=void 0,m=void 0,n=void 0,o=void 0,p=Math.round(a*d);if(e(d)){0>p&&(p=i+p),p%=i;var q=Math.floor(p/j),r=p%j;p+=9*g*q,r>g&&(p+=g*Math.floor((r-g)/Math.round(60*h-g)));var s=Math.floor(p/h);l=Math.floor(Math.floor(s/60)/60),m=Math.floor(s/60)%60,n=c?s%60:(p/h%60).toFixed(f)}else l=Math.floor(a/3600)%24,m=Math.floor(a/60)%60,n=c?Math.floor(a%60):(a%60).toFixed(f);l=0>=l?0:l,m=0>=m?0:m,n=0>=n?0:n;var t=b||l>0?(10>l?"0"+l:l)+":":"";return t+=(10>m?"0"+m:m)+":",t+=""+(10>n?"0"+n:n),c&&(o=(p%h).toFixed(0),o=0>=o?0:o,t+=10>o?k+"0"+o:""+k+o),t}function g(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:25;if("string"!=typeof a)throw new TypeError("Time must be a string");if(a.indexOf(";")>0&&(a=a.replace(";",":")),!a.match(/\d{2}(\:\d{2}){0,3}/))throw new TypeError("Time code must have the format `00:00:00`");var c=a.split(":"),d=void 0,f=0,g=0,h=0,i=0,j=0,k=Math.round(.066666*b),l=Math.round(b),m=3600*l,n=60*l;switch(c.length){default:case 1:h=parseInt(c[0],10);break;case 2:g=parseInt(c[0],10),h=parseInt(c[1],10);break;case 3:f=parseInt(c[0],10),g=parseInt(c[1],10),h=parseInt(c[2],10);break;case 4:f=parseInt(c[0],10),g=parseInt(c[1],10),h=parseInt(c[2],10),i=parseInt(c[3],10)}return e(b)?(j=60*f+g,d=m*f+n*g+l*h+i-k*(j-Math.floor(j/10))):d=(m*f+n*g+b*h+i)/b,parseFloat(d.toFixed(3))}function h(a,b){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:25;a=!a||"number"!=typeof a||0>a?0:a;for(var d=Math.floor(a/3600)%24,e=Math.floor(a/60)%60,f=Math.floor(a%60),g=Math.floor((a%1*c).toFixed(3)),h=[[g,"f"],[f,"s"],[e,"m"],[d,"h"]],i=b.timeFormat,j=i[1]===i[0],k=j?2:1,l=i.length<k?i[k]:":",m=i[0],n=!1,o=0,p=h.length;p>o;o++)if(i.indexOf(h[o][1])>-1)n=!0;else if(n){for(var q=!1,r=o;p>r;r++)if(h[r][0]>0){q=!0;break}if(!q)break;j||(i=m+i),i=h[o][1]+l+i,j&&(i=h[o][1]+i),m=h[o][1]}b.currentTimeFormat=i}function i(a){if("string"!=typeof a)throw new TypeError("Argument must be a string value");a=a.replace(",",".");var b=a.indexOf(".")>-1?a.split(".")[1].length:0,c=0,d=1;a=a.split(":").reverse();for(var e=0,f=a.length;f>e;e++)d=1,e>0&&(d=Math.pow(60,e)),c+=Number(a[e])*d;return Number(c.toFixed(b))}Object.defineProperty(c,"__esModule",{value:!0}),c.isDropFrame=e,c.secondsToTimeCode=f,c.timeCodeToSeconds=g,c.calculateTimeFormat=h,c.convertSMPTEtoSeconds=i;var j=a(6),k=d(j);k["default"].Utils=k["default"].Utils||{},k["default"].Utils.secondsToTimeCode=f,k["default"].Utils.timeCodeToSeconds=g,k["default"].Utils.calculateTimeFormat=h,k["default"].Utils.convertSMPTEtoSeconds=i},{6:6}]},{},[27,5,4,14,21,18,17,19,20,22,15,16,8,9,10,11,12,13]); \ No newline at end of file diff --git a/lib/mejs/mediaelement.js b/lib/mejs/mediaelement.js index 5d4ee742..d1c069cf 100644 --- a/lib/mejs/mediaelement.js +++ b/lib/mejs/mediaelement.js @@ -1,1961 +1,4301 @@ /*! -* MediaElement.js -* HTML5 <video> and <audio> shim and player -* http://mediaelementjs.com/ -* -* Creates a JavaScript object that mimics HTML5 MediaElement API -* for browsers that don't understand HTML5 or can't play the provided codec -* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3 -* -* Copyright 2010-2014, John Dyer (http://j.hn) -* License: MIT -* -*/ + * MediaElement.js + * http://www.mediaelementjs.com/ + * + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) + * License: MIT + * + */(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){ + +},{}],2:[function(_dereq_,module,exports){ +(function (global){ +var topLevel = typeof global !== 'undefined' ? global : + typeof window !== 'undefined' ? window : {} +var minDoc = _dereq_(1); + +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 : {}) +},{"1":1}],3:[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 : {}) +},{}],4:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _en = _dereq_(8); + +var _general = _dereq_(16); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Locale. + * + * This object manages translations with pluralization. Also deals with WordPress compatibility. + * @type {Object} + */ +var i18n = { lang: 'en', en: _en.EN }; + +/** + * Language setter/getter + * + * @param {*} args Can pass the language code and/or the translation strings as an Object + * @return {string} + */ +i18n.language = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (args !== null && args !== undefined && args.length) { + + if (typeof args[0] !== 'string') { + throw new TypeError('Language code must be a string value'); + } + + if (!args[0].match(/^[a-z]{2}(\-[a-z]{2})?$/i)) { + throw new TypeError('Language code must have format `xx` or `xx-xx`'); + } + + i18n.lang = args[0]; + + // Check if language strings were added; otherwise, check the second argument or set to English as default + if (i18n[args[0]] === undefined) { + args[1] = args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object' ? args[1] : {}; + i18n[args[0]] = !(0, _general.isObjectEmpty)(args[1]) ? args[1] : _en.EN; + } else if (args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object') { + i18n[args[0]] = args[1]; + } + } + + return i18n.lang; +}; + +/** + * Translate a string in the language set up (or English by default) + * + * @param {string} message + * @param {number} pluralParam + * @return {string} + */ +i18n.t = function (message) { + var pluralParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + + if (typeof message === 'string' && message.length) { + + var str = void 0, + pluralForm = void 0; + + var language = i18n.language(); + + /** + * Modify string using algorithm to detect plural forms. + * + * @private + * @see http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings + * @param {String|String[]} input - String or array of strings to pick the plural form + * @param {Number} number - Number to determine the proper plural form + * @param {Number} form - Number of language family to apply plural form + * @return {String} + */ + var _plural = function _plural(input, number, form) { + + if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) !== 'object' || typeof number !== 'number' || typeof form !== 'number') { + return input; + } + + /** + * + * @return {Function[]} + * @private + */ + var _pluralForms = function () { + return [ + // 0: Chinese, Japanese, Korean, Persian, Turkish, Thai, Lao, Aymará, + // Tibetan, Chiga, Dzongkha, Indonesian, Lojban, Georgian, Kazakh, Khmer, Kyrgyz, Malay, + // Burmese, Yakut, Sundanese, Tatar, Uyghur, Vietnamese, Wolof + function () { + return arguments.length <= 1 ? undefined : arguments[1]; + }, + + // 1: Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish, Estonian, Finnish, + // Hungarian, Basque, Greek, Hebrew, Italian, Portuguese, Spanish, Catalan, Afrikaans, + // Angika, Assamese, Asturian, Azerbaijani, Bulgarian, Bengali, Bodo, Aragonese, Dogri, + // Esperanto, Argentinean Spanish, Fulah, Friulian, Galician, Gujarati, Hausa, + // Hindi, Chhattisgarhi, Armenian, Interlingua, Greenlandic, Kannada, Kurdish, Letzeburgesch, + // Maithili, Malayalam, Mongolian, Manipuri, Marathi, Nahuatl, Neapolitan, Norwegian Bokmal, + // Nepali, Norwegian Nynorsk, Norwegian (old code), Northern Sotho, Oriya, Punjabi, Papiamento, + // Piemontese, Pashto, Romansh, Kinyarwanda, Santali, Scots, Sindhi, Northern Sami, Sinhala, + // Somali, Songhay, Albanian, Swahili, Tamil, Telugu, Turkmen, Urdu, Yoruba + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // 2: French, Brazilian Portuguese, Acholi, Akan, Amharic, Mapudungun, Breton, Filipino, + // Gun, Lingala, Mauritian Creole, Malagasy, Maori, Occitan, Tajik, Tigrinya, Uzbek, Walloon + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // 3: Latvian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 0) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 4: Scottish Gaelic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1 || (arguments.length <= 0 ? undefined : arguments[0]) === 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2 || (arguments.length <= 0 ? undefined : arguments[0]) === 12) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 20) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 5: Romanian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 0 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 6: Lithuanian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return [3]; + } + }, + + // 7: Belarusian, Bosnian, Croatian, Serbian, Russian, Ukrainian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 8: Slovak, Czech + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) <= 4) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 9: Polish + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 10: Slovenian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 2) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 3 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 === 4) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else { + return arguments.length <= 1 ? undefined : arguments[1]; + } + }, + + // 11: Irish Gaelic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 7) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 6 && (arguments.length <= 0 ? undefined : arguments[0]) < 11) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else { + return arguments.length <= 5 ? undefined : arguments[5]; + } + }, + + // 12: Arabic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 3 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 <= 10) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 11) { + return arguments.length <= 5 ? undefined : arguments[5]; + } else { + return arguments.length <= 6 ? undefined : arguments[6]; + } + }, + + // 13: Maltese + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 11) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 > 10 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 14: Macedonian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 15: Icelandic + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) !== 11 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // New additions + + // 16: Kashubian + // In https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of__pluralRules + // Breton is listed as #16 but in the Localization Guide it belongs to the group 2 + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, + + // 17: Welsh + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 8 && (arguments.length <= 0 ? undefined : arguments[0]) !== 11) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 18: Javanese + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 0 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, + + // 19: Cornish + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 3) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, + + // 20: Mandinka + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }]; + }(); + + // Perform plural form or return original text + return _pluralForms[form].apply(null, [number].concat(input)); + }; + + // Fetch the localized version of the string + if (i18n[language] !== undefined) { + str = i18n[language][message]; + if (pluralParam !== null && typeof pluralParam === 'number') { + pluralForm = i18n[language]['mejs.plural-form']; + str = _plural.apply(null, [str, pluralParam, pluralForm]); + } + } + + // Fallback to default language if requested uid is not translated + if (!str && i18n.en) { + str = i18n.en[message]; + if (pluralParam !== null && typeof pluralParam === 'number') { + pluralForm = i18n.en['mejs.plural-form']; + str = _plural.apply(null, [str, pluralParam, pluralForm]); + } + } + + // As a last resort, use the requested uid, to mimic original behavior of i18n utils + // (in which uid was the english text) + str = str || message; + + // Replace token + if (pluralParam !== null && typeof pluralParam === 'number') { + str = str.replace('%1', pluralParam); + } + + return (0, _general.escapeHTML)(str); + } + + return message; +}; + +_mejs2.default.i18n = i18n; + +// `i18n` compatibility workflow with WordPress +if (typeof mejsL10n !== 'undefined') { + _mejs2.default.i18n.language(mejsL10n.language, mejsL10n.strings); +} + +exports.default = i18n; + +},{"16":16,"6":6,"8":8}],5:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _general = _dereq_(16); + +var _media = _dereq_(17); + +var _renderer = _dereq_(7); + +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"); } } + +/** + * Media Core + * + * This class is the foundation to create/render different media formats. + * @class MediaElement + */ +var MediaElement = function MediaElement(idOrNode, options) { + var _this = this; + + _classCallCheck(this, MediaElement); + + var t = this; + + t.defaults = { + /** + * List of the renderers to use + * @type {String[]} + */ + renderers: [], + /** + * Name of MediaElement container + * @type {String} + */ + fakeNodeName: 'mediaelementwrapper', + /** + * The path where shims are located + * @type {String} + */ + pluginPath: 'build/', + /** + * Flag in `<object>` and `<embed>` to determine whether to use local or CDN + * Possible values: 'always' (CDN version) or 'sameDomain' (local files) + */ + shimScriptAccess: 'sameDomain', + /** + * If error happens, set up HTML message + * @type {String} + */ + customError: '' + }; + + options = Object.assign(t.defaults, options); + + // create our node (note: older versions of iOS don't support Object.defineProperty on DOM nodes) + t.mediaElement = _document2.default.createElement(options.fakeNodeName); + t.mediaElement.options = options; + + var id = idOrNode, + error = false; + + if (typeof idOrNode === 'string') { + t.mediaElement.originalNode = _document2.default.getElementById(idOrNode); + } else { + t.mediaElement.originalNode = idOrNode; + id = idOrNode.id; + } + + id = id || 'mejs_' + Math.random().toString().slice(2); + + if (t.mediaElement.originalNode !== undefined && t.mediaElement.originalNode !== null && t.mediaElement.appendChild) { + // change id + t.mediaElement.originalNode.setAttribute('id', id + '_from_mejs'); + + // to avoid some issues with Javascript interactions in the plugin, set `preload=none` if not set + // only if video/audio tags are detected + var tagName = t.mediaElement.originalNode.tagName.toLowerCase(); + if (['video', 'audio'].includes(tagName) && !t.mediaElement.originalNode.getAttribute('preload')) { + t.mediaElement.originalNode.setAttribute('preload', 'none'); + } + + // add next to this one + t.mediaElement.originalNode.parentNode.insertBefore(t.mediaElement, t.mediaElement.originalNode); + + // insert this one inside + t.mediaElement.appendChild(t.mediaElement.originalNode); + } else { + // TODO: where to put the node? + } + + t.mediaElement.id = id; + t.mediaElement.renderers = {}; + t.mediaElement.renderer = null; + t.mediaElement.rendererName = null; + /** + * Determine whether the renderer was found or not + * + * @public + * @param {String} rendererName + * @param {Object[]} mediaFiles + * @return {Boolean} + */ + t.mediaElement.changeRenderer = function (rendererName, mediaFiles) { + + var t = _this; + + // check for a match on the current renderer + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && t.mediaElement.renderer.name === rendererName) { + t.mediaElement.renderer.pause(); + if (t.mediaElement.renderer.stop) { + t.mediaElement.renderer.stop(); + } + t.mediaElement.renderer.show(); + t.mediaElement.renderer.setSrc(mediaFiles[0].src); + return true; + } + + // if existing renderer is not the right one, then hide it + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer.pause(); + if (t.mediaElement.renderer.stop) { + t.mediaElement.renderer.stop(); + } + t.mediaElement.renderer.hide(); + } + + // see if we have the renderer already created + var newRenderer = t.mediaElement.renderers[rendererName], + newRendererType = null; + + if (newRenderer !== undefined && newRenderer !== null) { + newRenderer.show(); + newRenderer.setSrc(mediaFiles[0].src); + t.mediaElement.renderer = newRenderer; + t.mediaElement.rendererName = rendererName; + return true; + } + + var rendererArray = t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : _renderer.renderer.order; + + // find the desired renderer in the array of possible ones + for (var i = 0, total = rendererArray.length; i < total; i++) { + + var index = rendererArray[i]; + + if (index === rendererName) { + + // create the renderer + var rendererList = _renderer.renderer.renderers; + newRendererType = rendererList[index]; + + var renderOptions = Object.assign(newRendererType.options, t.mediaElement.options); + newRenderer = newRendererType.create(t.mediaElement, renderOptions, mediaFiles); + newRenderer.name = rendererName; + + // store for later + t.mediaElement.renderers[newRendererType.name] = newRenderer; + t.mediaElement.renderer = newRenderer; + t.mediaElement.rendererName = rendererName; + + newRenderer.show(); + + return true; + } + } + + return false; + }; + + /** + * Set the element dimensions based on selected renderer's setSize method + * + * @public + * @param {number} width + * @param {number} height + */ + t.mediaElement.setSize = function (width, height) { + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer.setSize(width, height); + } + }; + + /** + * + * @param {Object[]} urlList + */ + t.mediaElement.createErrorMessage = function (urlList) { + + urlList = Array.isArray(urlList) ? urlList : []; + + var errorContainer = _document2.default.createElement('div'); + errorContainer.className = 'me_cannotplay'; + errorContainer.style.width = '100%'; + errorContainer.style.height = '100%'; + + var errorContent = t.mediaElement.options.customError; + + if (!errorContent) { + + var poster = t.mediaElement.originalNode.getAttribute('poster'); + if (poster) { + errorContent += '<img src="' + poster + '" width="100%" height="100%" alt="' + _mejs2.default.i18n.t('mejs.download-file') + '">'; + } + + for (var i = 0, total = urlList.length; i < total; i++) { + var url = urlList[i]; + errorContent += '<a href="' + url.src + '" data-type="' + url.type + '"><span>' + _mejs2.default.i18n.t('mejs.download-file') + ': ' + url.src + '</span></a>'; + } + } + + errorContainer.innerHTML = errorContent; + + t.mediaElement.originalNode.parentNode.insertBefore(errorContainer, t.mediaElement.originalNode); + t.mediaElement.originalNode.style.display = 'none'; + error = true; + }; + + var props = _mejs2.default.html5media.properties, + methods = _mejs2.default.html5media.methods, + addProperty = function addProperty(obj, name, onGet, onSet) { + + // wrapper functions + var oldValue = obj[name]; + var getFn = function getFn() { + return onGet.apply(obj, [oldValue]); + }, + setFn = function setFn(newValue) { + oldValue = onSet.apply(obj, [newValue]); + return oldValue; + }; + + Object.defineProperty(obj, name, { + get: getFn, + set: setFn + }); + }, + assignGettersSetters = function assignGettersSetters(propName) { + if (propName !== 'src') { + (function () { + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1), + getFn = function getFn() { + return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer['get' + capName]() : null; + }, + setFn = function setFn(value) { + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer['set' + capName](value); + } + }; + + addProperty(t.mediaElement, propName, getFn, setFn); + t.mediaElement['get' + capName] = getFn; + t.mediaElement['set' + capName] = setFn; + })(); + } + }, + + // `src` is a property separated from the others since it carries the logic to set the proper renderer + // based on the media files detected + getSrc = function getSrc() { + return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer.getSrc() : null; + }, + setSrc = function setSrc(value) { + + var mediaFiles = []; + + // clean up URLs + if (typeof value === 'string') { + mediaFiles.push({ + src: value, + type: value ? (0, _media.getTypeFromFile)(value) : '' + }); + } else { + for (var i = 0, total = value.length; i < total; i++) { + + var src = (0, _media.absolutizeUrl)(value[i].src), + type = value[i].type; + + mediaFiles.push({ + src: src, + type: (type === '' || type === null || type === undefined) && src ? (0, _media.getTypeFromFile)(src) : type + }); + } + } + + // find a renderer and URL match + var renderInfo = _renderer.renderer.select(mediaFiles, t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : []), + event = void 0; + + // Ensure that the original gets the first source found + if (!t.mediaElement.paused) { + t.mediaElement.pause(); + event = (0, _general.createEvent)('pause', t.mediaElement); + t.mediaElement.dispatchEvent(event); + } + + t.mediaElement.originalNode.setAttribute('src', mediaFiles[0].src || ''); + + if (t.mediaElement.querySelector('.me_cannotplay')) { + t.mediaElement.querySelector('.me_cannotplay').remove(); + } + + // did we find a renderer? + if (renderInfo === null) { + t.mediaElement.createErrorMessage(mediaFiles); + event = (0, _general.createEvent)('error', t.mediaElement); + event.message = 'No renderer found'; + t.mediaElement.dispatchEvent(event); + return; + } + + // turn on the renderer (this checks for the existing renderer already) + t.mediaElement.changeRenderer(renderInfo.rendererName, mediaFiles); + + if (t.mediaElement.renderer === undefined || t.mediaElement.renderer === null) { + event = (0, _general.createEvent)('error', t.mediaElement); + event.message = 'Error creating renderer'; + t.mediaElement.dispatchEvent(event); + t.mediaElement.createErrorMessage(mediaFiles); + return; + } + }, + assignMethods = function assignMethods(methodName) { + // run the method on the current renderer + t.mediaElement[methodName] = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer[methodName] === 'function') { + try { + t.mediaElement.renderer[methodName](args); + } catch (e) { + t.mediaElement.createErrorMessage(); + } + } + return null; + }; + }; + + // Assign all methods/properties/events to fake node if renderer was found + addProperty(t.mediaElement, 'src', getSrc, setSrc); + t.mediaElement.getSrc = getSrc; + t.mediaElement.setSrc = setSrc; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } + + // IE && iOS + t.mediaElement.events = {}; + + // start: fake events + t.mediaElement.addEventListener = function (eventName, callback) { + // create or find the array of callbacks for this eventName + t.mediaElement.events[eventName] = t.mediaElement.events[eventName] || []; + + // push the callback into the stack + t.mediaElement.events[eventName].push(callback); + }; + t.mediaElement.removeEventListener = function (eventName, callback) { + // no eventName means remove all listeners + if (!eventName) { + t.mediaElement.events = {}; + return true; + } + + // see if we have any callbacks for this eventName + var callbacks = t.mediaElement.events[eventName]; + + if (!callbacks) { + return true; + } + + // check for a specific callback + if (!callback) { + t.mediaElement.events[eventName] = []; + return true; + } + + // remove the specific callback + for (var _i2 = 0; _i2 < callbacks.length; _i2++) { + if (callbacks[_i2] === callback) { + t.mediaElement.events[eventName].splice(_i2, 1); + return true; + } + } + return false; + }; + + /** + * + * @param {Event} event + */ + t.mediaElement.dispatchEvent = function (event) { + + var callbacks = t.mediaElement.events[event.type]; + + if (callbacks) { + for (var _i3 = 0; _i3 < callbacks.length; _i3++) { + callbacks[_i3].apply(null, [event]); + } + } + }; + + if (t.mediaElement.originalNode !== null) { + var mediaFiles = []; + + switch (t.mediaElement.originalNode.nodeName.toLowerCase()) { + + case 'iframe': + mediaFiles.push({ + type: '', + src: t.mediaElement.originalNode.getAttribute('src') + }); + + break; + + case 'audio': + case 'video': + var n = void 0, + src = void 0, + type = void 0, + sources = t.mediaElement.originalNode.childNodes.length, + nodeSource = t.mediaElement.originalNode.getAttribute('src'); + + // Consider if node contains the `src` and `type` attributes + if (nodeSource) { + var node = t.mediaElement.originalNode; + mediaFiles.push({ + type: (0, _media.formatType)(nodeSource, node.getAttribute('type')), + src: nodeSource + }); + } + + // test <source> types to see if they are usable + for (var _i4 = 0; _i4 < sources; _i4++) { + n = t.mediaElement.originalNode.childNodes[_i4]; + if (n.nodeType === Node.ELEMENT_NODE && n.tagName.toLowerCase() === 'source') { + src = n.getAttribute('src'); + type = (0, _media.formatType)(src, n.getAttribute('type')); + mediaFiles.push({ type: type, src: src }); + } + } + break; + } + + if (mediaFiles.length > 0) { + t.mediaElement.src = mediaFiles; + } + } + + if (t.mediaElement.options.success) { + t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode); + } + + if (error && t.mediaElement.options.error) { + t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode); + } + + return t.mediaElement; +}; + +_window2.default.MediaElement = MediaElement; + +exports.default = MediaElement; + +},{"16":16,"17":17,"2":2,"3":3,"6":6,"7":7}],6:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + // Namespace -var mejs = mejs || {}; +var mejs = {}; + +// version number +mejs.version = '4.0.2'; + +// Basic HTML5 settings +mejs.html5media = { + /** + * @type {String[]} + */ + properties: [ + // GET/SET + 'volume', 'src', 'currentTime', 'muted', + + // GET only + 'duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable', + + // OTHERS + 'currentSrc', 'preload', 'bufferedBytes', 'bufferedTime', 'initialTime', 'startOffsetTime', 'defaultPlaybackRate', 'playbackRate', 'played', 'autoplay', 'loop', 'controls'], + readOnlyProperties: ['duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable'], + /** + * @type {String[]} + */ + methods: ['load', 'play', 'pause', 'canPlayType'], + /** + * @type {String[]} + */ + events: ['loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange'], + /** + * @type {String[]} + */ + mediaTypes: ['audio/mp3', 'audio/ogg', 'audio/oga', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav', 'audio/mpeg', 'audio/mp4', 'video/mp4', 'video/webm', 'video/ogg'] +}; + +_window2.default.mejs = mejs; + +exports.default = mejs; + +},{"3":3}],7:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.renderer = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +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"); } } + +/** + * + * Class to manage renderer selection and addition. + * @class Renderer + */ +var Renderer = function () { + function Renderer() { + _classCallCheck(this, Renderer); + + this.renderers = {}; + this.order = []; + } + + /** + * Register a new renderer. + * + * @param {Object} renderer - An object with all the rendered information (name REQUIRED) + * @method add + */ + + + _createClass(Renderer, [{ + key: 'add', + value: function add(renderer) { + + if (renderer.name === undefined) { + throw new TypeError('renderer must contain at least `name` property'); + } + + this.renderers[renderer.name] = renderer; + this.order.push(renderer.name); + } + + /** + * Iterate a list of renderers to determine which one should the player use. + * + * @param {Object[]} mediaFiles - A list of source and type obtained from video/audio/source tags: [{src:'',type:''}] + * @param {?String[]} renderers - Optional list of pre-selected renderers + * @return {?Object} The renderer's name and source selected + * @method select + */ + + }, { + key: 'select', + value: function select(mediaFiles) { + var renderers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + + + var renderersLength = renderers.length; + + renderers = renderers.length ? renderers : this.order; + + // If renderers are not set, set a default order: + // 1) Native renderers (HTML5, HLS, M(PEG)-DASH, FLV) + // 2) Flash shims (RTMP, FLV, HLS, M(PEG)-DASH, MP3, OGG) + // 3) Iframe renderers (YouTube, SoundCloud, Facebook. etc.) + if (!renderersLength) { + (function () { + var rendererIndicator = [/^(html5|native)/, /^flash/, /iframe$/], + rendererRanking = function rendererRanking(renderer) { + for (var i = 0, total = rendererIndicator.length; i < total; i++) { + if (renderer.match(rendererIndicator[i]) !== null) { + return i; + } + } + return rendererIndicator.length; + }; + + renderers.sort(function (a, b) { + return rendererRanking(a) - rendererRanking(b); + }); + })(); + } + + for (var i = 0, total = renderers.length; i < total; i++) { + var key = renderers[i], + _renderer = this.renderers[key]; + + if (_renderer !== null && _renderer !== undefined) { + for (var j = 0, jl = mediaFiles.length; j < jl; j++) { + if (typeof _renderer.canPlayType === 'function' && typeof mediaFiles[j].type === 'string' && _renderer.canPlayType(mediaFiles[j].type)) { + return { + rendererName: _renderer.name, + src: mediaFiles[j].src + }; + } + } + } + } + + return null; + } + + // Setters/getters + + }, { + key: 'order', + set: function set(order) { + + if (!Array.isArray(order)) { + throw new TypeError('order must be an array of strings.'); + } + + this._order = order; + }, + get: function get() { + return this._order; + } + }, { + key: 'renderers', + set: function set(renderers) { + + if (renderers !== null && (typeof renderers === 'undefined' ? 'undefined' : _typeof(renderers)) !== 'object') { + throw new TypeError('renderers must be an array of objects.'); + } + + this._renderers = renderers; + }, + get: function get() { + return this._renderers; + } + }]); + + return Renderer; +}(); + +var renderer = exports.renderer = new Renderer(); + +_mejs2.default.Renderers = renderer; + +},{"6":6}],8:[function(_dereq_,module,exports){ +'use strict'; + +/*! + * This is a `i18n` language object. + * + * English; This can serve as a template for other languages to translate + * + * @author + * TBD + * Sascha Greuel (Twitter: @SoftCreatR) + * + * @see core/i18n.js + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var EN = exports.EN = { + "mejs.plural-form": 1, + + // core/mediaelement.js + "mejs.download-file": "Download File", + + // renderers/flash.js + "mejs.install-flash": "You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/", + + // features/fullscreen.js + "mejs.fullscreen": "Fullscreen", + + // features/playpause.js + "mejs.play": "Play", + "mejs.pause": "Pause", + + // features/progress.js + "mejs.time-slider": "Time Slider", + "mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.", + "mejs.live-broadcast": "Live Broadcast", + + // features/volume.js + "mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.", + "mejs.unmute": "Unmute", + "mejs.mute": "Mute", + "mejs.volume-slider": "Volume Slider", + + // core/player.js + "mejs.video-player": "Video Player", + "mejs.audio-player": "Audio Player", + + // features/tracks.js + "mejs.captions-subtitles": "Captions/Subtitles", + "mejs.captions-chapters": "Chapters", + "mejs.none": "None", + "mejs.afrikaans": "Afrikaans", + "mejs.albanian": "Albanian", + "mejs.arabic": "Arabic", + "mejs.belarusian": "Belarusian", + "mejs.bulgarian": "Bulgarian", + "mejs.catalan": "Catalan", + "mejs.chinese": "Chinese", + "mejs.chinese-simplified": "Chinese (Simplified)", + "mejs.chinese-traditional": "Chinese (Traditional)", + "mejs.croatian": "Croatian", + "mejs.czech": "Czech", + "mejs.danish": "Danish", + "mejs.dutch": "Dutch", + "mejs.english": "English", + "mejs.estonian": "Estonian", + "mejs.filipino": "Filipino", + "mejs.finnish": "Finnish", + "mejs.french": "French", + "mejs.galician": "Galician", + "mejs.german": "German", + "mejs.greek": "Greek", + "mejs.haitian-creole": "Haitian Creole", + "mejs.hebrew": "Hebrew", + "mejs.hindi": "Hindi", + "mejs.hungarian": "Hungarian", + "mejs.icelandic": "Icelandic", + "mejs.indonesian": "Indonesian", + "mejs.irish": "Irish", + "mejs.italian": "Italian", + "mejs.japanese": "Japanese", + "mejs.korean": "Korean", + "mejs.latvian": "Latvian", + "mejs.lithuanian": "Lithuanian", + "mejs.macedonian": "Macedonian", + "mejs.malay": "Malay", + "mejs.maltese": "Maltese", + "mejs.norwegian": "Norwegian", + "mejs.persian": "Persian", + "mejs.polish": "Polish", + "mejs.portuguese": "Portuguese", + "mejs.romanian": "Romanian", + "mejs.russian": "Russian", + "mejs.serbian": "Serbian", + "mejs.slovak": "Slovak", + "mejs.slovenian": "Slovenian", + "mejs.spanish": "Spanish", + "mejs.swahili": "Swahili", + "mejs.swedish": "Swedish", + "mejs.tagalog": "Tagalog", + "mejs.thai": "Thai", + "mejs.turkish": "Turkish", + "mejs.ukrainian": "Ukrainian", + "mejs.vietnamese": "Vietnamese", + "mejs.welsh": "Welsh", + "mejs.yiddish": "Yiddish" +}; + +},{}],9:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _renderer = _dereq_(7); + +var _general = _dereq_(16); + +var _media = _dereq_(17); + +var _constants = _dereq_(15); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Native M(PEG)-Dash renderer + * + * Uses dash.js, a reference client implementation for the playback of M(PEG)-DASH via Javascript and compliant browsers. + * It relies on HTML5 video and MediaSource Extensions for playback. + * This renderer integrates new events associated with mpd files. + * @see https://github.com/Dash-Industry-Forum/dash.js + * + */ +var NativeDash = { + /** + * @type {Boolean} + */ + isMediaLoaded: false, + /** + * @type {Array} + */ + creationQueue: [], + + /** + * Create a queue to prepare the loading of an DASH source + * + * @param {Object} settings - an object with settings needed to load an DASH player instance + */ + prepareSettings: function prepareSettings(settings) { + if (NativeDash.isLoaded) { + NativeDash.createInstance(settings); + } else { + NativeDash.loadScript(settings); + NativeDash.creationQueue.push(settings); + } + }, + + /** + * Load dash.mediaplayer.js script on the header of the document + * + * @param {Object} settings - an object with settings needed to load an DASH player instance + */ + loadScript: function loadScript(settings) { + + // Skip script loading since it is already loaded + if (typeof dashjs !== 'undefined') { + NativeDash.createInstance(settings); + } else if (!NativeDash.isScriptLoaded) { + (function () { + + settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : '//cdn.dashjs.org/latest/dash.mediaplayer.min.js'; + + var script = _document2.default.createElement('script'), + firstScriptTag = _document2.default.getElementsByTagName('script')[0]; + + var done = false; + + script.src = settings.options.path; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function () { + if (!done && (!this.readyState || this.readyState === undefined || this.readyState === 'loaded' || this.readyState === 'complete')) { + done = true; + NativeDash.mediaReady(); + script.onload = script.onreadystatechange = null; + } + }; + + firstScriptTag.parentNode.insertBefore(script, firstScriptTag); + + NativeDash.isScriptLoaded = true; + })(); + } + }, + + /** + * Process queue of DASH player creation + * + */ + mediaReady: function mediaReady() { + + NativeDash.isLoaded = true; + NativeDash.isScriptLoaded = true; + + while (NativeDash.creationQueue.length > 0) { + var settings = NativeDash.creationQueue.pop(); + NativeDash.createInstance(settings); + } + }, + + /** + * Create a new instance of DASH player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to instantiate DASH object + */ + createInstance: function createInstance(settings) { + + var player = dashjs.MediaPlayer().create(); + _window2.default['__ready__' + settings.id](player); + } +}; + +var DashNativeRenderer = { + name: 'native_dash', + + options: { + prefix: 'native_dash', + dash: { + // Special config: used to set the local path/URL of dash.js player library + path: '//cdn.dashjs.org/latest/dash.mediaplayer.min.js', + debug: false + } + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return _constants.HAS_MSE && ['application/dash+xml'].includes(type); + }, + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var originalNode = mediaElement.originalNode, + id = mediaElement.id + '_' + options.prefix, + preload = originalNode.getAttribute('preload'), + autoplay = originalNode.autoplay; + + var node = null, + dashPlayer = null; + + node = originalNode.cloneNode(true); + options = Object.assign(options, mediaElement.options); + + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + node['get' + capName] = function () { + return dashPlayer !== null ? node[propName] : null; + }; + + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + if (dashPlayer !== null) { + if (propName === 'src') { + + dashPlayer.attachSource(value); + if (autoplay) { + node.play(); + } + } + + node[propName] = value; + } + } + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // Initial method to register all M-Dash events + _window2.default['__ready__' + id] = function (_dashPlayer) { + + mediaElement.dashPlayer = dashPlayer = _dashPlayer; + + dashPlayer.getDebug().setLogToBrowserConsole(options.dash.debug); + dashPlayer.setAutoPlay(preload && preload === 'auto' || autoplay); + dashPlayer.setScheduleWhilePaused(preload && preload === 'auto' || autoplay); + + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + dashEvents = dashjs.MediaPlayer.events, + assignEvents = function assignEvents(eventName) { + + if (eventName === 'loadedmetadata') { + dashPlayer.initialize(node, node.src, false); + } + + node.addEventListener(eventName, function (e) { + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; + + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); + } + + /** + * Custom M(PEG)-DASH events + * + * These events can be attached to the original node using addEventListener and the name of the event, + * not using dashjs.MediaPlayer.events object + * @see http://cdn.dashjs.org/latest/jsdoc/MediaPlayerEvents.html + */ + var assignMdashEvents = function assignMdashEvents(e) { + var event = (0, _general.createEvent)(e.type, node); + event.data = e; + mediaElement.dispatchEvent(event); + + if (e.type.toLowerCase() === 'error') { + console.error(e); + } + }; + + for (var eventType in dashEvents) { + if (dashEvents.hasOwnProperty(eventType)) { + dashPlayer.on(dashEvents[eventType], assignMdashEvents); + } + } + }; + + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } + + node.setAttribute('id', id); + + originalNode.parentNode.insertBefore(node, originalNode); + originalNode.autoplay = false; + originalNode.style.display = 'none'; + + NativeDash.prepareSettings({ + options: options.dash, + id: id + }); + + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; + + node.hide = function () { + node.pause(); + node.style.display = 'none'; + return node; + }; + + node.show = function () { + node.style.display = ''; + return node; + }; + + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); + + return node; + } +}; + +/** + * Register Native M(PEG)-Dash type based on URL structure + * + */ +_media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('.mpd') ? 'application/dash+xml' : null; +}); + +_renderer.renderer.add(DashNativeRenderer); + +},{"15":15,"16":16,"17":17,"2":2,"3":3,"6":6,"7":7}],10:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PluginDetector = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _renderer = _dereq_(7); + +var _general = _dereq_(16); + +var _constants = _dereq_(15); + +var _media = _dereq_(17); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Shim that falls back to Flash if a media type is not supported. + * + * Any format not supported natively, including, RTMP, FLV, HLS and M(PEG)-DASH (if browser does not support MSE), + * will play using Flash. + */ + +/** + * Core detector, plugins are added below + * + */ +var PluginDetector = exports.PluginDetector = { + /** + * Cached version numbers + * @type {Array} + */ + plugins: [], + + /** + * Test a plugin version number + * @param {String} plugin - In this scenario 'flash' will be tested + * @param {Array} v - An array containing the version up to 3 numbers (major, minor, revision) + * @return {Boolean} + */ + hasPluginVersion: function hasPluginVersion(plugin, v) { + var pv = PluginDetector.plugins[plugin]; + v[1] = v[1] || 0; + v[2] = v[2] || 0; + return pv[0] > v[0] || pv[0] === v[0] && pv[1] > v[1] || pv[0] === v[0] && pv[1] === v[1] && pv[2] >= v[2]; + }, + + /** + * Detect plugin and store its version number + * + * @see PluginDetector.detectPlugin + * @param {String} p + * @param {String} pluginName + * @param {String} mimeType + * @param {String} activeX + * @param {Function} axDetect + */ + addPlugin: function addPlugin(p, pluginName, mimeType, activeX, axDetect) { + PluginDetector.plugins[p] = PluginDetector.detectPlugin(pluginName, mimeType, activeX, axDetect); + }, + + /** + * Obtain version number from the mime-type (all but IE) or ActiveX (IE) + * + * @param {String} pluginName + * @param {String} mimeType + * @param {String} activeX + * @param {Function} axDetect + * @return {int[]} + */ + detectPlugin: function detectPlugin(pluginName, mimeType, activeX, axDetect) { + + var version = [0, 0, 0], + description = void 0, + ax = void 0; + + // Firefox, Webkit, Opera; avoid MS Edge since `plugins` cannot be accessed + if (_constants.NAV.plugins !== null && _constants.NAV.plugins !== undefined && _typeof(_constants.NAV.plugins[pluginName]) === 'object') { + description = _constants.NAV.plugins[pluginName].description; + if (description && !(typeof _constants.NAV.mimeTypes !== 'undefined' && _constants.NAV.mimeTypes[mimeType] && !_constants.NAV.mimeTypes[mimeType].enabledPlugin)) { + version = description.replace(pluginName, '').replace(/^\s+/, '').replace(/\sr/gi, '.').split('.'); + for (var i = 0, total = version.length; i < total; i++) { + version[i] = parseInt(version[i].match(/\d+/), 10); + } + } + // Internet Explorer / ActiveX + } else if (_window2.default.ActiveXObject !== undefined) { + try { + ax = new ActiveXObject(activeX); + if (ax) { + version = axDetect(ax); + } + } catch (e) { + + } + } + return version; + } +}; + +/** + * Add Flash detection + * + */ +PluginDetector.addPlugin('flash', 'Shockwave Flash', 'application/x-shockwave-flash', 'ShockwaveFlash.ShockwaveFlash', function (ax) { + // adapted from SWFObject + var version = [], + d = ax.GetVariable("$version"); + + if (d) { + d = d.split(" ")[1].split(","); + version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + return version; +}); + +var FlashMediaElementRenderer = { + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var flash = {}; + + // store main variable + flash.options = options; + flash.id = mediaElement.id + '_' + flash.options.prefix; + flash.mediaElement = mediaElement; + + // insert data + flash.flashState = {}; + flash.flashApi = null; + flash.flashApiStack = []; + + // mediaElements for get/set + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + + // add to flash state that we will store + flash.flashState[propName] = null; + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + flash['get' + capName] = function () { + + if (flash.flashApi !== null) { + + if (flash.flashApi['get_' + propName] !== undefined) { + var _ret = function () { + var value = flash.flashApi['get_' + propName](); + + // special case for buffered to conform to HTML5's newest + if (propName === 'buffered') { + return { + v: { + start: function start() { + return 0; + }, + end: function end() { + return value; + }, + length: 1 + } + }; + } + + return { + v: value + }; + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + } else { + return null; + } + } else { + return null; + } + }; + + flash['set' + capName] = function (value) { + if (propName === 'src') { + value = (0, _media.absolutizeUrl)(value); + } + + // send value to Flash + if (flash.flashApi !== null && flash.flashApi['set_' + propName] !== undefined) { + flash.flashApi['set_' + propName](value); + } else { + // store for after "READY" event fires + flash.flashApiStack.push({ + type: 'set', + propName: propName, + value: value + }); + } + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // add mediaElements for native methods + var methods = _mejs2.default.html5media.methods, + assignMethods = function assignMethods(methodName) { + + // run the method on the native HTMLMediaElement + flash[methodName] = function () { + + if (flash.flashApi !== null) { + + // send call up to Flash ExternalInterface API + if (flash.flashApi['fire_' + methodName]) { + try { + flash.flashApi['fire_' + methodName](); + } catch (e) { + + } + } else { + + } + } else { + // store for after "READY" event fires + flash.flashApiStack.push({ + type: 'call', + methodName: methodName + }); + } + }; + }; + methods.push('stop'); + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } + + // give initial events like in others renderers + var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay', 'error']; + + for (var _i2 = 0, _total2 = initEvents.length; _i2 < _total2; _i2++) { + var event = (0, _general.createEvent)(initEvents[_i2], flash); + mediaElement.dispatchEvent(event); + } + + // add a ready method that Flash can call to + _window2.default['__ready__' + flash.id] = function () { + + flash.flashReady = true; + flash.flashApi = _document2.default.getElementById('__' + flash.id); + + // do call stack + if (flash.flashApiStack.length) { + for (var _i3 = 0, _total3 = flash.flashApiStack.length; _i3 < _total3; _i3++) { + + var stackItem = flash.flashApiStack[_i3]; + + if (stackItem.type === 'set') { + var propName = stackItem.propName, + capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + flash['set' + capName](stackItem.value); + } else if (stackItem.type === 'call') { + flash[stackItem.methodName](); + } + } + } + }; + + _window2.default['__event__' + flash.id] = function (eventName, message) { + + var event = (0, _general.createEvent)(eventName, flash); + event.message = message || ''; + + // send event from Flash up to the mediaElement + flash.mediaElement.dispatchEvent(event); + }; + + // insert Flash object + flash.flashWrapper = _document2.default.createElement('div'); + + // If the access script flag does not have any of the valid values, set to `sameDomain` by default + if (!['always', 'sameDomain'].includes(flash.options.shimScriptAccess)) { + flash.options.shimScriptAccess = 'sameDomain'; + } + + var autoplay = mediaElement.originalNode.autoplay, + flashVars = ['uid=' + flash.id, 'autoplay=' + autoplay, 'allowScriptAccess=' + flash.options.shimScriptAccess], + isVideo = mediaElement.originalNode !== null && mediaElement.originalNode.tagName.toLowerCase() === 'video', + flashHeight = isVideo ? mediaElement.originalNode.height : 1, + flashWidth = isVideo ? mediaElement.originalNode.width : 1; + + if (mediaElement.originalNode.getAttribute('src')) { + flashVars.push('src=' + mediaElement.originalNode.getAttribute('src')); + } + + if (flash.options.enablePseudoStreaming === true) { + flashVars.push('pseudostreamstart=' + flash.options.pseudoStreamingStartQueryParam); + flashVars.push('pseudostreamtype=' + flash.options.pseudoStreamingType); + } + + mediaElement.appendChild(flash.flashWrapper); + + if (mediaElement.originalNode !== null) { + mediaElement.originalNode.style.display = 'none'; + } + + var settings = []; + + if (_constants.IS_IE) { + var specialIEContainer = _document2.default.createElement('div'); + flash.flashWrapper.appendChild(specialIEContainer); + + settings = ['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"', 'codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"', 'id="__' + flash.id + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"']; + + if (!isVideo) { + settings.push('style="clip: rect(0 0 0 0); position: absolute;"'); + } + + specialIEContainer.outerHTML = '<object ' + settings.join(' ') + '>' + ('<param name="movie" value="' + flash.options.pluginPath + flash.options.filename + '?x=' + new Date() + '" />') + ('<param name="flashvars" value="' + flashVars.join('&') + '" />') + '<param name="quality" value="high" />' + '<param name="bgcolor" value="#000000" />' + '<param name="wmode" value="transparent" />' + ('<param name="allowScriptAccess" value="' + flash.options.shimScriptAccess + '" />') + '<param name="allowFullScreen" value="true" />' + ('<div>' + _i18n2.default.t('mejs.install-flash') + '</div>') + '</object>'; + } else { + + settings = ['id="__' + flash.id + '"', 'name="__' + flash.id + '"', 'play="true"', 'loop="false"', 'quality="high"', 'bgcolor="#000000"', 'wmode="transparent"', 'allowScriptAccess="' + flash.options.shimScriptAccess + '"', 'allowFullScreen="true"', 'type="application/x-shockwave-flash"', 'pluginspage="//www.macromedia.com/go/getflashplayer"', 'src="' + flash.options.pluginPath + flash.options.filename + '"', 'flashvars="' + flashVars.join('&') + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"']; + + if (!isVideo) { + settings.push('style="clip: rect(0 0 0 0); position: absolute;"'); + } + + flash.flashWrapper.innerHTML = '<embed ' + settings.join(' ') + '>'; + } + + flash.flashNode = flash.flashWrapper.lastChild; + + flash.hide = function () { + if (isVideo) { + flash.flashNode.style.position = 'absolute'; + flash.flashNode.style.width = '1px'; + flash.flashNode.style.height = '1px'; + try { + flash.flashNode.style.clip = 'rect(0 0 0 0);'; + } catch (e) { + + } + } + }; + flash.show = function () { + if (isVideo) { + flash.flashNode.style.position = ''; + flash.flashNode.style.width = ''; + flash.flashNode.style.height = ''; + try { + flash.flashNode.style.clip = ''; + } catch (e) { + + } + } + }; + flash.setSize = function (width, height) { + flash.flashNode.style.width = width + 'px'; + flash.flashNode.style.height = height + 'px'; + + if (flash.flashApi !== null && typeof flash.flashApi.fire_setSize === 'function') { + flash.flashApi.fire_setSize(width, height); + } + }; + + flash.destroy = function () { + flash.flashNode.remove(); + }; + + if (mediaFiles && mediaFiles.length > 0) { + for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) { + flash.setSrc(mediaFiles[_i4].src); + break; + } + } + } + + return flash; + } +}; + +var hasFlash = PluginDetector.hasPluginVersion('flash', [10, 0, 0]); + +if (hasFlash) { + + /** + * Register media type based on URL structure if Flash is detected + * + */ + _media.typeChecks.push(function (url) { + + url = url.toLowerCase(); + + if (url.startsWith('rtmp')) { + if (url.includes('.mp3')) { + return 'audio/rtmp'; + } else { + return 'video/rtmp'; + } + } else if (url.includes('.oga') || url.includes('.ogg')) { + return 'audio/ogg'; + } else if (url.includes('.m3u8')) { + return 'application/x-mpegURL'; + } else if (url.includes('.mpd')) { + return 'application/dash+xml'; + } else if (url.includes('.flv')) { + return 'video/flv'; + } else { + return null; + } + }); + + // VIDEO + var FlashMediaElementVideoRenderer = { + name: 'flash_video', + + options: { + prefix: 'flash_video', + filename: 'mediaelement-flash-video.swf', + enablePseudoStreaming: false, + // start query parameter sent to server for pseudo-streaming + pseudoStreamingStartQueryParam: 'start', + // pseudo streaming type: use `time` for time based seeking (MP4) or `byte` for file byte position (FLV) + pseudoStreamingType: 'byte' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['video/mp4', 'video/rtmp', 'audio/rtmp', 'rtmp/mp4', 'audio/mp4', 'video/flv', 'video/x-flv'].includes(type.toLowerCase()); + }, + + create: FlashMediaElementRenderer.create + + }; + _renderer.renderer.add(FlashMediaElementVideoRenderer); + + // HLS + var FlashMediaElementHlsVideoRenderer = { + name: 'flash_hls', + + options: { + prefix: 'flash_hls', + filename: 'mediaelement-flash-video-hls.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()); + }, + + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementHlsVideoRenderer); + + // M(PEG)-DASH + var FlashMediaElementMdashVideoRenderer = { + name: 'flash_dash', + + options: { + prefix: 'flash_dash', + filename: 'mediaelement-flash-video-mdash.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['application/dash+xml'].includes(type.toLowerCase()); + }, + + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementMdashVideoRenderer); + + // AUDIO + var FlashMediaElementAudioRenderer = { + name: 'flash_audio', + + options: { + prefix: 'flash_audio', + filename: 'mediaelement-flash-audio.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['audio/mp3'].includes(type.toLowerCase()); + }, + + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementAudioRenderer); + + // AUDIO - ogg + var FlashMediaElementAudioOggRenderer = { + name: 'flash_audio_ogg', + + options: { + prefix: 'flash_audio_ogg', + filename: 'mediaelement-flash-audio-ogg.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['audio/ogg', 'audio/oga', 'audio/ogv'].includes(type.toLowerCase()); + }, + + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementAudioOggRenderer); +} + +},{"15":15,"16":16,"17":17,"2":2,"3":3,"4":4,"6":6,"7":7}],11:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _renderer = _dereq_(7); + +var _general = _dereq_(16); + +var _constants = _dereq_(15); + +var _media = _dereq_(17); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Native FLV renderer + * + * Uses flv.js, which is a JavaScript library which implements mechanisms to play flv files inspired by flv.js. + * It relies on HTML5 video and MediaSource Extensions for playback. + * Currently, it can only play files with the same origin. + * + * @see https://github.com/Bilibili/flv.js + * + */ +var NativeFlv = { + /** + * @type {Boolean} + */ + isMediaStarted: false, + /** + * @type {Boolean} + */ + isMediaLoaded: false, + /** + * @type {Array} + */ + creationQueue: [], + + /** + * Create a queue to prepare the loading of an FLV source + * @param {Object} settings - an object with settings needed to load an FLV player instance + */ + prepareSettings: function prepareSettings(settings) { + if (NativeFlv.isLoaded) { + NativeFlv.createInstance(settings); + } else { + NativeFlv.loadScript(settings); + NativeFlv.creationQueue.push(settings); + } + }, + + /** + * Load flv.js script on the header of the document + * + * @param {Object} settings - an object with settings needed to load an FLV player instance + */ + loadScript: function loadScript(settings) { + + // Skip script loading since it is already loaded + if (typeof flvjs !== 'undefined') { + NativeFlv.createInstance(settings); + } else if (!NativeFlv.isMediaStarted) { + (function () { + + settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : '//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js'; + + var script = _document2.default.createElement('script'), + firstScriptTag = _document2.default.getElementsByTagName('script')[0]; + + var done = false; + + script.src = settings.options.path; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function () { + if (!done && (!this.readyState || this.readyState === undefined || this.readyState === 'loaded' || this.readyState === 'complete')) { + done = true; + NativeFlv.mediaReady(); + script.onload = script.onreadystatechange = null; + } + }; + + firstScriptTag.parentNode.insertBefore(script, firstScriptTag); + NativeFlv.isMediaStarted = true; + })(); + } + }, + + /** + * Process queue of FLV player creation + * + */ + mediaReady: function mediaReady() { + NativeFlv.isLoaded = true; + NativeFlv.isMediaLoaded = true; + + while (NativeFlv.creationQueue.length > 0) { + var settings = NativeFlv.creationQueue.pop(); + NativeFlv.createInstance(settings); + } + }, + + /** + * Create a new instance of FLV player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to instantiate FLV object + */ + createInstance: function createInstance(settings) { + var player = flvjs.createPlayer(settings.options); + _window2.default['__ready__' + settings.id](player); + } +}; -// version number -mejs.version = '2.15.1'; - - -// player number (for missing, same id attr) -mejs.meIndex = 0; - -// media types accepted by plugins -mejs.plugins = { - silverlight: [ - {version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']} - ], - flash: [ - {version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a','audio/mpeg', 'video/youtube', 'video/x-youtube', 'application/x-mpegURL']} - //,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!) - ], - youtube: [ - {version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']} - ], - vimeo: [ - {version: null, types: ['video/vimeo', 'video/x-vimeo']} - ] +var FlvNativeRenderer = { + name: 'native_flv', + + options: { + prefix: 'native_flv', + flv: { + // Special config: used to set the local path/URL of flv.js library + path: '//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js', + // To modify more elements from FLV player, + // see https://github.com/Bilibili/flv.js/blob/master/docs/api.md#config + cors: true + } + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return _constants.HAS_MSE && ['video/x-flv', 'video/flv'].includes(type); + }, + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var originalNode = mediaElement.originalNode, + id = mediaElement.id + '_' + options.prefix; + + var node = null, + flvPlayer = null; + + node = originalNode.cloneNode(true); + options = Object.assign(options, mediaElement.options); + + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + node['get' + capName] = function () { + return flvPlayer !== null ? node[propName] : null; + }; + + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + if (flvPlayer !== null) { + node[propName] = value; + + if (propName === 'src') { + flvPlayer.unload(); + flvPlayer.detachMediaElement(); + flvPlayer.attachMediaElement(node); + flvPlayer.load(); + } + } + } + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // Initial method to register all FLV events + _window2.default['__ready__' + id] = function (_flvPlayer) { + + mediaElement.flvPlayer = flvPlayer = _flvPlayer; + + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + assignEvents = function assignEvents(eventName) { + + if (eventName === 'loadedmetadata') { + + flvPlayer.unload(); + flvPlayer.detachMediaElement(); + flvPlayer.attachMediaElement(node); + flvPlayer.load(); + } + + node.addEventListener(eventName, function (e) { + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; + + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); + } + }; + + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } + + node.setAttribute('id', id); + + originalNode.parentNode.insertBefore(node, originalNode); + originalNode.autoplay = false; + originalNode.style.display = 'none'; + + // Options that cannot be overridden + options.flv.type = 'flv'; + options.flv.url = node.getAttribute('src'); + + NativeFlv.prepareSettings({ + options: options.flv, + id: id + }); + + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; + + node.hide = function () { + if (flvPlayer !== null) { + flvPlayer.pause(); + } + node.style.display = 'none'; + return node; + }; + + node.show = function () { + node.style.display = ''; + return node; + }; + + node.destroy = function () { + if (flvPlayer !== null) { + flvPlayer.destroy(); + } + }; + + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); + + return node; + } +}; + +/** + * Register Native FLV type based on URL structure + * + */ +_media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('.flv') ? 'video/flv' : null; +}); + +_renderer.renderer.add(FlvNativeRenderer); + +},{"15":15,"16":16,"17":17,"2":2,"3":3,"6":6,"7":7}],12:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _renderer = _dereq_(7); + +var _general = _dereq_(16); + +var _constants = _dereq_(15); + +var _media = _dereq_(17); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Native HLS renderer + * + * Uses DailyMotion's hls.js, which is a JavaScript library which implements an HTTP Live Streaming client. + * It relies on HTML5 video and MediaSource Extensions for playback. + * This renderer integrates new events associated with m3u8 files the same way Flash version of Hls does. + * @see https://github.com/dailymotion/hls.js + * + */ +var NativeHls = { + /** + * @type {Boolean} + */ + isMediaStarted: false, + /** + * @type {Boolean} + */ + isMediaLoaded: false, + /** + * @type {Array} + */ + creationQueue: [], + + /** + * Create a queue to prepare the loading of an HLS source + * + * @param {Object} settings - an object with settings needed to load an HLS player instance + */ + prepareSettings: function prepareSettings(settings) { + if (NativeHls.isLoaded) { + NativeHls.createInstance(settings); + } else { + NativeHls.loadScript(settings); + NativeHls.creationQueue.push(settings); + } + }, + + /** + * Load hls.js script on the header of the document + * + * @param {Object} settings - an object with settings needed to load an HLS player instance + */ + loadScript: function loadScript(settings) { + + // Skip script loading since it is already loaded + if (typeof Hls !== 'undefined') { + NativeHls.createInstance(settings); + } else if (!NativeHls.isMediaStarted) { + (function () { + + settings.options.path = typeof settings.options.path === 'string' ? settings.options.path : '//cdn.jsdelivr.net/hls.js/latest/hls.min.js'; + + var script = _document2.default.createElement('script'), + firstScriptTag = _document2.default.getElementsByTagName('script')[0]; + + var done = false; + + script.src = settings.options.path; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function () { + if (!done && (!this.readyState || this.readyState === undefined || this.readyState === 'loaded' || this.readyState === 'complete')) { + done = true; + NativeHls.mediaReady(); + script.onload = script.onreadystatechange = null; + } + }; + + firstScriptTag.parentNode.insertBefore(script, firstScriptTag); + NativeHls.isMediaStarted = true; + })(); + } + }, + + /** + * Process queue of HLS player creation + * + */ + mediaReady: function mediaReady() { + NativeHls.isLoaded = true; + NativeHls.isMediaLoaded = true; + + while (NativeHls.creationQueue.length > 0) { + var settings = NativeHls.creationQueue.pop(); + NativeHls.createInstance(settings); + } + }, + + /** + * Create a new instance of HLS player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to instantiate HLS object + * @return {Hls} + */ + createInstance: function createInstance(settings) { + var player = new Hls(settings.options); + _window2.default['__ready__' + settings.id](player); + return player; + } +}; + +var HlsNativeRenderer = { + name: 'native_hls', + + options: { + prefix: 'native_hls', + hls: { + // Special config: used to set the local path/URL of hls.js library + path: '//cdn.jsdelivr.net/hls.js/latest/hls.min.js', + // To modify more elements from hls.js, + // see https://github.com/dailymotion/hls.js/blob/master/API.md#user-content-fine-tuning + autoStartLoad: false, + debug: false + } + }, + + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return _constants.HAS_MSE && ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()); + }, + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var originalNode = mediaElement.originalNode, + id = mediaElement.id + '_' + options.prefix, + preload = originalNode.getAttribute('preload'), + autoplay = originalNode.autoplay; + + var hlsPlayer = null, + node = null; + + node = originalNode.cloneNode(true); + options = Object.assign(options, mediaElement.options); + options.hls.autoStartLoad = preload && preload !== 'none' || autoplay; + + // WRAPPERS for PROPs + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + node['get' + capName] = function () { + return hlsPlayer !== null ? node[propName] : null; + }; + + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + if (hlsPlayer !== null) { + node[propName] = value; + + if (propName === 'src') { + + hlsPlayer.destroy(); + hlsPlayer = NativeHls.createInstance({ + options: options.hls, + id: id + }); + + hlsPlayer.loadSource(value); + hlsPlayer.attachMedia(node); + } + } + } + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // Initial method to register all HLS events + _window2.default['__ready__' + id] = function (_hlsPlayer) { + + mediaElement.hlsPlayer = hlsPlayer = _hlsPlayer; + + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + hlsEvents = Hls.Events, + assignEvents = function assignEvents(eventName) { + + if (eventName === 'loadedmetadata') { + + hlsPlayer.detachMedia(); + + var url = node.src; + + hlsPlayer.loadSource(url); + hlsPlayer.attachMedia(node); + } + + node.addEventListener(eventName, function (e) { + // copy event + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; + + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); + } + + /** + * Custom HLS events + * + * These events can be attached to the original node using addEventListener and the name of the event, + * not using Hls.Events object + * @see https://github.com/dailymotion/hls.js/blob/master/src/events.js + * @see https://github.com/dailymotion/hls.js/blob/master/src/errors.js + * @see https://github.com/dailymotion/hls.js/blob/master/API.md#runtime-events + * @see https://github.com/dailymotion/hls.js/blob/master/API.md#errors + */ + var recoverDecodingErrorDate = void 0, + recoverSwapAudioCodecDate = void 0; + var assignHlsEvents = function assignHlsEvents(e, data) { + var event = (0, _general.createEvent)(e, node); + event.data = data; + mediaElement.dispatchEvent(event); + + if (e === 'hlsError') { + console.warn(e, data); + + // borrowed from http://dailymotion.github.io/hls.js/demo/ + if (data.fatal) { + switch (data.type) { + case 'mediaError': + var now = new Date().getTime(); + if (!recoverDecodingErrorDate || now - recoverDecodingErrorDate > 3000) { + recoverDecodingErrorDate = new Date().getTime(); + hlsPlayer.recoverMediaError(); + } else if (!recoverSwapAudioCodecDate || now - recoverSwapAudioCodecDate > 3000) { + recoverSwapAudioCodecDate = new Date().getTime(); + console.warn('Attempting to swap Audio Codec and recover from media error'); + hlsPlayer.swapAudioCodec(); + hlsPlayer.recoverMediaError(); + } else { + console.error('Cannot recover, last media error recovery failed'); + } + break; + case 'networkError': + console.error('Network error'); + break; + default: + hlsPlayer.destroy(); + break; + + } + } + } + }; + + for (var eventType in hlsEvents) { + if (hlsEvents.hasOwnProperty(eventType)) { + hlsPlayer.on(hlsEvents[eventType], assignHlsEvents); + } + } + }; + + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } + + if (preload !== 'auto' && !autoplay) { + node.addEventListener('play', function () { + if (hlsPlayer !== null) { + hlsPlayer.startLoad(); + } + }); + + node.addEventListener('pause', function () { + if (hlsPlayer !== null) { + hlsPlayer.stopLoad(); + } + }); + } + + node.setAttribute('id', id); + + originalNode.parentNode.insertBefore(node, originalNode); + originalNode.autoplay = false; + originalNode.style.display = 'none'; + + NativeHls.prepareSettings({ + options: options.hls, + id: id + }); + + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; + + node.hide = function () { + node.pause(); + node.style.display = 'none'; + return node; + }; + + node.show = function () { + node.style.display = ''; + return node; + }; + + node.destroy = function () { + if (hlsPlayer !== null) { + hlsPlayer.destroy(); + } + }; + + node.stop = function () { + if (hlsPlayer !== null) { + hlsPlayer.stopLoad(); + } + }; + + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); + + return node; + } +}; + +/** + * Register Native HLS type based on URL structure + * + */ +_media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('.m3u8') ? 'application/x-mpegURL' : null; +}); + +_renderer.renderer.add(HlsNativeRenderer); + +},{"15":15,"16":16,"17":17,"2":2,"3":3,"6":6,"7":7}],13:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _renderer = _dereq_(7); + +var _general = _dereq_(16); + +var _constants = _dereq_(15); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Native HTML5 Renderer + * + * Wraps the native HTML5 <audio> or <video> tag and bubbles its properties, events, and methods up to the mediaElement. + */ +var HtmlMediaElement = { + + name: 'html5', + + options: { + prefix: 'html5' + }, + + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {String} + */ + canPlayType: function canPlayType(type) { + + var mediaElement = _document2.default.createElement('video'); + + // Due to an issue on Webkit, force the MP3 and MP4 on Android and consider native support for HLS; + // also consider URLs that might have obfuscated URLs + if (_constants.IS_ANDROID && type.match(/\/mp(3|4)$/gi) !== null || ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()) && _constants.SUPPORTS_NATIVE_HLS) { + return 'yes'; + } else if (mediaElement.canPlayType) { + return mediaElement.canPlayType(type).replace(/no/, ''); + } else { + return ''; + } + }, + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var id = mediaElement.id + '_' + options.prefix; + + var node = null; + + // CREATE NODE + if (mediaElement.originalNode === undefined || mediaElement.originalNode === null) { + node = _document2.default.createElement('audio'); + mediaElement.appendChild(node); + } else { + node = mediaElement.originalNode; + } + + node.setAttribute('id', id); + + // WRAPPERS for PROPs + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + node['get' + capName] = function () { + return node[propName]; + }; + + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + node[propName] = value; + } + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + assignEvents = function assignEvents(eventName) { + + node.addEventListener(eventName, function (e) { + // copy event + + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; + + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); + } + + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; + + node.hide = function () { + node.style.display = 'none'; + + return node; + }; + + node.show = function () { + node.style.display = ''; + + return node; + }; + + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } + + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); + + return node; + } }; -/* -Utility methods -*/ -mejs.Utility = { - encodeUrl: function(url) { - return encodeURIComponent(url); //.replace(/\?/gi,'%3F').replace(/=/gi,'%3D').replace(/&/gi,'%26'); +_window2.default.HtmlMediaElement = _mejs2.default.HtmlMediaElement = HtmlMediaElement; + +_renderer.renderer.add(HtmlMediaElement); + +},{"15":15,"16":16,"2":2,"3":3,"6":6,"7":7}],14:[function(_dereq_,module,exports){ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _renderer = _dereq_(7); + +var _general = _dereq_(16); + +var _media = _dereq_(17); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * YouTube renderer + * + * Uses <iframe> approach and uses YouTube API to manipulate it. + * Note: IE6-7 don't have postMessage so don't support <iframe> API, and IE8 doesn't fire the onReady event, + * so it doesn't work - not sure if Google problem or not. + * @see https://developers.google.com/youtube/iframe_api_reference + */ +var YouTubeApi = { + /** + * @type {Boolean} + */ + isIframeStarted: false, + /** + * @type {Boolean} + */ + isIframeLoaded: false, + /** + * @type {Array} + */ + iframeQueue: [], + + /** + * Create a queue to prepare the creation of <iframe> + * + * @param {Object} settings - an object with settings needed to create <iframe> + */ + enqueueIframe: function enqueueIframe(settings) { + + // Check whether YouTube API is already loaded. + YouTubeApi.isLoaded = typeof YT !== 'undefined' && YT.loaded; + + if (YouTubeApi.isLoaded) { + YouTubeApi.createIframe(settings); + } else { + YouTubeApi.loadIframeApi(); + YouTubeApi.iframeQueue.push(settings); + } + }, + + /** + * Load YouTube API script on the header of the document + * + */ + loadIframeApi: function loadIframeApi() { + if (!YouTubeApi.isIframeStarted) { + var tag = _document2.default.createElement('script'); + tag.src = '//www.youtube.com/player_api'; + var firstScriptTag = _document2.default.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + YouTubeApi.isIframeStarted = true; + } }, - escapeHTML: function(s) { - return s.toString().split('&').join('&').split('<').join('<').split('"').join('"'); + + /** + * Process queue of YouTube <iframe> element creation + * + */ + iFrameReady: function iFrameReady() { + + YouTubeApi.isLoaded = true; + YouTubeApi.isIframeLoaded = true; + + while (YouTubeApi.iframeQueue.length > 0) { + var settings = YouTubeApi.iframeQueue.pop(); + YouTubeApi.createIframe(settings); + } }, - absolutizeUrl: function(url) { - var el = document.createElement('div'); - el.innerHTML = '<a href="' + this.escapeHTML(url) + '">x</a>'; - return el.firstChild.href; + + /** + * Create a new instance of YouTube API player and trigger a custom event to initialize it + * + * @param {Object} settings - an object with settings needed to create <iframe> + */ + createIframe: function createIframe(settings) { + return new YT.Player(settings.containerId, settings); }, - getScriptPath: function(scriptNames) { - var - i = 0, - j, - codePath = '', - testname = '', - slashPos, - filenamePos, - scriptUrl, - scriptPath, - scriptFilename, - scripts = document.getElementsByTagName('script'), - il = scripts.length, - jl = scriptNames.length; - - // go through all <script> tags - for (; i < il; i++) { - scriptUrl = scripts[i].src; - slashPos = scriptUrl.lastIndexOf('/'); - if (slashPos > -1) { - scriptFilename = scriptUrl.substring(slashPos + 1); - scriptPath = scriptUrl.substring(0, slashPos + 1); - } else { - scriptFilename = scriptUrl; - scriptPath = ''; - } - - // see if any <script> tags have a file name that matches the - for (j = 0; j < jl; j++) { - testname = scriptNames[j]; - filenamePos = scriptFilename.indexOf(testname); - if (filenamePos > -1) { - codePath = scriptPath; - break; - } + + /** + * Extract ID from YouTube's URL to be loaded through API + * Valid URL format(s): + * - http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + * - http://www.youtube.com/v/VIDEO_ID?version=3 + * - http://youtu.be/Djd6tPrxc08 + * - http://www.youtube-nocookie.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + * + * @param {String} url + * @return {string} + */ + getYouTubeId: function getYouTubeId(url) { + + var youTubeId = ''; + + if (url.indexOf('?') > 0) { + // assuming: http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + youTubeId = YouTubeApi.getYouTubeIdFromParam(url); + + // if it's http://www.youtube.com/v/VIDEO_ID?version=3 + if (youTubeId === '') { + youTubeId = YouTubeApi.getYouTubeIdFromUrl(url); } - - // if we found a path, then break and return it - if (codePath !== '') { + } else { + youTubeId = YouTubeApi.getYouTubeIdFromUrl(url); + } + + return youTubeId; + }, + + /** + * Get ID from URL with format: http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0 + * + * @param {String} url + * @returns {string} + */ + getYouTubeIdFromParam: function getYouTubeIdFromParam(url) { + + if (url === undefined || url === null || !url.trim().length) { + return null; + } + + var parts = url.split('?'), + parameters = parts[1].split('&'); + + var youTubeId = ''; + + for (var i = 0, total = parameters.length; i < total; i++) { + var paramParts = parameters[i].split('='); + if (paramParts[0] === 'v') { + youTubeId = paramParts[1]; break; } } - - // send the best path back - return codePath; - }, - secondsToTimeCode: function(time, forceHours, showFrameCount, fps) { - //add framecount - if (typeof showFrameCount == 'undefined') { - showFrameCount=false; - } else if(typeof fps == 'undefined') { - fps = 25; - } - - var hours = Math.floor(time / 3600) % 24, - minutes = Math.floor(time / 60) % 60, - seconds = Math.floor(time % 60), - frames = Math.floor(((time % 1)*fps).toFixed(3)), - result = - ( (forceHours || hours > 0) ? (hours < 10 ? '0' + hours : hours) + ':' : '') - + (minutes < 10 ? '0' + minutes : minutes) + ':' - + (seconds < 10 ? '0' + seconds : seconds) - + ((showFrameCount) ? ':' + (frames < 10 ? '0' + frames : frames) : ''); - - return result; + + return youTubeId; }, - - timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){ - if (typeof showFrameCount == 'undefined') { - showFrameCount=false; - } else if(typeof fps == 'undefined') { - fps = 25; - } - - var tc_array = hh_mm_ss_ff.split(":"), - tc_hh = parseInt(tc_array[0], 10), - tc_mm = parseInt(tc_array[1], 10), - tc_ss = parseInt(tc_array[2], 10), - tc_ff = 0, - tc_in_seconds = 0; - - if (showFrameCount) { - tc_ff = parseInt(tc_array[3])/fps; - } - - tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff; - - return tc_in_seconds; + + /** + * Get ID from URL with formats + * - http://www.youtube.com/v/VIDEO_ID?version=3 + * - http://youtu.be/Djd6tPrxc08 + * @param {String} url + * @return {?String} + */ + getYouTubeIdFromUrl: function getYouTubeIdFromUrl(url) { + + if (url === undefined || url === null || !url.trim().length) { + return null; + } + + var parts = url.split('?'); + url = parts[0]; + return url.substring(url.lastIndexOf('/') + 1); }, - - convertSMPTEtoSeconds: function (SMPTE) { - if (typeof SMPTE != 'string') - return false; + /** + * Inject `no-cookie` element to URL. Only works with format: http://www.youtube.com/v/VIDEO_ID?version=3 + * @param {String} url + * @return {?String} + */ + getYouTubeNoCookieUrl: function getYouTubeNoCookieUrl(url) { + if (url === undefined || url === null || !url.trim().length || !url.includes('//www.youtube')) { + return url; + } - SMPTE = SMPTE.replace(',', '.'); - - var secs = 0, - decimalLen = (SMPTE.indexOf('.') != -1) ? SMPTE.split('.')[1].length : 0, - multiplier = 1; - - SMPTE = SMPTE.split(':').reverse(); - - for (var i = 0; i < SMPTE.length; i++) { - multiplier = 1; - if (i > 0) { - multiplier = Math.pow(60, i); - } - secs += Number(SMPTE[i]) * multiplier; - } - return Number(secs.toFixed(decimalLen)); - }, - - /* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */ - removeSwf: function(id) { - var obj = document.getElementById(id); - if (obj && /object|embed/i.test(obj.nodeName)) { - if (mejs.MediaFeatures.isIE) { - obj.style.display = "none"; - (function(){ - if (obj.readyState == 4) { - mejs.Utility.removeObjectInIE(id); - } else { - setTimeout(arguments.callee, 10); - } - })(); - } else { - obj.parentNode.removeChild(obj); - } + var parts = url.split('/'); + parts[2] = parts[2].replace('.com', '-nocookie.com'); + return parts.join('/'); + } +}; + +var YouTubeIframeRenderer = { + name: 'youtube_iframe', + + options: { + prefix: 'youtube_iframe', + /** + * Custom configuration for YouTube player + * + * @see https://developers.google.com/youtube/player_parameters#Parameters + * @type {Object} + */ + youtube: { + autoplay: 0, + controls: 0, + disablekb: 1, + end: 0, + loop: 0, + modestbranding: 0, + playsinline: 0, + rel: 0, + showinfo: 0, + start: 0, + iv_load_policy: 3, + // custom to inject `-nocookie` element in URL + nocookie: false } }, - removeObjectInIE: function(id) { - var obj = document.getElementById(id); - if (obj) { - for (var i in obj) { - if (typeof obj[i] == "function") { - obj[i] = null; + + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['video/youtube', 'video/x-youtube'].includes(type); + }, + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + // API objects + var youtube = {}, + apiStack = [], + readyState = 4; + + var youTubeApi = null, + paused = true, + ended = false, + youTubeIframe = null, + volume = 1; + + youtube.options = options; + youtube.id = mediaElement.id + '_' + options.prefix; + youtube.mediaElement = mediaElement; + + // wrappers for get/set + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + + // add to flash state that we will store + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + youtube['get' + capName] = function () { + if (youTubeApi !== null) { + var value = null; + + // figure out how to get youtube dta here + + var _ret = function () { + switch (propName) { + case 'currentTime': + return { + v: youTubeApi.getCurrentTime() + }; + + case 'duration': + return { + v: youTubeApi.getDuration() + }; + + case 'volume': + volume = youTubeApi.getVolume() / 100; + return { + v: volume + }; + + case 'paused': + return { + v: paused + }; + + case 'ended': + return { + v: ended + }; + + case 'muted': + return { + v: youTubeApi.isMuted() + }; + + case 'buffered': + var percentLoaded = youTubeApi.getVideoLoadedFraction(), + duration = youTubeApi.getDuration(); + return { + v: { + start: function start() { + return 0; + }, + end: function end() { + return percentLoaded * duration; + }, + length: 1 + } + }; + case 'src': + return { + v: youTubeApi.getVideoUrl() + }; + + case 'readyState': + return { + v: readyState + }; + } + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + return value; + } else { + return null; } - } - obj.parentNode.removeChild(obj); - } - } -}; + }; + youtube['set' + capName] = function (value) { -// Core detector, plugins are added below -mejs.PluginDetector = { + if (youTubeApi !== null) { - // main public function to test a plug version number PluginDetector.hasPluginVersion('flash',[9,0,125]); - hasPluginVersion: function(plugin, v) { - var pv = this.plugins[plugin]; - v[1] = v[1] || 0; - v[2] = v[2] || 0; - return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; - }, + // do something + switch (propName) { - // cached values - nav: window.navigator, - ua: window.navigator.userAgent.toLowerCase(), + case 'src': + var url = typeof value === 'string' ? value : value[0].src, + _videoId = YouTubeApi.getYouTubeId(url); - // stored version numbers - plugins: [], + if (mediaElement.originalNode.autoplay) { + youTubeApi.loadVideoById(_videoId); + } else { + youTubeApi.cueVideoById(_videoId); + } + break; - // runs detectPlugin() and stores the version number - addPlugin: function(p, pluginName, mimeType, activeX, axDetect) { - this.plugins[p] = this.detectPlugin(pluginName, mimeType, activeX, axDetect); - }, + case 'currentTime': + youTubeApi.seekTo(value); + break; + + case 'muted': + if (value) { + youTubeApi.mute(); + } else { + youTubeApi.unMute(); + } + setTimeout(function () { + var event = (0, _general.createEvent)('volumechange', youtube); + mediaElement.dispatchEvent(event); + }, 50); + break; + + case 'volume': + volume = value; + youTubeApi.setVolume(value * 100); + setTimeout(function () { + var event = (0, _general.createEvent)('volumechange', youtube); + mediaElement.dispatchEvent(event); + }, 50); + break; + case 'readyState': + var event = (0, _general.createEvent)('canplay', youtube); + mediaElement.dispatchEvent(event); + break; + + default: + + break; + } + } else { + // store for after "READY" event fires + apiStack.push({ type: 'set', propName: propName, value: value }); + } + }; + }; - // get the version number from the mimetype (all but IE) or ActiveX (IE) - detectPlugin: function(pluginName, mimeType, activeX, axDetect) { + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } - var version = [0,0,0], - description, - i, - ax; + // add wrappers for native methods + var methods = _mejs2.default.html5media.methods, + assignMethods = function assignMethods(methodName) { - // Firefox, Webkit, Opera - if (typeof(this.nav.plugins) != 'undefined' && typeof this.nav.plugins[pluginName] == 'object') { - description = this.nav.plugins[pluginName].description; - if (description && !(typeof this.nav.mimeTypes != 'undefined' && this.nav.mimeTypes[mimeType] && !this.nav.mimeTypes[mimeType].enabledPlugin)) { - version = description.replace(pluginName, '').replace(/^\s+/,'').replace(/\sr/gi,'.').split('.'); - for (i=0; i<version.length; i++) { - version[i] = parseInt(version[i].match(/\d+/), 10); + // run the method on the native HTMLMediaElement + youtube[methodName] = function () { + + if (youTubeApi !== null) { + + // DO method + switch (methodName) { + case 'play': + paused = false; + return youTubeApi.playVideo(); + case 'pause': + paused = true; + return youTubeApi.pauseVideo(); + case 'load': + return null; + + } + } else { + apiStack.push({ type: 'call', methodName: methodName }); } - } - // Internet Explorer / ActiveX - } else if (typeof(window.ActiveXObject) != 'undefined') { - try { - ax = new ActiveXObject(activeX); - if (ax) { - version = axDetect(ax); + }; + }; + + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } + + // CREATE YouTube + var youtubeContainer = _document2.default.createElement('div'); + youtubeContainer.id = youtube.id; + + // If `nocookie` feature was enabled, modify original URL + if (youtube.options.youtube.nocookie) { + mediaElement.originalNode.setAttribute('src', YouTubeApi.getYouTubeNoCookieUrl(mediaFiles[0].src)); + } + + mediaElement.originalNode.parentNode.insertBefore(youtubeContainer, mediaElement.originalNode); + mediaElement.originalNode.style.display = 'none'; + + var isAudio = mediaElement.originalNode.tagName.toLowerCase() === 'audio', + height = isAudio ? '0' : mediaElement.originalNode.height, + width = isAudio ? '0' : mediaElement.originalNode.width, + videoId = YouTubeApi.getYouTubeId(mediaFiles[0].src), + youtubeSettings = { + id: youtube.id, + containerId: youtubeContainer.id, + videoId: videoId, + height: height, + width: width, + playerVars: Object.assign({ + controls: 0, + rel: 0, + disablekb: 1, + showinfo: 0, + modestbranding: 0, + html5: 1, + playsinline: 0, + start: 0, + end: 0, + iv_load_policy: 3 + }, youtube.options.youtube), + origin: _window2.default.location.host, + events: { + onReady: function onReady(e) { + mediaElement.youTubeApi = youTubeApi = e.target; + mediaElement.youTubeState = { + paused: true, + ended: false + }; + + // do call stack + if (apiStack.length) { + for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) { + + var stackItem = apiStack[_i2]; + + if (stackItem.type === 'set') { + var propName = stackItem.propName, + capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + youtube['set' + capName](stackItem.value); + } else if (stackItem.type === 'call') { + youtube[stackItem.methodName](); + } + } + } + + // a few more events + youTubeIframe = youTubeApi.getIframe(); + + var events = ['mouseover', 'mouseout'], + assignEvents = function assignEvents(e) { + + var newEvent = (0, _general.createEvent)(e.type, youtube); + mediaElement.dispatchEvent(newEvent); + }; + + for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) { + youTubeIframe.addEventListener(events[_i3], assignEvents, false); + } + + // send init events + var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay']; + + for (var _i4 = 0, _total4 = initEvents.length; _i4 < _total4; _i4++) { + var event = (0, _general.createEvent)(initEvents[_i4], youtube); + mediaElement.dispatchEvent(event); + } + }, + onStateChange: function onStateChange(e) { + + // translate events + var events = []; + + switch (e.data) { + case -1: + // not started + events = ['loadedmetadata']; + paused = true; + ended = false; + break; + + case 0: + // YT.PlayerState.ENDED + events = ['ended']; + paused = false; + ended = true; + + youtube.stopInterval(); + break; + + case 1: + // YT.PlayerState.PLAYING + events = ['play', 'playing']; + paused = false; + ended = false; + + youtube.startInterval(); + + break; + + case 2: + // YT.PlayerState.PAUSED + events = ['pause']; + paused = true; + ended = false; + + youtube.stopInterval(); + break; + + case 3: + // YT.PlayerState.BUFFERING + events = ['progress']; + ended = false; + + break; + case 5: + // YT.PlayerState.CUED + events = ['loadeddata', 'loadedmetadata', 'canplay']; + paused = true; + ended = false; + + break; + } + + // send events up + for (var _i5 = 0, _total5 = events.length; _i5 < _total5; _i5++) { + var event = (0, _general.createEvent)(events[_i5], youtube); + mediaElement.dispatchEvent(event); + } + }, + onError: function onError(e) { + var event = (0, _general.createEvent)('error', youtube); + event.data = e.data; + mediaElement.dispatchEvent(event); } } - catch (e) { } + }; + + // The following will prevent that in mobile devices, YouTube is displayed in fullscreen when using audio + if (isAudio) { + youtubeSettings.playerVars.playsinline = 1; } - return version; - } -}; -// Add Flash detection -mejs.PluginDetector.addPlugin('flash','Shockwave Flash','application/x-shockwave-flash','ShockwaveFlash.ShockwaveFlash', function(ax) { - // adapted from SWFObject - var version = [], - d = ax.GetVariable("$version"); - if (d) { - d = d.split(" ")[1].split(","); - version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; - } - return version; -}); + // send it off for async loading and creation + YouTubeApi.enqueueIframe(youtubeSettings); -// Add Silverlight detection -mejs.PluginDetector.addPlugin('silverlight','Silverlight Plug-In','application/x-silverlight-2','AgControl.AgControl', function (ax) { - // Silverlight cannot report its version number to IE - // but it does have a isVersionSupported function, so we have to loop through it to get a version number. - // adapted from http://www.silverlightversion.com/ - var v = [0,0,0,0], - loopMatch = function(ax, v, i, n) { - while(ax.isVersionSupported(v[0]+ "."+ v[1] + "." + v[2] + "." + v[3])){ - v[i]+=n; + youtube.onEvent = function (eventName, player, _youTubeState) { + if (_youTubeState !== null && _youTubeState !== undefined) { + mediaElement.youTubeState = _youTubeState; } - v[i] -= n; }; - loopMatch(ax, v, 0, 1); - loopMatch(ax, v, 1, 1); - loopMatch(ax, v, 2, 10000); // the third place in the version number is usually 5 digits (4.0.xxxxx) - loopMatch(ax, v, 2, 1000); - loopMatch(ax, v, 2, 100); - loopMatch(ax, v, 2, 10); - loopMatch(ax, v, 2, 1); - loopMatch(ax, v, 3, 1); - - return v; -}); -// add adobe acrobat -/* -PluginDetector.addPlugin('acrobat','Adobe Acrobat','application/pdf','AcroPDF.PDF', function (ax) { - var version = [], - d = ax.GetVersions().split(',')[0].split('=')[1].split('.'); - if (d) { - version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; - } - return version; -}); -*/ -// necessary detection (fixes for <IE9) -mejs.MediaFeatures = { - init: function() { - var - t = this, - d = document, - nav = mejs.PluginDetector.nav, - ua = mejs.PluginDetector.ua.toLowerCase(), - i, - v, - html5Elements = ['source','track','audio','video']; - - // detect browsers (only the ones that have some kind of quirk we need to work around) - t.isiPad = (ua.match(/ipad/i) !== null); - t.isiPhone = (ua.match(/iphone/i) !== null); - t.isiOS = t.isiPhone || t.isiPad; - t.isAndroid = (ua.match(/android/i) !== null); - t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null); - t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null)); - t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null); - t.isChrome = (ua.match(/chrome/gi) !== null); - t.isChromium = (ua.match(/chromium/gi) !== null); - t.isFirefox = (ua.match(/firefox/gi) !== null); - t.isWebkit = (ua.match(/webkit/gi) !== null); - t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE; - t.isOpera = (ua.match(/opera/gi) !== null); - t.hasTouch = ('ontouchstart' in window); // && window.ontouchstart != null); // this breaks iOS 7 - - // borrowed from Modernizr - t.svg = !! document.createElementNS && - !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect; - - // create HTML5 media elements for IE before 9, get a <video> element for fullscreen detection - for (i=0; i<html5Elements.length; i++) { - v = document.createElement(html5Elements[i]); - } - - t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid); - - // Fix for IE9 on Windows 7N / Windows 7KN (Media Player not installer) - try{ - v.canPlayType("video/mp4"); - }catch(e){ - t.supportsMediaTag = false; - } - - // detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails) - - // iOS - t.hasSemiNativeFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined'); - - // W3C - t.hasNativeFullscreen = (typeof v.requestFullscreen !== 'undefined'); - - // webkit/firefox/IE11+ - t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined'); - t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined'); - t.hasMsNativeFullScreen = (typeof v.msRequestFullscreen !== 'undefined'); - - t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen || t.hasMsNativeFullScreen); - t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen; - - // Enabled? - if (t.hasMozNativeFullScreen) { - t.nativeFullScreenEnabled = document.mozFullScreenEnabled; - } else if (t.hasMsNativeFullScreen) { - t.nativeFullScreenEnabled = document.msFullscreenEnabled; - } - - if (t.isChrome) { - t.hasSemiNativeFullScreen = false; - } - - if (t.hasTrueNativeFullScreen) { - - t.fullScreenEventName = ''; - if (t.hasWebkitNativeFullScreen) { - t.fullScreenEventName = 'webkitfullscreenchange'; - - } else if (t.hasMozNativeFullScreen) { - t.fullScreenEventName = 'mozfullscreenchange'; - - } else if (t.hasMsNativeFullScreen) { - t.fullScreenEventName = 'MSFullscreenChange'; + youtube.setSize = function (width, height) { + if (youTubeApi !== null) { + youTubeApi.setSize(width, height); } - - t.isFullScreen = function() { - if (t.hasMozNativeFullScreen) { - return d.mozFullScreen; - - } else if (t.hasWebkitNativeFullScreen) { - return d.webkitIsFullScreen; - - } else if (t.hasMsNativeFullScreen) { - return d.msFullscreenElement !== null; - } + }; + youtube.hide = function () { + youtube.stopInterval(); + youtube.pause(); + if (youTubeIframe) { + youTubeIframe.style.display = 'none'; } - - t.requestFullScreen = function(el) { - - if (t.hasWebkitNativeFullScreen) { - el.webkitRequestFullScreen(); - - } else if (t.hasMozNativeFullScreen) { - el.mozRequestFullScreen(); + }; + youtube.show = function () { + if (youTubeIframe) { + youTubeIframe.style.display = ''; + } + }; + youtube.destroy = function () { + youTubeApi.destroy(); + }; + youtube.interval = null; - } else if (t.hasMsNativeFullScreen) { - el.msRequestFullscreen(); + youtube.startInterval = function () { + // create timer + youtube.interval = setInterval(function () { - } + var event = (0, _general.createEvent)('timeupdate', youtube); + mediaElement.dispatchEvent(event); + }, 250); + }; + youtube.stopInterval = function () { + if (youtube.interval) { + clearInterval(youtube.interval); } - - t.cancelFullScreen = function() { - if (t.hasWebkitNativeFullScreen) { - document.webkitCancelFullScreen(); - - } else if (t.hasMozNativeFullScreen) { - document.mozCancelFullScreen(); - - } else if (t.hasMsNativeFullScreen) { - document.msExitFullscreen(); - - } - } - - } - - - // OS X 10.5 can't do this even if it says it can :( - if (t.hasSemiNativeFullScreen && ua.match(/mac os x 10_5/i)) { - t.hasNativeFullScreen = false; - t.hasSemiNativeFullScreen = false; - } - + }; + + return youtube; } }; -mejs.MediaFeatures.init(); -/* -extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below) -*/ -mejs.HtmlMediaElement = { - pluginType: 'native', - isFullScreen: false, +if (_window2.default.postMessage && _typeof(_window2.default.addEventListener)) { - setCurrentTime: function (time) { - this.currentTime = time; - }, + _window2.default.onYouTubePlayerAPIReady = function () { + YouTubeApi.iFrameReady(); + }; - setMuted: function (muted) { - this.muted = muted; - }, + _media.typeChecks.push(function (url) { + url = url.toLowerCase(); + return url.includes('//www.youtube') || url.includes('//youtu.be') ? 'video/x-youtube' : null; + }); - setVolume: function (volume) { - this.volume = volume; - }, + _renderer.renderer.add(YouTubeIframeRenderer); +} - // for parity with the plugin versions - stop: function () { - this.pause(); - }, +},{"16":16,"17":17,"2":2,"3":3,"6":6,"7":7}],15:[function(_dereq_,module,exports){ +'use strict'; - // This can be a url string - // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}] - setSrc: function (url) { - - // Fix for IE9 which can't set .src when there are <source> elements. Awesome, right? - var - existingSources = this.getElementsByTagName('source'); - while (existingSources.length > 0){ - this.removeChild(existingSources[0]); - } - - if (typeof url == 'string') { - this.src = url; - } else { - var i, media; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.cancelFullScreen = exports.requestFullScreen = exports.isFullScreen = exports.FULLSCREEN_EVENT_NAME = exports.HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = exports.SUPPORTS_NATIVE_HLS = exports.SUPPORT_POINTER_EVENTS = exports.HAS_MSE = exports.IS_STOCK_ANDROID = exports.IS_SAFARI = exports.IS_FIREFOX = exports.IS_CHROME = exports.IS_EDGE = exports.IS_IE = exports.IS_ANDROID = exports.IS_IOS = exports.IS_IPHONE = exports.IS_IPAD = exports.UA = exports.NAV = undefined; - for (i=0; i<url.length; i++) { - media = url[i]; - if (this.canPlayType(media.type)) { - this.src = media.src; - break; - } - } - } - }, +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var NAV = exports.NAV = _window2.default.navigator; +var UA = exports.UA = NAV.userAgent.toLowerCase(); - setVideoSize: function (width, height) { - this.width = width; - this.height = height; +var IS_IPAD = exports.IS_IPAD = UA.match(/ipad/i) !== null; +var IS_IPHONE = exports.IS_IPHONE = UA.match(/iphone/i) !== null; +var IS_IOS = exports.IS_IOS = IS_IPHONE || IS_IPAD; +var IS_ANDROID = exports.IS_ANDROID = UA.match(/android/i) !== null; +var IS_IE = exports.IS_IE = NAV.appName.toLowerCase().includes('microsoft') || NAV.appName.toLowerCase().match(/trident/gi) !== null; +var IS_EDGE = exports.IS_EDGE = 'msLaunchUri' in NAV && !('documentMode' in _document2.default); +var IS_CHROME = exports.IS_CHROME = UA.match(/chrome/gi) !== null; +var IS_FIREFOX = exports.IS_FIREFOX = UA.match(/firefox/gi) !== null; +var IS_SAFARI = exports.IS_SAFARI = UA.match(/safari/gi) !== null && !IS_CHROME; +var IS_STOCK_ANDROID = exports.IS_STOCK_ANDROID = UA.match(/^mozilla\/\d+\.\d+\s\(linux;\su;/gi) !== null; + +var HAS_MSE = exports.HAS_MSE = 'MediaSource' in _window2.default; +var SUPPORT_POINTER_EVENTS = exports.SUPPORT_POINTER_EVENTS = function () { + var element = _document2.default.createElement('x'), + documentElement = _document2.default.documentElement, + getComputedStyle = _window2.default.getComputedStyle; + + if (!('pointerEvents' in element.style)) { + return false; } -}; -/* -Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember] -*/ -mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) { - this.id = pluginid; - this.pluginType = pluginType; - this.src = mediaUrl; - this.events = {}; - this.attributes = {}; -}; + element.style.pointerEvents = 'auto'; + element.style.pointerEvents = 'x'; + documentElement.appendChild(element); + var supports = getComputedStyle && getComputedStyle(element, '').pointerEvents === 'auto'; + element.remove(); + return !!supports; +}(); -// JavaScript values and ExternalInterface methods that match HTML5 video properties methods -// http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html -// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html -mejs.PluginMediaElement.prototype = { - - // special - pluginElement: null, - pluginType: '', - isFullScreen: false, - - // not implemented :( - playbackRate: -1, - defaultPlaybackRate: -1, - seekable: [], - played: [], - - // HTML5 read-only properties - paused: true, - ended: false, - seeking: false, - duration: 0, - error: null, - tagName: '', - - // HTML5 get/set properties, but only set (updated by event handlers) - muted: false, - volume: 1, - currentTime: 0, - - // HTML5 methods - play: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.playVideo(); - } else { - this.pluginApi.playMedia(); - } - this.paused = false; - } - }, - load: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - } else { - this.pluginApi.loadMedia(); - } - - this.paused = false; - } - }, - pause: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.pauseVideo(); - } else { - this.pluginApi.pauseMedia(); - } - - - this.paused = true; +// for IE +var html5Elements = ['source', 'track', 'audio', 'video']; +var video = void 0; + +for (var i = 0, total = html5Elements.length; i < total; i++) { + video = _document2.default.createElement(html5Elements[i]); +} + +// Test if browsers support HLS natively (right now Safari, Android's Chrome and Stock browsers, and MS Edge) +var SUPPORTS_NATIVE_HLS = exports.SUPPORTS_NATIVE_HLS = IS_SAFARI || IS_ANDROID && (IS_CHROME || IS_STOCK_ANDROID) || IS_IE && UA.match(/edge/gi) !== null; + +// Detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails) + +// iOS +var hasiOSFullScreen = video.webkitEnterFullscreen !== undefined; + +// W3C +var hasNativeFullscreen = video.requestFullscreen !== undefined; + +// OS X 10.5 can't do this even if it says it can :( +if (hasiOSFullScreen && UA.match(/mac os x 10_5/i)) { + hasNativeFullscreen = false; + hasiOSFullScreen = false; +} + +// webkit/firefox/IE11+ +var hasWebkitNativeFullScreen = video.webkitRequestFullScreen !== undefined; +var hasMozNativeFullScreen = video.mozRequestFullScreen !== undefined; +var hasMsNativeFullScreen = video.msRequestFullscreen !== undefined; + +var hasTrueNativeFullScreen = hasWebkitNativeFullScreen || hasMozNativeFullScreen || hasMsNativeFullScreen; +var nativeFullScreenEnabled = hasTrueNativeFullScreen; +var fullScreenEventName = ''; +var isFullScreen = void 0, + requestFullScreen = void 0, + cancelFullScreen = void 0; + +// Enabled? +if (hasMozNativeFullScreen) { + nativeFullScreenEnabled = _document2.default.mozFullScreenEnabled; +} else if (hasMsNativeFullScreen) { + nativeFullScreenEnabled = _document2.default.msFullscreenEnabled; +} + +if (IS_CHROME) { + hasiOSFullScreen = false; +} + +if (hasTrueNativeFullScreen) { + + if (hasWebkitNativeFullScreen) { + fullScreenEventName = 'webkitfullscreenchange'; + } else if (hasMozNativeFullScreen) { + fullScreenEventName = 'mozfullscreenchange'; + } else if (hasMsNativeFullScreen) { + fullScreenEventName = 'MSFullscreenChange'; + } + + exports.isFullScreen = isFullScreen = function isFullScreen() { + if (hasMozNativeFullScreen) { + return _document2.default.mozFullScreen; + } else if (hasWebkitNativeFullScreen) { + return _document2.default.webkitIsFullScreen; + } else if (hasMsNativeFullScreen) { + return _document2.default.msFullscreenElement !== null; } - }, - stop: function () { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.stopVideo(); - } else { - this.pluginApi.stopMedia(); - } - this.paused = true; + }; + + exports.requestFullScreen = requestFullScreen = function requestFullScreen(el) { + + if (hasWebkitNativeFullScreen) { + el.webkitRequestFullScreen(); + } else if (hasMozNativeFullScreen) { + el.mozRequestFullScreen(); + } else if (hasMsNativeFullScreen) { + el.msRequestFullscreen(); } - }, - canPlayType: function(type) { - var i, - j, - pluginInfo, - pluginVersions = mejs.plugins[this.pluginType]; - - for (i=0; i<pluginVersions.length; i++) { - pluginInfo = pluginVersions[i]; - - // test if user has the correct plugin version - if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) { - - // test for plugin playback types - for (j=0; j<pluginInfo.types.length; j++) { - // find plugin that can play the type - if (type == pluginInfo.types[j]) { - return 'probably'; - } - } - } + }; + + exports.cancelFullScreen = cancelFullScreen = function cancelFullScreen() { + if (hasWebkitNativeFullScreen) { + _document2.default.webkitCancelFullScreen(); + } else if (hasMozNativeFullScreen) { + _document2.default.mozCancelFullScreen(); + } else if (hasMsNativeFullScreen) { + _document2.default.msExitFullscreen(); } + }; +} - return ''; - }, - - positionFullscreenButton: function(x,y,visibleAndAbove) { - if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) { - this.pluginApi.positionFullscreenButton(Math.floor(x),Math.floor(y),visibleAndAbove); - } - }, - - hideFullscreenButton: function() { - if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) { - this.pluginApi.hideFullscreenButton(); - } - }, - - - // custom methods since not all JavaScript implementations support get/set - - // This can be a url string - // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}] - setSrc: function (url) { - if (typeof url == 'string') { - this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url)); - this.src = mejs.Utility.absolutizeUrl(url); - } else { - var i, media; +var HAS_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = hasNativeFullscreen; +var HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = hasWebkitNativeFullScreen; +var HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = hasMozNativeFullScreen; +var HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = hasMsNativeFullScreen; +var HAS_IOS_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = hasiOSFullScreen; +var HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_TRUE_NATIVE_FULLSCREEN = hasTrueNativeFullScreen; +var HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_NATIVE_FULLSCREEN_ENABLED = nativeFullScreenEnabled; +var FULLSCREEN_EVENT_NAME = exports.FULLSCREEN_EVENT_NAME = fullScreenEventName; + +exports.isFullScreen = isFullScreen; +exports.requestFullScreen = requestFullScreen; +exports.cancelFullScreen = cancelFullScreen; + + +_mejs2.default.Features = _mejs2.default.Features || {}; +_mejs2.default.Features.isiPad = IS_IPAD; +_mejs2.default.Features.isiPhone = IS_IPHONE; +_mejs2.default.Features.isiOS = _mejs2.default.Features.isiPhone || _mejs2.default.Features.isiPad; +_mejs2.default.Features.isAndroid = IS_ANDROID; +_mejs2.default.Features.isIE = IS_IE; +_mejs2.default.Features.isEdge = IS_EDGE; +_mejs2.default.Features.isChrome = IS_CHROME; +_mejs2.default.Features.isFirefox = IS_FIREFOX; +_mejs2.default.Features.isSafari = IS_SAFARI; +_mejs2.default.Features.isStockAndroid = IS_STOCK_ANDROID; +_mejs2.default.Features.hasMSE = HAS_MSE; +_mejs2.default.Features.supportsNativeHLS = SUPPORTS_NATIVE_HLS; + +_mejs2.default.Features.supportsPointerEvents = SUPPORT_POINTER_EVENTS; +_mejs2.default.Features.hasiOSFullScreen = HAS_IOS_FULLSCREEN; +_mejs2.default.Features.hasNativeFullscreen = HAS_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasWebkitNativeFullScreen = HAS_WEBKIT_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasMozNativeFullScreen = HAS_MOZ_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasMsNativeFullScreen = HAS_MS_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasTrueNativeFullScreen = HAS_TRUE_NATIVE_FULLSCREEN; +_mejs2.default.Features.nativeFullScreenEnabled = HAS_NATIVE_FULLSCREEN_ENABLED; +_mejs2.default.Features.fullScreenEventName = FULLSCREEN_EVENT_NAME; +_mejs2.default.Features.isFullScreen = isFullScreen; +_mejs2.default.Features.requestFullScreen = requestFullScreen; +_mejs2.default.Features.cancelFullScreen = cancelFullScreen; + +},{"2":2,"3":3,"6":6}],16:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.escapeHTML = escapeHTML; +exports.debounce = debounce; +exports.isObjectEmpty = isObjectEmpty; +exports.splitEvents = splitEvents; +exports.createEvent = createEvent; +exports.isNodeAfter = isNodeAfter; +exports.isString = isString; - for (i=0; i<url.length; i++) { - media = url[i]; - if (this.canPlayType(media.type)) { - this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src)); - this.src = mejs.Utility.absolutizeUrl(url); - break; - } - } - } +var _mejs = _dereq_(6); - }, - setCurrentTime: function (time) { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube' || this.pluginType == 'vimeo') { - this.pluginApi.seekTo(time); - } else { - this.pluginApi.setCurrentTime(time); - } - - - - this.currentTime = time; - } - }, - setVolume: function (volume) { - if (this.pluginApi != null) { - // same on YouTube and MEjs - if (this.pluginType == 'youtube') { - this.pluginApi.setVolume(volume * 100); - } else { - this.pluginApi.setVolume(volume); +var _mejs2 = _interopRequireDefault(_mejs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * + * @param {String} input + * @return {string} + */ +function escapeHTML(input) { + + if (typeof input !== 'string') { + throw new Error('Argument passed must be a string'); + } + + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"' + }; + + return input.replace(/[&<>"]/g, function (c) { + return map[c]; + }); +} + +// taken from underscore +function debounce(func, wait) { + var _this = this, + _arguments = arguments; + + var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + + if (typeof func !== 'function') { + throw new Error('First argument must be a function'); + } + + if (typeof wait !== 'number') { + throw new Error('Second argument must be a numeric value'); + } + + var timeout = void 0; + return function () { + var context = _this, + args = _arguments; + var later = function later() { + timeout = null; + if (!immediate) { + func.apply(context, args); } - this.volume = volume; + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + + if (callNow) { + func.apply(context, args); } - }, - setMuted: function (muted) { - if (this.pluginApi != null) { - if (this.pluginType == 'youtube') { - if (muted) { - this.pluginApi.mute(); - } else { - this.pluginApi.unMute(); - } - this.muted = muted; - this.dispatchEvent('volumechange'); - } else { - this.pluginApi.setMuted(muted); - } - this.muted = muted; + }; +} + +/** + * Determine if an object contains any elements + * + * @see http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object + * @param {Object} instance + * @return {Boolean} + */ +function isObjectEmpty(instance) { + return Object.getOwnPropertyNames(instance).length <= 0; +} + +/** + * Group a string of events into `document` (d) and `window` (w) events + * + * @param {String} events List of space separated events + * @param {String} id Namespace appended to events + * @return {{d: Array, w: Array}} + */ +function splitEvents(events, id) { + // Global events + var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/; + // add player ID as an event namespace so it's easier to unbind them all later + var ret = { d: [], w: [] }; + (events || '').split(' ').forEach(function (v) { + var eventName = '' + v + (id ? '.' + id : ''); + + if (eventName.startsWith('.')) { + ret.d.push(eventName); + ret.w.push(eventName); + } else { + ret[rwindow.test(v) ? 'w' : 'd'].push(eventName); } - }, + }); + + ret.d = ret.d.join(' '); + ret.w = ret.w.join(' '); + return ret; +} + +/** + * + * @param {string} eventName + * @param {*} target + * @return {Event|Object} + */ +function createEvent(eventName, target) { + + if (typeof eventName !== 'string') { + throw new Error('Event name must be a string'); + } + + var eventFrags = eventName.match(/[a-z]+\.([a-z]+)/), + detail = { + target: target + }; + + if (eventFrags !== null) { + eventName = eventFrags[0]; + detail.namespace = eventFrags[1]; + } - // additional non-HTML5 methods - setVideoSize: function (width, height) { - - //if (this.pluginType == 'flash' || this.pluginType == 'silverlight') { - if (this.pluginElement && this.pluginElement.style) { - this.pluginElement.style.width = width + 'px'; - this.pluginElement.style.height = height + 'px'; - } - if (this.pluginApi != null && this.pluginApi.setVideoSize) { - this.pluginApi.setVideoSize(width, height); - } - //} - }, + return new window.CustomEvent(eventName, { + detail: detail + }); +} - setFullscreen: function (fullscreen) { - if (this.pluginApi != null && this.pluginApi.setFullscreen) { - this.pluginApi.setFullscreen(fullscreen); - } - }, - - enterFullScreen: function() { - if (this.pluginApi != null && this.pluginApi.setFullscreen) { - this.setFullscreen(true); - } - - }, - - exitFullScreen: function() { - if (this.pluginApi != null && this.pluginApi.setFullscreen) { - this.setFullscreen(false); - } - }, +/** + * Returns true if targetNode appears after sourceNode in the dom. + * @param {HTMLElement} sourceNode - the source node for comparison + * @param {HTMLElement} targetNode - the node to compare against sourceNode + */ +function isNodeAfter(sourceNode, targetNode) { - // start: fake events - addEventListener: function (eventName, callback, bubble) { - this.events[eventName] = this.events[eventName] || []; - this.events[eventName].push(callback); - }, - removeEventListener: function (eventName, callback) { - if (!eventName) { this.events = {}; return true; } - var callbacks = this.events[eventName]; - if (!callbacks) return true; - if (!callback) { this.events[eventName] = []; return true; } - for (var i = 0; i < callbacks.length; i++) { - if (callbacks[i] === callback) { - this.events[eventName].splice(i, 1); - return true; - } - } - return false; - }, - dispatchEvent: function (eventName) { - var i, - args, - callbacks = this.events[eventName]; + return !!(sourceNode && targetNode && sourceNode.compareDocumentPosition(targetNode) & 2 // 2 : Node.DOCUMENT_POSITION_PRECEDING + ); +} - if (callbacks) { - args = Array.prototype.slice.call(arguments, 1); - for (i = 0; i < callbacks.length; i++) { - callbacks[i].apply(null, args); - } - } - }, - // end: fake events - - // fake DOM attribute methods - hasAttribute: function(name){ - return (name in this.attributes); - }, - removeAttribute: function(name){ - delete this.attributes[name]; - }, - getAttribute: function(name){ - if (this.hasAttribute(name)) { - return this.attributes[name]; - } - return ''; - }, - setAttribute: function(name, value){ - this.attributes[name] = value; - }, +/** + * Determines if a value is a string + * + * @param {*} value to check + * @returns {Boolean} True if a value is a string + */ +function isString(value) { + return typeof value === 'string'; +} - remove: function() { - mejs.Utility.removeSwf(this.pluginElement.id); - mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id); - } -}; +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.escapeHTML = escapeHTML; +_mejs2.default.Utils.debounce = debounce; +_mejs2.default.Utils.isObjectEmpty = isObjectEmpty; +_mejs2.default.Utils.splitEvents = splitEvents; +_mejs2.default.Utils.createEvent = createEvent; +_mejs2.default.Utils.isNodeAfter = isNodeAfter; +_mejs2.default.Utils.isString = isString; + +},{"6":6}],17:[function(_dereq_,module,exports){ +'use strict'; -// Handles calls from Flash/Silverlight and reports them as native <video/audio> events and properties -mejs.MediaPluginBridge = { +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.typeChecks = undefined; +exports.absolutizeUrl = absolutizeUrl; +exports.formatType = formatType; +exports.getMimeFromType = getMimeFromType; +exports.getTypeFromFile = getTypeFromFile; +exports.getExtension = getExtension; +exports.normalizeExtension = normalizeExtension; - pluginMediaElements:{}, - htmlMediaElements:{}, +var _mejs = _dereq_(6); - registerPluginElement: function (id, pluginMediaElement, htmlMediaElement) { - this.pluginMediaElements[id] = pluginMediaElement; - this.htmlMediaElements[id] = htmlMediaElement; - }, +var _mejs2 = _interopRequireDefault(_mejs); - unregisterPluginElement: function (id) { - delete this.pluginMediaElements[id]; - delete this.htmlMediaElements[id]; - }, +var _general = _dereq_(16); - // when Flash/Silverlight is ready, it calls out to this method - initPlugin: function (id) { +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - var pluginMediaElement = this.pluginMediaElements[id], - htmlMediaElement = this.htmlMediaElements[id]; +var typeChecks = exports.typeChecks = []; - if (pluginMediaElement) { - // find the javascript bridge - switch (pluginMediaElement.pluginType) { - case "flash": - pluginMediaElement.pluginElement = pluginMediaElement.pluginApi = document.getElementById(id); - break; - case "silverlight": - pluginMediaElement.pluginElement = document.getElementById(pluginMediaElement.id); - pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS; - break; - } - - if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) { - pluginMediaElement.success(pluginMediaElement, htmlMediaElement); - } - } - }, +/** + * + * @param {String} url + * @return {String} + */ +function absolutizeUrl(url) { - // receives events from Flash/Silverlight and sends them out as HTML5 media events - // http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html - fireEvent: function (id, eventName, values) { - - var - e, - i, - bufferedTime, - pluginMediaElement = this.pluginMediaElements[id]; - - if(!pluginMediaElement){ - return; - } - - // fake event object to mimic real HTML media event. - e = { - type: eventName, - target: pluginMediaElement - }; + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - // attach all values to element and event object - for (i in values) { - pluginMediaElement[i] = values[i]; - e[i] = values[i]; - } + var el = document.createElement('div'); + el.innerHTML = '<a href="' + (0, _general.escapeHTML)(url) + '">x</a>'; + return el.firstChild.href; +} + +/** + * Get the format of a specific media, based on URL and additionally its mime type + * + * @param {String} url + * @param {String} type + * @return {String} + */ +function formatType(url) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - // fake the newer W3C buffered TimeRange (loaded and total have been removed) - bufferedTime = values.bufferedTime || 0; + return url && !type ? getTypeFromFile(url) : getMimeFromType(type); +} - e.target.buffered = e.buffered = { - start: function(index) { - return 0; - }, - end: function (index) { - return bufferedTime; - }, - length: 1 - }; +/** + * Return the mime part of the type in case the attribute contains the codec + * (`video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`) + * + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element + * @param {String} type + * @return {String} + */ +function getMimeFromType(type) { - pluginMediaElement.dispatchEvent(e.type, e); + if (typeof type !== 'string') { + throw new Error('`type` argument must be a string'); } -}; -/* -Default options -*/ -mejs.MediaElementDefaults = { - // allows testing on HTML5, flash, silverlight - // auto: attempts to detect what the browser can do - // auto_plugin: prefer plugins and then attempt native HTML5 - // native: forces HTML5 playback - // shim: disallows HTML5, will attempt either Flash or Silverlight - // none: forces fallback view - mode: 'auto', - // remove or reorder to change plugin priority and availability - plugins: ['flash','silverlight','youtube','vimeo'], - // shows debug errors on screen - enablePluginDebug: false, - // use plugin for browsers that have trouble with Basic Authentication on HTTPS sites - httpsBasicAuthSite: false, - // overrides the type specified, useful for dynamic instantiation - type: '', - // path to Flash and Silverlight plugins - pluginPath: mejs.Utility.getScriptPath(['mediaelement.js','mediaelement.min.js','mediaelement-and-player.js','mediaelement-and-player.min.js']), - // name of flash file - flashName: 'flashmediaelement.swf', - // streamer for RTMP streaming - flashStreamer: '', - // turns on the smoothing filter in Flash - enablePluginSmoothing: false, - // enabled pseudo-streaming (seek) on .mp4 files - enablePseudoStreaming: false, - // start query parameter sent to server for pseudo-streaming - pseudoStreamingStartQueryParam: 'start', - // name of silverlight file - silverlightName: 'silverlightmediaelement.xap', - // default if the <video width> is not specified - defaultVideoWidth: 480, - // default if the <video height> is not specified - defaultVideoHeight: 270, - // overrides <video width> - pluginWidth: -1, - // overrides <video height> - pluginHeight: -1, - // additional plugin variables in 'key=value' form - pluginVars: [], - // rate in milliseconds for Flash and Silverlight to fire the timeupdate event - // larger number is less accurate, but less strain on plugin->JavaScript bridge - timerRate: 250, - // initial volume for player - startVolume: 0.8, - success: function () { }, - error: function () { } -}; + return type && ~type.indexOf(';') ? type.substr(0, type.indexOf(';')) : type; +} -/* -Determines if a browser supports the <video> or <audio> element -and returns either the native element or a Flash/Silverlight version that -mimics HTML5 MediaElement -*/ -mejs.MediaElement = function (el, o) { - return mejs.HtmlMediaElementShim.create(el,o); -}; +/** + * Get the type of media based on URL structure + * + * @param {String} url + * @return {String} + */ +function getTypeFromFile(url) { -mejs.HtmlMediaElementShim = { - - create: function(el, o) { - var - options = mejs.MediaElementDefaults, - htmlMediaElement = (typeof(el) == 'string') ? document.getElementById(el) : el, - tagName = htmlMediaElement.tagName.toLowerCase(), - isMediaTag = (tagName === 'audio' || tagName === 'video'), - src = (isMediaTag) ? htmlMediaElement.getAttribute('src') : htmlMediaElement.getAttribute('href'), - poster = htmlMediaElement.getAttribute('poster'), - autoplay = htmlMediaElement.getAttribute('autoplay'), - preload = htmlMediaElement.getAttribute('preload'), - controls = htmlMediaElement.getAttribute('controls'), - playback, - prop; - - // extend options - for (prop in o) { - options[prop] = o[prop]; - } - - // clean up attributes - src = (typeof src == 'undefined' || src === null || src == '') ? null : src; - poster = (typeof poster == 'undefined' || poster === null) ? '' : poster; - preload = (typeof preload == 'undefined' || preload === null || preload === 'false') ? 'none' : preload; - autoplay = !(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false'); - controls = !(typeof controls == 'undefined' || controls === null || controls === 'false'); - - // test for HTML5 and plugin capabilities - playback = this.determinePlayback(htmlMediaElement, options, mejs.MediaFeatures.supportsMediaTag, isMediaTag, src); - playback.url = (playback.url !== null) ? mejs.Utility.absolutizeUrl(playback.url) : ''; - - if (playback.method == 'native') { - // second fix for android - if (mejs.MediaFeatures.isBustedAndroid) { - htmlMediaElement.src = playback.url; - htmlMediaElement.addEventListener('click', function() { - htmlMediaElement.play(); - }, false); - } - - // add methods to native HTMLMediaElement - return this.updateNative(playback, options, autoplay, preload); - } else if (playback.method !== '') { - // create plugin to mimic HTMLMediaElement - - return this.createPlugin( playback, options, poster, autoplay, preload, controls); - } else { - // boo, no HTML5, no Flash, no Silverlight. - this.createErrorMessage( playback, options, poster ); - - return this; - } - }, - - determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) { - var - mediaFiles = [], - i, - j, - k, - l, - n, - type, - result = { method: '', url: '', htmlMediaElement: htmlMediaElement, isVideo: (htmlMediaElement.tagName.toLowerCase() != 'audio')}, - pluginName, - pluginVersions, - pluginInfo, - dummy, - media; - - // STEP 1: Get URL and type from <video src> or <source src> - - // supplied type overrides <video type> and <source type> - if (typeof options.type != 'undefined' && options.type !== '') { - - // accept either string or array of types - if (typeof options.type == 'string') { - mediaFiles.push({type:options.type, url:src}); - } else { - - for (i=0; i<options.type.length; i++) { - mediaFiles.push({type:options.type[i], url:src}); - } - } + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - // test for src attribute first - } else if (src !== null) { - type = this.formatType(src, htmlMediaElement.getAttribute('type')); - mediaFiles.push({type:type, url:src}); + for (var i = 0, total = typeChecks.length; i < total; i++) { + var type = typeChecks[i](url); - // then test for <source> elements - } else { - // test <source> types to see if they are usable - for (i = 0; i < htmlMediaElement.childNodes.length; i++) { - n = htmlMediaElement.childNodes[i]; - if (n.nodeType == 1 && n.tagName.toLowerCase() == 'source') { - src = n.getAttribute('src'); - type = this.formatType(src, n.getAttribute('type')); - media = n.getAttribute('media'); - - if (!media || !window.matchMedia || (window.matchMedia && window.matchMedia(media).matches)) { - mediaFiles.push({type:type, url:src}); - } - } - } - } - - // in the case of dynamicly created players - // check for audio types - if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) { - result.isVideo = false; + if (type) { + return type; } - + } - // STEP 2: Test for playback method - - // special case for Android which sadly doesn't implement the canPlayType function (always returns '') - if (mejs.MediaFeatures.isBustedAndroid) { - htmlMediaElement.canPlayType = function(type) { - return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : ''; - }; - } - - // special case for Chromium to specify natively supported video codecs (i.e. WebM and Theora) - if (mejs.MediaFeatures.isChromium) { - htmlMediaElement.canPlayType = function(type) { - return (type.match(/video\/(webm|ogv|ogg)/gi) !== null) ? 'maybe' : ''; - }; - } + // the do standard extension check + var ext = getExtension(url), + normalizedExt = normalizeExtension(ext); - // test for native playback first - if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native') && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) { - - if (!isMediaTag) { + var mime = 'video/mp4'; - // create a real HTML5 Media Element - dummy = document.createElement( result.isVideo ? 'video' : 'audio'); - htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement); - htmlMediaElement.style.display = 'none'; - - // use this one from now on - result.htmlMediaElement = htmlMediaElement = dummy; - } - - for (i=0; i<mediaFiles.length; i++) { - // normal check - if (mediaFiles[i].type == "video/m3u8" || htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== '' - // special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg') - || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== '' - // special case for m4a supported by detecting mp4 support - || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/m4a/,'mp4')).replace(/no/, '') !== '') { - result.method = 'native'; - result.url = mediaFiles[i].url; - break; - } - } - - if (result.method === 'native') { - if (result.url !== null) { - htmlMediaElement.src = result.url; - } - - // if `auto_plugin` mode, then cache the native result but try plugins. - if (options.mode !== 'auto_plugin') { - return result; - } - } + // Obtain correct MIME types + if (normalizedExt) { + if (['mp4', 'm4v', 'ogg', 'ogv', 'webm', 'flv', 'mpeg', 'mov'].includes(normalizedExt)) { + mime = 'video/' + normalizedExt; + } else if (['mp3', 'oga', 'wav', 'mid', 'midi'].includes(normalizedExt)) { + mime = 'audio/' + normalizedExt; } + } - // if native playback didn't work, then test plugins - if (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'shim') { - for (i=0; i<mediaFiles.length; i++) { - type = mediaFiles[i].type; + return mime; +} - // test all plugins in order of preference [silverlight, flash] - for (j=0; j<options.plugins.length; j++) { +/** + * Get media file extension from URL + * + * @param {String} url + * @return {String} + */ +function getExtension(url) { - pluginName = options.plugins[j]; - - // test version of plugin (for future features) - pluginVersions = mejs.plugins[pluginName]; - - for (k=0; k<pluginVersions.length; k++) { - pluginInfo = pluginVersions[k]; - - // test if user has the correct plugin version - - // for youtube/vimeo - if (pluginInfo.version == null || - - mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) { - - // test for plugin playback types - for (l=0; l<pluginInfo.types.length; l++) { - // find plugin that can play the type - if (type == pluginInfo.types[l]) { - result.method = pluginName; - result.url = mediaFiles[i].url; - return result; - } - } - } - } - } - } - } - - // at this point, being in 'auto_plugin' mode implies that we tried plugins but failed. - // if we have native support then return that. - if (options.mode === 'auto_plugin' && result.method === 'native') { - return result; - } + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - // what if there's nothing to play? just grab the first available - if (result.method === '' && mediaFiles.length > 0) { - result.url = mediaFiles[0].url; - } + var baseUrl = url.split('?')[0], + baseName = baseUrl.split('\\').pop().split('/').pop(); - return result; - }, + return baseName.indexOf('.') > -1 ? baseName.substring(baseName.lastIndexOf('.') + 1) : ''; +} - formatType: function(url, type) { - var ext; +/** + * Get standard extension of a media file + * + * @param {String} extension + * @return {String} + */ +function normalizeExtension(extension) { - // if no type is supplied, fake it with the extension - if (url && !type) { - return this.getTypeFromFile(url); - } else { - // only return the mime part of the type in case the attribute contains the codec - // see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element - // `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4` - - if (type && ~type.indexOf(';')) { - return type.substr(0, type.indexOf(';')); - } else { - return type; - } - } - }, - - getTypeFromFile: function(url) { - url = url.split('?')[0]; - var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(); - return (/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + this.getTypeFromExtension(ext); - }, - - getTypeFromExtension: function(ext) { - - switch (ext) { - case 'mp4': - case 'm4v': - case 'm4a': - return 'mp4'; - case 'webm': - case 'webma': - case 'webmv': - return 'webm'; - case 'ogg': - case 'oga': - case 'ogv': - return 'ogg'; - default: - return ext; - } - }, + if (typeof extension !== 'string') { + throw new Error('`extension` argument must be a string'); + } - createErrorMessage: function(playback, options, poster) { - var - htmlMediaElement = playback.htmlMediaElement, - errorContainer = document.createElement('div'); - - errorContainer.className = 'me-cannotplay'; - - try { - errorContainer.style.width = htmlMediaElement.width + 'px'; - errorContainer.style.height = htmlMediaElement.height + 'px'; - } catch (e) {} - - if (options.customError) { - errorContainer.innerHTML = options.customError; - } else { - errorContainer.innerHTML = (poster !== '') ? - '<a href="' + playback.url + '"><img src="' + poster + '" width="100%" height="100%" /></a>' : - '<a href="' + playback.url + '"><span>' + mejs.i18n.t('Download File') + '</span></a>'; - } + switch (extension) { + case 'mp4': + case 'm4v': + return 'mp4'; + case 'webm': + case 'webma': + case 'webmv': + return 'webm'; + case 'ogg': + case 'oga': + case 'ogv': + return 'ogg'; + default: + return extension; + } +} - htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement); - htmlMediaElement.style.display = 'none'; +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.typeChecks = typeChecks; +_mejs2.default.Utils.absolutizeUrl = absolutizeUrl; +_mejs2.default.Utils.formatType = formatType; +_mejs2.default.Utils.getMimeFromType = getMimeFromType; +_mejs2.default.Utils.getTypeFromFile = getTypeFromFile; +_mejs2.default.Utils.getExtension = getExtension; +_mejs2.default.Utils.normalizeExtension = normalizeExtension; - options.error(htmlMediaElement); - }, +},{"16":16,"6":6}],18:[function(_dereq_,module,exports){ +'use strict'; - createPlugin:function(playback, options, poster, autoplay, preload, controls) { - var - htmlMediaElement = playback.htmlMediaElement, - width = 1, - height = 1, - pluginid = 'me_' + playback.method + '_' + (mejs.meIndex++), - pluginMediaElement = new mejs.PluginMediaElement(pluginid, playback.method, playback.url), - container = document.createElement('div'), - specialIEContainer, - node, - initVars; - - // copy tagName from html media element - pluginMediaElement.tagName = htmlMediaElement.tagName - - // copy attributes from html media element to plugin media element - for (var i = 0; i < htmlMediaElement.attributes.length; i++) { - var attribute = htmlMediaElement.attributes[i]; - if (attribute.specified == true) { - pluginMediaElement.setAttribute(attribute.name, attribute.value); - } - } +var _document = _dereq_(2); - // check for placement inside a <p> tag (sometimes WYSIWYG editors do this) - node = htmlMediaElement.parentNode; - while (node !== null && node.tagName.toLowerCase() !== 'body' && node.parentNode != null) { - if (node.parentNode.tagName.toLowerCase() === 'p') { - node.parentNode.parentNode.insertBefore(node, node.parentNode); - break; - } - node = node.parentNode; - } +var _document2 = _interopRequireDefault(_document); - if (playback.isVideo) { - width = (options.pluginWidth > 0) ? options.pluginWidth : (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth; - height = (options.pluginHeight > 0) ? options.pluginHeight : (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight; - - // in case of '%' make sure it's encoded - width = mejs.Utility.encodeUrl(width); - height = mejs.Utility.encodeUrl(height); - - } else { - if (options.enablePluginDebug) { - width = 320; - height = 240; - } - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // register plugin - pluginMediaElement.success = options.success; - mejs.MediaPluginBridge.registerPluginElement(pluginid, pluginMediaElement, htmlMediaElement); +/** + * Polyfill + * + * Mimics the missing methods like Object.assign, Array.includes, etc., as a way to avoid including the whole list + * of polyfills provided by Babel. + */ - // add container (must be added to DOM before inserting HTML for IE) - container.className = 'me-plugin'; - container.id = pluginid + '_container'; - - if (playback.isVideo) { - htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement); - } else { - document.body.insertBefore(container, document.body.childNodes[0]); - } - - // flash/silverlight vars - initVars = [ - 'id=' + pluginid, - 'isvideo=' + ((playback.isVideo) ? "true" : "false"), - 'autoplay=' + ((autoplay) ? "true" : "false"), - 'preload=' + preload, - 'width=' + width, - 'startvolume=' + options.startVolume, - 'timerrate=' + options.timerRate, - 'flashstreamer=' + options.flashStreamer, - 'height=' + height, - 'pseudostreamstart=' + options.pseudoStreamingStartQueryParam]; - - if (playback.url !== null) { - if (playback.method == 'flash') { - initVars.push('file=' + mejs.Utility.encodeUrl(playback.url)); - } else { - initVars.push('file=' + playback.url); - } - } - if (options.enablePluginDebug) { - initVars.push('debug=true'); - } - if (options.enablePluginSmoothing) { - initVars.push('smoothing=true'); +// ChildNode.remove polyfill +// from: https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md +(function (arr) { + arr.forEach(function (item) { + if (item.hasOwnProperty('remove')) { + return; } - if (options.enablePseudoStreaming) { - initVars.push('pseudostreaming=true'); - } - if (controls) { - initVars.push('controls=true'); // shows controls in the plugin if desired - } - if (options.pluginVars) { - initVars = initVars.concat(options.pluginVars); - } - - switch (playback.method) { - case 'silverlight': - container.innerHTML = -'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' + -'<param name="initParams" value="' + initVars.join(',') + '" />' + -'<param name="windowless" value="true" />' + -'<param name="background" value="black" />' + -'<param name="minRuntimeVersion" value="3.0.0.0" />' + -'<param name="autoUpgrade" value="true" />' + -'<param name="source" value="' + options.pluginPath + options.silverlightName + '" />' + -'</object>'; - break; + Object.defineProperty(item, 'remove', { + configurable: true, + enumerable: true, + writable: true, + value: function remove() { + this.parentNode.removeChild(this); + } + }); + }); +})([Element.prototype, CharacterData.prototype, DocumentType.prototype]); - case 'flash': - - if (mejs.MediaFeatures.isIE) { - specialIEContainer = document.createElement('div'); - container.appendChild(specialIEContainer); - specialIEContainer.outerHTML = -'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' + -'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' + -'<param name="movie" value="' + options.pluginPath + options.flashName + '?x=' + (new Date()) + '" />' + -'<param name="flashvars" value="' + initVars.join('&') + '" />' + -'<param name="quality" value="high" />' + -'<param name="bgcolor" value="#000000" />' + -'<param name="wmode" value="transparent" />' + -'<param name="allowScriptAccess" value="always" />' + -'<param name="allowFullScreen" value="true" />' + -'<param name="scale" value="default" />' + -'</object>'; +// CustomEvent polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent +(function () { - } else { + if (typeof window.CustomEvent === "function") return false; - container.innerHTML = -'<embed id="' + pluginid + '" name="' + pluginid + '" ' + -'play="true" ' + -'loop="false" ' + -'quality="high" ' + -'bgcolor="#000000" ' + -'wmode="transparent" ' + -'allowScriptAccess="always" ' + -'allowFullScreen="true" ' + -'type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" ' + -'src="' + options.pluginPath + options.flashName + '" ' + -'flashvars="' + initVars.join('&') + '" ' + -'width="' + width + '" ' + -'height="' + height + '" ' + -'scale="default"' + -'class="mejs-shim"></embed>'; - } - break; - - case 'youtube': - - - var videoId; - // youtu.be url from share button - if (playback.url.lastIndexOf("youtu.be") != -1) { - videoId = playback.url.substr(playback.url.lastIndexOf('/')+1); - if (videoId.indexOf('?') != -1) { - videoId = videoId.substr(0, videoId.indexOf('?')); - } - } - else { - videoId = playback.url.substr(playback.url.lastIndexOf('=')+1); - } - youtubeSettings = { - container: container, - containerId: container.id, - pluginMediaElement: pluginMediaElement, - pluginId: pluginid, - videoId: videoId, - height: height, - width: width - }; - - if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) { - mejs.YouTubeApi.createFlash(youtubeSettings); - } else { - mejs.YouTubeApi.enqueueIframe(youtubeSettings); - } - - break; - - // DEMO Code. Does NOT work. - case 'vimeo': - var player_id = pluginid + "_player"; - pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1); - - container.innerHTML ='<iframe src="//player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '"></iframe>'; - if (typeof($f) == 'function') { // froogaloop available - var player = $f(container.childNodes[0]); - player.addEvent('ready', function() { - $.extend( player, { - playVideo: function() { - player.api( 'play' ); - }, - stopVideo: function() { - player.api( 'unload' ); - }, - pauseVideo: function() { - player.api( 'pause' ); - }, - seekTo: function( seconds ) { - player.api( 'seekTo', seconds ); - }, - setVolume: function( volume ) { - player.api( 'setVolume', volume ); - }, - setMuted: function( muted ) { - if( muted ) { - player.lastVolume = player.api( 'getVolume' ); - player.api( 'setVolume', 0 ); - } else { - player.api( 'setVolume', player.lastVolume ); - delete player.lastVolume; - } - } - }); + function CustomEvent(event, params) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = _document2.default.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } - function createEvent(player, pluginMediaElement, eventName, e) { - var obj = { - type: eventName, - target: pluginMediaElement - }; - if (eventName == 'timeupdate') { - pluginMediaElement.currentTime = obj.currentTime = e.seconds; - pluginMediaElement.duration = obj.duration = e.duration; - } - pluginMediaElement.dispatchEvent(obj.type, obj); - } + CustomEvent.prototype = window.Event.prototype; - player.addEvent('play', function() { - createEvent(player, pluginMediaElement, 'play'); - createEvent(player, pluginMediaElement, 'playing'); - }); + window.CustomEvent = CustomEvent; +})(); - player.addEvent('pause', function() { - createEvent(player, pluginMediaElement, 'pause'); - }); +// Object.assign polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill +if (typeof Object.assign !== 'function') { + Object.assign = function (target) { + // .length of function is 2 - player.addEvent('finish', function() { - createEvent(player, pluginMediaElement, 'ended'); - }); + if (target === null || target === undefined) { + // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } - player.addEvent('playProgress', function(e) { - createEvent(player, pluginMediaElement, 'timeupdate', e); - }); + var to = Object(target); - pluginMediaElement.pluginElement = container; - pluginMediaElement.pluginApi = player; + for (var index = 1, total = arguments.length; index < total; index++) { + var nextSource = arguments[index]; - // init mejs - mejs.MediaPluginBridge.initPlugin(pluginid); - }); - } - else { - console.warn("You need to include froogaloop for vimeo to work"); + if (nextSource !== null) { + // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } } - break; + } } - // hide original element - htmlMediaElement.style.display = 'none'; - // prevent browser from autoplaying when using a plugin - htmlMediaElement.removeAttribute('autoplay'); + return to; + }; +} - // FYI: options.success will be fired by the MediaPluginBridge - - return pluginMediaElement; - }, +// Array.includes polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Polyfill +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, 'includes', { + value: function value(searchElement, fromIndex) { - updateNative: function(playback, options, autoplay, preload) { - - var htmlMediaElement = playback.htmlMediaElement, - m; - - - // add methods to video object to bring it into parity with Flash Object - for (m in mejs.HtmlMediaElement) { - htmlMediaElement[m] = mejs.HtmlMediaElement[m]; - } - - /* - Chrome now supports preload="none" - if (mejs.MediaFeatures.isChrome) { - - // special case to enforce preload attribute (Chrome doesn't respect this) - if (preload === 'none' && !autoplay) { - - // forces the browser to stop loading (note: fails in IE9) - htmlMediaElement.src = ''; - htmlMediaElement.load(); - htmlMediaElement.canceledPreload = true; - - htmlMediaElement.addEventListener('play',function() { - if (htmlMediaElement.canceledPreload) { - htmlMediaElement.src = playback.url; - htmlMediaElement.load(); - htmlMediaElement.play(); - htmlMediaElement.canceledPreload = false; - } - }, false); - // for some reason Chrome forgets how to autoplay sometimes. - } else if (autoplay) { - htmlMediaElement.load(); - htmlMediaElement.play(); + // 1. const O be ? ToObject(this value). + if (this === null || this === undefined) { + throw new TypeError('"this" is null or not defined'); } - } - */ - // fire success code - options.success(htmlMediaElement, htmlMediaElement); - - return htmlMediaElement; - } -}; + var o = Object(this); -/* - - test on IE (object vs. embed) - - determine when to use iframe (Firefox, Safari, Mobile) vs. Flash (Chrome, IE) - - fullscreen? -*/ + // 2. const len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; -// YouTube Flash and Iframe API -mejs.YouTubeApi = { - isIframeStarted: false, - isIframeLoaded: false, - loadIframeApi: function() { - if (!this.isIframeStarted) { - var tag = document.createElement('script'); - tag.src = "//www.youtube.com/player_api"; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - this.isIframeStarted = true; - } - }, - iframeQueue: [], - enqueueIframe: function(yt) { - - if (this.isLoaded) { - this.createIframe(yt); - } else { - this.loadIframeApi(); - this.iframeQueue.push(yt); - } - }, - createIframe: function(settings) { - - var - pluginMediaElement = settings.pluginMediaElement, - player = new YT.Player(settings.containerId, { - height: settings.height, - width: settings.width, - videoId: settings.videoId, - playerVars: {controls:0}, - events: { - 'onReady': function() { - - // hook up iframe object to MEjs - settings.pluginMediaElement.pluginApi = player; - - // init mejs - mejs.MediaPluginBridge.initPlugin(settings.pluginId); - - // create timer - setInterval(function() { - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate'); - }, 250); - }, - 'onStateChange': function(e) { - - mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement); - - } + // 3. If len is 0, return false. + if (len === 0) { + return false; } - }); - }, - - createEvent: function (player, pluginMediaElement, eventName) { - var obj = { - type: eventName, - target: pluginMediaElement - }; - if (player && player.getDuration) { - - // time - pluginMediaElement.currentTime = obj.currentTime = player.getCurrentTime(); - pluginMediaElement.duration = obj.duration = player.getDuration(); - - // state - obj.paused = pluginMediaElement.paused; - obj.ended = pluginMediaElement.ended; - - // sound - obj.muted = player.isMuted(); - obj.volume = player.getVolume() / 100; - - // progress - obj.bytesTotal = player.getVideoBytesTotal(); - obj.bufferedBytes = player.getVideoBytesLoaded(); - - // fake the W3C buffered TimeRange - var bufferedTime = obj.bufferedBytes / obj.bytesTotal * obj.duration; - - obj.target.buffered = obj.buffered = { - start: function(index) { - return 0; - }, - end: function (index) { - return bufferedTime; - }, - length: 1 - }; + // 4. const n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. const k be n. + // 6. Else n < 0, + // a. const k be len + n. + // b. If k < 0, const k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + // 7. Repeat, while k < len + while (k < len) { + // a. const elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(searchElement, elementK) is true, return true. + // c. Increase k by 1. + // NOTE: === provides the correct "SameValueZero" comparison needed here. + if (o[k] === searchElement) { + return true; + } + k++; + } + // 8. Return false + return false; } - - // send event up the chain - pluginMediaElement.dispatchEvent(obj.type, obj); - }, - - iFrameReady: function() { - - this.isLoaded = true; - this.isIframeLoaded = true; - - while (this.iframeQueue.length > 0) { - var settings = this.iframeQueue.pop(); - this.createIframe(settings); - } - }, - - // FLASH! - flashPlayers: {}, - createFlash: function(settings) { - - this.flashPlayers[settings.pluginId] = settings; - - /* - settings.container.innerHTML = - '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="//www.youtube.com/apiplayer?enablejsapi=1&playerapiid=' + settings.pluginId + '&version=3&autoplay=0&controls=0&modestbranding=1&loop=0" ' + - 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' + - '<param name="allowScriptAccess" value="always">' + - '<param name="wmode" value="transparent">' + - '</object>'; - */ - - var specialIEContainer, - youtubeUrl = '//www.youtube.com/apiplayer?enablejsapi=1&playerapiid=' + settings.pluginId + '&version=3&autoplay=0&controls=0&modestbranding=1&loop=0'; - - if (mejs.MediaFeatures.isIE) { - - specialIEContainer = document.createElement('div'); - settings.container.appendChild(specialIEContainer); - specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' + -'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' + - '<param name="movie" value="' + youtubeUrl + '" />' + - '<param name="wmode" value="transparent" />' + - '<param name="allowScriptAccess" value="always" />' + - '<param name="allowFullScreen" value="true" />' + -'</object>'; - } else { - settings.container.innerHTML = - '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' + - 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' + - '<param name="allowScriptAccess" value="always">' + - '<param name="wmode" value="transparent">' + - '</object>'; - } - - }, - - flashReady: function(id) { - var - settings = this.flashPlayers[id], - player = document.getElementById(id), - pluginMediaElement = settings.pluginMediaElement; - - // hook up and return to MediaELementPlayer.success - pluginMediaElement.pluginApi = - pluginMediaElement.pluginElement = player; - mejs.MediaPluginBridge.initPlugin(id); - - // load the youtube video - player.cueVideoById(settings.videoId); - - var callbackName = settings.containerId + '_callback'; - - window[callbackName] = function(e) { - mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement); - } - - player.addEventListener('onStateChange', callbackName); - - setInterval(function() { - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate'); - }, 250); - - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay'); - }, - - handleStateChange: function(youTubeState, player, pluginMediaElement) { - switch (youTubeState) { - case -1: // not started - pluginMediaElement.paused = true; - pluginMediaElement.ended = true; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'loadedmetadata'); - //createYouTubeEvent(player, pluginMediaElement, 'loadeddata'); - break; - case 0: - pluginMediaElement.paused = false; - pluginMediaElement.ended = true; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'ended'); - break; - case 1: - pluginMediaElement.paused = false; - pluginMediaElement.ended = false; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play'); - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing'); - break; - case 2: - pluginMediaElement.paused = true; - pluginMediaElement.ended = false; - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause'); - break; - case 3: // buffering - mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'progress'); - break; - case 5: - // cued? - break; - - } - - } -} -// IFRAME -function onYouTubePlayerAPIReady() { - mejs.YouTubeApi.iFrameReady(); + }); } -// FLASH -function onYouTubePlayerReady(id) { - mejs.YouTubeApi.flashReady(id); -} - -window.mejs = mejs; -window.MediaElement = mejs.MediaElement; - -/*! - * Adds Internationalization and localization to mediaelement. - * - * This file does not contain translations, you have to add the manually. - * The schema is always the same: me-i18n-locale-[ISO_639-1 Code].js - * - * Examples are provided both for german and chinese translation. - * - * - * What is the concept beyond i18n? - * http://en.wikipedia.org/wiki/Internationalization_and_localization - * - * What langcode should i use? - * http://en.wikipedia.org/wiki/ISO_639-1 - * - * - * License? - * - * The i18n file uses methods from the Drupal project (drupal.js): - * - i18n.methods.t() (modified) - * - i18n.methods.checkPlain() (full copy) - * - * The Drupal project is (like mediaelementjs) licensed under GPLv2. - * - http://drupal.org/licensing/faq/#q1 - * - https://github.com/johndyer/mediaelement - * - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * - * - * @author - * Tim Latz (latz.tim@gmail.com) - * - * - * @params - * - context - document, iframe .. - * - exports - CommonJS, window .. - * - */ -;(function(context, exports, undefined) { - "use strict"; - var i18n = { - "locale": { - "language" : '', - "strings" : {} - }, - "methods" : {} - }; -// start i18n - - - /** - * Get language, fallback to browser's language if empty - */ - i18n.getLanguage = function () { - var language = i18n.locale.language || window.navigator.userLanguage || window.navigator.language; - // convert to iso 639-1 (2-letters, lower case) - return language.substr(0, 2).toLowerCase(); - }; - - // i18n fixes for compatibility with WordPress - if ( typeof mejsL10n != 'undefined' ) { - i18n.locale.language = mejsL10n.language; - } - +// String.includes polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +if (!String.prototype.includes) { + String.prototype.includes = function (search, start) { + 'use strict'; - /** - * Encode special characters in a plain-text string for display as HTML. - */ - i18n.methods.checkPlain = function (str) { - var character, regex, - replace = { - '&': '&', - '"': '"', - '<': '<', - '>': '>' - }; - str = String(str); - for (character in replace) { - if (replace.hasOwnProperty(character)) { - regex = new RegExp(character, 'g'); - str = str.replace(regex, replace[character]); - } - } - return str; - }; - - /** - * Translate strings to the page language or a given language. - * - * - * @param str - * A string containing the English string to translate. - * - * @param options - * - 'context' (defaults to the default context): The context the source string - * belongs to. - * - * @return - * The translated string, escaped via i18n.methods.checkPlain() - */ - i18n.methods.t = function (str, options) { - - // Fetch the localized version of the string. - if (i18n.locale.strings && i18n.locale.strings[options.context] && i18n.locale.strings[options.context][str]) { - str = i18n.locale.strings[options.context][str]; - } - - return i18n.methods.checkPlain(str); - }; - - - /** - * Wrapper for i18n.methods.t() - * - * @see i18n.methods.t() - * @throws InvalidArgumentException - */ - i18n.t = function(str, options) { - - if (typeof str === 'string' && str.length > 0) { - - // check every time due language can change for - // different reasons (translation, lang switcher ..) - var language = i18n.getLanguage(); - - options = options || { - "context" : language - }; - - return i18n.methods.t(str, options); - } - else { - throw { - "name" : 'InvalidArgumentException', - "message" : 'First argument is either not a string or empty.' - }; - } - }; - -// end i18n - exports.i18n = i18n; -}(document, mejs)); - -// i18n fixes for compatibility with WordPress -;(function(exports, undefined) { - - "use strict"; - - if ( typeof mejsL10n != 'undefined' ) { - exports[mejsL10n.language] = mejsL10n.strings; - } + if (typeof start !== 'number') { + start = 0; + } -}(mejs.i18n.locale.strings)); + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; +} -/*! - * This is a i18n.locale language object. - * - * German translation by Tim Latz, latz.tim@gmail.com - * - * @author - * Tim Latz (latz.tim@gmail.com) - * - * @see - * me-i18n.js - * - * @params - * - exports - CommonJS, window .. - */ -;(function(exports, undefined) { +// String.startsWith polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; +} - "use strict"; +// Element.matches polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches +if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length - 1; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} - if (typeof exports.de === 'undefined') { - exports.de = { - "Fullscreen" : "Vollbild", - "Go Fullscreen" : "Vollbild an", - "Turn off Fullscreen" : "Vollbild aus", - "Close" : "Schließen" - }; - } +// Element.closest polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest +if (window.Element && !Element.prototype.closest) { + Element.prototype.closest = function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = void 0, + el = this; + do { + i = matches.length; + while (--i >= 0 && matches.item(i) !== el) {} + } while (i < 0 && (el = el.parentElement)); + return el; + }; +} -}(mejs.i18n.locale.strings)); -/*! - * This is a i18n.locale language object. - * - * Traditional chinese translation by Tim Latz, latz.tim@gmail.com - * - * @author - * Tim Latz (latz.tim@gmail.com) - * - * @see - * me-i18n.js - * - * @params - * - exports - CommonJS, window .. - */ -;(function(exports, undefined) { +// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ +// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - "use strict"; +// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel - if (typeof exports.zh === 'undefined') { - exports.zh = { - "Fullscreen" : "全螢幕", - "Go Fullscreen" : "å…¨å±æ¨¡å¼", - "Turn off Fullscreen" : "退出全å±æ¨¡å¼", - "Close" : "關閉" - }; - } +// MIT license -}(mejs.i18n.locale.strings)); +(function () { + var lastTime = 0; + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } + if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + + if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; +})(); + +},{"2":2}]},{},[18,5,4,8,13,10,9,11,12,14]); diff --git a/lib/mejs/mediaelement.min.js b/lib/mejs/mediaelement.min.js index d14d65f4..90d697e4 100644 --- a/lib/mejs/mediaelement.min.js +++ b/lib/mejs/mediaelement.min.js @@ -1,72 +1,34 @@ /*! -* MediaElement.js -* HTML5 <video> and <audio> shim and player -* http://mediaelementjs.com/ -* -* Creates a JavaScript object that mimics HTML5 MediaElement API -* for browsers that don't understand HTML5 or can't play the provided codec -* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3 -* -* Copyright 2010-2014, John Dyer (http://j.hn) -* License: MIT -* -*/var mejs=mejs||{};mejs.version="2.15.1";mejs.meIndex=0; -mejs.plugins={silverlight:[{version:[3,0],types:["video/mp4","video/m4v","video/mov","video/wmv","audio/wma","audio/m4a","audio/mp3","audio/wav","audio/mpeg"]}],flash:[{version:[9,0,124],types:["video/mp4","video/m4v","video/mov","video/flv","video/rtmp","video/x-flv","audio/flv","audio/x-flv","audio/mp3","audio/m4a","audio/mpeg","video/youtube","video/x-youtube","application/x-mpegURL"]}],youtube:[{version:null,types:["video/youtube","video/x-youtube","audio/youtube","audio/x-youtube"]}],vimeo:[{version:null, -types:["video/vimeo","video/x-vimeo"]}]}; -mejs.Utility={encodeUrl:function(a){return encodeURIComponent(a)},escapeHTML:function(a){return a.toString().split("&").join("&").split("<").join("<").split('"').join(""")},absolutizeUrl:function(a){var b=document.createElement("div");b.innerHTML='<a href="'+this.escapeHTML(a)+'">x</a>';return b.firstChild.href},getScriptPath:function(a){for(var b=0,c,d="",e="",g,f,i=document.getElementsByTagName("script"),k=i.length,h=a.length;b<k;b++){g=i[b].src;c=g.lastIndexOf("/");if(c>-1){f=g.substring(c+ -1);g=g.substring(0,c+1)}else{f=g;g=""}for(c=0;c<h;c++){e=a[c];e=f.indexOf(e);if(e>-1){d=g;break}}if(d!=="")break}return d},secondsToTimeCode:function(a,b,c,d){if(typeof c=="undefined")c=false;else if(typeof d=="undefined")d=25;var e=Math.floor(a/3600)%24,g=Math.floor(a/60)%60,f=Math.floor(a%60);a=Math.floor((a%1*d).toFixed(3));return(b||e>0?(e<10?"0"+e:e)+":":"")+(g<10?"0"+g:g)+":"+(f<10?"0"+f:f)+(c?":"+(a<10?"0"+a:a):"")},timeCodeToSeconds:function(a,b,c,d){if(typeof c=="undefined")c=false;else if(typeof d== -"undefined")d=25;a=a.split(":");b=parseInt(a[0],10);var e=parseInt(a[1],10),g=parseInt(a[2],10),f=0,i=0;if(c)f=parseInt(a[3])/d;return i=b*3600+e*60+g+f},convertSMPTEtoSeconds:function(a){if(typeof a!="string")return false;a=a.replace(",",".");var b=0,c=a.indexOf(".")!=-1?a.split(".")[1].length:0,d=1;a=a.split(":").reverse();for(var e=0;e<a.length;e++){d=1;if(e>0)d=Math.pow(60,e);b+=Number(a[e])*d}return Number(b.toFixed(c))},removeSwf:function(a){var b=document.getElementById(a);if(b&&/object|embed/i.test(b.nodeName))if(mejs.MediaFeatures.isIE){b.style.display= -"none";(function(){b.readyState==4?mejs.Utility.removeObjectInIE(a):setTimeout(arguments.callee,10)})()}else b.parentNode.removeChild(b)},removeObjectInIE:function(a){if(a=document.getElementById(a)){for(var b in a)if(typeof a[b]=="function")a[b]=null;a.parentNode.removeChild(a)}}}; -mejs.PluginDetector={hasPluginVersion:function(a,b){var c=this.plugins[a];b[1]=b[1]||0;b[2]=b[2]||0;return c[0]>b[0]||c[0]==b[0]&&c[1]>b[1]||c[0]==b[0]&&c[1]==b[1]&&c[2]>=b[2]?true:false},nav:window.navigator,ua:window.navigator.userAgent.toLowerCase(),plugins:[],addPlugin:function(a,b,c,d,e){this.plugins[a]=this.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var e=[0,0,0],g;if(typeof this.nav.plugins!="undefined"&&typeof this.nav.plugins[a]=="object"){if((c=this.nav.plugins[a].description)&& -!(typeof this.nav.mimeTypes!="undefined"&&this.nav.mimeTypes[b]&&!this.nav.mimeTypes[b].enabledPlugin)){e=c.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(a=0;a<e.length;a++)e[a]=parseInt(e[a].match(/\d+/),10)}}else if(typeof window.ActiveXObject!="undefined")try{if(g=new ActiveXObject(c))e=d(g)}catch(f){}return e}}; -mejs.PluginDetector.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[];if(a=a.GetVariable("$version")){a=a.split(" ")[1].split(",");b=[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]}return b}); -mejs.PluginDetector.addPlugin("silverlight","Silverlight Plug-In","application/x-silverlight-2","AgControl.AgControl",function(a){var b=[0,0,0,0],c=function(d,e,g,f){for(;d.isVersionSupported(e[0]+"."+e[1]+"."+e[2]+"."+e[3]);)e[g]+=f;e[g]-=f};c(a,b,0,1);c(a,b,1,1);c(a,b,2,1E4);c(a,b,2,1E3);c(a,b,2,100);c(a,b,2,10);c(a,b,2,1);c(a,b,3,1);return b}); -mejs.MediaFeatures={init:function(){var a=this,b=document,c=mejs.PluginDetector.nav,d=mejs.PluginDetector.ua.toLowerCase(),e,g=["source","track","audio","video"];a.isiPad=d.match(/ipad/i)!==null;a.isiPhone=d.match(/iphone/i)!==null;a.isiOS=a.isiPhone||a.isiPad;a.isAndroid=d.match(/android/i)!==null;a.isBustedAndroid=d.match(/android 2\.[12]/)!==null;a.isBustedNativeHTTPS=location.protocol==="https:"&&(d.match(/android [12]\./)!==null||d.match(/macintosh.* version.* safari/)!==null);a.isIE=c.appName.toLowerCase().indexOf("microsoft")!= --1||c.appName.toLowerCase().match(/trident/gi)!==null;a.isChrome=d.match(/chrome/gi)!==null;a.isChromium=d.match(/chromium/gi)!==null;a.isFirefox=d.match(/firefox/gi)!==null;a.isWebkit=d.match(/webkit/gi)!==null;a.isGecko=d.match(/gecko/gi)!==null&&!a.isWebkit&&!a.isIE;a.isOpera=d.match(/opera/gi)!==null;a.hasTouch="ontouchstart"in window;a.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect;for(c=0;c<g.length;c++)e=document.createElement(g[c]); -a.supportsMediaTag=typeof e.canPlayType!=="undefined"||a.isBustedAndroid;try{e.canPlayType("video/mp4")}catch(f){a.supportsMediaTag=false}a.hasSemiNativeFullScreen=typeof e.webkitEnterFullscreen!=="undefined";a.hasNativeFullscreen=typeof e.requestFullscreen!=="undefined";a.hasWebkitNativeFullScreen=typeof e.webkitRequestFullScreen!=="undefined";a.hasMozNativeFullScreen=typeof e.mozRequestFullScreen!=="undefined";a.hasMsNativeFullScreen=typeof e.msRequestFullscreen!=="undefined";a.hasTrueNativeFullScreen= -a.hasWebkitNativeFullScreen||a.hasMozNativeFullScreen||a.hasMsNativeFullScreen;a.nativeFullScreenEnabled=a.hasTrueNativeFullScreen;if(a.hasMozNativeFullScreen)a.nativeFullScreenEnabled=document.mozFullScreenEnabled;else if(a.hasMsNativeFullScreen)a.nativeFullScreenEnabled=document.msFullscreenEnabled;if(a.isChrome)a.hasSemiNativeFullScreen=false;if(a.hasTrueNativeFullScreen){a.fullScreenEventName="";if(a.hasWebkitNativeFullScreen)a.fullScreenEventName="webkitfullscreenchange";else if(a.hasMozNativeFullScreen)a.fullScreenEventName= -"mozfullscreenchange";else if(a.hasMsNativeFullScreen)a.fullScreenEventName="MSFullscreenChange";a.isFullScreen=function(){if(a.hasMozNativeFullScreen)return b.mozFullScreen;else if(a.hasWebkitNativeFullScreen)return b.webkitIsFullScreen;else if(a.hasMsNativeFullScreen)return b.msFullscreenElement!==null};a.requestFullScreen=function(i){if(a.hasWebkitNativeFullScreen)i.webkitRequestFullScreen();else if(a.hasMozNativeFullScreen)i.mozRequestFullScreen();else a.hasMsNativeFullScreen&&i.msRequestFullscreen()}; -a.cancelFullScreen=function(){if(a.hasWebkitNativeFullScreen)document.webkitCancelFullScreen();else if(a.hasMozNativeFullScreen)document.mozCancelFullScreen();else a.hasMsNativeFullScreen&&document.msExitFullscreen()}}if(a.hasSemiNativeFullScreen&&d.match(/mac os x 10_5/i)){a.hasNativeFullScreen=false;a.hasSemiNativeFullScreen=false}}};mejs.MediaFeatures.init(); -mejs.HtmlMediaElement={pluginType:"native",isFullScreen:false,setCurrentTime:function(a){this.currentTime=a},setMuted:function(a){this.muted=a},setVolume:function(a){this.volume=a},stop:function(){this.pause()},setSrc:function(a){for(var b=this.getElementsByTagName("source");b.length>0;)this.removeChild(b[0]);if(typeof a=="string")this.src=a;else{var c;for(b=0;b<a.length;b++){c=a[b];if(this.canPlayType(c.type)){this.src=c.src;break}}}},setVideoSize:function(a,b){this.width=a;this.height=b}}; -mejs.PluginMediaElement=function(a,b,c){this.id=a;this.pluginType=b;this.src=c;this.events={};this.attributes={}}; -mejs.PluginMediaElement.prototype={pluginElement:null,pluginType:"",isFullScreen:false,playbackRate:-1,defaultPlaybackRate:-1,seekable:[],played:[],paused:true,ended:false,seeking:false,duration:0,error:null,tagName:"",muted:false,volume:1,currentTime:0,play:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.playVideo():this.pluginApi.playMedia();this.paused=false}},load:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType== -"vimeo"||this.pluginApi.loadMedia();this.paused=false}},pause:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.pauseVideo():this.pluginApi.pauseMedia();this.paused=true}},stop:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.stopVideo():this.pluginApi.stopMedia();this.paused=true}},canPlayType:function(a){var b,c,d,e=mejs.plugins[this.pluginType];for(b=0;b<e.length;b++){d=e[b];if(mejs.PluginDetector.hasPluginVersion(this.pluginType, -d.version))for(c=0;c<d.types.length;c++)if(a==d.types[c])return"probably"}return""},positionFullscreenButton:function(a,b,c){this.pluginApi!=null&&this.pluginApi.positionFullscreenButton&&this.pluginApi.positionFullscreenButton(Math.floor(a),Math.floor(b),c)},hideFullscreenButton:function(){this.pluginApi!=null&&this.pluginApi.hideFullscreenButton&&this.pluginApi.hideFullscreenButton()},setSrc:function(a){if(typeof a=="string"){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(a));this.src=mejs.Utility.absolutizeUrl(a)}else{var b, -c;for(b=0;b<a.length;b++){c=a[b];if(this.canPlayType(c.type)){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(c.src));this.src=mejs.Utility.absolutizeUrl(a);break}}}},setCurrentTime:function(a){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.seekTo(a):this.pluginApi.setCurrentTime(a);this.currentTime=a}},setVolume:function(a){if(this.pluginApi!=null){this.pluginType=="youtube"?this.pluginApi.setVolume(a*100):this.pluginApi.setVolume(a);this.volume=a}}, -setMuted:function(a){if(this.pluginApi!=null){if(this.pluginType=="youtube"){a?this.pluginApi.mute():this.pluginApi.unMute();this.muted=a;this.dispatchEvent("volumechange")}else this.pluginApi.setMuted(a);this.muted=a}},setVideoSize:function(a,b){if(this.pluginElement&&this.pluginElement.style){this.pluginElement.style.width=a+"px";this.pluginElement.style.height=b+"px"}this.pluginApi!=null&&this.pluginApi.setVideoSize&&this.pluginApi.setVideoSize(a,b)},setFullscreen:function(a){this.pluginApi!=null&& -this.pluginApi.setFullscreen&&this.pluginApi.setFullscreen(a)},enterFullScreen:function(){this.pluginApi!=null&&this.pluginApi.setFullscreen&&this.setFullscreen(true)},exitFullScreen:function(){this.pluginApi!=null&&this.pluginApi.setFullscreen&&this.setFullscreen(false)},addEventListener:function(a,b){this.events[a]=this.events[a]||[];this.events[a].push(b)},removeEventListener:function(a,b){if(!a){this.events={};return true}var c=this.events[a];if(!c)return true;if(!b){this.events[a]=[];return true}for(var d= -0;d<c.length;d++)if(c[d]===b){this.events[a].splice(d,1);return true}return false},dispatchEvent:function(a){var b,c,d=this.events[a];if(d){c=Array.prototype.slice.call(arguments,1);for(b=0;b<d.length;b++)d[b].apply(null,c)}},hasAttribute:function(a){return a in this.attributes},removeAttribute:function(a){delete this.attributes[a]},getAttribute:function(a){if(this.hasAttribute(a))return this.attributes[a];return""},setAttribute:function(a,b){this.attributes[a]=b},remove:function(){mejs.Utility.removeSwf(this.pluginElement.id); -mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id)}}; -mejs.MediaPluginBridge={pluginMediaElements:{},htmlMediaElements:{},registerPluginElement:function(a,b,c){this.pluginMediaElements[a]=b;this.htmlMediaElements[a]=c},unregisterPluginElement:function(a){delete this.pluginMediaElements[a];delete this.htmlMediaElements[a]},initPlugin:function(a){var b=this.pluginMediaElements[a],c=this.htmlMediaElements[a];if(b){switch(b.pluginType){case "flash":b.pluginElement=b.pluginApi=document.getElementById(a);break;case "silverlight":b.pluginElement=document.getElementById(b.id); -b.pluginApi=b.pluginElement.Content.MediaElementJS}b.pluginApi!=null&&b.success&&b.success(b,c)}},fireEvent:function(a,b,c){var d,e;if(a=this.pluginMediaElements[a]){b={type:b,target:a};for(d in c){a[d]=c[d];b[d]=c[d]}e=c.bufferedTime||0;b.target.buffered=b.buffered={start:function(){return 0},end:function(){return e},length:1};a.dispatchEvent(b.type,b)}}}; -mejs.MediaElementDefaults={mode:"auto",plugins:["flash","silverlight","youtube","vimeo"],enablePluginDebug:false,httpsBasicAuthSite:false,type:"",pluginPath:mejs.Utility.getScriptPath(["mediaelement.js","mediaelement.min.js","mediaelement-and-player.js","mediaelement-and-player.min.js"]),flashName:"flashmediaelement.swf",flashStreamer:"",enablePluginSmoothing:false,enablePseudoStreaming:false,pseudoStreamingStartQueryParam:"start",silverlightName:"silverlightmediaelement.xap",defaultVideoWidth:480, -defaultVideoHeight:270,pluginWidth:-1,pluginHeight:-1,pluginVars:[],timerRate:250,startVolume:0.8,success:function(){},error:function(){}};mejs.MediaElement=function(a,b){return mejs.HtmlMediaElementShim.create(a,b)}; -mejs.HtmlMediaElementShim={create:function(a,b){var c=mejs.MediaElementDefaults,d=typeof a=="string"?document.getElementById(a):a,e=d.tagName.toLowerCase(),g=e==="audio"||e==="video",f=g?d.getAttribute("src"):d.getAttribute("href");e=d.getAttribute("poster");var i=d.getAttribute("autoplay"),k=d.getAttribute("preload"),h=d.getAttribute("controls"),j;for(j in b)c[j]=b[j];f=typeof f=="undefined"||f===null||f==""?null:f;e=typeof e=="undefined"||e===null?"":e;k=typeof k=="undefined"||k===null||k==="false"? -"none":k;i=!(typeof i=="undefined"||i===null||i==="false");h=!(typeof h=="undefined"||h===null||h==="false");j=this.determinePlayback(d,c,mejs.MediaFeatures.supportsMediaTag,g,f);j.url=j.url!==null?mejs.Utility.absolutizeUrl(j.url):"";if(j.method=="native"){if(mejs.MediaFeatures.isBustedAndroid){d.src=j.url;d.addEventListener("click",function(){d.play()},false)}return this.updateNative(j,c,i,k)}else if(j.method!=="")return this.createPlugin(j,c,e,i,k,h);else{this.createErrorMessage(j,c,e);return this}}, -determinePlayback:function(a,b,c,d,e){var g=[],f,i,k,h={method:"",url:"",htmlMediaElement:a,isVideo:a.tagName.toLowerCase()!="audio"},j;if(typeof b.type!="undefined"&&b.type!=="")if(typeof b.type=="string")g.push({type:b.type,url:e});else for(f=0;f<b.type.length;f++)g.push({type:b.type[f],url:e});else if(e!==null){k=this.formatType(e,a.getAttribute("type"));g.push({type:k,url:e})}else for(f=0;f<a.childNodes.length;f++){i=a.childNodes[f];if(i.nodeType==1&&i.tagName.toLowerCase()=="source"){e=i.getAttribute("src"); -k=this.formatType(e,i.getAttribute("type"));i=i.getAttribute("media");if(!i||!window.matchMedia||window.matchMedia&&window.matchMedia(i).matches)g.push({type:k,url:e})}}if(!d&&g.length>0&&g[0].url!==null&&this.getTypeFromFile(g[0].url).indexOf("audio")>-1)h.isVideo=false;if(mejs.MediaFeatures.isBustedAndroid)a.canPlayType=function(m){return m.match(/video\/(mp4|m4v)/gi)!==null?"maybe":""};if(mejs.MediaFeatures.isChromium)a.canPlayType=function(m){return m.match(/video\/(webm|ogv|ogg)/gi)!==null?"maybe": -""};if(c&&(b.mode==="auto"||b.mode==="auto_plugin"||b.mode==="native")&&!(mejs.MediaFeatures.isBustedNativeHTTPS&&b.httpsBasicAuthSite===true)){if(!d){f=document.createElement(h.isVideo?"video":"audio");a.parentNode.insertBefore(f,a);a.style.display="none";h.htmlMediaElement=a=f}for(f=0;f<g.length;f++)if(g[f].type=="video/m3u8"||a.canPlayType(g[f].type).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/mp3/,"mpeg")).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/m4a/,"mp4")).replace(/no/, -"")!==""){h.method="native";h.url=g[f].url;break}if(h.method==="native"){if(h.url!==null)a.src=h.url;if(b.mode!=="auto_plugin")return h}}if(b.mode==="auto"||b.mode==="auto_plugin"||b.mode==="shim")for(f=0;f<g.length;f++){k=g[f].type;for(a=0;a<b.plugins.length;a++){e=b.plugins[a];i=mejs.plugins[e];for(c=0;c<i.length;c++){j=i[c];if(j.version==null||mejs.PluginDetector.hasPluginVersion(e,j.version))for(d=0;d<j.types.length;d++)if(k==j.types[d]){h.method=e;h.url=g[f].url;return h}}}}if(b.mode==="auto_plugin"&& -h.method==="native")return h;if(h.method===""&&g.length>0)h.url=g[0].url;return h},formatType:function(a,b){return a&&!b?this.getTypeFromFile(a):b&&~b.indexOf(";")?b.substr(0,b.indexOf(";")):b},getTypeFromFile:function(a){a=a.split("?")[0];a=a.substring(a.lastIndexOf(".")+1).toLowerCase();return(/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(a)?"video":"audio")+"/"+this.getTypeFromExtension(a)},getTypeFromExtension:function(a){switch(a){case "mp4":case "m4v":case "m4a":return"mp4";case "webm":case "webma":case "webmv":return"webm"; -case "ogg":case "oga":case "ogv":return"ogg";default:return a}},createErrorMessage:function(a,b,c){var d=a.htmlMediaElement,e=document.createElement("div");e.className="me-cannotplay";try{e.style.width=d.width+"px";e.style.height=d.height+"px"}catch(g){}e.innerHTML=b.customError?b.customError:c!==""?'<a href="'+a.url+'"><img src="'+c+'" width="100%" height="100%" /></a>':'<a href="'+a.url+'"><span>'+mejs.i18n.t("Download File")+"</span></a>";d.parentNode.insertBefore(e,d);d.style.display="none";b.error(d)}, -createPlugin:function(a,b,c,d,e,g){c=a.htmlMediaElement;var f=1,i=1,k="me_"+a.method+"_"+mejs.meIndex++,h=new mejs.PluginMediaElement(k,a.method,a.url),j=document.createElement("div"),m;h.tagName=c.tagName;for(m=0;m<c.attributes.length;m++){var q=c.attributes[m];q.specified==true&&h.setAttribute(q.name,q.value)}for(m=c.parentNode;m!==null&&m.tagName.toLowerCase()!=="body"&&m.parentNode!=null;){if(m.parentNode.tagName.toLowerCase()==="p"){m.parentNode.parentNode.insertBefore(m,m.parentNode);break}m= -m.parentNode}if(a.isVideo){f=b.pluginWidth>0?b.pluginWidth:b.videoWidth>0?b.videoWidth:c.getAttribute("width")!==null?c.getAttribute("width"):b.defaultVideoWidth;i=b.pluginHeight>0?b.pluginHeight:b.videoHeight>0?b.videoHeight:c.getAttribute("height")!==null?c.getAttribute("height"):b.defaultVideoHeight;f=mejs.Utility.encodeUrl(f);i=mejs.Utility.encodeUrl(i)}else if(b.enablePluginDebug){f=320;i=240}h.success=b.success;mejs.MediaPluginBridge.registerPluginElement(k,h,c);j.className="me-plugin";j.id= -k+"_container";a.isVideo?c.parentNode.insertBefore(j,c):document.body.insertBefore(j,document.body.childNodes[0]);d=["id="+k,"isvideo="+(a.isVideo?"true":"false"),"autoplay="+(d?"true":"false"),"preload="+e,"width="+f,"startvolume="+b.startVolume,"timerrate="+b.timerRate,"flashstreamer="+b.flashStreamer,"height="+i,"pseudostreamstart="+b.pseudoStreamingStartQueryParam];if(a.url!==null)a.method=="flash"?d.push("file="+mejs.Utility.encodeUrl(a.url)):d.push("file="+a.url);b.enablePluginDebug&&d.push("debug=true"); -b.enablePluginSmoothing&&d.push("smoothing=true");b.enablePseudoStreaming&&d.push("pseudostreaming=true");g&&d.push("controls=true");if(b.pluginVars)d=d.concat(b.pluginVars);switch(a.method){case "silverlight":j.innerHTML='<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="'+k+'" name="'+k+'" width="'+f+'" height="'+i+'" class="mejs-shim"><param name="initParams" value="'+d.join(",")+'" /><param name="windowless" value="true" /><param name="background" value="black" /><param name="minRuntimeVersion" value="3.0.0.0" /><param name="autoUpgrade" value="true" /><param name="source" value="'+ -b.pluginPath+b.silverlightName+'" /></object>';break;case "flash":if(mejs.MediaFeatures.isIE){a=document.createElement("div");j.appendChild(a);a.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+k+'" width="'+f+'" height="'+i+'" class="mejs-shim"><param name="movie" value="'+b.pluginPath+b.flashName+"?x="+new Date+'" /><param name="flashvars" value="'+d.join("&")+'" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><param name="scale" value="default" /></object>'}else j.innerHTML= -'<embed id="'+k+'" name="'+k+'" play="true" loop="false" quality="high" bgcolor="#000000" wmode="transparent" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" src="'+b.pluginPath+b.flashName+'" flashvars="'+d.join("&")+'" width="'+f+'" height="'+i+'" scale="default"class="mejs-shim"></embed>';break;case "youtube":if(a.url.lastIndexOf("youtu.be")!=-1){a=a.url.substr(a.url.lastIndexOf("/")+1);if(a.indexOf("?")!= --1)a=a.substr(0,a.indexOf("?"))}else a=a.url.substr(a.url.lastIndexOf("=")+1);youtubeSettings={container:j,containerId:j.id,pluginMediaElement:h,pluginId:k,videoId:a,height:i,width:f};mejs.PluginDetector.hasPluginVersion("flash",[10,0,0])?mejs.YouTubeApi.createFlash(youtubeSettings):mejs.YouTubeApi.enqueueIframe(youtubeSettings);break;case "vimeo":b=k+"_player";h.vimeoid=a.url.substr(a.url.lastIndexOf("/")+1);j.innerHTML='<iframe src="//player.vimeo.com/video/'+h.vimeoid+"?api=1&portrait=0&byline=0&title=0&player_id="+ -b+'" width="'+f+'" height="'+i+'" frameborder="0" class="mejs-shim" id="'+b+'"></iframe>';if(typeof $f=="function"){var l=$f(j.childNodes[0]);l.addEvent("ready",function(){function o(n,p,r,s){n={type:r,target:p};if(r=="timeupdate"){p.currentTime=n.currentTime=s.seconds;p.duration=n.duration=s.duration}p.dispatchEvent(n.type,n)}$.extend(l,{playVideo:function(){l.api("play")},stopVideo:function(){l.api("unload")},pauseVideo:function(){l.api("pause")},seekTo:function(n){l.api("seekTo",n)},setVolume:function(n){l.api("setVolume", -n)},setMuted:function(n){if(n){l.lastVolume=l.api("getVolume");l.api("setVolume",0)}else{l.api("setVolume",l.lastVolume);delete l.lastVolume}}});l.addEvent("play",function(){o(l,h,"play");o(l,h,"playing")});l.addEvent("pause",function(){o(l,h,"pause")});l.addEvent("finish",function(){o(l,h,"ended")});l.addEvent("playProgress",function(n){o(l,h,"timeupdate",n)});h.pluginElement=j;h.pluginApi=l;mejs.MediaPluginBridge.initPlugin(k)})}else console.warn("You need to include froogaloop for vimeo to work")}c.style.display= -"none";c.removeAttribute("autoplay");return h},updateNative:function(a,b){var c=a.htmlMediaElement,d;for(d in mejs.HtmlMediaElement)c[d]=mejs.HtmlMediaElement[d];b.success(c,c);return c}}; -mejs.YouTubeApi={isIframeStarted:false,isIframeLoaded:false,loadIframeApi:function(){if(!this.isIframeStarted){var a=document.createElement("script");a.src="//www.youtube.com/player_api";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b);this.isIframeStarted=true}},iframeQueue:[],enqueueIframe:function(a){if(this.isLoaded)this.createIframe(a);else{this.loadIframeApi();this.iframeQueue.push(a)}},createIframe:function(a){var b=a.pluginMediaElement,c=new YT.Player(a.containerId, -{height:a.height,width:a.width,videoId:a.videoId,playerVars:{controls:0},events:{onReady:function(){a.pluginMediaElement.pluginApi=c;mejs.MediaPluginBridge.initPlugin(a.pluginId);setInterval(function(){mejs.YouTubeApi.createEvent(c,b,"timeupdate")},250)},onStateChange:function(d){mejs.YouTubeApi.handleStateChange(d.data,c,b)}}})},createEvent:function(a,b,c){c={type:c,target:b};if(a&&a.getDuration){b.currentTime=c.currentTime=a.getCurrentTime();b.duration=c.duration=a.getDuration();c.paused=b.paused; -c.ended=b.ended;c.muted=a.isMuted();c.volume=a.getVolume()/100;c.bytesTotal=a.getVideoBytesTotal();c.bufferedBytes=a.getVideoBytesLoaded();var d=c.bufferedBytes/c.bytesTotal*c.duration;c.target.buffered=c.buffered={start:function(){return 0},end:function(){return d},length:1}}b.dispatchEvent(c.type,c)},iFrameReady:function(){for(this.isIframeLoaded=this.isLoaded=true;this.iframeQueue.length>0;)this.createIframe(this.iframeQueue.pop())},flashPlayers:{},createFlash:function(a){this.flashPlayers[a.pluginId]= -a;var b,c="//www.youtube.com/apiplayer?enablejsapi=1&playerapiid="+a.pluginId+"&version=3&autoplay=0&controls=0&modestbranding=1&loop=0";if(mejs.MediaFeatures.isIE){b=document.createElement("div");a.container.appendChild(b);b.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+a.pluginId+'" width="'+a.width+'" height="'+a.height+'" class="mejs-shim"><param name="movie" value="'+ -c+'" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /></object>'}else a.container.innerHTML='<object type="application/x-shockwave-flash" id="'+a.pluginId+'" data="'+c+'" width="'+a.width+'" height="'+a.height+'" style="visibility: visible; " class="mejs-shim"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object>'},flashReady:function(a){var b=this.flashPlayers[a],c= -document.getElementById(a),d=b.pluginMediaElement;d.pluginApi=d.pluginElement=c;mejs.MediaPluginBridge.initPlugin(a);c.cueVideoById(b.videoId);a=b.containerId+"_callback";window[a]=function(e){mejs.YouTubeApi.handleStateChange(e,c,d)};c.addEventListener("onStateChange",a);setInterval(function(){mejs.YouTubeApi.createEvent(c,d,"timeupdate")},250);mejs.YouTubeApi.createEvent(c,d,"canplay")},handleStateChange:function(a,b,c){switch(a){case -1:c.paused=true;c.ended=true;mejs.YouTubeApi.createEvent(b, -c,"loadedmetadata");break;case 0:c.paused=false;c.ended=true;mejs.YouTubeApi.createEvent(b,c,"ended");break;case 1:c.paused=false;c.ended=false;mejs.YouTubeApi.createEvent(b,c,"play");mejs.YouTubeApi.createEvent(b,c,"playing");break;case 2:c.paused=true;c.ended=false;mejs.YouTubeApi.createEvent(b,c,"pause");break;case 3:mejs.YouTubeApi.createEvent(b,c,"progress")}}};function onYouTubePlayerAPIReady(){mejs.YouTubeApi.iFrameReady()}function onYouTubePlayerReady(a){mejs.YouTubeApi.flashReady(a)} -window.mejs=mejs;window.MediaElement=mejs.MediaElement; -(function(a,b){var c={locale:{language:"",strings:{}},methods:{}};c.getLanguage=function(){return(c.locale.language||window.navigator.userLanguage||window.navigator.language).substr(0,2).toLowerCase()};if(typeof mejsL10n!="undefined")c.locale.language=mejsL10n.language;c.methods.checkPlain=function(d){var e,g,f={"&":"&",'"':""","<":"<",">":">"};d=String(d);for(e in f)if(f.hasOwnProperty(e)){g=RegExp(e,"g");d=d.replace(g,f[e])}return d};c.methods.t=function(d,e){if(c.locale.strings&& -c.locale.strings[e.context]&&c.locale.strings[e.context][d])d=c.locale.strings[e.context][d];return c.methods.checkPlain(d)};c.t=function(d,e){if(typeof d==="string"&&d.length>0){var g=c.getLanguage();e=e||{context:g};return c.methods.t(d,e)}else throw{name:"InvalidArgumentException",message:"First argument is either not a string or empty."};};b.i18n=c})(document,mejs);(function(a){if(typeof mejsL10n!="undefined")a[mejsL10n.language]=mejsL10n.strings})(mejs.i18n.locale.strings); -(function(a){if(typeof a.de==="undefined")a.de={Fullscreen:"Vollbild","Go Fullscreen":"Vollbild an","Turn off Fullscreen":"Vollbild aus",Close:"Schlie\u00dfen"}})(mejs.i18n.locale.strings);(function(a){if(typeof a.zh==="undefined")a.zh={Fullscreen:"\u5168\u87a2\u5e55","Go Fullscreen":"\u5168\u5c4f\u6a21\u5f0f","Turn off Fullscreen":"\u9000\u51fa\u5168\u5c4f\u6a21\u5f0f",Close:"\u95dc\u9589"}})(mejs.i18n.locale.strings); + * MediaElement.js + * http://www.mediaelementjs.com/ + * + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) + * License: MIT + * + *//*! + * MediaElement.js + * http://www.mediaelementjs.com/ + * + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) + * License: MIT + * + */ +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){},{}],2:[function(a,b,c){(function(c){var d="undefined"!=typeof c?c:"undefined"!=typeof window?window:{},e=a(1);if("undefined"!=typeof document)b.exports=document;else{var f=d["__GLOBAL_DOCUMENT_CACHE@4"];f||(f=d["__GLOBAL_DOCUMENT_CACHE@4"]=e),b.exports=f}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{1:1}],3:[function(a,b,c){(function(a){"undefined"!=typeof window?b.exports=window:"undefined"!=typeof a?b.exports=a:"undefined"!=typeof self?b.exports=self:b.exports={}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0});var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(6),g=d(f),h=a(8),i=a(16),j={lang:"en",en:h.EN};j.language=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];if(null!==b&&void 0!==b&&b.length){if("string"!=typeof b[0])throw new TypeError("Language code must be a string value");if(!b[0].match(/^[a-z]{2}(\-[a-z]{2})?$/i))throw new TypeError("Language code must have format `xx` or `xx-xx`");j.lang=b[0],void 0===j[b[0]]?(b[1]=null!==b[1]&&void 0!==b[1]&&"object"===e(b[1])?b[1]:{},j[b[0]]=i.isObjectEmpty(b[1])?h.EN:b[1]):null!==b[1]&&void 0!==b[1]&&"object"===e(b[1])&&(j[b[0]]=b[1])}return j.lang},j.t=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof a&&a.length){var c=void 0,d=void 0,f=j.language(),g=function(a,b,c){if("object"!==("undefined"==typeof a?"undefined":e(a))||"number"!=typeof b||"number"!=typeof c)return a;var d=function(){return[function(){return arguments.length<=1?void 0:arguments[1]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 0===(arguments.length<=0?void 0:arguments[0])||1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:0!==(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])||11===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])||12===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])>2&&(arguments.length<=0?void 0:arguments[0])<20?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:0===(arguments.length<=0?void 0:arguments[0])||(arguments.length<=0?void 0:arguments[0])%100>0&&(arguments.length<=0?void 0:arguments[0])%100<20?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:[3]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])>=2&&(arguments.length<=0?void 0:arguments[0])<=4?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return(arguments.length<=0?void 0:arguments[0])%100===1?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])%100===2?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])%100===3||(arguments.length<=0?void 0:arguments[0])%100===4?arguments.length<=4?void 0:arguments[4]:arguments.length<=1?void 0:arguments[1]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])>2&&(arguments.length<=0?void 0:arguments[0])<7?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])>6&&(arguments.length<=0?void 0:arguments[0])<11?arguments.length<=4?void 0:arguments[4]:arguments.length<=5?void 0:arguments[5]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])%100>=3&&(arguments.length<=0?void 0:arguments[0])%100<=10?arguments.length<=4?void 0:arguments[4]:(arguments.length<=0?void 0:arguments[0])%100>=11?arguments.length<=5?void 0:arguments[5]:arguments.length<=6?void 0:arguments[6]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:0===(arguments.length<=0?void 0:arguments[0])||(arguments.length<=0?void 0:arguments[0])%100>1&&(arguments.length<=0?void 0:arguments[0])%100<11?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])%100>10&&(arguments.length<=0?void 0:arguments[0])%100<20?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10===2?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 11!==(arguments.length<=0?void 0:arguments[0])&&(arguments.length<=0?void 0:arguments[0])%10===1?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:8!==(arguments.length<=0?void 0:arguments[0])&&11!==(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:3===(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]}]}();return d[c].apply(null,[b].concat(a))};return void 0!==j[f]&&(c=j[f][a],null!==b&&"number"==typeof b&&(d=j[f]["mejs.plural-form"],c=g.apply(null,[c,b,d]))),!c&&j.en&&(c=j.en[a],null!==b&&"number"==typeof b&&(d=j.en["mejs.plural-form"],c=g.apply(null,[c,b,d]))),c=c||a,null!==b&&"number"==typeof b&&(c=c.replace("%1",b)),i.escapeHTML(c)}return a},g["default"].i18n=j,"undefined"!=typeof mejsL10n&&g["default"].i18n.language(mejsL10n.language,mejsL10n.strings),c["default"]=j},{16:16,6:6,8:8}],5:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0});var f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(16),m=a(17),n=a(7),o=function p(a,b){var c=this;e(this,p);var d=this;d.defaults={renderers:[],fakeNodeName:"mediaelementwrapper",pluginPath:"build/",shimScriptAccess:"sameDomain",customError:""},b=Object.assign(d.defaults,b),d.mediaElement=i["default"].createElement(b.fakeNodeName),d.mediaElement.options=b;var f=a,g=!1;if("string"==typeof a?d.mediaElement.originalNode=i["default"].getElementById(a):(d.mediaElement.originalNode=a,f=a.id),f=f||"mejs_"+Math.random().toString().slice(2),void 0!==d.mediaElement.originalNode&&null!==d.mediaElement.originalNode&&d.mediaElement.appendChild){d.mediaElement.originalNode.setAttribute("id",f+"_from_mejs");var h=d.mediaElement.originalNode.tagName.toLowerCase();["video","audio"].includes(h)&&!d.mediaElement.originalNode.getAttribute("preload")&&d.mediaElement.originalNode.setAttribute("preload","none"),d.mediaElement.originalNode.parentNode.insertBefore(d.mediaElement,d.mediaElement.originalNode),d.mediaElement.appendChild(d.mediaElement.originalNode)}d.mediaElement.id=f,d.mediaElement.renderers={},d.mediaElement.renderer=null,d.mediaElement.rendererName=null,d.mediaElement.changeRenderer=function(a,b){var d=c;if(void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer.name===a)return d.mediaElement.renderer.pause(),d.mediaElement.renderer.stop&&d.mediaElement.renderer.stop(),d.mediaElement.renderer.show(),d.mediaElement.renderer.setSrc(b[0].src),!0;void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&(d.mediaElement.renderer.pause(),d.mediaElement.renderer.stop&&d.mediaElement.renderer.stop(),d.mediaElement.renderer.hide());var e=d.mediaElement.renderers[a],f=null;if(void 0!==e&&null!==e)return e.show(),e.setSrc(b[0].src),d.mediaElement.renderer=e,d.mediaElement.rendererName=a,!0;for(var g=d.mediaElement.options.renderers.length?d.mediaElement.options.renderers:n.renderer.order,h=0,i=g.length;i>h;h++){var j=g[h];if(j===a){var k=n.renderer.renderers;f=k[j];var l=Object.assign(f.options,d.mediaElement.options);return e=f.create(d.mediaElement,l,b),e.name=a,d.mediaElement.renderers[f.name]=e,d.mediaElement.renderer=e,d.mediaElement.rendererName=a,e.show(),!0}}return!1},d.mediaElement.setSize=function(a,b){void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer.setSize(a,b)},d.mediaElement.createErrorMessage=function(a){a=Array.isArray(a)?a:[];var b=i["default"].createElement("div");b.className="me_cannotplay",b.style.width="100%",b.style.height="100%";var c=d.mediaElement.options.customError;if(!c){var e=d.mediaElement.originalNode.getAttribute("poster");e&&(c+='<img src="'+e+'" width="100%" height="100%" alt="'+k["default"].i18n.t("mejs.download-file")+'">');for(var f=0,h=a.length;h>f;f++){var j=a[f];c+='<a href="'+j.src+'" data-type="'+j.type+'"><span>'+k["default"].i18n.t("mejs.download-file")+": "+j.src+"</span></a>"}}b.innerHTML=c,d.mediaElement.originalNode.parentNode.insertBefore(b,d.mediaElement.originalNode),d.mediaElement.originalNode.style.display="none",g=!0};var j=k["default"].html5media.properties,o=k["default"].html5media.methods,q=function(a,b,c,d){var e=a[b],f=function(){return c.apply(a,[e])},g=function(b){return e=d.apply(a,[b])};Object.defineProperty(a,b,{get:f,set:g})},r=function(a){"src"!==a&&!function(){var b=""+a.substring(0,1).toUpperCase()+a.substring(1),c=function(){return void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer?d.mediaElement.renderer["get"+b]():null},e=function(a){void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer["set"+b](a)};q(d.mediaElement,a,c,e),d.mediaElement["get"+b]=c,d.mediaElement["set"+b]=e}()},s=function(){return void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer?d.mediaElement.renderer.getSrc():null},t=function(a){var b=[];if("string"==typeof a)b.push({src:a,type:a?m.getTypeFromFile(a):""});else for(var c=0,e=a.length;e>c;c++){var f=m.absolutizeUrl(a[c].src),g=a[c].type;b.push({src:f,type:""!==g&&null!==g&&void 0!==g||!f?g:m.getTypeFromFile(f)})}var h=n.renderer.select(b,d.mediaElement.options.renderers.length?d.mediaElement.options.renderers:[]),i=void 0;return d.mediaElement.paused||(d.mediaElement.pause(),i=l.createEvent("pause",d.mediaElement),d.mediaElement.dispatchEvent(i)),d.mediaElement.originalNode.setAttribute("src",b[0].src||""),d.mediaElement.querySelector(".me_cannotplay")&&d.mediaElement.querySelector(".me_cannotplay").remove(),null===h?(d.mediaElement.createErrorMessage(b),i=l.createEvent("error",d.mediaElement),i.message="No renderer found",void d.mediaElement.dispatchEvent(i)):(d.mediaElement.changeRenderer(h.rendererName,b),void 0===d.mediaElement.renderer||null===d.mediaElement.renderer?(i=l.createEvent("error",d.mediaElement),i.message="Error creating renderer",d.mediaElement.dispatchEvent(i),void d.mediaElement.createErrorMessage(b)):void 0)},u=function(a){d.mediaElement[a]=function(){for(var b=arguments.length,c=Array(b),e=0;b>e;e++)c[e]=arguments[e];if(void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&"function"==typeof d.mediaElement.renderer[a])try{d.mediaElement.renderer[a](c)}catch(f){d.mediaElement.createErrorMessage()}return null}};q(d.mediaElement,"src",s,t),d.mediaElement.getSrc=s,d.mediaElement.setSrc=t;for(var v=0,w=j.length;w>v;v++)r(j[v]);for(var x=0,y=o.length;y>x;x++)u(o[x]);if(d.mediaElement.events={},d.mediaElement.addEventListener=function(a,b){d.mediaElement.events[a]=d.mediaElement.events[a]||[],d.mediaElement.events[a].push(b)},d.mediaElement.removeEventListener=function(a,b){if(!a)return d.mediaElement.events={},!0;var c=d.mediaElement.events[a];if(!c)return!0;if(!b)return d.mediaElement.events[a]=[],!0;for(var e=0;e<c.length;e++)if(c[e]===b)return d.mediaElement.events[a].splice(e,1),!0;return!1},d.mediaElement.dispatchEvent=function(a){var b=d.mediaElement.events[a.type];if(b)for(var c=0;c<b.length;c++)b[c].apply(null,[a])},null!==d.mediaElement.originalNode){var z=[];switch(d.mediaElement.originalNode.nodeName.toLowerCase()){case"iframe":z.push({type:"",src:d.mediaElement.originalNode.getAttribute("src")});break;case"audio":case"video":var A=void 0,B=void 0,C=void 0,D=d.mediaElement.originalNode.childNodes.length,E=d.mediaElement.originalNode.getAttribute("src");if(E){var F=d.mediaElement.originalNode;z.push({type:m.formatType(E,F.getAttribute("type")),src:E})}for(var G=0;D>G;G++)A=d.mediaElement.originalNode.childNodes[G],A.nodeType===Node.ELEMENT_NODE&&"source"===A.tagName.toLowerCase()&&(B=A.getAttribute("src"),C=m.formatType(B,A.getAttribute("type")),z.push({type:C,src:B}))}z.length>0&&(d.mediaElement.src=z)}return d.mediaElement.options.success&&d.mediaElement.options.success(d.mediaElement,d.mediaElement.originalNode),g&&d.mediaElement.options.error&&d.mediaElement.options.error(d.mediaElement,d.mediaElement.originalNode),d.mediaElement};g["default"].MediaElement=o,c["default"]=o},{16:16,17:17,2:2,3:3,6:6,7:7}],6:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0});var e=a(3),f=d(e),g={};g.version="4.0.2",g.html5media={properties:["volume","src","currentTime","muted","duration","paused","ended","buffered","error","networkState","readyState","seeking","seekable","currentSrc","preload","bufferedBytes","bufferedTime","initialTime","startOffsetTime","defaultPlaybackRate","playbackRate","played","autoplay","loop","controls"],readOnlyProperties:["duration","paused","ended","buffered","error","networkState","readyState","seeking","seekable"],methods:["load","play","pause","canPlayType"],events:["loadstart","progress","suspend","abort","error","emptied","stalled","play","pause","loadedmetadata","loadeddata","waiting","playing","canplay","canplaythrough","seeking","seeked","timeupdate","ended","ratechange","durationchange","volumechange"],mediaTypes:["audio/mp3","audio/ogg","audio/oga","audio/wav","audio/x-wav","audio/wave","audio/x-pn-wav","audio/mpeg","audio/mp4","video/mp4","video/webm","video/ogg"]},f["default"].mejs=g,c["default"]=g},{3:3}],7:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0}),c.renderer=void 0;var f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},g=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),h=a(6),i=d(h),j=function(){function a(){e(this,a),this.renderers={},this.order=[]}return g(a,[{key:"add",value:function(a){if(void 0===a.name)throw new TypeError("renderer must contain at least `name` property");this.renderers[a.name]=a,this.order.push(a.name)}},{key:"select",value:function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],c=b.length;b=b.length?b:this.order,c||!function(){var a=[/^(html5|native)/,/^flash/,/iframe$/],c=function(b){for(var c=0,d=a.length;d>c;c++)if(null!==b.match(a[c]))return c;return a.length};b.sort(function(a,b){return c(a)-c(b)})}();for(var d=0,e=b.length;e>d;d++){var f=b[d],g=this.renderers[f];if(null!==g&&void 0!==g)for(var h=0,i=a.length;i>h;h++)if("function"==typeof g.canPlayType&&"string"==typeof a[h].type&&g.canPlayType(a[h].type))return{rendererName:g.name,src:a[h].src}}return null}},{key:"order",set:function(a){if(!Array.isArray(a))throw new TypeError("order must be an array of strings.");this._order=a},get:function(){return this._order}},{key:"renderers",set:function(a){if(null!==a&&"object"!==("undefined"==typeof a?"undefined":f(a)))throw new TypeError("renderers must be an array of objects.");this._renderers=a},get:function(){return this._renderers}}]),a}(),k=c.renderer=new j;i["default"].Renderers=k},{6:6}],8:[function(a,b,c){"use strict";/*! + * This is a `i18n` language object. + * + * English; This can serve as a template for other languages to translate + * + * @author + * TBD + * Sascha Greuel (Twitter: @SoftCreatR) + * + * @see core/i18n.js + */ +Object.defineProperty(c,"__esModule",{value:!0});c.EN={"mejs.plural-form":1,"mejs.download-file":"Download File","mejs.install-flash":"You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/","mejs.fullscreen":"Fullscreen","mejs.play":"Play","mejs.pause":"Pause","mejs.time-slider":"Time Slider","mejs.time-help-text":"Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.","mejs.live-broadcast":"Live Broadcast","mejs.volume-help-text":"Use Up/Down Arrow keys to increase or decrease volume.","mejs.unmute":"Unmute","mejs.mute":"Mute","mejs.volume-slider":"Volume Slider","mejs.video-player":"Video Player","mejs.audio-player":"Audio Player","mejs.captions-subtitles":"Captions/Subtitles","mejs.captions-chapters":"Chapters","mejs.none":"None","mejs.afrikaans":"Afrikaans","mejs.albanian":"Albanian","mejs.arabic":"Arabic","mejs.belarusian":"Belarusian","mejs.bulgarian":"Bulgarian","mejs.catalan":"Catalan","mejs.chinese":"Chinese","mejs.chinese-simplified":"Chinese (Simplified)","mejs.chinese-traditional":"Chinese (Traditional)","mejs.croatian":"Croatian","mejs.czech":"Czech","mejs.danish":"Danish","mejs.dutch":"Dutch","mejs.english":"English","mejs.estonian":"Estonian","mejs.filipino":"Filipino","mejs.finnish":"Finnish","mejs.french":"French","mejs.galician":"Galician","mejs.german":"German","mejs.greek":"Greek","mejs.haitian-creole":"Haitian Creole","mejs.hebrew":"Hebrew","mejs.hindi":"Hindi","mejs.hungarian":"Hungarian","mejs.icelandic":"Icelandic","mejs.indonesian":"Indonesian","mejs.irish":"Irish","mejs.italian":"Italian","mejs.japanese":"Japanese","mejs.korean":"Korean","mejs.latvian":"Latvian","mejs.lithuanian":"Lithuanian","mejs.macedonian":"Macedonian","mejs.malay":"Malay","mejs.maltese":"Maltese","mejs.norwegian":"Norwegian","mejs.persian":"Persian","mejs.polish":"Polish","mejs.portuguese":"Portuguese","mejs.romanian":"Romanian","mejs.russian":"Russian","mejs.serbian":"Serbian","mejs.slovak":"Slovak","mejs.slovenian":"Slovenian","mejs.spanish":"Spanish","mejs.swahili":"Swahili","mejs.swedish":"Swedish","mejs.tagalog":"Tagalog","mejs.thai":"Thai","mejs.turkish":"Turkish","mejs.ukrainian":"Ukrainian","mejs.vietnamese":"Vietnamese","mejs.welsh":"Welsh","mejs.yiddish":"Yiddish"}},{}],9:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(16),m=a(17),n=a(15),o={isMediaLoaded:!1,creationQueue:[],prepareSettings:function(a){o.isLoaded?o.createInstance(a):(o.loadScript(a),o.creationQueue.push(a))},loadScript:function(a){"undefined"!=typeof dashjs?o.createInstance(a):o.isScriptLoaded||!function(){a.options.path="string"==typeof a.options.path?a.options.path:"//cdn.dashjs.org/latest/dash.mediaplayer.min.js";var b=h["default"].createElement("script"),c=h["default"].getElementsByTagName("script")[0],d=!1;b.src=a.options.path,b.onload=b.onreadystatechange=function(){d||this.readyState&&void 0!==this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,o.mediaReady(),b.onload=b.onreadystatechange=null)},c.parentNode.insertBefore(b,c),o.isScriptLoaded=!0}()},mediaReady:function(){for(o.isLoaded=!0,o.isScriptLoaded=!0;o.creationQueue.length>0;){var a=o.creationQueue.pop();o.createInstance(a)}},createInstance:function(a){var b=dashjs.MediaPlayer().create();f["default"]["__ready__"+a.id](b)}},p={name:"native_dash",options:{prefix:"native_dash",dash:{path:"//cdn.dashjs.org/latest/dash.mediaplayer.min.js",debug:!1}},canPlayType:function(a){return n.HAS_MSE&&["application/dash+xml"].includes(a)},create:function(a,b,c){var d=a.originalNode,e=a.id+"_"+b.prefix,g=d.getAttribute("preload"),i=d.autoplay,m=null,n=null;m=d.cloneNode(!0),b=Object.assign(b,a.options);for(var p=j["default"].html5media.properties,q=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);m["get"+b]=function(){return null!==n?m[a]:null},m["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||null!==n&&("src"===a&&(n.attachSource(b),i&&m.play()),m[a]=b)}},r=0,s=p.length;s>r;r++)q(p[r]);if(f["default"]["__ready__"+e]=function(c){a.dashPlayer=n=c,n.getDebug().setLogToBrowserConsole(b.dash.debug),n.setAutoPlay(g&&"auto"===g||i),n.setScheduleWhilePaused(g&&"auto"===g||i);for(var d=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),e=dashjs.MediaPlayer.events,f=function(b){"loadedmetadata"===b&&n.initialize(m,m.src,!1),m.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},k=0,o=d.length;o>k;k++)f(d[k]);var p=function(b){var c=l.createEvent(b.type,m);c.data=b,a.dispatchEvent(c),"error"===b.type.toLowerCase()&&console.error(b)};for(var q in e)e.hasOwnProperty(q)&&n.on(e[q],p)},c&&c.length>0)for(var t=0,u=c.length;u>t;t++)if(k.renderer.renderers[b.prefix].canPlayType(c[t].type)){m.setAttribute("src",c[t].src);break}m.setAttribute("id",e),d.parentNode.insertBefore(m,d),d.autoplay=!1,d.style.display="none",o.prepareSettings({options:b.dash,id:e}),m.setSize=function(a,b){return m.style.width=a+"px",m.style.height=b+"px",m},m.hide=function(){return m.pause(),m.style.display="none",m},m.show=function(){return m.style.display="",m};var v=l.createEvent("rendererready",m);return a.dispatchEvent(v),m}};m.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes(".mpd")?"application/dash+xml":null}),k.renderer.add(p)},{15:15,16:16,17:17,2:2,3:3,6:6,7:7}],10:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0}),c.PluginDetector=void 0;var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(4),m=d(l),n=a(7),o=a(16),p=a(15),q=a(17),r=c.PluginDetector={plugins:[],hasPluginVersion:function(a,b){var c=r.plugins[a];return b[1]=b[1]||0,b[2]=b[2]||0,c[0]>b[0]||c[0]===b[0]&&c[1]>b[1]||c[0]===b[0]&&c[1]===b[1]&&c[2]>=b[2]},addPlugin:function(a,b,c,d,e){r.plugins[a]=r.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var f=[0,0,0],h=void 0,i=void 0;if(null!==p.NAV.plugins&&void 0!==p.NAV.plugins&&"object"===e(p.NAV.plugins[a])){if(h=p.NAV.plugins[a].description,h&&("undefined"==typeof p.NAV.mimeTypes||!p.NAV.mimeTypes[b]||p.NAV.mimeTypes[b].enabledPlugin)){f=h.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(var j=0,k=f.length;k>j;j++)f[j]=parseInt(f[j].match(/\d+/),10)}}else if(void 0!==g["default"].ActiveXObject)try{i=new ActiveXObject(c),i&&(f=d(i))}catch(l){}return f}};r.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[],c=a.GetVariable("$version");return c&&(c=c.split(" ")[1].split(","),b=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]),b});var s={create:function(a,b,c){var d={};d.options=b,d.id=a.id+"_"+d.options.prefix,d.mediaElement=a,d.flashState={},d.flashApi=null,d.flashApiStack=[];for(var f=k["default"].html5media.properties,h=function(a){d.flashState[a]=null;var b=""+a.substring(0,1).toUpperCase()+a.substring(1);d["get"+b]=function(){if(null===d.flashApi)return null;if(void 0===d.flashApi["get_"+a])return null;var b=function(){var b=d.flashApi["get_"+a]();return"buffered"===a?{v:{start:function(){return 0},end:function(){return b},length:1}}:{v:b}}();return"object"===("undefined"==typeof b?"undefined":e(b))?b.v:void 0},d["set"+b]=function(b){"src"===a&&(b=q.absolutizeUrl(b)),null!==d.flashApi&&void 0!==d.flashApi["set_"+a]?d.flashApi["set_"+a](b):d.flashApiStack.push({type:"set",propName:a,value:b})}},j=0,l=f.length;l>j;j++)h(f[j]);var r=k["default"].html5media.methods,s=function(a){d[a]=function(){if(null!==d.flashApi){if(d.flashApi["fire_"+a])try{d.flashApi["fire_"+a]()}catch(b){}}else d.flashApiStack.push({type:"call",methodName:a})}};r.push("stop");for(var t=0,u=r.length;u>t;t++)s(r[t]);for(var v=["rendererready","loadeddata","loadedmetadata","canplay","error"],w=0,x=v.length;x>w;w++){var y=o.createEvent(v[w],d);a.dispatchEvent(y)}g["default"]["__ready__"+d.id]=function(){if(d.flashReady=!0,d.flashApi=i["default"].getElementById("__"+d.id),d.flashApiStack.length)for(var a=0,b=d.flashApiStack.length;b>a;a++){var c=d.flashApiStack[a];if("set"===c.type){var e=c.propName,f=""+e.substring(0,1).toUpperCase()+e.substring(1);d["set"+f](c.value)}else"call"===c.type&&d[c.methodName]()}},g["default"]["__event__"+d.id]=function(a,b){var c=o.createEvent(a,d);c.message=b||"",d.mediaElement.dispatchEvent(c)},d.flashWrapper=i["default"].createElement("div"),["always","sameDomain"].includes(d.options.shimScriptAccess)||(d.options.shimScriptAccess="sameDomain");var z=a.originalNode.autoplay,A=["uid="+d.id,"autoplay="+z,"allowScriptAccess="+d.options.shimScriptAccess],B=null!==a.originalNode&&"video"===a.originalNode.tagName.toLowerCase(),C=B?a.originalNode.height:1,D=B?a.originalNode.width:1;a.originalNode.getAttribute("src")&&A.push("src="+a.originalNode.getAttribute("src")),d.options.enablePseudoStreaming===!0&&(A.push("pseudostreamstart="+d.options.pseudoStreamingStartQueryParam),A.push("pseudostreamtype="+d.options.pseudoStreamingType)),a.appendChild(d.flashWrapper),null!==a.originalNode&&(a.originalNode.style.display="none");var E=[];if(p.IS_IE){var F=i["default"].createElement("div");d.flashWrapper.appendChild(F),E=['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"','codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"','id="__'+d.id+'"','width="'+D+'"','height="'+C+'"'],B||E.push('style="clip: rect(0 0 0 0); position: absolute;"'),F.outerHTML="<object "+E.join(" ")+">"+('<param name="movie" value="'+d.options.pluginPath+d.options.filename+"?x="+new Date+'" />')+('<param name="flashvars" value="'+A.join("&")+'" />')+'<param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" />'+('<param name="allowScriptAccess" value="'+d.options.shimScriptAccess+'" />')+'<param name="allowFullScreen" value="true" />'+("<div>"+m["default"].t("mejs.install-flash")+"</div>")+"</object>"}else E=['id="__'+d.id+'"','name="__'+d.id+'"','play="true"','loop="false"','quality="high"','bgcolor="#000000"','wmode="transparent"','allowScriptAccess="'+d.options.shimScriptAccess+'"','allowFullScreen="true"','type="application/x-shockwave-flash"','pluginspage="//www.macromedia.com/go/getflashplayer"','src="'+d.options.pluginPath+d.options.filename+'"','flashvars="'+A.join("&")+'"','width="'+D+'"','height="'+C+'"'],B||E.push('style="clip: rect(0 0 0 0); position: absolute;"'),d.flashWrapper.innerHTML="<embed "+E.join(" ")+">";if(d.flashNode=d.flashWrapper.lastChild,d.hide=function(){if(B){d.flashNode.style.position="absolute",d.flashNode.style.width="1px",d.flashNode.style.height="1px";try{d.flashNode.style.clip="rect(0 0 0 0);"}catch(a){}}},d.show=function(){if(B){d.flashNode.style.position="",d.flashNode.style.width="",d.flashNode.style.height="";try{d.flashNode.style.clip=""}catch(a){}}},d.setSize=function(a,b){d.flashNode.style.width=a+"px",d.flashNode.style.height=b+"px",null!==d.flashApi&&"function"==typeof d.flashApi.fire_setSize&&d.flashApi.fire_setSize(a,b)},d.destroy=function(){d.flashNode.remove()},c&&c.length>0)for(var G=0,H=c.length;H>G;G++)if(n.renderer.renderers[b.prefix].canPlayType(c[G].type)){d.setSrc(c[G].src);break}return d}},t=r.hasPluginVersion("flash",[10,0,0]);if(t){q.typeChecks.push(function(a){return a=a.toLowerCase(),a.startsWith("rtmp")?a.includes(".mp3")?"audio/rtmp":"video/rtmp":a.includes(".oga")||a.includes(".ogg")?"audio/ogg":a.includes(".m3u8")?"application/x-mpegURL":a.includes(".mpd")?"application/dash+xml":a.includes(".flv")?"video/flv":null});var u={name:"flash_video",options:{prefix:"flash_video",filename:"mediaelement-flash-video.swf",enablePseudoStreaming:!1,pseudoStreamingStartQueryParam:"start",pseudoStreamingType:"byte"},canPlayType:function(a){return["video/mp4","video/rtmp","audio/rtmp","rtmp/mp4","audio/mp4","video/flv","video/x-flv"].includes(a.toLowerCase())},create:s.create};n.renderer.add(u);var v={name:"flash_hls",options:{prefix:"flash_hls",filename:"mediaelement-flash-video-hls.swf"},canPlayType:function(a){return["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())},create:s.create};n.renderer.add(v);var w={name:"flash_dash",options:{prefix:"flash_dash",filename:"mediaelement-flash-video-mdash.swf"},canPlayType:function(a){return["application/dash+xml"].includes(a.toLowerCase())},create:s.create};n.renderer.add(w);var x={name:"flash_audio",options:{prefix:"flash_audio",filename:"mediaelement-flash-audio.swf"},canPlayType:function(a){return["audio/mp3"].includes(a.toLowerCase())},create:s.create};n.renderer.add(x);var y={name:"flash_audio_ogg",options:{prefix:"flash_audio_ogg",filename:"mediaelement-flash-audio-ogg.swf"},canPlayType:function(a){return["audio/ogg","audio/oga","audio/ogv"].includes(a.toLowerCase())},create:s.create};n.renderer.add(y)}},{15:15,16:16,17:17,2:2,3:3,4:4,6:6,7:7}],11:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(16),m=a(15),n=a(17),o={isMediaStarted:!1,isMediaLoaded:!1,creationQueue:[],prepareSettings:function(a){o.isLoaded?o.createInstance(a):(o.loadScript(a),o.creationQueue.push(a))},loadScript:function(a){"undefined"!=typeof flvjs?o.createInstance(a):o.isMediaStarted||!function(){a.options.path="string"==typeof a.options.path?a.options.path:"//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js";var b=h["default"].createElement("script"),c=h["default"].getElementsByTagName("script")[0],d=!1;b.src=a.options.path,b.onload=b.onreadystatechange=function(){d||this.readyState&&void 0!==this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,o.mediaReady(),b.onload=b.onreadystatechange=null)},c.parentNode.insertBefore(b,c),o.isMediaStarted=!0}()},mediaReady:function(){for(o.isLoaded=!0,o.isMediaLoaded=!0;o.creationQueue.length>0;){var a=o.creationQueue.pop();o.createInstance(a)}},createInstance:function(a){var b=flvjs.createPlayer(a.options);f["default"]["__ready__"+a.id](b)}},p={name:"native_flv",options:{prefix:"native_flv",flv:{path:"//cdnjs.cloudflare.com/ajax/libs/flv.js/1.1.0/flv.min.js",cors:!0}},canPlayType:function(a){return m.HAS_MSE&&["video/x-flv","video/flv"].includes(a)},create:function(a,b,c){var d=a.originalNode,e=a.id+"_"+b.prefix,g=null,i=null;g=d.cloneNode(!0),b=Object.assign(b,a.options);for(var m=j["default"].html5media.properties,n=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);g["get"+b]=function(){return null!==i?g[a]:null},g["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||null!==i&&(g[a]=b,"src"===a&&(i.unload(),i.detachMediaElement(),i.attachMediaElement(g),i.load()))}},p=0,q=m.length;q>p;p++)n(m[p]);if(f["default"]["__ready__"+e]=function(b){a.flvPlayer=i=b;for(var c=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),d=function(b){"loadedmetadata"===b&&(i.unload(),i.detachMediaElement(),i.attachMediaElement(g),i.load()),g.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},e=0,f=c.length;f>e;e++)d(c[e])},c&&c.length>0)for(var r=0,s=c.length;s>r;r++)if(k.renderer.renderers[b.prefix].canPlayType(c[r].type)){g.setAttribute("src",c[r].src);break}g.setAttribute("id",e),d.parentNode.insertBefore(g,d),d.autoplay=!1,d.style.display="none",b.flv.type="flv",b.flv.url=g.getAttribute("src"),o.prepareSettings({options:b.flv,id:e}),g.setSize=function(a,b){return g.style.width=a+"px",g.style.height=b+"px",g},g.hide=function(){return null!==i&&i.pause(),g.style.display="none",g},g.show=function(){return g.style.display="",g},g.destroy=function(){null!==i&&i.destroy()};var t=l.createEvent("rendererready",g);return a.dispatchEvent(t),g}};n.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes(".flv")?"video/flv":null}),k.renderer.add(p)},{15:15,16:16,17:17,2:2,3:3,6:6,7:7}],12:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(16),m=a(15),n=a(17),o={isMediaStarted:!1,isMediaLoaded:!1,creationQueue:[],prepareSettings:function(a){o.isLoaded?o.createInstance(a):(o.loadScript(a),o.creationQueue.push(a))},loadScript:function(a){"undefined"!=typeof Hls?o.createInstance(a):o.isMediaStarted||!function(){a.options.path="string"==typeof a.options.path?a.options.path:"//cdn.jsdelivr.net/hls.js/latest/hls.min.js";var b=h["default"].createElement("script"),c=h["default"].getElementsByTagName("script")[0],d=!1;b.src=a.options.path,b.onload=b.onreadystatechange=function(){d||this.readyState&&void 0!==this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,o.mediaReady(),b.onload=b.onreadystatechange=null)},c.parentNode.insertBefore(b,c),o.isMediaStarted=!0}()},mediaReady:function(){for(o.isLoaded=!0,o.isMediaLoaded=!0;o.creationQueue.length>0;){var a=o.creationQueue.pop();o.createInstance(a)}},createInstance:function(a){var b=new Hls(a.options);return f["default"]["__ready__"+a.id](b),b}},p={name:"native_hls",options:{prefix:"native_hls",hls:{path:"//cdn.jsdelivr.net/hls.js/latest/hls.min.js",autoStartLoad:!1,debug:!1}},canPlayType:function(a){return m.HAS_MSE&&["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())},create:function(a,b,c){var d=a.originalNode,e=a.id+"_"+b.prefix,g=d.getAttribute("preload"),i=d.autoplay,m=null,n=null;n=d.cloneNode(!0),b=Object.assign(b,a.options),b.hls.autoStartLoad=g&&"none"!==g||i;for(var p=j["default"].html5media.properties,q=function(a){var c=""+a.substring(0,1).toUpperCase()+a.substring(1);n["get"+c]=function(){return null!==m?n[a]:null},n["set"+c]=function(c){j["default"].html5media.readOnlyProperties.includes(a)||null!==m&&(n[a]=c,"src"===a&&(m.destroy(),m=o.createInstance({options:b.hls,id:e}),m.loadSource(c),m.attachMedia(n)))}},r=0,s=p.length;s>r;r++)q(p[r]);if(f["default"]["__ready__"+e]=function(b){a.hlsPlayer=m=b;for(var c=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),d=Hls.Events,e=function(b){if("loadedmetadata"===b){m.detachMedia();var c=n.src;m.loadSource(c),m.attachMedia(n)}n.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},f=0,g=c.length;g>f;f++)e(c[f]);var i=void 0,k=void 0,o=function(b,c){var d=l.createEvent(b,n);if(d.data=c,a.dispatchEvent(d),"hlsError"===b&&(console.warn(b,c),c.fatal))switch(c.type){case"mediaError":var e=(new Date).getTime();!i||e-i>3e3?(i=(new Date).getTime(),m.recoverMediaError()):!k||e-k>3e3?(k=(new Date).getTime(),console.warn("Attempting to swap Audio Codec and recover from media error"),m.swapAudioCodec(),m.recoverMediaError()):console.error("Cannot recover, last media error recovery failed");break;case"networkError":console.error("Network error");break;default:m.destroy()}};for(var p in d)d.hasOwnProperty(p)&&m.on(d[p],o)},c&&c.length>0)for(var t=0,u=c.length;u>t;t++)if(k.renderer.renderers[b.prefix].canPlayType(c[t].type)){n.setAttribute("src",c[t].src);break}"auto"===g||i||(n.addEventListener("play",function(){null!==m&&m.startLoad()}),n.addEventListener("pause",function(){null!==m&&m.stopLoad()})),n.setAttribute("id",e),d.parentNode.insertBefore(n,d),d.autoplay=!1,d.style.display="none",o.prepareSettings({options:b.hls,id:e}),n.setSize=function(a,b){return n.style.width=a+"px",n.style.height=b+"px",n},n.hide=function(){return n.pause(),n.style.display="none",n},n.show=function(){return n.style.display="",n},n.destroy=function(){null!==m&&m.destroy()},n.stop=function(){null!==m&&m.stopLoad()};var v=l.createEvent("rendererready",n);return a.dispatchEvent(v),n}};n.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes(".m3u8")?"application/x-mpegURL":null}),k.renderer.add(p)},{15:15,16:16,17:17,2:2,3:3,6:6,7:7}],13:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(16),m=a(15),n={name:"html5",options:{prefix:"html5"},canPlayType:function(a){var b=h["default"].createElement("video");return m.IS_ANDROID&&null!==a.match(/\/mp(3|4)$/gi)||["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())&&m.SUPPORTS_NATIVE_HLS?"yes":b.canPlayType?b.canPlayType(a).replace(/no/,""):""},create:function(a,b,c){var d=a.id+"_"+b.prefix,e=null;void 0===a.originalNode||null===a.originalNode?(e=h["default"].createElement("audio"),a.appendChild(e)):e=a.originalNode,e.setAttribute("id",d);for(var f=j["default"].html5media.properties,g=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);e["get"+b]=function(){return e[a]},e["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||(e[a]=b)}},i=0,m=f.length;m>i;i++)g(f[i]);for(var n=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),o=function(b){e.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},p=0,q=n.length;q>p;p++)o(n[p]);if(e.setSize=function(a,b){return e.style.width=a+"px",e.style.height=b+"px",e},e.hide=function(){return e.style.display="none",e},e.show=function(){return e.style.display="",e},c&&c.length>0)for(var r=0,s=c.length;s>r;r++)if(k.renderer.renderers[b.prefix].canPlayType(c[r].type)){e.setAttribute("src",c[r].src);break}var t=l.createEvent("rendererready",e);return a.dispatchEvent(t),e}};f["default"].HtmlMediaElement=j["default"].HtmlMediaElement=n,k.renderer.add(n)},{15:15,16:16,2:2,3:3,6:6,7:7}],14:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(7),m=a(16),n=a(17),o={isIframeStarted:!1,isIframeLoaded:!1,iframeQueue:[],enqueueIframe:function(a){o.isLoaded="undefined"!=typeof YT&&YT.loaded,o.isLoaded?o.createIframe(a):(o.loadIframeApi(),o.iframeQueue.push(a))},loadIframeApi:function(){if(!o.isIframeStarted){var a=i["default"].createElement("script");a.src="//www.youtube.com/player_api";var b=i["default"].getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b),o.isIframeStarted=!0}},iFrameReady:function(){for(o.isLoaded=!0,o.isIframeLoaded=!0;o.iframeQueue.length>0;){var a=o.iframeQueue.pop();o.createIframe(a)}},createIframe:function(a){return new YT.Player(a.containerId,a)},getYouTubeId:function(a){var b="";return a.indexOf("?")>0?(b=o.getYouTubeIdFromParam(a),""===b&&(b=o.getYouTubeIdFromUrl(a))):b=o.getYouTubeIdFromUrl(a),b},getYouTubeIdFromParam:function(a){if(void 0===a||null===a||!a.trim().length)return null;for(var b=a.split("?"),c=b[1].split("&"),d="",e=0,f=c.length;f>e;e++){var g=c[e].split("=");if("v"===g[0]){d=g[1];break}}return d},getYouTubeIdFromUrl:function(a){if(void 0===a||null===a||!a.trim().length)return null;var b=a.split("?");return a=b[0],a.substring(a.lastIndexOf("/")+1)},getYouTubeNoCookieUrl:function(a){if(void 0===a||null===a||!a.trim().length||!a.includes("//www.youtube"))return a;var b=a.split("/");return b[2]=b[2].replace(".com","-nocookie.com"),b.join("/")}},p={name:"youtube_iframe",options:{prefix:"youtube_iframe",youtube:{autoplay:0,controls:0,disablekb:1,end:0,loop:0,modestbranding:0,playsinline:0,rel:0,showinfo:0,start:0,iv_load_policy:3,nocookie:!1}},canPlayType:function(a){return["video/youtube","video/x-youtube"].includes(a)},create:function(a,b,c){var d={},f=[],h=4,j=null,l=!0,n=!1,p=null,q=1;d.options=b,d.id=a.id+"_"+b.prefix,d.mediaElement=a;for(var r=k["default"].html5media.properties,s=function(b){var c=""+b.substring(0,1).toUpperCase()+b.substring(1);d["get"+c]=function(){if(null!==j){var a=null,c=function(){switch(b){case"currentTime":return{v:j.getCurrentTime()};case"duration":return{v:j.getDuration()};case"volume":return q=j.getVolume()/100,{v:q};case"paused":return{v:l};case"ended":return{v:n};case"muted":return{v:j.isMuted()};case"buffered":var a=j.getVideoLoadedFraction(),c=j.getDuration();return{v:{start:function(){return 0},end:function(){return a*c},length:1}};case"src":return{v:j.getVideoUrl()};case"readyState":return{v:h}}}();return"object"===("undefined"==typeof c?"undefined":e(c))?c.v:a}return null},d["set"+c]=function(c){if(null!==j)switch(b){case"src":var e="string"==typeof c?c:c[0].src,g=o.getYouTubeId(e);a.originalNode.autoplay?j.loadVideoById(g):j.cueVideoById(g);break;case"currentTime":j.seekTo(c);break;case"muted":c?j.mute():j.unMute(),setTimeout(function(){var b=m.createEvent("volumechange",d);a.dispatchEvent(b)},50);break;case"volume":q=c,j.setVolume(100*c),setTimeout(function(){var b=m.createEvent("volumechange",d);a.dispatchEvent(b)},50);break;case"readyState":var h=m.createEvent("canplay",d);a.dispatchEvent(h)}else f.push({type:"set",propName:b,value:c})}},t=0,u=r.length;u>t;t++)s(r[t]);for(var v=k["default"].html5media.methods,w=function(a){d[a]=function(){if(null!==j)switch(a){case"play":return l=!1,j.playVideo();case"pause":return l=!0,j.pauseVideo();case"load":return null}else f.push({type:"call",methodName:a})}},x=0,y=v.length;y>x;x++)w(v[x]);var z=i["default"].createElement("div");z.id=d.id,d.options.youtube.nocookie&&a.originalNode.setAttribute("src",o.getYouTubeNoCookieUrl(c[0].src)),a.originalNode.parentNode.insertBefore(z,a.originalNode),a.originalNode.style.display="none";var A="audio"===a.originalNode.tagName.toLowerCase(),B=A?"0":a.originalNode.height,C=A?"0":a.originalNode.width,D=o.getYouTubeId(c[0].src),E={id:d.id,containerId:z.id,videoId:D,height:B,width:C,playerVars:Object.assign({controls:0,rel:0,disablekb:1,showinfo:0,modestbranding:0,html5:1,playsinline:0,start:0,end:0,iv_load_policy:3},d.options.youtube),origin:g["default"].location.host,events:{onReady:function(b){if(a.youTubeApi=j=b.target,a.youTubeState={paused:!0,ended:!1},f.length)for(var c=0,e=f.length;e>c;c++){var g=f[c];if("set"===g.type){var h=g.propName,i=""+h.substring(0,1).toUpperCase()+h.substring(1);d["set"+i](g.value)}else"call"===g.type&&d[g.methodName]()}p=j.getIframe();for(var k=["mouseover","mouseout"],l=function(b){var c=m.createEvent(b.type,d);a.dispatchEvent(c)},n=0,o=k.length;o>n;n++)p.addEventListener(k[n],l,!1);for(var q=["rendererready","loadeddata","loadedmetadata","canplay"],r=0,s=q.length;s>r;r++){var t=m.createEvent(q[r],d);a.dispatchEvent(t)}},onStateChange:function(b){var c=[];switch(b.data){case-1:c=["loadedmetadata"],l=!0,n=!1;break;case 0:c=["ended"],l=!1,n=!0,d.stopInterval();break;case 1:c=["play","playing"],l=!1,n=!1,d.startInterval();break;case 2:c=["pause"],l=!0,n=!1,d.stopInterval();break;case 3:c=["progress"],n=!1;break;case 5:c=["loadeddata","loadedmetadata","canplay"],l=!0,n=!1}for(var e=0,f=c.length;f>e;e++){var g=m.createEvent(c[e],d);a.dispatchEvent(g)}},onError:function(b){var c=m.createEvent("error",d);c.data=b.data,a.dispatchEvent(c)}}};return A&&(E.playerVars.playsinline=1),o.enqueueIframe(E),d.onEvent=function(b,c,d){null!==d&&void 0!==d&&(a.youTubeState=d)},d.setSize=function(a,b){null!==j&&j.setSize(a,b)},d.hide=function(){d.stopInterval(),d.pause(),p&&(p.style.display="none")},d.show=function(){p&&(p.style.display="")},d.destroy=function(){j.destroy()},d.interval=null,d.startInterval=function(){d.interval=setInterval(function(){var b=m.createEvent("timeupdate",d);a.dispatchEvent(b)},250)},d.stopInterval=function(){d.interval&&clearInterval(d.interval)},d}};g["default"].postMessage&&e(g["default"].addEventListener)&&(g["default"].onYouTubePlayerAPIReady=function(){o.iFrameReady()},n.typeChecks.push(function(a){return a=a.toLowerCase(),a.includes("//www.youtube")||a.includes("//youtu.be")?"video/x-youtube":null}),l.renderer.add(p))},{16:16,17:17,2:2,3:3,6:6,7:7}],15:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0}),c.cancelFullScreen=c.requestFullScreen=c.isFullScreen=c.FULLSCREEN_EVENT_NAME=c.HAS_NATIVE_FULLSCREEN_ENABLED=c.HAS_TRUE_NATIVE_FULLSCREEN=c.HAS_IOS_FULLSCREEN=c.HAS_MS_NATIVE_FULLSCREEN=c.HAS_MOZ_NATIVE_FULLSCREEN=c.HAS_WEBKIT_NATIVE_FULLSCREEN=c.HAS_NATIVE_FULLSCREEN=c.SUPPORTS_NATIVE_HLS=c.SUPPORT_POINTER_EVENTS=c.HAS_MSE=c.IS_STOCK_ANDROID=c.IS_SAFARI=c.IS_FIREFOX=c.IS_CHROME=c.IS_EDGE=c.IS_IE=c.IS_ANDROID=c.IS_IOS=c.IS_IPHONE=c.IS_IPAD=c.UA=c.NAV=void 0;for(var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=c.NAV=f["default"].navigator,l=c.UA=k.userAgent.toLowerCase(),m=c.IS_IPAD=null!==l.match(/ipad/i),n=c.IS_IPHONE=null!==l.match(/iphone/i),o=(c.IS_IOS=n||m,c.IS_ANDROID=null!==l.match(/android/i)),p=c.IS_IE=k.appName.toLowerCase().includes("microsoft")||null!==k.appName.toLowerCase().match(/trident/gi),q=(c.IS_EDGE="msLaunchUri"in k&&!("documentMode"in h["default"])),r=c.IS_CHROME=null!==l.match(/chrome/gi),s=c.IS_FIREFOX=null!==l.match(/firefox/gi),t=c.IS_SAFARI=null!==l.match(/safari/gi)&&!r,u=c.IS_STOCK_ANDROID=null!==l.match(/^mozilla\/\d+\.\d+\s\(linux;\su;/gi),v=(c.HAS_MSE="MediaSource"in f["default"]),w=(c.SUPPORT_POINTER_EVENTS=function(){var a=h["default"].createElement("x"),b=h["default"].documentElement,c=f["default"].getComputedStyle;if(!("pointerEvents"in a.style))return!1;a.style.pointerEvents="auto",a.style.pointerEvents="x",b.appendChild(a);var d=c&&"auto"===c(a,"").pointerEvents;return a.remove(),!!d}()),x=["source","track","audio","video"],y=void 0,z=0,A=x.length;A>z;z++)y=h["default"].createElement(x[z]);var B=c.SUPPORTS_NATIVE_HLS=t||o&&(r||u)||p&&null!==l.match(/edge/gi),C=void 0!==y.webkitEnterFullscreen,D=void 0!==y.requestFullscreen;C&&l.match(/mac os x 10_5/i)&&(D=!1,C=!1);var E=void 0!==y.webkitRequestFullScreen,F=void 0!==y.mozRequestFullScreen,G=void 0!==y.msRequestFullscreen,H=E||F||G,I=H,J="",K=void 0,L=void 0,M=void 0;F?I=h["default"].mozFullScreenEnabled:G&&(I=h["default"].msFullscreenEnabled),r&&(C=!1),H&&(E?J="webkitfullscreenchange":F?J="mozfullscreenchange":G&&(J="MSFullscreenChange"),c.isFullScreen=K=function(){return F?h["default"].mozFullScreen:E?h["default"].webkitIsFullScreen:G?null!==h["default"].msFullscreenElement:void 0},c.requestFullScreen=L=function(a){E?a.webkitRequestFullScreen():F?a.mozRequestFullScreen():G&&a.msRequestFullscreen()},c.cancelFullScreen=M=function(){E?h["default"].webkitCancelFullScreen():F?h["default"].mozCancelFullScreen():G&&h["default"].msExitFullscreen()});var N=c.HAS_NATIVE_FULLSCREEN=D,O=c.HAS_WEBKIT_NATIVE_FULLSCREEN=E,P=c.HAS_MOZ_NATIVE_FULLSCREEN=F,Q=c.HAS_MS_NATIVE_FULLSCREEN=G,R=c.HAS_IOS_FULLSCREEN=C,S=c.HAS_TRUE_NATIVE_FULLSCREEN=H,T=c.HAS_NATIVE_FULLSCREEN_ENABLED=I,U=c.FULLSCREEN_EVENT_NAME=J;c.isFullScreen=K,c.requestFullScreen=L,c.cancelFullScreen=M,j["default"].Features=j["default"].Features||{},j["default"].Features.isiPad=m,j["default"].Features.isiPhone=n,j["default"].Features.isiOS=j["default"].Features.isiPhone||j["default"].Features.isiPad,j["default"].Features.isAndroid=o,j["default"].Features.isIE=p,j["default"].Features.isEdge=q,j["default"].Features.isChrome=r,j["default"].Features.isFirefox=s,j["default"].Features.isSafari=t,j["default"].Features.isStockAndroid=u,j["default"].Features.hasMSE=v,j["default"].Features.supportsNativeHLS=B,j["default"].Features.supportsPointerEvents=w,j["default"].Features.hasiOSFullScreen=R,j["default"].Features.hasNativeFullscreen=N,j["default"].Features.hasWebkitNativeFullScreen=O,j["default"].Features.hasMozNativeFullScreen=P, +j["default"].Features.hasMsNativeFullScreen=Q,j["default"].Features.hasTrueNativeFullScreen=S,j["default"].Features.nativeFullScreenEnabled=T,j["default"].Features.fullScreenEventName=U,j["default"].Features.isFullScreen=K,j["default"].Features.requestFullScreen=L,j["default"].Features.cancelFullScreen=M},{2:2,3:3,6:6}],16:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if("string"!=typeof a)throw new Error("Argument passed must be a string");var b={"&":"&","<":"<",">":">",'"':"""};return a.replace(/[&<>"]/g,function(a){return b[a]})}function f(a,b){var c=this,d=arguments,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!1;if("function"!=typeof a)throw new Error("First argument must be a function");if("number"!=typeof b)throw new Error("Second argument must be a numeric value");var f=void 0;return function(){var g=c,h=d,i=function(){f=null,e||a.apply(g,h)},j=e&&!f;clearTimeout(f),f=setTimeout(i,b),j&&a.apply(g,h)}}function g(a){return Object.getOwnPropertyNames(a).length<=0}function h(a,b){var c=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/,d={d:[],w:[]};return(a||"").split(" ").forEach(function(a){var e=""+a+(b?"."+b:"");e.startsWith(".")?(d.d.push(e),d.w.push(e)):d[c.test(a)?"w":"d"].push(e)}),d.d=d.d.join(" "),d.w=d.w.join(" "),d}function i(a,b){if("string"!=typeof a)throw new Error("Event name must be a string");var c=a.match(/[a-z]+\.([a-z]+)/),d={target:b};return null!==c&&(a=c[0],d.namespace=c[1]),new window.CustomEvent(a,{detail:d})}function j(a,b){return!!(a&&b&&2&a.compareDocumentPosition(b))}function k(a){return"string"==typeof a}Object.defineProperty(c,"__esModule",{value:!0}),c.escapeHTML=e,c.debounce=f,c.isObjectEmpty=g,c.splitEvents=h,c.createEvent=i,c.isNodeAfter=j,c.isString=k;var l=a(6),m=d(l);m["default"].Utils=m["default"].Utils||{},m["default"].Utils.escapeHTML=e,m["default"].Utils.debounce=f,m["default"].Utils.isObjectEmpty=g,m["default"].Utils.splitEvents=h,m["default"].Utils.createEvent=i,m["default"].Utils.isNodeAfter=j,m["default"].Utils.isString=k},{6:6}],17:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");var b=document.createElement("div");return b.innerHTML='<a href="'+m.escapeHTML(a)+'">x</a>',b.firstChild.href}function f(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return a&&!b?h(a):g(b)}function g(a){if("string"!=typeof a)throw new Error("`type` argument must be a string");return a&&~a.indexOf(";")?a.substr(0,a.indexOf(";")):a}function h(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");for(var b=0,c=n.length;c>b;b++){var d=n[b](a);if(d)return d}var e=i(a),f=j(e),g="video/mp4";return f&&(["mp4","m4v","ogg","ogv","webm","flv","mpeg","mov"].includes(f)?g="video/"+f:["mp3","oga","wav","mid","midi"].includes(f)&&(g="audio/"+f)),g}function i(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");var b=a.split("?")[0],c=b.split("\\").pop().split("/").pop();return c.indexOf(".")>-1?c.substring(c.lastIndexOf(".")+1):""}function j(a){if("string"!=typeof a)throw new Error("`extension` argument must be a string");switch(a){case"mp4":case"m4v":return"mp4";case"webm":case"webma":case"webmv":return"webm";case"ogg":case"oga":case"ogv":return"ogg";default:return a}}Object.defineProperty(c,"__esModule",{value:!0}),c.typeChecks=void 0,c.absolutizeUrl=e,c.formatType=f,c.getMimeFromType=g,c.getTypeFromFile=h,c.getExtension=i,c.normalizeExtension=j;var k=a(6),l=d(k),m=a(16),n=c.typeChecks=[];l["default"].Utils=l["default"].Utils||{},l["default"].Utils.typeChecks=n,l["default"].Utils.absolutizeUrl=e,l["default"].Utils.formatType=f,l["default"].Utils.getMimeFromType=g,l["default"].Utils.getTypeFromFile=h,l["default"].Utils.getExtension=i,l["default"].Utils.normalizeExtension=j},{16:16,6:6}],18:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e);!function(a){a.forEach(function(a){a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){this.parentNode.removeChild(this)}})})}([Element.prototype,CharacterData.prototype,DocumentType.prototype]),function(){function a(a,b){b=b||{bubbles:!1,cancelable:!1,detail:void 0};var c=f["default"].createEvent("CustomEvent");return c.initCustomEvent(a,b.bubbles,b.cancelable,b.detail),c}return"function"==typeof window.CustomEvent?!1:(a.prototype=window.Event.prototype,void(window.CustomEvent=a))}(),"function"!=typeof Object.assign&&(Object.assign=function(a){if(null===a||void 0===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1,d=arguments.length;d>c;c++){var e=arguments[c];if(null!==e)for(var f in e)Object.prototype.hasOwnProperty.call(e,f)&&(b[f]=e[f])}return b}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(a,b){if(null===this||void 0===this)throw new TypeError('"this" is null or not defined');var c=Object(this),d=c.length>>>0;if(0===d)return!1;for(var e=0|b,f=Math.max(e>=0?e:d-Math.abs(e),0);d>f;){if(c[f]===a)return!0;f++}return!1}}),String.prototype.includes||(String.prototype.includes=function(a,b){return"number"!=typeof b&&(b=0),b+a.length>this.length?!1:-1!==this.indexOf(a,b)}),String.prototype.startsWith||(String.prototype.startsWith=function(a,b){return b=b||0,this.substr(b,a.length)===a}),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(a){for(var b=(this.document||this.ownerDocument).querySelectorAll(a),c=b.length-1;--c>=0&&b.item(c)!==this;);return c>-1}),window.Element&&!Element.prototype.closest&&(Element.prototype.closest=function(a){var b=(this.document||this.ownerDocument).querySelectorAll(a),c=void 0,d=this;do for(c=b.length;--c>=0&&b.item(c)!==d;);while(0>c&&(d=d.parentElement));return d}),function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),d=Math.max(0,16-(c-a)),e=window.setTimeout(function(){b(c+d)},d);return a=c+d,e}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)})}()},{2:2}]},{},[18,5,4,8,13,10,9,11,12,14]); \ No newline at end of file diff --git a/lib/mejs/mediaelementplayer.css b/lib/mejs/mediaelementplayer.css index 432ef5c4..5ae82603 100644 --- a/lib/mejs/mediaelementplayer.css +++ b/lib/mejs/mediaelementplayer.css @@ -1,954 +1,671 @@ -.mejs-container { - position: relative; - background: #000; - font-family: Helvetica, Arial; - text-align: left; - vertical-align: top; - text-indent: 0; +/* Accessibility: hide screen reader texts (and prefer "top" for RTL languages). +Reference: http://blog.rrwd.nl/2015/04/04/the-screen-reader-text-class-why-and-how/ */ +.mejs__offscreen { + clip: rect(1px, 1px, 1px, 1px); /* IE8-IE11 - no support for clip-path */ + clip-path: polygon(0px 0px, 0px 0px, 0px 0px, 0px 0px); + position: absolute !important; + height: 1px; + width: 1px; + overflow: hidden; } -.me-plugin { - position: absolute; - height: auto; - width: auto; +.mejs__container { + position: relative; + background: #000; + font-family: "Helvetica", Arial, serif; + text-align: left; + vertical-align: top; + text-indent: 0; + box-sizing: border-box; + min-width: 250px; } -.mejs-embed, .mejs-embed body { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - background: #000; - overflow: hidden; +.mejs__container .mejs__video { + min-height: 140px; } -.mejs-fullscreen { - /* set it to not show scroll bars so 100% will work */ - overflow: hidden !important; +.mejs__container * { + box-sizing: border-box; } -.mejs-container-fullscreen { - position: fixed; - left: 0; - top: 0; - right: 0; - bottom: 0; - overflow: hidden; - z-index: 1000; +/* Hide native play button from iOS to favor plugin button */ +.mejs__container video::-webkit-media-controls-start-playback-button { + display: none !important; + -webkit-appearance: none; } -.mejs-container-fullscreen .mejs-mediaelement, -.mejs-container-fullscreen video { - width: 100%; - height: 100%; + +.mejs__fill-container, +.mejs__fill-container .mejs__container { + width: 100%; + height: 100%; +} + +.mejs__fill-container { + overflow: hidden; + position: relative; + margin: 0 auto; + background: transparent; +} + +.mejs__container:focus { + outline: none; +} + +.mejs__iframe-overlay { + position: absolute; + width: 100%; + height: 100%; +} + +.mejs__embed, +.mejs__embed body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + background: #000; + overflow: hidden; +} + +.mejs__fullscreen { + overflow: hidden !important; +} + +.mejs__container-fullscreen { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; + z-index: 1000; } -.mejs-clear { - clear: both; +.mejs__container-fullscreen .mejs__mediaelement, +.mejs__container-fullscreen video { + width: 100% !important; + height: 100% !important; +} + +.mejs__clear { + clear: both; } /* Start: LAYERS */ -.mejs-background { - position: absolute; - top: 0; - left: 0; +.mejs__background { + position: absolute; + top: 0; + left: 0; +} + +.mejs__mediaelement { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 0; +} + +.mejs__poster { + position: absolute; + top: 0; + left: 0; + background-size: contain; + background-position: 50% 50%; + background-repeat: no-repeat; + z-index: 1; } -.mejs-mediaelement { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; +:root .mejs__poster-img { + display: none; } -.mejs-poster { - position: absolute; - top: 0; - left: 0; - background-size: contain ; - background-position: 50% 50% ; - background-repeat: no-repeat ; +.mejs__poster-img { + border: 0; + padding: 0; } -:root .mejs-poster img { - display: none ; + +.mejs__overlay { + position: absolute; + top: 0; + left: 0; + z-index: 1; +} +.mejs__layer { + z-index: 1; } -.mejs-poster img { - border: 0; - padding: 0; - border: 0; +.mejs__overlay-play { + cursor: pointer; } -.mejs-overlay { - position: absolute; - top: 0; - left: 0; +.mejs__overlay-button { + position: absolute; + top: 50%; + left: 50%; + width: 80px; + height: 80px; + margin: -40px 0 0 -40px; + background: url("mejs-controls.svg") no-repeat; + background-position: 0 -39px; + overflow: hidden; + z-index: 1; } -.mejs-overlay-play { - cursor: pointer; +.mejs__overlay:hover > .mejs__overlay-button { + background-position: -80px -39px; } -.mejs-overlay-button { - position: absolute; - top: 50%; - left: 50%; - width: 100px; - height: 100px; - margin: -50px 0 0 -50px; - background: url(bigplay.svg) no-repeat; +.mejs__overlay-loading { + position: absolute; + top: 50%; + left: 50%; + width: 80px; + height: 80px; + margin: -40px 0 0 -40px; } -.no-svg .mejs-overlay-button { - background-image: url(bigplay.png); +.mejs__overlay-loading-bg-img { + display: block; + width: 80px; + height: 80px; + background: transparent url("mejs-controls.svg") -160px -40px no-repeat; + -webkit-animation: mejs-loading-spinner 1s linear infinite; + -moz-animation: mejs-loading-spinner 1s linear infinite; + animation: mejs-loading-spinner 1s linear infinite; + z-index: 1; } -.mejs-overlay:hover .mejs-overlay-button { - background-position: 0 -100px ; +@-moz-keyframes mejs-loading-spinner { + 100% { + -moz-transform: rotate(360deg); + } } -.mejs-overlay-loading { - position: absolute; - top: 50%; - left: 50%; - width: 80px; - height: 80px; - margin: -40px 0 0 -40px; - background: #333; - background: url(background.png); - background: rgba(0, 0, 0, 0.9); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.9)), to(rgba(0,0,0,0.9))); - background: -webkit-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); - background: -moz-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); - background: -o-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); - background: -ms-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); - background: linear-gradient(rgba(50,50,50,0.9), rgba(0,0,0,0.9)); +@-webkit-keyframes mejs-loading-spinner { + 100% { + -webkit-transform: rotate(360deg); + } } -.mejs-overlay-loading span { - display: block; - width: 80px; - height: 80px; - background: transparent url(loading.gif) 50% 50% no-repeat; +@keyframes mejs-loading-spinner { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } } /* End: LAYERS */ /* Start: CONTROL BAR */ -.mejs-container .mejs-controls { - position: absolute; - list-style-type: none; - margin: 0; - padding: 0; - bottom: 0; - left: 0; - background: url(background.png); - background: rgba(0, 0, 0, 0.7); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7))); - background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - height: 30px; - width: 100%; -} -.mejs-container .mejs-controls div { - list-style-type: none; - background-image: none; - display: block; - float: left; - margin: 0; - padding: 0; - width: 26px; - height: 26px; - font-size: 11px; - line-height: 11px; - font-family: Helvetica, Arial; - border: 0; -} - -.mejs-controls .mejs-button button { - cursor: pointer; - display: block; - font-size: 0; - line-height: 0; - text-decoration: none; - margin: 7px 5px; - padding: 0; - position: absolute; - height: 16px; - width: 16px; - border: 0; - background: transparent url(controls.svg) no-repeat; -} - -.no-svg .mejs-controls .mejs-button button { - background-image: url(controls.png); +.mejs__controls { + position: absolute; + list-style-type: none; + margin: 0; + padding: 0 10px; + bottom: 0; + left: 0; + height: 40px; + width: 100%; + z-index: 1; +} + +.mejs__controls:not([style*="display: none"]) { + background: rgba(255, 0, 0, 0.7); + background: linear-gradient(rgba(0, 0, 0, 0.0), rgba(0, 0, 0, 0.35)); +} + +.mejs__button, +.mejs__time, +.mejs__time-rail { + float: left; + margin: 0; + width: 32px; + height: 40px; + font-size: 10px; + line-height: 10px; +} + +.mejs__button > button { + cursor: pointer; + display: block; + font-size: 0; + line-height: 0; + text-decoration: none; + margin: 10px 6px; + padding: 0; + position: absolute; + height: 20px; + width: 20px; + border: 0; + background: transparent url("mejs-controls.svg"); + overflow: hidden; } /* :focus for accessibility */ -.mejs-controls .mejs-button button:focus { - outline: dotted 1px #999; +.mejs__button > button:focus { + outline: dotted 1px #999; +} + +.mejs__container-keyboard-inactive a, +.mejs__container-keyboard-inactive a:focus, +.mejs__container-keyboard-inactive button, +.mejs__container-keyboard-inactive button:focus, +.mejs__container-keyboard-inactive [role=slider], +.mejs__container-keyboard-inactive [role=slider]:focus { + outline: 0; } /* End: CONTROL BAR */ /* Start: Time (Current / Duration) */ -.mejs-container .mejs-controls .mejs-time { - color: #fff; - display: block; - height: 17px; - width: auto; - padding: 8px 3px 0 3px ; - overflow: hidden; - text-align: center; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} - -.mejs-container .mejs-controls .mejs-time span { - color: #fff; - font-size: 11px; - line-height: 12px; - display: block; - float: left; - margin: 1px 2px 0 0; - width: auto; +.mejs__time { + color: #fff; + display: block; + height: 24px; + width: auto; + font-weight: bold; + font-size: 11px; + padding: 16px 6px 0 6px; + overflow: hidden; + text-align: center; + box-sizing: content-box; } + /* End: Time (Current / Duration) */ /* Start: Play/Pause/Stop */ -.mejs-controls .mejs-play button { - background-position: 0 0; +.mejs__play > button { + background-position: 0 0; } -.mejs-controls .mejs-pause button { - background-position: 0 -16px; +.mejs__pause > button { + background-position: -20px 0; } -.mejs-controls .mejs-stop button { - background-position: -112px 0; +.mejs__replay > button { + background-position: -280px 0; } -/* Start: Play/Pause/Stop */ + +/* End: Play/Pause/Stop */ /* Start: Progress Bar */ -.mejs-controls div.mejs-time-rail { - direction: ltr; - width: 200px; - padding-top: 5px; -} - -.mejs-controls .mejs-time-rail span { - display: block; - position: absolute; - width: 180px; - height: 10px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - cursor: pointer; -} - -.mejs-controls .mejs-time-rail .mejs-time-total { - margin: 5px; - background: #333; - background: rgba(50,50,50,0.8); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8))); - background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8)); -} - -.mejs-controls .mejs-time-rail .mejs-time-buffering { - width: 100%; - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 15px 15px; - -moz-background-size: 15px 15px; - -o-background-size: 15px 15px; - background-size: 15px 15px; - -webkit-animation: buffering-stripes 2s linear infinite; - -moz-animation: buffering-stripes 2s linear infinite; - -ms-animation: buffering-stripes 2s linear infinite; - -o-animation: buffering-stripes 2s linear infinite; - animation: buffering-stripes 2s linear infinite; -} - -@-webkit-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } -@-moz-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } -@-ms-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } -@-o-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } -@keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } - -.mejs-controls .mejs-time-rail .mejs-time-loaded { - background: #3caac8; - background: rgba(60,170,200,0.8); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(44,124,145,0.8)), to(rgba(78,183,212,0.8))); - background: -webkit-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); - background: -moz-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); - background: -o-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); - background: -ms-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); - background: linear-gradient(rgba(44,124,145,0.8), rgba(78,183,212,0.8)); - width: 0; -} - -.mejs-controls .mejs-time-rail .mejs-time-current { - background: #fff; - background: rgba(255,255,255,0.8); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8))); - background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - width: 0; -} - -.mejs-controls .mejs-time-rail .mejs-time-handle { - display: none; - position: absolute; - margin: 0; - width: 10px; - background: #fff; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - cursor: pointer; - border: solid 2px #333; - top: -2px; - text-align: center; -} - -.mejs-controls .mejs-time-rail .mejs-time-float { - position: absolute; - display: none; - background: #eee; - width: 36px; - height: 17px; - border: solid 1px #333; - top: -26px; - margin-left: -18px; - text-align: center; - color: #111; -} - -.mejs-controls .mejs-time-rail .mejs-time-float-current { - margin: 2px; - width: 30px; - display: block; - text-align: center; - left: 0; -} - -.mejs-controls .mejs-time-rail .mejs-time-float-corner { - position: absolute; - display: block; - width: 0; - height: 0; - line-height: 0; - border: solid 5px #eee; - border-color: #eee transparent transparent transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - top: 15px; - left: 13px; -} - -.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float { - width: 48px; -} - -.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current { - width: 44px; -} - -.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner { - left: 18px; -} - -/* -.mejs-controls .mejs-time-rail:hover .mejs-time-handle { - visibility:visible; -} -*/ +.mejs__time-rail { + direction: ltr; + width: 200px; + padding-top: 10px; + height: 40px; + position: relative; + margin: 0 10px; +} + +.mejs__time-total, +.mejs__time-buffering, +.mejs__time-loaded, +.mejs__time-current, +.mejs__time-handle, +.mejs__time-float, +.mejs__time-float-current, +.mejs__time-float-corner, +.mejs__time-marker { + cursor: pointer; + display: block; + position: absolute; + height: 10px; + border-radius: 2px; +} + +.mejs__time-total { + margin: 5px 0 0 0; + background: rgba(255, 255, 255, 0.3); + width: 100%; +} + +.mejs__time-buffering { + width: 100%; + background: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 15px 15px; + animation: buffering-stripes 2s linear infinite; +} + +@keyframes buffering-stripes { + from { + background-position: 0 0; + } + to { + background-position: 30px 0; + } +} + +.mejs__time-loaded { + background: rgba(255, 255, 255, .3); + width: 0; +} + +.mejs__time-current { + background: rgba(255, 255, 255, 0.9); + width: 0; +} + +.mejs__time-handle { + display: none; + position: absolute; + margin: 0; + width: 10px; + background: #fff; + border-radius: 5px; + cursor: pointer; + border: solid 2px #333; + top: -2px; + text-align: center; +} + +.mejs__time-float { + position: absolute; + display: none; + background: #eee; + width: 36px; + height: 17px; + border: solid 1px #333; + top: -26px; + margin-left: -18px; + text-align: center; + color: #111; +} + +.mejs__time-float-current { + margin: 2px; + width: 30px; + display: block; + text-align: center; + left: 0; +} + +.mejs__time-float-corner { + position: absolute; + display: block; + width: 0; + height: 0; + line-height: 0; + border: solid 5px #eee; + border-color: #eee transparent transparent transparent; + border-radius: 0; + top: 15px; + left: 13px; +} + +.mejs__long-video .mejs__time-float { + width: 64px; + margin-left:-23px; +} + +.mejs__long-video .mejs__time-float-current { + width: 60px; +} + +.mejs__long-video .mejs__time-float-corner { + left: 18px; +} + +.mejs__broadcast { + color: #fff; + position: absolute; + width: 100%; + height: 10px; + top: 15px; +} + /* End: Progress Bar */ /* Start: Fullscreen */ -.mejs-controls .mejs-fullscreen-button button { - background-position: -32px 0; +.mejs__fullscreen-button > button { + background-position: -80px 0; } -.mejs-controls .mejs-unfullscreen button { - background-position: -32px -16px; +.mejs__unfullscreen > button { + background-position: -100px 0; } -/* End: Fullscreen */ +/* End: Fullscreen */ /* Start: Mute/Volume */ -.mejs-controls .mejs-volume-button { -} - -.mejs-controls .mejs-mute button { - background-position: -16px -16px; -} - -.mejs-controls .mejs-unmute button { - background-position: -16px 0; -} - -.mejs-controls .mejs-volume-button { - position: relative; -} - -.mejs-controls .mejs-volume-button .mejs-volume-slider { - display: none; - height: 115px; - width: 25px; - background: url(background.png); - background: rgba(50, 50, 50, 0.7); - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - top: -115px; - left: 0; - z-index: 1; - position: absolute; - margin: 0; -} - -.mejs-controls .mejs-volume-button:hover { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -/* -.mejs-controls .mejs-volume-button:hover .mejs-volume-slider { - display: block; -} -*/ - -.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total { - position: absolute; - left: 11px; - top: 8px; - width: 2px; - height: 100px; - background: #ddd; - background: rgba(255, 255, 255, 0.5); - margin: 0; -} - -.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current { - position: absolute; - left: 11px; - top: 8px; - width: 2px; - height: 100px; - background: #ddd; - background: rgba(255, 255, 255, 0.9); - margin: 0; -} - -.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle { - position: absolute; - left: 4px; - top: -3px; - width: 16px; - height: 6px; - background: #ddd; - background: rgba(255, 255, 255, 0.9); - cursor: N-resize; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - margin: 0; -} - -/* horizontal version */ -.mejs-controls div.mejs-horizontal-volume-slider { - height: 26px; - width: 60px; - position: relative; -} - -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { - position: absolute; - left: 0; - top: 11px; - width: 50px; - height: 8px; - margin: 0; - padding: 0; - font-size: 1px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - background: #333; - background: rgba(50,50,50,0.8); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8))); - background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); - background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8)); -} - -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - position: absolute; - left: 0; - top: 11px; - width: 50px; - height: 8px; - margin: 0; - padding: 0; - font-size: 1px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - background: #fff; - background: rgba(255,255,255,0.8); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8))); - background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); - background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8)); -} - -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle { - display: none; +.mejs__mute > button { + background-position: -60px 0; +} + +.mejs__unmute > button { + background-position: -40px 0; +} + +.mejs__volume-button { + position: relative; +} + +.mejs__volume-button > .mejs__volume-slider { + display: none; + height: 115px; + width: 25px; + background: rgba(50, 50, 50, 0.7); + border-radius: 0; + top: -115px; + left: 5px; + z-index: 1; + position: absolute; + margin: 0; +} + +.mejs__volume-button:hover { + border-radius: 0 0 4px 4px; +} + +.mejs__volume-total { + position: absolute; + left: 11px; + top: 8px; + width: 2px; + height: 100px; + background: rgba(255, 255, 255, 0.5); + margin: 0; +} + +.mejs__volume-current { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.9); + margin: 0; +} + +.mejs__volume-handle { + position: absolute; + left: 0; + bottom: 100%; + width: 16px; + height: 6px; + margin: 0 0 -3px -7px; + background: rgba(255, 255, 255, 0.9); + cursor: ns-resize; + border-radius: 1px; +} + +.mejs__horizontal-volume-slider { + height: 36px; + width: 56px; + position: relative; + display: block; + float: left; + vertical-align: middle; +} + +.mejs__horizontal-volume-total { + position: absolute; + left: 0; + top: 16px; + width: 50px; + height: 8px; + margin: 0; + padding: 0; + font-size: 1px; + border-radius: 2px; + background: rgba(50, 50, 50, 0.8); +} + +.mejs__horizontal-volume-current { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + font-size: 1px; + border-radius: 2px; + background: rgba(255, 255, 255, 0.8); +} + +.mejs__horizontal-volume-handle { + display: none; } /* End: Mute/Volume */ /* Start: Track (Captions and Chapters) */ -.mejs-controls .mejs-captions-button { - position: relative; -} - -.mejs-controls .mejs-captions-button button { - background-position: -48px 0; -} -.mejs-controls .mejs-captions-button .mejs-captions-selector { - visibility: hidden; - position: absolute; - bottom: 26px; - right: -51px; - width: 85px; - height: 100px; - background: url(background.png); - background: rgba(50,50,50,0.7); - border: solid 1px transparent; - padding: 10px 10px 0 10px; - overflow: hidden; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -/* -.mejs-controls .mejs-captions-button:hover .mejs-captions-selector { - visibility: visible; -} -*/ - -.mejs-controls .mejs-captions-button .mejs-captions-selector ul { - margin: 0; - padding: 0; - display: block; - list-style-type: none !important; - overflow: hidden; -} - -.mejs-controls .mejs-captions-button .mejs-captions-selector ul li { - margin: 0 0 6px 0; - padding: 0; - list-style-type: none !important; - display: block; - color: #fff; - overflow: hidden; -} - -.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input { - clear: both; - float: left; - margin: 3px 3px 0 5px; -} - -.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label { - width: 55px; - float: left; - padding: 4px 0 0 0; - line-height: 15px; - font-family: helvetica, arial; - font-size: 10px; -} - -.mejs-controls .mejs-captions-button .mejs-captions-translations { - font-size: 10px; - margin: 0 0 5px 0; -} - -.mejs-chapters { - position: absolute; - top: 0; - left: 0; - -xborder-right: solid 1px #fff; - width: 10000px; - z-index: 1; -} - -.mejs-chapters .mejs-chapter { - position: absolute; - float: left; - background: #222; - background: rgba(0, 0, 0, 0.7); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7))); - background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7)); - filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232,endColorstr=#000000); - overflow: hidden; - border: 0; -} - -.mejs-chapters .mejs-chapter .mejs-chapter-block { - font-size: 11px; - color: #fff; - padding: 5px; - display: block; - border-right: solid 1px #333; - border-bottom: solid 1px #333; - cursor: pointer; -} - -.mejs-chapters .mejs-chapter .mejs-chapter-block-last { - border-right: none; -} - -.mejs-chapters .mejs-chapter .mejs-chapter-block:hover { - background: #666; - background: rgba(102,102,102, 0.7); - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(102,102,102,0.7)), to(rgba(50,50,50,0.6))); - background: -webkit-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); - background: -moz-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); - background: -o-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); - background: -ms-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); - background: linear-gradient(rgba(102,102,102,0.7), rgba(50,50,50,0.6)); - filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666,endColorstr=#323232); +.mejs__captions-button, .mejs__chapters-button { + position: relative; } -.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title { - font-size: 12px; - font-weight: bold; - display: block; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0 0 3px 0; - line-height: 12px; +.mejs__captions-button > button { + background-position: -140px 0; } -.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan { - font-size: 12px; - line-height: 12px; - margin: 3px 0 4px 0; - display: block; - white-space: nowrap; - text-overflow: ellipsis; +.mejs__chapters-button > button { + background-position: -302px 0; } -.mejs-captions-layer { - position: absolute; - bottom: 0; - left: 0; - text-align:center; - line-height: 20px; - font-size: 16px; - color: #fff; +.mejs__captions-button > .mejs__captions-selector, .mejs__chapters-button > .mejs__chapters-selector { + visibility: hidden; + position: absolute; + bottom: 40px; + right: -51px; + width: 85px; + background: rgba(50, 50, 50, 0.7); + border: solid 1px transparent; + padding: 0; + overflow: hidden; + border-radius: 0; } -.mejs-captions-layer a { - color: #fff; - text-decoration: underline; +.mejs__chapters-button > .mejs__chapters-selector { + width: 110px; } -.mejs-captions-layer[lang=ar] { - font-size: 20px; - font-weight: normal; +.mejs__captions-button > .mejs__captions-selector, .mejs__chapters-button > .mejs__chapters-selector { + visibility: visible; } -.mejs-captions-position { - position: absolute; - width: 100%; - bottom: 15px; - left: 0; -} - -.mejs-captions-position-hover { - bottom: 35px; -} - -.mejs-captions-text { - padding: 3px 5px; - background: url(background.png); - background: rgba(20, 20, 20, 0.5); - white-space: pre-wrap; +.mejs__captions-selector-list, .mejs__chapters-selector-list { + margin: 0; + padding: 0; + display: block; + list-style-type: none !important; + overflow: hidden; } -/* End: Track (Captions and Chapters) */ -/* Start: Error */ -.me-cannotplay { +.mejs__captions-selector-list-item, .mejs__chapters-selector-list-item { + margin: 0 0 6px 0; + padding: 0 10px; + list-style-type: none !important; + display: block; + color: #fff; + overflow: hidden; + cursor: pointer; } -.me-cannotplay a { - color: #fff; - font-weight: bold; +.mejs__captions-selector-list-item:hover, .mejs__chapters-selector-list-item:hover { + background-color: rgb(200, 200, 200) !important; + background-color: rgba(255, 255, 255, 0.4) !important; } -.me-cannotplay span { - padding: 15px; - display: block; +.mejs__captions-selector-input, .mejs__chapters-selector-input { + clear: both; + float: left; + margin: 3px 3px 0 5px; + position: absolute; + left: -1000px; } -/* End: Error */ - -/* Start: Loop */ -.mejs-controls .mejs-loop-off button { - background-position: -64px -16px; +.mejs__captions-selector-label, .mejs__chapters-selector-label { + width: 55px; + float: left; + padding: 4px 0 0 0; + line-height: 15px; + font-size: 10px; + cursor: pointer; } -.mejs-controls .mejs-loop-on button { - background-position: -64px 0; +.mejs__captions-selected, .mejs__chapters-selected { + color: rgba(33, 248, 248, 1); } -/* End: Loop */ - -/* Start: backlight */ -.mejs-controls .mejs-backlight-off button { - background-position: -80px -16px; +.mejs__captions-translations { + font-size: 10px; + margin: 0 0 5px 0; } -.mejs-controls .mejs-backlight-on button { - background-position: -80px 0; +.mejs__captions-layer { + position: absolute; + bottom: 0; + left: 0; + text-align: center; + line-height: 20px; + font-size: 16px; + color: #fff; } -/* End: backlight */ -/* Start: Picture Controls */ -.mejs-controls .mejs-picturecontrols-button { - background-position: -96px 0; +.mejs__captions-layer a { + color: #fff; + text-decoration: underline; } -/* End: Picture Controls */ - -/* context menu */ -.mejs-contextmenu { - position: absolute; - width: 150px; - padding: 10px; - border-radius: 4px; - top: 0; - left: 0; - background: #fff; - border: solid 1px #999; - z-index: 1001; /* make sure it shows on fullscreen */ -} -.mejs-contextmenu .mejs-contextmenu-separator { - height: 1px; - font-size: 0; - margin: 5px 6px; - background: #333; +.mejs__captions-layer[lang=ar] { + font-size: 20px; + font-weight: normal; } -.mejs-contextmenu .mejs-contextmenu-item { - font-family: Helvetica, Arial; - font-size: 12px; - padding: 4px 6px; - cursor: pointer; - color: #333; -} -.mejs-contextmenu .mejs-contextmenu-item:hover { - background: #2C7C91; - color: #fff; +.mejs__captions-position { + position: absolute; + width: 100%; + bottom: 15px; + left: 0; } -/* Start: Source Chooser */ -.mejs-controls .mejs-sourcechooser-button { - position: relative; +.mejs__captions-position-hover { + bottom: 35px; } -.mejs-controls .mejs-sourcechooser-button button { - background-position: -128px 0; +.mejs__captions-text, .mejs__captions-text * { + padding: 0; + background: rgba(20, 20, 20, 0.5); + white-space: pre-wrap; + box-shadow: 5px 0 0 rgba(20, 20, 20, 0.5), -5px 0 0 rgba(20, 20, 20, 0.5); } -.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector { - visibility: hidden; - position: absolute; - bottom: 26px; - right: -10px; - width: 130px; - height: 100px; - background: url(background.png); - background: rgba(50,50,50,0.7); - border: solid 1px transparent; - padding: 10px; - overflow: hidden; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; +/* End: Track (Captions and Chapters) */ + +/* Start: Error */ +.me_cannotplay a { + font-weight: bold; } -.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul { - margin: 0; - padding: 0; - display: block; - list-style-type: none !important; - overflow: hidden; +.mejs__container .me_cannotplay a { + color: #fff; } -.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li { - margin: 0 0 6px 0; - padding: 0; - list-style-type: none !important; - display: block; - color: #fff; - overflow: hidden; -} - -.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input { - clear: both; - float: left; - margin: 3px 3px 0 5px; -} - -.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label { - width: 100px; - float: left; - padding: 4px 0 0 0; - line-height: 15px; - font-family: helvetica, arial; - font-size: 10px; -} -/* End: Source Chooser */ - -/* Start: Postroll */ -.mejs-postroll-layer { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - background: url(background.png); - background: rgba(50,50,50,0.7); - z-index: 1000; - overflow: hidden; -} -.mejs-postroll-layer-content { - width: 100%; - height: 100%; -} -.mejs-postroll-close { - position: absolute; - right: 0; - top: 0; - background: url(background.png); - background: rgba(50,50,50,0.7); - color: #fff; - padding: 4px; - z-index: 100; - cursor: pointer; -} -/* End: Postroll */ - - -/* Start: Speed */ -div.mejs-speed-button { - width: 46px !important; - position: relative; -} - -.mejs-controls .mejs-button.mejs-speed-button button { - background: transparent; - width: 36px; - font-size: 11px; - line-height: normal; - color: #ffffff; -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector { - visibility: hidden; - position: absolute; - top: -100px; - left: -10px; - width: 60px; - height: 100px; - background: url(background.png); - background: rgba(50, 50, 50, 0.7); - border: solid 1px transparent; - padding: 0; - overflow: hidden; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.mejs-controls .mejs-speed-button:hover > .mejs-speed-selector { - visibility: visible; -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label.mejs-speed-selected { - color: rgba(33, 248, 248, 1); -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector ul { - margin: 0; - padding: 0; - display: block; - list-style-type: none !important; - overflow: hidden; -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector ul li { - margin: 0 0 6px 0; - padding: 0 10px; - list-style-type: none !important; - display: block; - color: #fff; - overflow: hidden; -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector ul li input { - clear: both; - float: left; - margin: 3px 3px 0 5px; - display: none; -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label { - width: 60px; - float: left; - padding: 4px 0 0 0; - line-height: 15px; - font-family: helvetica, arial; - font-size: 11.5px; - color: white; - margin-left: 5px; - cursor: pointer; -} - -.mejs-controls .mejs-speed-button .mejs-speed-selector ul li:hover { - background-color: rgb(200, 200, 200) !important; - background-color: rgba(255,255,255,.4) !important; -} -/* End: Speed */ +.me_cannotplay span { + padding: 15px; + display: block; +} +/* End: Error */ \ No newline at end of file diff --git a/lib/mejs/mediaelementplayer.js b/lib/mejs/mediaelementplayer.js index c1c1622f..deb9bf46 100644 --- a/lib/mejs/mediaelementplayer.js +++ b/lib/mejs/mediaelementplayer.js @@ -1,3328 +1,7562 @@ /*! - * MediaElementPlayer - * http://mediaelementjs.com/ + * MediaElement.js + * http://www.mediaelementjs.com/ * - * Creates a controller bar for HTML5 <video> add <audio> tags - * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper) + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) * - * Copyright 2010-2013, John Dyer (http://j.hn/) + * Copyright 2010-2017, John Dyer (http://j.hn/) * License: MIT * - */ -if (typeof jQuery != 'undefined') { - mejs.$ = jQuery; -} else if (typeof ender != 'undefined') { - mejs.$ = ender; + */(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){ + +},{}],2:[function(_dereq_,module,exports){ +(function (global){ +var topLevel = typeof global !== 'undefined' ? global : + typeof window !== 'undefined' ? window : {} +var minDoc = _dereq_(1); + +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; } -(function ($) { - // default player values - mejs.MepDefaults = { - // url to poster (to fix iOS 3.x) - poster: '', - // When the video is ended, we can show the poster. - showPosterWhenEnded: false, - // default if the <video width> is not specified - defaultVideoWidth: 480, - // default if the <video height> is not specified - defaultVideoHeight: 270, - // if set, overrides <video width> - videoWidth: -1, - // if set, overrides <video height> - videoHeight: -1, - // default if the user doesn't specify - defaultAudioWidth: 400, - // default if the user doesn't specify - defaultAudioHeight: 30, - - // default amount to move back when back key is pressed - defaultSeekBackwardInterval: function(media) { - return (media.duration * 0.05); - }, - // default amount to move forward when forward key is pressed - defaultSeekForwardInterval: function(media) { - return (media.duration * 0.05); - }, +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"1":1}],3:[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 = {}; +} - // set dimensions via JS instead of CSS - setDimensions: true, - - // width of audio player - audioWidth: -1, - // height of audio player - audioHeight: -1, - // initial volume when the player starts (overrided by user cookie) - startVolume: 0.8, - // useful for <audio> player loops - loop: false, - // rewind to beginning when media ends - autoRewind: true, - // resize to media dimensions - enableAutosize: true, - // forces the hour marker (##:00:00) - alwaysShowHours: false, - - // show framecount in timecode (##:00:00:00) - showTimecodeFrameCount: false, - // used when showTimecodeFrameCount is set to true - framesPerSecond: 25, - - // automatically calculate the width of the progress bar based on the sizes of other elements - autosizeProgress : true, - // Hide controls when playing and mouse is not over the video - alwaysShowControls: false, - // Display the video control - hideVideoControlsOnLoad: false, - // Enable click video element to toggle play/pause - clickToPlayPause: true, - // force iPad's native controls - iPadUseNativeControls: false, - // force iPhone's native controls - iPhoneUseNativeControls: false, - // force Android's native controls - AndroidUseNativeControls: false, - // features to show - features: ['playpause','current','progress','duration','tracks','volume','fullscreen'], - // only for dynamic - isVideo: true, - - // turns keyboard support on and off for this instance - enableKeyboard: true, - - // whenthis player starts, it will pause other players - pauseOtherPlayers: true, - - // array of keyboard actions such as play pause - keyActions: [ - { - keys: [ - 32, // SPACE - 179 // GOOGLE play/pause button - ], - action: function(player, media) { - if (media.paused || media.ended) { - player.play(); - } else { - player.pause(); - } - } - }, - { - keys: [38], // UP - action: function(player, media) { - player.container.find('.mejs-volume-slider').css('display','block'); - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],4:[function(_dereq_,module,exports){ +'use strict'; - var newVolume = Math.min(media.volume + 0.1, 1); - media.setVolume(newVolume); - } - }, - { - keys: [40], // DOWN - action: function(player, media) { - player.container.find('.mejs-volume-slider').css('display','block'); - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } +Object.defineProperty(exports, "__esModule", { + value: true +}); - var newVolume = Math.max(media.volume - 0.1, 0); - media.setVolume(newVolume); - } - }, - { - keys: [ - 37, // LEFT - 227 // Google TV rewind - ], - action: function(player, media) { - if (!isNaN(media.duration) && media.duration > 0) { - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - - // 5% - var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0); - media.setCurrentTime(newTime); - } - } - }, - { - keys: [ - 39, // RIGHT - 228 // Google TV forward - ], - action: function(player, media) { - if (!isNaN(media.duration) && media.duration > 0) { - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - - // 5% - var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration); - media.setCurrentTime(newTime); - } - } - }, - { - keys: [70], // F - action: function(player, media) { - if (typeof player.enterFullScreen != 'undefined') { - if (player.isFullScreen) { - player.exitFullScreen(); - } else { - player.enterFullScreen(); - } - } - } - }, - { - keys: [77], // M - action: function(player, media) { - player.container.find('.mejs-volume-slider').css('display','block'); - if (player.isVideo) { - player.showControls(); - player.startControlsTimer(); - } - if (player.media.muted) { - player.setMuted(false); - } else { - player.setMuted(true); - } - } - } - ] - }; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - mejs.mepIndex = 0; +var _mejs = _dereq_(6); - mejs.players = {}; +var _mejs2 = _interopRequireDefault(_mejs); - // wraps a MediaElement object in player controls - mejs.MediaElementPlayer = function(node, o) { - // enforce object, even without "new" (via John Resig) - if ( !(this instanceof mejs.MediaElementPlayer) ) { - return new mejs.MediaElementPlayer(node, o); - } +var _en = _dereq_(14); - var t = this; +var _general = _dereq_(21); - // these will be reset after the MediaElement.success fires - t.$media = t.$node = $(node); - t.node = t.media = t.$media[0]; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // check for existing player - if (typeof t.node.player != 'undefined') { - return t.node.player; - } else { - // attach player to DOM node for reference - t.node.player = t; - } +/** + * Locale. + * + * This object manages translations with pluralization. Also deals with WordPress compatibility. + * @type {Object} + */ +var i18n = { lang: 'en', en: _en.EN }; + +/** + * Language setter/getter + * + * @param {*} args Can pass the language code and/or the translation strings as an Object + * @return {string} + */ +i18n.language = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (args !== null && args !== undefined && args.length) { - // try to get options from data-mejsoptions - if (typeof o == 'undefined') { - o = t.$node.data('mejsoptions'); + if (typeof args[0] !== 'string') { + throw new TypeError('Language code must be a string value'); } - // extend default options - t.options = $.extend({},mejs.MepDefaults,o); - - // unique ID - t.id = 'mep_' + mejs.mepIndex++; + if (!args[0].match(/^[a-z]{2}(\-[a-z]{2})?$/i)) { + throw new TypeError('Language code must have format `xx` or `xx-xx`'); + } - // add to player array (for focus events) - mejs.players[t.id] = t; + i18n.lang = args[0]; - // start up - t.init(); + // Check if language strings were added; otherwise, check the second argument or set to English as default + if (i18n[args[0]] === undefined) { + args[1] = args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object' ? args[1] : {}; + i18n[args[0]] = !(0, _general.isObjectEmpty)(args[1]) ? args[1] : _en.EN; + } else if (args[1] !== null && args[1] !== undefined && _typeof(args[1]) === 'object') { + i18n[args[0]] = args[1]; + } + } - return t; - }; + return i18n.lang; +}; - // actual player - mejs.MediaElementPlayer.prototype = { +/** + * Translate a string in the language set up (or English by default) + * + * @param {string} message + * @param {number} pluralParam + * @return {string} + */ +i18n.t = function (message) { + var pluralParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - hasFocus: false, - controlsAreVisible: true, + if (typeof message === 'string' && message.length) { - init: function() { + var str = void 0, + pluralForm = void 0; - var - t = this, - mf = mejs.MediaFeatures, - // options for MediaElement (shim) - meOptions = $.extend(true, {}, t.options, { - success: function(media, domNode) { t.meReady(media, domNode); }, - error: function(e) { t.handleError(e);} - }), - tagName = t.media.tagName.toLowerCase(); + var language = i18n.language(); - t.isDynamic = (tagName !== 'audio' && tagName !== 'video'); + /** + * Modify string using algorithm to detect plural forms. + * + * @private + * @see http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings + * @param {String|String[]} input - String or array of strings to pick the plural form + * @param {Number} number - Number to determine the proper plural form + * @param {Number} form - Number of language family to apply plural form + * @return {String} + */ + var _plural = function _plural(input, number, form) { - if (t.isDynamic) { - // get video from src or href? - t.isVideo = t.options.isVideo; - } else { - t.isVideo = (tagName !== 'audio' && t.options.isVideo); + if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) !== 'object' || typeof number !== 'number' || typeof form !== 'number') { + return input; } - // use native controls in iPad, iPhone, and Android - if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) { + /** + * + * @return {Function[]} + * @private + */ + var _pluralForms = function () { + return [ + // 0: Chinese, Japanese, Korean, Persian, Turkish, Thai, Lao, Aymará, + // Tibetan, Chiga, Dzongkha, Indonesian, Lojban, Georgian, Kazakh, Khmer, Kyrgyz, Malay, + // Burmese, Yakut, Sundanese, Tatar, Uyghur, Vietnamese, Wolof + function () { + return arguments.length <= 1 ? undefined : arguments[1]; + }, - // add controls and stop - t.$media.attr('controls', 'controls'); + // 1: Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish, Estonian, Finnish, + // Hungarian, Basque, Greek, Hebrew, Italian, Portuguese, Spanish, Catalan, Afrikaans, + // Angika, Assamese, Asturian, Azerbaijani, Bulgarian, Bengali, Bodo, Aragonese, Dogri, + // Esperanto, Argentinean Spanish, Fulah, Friulian, Galician, Gujarati, Hausa, + // Hindi, Chhattisgarhi, Armenian, Interlingua, Greenlandic, Kannada, Kurdish, Letzeburgesch, + // Maithili, Malayalam, Mongolian, Manipuri, Marathi, Nahuatl, Neapolitan, Norwegian Bokmal, + // Nepali, Norwegian Nynorsk, Norwegian (old code), Northern Sotho, Oriya, Punjabi, Papiamento, + // Piemontese, Pashto, Romansh, Kinyarwanda, Santali, Scots, Sindhi, Northern Sami, Sinhala, + // Somali, Songhay, Albanian, Swahili, Tamil, Telugu, Turkmen, Urdu, Yoruba + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, - // attempt to fix iOS 3 bug - //t.$media.removeAttr('poster'); - // no Issue found on iOS3 -ttroxell + // 2: French, Brazilian Portuguese, Acholi, Akan, Amharic, Mapudungun, Breton, Filipino, + // Gun, Lingala, Mauritian Creole, Malagasy, Maori, Occitan, Tajik, Tigrinya, Uzbek, Walloon + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, - // override Apple's autoplay override for iPads - if (mf.isiPad && t.media.getAttribute('autoplay') !== null) { - t.play(); - } + // 3: Latvian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 0) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - } else if (mf.isAndroid && t.options.AndroidUseNativeControls) { + // 4: Scottish Gaelic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1 || (arguments.length <= 0 ? undefined : arguments[0]) === 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2 || (arguments.length <= 0 ? undefined : arguments[0]) === 12) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 20) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, - // leave default player + // 5: Romanian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 0 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - } else { + // 6: Lithuanian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return [3]; + } + }, - // DESKTOP: use MediaElementPlayer controls + // 7: Belarusian, Bosnian, Croatian, Serbian, Russian, Ukrainian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 !== 11) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - // remove native controls - t.$media.removeAttr('controls'); + // 8: Slovak, Czech + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) <= 4) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - // build container - t.container = - $('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svg ? 'svg' : 'no-svg') + '">'+ - '<div class="mejs-inner">'+ - '<div class="mejs-mediaelement"></div>'+ - '<div class="mejs-layers"></div>'+ - '<div class="mejs-controls"></div>'+ - '<div class="mejs-clear"></div>'+ - '</div>' + - '</div>') - .addClass(t.$media[0].className) - .insertBefore(t.$media); + // 9: Polish + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - // add classes for user and content - t.container.addClass( - (mf.isAndroid ? 'mejs-android ' : '') + - (mf.isiOS ? 'mejs-ios ' : '') + - (mf.isiPad ? 'mejs-ipad ' : '') + - (mf.isiPhone ? 'mejs-iphone ' : '') + - (t.isVideo ? 'mejs-video ' : 'mejs-audio ') - ); + // 10: Slovenian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 2) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 === 3 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 === 4) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else { + return arguments.length <= 1 ? undefined : arguments[1]; + } + }, + // 11: Irish Gaelic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 2 && (arguments.length <= 0 ? undefined : arguments[0]) < 7) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) > 6 && (arguments.length <= 0 ? undefined : arguments[0]) < 11) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else { + return arguments.length <= 5 ? undefined : arguments[5]; + } + }, - // move the <video/video> tag into the right spot - if (mf.isiOS) { + // 12: Arabic + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 3 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 <= 10) { + return arguments.length <= 4 ? undefined : arguments[4]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 11) { + return arguments.length <= 5 ? undefined : arguments[5]; + } else { + return arguments.length <= 6 ? undefined : arguments[6]; + } + }, - // sadly, you can't move nodes in iOS, so we have to destroy and recreate it! - var $newMedia = t.$media.clone(); + // 13: Maltese + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 0 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 > 1 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 11) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 100 > 10 && (arguments.length <= 0 ? undefined : arguments[0]) % 100 < 20) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, - t.container.find('.mejs-mediaelement').append($newMedia); + // 14: Macedonian + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - t.$media.remove(); - t.$node = t.$media = $newMedia; - t.node = t.media = $newMedia[0] + // 15: Icelandic + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) !== 11 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 === 1 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, - } else { + // New additions - // normal way of moving it into place (doesn't work on iOS) - t.container.find('.mejs-mediaelement').append(t.$media); - } + // 16: Kashubian + // In https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of__pluralRules + // Breton is listed as #16 but in the Localization Guide it belongs to the group 2 + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) % 10 >= 2 && (arguments.length <= 0 ? undefined : arguments[0]) % 10 <= 4 && ((arguments.length <= 0 ? undefined : arguments[0]) % 100 < 10 || (arguments.length <= 0 ? undefined : arguments[0]) % 100 >= 20)) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }, - // find parts - t.controls = t.container.find('.mejs-controls'); - t.layers = t.container.find('.mejs-layers'); + // 17: Welsh + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) !== 8 && (arguments.length <= 0 ? undefined : arguments[0]) !== 11) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, - // determine the size + // 18: Javanese + function () { + return (arguments.length <= 0 ? undefined : arguments[0]) === 0 ? arguments.length <= 1 ? undefined : arguments[1] : arguments.length <= 2 ? undefined : arguments[2]; + }, - /* size priority: - (1) videoWidth (forced), - (2) style="width;height;" - (3) width attribute, - (4) defaultVideoWidth (for unspecified cases) - */ + // 19: Cornish + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 2) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 3) { + return arguments.length <= 3 ? undefined : arguments[3]; + } else { + return arguments.length <= 4 ? undefined : arguments[4]; + } + }, - var tagType = (t.isVideo ? 'video' : 'audio'), - capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1); + // 20: Mandinka + function () { + if ((arguments.length <= 0 ? undefined : arguments[0]) === 0) { + return arguments.length <= 1 ? undefined : arguments[1]; + } else if ((arguments.length <= 0 ? undefined : arguments[0]) === 1) { + return arguments.length <= 2 ? undefined : arguments[2]; + } else { + return arguments.length <= 3 ? undefined : arguments[3]; + } + }]; + }(); + // Perform plural form or return original text + return _pluralForms[form].apply(null, [number].concat(input)); + }; + // Fetch the localized version of the string + if (i18n[language] !== undefined) { + str = i18n[language][message]; + if (pluralParam !== null && typeof pluralParam === 'number') { + pluralForm = i18n[language]['mejs.plural-form']; + str = _plural.apply(null, [str, pluralParam, pluralForm]); + } + } - if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) { - t.width = t.options[tagType + 'Width']; - } else if (t.media.style.width !== '' && t.media.style.width !== null) { - t.width = t.media.style.width; - } else if (t.media.getAttribute('width') !== null) { - t.width = t.$media.attr('width'); - } else { - t.width = t.options['default' + capsTagName + 'Width']; - } + // Fallback to default language if requested uid is not translated + if (!str && i18n.en) { + str = i18n.en[message]; + if (pluralParam !== null && typeof pluralParam === 'number') { + pluralForm = i18n.en['mejs.plural-form']; + str = _plural.apply(null, [str, pluralParam, pluralForm]); + } + } - if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) { - t.height = t.options[tagType + 'Height']; - } else if (t.media.style.height !== '' && t.media.style.height !== null) { - t.height = t.media.style.height; - } else if (t.$media[0].getAttribute('height') !== null) { - t.height = t.$media.attr('height'); - } else { - t.height = t.options['default' + capsTagName + 'Height']; - } + // As a last resort, use the requested uid, to mimic original behavior of i18n utils + // (in which uid was the english text) + str = str || message; - // set the size, while we wait for the plugins to load below - t.setPlayerSize(t.width, t.height); + // Replace token + if (pluralParam !== null && typeof pluralParam === 'number') { + str = str.replace('%1', pluralParam); + } - // create MediaElementShim - meOptions.pluginWidth = t.width; - meOptions.pluginHeight = t.height; - } + return (0, _general.escapeHTML)(str); + } - // create MediaElement shim - mejs.MediaElement(t.$media[0], meOptions); + return message; +}; - if (typeof(t.container) != 'undefined' && t.controlsAreVisible){ - // controls are shown when loaded - t.container.trigger('controlsshown'); - } - }, +_mejs2.default.i18n = i18n; - showControls: function(doAnimation) { - var t = this; +// `i18n` compatibility workflow with WordPress +if (typeof mejsL10n !== 'undefined') { + _mejs2.default.i18n.language(mejsL10n.language, mejsL10n.strings); +} - doAnimation = typeof doAnimation == 'undefined' || doAnimation; +exports.default = i18n; - if (t.controlsAreVisible) - return; +},{"14":14,"21":21,"6":6}],5:[function(_dereq_,module,exports){ +'use strict'; - if (doAnimation) { - t.controls - .css('visibility','visible') - .stop(true, true).fadeIn(200, function() { - t.controlsAreVisible = true; - t.container.trigger('controlsshown'); - }); +Object.defineProperty(exports, "__esModule", { + value: true +}); - // any additional controls people might add and want to hide - t.container.find('.mejs-control') - .css('visibility','visible') - .stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;}); +var _window = _dereq_(3); - } else { - t.controls - .css('visibility','visible') - .css('display','block'); +var _window2 = _interopRequireDefault(_window); - // any additional controls people might add and want to hide - t.container.find('.mejs-control') - .css('visibility','visible') - .css('display','block'); +var _document = _dereq_(2); - t.controlsAreVisible = true; - t.container.trigger('controlsshown'); - } +var _document2 = _interopRequireDefault(_document); - t.setControlsSize(); +var _mejs = _dereq_(6); - }, +var _mejs2 = _interopRequireDefault(_mejs); - hideControls: function(doAnimation) { - var t = this; +var _general = _dereq_(21); - doAnimation = typeof doAnimation == 'undefined' || doAnimation; +var _media = _dereq_(22); - if (!t.controlsAreVisible || t.options.alwaysShowControls) - return; +var _renderer = _dereq_(7); - if (doAnimation) { - // fade out main controls - t.controls.stop(true, true).fadeOut(200, function() { - $(this) - .css('visibility','hidden') - .css('display','block'); - - t.controlsAreVisible = false; - t.container.trigger('controlshidden'); - }); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // any additional controls people might add and want to hide - t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() { - $(this) - .css('visibility','hidden') - .css('display','block'); - }); - } else { +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - // hide main controls - t.controls - .css('visibility','hidden') - .css('display','block'); +/** + * Media Core + * + * This class is the foundation to create/render different media formats. + * @class MediaElement + */ +var MediaElement = function MediaElement(idOrNode, options) { + var _this = this; + + _classCallCheck(this, MediaElement); + + var t = this; + + t.defaults = { + /** + * List of the renderers to use + * @type {String[]} + */ + renderers: [], + /** + * Name of MediaElement container + * @type {String} + */ + fakeNodeName: 'mediaelementwrapper', + /** + * The path where shims are located + * @type {String} + */ + pluginPath: 'build/', + /** + * Flag in `<object>` and `<embed>` to determine whether to use local or CDN + * Possible values: 'always' (CDN version) or 'sameDomain' (local files) + */ + shimScriptAccess: 'sameDomain', + /** + * If error happens, set up HTML message + * @type {String} + */ + customError: '' + }; - // hide others - t.container.find('.mejs-control') - .css('visibility','hidden') - .css('display','block'); + options = Object.assign(t.defaults, options); - t.controlsAreVisible = false; - t.container.trigger('controlshidden'); - } - }, + // create our node (note: older versions of iOS don't support Object.defineProperty on DOM nodes) + t.mediaElement = _document2.default.createElement(options.fakeNodeName); + t.mediaElement.options = options; - controlsTimer: null, + var id = idOrNode, + error = false; - startControlsTimer: function(timeout) { + if (typeof idOrNode === 'string') { + t.mediaElement.originalNode = _document2.default.getElementById(idOrNode); + } else { + t.mediaElement.originalNode = idOrNode; + id = idOrNode.id; + } - var t = this; + id = id || 'mejs_' + Math.random().toString().slice(2); - timeout = typeof timeout != 'undefined' ? timeout : 1500; + if (t.mediaElement.originalNode !== undefined && t.mediaElement.originalNode !== null && t.mediaElement.appendChild) { + // change id + t.mediaElement.originalNode.setAttribute('id', id + '_from_mejs'); - t.killControlsTimer('start'); + // to avoid some issues with Javascript interactions in the plugin, set `preload=none` if not set + // only if video/audio tags are detected + var tagName = t.mediaElement.originalNode.tagName.toLowerCase(); + if (['video', 'audio'].includes(tagName) && !t.mediaElement.originalNode.getAttribute('preload')) { + t.mediaElement.originalNode.setAttribute('preload', 'none'); + } - t.controlsTimer = setTimeout(function() { - // - t.hideControls(); - t.killControlsTimer('hide'); - }, timeout); - }, + // add next to this one + t.mediaElement.originalNode.parentNode.insertBefore(t.mediaElement, t.mediaElement.originalNode); - killControlsTimer: function(src) { + // insert this one inside + t.mediaElement.appendChild(t.mediaElement.originalNode); + } else { + // TODO: where to put the node? + } - var t = this; + t.mediaElement.id = id; + t.mediaElement.renderers = {}; + t.mediaElement.renderer = null; + t.mediaElement.rendererName = null; + /** + * Determine whether the renderer was found or not + * + * @public + * @param {String} rendererName + * @param {Object[]} mediaFiles + * @return {Boolean} + */ + t.mediaElement.changeRenderer = function (rendererName, mediaFiles) { + + var t = _this; + + // check for a match on the current renderer + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && t.mediaElement.renderer.name === rendererName) { + t.mediaElement.renderer.pause(); + if (t.mediaElement.renderer.stop) { + t.mediaElement.renderer.stop(); + } + t.mediaElement.renderer.show(); + t.mediaElement.renderer.setSrc(mediaFiles[0].src); + return true; + } - if (t.controlsTimer !== null) { - clearTimeout(t.controlsTimer); - delete t.controlsTimer; - t.controlsTimer = null; + // if existing renderer is not the right one, then hide it + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer.pause(); + if (t.mediaElement.renderer.stop) { + t.mediaElement.renderer.stop(); } - }, + t.mediaElement.renderer.hide(); + } - controlsEnabled: true, + // see if we have the renderer already created + var newRenderer = t.mediaElement.renderers[rendererName], + newRendererType = null; - disableControls: function() { - var t= this; + if (newRenderer !== undefined && newRenderer !== null) { + newRenderer.show(); + newRenderer.setSrc(mediaFiles[0].src); + t.mediaElement.renderer = newRenderer; + t.mediaElement.rendererName = rendererName; + return true; + } - t.killControlsTimer(); - t.hideControls(false); - this.controlsEnabled = false; - }, + var rendererArray = t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : _renderer.renderer.order; - enableControls: function() { - var t= this; + // find the desired renderer in the array of possible ones + for (var i = 0, total = rendererArray.length; i < total; i++) { - t.showControls(false); + var index = rendererArray[i]; - t.controlsEnabled = true; - }, + if (index === rendererName) { + // create the renderer + var rendererList = _renderer.renderer.renderers; + newRendererType = rendererList[index]; - // Sets up all controls and events - meReady: function(media, domNode) { + var renderOptions = Object.assign(newRendererType.options, t.mediaElement.options); + newRenderer = newRendererType.create(t.mediaElement, renderOptions, mediaFiles); + newRenderer.name = rendererName; + // store for later + t.mediaElement.renderers[newRendererType.name] = newRenderer; + t.mediaElement.renderer = newRenderer; + t.mediaElement.rendererName = rendererName; - var t = this, - mf = mejs.MediaFeatures, - autoplayAttr = domNode.getAttribute('autoplay'), - autoplay = !(typeof autoplayAttr == 'undefined' || autoplayAttr === null || autoplayAttr === 'false'), - featureIndex, - feature; + newRenderer.show(); - // make sure it can't create itself again if a plugin reloads - if (t.created) { - return; - } else { - t.created = true; + return true; } + } - t.media = media; - t.domNode = domNode; + return false; + }; - if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) { + /** + * Set the element dimensions based on selected renderer's setSize method + * + * @public + * @param {number} width + * @param {number} height + */ + t.mediaElement.setSize = function (width, height) { + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer.setSize(width, height); + } + }; - // two built in features - t.buildposter(t, t.controls, t.layers, t.media); - t.buildkeyboard(t, t.controls, t.layers, t.media); - t.buildoverlays(t, t.controls, t.layers, t.media); + /** + * + * @param {Object[]} urlList + */ + t.mediaElement.createErrorMessage = function (urlList) { - // grab for use by features - t.findTracks(); + urlList = Array.isArray(urlList) ? urlList : []; - // add user-defined features/controls - for (featureIndex in t.options.features) { - feature = t.options.features[featureIndex]; - if (t['build' + feature]) { - try { - t['build' + feature](t, t.controls, t.layers, t.media); - } catch (e) { - // TODO: report control error - //throw e; - - - } - } - } + var errorContainer = _document2.default.createElement('div'); + errorContainer.className = 'me_cannotplay'; + errorContainer.style.width = '100%'; + errorContainer.style.height = '100%'; - t.container.trigger('controlsready'); + var errorContent = t.mediaElement.options.customError; - // reset all layers and controls - t.setPlayerSize(t.width, t.height); - t.setControlsSize(); + if (!errorContent) { + var poster = t.mediaElement.originalNode.getAttribute('poster'); + if (poster) { + errorContent += '<img src="' + poster + '" width="100%" height="100%" alt="' + _mejs2.default.i18n.t('mejs.download-file') + '">'; + } - // controls fade - if (t.isVideo) { + for (var i = 0, total = urlList.length; i < total; i++) { + var url = urlList[i]; + errorContent += '<a href="' + url.src + '" data-type="' + url.type + '"><span>' + _mejs2.default.i18n.t('mejs.download-file') + ': ' + url.src + '</span></a>'; + } + } - if (mejs.MediaFeatures.hasTouch) { + errorContainer.innerHTML = errorContent; - // for touch devices (iOS, Android) - // show/hide without animation on touch + t.mediaElement.originalNode.parentNode.insertBefore(errorContainer, t.mediaElement.originalNode); + t.mediaElement.originalNode.style.display = 'none'; + error = true; + }; - t.$media.bind('touchstart', function() { + var props = _mejs2.default.html5media.properties, + methods = _mejs2.default.html5media.methods, + addProperty = function addProperty(obj, name, onGet, onSet) { + // wrapper functions + var oldValue = obj[name]; + var getFn = function getFn() { + return onGet.apply(obj, [oldValue]); + }, + setFn = function setFn(newValue) { + oldValue = onSet.apply(obj, [newValue]); + return oldValue; + }; - // toggle controls - if (t.controlsAreVisible) { - t.hideControls(false); - } else { - if (t.controlsEnabled) { - t.showControls(false); - } - } - }); + Object.defineProperty(obj, name, { + get: getFn, + set: setFn + }); + }, + assignGettersSetters = function assignGettersSetters(propName) { + if (propName !== 'src') { + (function () { + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1), + getFn = function getFn() { + return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer['get' + capName]() : null; + }, + setFn = function setFn(value) { + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null) { + t.mediaElement.renderer['set' + capName](value); + } + }; - } else { + addProperty(t.mediaElement, propName, getFn, setFn); + t.mediaElement['get' + capName] = getFn; + t.mediaElement['set' + capName] = setFn; + })(); + } + }, + + // `src` is a property separated from the others since it carries the logic to set the proper renderer + // based on the media files detected + getSrc = function getSrc() { + return t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null ? t.mediaElement.renderer.getSrc() : null; + }, + setSrc = function setSrc(value) { + + var mediaFiles = []; + + // clean up URLs + if (typeof value === 'string') { + mediaFiles.push({ + src: value, + type: value ? (0, _media.getTypeFromFile)(value) : '' + }); + } else { + for (var i = 0, total = value.length; i < total; i++) { - // create callback here since it needs access to current - // MediaElement object - t.clickToPlayPauseCallback = function() { - // + var src = (0, _media.absolutizeUrl)(value[i].src), + type = value[i].type; - if (t.options.clickToPlayPause) { - if (t.media.paused) { - t.play(); - } else { - t.pause(); - } - } - }; + mediaFiles.push({ + src: src, + type: (type === '' || type === null || type === undefined) && src ? (0, _media.getTypeFromFile)(src) : type + }); + } + } - // click to play/pause - t.media.addEventListener('click', t.clickToPlayPauseCallback, false); + // find a renderer and URL match + var renderInfo = _renderer.renderer.select(mediaFiles, t.mediaElement.options.renderers.length ? t.mediaElement.options.renderers : []), + event = void 0; - // show/hide controls - t.container - .bind('mouseenter mouseover', function () { - if (t.controlsEnabled) { - if (!t.options.alwaysShowControls ) { - t.killControlsTimer('enter'); - t.showControls(); - t.startControlsTimer(2500); - } - } - }) - .bind('mousemove', function() { - if (t.controlsEnabled) { - if (!t.controlsAreVisible) { - t.showControls(); - } - if (!t.options.alwaysShowControls) { - t.startControlsTimer(2500); - } - } - }) - .bind('mouseleave', function () { - if (t.controlsEnabled) { - if (!t.media.paused && !t.options.alwaysShowControls) { - t.startControlsTimer(1000); - } - } - }); - } + // Ensure that the original gets the first source found + if (!t.mediaElement.paused) { + t.mediaElement.pause(); + event = (0, _general.createEvent)('pause', t.mediaElement); + t.mediaElement.dispatchEvent(event); + } - if(t.options.hideVideoControlsOnLoad) { - t.hideControls(false); - } + t.mediaElement.originalNode.setAttribute('src', mediaFiles[0].src || ''); - // check for autoplay - if (autoplay && !t.options.alwaysShowControls) { - t.hideControls(); - } + if (t.mediaElement.querySelector('.me_cannotplay')) { + t.mediaElement.querySelector('.me_cannotplay').remove(); + } - // resizer - if (t.options.enableAutosize) { - t.media.addEventListener('loadedmetadata', function(e) { - // if the <video height> was not set and the options.videoHeight was not set - // then resize to the real dimensions - if (t.options.videoHeight <= 0 && t.domNode.getAttribute('height') === null && !isNaN(e.target.videoHeight)) { - t.setPlayerSize(e.target.videoWidth, e.target.videoHeight); - t.setControlsSize(); - t.media.setVideoSize(e.target.videoWidth, e.target.videoHeight); - } - }, false); - } + // did we find a renderer? + if (renderInfo === null) { + t.mediaElement.createErrorMessage(mediaFiles); + event = (0, _general.createEvent)('error', t.mediaElement); + event.message = 'No renderer found'; + t.mediaElement.dispatchEvent(event); + return; + } + + // turn on the renderer (this checks for the existing renderer already) + t.mediaElement.changeRenderer(renderInfo.rendererName, mediaFiles); + + if (t.mediaElement.renderer === undefined || t.mediaElement.renderer === null) { + event = (0, _general.createEvent)('error', t.mediaElement); + event.message = 'Error creating renderer'; + t.mediaElement.dispatchEvent(event); + t.mediaElement.createErrorMessage(mediaFiles); + return; + } + }, + assignMethods = function assignMethods(methodName) { + // run the method on the current renderer + t.mediaElement[methodName] = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (t.mediaElement.renderer !== undefined && t.mediaElement.renderer !== null && typeof t.mediaElement.renderer[methodName] === 'function') { + try { + t.mediaElement.renderer[methodName](args); + } catch (e) { + t.mediaElement.createErrorMessage(); } + } + return null; + }; + }; - // EVENTS + // Assign all methods/properties/events to fake node if renderer was found + addProperty(t.mediaElement, 'src', getSrc, setSrc); + t.mediaElement.getSrc = getSrc; + t.mediaElement.setSrc = setSrc; - // FOCUS: when a video starts playing, it takes focus from other players (possibily pausing them) - media.addEventListener('play', function() { - var playerIndex; + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } - // go through all other players - for (playerIndex in mejs.players) { - var p = mejs.players[playerIndex]; - if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) { - p.pause(); - } - p.hasFocus = false; - } + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } - t.hasFocus = true; - },false); + // IE && iOS + t.mediaElement.events = {}; + // start: fake events + t.mediaElement.addEventListener = function (eventName, callback) { + // create or find the array of callbacks for this eventName + t.mediaElement.events[eventName] = t.mediaElement.events[eventName] || []; - // ended for all - t.media.addEventListener('ended', function (e) { - if(t.options.autoRewind) { - try{ - t.media.setCurrentTime(0); - } catch (exp) { + // push the callback into the stack + t.mediaElement.events[eventName].push(callback); + }; + t.mediaElement.removeEventListener = function (eventName, callback) { + // no eventName means remove all listeners + if (!eventName) { + t.mediaElement.events = {}; + return true; + } - } - } - t.media.pause(); + // see if we have any callbacks for this eventName + var callbacks = t.mediaElement.events[eventName]; - if (t.setProgressRail) { - t.setProgressRail(); - } - if (t.setCurrentRail) { - t.setCurrentRail(); - } + if (!callbacks) { + return true; + } - if (t.options.loop) { - t.play(); - } else if (!t.options.alwaysShowControls && t.controlsEnabled) { - t.showControls(); - } - }, false); + // check for a specific callback + if (!callback) { + t.mediaElement.events[eventName] = []; + return true; + } - // resize on the first play - t.media.addEventListener('loadedmetadata', function(e) { - if (t.updateDuration) { - t.updateDuration(); - } - if (t.updateCurrent) { - t.updateCurrent(); - } + // remove the specific callback + for (var _i2 = 0; _i2 < callbacks.length; _i2++) { + if (callbacks[_i2] === callback) { + t.mediaElement.events[eventName].splice(_i2, 1); + return true; + } + } + return false; + }; - if (!t.isFullScreen) { - t.setPlayerSize(t.width, t.height); - t.setControlsSize(); - } - }, false); + /** + * + * @param {Event} event + */ + t.mediaElement.dispatchEvent = function (event) { + var callbacks = t.mediaElement.events[event.type]; - // webkit has trouble doing this without a delay - setTimeout(function () { - t.setPlayerSize(t.width, t.height); - t.setControlsSize(); - }, 50); + if (callbacks) { + for (var _i3 = 0; _i3 < callbacks.length; _i3++) { + callbacks[_i3].apply(null, [event]); + } + } + }; - // adjust controls whenever window sizes (used to be in fullscreen only) - t.globalBind('resize', function() { + if (t.mediaElement.originalNode !== null) { + var mediaFiles = []; - // don't resize for fullscreen mode - if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) { - t.setPlayerSize(t.width, t.height); - } + switch (t.mediaElement.originalNode.nodeName.toLowerCase()) { - // always adjust controls - t.setControlsSize(); + case 'iframe': + mediaFiles.push({ + type: '', + src: t.mediaElement.originalNode.getAttribute('src') }); - // TEMP: needs to be moved somewhere else - if (t.media.pluginType == 'youtube' && t.options.autoplay) { - //LOK-Soft: added t.options.autoplay to if -- I can only guess this is for hiding play button when autoplaying youtube, general hiding play button layer causes missing button on player load - t.container.find('.mejs-overlay-play').hide(); + break; + + case 'audio': + case 'video': + var n = void 0, + src = void 0, + type = void 0, + sources = t.mediaElement.originalNode.childNodes.length, + nodeSource = t.mediaElement.originalNode.getAttribute('src'); + + // Consider if node contains the `src` and `type` attributes + if (nodeSource) { + var node = t.mediaElement.originalNode; + mediaFiles.push({ + type: (0, _media.formatType)(nodeSource, node.getAttribute('type')), + src: nodeSource + }); } - } - // force autoplay for HTML5 - if (autoplay && media.pluginType == 'native') { - t.play(); - } + // test <source> types to see if they are usable + for (var _i4 = 0; _i4 < sources; _i4++) { + n = t.mediaElement.originalNode.childNodes[_i4]; + if (n.nodeType === Node.ELEMENT_NODE && n.tagName.toLowerCase() === 'source') { + src = n.getAttribute('src'); + type = (0, _media.formatType)(src, n.getAttribute('type')); + mediaFiles.push({ type: type, src: src }); + } + } + break; + } + if (mediaFiles.length > 0) { + t.mediaElement.src = mediaFiles; + } + } - if (t.options.success) { + if (t.mediaElement.options.success) { + t.mediaElement.options.success(t.mediaElement, t.mediaElement.originalNode); + } - if (typeof t.options.success == 'string') { - window[t.options.success](t.media, t.domNode, t); - } else { - t.options.success(t.media, t.domNode, t); - } - } - }, + if (error && t.mediaElement.options.error) { + t.mediaElement.options.error(t.mediaElement, t.mediaElement.originalNode); + } - handleError: function(e) { - var t = this; + return t.mediaElement; +}; - t.controls.hide(); +_window2.default.MediaElement = MediaElement; - // Tell user that the file cannot be played - if (t.options.error) { - t.options.error(e); - } - }, +exports.default = MediaElement; - setPlayerSize: function(width,height) { - var t = this; +},{"2":2,"21":21,"22":22,"3":3,"6":6,"7":7}],6:[function(_dereq_,module,exports){ +'use strict'; - if( !t.options.setDimensions ) { - return false; - } +Object.defineProperty(exports, "__esModule", { + value: true +}); - if (typeof width != 'undefined') { - t.width = width; - } +var _window = _dereq_(3); - if (typeof height != 'undefined') { - t.height = height; - } +var _window2 = _interopRequireDefault(_window); - // detect 100% mode - use currentStyle for IE since css() doesn't return percentages - if (t.height.toString().indexOf('%') > 0 || t.$node.css('max-width') === '100%' || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%')) { +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // do we have the native dimensions yet? - var nativeWidth = (function() { - if (t.isVideo) { - if (t.media.videoWidth && t.media.videoWidth > 0) { - return t.media.videoWidth; - } else if (t.media.getAttribute('width') !== null) { - return t.media.getAttribute('width'); - } else { - return t.options.defaultVideoWidth; - } - } else { - return t.options.defaultAudioWidth; - } - })(); +// Namespace +var mejs = {}; - var nativeHeight = (function() { - if (t.isVideo) { - if (t.media.videoHeight && t.media.videoHeight > 0) { - return t.media.videoHeight; - } else if (t.media.getAttribute('height') !== null) { - return t.media.getAttribute('height'); - } else { - return t.options.defaultVideoHeight; - } - } else { - return t.options.defaultAudioHeight; - } - })(); +// version number +mejs.version = '4.0.2'; - var - parentWidth = t.container.parent().closest(':visible').width(), - parentHeight = t.container.parent().closest(':visible').height(), - newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight; +// Basic HTML5 settings +mejs.html5media = { + /** + * @type {String[]} + */ + properties: [ + // GET/SET + 'volume', 'src', 'currentTime', 'muted', - // When we use percent, the newHeight can't be calculated so we get the container height - if(isNaN(newHeight) || ( parentHeight != 0 && newHeight > parentHeight )) { - newHeight = parentHeight; - } + // GET only + 'duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable', - if (t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) { - parentWidth = $(window).width(); - newHeight = $(window).height(); - } + // OTHERS + 'currentSrc', 'preload', 'bufferedBytes', 'bufferedTime', 'initialTime', 'startOffsetTime', 'defaultPlaybackRate', 'playbackRate', 'played', 'autoplay', 'loop', 'controls'], + readOnlyProperties: ['duration', 'paused', 'ended', 'buffered', 'error', 'networkState', 'readyState', 'seeking', 'seekable'], + /** + * @type {String[]} + */ + methods: ['load', 'play', 'pause', 'canPlayType'], + /** + * @type {String[]} + */ + events: ['loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange'], + /** + * @type {String[]} + */ + mediaTypes: ['audio/mp3', 'audio/ogg', 'audio/oga', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav', 'audio/mpeg', 'audio/mp4', 'video/mp4', 'video/webm', 'video/ogg'] +}; - if ( newHeight != 0 && parentWidth != 0 ) { - // set outer container size - t.container - .width(parentWidth) - .height(newHeight); +_window2.default.mejs = mejs; - // set native <video> or <audio> and shims - t.$media.add(t.container.find('.mejs-shim')) - .width('100%') - .height('100%'); +exports.default = mejs; - // if shim is ready, send the size to the embeded plugin - if (t.isVideo) { - if (t.media.setVideoSize) { - t.media.setVideoSize(parentWidth, newHeight); - } - } +},{"3":3}],7:[function(_dereq_,module,exports){ +'use strict'; - // set the layers - t.layers.children('.mejs-layer') - .width('100%') - .height('100%'); - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.renderer = undefined; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - } else { +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - t.container - .width(t.width) - .height(t.height); +var _mejs = _dereq_(6); - t.layers.children('.mejs-layer') - .width(t.width) - .height(t.height); +var _mejs2 = _interopRequireDefault(_mejs); - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // special case for big play button so it doesn't go over the controls area - var playLayer = t.layers.find('.mejs-overlay-play'), - playButton = playLayer.find('.mejs-overlay-button'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - playLayer.height(t.container.height() - t.controls.height()); - playButton.css('margin-top', '-' + (playButton.height()/2 - t.controls.height()/2).toString() + 'px' ); +/** + * + * Class to manage renderer selection and addition. + * @class Renderer + */ +var Renderer = function () { + function Renderer() { + _classCallCheck(this, Renderer); - }, + this.renderers = {}; + this.order = []; + } - setControlsSize: function() { - var t = this, - usedWidth = 0, - railWidth = 0, - rail = t.controls.find('.mejs-time-rail'), - total = t.controls.find('.mejs-time-total'), - current = t.controls.find('.mejs-time-current'), - loaded = t.controls.find('.mejs-time-loaded'), - others = rail.siblings(), - lastControl = others.last(), - lastControlPosition = null; + /** + * Register a new renderer. + * + * @param {Object} renderer - An object with all the rendered information (name REQUIRED) + * @method add + */ - // skip calculation if hidden - if (!t.container.is(':visible') || !rail.length || !rail.is(':visible')) { - return; - } + _createClass(Renderer, [{ + key: 'add', + value: function add(renderer) { - // allow the size to come from custom CSS - if (t.options && !t.options.autosizeProgress) { - // Also, frontends devs can be more flexible - // due the opportunity of absolute positioning. - railWidth = parseInt(rail.css('width')); + if (renderer.name === undefined) { + throw new TypeError('renderer must contain at least `name` property'); } - // attempt to autosize - if (railWidth === 0 || !railWidth) { + this.renderers[renderer.name] = renderer; + this.order.push(renderer.name); + } - // find the size of all the other controls besides the rail - others.each(function() { - var $this = $(this); - if ($this.css('position') != 'absolute' && $this.is(':visible')) { - usedWidth += $(this).outerWidth(true); - } - }); + /** + * Iterate a list of renderers to determine which one should the player use. + * + * @param {Object[]} mediaFiles - A list of source and type obtained from video/audio/source tags: [{src:'',type:''}] + * @param {?String[]} renderers - Optional list of pre-selected renderers + * @return {?Object} The renderer's name and source selected + * @method select + */ + + }, { + key: 'select', + value: function select(mediaFiles) { + var renderers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + + + var renderersLength = renderers.length; + + renderers = renderers.length ? renderers : this.order; + + // If renderers are not set, set a default order: + // 1) Native renderers (HTML5, HLS, M(PEG)-DASH, FLV) + // 2) Flash shims (RTMP, FLV, HLS, M(PEG)-DASH, MP3, OGG) + // 3) Iframe renderers (YouTube, SoundCloud, Facebook. etc.) + if (!renderersLength) { + (function () { + var rendererIndicator = [/^(html5|native)/, /^flash/, /iframe$/], + rendererRanking = function rendererRanking(renderer) { + for (var i = 0, total = rendererIndicator.length; i < total; i++) { + if (renderer.match(rendererIndicator[i]) !== null) { + return i; + } + } + return rendererIndicator.length; + }; - // fit the rail into the remaining space - railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width()); + renderers.sort(function (a, b) { + return rendererRanking(a) - rendererRanking(b); + }); + })(); } - // resize the rail, - // but then check if the last control (say, the fullscreen button) got pushed down - // this often happens when zoomed - do { - // outer area - rail.width(railWidth); - // dark space - total.width(railWidth - (total.outerWidth(true) - total.width())); + for (var i = 0, total = renderers.length; i < total; i++) { + var key = renderers[i], + _renderer = this.renderers[key]; - if (lastControl.css('position') != 'absolute') { - lastControlPosition = lastControl.position(); - railWidth--; + if (_renderer !== null && _renderer !== undefined) { + for (var j = 0, jl = mediaFiles.length; j < jl; j++) { + if (typeof _renderer.canPlayType === 'function' && typeof mediaFiles[j].type === 'string' && _renderer.canPlayType(mediaFiles[j].type)) { + return { + rendererName: _renderer.name, + src: mediaFiles[j].src + }; + } + } } - } while (lastControlPosition != null && lastControlPosition.top > 0 && railWidth > 0); - - if (t.setProgressRail) - t.setProgressRail(); - if (t.setCurrentRail) - t.setCurrentRail(); - }, + } + return null; + } - buildposter: function(player, controls, layers, media) { - var t = this, - poster = - $('<div class="mejs-poster mejs-layer">' + - '</div>') - .appendTo(layers), - posterUrl = player.$media.attr('poster'); + // Setters/getters - // prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster) - if (player.options.poster !== '') { - posterUrl = player.options.poster; - } + }, { + key: 'order', + set: function set(order) { - // second, try the real poster - if (posterUrl !== '' && posterUrl != null) { - t.setPoster(posterUrl); - } else { - poster.hide(); + if (!Array.isArray(order)) { + throw new TypeError('order must be an array of strings.'); } - media.addEventListener('play',function() { - poster.hide(); - }, false); + this._order = order; + }, + get: function get() { + return this._order; + } + }, { + key: 'renderers', + set: function set(renderers) { - if(player.options.showPosterWhenEnded && player.options.autoRewind){ - media.addEventListener('ended',function() { - poster.show(); - }, false); + if (renderers !== null && (typeof renderers === 'undefined' ? 'undefined' : _typeof(renderers)) !== 'object') { + throw new TypeError('renderers must be an array of objects.'); } + + this._renderers = renderers; }, + get: function get() { + return this._renderers; + } + }]); - setPoster: function(url) { - var t = this, - posterDiv = t.container.find('.mejs-poster'), - posterImg = posterDiv.find('img'); + return Renderer; +}(); - if (posterImg.length == 0) { - posterImg = $('<img width="100%" height="100%" />').appendTo(posterDiv); - } +var renderer = exports.renderer = new Renderer(); - posterImg.attr('src', url); - posterDiv.css({'background-image' : 'url(' + url + ')'}); - }, +_mejs2.default.Renderers = renderer; - buildoverlays: function(player, controls, layers, media) { - var t = this; - if (!player.isVideo) - return; +},{"6":6}],8:[function(_dereq_,module,exports){ +'use strict'; - var - loading = - $('<div class="mejs-overlay mejs-layer">'+ - '<div class="mejs-overlay-loading"><span></span></div>'+ - '</div>') - .hide() // start out hidden - .appendTo(layers), - error = - $('<div class="mejs-overlay mejs-layer">'+ - '<div class="mejs-overlay-error"></div>'+ - '</div>') - .hide() // start out hidden - .appendTo(layers), - // this needs to come last so it's on top - bigPlay = - $('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+ - '<div class="mejs-overlay-button"></div>'+ - '</div>') - .appendTo(layers) - .bind('click', function() { // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay started and immediately stopped the video - if (t.options.clickToPlayPause) { - if (media.paused) { - media.play(); - } - } - }); +var _window = _dereq_(3); - /* - if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) { - bigPlay.remove(); - loading.remove(); - } - */ +var _window2 = _interopRequireDefault(_window); +var _document = _dereq_(2); - // show/hide big play button - media.addEventListener('play',function() { - bigPlay.hide(); - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - error.hide(); - }, false); - - media.addEventListener('playing', function() { - bigPlay.hide(); - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - error.hide(); - }, false); - - media.addEventListener('seeking', function() { - loading.show(); - controls.find('.mejs-time-buffering').show(); - }, false); - - media.addEventListener('seeked', function() { - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - }, false); - - media.addEventListener('pause',function() { - if (!mejs.MediaFeatures.isiPhone) { - bigPlay.show(); - } - }, false); - - media.addEventListener('waiting', function() { - loading.show(); - controls.find('.mejs-time-buffering').show(); - }, false); +var _document2 = _interopRequireDefault(_document); +var _i18n = _dereq_(4); - // show/hide loading - media.addEventListener('loadeddata',function() { - // for some reason Chrome is firing this event - //if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none') - // return; - - loading.show(); - controls.find('.mejs-time-buffering').show(); - }, false); - media.addEventListener('canplay',function() { - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - }, false); +var _i18n2 = _interopRequireDefault(_i18n); - // error handling - media.addEventListener('error',function() { - loading.hide(); - controls.find('.mejs-time-buffering').hide(); - error.show(); - error.find('mejs-overlay-error').html("Error loading this resource"); - }, false); - - media.addEventListener('keydown', function(e) { - t.onkeydown(player, media, e); - }, false); - }, +var _player = _dereq_(16); - buildkeyboard: function(player, controls, layers, media) { +var _player2 = _interopRequireDefault(_player); - var t = this; +var _constants = _dereq_(19); - // listen for key presses - t.globalBind('keydown', function(e) { - return t.onkeydown(player, media, e); - }); +var Features = _interopRequireWildcard(_constants); - // check if someone clicked outside a player region, then kill its focus - t.globalBind('click', function(event) { - player.hasFocus = $(event.target).closest('.mejs-container').length != 0; - }); +var _general = _dereq_(21); - }, - onkeydown: function(player, media, e) { - if (player.hasFocus && player.options.enableKeyboard) { - // find a matching key - for (var i = 0, il = player.options.keyActions.length; i < il; i++) { - var keyAction = player.options.keyActions[i]; +var _dom = _dereq_(20); - for (var j = 0, jl = keyAction.keys.length; j < jl; j++) { - if (e.keyCode == keyAction.keys[j]) { - if (typeof(e.preventDefault) == "function") e.preventDefault(); - keyAction.action(player, media, e.keyCode); - return false; - } - } - } - } +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; } } - return true; - }, +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - findTracks: function() { - var t = this, - tracktags = t.$media.find('track'); +/** + * Fullscreen button + * + * This feature creates a button to toggle fullscreen on video; it considers a letiety of possibilities when dealing with it + * since it is not consistent across browsers. It also accounts for triggering the event through Flash shim. + */ - // store for use by plugins - t.tracks = []; - tracktags.each(function(index, track) { +// Feature configuration +Object.assign(_player.config, { + /** + * @type {Boolean} + */ + usePluginFullScreen: true, + /** + * @type {?String} + */ + fullscreenText: null +}); + +Object.assign(_player2.default.prototype, { + + /** + * @type {Boolean} + */ + isFullScreen: false, + /** + * @type {Boolean} + */ + isNativeFullScreen: false, + /** + * @type {Boolean} + */ + isInIframe: false, + /** + * @type {Boolean} + */ + isPluginClickThroughCreated: false, + /** + * Possible modes + * (1) 'native-native' HTML5 video + browser fullscreen (IE10+, etc.) + * (2) 'plugin-native' plugin video + browser fullscreen (fails in some versions of Firefox) + * (3) 'fullwindow' Full window (retains all UI) + * + * @type {String} + */ + fullscreenMode: '', + /** + * + */ + containerSizeTimeout: null, + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildfullscreen: function buildfullscreen(player, controls, layers, media) { + + if (!player.isVideo) { + return; + } - track = $(track); + player.isInIframe = _window2.default.location !== _window2.default.parent.location; - t.tracks.push({ - srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '', - src: track.attr('src'), - kind: track.attr('kind'), - label: track.attr('label') || '', - entries: [], - isLoaded: false - }); - }); - }, - changeSkin: function(className) { - this.container[0].className = 'mejs-container ' + className; - this.setPlayerSize(this.width, this.height); - this.setControlsSize(); - }, - play: function() { - this.load(); - this.media.play(); - }, - pause: function() { - try { - this.media.pause(); - } catch (e) {} - }, - load: function() { - if (!this.isLoaded) { - this.media.load(); - } + // detect on start + media.addEventListener('loadstart', function () { + player.detectFullscreenMode(); + }); - this.isLoaded = true; - }, - setMuted: function(muted) { - this.media.setMuted(muted); - }, - setCurrentTime: function(time) { - this.media.setCurrentTime(time); - }, - getCurrentTime: function() { - return this.media.currentTime; - }, - setVolume: function(volume) { - this.media.setVolume(volume); - }, - getVolume: function() { - return this.media.volume; - }, - setSrc: function(src) { - this.media.setSrc(src); - }, - remove: function() { - var t = this, featureIndex, feature; + var t = this, + fullscreenTitle = (0, _general.isString)(t.options.fullscreenText) ? t.options.fullscreenText : _i18n2.default.t('mejs.fullscreen'), + fullscreenBtn = _document2.default.createElement('div'); - // invoke features cleanup - for (featureIndex in t.options.features) { - feature = t.options.features[featureIndex]; - if (t['clean' + feature]) { - try { - t['clean' + feature](t); - } catch (e) { - // TODO: report control error - //throw e; - // - // - } - } - } + fullscreenBtn.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'fullscreen-button'; + fullscreenBtn.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + fullscreenTitle + '" aria-label="' + fullscreenTitle + '" tabindex="0"></button>'; + t.addControlElement(fullscreenBtn, 'fullscreen'); - // grab video and put it back in place - if (!t.isDynamic) { - t.$media.prop('controls', true); - // detach events from the video - // TODO: detach event listeners better than this; - // also detach ONLY the events attached by this plugin! - t.$node.clone().insertBefore(t.container).show(); - t.$node.remove(); + fullscreenBtn.addEventListener('click', function () { + // toggle fullscreen + var isFullScreen = Features.HAS_TRUE_NATIVE_FULLSCREEN && Features.IS_FULLSCREEN || player.isFullScreen; + + if (isFullScreen) { + player.exitFullScreen(); } else { - t.$node.insertBefore(t.container); + player.enterFullScreen(); } + }); + + player.fullscreenBtn = fullscreenBtn; - if (t.media.pluginType !== 'native') { - t.media.remove(); + t.globalBind('keydown', function (e) { + var key = e.which || e.keyCode || 0; + if (key === 27 && (Features.HAS_TRUE_NATIVE_FULLSCREEN && Features.IS_FULLSCREEN || t.isFullScreen)) { + player.exitFullScreen(); } + }); - // Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api. - delete mejs.players[t.id]; + t.normalHeight = 0; + t.normalWidth = 0; - if (typeof t.container == 'object') { - t.container.remove(); - } - t.globalUnbind(); - delete t.node.player; + // setup native fullscreen event + if (Features.HAS_TRUE_NATIVE_FULLSCREEN) { + + // + /** + * Detect any changes on fullscreen + * + * Chrome doesn't always fire this in an `<iframe>` + * @private + */ + var fullscreenChanged = function fullscreenChanged() { + if (player.isFullScreen) { + if (Features.isFullScreen()) { + player.isNativeFullScreen = true; + // reset the controls once we are fully in full screen + player.setControlsSize(); + } else { + player.isNativeFullScreen = false; + // when a user presses ESC + // make sure to put the player back into place + player.exitFullScreen(); + } + } + }; + + player.globalBind(Features.FULLSCREEN_EVENT_NAME, fullscreenChanged); } - }; + }, - (function(){ - var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/; - function splitEvents(events, id) { - // add player ID as an event namespace so it's easier to unbind them all later - var ret = {d: [], w: []}; - $.each((events || '').split(' '), function(k, v){ - var eventname = v + '.' + id; - if (eventname.indexOf('.') === 0) { - ret.d.push(eventname); - ret.w.push(eventname); - } - else { - ret[rwindow.test(v) ? 'w' : 'd'].push(eventname); - } - }); - ret.d = ret.d.join(' '); - ret.w = ret.w.join(' '); - return ret; + /** + * Detect the type of fullscreen based on browser's capabilities + * + * @return {String} + */ + detectFullscreenMode: function detectFullscreenMode() { + + var t = this, + isNative = t.media.rendererName !== null && t.media.rendererName.match(/(native|html5)/) !== null; + + var mode = ''; + + if (Features.HAS_TRUE_NATIVE_FULLSCREEN && isNative) { + mode = 'native-native'; + } else if (Features.HAS_TRUE_NATIVE_FULLSCREEN && !isNative) { + mode = 'plugin-native'; + } else if (t.usePluginFullScreen && Features.SUPPORT_POINTER_EVENTS) { + mode = 'plugin-click'; + } else { + mode = 'fullwindow'; } - mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) { - var t = this; - events = splitEvents(events, t.id); - if (events.d) $(document).bind(events.d, data, callback); - if (events.w) $(window).bind(events.w, data, callback); - }; + t.fullscreenMode = mode; + return mode; + }, - mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) { - var t = this; - events = splitEvents(events, t.id); - if (events.d) $(document).unbind(events.d, callback); - if (events.w) $(window).unbind(events.w, callback); - }; - })(); - // turn into jQuery plugin - if (typeof $ != 'undefined') { - $.fn.mediaelementplayer = function (options) { - if (options === false) { - this.each(function () { - var player = $(this).data('mediaelementplayer'); - if (player) { - player.remove(); - } - $(this).removeData('mediaelementplayer'); - }); + /** + * Feature destructor. + * + * Always has to be prefixed with `clean` and the name that was used in features list + * @param {MediaElementPlayer} player + */ + cleanfullscreen: function cleanfullscreen(player) { + player.exitFullScreen(); + }, + + + /** + * + */ + enterFullScreen: function enterFullScreen() { + + var t = this, + isNative = t.media.rendererName !== null && t.media.rendererName.match(/(html5|native)/) !== null, + containerStyles = getComputedStyle(t.container); + + if (Features.IS_IOS && Features.HAS_IOS_FULLSCREEN && typeof t.media.webkitEnterFullscreen === 'function') { + t.media.webkitEnterFullscreen(); + return; + } + + // set it to not show scroll bars so 100% will work + (0, _dom.addClass)(_document2.default.documentElement, t.options.classPrefix + 'fullscreen'); + (0, _dom.addClass)(t.container, t.options.classPrefix + 'container-fullscreen'); + + // store sizing + t.normalHeight = parseFloat(containerStyles.height); + t.normalWidth = parseFloat(containerStyles.width); + + // attempt to do true fullscreen + if (t.fullscreenMode === 'native-native' || t.fullscreenMode === 'plugin-native') { + + Features.requestFullScreen(t.container); + + if (t.isInIframe) { + // sometimes exiting from fullscreen doesn't work + // notably in Chrome <iframe>. Fixed in version 17 + setTimeout(function checkFullscreen() { + + if (t.isNativeFullScreen) { + var percentErrorMargin = 0.002, + // 0.2% + windowWidth = _window2.default.innerWidth || _document2.default.documentElement.clientWidth || _document2.default.body.clientWidth, + screenWidth = screen.width, + absDiff = Math.abs(screenWidth - windowWidth), + marginError = screenWidth * percentErrorMargin; + + // check if the video is suddenly not really fullscreen + if (absDiff > marginError) { + // manually exit + t.exitFullScreen(); + } else { + // test again + setTimeout(checkFullscreen, 500); + } + } + }, 1000); } - else { - this.each(function () { - $(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options)); - }); + } else if (t.fullscreeMode === 'fullwindow') {} + // move into position + + // make full size + t.container.style.width = '100%'; + t.container.style.height = '100%'; + + // Only needed for safari 5.1 native full screen, can cause display issues elsewhere + // Actually, it seems to be needed for IE8, too + t.containerSizeTimeout = setTimeout(function () { + t.container.style.width = '100%'; + t.container.style.height = '100%'; + t.setControlsSize(); + }, 500); + + if (isNative) { + t.node.style.width = '100%'; + t.node.style.height = '100%'; + } else { + var elements = t.container.querySelectorAll('iframe, embed, object, video'), + _total = elements.length; + for (var i = 0; i < _total; i++) { + elements[i].style.width = '100%'; + elements[i].style.height = '100%'; } - return this; - }; + } + if (t.options.setDimensions && typeof t.media.setSize === 'function') { + t.media.setSize(screen.width, screen.height); + } - $(document).ready(function() { - // auto enable using JSON attribute - $('.mejs-player').mediaelementplayer(); - }); - } + var layers = t.layers.childNodes, + total = layers.length; + for (var _i = 0; _i < total; _i++) { + layers[_i].style.width = '100%'; + layers[_i].style.height = '100%'; + } - // push out to window - window.MediaElementPlayer = mejs.MediaElementPlayer; + if (t.fullscreenBtn) { + (0, _dom.removeClass)(t.fullscreenBtn, t.options.classPrefix + 'fullscreen'); + (0, _dom.addClass)(t.fullscreenBtn, t.options.classPrefix + 'unfullscreen'); + } -})(mejs.$); + t.setControlsSize(); + t.isFullScreen = true; -(function($) { + var zoomFactor = Math.min(screen.width / t.width, screen.height / t.height), + captionText = t.container.querySelector('.' + t.options.classPrefix + 'captions-text'); + if (captionText) { + captionText.style.fontSize = zoomFactor * 100 + '%'; + captionText.style.lineHeight = 'normal'; + t.container.querySelector('.' + t.options.classPrefix + 'captions-position').style.bottom = '45px'; + } + var event = (0, _general.createEvent)('enteredfullscreen', t.container); + t.container.dispatchEvent(event); + }, - $.extend(mejs.MepDefaults, { - playpauseText: mejs.i18n.t('Play/Pause') - }); - // PLAY/pause BUTTON - $.extend(MediaElementPlayer.prototype, { - buildplaypause: function(player, controls, layers, media) { - var - t = this, - play = - $('<div class="mejs-button mejs-playpause-button mejs-play" >' + - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.playpauseText + '" aria-label="' + t.options.playpauseText + '"></button>' + - '</div>') - .appendTo(controls) - .click(function(e) { - e.preventDefault(); - - if (media.paused) { - media.play(); - } else { - media.pause(); - } - - return false; - }); + /** + * + */ + exitFullScreen: function exitFullScreen() { - media.addEventListener('play',function() { - play.removeClass('mejs-play').addClass('mejs-pause'); - }, false); - media.addEventListener('playing',function() { - play.removeClass('mejs-play').addClass('mejs-pause'); - }, false); + var t = this, + isNative = t.media.rendererName !== null && t.media.rendererName.match(/(native|html5)/) !== null; + // Prevent container from attempting to stretch a second time + clearTimeout(t.containerSizeTimeout); - media.addEventListener('pause',function() { - play.removeClass('mejs-pause').addClass('mejs-play'); - }, false); - media.addEventListener('paused',function() { - play.removeClass('mejs-pause').addClass('mejs-play'); - }, false); + // come out of native fullscreen + if (Features.HAS_TRUE_NATIVE_FULLSCREEN && (Features.IS_FULLSCREEN || t.isFullScreen)) { + Features.cancelFullScreen(); } - }); - -})(mejs.$); -(function($) { + // restore scroll bars to document + (0, _dom.removeClass)(_document2.default.documentElement, t.options.classPrefix + 'fullscreen'); + (0, _dom.removeClass)(t.container, t.options.classPrefix + 'container-fullscreen'); - $.extend(mejs.MepDefaults, { - stopText: 'Stop' - }); + if (t.options.setDimensions) { + t.container.style.width = t.normalWidth + 'px'; + t.container.style.height = t.normalHeight + 'px'; - // STOP BUTTON - $.extend(MediaElementPlayer.prototype, { - buildstop: function(player, controls, layers, media) { - var t = this, - stop = - $('<div class="mejs-button mejs-stop-button mejs-stop">' + - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '" aria-label="' + t.options.stopText + '"></button>' + - '</div>') - .appendTo(controls) - .click(function() { - if (!media.paused) { - media.pause(); - } - if (media.currentTime > 0) { - media.setCurrentTime(0); - media.pause(); - controls.find('.mejs-time-current').width('0px'); - controls.find('.mejs-time-handle').css('left', '0px'); - controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0) ); - controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0) ); - layers.find('.mejs-poster').show(); - } - }); + if (isNative) { + t.node.style.width = t.normalWidth + 'px'; + t.node.style.height = t.normalHeight + 'px'; + } else { + var elements = t.container.querySelectorAll('iframe, embed, object, video'), + _total2 = elements.length; + for (var i = 0; i < _total2; i++) { + elements[i].style.width = t.normalWidth + 'px'; + elements[i].style.height = t.normalHeight + 'px'; + } + } + + if (typeof t.media.setSize === 'function') { + t.media.setSize(t.normalWidth, t.normalHeight); + } + + var layers = t.layers.childNodes, + total = layers.length; + for (var _i2 = 0; _i2 < total; _i2++) { + layers[_i2].style.width = t.normalWidth + 'px'; + layers[_i2].style.height = t.normalHeight + 'px'; + } } - }); - -})(mejs.$); - -(function($) { - // progress/loaded bar - $.extend(MediaElementPlayer.prototype, { - buildprogress: function(player, controls, layers, media) { - - $('<div class="mejs-time-rail">'+ - '<span class="mejs-time-total">'+ - '<span class="mejs-time-buffering"></span>'+ - '<span class="mejs-time-loaded"></span>'+ - '<span class="mejs-time-current"></span>'+ - '<span class="mejs-time-handle"></span>'+ - '<span class="mejs-time-float">' + - '<span class="mejs-time-float-current">00:00</span>' + - '<span class="mejs-time-float-corner"></span>' + - '</span>'+ - '</span>'+ - '</div>') - .appendTo(controls); - controls.find('.mejs-time-buffering').hide(); - - var - t = this, - total = controls.find('.mejs-time-total'), - loaded = controls.find('.mejs-time-loaded'), - current = controls.find('.mejs-time-current'), - handle = controls.find('.mejs-time-handle'), - timefloat = controls.find('.mejs-time-float'), - timefloatcurrent = controls.find('.mejs-time-float-current'), - handleMouseMove = function (e) { - // mouse or touch position relative to the object - if (e.originalEvent.changedTouches) { - var x = e.originalEvent.changedTouches[0].pageX; - }else{ - var x = e.pageX; - } - - var offset = total.offset(), - width = total.outerWidth(true), - percentage = 0, - newTime = 0, - pos = 0; - - - if (media.duration) { - if (x < offset.left) { - x = offset.left; - } else if (x > width + offset.left) { - x = width + offset.left; - } - - pos = x - offset.left; - percentage = (pos / width); - newTime = (percentage <= 0.02) ? 0 : percentage * media.duration; - // seek to where the mouse is - if (mouseIsDown && newTime !== media.currentTime) { - media.setCurrentTime(newTime); - } + (0, _dom.removeClass)(t.fullscreenBtn, t.options.classPrefix + 'unfullscreen'); + (0, _dom.addClass)(t.fullscreenBtn, t.options.classPrefix + 'fullscreen'); + + t.setControlsSize(); + t.isFullScreen = false; + + var captionText = t.container.querySelector('.' + t.options.classPrefix + 'captions-text'); + if (captionText) { + captionText.style.fontSize = ''; + captionText.style.lineHeight = ''; + t.container.querySelector('.' + t.options.classPrefix + 'captions-position').style.bottom = ''; + } + var event = (0, _general.createEvent)('exitedfullscreen', t.container); + t.container.dispatchEvent(event); + } +}); + +},{"16":16,"19":19,"2":2,"20":20,"21":21,"3":3,"4":4}],9:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _general = _dereq_(21); + +var _dom = _dereq_(20); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Play/Pause button + * + * This feature enables the displaying of a Play button in the control bar, and also contains logic to toggle its state + * between paused and playing. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * @type {?String} + */ + playText: null, + /** + * @type {?String} + */ + pauseText: null +}); + +Object.assign(_player2.default.prototype, { + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + * @public + */ + buildplaypause: function buildplaypause(player, controls, layers, media) { + + var t = this, + op = t.options, + playTitle = (0, _general.isString)(op.playText) ? op.playText : _i18n2.default.t('mejs.play'), + pauseTitle = (0, _general.isString)(op.pauseText) ? op.pauseText : _i18n2.default.t('mejs.pause'), + play = _document2.default.createElement('div'); + + play.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'playpause-button ' + t.options.classPrefix + 'play'; + play.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + playTitle + '" aria-label="' + pauseTitle + '" tabindex="0"></button>'; + play.addEventListener('click', function () { + if (media.paused) { + media.play(); + } else { + media.pause(); + } + }); + + var playBtn = play.querySelector('button'); + t.addControlElement(play, 'playpause'); + + /** + * @private + * @param {String} which - token to determine new state of button + */ + function togglePlayPause(which) { + if ('play' === which) { + (0, _dom.removeClass)(play, t.options.classPrefix + 'play'); + (0, _dom.removeClass)(play, t.options.classPrefix + 'replay'); + (0, _dom.addClass)(play, t.options.classPrefix + 'pause'); + playBtn.setAttribute('title', pauseTitle); + playBtn.setAttribute('aria-label', pauseTitle); + } else { + + (0, _dom.removeClass)(play, t.options.classPrefix + 'pause'); + (0, _dom.removeClass)(play, t.options.classPrefix + 'replay'); + (0, _dom.addClass)(play, t.options.classPrefix + 'play'); + playBtn.setAttribute('title', playTitle); + playBtn.setAttribute('aria-label', playTitle); + } + } + + togglePlayPause('pse'); + + media.addEventListener('loadedmetadata', function () { + togglePlayPause('pse'); + }); + + media.addEventListener('play', function () { + togglePlayPause('play'); + }); + media.addEventListener('playing', function () { + togglePlayPause('play'); + }); + + media.addEventListener('pause', function () { + togglePlayPause('pse'); + }); + media.addEventListener('paused', function () { + togglePlayPause('pse'); + }); + + media.addEventListener('ended', function () { + + if (!player.options.loop) { + (0, _dom.removeClass)(play, t.options.classPrefix + 'pause'); + (0, _dom.removeClass)(play, t.options.classPrefix + 'play'); + (0, _dom.addClass)(play, t.options.classPrefix + 'replay'); + playBtn.setAttribute('title', playTitle); + playBtn.setAttribute('aria-label', playTitle); + } + }); + } +}); + +},{"16":16,"2":2,"20":20,"21":21,"4":4}],10:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _constants = _dereq_(19); + +var _time = _dereq_(24); + +var _dom = _dereq_(20); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Progress/loaded bar + * + * This feature creates a progress bar with a slider in the control bar, and updates it based on native events. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * Enable tooltip that shows time in progress bar + * @type {Boolean} + */ + enableProgressTooltip: true +}); + +Object.assign(_player2.default.prototype, { + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildprogress: function buildprogress(player, controls, layers, media) { + + var lastKeyPressTime = 0, + mouseIsDown = false, + startedPaused = false; + + var t = this, + autoRewindInitial = player.options.autoRewind, + tooltip = player.options.enableProgressTooltip ? '<span class="' + t.options.classPrefix + 'time-float">' + ('<span class="' + t.options.classPrefix + 'time-float-current">00:00</span>') + ('<span class="' + t.options.classPrefix + 'time-float-corner"></span>') + '</span>' : "", + rail = _document2.default.createElement('div'); + + rail.className = t.options.classPrefix + 'time-rail'; + rail.innerHTML = '<span class="' + t.options.classPrefix + 'time-total ' + t.options.classPrefix + 'time-slider">' + ('<span class="' + t.options.classPrefix + 'time-buffering"></span>') + ('<span class="' + t.options.classPrefix + 'time-loaded"></span>') + ('<span class="' + t.options.classPrefix + 'time-current"></span>') + ('<span class="' + t.options.classPrefix + 'time-handle"></span>') + ('' + tooltip) + '</span>'; + + t.addControlElement(rail, 'progress'); + + controls.querySelector('.' + t.options.classPrefix + 'time-buffering').style.display = 'none'; + + t.rail = controls.querySelector('.' + t.options.classPrefix + 'time-rail'); + t.total = controls.querySelector('.' + t.options.classPrefix + 'time-total'); + t.loaded = controls.querySelector('.' + t.options.classPrefix + 'time-loaded'); + t.current = controls.querySelector('.' + t.options.classPrefix + 'time-current'); + t.handle = controls.querySelector('.' + t.options.classPrefix + 'time-handle'); + t.timefloat = controls.querySelector('.' + t.options.classPrefix + 'time-float'); + t.timefloatcurrent = controls.querySelector('.' + t.options.classPrefix + 'time-float-current'); + t.slider = controls.querySelector('.' + t.options.classPrefix + 'time-slider'); + t.newTime = 0; + t.forcedHandlePause = false; + + /** + * + * @private + * @param {Event} e + */ + var handleMouseMove = function handleMouseMove(e) { + + var totalStyles = getComputedStyle(t.total), + offsetStyles = (0, _dom.offset)(t.total), + width = parseFloat(totalStyles.width); + + var percentage = 0, + pos = 0, + x = void 0; + + // mouse or touch position relative to the object + if (e.originalEvent && e.originalEvent.changedTouches) { + x = e.originalEvent.changedTouches[0].pageX; + } else if (e.changedTouches) { + // for Zepto + x = e.changedTouches[0].pageX; + } else { + x = e.pageX; + } + + if (media.duration) { + if (x < offsetStyles.left) { + x = offsetStyles.left; + } else if (x > width + offsetStyles.left) { + x = width + offsetStyles.left; + } + + pos = x - offsetStyles.left; + percentage = pos / width; + t.newTime = percentage <= 0.02 ? 0 : percentage * media.duration; + + // fake seek to where the mouse is + if (mouseIsDown && media.currentTime !== null && t.newTime.toFixed(4) !== media.currentTime.toFixed(4)) { + t.setCurrentRailHandle(t.newTime); + t.updateCurrent(t.newTime); + } + + // position floating time box + if (!_constants.IS_IOS && !_constants.IS_ANDROID && t.timefloat) { + t.timefloat.style.left = pos + 'px'; + t.timefloatcurrent.innerHTML = (0, _time.secondsToTimeCode)(t.newTime, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength); + t.timefloat.style.display = 'block'; + } + } + }, + + /** + * Update elements in progress bar for accessibility purposes only when player is paused. + * + * This is to avoid attempts to repeat the time over and over again when media is playing. + * @private + */ + updateSlider = function updateSlider() { + + var seconds = media.currentTime, + timeSliderText = _i18n2.default.t('mejs.time-slider'), + time = (0, _time.secondsToTimeCode)(seconds, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength), + duration = media.duration; + + t.slider.setAttribute('role', 'slider'); + t.slider.tabIndex = 0; + + if (media.paused) { + t.slider.setAttribute('aria-label', timeSliderText); + t.slider.setAttribute('aria-valuemin', 0); + t.slider.setAttribute('aria-valuemax', duration); + t.slider.setAttribute('aria-valuenow', seconds); + t.slider.setAttribute('aria-valuetext', time); + } else { + t.slider.removeAttribute('aria-label'); + t.slider.removeAttribute('aria-valuemin'); + t.slider.removeAttribute('aria-valuemax'); + t.slider.removeAttribute('aria-valuenow'); + t.slider.removeAttribute('aria-valuetext'); + } + }, + + /** + * + * @private + */ + restartPlayer = function restartPlayer() { + var now = new Date(); + if (now - lastKeyPressTime >= 1000) { + media.play(); + } + }, + handleMouseup = function handleMouseup() { + + if (mouseIsDown && media.currentTime !== null && t.newTime.toFixed(4) !== media.currentTime.toFixed(4)) { + media.setCurrentTime(t.newTime); + player.setCurrentRail(); + t.updateCurrent(t.newTime); + } + if (t.forcedHandlePause) { + t.media.play(); + } + t.forcedHandlePause = false; + }; + + // Events + t.slider.addEventListener('focus', function () { + player.options.autoRewind = false; + }); + t.slider.addEventListener('blur', function () { + player.options.autoRewind = autoRewindInitial; + }); + t.slider.addEventListener('keydown', function (e) { + + if (new Date() - lastKeyPressTime >= 1000) { + startedPaused = media.paused; + } + + if (t.options.keyActions.length) { + + var keyCode = e.which || e.keyCode || 0, + duration = media.duration, + seekForward = player.options.defaultSeekForwardInterval(media), + seekBackward = player.options.defaultSeekBackwardInterval(media); + + var seekTime = media.currentTime; - // position floating time box - if (!mejs.MediaFeatures.hasTouch) { - timefloat.css('left', pos); - timefloatcurrent.html( mejs.Utility.secondsToTimeCode(newTime) ); - timefloat.show(); + switch (keyCode) { + case 37: // left + case 40: + // Down + if (media.duration !== Infinity) { + seekTime -= seekBackward; } - } - }, - mouseIsDown = false, - mouseIsOver = false; + break; + case 39: // Right + case 38: + // Up + if (media.duration !== Infinity) { + seekTime += seekForward; + } + break; + case 36: + // Home + seekTime = 0; + break; + case 35: + // end + seekTime = duration; + break; + case 32: + // space + if (!_constants.IS_FIREFOX) { + if (media.paused) { + media.play(); + } else { + media.pause(); + } + } + return; + case 13: + // enter + if (media.paused) { + media.play(); + } else { + media.pause(); + } + return; + default: + return; + } + + seekTime = seekTime < 0 ? 0 : seekTime >= duration ? duration : Math.floor(seekTime); + lastKeyPressTime = new Date(); + if (!startedPaused) { + media.pause(); + } + + if (seekTime < media.duration && !startedPaused) { + setTimeout(restartPlayer, 1100); + } + + media.setCurrentTime(seekTime); + + e.preventDefault(); + e.stopPropagation(); + } + }); + + var events = ['mousedown', 'touchstart']; + + // Required to manipulate mouse movements that require drag 'n' drop properly + t.slider.addEventListener('dragstart', function () { + return false; + }); - // handle clicks - //controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove); - total - .bind('mousedown touchstart', function (e) { + for (var i = 0, total = events.length; i < total; i++) { + t.slider.addEventListener(events[i], function (e) { + t.forcedHandlePause = false; + if (media.duration !== Infinity) { // only handle left clicks or touch if (e.which === 1 || e.which === 0) { + + if (!media.paused) { + t.media.pause(); + t.forcedHandlePause = true; + } + mouseIsDown = true; handleMouseMove(e); - t.globalBind('mousemove.dur touchmove.dur', function(e) { - handleMouseMove(e); + t.globalBind('mousemove.dur touchmove.dur', function (event) { + var target = event.target; + if (target === t.slider || target.closest('.' + t.options.classPrefix + 'time-slider')) { + handleMouseMove(event); + } }); - t.globalBind('mouseup.dur touchend.dur', function (e) { + t.globalBind('mouseup.dur touchend.dur', function () { + handleMouseup(); mouseIsDown = false; - timefloat.hide(); - t.globalUnbind('.dur'); + if (t.timefloat) { + t.timefloat.style.display = 'none'; + } + t.globalUnbind('mousemove.dur touchmove.dur mouseup.dur touchend.dur'); }); - return false; - } - }) - .bind('mouseenter', function(e) { - mouseIsOver = true; - t.globalBind('mousemove.dur', function(e) { - handleMouseMove(e); - }); - if (!mejs.MediaFeatures.hasTouch) { - timefloat.show(); } - }) - .bind('mouseleave',function(e) { - mouseIsOver = false; - if (!mouseIsDown) { - t.globalUnbind('.dur'); - timefloat.hide(); + } + }); + } + t.slider.addEventListener('mouseenter', function (e) { + if (e.target === t.slider && media.duration !== Infinity) { + t.globalBind('mousemove.dur', function (event) { + var target = event.target; + if (target === t.slider || target.closest('.' + t.options.classPrefix + 'time-slider')) { + handleMouseMove(event); } }); + if (t.timefloat && !_constants.IS_IOS && !_constants.IS_ANDROID) { + t.timefloat.style.display = 'block'; + } + } + }); + t.slider.addEventListener('mouseleave', function () { + if (media.duration !== Infinity) { + if (!mouseIsDown) { + t.globalUnbind('mousemove.dur'); + if (t.timefloat) { + t.timefloat.style.display = 'none'; + } + } + } + }); - // loading - media.addEventListener('progress', function (e) { - player.setProgressRail(e); - player.setCurrentRail(e); - }, false); + // loading + // If media is does not have a finite duration, remove progress bar interaction + // and indicate that is a live broadcast + media.addEventListener('progress', function (e) { + var broadcast = controls.querySelector('.' + t.options.classPrefix + 'broadcast'); + if (media.duration !== Infinity) { + if (broadcast) { + t.slider.style.display = ''; + broadcast.remove(); + } - // current time - media.addEventListener('timeupdate', function(e) { player.setProgressRail(e); - player.setCurrentRail(e); - }, false); - - - // store for later use - t.loaded = loaded; - t.total = total; - t.current = current; - t.handle = handle; - }, - setProgressRail: function(e) { - - var - t = this, - target = (e != undefined) ? e.target : t.media, - percent = null; - - // newest HTML5 spec has buffered array (FF4, Webkit) - if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) { - // TODO: account for a real array with multiple values (only Firefox 4 has this so far) - percent = target.buffered.end(0) / target.duration; - } - // Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end() - // to be anything other than 0. If the byte count is available we use this instead. - // Browsers that support the else if do not seem to have the bufferedBytes value and - // should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8. - else if (target && target.bytesTotal != undefined && target.bytesTotal > 0 && target.bufferedBytes != undefined) { - percent = target.bufferedBytes / target.bytesTotal; + if (!t.forcedHandlePause) { + player.setCurrentRail(e); + } + } else if (!broadcast) { + var label = _document2.default.createElement('span'); + label.className = t.options.classPrefix + 'broadcast'; + label.innerText = _i18n2.default.t('mejs.live-broadcast'); + t.slider.style.display = 'none'; } - // Firefox 3 with an Ogg file seems to go this way - else if (e && e.lengthComputable && e.total != 0) { - percent = e.loaded/e.total; + }); + + // current time + media.addEventListener('timeupdate', function (e) { + var broadcast = controls.querySelector('.' + t.options.classPrefix + 'broadcast'); + if (media.duration !== Infinity) { + if (broadcast) { + t.slider.style.display = ''; + broadcast.remove(); + } + + player.setProgressRail(e); + if (!t.forcedHandlePause) { + player.setCurrentRail(e); + } + updateSlider(e); + } else if (!broadcast) { + var label = _document2.default.createElement('span'); + label.className = t.options.classPrefix + 'broadcast'; + label.innerText = _i18n2.default.t('mejs.live-broadcast'); + controls.querySelector('.' + t.options.classPrefix + 'time-rail').appendChild(label); + t.slider.style.display = 'none'; } + }); - // finally update the progress bar - if (percent !== null) { - percent = Math.min(1, Math.max(0, percent)); - // update loaded bar - if (t.loaded && t.total) { - t.loaded.width(t.total.width() * percent); + t.container.addEventListener('controlsresize', function (e) { + if (media.duration !== Infinity) { + player.setProgressRail(e); + if (!t.forcedHandlePause) { + player.setCurrentRail(e); } } - }, - setCurrentRail: function() { + }); + }, - var t = this; - - if (t.media.currentTime != undefined && t.media.duration) { - // update bar and handle - if (t.total && t.handle) { - var - newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration), - handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2); + /** + * Calculate the progress on the media and update progress bar's width + * + * @param {Event} e + */ + setProgressRail: function setProgressRail(e) { + + var percent = null; + + var t = this, + target = e !== undefined ? e.target : t.media; - t.current.width(newWidth); - t.handle.css('left', handlePos); + // newest HTML5 spec has buffered array (FF4, Webkit) + if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) { + // account for a real array with multiple values - always read the end of the last buffer + percent = target.buffered.end(target.buffered.length - 1) / target.duration; + } + // Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end() + // to be anything other than 0. If the byte count is available we use this instead. + // Browsers that support the else if do not seem to have the bufferedBytes value and + // should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8. + else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) { + percent = target.bufferedBytes / target.bytesTotal; + } + // Firefox 3 with an Ogg file seems to go this way + else if (e && e.lengthComputable && e.total !== 0) { + percent = e.loaded / e.total; } + + // finally update the progress bar + if (percent !== null) { + percent = Math.min(1, Math.max(0, percent)); + // update loaded bar + if (t.loaded && t.total) { + t.loaded.style.width = percent * 100 + '%'; + } + } + }, + + /** + * Update the slider's width depending on the time assigned + * + * @param {Number} fakeTime + */ + setCurrentRailHandle: function setCurrentRailHandle(fakeTime) { + var t = this; + t.setCurrentRailMain(t, fakeTime); + }, + + /** + * Update the slider's width depending on the current time + * + */ + setCurrentRail: function setCurrentRail() { + var t = this; + t.setCurrentRailMain(t); + }, + + /** + * Method that handles the calculation of the width of the rail. + * + * @param {MediaElementPlayer} t + * @param {?Number} fakeTime + */ + setCurrentRailMain: function setCurrentRailMain(t, fakeTime) { + if (t.media.currentTime !== undefined && t.media.duration) { + var nTime = typeof fakeTime === 'undefined' ? t.media.currentTime : fakeTime; + + // update bar and handle + if (t.total && t.handle) { + var newWidth = Math.round(parseFloat(getComputedStyle(t.total).width) * nTime / t.media.duration), + handlePos = newWidth - Math.round(t.handle.offsetWidth / 2); + + newWidth = nTime / t.media.duration * 100; + t.current.style.width = newWidth + '%'; + t.handle.style.left = handlePos + 'px'; } + } + } +}); - } - }); -})(mejs.$); - -(function($) { - - // options - $.extend(mejs.MepDefaults, { - duration: -1, - timeAndDurationSeparator: '<span> | </span>' - }); +},{"16":16,"19":19,"2":2,"20":20,"24":24,"4":4}],11:[function(_dereq_,module,exports){ +'use strict'; +var _document = _dereq_(2); - // current and duration 00:00 / 00:00 - $.extend(MediaElementPlayer.prototype, { - buildcurrent: function(player, controls, layers, media) { - var t = this; - - $('<div class="mejs-time">'+ - '<span class="mejs-currenttime">' + (player.options.alwaysShowHours ? '00:' : '') - + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')+ '</span>'+ - '</div>') - .appendTo(controls); - - t.currenttime = t.controls.find('.mejs-currenttime'); - - media.addEventListener('timeupdate',function() { - player.updateCurrent(); - }, false); - }, +var _document2 = _interopRequireDefault(_document); +var _player = _dereq_(16); - buildduration: function(player, controls, layers, media) { - var t = this; - - if (controls.children().last().find('.mejs-currenttime').length > 0) { - $(t.options.timeAndDurationSeparator + - '<span class="mejs-duration">' + - (t.options.duration > 0 ? - mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25) : - ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')) - ) + - '</span>') - .appendTo(controls.find('.mejs-time')); - } else { +var _player2 = _interopRequireDefault(_player); - // add class to current time - controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container'); - - $('<div class="mejs-time mejs-duration-container">'+ - '<span class="mejs-duration">' + - (t.options.duration > 0 ? - mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25) : - ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')) - ) + - '</span>' + - '</div>') - .appendTo(controls); - } - - t.durationD = t.controls.find('.mejs-duration'); - - media.addEventListener('timeupdate',function() { - player.updateDuration(); - }, false); - }, - - updateCurrent: function() { - var t = this; +var _time = _dereq_(24); + +var _dom = _dereq_(20); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - if (t.currenttime) { - t.currenttime.html(mejs.Utility.secondsToTimeCode(t.media.currentTime, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25)); +/** + * Current/duration times + * + * This feature creates/updates the duration and progress times in the control bar, based on native events. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * The initial duration + * @type {Number} + */ + duration: 0, + /** + * @type {String} + */ + timeAndDurationSeparator: '<span> | </span>' +}); + +Object.assign(_player2.default.prototype, { + + /** + * Current time constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildcurrent: function buildcurrent(player, controls, layers, media) { + var t = this, + time = _document2.default.createElement('div'); + + time.className = t.options.classPrefix + 'time'; + time.setAttribute('role', 'timer'); + time.setAttribute('aria-live', 'off'); + time.innerHTML = '<span class="' + t.options.classPrefix + 'currenttime">' + (0, _time.secondsToTimeCode)(0, player.options.alwaysShowHours, player.options.showTimecodeFrameCount, player.options.framesPerSecond, player.options.secondsDecimalLength) + '</span>'; + + t.addControlElement(time, 'current'); + + media.addEventListener('timeupdate', function () { + if (t.controlsAreVisible) { + player.updateCurrent(); } - }, - - updateDuration: function() { - var t = this; + }); + }, - //Toggle the long video class if the video is longer than an hour. - t.container.toggleClass("mejs-long-video", t.media.duration > 3600); - - if (t.durationD && (t.options.duration > 0 || t.media.duration)) { - t.durationD.html(mejs.Utility.secondsToTimeCode(t.options.duration > 0 ? t.options.duration : t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25)); - } - } - }); -})(mejs.$); + /** + * Duration time constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildduration: function buildduration(player, controls, layers, media) { -(function($) { + var t = this, + currTime = controls.lastChild.querySelector('.' + t.options.classPrefix + 'currenttime'); - $.extend(mejs.MepDefaults, { - muteText: mejs.i18n.t('Mute Toggle'), - hideVolumeOnTouchDevices: true, - - audioVolume: 'horizontal', - videoVolume: 'vertical' - }); + if (currTime) { + controls.querySelector('.' + t.options.classPrefix + 'time').innerHTML += t.options.timeAndDurationSeparator + '<span class="' + t.options.classPrefix + 'duration">' + ((0, _time.secondsToTimeCode)(t.options.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength) + '</span>'); + } else { - $.extend(MediaElementPlayer.prototype, { - buildvolume: function(player, controls, layers, media) { - - // Android and iOS don't support volume controls - if ((mejs.MediaFeatures.isAndroid || mejs.MediaFeatures.isiOS) && this.options.hideVolumeOnTouchDevices) - return; - - var t = this, - mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume, - mute = (mode == 'horizontal') ? - - // horizontal version - $('<div class="mejs-button mejs-volume-button mejs-mute">'+ - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '" aria-label="' + t.options.muteText + '"></button>'+ - '</div>' + - '<div class="mejs-horizontal-volume-slider">'+ // outer background - '<div class="mejs-horizontal-volume-total"></div>'+ // line background - '<div class="mejs-horizontal-volume-current"></div>'+ // current volume - '<div class="mejs-horizontal-volume-handle"></div>'+ // handle - '</div>' - ) - .appendTo(controls) : + // add class to current time + if (controls.querySelector('.' + t.options.classPrefix + 'currenttime')) { + (0, _dom.addClass)(controls.querySelector('.' + t.options.classPrefix + 'currenttime').parentNode, t.options.classPrefix + 'currenttime-container'); + } + + var duration = _document2.default.createElement('div'); + duration.className = t.options.classPrefix + 'time ' + t.options.classPrefix + 'duration-container'; + duration.innerHTML = '<span class="' + t.options.classPrefix + 'duration">' + ((0, _time.secondsToTimeCode)(t.options.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength) + '</span>'); + + t.addControlElement(duration, 'duration'); + } + + media.addEventListener('timeupdate', function () { + if (t.controlsAreVisible) { + player.updateDuration(); + } + }); + }, + + + /** + * Update the current time and output it in format 00:00 + * + */ + updateCurrent: function updateCurrent() { + var t = this; + + var currentTime = t.media.currentTime; + + if (isNaN(currentTime)) { + currentTime = 0; + } + + if (t.controls.querySelector('.' + t.options.classPrefix + 'currenttime')) { + t.controls.querySelector('.' + t.options.classPrefix + 'currenttime').innerText = (0, _time.secondsToTimeCode)(currentTime, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength); + } + }, + + + /** + * Update the duration time and output it in format 00:00 + * + */ + updateDuration: function updateDuration() { + var t = this; + + var duration = t.media.duration; + + if (isNaN(duration) || duration === Infinity || duration < 0) { + t.media.duration = t.options.duration = duration = 0; + } + + if (t.options.duration > 0) { + duration = t.options.duration; + } + + var timecode = (0, _time.secondsToTimeCode)(duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond, t.options.secondsDecimalLength); + + // Toggle long-video class if time code is >5 digits (MM:SS) + if (timecode.length > 5) { + (0, _dom.toggleClass)(t.container, t.options.classPrefix + 'long-video'); + } + + if (t.controls.querySelector('.' + t.options.classPrefix + 'duration') && duration > 0) { + t.controls.querySelector('.' + t.options.classPrefix + 'duration').innerHTML = timecode; + } + } +}); + +},{"16":16,"2":2,"20":20,"24":24}],12:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _time = _dereq_(24); + +var _general = _dereq_(21); + +var _dom = _dereq_(20); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Closed Captions (CC) button + * + * This feature enables the displaying of a CC button in the control bar, and also contains the methods to start media + * with a certain language (if available), toggle captions, etc. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * Default language to start media using ISO 639-2 Language Code List (en, es, it, etc.) + * If there are multiple tracks for one language, the last track node found is activated + * @see https://www.loc.gov/standards/iso639-2/php/code_list.php + * @type {String} + */ + startLanguage: '', + /** + * @type {?String} + */ + tracksText: null, + /** + * @type {?String} + */ + chaptersText: null, + /** + * Avoid to screen reader speak captions over an audio track. + * + * @type {Boolean} + */ + tracksAriaLive: false, + /** + * Remove the [cc] button when no track nodes are present + * @type {Boolean} + */ + hideCaptionsButtonWhenEmpty: true, + /** + * Change captions to pop-up if true and only one track node is found + * @type {Boolean} + */ + toggleCaptionsButtonWhenOnlyOne: false, + /** + * @type {String} + */ + slidesSelector: '' +}); + +Object.assign(_player2.default.prototype, { + + /** + * @type {Boolean} + */ + hasChapters: false, + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + */ + buildtracks: function buildtracks(player, controls, layers, media) { + if (player.tracks.length === 0) { + return; + } + + var t = this, + attr = t.options.tracksAriaLive ? ' role="log" aria-live="assertive" aria-atomic="false"' : '', + tracksTitle = (0, _general.isString)(t.options.tracksText) ? t.options.tracksText : _i18n2.default.t('mejs.captions-subtitles'), + chaptersTitle = (0, _general.isString)(t.options.chaptersText) ? t.options.chaptersText : _i18n2.default.t('mejs.captions-chapters'), + total = player.tracks.length; + + // If browser will do native captions, prefer mejs captions, loop through tracks and hide + if (t.domNode.textTracks) { + for (var i = t.domNode.textTracks.length - 1; i >= 0; i--) { + t.domNode.textTracks[i].mode = 'hidden'; + } + } + + t.cleartracks(player); + + player.captions = _document2.default.createElement('div'); + player.captions.className = t.options.classPrefix + 'captions-layer ' + t.options.classPrefix + 'layer'; + player.captions.innerHTML = '<div class="' + t.options.classPrefix + 'captions-position ' + t.options.classPrefix + 'captions-position-hover"' + attr + '>' + ('<span class="' + t.options.classPrefix + 'captions-text"></span>') + '</div>'; + player.captions.style.display = 'none'; + layers.insertBefore(player.captions, layers.firstChild); + + player.captionsText = player.captions.querySelector('.' + t.options.classPrefix + 'captions-text'); + + player.captionsButton = _document2.default.createElement('div'); + player.captionsButton.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'captions-button'; + player.captionsButton.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + tracksTitle + '" aria-label="' + tracksTitle + '" tabindex="0"></button>' + ('<div class="' + t.options.classPrefix + 'captions-selector ' + t.options.classPrefix + 'offscreen">') + ('<ul class="' + t.options.classPrefix + 'captions-selector-list">') + ('<li class="' + t.options.classPrefix + 'captions-selector-list-item">') + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + player.id + '_captions" id="' + player.id + '_captions_none" ') + 'value="none" checked disabled>' + ('<label class="' + t.options.classPrefix + 'captions-selector-label ') + (t.options.classPrefix + 'captions-selected" ') + ('for="' + player.id + '_captions_none">' + _i18n2.default.t('mejs.none') + '</label>') + '</li>' + '</ul>' + '</div>'; + + t.addControlElement(player.captionsButton, 'tracks'); + + player.captionsButton.querySelector('.' + t.options.classPrefix + 'captions-selector-list-item').disabled = false; + + player.chaptersButton = _document2.default.createElement('div'); + player.chaptersButton.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'chapters-button'; + player.chaptersButton.innerHTML = '<button type="button" aria-controls="' + t.id + '" title="' + chaptersTitle + '" aria-label="' + chaptersTitle + '" tabindex="0"></button>' + ('<div class="' + t.options.classPrefix + 'chapters-selector ' + t.options.classPrefix + 'offscreen">') + ('<ul class="' + t.options.classPrefix + 'chapters-selector-list"></ul>') + '</div>'; + + var subtitleCount = 0; + + for (var _i = 0; _i < total; _i++) { + var kind = player.tracks[_i].kind; + if (kind === 'subtitles' || kind === 'captions') { + subtitleCount++; + } else if (kind === 'chapters' && !controls.querySelector('.' + t.options.classPrefix + 'chapter-selector')) { + player.captionsButton.parentNode.insertBefore(player.chaptersButton, player.captionsButton); + } + } + + player.trackToLoad = -1; + player.selectedTrack = null; + player.isLoadingTrack = false; + + // add to list + for (var _i2 = 0; _i2 < total; _i2++) { + var _kind = player.tracks[_i2].kind; + if (_kind === 'subtitles' || _kind === 'captions') { + player.addTrackButton(player.tracks[_i2].trackId, player.tracks[_i2].srclang, player.tracks[_i2].label); + } + } + + // start loading tracks + player.loadNextTrack(); + + var inEvents = ['mouseenter', 'focusin'], + outEvents = ['mouseleave', 'focusout']; + + // if only one language then just make the button a toggle + if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount === 1) { + // click + player.captionsButton.addEventListener('click', function () { + var trackId = 'none'; + if (player.selectedTrack === null) { + trackId = player.tracks[0].trackId; + } + player.setTrack(trackId); + }); + } else { + var labels = player.captionsButton.querySelectorAll('.' + t.options.classPrefix + 'captions-selector-label'), + captions = player.captionsButton.querySelectorAll('input[type=radio]'); + // hover or keyboard focus + for (var _i3 = 0, _total = inEvents.length; _i3 < _total; _i3++) { + player.captionsButton.addEventListener(inEvents[_i3], function () { + (0, _dom.removeClass)(this.querySelector('.' + t.options.classPrefix + 'captions-selector'), t.options.classPrefix + 'offscreen'); + }); + } + + for (var _i4 = 0, _total2 = outEvents.length; _i4 < _total2; _i4++) { + player.captionsButton.addEventListener(outEvents[_i4], function () { + (0, _dom.addClass)(this.querySelector('.' + t.options.classPrefix + 'captions-selector'), t.options.classPrefix + 'offscreen'); + }); + } + + // handle clicks to the language radio buttons + for (var _i5 = 0, _total3 = captions.length; _i5 < _total3; _i5++) { + captions[_i5].addEventListener('click', function () { + // value is trackId, same as the actual id, and we're using it here + // because the "none" checkbox doesn't have a trackId + // to use, but we want to know when "none" is clicked + player.setTrack(this.value); + }); + } + + for (var _i6 = 0, _total4 = labels.length; _i6 < _total4; _i6++) { + labels[_i6].addEventListener('click', function () { + var radio = (0, _dom.siblings)(this, function (el) { + return el.tagName === 'INPUT'; + })[0], + event = (0, _general.createEvent)('click', radio); + radio.dispatchEvent(event); + }); + } + + //Allow up/down arrow to change the selected radio without changing the volume. + player.captionsButton.addEventListener('keydown', function (e) { + e.stopPropagation(); + }); + } + + for (var _i7 = 0, _total5 = inEvents.length; _i7 < _total5; _i7++) { + player.chaptersButton.addEventListener(inEvents[_i7], function () { + if (this.querySelector('.' + t.options.classPrefix + 'chapters-selector-list').childNodes.length) { + (0, _dom.removeClass)(this.querySelector('.' + t.options.classPrefix + 'chapters-selector'), t.options.classPrefix + 'offscreen'); + } + }); + } + + for (var _i8 = 0, _total6 = outEvents.length; _i8 < _total6; _i8++) { + player.chaptersButton.addEventListener(outEvents[_i8], function () { + (0, _dom.addClass)(this.querySelector('.' + t.options.classPrefix + 'chapters-selector'), t.options.classPrefix + 'offscreen'); + }); + } + + //Allow up/down arrow to change the selected radio without changing the volume. + player.chaptersButton.addEventListener('keydown', function (e) { + e.stopPropagation(); + }); + + if (!player.options.alwaysShowControls) { + // move with controls + player.container.addEventListener('controlsshown', function () { + // push captions above controls + (0, _dom.addClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover'); + }); + + player.container.addEventListener('controlshidden', function () { + if (!media.paused) { + // move back to normal place + (0, _dom.removeClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover'); + } + }); + } else { + (0, _dom.addClass)(player.container.querySelector('.' + t.options.classPrefix + 'captions-position'), t.options.classPrefix + 'captions-position-hover'); + } + + media.addEventListener('timeupdate', function () { + player.displayCaptions(); + }); + + if (player.options.slidesSelector !== '') { + player.slidesContainer = _document2.default.querySelectorAll(player.options.slidesSelector); + + media.addEventListener('timeupdate', function () { + player.displaySlides(); + }); + } + }, + + + /** + * Feature destructor. + * + * Always has to be prefixed with `clean` and the name that was used in MepDefaults.features list + * @param {MediaElementPlayer} player + */ + cleartracks: function cleartracks(player) { + if (player) { + if (player.captions) { + player.captions.remove(); + } + if (player.chapters) { + player.chapters.remove(); + } + if (player.captionsText) { + player.captionsText.remove(); + } + if (player.captionsButton) { + player.captionsButton.remove(); + } + if (player.chaptersButton) { + player.chaptersButton.remove(); + } + } + }, + rebuildtracks: function rebuildtracks() { + var t = this; + t.findTracks(); + t.buildtracks(t, t.controls, t.layers, t.media); + }, + findTracks: function findTracks() { + var t = this, + tracktags = t.node.querySelectorAll('track'), + total = tracktags.length; + + // store for use by plugins + t.tracks = []; + for (var i = 0; i < total; i++) { + var track = tracktags[i], + srclang = track.getAttribute('srclang').toLowerCase() || '', + trackId = t.id + '_track_' + i + '_' + track.getAttribute('kind') + '_' + srclang; + t.tracks.push({ + trackId: trackId, + srclang: srclang, + src: track.getAttribute('src'), + kind: track.getAttribute('kind'), + label: track.getAttribute('label') || '', + entries: [], + isLoaded: false + }); + } + }, + + + /** + * + * @param {String} trackId, or "none" to disable captions + */ + setTrack: function setTrack(trackId) { + + var t = this, + radios = t.captionsButton.querySelectorAll('input[type="radio"]'), + captions = t.captionsButton.querySelectorAll('.' + t.options.classPrefix + 'captions-selected'), + track = t.captionsButton.querySelector('input[value="' + trackId + '"]'); + + for (var i = 0, total = radios.length; i < total; i++) { + radios[i].checked = false; + } + + for (var _i9 = 0, _total7 = captions.length; _i9 < _total7; _i9++) { + (0, _dom.removeClass)(captions[_i9], t.options.classPrefix + 'captions-selected'); + } + + track.checked = true; + var labels = (0, _dom.siblings)(track, function (el) { + return (0, _dom.hasClass)(el, t.options.classPrefix + 'captions-selector-label'); + }); + for (var _i10 = 0, _total8 = labels.length; _i10 < _total8; _i10++) { + (0, _dom.addClass)(labels[_i10], t.options.classPrefix + 'captions-selected'); + } + + if (trackId === 'none') { + t.selectedTrack = null; + (0, _dom.removeClass)(t.captionsButton, t.options.classPrefix + 'captions-enabled'); + } else { + for (var _i11 = 0, _total9 = t.tracks.length; _i11 < _total9; _i11++) { + var _track = t.tracks[_i11]; + if (_track.trackId === trackId) { + if (t.selectedTrack === null) { + (0, _dom.addClass)(t.captionsButton, t.options.classPrefix + 'captions-enabled'); + } + t.selectedTrack = _track; + t.captions.setAttribute('lang', t.selectedTrack.srclang); + t.displayCaptions(); + break; + } + } + } + + var event = (0, _general.createEvent)('captionschange', t.media); + event.detail.caption = t.selectedTrack; + t.media.dispatchEvent(event); + }, + + + /** + * + */ + loadNextTrack: function loadNextTrack() { + var t = this; + + t.trackToLoad++; + if (t.trackToLoad < t.tracks.length) { + t.isLoadingTrack = true; + t.loadTrack(t.trackToLoad); + } else { + // add done? + t.isLoadingTrack = false; + t.checkForTracks(); + } + }, + + + /** + * + * @param index + */ + loadTrack: function loadTrack(index) { + var t = this, + track = t.tracks[index]; + + if (track !== undefined && (track.src !== undefined || track.src !== "")) { + (0, _dom.ajax)(track.src, 'text', function (d) { + + // parse the loaded file + track.entries = typeof d === 'string' && /<tt\s+xml/ig.exec(d) ? _mejs2.default.TrackFormatParser.dfxp.parse(d) : _mejs2.default.TrackFormatParser.webvtt.parse(d); + + track.isLoaded = true; + + t.enableTrackButton(track); + t.loadNextTrack(); + + if (track.kind === 'slides') { + t.setupSlides(track); + } + // Load by default the first track with `chapters` kind + else if (track.kind === 'chapters' && !t.hasChapters) { + t.drawChapters(track); + t.hasChapters = true; + } + }, function () { + t.removeTrackButton(track.trackId); + t.loadNextTrack(); + }); + } + }, + + + /** + * + * @param {String} track - The language code + */ + enableTrackButton: function enableTrackButton(track) { + var t = this, + lang = track.srclang, + target = _document2.default.getElementById('' + track.trackId); + + if (!target) { + return; + } + + var label = track.label; + + if (label === '') { + label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang; + } + target.disabled = false; + var targetSiblings = (0, _dom.siblings)(target, function (el) { + return (0, _dom.hasClass)(el, t.options.classPrefix + 'captions-selector-label'); + }); + for (var i = 0, total = targetSiblings.length; i < total; i++) { + targetSiblings[i].innerHTML = label; + } + + // auto select + if (t.options.startLanguage === lang) { + target.checked = true; + var event = (0, _general.createEvent)('click', target); + target.dispatchEvent(event); + } + }, + + + /** + * + * @param {String} trackId + */ + removeTrackButton: function removeTrackButton(trackId) { + + var element = _document2.default.getElementById('' + trackId); + + if (element) { + var button = element.closest('li'); + if (button) { + button.remove(); + } + } + }, + + + /** + * + * @param {String} trackId + * @param {String} lang - The language code + * @param {String} label + */ + addTrackButton: function addTrackButton(trackId, lang, label) { + var t = this; + if (label === '') { + label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang; + } + + // trackId is used in the value, too, because the "none" + // caption option doesn't have a trackId but we need to be able + // to set it, too + t.captionsButton.querySelector('ul').innerHTML += '<li class="' + t.options.classPrefix + 'captions-selector-list-item">' + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + t.id + '_captions" id="' + trackId + '" value="' + trackId + '" disabled>') + ('<label class="' + t.options.classPrefix + 'captions-selector-label">' + label + ' (loading)</label>') + '</li>'; + }, + + + /** + * + */ + checkForTracks: function checkForTracks() { + var t = this; + + var hasSubtitles = false; + + // check if any subtitles + if (t.options.hideCaptionsButtonWhenEmpty) { + for (var i = 0, total = t.tracks.length; i < total; i++) { + var kind = t.tracks[i].kind; + if ((kind === 'subtitles' || kind === 'captions') && t.tracks[i].isLoaded) { + hasSubtitles = true; + break; + } + } + + t.captionsButton.style.display = hasSubtitles ? '' : 'none'; + t.setControlsSize(); + } + }, + + + /** + * + */ + displayCaptions: function displayCaptions() { + + if (this.tracks === undefined) { + return; + } + + var t = this, + track = t.selectedTrack, + sanitize = function sanitize(html) { + + var div = _document2.default.createElement('div'); + div.innerHTML = html; + + // Remove all `<script>` tags first + var scripts = div.getElementsByTagName('script'); + var i = scripts.length; + while (i--) { + scripts[i].remove(); + } + + // Loop the elements and remove anything that contains value="javascript:" or an `on*` attribute + // (`onerror`, `onclick`, etc.) + var allElements = div.getElementsByTagName('*'); + for (var _i12 = 0, n = allElements.length; _i12 < n; _i12++) { + var attributesObj = allElements[_i12].attributes, + attributes = Array.prototype.slice.call(attributesObj); + + for (var j = 0, total = attributes.length; j < total; j++) { + if (attributes[j].name.startsWith('on') || attributes[j].value.startsWith('javascript')) { + allElements[_i12].remove(); + } else if (attributes[j].name === 'style') { + allElements[_i12].removeAttribute(attributes[j].name); + } + } + } + return div.innerHTML; + }; + + if (track !== null && track.isLoaded) { + var i = t.searchTrackPosition(track.entries, t.media.currentTime); + if (i > -1) { + // Set the line before the timecode as a class so the cue can be targeted if needed + t.captionsText.innerHTML = sanitize(track.entries[i].text); + t.captionsText.className = t.options.classPrefix + 'captions-text ' + (track.entries[i].identifier || ''); + t.captions.style.display = ''; + t.captions.style.height = '0px'; + return; // exit out if one is visible; + } + + t.captions.style.display = 'none'; + } else { + t.captions.style.display = 'none'; + } + }, + + + /** + * + * @param {HTMLElement} track + */ + setupSlides: function setupSlides(track) { + var t = this; + + t.slides = track; + t.slides.entries.imgs = [t.slides.entries.length]; + t.showSlide(0); + }, + + + /** + * + * @param {Number} index + */ + showSlide: function showSlide(index) { + var _this = this; + + var t = this; + + if (t.tracks === undefined || t.slidesContainer === undefined) { + return; + } + + var url = t.slides.entries[index].text; + + var img = t.slides.entries[index].imgs; + + if (img === undefined || img.fadeIn === undefined) { + (function () { + + var image = _document2.default.createElement('img'); + image.src = url; + image.addEventListener('load', function () { + var self = _this, + visible = (0, _dom.siblings)(self, function (el) { + return visible(el); + }); + self.style.display = 'none'; + t.slidesContainer.innerHTML += self.innerHTML; + (0, _dom.fadeIn)(t.slidesContainer.querySelector(image)); + for (var i = 0, total = visible.length; i < total; i++) { + (0, _dom.fadeOut)(visible[i], 400); + } + }); + t.slides.entries[index].imgs = img = image; + })(); + } else if (!(0, _dom.visible)(img)) { + (function () { + var visible = (0, _dom.siblings)(self, function (el) { + return visible(el); + }); + (0, _dom.fadeIn)(t.slidesContainer.querySelector(img)); + for (var i = 0, total = visible.length; i < total; i++) { + (0, _dom.fadeOut)(visible[i]); + } + })(); + } + }, + + + /** + * + */ + displaySlides: function displaySlides() { + var t = this; + + if (this.slides === undefined) { + return; + } + + var slides = t.slides, + i = t.searchTrackPosition(slides.entries, t.media.currentTime); + + if (i > -1) { + t.showSlide(i); + return; // exit out if one is visible; + } + }, + + + /** + * + * @param {Object} chapters + */ + drawChapters: function drawChapters(chapters) { + var t = this, + total = chapters.entries.length; + + if (!total) { + return; + } + + t.chaptersButton.querySelector('ul').innerHTML = ''; + + for (var i = 0; i < total; i++) { + t.chaptersButton.querySelector('ul').innerHTML += '<li class="' + t.options.classPrefix + 'chapters-selector-list-item" ' + 'role="menuitemcheckbox" aria-live="polite" aria-disabled="false" aria-checked="false">' + ('<input type="radio" class="' + t.options.classPrefix + 'captions-selector-input" ') + ('name="' + t.id + '_chapters" value="' + chapters.entries[i].start + '" disabled>') + ('<label class="' + t.options.classPrefix + 'chapters-selector-label">' + chapters.entries[i].text + '</label>') + '</li>'; + } + + var radios = t.chaptersButton.querySelectorAll('input[type="radio"]'), + labels = t.chaptersButton.querySelectorAll('.' + t.options.classPrefix + 'chapters-selector-label'); + + for (var _i13 = 0, _total10 = radios.length; _i13 < _total10; _i13++) { + radios[_i13].disabled = false; + radios[_i13].checked = false; + radios[_i13].addEventListener('click', function () { + var self = this, + listItems = t.chaptersButton.querySelectorAll('li'), + label = (0, _dom.siblings)(self, function (el) { + return (0, _dom.hasClass)(el, t.options.classPrefix + 'chapters-selector-label'); + })[0]; + + self.checked = true; + self.parentNode.setAttribute('aria-checked', true); + (0, _dom.addClass)(label, t.options.classPrefix + 'chapters-selected'); + (0, _dom.removeClass)(t.chaptersButton.querySelector('.' + t.options.classPrefix + 'chapters-selected'), t.options.classPrefix + 'chapters-selected'); + + for (var _i14 = 0, _total11 = listItems.length; _i14 < _total11; _i14++) { + listItems[_i14].setAttribute('aria-checked', false); + } + + t.media.setCurrentTime(parseFloat(self.value)); + if (t.media.paused) { + t.media.play(); + } + }); + } + + for (var _i15 = 0, _total12 = labels.length; _i15 < _total12; _i15++) { + labels[_i15].addEventListener('click', function () { + var radio = (0, _dom.siblings)(this, function (el) { + return el.tagName === 'INPUT'; + })[0], + event = (0, _general.createEvent)('click', radio); + radio.dispatchEvent(event); + }); + } + }, + + /** + * Perform binary search to look for proper track index + * + * @param {Object[]} tracks + * @param {Number} currentTime + * @return {Number} + */ + searchTrackPosition: function searchTrackPosition(tracks, currentTime) { + var lo = 0, + hi = tracks.length - 1, + mid = void 0, + start = void 0, + stop = void 0; + + while (lo <= hi) { + mid = lo + hi >> 1; + start = tracks[mid].start; + stop = tracks[mid].stop; + + if (currentTime >= start && currentTime < stop) { + return mid; + } else if (start < currentTime) { + lo = mid + 1; + } else if (start > currentTime) { + hi = mid - 1; + } + } + + return -1; + } +}); + +/** + * Map all possible languages with their respective code + * + * @constructor + */ +_mejs2.default.language = { + codes: { + af: 'mejs.afrikaans', + sq: 'mejs.albanian', + ar: 'mejs.arabic', + be: 'mejs.belarusian', + bg: 'mejs.bulgarian', + ca: 'mejs.catalan', + zh: 'mejs.chinese', + 'zh-cn': 'mejs.chinese-simplified', + 'zh-tw': 'mejs.chines-traditional', + hr: 'mejs.croatian', + cs: 'mejs.czech', + da: 'mejs.danish', + nl: 'mejs.dutch', + en: 'mejs.english', + et: 'mejs.estonian', + fl: 'mejs.filipino', + fi: 'mejs.finnish', + fr: 'mejs.french', + gl: 'mejs.galician', + de: 'mejs.german', + el: 'mejs.greek', + ht: 'mejs.haitian-creole', + iw: 'mejs.hebrew', + hi: 'mejs.hindi', + hu: 'mejs.hungarian', + is: 'mejs.icelandic', + id: 'mejs.indonesian', + ga: 'mejs.irish', + it: 'mejs.italian', + ja: 'mejs.japanese', + ko: 'mejs.korean', + lv: 'mejs.latvian', + lt: 'mejs.lithuanian', + mk: 'mejs.macedonian', + ms: 'mejs.malay', + mt: 'mejs.maltese', + no: 'mejs.norwegian', + fa: 'mejs.persian', + pl: 'mejs.polish', + pt: 'mejs.portuguese', + ro: 'mejs.romanian', + ru: 'mejs.russian', + sr: 'mejs.serbian', + sk: 'mejs.slovak', + sl: 'mejs.slovenian', + es: 'mejs.spanish', + sw: 'mejs.swahili', + sv: 'mejs.swedish', + tl: 'mejs.tagalog', + th: 'mejs.thai', + tr: 'mejs.turkish', + uk: 'mejs.ukrainian', + vi: 'mejs.vietnamese', + cy: 'mejs.welsh', + yi: 'mejs.yiddish' + } +}; + +/* + Parses WebVTT format which should be formatted as + ================================ + WEBVTT + + 1 + 00:00:01,1 --> 00:00:05,000 + A line of text + + 2 + 00:01:15,1 --> 00:02:05,000 + A second line of text + + =============================== + + Adapted from: http://www.delphiki.com/html5/playr + */ +_mejs2.default.TrackFormatParser = { + webvtt: { + /** + * @type {String} + */ + pattern: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/, + + /** + * + * @param {String} trackText + * @returns {{text: Array, times: Array}} + */ + parse: function parse(trackText) { + var lines = trackText.split(/\r?\n/), + entries = []; + + var timecode = void 0, + text = void 0, + identifier = void 0; + + for (var i = 0, total = lines.length; i < total; i++) { + timecode = this.pattern.exec(lines[i]); + + if (timecode && i < lines.length) { + if (i - 1 >= 0 && lines[i - 1] !== '') { + identifier = lines[i - 1]; + } + i++; + // grab all the (possibly multi-line) text that follows + text = lines[i]; + i++; + while (lines[i] !== '' && i < lines.length) { + text = text + '\n' + lines[i]; + i++; + } + text = text.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); + entries.push({ + identifier: identifier, + start: (0, _time.convertSMPTEtoSeconds)(timecode[1]) === 0 ? 0.200 : (0, _time.convertSMPTEtoSeconds)(timecode[1]), + stop: (0, _time.convertSMPTEtoSeconds)(timecode[3]), + text: text, + settings: timecode[5] + }); + } + identifier = ''; + } + return entries; + } + }, + // Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420 + dfxp: { + /** + * + * @param {String} trackText + * @returns {{text: Array, times: Array}} + */ + parse: function parse(trackText) { + trackText = $(trackText).filter('tt'); + var container = trackText.firstChild, + lines = container.querySelectorAll('p'), + styleNode = trackText.getElementById('' + container.attr('style')), + entries = []; + + var styles = void 0; + + if (styleNode.length) { + styleNode.removeAttribute('id'); + var attributes = styleNode.attributes; + if (attributes.length) { + styles = {}; + for (var i = 0, total = attributes.length; i < total; i++) { + styles[attributes[i].name.split(":")[1]] = attributes[i].value; + } + } + } + + for (var _i16 = 0, _total13 = lines.length; _i16 < _total13; _i16++) { + var style = void 0, + _temp = { + start: null, + stop: null, + style: null, + text: null + }; + + if (lines.eq(_i16).attr('begin')) { + _temp.start = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16).attr('begin')); + } + if (!_temp.start && lines.eq(_i16 - 1).attr('end')) { + _temp.start = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16 - 1).attr('end')); + } + if (lines.eq(_i16).attr('end')) { + _temp.stop = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16).attr('end')); + } + if (!_temp.stop && lines.eq(_i16 + 1).attr('begin')) { + _temp.stop = (0, _time.convertSMPTEtoSeconds)(lines.eq(_i16 + 1).attr('begin')); + } + + if (styles) { + style = ''; + for (var _style in styles) { + style += _style + ':' + styles[_style] + ';'; + } + } + if (style) { + _temp.style = style; + } + if (_temp.start === 0) { + _temp.start = 0.200; + } + _temp.text = lines.eq(_i16).innerHTML.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); + entries.push(_temp); + } + return entries; + } + } +}; + +},{"16":16,"2":2,"20":20,"21":21,"24":24,"4":4,"6":6}],13:[function(_dereq_,module,exports){ +'use strict'; + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _player = _dereq_(16); + +var _player2 = _interopRequireDefault(_player); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _constants = _dereq_(19); + +var _general = _dereq_(21); + +var _dom = _dereq_(20); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Volume button + * + * This feature enables the displaying of a Volume button in the control bar, and also contains logic to manipulate its + * events, such as sliding up/down (or left/right, if vertical), muting/unmuting media, etc. + */ + +// Feature configuration +Object.assign(_player.config, { + /** + * @type {?String} + */ + muteText: null, + /** + * @type {?String} + */ + unmuteText: null, + /** + * @type {?String} + */ + allyVolumeControlText: null, + /** + * @type {Boolean} + */ + hideVolumeOnTouchDevices: true, + /** + * @type {String} + */ + audioVolume: 'horizontal', + /** + * @type {String} + */ + videoVolume: 'vertical' +}); + +Object.assign(_player2.default.prototype, { + + /** + * Feature constructor. + * + * Always has to be prefixed with `build` and the name that will be used in MepDefaults.features list + * @param {MediaElementPlayer} player + * @param {$} controls + * @param {$} layers + * @param {HTMLElement} media + * @public + */ + buildvolume: function buildvolume(player, controls, layers, media) { + + // Android and iOS don't support volume controls + if ((_constants.IS_ANDROID || _constants.IS_IOS) && this.options.hideVolumeOnTouchDevices) { + return; + } + + var t = this, + mode = t.isVideo ? t.options.videoVolume : t.options.audioVolume, + muteText = (0, _general.isString)(t.options.muteText) ? t.options.muteText : _i18n2.default.t('mejs.mute'), + unmuteText = (0, _general.isString)(t.options.unmuteText) ? t.options.unmuteText : _i18n2.default.t('mejs.unmute'), + volumeControlText = (0, _general.isString)(t.options.allyVolumeControlText) ? t.options.allyVolumeControlText : _i18n2.default.t('mejs.volume-help-text'), + mute = _document2.default.createElement('div'); + + mute.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'volume-button ' + t.options.classPrefix + 'mute'; + mute.innerHTML = mode === 'horizontal' ? '<button type="button" aria-controls="' + t.id + '" title="' + muteText + '" aria-label="' + muteText + '" tabindex="0"></button>' : '<button type="button" aria-controls="' + t.id + '" title="' + muteText + '" aria-label="' + muteText + '" tabindex="0"></button>' + ('<a href="javascript:void(0);" class="' + t.options.classPrefix + 'volume-slider">') + ('<span class="' + t.options.classPrefix + 'offscreen">' + volumeControlText + '</span>') + ('<div class="' + t.options.classPrefix + 'volume-total">') + ('<div class="' + t.options.classPrefix + 'volume-current"></div>') + ('<div class="' + t.options.classPrefix + 'volume-handle"></div>') + '</div>' + '</a>'; + + t.addControlElement(mute, 'volume'); + + // horizontal version + if (mode === 'horizontal') { + var anchor = _document2.default.createElement('a'); + anchor.className = t.options.classPrefix + 'horizontal-volume-slider'; + anchor.href = 'javascript:void(0);'; + anchor.innerHTML += '<span class="' + t.options.classPrefix + 'offscreen">' + volumeControlText + '</span>' + ('<div class="' + t.options.classPrefix + 'horizontal-volume-total">') + ('<div class="' + t.options.classPrefix + 'horizontal-volume-current"></div>') + ('<div class="' + t.options.classPrefix + 'horizontal-volume-handle"></div>') + '</div>'; + mute.parentNode.insertBefore(anchor, mute.nextSibling); + } + + var volumeSlider = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-slider') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-slider'), + volumeTotal = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-total') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-total'), + volumeCurrent = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-current') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-current'), + volumeHandle = mode === 'vertical' ? t.container.querySelector('.' + t.options.classPrefix + 'volume-handle') : t.container.querySelector('.' + t.options.classPrefix + 'horizontal-volume-handle'), + button = mute.firstElementChild, + + + /** + * @private + * @param {Number} volume + */ + positionVolumeHandle = function positionVolumeHandle(volume) { + + // correct to 0-1 + volume = Math.max(0, volume); + volume = Math.min(volume, 1); + + // adjust mute button style + if (volume === 0) { + (0, _dom.removeClass)(mute, t.options.classPrefix + 'mute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'unmute'); + var _button = mute.firstElementChild; + _button.setAttribute('title', unmuteText); + _button.setAttribute('aria-label', unmuteText); + } else { + (0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'mute'); + var _button2 = mute.firstElementChild; + _button2.setAttribute('title', muteText); + _button2.setAttribute('aria-label', muteText); + } + + var volumePercentage = volume * 100 + '%', + volumeStyles = getComputedStyle(volumeHandle); + + // position slider + if (mode === 'vertical') { + volumeCurrent.style.bottom = 0; + volumeCurrent.style.height = volumePercentage; + volumeHandle.style.bottom = volumePercentage; + volumeHandle.style.marginBottom = -parseFloat(volumeStyles.height) / 2 + 'px'; + } else { + volumeCurrent.style.left = 0; + volumeCurrent.style.width = volumePercentage; + volumeHandle.style.left = volumePercentage; + volumeHandle.style.marginLeft = -parseFloat(volumeStyles.width) / 2 + 'px'; + } + }, + + /** + * @private + */ + handleVolumeMove = function handleVolumeMove(e) { + + var totalOffset = (0, _dom.offset)(volumeTotal), + volumeStyles = getComputedStyle(volumeTotal); + + var volume = null; + + // calculate the new volume based on the most recent position + if (mode === 'vertical') { + + var railHeight = parseFloat(volumeStyles.height), + newY = e.pageY - totalOffset.top; + + volume = (railHeight - newY) / railHeight; + + // the controls just hide themselves (usually when mouse moves too far up) + if (totalOffset.top === 0 || totalOffset.left === 0) { + return; + } + } else { + var railWidth = parseFloat(volumeStyles.width), + newX = e.pageX - totalOffset.left; + + volume = newX / railWidth; + } + + // ensure the volume isn't outside 0-1 + volume = Math.max(0, volume); + volume = Math.min(volume, 1); + + // position the slider and handle + positionVolumeHandle(volume); + + // set the media object (this will trigger the `volumechanged` event) + if (volume === 0) { + media.setMuted(true); + } else { + media.setMuted(false); + } + media.setVolume(volume); + + e.preventDefault(); + e.stopPropagation(); + }; + + mute.addEventListener('mouseenter', function (e) { + if (e.target === mute) { + volumeSlider.style.display = 'block'; + mouseIsOver = true; + e.preventDefault(); + e.stopPropagation(); + } + }); + mute.addEventListener('focusin', function () { + volumeSlider.style.display = 'block'; + mouseIsOver = true; + }); + mute.addEventListener('mouseleave', function () { + mouseIsOver = false; + if (!mouseIsDown && mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + mute.addEventListener('focusout', function () { + mouseIsOver = false; + if (!mouseIsDown && mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + mute.addEventListener('keydown', function (e) { + + if (t.options.keyActions.length) { + var keyCode = e.which || e.keyCode || 0, + volume = media.volume; + switch (keyCode) { + case 38: + // Up + volume = Math.min(volume + 0.1, 1); + break; + case 40: + // Down + volume = Math.max(0, volume - 0.1); + break; + default: + return true; + } + + mouseIsDown = false; + positionVolumeHandle(volume); + media.setVolume(volume); + + e.preventDefault(); + e.stopPropagation(); + } + }); + + var mouseIsDown = false, + mouseIsOver = false, + + + /** + * @private + */ + updateVolumeSlider = function updateVolumeSlider() { + var volume = Math.floor(media.volume * 100); + volumeSlider.setAttribute('aria-label', _i18n2.default.t('mejs.volume-slider')); + volumeSlider.setAttribute('aria-valuemin', 0); + volumeSlider.setAttribute('aria-valuemax', 100); + volumeSlider.setAttribute('aria-valuenow', volume); + volumeSlider.setAttribute('aria-valuetext', volume + '%'); + volumeSlider.setAttribute('role', 'slider'); + volumeSlider.tabIndex = -1; + }; + + // Events + volumeSlider.addEventListener('dragstart', function () { + return false; + }); + + volumeSlider.addEventListener('mouseover', function () { + mouseIsOver = true; + }); + volumeSlider.addEventListener('mousedown', function (e) { + handleVolumeMove(e); + t.globalBind('mousemove.vol', function (event) { + var target = event.target; + if (mouseIsDown && (target === volumeSlider || target.closest(mode === 'vertical' ? '.' + t.options.classPrefix + 'volume-slider' : '.' + t.options.classPrefix + 'horizontal-volume-slider'))) { + handleVolumeMove(event); + } + }); + t.globalBind('mouseup.vol', function () { + mouseIsDown = false; + t.globalUnbind('mousemove.vol mouseup.vol'); + + if (!mouseIsOver && mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + mouseIsDown = true; + + e.preventDefault(); + e.stopPropagation(); + }); + + // MUTE button + button.addEventListener('click', function () { + media.setMuted(!media.muted); + var event = (0, _general.createEvent)('volumechange', media); + media.dispatchEvent(event); + }); + button.addEventListener('focus', function () { + if (mode === 'vertical') { + volumeSlider.style.display = 'block'; + } + }); + button.addEventListener('blur', function () { + if (mode === 'vertical') { + volumeSlider.style.display = 'none'; + } + }); + + // listen for volume change events from other sources + media.addEventListener('volumechange', function (e) { + if (!mouseIsDown) { + if (media.muted) { + positionVolumeHandle(0); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'mute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'unmute'); + } else { + positionVolumeHandle(media.volume); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'mute'); + } + } + updateVolumeSlider(e); + }); + + // mutes the media and sets the volume icon muted if the initial volume is set to 0 + if (player.options.startVolume === 0) { + media.setMuted(true); + } + + // shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements + var isNative = t.media.rendererName !== null && t.media.rendererName.match(/(native|html5)/) !== null; + + if (isNative) { + media.setVolume(player.options.startVolume); + } + + t.container.addEventListener('controlsresize', function () { + if (media.muted) { + positionVolumeHandle(0); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'mute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'unmute'); + } else { + positionVolumeHandle(media.volume); + (0, _dom.removeClass)(mute, t.options.classPrefix + 'unmute'); + (0, _dom.addClass)(mute, t.options.classPrefix + 'mute'); + } + }); + } +}); + +},{"16":16,"19":19,"2":2,"20":20,"21":21,"4":4}],14:[function(_dereq_,module,exports){ +'use strict'; + +/*! + * This is a `i18n` language object. + * + * English; This can serve as a template for other languages to translate + * + * @author + * TBD + * Sascha Greuel (Twitter: @SoftCreatR) + * + * @see core/i18n.js + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var EN = exports.EN = { + "mejs.plural-form": 1, + + // core/mediaelement.js + "mejs.download-file": "Download File", + + // renderers/flash.js + "mejs.install-flash": "You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/", + + // features/fullscreen.js + "mejs.fullscreen": "Fullscreen", + + // features/playpause.js + "mejs.play": "Play", + "mejs.pause": "Pause", + + // features/progress.js + "mejs.time-slider": "Time Slider", + "mejs.time-help-text": "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.", + "mejs.live-broadcast": "Live Broadcast", + + // features/volume.js + "mejs.volume-help-text": "Use Up/Down Arrow keys to increase or decrease volume.", + "mejs.unmute": "Unmute", + "mejs.mute": "Mute", + "mejs.volume-slider": "Volume Slider", + + // core/player.js + "mejs.video-player": "Video Player", + "mejs.audio-player": "Audio Player", + + // features/tracks.js + "mejs.captions-subtitles": "Captions/Subtitles", + "mejs.captions-chapters": "Chapters", + "mejs.none": "None", + "mejs.afrikaans": "Afrikaans", + "mejs.albanian": "Albanian", + "mejs.arabic": "Arabic", + "mejs.belarusian": "Belarusian", + "mejs.bulgarian": "Bulgarian", + "mejs.catalan": "Catalan", + "mejs.chinese": "Chinese", + "mejs.chinese-simplified": "Chinese (Simplified)", + "mejs.chinese-traditional": "Chinese (Traditional)", + "mejs.croatian": "Croatian", + "mejs.czech": "Czech", + "mejs.danish": "Danish", + "mejs.dutch": "Dutch", + "mejs.english": "English", + "mejs.estonian": "Estonian", + "mejs.filipino": "Filipino", + "mejs.finnish": "Finnish", + "mejs.french": "French", + "mejs.galician": "Galician", + "mejs.german": "German", + "mejs.greek": "Greek", + "mejs.haitian-creole": "Haitian Creole", + "mejs.hebrew": "Hebrew", + "mejs.hindi": "Hindi", + "mejs.hungarian": "Hungarian", + "mejs.icelandic": "Icelandic", + "mejs.indonesian": "Indonesian", + "mejs.irish": "Irish", + "mejs.italian": "Italian", + "mejs.japanese": "Japanese", + "mejs.korean": "Korean", + "mejs.latvian": "Latvian", + "mejs.lithuanian": "Lithuanian", + "mejs.macedonian": "Macedonian", + "mejs.malay": "Malay", + "mejs.maltese": "Maltese", + "mejs.norwegian": "Norwegian", + "mejs.persian": "Persian", + "mejs.polish": "Polish", + "mejs.portuguese": "Portuguese", + "mejs.romanian": "Romanian", + "mejs.russian": "Russian", + "mejs.serbian": "Serbian", + "mejs.slovak": "Slovak", + "mejs.slovenian": "Slovenian", + "mejs.spanish": "Spanish", + "mejs.swahili": "Swahili", + "mejs.swedish": "Swedish", + "mejs.tagalog": "Tagalog", + "mejs.thai": "Thai", + "mejs.turkish": "Turkish", + "mejs.ukrainian": "Ukrainian", + "mejs.vietnamese": "Vietnamese", + "mejs.welsh": "Welsh", + "mejs.yiddish": "Yiddish" +}; + +},{}],15:[function(_dereq_,module,exports){ +'use strict'; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +if (typeof jQuery !== 'undefined') { + _mejs2.default.$ = _window2.default.jQuery = _window2.default.$ = jQuery; +} else if (typeof Zepto !== 'undefined') { + _mejs2.default.$ = _window2.default.Zepto = _window2.default.$ = Zepto; +} else if (typeof ender !== 'undefined') { + _mejs2.default.$ = _window2.default.ender = _window2.default.$ = ender; +} + +},{"3":3,"6":6}],16:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.config = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _mediaelement = _dereq_(5); + +var _mediaelement2 = _interopRequireDefault(_mediaelement); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _constants = _dereq_(19); + +var _general = _dereq_(21); + +var _time = _dereq_(24); + +var _media = _dereq_(22); + +var _dom = _dereq_(20); + +var dom = _interopRequireWildcard(_dom); + +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"); } } + +_mejs2.default.mepIndex = 0; + +_mejs2.default.players = {}; + +// default player values +var config = exports.config = { + // url to poster (to fix iOS 3.x) + poster: '', + // When the video is ended, show the poster. + showPosterWhenEnded: false, + // When the video is paused, show the poster. + showPosterWhenPaused: false, + // Default if the <video width> is not specified + defaultVideoWidth: 480, + // Default if the <video height> is not specified + defaultVideoHeight: 270, + // If set, overrides <video width> + videoWidth: -1, + // If set, overrides <video height> + videoHeight: -1, + // Default if the user doesn't specify + defaultAudioWidth: 400, + // Default if the user doesn't specify + defaultAudioHeight: 40, + // Default amount to move back when back key is pressed + defaultSeekBackwardInterval: function defaultSeekBackwardInterval(media) { + return media.duration * 0.05; + }, + // Default amount to move forward when forward key is pressed + defaultSeekForwardInterval: function defaultSeekForwardInterval(media) { + return media.duration * 0.05; + }, + // Set dimensions via JS instead of CSS + setDimensions: true, + // Width of audio player + audioWidth: -1, + // Height of audio player + audioHeight: -1, + // Initial volume when the player starts (overridden by user cookie) + startVolume: 0.8, + // Useful for <audio> player loops + loop: false, + // Rewind to beginning when media ends + autoRewind: true, + // Resize to media dimensions + enableAutosize: true, + /* + * Time format to use. Default: 'mm:ss' + * Supported units: + * h: hour + * m: minute + * s: second + * f: frame count + * When using 'hh', 'mm', 'ss' or 'ff' we always display 2 digits. + * If you use 'h', 'm', 's' or 'f' we display 1 digit if possible. + * + * Example to display 75 seconds: + * Format 'mm:ss': 01:15 + * Format 'm:ss': 1:15 + * Format 'm:s': 1:15 + */ + timeFormat: '', + // Force the hour marker (##:00:00) + alwaysShowHours: false, + // Show framecount in timecode (##:00:00:00) + showTimecodeFrameCount: false, + // Used when showTimecodeFrameCount is set to true + framesPerSecond: 25, + // Hide controls when playing and mouse is not over the video + alwaysShowControls: false, + // Display the video control when media is loading + hideVideoControlsOnLoad: false, + // Display the video controls when media is paused + hideVideoControlsOnPause: false, + // Enable click video element to toggle play/pause + clickToPlayPause: true, + // Time in ms to hide controls + controlsTimeoutDefault: 1500, + // Time in ms to trigger the timer when mouse moves + controlsTimeoutMouseEnter: 2500, + // Time in ms to trigger the timer when mouse leaves + controlsTimeoutMouseLeave: 1000, + // Force iPad's native controls + iPadUseNativeControls: false, + // Force iPhone's native controls + iPhoneUseNativeControls: false, + // Force Android's native controls + AndroidUseNativeControls: false, + // Features to show + features: ['playpause', 'current', 'progress', 'duration', 'tracks', 'volume', 'fullscreen'], + // Only for dynamic + isVideo: true, + // Stretching modes (auto, fill, responsive, none) + stretching: 'auto', + // Prefix class names on elements + classPrefix: 'mejs__', + // Turn keyboard support on and off for this instance + enableKeyboard: true, + // When this player starts, it will pause other players + pauseOtherPlayers: true, + // Number of decimal places to show if frames are shown + secondsDecimalLength: 0, + // Array of keyboard actions such as play/pause + keyActions: [{ + keys: [32, // SPACE + 179 // GOOGLE play/pause button + ], + action: function action(player, media) { + + if (!_constants.IS_FIREFOX) { + if (media.paused || media.ended) { + media.play(); + } else { + media.pause(); + } + } + } + }, { + keys: [38], // UP + action: function action(player, media) { + + if (player.container.querySelector('.' + config.classPrefix + 'volume-button>button').matches(':focus') || player.container.querySelector('.' + config.classPrefix + 'volume-slider').matches(':focus')) { + player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = ''; + } + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + var newVolume = Math.min(media.volume + 0.1, 1); + media.setVolume(newVolume); + if (newVolume > 0) { + media.setMuted(false); + } + } + }, { + keys: [40], // DOWN + action: function action(player, media) { + + if (player.container.querySelector('.' + config.classPrefix + 'volume-button>button').matches(':focus') || player.container.querySelector('.' + config.classPrefix + 'volume-slider').matches(':focus')) { + player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = ''; + } + + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + var newVolume = Math.max(media.volume - 0.1, 0); + media.setVolume(newVolume); + + if (newVolume <= 0.1) { + media.setMuted(true); + } + } + }, { + keys: [37, // LEFT + 227 // Google TV rewind + ], + action: function action(player, media) { + if (!isNaN(media.duration) && media.duration > 0) { + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + // 5% + var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0); + media.setCurrentTime(newTime); + } + } + }, { + keys: [39, // RIGHT + 228 // Google TV forward + ], + action: function action(player, media) { + + if (!isNaN(media.duration) && media.duration > 0) { + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + + // 5% + var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration); + media.setCurrentTime(newTime); + } + } + }, { + keys: [70], // F + action: function action(player, media, key, event) { + if (!event.ctrlKey) { + if (typeof player.enterFullScreen !== 'undefined') { + if (player.isFullScreen) { + player.exitFullScreen(); + } else { + player.enterFullScreen(); + } + } + } + } + }, { + keys: [77], // M + action: function action(player) { + + player.container.querySelector('.' + config.classPrefix + 'volume-slider').style.display = ''; + if (player.isVideo) { + player.showControls(); + player.startControlsTimer(); + } + if (player.media.muted) { + player.setMuted(false); + } else { + player.setMuted(true); + } + } + }] +}; + +_mejs2.default.MepDefaults = config; + +/** + * Wrap a MediaElement object in player controls + * + * @constructor + * @param {HTMLElement|String} node + * @param {Object} o + * @return {?MediaElementPlayer} + */ + +var MediaElementPlayer = function () { + function MediaElementPlayer(node, o) { + _classCallCheck(this, MediaElementPlayer); + + var t = this, + element = typeof node === 'string' ? _document2.default.getElementById(node) : node; + + t.hasFocus = false; + + t.controlsAreVisible = true; + + t.controlsEnabled = true; + + t.controlsTimer = null; + + // enforce object, even without "new" (via John Resig) + if (!(t instanceof MediaElementPlayer)) { + return new MediaElementPlayer(element, o); + } + + // these will be reset after the MediaElement.success fires + // t.media will be the fake node to emulate all HTML5 events, methods, etc + // t.node will be the node to be restored + t.node = t.media = element; + + if (!t.node) { + return; + } + + // check for existing player + if (t.media.player !== undefined) { + return t.media.player; + } + + // try to get options from data-mejsoptions + if (o === undefined) { + o = t.node.getAttribute('data-mejsoptions'); + } + + // extend default options + t.options = Object.assign({}, config, o); + + if (!t.options.timeFormat) { + // Generate the time format according to options + t.options.timeFormat = 'mm:ss'; + if (t.options.alwaysShowHours) { + t.options.timeFormat = 'hh:mm:ss'; + } + if (t.options.showTimecodeFrameCount) { + t.options.timeFormat += ':ff'; + } + } + + (0, _time.calculateTimeFormat)(0, t.options, t.options.framesPerSecond || 25); + + // unique ID + t.id = 'mep_' + _mejs2.default.mepIndex++; + + // add to player array (for focus events) + _mejs2.default.players[t.id] = t; + + // start up + var meOptions = Object.assign({}, t.options, { + success: function success(media, domNode) { + t._meReady(media, domNode); + }, + error: function error(e) { + t._handleError(e); + } + }), + tagName = t.node.tagName.toLowerCase(); + + // get video from src or href? + t.isDynamic = tagName !== 'audio' && tagName !== 'video'; + t.isVideo = t.isDynamic ? t.options.isVideo : tagName !== 'audio' && t.options.isVideo; + + // use native controls in iPad, iPhone, and Android + if (_constants.IS_IPAD && t.options.iPadUseNativeControls || _constants.IS_IPHONE && t.options.iPhoneUseNativeControls) { + + // add controls and stop + t.node.setAttribute('controls', true); + + // override Apple's autoplay override for iPads + if (_constants.IS_IPAD && t.node.getAttribute('autoplay')) { + t.play(); + } + } else if ((t.isVideo || !t.isVideo && t.options.features.length) && !(_constants.IS_ANDROID && t.options.AndroidUseNativeControls)) { + + // DESKTOP: use MediaElementPlayer controls + + // remove native controls + t.node.removeAttribute('controls'); + var videoPlayerTitle = t.isVideo ? _i18n2.default.t('mejs.video-player') : _i18n2.default.t('mejs.audio-player'); + // insert description for screen readers + var offscreen = _document2.default.createElement('span'); + offscreen.className = t.options.classPrefix + 'offscreen'; + offscreen.innerText = videoPlayerTitle; + t.media.parentNode.insertBefore(offscreen, t.media); + + // build container + t.container = _document2.default.createElement('div'); + t.container.id = t.id; + t.container.className = t.options.classPrefix + 'container ' + t.options.classPrefix + 'container-keyboard-inactive ' + t.media.className; + t.container.tabIndex = 0; + t.container.setAttribute('role', 'application'); + t.container.setAttribute('aria-label', videoPlayerTitle); + t.container.innerHTML = '<div class="' + t.options.classPrefix + 'inner">' + ('<div class="' + t.options.classPrefix + 'layers"></div>') + ('<div class="' + t.options.classPrefix + 'controls"></div>') + ('<div class="' + t.options.classPrefix + 'mediaelement"></div>') + ('<div class="' + t.options.classPrefix + 'clear"></div>') + '</div>'; + t.container.addEventListener('focus', function (e) { + if (!t.controlsAreVisible && !t.hasFocus && t.controlsEnabled) { + t.showControls(true); + // In versions older than IE11, the focus causes the playbar to be displayed + // if user clicks on the Play/Pause button in the control bar once it attempts + // to hide it + if (!_constants.HAS_MS_NATIVE_FULLSCREEN) { + // If e.relatedTarget appears before container, send focus to play button, + // else send focus to last control button. + var btnSelector = (0, _general.isNodeAfter)(e.relatedTarget, t.container) ? '.' + t.options.classPrefix + 'controls .' + t.options.classPrefix + 'button:last-child > button' : '.' + t.options.classPrefix + 'playpause-button > button', + button = t.container.querySelector(btnSelector); + + button.focus(); + } + } + }); + t.node.parentNode.insertBefore(t.container, t.node); + + // When no elements in controls, hide bar completely + if (!t.options.features.length) { + t.container.style.background = 'transparent'; + t.container.querySelector('.' + t.options.classPrefix + 'controls').style.display = 'none'; + } + + if (t.isVideo && t.options.stretching === 'fill' && !dom.hasClass(t.container.parentNode, t.options.classPrefix + 'fill-container')) { + // outer container + t.outerContainer = t.media.parentNode; + + var wrapper = _document2.default.createElement('div'); + wrapper.className = t.options.classPrefix + 'fill-container'; + t.container.parentNode.insertBefore(wrapper, t.container); + wrapper.appendChild(t.container); + } + + // add classes for user and content + if (_constants.IS_ANDROID) { + dom.addClass(t.container, t.options.classPrefix + 'android'); + } + if (_constants.IS_IOS) { + dom.addClass(t.container, t.options.classPrefix + 'ios'); + } + if (_constants.IS_IPAD) { + dom.addClass(t.container, t.options.classPrefix + 'ipad'); + } + if (_constants.IS_IPHONE) { + dom.addClass(t.container, t.options.classPrefix + 'iphone'); + } + dom.addClass(t.container, t.isVideo ? t.options.classPrefix + 'video' : t.options.classPrefix + 'audio'); + + // move the <video/video> tag into the right spot + t.container.querySelector('.' + t.options.classPrefix + 'mediaelement').appendChild(t.node); + + // needs to be assigned here, after iOS remap + t.media.player = t; + + // find parts + t.controls = t.container.querySelector('.' + t.options.classPrefix + 'controls'); + t.layers = t.container.querySelector('.' + t.options.classPrefix + 'layers'); + + // determine the size + + /* size priority: + (1) videoWidth (forced), + (2) style="width;height;" + (3) width attribute, + (4) defaultVideoWidth (for unspecified cases) + */ + + var tagType = t.isVideo ? 'video' : 'audio', + capsTagName = tagType.substring(0, 1).toUpperCase() + tagType.substring(1); + + if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) { + t.width = t.options[tagType + 'Width']; + } else if (t.node.style.width !== '' && t.node.style.width !== null) { + t.width = t.node.style.width; + } else if (t.node.getAttribute('width')) { + t.width = t.node.getAttribute('width'); + } else { + t.width = t.options['default' + capsTagName + 'Width']; + } + + if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) { + t.height = t.options[tagType + 'Height']; + } else if (t.node.style.height !== '' && t.node.style.height !== null) { + t.height = t.node.style.height; + } else if (t.node.getAttribute('height')) { + t.height = t.node.getAttribute('height'); + } else { + t.height = t.options['default' + capsTagName + 'Height']; + } + + t.initialAspectRatio = t.height >= t.width ? t.width / t.height : t.height / t.width; + + // set the size, while we wait for the plugins to load below + t.setPlayerSize(t.width, t.height); + + // create MediaElementShim + meOptions.pluginWidth = t.width; + meOptions.pluginHeight = t.height; + } + // Hide media completely for audio that doesn't have any features + else if (!t.isVideo && !t.options.features.length) { + t.node.style.display = 'none'; + } + + // create MediaElement shim + new _mediaelement2.default(t.media, meOptions); + + if (t.container !== undefined && t.options.features.length && t.controlsAreVisible && !t.options.hideVideoControlsOnLoad) { + // controls are shown when loaded + var event = (0, _general.createEvent)('controlsshown', t.container); + t.container.dispatchEvent(event); + } + + return t; + } + + _createClass(MediaElementPlayer, [{ + key: 'showControls', + value: function showControls(doAnimation) { + var t = this; + + doAnimation = doAnimation === undefined || doAnimation; + + if (t.controlsAreVisible) { + return; + } + + if (doAnimation) { + (function () { + dom.removeClass(t.controls, t.options.classPrefix + 'offscreen'); + dom.fadeIn(t.controls, 200, function () { + var event = (0, _general.createEvent)('controlsshown', t.container); + t.container.dispatchEvent(event); + }); + + // any additional controls people might add and want to hide + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + + var _loop = function _loop(i, total) { + dom.fadeIn(controls[i], 200, function () { + dom.removeClass(controls[i], t.options.classPrefix + 'offscreen'); + }); + }; + + for (var i = 0, total = controls.length; i < total; i++) { + _loop(i, total); + } + })(); + } else { + dom.removeClass(t.controls, t.options.classPrefix + 'offscreen'); + t.controls.style.display = ''; + + // any additional controls people might add and want to hide + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + for (var i = 0, total = controls.length; i < total; i++) { + dom.removeClass(controls[i], t.options.classPrefix + 'offscreen'); + controls[i].style.display = ''; + } + + var event = (0, _general.createEvent)('controlsshown', t.container); + t.container.dispatchEvent(event); + } + + t.controlsAreVisible = true; + t.setControlsSize(); + } + }, { + key: 'hideControls', + value: function hideControls(doAnimation, forceHide) { + var t = this; + + doAnimation = doAnimation === undefined || doAnimation; + + if (forceHide !== true && (!t.controlsAreVisible || t.options.alwaysShowControls || t.keyboardAction || t.media.paused && t.media.readyState === 4 && (!t.options.hideVideoControlsOnLoad && t.media.currentTime <= 0 || !t.options.hideVideoControlsOnPause && t.media.currentTime > 0) || t.isVideo && !t.options.hideVideoControlsOnLoad && !t.media.readyState || t.media.ended)) { + return; + } + + if (doAnimation) { + (function () { + // fade out main controls + dom.fadeOut(t.controls, 200, function () { + dom.addClass(t.controls, t.options.classPrefix + 'offscreen'); + t.controls.style.display = ''; + var event = (0, _general.createEvent)('controlshidden', t.container); + t.container.dispatchEvent(event); + }); + + // any additional controls people might add and want to hide + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + + var _loop2 = function _loop2(i, total) { + dom.fadeOut(controls[i], 200, function () { + dom.addClass(controls[i], t.options.classPrefix + 'offscreen'); + controls[i].style.display = ''; + }); + }; + + for (var i = 0, total = controls.length; i < total; i++) { + _loop2(i, total); + } + })(); + } else { + + // hide main controls + dom.addClass(t.controls, t.options.classPrefix + 'offscreen'); + t.controls.style.display = ''; + + // hide others + var controls = t.container.querySelectorAll('.' + t.options.classPrefix + 'control'); + for (var i = 0, total = controls.length; i < total; i++) { + dom.addClass(controls[i], t.options.classPrefix + 'offscreen'); + controls[i].style.display = ''; + } + + var event = (0, _general.createEvent)('controlshidden', t.container); + t.container.dispatchEvent(event); + } + + t.controlsAreVisible = false; + } + }, { + key: 'startControlsTimer', + value: function startControlsTimer(timeout) { + + var t = this; + + timeout = typeof timeout !== 'undefined' ? timeout : t.options.controlsTimeoutDefault; + + t.killControlsTimer('start'); + + t.controlsTimer = setTimeout(function () { + t.hideControls(); + t.killControlsTimer('hide'); + }, timeout); + } + }, { + key: 'killControlsTimer', + value: function killControlsTimer() { + + var t = this; + + if (t.controlsTimer !== null) { + clearTimeout(t.controlsTimer); + delete t.controlsTimer; + t.controlsTimer = null; + } + } + }, { + key: 'disableControls', + value: function disableControls() { + var t = this; + + t.killControlsTimer(); + t.controlsEnabled = true; + t.hideControls(false, true); + } + }, { + key: 'enableControls', + value: function enableControls() { + var t = this; + + t.controlsEnabled = true; + t.showControls(false); + } + + /** + * Set up all controls and events + * + * @param media + * @param domNode + * @private + */ + + }, { + key: '_meReady', + value: function _meReady(media, domNode) { + + var t = this, + autoplayAttr = domNode.getAttribute('autoplay'), + autoplay = !(autoplayAttr === undefined || autoplayAttr === null || autoplayAttr === 'false'), + isNative = media.rendererName !== null && media.rendererName.match(/(native|html5)/) !== null; + + if (t.controls) { + t.enableControls(); + } + + if (t.container.querySelector('.' + t.options.classPrefix + 'overlay-play')) { + t.container.querySelector('.' + t.options.classPrefix + 'overlay-play').style.display = ''; + } + + // make sure it can't create itself again if a plugin reloads + if (t.created) { + return; + } + + t.created = true; + t.media = media; + t.domNode = domNode; + + if (!(_constants.IS_ANDROID && t.options.AndroidUseNativeControls) && !(_constants.IS_IPAD && t.options.iPadUseNativeControls) && !(_constants.IS_IPHONE && t.options.iPhoneUseNativeControls)) { + var _ret5 = function () { + + // In the event that no features are specified for audio, + // create only MediaElement instance rather than + // doing all the work to create a full player + if (!t.isVideo && !t.options.features.length) { + + // force autoplay for HTML5 + if (autoplay && isNative) { + t.play(); + } + + if (t.options.success) { + + if (typeof t.options.success === 'string') { + _window2.default[t.options.success](t.media, t.domNode, t); + } else { + t.options.success(t.media, t.domNode, t); + } + } + + return { + v: void 0 + }; + } + + // two built in features + t.buildposter(t, t.controls, t.layers, t.media); + t.buildkeyboard(t, t.controls, t.layers, t.media); + t.buildoverlays(t, t.controls, t.layers, t.media); + + // grab for use by features + t.findTracks(); + + // cache container to store control elements' original position + t.featurePosition = {}; + + // add user-defined features/controls + for (var i = 0, total = t.options.features.length; i < total; i++) { + var feature = t.options.features[i]; + if (t['build' + feature]) { + try { + t['build' + feature](t, t.controls, t.layers, t.media); + } catch (e) { + // TODO: report control error + console.error('error building ' + feature, e); + } + } + } + + var event = (0, _general.createEvent)('controlsready', t.container); + t.container.dispatchEvent(event); + + // reset all layers and controls + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + + // controls fade + if (t.isVideo) { + + // create callback here since it needs access to current + // MediaElement object + t.clickToPlayPauseCallback = function () { + + if (t.options.clickToPlayPause) { + var button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'), + pressed = button.getAttribute('aria-pressed'); + + if (t.media.paused && pressed) { + t.pause(); + } else if (t.media.paused) { + t.play(); + } else { + t.pause(); + } + + button.setAttribute('aria-pressed', !pressed); + } + }; + + t.createIframeLayer(); + + // click to play/pause + t.media.addEventListener('click', t.clickToPlayPauseCallback); + + if ((_constants.IS_ANDROID || _constants.IS_IOS) && !t.options.alwaysShowControls) { + + // for touch devices (iOS, Android) + // show/hide without animation on touch + t.node.addEventListener('touchstart', function () { + + // toggle controls + if (t.controlsAreVisible) { + t.hideControls(false); + } else { + if (t.controlsEnabled) { + t.showControls(false); + } + } + }); + } else { + + // show/hide controls + t.container.addEventListener('mouseenter', function () { + if (t.controlsEnabled) { + if (!t.options.alwaysShowControls) { + t.killControlsTimer('enter'); + t.showControls(); + t.startControlsTimer(t.options.controlsTimeoutMouseEnter); + } + } + }); + t.container.addEventListener('mousemove', function () { + if (t.controlsEnabled) { + if (!t.controlsAreVisible) { + t.showControls(); + } + if (!t.options.alwaysShowControls) { + t.startControlsTimer(t.options.controlsTimeoutMouseEnter); + } + } + }); + t.container.addEventListener('mouseleave', function () { + if (t.controlsEnabled) { + if (!t.media.paused && !t.options.alwaysShowControls) { + t.startControlsTimer(t.options.controlsTimeoutMouseLeave); + } + } + }); + } + + if (t.options.hideVideoControlsOnLoad) { + t.hideControls(false); + } + + // check for autoplay + if (autoplay && !t.options.alwaysShowControls) { + t.hideControls(); + } + + // resizer + if (t.options.enableAutosize) { + t.media.addEventListener('loadedmetadata', function (e) { + // if the <video height> was not set and the options.videoHeight was not set + // then resize to the real dimensions + if (t.options.videoHeight <= 0 && !t.domNode.getAttribute('height') && e.target !== null && !isNaN(e.target.videoHeight)) { + t.setPlayerSize(e.target.videoWidth, e.target.videoHeight); + t.setControlsSize(); + t.media.setSize(e.target.videoWidth, e.target.videoHeight); + } + }); + } + } + + // EVENTS + + // FOCUS: when a video starts playing, it takes focus from other players (possibly pausing them) + t.media.addEventListener('play', function () { + t.hasFocus = true; + + // go through all other players + for (var playerIndex in _mejs2.default.players) { + if (_mejs2.default.players.hasOwnProperty(playerIndex)) { + var p = _mejs2.default.players[playerIndex]; + + if (p.id !== t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) { + p.pause(); + p.hasFocus = false; + } + } + } + }); + + // ended for all + t.media.addEventListener('ended', function () { + if (t.options.autoRewind) { + try { + t.media.setCurrentTime(0); + // Fixing an Android stock browser bug, where "seeked" isn't fired correctly after + // ending the video and jumping to the beginning + setTimeout(function () { + t.container.querySelector('.' + t.options.classPrefix + 'overlay-loading').parentNode.style.display = 'none'; + }, 20); + } catch (exp) { + + } + } + + if (typeof t.media.stop === 'function') { + t.media.stop(); + } else { + t.media.pause(); + } + + if (t.setProgressRail) { + t.setProgressRail(); + } + if (t.setCurrentRail) { + t.setCurrentRail(); + } + + if (t.options.loop) { + t.play(); + } else if (!t.options.alwaysShowControls && t.controlsEnabled) { + t.showControls(); + } + }); + + // resize on the first play + t.media.addEventListener('loadedmetadata', function () { + + (0, _time.calculateTimeFormat)(t.duration, t.options, t.options.framesPerSecond || 25); + + if (t.updateDuration) { + t.updateDuration(); + } + if (t.updateCurrent) { + t.updateCurrent(); + } + + if (!t.isFullScreen) { + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + } + }); + + // Only change the time format when necessary + var duration = null; + t.media.addEventListener('timeupdate', function () { + if (duration !== t.media.duration) { + duration = t.media.duration; + (0, _time.calculateTimeFormat)(duration, t.options, t.options.framesPerSecond || 25); + + // make sure to fill in and resize the controls (e.g., 00:00 => 01:13:15 + if (t.updateDuration) { + t.updateDuration(); + } + if (t.updateCurrent) { + t.updateCurrent(); + } + t.setControlsSize(); + } + }); + + t.container.addEventListener('focusout', function (e) { + setTimeout(function () { + //FF is working on supporting focusout https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + if (e.relatedTarget) { + if (t.keyboardAction && !e.relatedTarget.closest('.mejs-container')) { + t.keyboardAction = false; + if (t.isVideo && !t.options.alwaysShowControls) { + t.hideControls(true); + } + } + } + }, 0); + }); + + // webkit has trouble doing this without a delay + setTimeout(function () { + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + }, 0); + + // adjust controls whenever window sizes (used to be in fullscreen only) + t.globalBind('resize', function () { + + // don't resize for fullscreen mode + if (!(t.isFullScreen || _constants.HAS_TRUE_NATIVE_FULLSCREEN && _document2.default.webkitIsFullScreen)) { + t.setPlayerSize(t.width, t.height); + } + + // always adjust controls + t.setControlsSize(); + }); + + // Disable focus outline to improve look-and-feel for regular users + t.globalBind('click', function (e) { + if (e.target.matches('.' + t.options.classPrefix + 'container')) { + dom.addClass(e.target, t.options.classPrefix + 'container-keyboard-inactive'); + } else if (e.target.closest('.' + t.options.classPrefix + 'container')) { + dom.addClass(e.target.closest('.' + t.options.classPrefix + 'container'), t.options.classPrefix + 'container-keyboard-inactive'); + } + }); + + // Enable focus outline for Accessibility purposes + t.globalBind('keydown', function (e) { + if (e.target.matches('.' + t.options.classPrefix + 'container')) { + dom.removeClass(e.target, t.options.classPrefix + 'container-keyboard-inactive'); + } else if (e.target.closest('.' + t.options.classPrefix + 'container')) { + dom.removeClass(event.target.closest('.' + t.options.classPrefix + 'container'), t.options.classPrefix + 'container-keyboard-inactive'); + } + }); + }(); + + if ((typeof _ret5 === 'undefined' ? 'undefined' : _typeof(_ret5)) === "object") return _ret5.v; + } + + // force autoplay for HTML5 + if (autoplay && isNative) { + t.play(); + } + + if (t.options.success) { + + if (typeof t.options.success === 'string') { + _window2.default[t.options.success](t.media, t.domNode, t); + } else { + t.options.success(t.media, t.domNode, t); + } + } + } + + /** + * + * @param {Event} e + * @private + */ + + }, { + key: '_handleError', + value: function _handleError(e) { + var t = this; + + if (t.controls) { + t.disableControls(); + } + + var play = t.layers.querySelector('.' + t.options.classPrefix + 'overlay-play'); + + if (play) { + play.style.display = 'none'; + } + + // Tell user that the file cannot be played + if (t.options.error) { + t.options.error(e); + } + } + }, { + key: 'setPlayerSize', + value: function setPlayerSize(width, height) { + var t = this; + + if (!t.options.setDimensions) { + return false; + } + + if (typeof width !== 'undefined') { + t.width = width; + } + + if (typeof height !== 'undefined') { + t.height = height; + } + + if (typeof FB !== 'undefined' && t.isVideo) { + FB.Event.subscribe('xfbml.ready', function () { + var target = t.media.firstChild; + + t.width = parseFloat(target.offsetWidth); + t.height = parseFloat(target.offsetHeight); + t.setDimensions(t.width, t.height); + return false; + }); + + var target = t.media.firstChild; + + if (target.length) { + t.width = target.offsetWidth; + t.height = target.offsetHeight; + } + } + + // check stretching modes + switch (t.options.stretching) { + case 'fill': + // The 'fill' effect only makes sense on video; for audio we will set the dimensions + if (t.isVideo) { + t.setFillMode(); + } else { + t.setDimensions(t.width, t.height); + } + break; + case 'responsive': + t.setResponsiveMode(); + break; + case 'none': + t.setDimensions(t.width, t.height); + break; + // This is the 'auto' mode + default: + if (t.hasFluidMode() === true) { + t.setResponsiveMode(); + } else { + t.setDimensions(t.width, t.height); + } + break; + } + } + }, { + key: 'hasFluidMode', + value: function hasFluidMode() { + var t = this; + + // detect 100% mode - use currentStyle for IE since css() doesn't return percentages + return t.height.toString().includes('%') || t.node.style.maxWidth && t.node.style.maxWidth !== 'none' && t.node.style.maxWidth !== t.width || t.node.currentStyle && t.node.currentStyle.maxWidth === '100%'; + } + }, { + key: 'setResponsiveMode', + value: function setResponsiveMode() { + var t = this, + parent = function () { + + var parentEl = void 0, + el = t.container; + + // traverse parents to find the closest visible one + while (el) { + parentEl = el.parentElement; + if (parentEl && dom.visible(parentEl)) { + return parentEl; + } + el = parentEl; + } + + return null; + }(), + parentStyles = getComputedStyle(parent, null), + nativeWidth = function () { + if (t.isVideo) { + if (t.media.videoWidth && t.media.videoWidth > 0) { + return t.media.videoWidth; + } else if (t.node.getAttribute('width')) { + return t.node.getAttribute('width'); + } else { + return t.options.defaultVideoWidth; + } + } else { + return t.options.defaultAudioWidth; + } + }(), + nativeHeight = function () { + if (t.isVideo) { + if (t.media.videoHeight && t.media.videoHeight > 0) { + return t.media.videoHeight; + } else if (t.node.getAttribute('height')) { + return t.node.getAttribute('height'); + } else { + return t.options.defaultVideoHeight; + } + } else { + return t.options.defaultAudioHeight; + } + }(), + aspectRatio = function () { + var ratio = 1; + if (!t.isVideo) { + return ratio; + } + + if (t.media.videoWidth && t.media.videoWidth > 0 && t.media.videoHeight && t.media.videoHeight > 0) { + ratio = t.height >= t.width ? t.media.videoWidth / t.media.videoHeight : t.media.videoHeight / t.media.videoWidth; + } else { + ratio = t.initialAspectRatio; + } + + if (isNaN(ratio) || ratio < 0.01 || ratio > 100) { + ratio = 1; + } + + return ratio; + }(), + parentHeight = parseFloat(parentStyles.height); + + var newHeight = void 0, + parentWidth = parseFloat(parentStyles.width); + + if (t.isVideo) { + // Responsive video is based on width: 100% and height: 100% + if (t.height === '100%') { + newHeight = parseInt(parentWidth * nativeHeight / nativeWidth, 10); + } else { + newHeight = t.height >= t.width ? parseInt(parentWidth / aspectRatio, 10) : parseInt(parentWidth * aspectRatio, 10); + } + } else { + newHeight = nativeHeight; + } + + // If we were unable to compute newHeight, get the container height instead + if (isNaN(newHeight)) { + newHeight = parentHeight; + } + + if (t.container.parentNode.length > 0 && t.container.parentNode.tagName.toLowerCase() === 'body') { + parentWidth = _window2.default.innerWidth || _document2.default.documentElement.clientWidth || _document2.default.body.clientWidth; + newHeight = _window2.default.innerHeight || _document2.default.documentElement.clientHeight || _document2.default.body.clientHeight; + } + + if (newHeight && parentWidth) { + + // set outer container size + t.container.style.width = parentWidth + 'px'; + t.container.style.height = newHeight + 'px'; + + // set native <video> or <audio> and shims + t.node.style.width = '100%'; + t.node.style.height = '100%'; + + // if shim is ready, send the size to the embedded plugin + if (t.isVideo && t.media.setSize) { + t.media.setSize(parentWidth, newHeight); + } + + // set the layers + var layerChildren = t.layers.childNodes; + for (var i = 0, total = layerChildren.length; i < total; i++) { + layerChildren[i].style.width = '100%'; + layerChildren[i].style.height = '100%'; + } + } + } + }, { + key: 'setFillMode', + value: function setFillMode() { + var t = this, + parent = t.outerContainer; + + var parentStyles = getComputedStyle(parent); + + // Remove the responsive attributes in the event they are there + if (t.node.style.height !== 'none' && t.node.style.height !== t.height) { + t.node.style.height = ''; + } + if (t.node.style.maxWidth !== 'none' && t.node.style.maxWidth !== t.width) { + t.node.style.maxWidth = ''; + } + + if (t.node.style.maxHeight !== 'none' && t.node.style.maxHeight !== t.height) { + t.node.style.maxHeight = ''; + } + + if (t.node.currentStyle) { + if (t.node.currentStyle.height === '100%') { + t.node.currentStyle.height = ''; + } + if (t.node.currentStyle.maxWidth === '100%') { + t.node.currentStyle.maxWidth = ''; + } + if (t.node.currentStyle.maxHeight === '100%') { + t.node.currentStyle.maxHeight = ''; + } + } + + if (!parseFloat(parentStyles.width)) { + parent.style.width = t.media.offsetWidth + 'px'; + } + + if (!parseFloat(parentStyles.height)) { + parent.style.height = t.media.offsetHeight + 'px'; + } + + parentStyles = getComputedStyle(parent); + + var parentWidth = parseFloat(parentStyles.width), + parentHeight = parseFloat(parentStyles.height); + + t.setDimensions('100%', '100%'); + + // This prevents an issue when displaying poster + var poster = t.container.querySelector(t.options.classPrefix + 'poster img'); + if (poster) { + poster.style.display = ''; + } + + // calculate new width and height + var targetElement = t.container.querySelectorAll('object, embed, iframe, video'), + initHeight = t.height, + initWidth = t.width, + + // scale to the target width + scaleX1 = parentWidth, + scaleY1 = initHeight * parentWidth / initWidth, + + // scale to the target height + scaleX2 = initWidth * parentHeight / initHeight, + scaleY2 = parentHeight, + + // now figure out which one we should use + bScaleOnWidth = scaleX2 > parentWidth === false, + finalWidth = bScaleOnWidth ? Math.floor(scaleX1) : Math.floor(scaleX2), + finalHeight = bScaleOnWidth ? Math.floor(scaleY1) : Math.floor(scaleY2), + width = bScaleOnWidth ? parentWidth + 'px' : finalWidth + 'px', + height = bScaleOnWidth ? finalHeight + 'px' : parentHeight + 'px'; + + for (var i = 0, total = targetElement.length; i < total; i++) { + targetElement[i].style.height = height; + targetElement[i].style.width = width; + if (t.media.setSize) { + t.media.setSize(width, height); + } + + targetElement[i].style.marginLeft = Math.floor((parentWidth - finalWidth) / 2) + 'px'; + targetElement[i].style.marginTop = 0; + } + } + }, { + key: 'setDimensions', + value: function setDimensions(width, height) { + var t = this; + + width = (0, _general.isString)(width) && width.includes('%') ? width : parseFloat(width) + 'px'; + height = (0, _general.isString)(height) && height.includes('%') ? height : parseFloat(height) + 'px'; + + t.container.style.width = width; + t.container.style.height = height; + + var layers = t.layers.childNodes; + for (var i = 0, total = layers.length; i < total; i++) { + layers[i].style.width = width; + layers[i].style.height = height; + } + } + }, { + key: 'setControlsSize', + value: function setControlsSize() { + var t = this; + + // skip calculation if hidden + if (!dom.visible(t.container) || !t.rail || !dom.visible(t.rail)) { + return; + } + + var railStyles = getComputedStyle(t.rail), + totalStyles = getComputedStyle(t.total), + railMargin = parseFloat(railStyles.marginLeft) + parseFloat(railStyles.marginRight), + totalMargin = parseFloat(totalStyles.marginLeft) + parseFloat(totalStyles.marginRight) || 0; + + var siblingsWidth = 0; + + var siblings = dom.siblings(t.rail, function (el) { + return el !== t.rail; + }), + total = siblings.length; + for (var i = 0; i < total; i++) { + siblingsWidth += siblings[i].offsetWidth; + } + + siblingsWidth += totalMargin + (totalMargin === 0 ? railMargin * 2 : railMargin) + 1; + + // Substract the width of the feature siblings from time rail + var controlsWidth = parseFloat(t.controls.offsetWidth); + t.rail.style.width = (siblingsWidth > controlsWidth ? 0 : controlsWidth - siblingsWidth) + 'px'; + + var event = (0, _general.createEvent)('controlsresize', t.container); + t.container.dispatchEvent(event); + } + + /** + * Add featured control element and cache its position in case features are reset + * + * @param {HTMLElement} element + * @param {String} key + */ + + }, { + key: 'addControlElement', + value: function addControlElement(element, key) { + + var t = this; + + if (t.featurePosition[key] !== undefined) { + var child = t.controls.childNodes[t.featurePosition[key] - 1]; + child.parentNode.insertBefore(element, child.nextSibling); + } else { + t.controls.appendChild(element); + var children = t.controls.childNodes; + for (var i = 0, total = children.length; i < total; i++) { + if (element == children[i]) { + t.featurePosition[key] = i; + break; + } + } + } + } + + /** + * Append layer to manipulate `<iframe>` elements safely. + * + * This allows the user to trigger events properly given that mouse/click don't get lost in the `<iframe>`. + */ + + }, { + key: 'createIframeLayer', + value: function createIframeLayer() { + + var t = this; + + if (t.isVideo && t.media.rendererName !== null && t.media.rendererName.match(/iframe/i) !== null && !_document2.default.getElementById(t.media.id + '-iframe-overlay')) { + + var layer = _document2.default.createElement('div'), + target = _document2.default.getElementById(t.media.id + '_' + t.media.rendererName); + + layer.id = t.media.id + '-iframe-overlay'; + layer.className = t.options.classPrefix + 'iframe-overlay'; + layer.addEventListener('click', function (e) { + if (t.options.clickToPlayPause) { + if (t.media.paused) { + t.media.play(); + } else { + t.media.pause(); + } + + e.preventDefault(); + e.stopPropagation(); + } + }); + + target.parentNode.insertBefore(layer, target); + } + } + }, { + key: 'resetSize', + value: function resetSize() { + var t = this; + // webkit has trouble doing this without a delay + setTimeout(function () { + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + }, 50); + } + }, { + key: 'setPoster', + value: function setPoster(url) { + var t = this, + posterDiv = t.container.querySelector('.' + t.options.classPrefix + 'poster'); + + var posterImg = posterDiv.querySelector('img'); + + if (!posterImg) { + posterImg = _document2.default.createElement('img'); + posterImg.className = t.options.classPrefix + 'poster-img'; + posterImg.width = '100%'; + posterImg.height = '100%'; + posterDiv.appendChild(posterImg); + } + + posterImg.setAttribute('src', url); + posterDiv.style.backgroundImage = 'url("' + url + '")'; + } + }, { + key: 'changeSkin', + value: function changeSkin(className) { + var t = this; + + t.container.className = t.options.classPrefix + 'container ' + className; + t.setPlayerSize(t.width, t.height); + t.setControlsSize(); + } + }, { + key: 'globalBind', + value: function globalBind(events, callback) { + var t = this, + doc = t.node ? t.node.ownerDocument : _document2.default; + + events = (0, _general.splitEvents)(events, t.id); + if (events.d) { + var eventList = events.d.split(' '); + for (var i = 0, total = eventList.length; i < total; i++) { + eventList[i].split('.').reduce(function (part, e) { + doc.addEventListener(e, callback, false); + return e; + }, ''); + } + } + if (events.w) { + var _eventList = events.w.split(' '); + for (var _i = 0, _total = _eventList.length; _i < _total; _i++) { + _eventList[_i].split('.').reduce(function (part, e) { + _window2.default.addEventListener(e, callback, false); + return e; + }, ''); + } + } + } + }, { + key: 'globalUnbind', + value: function globalUnbind(events, callback) { + + var t = this, + doc = t.node ? t.node.ownerDocument : _document2.default; + + events = (0, _general.splitEvents)(events, t.id); + if (events.d) { + var eventList = events.d.split(' '); + for (var i = 0, total = eventList.length; i < total; i++) { + eventList[i].split('.').reduce(function (part, e) { + doc.removeEventListener(e, callback, false); + return e; + }, ''); + } + } + if (events.w) { + var _eventList2 = events.d.split(' '); + for (var _i2 = 0, _total2 = _eventList2.length; _i2 < _total2; _i2++) { + _eventList2[_i2].split('.').reduce(function (part, e) { + _window2.default.removeEventListener(e, callback, false); + return e; + }, ''); + } + } + } + }, { + key: 'buildposter', + value: function buildposter(player, controls, layers, media) { + + var t = this, + poster = _document2.default.createElement('div'); + + poster.className = t.options.classPrefix + 'poster ' + t.options.classPrefix + 'layer'; + layers.appendChild(poster); + + var posterUrl = player.media.getAttribute('poster'); + + // priority goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster) + if (player.options.poster !== '') { + posterUrl = player.options.poster; + } + + // second, try the real poster + if (posterUrl) { + t.setPoster(posterUrl); + } else { + poster.style.display = 'none'; + } + + media.addEventListener('play', function () { + poster.style.display = 'none'; + }); + + media.addEventListener('playing', function () { + poster.style.display = 'none'; + }); + + if (player.options.showPosterWhenEnded && player.options.autoRewind) { + media.addEventListener('ended', function () { + poster.style.display = ''; + }); + } + + media.addEventListener('error', function () { + poster.style.display = 'none'; + }); + + if (player.options.showPosterWhenPaused) { + media.addEventListener('pause', function () { + // To avoid displaying the poster when video ended, since it + // triggers a pause event as well + if (!media.ended) { + poster.style.display = ''; + } + }); + } + } + }, { + key: 'buildoverlays', + value: function buildoverlays(player, controls, layers, media) { + + if (!player.isVideo) { + return; + } + + var t = this, + loading = _document2.default.createElement('div'), + error = _document2.default.createElement('div'), + + // this needs to come last so it's on top + bigPlay = _document2.default.createElement('div'), + buffer = controls.querySelector('.' + t.options.classPrefix + 'time-buffering'); + + loading.style.display = 'none'; // start out hidden + loading.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer'; + loading.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-loading">' + ('<span class="' + t.options.classPrefix + 'overlay-loading-bg-img"></span>') + '</div>'; + layers.appendChild(loading); + + error.style.display = 'none'; + error.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer'; + error.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-error"></div>'; + layers.appendChild(error); + + bigPlay.className = t.options.classPrefix + 'overlay ' + t.options.classPrefix + 'layer ' + t.options.classPrefix + 'overlay-play'; + bigPlay.innerHTML = '<div class="' + t.options.classPrefix + 'overlay-button" role="button" tabindex="0"' + ('aria-label="' + _i18n2.default.t('mejs.play') + '" aria-pressed="false"></div>'); + bigPlay.addEventListener('click', function () { + // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay + // started and immediately stopped the video + if (t.options.clickToPlayPause) { + + var button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'), + pressed = button.getAttribute('aria-pressed'); + + if (media.paused) { + media.play(); + } else { + media.pause(); + } + + button.setAttribute('aria-pressed', !!pressed); + } + }); + layers.appendChild(bigPlay); + + if (t.media.rendererName !== null && (t.media.rendererName.match(/(youtube|facebook)/) && !(player.media.originalNode.getAttribute('poster') || player.options.poster) || _constants.IS_STOCK_ANDROID)) { + bigPlay.style.display = 'none'; + } + + // show/hide big play button + media.addEventListener('play', function () { + bigPlay.style.display = 'none'; + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + error.style.display = 'none'; + }); + + media.addEventListener('playing', function () { + bigPlay.style.display = 'none'; + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + error.style.display = 'none'; + }); + + media.addEventListener('seeking', function () { + bigPlay.style.display = 'none'; + loading.style.display = ''; + if (buffer) { + buffer.style.display = ''; + } + }); + + media.addEventListener('seeked', function () { + bigPlay.style.display = ''; + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = ''; + } + }); + + media.addEventListener('pause', function () { + loading.style.display = 'none'; + if (!_constants.IS_STOCK_ANDROID) { + bigPlay.style.display = ''; + } + if (buffer) { + buffer.style.display = 'none'; + } + }); + + media.addEventListener('waiting', function () { + loading.style.display = ''; + if (buffer) { + buffer.style.display = ''; + } + }); + + // show/hide loading + media.addEventListener('loadeddata', function () { + loading.style.display = ''; + if (buffer) { + buffer.style.display = ''; + } + + // Firing the 'canplay' event after a timeout which isn't getting fired on some Android 4.1 devices + // (https://github.com/johndyer/mediaelement/issues/1305) + if (_constants.IS_ANDROID) { + media.canplayTimeout = setTimeout(function () { + if (_document2.default.createEvent) { + var evt = _document2.default.createEvent('HTMLEvents'); + evt.initEvent('canplay', true, true); + return media.dispatchEvent(evt); + } + }, 300); + } + }); + media.addEventListener('canplay', function () { + loading.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + // Clear timeout inside 'loadeddata' to prevent 'canplay' from firing twice + clearTimeout(media.canplayTimeout); + }); + + // error handling + media.addEventListener('error', function (e) { + t._handleError(e); + loading.style.display = 'none'; + bigPlay.style.display = 'none'; + if (buffer) { + buffer.style.display = 'none'; + } + error.style.display = 'block'; + error.querySelector('.' + t.options.classPrefix + 'overlay-error').innerHTML = e.message; + }); + + media.addEventListener('keydown', function (e) { + t.onkeydown(player, media, e); + }); + } + }, { + key: 'buildkeyboard', + value: function buildkeyboard(player, controls, layers, media) { + + var t = this; + + t.container.addEventListener('keydown', function () { + t.keyboardAction = true; + }); + + // listen for key presses + t.globalBind('keydown', function (event) { + var container = _document2.default.activeElement.closest('.' + t.options.classPrefix + 'container'), + target = t.media.closest('.' + t.options.classPrefix + 'container'); + t.hasFocus = !!(container && target && container.id === target.id); + return t.onkeydown(player, media, event); + }); + + // check if someone clicked outside a player region, then kill its focus + t.globalBind('click', function (event) { + t.hasFocus = !!event.target.closest('.' + t.options.classPrefix + 'container'); + }); + } + }, { + key: 'onkeydown', + value: function onkeydown(player, media, e) { + + if (player.hasFocus && player.options.enableKeyboard) { + // find a matching key + for (var i = 0, total = player.options.keyActions.length; i < total; i++) { + var keyAction = player.options.keyActions[i]; + + for (var j = 0, jl = keyAction.keys.length; j < jl; j++) { + if (e.keyCode === keyAction.keys[j]) { + keyAction.action(player, media, e.keyCode, e); + e.preventDefault(); + e.stopPropagation(); + } + } + } + } + + return true; + } + }, { + key: 'play', + value: function play() { + var t = this; + + // only load if the current time is 0 to ensure proper playing + if (t.media.getCurrentTime() <= 0) { + t.load(); + } + t.media.play(); + } + }, { + key: 'pause', + value: function pause() { + try { + this.media.pause(); + } catch (e) { - // vertical version - $('<div class="mejs-button mejs-volume-button mejs-mute">'+ - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '" aria-label="' + t.options.muteText + '"></button>'+ - '<div class="mejs-volume-slider">'+ // outer background - '<div class="mejs-volume-total"></div>'+ // line background - '<div class="mejs-volume-current"></div>'+ // current volume - '<div class="mejs-volume-handle"></div>'+ // handle - '</div>'+ - '</div>') - .appendTo(controls), - volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'), - volumeTotal = t.container.find('.mejs-volume-total, .mejs-horizontal-volume-total'), - volumeCurrent = t.container.find('.mejs-volume-current, .mejs-horizontal-volume-current'), - volumeHandle = t.container.find('.mejs-volume-handle, .mejs-horizontal-volume-handle'), - - positionVolumeHandle = function(volume, secondTry) { - - if (!volumeSlider.is(':visible') && typeof secondTry == 'undefined') { - volumeSlider.show(); - positionVolumeHandle(volume, true); - volumeSlider.hide() - return; + } + } + }, { + key: 'load', + value: function load() { + var t = this; + + if (!t.isLoaded) { + t.media.load(); + } + + t.isLoaded = true; + } + }, { + key: 'setMuted', + value: function setMuted(muted) { + this.media.setMuted(muted); + } + }, { + key: 'setCurrentTime', + value: function setCurrentTime(time) { + this.media.setCurrentTime(time); + } + }, { + key: 'getCurrentTime', + value: function getCurrentTime() { + return this.media.currentTime; + } + }, { + key: 'setVolume', + value: function setVolume(volume) { + this.media.setVolume(volume); + } + }, { + key: 'getVolume', + value: function getVolume() { + return this.media.volume; + } + }, { + key: 'setSrc', + value: function setSrc(src) { + var t = this, + layer = _document2.default.getElementById(t.media.id + '-iframe-overlay'); + + if (layer) { + layer.remove(); + } + + t.media.setSrc(src); + + t.createIframeLayer(); + } + }, { + key: 'remove', + value: function remove() { + + var t = this, + rendererName = t.media.rendererName; + + // Stop completely media playing + if (!t.media.paused) { + t.media.pause(); + } + + var src = t.media.originalNode.getAttribute('src'); + t.media.setSrc(''); + + // invoke features cleanup + for (var featureIndex in t.options.features) { + var feature = t.options.features[featureIndex]; + if (t['clean' + feature]) { + try { + t['clean' + feature](t); + } catch (e) { + // @todo: report control error + console.error('error cleaning ' + feature, e); + } + } + } + + // reset dimensions + var nativeWidth = t.node.getAttribute('width'), + nativeHeight = t.node.getAttribute('height'); + if (nativeWidth) { + if (nativeWidth.match('%') === null) { + nativeWidth = nativeWidth + 'px'; + } + } else { + nativeWidth = 'auto'; + } + if (nativeHeight) { + if (nativeHeight.match('%') === null) { + nativeHeight = nativeHeight + 'px'; + } + } else { + nativeHeight = 'auto'; + } + t.node.style.width = nativeWidth; + t.node.style.height = nativeHeight; + + // grab video and put it back in place + if (!t.isDynamic) { + t.node.setAttribute('controls', true); + t.node.setAttribute('id', t.node.getAttribute('id').replace('_' + rendererName, '').replace('_from_mejs', '')); + + // Remove `autoplay` (not worth bringing it back once player is destroyed) + delete t.node.autoplay; + + // Reintegrate file if it can be played + if (t.media.canPlayType((0, _media.getTypeFromFile)(src))) { + t.node.setAttribute('src', src); + } + + // If <iframe>, remove overlay + if (rendererName.match(/iframe/i) !== null) { + var layer = _document2.default.getElementById(t.media.id + '-iframe-overlay'); + layer.remove(); + } + + var node = t.node.cloneNode(true); + t.container.parentNode.insertBefore(node, t.container); + t.node.remove(); + delete t.node; + } else { + t.container.parentNode.insertBefore(t.node, t.container); + } + + if (typeof t.media.destroy === 'function') { + t.media.destroy(); + } + + // Remove the player from the mejs.players object so that pauseOtherPlayers doesn't blow up when trying to + // pause a non existent Flash API. + delete _mejs2.default.players[t.id]; + + if (_typeof(t.container) === 'object') { + var offscreen = t.container.parentNode.querySelector('.' + t.options.classPrefix + 'offscreen'); + offscreen.remove(); + t.container.remove(); + } + t.globalUnbind(); + + delete t.media.player; + } + }]); + + return MediaElementPlayer; +}(); + +_window2.default.MediaElementPlayer = MediaElementPlayer; + +exports.default = MediaElementPlayer; + +// turn into plugin + +(function ($) { + + if (typeof $ !== 'undefined') { + $.fn.mediaelementplayer = function (options) { + if (options === false) { + this.each(function () { + var player = $(this).data('mediaelementplayer'); + if (player) { + player.remove(); + } + $(this).removeData('mediaelementplayer'); + }); + } else { + this.each(function () { + $(this).data('mediaelementplayer', new MediaElementPlayer(this, options)); + }); + } + return this; + }; + + $(_document2.default).ready(function () { + // auto enable using JSON attribute + $('.' + config.classPrefix + 'player').mediaelementplayer(); + }); + } +})(_mejs2.default.$); + +},{"19":19,"2":2,"20":20,"21":21,"22":22,"24":24,"3":3,"4":4,"5":5,"6":6}],17:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PluginDetector = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _window = _dereq_(3); + +var _window2 = _interopRequireDefault(_window); + +var _document = _dereq_(2); + +var _document2 = _interopRequireDefault(_document); + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +var _i18n = _dereq_(4); + +var _i18n2 = _interopRequireDefault(_i18n); + +var _renderer = _dereq_(7); + +var _general = _dereq_(21); + +var _constants = _dereq_(19); + +var _media = _dereq_(22); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Shim that falls back to Flash if a media type is not supported. + * + * Any format not supported natively, including, RTMP, FLV, HLS and M(PEG)-DASH (if browser does not support MSE), + * will play using Flash. + */ + +/** + * Core detector, plugins are added below + * + */ +var PluginDetector = exports.PluginDetector = { + /** + * Cached version numbers + * @type {Array} + */ + plugins: [], + + /** + * Test a plugin version number + * @param {String} plugin - In this scenario 'flash' will be tested + * @param {Array} v - An array containing the version up to 3 numbers (major, minor, revision) + * @return {Boolean} + */ + hasPluginVersion: function hasPluginVersion(plugin, v) { + var pv = PluginDetector.plugins[plugin]; + v[1] = v[1] || 0; + v[2] = v[2] || 0; + return pv[0] > v[0] || pv[0] === v[0] && pv[1] > v[1] || pv[0] === v[0] && pv[1] === v[1] && pv[2] >= v[2]; + }, + + /** + * Detect plugin and store its version number + * + * @see PluginDetector.detectPlugin + * @param {String} p + * @param {String} pluginName + * @param {String} mimeType + * @param {String} activeX + * @param {Function} axDetect + */ + addPlugin: function addPlugin(p, pluginName, mimeType, activeX, axDetect) { + PluginDetector.plugins[p] = PluginDetector.detectPlugin(pluginName, mimeType, activeX, axDetect); + }, + + /** + * Obtain version number from the mime-type (all but IE) or ActiveX (IE) + * + * @param {String} pluginName + * @param {String} mimeType + * @param {String} activeX + * @param {Function} axDetect + * @return {int[]} + */ + detectPlugin: function detectPlugin(pluginName, mimeType, activeX, axDetect) { + + var version = [0, 0, 0], + description = void 0, + ax = void 0; + + // Firefox, Webkit, Opera; avoid MS Edge since `plugins` cannot be accessed + if (_constants.NAV.plugins !== null && _constants.NAV.plugins !== undefined && _typeof(_constants.NAV.plugins[pluginName]) === 'object') { + description = _constants.NAV.plugins[pluginName].description; + if (description && !(typeof _constants.NAV.mimeTypes !== 'undefined' && _constants.NAV.mimeTypes[mimeType] && !_constants.NAV.mimeTypes[mimeType].enabledPlugin)) { + version = description.replace(pluginName, '').replace(/^\s+/, '').replace(/\sr/gi, '.').split('.'); + for (var i = 0, total = version.length; i < total; i++) { + version[i] = parseInt(version[i].match(/\d+/), 10); + } + } + // Internet Explorer / ActiveX + } else if (_window2.default.ActiveXObject !== undefined) { + try { + ax = new ActiveXObject(activeX); + if (ax) { + version = axDetect(ax); } - - // correct to 0-1 - volume = Math.max(0,volume); - volume = Math.min(volume,1); + } catch (e) { - // ajust mute button style - if (volume == 0) { - mute.removeClass('mejs-mute').addClass('mejs-unmute'); + } + } + return version; + } +}; + +/** + * Add Flash detection + * + */ +PluginDetector.addPlugin('flash', 'Shockwave Flash', 'application/x-shockwave-flash', 'ShockwaveFlash.ShockwaveFlash', function (ax) { + // adapted from SWFObject + var version = [], + d = ax.GetVariable("$version"); + + if (d) { + d = d.split(" ")[1].split(","); + version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + return version; +}); + +var FlashMediaElementRenderer = { + + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var flash = {}; + + // store main variable + flash.options = options; + flash.id = mediaElement.id + '_' + flash.options.prefix; + flash.mediaElement = mediaElement; + + // insert data + flash.flashState = {}; + flash.flashApi = null; + flash.flashApiStack = []; + + // mediaElements for get/set + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + + // add to flash state that we will store + flash.flashState[propName] = null; + + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + flash['get' + capName] = function () { + + if (flash.flashApi !== null) { + + if (flash.flashApi['get_' + propName] !== undefined) { + var _ret = function () { + var value = flash.flashApi['get_' + propName](); + + // special case for buffered to conform to HTML5's newest + if (propName === 'buffered') { + return { + v: { + start: function start() { + return 0; + }, + end: function end() { + return value; + }, + length: 1 + } + }; + } + + return { + v: value + }; + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + } else { + return null; + } } else { - mute.removeClass('mejs-unmute').addClass('mejs-mute'); - } + return null; + } + }; - // position slider - if (mode == 'vertical') { - var - - // height of the full size volume slider background - totalHeight = volumeTotal.height(), - - // top/left of full size volume slider background - totalPosition = volumeTotal.position(), - - // the new top position based on the current volume - // 70% volume on 100px height == top:30px - newTop = totalHeight - (totalHeight * volume); - - // handle - volumeHandle.css('top', Math.round(totalPosition.top + newTop - (volumeHandle.height() / 2))); - - // show the current visibility - volumeCurrent.height(totalHeight - newTop ); - volumeCurrent.css('top', totalPosition.top + newTop); + flash['set' + capName] = function (value) { + if (propName === 'src') { + value = (0, _media.absolutizeUrl)(value); + } + + // send value to Flash + if (flash.flashApi !== null && flash.flashApi['set_' + propName] !== undefined) { + flash.flashApi['set_' + propName](value); } else { - var - - // height of the full size volume slider background - totalWidth = volumeTotal.width(), - - // top/left of full size volume slider background - totalPosition = volumeTotal.position(), - - // the new left position based on the current volume - newLeft = totalWidth * volume; - - // handle - volumeHandle.css('left', Math.round(totalPosition.left + newLeft - (volumeHandle.width() / 2))); - - // rezize the current part of the volume bar - volumeCurrent.width( Math.round(newLeft) ); + // store for after "READY" event fires + flash.flashApiStack.push({ + type: 'set', + propName: propName, + value: value + }); } - }, - handleVolumeMove = function(e) { - - var volume = null, - totalOffset = volumeTotal.offset(); - - // calculate the new volume based on the moust position - if (mode == 'vertical') { - - var - railHeight = volumeTotal.height(), - totalTop = parseInt(volumeTotal.css('top').replace(/px/,''),10), - newY = e.pageY - totalOffset.top; - - volume = (railHeight - newY) / railHeight; + }; + }; + + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + + // add mediaElements for native methods + var methods = _mejs2.default.html5media.methods, + assignMethods = function assignMethods(methodName) { + + // run the method on the native HTMLMediaElement + flash[methodName] = function () { + + if (flash.flashApi !== null) { + + // send call up to Flash ExternalInterface API + if (flash.flashApi['fire_' + methodName]) { + try { + flash.flashApi['fire_' + methodName](); + } catch (e) { + + } + } else { - // the controls just hide themselves (usually when mouse moves too far up) - if (totalOffset.top == 0 || totalOffset.left == 0) - return; - + } } else { - var - railWidth = volumeTotal.width(), - newX = e.pageX - totalOffset.left; - - volume = newX / railWidth; + // store for after "READY" event fires + flash.flashApiStack.push({ + type: 'call', + methodName: methodName + }); } - - // ensure the volume isn't outside 0-1 - volume = Math.max(0,volume); - volume = Math.min(volume,1); - - // position the slider and handle - positionVolumeHandle(volume); - - // set the media object (this will trigger the volumechanged event) - if (volume == 0) { - media.setMuted(true); - } else { - media.setMuted(false); + }; + }; + methods.push('stop'); + for (var _i = 0, _total = methods.length; _i < _total; _i++) { + assignMethods(methods[_i]); + } + + // give initial events like in others renderers + var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay', 'error']; + + for (var _i2 = 0, _total2 = initEvents.length; _i2 < _total2; _i2++) { + var event = (0, _general.createEvent)(initEvents[_i2], flash); + mediaElement.dispatchEvent(event); + } + + // add a ready method that Flash can call to + _window2.default['__ready__' + flash.id] = function () { + + flash.flashReady = true; + flash.flashApi = _document2.default.getElementById('__' + flash.id); + + // do call stack + if (flash.flashApiStack.length) { + for (var _i3 = 0, _total3 = flash.flashApiStack.length; _i3 < _total3; _i3++) { + + var stackItem = flash.flashApiStack[_i3]; + + if (stackItem.type === 'set') { + var propName = stackItem.propName, + capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); + + flash['set' + capName](stackItem.value); + } else if (stackItem.type === 'call') { + flash[stackItem.methodName](); + } + } + } + }; + + _window2.default['__event__' + flash.id] = function (eventName, message) { + + var event = (0, _general.createEvent)(eventName, flash); + event.message = message || ''; + + // send event from Flash up to the mediaElement + flash.mediaElement.dispatchEvent(event); + }; + + // insert Flash object + flash.flashWrapper = _document2.default.createElement('div'); + + // If the access script flag does not have any of the valid values, set to `sameDomain` by default + if (!['always', 'sameDomain'].includes(flash.options.shimScriptAccess)) { + flash.options.shimScriptAccess = 'sameDomain'; + } + + var autoplay = mediaElement.originalNode.autoplay, + flashVars = ['uid=' + flash.id, 'autoplay=' + autoplay, 'allowScriptAccess=' + flash.options.shimScriptAccess], + isVideo = mediaElement.originalNode !== null && mediaElement.originalNode.tagName.toLowerCase() === 'video', + flashHeight = isVideo ? mediaElement.originalNode.height : 1, + flashWidth = isVideo ? mediaElement.originalNode.width : 1; + + if (mediaElement.originalNode.getAttribute('src')) { + flashVars.push('src=' + mediaElement.originalNode.getAttribute('src')); + } + + if (flash.options.enablePseudoStreaming === true) { + flashVars.push('pseudostreamstart=' + flash.options.pseudoStreamingStartQueryParam); + flashVars.push('pseudostreamtype=' + flash.options.pseudoStreamingType); + } + + mediaElement.appendChild(flash.flashWrapper); + + if (mediaElement.originalNode !== null) { + mediaElement.originalNode.style.display = 'none'; + } + + var settings = []; + + if (_constants.IS_IE) { + var specialIEContainer = _document2.default.createElement('div'); + flash.flashWrapper.appendChild(specialIEContainer); + + settings = ['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"', 'codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"', 'id="__' + flash.id + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"']; + + if (!isVideo) { + settings.push('style="clip: rect(0 0 0 0); position: absolute;"'); + } + + specialIEContainer.outerHTML = '<object ' + settings.join(' ') + '>' + ('<param name="movie" value="' + flash.options.pluginPath + flash.options.filename + '?x=' + new Date() + '" />') + ('<param name="flashvars" value="' + flashVars.join('&') + '" />') + '<param name="quality" value="high" />' + '<param name="bgcolor" value="#000000" />' + '<param name="wmode" value="transparent" />' + ('<param name="allowScriptAccess" value="' + flash.options.shimScriptAccess + '" />') + '<param name="allowFullScreen" value="true" />' + ('<div>' + _i18n2.default.t('mejs.install-flash') + '</div>') + '</object>'; + } else { + + settings = ['id="__' + flash.id + '"', 'name="__' + flash.id + '"', 'play="true"', 'loop="false"', 'quality="high"', 'bgcolor="#000000"', 'wmode="transparent"', 'allowScriptAccess="' + flash.options.shimScriptAccess + '"', 'allowFullScreen="true"', 'type="application/x-shockwave-flash"', 'pluginspage="//www.macromedia.com/go/getflashplayer"', 'src="' + flash.options.pluginPath + flash.options.filename + '"', 'flashvars="' + flashVars.join('&') + '"', 'width="' + flashWidth + '"', 'height="' + flashHeight + '"']; + + if (!isVideo) { + settings.push('style="clip: rect(0 0 0 0); position: absolute;"'); + } + + flash.flashWrapper.innerHTML = '<embed ' + settings.join(' ') + '>'; + } + + flash.flashNode = flash.flashWrapper.lastChild; + + flash.hide = function () { + if (isVideo) { + flash.flashNode.style.position = 'absolute'; + flash.flashNode.style.width = '1px'; + flash.flashNode.style.height = '1px'; + try { + flash.flashNode.style.clip = 'rect(0 0 0 0);'; + } catch (e) { + + } + } + }; + flash.show = function () { + if (isVideo) { + flash.flashNode.style.position = ''; + flash.flashNode.style.width = ''; + flash.flashNode.style.height = ''; + try { + flash.flashNode.style.clip = ''; + } catch (e) { + } - media.setVolume(volume); - }, - mouseIsDown = false, - mouseIsOver = false; + } + }; + flash.setSize = function (width, height) { + flash.flashNode.style.width = width + 'px'; + flash.flashNode.style.height = height + 'px'; - // SLIDER - - mute - .hover(function() { - volumeSlider.show(); - mouseIsOver = true; - }, function() { - mouseIsOver = false; - - if (!mouseIsDown && mode == 'vertical') { - volumeSlider.hide(); - } - }); - - volumeSlider - .bind('mouseover', function() { - mouseIsOver = true; - }) - .bind('mousedown', function (e) { - handleVolumeMove(e); - t.globalBind('mousemove.vol', function(e) { - handleVolumeMove(e); - }); - t.globalBind('mouseup.vol', function () { - mouseIsDown = false; - t.globalUnbind('.vol'); + if (flash.flashApi !== null && typeof flash.flashApi.fire_setSize === 'function') { + flash.flashApi.fire_setSize(width, height); + } + }; - if (!mouseIsOver && mode == 'vertical') { - volumeSlider.hide(); - } - }); - mouseIsDown = true; - - return false; - }); + flash.destroy = function () { + flash.flashNode.remove(); + }; + if (mediaFiles && mediaFiles.length > 0) { + for (var _i4 = 0, _total4 = mediaFiles.length; _i4 < _total4; _i4++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i4].type)) { + flash.setSrc(mediaFiles[_i4].src); + break; + } + } + } - // MUTE button - mute.find('button').click(function() { - media.setMuted( !media.muted ); - }); + return flash; + } +}; - // listen for volume change events from other sources - media.addEventListener('volumechange', function(e) { - if (!mouseIsDown) { - if (media.muted) { - positionVolumeHandle(0); - mute.removeClass('mejs-mute').addClass('mejs-unmute'); - } else { - positionVolumeHandle(media.volume); - mute.removeClass('mejs-unmute').addClass('mejs-mute'); - } - } - }, false); +var hasFlash = PluginDetector.hasPluginVersion('flash', [10, 0, 0]); - if (t.container.is(':visible')) { - // set initial volume - positionVolumeHandle(player.options.startVolume); +if (hasFlash) { - // mutes the media and sets the volume icon muted if the initial volume is set to 0 - if (player.options.startVolume === 0) { - media.setMuted(true); - } + /** + * Register media type based on URL structure if Flash is detected + * + */ + _media.typeChecks.push(function (url) { - // shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements - if (media.pluginType === 'native') { - media.setVolume(player.options.startVolume); - } + url = url.toLowerCase(); + + if (url.startsWith('rtmp')) { + if (url.includes('.mp3')) { + return 'audio/rtmp'; + } else { + return 'video/rtmp'; } + } else if (url.includes('.oga') || url.includes('.ogg')) { + return 'audio/ogg'; + } else if (url.includes('.m3u8')) { + return 'application/x-mpegURL'; + } else if (url.includes('.mpd')) { + return 'application/dash+xml'; + } else if (url.includes('.flv')) { + return 'video/flv'; + } else { + return null; } }); - -})(mejs.$); -(function($) { + // VIDEO + var FlashMediaElementVideoRenderer = { + name: 'flash_video', + + options: { + prefix: 'flash_video', + filename: 'mediaelement-flash-video.swf', + enablePseudoStreaming: false, + // start query parameter sent to server for pseudo-streaming + pseudoStreamingStartQueryParam: 'start', + // pseudo streaming type: use `time` for time based seeking (MP4) or `byte` for file byte position (FLV) + pseudoStreamingType: 'byte' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['video/mp4', 'video/rtmp', 'audio/rtmp', 'rtmp/mp4', 'audio/mp4', 'video/flv', 'video/x-flv'].includes(type.toLowerCase()); + }, - $.extend(mejs.MepDefaults, { - usePluginFullScreen: true, - newWindowCallback: function() { return '';}, - fullscreenText: mejs.i18n.t('Fullscreen') - }); + create: FlashMediaElementRenderer.create - $.extend(MediaElementPlayer.prototype, { + }; + _renderer.renderer.add(FlashMediaElementVideoRenderer); - isFullScreen: false, + // HLS + var FlashMediaElementHlsVideoRenderer = { + name: 'flash_hls', - isNativeFullScreen: false, + options: { + prefix: 'flash_hls', + filename: 'mediaelement-flash-video-hls.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()); + }, - isInIframe: false, + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementHlsVideoRenderer); - buildfullscreen: function(player, controls, layers, media) { + // M(PEG)-DASH + var FlashMediaElementMdashVideoRenderer = { + name: 'flash_dash', - if (!player.isVideo) - return; + options: { + prefix: 'flash_dash', + filename: 'mediaelement-flash-video-mdash.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['application/dash+xml'].includes(type.toLowerCase()); + }, - player.isInIframe = (window.location != window.parent.location); + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementMdashVideoRenderer); - // native events - if (mejs.MediaFeatures.hasTrueNativeFullScreen) { + // AUDIO + var FlashMediaElementAudioRenderer = { + name: 'flash_audio', - // chrome doesn't alays fire this in an iframe - var func = function(e) { - if (player.isFullScreen) { - if (mejs.MediaFeatures.isFullScreen()) { - player.isNativeFullScreen = true; - // reset the controls once we are fully in full screen - player.setControlsSize(); - } else { - player.isNativeFullScreen = false; - // when a user presses ESC - // make sure to put the player back into place - player.exitFullScreen(); - } - } - }; + options: { + prefix: 'flash_audio', + filename: 'mediaelement-flash-audio.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['audio/mp3'].includes(type.toLowerCase()); + }, - player.globalBind(mejs.MediaFeatures.fullScreenEventName, func); - } + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementAudioRenderer); - var t = this, - normalHeight = 0, - normalWidth = 0, - container = player.container, - fullscreenBtn = - $('<div class="mejs-button mejs-fullscreen-button">' + - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.fullscreenText + '" aria-label="' + t.options.fullscreenText + '"></button>' + - '</div>') - .appendTo(controls); - - if (t.media.pluginType === 'native' || (!t.options.usePluginFullScreen && !mejs.MediaFeatures.isFirefox)) { - - fullscreenBtn.click(function() { - var isFullScreen = (mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || player.isFullScreen; - - if (isFullScreen) { - player.exitFullScreen(); - } else { - player.enterFullScreen(); - } - }); + // AUDIO - ogg + var FlashMediaElementAudioOggRenderer = { + name: 'flash_audio_ogg', - } else { + options: { + prefix: 'flash_audio_ogg', + filename: 'mediaelement-flash-audio-ogg.swf' + }, + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {Boolean} + */ + canPlayType: function canPlayType(type) { + return ['audio/ogg', 'audio/oga', 'audio/ogv'].includes(type.toLowerCase()); + }, - var hideTimeout = null, - supportsPointerEvents = (function() { - // TAKEN FROM MODERNIZR - var element = document.createElement('x'), - documentElement = document.documentElement, - getComputedStyle = window.getComputedStyle, - supports; - if(!('pointerEvents' in element.style)){ - return false; - } - element.style.pointerEvents = 'auto'; - element.style.pointerEvents = 'x'; - documentElement.appendChild(element); - supports = getComputedStyle && - getComputedStyle(element, '').pointerEvents === 'auto'; - documentElement.removeChild(element); - return !!supports; - })(); - - // - - if (supportsPointerEvents && !mejs.MediaFeatures.isOpera) { // opera doesn't allow this :( - - // allows clicking through the fullscreen button and controls down directly to Flash - - /* - When a user puts his mouse over the fullscreen button, the controls are disabled - So we put a div over the video and another one on iether side of the fullscreen button - that caputre mouse movement - and restore the controls once the mouse moves outside of the fullscreen button - */ - - var fullscreenIsDisabled = false, - restoreControls = function() { - if (fullscreenIsDisabled) { - // hide the hovers - for (var i in hoverDivs) { - hoverDivs[i].hide(); - } + create: FlashMediaElementRenderer.create + }; + _renderer.renderer.add(FlashMediaElementAudioOggRenderer); +} - // restore the control bar - fullscreenBtn.css('pointer-events', ''); - t.controls.css('pointer-events', ''); +},{"19":19,"2":2,"21":21,"22":22,"3":3,"4":4,"6":6,"7":7}],18:[function(_dereq_,module,exports){ +'use strict'; - // prevent clicks from pausing video - t.media.removeEventListener('click', t.clickToPlayPauseCallback); +var _window = _dereq_(3); - // store for later - fullscreenIsDisabled = false; - } - }, - hoverDivs = {}, - hoverDivNames = ['top', 'left', 'right', 'bottom'], - i, len, - positionHoverDivs = function() { - var fullScreenBtnOffsetLeft = fullscreenBtn.offset().left - t.container.offset().left, - fullScreenBtnOffsetTop = fullscreenBtn.offset().top - t.container.offset().top, - fullScreenBtnWidth = fullscreenBtn.outerWidth(true), - fullScreenBtnHeight = fullscreenBtn.outerHeight(true), - containerWidth = t.container.width(), - containerHeight = t.container.height(); - - for (i in hoverDivs) { - hoverDivs[i].css({position: 'absolute', top: 0, left: 0}); //, backgroundColor: '#f00'}); - } +var _window2 = _interopRequireDefault(_window); - // over video, but not controls - hoverDivs['top'] - .width( containerWidth ) - .height( fullScreenBtnOffsetTop ); - - // over controls, but not the fullscreen button - hoverDivs['left'] - .width( fullScreenBtnOffsetLeft ) - .height( fullScreenBtnHeight ) - .css({top: fullScreenBtnOffsetTop}); - - // after the fullscreen button - hoverDivs['right'] - .width( containerWidth - fullScreenBtnOffsetLeft - fullScreenBtnWidth ) - .height( fullScreenBtnHeight ) - .css({top: fullScreenBtnOffsetTop, - left: fullScreenBtnOffsetLeft + fullScreenBtnWidth}); - - // under the fullscreen button - hoverDivs['bottom'] - .width( containerWidth ) - .height( containerHeight - fullScreenBtnHeight - fullScreenBtnOffsetTop ) - .css({top: fullScreenBtnOffsetTop + fullScreenBtnHeight}); - }; +var _document = _dereq_(2); - t.globalBind('resize', function() { - positionHoverDivs(); - }); +var _document2 = _interopRequireDefault(_document); - for (i = 0, len = hoverDivNames.length; i < len; i++) { - hoverDivs[hoverDivNames[i]] = $('<div class="mejs-fullscreen-hover" />').appendTo(t.container).mouseover(restoreControls).hide(); - } +var _mejs = _dereq_(6); - // on hover, kill the fullscreen button's HTML handling, allowing clicks down to Flash - fullscreenBtn.on('mouseover',function() { +var _mejs2 = _interopRequireDefault(_mejs); - if (!t.isFullScreen) { +var _renderer = _dereq_(7); - var buttonPos = fullscreenBtn.offset(), - containerPos = player.container.offset(); +var _general = _dereq_(21); - // move the button in Flash into place - media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, false); +var _constants = _dereq_(19); - // allows click through - fullscreenBtn.css('pointer-events', 'none'); - t.controls.css('pointer-events', 'none'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // restore click-to-play - t.media.addEventListener('click', t.clickToPlayPauseCallback); +/** + * Native HTML5 Renderer + * + * Wraps the native HTML5 <audio> or <video> tag and bubbles its properties, events, and methods up to the mediaElement. + */ +var HtmlMediaElement = { + + name: 'html5', + + options: { + prefix: 'html5' + }, + + /** + * Determine if a specific element type can be played with this render + * + * @param {String} type + * @return {String} + */ + canPlayType: function canPlayType(type) { + + var mediaElement = _document2.default.createElement('video'); + + // Due to an issue on Webkit, force the MP3 and MP4 on Android and consider native support for HLS; + // also consider URLs that might have obfuscated URLs + if (_constants.IS_ANDROID && type.match(/\/mp(3|4)$/gi) !== null || ['application/x-mpegurl', 'vnd.apple.mpegurl', 'audio/mpegurl', 'audio/hls', 'video/hls'].includes(type.toLowerCase()) && _constants.SUPPORTS_NATIVE_HLS) { + return 'yes'; + } else if (mediaElement.canPlayType) { + return mediaElement.canPlayType(type).replace(/no/, ''); + } else { + return ''; + } + }, + /** + * Create the player instance and add all native events/methods/properties as possible + * + * @param {MediaElement} mediaElement Instance of mejs.MediaElement already created + * @param {Object} options All the player configuration options passed through constructor + * @param {Object[]} mediaFiles List of sources with format: {src: url, type: x/y-z} + * @return {Object} + */ + create: function create(mediaElement, options, mediaFiles) { + + var id = mediaElement.id + '_' + options.prefix; + + var node = null; + + // CREATE NODE + if (mediaElement.originalNode === undefined || mediaElement.originalNode === null) { + node = _document2.default.createElement('audio'); + mediaElement.appendChild(node); + } else { + node = mediaElement.originalNode; + } - // show the divs that will restore things - for (i in hoverDivs) { - hoverDivs[i].show(); - } + node.setAttribute('id', id); - positionHoverDivs(); + // WRAPPERS for PROPs + var props = _mejs2.default.html5media.properties, + assignGettersSetters = function assignGettersSetters(propName) { + var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1); - fullscreenIsDisabled = true; - } + node['get' + capName] = function () { + return node[propName]; + }; - }); + node['set' + capName] = function (value) { + if (!_mejs2.default.html5media.readOnlyProperties.includes(propName)) { + node[propName] = value; + } + }; + }; - // restore controls anytime the user enters or leaves fullscreen - media.addEventListener('fullscreenchange', function(e) { - t.isFullScreen = !t.isFullScreen; - // don't allow plugin click to pause video - messes with - // plugin's controls - if (t.isFullScreen) { - t.media.removeEventListener('click', t.clickToPlayPauseCallback); - } else { - t.media.addEventListener('click', t.clickToPlayPauseCallback); - } - restoreControls(); - }); + for (var i = 0, total = props.length; i < total; i++) { + assignGettersSetters(props[i]); + } + var events = _mejs2.default.html5media.events.concat(['click', 'mouseover', 'mouseout']), + assignEvents = function assignEvents(eventName) { - // the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events - // so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button + node.addEventListener(eventName, function (e) { + // copy event - t.globalBind('mousemove', function(e) { + var event = _document2.default.createEvent('HTMLEvents'); + event.initEvent(e.type, e.bubbles, e.cancelable); + mediaElement.dispatchEvent(event); + }); + }; - // if the mouse is anywhere but the fullsceen button, then restore it all - if (fullscreenIsDisabled) { + for (var _i = 0, _total = events.length; _i < _total; _i++) { + assignEvents(events[_i]); + } - var fullscreenBtnPos = fullscreenBtn.offset(); + // HELPER METHODS + node.setSize = function (width, height) { + node.style.width = width + 'px'; + node.style.height = height + 'px'; + return node; + }; + node.hide = function () { + node.style.display = 'none'; - if (e.pageY < fullscreenBtnPos.top || e.pageY > fullscreenBtnPos.top + fullscreenBtn.outerHeight(true) || - e.pageX < fullscreenBtnPos.left || e.pageX > fullscreenBtnPos.left + fullscreenBtn.outerWidth(true) - ) { + return node; + }; - fullscreenBtn.css('pointer-events', ''); - t.controls.css('pointer-events', ''); + node.show = function () { + node.style.display = ''; - fullscreenIsDisabled = false; - } - } - }); + return node; + }; + if (mediaFiles && mediaFiles.length > 0) { + for (var _i2 = 0, _total2 = mediaFiles.length; _i2 < _total2; _i2++) { + if (_renderer.renderer.renderers[options.prefix].canPlayType(mediaFiles[_i2].type)) { + node.setAttribute('src', mediaFiles[_i2].src); + break; + } + } + } + var event = (0, _general.createEvent)('rendererready', node); + mediaElement.dispatchEvent(event); - } else { + return node; + } +}; - // the hover state will show the fullscreen button in Flash to hover up and click +_window2.default.HtmlMediaElement = _mejs2.default.HtmlMediaElement = HtmlMediaElement; - fullscreenBtn - .on('mouseover', function() { +_renderer.renderer.add(HtmlMediaElement); - if (hideTimeout !== null) { - clearTimeout(hideTimeout); - delete hideTimeout; - } +},{"19":19,"2":2,"21":21,"3":3,"6":6,"7":7}],19:[function(_dereq_,module,exports){ +'use strict'; - var buttonPos = fullscreenBtn.offset(), - containerPos = player.container.offset(); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.cancelFullScreen = exports.requestFullScreen = exports.isFullScreen = exports.FULLSCREEN_EVENT_NAME = exports.HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = exports.SUPPORTS_NATIVE_HLS = exports.SUPPORT_POINTER_EVENTS = exports.HAS_MSE = exports.IS_STOCK_ANDROID = exports.IS_SAFARI = exports.IS_FIREFOX = exports.IS_CHROME = exports.IS_EDGE = exports.IS_IE = exports.IS_ANDROID = exports.IS_IOS = exports.IS_IPHONE = exports.IS_IPAD = exports.UA = exports.NAV = undefined; - media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, true); +var _window = _dereq_(3); - }) - .on('mouseout', function() { +var _window2 = _interopRequireDefault(_window); - if (hideTimeout !== null) { - clearTimeout(hideTimeout); - delete hideTimeout; - } +var _document = _dereq_(2); - hideTimeout = setTimeout(function() { - media.hideFullscreenButton(); - }, 1500); +var _document2 = _interopRequireDefault(_document); +var _mejs = _dereq_(6); - }); - } - } +var _mejs2 = _interopRequireDefault(_mejs); - player.fullscreenBtn = fullscreenBtn; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - t.globalBind('keydown',function (e) { - if (((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen) && e.keyCode == 27) { - player.exitFullScreen(); - } - }); +var NAV = exports.NAV = _window2.default.navigator; +var UA = exports.UA = NAV.userAgent.toLowerCase(); - }, +var IS_IPAD = exports.IS_IPAD = UA.match(/ipad/i) !== null; +var IS_IPHONE = exports.IS_IPHONE = UA.match(/iphone/i) !== null; +var IS_IOS = exports.IS_IOS = IS_IPHONE || IS_IPAD; +var IS_ANDROID = exports.IS_ANDROID = UA.match(/android/i) !== null; +var IS_IE = exports.IS_IE = NAV.appName.toLowerCase().includes('microsoft') || NAV.appName.toLowerCase().match(/trident/gi) !== null; +var IS_EDGE = exports.IS_EDGE = 'msLaunchUri' in NAV && !('documentMode' in _document2.default); +var IS_CHROME = exports.IS_CHROME = UA.match(/chrome/gi) !== null; +var IS_FIREFOX = exports.IS_FIREFOX = UA.match(/firefox/gi) !== null; +var IS_SAFARI = exports.IS_SAFARI = UA.match(/safari/gi) !== null && !IS_CHROME; +var IS_STOCK_ANDROID = exports.IS_STOCK_ANDROID = UA.match(/^mozilla\/\d+\.\d+\s\(linux;\su;/gi) !== null; - cleanfullscreen: function(player) { - player.exitFullScreen(); - }, +var HAS_MSE = exports.HAS_MSE = 'MediaSource' in _window2.default; +var SUPPORT_POINTER_EVENTS = exports.SUPPORT_POINTER_EVENTS = function () { + var element = _document2.default.createElement('x'), + documentElement = _document2.default.documentElement, + getComputedStyle = _window2.default.getComputedStyle; - containerSizeTimeout: null, + if (!('pointerEvents' in element.style)) { + return false; + } - enterFullScreen: function() { + element.style.pointerEvents = 'auto'; + element.style.pointerEvents = 'x'; + documentElement.appendChild(element); + var supports = getComputedStyle && getComputedStyle(element, '').pointerEvents === 'auto'; + element.remove(); + return !!supports; +}(); - var t = this; +// for IE +var html5Elements = ['source', 'track', 'audio', 'video']; +var video = void 0; - // firefox+flash can't adjust plugin sizes without resetting :( - if (t.media.pluginType !== 'native' && (mejs.MediaFeatures.isFirefox || t.options.usePluginFullScreen)) { - //t.media.setFullscreen(true); - //player.isFullScreen = true; - return; - } +for (var i = 0, total = html5Elements.length; i < total; i++) { + video = _document2.default.createElement(html5Elements[i]); +} + +// Test if browsers support HLS natively (right now Safari, Android's Chrome and Stock browsers, and MS Edge) +var SUPPORTS_NATIVE_HLS = exports.SUPPORTS_NATIVE_HLS = IS_SAFARI || IS_ANDROID && (IS_CHROME || IS_STOCK_ANDROID) || IS_IE && UA.match(/edge/gi) !== null; - // set it to not show scroll bars so 100% will work - $(document.documentElement).addClass('mejs-fullscreen'); +// Detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails) - // store sizing - normalHeight = t.container.height(); - normalWidth = t.container.width(); +// iOS +var hasiOSFullScreen = video.webkitEnterFullscreen !== undefined; - // attempt to do true fullscreen (Safari 5.1 and Firefox Nightly only for now) - if (t.media.pluginType === 'native') { - if (mejs.MediaFeatures.hasTrueNativeFullScreen) { +// W3C +var hasNativeFullscreen = video.requestFullscreen !== undefined; - mejs.MediaFeatures.requestFullScreen(t.container[0]); - //return; +// OS X 10.5 can't do this even if it says it can :( +if (hasiOSFullScreen && UA.match(/mac os x 10_5/i)) { + hasNativeFullscreen = false; + hasiOSFullScreen = false; +} - if (t.isInIframe) { - // sometimes exiting from fullscreen doesn't work - // notably in Chrome <iframe>. Fixed in version 17 - setTimeout(function checkFullscreen() { +// webkit/firefox/IE11+ +var hasWebkitNativeFullScreen = video.webkitRequestFullScreen !== undefined; +var hasMozNativeFullScreen = video.mozRequestFullScreen !== undefined; +var hasMsNativeFullScreen = video.msRequestFullscreen !== undefined; + +var hasTrueNativeFullScreen = hasWebkitNativeFullScreen || hasMozNativeFullScreen || hasMsNativeFullScreen; +var nativeFullScreenEnabled = hasTrueNativeFullScreen; +var fullScreenEventName = ''; +var isFullScreen = void 0, + requestFullScreen = void 0, + cancelFullScreen = void 0; + +// Enabled? +if (hasMozNativeFullScreen) { + nativeFullScreenEnabled = _document2.default.mozFullScreenEnabled; +} else if (hasMsNativeFullScreen) { + nativeFullScreenEnabled = _document2.default.msFullscreenEnabled; +} - if (t.isNativeFullScreen) { - var zoomMultiplier = window["devicePixelRatio"] || 1; - // Use a percent error margin since devicePixelRatio is a float and not exact. - var percentErrorMargin = 0.002; // 0.2% - var windowWidth = zoomMultiplier * $(window).width(); - var screenWidth = screen.width; - var absDiff = Math.abs(screenWidth - windowWidth); - var marginError = screenWidth * percentErrorMargin; +if (IS_CHROME) { + hasiOSFullScreen = false; +} - // check if the video is suddenly not really fullscreen - if (absDiff > marginError) { - // manually exit - t.exitFullScreen(); - } else { - // test again - setTimeout(checkFullscreen, 500); - } - } +if (hasTrueNativeFullScreen) { + if (hasWebkitNativeFullScreen) { + fullScreenEventName = 'webkitfullscreenchange'; + } else if (hasMozNativeFullScreen) { + fullScreenEventName = 'mozfullscreenchange'; + } else if (hasMsNativeFullScreen) { + fullScreenEventName = 'MSFullscreenChange'; + } - }, 500); - } + exports.isFullScreen = isFullScreen = function isFullScreen() { + if (hasMozNativeFullScreen) { + return _document2.default.mozFullScreen; + } else if (hasWebkitNativeFullScreen) { + return _document2.default.webkitIsFullScreen; + } else if (hasMsNativeFullScreen) { + return _document2.default.msFullscreenElement !== null; + } + }; - } else if (mejs.MediaFeatures.hasSemiNativeFullScreen) { - t.media.webkitEnterFullscreen(); - return; - } - } + exports.requestFullScreen = requestFullScreen = function requestFullScreen(el) { - // check for iframe launch - if (t.isInIframe) { - var url = t.options.newWindowCallback(this); + if (hasWebkitNativeFullScreen) { + el.webkitRequestFullScreen(); + } else if (hasMozNativeFullScreen) { + el.mozRequestFullScreen(); + } else if (hasMsNativeFullScreen) { + el.msRequestFullscreen(); + } + }; + exports.cancelFullScreen = cancelFullScreen = function cancelFullScreen() { + if (hasWebkitNativeFullScreen) { + _document2.default.webkitCancelFullScreen(); + } else if (hasMozNativeFullScreen) { + _document2.default.mozCancelFullScreen(); + } else if (hasMsNativeFullScreen) { + _document2.default.msExitFullscreen(); + } + }; +} - if (url !== '') { +var HAS_NATIVE_FULLSCREEN = exports.HAS_NATIVE_FULLSCREEN = hasNativeFullscreen; +var HAS_WEBKIT_NATIVE_FULLSCREEN = exports.HAS_WEBKIT_NATIVE_FULLSCREEN = hasWebkitNativeFullScreen; +var HAS_MOZ_NATIVE_FULLSCREEN = exports.HAS_MOZ_NATIVE_FULLSCREEN = hasMozNativeFullScreen; +var HAS_MS_NATIVE_FULLSCREEN = exports.HAS_MS_NATIVE_FULLSCREEN = hasMsNativeFullScreen; +var HAS_IOS_FULLSCREEN = exports.HAS_IOS_FULLSCREEN = hasiOSFullScreen; +var HAS_TRUE_NATIVE_FULLSCREEN = exports.HAS_TRUE_NATIVE_FULLSCREEN = hasTrueNativeFullScreen; +var HAS_NATIVE_FULLSCREEN_ENABLED = exports.HAS_NATIVE_FULLSCREEN_ENABLED = nativeFullScreenEnabled; +var FULLSCREEN_EVENT_NAME = exports.FULLSCREEN_EVENT_NAME = fullScreenEventName; + +exports.isFullScreen = isFullScreen; +exports.requestFullScreen = requestFullScreen; +exports.cancelFullScreen = cancelFullScreen; + + +_mejs2.default.Features = _mejs2.default.Features || {}; +_mejs2.default.Features.isiPad = IS_IPAD; +_mejs2.default.Features.isiPhone = IS_IPHONE; +_mejs2.default.Features.isiOS = _mejs2.default.Features.isiPhone || _mejs2.default.Features.isiPad; +_mejs2.default.Features.isAndroid = IS_ANDROID; +_mejs2.default.Features.isIE = IS_IE; +_mejs2.default.Features.isEdge = IS_EDGE; +_mejs2.default.Features.isChrome = IS_CHROME; +_mejs2.default.Features.isFirefox = IS_FIREFOX; +_mejs2.default.Features.isSafari = IS_SAFARI; +_mejs2.default.Features.isStockAndroid = IS_STOCK_ANDROID; +_mejs2.default.Features.hasMSE = HAS_MSE; +_mejs2.default.Features.supportsNativeHLS = SUPPORTS_NATIVE_HLS; + +_mejs2.default.Features.supportsPointerEvents = SUPPORT_POINTER_EVENTS; +_mejs2.default.Features.hasiOSFullScreen = HAS_IOS_FULLSCREEN; +_mejs2.default.Features.hasNativeFullscreen = HAS_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasWebkitNativeFullScreen = HAS_WEBKIT_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasMozNativeFullScreen = HAS_MOZ_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasMsNativeFullScreen = HAS_MS_NATIVE_FULLSCREEN; +_mejs2.default.Features.hasTrueNativeFullScreen = HAS_TRUE_NATIVE_FULLSCREEN; +_mejs2.default.Features.nativeFullScreenEnabled = HAS_NATIVE_FULLSCREEN_ENABLED; +_mejs2.default.Features.fullScreenEventName = FULLSCREEN_EVENT_NAME; +_mejs2.default.Features.isFullScreen = isFullScreen; +_mejs2.default.Features.requestFullScreen = requestFullScreen; +_mejs2.default.Features.cancelFullScreen = cancelFullScreen; + +},{"2":2,"3":3,"6":6}],20:[function(_dereq_,module,exports){ +'use strict'; - // launch immediately - if (!mejs.MediaFeatures.hasTrueNativeFullScreen) { - t.pause(); - window.open(url, t.id, 'top=0,left=0,width=' + screen.availWidth + ',height=' + screen.availHeight + ',resizable=yes,scrollbars=no,status=no,toolbar=no'); - return; - } else { - setTimeout(function() { - if (!t.isNativeFullScreen) { - t.pause(); - window.open(url, t.id, 'top=0,left=0,width=' + screen.availWidth + ',height=' + screen.availHeight + ',resizable=yes,scrollbars=no,status=no,toolbar=no'); - } - }, 250); - } - } +/** + * Most of the mtehods have been borrowed/adapted from https://plainjs.com/javascript, + * except fadeIn/fadeOut (from https://github.com/DimitriMikadze/vanilla-helpers/blob/master/js/vanillaHelpers.js) + */ - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.removeClass = exports.addClass = exports.hasClass = undefined; +exports.offset = offset; +exports.toggleClass = toggleClass; +exports.fadeOut = fadeOut; +exports.fadeIn = fadeIn; +exports.siblings = siblings; +exports.visible = visible; +exports.ajax = ajax; - // full window code +var _window = _dereq_(3); +var _window2 = _interopRequireDefault(_window); +var _document = _dereq_(2); - // make full size - t.container - .addClass('mejs-container-fullscreen') - .width('100%') - .height('100%'); - //.css({position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, overflow: 'hidden', width: '100%', height: '100%', 'z-index': 1000}); +var _document2 = _interopRequireDefault(_document); - // Only needed for safari 5.1 native full screen, can cause display issues elsewhere - // Actually, it seems to be needed for IE8, too - //if (mejs.MediaFeatures.hasTrueNativeFullScreen) { - t.containerSizeTimeout = setTimeout(function() { - t.container.css({width: '100%', height: '100%'}); - t.setControlsSize(); - }, 500); - //} +var _mejs = _dereq_(6); - if (t.media.pluginType === 'native') { - t.$media - .width('100%') - .height('100%'); - } else { - t.container.find('.mejs-shim') - .width('100%') - .height('100%'); +var _mejs2 = _interopRequireDefault(_mejs); - //if (!mejs.MediaFeatures.hasTrueNativeFullScreen) { - t.media.setVideoSize($(window).width(),$(window).height()); - //} - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - t.layers.children('div') - .width('100%') - .height('100%'); +function offset(el) { + var rect = el.getBoundingClientRect(), + scrollLeft = _window2.default.pageXOffset || _document2.default.documentElement.scrollLeft, + scrollTop = _window2.default.pageYOffset || _document2.default.documentElement.scrollTop; + return { top: rect.top + scrollTop, left: rect.left + scrollLeft }; +} - if (t.fullscreenBtn) { - t.fullscreenBtn - .removeClass('mejs-fullscreen') - .addClass('mejs-unfullscreen'); - } +var hasClassMethod = void 0, + addClassMethod = void 0, + removeClassMethod = void 0; - t.setControlsSize(); - t.isFullScreen = true; +if ('classList' in _document2.default.documentElement) { + hasClassMethod = function hasClassMethod(el, className) { + return el.classList !== undefined && el.classList.contains(className); + }; + addClassMethod = function addClassMethod(el, className) { + return el.classList.add(className); + }; + removeClassMethod = function removeClassMethod(el, className) { + return el.classList.remove(className); + }; +} else { + hasClassMethod = function hasClassMethod(el, className) { + return new RegExp('\\b' + className + '\\b').test(el.className); + }; + addClassMethod = function addClassMethod(el, className) { + if (!hasClass(el, className)) { + el.className += ' ' + className; + } + }; + removeClassMethod = function removeClassMethod(el, className) { + el.className = el.className.replace(new RegExp('\\b' + className + '\\b', 'g'), ''); + }; +} - t.container.find('.mejs-captions-text').css('font-size', screen.width / t.width * 1.00 * 100 + '%'); - t.container.find('.mejs-captions-position').css('bottom', '45px'); - }, +var hasClass = exports.hasClass = hasClassMethod; +var addClass = exports.addClass = addClassMethod; +var removeClass = exports.removeClass = removeClassMethod; - exitFullScreen: function() { +function toggleClass(el, className) { + hasClass(el, className) ? removeClass(el, className) : addClass(el, className); +} - var t = this; +// fade an element from the current state to full opacity in "duration" ms +function fadeOut(el) { + var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400; + var callback = arguments[2]; - // Prevent container from attempting to stretch a second time - clearTimeout(t.containerSizeTimeout); + if (!el.style.opacity) { + el.style.opacity = 1; + } - // firefox can't adjust plugins - if (t.media.pluginType !== 'native' && mejs.MediaFeatures.isFirefox) { - t.media.setFullscreen(false); - //player.isFullScreen = false; - return; + var start = null; + _window2.default.requestAnimationFrame(function animate(timestamp) { + start = start || timestamp; + var progress = timestamp - start; + el.style.opacity = parseFloat(1 - progress / duration, 2); + if (progress > duration) { + if (callback && typeof callback === 'function') { + callback(); } + } else { + _window2.default.requestAnimationFrame(animate); + } + }); +} + +// fade out an element from the current state to full transparency in "duration" ms +// display is the display style the element is assigned after the animation is done +function fadeIn(el) { + var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400; + var callback = arguments[2]; + + if (!el.style.opacity) { + el.style.opacity = 0; + } - // come outo of native fullscreen - if (mejs.MediaFeatures.hasTrueNativeFullScreen && (mejs.MediaFeatures.isFullScreen() || t.isFullScreen)) { - mejs.MediaFeatures.cancelFullScreen(); + var start = null; + _window2.default.requestAnimationFrame(function animate(timestamp) { + start = start || timestamp; + var progress = timestamp - start; + el.style.opacity = parseFloat(progress / duration, 2); + if (progress > duration) { + if (callback && typeof callback === 'function') { + callback(); } + } else { + _window2.default.requestAnimationFrame(animate); + } + }); +} + +function siblings(el, filter) { + var siblings = []; + el = el.parentNode.firstChild; + do { + if (!filter || filter(el)) { + siblings.push(el); + } + } while (el = el.nextSibling); + return siblings; +} - // restore scroll bars to document - $(document.documentElement).removeClass('mejs-fullscreen'); +function visible(elem) { + return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); +} - t.container - .removeClass('mejs-container-fullscreen') - .width(normalWidth) - .height(normalHeight); - //.css({position: '', left: '', top: '', right: '', bottom: '', overflow: 'inherit', width: normalWidth + 'px', height: normalHeight + 'px', 'z-index': 1}); +function ajax(url, dataType, success, error) { + var xhr = _window2.default.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); + + var type = 'application/x-www-form-urlencoded; charset=UTF-8', + completed = false, + accept = '*/'.concat('*'); + + switch (dataType) { + case 'text': + type = 'text/plain'; + break; + case 'json': + type = 'application/json, text/javascript'; + break; + case 'html': + type = 'text/html'; + break; + case 'xml': + type = 'application/xml, text/xml'; + break; + } - if (t.media.pluginType === 'native') { - t.$media - .width(normalWidth) - .height(normalHeight); - } else { - t.container.find('.mejs-shim') - .width(normalWidth) - .height(normalHeight); + if (!type.includes('application/x-www-form-urlencoded')) { + accept = type + ', */*; q=0.01'; + } - t.media.setVideoSize(normalWidth, normalHeight); + if (xhr) { + xhr.open('GET', url, true); + xhr.setRequestHeader('Accept', accept); + xhr.onreadystatechange = function () { + + // Ignore repeat invocations + if (completed) { + return; } - t.layers.children('div') - .width(normalWidth) - .height(normalHeight); + if (xhr.readyState === 4) { + if (xhr.status === 200) { - t.fullscreenBtn - .removeClass('mejs-unfullscreen') - .addClass('mejs-fullscreen'); + completed = true; - t.setControlsSize(); - t.isFullScreen = false; + var data = void 0; - t.container.find('.mejs-captions-text').css('font-size',''); - t.container.find('.mejs-captions-position').css('bottom', ''); - } - }); + switch (dataType) { + case 'json': + data = JSON.parse(xhr.responseText); + break; + case 'xml': + data = xhr.responseXML; + break; + default: + data = xhr.responseText; + break; + } -})(mejs.$); + success(data); + } else if (typeof error === 'function') { + error(xhr.status); + } + } + }; -(function($) { + xhr.send(); + } +} - // Speed - $.extend(mejs.MepDefaults, { +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.offset = offset; +_mejs2.default.Utils.hasClass = hasClass; +_mejs2.default.Utils.addClass = addClass; +_mejs2.default.Utils.removeClass = removeClass; +_mejs2.default.Utils.toggleClass = toggleClass; +_mejs2.default.Utils.fadeIn = fadeIn; +_mejs2.default.Utils.fadeOut = fadeOut; +_mejs2.default.Utils.siblings = siblings; +_mejs2.default.Utils.visible = visible; +_mejs2.default.Utils.ajax = ajax; + +},{"2":2,"3":3,"6":6}],21:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.escapeHTML = escapeHTML; +exports.debounce = debounce; +exports.isObjectEmpty = isObjectEmpty; +exports.splitEvents = splitEvents; +exports.createEvent = createEvent; +exports.isNodeAfter = isNodeAfter; +exports.isString = isString; + +var _mejs = _dereq_(6); + +var _mejs2 = _interopRequireDefault(_mejs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - speeds: ['1.50', '1.25', '1.00', '0.75'], +/** + * + * @param {String} input + * @return {string} + */ +function escapeHTML(input) { - defaultSpeed: '1.00' + if (typeof input !== 'string') { + throw new Error('Argument passed must be a string'); + } - }); + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"' + }; - $.extend(MediaElementPlayer.prototype, { + return input.replace(/[&<>"]/g, function (c) { + return map[c]; + }); +} - buildspeed: function(player, controls, layers, media) { - var t = this; +// taken from underscore +function debounce(func, wait) { + var _this = this, + _arguments = arguments; - if (t.media.pluginType == 'native') { - var s = '<div class="mejs-button mejs-speed-button"><button type="button">'+t.options.defaultSpeed+'x</button><div class="mejs-speed-selector"><ul>'; - var i, ss; + var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if ($.inArray(t.options.defaultSpeed, t.options.speeds) === -1) { - t.options.speeds.push(t.options.defaultSpeed); - } - t.options.speeds.sort(function(a, b) { - return parseFloat(b) - parseFloat(a); - }); + if (typeof func !== 'function') { + throw new Error('First argument must be a function'); + } - for (i = 0; i < t.options.speeds.length; i++) { - s += '<li><input type="radio" name="speed" value="' + t.options.speeds[i] + '" id="' + t.options.speeds[i] + '" '; - if (t.options.speeds[i] == t.options.defaultSpeed) { - s += 'checked=true '; - s += '/><label for="' + t.options.speeds[i] + '" class="mejs-speed-selected">'+ t.options.speeds[i] + 'x</label></li>'; - } else { - s += '/><label for="' + t.options.speeds[i] + '">'+ t.options.speeds[i] + 'x</label></li>'; - } - } - s += '</ul></div></div>'; + if (typeof wait !== 'number') { + throw new Error('Second argument must be a numeric value'); + } - player.speedButton = $(s).appendTo(controls); + var timeout = void 0; + return function () { + var context = _this, + args = _arguments; + var later = function later() { + timeout = null; + if (!immediate) { + func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); - player.playbackspeed = t.options.defaultSpeed; + if (callNow) { + func.apply(context, args); + } + }; +} - player.speedButton - .on('click', 'input[type=radio]', function() { - player.playbackspeed = $(this).attr('value'); - media.playbackRate = parseFloat(player.playbackspeed); - player.speedButton.find('button').text(player.playbackspeed + 'x'); - player.speedButton.find('.mejs-speed-selected').removeClass('mejs-speed-selected'); - player.speedButton.find('input[type=radio]:checked').next().addClass('mejs-speed-selected'); - }); +/** + * Determine if an object contains any elements + * + * @see http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object + * @param {Object} instance + * @return {Boolean} + */ +function isObjectEmpty(instance) { + return Object.getOwnPropertyNames(instance).length <= 0; +} - ss = player.speedButton.find('.mejs-speed-selector'); - ss.height(this.speedButton.find('.mejs-speed-selector ul').outerHeight(true) + player.speedButton.find('.mejs-speed-translations').outerHeight(true)); - ss.css('top', (-1 * ss.height()) + 'px'); - } +/** + * Group a string of events into `document` (d) and `window` (w) events + * + * @param {String} events List of space separated events + * @param {String} id Namespace appended to events + * @return {{d: Array, w: Array}} + */ +function splitEvents(events, id) { + // Global events + var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/; + // add player ID as an event namespace so it's easier to unbind them all later + var ret = { d: [], w: [] }; + (events || '').split(' ').forEach(function (v) { + var eventName = '' + v + (id ? '.' + id : ''); + + if (eventName.startsWith('.')) { + ret.d.push(eventName); + ret.w.push(eventName); + } else { + ret[rwindow.test(v) ? 'w' : 'd'].push(eventName); } }); -})(mejs.$); - -(function($) { + ret.d = ret.d.join(' '); + ret.w = ret.w.join(' '); + return ret; +} - // add extra default options - $.extend(mejs.MepDefaults, { - // this will automatically turn on a <track> - startLanguage: '', +/** + * + * @param {string} eventName + * @param {*} target + * @return {Event|Object} + */ +function createEvent(eventName, target) { - tracksText: mejs.i18n.t('Captions/Subtitles'), + if (typeof eventName !== 'string') { + throw new Error('Event name must be a string'); + } - // option to remove the [cc] button when no <track kind="subtitles"> are present - hideCaptionsButtonWhenEmpty: true, + var eventFrags = eventName.match(/[a-z]+\.([a-z]+)/), + detail = { + target: target + }; - // If true and we only have one track, change captions to popup - toggleCaptionsButtonWhenOnlyOne: false, + if (eventFrags !== null) { + eventName = eventFrags[0]; + detail.namespace = eventFrags[1]; + } - // #id or .class - slidesSelector: '' + return new window.CustomEvent(eventName, { + detail: detail }); +} - $.extend(MediaElementPlayer.prototype, { +/** + * Returns true if targetNode appears after sourceNode in the dom. + * @param {HTMLElement} sourceNode - the source node for comparison + * @param {HTMLElement} targetNode - the node to compare against sourceNode + */ +function isNodeAfter(sourceNode, targetNode) { - hasChapters: false, + return !!(sourceNode && targetNode && sourceNode.compareDocumentPosition(targetNode) & 2 // 2 : Node.DOCUMENT_POSITION_PRECEDING + ); +} - buildtracks: function(player, controls, layers, media) { - if (player.tracks.length === 0) - return; +/** + * Determines if a value is a string + * + * @param {*} value to check + * @returns {Boolean} True if a value is a string + */ +function isString(value) { + return typeof value === 'string'; +} - var t = this, - i, - options = ''; - - if (t.domNode.textTracks) { // if browser will do native captions, prefer mejs captions, loop through tracks and hide - for (i = t.domNode.textTracks.length - 1; i >= 0; i--) { - t.domNode.textTracks[i].mode = "hidden"; - } - } - player.chapters = - $('<div class="mejs-chapters mejs-layer"></div>') - .prependTo(layers).hide(); - player.captions = - $('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>') - .prependTo(layers).hide(); - player.captionsText = player.captions.find('.mejs-captions-text'); - player.captionsButton = - $('<div class="mejs-button mejs-captions-button">'+ - '<button type="button" aria-controls="' + t.id + '" title="' + t.options.tracksText + '" aria-label="' + t.options.tracksText + '"></button>'+ - '<div class="mejs-captions-selector">'+ - '<ul>'+ - '<li>'+ - '<input type="radio" name="' + player.id + '_captions" id="' + player.id + '_captions_none" value="none" checked="checked" />' + - '<label for="' + player.id + '_captions_none">' + mejs.i18n.t('None') +'</label>'+ - '</li>' + - '</ul>'+ - '</div>'+ - '</div>') - .appendTo(controls); - - - var subtitleCount = 0; - for (i=0; i<player.tracks.length; i++) { - if (player.tracks[i].kind == 'subtitles') { - subtitleCount++; - } - } - - // if only one language then just make the button a toggle - if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){ - // click - player.captionsButton.on('click',function() { - if (player.selectedTrack === null) { - lang = player.tracks[0].srclang; - } else { - lang = 'none'; - } - player.setTrack(lang); - }); - } else { - // hover or keyboard focus - player.captionsButton.on( 'mouseenter focusin', function() { - $(this).find('.mejs-captions-selector').css('visibility','visible'); - }) - - // handle clicks to the language radio buttons - .on('click','input[type=radio]',function() { - lang = this.value; - player.setTrack(lang); - }); +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.escapeHTML = escapeHTML; +_mejs2.default.Utils.debounce = debounce; +_mejs2.default.Utils.isObjectEmpty = isObjectEmpty; +_mejs2.default.Utils.splitEvents = splitEvents; +_mejs2.default.Utils.createEvent = createEvent; +_mejs2.default.Utils.isNodeAfter = isNodeAfter; +_mejs2.default.Utils.isString = isString; - player.captionsButton.on( 'mouseleave focusout', function() { - $(this).find(".mejs-captions-selector").css("visibility","hidden"); - }); +},{"6":6}],22:[function(_dereq_,module,exports){ +'use strict'; - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.typeChecks = undefined; +exports.absolutizeUrl = absolutizeUrl; +exports.formatType = formatType; +exports.getMimeFromType = getMimeFromType; +exports.getTypeFromFile = getTypeFromFile; +exports.getExtension = getExtension; +exports.normalizeExtension = normalizeExtension; - if (!player.options.alwaysShowControls) { - // move with controls - player.container - .bind('controlsshown', function () { - // push captions above controls - player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover'); +var _mejs = _dereq_(6); - }) - .bind('controlshidden', function () { - if (!media.paused) { - // move back to normal place - player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover'); - } - }); - } else { - player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover'); - } +var _mejs2 = _interopRequireDefault(_mejs); - player.trackToLoad = -1; - player.selectedTrack = null; - player.isLoadingTrack = false; +var _general = _dereq_(21); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var typeChecks = exports.typeChecks = []; + +/** + * + * @param {String} url + * @return {String} + */ +function absolutizeUrl(url) { + + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - // add to list - for (i=0; i<player.tracks.length; i++) { - if (player.tracks[i].kind == 'subtitles') { - player.addTrackButton(player.tracks[i].srclang, player.tracks[i].label); - } - } + var el = document.createElement('div'); + el.innerHTML = '<a href="' + (0, _general.escapeHTML)(url) + '">x</a>'; + return el.firstChild.href; +} - // start loading tracks - player.loadNextTrack(); +/** + * Get the format of a specific media, based on URL and additionally its mime type + * + * @param {String} url + * @param {String} type + * @return {String} + */ +function formatType(url) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - media.addEventListener('timeupdate',function(e) { - player.displayCaptions(); - }, false); + return url && !type ? getTypeFromFile(url) : getMimeFromType(type); +} - if (player.options.slidesSelector !== '') { - player.slidesContainer = $(player.options.slidesSelector); +/** + * Return the mime part of the type in case the attribute contains the codec + * (`video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`) + * + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element + * @param {String} type + * @return {String} + */ +function getMimeFromType(type) { - media.addEventListener('timeupdate',function(e) { - player.displaySlides(); - }, false); + if (typeof type !== 'string') { + throw new Error('`type` argument must be a string'); + } - } + return type && ~type.indexOf(';') ? type.substr(0, type.indexOf(';')) : type; +} - media.addEventListener('loadedmetadata', function(e) { - player.displayChapters(); - }, false); +/** + * Get the type of media based on URL structure + * + * @param {String} url + * @return {String} + */ +function getTypeFromFile(url) { - player.container.hover( - function () { - // chapters - if (player.hasChapters) { - player.chapters.css('visibility','visible'); - player.chapters.fadeIn(200).height(player.chapters.find('.mejs-chapter').outerHeight()); - } - }, - function () { - if (player.hasChapters && !media.paused) { - player.chapters.fadeOut(200, function() { - $(this).css('visibility','hidden'); - $(this).css('display','block'); - }); - } - }); + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - // check for autoplay - if (player.node.getAttribute('autoplay') !== null) { - player.chapters.css('visibility','hidden'); - } - }, + for (var i = 0, total = typeChecks.length; i < total; i++) { + var type = typeChecks[i](url); - setTrack: function(lang){ + if (type) { + return type; + } + } - var t = this, - i; + // the do standard extension check + var ext = getExtension(url), + normalizedExt = normalizeExtension(ext); - if (lang == 'none') { - t.selectedTrack = null; - t.captionsButton.removeClass('mejs-captions-enabled'); - } else { - for (i=0; i<t.tracks.length; i++) { - if (t.tracks[i].srclang == lang) { - if (t.selectedTrack === null) - t.captionsButton.addClass('mejs-captions-enabled'); - t.selectedTrack = t.tracks[i]; - t.captions.attr('lang', t.selectedTrack.srclang); - t.displayCaptions(); - break; - } - } - } - }, + var mime = 'video/mp4'; - loadNextTrack: function() { - var t = this; + // Obtain correct MIME types + if (normalizedExt) { + if (['mp4', 'm4v', 'ogg', 'ogv', 'webm', 'flv', 'mpeg', 'mov'].includes(normalizedExt)) { + mime = 'video/' + normalizedExt; + } else if (['mp3', 'oga', 'wav', 'mid', 'midi'].includes(normalizedExt)) { + mime = 'audio/' + normalizedExt; + } + } - t.trackToLoad++; - if (t.trackToLoad < t.tracks.length) { - t.isLoadingTrack = true; - t.loadTrack(t.trackToLoad); - } else { - // add done? - t.isLoadingTrack = false; + return mime; +} - t.checkForTracks(); - } - }, +/** + * Get media file extension from URL + * + * @param {String} url + * @return {String} + */ +function getExtension(url) { - loadTrack: function(index){ - var - t = this, - track = t.tracks[index], - after = function() { + if (typeof url !== 'string') { + throw new Error('`url` argument must be a string'); + } - track.isLoaded = true; + var baseUrl = url.split('?')[0], + baseName = baseUrl.split('\\').pop().split('/').pop(); - // create button - //t.addTrackButton(track.srclang); - t.enableTrackButton(track.srclang, track.label); + return baseName.indexOf('.') > -1 ? baseName.substring(baseName.lastIndexOf('.') + 1) : ''; +} - t.loadNextTrack(); +/** + * Get standard extension of a media file + * + * @param {String} extension + * @return {String} + */ +function normalizeExtension(extension) { - }; + if (typeof extension !== 'string') { + throw new Error('`extension` argument must be a string'); + } + switch (extension) { + case 'mp4': + case 'm4v': + return 'mp4'; + case 'webm': + case 'webma': + case 'webmv': + return 'webm'; + case 'ogg': + case 'oga': + case 'ogv': + return 'ogg'; + default: + return extension; + } +} - $.ajax({ - url: track.src, - dataType: "text", - success: function(d) { +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.typeChecks = typeChecks; +_mejs2.default.Utils.absolutizeUrl = absolutizeUrl; +_mejs2.default.Utils.formatType = formatType; +_mejs2.default.Utils.getMimeFromType = getMimeFromType; +_mejs2.default.Utils.getTypeFromFile = getTypeFromFile; +_mejs2.default.Utils.getExtension = getExtension; +_mejs2.default.Utils.normalizeExtension = normalizeExtension; - // parse the loaded file - if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) { - track.entries = mejs.TrackFormatParser.dfxp.parse(d); - } else { - track.entries = mejs.TrackFormatParser.webvtt.parse(d); - } +},{"21":21,"6":6}],23:[function(_dereq_,module,exports){ +'use strict'; - after(); +var _document = _dereq_(2); - if (track.kind == 'chapters') { - t.media.addEventListener('play', function(e) { - if (t.media.duration > 0) { - t.displayChapters(track); - } - }, false); - } +var _document2 = _interopRequireDefault(_document); - if (track.kind == 'slides') { - t.setupSlides(track); - } - }, - error: function() { - t.loadNextTrack(); - } - }); - }, +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - enableTrackButton: function(lang, label) { - var t = this; +/** + * Polyfill + * + * Mimics the missing methods like Object.assign, Array.includes, etc., as a way to avoid including the whole list + * of polyfills provided by Babel. + */ - if (label === '') { - label = mejs.language.codes[lang] || lang; +// ChildNode.remove polyfill +// from: https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md +(function (arr) { + arr.forEach(function (item) { + if (item.hasOwnProperty('remove')) { + return; + } + Object.defineProperty(item, 'remove', { + configurable: true, + enumerable: true, + writable: true, + value: function remove() { + this.parentNode.removeChild(this); } + }); + }); +})([Element.prototype, CharacterData.prototype, DocumentType.prototype]); - t.captionsButton - .find('input[value=' + lang + ']') - .prop('disabled',false) - .siblings('label') - .html( label ); +// CustomEvent polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent +(function () { - // auto select - if (t.options.startLanguage == lang) { - $('#' + t.id + '_captions_' + lang).prop('checked', true).trigger('click'); - } + if (typeof window.CustomEvent === "function") return false; - t.adjustLanguageBox(); - }, + function CustomEvent(event, params) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = _document2.default.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } - addTrackButton: function(lang, label) { - var t = this; - if (label === '') { - label = mejs.language.codes[lang] || lang; - } + CustomEvent.prototype = window.Event.prototype; - t.captionsButton.find('ul').append( - $('<li>'+ - '<input type="radio" name="' + t.id + '_captions" id="' + t.id + '_captions_' + lang + '" value="' + lang + '" disabled="disabled" />' + - '<label for="' + t.id + '_captions_' + lang + '">' + label + ' (loading)' + '</label>'+ - '</li>') - ); + window.CustomEvent = CustomEvent; +})(); - t.adjustLanguageBox(); +// Object.assign polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill +if (typeof Object.assign !== 'function') { + Object.assign = function (target) { + // .length of function is 2 - // remove this from the dropdownlist (if it exists) - t.container.find('.mejs-captions-translations option[value=' + lang + ']').remove(); - }, + if (target === null || target === undefined) { + // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } - adjustLanguageBox:function() { - var t = this; - // adjust the size of the outer box - t.captionsButton.find('.mejs-captions-selector').height( - t.captionsButton.find('.mejs-captions-selector ul').outerHeight(true) + - t.captionsButton.find('.mejs-captions-translations').outerHeight(true) - ); - }, + var to = Object(target); - checkForTracks: function() { - var - t = this, - hasSubtitles = false; + for (var index = 1, total = arguments.length; index < total; index++) { + var nextSource = arguments[index]; - // check if any subtitles - if (t.options.hideCaptionsButtonWhenEmpty) { - for (i=0; i<t.tracks.length; i++) { - if (t.tracks[i].kind == 'subtitles') { - hasSubtitles = true; - break; + if (nextSource !== null) { + // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; } } + } + } + return to; + }; +} - if (!hasSubtitles) { - t.captionsButton.hide(); - t.setControlsSize(); - } +// Array.includes polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Polyfill +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, 'includes', { + value: function value(searchElement, fromIndex) { + + // 1. const O be ? ToObject(this value). + if (this === null || this === undefined) { + throw new TypeError('"this" is null or not defined'); } - }, - displayCaptions: function() { + var o = Object(this); - if (typeof this.tracks == 'undefined') - return; + // 2. const len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; - var - t = this, - i, - track = t.selectedTrack; - - if (track !== null && track.isLoaded) { - for (i=0; i<track.entries.times.length; i++) { - if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop) { - // Set the line before the timecode as a class so the cue can be targeted if needed - t.captionsText.html(track.entries.text[i]).attr('class', 'mejs-captions-text ' + (track.entries.times[i].identifier || '')); - t.captions.show().height(0); - return; // exit out if one is visible; - } - } - t.captions.hide(); - } else { - t.captions.hide(); + // 3. If len is 0, return false. + if (len === 0) { + return false; } - }, - setupSlides: function(track) { - var t = this; + // 4. const n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. const k be n. + // 6. Else n < 0, + // a. const k be len + n. + // b. If k < 0, const k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + // 7. Repeat, while k < len + while (k < len) { + // a. const elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(searchElement, elementK) is true, return true. + // c. Increase k by 1. + // NOTE: === provides the correct "SameValueZero" comparison needed here. + if (o[k] === searchElement) { + return true; + } + k++; + } - t.slides = track; - t.slides.entries.imgs = [t.slides.entries.text.length]; - t.showSlide(0); + // 8. Return false + return false; + } + }); +} - }, +// String.includes polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +if (!String.prototype.includes) { + String.prototype.includes = function (search, start) { + 'use strict'; - showSlide: function(index) { - if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') { - return; - } + if (typeof start !== 'number') { + start = 0; + } - var t = this, - url = t.slides.entries.text[index], - img = t.slides.entries.imgs[index]; + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; +} - if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') { +// String.startsWith polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; +} - t.slides.entries.imgs[index] = img = $('<img src="' + url + '">') - .on('load', function() { - img.appendTo(t.slidesContainer) - .hide() - .fadeIn() - .siblings(':visible') - .fadeOut(); +// Element.matches polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches +if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length - 1; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} - }); +// Element.closest polyfill +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest +if (window.Element && !Element.prototype.closest) { + Element.prototype.closest = function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = void 0, + el = this; + do { + i = matches.length; + while (--i >= 0 && matches.item(i) !== el) {} + } while (i < 0 && (el = el.parentElement)); + return el; + }; +} - } else { +// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ +// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - if (!img.is(':visible') && !img.is(':animated')) { +// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel - // +// MIT license - img.fadeIn() - .siblings(':visible') - .fadeOut(); - } - } +(function () { + var lastTime = 0; + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } - }, + if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; - displaySlides: function() { + if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; +})(); - if (typeof this.slides == 'undefined') - return; +},{"2":2}],24:[function(_dereq_,module,exports){ +'use strict'; - var - t = this, - slides = t.slides, - i; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isDropFrame = isDropFrame; +exports.secondsToTimeCode = secondsToTimeCode; +exports.timeCodeToSeconds = timeCodeToSeconds; +exports.calculateTimeFormat = calculateTimeFormat; +exports.convertSMPTEtoSeconds = convertSMPTEtoSeconds; - for (i=0; i<slides.entries.times.length; i++) { - if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){ +var _mejs = _dereq_(6); - t.showSlide(i); +var _mejs2 = _interopRequireDefault(_mejs); - return; // exit out if one is visible; - } - } - }, +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - displayChapters: function() { - var - t = this, - i; +/** + * Indicate if FPS is dropFrame (typically non-integer frame rates: 29.976) + * + * @param {Number} fps - Frames per second + * @return {Boolean} + */ +function isDropFrame() { + var fps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 25; - for (i=0; i<t.tracks.length; i++) { - if (t.tracks[i].kind == 'chapters' && t.tracks[i].isLoaded) { - t.drawChapters(t.tracks[i]); - t.hasChapters = true; - break; - } - } - }, + return !(fps % 1 === 0); +} +/** + * Format a numeric time in format '00:00:00' + * + * @param {Number} time - Ideally a number, but if not or less than zero, is defaulted to zero + * @param {Boolean} forceHours + * @param {Boolean} showFrameCount + * @param {Number} fps - Frames per second + * @param {Number} secondsDecimalLength - Number of decimals to display if any + * @return {String} + */ +function secondsToTimeCode(time) { + var forceHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var showFrameCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var fps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 25; + var secondsDecimalLength = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + + + time = !time || typeof time !== 'number' || time < 0 ? 0 : time; + + var dropFrames = Math.round(fps * 0.066666), + // Number of drop frames to drop on the minute marks (6%) + timeBase = Math.round(fps), + framesPer24Hours = Math.round(fps * 3600) * 24, + framesPer10Minutes = Math.round(fps * 600), + frameSep = isDropFrame(fps) ? ';' : ':', + hours = void 0, + minutes = void 0, + seconds = void 0, + frames = void 0, + f = Math.round(time * fps); + + if (isDropFrame(fps)) { + + if (f < 0) { + f = framesPer24Hours + f; + } - drawChapters: function(chapters) { - var - t = this, - i, - dur, - //width, - //left, - percent = 0, - usedPercent = 0; - - t.chapters.empty(); - - for (i=0; i<chapters.entries.times.length; i++) { - dur = chapters.entries.times[i].stop - chapters.entries.times[i].start; - percent = Math.floor(dur / t.media.duration * 100); - if (percent + usedPercent > 100 || // too large - i == chapters.entries.times.length-1 && percent + usedPercent < 100) // not going to fill it in - { - percent = 100 - usedPercent; - } - //width = Math.floor(t.width * dur / t.media.duration); - //left = Math.floor(t.width * chapters.entries.times[i].start / t.media.duration); - //if (left + width > t.width) { - // width = t.width - left; - //} - - t.chapters.append( $( - '<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' + - '<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' + - '<span class="ch-title">' + chapters.entries.text[i] + '</span>' + - '<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '–' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' + - '</div>' + - '</div>')); - usedPercent += percent; - } - - t.chapters.find('div.mejs-chapter').click(function() { - t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) ); - if (t.media.paused) { - t.media.play(); - } - }); + f = f % framesPer24Hours; - t.chapters.show(); + var d = Math.floor(f / framesPer10Minutes); + var m = f % framesPer10Minutes; + f = f + dropFrames * 9 * d; + if (m > dropFrames) { + f = f + dropFrames * Math.floor((m - dropFrames) / Math.round(timeBase * 60 - dropFrames)); } - }); + var timeBaseDivision = Math.floor(f / timeBase); + hours = Math.floor(Math.floor(timeBaseDivision / 60) / 60); + minutes = Math.floor(timeBaseDivision / 60) % 60; - mejs.language = { - codes: { - af:'Afrikaans', - sq:'Albanian', - ar:'Arabic', - be:'Belarusian', - bg:'Bulgarian', - ca:'Catalan', - zh:'Chinese', - 'zh-cn':'Chinese Simplified', - 'zh-tw':'Chinese Traditional', - hr:'Croatian', - cs:'Czech', - da:'Danish', - nl:'Dutch', - en:'English', - et:'Estonian', - fl:'Filipino', - fi:'Finnish', - fr:'French', - gl:'Galician', - de:'German', - el:'Greek', - ht:'Haitian Creole', - iw:'Hebrew', - hi:'Hindi', - hu:'Hungarian', - is:'Icelandic', - id:'Indonesian', - ga:'Irish', - it:'Italian', - ja:'Japanese', - ko:'Korean', - lv:'Latvian', - lt:'Lithuanian', - mk:'Macedonian', - ms:'Malay', - mt:'Maltese', - no:'Norwegian', - fa:'Persian', - pl:'Polish', - pt:'Portuguese', - // 'pt-pt':'Portuguese (Portugal)', - ro:'Romanian', - ru:'Russian', - sr:'Serbian', - sk:'Slovak', - sl:'Slovenian', - es:'Spanish', - sw:'Swahili', - sv:'Swedish', - tl:'Tagalog', - th:'Thai', - tr:'Turkish', - uk:'Ukrainian', - vi:'Vietnamese', - cy:'Welsh', - yi:'Yiddish' + if (showFrameCount) { + seconds = timeBaseDivision % 60; + } else { + seconds = (f / timeBase % 60).toFixed(secondsDecimalLength); } - }; + } else { + hours = Math.floor(time / 3600) % 24; + minutes = Math.floor(time / 60) % 60; + if (showFrameCount) { + seconds = Math.floor(time % 60); + } else { + seconds = (time % 60).toFixed(secondsDecimalLength); + } + } + hours = hours <= 0 ? 0 : hours; + minutes = minutes <= 0 ? 0 : minutes; + seconds = seconds <= 0 ? 0 : seconds; + + var result = forceHours || hours > 0 ? (hours < 10 ? '0' + hours : hours) + ':' : ''; + result += (minutes < 10 ? '0' + minutes : minutes) + ':'; + result += '' + (seconds < 10 ? '0' + seconds : seconds); + + if (showFrameCount) { + frames = (f % timeBase).toFixed(0); + frames = frames <= 0 ? 0 : frames; + result += frames < 10 ? frameSep + '0' + frames : '' + frameSep + frames; + } - /* - Parses WebVTT format which should be formatted as - ================================ - WEBVTT - - 1 - 00:00:01,1 --> 00:00:05,000 - A line of text - - 2 - 00:01:15,1 --> 00:02:05,000 - A second line of text - - =============================== - - Adapted from: http://www.delphiki.com/html5/playr - */ - mejs.TrackFormatParser = { - webvtt: { - pattern_timecode: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/, - - parse: function(trackText) { - var - i = 0, - lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/), - entries = {text:[], times:[]}, - timecode, - text, - identifier; - for(; i<lines.length; i++) { - timecode = this.pattern_timecode.exec(lines[i]); - - if (timecode && i<lines.length) { - if ((i - 1) >= 0 && lines[i - 1] !== '') { - identifier = lines[i - 1]; - } - i++; - // grab all the (possibly multi-line) text that follows - text = lines[i]; - i++; - while(lines[i] !== '' && i<lines.length){ - text = text + '\n' + lines[i]; - i++; - } - text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); - // Text is in a different array so I can use .join - entries.text.push(text); - entries.times.push( - { - identifier: identifier, - start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) === 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]), - stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]), - settings: timecode[5] - }); - } - identifier = ''; - } - return entries; - } - }, - // Thanks to Justin Capella: https://github.com/johndyer/mediaelement/pull/420 - dfxp: { - parse: function(trackText) { - trackText = $(trackText).filter("tt"); - var - i = 0, - container = trackText.children("div").eq(0), - lines = container.find("p"), - styleNode = trackText.find("#" + container.attr("style")), - styles, - begin, - end, - text, - entries = {text:[], times:[]}; - - - if (styleNode.length) { - var attributes = styleNode.removeAttr("id").get(0).attributes; - if (attributes.length) { - styles = {}; - for (i = 0; i < attributes.length; i++) { - styles[attributes[i].name.split(":")[1]] = attributes[i].value; - } - } - } + return result; +} - for(i = 0; i<lines.length; i++) { - var style; - var _temp_times = { - start: null, - stop: null, - style: null - }; - if (lines.eq(i).attr("begin")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("begin")); - if (!_temp_times.start && lines.eq(i-1).attr("end")) _temp_times.start = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i-1).attr("end")); - if (lines.eq(i).attr("end")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i).attr("end")); - if (!_temp_times.stop && lines.eq(i+1).attr("begin")) _temp_times.stop = mejs.Utility.convertSMPTEtoSeconds(lines.eq(i+1).attr("begin")); - if (styles) { - style = ""; - for (var _style in styles) { - style += _style + ":" + styles[_style] + ";"; - } - } - if (style) _temp_times.style = style; - if (_temp_times.start === 0) _temp_times.start = 0.200; - entries.times.push(_temp_times); - text = $.trim(lines.eq(i).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>"); - entries.text.push(text); - if (entries.times.start === 0) entries.times.start = 2; - } - return entries; - } - }, - split2: function (text, regex) { - // normal version for compliant browsers - // see below for IE fix - return text.split(regex); - } - }; +/** + * Convert a '00:00:00' time string into seconds + * + * @param {String} time + * @param {Number} fps - Frames per second + * @return {Number} + */ +function timeCodeToSeconds(time) { + var fps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 25; - // test for browsers with bad String.split method. - if ('x\n\ny'.split(/\n/gi).length != 3) { - // add super slow IE8 and below version - mejs.TrackFormatParser.split2 = function(text, regex) { - var - parts = [], - chunk = '', - i; - for (i=0; i<text.length; i++) { - chunk += text.substring(i,i+1); - if (regex.test(chunk)) { - parts.push(chunk.replace(regex, '')); - chunk = ''; - } - } - parts.push(chunk); - return parts; - }; + if (typeof time !== 'string') { + throw new TypeError('Time must be a string'); } -})(mejs.$); + if (time.indexOf(';') > 0) { + time = time.replace(';', ':'); + } -/* -* ContextMenu Plugin -* -* -*/ - -(function($) { - -$.extend(mejs.MepDefaults, - { 'contextMenuItems': [ - // demo of a fullscreen option - { - render: function(player) { - - // check for fullscreen plugin - if (typeof player.enterFullScreen == 'undefined') - return null; - - if (player.isFullScreen) { - return mejs.i18n.t('Turn off Fullscreen'); - } else { - return mejs.i18n.t('Go Fullscreen'); - } - }, - click: function(player) { - if (player.isFullScreen) { - player.exitFullScreen(); - } else { - player.enterFullScreen(); - } - } - } - , - // demo of a mute/unmute button - { - render: function(player) { - if (player.media.muted) { - return mejs.i18n.t('Unmute'); - } else { - return mejs.i18n.t('Mute'); - } - }, - click: function(player) { - if (player.media.muted) { - player.setMuted(false); - } else { - player.setMuted(true); + if (!time.match(/\d{2}(\:\d{2}){0,3}/)) { + throw new TypeError('Time code must have the format `00:00:00`'); + } + + var parts = time.split(':'); + + var output = void 0, + hours = 0, + minutes = 0, + seconds = 0, + frames = 0, + totalMinutes = 0, + dropFrames = Math.round(fps * 0.066666), + // Number of drop frames to drop on the minute marks (6%) + timeBase = Math.round(fps), + hFrames = timeBase * 3600, + mFrames = timeBase * 60; + + switch (parts.length) { + default: + case 1: + seconds = parseInt(parts[0], 10); + break; + case 2: + minutes = parseInt(parts[0], 10); + seconds = parseInt(parts[1], 10); + break; + case 3: + hours = parseInt(parts[0], 10); + minutes = parseInt(parts[1], 10); + seconds = parseInt(parts[2], 10); + break; + case 4: + hours = parseInt(parts[0], 10); + minutes = parseInt(parts[1], 10); + seconds = parseInt(parts[2], 10); + frames = parseInt(parts[3], 10); + break; + } + + if (isDropFrame(fps)) { + totalMinutes = 60 * hours + minutes; + output = hFrames * hours + mFrames * minutes + timeBase * seconds + frames - dropFrames * (totalMinutes - Math.floor(totalMinutes / 10)); + } else { + output = (hFrames * hours + mFrames * minutes + fps * seconds + frames) / fps; + } + + return parseFloat(output.toFixed(3)); +} + +/** + * Calculate the time format to use + * + * There is a default format set in the options but it can be incomplete, so it is adjusted according to the media + * duration. Format: 'hh:mm:ss:ff' + * @param {*} time - Ideally a number, but if not or less than zero, is defaulted to zero + * @param {Object} options + * @param {Number} fps - Frames per second + */ +function calculateTimeFormat(time, options) { + var fps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25; + + + time = !time || typeof time !== 'number' || time < 0 ? 0 : time; + + var hours = Math.floor(time / 3600) % 24, + minutes = Math.floor(time / 60) % 60, + seconds = Math.floor(time % 60), + frames = Math.floor((time % 1 * fps).toFixed(3)), + lis = [[frames, 'f'], [seconds, 's'], [minutes, 'm'], [hours, 'h']]; + + var format = options.timeFormat, + firstTwoPlaces = format[1] === format[0], + separatorIndex = firstTwoPlaces ? 2 : 1, + separator = format.length < separatorIndex ? format[separatorIndex] : ':', + firstChar = format[0], + required = false; + + for (var i = 0, len = lis.length; i < len; i++) { + if (format.indexOf(lis[i][1]) > -1) { + required = true; + } else if (required) { + var hasNextValue = false; + for (var j = i; j < len; j++) { + if (lis[j][0] > 0) { + hasNextValue = true; + break; } } - }, - // separator - { - isSeparator: true - } - , - // demo of simple download video - { - render: function(player) { - return mejs.i18n.t('Download Video'); - }, - click: function(player) { - window.location.href = player.media.currentSrc; - } - } - ]} -); - - - $.extend(MediaElementPlayer.prototype, { - buildcontextmenu: function(player, controls, layers, media) { - - // create context menu - player.contextMenu = $('<div class="mejs-contextmenu"></div>') - .appendTo($('body')) - .hide(); - - // create events for showing context menu - player.container.bind('contextmenu', function(e) { - if (player.isContextMenuEnabled) { - e.preventDefault(); - player.renderContextMenu(e.clientX-1, e.clientY-1); - return false; - } - }); - player.container.bind('click', function() { - player.contextMenu.hide(); - }); - player.contextMenu.bind('mouseleave', function() { - // - player.startContextMenuTimer(); - - }); - }, + if (!hasNextValue) { + break; + } - cleancontextmenu: function(player) { - player.contextMenu.remove(); - }, - - isContextMenuEnabled: true, - enableContextMenu: function() { - this.isContextMenuEnabled = true; - }, - disableContextMenu: function() { - this.isContextMenuEnabled = false; - }, - - contextMenuTimeout: null, - startContextMenuTimer: function() { - // - - var t = this; - - t.killContextMenuTimer(); - - t.contextMenuTimer = setTimeout(function() { - t.hideContextMenu(); - t.killContextMenuTimer(); - }, 750); - }, - killContextMenuTimer: function() { - var timer = this.contextMenuTimer; - - // - - if (timer != null) { - clearTimeout(timer); - delete timer; - timer = null; - } - }, - - hideContextMenu: function() { - this.contextMenu.hide(); - }, - - renderContextMenu: function(x,y) { - - // alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly - var t = this, - html = '', - items = t.options.contextMenuItems; - - for (var i=0, il=items.length; i<il; i++) { - - if (items[i].isSeparator) { - html += '<div class="mejs-contextmenu-separator"></div>'; - } else { - - var rendered = items[i].render(t); - - // render can return null if the item doesn't need to be used at the moment - if (rendered != null) { - html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>'; - } - } + if (!firstTwoPlaces) { + format = firstChar + format; } - - // position and show the context menu - t.contextMenu - .empty() - .append($(html)) - .css({top:y, left:x}) - .show(); - - // bind events - t.contextMenu.find('.mejs-contextmenu-item').each(function() { - - // which one is this? - var $dom = $(this), - itemIndex = parseInt( $dom.data('itemindex'), 10 ), - item = t.options.contextMenuItems[itemIndex]; - - // bind extra functionality? - if (typeof item.show != 'undefined') - item.show( $dom , t); - - // bind click action - $dom.click(function() { - // perform click action - if (typeof item.click != 'undefined') - item.click(t); - - // close - t.contextMenu.hide(); - }); - }); - - // stop the controls from hiding - setTimeout(function() { - t.killControlsTimer('rev3'); - }, 100); - + format = lis[i][1] + separator + format; + if (firstTwoPlaces) { + format = lis[i][1] + format; + } + firstChar = lis[i][1]; } - }); - -})(mejs.$); + } + + options.currentTimeFormat = format; +} + /** - * Postroll plugin + * Convert Society of Motion Picture and Television Engineers (SMTPE) time code into seconds + * + * @param {String} SMPTE + * @return {Number} */ -(function($) { +function convertSMPTEtoSeconds(SMPTE) { - $.extend(mejs.MepDefaults, { - postrollCloseText: mejs.i18n.t('Close') - }); + if (typeof SMPTE !== 'string') { + throw new TypeError('Argument must be a string value'); + } - // Postroll - $.extend(MediaElementPlayer.prototype, { - buildpostroll: function(player, controls, layers, media) { - var - t = this, - postrollLink = t.container.find('link[rel="postroll"]').attr('href'); - - if (typeof postrollLink !== 'undefined') { - player.postroll = - $('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">' + t.options.postrollCloseText + '</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(layers).hide(); - - t.media.addEventListener('ended', function (e) { - $.ajax({ - dataType: 'html', - url: postrollLink, - success: function (data, textStatus) { - layers.find('.mejs-postroll-layer-content').html(data); - } - }); - player.postroll.show(); - }, false); - } + SMPTE = SMPTE.replace(',', '.'); + + var decimalLen = SMPTE.indexOf('.') > -1 ? SMPTE.split('.')[1].length : 0; + + var secs = 0, + multiplier = 1; + + SMPTE = SMPTE.split(':').reverse(); + + for (var i = 0, total = SMPTE.length; i < total; i++) { + multiplier = 1; + if (i > 0) { + multiplier = Math.pow(60, i); } - }); + secs += Number(SMPTE[i]) * multiplier; + } + return Number(secs.toFixed(decimalLen)); +} + +_mejs2.default.Utils = _mejs2.default.Utils || {}; +_mejs2.default.Utils.secondsToTimeCode = secondsToTimeCode; +_mejs2.default.Utils.timeCodeToSeconds = timeCodeToSeconds; +_mejs2.default.Utils.calculateTimeFormat = calculateTimeFormat; +_mejs2.default.Utils.convertSMPTEtoSeconds = convertSMPTEtoSeconds; -})(mejs.$); +},{"6":6}]},{},[23,5,4,14,18,17,15,16,8,9,10,11,12,13]); diff --git a/lib/mejs/mediaelementplayer.min.css b/lib/mejs/mediaelementplayer.min.css index ca859f38..84ca0fb5 100644 --- a/lib/mejs/mediaelementplayer.min.css +++ b/lib/mejs/mediaelementplayer.min.css @@ -1 +1 @@ -.mejs-container{position:relative;background:#000;font-family:Helvetica,Arial;text-align:left;vertical-align:top;text-indent:0;}.me-plugin{position:absolute;height:auto;width:auto;}.mejs-embed,.mejs-embed body{width:100%;height:100%;margin:0;padding:0;background:#000;overflow:hidden;}.mejs-fullscreen{overflow:hidden!important;}.mejs-container-fullscreen{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:1000;}.mejs-container-fullscreen .mejs-mediaelement,.mejs-container-fullscreen video{width:100%;height:100%;}.mejs-clear{clear:both;}.mejs-background{position:absolute;top:0;left:0;}.mejs-mediaelement{position:absolute;top:0;left:0;width:100%;height:100%;}.mejs-poster{position:absolute;top:0;left:0;background-size:contain;background-position:50% 50%;background-repeat:no-repeat;}:root .mejs-poster img{display:none;}.mejs-poster img{border:0;padding:0;border:0;}.mejs-overlay{position:absolute;top:0;left:0;}.mejs-overlay-play{cursor:pointer;}.mejs-overlay-button{position:absolute;top:50%;left:50%;width:100px;height:100px;margin:-50px 0 0 -50px;background:url(bigplay.svg) no-repeat;}.no-svg .mejs-overlay-button{background-image:url(bigplay.png);}.mejs-overlay:hover .mejs-overlay-button{background-position:0 -100px;}.mejs-overlay-loading{position:absolute;top:50%;left:50%;width:80px;height:80px;margin:-40px 0 0 -40px;background:#333;background:url(background.png);background:rgba(0,0,0,0.9);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(50,50,50,0.9)),to(rgba(0,0,0,0.9)));background:-webkit-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:-moz-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:-o-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:-ms-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:linear-gradient(rgba(50,50,50,0.9),rgba(0,0,0,0.9));}.mejs-overlay-loading span{display:block;width:80px;height:80px;background:transparent url(loading.gif) 50% 50% no-repeat;}.mejs-container .mejs-controls{position:absolute;list-style-type:none;margin:0;padding:0;bottom:0;left:0;background:url(background.png);background:rgba(0,0,0,0.7);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(50,50,50,0.7)),to(rgba(0,0,0,0.7)));background:-webkit-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-moz-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-o-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-ms-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:linear-gradient(rgba(50,50,50,0.7),rgba(0,0,0,0.7));height:30px;width:100%;}.mejs-container .mejs-controls div{list-style-type:none;background-image:none;display:block;float:left;margin:0;padding:0;width:26px;height:26px;font-size:11px;line-height:11px;font-family:Helvetica,Arial;border:0;}.mejs-controls .mejs-button button{cursor:pointer;display:block;font-size:0;line-height:0;text-decoration:none;margin:7px 5px;padding:0;position:absolute;height:16px;width:16px;border:0;background:transparent url(controls.svg) no-repeat;}.no-svg .mejs-controls .mejs-button button{background-image:url(controls.png);}.mejs-controls .mejs-button button:focus{outline:dotted 1px #999;}.mejs-container .mejs-controls .mejs-time{color:#fff;display:block;height:17px;width:auto;padding:8px 3px 0 3px;overflow:hidden;text-align:center;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}.mejs-container .mejs-controls .mejs-time span{color:#fff;font-size:11px;line-height:12px;display:block;float:left;margin:1px 2px 0 0;width:auto;}.mejs-controls .mejs-play button{background-position:0 0;}.mejs-controls .mejs-pause button{background-position:0 -16px;}.mejs-controls .mejs-stop button{background-position:-112px 0;}.mejs-controls div.mejs-time-rail{direction:ltr;width:200px;padding-top:5px;}.mejs-controls .mejs-time-rail span{display:block;position:absolute;width:180px;height:10px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;cursor:pointer;}.mejs-controls .mejs-time-rail .mejs-time-total{margin:5px;background:#333;background:rgba(50,50,50,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(30,30,30,0.8)),to(rgba(60,60,60,0.8)));background:-webkit-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-moz-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-o-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-ms-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:linear-gradient(rgba(30,30,30,0.8),rgba(60,60,60,0.8));}.mejs-controls .mejs-time-rail .mejs-time-buffering{width:100%;background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:15px 15px;-moz-background-size:15px 15px;-o-background-size:15px 15px;background-size:15px 15px;-webkit-animation:buffering-stripes 2s linear infinite;-moz-animation:buffering-stripes 2s linear infinite;-ms-animation:buffering-stripes 2s linear infinite;-o-animation:buffering-stripes 2s linear infinite;animation:buffering-stripes 2s linear infinite;}@-webkit-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@-moz-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@-ms-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@-o-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}.mejs-controls .mejs-time-rail .mejs-time-loaded{background:#3caac8;background:rgba(60,170,200,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(44,124,145,0.8)),to(rgba(78,183,212,0.8)));background:-webkit-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:-moz-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:-o-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:-ms-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:linear-gradient(rgba(44,124,145,0.8),rgba(78,183,212,0.8));width:0;}.mejs-controls .mejs-time-rail .mejs-time-current{background:#fff;background:rgba(255,255,255,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(255,255,255,0.9)),to(rgba(200,200,200,0.8)));background:-webkit-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-moz-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-o-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-ms-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:linear-gradient(rgba(255,255,255,0.9),rgba(200,200,200,0.8));width:0;}.mejs-controls .mejs-time-rail .mejs-time-handle{display:none;position:absolute;margin:0;width:10px;background:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;cursor:pointer;border:solid 2px #333;top:-2px;text-align:center;}.mejs-controls .mejs-time-rail .mejs-time-float{position:absolute;display:none;background:#eee;width:36px;height:17px;border:solid 1px #333;top:-26px;margin-left:-18px;text-align:center;color:#111;}.mejs-controls .mejs-time-rail .mejs-time-float-current{margin:2px;width:30px;display:block;text-align:center;left:0;}.mejs-controls .mejs-time-rail .mejs-time-float-corner{position:absolute;display:block;width:0;height:0;line-height:0;border:solid 5px #eee;border-color:#eee transparent transparent transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:15px;left:13px;}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float{width:48px;}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current{width:44px;}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner{left:18px;}.mejs-controls .mejs-fullscreen-button button{background-position:-32px 0;}.mejs-controls .mejs-unfullscreen button{background-position:-32px -16px;}.mejs-controls .mejs-mute button{background-position:-16px -16px;}.mejs-controls .mejs-unmute button{background-position:-16px 0;}.mejs-controls .mejs-volume-button{position:relative;}.mejs-controls .mejs-volume-button .mejs-volume-slider{display:none;height:115px;width:25px;background:url(background.png);background:rgba(50,50,50,0.7);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:-115px;left:0;z-index:1;position:absolute;margin:0;}.mejs-controls .mejs-volume-button:hover{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total{position:absolute;left:11px;top:8px;width:2px;height:100px;background:#ddd;background:rgba(255,255,255,0.5);margin:0;}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current{position:absolute;left:11px;top:8px;width:2px;height:100px;background:#ddd;background:rgba(255,255,255,0.9);margin:0;}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle{position:absolute;left:4px;top:-3px;width:16px;height:6px;background:#ddd;background:rgba(255,255,255,0.9);cursor:N-resize;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;margin:0;}.mejs-controls div.mejs-horizontal-volume-slider{height:26px;width:60px;position:relative;}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total{position:absolute;left:0;top:11px;width:50px;height:8px;margin:0;padding:0;font-size:1px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#333;background:rgba(50,50,50,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(30,30,30,0.8)),to(rgba(60,60,60,0.8)));background:-webkit-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-moz-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-o-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-ms-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:linear-gradient(rgba(30,30,30,0.8),rgba(60,60,60,0.8));}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current{position:absolute;left:0;top:11px;width:50px;height:8px;margin:0;padding:0;font-size:1px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;background:rgba(255,255,255,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(255,255,255,0.9)),to(rgba(200,200,200,0.8)));background:-webkit-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-moz-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-o-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-ms-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:linear-gradient(rgba(255,255,255,0.9),rgba(200,200,200,0.8));}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle{display:none;}.mejs-controls .mejs-captions-button{position:relative;}.mejs-controls .mejs-captions-button button{background-position:-48px 0;}.mejs-controls .mejs-captions-button .mejs-captions-selector{visibility:hidden;position:absolute;bottom:26px;right:-51px;width:85px;height:100px;background:url(background.png);background:rgba(50,50,50,0.7);border:solid 1px transparent;padding:10px 10px 0 10px;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li{margin:0 0 6px 0;padding:0;list-style-type:none!important;display:block;color:#fff;overflow:hidden;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label{width:55px;float:left;padding:4px 0 0 0;line-height:15px;font-family:helvetica,arial;font-size:10px;}.mejs-controls .mejs-captions-button .mejs-captions-translations{font-size:10px;margin:0 0 5px 0;}.mejs-chapters{position:absolute;top:0;left:0;-xborder-right:solid 1px #fff;width:10000px;z-index:1;}.mejs-chapters .mejs-chapter{position:absolute;float:left;background:#222;background:rgba(0,0,0,0.7);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(50,50,50,0.7)),to(rgba(0,0,0,0.7)));background:-webkit-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-moz-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-o-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-ms-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:linear-gradient(rgba(50,50,50,0.7),rgba(0,0,0,0.7));filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,startColorstr=#323232,endColorstr=#000000);overflow:hidden;border:0;}.mejs-chapters .mejs-chapter .mejs-chapter-block{font-size:11px;color:#fff;padding:5px;display:block;border-right:solid 1px #333;border-bottom:solid 1px #333;cursor:pointer;}.mejs-chapters .mejs-chapter .mejs-chapter-block-last{border-right:none;}.mejs-chapters .mejs-chapter .mejs-chapter-block:hover{background:#666;background:rgba(102,102,102,0.7);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(102,102,102,0.7)),to(rgba(50,50,50,0.6)));background:-webkit-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:-moz-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:-o-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:-ms-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:linear-gradient(rgba(102,102,102,0.7),rgba(50,50,50,0.6));filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,startColorstr=#666666,endColorstr=#323232);}.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title{font-size:12px;font-weight:bold;display:block;white-space:nowrap;text-overflow:ellipsis;margin:0 0 3px 0;line-height:12px;}.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan{font-size:12px;line-height:12px;margin:3px 0 4px 0;display:block;white-space:nowrap;text-overflow:ellipsis;}.mejs-captions-layer{position:absolute;bottom:0;left:0;text-align:center;line-height:20px;font-size:16px;color:#fff;}.mejs-captions-layer a{color:#fff;text-decoration:underline;}.mejs-captions-layer[lang=ar]{font-size:20px;font-weight:normal;}.mejs-captions-position{position:absolute;width:100%;bottom:15px;left:0;}.mejs-captions-position-hover{bottom:35px;}.mejs-captions-text{padding:3px 5px;background:url(background.png);background:rgba(20,20,20,0.5);white-space:pre-wrap;}.me-cannotplay a{color:#fff;font-weight:bold;}.me-cannotplay span{padding:15px;display:block;}.mejs-controls .mejs-loop-off button{background-position:-64px -16px;}.mejs-controls .mejs-loop-on button{background-position:-64px 0;}.mejs-controls .mejs-backlight-off button{background-position:-80px -16px;}.mejs-controls .mejs-backlight-on button{background-position:-80px 0;}.mejs-controls .mejs-picturecontrols-button{background-position:-96px 0;}.mejs-contextmenu{position:absolute;width:150px;padding:10px;border-radius:4px;top:0;left:0;background:#fff;border:solid 1px #999;z-index:1001;}.mejs-contextmenu .mejs-contextmenu-separator{height:1px;font-size:0;margin:5px 6px;background:#333;}.mejs-contextmenu .mejs-contextmenu-item{font-family:Helvetica,Arial;font-size:12px;padding:4px 6px;cursor:pointer;color:#333;}.mejs-contextmenu .mejs-contextmenu-item:hover{background:#2C7C91;color:#fff;}.mejs-controls .mejs-sourcechooser-button{position:relative;}.mejs-controls .mejs-sourcechooser-button button{background-position:-128px 0;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector{visibility:hidden;position:absolute;bottom:26px;right:-10px;width:130px;height:100px;background:url(background.png);background:rgba(50,50,50,0.7);border:solid 1px transparent;padding:10px;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li{margin:0 0 6px 0;padding:0;list-style-type:none!important;display:block;color:#fff;overflow:hidden;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label{width:100px;float:left;padding:4px 0 0 0;line-height:15px;font-family:helvetica,arial;font-size:10px;}.mejs-postroll-layer{position:absolute;bottom:0;left:0;width:100%;height:100%;background:url(background.png);background:rgba(50,50,50,0.7);z-index:1000;overflow:hidden;}.mejs-postroll-layer-content{width:100%;height:100%;}.mejs-postroll-close{position:absolute;right:0;top:0;background:url(background.png);background:rgba(50,50,50,0.7);color:#fff;padding:4px;z-index:100;cursor:pointer;}div.mejs-speed-button{width:46px!important;position:relative;}.mejs-controls .mejs-button.mejs-speed-button button{background:transparent;width:36px;font-size:11px;line-height:normal;color:#fff;}.mejs-controls .mejs-speed-button .mejs-speed-selector{visibility:hidden;position:absolute;top:-100px;left:-10px;width:60px;height:100px;background:url(background.png);background:rgba(50,50,50,0.7);border:solid 1px transparent;padding:0;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.mejs-controls .mejs-speed-button:hover>.mejs-speed-selector{visibility:visible;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label.mejs-speed-selected{color:rgba(33,248,248,1);}.mejs-controls .mejs-speed-button .mejs-speed-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li{margin:0 0 6px 0;padding:0 10px;list-style-type:none!important;display:block;color:#fff;overflow:hidden;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;display:none;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label{width:60px;float:left;padding:4px 0 0 0;line-height:15px;font-family:helvetica,arial;font-size:11.5px;color:white;margin-left:5px;cursor:pointer;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li:hover{background-color:#c8c8c8!important;background-color:rgba(255,255,255,.4)!important;} \ No newline at end of file +.mejs__offscreen{clip:rect(1px,1px,1px,1px);-webkit-clip-path:polygon(0 0,0 0,0 0,0 0);clip-path:polygon(0 0,0 0,0 0,0 0);position:absolute!important;height:1px;width:1px;overflow:hidden}.mejs__container{position:relative;background:#000;font-family:Helvetica,Arial,serif;text-align:left;vertical-align:top;text-indent:0;box-sizing:border-box;min-width:250px}.mejs__container .mejs__video{min-height:140px}.mejs__container *{box-sizing:border-box}.mejs__container video::-webkit-media-controls-start-playback-button{display:none!important;-webkit-appearance:none}.mejs__fill-container,.mejs__fill-container .mejs__container{width:100%;height:100%}.mejs__fill-container{overflow:hidden;position:relative;margin:0 auto;background:transparent}.mejs__container:focus{outline:none}.mejs__iframe-overlay{position:absolute;width:100%;height:100%}.mejs__embed,.mejs__embed body{width:100%;height:100%;margin:0;padding:0;background:#000;overflow:hidden}.mejs__fullscreen{overflow:hidden!important}.mejs__container-fullscreen{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:2}.mejs__container-fullscreen .mejs__mediaelement,.mejs__container-fullscreen video{width:100%!important;height:100%!important}.mejs__clear{clear:both}.mejs__background,.mejs__mediaelement{position:absolute;top:0;left:0}.mejs__mediaelement{width:100%;height:100%;z-index:0}.mejs__poster{position:absolute;top:0;left:0;background-size:contain;background-position:50% 50%;background-repeat:no-repeat;z-index:1}:root .mejs__poster-img{display:none}.mejs__poster-img{border:0;padding:0}.mejs__overlay{position:absolute;top:0;left:0;z-index:1}.mejs__layer{z-index:1}.mejs__overlay-play{cursor:pointer}.mejs__overlay-button{position:absolute;top:50%;left:50%;width:80px;height:80px;margin:-40px 0 0 -40px;background:url(mejs-controls.svg) no-repeat;background-position:0 -39px;overflow:hidden;z-index:1}.mejs__overlay:hover>.mejs__overlay-button{background-position:-80px -39px}.mejs__overlay-loading{position:absolute;top:50%;left:50%;width:80px;height:80px;margin:-40px 0 0 -40px}.mejs__overlay-loading-bg-img{display:block;width:80px;height:80px;background:transparent url(mejs-controls.svg) -160px -40px no-repeat;animation:a 1s linear infinite;z-index:1}@keyframes a{to{transform:rotate(1turn)}}.mejs__controls{position:absolute;list-style-type:none;margin:0;padding:0 10px;bottom:0;left:0;height:40px;width:100%;z-index:1}.mejs__controls:not([style*="display: none"]){background:rgba(255,0,0,.7);background:linear-gradient(transparent,rgba(0,0,0,.35))}.mejs__button,.mejs__time,.mejs__time-rail{float:left;margin:0;width:32px;height:40px;font-size:10px;line-height:10px}.mejs__button>button{cursor:pointer;display:block;font-size:0;line-height:0;text-decoration:none;margin:10px 6px;padding:0;position:absolute;height:20px;width:20px;border:0;background:transparent url(mejs-controls.svg);overflow:hidden}.mejs__button>button:focus{outline:1px dotted #999}.mejs__container-keyboard-inactive [role=slider],.mejs__container-keyboard-inactive [role=slider]:focus,.mejs__container-keyboard-inactive a,.mejs__container-keyboard-inactive a:focus,.mejs__container-keyboard-inactive button,.mejs__container-keyboard-inactive button:focus{outline:0}.mejs__time{color:#fff;display:block;height:24px;width:auto;font-weight:700;font-size:11px;padding:16px 6px 0;overflow:hidden;text-align:center;box-sizing:content-box}.mejs__play>button{background-position:0 0}.mejs__pause>button{background-position:-20px 0}.mejs__replay>button{background-position:-280px 0}.mejs__time-rail{direction:ltr;width:200px;padding-top:10px;height:40px;position:relative;margin:0 10px}.mejs__time-buffering,.mejs__time-current,.mejs__time-float,.mejs__time-float-corner,.mejs__time-float-current,.mejs__time-handle,.mejs__time-loaded,.mejs__time-marker,.mejs__time-total{cursor:pointer;display:block;position:absolute;height:10px;border-radius:2px}.mejs__time-total{margin:5px 0 0;background:hsla(0,0%,100%,.3);width:100%}.mejs__time-buffering{width:100%;background:linear-gradient(-45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:15px 15px;animation:b 2s linear infinite}@keyframes b{0%{background-position:0 0}to{background-position:30px 0}}.mejs__time-loaded{background:hsla(0,0%,100%,.3);width:0}.mejs__time-current{background:hsla(0,0%,100%,.9);width:0}.mejs__time-handle{margin:0;width:10px;background:#fff;border-radius:5px;cursor:pointer;border:2px solid #333;top:-2px}.mejs__time-float,.mejs__time-handle{display:none;position:absolute;text-align:center}.mejs__time-float{background:#eee;width:36px;height:17px;border:1px solid #333;top:-26px;margin-left:-18px;color:#111}.mejs__time-float-current{margin:2px;width:30px;display:block;text-align:center;left:0}.mejs__time-float-corner{position:absolute;display:block;width:0;height:0;line-height:0;border:5px solid #eee;border-color:#eee transparent transparent;border-radius:0;top:15px;left:13px}.mejs__long-video .mejs__time-float{width:64px;margin-left:-23px}.mejs__long-video .mejs__time-float-current{width:60px}.mejs__long-video .mejs__time-float-corner{left:18px}.mejs__broadcast{color:#fff;position:absolute;width:100%;height:10px;top:15px}.mejs__fullscreen-button>button{background-position:-80px 0}.mejs__unfullscreen>button{background-position:-100px 0}.mejs__mute>button{background-position:-60px 0}.mejs__unmute>button{background-position:-40px 0}.mejs__volume-button{position:relative}.mejs__volume-button>.mejs__volume-slider{display:none;height:115px;width:25px;background:rgba(50,50,50,.7);border-radius:0;top:-115px;left:5px;z-index:1;position:absolute;margin:0}.mejs__volume-button:hover{border-radius:0 0 4px 4px}.mejs__volume-total{position:absolute;left:11px;top:8px;width:2px;height:100px;background:hsla(0,0%,100%,.5);margin:0}.mejs__volume-current{bottom:0;width:100%;height:100%;margin:0}.mejs__volume-current,.mejs__volume-handle{position:absolute;left:0;background:hsla(0,0%,100%,.9)}.mejs__volume-handle{bottom:100%;width:16px;height:6px;margin:0 0 -3px -7px;cursor:ns-resize;border-radius:1px}.mejs__horizontal-volume-slider{height:36px;width:56px;position:relative;display:block;float:left;vertical-align:middle}.mejs__horizontal-volume-total{top:16px;width:50px;height:8px;background:rgba(50,50,50,.8)}.mejs__horizontal-volume-current,.mejs__horizontal-volume-total{position:absolute;left:0;margin:0;padding:0;font-size:1px;border-radius:2px}.mejs__horizontal-volume-current{top:0;width:100%;height:100%;background:hsla(0,0%,100%,.8)}.mejs__horizontal-volume-handle{display:none}.mejs__captions-button,.mejs__chapters-button{position:relative}.mejs__captions-button>button{background-position:-140px 0}.mejs__chapters-button>button{background-position:-302px 0}.mejs__captions-button>.mejs__captions-selector,.mejs__chapters-button>.mejs__chapters-selector{visibility:hidden;position:absolute;bottom:40px;right:-51px;width:85px;background:rgba(50,50,50,.7);border:1px solid transparent;padding:0;overflow:hidden;border-radius:0}.mejs__chapters-button>.mejs__chapters-selector{width:110px}.mejs__captions-button>.mejs__captions-selector,.mejs__chapters-button>.mejs__chapters-selector{visibility:visible}.mejs__captions-selector-list,.mejs__chapters-selector-list{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden}.mejs__captions-selector-list-item,.mejs__chapters-selector-list-item{margin:0 0 6px;padding:0 10px;list-style-type:none!important;display:block;color:#fff;overflow:hidden;cursor:pointer}.mejs__captions-selector-list-item:hover,.mejs__chapters-selector-list-item:hover{background-color:#c8c8c8!important;background-color:hsla(0,0%,100%,.4)!important}.mejs__captions-selector-input,.mejs__chapters-selector-input{clear:both;float:left;margin:3px 3px 0 5px;position:absolute;left:-1000px}.mejs__captions-selector-label,.mejs__chapters-selector-label{width:55px;float:left;padding:4px 0 0;line-height:15px;font-size:10px;cursor:pointer}.mejs__captions-selected,.mejs__chapters-selected{color:#21f8f8}.mejs__captions-translations{font-size:10px;margin:0 0 5px}.mejs__captions-layer{position:absolute;bottom:0;left:0;text-align:center;line-height:20px;font-size:16px;color:#fff}.mejs__captions-layer a{color:#fff;text-decoration:underline}.mejs__captions-layer[lang=ar]{font-size:20px;font-weight:400}.mejs__captions-position{position:absolute;width:100%;bottom:15px;left:0}.mejs__captions-position-hover{bottom:35px}.mejs__captions-text,.mejs__captions-text *{padding:0;background:hsla(0,0%,8%,.5);white-space:pre-wrap;box-shadow:5px 0 0 hsla(0,0%,8%,.5),-5px 0 0 hsla(0,0%,8%,.5)}.me_cannotplay a{font-weight:700}.mejs__container .me_cannotplay a{color:#fff}.me_cannotplay span{padding:15px;display:block} \ No newline at end of file diff --git a/lib/mejs/mediaelementplayer.min.js b/lib/mejs/mediaelementplayer.min.js index e96ae83b..9942ccf3 100644 --- a/lib/mejs/mediaelementplayer.min.js +++ b/lib/mejs/mediaelementplayer.min.js @@ -1,109 +1,35 @@ /*! - * MediaElementPlayer - * http://mediaelementjs.com/ + * MediaElement.js + * http://www.mediaelementjs.com/ * - * Creates a controller bar for HTML5 <video> add <audio> tags - * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper) + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) * - * Copyright 2010-2013, John Dyer (http://j.hn/) + * Copyright 2010-2017, John Dyer (http://j.hn/) * License: MIT * - */if(typeof jQuery!="undefined")mejs.$=jQuery;else if(typeof ender!="undefined")mejs.$=ender; -(function(f){mejs.MepDefaults={poster:"",showPosterWhenEnded:false,defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:30,defaultSeekBackwardInterval:function(a){return a.duration*0.05},defaultSeekForwardInterval:function(a){return a.duration*0.05},setDimensions:true,audioWidth:-1,audioHeight:-1,startVolume:0.8,loop:false,autoRewind:true,enableAutosize:true,alwaysShowHours:false,showTimecodeFrameCount:false,framesPerSecond:25,autosizeProgress:true, -alwaysShowControls:false,hideVideoControlsOnLoad:false,clickToPlayPause:true,iPadUseNativeControls:false,iPhoneUseNativeControls:false,AndroidUseNativeControls:false,features:["playpause","current","progress","duration","tracks","volume","fullscreen"],isVideo:true,enableKeyboard:true,pauseOtherPlayers:true,keyActions:[{keys:[32,179],action:function(a,b){b.paused||b.ended?a.play():a.pause()}},{keys:[38],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls(); -a.startControlsTimer()}b.setVolume(Math.min(b.volume+0.1,1))}},{keys:[40],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();a.startControlsTimer()}b.setVolume(Math.max(b.volume-0.1,0))}},{keys:[37,227],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){if(a.isVideo){a.showControls();a.startControlsTimer()}var c=Math.max(b.currentTime-a.options.defaultSeekBackwardInterval(b),0);b.setCurrentTime(c)}}},{keys:[39,228],action:function(a, -b){if(!isNaN(b.duration)&&b.duration>0){if(a.isVideo){a.showControls();a.startControlsTimer()}var c=Math.min(b.currentTime+a.options.defaultSeekForwardInterval(b),b.duration);b.setCurrentTime(c)}}},{keys:[70],action:function(a){if(typeof a.enterFullScreen!="undefined")a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{keys:[77],action:function(a){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();a.startControlsTimer()}a.media.muted?a.setMuted(false): -a.setMuted(true)}}]};mejs.mepIndex=0;mejs.players={};mejs.MediaElementPlayer=function(a,b){if(!(this instanceof mejs.MediaElementPlayer))return new mejs.MediaElementPlayer(a,b);this.$media=this.$node=f(a);this.node=this.media=this.$media[0];if(typeof this.node.player!="undefined")return this.node.player;else this.node.player=this;if(typeof b=="undefined")b=this.$node.data("mejsoptions");this.options=f.extend({},mejs.MepDefaults,b);this.id="mep_"+mejs.mepIndex++;mejs.players[this.id]=this;this.init(); -return this};mejs.MediaElementPlayer.prototype={hasFocus:false,controlsAreVisible:true,init:function(){var a=this,b=mejs.MediaFeatures,c=f.extend(true,{},a.options,{success:function(d,g){a.meReady(d,g)},error:function(d){a.handleError(d)}}),e=a.media.tagName.toLowerCase();a.isDynamic=e!=="audio"&&e!=="video";a.isVideo=a.isDynamic?a.options.isVideo:e!=="audio"&&a.options.isVideo;if(b.isiPad&&a.options.iPadUseNativeControls||b.isiPhone&&a.options.iPhoneUseNativeControls){a.$media.attr("controls","controls"); -b.isiPad&&a.media.getAttribute("autoplay")!==null&&a.play()}else if(!(b.isAndroid&&a.options.AndroidUseNativeControls)){a.$media.removeAttr("controls");a.container=f('<div id="'+a.id+'" class="mejs-container '+(mejs.MediaFeatures.svg?"svg":"no-svg")+'"><div class="mejs-inner"><div class="mejs-mediaelement"></div><div class="mejs-layers"></div><div class="mejs-controls"></div><div class="mejs-clear"></div></div></div>').addClass(a.$media[0].className).insertBefore(a.$media);a.container.addClass((b.isAndroid? -"mejs-android ":"")+(b.isiOS?"mejs-ios ":"")+(b.isiPad?"mejs-ipad ":"")+(b.isiPhone?"mejs-iphone ":"")+(a.isVideo?"mejs-video ":"mejs-audio "));if(b.isiOS){b=a.$media.clone();a.container.find(".mejs-mediaelement").append(b);a.$media.remove();a.$node=a.$media=b;a.node=a.media=b[0]}else a.container.find(".mejs-mediaelement").append(a.$media);a.controls=a.container.find(".mejs-controls");a.layers=a.container.find(".mejs-layers");b=a.isVideo?"video":"audio";e=b.substring(0,1).toUpperCase()+b.substring(1); -a.width=a.options[b+"Width"]>0||a.options[b+"Width"].toString().indexOf("%")>-1?a.options[b+"Width"]:a.media.style.width!==""&&a.media.style.width!==null?a.media.style.width:a.media.getAttribute("width")!==null?a.$media.attr("width"):a.options["default"+e+"Width"];a.height=a.options[b+"Height"]>0||a.options[b+"Height"].toString().indexOf("%")>-1?a.options[b+"Height"]:a.media.style.height!==""&&a.media.style.height!==null?a.media.style.height:a.$media[0].getAttribute("height")!==null?a.$media.attr("height"): -a.options["default"+e+"Height"];a.setPlayerSize(a.width,a.height);c.pluginWidth=a.width;c.pluginHeight=a.height}mejs.MediaElement(a.$media[0],c);typeof a.container!="undefined"&&a.controlsAreVisible&&a.container.trigger("controlsshown")},showControls:function(a){var b=this;a=typeof a=="undefined"||a;if(!b.controlsAreVisible){if(a){b.controls.css("visibility","visible").stop(true,true).fadeIn(200,function(){b.controlsAreVisible=true;b.container.trigger("controlsshown")});b.container.find(".mejs-control").css("visibility", -"visible").stop(true,true).fadeIn(200,function(){b.controlsAreVisible=true})}else{b.controls.css("visibility","visible").css("display","block");b.container.find(".mejs-control").css("visibility","visible").css("display","block");b.controlsAreVisible=true;b.container.trigger("controlsshown")}b.setControlsSize()}},hideControls:function(a){var b=this;a=typeof a=="undefined"||a;if(!(!b.controlsAreVisible||b.options.alwaysShowControls))if(a){b.controls.stop(true,true).fadeOut(200,function(){f(this).css("visibility", -"hidden").css("display","block");b.controlsAreVisible=false;b.container.trigger("controlshidden")});b.container.find(".mejs-control").stop(true,true).fadeOut(200,function(){f(this).css("visibility","hidden").css("display","block")})}else{b.controls.css("visibility","hidden").css("display","block");b.container.find(".mejs-control").css("visibility","hidden").css("display","block");b.controlsAreVisible=false;b.container.trigger("controlshidden")}},controlsTimer:null,startControlsTimer:function(a){var b= -this;a=typeof a!="undefined"?a:1500;b.killControlsTimer("start");b.controlsTimer=setTimeout(function(){b.hideControls();b.killControlsTimer("hide")},a)},killControlsTimer:function(){if(this.controlsTimer!==null){clearTimeout(this.controlsTimer);delete this.controlsTimer;this.controlsTimer=null}},controlsEnabled:true,disableControls:function(){this.killControlsTimer();this.hideControls(false);this.controlsEnabled=false},enableControls:function(){this.showControls(false);this.controlsEnabled=true}, -meReady:function(a,b){var c=this,e=mejs.MediaFeatures,d=b.getAttribute("autoplay");d=!(typeof d=="undefined"||d===null||d==="false");var g;if(!c.created){c.created=true;c.media=a;c.domNode=b;if(!(e.isAndroid&&c.options.AndroidUseNativeControls)&&!(e.isiPad&&c.options.iPadUseNativeControls)&&!(e.isiPhone&&c.options.iPhoneUseNativeControls)){c.buildposter(c,c.controls,c.layers,c.media);c.buildkeyboard(c,c.controls,c.layers,c.media);c.buildoverlays(c,c.controls,c.layers,c.media);c.findTracks();for(g in c.options.features){e= -c.options.features[g];if(c["build"+e])try{c["build"+e](c,c.controls,c.layers,c.media)}catch(k){}}c.container.trigger("controlsready");c.setPlayerSize(c.width,c.height);c.setControlsSize();if(c.isVideo){if(mejs.MediaFeatures.hasTouch)c.$media.bind("touchstart",function(){if(c.controlsAreVisible)c.hideControls(false);else c.controlsEnabled&&c.showControls(false)});else{c.clickToPlayPauseCallback=function(){if(c.options.clickToPlayPause)c.media.paused?c.play():c.pause()};c.media.addEventListener("click", -c.clickToPlayPauseCallback,false);c.container.bind("mouseenter mouseover",function(){if(c.controlsEnabled)if(!c.options.alwaysShowControls){c.killControlsTimer("enter");c.showControls();c.startControlsTimer(2500)}}).bind("mousemove",function(){if(c.controlsEnabled){c.controlsAreVisible||c.showControls();c.options.alwaysShowControls||c.startControlsTimer(2500)}}).bind("mouseleave",function(){c.controlsEnabled&&!c.media.paused&&!c.options.alwaysShowControls&&c.startControlsTimer(1E3)})}c.options.hideVideoControlsOnLoad&& -c.hideControls(false);d&&!c.options.alwaysShowControls&&c.hideControls();c.options.enableAutosize&&c.media.addEventListener("loadedmetadata",function(j){if(c.options.videoHeight<=0&&c.domNode.getAttribute("height")===null&&!isNaN(j.target.videoHeight)){c.setPlayerSize(j.target.videoWidth,j.target.videoHeight);c.setControlsSize();c.media.setVideoSize(j.target.videoWidth,j.target.videoHeight)}},false)}a.addEventListener("play",function(){for(var j in mejs.players){var m=mejs.players[j];m.id!=c.id&& -c.options.pauseOtherPlayers&&!m.paused&&!m.ended&&m.pause();m.hasFocus=false}c.hasFocus=true},false);c.media.addEventListener("ended",function(){if(c.options.autoRewind)try{c.media.setCurrentTime(0)}catch(j){}c.media.pause();c.setProgressRail&&c.setProgressRail();c.setCurrentRail&&c.setCurrentRail();if(c.options.loop)c.play();else!c.options.alwaysShowControls&&c.controlsEnabled&&c.showControls()},false);c.media.addEventListener("loadedmetadata",function(){c.updateDuration&&c.updateDuration();c.updateCurrent&& -c.updateCurrent();if(!c.isFullScreen){c.setPlayerSize(c.width,c.height);c.setControlsSize()}},false);setTimeout(function(){c.setPlayerSize(c.width,c.height);c.setControlsSize()},50);c.globalBind("resize",function(){c.isFullScreen||mejs.MediaFeatures.hasTrueNativeFullScreen&&document.webkitIsFullScreen||c.setPlayerSize(c.width,c.height);c.setControlsSize()});c.media.pluginType=="youtube"&&c.options.autoplay&&c.container.find(".mejs-overlay-play").hide()}d&&a.pluginType=="native"&&c.play();if(c.options.success)typeof c.options.success== -"string"?window[c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c)}},handleError:function(a){this.controls.hide();this.options.error&&this.options.error(a)},setPlayerSize:function(a,b){if(!this.options.setDimensions)return false;if(typeof a!="undefined")this.width=a;if(typeof b!="undefined")this.height=b;if(this.height.toString().indexOf("%")>0||this.$node.css("max-width")==="100%"||this.$node[0].currentStyle&&this.$node[0].currentStyle.maxWidth==="100%"){var c=this.isVideo? -this.media.videoWidth&&this.media.videoWidth>0?this.media.videoWidth:this.media.getAttribute("width")!==null?this.media.getAttribute("width"):this.options.defaultVideoWidth:this.options.defaultAudioWidth,e=this.isVideo?this.media.videoHeight&&this.media.videoHeight>0?this.media.videoHeight:this.media.getAttribute("height")!==null?this.media.getAttribute("height"):this.options.defaultVideoHeight:this.options.defaultAudioHeight,d=this.container.parent().closest(":visible").width(),g=this.container.parent().closest(":visible").height(); -c=this.isVideo||!this.options.autosizeProgress?parseInt(d*e/c,10):e;if(isNaN(c)||g!=0&&c>g)c=g;if(this.container.parent()[0].tagName.toLowerCase()==="body"){d=f(window).width();c=f(window).height()}if(c!=0&&d!=0){this.container.width(d).height(c);this.$media.add(this.container.find(".mejs-shim")).width("100%").height("100%");this.isVideo&&this.media.setVideoSize&&this.media.setVideoSize(d,c);this.layers.children(".mejs-layer").width("100%").height("100%")}}else{this.container.width(this.width).height(this.height); -this.layers.children(".mejs-layer").width(this.width).height(this.height)}d=this.layers.find(".mejs-overlay-play");g=d.find(".mejs-overlay-button");d.height(this.container.height()-this.controls.height());g.css("margin-top","-"+(g.height()/2-this.controls.height()/2).toString()+"px")},setControlsSize:function(){var a=0,b=0,c=this.controls.find(".mejs-time-rail"),e=this.controls.find(".mejs-time-total");this.controls.find(".mejs-time-current");this.controls.find(".mejs-time-loaded");var d=c.siblings(), -g=d.last(),k=null;if(!(!this.container.is(":visible")||!c.length||!c.is(":visible"))){if(this.options&&!this.options.autosizeProgress)b=parseInt(c.css("width"));if(b===0||!b){d.each(function(){var j=f(this);if(j.css("position")!="absolute"&&j.is(":visible"))a+=f(this).outerWidth(true)});b=this.controls.width()-a-(c.outerWidth(true)-c.width())}do{c.width(b);e.width(b-(e.outerWidth(true)-e.width()));if(g.css("position")!="absolute"){k=g.position();b--}}while(k!=null&&k.top>0&&b>0);this.setProgressRail&& -this.setProgressRail();this.setCurrentRail&&this.setCurrentRail()}},buildposter:function(a,b,c,e){var d=f('<div class="mejs-poster mejs-layer"></div>').appendTo(c);b=a.$media.attr("poster");if(a.options.poster!=="")b=a.options.poster;b!==""&&b!=null?this.setPoster(b):d.hide();e.addEventListener("play",function(){d.hide()},false);a.options.showPosterWhenEnded&&a.options.autoRewind&&e.addEventListener("ended",function(){d.show()},false)},setPoster:function(a){var b=this.container.find(".mejs-poster"), -c=b.find("img");if(c.length==0)c=f('<img width="100%" height="100%" />').appendTo(b);c.attr("src",a);b.css({"background-image":"url("+a+")"})},buildoverlays:function(a,b,c,e){var d=this;if(a.isVideo){var g=f('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-loading"><span></span></div></div>').hide().appendTo(c),k=f('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-error"></div></div>').hide().appendTo(c),j=f('<div class="mejs-overlay mejs-layer mejs-overlay-play"><div class="mejs-overlay-button"></div></div>').appendTo(c).bind("click", -function(){d.options.clickToPlayPause&&e.paused&&e.play()});e.addEventListener("play",function(){j.hide();g.hide();b.find(".mejs-time-buffering").hide();k.hide()},false);e.addEventListener("playing",function(){j.hide();g.hide();b.find(".mejs-time-buffering").hide();k.hide()},false);e.addEventListener("seeking",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("seeked",function(){g.hide();b.find(".mejs-time-buffering").hide()},false);e.addEventListener("pause",function(){mejs.MediaFeatures.isiPhone|| -j.show()},false);e.addEventListener("waiting",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("loadeddata",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("canplay",function(){g.hide();b.find(".mejs-time-buffering").hide()},false);e.addEventListener("error",function(){g.hide();b.find(".mejs-time-buffering").hide();k.show();k.find("mejs-overlay-error").html("Error loading this resource")},false);e.addEventListener("keydown", -function(m){d.onkeydown(a,e,m)},false)}},buildkeyboard:function(a,b,c,e){var d=this;d.globalBind("keydown",function(g){return d.onkeydown(a,e,g)});d.globalBind("click",function(g){a.hasFocus=f(g.target).closest(".mejs-container").length!=0})},onkeydown:function(a,b,c){if(a.hasFocus&&a.options.enableKeyboard)for(var e=0,d=a.options.keyActions.length;e<d;e++)for(var g=a.options.keyActions[e],k=0,j=g.keys.length;k<j;k++)if(c.keyCode==g.keys[k]){typeof c.preventDefault=="function"&&c.preventDefault(); -g.action(a,b,c.keyCode);return false}return true},findTracks:function(){var a=this,b=a.$media.find("track");a.tracks=[];b.each(function(c,e){e=f(e);a.tracks.push({srclang:e.attr("srclang")?e.attr("srclang").toLowerCase():"",src:e.attr("src"),kind:e.attr("kind"),label:e.attr("label")||"",entries:[],isLoaded:false})})},changeSkin:function(a){this.container[0].className="mejs-container "+a;this.setPlayerSize(this.width,this.height);this.setControlsSize()},play:function(){this.load();this.media.play()}, -pause:function(){try{this.media.pause()}catch(a){}},load:function(){this.isLoaded||this.media.load();this.isLoaded=true},setMuted:function(a){this.media.setMuted(a)},setCurrentTime:function(a){this.media.setCurrentTime(a)},getCurrentTime:function(){return this.media.currentTime},setVolume:function(a){this.media.setVolume(a)},getVolume:function(){return this.media.volume},setSrc:function(a){this.media.setSrc(a)},remove:function(){var a,b;for(a in this.options.features){b=this.options.features[a];if(this["clean"+ -b])try{this["clean"+b](this)}catch(c){}}if(this.isDynamic)this.$node.insertBefore(this.container);else{this.$media.prop("controls",true);this.$node.clone().insertBefore(this.container).show();this.$node.remove()}this.media.pluginType!=="native"&&this.media.remove();delete mejs.players[this.id];typeof this.container=="object"&&this.container.remove();this.globalUnbind();delete this.node.player}};(function(){function a(c,e){var d={d:[],w:[]};f.each((c||"").split(" "),function(g,k){var j=k+"."+e;if(j.indexOf(".")=== -0){d.d.push(j);d.w.push(j)}else d[b.test(k)?"w":"d"].push(j)});d.d=d.d.join(" ");d.w=d.w.join(" ");return d}var b=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;mejs.MediaElementPlayer.prototype.globalBind=function(c,e,d){c=a(c,this.id);c.d&&f(document).bind(c.d,e,d);c.w&&f(window).bind(c.w,e,d)};mejs.MediaElementPlayer.prototype.globalUnbind=function(c,e){c=a(c,this.id);c.d&&f(document).unbind(c.d,e);c.w&&f(window).unbind(c.w,e)}})(); -if(typeof f!="undefined"){f.fn.mediaelementplayer=function(a){a===false?this.each(function(){var b=f(this).data("mediaelementplayer");b&&b.remove();f(this).removeData("mediaelementplayer")}):this.each(function(){f(this).data("mediaelementplayer",new mejs.MediaElementPlayer(this,a))});return this};f(document).ready(function(){f(".mejs-player").mediaelementplayer()})}window.MediaElementPlayer=mejs.MediaElementPlayer})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{playpauseText:mejs.i18n.t("Play/Pause")});f.extend(MediaElementPlayer.prototype,{buildplaypause:function(a,b,c,e){var d=f('<div class="mejs-button mejs-playpause-button mejs-play" ><button type="button" aria-controls="'+this.id+'" title="'+this.options.playpauseText+'" aria-label="'+this.options.playpauseText+'"></button></div>').appendTo(b).click(function(g){g.preventDefault();e.paused?e.play():e.pause();return false});e.addEventListener("play",function(){d.removeClass("mejs-play").addClass("mejs-pause")}, -false);e.addEventListener("playing",function(){d.removeClass("mejs-play").addClass("mejs-pause")},false);e.addEventListener("pause",function(){d.removeClass("mejs-pause").addClass("mejs-play")},false);e.addEventListener("paused",function(){d.removeClass("mejs-pause").addClass("mejs-play")},false)}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{stopText:"Stop"});f.extend(MediaElementPlayer.prototype,{buildstop:function(a,b,c,e){f('<div class="mejs-button mejs-stop-button mejs-stop"><button type="button" aria-controls="'+this.id+'" title="'+this.options.stopText+'" aria-label="'+this.options.stopText+'"></button></div>').appendTo(b).click(function(){e.paused||e.pause();if(e.currentTime>0){e.setCurrentTime(0);e.pause();b.find(".mejs-time-current").width("0px");b.find(".mejs-time-handle").css("left", -"0px");b.find(".mejs-time-float-current").html(mejs.Utility.secondsToTimeCode(0));b.find(".mejs-currenttime").html(mejs.Utility.secondsToTimeCode(0));c.find(".mejs-poster").show()}})}})})(mejs.$); -(function(f){f.extend(MediaElementPlayer.prototype,{buildprogress:function(a,b,c,e){f('<div class="mejs-time-rail"><span class="mejs-time-total"><span class="mejs-time-buffering"></span><span class="mejs-time-loaded"></span><span class="mejs-time-current"></span><span class="mejs-time-handle"></span><span class="mejs-time-float"><span class="mejs-time-float-current">00:00</span><span class="mejs-time-float-corner"></span></span></span></div>').appendTo(b);b.find(".mejs-time-buffering").hide();var d= -this,g=b.find(".mejs-time-total");c=b.find(".mejs-time-loaded");var k=b.find(".mejs-time-current"),j=b.find(".mejs-time-handle"),m=b.find(".mejs-time-float"),q=b.find(".mejs-time-float-current"),p=function(h){h=h.originalEvent.changedTouches?h.originalEvent.changedTouches[0].pageX:h.pageX;var l=g.offset(),r=g.outerWidth(true),n=0,o=n=0;if(e.duration){if(h<l.left)h=l.left;else if(h>r+l.left)h=r+l.left;o=h-l.left;n=o/r;n=n<=0.02?0:n*e.duration;t&&n!==e.currentTime&&e.setCurrentTime(n);if(!mejs.MediaFeatures.hasTouch){m.css("left", -o);q.html(mejs.Utility.secondsToTimeCode(n));m.show()}}},t=false;g.bind("mousedown touchstart",function(h){if(h.which===1||h.which===0){t=true;p(h);d.globalBind("mousemove.dur touchmove.dur",function(l){p(l)});d.globalBind("mouseup.dur touchend.dur",function(){t=false;m.hide();d.globalUnbind(".dur")});return false}}).bind("mouseenter",function(){d.globalBind("mousemove.dur",function(h){p(h)});mejs.MediaFeatures.hasTouch||m.show()}).bind("mouseleave",function(){if(!t){d.globalUnbind(".dur");m.hide()}}); -e.addEventListener("progress",function(h){a.setProgressRail(h);a.setCurrentRail(h)},false);e.addEventListener("timeupdate",function(h){a.setProgressRail(h);a.setCurrentRail(h)},false);d.loaded=c;d.total=g;d.current=k;d.handle=j},setProgressRail:function(a){var b=a!=undefined?a.target:this.media,c=null;if(b&&b.buffered&&b.buffered.length>0&&b.buffered.end&&b.duration)c=b.buffered.end(0)/b.duration;else if(b&&b.bytesTotal!=undefined&&b.bytesTotal>0&&b.bufferedBytes!=undefined)c=b.bufferedBytes/b.bytesTotal; -else if(a&&a.lengthComputable&&a.total!=0)c=a.loaded/a.total;if(c!==null){c=Math.min(1,Math.max(0,c));this.loaded&&this.total&&this.loaded.width(this.total.width()*c)}},setCurrentRail:function(){if(this.media.currentTime!=undefined&&this.media.duration)if(this.total&&this.handle){var a=Math.round(this.total.width()*this.media.currentTime/this.media.duration),b=a-Math.round(this.handle.outerWidth(true)/2);this.current.width(a);this.handle.css("left",b)}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{duration:-1,timeAndDurationSeparator:"<span> | </span>"});f.extend(MediaElementPlayer.prototype,{buildcurrent:function(a,b,c,e){f('<div class="mejs-time"><span class="mejs-currenttime">'+(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00")+"</span></div>").appendTo(b);this.currenttime=this.controls.find(".mejs-currenttime");e.addEventListener("timeupdate",function(){a.updateCurrent()},false)},buildduration:function(a,b, -c,e){if(b.children().last().find(".mejs-currenttime").length>0)f(this.options.timeAndDurationSeparator+'<span class="mejs-duration">'+(this.options.duration>0?mejs.Utility.secondsToTimeCode(this.options.duration,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25):(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00"))+"</span>").appendTo(b.find(".mejs-time"));else{b.find(".mejs-currenttime").parent().addClass("mejs-currenttime-container"); -f('<div class="mejs-time mejs-duration-container"><span class="mejs-duration">'+(this.options.duration>0?mejs.Utility.secondsToTimeCode(this.options.duration,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25):(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00"))+"</span></div>").appendTo(b)}this.durationD=this.controls.find(".mejs-duration");e.addEventListener("timeupdate",function(){a.updateDuration()}, -false)},updateCurrent:function(){if(this.currenttime)this.currenttime.html(mejs.Utility.secondsToTimeCode(this.media.currentTime,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25))},updateDuration:function(){this.container.toggleClass("mejs-long-video",this.media.duration>3600);if(this.durationD&&(this.options.duration>0||this.media.duration))this.durationD.html(mejs.Utility.secondsToTimeCode(this.options.duration>0?this.options.duration: -this.media.duration,this.options.alwaysShowHours,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25))}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{muteText:mejs.i18n.t("Mute Toggle"),hideVolumeOnTouchDevices:true,audioVolume:"horizontal",videoVolume:"vertical"});f.extend(MediaElementPlayer.prototype,{buildvolume:function(a,b,c,e){if(!((mejs.MediaFeatures.isAndroid||mejs.MediaFeatures.isiOS)&&this.options.hideVolumeOnTouchDevices)){var d=this,g=d.isVideo?d.options.videoVolume:d.options.audioVolume,k=g=="horizontal"?f('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+ -d.id+'" title="'+d.options.muteText+'" aria-label="'+d.options.muteText+'"></button></div><div class="mejs-horizontal-volume-slider"><div class="mejs-horizontal-volume-total"></div><div class="mejs-horizontal-volume-current"></div><div class="mejs-horizontal-volume-handle"></div></div>').appendTo(b):f('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+d.id+'" title="'+d.options.muteText+'" aria-label="'+d.options.muteText+'"></button><div class="mejs-volume-slider"><div class="mejs-volume-total"></div><div class="mejs-volume-current"></div><div class="mejs-volume-handle"></div></div></div>').appendTo(b), -j=d.container.find(".mejs-volume-slider, .mejs-horizontal-volume-slider"),m=d.container.find(".mejs-volume-total, .mejs-horizontal-volume-total"),q=d.container.find(".mejs-volume-current, .mejs-horizontal-volume-current"),p=d.container.find(".mejs-volume-handle, .mejs-horizontal-volume-handle"),t=function(n,o){if(!j.is(":visible")&&typeof o=="undefined"){j.show();t(n,true);j.hide()}else{n=Math.max(0,n);n=Math.min(n,1);n==0?k.removeClass("mejs-mute").addClass("mejs-unmute"):k.removeClass("mejs-unmute").addClass("mejs-mute"); -if(g=="vertical"){var s=m.height(),u=m.position(),v=s-s*n;p.css("top",Math.round(u.top+v-p.height()/2));q.height(s-v);q.css("top",u.top+v)}else{s=m.width();u=m.position();s=s*n;p.css("left",Math.round(u.left+s-p.width()/2));q.width(Math.round(s))}}},h=function(n){var o=null,s=m.offset();if(g=="vertical"){o=m.height();parseInt(m.css("top").replace(/px/,""),10);o=(o-(n.pageY-s.top))/o;if(s.top==0||s.left==0)return}else{o=m.width();o=(n.pageX-s.left)/o}o=Math.max(0,o);o=Math.min(o,1);t(o);o==0?e.setMuted(true): -e.setMuted(false);e.setVolume(o)},l=false,r=false;k.hover(function(){j.show();r=true},function(){r=false;!l&&g=="vertical"&&j.hide()});j.bind("mouseover",function(){r=true}).bind("mousedown",function(n){h(n);d.globalBind("mousemove.vol",function(o){h(o)});d.globalBind("mouseup.vol",function(){l=false;d.globalUnbind(".vol");!r&&g=="vertical"&&j.hide()});l=true;return false});k.find("button").click(function(){e.setMuted(!e.muted)});e.addEventListener("volumechange",function(){if(!l)if(e.muted){t(0); -k.removeClass("mejs-mute").addClass("mejs-unmute")}else{t(e.volume);k.removeClass("mejs-unmute").addClass("mejs-mute")}},false);if(d.container.is(":visible")){t(a.options.startVolume);a.options.startVolume===0&&e.setMuted(true);e.pluginType==="native"&&e.setVolume(a.options.startVolume)}}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{usePluginFullScreen:true,newWindowCallback:function(){return""},fullscreenText:mejs.i18n.t("Fullscreen")});f.extend(MediaElementPlayer.prototype,{isFullScreen:false,isNativeFullScreen:false,isInIframe:false,buildfullscreen:function(a,b,c,e){if(a.isVideo){a.isInIframe=window.location!=window.parent.location;mejs.MediaFeatures.hasTrueNativeFullScreen&&a.globalBind(mejs.MediaFeatures.fullScreenEventName,function(){if(a.isFullScreen)if(mejs.MediaFeatures.isFullScreen()){a.isNativeFullScreen= -true;a.setControlsSize()}else{a.isNativeFullScreen=false;a.exitFullScreen()}});var d=this,g=f('<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="'+d.id+'" title="'+d.options.fullscreenText+'" aria-label="'+d.options.fullscreenText+'"></button></div>').appendTo(b);if(d.media.pluginType==="native"||!d.options.usePluginFullScreen&&!mejs.MediaFeatures.isFirefox)g.click(function(){mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||a.isFullScreen? -a.exitFullScreen():a.enterFullScreen()});else{var k=null;if(function(){var h=document.createElement("x"),l=document.documentElement,r=window.getComputedStyle;if(!("pointerEvents"in h.style))return false;h.style.pointerEvents="auto";h.style.pointerEvents="x";l.appendChild(h);r=r&&r(h,"").pointerEvents==="auto";l.removeChild(h);return!!r}()&&!mejs.MediaFeatures.isOpera){var j=false,m=function(){if(j){for(var h in q)q[h].hide();g.css("pointer-events","");d.controls.css("pointer-events","");d.media.removeEventListener("click", -d.clickToPlayPauseCallback);j=false}},q={};b=["top","left","right","bottom"];var p,t=function(){var h=g.offset().left-d.container.offset().left,l=g.offset().top-d.container.offset().top,r=g.outerWidth(true),n=g.outerHeight(true),o=d.container.width(),s=d.container.height();for(p in q)q[p].css({position:"absolute",top:0,left:0});q.top.width(o).height(l);q.left.width(h).height(n).css({top:l});q.right.width(o-h-r).height(n).css({top:l,left:h+r});q.bottom.width(o).height(s-n-l).css({top:l+n})};d.globalBind("resize", -function(){t()});p=0;for(c=b.length;p<c;p++)q[b[p]]=f('<div class="mejs-fullscreen-hover" />').appendTo(d.container).mouseover(m).hide();g.on("mouseover",function(){if(!d.isFullScreen){var h=g.offset(),l=a.container.offset();e.positionFullscreenButton(h.left-l.left,h.top-l.top,false);g.css("pointer-events","none");d.controls.css("pointer-events","none");d.media.addEventListener("click",d.clickToPlayPauseCallback);for(p in q)q[p].show();t();j=true}});e.addEventListener("fullscreenchange",function(){d.isFullScreen= -!d.isFullScreen;d.isFullScreen?d.media.removeEventListener("click",d.clickToPlayPauseCallback):d.media.addEventListener("click",d.clickToPlayPauseCallback);m()});d.globalBind("mousemove",function(h){if(j){var l=g.offset();if(h.pageY<l.top||h.pageY>l.top+g.outerHeight(true)||h.pageX<l.left||h.pageX>l.left+g.outerWidth(true)){g.css("pointer-events","");d.controls.css("pointer-events","");j=false}}})}else g.on("mouseover",function(){if(k!==null){clearTimeout(k);delete k}var h=g.offset(),l=a.container.offset(); -e.positionFullscreenButton(h.left-l.left,h.top-l.top,true)}).on("mouseout",function(){if(k!==null){clearTimeout(k);delete k}k=setTimeout(function(){e.hideFullscreenButton()},1500)})}a.fullscreenBtn=g;d.globalBind("keydown",function(h){if((mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||d.isFullScreen)&&h.keyCode==27)a.exitFullScreen()})}},cleanfullscreen:function(a){a.exitFullScreen()},containerSizeTimeout:null,enterFullScreen:function(){var a=this;if(!(a.media.pluginType!== -"native"&&(mejs.MediaFeatures.isFirefox||a.options.usePluginFullScreen))){f(document.documentElement).addClass("mejs-fullscreen");normalHeight=a.container.height();normalWidth=a.container.width();if(a.media.pluginType==="native")if(mejs.MediaFeatures.hasTrueNativeFullScreen){mejs.MediaFeatures.requestFullScreen(a.container[0]);a.isInIframe&&setTimeout(function c(){if(a.isNativeFullScreen){var e=(window.devicePixelRatio||1)*f(window).width(),d=screen.width;Math.abs(d-e)>d*0.0020?a.exitFullScreen(): -setTimeout(c,500)}},500)}else if(mejs.MediaFeatures.hasSemiNativeFullScreen){a.media.webkitEnterFullscreen();return}if(a.isInIframe){var b=a.options.newWindowCallback(this);if(b!=="")if(mejs.MediaFeatures.hasTrueNativeFullScreen)setTimeout(function(){if(!a.isNativeFullScreen){a.pause();window.open(b,a.id,"top=0,left=0,width="+screen.availWidth+",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no")}},250);else{a.pause();window.open(b,a.id,"top=0,left=0,width="+screen.availWidth+ -",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no");return}}a.container.addClass("mejs-container-fullscreen").width("100%").height("100%");a.containerSizeTimeout=setTimeout(function(){a.container.css({width:"100%",height:"100%"});a.setControlsSize()},500);if(a.media.pluginType==="native")a.$media.width("100%").height("100%");else{a.container.find(".mejs-shim").width("100%").height("100%");a.media.setVideoSize(f(window).width(),f(window).height())}a.layers.children("div").width("100%").height("100%"); -a.fullscreenBtn&&a.fullscreenBtn.removeClass("mejs-fullscreen").addClass("mejs-unfullscreen");a.setControlsSize();a.isFullScreen=true;a.container.find(".mejs-captions-text").css("font-size",screen.width/a.width*1*100+"%");a.container.find(".mejs-captions-position").css("bottom","45px")}},exitFullScreen:function(){clearTimeout(this.containerSizeTimeout);if(this.media.pluginType!=="native"&&mejs.MediaFeatures.isFirefox)this.media.setFullscreen(false);else{if(mejs.MediaFeatures.hasTrueNativeFullScreen&& -(mejs.MediaFeatures.isFullScreen()||this.isFullScreen))mejs.MediaFeatures.cancelFullScreen();f(document.documentElement).removeClass("mejs-fullscreen");this.container.removeClass("mejs-container-fullscreen").width(normalWidth).height(normalHeight);if(this.media.pluginType==="native")this.$media.width(normalWidth).height(normalHeight);else{this.container.find(".mejs-shim").width(normalWidth).height(normalHeight);this.media.setVideoSize(normalWidth,normalHeight)}this.layers.children("div").width(normalWidth).height(normalHeight); -this.fullscreenBtn.removeClass("mejs-unfullscreen").addClass("mejs-fullscreen");this.setControlsSize();this.isFullScreen=false;this.container.find(".mejs-captions-text").css("font-size","");this.container.find(".mejs-captions-position").css("bottom","")}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{speeds:["1.50","1.25","1.00","0.75"],defaultSpeed:"1.00"});f.extend(MediaElementPlayer.prototype,{buildspeed:function(a,b,c,e){if(this.media.pluginType=="native"){c='<div class="mejs-button mejs-speed-button"><button type="button">'+this.options.defaultSpeed+'x</button><div class="mejs-speed-selector"><ul>';var d;f.inArray(this.options.defaultSpeed,this.options.speeds)===-1&&this.options.speeds.push(this.options.defaultSpeed);this.options.speeds.sort(function(g, -k){return parseFloat(k)-parseFloat(g)});for(d=0;d<this.options.speeds.length;d++){c+='<li><input type="radio" name="speed" value="'+this.options.speeds[d]+'" id="'+this.options.speeds[d]+'" ';if(this.options.speeds[d]==this.options.defaultSpeed){c+="checked=true ";c+='/><label for="'+this.options.speeds[d]+'" class="mejs-speed-selected">'+this.options.speeds[d]+"x</label></li>"}else c+='/><label for="'+this.options.speeds[d]+'">'+this.options.speeds[d]+"x</label></li>"}c+="</ul></div></div>";a.speedButton= -f(c).appendTo(b);a.playbackspeed=this.options.defaultSpeed;a.speedButton.on("click","input[type=radio]",function(){a.playbackspeed=f(this).attr("value");e.playbackRate=parseFloat(a.playbackspeed);a.speedButton.find("button").text(a.playbackspeed+"x");a.speedButton.find(".mejs-speed-selected").removeClass("mejs-speed-selected");a.speedButton.find("input[type=radio]:checked").next().addClass("mejs-speed-selected")});b=a.speedButton.find(".mejs-speed-selector");b.height(this.speedButton.find(".mejs-speed-selector ul").outerHeight(true)+ -a.speedButton.find(".mejs-speed-translations").outerHeight(true));b.css("top",-1*b.height()+"px")}}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{startLanguage:"",tracksText:mejs.i18n.t("Captions/Subtitles"),hideCaptionsButtonWhenEmpty:true,toggleCaptionsButtonWhenOnlyOne:false,slidesSelector:""});f.extend(MediaElementPlayer.prototype,{hasChapters:false,buildtracks:function(a,b,c,e){if(a.tracks.length!==0){var d;if(this.domNode.textTracks)for(d=this.domNode.textTracks.length-1;d>=0;d--)this.domNode.textTracks[d].mode="hidden";a.chapters=f('<div class="mejs-chapters mejs-layer"></div>').prependTo(c).hide(); -a.captions=f('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>').prependTo(c).hide();a.captionsText=a.captions.find(".mejs-captions-text");a.captionsButton=f('<div class="mejs-button mejs-captions-button"><button type="button" aria-controls="'+this.id+'" title="'+this.options.tracksText+'" aria-label="'+this.options.tracksText+'"></button><div class="mejs-captions-selector"><ul><li><input type="radio" name="'+ -a.id+'_captions" id="'+a.id+'_captions_none" value="none" checked="checked" /><label for="'+a.id+'_captions_none">'+mejs.i18n.t("None")+"</label></li></ul></div></div>").appendTo(b);for(d=b=0;d<a.tracks.length;d++)a.tracks[d].kind=="subtitles"&&b++;if(this.options.toggleCaptionsButtonWhenOnlyOne&&b==1)a.captionsButton.on("click",function(){lang=a.selectedTrack===null?a.tracks[0].srclang:"none";a.setTrack(lang)});else{a.captionsButton.on("mouseenter focusin",function(){f(this).find(".mejs-captions-selector").css("visibility", -"visible")}).on("click","input[type=radio]",function(){lang=this.value;a.setTrack(lang)});a.captionsButton.on("mouseleave focusout",function(){f(this).find(".mejs-captions-selector").css("visibility","hidden")})}a.options.alwaysShowControls?a.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover"):a.container.bind("controlsshown",function(){a.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover")}).bind("controlshidden",function(){e.paused||a.container.find(".mejs-captions-position").removeClass("mejs-captions-position-hover")}); -a.trackToLoad=-1;a.selectedTrack=null;a.isLoadingTrack=false;for(d=0;d<a.tracks.length;d++)a.tracks[d].kind=="subtitles"&&a.addTrackButton(a.tracks[d].srclang,a.tracks[d].label);a.loadNextTrack();e.addEventListener("timeupdate",function(){a.displayCaptions()},false);if(a.options.slidesSelector!==""){a.slidesContainer=f(a.options.slidesSelector);e.addEventListener("timeupdate",function(){a.displaySlides()},false)}e.addEventListener("loadedmetadata",function(){a.displayChapters()},false);a.container.hover(function(){if(a.hasChapters){a.chapters.css("visibility", -"visible");a.chapters.fadeIn(200).height(a.chapters.find(".mejs-chapter").outerHeight())}},function(){a.hasChapters&&!e.paused&&a.chapters.fadeOut(200,function(){f(this).css("visibility","hidden");f(this).css("display","block")})});a.node.getAttribute("autoplay")!==null&&a.chapters.css("visibility","hidden")}},setTrack:function(a){var b;if(a=="none"){this.selectedTrack=null;this.captionsButton.removeClass("mejs-captions-enabled")}else for(b=0;b<this.tracks.length;b++)if(this.tracks[b].srclang==a){this.selectedTrack=== -null&&this.captionsButton.addClass("mejs-captions-enabled");this.selectedTrack=this.tracks[b];this.captions.attr("lang",this.selectedTrack.srclang);this.displayCaptions();break}},loadNextTrack:function(){this.trackToLoad++;if(this.trackToLoad<this.tracks.length){this.isLoadingTrack=true;this.loadTrack(this.trackToLoad)}else{this.isLoadingTrack=false;this.checkForTracks()}},loadTrack:function(a){var b=this,c=b.tracks[a];f.ajax({url:c.src,dataType:"text",success:function(e){c.entries=typeof e=="string"&& -/<tt\s+xml/ig.exec(e)?mejs.TrackFormatParser.dfxp.parse(e):mejs.TrackFormatParser.webvtt.parse(e);c.isLoaded=true;b.enableTrackButton(c.srclang,c.label);b.loadNextTrack();c.kind=="chapters"&&b.media.addEventListener("play",function(){b.media.duration>0&&b.displayChapters(c)},false);c.kind=="slides"&&b.setupSlides(c)},error:function(){b.loadNextTrack()}})},enableTrackButton:function(a,b){if(b==="")b=mejs.language.codes[a]||a;this.captionsButton.find("input[value="+a+"]").prop("disabled",false).siblings("label").html(b); -this.options.startLanguage==a&&f("#"+this.id+"_captions_"+a).prop("checked",true).trigger("click");this.adjustLanguageBox()},addTrackButton:function(a,b){if(b==="")b=mejs.language.codes[a]||a;this.captionsButton.find("ul").append(f('<li><input type="radio" name="'+this.id+'_captions" id="'+this.id+"_captions_"+a+'" value="'+a+'" disabled="disabled" /><label for="'+this.id+"_captions_"+a+'">'+b+" (loading)</label></li>"));this.adjustLanguageBox();this.container.find(".mejs-captions-translations option[value="+ -a+"]").remove()},adjustLanguageBox:function(){this.captionsButton.find(".mejs-captions-selector").height(this.captionsButton.find(".mejs-captions-selector ul").outerHeight(true)+this.captionsButton.find(".mejs-captions-translations").outerHeight(true))},checkForTracks:function(){var a=false;if(this.options.hideCaptionsButtonWhenEmpty){for(i=0;i<this.tracks.length;i++)if(this.tracks[i].kind=="subtitles"){a=true;break}if(!a){this.captionsButton.hide();this.setControlsSize()}}},displayCaptions:function(){if(typeof this.tracks!= -"undefined"){var a,b=this.selectedTrack;if(b!==null&&b.isLoaded)for(a=0;a<b.entries.times.length;a++)if(this.media.currentTime>=b.entries.times[a].start&&this.media.currentTime<=b.entries.times[a].stop){this.captionsText.html(b.entries.text[a]).attr("class","mejs-captions-text "+(b.entries.times[a].identifier||""));this.captions.show().height(0);return}this.captions.hide()}},setupSlides:function(a){this.slides=a;this.slides.entries.imgs=[this.slides.entries.text.length];this.showSlide(0)},showSlide:function(a){if(!(typeof this.tracks== -"undefined"||typeof this.slidesContainer=="undefined")){var b=this,c=b.slides.entries.text[a],e=b.slides.entries.imgs[a];if(typeof e=="undefined"||typeof e.fadeIn=="undefined")b.slides.entries.imgs[a]=e=f('<img src="'+c+'">').on("load",function(){e.appendTo(b.slidesContainer).hide().fadeIn().siblings(":visible").fadeOut()});else!e.is(":visible")&&!e.is(":animated")&&e.fadeIn().siblings(":visible").fadeOut()}},displaySlides:function(){if(typeof this.slides!="undefined"){var a=this.slides,b;for(b=0;b< -a.entries.times.length;b++)if(this.media.currentTime>=a.entries.times[b].start&&this.media.currentTime<=a.entries.times[b].stop){this.showSlide(b);break}}},displayChapters:function(){var a;for(a=0;a<this.tracks.length;a++)if(this.tracks[a].kind=="chapters"&&this.tracks[a].isLoaded){this.drawChapters(this.tracks[a]);this.hasChapters=true;break}},drawChapters:function(a){var b=this,c,e,d=e=0;b.chapters.empty();for(c=0;c<a.entries.times.length;c++){e=a.entries.times[c].stop-a.entries.times[c].start; -e=Math.floor(e/b.media.duration*100);if(e+d>100||c==a.entries.times.length-1&&e+d<100)e=100-d;b.chapters.append(f('<div class="mejs-chapter" rel="'+a.entries.times[c].start+'" style="left: '+d.toString()+"%;width: "+e.toString()+'%;"><div class="mejs-chapter-block'+(c==a.entries.times.length-1?" mejs-chapter-block-last":"")+'"><span class="ch-title">'+a.entries.text[c]+'</span><span class="ch-time">'+mejs.Utility.secondsToTimeCode(a.entries.times[c].start)+"–"+mejs.Utility.secondsToTimeCode(a.entries.times[c].stop)+ -"</span></div></div>"));d+=e}b.chapters.find("div.mejs-chapter").click(function(){b.media.setCurrentTime(parseFloat(f(this).attr("rel")));b.media.paused&&b.media.play()});b.chapters.show()}});mejs.language={codes:{af:"Afrikaans",sq:"Albanian",ar:"Arabic",be:"Belarusian",bg:"Bulgarian",ca:"Catalan",zh:"Chinese","zh-cn":"Chinese Simplified","zh-tw":"Chinese Traditional",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch",en:"English",et:"Estonian",fl:"Filipino",fi:"Finnish",fr:"French",gl:"Galician",de:"German", -el:"Greek",ht:"Haitian Creole",iw:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",ga:"Irish",it:"Italian",ja:"Japanese",ko:"Korean",lv:"Latvian",lt:"Lithuanian",mk:"Macedonian",ms:"Malay",mt:"Maltese",no:"Norwegian",fa:"Persian",pl:"Polish",pt:"Portuguese",ro:"Romanian",ru:"Russian",sr:"Serbian",sk:"Slovak",sl:"Slovenian",es:"Spanish",sw:"Swahili",sv:"Swedish",tl:"Tagalog",th:"Thai",tr:"Turkish",uk:"Ukrainian",vi:"Vietnamese",cy:"Welsh",yi:"Yiddish"}};mejs.TrackFormatParser={webvtt:{pattern_timecode:/^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/, -parse:function(a){var b=0;a=mejs.TrackFormatParser.split2(a,/\r?\n/);for(var c={text:[],times:[]},e,d,g;b<a.length;b++){if((e=this.pattern_timecode.exec(a[b]))&&b<a.length){if(b-1>=0&&a[b-1]!=="")g=a[b-1];b++;d=a[b];for(b++;a[b]!==""&&b<a.length;){d=d+"\n"+a[b];b++}d=f.trim(d).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a href='$1' target='_blank'>$1</a>");c.text.push(d);c.times.push({identifier:g,start:mejs.Utility.convertSMPTEtoSeconds(e[1])===0?0.2:mejs.Utility.convertSMPTEtoSeconds(e[1]), -stop:mejs.Utility.convertSMPTEtoSeconds(e[3]),settings:e[5]})}g=""}return c}},dfxp:{parse:function(a){a=f(a).filter("tt");var b=0;b=a.children("div").eq(0);var c=b.find("p");b=a.find("#"+b.attr("style"));var e,d;a={text:[],times:[]};if(b.length){d=b.removeAttr("id").get(0).attributes;if(d.length){e={};for(b=0;b<d.length;b++)e[d[b].name.split(":")[1]]=d[b].value}}for(b=0;b<c.length;b++){var g;d={start:null,stop:null,style:null};if(c.eq(b).attr("begin"))d.start=mejs.Utility.convertSMPTEtoSeconds(c.eq(b).attr("begin")); -if(!d.start&&c.eq(b-1).attr("end"))d.start=mejs.Utility.convertSMPTEtoSeconds(c.eq(b-1).attr("end"));if(c.eq(b).attr("end"))d.stop=mejs.Utility.convertSMPTEtoSeconds(c.eq(b).attr("end"));if(!d.stop&&c.eq(b+1).attr("begin"))d.stop=mejs.Utility.convertSMPTEtoSeconds(c.eq(b+1).attr("begin"));if(e){g="";for(var k in e)g+=k+":"+e[k]+";"}if(g)d.style=g;if(d.start===0)d.start=0.2;a.times.push(d);d=f.trim(c.eq(b).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, -"<a href='$1' target='_blank'>$1</a>");a.text.push(d);if(a.times.start===0)a.times.start=2}return a}},split2:function(a,b){return a.split(b)}};if("x\n\ny".split(/\n/gi).length!=3)mejs.TrackFormatParser.split2=function(a,b){var c=[],e="",d;for(d=0;d<a.length;d++){e+=a.substring(d,d+1);if(b.test(e)){c.push(e.replace(b,""));e=""}}c.push(e);return c}})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{contextMenuItems:[{render:function(a){if(typeof a.enterFullScreen=="undefined")return null;return a.isFullScreen?mejs.i18n.t("Turn off Fullscreen"):mejs.i18n.t("Go Fullscreen")},click:function(a){a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{render:function(a){return a.media.muted?mejs.i18n.t("Unmute"):mejs.i18n.t("Mute")},click:function(a){a.media.muted?a.setMuted(false):a.setMuted(true)}},{isSeparator:true},{render:function(){return mejs.i18n.t("Download Video")}, -click:function(a){window.location.href=a.media.currentSrc}}]});f.extend(MediaElementPlayer.prototype,{buildcontextmenu:function(a){a.contextMenu=f('<div class="mejs-contextmenu"></div>').appendTo(f("body")).hide();a.container.bind("contextmenu",function(b){if(a.isContextMenuEnabled){b.preventDefault();a.renderContextMenu(b.clientX-1,b.clientY-1);return false}});a.container.bind("click",function(){a.contextMenu.hide()});a.contextMenu.bind("mouseleave",function(){a.startContextMenuTimer()})},cleancontextmenu:function(a){a.contextMenu.remove()}, -isContextMenuEnabled:true,enableContextMenu:function(){this.isContextMenuEnabled=true},disableContextMenu:function(){this.isContextMenuEnabled=false},contextMenuTimeout:null,startContextMenuTimer:function(){var a=this;a.killContextMenuTimer();a.contextMenuTimer=setTimeout(function(){a.hideContextMenu();a.killContextMenuTimer()},750)},killContextMenuTimer:function(){var a=this.contextMenuTimer;if(a!=null){clearTimeout(a);delete a}},hideContextMenu:function(){this.contextMenu.hide()},renderContextMenu:function(a, -b){for(var c=this,e="",d=c.options.contextMenuItems,g=0,k=d.length;g<k;g++)if(d[g].isSeparator)e+='<div class="mejs-contextmenu-separator"></div>';else{var j=d[g].render(c);if(j!=null)e+='<div class="mejs-contextmenu-item" data-itemindex="'+g+'" id="element-'+Math.random()*1E6+'">'+j+"</div>"}c.contextMenu.empty().append(f(e)).css({top:b,left:a}).show();c.contextMenu.find(".mejs-contextmenu-item").each(function(){var m=f(this),q=parseInt(m.data("itemindex"),10),p=c.options.contextMenuItems[q];typeof p.show!= -"undefined"&&p.show(m,c);m.click(function(){typeof p.click!="undefined"&&p.click(c);c.contextMenu.hide()})});setTimeout(function(){c.killControlsTimer("rev3")},100)}})})(mejs.$); -(function(f){f.extend(mejs.MepDefaults,{postrollCloseText:mejs.i18n.t("Close")});f.extend(MediaElementPlayer.prototype,{buildpostroll:function(a,b,c){var e=this.container.find('link[rel="postroll"]').attr("href");if(typeof e!=="undefined"){a.postroll=f('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">'+this.options.postrollCloseText+'</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(c).hide();this.media.addEventListener("ended", -function(){f.ajax({dataType:"html",url:e,success:function(d){c.find(".mejs-postroll-layer-content").html(d)}});a.postroll.show()},false)}}})})(mejs.$); + *//*! + * MediaElement.js + * http://www.mediaelementjs.com/ + * + * Wrapper that mimics native HTML5 MediaElement (audio and video) + * using a variety of technologies (pure JavaScript, Flash, iframe) + * + * Copyright 2010-2017, John Dyer (http://j.hn/) + * License: MIT + * + */ +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){},{}],2:[function(a,b,c){(function(c){var d="undefined"!=typeof c?c:"undefined"!=typeof window?window:{},e=a(1);if("undefined"!=typeof document)b.exports=document;else{var f=d["__GLOBAL_DOCUMENT_CACHE@4"];f||(f=d["__GLOBAL_DOCUMENT_CACHE@4"]=e),b.exports=f}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{1:1}],3:[function(a,b,c){(function(a){"undefined"!=typeof window?b.exports=window:"undefined"!=typeof a?b.exports=a:"undefined"!=typeof self?b.exports=self:b.exports={}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0});var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(6),g=d(f),h=a(14),i=a(21),j={lang:"en",en:h.EN};j.language=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];if(null!==b&&void 0!==b&&b.length){if("string"!=typeof b[0])throw new TypeError("Language code must be a string value");if(!b[0].match(/^[a-z]{2}(\-[a-z]{2})?$/i))throw new TypeError("Language code must have format `xx` or `xx-xx`");j.lang=b[0],void 0===j[b[0]]?(b[1]=null!==b[1]&&void 0!==b[1]&&"object"===e(b[1])?b[1]:{},j[b[0]]=i.isObjectEmpty(b[1])?h.EN:b[1]):null!==b[1]&&void 0!==b[1]&&"object"===e(b[1])&&(j[b[0]]=b[1])}return j.lang},j.t=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof a&&a.length){var c=void 0,d=void 0,f=j.language(),g=function(a,b,c){if("object"!==("undefined"==typeof a?"undefined":e(a))||"number"!=typeof b||"number"!=typeof c)return a;var d=function(){return[function(){return arguments.length<=1?void 0:arguments[1]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 0===(arguments.length<=0?void 0:arguments[0])||1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:0!==(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])||11===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])||12===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])>2&&(arguments.length<=0?void 0:arguments[0])<20?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:0===(arguments.length<=0?void 0:arguments[0])||(arguments.length<=0?void 0:arguments[0])%100>0&&(arguments.length<=0?void 0:arguments[0])%100<20?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:[3]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1&&(arguments.length<=0?void 0:arguments[0])%100!==11?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])>=2&&(arguments.length<=0?void 0:arguments[0])<=4?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return(arguments.length<=0?void 0:arguments[0])%100===1?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])%100===2?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])%100===3||(arguments.length<=0?void 0:arguments[0])%100===4?arguments.length<=4?void 0:arguments[4]:arguments.length<=1?void 0:arguments[1]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])>2&&(arguments.length<=0?void 0:arguments[0])<7?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])>6&&(arguments.length<=0?void 0:arguments[0])<11?arguments.length<=4?void 0:arguments[4]:arguments.length<=5?void 0:arguments[5]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:(arguments.length<=0?void 0:arguments[0])%100>=3&&(arguments.length<=0?void 0:arguments[0])%100<=10?arguments.length<=4?void 0:arguments[4]:(arguments.length<=0?void 0:arguments[0])%100>=11?arguments.length<=5?void 0:arguments[5]:arguments.length<=6?void 0:arguments[6]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:0===(arguments.length<=0?void 0:arguments[0])||(arguments.length<=0?void 0:arguments[0])%100>1&&(arguments.length<=0?void 0:arguments[0])%100<11?arguments.length<=2?void 0:arguments[2]:(arguments.length<=0?void 0:arguments[0])%100>10&&(arguments.length<=0?void 0:arguments[0])%100<20?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return(arguments.length<=0?void 0:arguments[0])%10===1?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10===2?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 11!==(arguments.length<=0?void 0:arguments[0])&&(arguments.length<=0?void 0:arguments[0])%10===1?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:(arguments.length<=0?void 0:arguments[0])%10>=2&&(arguments.length<=0?void 0:arguments[0])%10<=4&&((arguments.length<=0?void 0:arguments[0])%100<10||(arguments.length<=0?void 0:arguments[0])%100>=20)?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:8!==(arguments.length<=0?void 0:arguments[0])&&11!==(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:arguments.length<=2?void 0:arguments[2]},function(){return 1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:2===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:3===(arguments.length<=0?void 0:arguments[0])?arguments.length<=3?void 0:arguments[3]:arguments.length<=4?void 0:arguments[4]},function(){return 0===(arguments.length<=0?void 0:arguments[0])?arguments.length<=1?void 0:arguments[1]:1===(arguments.length<=0?void 0:arguments[0])?arguments.length<=2?void 0:arguments[2]:arguments.length<=3?void 0:arguments[3]}]}();return d[c].apply(null,[b].concat(a))};return void 0!==j[f]&&(c=j[f][a],null!==b&&"number"==typeof b&&(d=j[f]["mejs.plural-form"],c=g.apply(null,[c,b,d]))),!c&&j.en&&(c=j.en[a],null!==b&&"number"==typeof b&&(d=j.en["mejs.plural-form"],c=g.apply(null,[c,b,d]))),c=c||a,null!==b&&"number"==typeof b&&(c=c.replace("%1",b)),i.escapeHTML(c)}return a},g["default"].i18n=j,"undefined"!=typeof mejsL10n&&g["default"].i18n.language(mejsL10n.language,mejsL10n.strings),c["default"]=j},{14:14,21:21,6:6}],5:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0});var f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(21),m=a(22),n=a(7),o=function p(a,b){var c=this;e(this,p);var d=this;d.defaults={renderers:[],fakeNodeName:"mediaelementwrapper",pluginPath:"build/",shimScriptAccess:"sameDomain",customError:""},b=Object.assign(d.defaults,b),d.mediaElement=i["default"].createElement(b.fakeNodeName),d.mediaElement.options=b;var f=a,g=!1;if("string"==typeof a?d.mediaElement.originalNode=i["default"].getElementById(a):(d.mediaElement.originalNode=a,f=a.id),f=f||"mejs_"+Math.random().toString().slice(2),void 0!==d.mediaElement.originalNode&&null!==d.mediaElement.originalNode&&d.mediaElement.appendChild){d.mediaElement.originalNode.setAttribute("id",f+"_from_mejs");var h=d.mediaElement.originalNode.tagName.toLowerCase();["video","audio"].includes(h)&&!d.mediaElement.originalNode.getAttribute("preload")&&d.mediaElement.originalNode.setAttribute("preload","none"),d.mediaElement.originalNode.parentNode.insertBefore(d.mediaElement,d.mediaElement.originalNode),d.mediaElement.appendChild(d.mediaElement.originalNode)}d.mediaElement.id=f,d.mediaElement.renderers={},d.mediaElement.renderer=null,d.mediaElement.rendererName=null,d.mediaElement.changeRenderer=function(a,b){var d=c;if(void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer.name===a)return d.mediaElement.renderer.pause(),d.mediaElement.renderer.stop&&d.mediaElement.renderer.stop(),d.mediaElement.renderer.show(),d.mediaElement.renderer.setSrc(b[0].src),!0;void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&(d.mediaElement.renderer.pause(),d.mediaElement.renderer.stop&&d.mediaElement.renderer.stop(),d.mediaElement.renderer.hide());var e=d.mediaElement.renderers[a],f=null;if(void 0!==e&&null!==e)return e.show(),e.setSrc(b[0].src),d.mediaElement.renderer=e,d.mediaElement.rendererName=a,!0;for(var g=d.mediaElement.options.renderers.length?d.mediaElement.options.renderers:n.renderer.order,h=0,i=g.length;i>h;h++){var j=g[h];if(j===a){var k=n.renderer.renderers;f=k[j];var l=Object.assign(f.options,d.mediaElement.options);return e=f.create(d.mediaElement,l,b),e.name=a,d.mediaElement.renderers[f.name]=e,d.mediaElement.renderer=e,d.mediaElement.rendererName=a,e.show(),!0}}return!1},d.mediaElement.setSize=function(a,b){void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer.setSize(a,b)},d.mediaElement.createErrorMessage=function(a){a=Array.isArray(a)?a:[];var b=i["default"].createElement("div");b.className="me_cannotplay",b.style.width="100%",b.style.height="100%";var c=d.mediaElement.options.customError;if(!c){var e=d.mediaElement.originalNode.getAttribute("poster");e&&(c+='<img src="'+e+'" width="100%" height="100%" alt="'+k["default"].i18n.t("mejs.download-file")+'">');for(var f=0,h=a.length;h>f;f++){var j=a[f];c+='<a href="'+j.src+'" data-type="'+j.type+'"><span>'+k["default"].i18n.t("mejs.download-file")+": "+j.src+"</span></a>"}}b.innerHTML=c,d.mediaElement.originalNode.parentNode.insertBefore(b,d.mediaElement.originalNode),d.mediaElement.originalNode.style.display="none",g=!0};var j=k["default"].html5media.properties,o=k["default"].html5media.methods,q=function(a,b,c,d){var e=a[b],f=function(){return c.apply(a,[e])},g=function(b){return e=d.apply(a,[b])};Object.defineProperty(a,b,{get:f,set:g})},r=function(a){"src"!==a&&!function(){var b=""+a.substring(0,1).toUpperCase()+a.substring(1),c=function(){return void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer?d.mediaElement.renderer["get"+b]():null},e=function(a){void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&d.mediaElement.renderer["set"+b](a)};q(d.mediaElement,a,c,e),d.mediaElement["get"+b]=c,d.mediaElement["set"+b]=e}()},s=function(){return void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer?d.mediaElement.renderer.getSrc():null},t=function(a){var b=[];if("string"==typeof a)b.push({src:a,type:a?m.getTypeFromFile(a):""});else for(var c=0,e=a.length;e>c;c++){var f=m.absolutizeUrl(a[c].src),g=a[c].type;b.push({src:f,type:""!==g&&null!==g&&void 0!==g||!f?g:m.getTypeFromFile(f)})}var h=n.renderer.select(b,d.mediaElement.options.renderers.length?d.mediaElement.options.renderers:[]),i=void 0;return d.mediaElement.paused||(d.mediaElement.pause(),i=l.createEvent("pause",d.mediaElement),d.mediaElement.dispatchEvent(i)),d.mediaElement.originalNode.setAttribute("src",b[0].src||""),d.mediaElement.querySelector(".me_cannotplay")&&d.mediaElement.querySelector(".me_cannotplay").remove(),null===h?(d.mediaElement.createErrorMessage(b),i=l.createEvent("error",d.mediaElement),i.message="No renderer found",void d.mediaElement.dispatchEvent(i)):(d.mediaElement.changeRenderer(h.rendererName,b),void 0===d.mediaElement.renderer||null===d.mediaElement.renderer?(i=l.createEvent("error",d.mediaElement),i.message="Error creating renderer",d.mediaElement.dispatchEvent(i),void d.mediaElement.createErrorMessage(b)):void 0)},u=function(a){d.mediaElement[a]=function(){for(var b=arguments.length,c=Array(b),e=0;b>e;e++)c[e]=arguments[e];if(void 0!==d.mediaElement.renderer&&null!==d.mediaElement.renderer&&"function"==typeof d.mediaElement.renderer[a])try{d.mediaElement.renderer[a](c)}catch(f){d.mediaElement.createErrorMessage()}return null}};q(d.mediaElement,"src",s,t),d.mediaElement.getSrc=s,d.mediaElement.setSrc=t;for(var v=0,w=j.length;w>v;v++)r(j[v]);for(var x=0,y=o.length;y>x;x++)u(o[x]);if(d.mediaElement.events={},d.mediaElement.addEventListener=function(a,b){d.mediaElement.events[a]=d.mediaElement.events[a]||[],d.mediaElement.events[a].push(b)},d.mediaElement.removeEventListener=function(a,b){if(!a)return d.mediaElement.events={},!0;var c=d.mediaElement.events[a];if(!c)return!0;if(!b)return d.mediaElement.events[a]=[],!0;for(var e=0;e<c.length;e++)if(c[e]===b)return d.mediaElement.events[a].splice(e,1),!0;return!1},d.mediaElement.dispatchEvent=function(a){var b=d.mediaElement.events[a.type];if(b)for(var c=0;c<b.length;c++)b[c].apply(null,[a])},null!==d.mediaElement.originalNode){var z=[];switch(d.mediaElement.originalNode.nodeName.toLowerCase()){case"iframe":z.push({type:"",src:d.mediaElement.originalNode.getAttribute("src")});break;case"audio":case"video":var A=void 0,B=void 0,C=void 0,D=d.mediaElement.originalNode.childNodes.length,E=d.mediaElement.originalNode.getAttribute("src");if(E){var F=d.mediaElement.originalNode;z.push({type:m.formatType(E,F.getAttribute("type")),src:E})}for(var G=0;D>G;G++)A=d.mediaElement.originalNode.childNodes[G],A.nodeType===Node.ELEMENT_NODE&&"source"===A.tagName.toLowerCase()&&(B=A.getAttribute("src"),C=m.formatType(B,A.getAttribute("type")),z.push({type:C,src:B}))}z.length>0&&(d.mediaElement.src=z)}return d.mediaElement.options.success&&d.mediaElement.options.success(d.mediaElement,d.mediaElement.originalNode),g&&d.mediaElement.options.error&&d.mediaElement.options.error(d.mediaElement,d.mediaElement.originalNode),d.mediaElement};g["default"].MediaElement=o,c["default"]=o},{2:2,21:21,22:22,3:3,6:6,7:7}],6:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0});var e=a(3),f=d(e),g={};g.version="4.0.2",g.html5media={properties:["volume","src","currentTime","muted","duration","paused","ended","buffered","error","networkState","readyState","seeking","seekable","currentSrc","preload","bufferedBytes","bufferedTime","initialTime","startOffsetTime","defaultPlaybackRate","playbackRate","played","autoplay","loop","controls"],readOnlyProperties:["duration","paused","ended","buffered","error","networkState","readyState","seeking","seekable"],methods:["load","play","pause","canPlayType"],events:["loadstart","progress","suspend","abort","error","emptied","stalled","play","pause","loadedmetadata","loadeddata","waiting","playing","canplay","canplaythrough","seeking","seeked","timeupdate","ended","ratechange","durationchange","volumechange"],mediaTypes:["audio/mp3","audio/ogg","audio/oga","audio/wav","audio/x-wav","audio/wave","audio/x-pn-wav","audio/mpeg","audio/mp4","video/mp4","video/webm","video/ogg"]},f["default"].mejs=g,c["default"]=g},{3:3}],7:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0}),c.renderer=void 0;var f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},g=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),h=a(6),i=d(h),j=function(){function a(){e(this,a),this.renderers={},this.order=[]}return g(a,[{key:"add",value:function(a){if(void 0===a.name)throw new TypeError("renderer must contain at least `name` property");this.renderers[a.name]=a,this.order.push(a.name)}},{key:"select",value:function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],c=b.length;b=b.length?b:this.order,c||!function(){var a=[/^(html5|native)/,/^flash/,/iframe$/],c=function(b){for(var c=0,d=a.length;d>c;c++)if(null!==b.match(a[c]))return c;return a.length};b.sort(function(a,b){return c(a)-c(b)})}();for(var d=0,e=b.length;e>d;d++){var f=b[d],g=this.renderers[f];if(null!==g&&void 0!==g)for(var h=0,i=a.length;i>h;h++)if("function"==typeof g.canPlayType&&"string"==typeof a[h].type&&g.canPlayType(a[h].type))return{rendererName:g.name,src:a[h].src}}return null}},{key:"order",set:function(a){if(!Array.isArray(a))throw new TypeError("order must be an array of strings.");this._order=a},get:function(){return this._order}},{key:"renderers",set:function(a){if(null!==a&&"object"!==("undefined"==typeof a?"undefined":f(a)))throw new TypeError("renderers must be an array of objects.");this._renderers=a},get:function(){return this._renderers}}]),a}(),k=c.renderer=new j;i["default"].Renderers=k},{6:6}],8:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}var f=a(3),g=e(f),h=a(2),i=e(h),j=a(4),k=e(j),l=a(16),m=e(l),n=a(19),o=d(n),p=a(21),q=a(20);Object.assign(l.config,{usePluginFullScreen:!0,fullscreenText:null}),Object.assign(m["default"].prototype,{isFullScreen:!1,isNativeFullScreen:!1,isInIframe:!1,isPluginClickThroughCreated:!1,fullscreenMode:"",containerSizeTimeout:null,buildfullscreen:function(a,b,c,d){if(a.isVideo){a.isInIframe=g["default"].location!==g["default"].parent.location,d.addEventListener("loadstart",function(){a.detectFullscreenMode()});var e=this,f=p.isString(e.options.fullscreenText)?e.options.fullscreenText:k["default"].t("mejs.fullscreen"),h=i["default"].createElement("div");if(h.className=e.options.classPrefix+"button "+e.options.classPrefix+"fullscreen-button",h.innerHTML='<button type="button" aria-controls="'+e.id+'" title="'+f+'" aria-label="'+f+'" tabindex="0"></button>',e.addControlElement(h,"fullscreen"),h.addEventListener("click",function(){var b=o.HAS_TRUE_NATIVE_FULLSCREEN&&o.IS_FULLSCREEN||a.isFullScreen;b?a.exitFullScreen():a.enterFullScreen()}),a.fullscreenBtn=h,e.globalBind("keydown",function(b){var c=b.which||b.keyCode||0;27===c&&(o.HAS_TRUE_NATIVE_FULLSCREEN&&o.IS_FULLSCREEN||e.isFullScreen)&&a.exitFullScreen()}),e.normalHeight=0,e.normalWidth=0,o.HAS_TRUE_NATIVE_FULLSCREEN){var j=function(){a.isFullScreen&&(o.isFullScreen()?(a.isNativeFullScreen=!0,a.setControlsSize()):(a.isNativeFullScreen=!1,a.exitFullScreen()))};a.globalBind(o.FULLSCREEN_EVENT_NAME,j)}}},detectFullscreenMode:function(){var a=this,b=null!==a.media.rendererName&&null!==a.media.rendererName.match(/(native|html5)/),c="";return c=o.HAS_TRUE_NATIVE_FULLSCREEN&&b?"native-native":o.HAS_TRUE_NATIVE_FULLSCREEN&&!b?"plugin-native":a.usePluginFullScreen&&o.SUPPORT_POINTER_EVENTS?"plugin-click":"fullwindow",a.fullscreenMode=c,c},cleanfullscreen:function(a){a.exitFullScreen()},enterFullScreen:function(){var a=this,b=null!==a.media.rendererName&&null!==a.media.rendererName.match(/(html5|native)/),c=getComputedStyle(a.container);if(o.IS_IOS&&o.HAS_IOS_FULLSCREEN&&"function"==typeof a.media.webkitEnterFullscreen)return void a.media.webkitEnterFullscreen();if(q.addClass(i["default"].documentElement,a.options.classPrefix+"fullscreen"),q.addClass(a.container,a.options.classPrefix+"container-fullscreen"),a.normalHeight=parseFloat(c.height),a.normalWidth=parseFloat(c.width),"native-native"===a.fullscreenMode||"plugin-native"===a.fullscreenMode?(o.requestFullScreen(a.container),a.isInIframe&&setTimeout(function r(){if(a.isNativeFullScreen){var b=.002,c=g["default"].innerWidth||i["default"].documentElement.clientWidth||i["default"].body.clientWidth,d=screen.width,e=Math.abs(d-c),f=d*b;e>f?a.exitFullScreen():setTimeout(r,500)}},1e3)):"fullwindow"===a.fullscreeMode,a.container.style.width="100%",a.container.style.height="100%",a.containerSizeTimeout=setTimeout(function(){a.container.style.width="100%",a.container.style.height="100%",a.setControlsSize()},500),b)a.node.style.width="100%",a.node.style.height="100%";else for(var d=a.container.querySelectorAll("iframe, embed, object, video"),e=d.length,f=0;e>f;f++)d[f].style.width="100%",d[f].style.height="100%";a.options.setDimensions&&"function"==typeof a.media.setSize&&a.media.setSize(screen.width,screen.height);for(var h=a.layers.childNodes,j=h.length,k=0;j>k;k++)h[k].style.width="100%",h[k].style.height="100%";a.fullscreenBtn&&(q.removeClass(a.fullscreenBtn,a.options.classPrefix+"fullscreen"),q.addClass(a.fullscreenBtn,a.options.classPrefix+"unfullscreen")),a.setControlsSize(),a.isFullScreen=!0;var l=Math.min(screen.width/a.width,screen.height/a.height),m=a.container.querySelector("."+a.options.classPrefix+"captions-text");m&&(m.style.fontSize=100*l+"%",m.style.lineHeight="normal",a.container.querySelector("."+a.options.classPrefix+"captions-position").style.bottom="45px");var n=p.createEvent("enteredfullscreen",a.container);a.container.dispatchEvent(n)},exitFullScreen:function(){var a=this,b=null!==a.media.rendererName&&null!==a.media.rendererName.match(/(native|html5)/);if(clearTimeout(a.containerSizeTimeout),o.HAS_TRUE_NATIVE_FULLSCREEN&&(o.IS_FULLSCREEN||a.isFullScreen)&&o.cancelFullScreen(),q.removeClass(i["default"].documentElement,a.options.classPrefix+"fullscreen"),q.removeClass(a.container,a.options.classPrefix+"container-fullscreen"),a.options.setDimensions){if(a.container.style.width=a.normalWidth+"px",a.container.style.height=a.normalHeight+"px",b)a.node.style.width=a.normalWidth+"px",a.node.style.height=a.normalHeight+"px";else for(var c=a.container.querySelectorAll("iframe, embed, object, video"),d=c.length,e=0;d>e;e++)c[e].style.width=a.normalWidth+"px",c[e].style.height=a.normalHeight+"px";"function"==typeof a.media.setSize&&a.media.setSize(a.normalWidth,a.normalHeight);for(var f=a.layers.childNodes,g=f.length,h=0;g>h;h++)f[h].style.width=a.normalWidth+"px",f[h].style.height=a.normalHeight+"px"}q.removeClass(a.fullscreenBtn,a.options.classPrefix+"unfullscreen"),q.addClass(a.fullscreenBtn,a.options.classPrefix+"fullscreen"),a.setControlsSize(),a.isFullScreen=!1;var j=a.container.querySelector("."+a.options.classPrefix+"captions-text");j&&(j.style.fontSize="",j.style.lineHeight="",a.container.querySelector("."+a.options.classPrefix+"captions-position").style.bottom="");var k=p.createEvent("exitedfullscreen",a.container);a.container.dispatchEvent(k)}})},{16:16,19:19,2:2,20:20,21:21,3:3,4:4}],9:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(4),j=d(i),k=a(21),l=a(20);Object.assign(g.config,{playText:null,pauseText:null}),Object.assign(h["default"].prototype,{buildplaypause:function(a,b,c,d){function e(a){"play"===a?(l.removeClass(n,g.options.classPrefix+"play"),l.removeClass(n,g.options.classPrefix+"replay"),l.addClass(n,g.options.classPrefix+"pause"),o.setAttribute("title",m),o.setAttribute("aria-label",m)):(l.removeClass(n,g.options.classPrefix+"pause"),l.removeClass(n,g.options.classPrefix+"replay"),l.addClass(n,g.options.classPrefix+"play"),o.setAttribute("title",i),o.setAttribute("aria-label",i))}var g=this,h=g.options,i=k.isString(h.playText)?h.playText:j["default"].t("mejs.play"),m=k.isString(h.pauseText)?h.pauseText:j["default"].t("mejs.pause"),n=f["default"].createElement("div");n.className=g.options.classPrefix+"button "+g.options.classPrefix+"playpause-button "+g.options.classPrefix+"play",n.innerHTML='<button type="button" aria-controls="'+g.id+'" title="'+i+'" aria-label="'+m+'" tabindex="0"></button>',n.addEventListener("click",function(){d.paused?d.play():d.pause()});var o=n.querySelector("button");g.addControlElement(n,"playpause"),e("pse"),d.addEventListener("loadedmetadata",function(){e("pse")}),d.addEventListener("play",function(){e("play")}),d.addEventListener("playing",function(){e("play")}),d.addEventListener("pause",function(){e("pse")}),d.addEventListener("paused",function(){e("pse")}),d.addEventListener("ended",function(){a.options.loop||(l.removeClass(n,g.options.classPrefix+"pause"),l.removeClass(n,g.options.classPrefix+"play"),l.addClass(n,g.options.classPrefix+"replay"),o.setAttribute("title",i),o.setAttribute("aria-label",i))})}})},{16:16,2:2,20:20,21:21,4:4}],10:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(4),j=d(i),k=a(19),l=a(24),m=a(20);Object.assign(g.config,{enableProgressTooltip:!0}),Object.assign(h["default"].prototype,{buildprogress:function(a,b,c,d){var e=0,g=!1,h=!1,i=this,n=a.options.autoRewind,o=a.options.enableProgressTooltip?'<span class="'+i.options.classPrefix+'time-float">'+('<span class="'+i.options.classPrefix+'time-float-current">00:00</span>')+('<span class="'+i.options.classPrefix+'time-float-corner"></span>')+"</span>":"",p=f["default"].createElement("div");p.className=i.options.classPrefix+"time-rail",p.innerHTML='<span class="'+i.options.classPrefix+"time-total "+i.options.classPrefix+'time-slider">'+('<span class="'+i.options.classPrefix+'time-buffering"></span>')+('<span class="'+i.options.classPrefix+'time-loaded"></span>')+('<span class="'+i.options.classPrefix+'time-current"></span>')+('<span class="'+i.options.classPrefix+'time-handle"></span>')+(""+o)+"</span>",i.addControlElement(p,"progress"),b.querySelector("."+i.options.classPrefix+"time-buffering").style.display="none",i.rail=b.querySelector("."+i.options.classPrefix+"time-rail"),i.total=b.querySelector("."+i.options.classPrefix+"time-total"),i.loaded=b.querySelector("."+i.options.classPrefix+"time-loaded"),i.current=b.querySelector("."+i.options.classPrefix+"time-current"),i.handle=b.querySelector("."+i.options.classPrefix+"time-handle"),i.timefloat=b.querySelector("."+i.options.classPrefix+"time-float"),i.timefloatcurrent=b.querySelector("."+i.options.classPrefix+"time-float-current"),i.slider=b.querySelector("."+i.options.classPrefix+"time-slider"),i.newTime=0,i.forcedHandlePause=!1;var q=function(b){var c=getComputedStyle(i.total),e=m.offset(i.total),f=parseFloat(c.width),h=0,j=0,n=void 0;n=b.originalEvent&&b.originalEvent.changedTouches?b.originalEvent.changedTouches[0].pageX:b.changedTouches?b.changedTouches[0].pageX:b.pageX,d.duration&&(n<e.left?n=e.left:n>f+e.left&&(n=f+e.left),j=n-e.left,h=j/f,i.newTime=.02>=h?0:h*d.duration,g&&null!==d.currentTime&&i.newTime.toFixed(4)!==d.currentTime.toFixed(4)&&(i.setCurrentRailHandle(i.newTime),i.updateCurrent(i.newTime)),k.IS_IOS||k.IS_ANDROID||!i.timefloat||(i.timefloat.style.left=j+"px",i.timefloatcurrent.innerHTML=l.secondsToTimeCode(i.newTime,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength),i.timefloat.style.display="block"))},r=function(){var b=d.currentTime,c=j["default"].t("mejs.time-slider"),e=l.secondsToTimeCode(b,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength),f=d.duration;i.slider.setAttribute("role","slider"),i.slider.tabIndex=0,d.paused?(i.slider.setAttribute("aria-label",c),i.slider.setAttribute("aria-valuemin",0),i.slider.setAttribute("aria-valuemax",f),i.slider.setAttribute("aria-valuenow",b),i.slider.setAttribute("aria-valuetext",e)):(i.slider.removeAttribute("aria-label"),i.slider.removeAttribute("aria-valuemin"),i.slider.removeAttribute("aria-valuemax"),i.slider.removeAttribute("aria-valuenow"),i.slider.removeAttribute("aria-valuetext"))},s=function(){var a=new Date;a-e>=1e3&&d.play()},t=function(){g&&null!==d.currentTime&&i.newTime.toFixed(4)!==d.currentTime.toFixed(4)&&(d.setCurrentTime(i.newTime),a.setCurrentRail(),i.updateCurrent(i.newTime)),i.forcedHandlePause&&i.media.play(),i.forcedHandlePause=!1};i.slider.addEventListener("focus",function(){a.options.autoRewind=!1}),i.slider.addEventListener("blur",function(){a.options.autoRewind=n}),i.slider.addEventListener("keydown",function(b){if(new Date-e>=1e3&&(h=d.paused),i.options.keyActions.length){var c=b.which||b.keyCode||0,f=d.duration,g=a.options.defaultSeekForwardInterval(d),j=a.options.defaultSeekBackwardInterval(d),l=d.currentTime;switch(c){case 37:case 40:d.duration!==1/0&&(l-=j);break;case 39:case 38:d.duration!==1/0&&(l+=g);break;case 36:l=0;break;case 35:l=f;break;case 32:return void(k.IS_FIREFOX||(d.paused?d.play():d.pause()));case 13:return void(d.paused?d.play():d.pause());default:return}l=0>l?0:l>=f?f:Math.floor(l),e=new Date,h||d.pause(),l<d.duration&&!h&&setTimeout(s,1100),d.setCurrentTime(l),b.preventDefault(),b.stopPropagation()}});var u=["mousedown","touchstart"];i.slider.addEventListener("dragstart",function(){return!1});for(var v=0,w=u.length;w>v;v++)i.slider.addEventListener(u[v],function(a){i.forcedHandlePause=!1,d.duration!==1/0&&(1===a.which||0===a.which)&&(d.paused||(i.media.pause(),i.forcedHandlePause=!0),g=!0,q(a),i.globalBind("mousemove.dur touchmove.dur",function(a){var b=a.target;(b===i.slider||b.closest("."+i.options.classPrefix+"time-slider"))&&q(a); +}),i.globalBind("mouseup.dur touchend.dur",function(){t(),g=!1,i.timefloat&&(i.timefloat.style.display="none"),i.globalUnbind("mousemove.dur touchmove.dur mouseup.dur touchend.dur")}))});i.slider.addEventListener("mouseenter",function(a){a.target===i.slider&&d.duration!==1/0&&(i.globalBind("mousemove.dur",function(a){var b=a.target;(b===i.slider||b.closest("."+i.options.classPrefix+"time-slider"))&&q(a)}),!i.timefloat||k.IS_IOS||k.IS_ANDROID||(i.timefloat.style.display="block"))}),i.slider.addEventListener("mouseleave",function(){d.duration!==1/0&&(g||(i.globalUnbind("mousemove.dur"),i.timefloat&&(i.timefloat.style.display="none")))}),d.addEventListener("progress",function(c){var e=b.querySelector("."+i.options.classPrefix+"broadcast");if(d.duration!==1/0)e&&(i.slider.style.display="",e.remove()),a.setProgressRail(c),i.forcedHandlePause||a.setCurrentRail(c);else if(!e){var g=f["default"].createElement("span");g.className=i.options.classPrefix+"broadcast",g.innerText=j["default"].t("mejs.live-broadcast"),i.slider.style.display="none"}}),d.addEventListener("timeupdate",function(c){var e=b.querySelector("."+i.options.classPrefix+"broadcast");if(d.duration!==1/0)e&&(i.slider.style.display="",e.remove()),a.setProgressRail(c),i.forcedHandlePause||a.setCurrentRail(c),r(c);else if(!e){var g=f["default"].createElement("span");g.className=i.options.classPrefix+"broadcast",g.innerText=j["default"].t("mejs.live-broadcast"),b.querySelector("."+i.options.classPrefix+"time-rail").appendChild(g),i.slider.style.display="none"}}),i.container.addEventListener("controlsresize",function(b){d.duration!==1/0&&(a.setProgressRail(b),i.forcedHandlePause||a.setCurrentRail(b))})},setProgressRail:function(a){var b=null,c=this,d=void 0!==a?a.target:c.media;d&&d.buffered&&d.buffered.length>0&&d.buffered.end&&d.duration?b=d.buffered.end(d.buffered.length-1)/d.duration:d&&void 0!==d.bytesTotal&&d.bytesTotal>0&&void 0!==d.bufferedBytes?b=d.bufferedBytes/d.bytesTotal:a&&a.lengthComputable&&0!==a.total&&(b=a.loaded/a.total),null!==b&&(b=Math.min(1,Math.max(0,b)),c.loaded&&c.total&&(c.loaded.style.width=100*b+"%"))},setCurrentRailHandle:function(a){var b=this;b.setCurrentRailMain(b,a)},setCurrentRail:function(){var a=this;a.setCurrentRailMain(a)},setCurrentRailMain:function(a,b){if(void 0!==a.media.currentTime&&a.media.duration){var c="undefined"==typeof b?a.media.currentTime:b;if(a.total&&a.handle){var d=Math.round(parseFloat(getComputedStyle(a.total).width)*c/a.media.duration),e=d-Math.round(a.handle.offsetWidth/2);d=c/a.media.duration*100,a.current.style.width=d+"%",a.handle.style.left=e+"px"}}}})},{16:16,19:19,2:2,20:20,24:24,4:4}],11:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(24),j=a(20);Object.assign(g.config,{duration:0,timeAndDurationSeparator:"<span> | </span>"}),Object.assign(h["default"].prototype,{buildcurrent:function(a,b,c,d){var e=this,g=f["default"].createElement("div");g.className=e.options.classPrefix+"time",g.setAttribute("role","timer"),g.setAttribute("aria-live","off"),g.innerHTML='<span class="'+e.options.classPrefix+'currenttime">'+i.secondsToTimeCode(0,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength)+"</span>",e.addControlElement(g,"current"),d.addEventListener("timeupdate",function(){e.controlsAreVisible&&a.updateCurrent()})},buildduration:function(a,b,c,d){var e=this,g=b.lastChild.querySelector("."+e.options.classPrefix+"currenttime");if(g)b.querySelector("."+e.options.classPrefix+"time").innerHTML+=e.options.timeAndDurationSeparator+'<span class="'+e.options.classPrefix+'duration">'+(i.secondsToTimeCode(e.options.duration,e.options.alwaysShowHours,e.options.showTimecodeFrameCount,e.options.framesPerSecond,e.options.secondsDecimalLength)+"</span>");else{b.querySelector("."+e.options.classPrefix+"currenttime")&&j.addClass(b.querySelector("."+e.options.classPrefix+"currenttime").parentNode,e.options.classPrefix+"currenttime-container");var h=f["default"].createElement("div");h.className=e.options.classPrefix+"time "+e.options.classPrefix+"duration-container",h.innerHTML='<span class="'+e.options.classPrefix+'duration">'+(i.secondsToTimeCode(e.options.duration,e.options.alwaysShowHours,e.options.showTimecodeFrameCount,e.options.framesPerSecond,e.options.secondsDecimalLength)+"</span>"),e.addControlElement(h,"duration")}d.addEventListener("timeupdate",function(){e.controlsAreVisible&&a.updateDuration()})},updateCurrent:function(){var a=this,b=a.media.currentTime;isNaN(b)&&(b=0),a.controls.querySelector("."+a.options.classPrefix+"currenttime")&&(a.controls.querySelector("."+a.options.classPrefix+"currenttime").innerText=i.secondsToTimeCode(b,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength))},updateDuration:function(){var a=this,b=a.media.duration;(isNaN(b)||b===1/0||0>b)&&(a.media.duration=a.options.duration=b=0),a.options.duration>0&&(b=a.options.duration);var c=i.secondsToTimeCode(b,a.options.alwaysShowHours,a.options.showTimecodeFrameCount,a.options.framesPerSecond,a.options.secondsDecimalLength);c.length>5&&j.toggleClass(a.container,a.options.classPrefix+"long-video"),a.controls.querySelector("."+a.options.classPrefix+"duration")&&b>0&&(a.controls.querySelector("."+a.options.classPrefix+"duration").innerHTML=c)}})},{16:16,2:2,20:20,24:24}],12:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(6),h=d(g),i=a(4),j=d(i),k=a(16),l=d(k),m=a(24),n=a(21),o=a(20);Object.assign(k.config,{startLanguage:"",tracksText:null,chaptersText:null,tracksAriaLive:!1,hideCaptionsButtonWhenEmpty:!0,toggleCaptionsButtonWhenOnlyOne:!1,slidesSelector:""}),Object.assign(l["default"].prototype,{hasChapters:!1,buildtracks:function(a,b,c,d){if(0!==a.tracks.length){var e=this,g=e.options.tracksAriaLive?' role="log" aria-live="assertive" aria-atomic="false"':"",h=n.isString(e.options.tracksText)?e.options.tracksText:j["default"].t("mejs.captions-subtitles"),i=n.isString(e.options.chaptersText)?e.options.chaptersText:j["default"].t("mejs.captions-chapters"),k=a.tracks.length;if(e.domNode.textTracks)for(var l=e.domNode.textTracks.length-1;l>=0;l--)e.domNode.textTracks[l].mode="hidden";e.cleartracks(a),a.captions=f["default"].createElement("div"),a.captions.className=e.options.classPrefix+"captions-layer "+e.options.classPrefix+"layer",a.captions.innerHTML='<div class="'+e.options.classPrefix+"captions-position "+e.options.classPrefix+'captions-position-hover"'+g+">"+('<span class="'+e.options.classPrefix+'captions-text"></span>')+"</div>",a.captions.style.display="none",c.insertBefore(a.captions,c.firstChild),a.captionsText=a.captions.querySelector("."+e.options.classPrefix+"captions-text"),a.captionsButton=f["default"].createElement("div"),a.captionsButton.className=e.options.classPrefix+"button "+e.options.classPrefix+"captions-button",a.captionsButton.innerHTML='<button type="button" aria-controls="'+e.id+'" title="'+h+'" aria-label="'+h+'" tabindex="0"></button>'+('<div class="'+e.options.classPrefix+"captions-selector "+e.options.classPrefix+'offscreen">')+('<ul class="'+e.options.classPrefix+'captions-selector-list">')+('<li class="'+e.options.classPrefix+'captions-selector-list-item">')+('<input type="radio" class="'+e.options.classPrefix+'captions-selector-input" ')+('name="'+a.id+'_captions" id="'+a.id+'_captions_none" ')+'value="none" checked disabled>'+('<label class="'+e.options.classPrefix+"captions-selector-label ")+(e.options.classPrefix+'captions-selected" ')+('for="'+a.id+'_captions_none">'+j["default"].t("mejs.none")+"</label>")+"</li></ul></div>",e.addControlElement(a.captionsButton,"tracks"),a.captionsButton.querySelector("."+e.options.classPrefix+"captions-selector-list-item").disabled=!1,a.chaptersButton=f["default"].createElement("div"),a.chaptersButton.className=e.options.classPrefix+"button "+e.options.classPrefix+"chapters-button",a.chaptersButton.innerHTML='<button type="button" aria-controls="'+e.id+'" title="'+i+'" aria-label="'+i+'" tabindex="0"></button>'+('<div class="'+e.options.classPrefix+"chapters-selector "+e.options.classPrefix+'offscreen">')+('<ul class="'+e.options.classPrefix+'chapters-selector-list"></ul>')+"</div>";for(var m=0,p=0;k>p;p++){var q=a.tracks[p].kind;"subtitles"===q||"captions"===q?m++:"chapters"!==q||b.querySelector("."+e.options.classPrefix+"chapter-selector")||a.captionsButton.parentNode.insertBefore(a.chaptersButton,a.captionsButton)}a.trackToLoad=-1,a.selectedTrack=null,a.isLoadingTrack=!1;for(var r=0;k>r;r++){var s=a.tracks[r].kind;("subtitles"===s||"captions"===s)&&a.addTrackButton(a.tracks[r].trackId,a.tracks[r].srclang,a.tracks[r].label)}a.loadNextTrack();var t=["mouseenter","focusin"],u=["mouseleave","focusout"];if(e.options.toggleCaptionsButtonWhenOnlyOne&&1===m)a.captionsButton.addEventListener("click",function(){var b="none";null===a.selectedTrack&&(b=a.tracks[0].trackId),a.setTrack(b)});else{for(var v=a.captionsButton.querySelectorAll("."+e.options.classPrefix+"captions-selector-label"),w=a.captionsButton.querySelectorAll("input[type=radio]"),x=0,y=t.length;y>x;x++)a.captionsButton.addEventListener(t[x],function(){o.removeClass(this.querySelector("."+e.options.classPrefix+"captions-selector"),e.options.classPrefix+"offscreen")});for(var z=0,A=u.length;A>z;z++)a.captionsButton.addEventListener(u[z],function(){o.addClass(this.querySelector("."+e.options.classPrefix+"captions-selector"),e.options.classPrefix+"offscreen")});for(var B=0,C=w.length;C>B;B++)w[B].addEventListener("click",function(){a.setTrack(this.value)});for(var D=0,E=v.length;E>D;D++)v[D].addEventListener("click",function(){var a=o.siblings(this,function(a){return"INPUT"===a.tagName})[0],b=n.createEvent("click",a);a.dispatchEvent(b)});a.captionsButton.addEventListener("keydown",function(a){a.stopPropagation()})}for(var F=0,G=t.length;G>F;F++)a.chaptersButton.addEventListener(t[F],function(){this.querySelector("."+e.options.classPrefix+"chapters-selector-list").childNodes.length&&o.removeClass(this.querySelector("."+e.options.classPrefix+"chapters-selector"),e.options.classPrefix+"offscreen")});for(var H=0,I=u.length;I>H;H++)a.chaptersButton.addEventListener(u[H],function(){o.addClass(this.querySelector("."+e.options.classPrefix+"chapters-selector"),e.options.classPrefix+"offscreen")});a.chaptersButton.addEventListener("keydown",function(a){a.stopPropagation()}),a.options.alwaysShowControls?o.addClass(a.container.querySelector("."+e.options.classPrefix+"captions-position"),e.options.classPrefix+"captions-position-hover"):(a.container.addEventListener("controlsshown",function(){o.addClass(a.container.querySelector("."+e.options.classPrefix+"captions-position"),e.options.classPrefix+"captions-position-hover")}),a.container.addEventListener("controlshidden",function(){d.paused||o.removeClass(a.container.querySelector("."+e.options.classPrefix+"captions-position"),e.options.classPrefix+"captions-position-hover")})),d.addEventListener("timeupdate",function(){a.displayCaptions()}),""!==a.options.slidesSelector&&(a.slidesContainer=f["default"].querySelectorAll(a.options.slidesSelector),d.addEventListener("timeupdate",function(){a.displaySlides()}))}},cleartracks:function(a){a&&(a.captions&&a.captions.remove(),a.chapters&&a.chapters.remove(),a.captionsText&&a.captionsText.remove(),a.captionsButton&&a.captionsButton.remove(),a.chaptersButton&&a.chaptersButton.remove())},rebuildtracks:function(){var a=this;a.findTracks(),a.buildtracks(a,a.controls,a.layers,a.media)},findTracks:function(){var a=this,b=a.node.querySelectorAll("track"),c=b.length;a.tracks=[];for(var d=0;c>d;d++){var e=b[d],f=e.getAttribute("srclang").toLowerCase()||"",g=a.id+"_track_"+d+"_"+e.getAttribute("kind")+"_"+f;a.tracks.push({trackId:g,srclang:f,src:e.getAttribute("src"),kind:e.getAttribute("kind"),label:e.getAttribute("label")||"",entries:[],isLoaded:!1})}},setTrack:function(a){for(var b=this,c=b.captionsButton.querySelectorAll('input[type="radio"]'),d=b.captionsButton.querySelectorAll("."+b.options.classPrefix+"captions-selected"),e=b.captionsButton.querySelector('input[value="'+a+'"]'),f=0,g=c.length;g>f;f++)c[f].checked=!1;for(var h=0,i=d.length;i>h;h++)o.removeClass(d[h],b.options.classPrefix+"captions-selected");e.checked=!0;for(var j=o.siblings(e,function(a){return o.hasClass(a,b.options.classPrefix+"captions-selector-label")}),k=0,l=j.length;l>k;k++)o.addClass(j[k],b.options.classPrefix+"captions-selected");if("none"===a)b.selectedTrack=null,o.removeClass(b.captionsButton,b.options.classPrefix+"captions-enabled");else for(var m=0,p=b.tracks.length;p>m;m++){var q=b.tracks[m];if(q.trackId===a){null===b.selectedTrack&&o.addClass(b.captionsButton,b.options.classPrefix+"captions-enabled"),b.selectedTrack=q,b.captions.setAttribute("lang",b.selectedTrack.srclang),b.displayCaptions();break}}var r=n.createEvent("captionschange",b.media);r.detail.caption=b.selectedTrack,b.media.dispatchEvent(r)},loadNextTrack:function(){var a=this;a.trackToLoad++,a.trackToLoad<a.tracks.length?(a.isLoadingTrack=!0,a.loadTrack(a.trackToLoad)):(a.isLoadingTrack=!1,a.checkForTracks())},loadTrack:function(a){var b=this,c=b.tracks[a];void 0===c||void 0===c.src&&""===c.src||o.ajax(c.src,"text",function(a){c.entries="string"==typeof a&&/<tt\s+xml/gi.exec(a)?h["default"].TrackFormatParser.dfxp.parse(a):h["default"].TrackFormatParser.webvtt.parse(a),c.isLoaded=!0,b.enableTrackButton(c),b.loadNextTrack(),"slides"===c.kind?b.setupSlides(c):"chapters"!==c.kind||b.hasChapters||(b.drawChapters(c),b.hasChapters=!0)},function(){b.removeTrackButton(c.trackId),b.loadNextTrack()})},enableTrackButton:function(a){var b=this,c=a.srclang,d=f["default"].getElementById(""+a.trackId);if(d){var e=a.label;""===e&&(e=j["default"].t(h["default"].language.codes[c])||c),d.disabled=!1;for(var g=o.siblings(d,function(a){return o.hasClass(a,b.options.classPrefix+"captions-selector-label")}),i=0,k=g.length;k>i;i++)g[i].innerHTML=e;if(b.options.startLanguage===c){d.checked=!0;var l=n.createEvent("click",d);d.dispatchEvent(l)}}},removeTrackButton:function(a){var b=f["default"].getElementById(""+a);if(b){var c=b.closest("li");c&&c.remove()}},addTrackButton:function(a,b,c){var d=this;""===c&&(c=j["default"].t(h["default"].language.codes[b])||b),d.captionsButton.querySelector("ul").innerHTML+='<li class="'+d.options.classPrefix+'captions-selector-list-item">'+('<input type="radio" class="'+d.options.classPrefix+'captions-selector-input" ')+('name="'+d.id+'_captions" id="'+a+'" value="'+a+'" disabled>')+('<label class="'+d.options.classPrefix+'captions-selector-label">'+c+" (loading)</label>")+"</li>"},checkForTracks:function(){var a=this,b=!1;if(a.options.hideCaptionsButtonWhenEmpty){for(var c=0,d=a.tracks.length;d>c;c++){var e=a.tracks[c].kind;if(("subtitles"===e||"captions"===e)&&a.tracks[c].isLoaded){b=!0;break}}a.captionsButton.style.display=b?"":"none",a.setControlsSize()}},displayCaptions:function(){if(void 0!==this.tracks){var a=this,b=a.selectedTrack,c=function(a){var b=f["default"].createElement("div");b.innerHTML=a;for(var c=b.getElementsByTagName("script"),d=c.length;d--;)c[d].remove();for(var e=b.getElementsByTagName("*"),g=0,h=e.length;h>g;g++)for(var i=e[g].attributes,j=Array.prototype.slice.call(i),k=0,l=j.length;l>k;k++)j[k].name.startsWith("on")||j[k].value.startsWith("javascript")?e[g].remove():"style"===j[k].name&&e[g].removeAttribute(j[k].name);return b.innerHTML};if(null!==b&&b.isLoaded){var d=a.searchTrackPosition(b.entries,a.media.currentTime);if(d>-1)return a.captionsText.innerHTML=c(b.entries[d].text),a.captionsText.className=a.options.classPrefix+"captions-text "+(b.entries[d].identifier||""),a.captions.style.display="",void(a.captions.style.height="0px");a.captions.style.display="none"}else a.captions.style.display="none"}},setupSlides:function(a){var b=this;b.slides=a,b.slides.entries.imgs=[b.slides.entries.length],b.showSlide(0)},showSlide:function(a){var b=this,c=this;if(void 0!==c.tracks&&void 0!==c.slidesContainer){var d=c.slides.entries[a].text,e=c.slides.entries[a].imgs;void 0===e||void 0===e.fadeIn?!function(){var g=f["default"].createElement("img");g.src=d,g.addEventListener("load",function(){var a=b,d=o.siblings(a,function(a){return d(a)});a.style.display="none",c.slidesContainer.innerHTML+=a.innerHTML,o.fadeIn(c.slidesContainer.querySelector(g));for(var e=0,f=d.length;f>e;e++)o.fadeOut(d[e],400)}),c.slides.entries[a].imgs=e=g}():o.visible(e)||!function(){var a=o.siblings(self,function(b){return a(b)});o.fadeIn(c.slidesContainer.querySelector(e));for(var b=0,d=a.length;d>b;b++)o.fadeOut(a[b])}()}},displaySlides:function(){var a=this;if(void 0!==this.slides){var b=a.slides,c=a.searchTrackPosition(b.entries,a.media.currentTime);return c>-1?void a.showSlide(c):void 0}},drawChapters:function(a){var b=this,c=a.entries.length;if(c){b.chaptersButton.querySelector("ul").innerHTML="";for(var d=0;c>d;d++)b.chaptersButton.querySelector("ul").innerHTML+='<li class="'+b.options.classPrefix+'chapters-selector-list-item" role="menuitemcheckbox" aria-live="polite" aria-disabled="false" aria-checked="false">'+('<input type="radio" class="'+b.options.classPrefix+'captions-selector-input" ')+('name="'+b.id+'_chapters" value="'+a.entries[d].start+'" disabled>')+('<label class="'+b.options.classPrefix+'chapters-selector-label">'+a.entries[d].text+"</label>")+"</li>";for(var e=b.chaptersButton.querySelectorAll('input[type="radio"]'),f=b.chaptersButton.querySelectorAll("."+b.options.classPrefix+"chapters-selector-label"),g=0,h=e.length;h>g;g++)e[g].disabled=!1,e[g].checked=!1,e[g].addEventListener("click",function(){var a=this,c=b.chaptersButton.querySelectorAll("li"),d=o.siblings(a,function(a){return o.hasClass(a,b.options.classPrefix+"chapters-selector-label")})[0];a.checked=!0,a.parentNode.setAttribute("aria-checked",!0),o.addClass(d,b.options.classPrefix+"chapters-selected"),o.removeClass(b.chaptersButton.querySelector("."+b.options.classPrefix+"chapters-selected"),b.options.classPrefix+"chapters-selected");for(var e=0,f=c.length;f>e;e++)c[e].setAttribute("aria-checked",!1);b.media.setCurrentTime(parseFloat(a.value)),b.media.paused&&b.media.play()});for(var i=0,j=f.length;j>i;i++)f[i].addEventListener("click",function(){var a=o.siblings(this,function(a){return"INPUT"===a.tagName})[0],b=n.createEvent("click",a);a.dispatchEvent(b)})}},searchTrackPosition:function(a,b){for(var c=0,d=a.length-1,e=void 0,f=void 0,g=void 0;d>=c;){if(e=c+d>>1,f=a[e].start,g=a[e].stop,b>=f&&g>b)return e;b>f?c=e+1:f>b&&(d=e-1)}return-1}}),h["default"].language={codes:{af:"mejs.afrikaans",sq:"mejs.albanian",ar:"mejs.arabic",be:"mejs.belarusian",bg:"mejs.bulgarian",ca:"mejs.catalan",zh:"mejs.chinese","zh-cn":"mejs.chinese-simplified","zh-tw":"mejs.chines-traditional",hr:"mejs.croatian",cs:"mejs.czech",da:"mejs.danish",nl:"mejs.dutch",en:"mejs.english",et:"mejs.estonian",fl:"mejs.filipino",fi:"mejs.finnish",fr:"mejs.french",gl:"mejs.galician",de:"mejs.german",el:"mejs.greek",ht:"mejs.haitian-creole",iw:"mejs.hebrew",hi:"mejs.hindi",hu:"mejs.hungarian",is:"mejs.icelandic",id:"mejs.indonesian",ga:"mejs.irish",it:"mejs.italian",ja:"mejs.japanese",ko:"mejs.korean",lv:"mejs.latvian",lt:"mejs.lithuanian",mk:"mejs.macedonian",ms:"mejs.malay",mt:"mejs.maltese",no:"mejs.norwegian",fa:"mejs.persian",pl:"mejs.polish",pt:"mejs.portuguese",ro:"mejs.romanian",ru:"mejs.russian",sr:"mejs.serbian",sk:"mejs.slovak",sl:"mejs.slovenian",es:"mejs.spanish",sw:"mejs.swahili",sv:"mejs.swedish",tl:"mejs.tagalog",th:"mejs.thai",tr:"mejs.turkish",uk:"mejs.ukrainian",vi:"mejs.vietnamese",cy:"mejs.welsh",yi:"mejs.yiddish"}},h["default"].TrackFormatParser={webvtt:{pattern:/^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,parse:function(a){for(var b=a.split(/\r?\n/),c=[],d=void 0,e=void 0,f=void 0,g=0,h=b.length;h>g;g++){if(d=this.pattern.exec(b[g]),d&&g<b.length){for(g-1>=0&&""!==b[g-1]&&(f=b[g-1]),g++,e=b[g],g++;""!==b[g]&&g<b.length;)e=e+"\n"+b[g],g++;e=e.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi,"<a href='$1' target='_blank'>$1</a>"),c.push({identifier:f,start:0===m.convertSMPTEtoSeconds(d[1])?.2:m.convertSMPTEtoSeconds(d[1]),stop:m.convertSMPTEtoSeconds(d[3]),text:e,settings:d[5]})}f=""}return c}},dfxp:{parse:function(a){a=$(a).filter("tt");var b=a.firstChild,c=b.querySelectorAll("p"),d=a.getElementById(""+b.attr("style")),e=[],f=void 0;if(d.length){d.removeAttribute("id");var g=d.attributes;if(g.length){f={};for(var h=0,i=g.length;i>h;h++)f[g[h].name.split(":")[1]]=g[h].value}}for(var j=0,k=c.length;k>j;j++){var l=void 0,n={start:null,stop:null,style:null,text:null};if(c.eq(j).attr("begin")&&(n.start=m.convertSMPTEtoSeconds(c.eq(j).attr("begin"))),!n.start&&c.eq(j-1).attr("end")&&(n.start=m.convertSMPTEtoSeconds(c.eq(j-1).attr("end"))),c.eq(j).attr("end")&&(n.stop=m.convertSMPTEtoSeconds(c.eq(j).attr("end"))),!n.stop&&c.eq(j+1).attr("begin")&&(n.stop=m.convertSMPTEtoSeconds(c.eq(j+1).attr("begin"))),f){l="";for(var o in f)l+=o+":"+f[o]+";"}l&&(n.style=l),0===n.start&&(n.start=.2),n.text=c.eq(j).innerHTML.trim().replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi,"<a href='$1' target='_blank'>$1</a>"),e.push(n)}return e}}}},{16:16,2:2,20:20,21:21,24:24,4:4,6:6}],13:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e),g=a(16),h=d(g),i=a(4),j=d(i),k=a(19),l=a(21),m=a(20);Object.assign(g.config,{muteText:null,unmuteText:null,allyVolumeControlText:null,hideVolumeOnTouchDevices:!0,audioVolume:"horizontal",videoVolume:"vertical"}),Object.assign(h["default"].prototype,{buildvolume:function(a,b,c,d){if(!k.IS_ANDROID&&!k.IS_IOS||!this.options.hideVolumeOnTouchDevices){var e=this,g=e.isVideo?e.options.videoVolume:e.options.audioVolume,h=l.isString(e.options.muteText)?e.options.muteText:j["default"].t("mejs.mute"),i=l.isString(e.options.unmuteText)?e.options.unmuteText:j["default"].t("mejs.unmute"),n=l.isString(e.options.allyVolumeControlText)?e.options.allyVolumeControlText:j["default"].t("mejs.volume-help-text"),o=f["default"].createElement("div");if(o.className=e.options.classPrefix+"button "+e.options.classPrefix+"volume-button "+e.options.classPrefix+"mute",o.innerHTML="horizontal"===g?'<button type="button" aria-controls="'+e.id+'" title="'+h+'" aria-label="'+h+'" tabindex="0"></button>':'<button type="button" aria-controls="'+e.id+'" title="'+h+'" aria-label="'+h+'" tabindex="0"></button>'+('<a href="javascript:void(0);" class="'+e.options.classPrefix+'volume-slider">')+('<span class="'+e.options.classPrefix+'offscreen">'+n+"</span>")+('<div class="'+e.options.classPrefix+'volume-total">')+('<div class="'+e.options.classPrefix+'volume-current"></div>')+('<div class="'+e.options.classPrefix+'volume-handle"></div>')+"</div></a>",e.addControlElement(o,"volume"),"horizontal"===g){var p=f["default"].createElement("a");p.className=e.options.classPrefix+"horizontal-volume-slider",p.href="javascript:void(0);",p.innerHTML+='<span class="'+e.options.classPrefix+'offscreen">'+n+"</span>"+('<div class="'+e.options.classPrefix+'horizontal-volume-total">')+('<div class="'+e.options.classPrefix+'horizontal-volume-current"></div>')+('<div class="'+e.options.classPrefix+'horizontal-volume-handle"></div>')+"</div>",o.parentNode.insertBefore(p,o.nextSibling)}var q="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-slider"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-slider"),r="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-total"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-total"),s="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-current"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-current"),t="vertical"===g?e.container.querySelector("."+e.options.classPrefix+"volume-handle"):e.container.querySelector("."+e.options.classPrefix+"horizontal-volume-handle"),u=o.firstElementChild,v=function(a){if(a=Math.max(0,a),a=Math.min(a,1),0===a){m.removeClass(o,e.options.classPrefix+"mute"),m.addClass(o,e.options.classPrefix+"unmute");var b=o.firstElementChild;b.setAttribute("title",i),b.setAttribute("aria-label",i)}else{m.removeClass(o,e.options.classPrefix+"unmute"),m.addClass(o,e.options.classPrefix+"mute");var c=o.firstElementChild;c.setAttribute("title",h),c.setAttribute("aria-label",h)}var d=100*a+"%",f=getComputedStyle(t);"vertical"===g?(s.style.bottom=0,s.style.height=d,t.style.bottom=d,t.style.marginBottom=-parseFloat(f.height)/2+"px"):(s.style.left=0,s.style.width=d,t.style.left=d,t.style.marginLeft=-parseFloat(f.width)/2+"px")},w=function(a){var b=m.offset(r),c=getComputedStyle(r),e=null;if("vertical"===g){var f=parseFloat(c.height),h=a.pageY-b.top;if(e=(f-h)/f,0===b.top||0===b.left)return}else{var i=parseFloat(c.width),j=a.pageX-b.left;e=j/i}e=Math.max(0,e),e=Math.min(e,1),v(e),0===e?d.setMuted(!0):d.setMuted(!1),d.setVolume(e),a.preventDefault(),a.stopPropagation()};o.addEventListener("mouseenter",function(a){a.target===o&&(q.style.display="block",y=!0,a.preventDefault(),a.stopPropagation())}),o.addEventListener("focusin",function(){q.style.display="block",y=!0}),o.addEventListener("mouseleave",function(){y=!1,x||"vertical"!==g||(q.style.display="none")}),o.addEventListener("focusout",function(){y=!1,x||"vertical"!==g||(q.style.display="none")}),o.addEventListener("keydown",function(a){if(e.options.keyActions.length){var b=a.which||a.keyCode||0,c=d.volume;switch(b){case 38:c=Math.min(c+.1,1);break;case 40:c=Math.max(0,c-.1);break;default:return!0}x=!1,v(c),d.setVolume(c),a.preventDefault(),a.stopPropagation()}});var x=!1,y=!1,z=function(){var a=Math.floor(100*d.volume);q.setAttribute("aria-label",j["default"].t("mejs.volume-slider")),q.setAttribute("aria-valuemin",0),q.setAttribute("aria-valuemax",100),q.setAttribute("aria-valuenow",a),q.setAttribute("aria-valuetext",a+"%"),q.setAttribute("role","slider"),q.tabIndex=-1};q.addEventListener("dragstart",function(){return!1}),q.addEventListener("mouseover",function(){y=!0}),q.addEventListener("mousedown",function(a){w(a),e.globalBind("mousemove.vol",function(a){var b=a.target;x&&(b===q||b.closest("vertical"===g?"."+e.options.classPrefix+"volume-slider":"."+e.options.classPrefix+"horizontal-volume-slider"))&&w(a)}),e.globalBind("mouseup.vol",function(){x=!1,e.globalUnbind("mousemove.vol mouseup.vol"),y||"vertical"!==g||(q.style.display="none")}),x=!0,a.preventDefault(),a.stopPropagation()}),u.addEventListener("click",function(){d.setMuted(!d.muted);var a=l.createEvent("volumechange",d);d.dispatchEvent(a)}),u.addEventListener("focus",function(){"vertical"===g&&(q.style.display="block")}),u.addEventListener("blur",function(){"vertical"===g&&(q.style.display="none")}),d.addEventListener("volumechange",function(a){x||(d.muted?(v(0),m.removeClass(o,e.options.classPrefix+"mute"),m.addClass(o,e.options.classPrefix+"unmute")):(v(d.volume),m.removeClass(o,e.options.classPrefix+"unmute"),m.addClass(o,e.options.classPrefix+"mute"))),z(a)}),0===a.options.startVolume&&d.setMuted(!0);var A=null!==e.media.rendererName&&null!==e.media.rendererName.match(/(native|html5)/);A&&d.setVolume(a.options.startVolume),e.container.addEventListener("controlsresize",function(){d.muted?(v(0),m.removeClass(o,e.options.classPrefix+"mute"),m.addClass(o,e.options.classPrefix+"unmute")):(v(d.volume),m.removeClass(o,e.options.classPrefix+"unmute"),m.addClass(o,e.options.classPrefix+"mute"))})}}})},{16:16,19:19,2:2,20:20,21:21,4:4}],14:[function(a,b,c){"use strict";/*! + * This is a `i18n` language object. + * + * English; This can serve as a template for other languages to translate + * + * @author + * TBD + * Sascha Greuel (Twitter: @SoftCreatR) + * + * @see core/i18n.js + */ +Object.defineProperty(c,"__esModule",{value:!0});c.EN={"mejs.plural-form":1,"mejs.download-file":"Download File","mejs.install-flash":"You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/","mejs.fullscreen":"Fullscreen","mejs.play":"Play","mejs.pause":"Pause","mejs.time-slider":"Time Slider","mejs.time-help-text":"Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.","mejs.live-broadcast":"Live Broadcast","mejs.volume-help-text":"Use Up/Down Arrow keys to increase or decrease volume.","mejs.unmute":"Unmute","mejs.mute":"Mute","mejs.volume-slider":"Volume Slider","mejs.video-player":"Video Player","mejs.audio-player":"Audio Player","mejs.captions-subtitles":"Captions/Subtitles","mejs.captions-chapters":"Chapters","mejs.none":"None","mejs.afrikaans":"Afrikaans","mejs.albanian":"Albanian","mejs.arabic":"Arabic","mejs.belarusian":"Belarusian","mejs.bulgarian":"Bulgarian","mejs.catalan":"Catalan","mejs.chinese":"Chinese","mejs.chinese-simplified":"Chinese (Simplified)","mejs.chinese-traditional":"Chinese (Traditional)","mejs.croatian":"Croatian","mejs.czech":"Czech","mejs.danish":"Danish","mejs.dutch":"Dutch","mejs.english":"English","mejs.estonian":"Estonian","mejs.filipino":"Filipino","mejs.finnish":"Finnish","mejs.french":"French","mejs.galician":"Galician","mejs.german":"German","mejs.greek":"Greek","mejs.haitian-creole":"Haitian Creole","mejs.hebrew":"Hebrew","mejs.hindi":"Hindi","mejs.hungarian":"Hungarian","mejs.icelandic":"Icelandic","mejs.indonesian":"Indonesian","mejs.irish":"Irish","mejs.italian":"Italian","mejs.japanese":"Japanese","mejs.korean":"Korean","mejs.latvian":"Latvian","mejs.lithuanian":"Lithuanian","mejs.macedonian":"Macedonian","mejs.malay":"Malay","mejs.maltese":"Maltese","mejs.norwegian":"Norwegian","mejs.persian":"Persian","mejs.polish":"Polish","mejs.portuguese":"Portuguese","mejs.romanian":"Romanian","mejs.russian":"Russian","mejs.serbian":"Serbian","mejs.slovak":"Slovak","mejs.slovenian":"Slovenian","mejs.spanish":"Spanish","mejs.swahili":"Swahili","mejs.swedish":"Swedish","mejs.tagalog":"Tagalog","mejs.thai":"Thai","mejs.turkish":"Turkish","mejs.ukrainian":"Ukrainian","mejs.vietnamese":"Vietnamese","mejs.welsh":"Welsh","mejs.yiddish":"Yiddish"}},{}],15:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(6),h=d(g);"undefined"!=typeof jQuery?h["default"].$=f["default"].jQuery=f["default"].$=jQuery:"undefined"!=typeof Zepto?h["default"].$=f["default"].Zepto=f["default"].$=Zepto:"undefined"!=typeof ender&&(h["default"].$=f["default"].ender=f["default"].$=ender)},{3:3,6:6}],16:[function(a,b,c){"use strict";function d(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b}function e(a){return a&&a.__esModule?a:{"default":a}}function f(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(c,"__esModule",{value:!0}),c.config=void 0;var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},h=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),i=a(3),j=e(i),k=a(2),l=e(k),m=a(6),n=e(m),o=a(5),p=e(o),q=a(4),r=e(q),s=a(19),t=a(21),u=a(24),v=a(22),w=a(20),x=d(w);n["default"].mepIndex=0,n["default"].players={};var y=c.config={poster:"",showPosterWhenEnded:!1,showPosterWhenPaused:!1,defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:40,defaultSeekBackwardInterval:function(a){return.05*a.duration},defaultSeekForwardInterval:function(a){return.05*a.duration},setDimensions:!0,audioWidth:-1,audioHeight:-1,startVolume:.8,loop:!1,autoRewind:!0,enableAutosize:!0,timeFormat:"",alwaysShowHours:!1,showTimecodeFrameCount:!1,framesPerSecond:25,alwaysShowControls:!1,hideVideoControlsOnLoad:!1,hideVideoControlsOnPause:!1,clickToPlayPause:!0,controlsTimeoutDefault:1500,controlsTimeoutMouseEnter:2500,controlsTimeoutMouseLeave:1e3,iPadUseNativeControls:!1,iPhoneUseNativeControls:!1,AndroidUseNativeControls:!1,features:["playpause","current","progress","duration","tracks","volume","fullscreen"],isVideo:!0,stretching:"auto",classPrefix:"mejs__",enableKeyboard:!0,pauseOtherPlayers:!0,secondsDecimalLength:0,keyActions:[{keys:[32,179],action:function(a,b){s.IS_FIREFOX||(b.paused||b.ended?b.play():b.pause())}},{keys:[38],action:function(a,b){(a.container.querySelector("."+y.classPrefix+"volume-button>button").matches(":focus")||a.container.querySelector("."+y.classPrefix+"volume-slider").matches(":focus"))&&(a.container.querySelector("."+y.classPrefix+"volume-slider").style.display=""),a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.min(b.volume+.1,1);b.setVolume(c),c>0&&b.setMuted(!1)}},{keys:[40],action:function(a,b){(a.container.querySelector("."+y.classPrefix+"volume-button>button").matches(":focus")||a.container.querySelector("."+y.classPrefix+"volume-slider").matches(":focus"))&&(a.container.querySelector("."+y.classPrefix+"volume-slider").style.display=""),a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.max(b.volume-.1,0);b.setVolume(c),.1>=c&&b.setMuted(!0)}},{keys:[37,227],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.max(b.currentTime-a.options.defaultSeekBackwardInterval(b),0);b.setCurrentTime(c)}}},{keys:[39,228],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){a.isVideo&&(a.showControls(),a.startControlsTimer());var c=Math.min(b.currentTime+a.options.defaultSeekForwardInterval(b),b.duration);b.setCurrentTime(c)}}},{keys:[70],action:function(a,b,c,d){d.ctrlKey||"undefined"!=typeof a.enterFullScreen&&(a.isFullScreen?a.exitFullScreen():a.enterFullScreen())}},{keys:[77],action:function(a){a.container.querySelector("."+y.classPrefix+"volume-slider").style.display="",a.isVideo&&(a.showControls(),a.startControlsTimer()),a.media.muted?a.setMuted(!1):a.setMuted(!0)}}]};n["default"].MepDefaults=y;var z=function(){function a(b,c){f(this,a);var d=this,e="string"==typeof b?l["default"].getElementById(b):b;if(d.hasFocus=!1,d.controlsAreVisible=!0,d.controlsEnabled=!0,d.controlsTimer=null,!(d instanceof a))return new a(e,c);if(d.node=d.media=e,d.node){if(void 0!==d.media.player)return d.media.player;void 0===c&&(c=d.node.getAttribute("data-mejsoptions")),d.options=Object.assign({},y,c),d.options.timeFormat||(d.options.timeFormat="mm:ss",d.options.alwaysShowHours&&(d.options.timeFormat="hh:mm:ss"),d.options.showTimecodeFrameCount&&(d.options.timeFormat+=":ff")),u.calculateTimeFormat(0,d.options,d.options.framesPerSecond||25),d.id="mep_"+n["default"].mepIndex++,n["default"].players[d.id]=d;var g=Object.assign({},d.options,{success:function(a,b){d._meReady(a,b)},error:function(a){d._handleError(a)}}),h=d.node.tagName.toLowerCase();if(d.isDynamic="audio"!==h&&"video"!==h,d.isVideo=d.isDynamic?d.options.isVideo:"audio"!==h&&d.options.isVideo,s.IS_IPAD&&d.options.iPadUseNativeControls||s.IS_IPHONE&&d.options.iPhoneUseNativeControls)d.node.setAttribute("controls",!0),s.IS_IPAD&&d.node.getAttribute("autoplay")&&d.play();else if(!(d.isVideo||!d.isVideo&&d.options.features.length)||s.IS_ANDROID&&d.options.AndroidUseNativeControls)d.isVideo||d.options.features.length||(d.node.style.display="none");else{d.node.removeAttribute("controls");var i=d.isVideo?r["default"].t("mejs.video-player"):r["default"].t("mejs.audio-player"),j=l["default"].createElement("span");if(j.className=d.options.classPrefix+"offscreen",j.innerText=i,d.media.parentNode.insertBefore(j,d.media),d.container=l["default"].createElement("div"),d.container.id=d.id,d.container.className=d.options.classPrefix+"container "+d.options.classPrefix+"container-keyboard-inactive "+d.media.className,d.container.tabIndex=0,d.container.setAttribute("role","application"),d.container.setAttribute("aria-label",i),d.container.innerHTML='<div class="'+d.options.classPrefix+'inner">'+('<div class="'+d.options.classPrefix+'layers"></div>')+('<div class="'+d.options.classPrefix+'controls"></div>')+('<div class="'+d.options.classPrefix+'mediaelement"></div>')+('<div class="'+d.options.classPrefix+'clear"></div>')+"</div>",d.container.addEventListener("focus",function(a){if(!d.controlsAreVisible&&!d.hasFocus&&d.controlsEnabled&&(d.showControls(!0),!s.HAS_MS_NATIVE_FULLSCREEN)){var b=t.isNodeAfter(a.relatedTarget,d.container)?"."+d.options.classPrefix+"controls ."+d.options.classPrefix+"button:last-child > button":"."+d.options.classPrefix+"playpause-button > button",c=d.container.querySelector(b);c.focus()}}),d.node.parentNode.insertBefore(d.container,d.node),d.options.features.length||(d.container.style.background="transparent",d.container.querySelector("."+d.options.classPrefix+"controls").style.display="none"),d.isVideo&&"fill"===d.options.stretching&&!x.hasClass(d.container.parentNode,d.options.classPrefix+"fill-container")){d.outerContainer=d.media.parentNode;var k=l["default"].createElement("div");k.className=d.options.classPrefix+"fill-container",d.container.parentNode.insertBefore(k,d.container),k.appendChild(d.container)}s.IS_ANDROID&&x.addClass(d.container,d.options.classPrefix+"android"),s.IS_IOS&&x.addClass(d.container,d.options.classPrefix+"ios"),s.IS_IPAD&&x.addClass(d.container,d.options.classPrefix+"ipad"),s.IS_IPHONE&&x.addClass(d.container,d.options.classPrefix+"iphone"),x.addClass(d.container,d.isVideo?d.options.classPrefix+"video":d.options.classPrefix+"audio"),d.container.querySelector("."+d.options.classPrefix+"mediaelement").appendChild(d.node),d.media.player=d,d.controls=d.container.querySelector("."+d.options.classPrefix+"controls"),d.layers=d.container.querySelector("."+d.options.classPrefix+"layers");var m=d.isVideo?"video":"audio",o=m.substring(0,1).toUpperCase()+m.substring(1);d.options[m+"Width"]>0||d.options[m+"Width"].toString().indexOf("%")>-1?d.width=d.options[m+"Width"]:""!==d.node.style.width&&null!==d.node.style.width?d.width=d.node.style.width:d.node.getAttribute("width")?d.width=d.node.getAttribute("width"):d.width=d.options["default"+o+"Width"],d.options[m+"Height"]>0||d.options[m+"Height"].toString().indexOf("%")>-1?d.height=d.options[m+"Height"]:""!==d.node.style.height&&null!==d.node.style.height?d.height=d.node.style.height:d.node.getAttribute("height")?d.height=d.node.getAttribute("height"):d.height=d.options["default"+o+"Height"],d.initialAspectRatio=d.height>=d.width?d.width/d.height:d.height/d.width,d.setPlayerSize(d.width,d.height),g.pluginWidth=d.width,g.pluginHeight=d.height}if(new p["default"](d.media,g),void 0!==d.container&&d.options.features.length&&d.controlsAreVisible&&!d.options.hideVideoControlsOnLoad){var q=t.createEvent("controlsshown",d.container);d.container.dispatchEvent(q)}return d}}return h(a,[{key:"showControls",value:function(a){var b=this;if(a=void 0===a||a,!b.controlsAreVisible){if(a)!function(){x.removeClass(b.controls,b.options.classPrefix+"offscreen"),x.fadeIn(b.controls,200,function(){var a=t.createEvent("controlsshown",b.container);b.container.dispatchEvent(a)});for(var a=b.container.querySelectorAll("."+b.options.classPrefix+"control"),c=function(c,d){x.fadeIn(a[c],200,function(){x.removeClass(a[c],b.options.classPrefix+"offscreen")})},d=0,e=a.length;e>d;d++)c(d,e)}();else{x.removeClass(b.controls,b.options.classPrefix+"offscreen"),b.controls.style.display="";for(var c=b.container.querySelectorAll("."+b.options.classPrefix+"control"),d=0,e=c.length;e>d;d++)x.removeClass(c[d],b.options.classPrefix+"offscreen"),c[d].style.display="";var f=t.createEvent("controlsshown",b.container);b.container.dispatchEvent(f)}b.controlsAreVisible=!0,b.setControlsSize()}}},{key:"hideControls",value:function(a,b){var c=this;if(a=void 0===a||a,b===!0||!(!c.controlsAreVisible||c.options.alwaysShowControls||c.keyboardAction||c.media.paused&&4===c.media.readyState&&(!c.options.hideVideoControlsOnLoad&&c.media.currentTime<=0||!c.options.hideVideoControlsOnPause&&c.media.currentTime>0)||c.isVideo&&!c.options.hideVideoControlsOnLoad&&!c.media.readyState||c.media.ended)){if(a)!function(){x.fadeOut(c.controls,200,function(){x.addClass(c.controls,c.options.classPrefix+"offscreen"),c.controls.style.display="";var a=t.createEvent("controlshidden",c.container);c.container.dispatchEvent(a)});for(var a=c.container.querySelectorAll("."+c.options.classPrefix+"control"),b=function(b,d){x.fadeOut(a[b],200,function(){x.addClass(a[b],c.options.classPrefix+"offscreen"),a[b].style.display=""})},d=0,e=a.length;e>d;d++)b(d,e)}();else{x.addClass(c.controls,c.options.classPrefix+"offscreen"),c.controls.style.display="";for(var d=c.container.querySelectorAll("."+c.options.classPrefix+"control"),e=0,f=d.length;f>e;e++)x.addClass(d[e],c.options.classPrefix+"offscreen"),d[e].style.display="";var g=t.createEvent("controlshidden",c.container);c.container.dispatchEvent(g)}c.controlsAreVisible=!1}}},{key:"startControlsTimer",value:function(a){var b=this;a="undefined"!=typeof a?a:b.options.controlsTimeoutDefault,b.killControlsTimer("start"),b.controlsTimer=setTimeout(function(){b.hideControls(),b.killControlsTimer("hide")},a)}},{key:"killControlsTimer",value:function(){var a=this;null!==a.controlsTimer&&(clearTimeout(a.controlsTimer),delete a.controlsTimer,a.controlsTimer=null)}},{key:"disableControls",value:function(){var a=this;a.killControlsTimer(),a.controlsEnabled=!0,a.hideControls(!1,!0)}},{key:"enableControls",value:function(){var a=this;a.controlsEnabled=!0,a.showControls(!1)}},{key:"_meReady",value:function(a,b){var c=this,d=b.getAttribute("autoplay"),e=!(void 0===d||null===d||"false"===d),f=null!==a.rendererName&&null!==a.rendererName.match(/(native|html5)/);if(c.controls&&c.enableControls(),c.container.querySelector("."+c.options.classPrefix+"overlay-play")&&(c.container.querySelector("."+c.options.classPrefix+"overlay-play").style.display=""),!c.created){if(c.created=!0,c.media=a,c.domNode=b,!(s.IS_ANDROID&&c.options.AndroidUseNativeControls||s.IS_IPAD&&c.options.iPadUseNativeControls||s.IS_IPHONE&&c.options.iPhoneUseNativeControls)){var h=function(){if(!c.isVideo&&!c.options.features.length)return e&&f&&c.play(),c.options.success&&("string"==typeof c.options.success?j["default"][c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c)),{v:void 0};c.buildposter(c,c.controls,c.layers,c.media),c.buildkeyboard(c,c.controls,c.layers,c.media),c.buildoverlays(c,c.controls,c.layers,c.media),c.findTracks(),c.featurePosition={};for(var a=0,b=c.options.features.length;b>a;a++){var d=c.options.features[a];if(c["build"+d])try{c["build"+d](c,c.controls,c.layers,c.media)}catch(g){console.error("error building "+d,g)}}var h=t.createEvent("controlsready",c.container);c.container.dispatchEvent(h),c.setPlayerSize(c.width,c.height),c.setControlsSize(),c.isVideo&&(c.clickToPlayPauseCallback=function(){if(c.options.clickToPlayPause){var a=c.container.querySelector("."+c.options.classPrefix+"overlay-button"),b=a.getAttribute("aria-pressed");c.media.paused&&b?c.pause():c.media.paused?c.play():c.pause(),a.setAttribute("aria-pressed",!b)}},c.createIframeLayer(),c.media.addEventListener("click",c.clickToPlayPauseCallback),!s.IS_ANDROID&&!s.IS_IOS||c.options.alwaysShowControls?(c.container.addEventListener("mouseenter",function(){c.controlsEnabled&&(c.options.alwaysShowControls||(c.killControlsTimer("enter"),c.showControls(),c.startControlsTimer(c.options.controlsTimeoutMouseEnter)))}),c.container.addEventListener("mousemove",function(){c.controlsEnabled&&(c.controlsAreVisible||c.showControls(),c.options.alwaysShowControls||c.startControlsTimer(c.options.controlsTimeoutMouseEnter))}),c.container.addEventListener("mouseleave",function(){c.controlsEnabled&&(c.media.paused||c.options.alwaysShowControls||c.startControlsTimer(c.options.controlsTimeoutMouseLeave))})):c.node.addEventListener("touchstart",function(){c.controlsAreVisible?c.hideControls(!1):c.controlsEnabled&&c.showControls(!1)}),c.options.hideVideoControlsOnLoad&&c.hideControls(!1),e&&!c.options.alwaysShowControls&&c.hideControls(),c.options.enableAutosize&&c.media.addEventListener("loadedmetadata",function(a){c.options.videoHeight<=0&&!c.domNode.getAttribute("height")&&null!==a.target&&!isNaN(a.target.videoHeight)&&(c.setPlayerSize(a.target.videoWidth,a.target.videoHeight),c.setControlsSize(),c.media.setSize(a.target.videoWidth,a.target.videoHeight))})),c.media.addEventListener("play",function(){c.hasFocus=!0;for(var a in n["default"].players)if(n["default"].players.hasOwnProperty(a)){var b=n["default"].players[a];b.id===c.id||!c.options.pauseOtherPlayers||b.paused||b.ended||(b.pause(),b.hasFocus=!1)}}),c.media.addEventListener("ended",function(){if(c.options.autoRewind)try{c.media.setCurrentTime(0),setTimeout(function(){c.container.querySelector("."+c.options.classPrefix+"overlay-loading").parentNode.style.display="none"},20)}catch(a){}"function"==typeof c.media.stop?c.media.stop():c.media.pause(),c.setProgressRail&&c.setProgressRail(),c.setCurrentRail&&c.setCurrentRail(),c.options.loop?c.play():!c.options.alwaysShowControls&&c.controlsEnabled&&c.showControls()}),c.media.addEventListener("loadedmetadata",function(){u.calculateTimeFormat(c.duration,c.options,c.options.framesPerSecond||25),c.updateDuration&&c.updateDuration(),c.updateCurrent&&c.updateCurrent(),c.isFullScreen||(c.setPlayerSize(c.width,c.height),c.setControlsSize())});var i=null;c.media.addEventListener("timeupdate",function(){i!==c.media.duration&&(i=c.media.duration,u.calculateTimeFormat(i,c.options,c.options.framesPerSecond||25),c.updateDuration&&c.updateDuration(),c.updateCurrent&&c.updateCurrent(),c.setControlsSize())}),c.container.addEventListener("focusout",function(a){setTimeout(function(){a.relatedTarget&&c.keyboardAction&&!a.relatedTarget.closest(".mejs-container")&&(c.keyboardAction=!1,c.isVideo&&!c.options.alwaysShowControls&&c.hideControls(!0))},0)}),setTimeout(function(){c.setPlayerSize(c.width,c.height),c.setControlsSize()},0),c.globalBind("resize",function(){c.isFullScreen||s.HAS_TRUE_NATIVE_FULLSCREEN&&l["default"].webkitIsFullScreen||c.setPlayerSize(c.width,c.height),c.setControlsSize()}),c.globalBind("click",function(a){a.target.matches("."+c.options.classPrefix+"container")?x.addClass(a.target,c.options.classPrefix+"container-keyboard-inactive"):a.target.closest("."+c.options.classPrefix+"container")&&x.addClass(a.target.closest("."+c.options.classPrefix+"container"),c.options.classPrefix+"container-keyboard-inactive")}),c.globalBind("keydown",function(a){a.target.matches("."+c.options.classPrefix+"container")?x.removeClass(a.target,c.options.classPrefix+"container-keyboard-inactive"):a.target.closest("."+c.options.classPrefix+"container")&&x.removeClass(h.target.closest("."+c.options.classPrefix+"container"),c.options.classPrefix+"container-keyboard-inactive")})}();if("object"===("undefined"==typeof h?"undefined":g(h)))return h.v}e&&f&&c.play(),c.options.success&&("string"==typeof c.options.success?j["default"][c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c))}}},{key:"_handleError",value:function(a){var b=this;b.controls&&b.disableControls();var c=b.layers.querySelector("."+b.options.classPrefix+"overlay-play");c&&(c.style.display="none"),b.options.error&&b.options.error(a)}},{key:"setPlayerSize",value:function(a,b){var c=this;if(!c.options.setDimensions)return!1;if("undefined"!=typeof a&&(c.width=a),"undefined"!=typeof b&&(c.height=b),"undefined"!=typeof FB&&c.isVideo){FB.Event.subscribe("xfbml.ready",function(){var a=c.media.firstChild;return c.width=parseFloat(a.offsetWidth),c.height=parseFloat(a.offsetHeight),c.setDimensions(c.width,c.height),!1});var d=c.media.firstChild;d.length&&(c.width=d.offsetWidth,c.height=d.offsetHeight)}switch(c.options.stretching){case"fill":c.isVideo?c.setFillMode():c.setDimensions(c.width,c.height);break;case"responsive":c.setResponsiveMode();break;case"none":c.setDimensions(c.width,c.height);break;default:c.hasFluidMode()===!0?c.setResponsiveMode():c.setDimensions(c.width,c.height)}}},{key:"hasFluidMode",value:function(){var a=this;return a.height.toString().includes("%")||a.node.style.maxWidth&&"none"!==a.node.style.maxWidth&&a.node.style.maxWidth!==a.width||a.node.currentStyle&&"100%"===a.node.currentStyle.maxWidth}},{key:"setResponsiveMode",value:function(){var a=this,b=function(){for(var b=void 0,c=a.container;c;){if(b=c.parentElement,b&&x.visible(b))return b;c=b}return null}(),c=getComputedStyle(b,null),d=function(){return a.isVideo?a.media.videoWidth&&a.media.videoWidth>0?a.media.videoWidth:a.node.getAttribute("width")?a.node.getAttribute("width"):a.options.defaultVideoWidth:a.options.defaultAudioWidth}(),e=function(){return a.isVideo?a.media.videoHeight&&a.media.videoHeight>0?a.media.videoHeight:a.node.getAttribute("height")?a.node.getAttribute("height"):a.options.defaultVideoHeight:a.options.defaultAudioHeight}(),f=function(){var b=1;return a.isVideo?(b=a.media.videoWidth&&a.media.videoWidth>0&&a.media.videoHeight&&a.media.videoHeight>0?a.height>=a.width?a.media.videoWidth/a.media.videoHeight:a.media.videoHeight/a.media.videoWidth:a.initialAspectRatio,(isNaN(b)||.01>b||b>100)&&(b=1),b):b}(),g=parseFloat(c.height),h=void 0,i=parseFloat(c.width);if(h=a.isVideo?"100%"===a.height?parseInt(i*e/d,10):a.height>=a.width?parseInt(i/f,10):parseInt(i*f,10):e,isNaN(h)&&(h=g),a.container.parentNode.length>0&&"body"===a.container.parentNode.tagName.toLowerCase()&&(i=j["default"].innerWidth||l["default"].documentElement.clientWidth||l["default"].body.clientWidth,h=j["default"].innerHeight||l["default"].documentElement.clientHeight||l["default"].body.clientHeight),h&&i){a.container.style.width=i+"px",a.container.style.height=h+"px",a.node.style.width="100%",a.node.style.height="100%",a.isVideo&&a.media.setSize&&a.media.setSize(i,h);for(var k=a.layers.childNodes,m=0,n=k.length;n>m;m++)k[m].style.width="100%",k[m].style.height="100%"}}},{key:"setFillMode",value:function(){var a=this,b=a.outerContainer,c=getComputedStyle(b);"none"!==a.node.style.height&&a.node.style.height!==a.height&&(a.node.style.height=""),"none"!==a.node.style.maxWidth&&a.node.style.maxWidth!==a.width&&(a.node.style.maxWidth=""),"none"!==a.node.style.maxHeight&&a.node.style.maxHeight!==a.height&&(a.node.style.maxHeight=""),a.node.currentStyle&&("100%"===a.node.currentStyle.height&&(a.node.currentStyle.height=""),"100%"===a.node.currentStyle.maxWidth&&(a.node.currentStyle.maxWidth=""),"100%"===a.node.currentStyle.maxHeight&&(a.node.currentStyle.maxHeight="")),parseFloat(c.width)||(b.style.width=a.media.offsetWidth+"px"),parseFloat(c.height)||(b.style.height=a.media.offsetHeight+"px"),c=getComputedStyle(b);var d=parseFloat(c.width),e=parseFloat(c.height);a.setDimensions("100%","100%");var f=a.container.querySelector(a.options.classPrefix+"poster img");f&&(f.style.display="");for(var g=a.container.querySelectorAll("object, embed, iframe, video"),h=a.height,i=a.width,j=d,k=h*d/i,l=i*e/h,m=e,n=l>d==!1,o=n?Math.floor(j):Math.floor(l),p=n?Math.floor(k):Math.floor(m),q=n?d+"px":o+"px",r=n?p+"px":e+"px",s=0,t=g.length;t>s;s++)g[s].style.height=r,g[s].style.width=q,a.media.setSize&&a.media.setSize(q,r),g[s].style.marginLeft=Math.floor((d-o)/2)+"px",g[s].style.marginTop=0}},{key:"setDimensions",value:function(a,b){var c=this;a=t.isString(a)&&a.includes("%")?a:parseFloat(a)+"px",b=t.isString(b)&&b.includes("%")?b:parseFloat(b)+"px",c.container.style.width=a,c.container.style.height=b;for(var d=c.layers.childNodes,e=0,f=d.length;f>e;e++)d[e].style.width=a,d[e].style.height=b}},{key:"setControlsSize",value:function(){var a=this;if(x.visible(a.container)&&a.rail&&x.visible(a.rail)){for(var b=getComputedStyle(a.rail),c=getComputedStyle(a.total),d=parseFloat(b.marginLeft)+parseFloat(b.marginRight),e=parseFloat(c.marginLeft)+parseFloat(c.marginRight)||0,f=0,g=x.siblings(a.rail,function(b){return b!==a.rail}),h=g.length,i=0;h>i;i++)f+=g[i].offsetWidth;f+=e+(0===e?2*d:d)+1;var j=parseFloat(a.controls.offsetWidth);a.rail.style.width=(f>j?0:j-f)+"px";var k=t.createEvent("controlsresize",a.container);a.container.dispatchEvent(k)}}},{key:"addControlElement",value:function(a,b){var c=this;if(void 0!==c.featurePosition[b]){var d=c.controls.childNodes[c.featurePosition[b]-1];d.parentNode.insertBefore(a,d.nextSibling)}else{c.controls.appendChild(a);for(var e=c.controls.childNodes,f=0,g=e.length;g>f;f++)if(a==e[f]){c.featurePosition[b]=f;break}}}},{key:"createIframeLayer",value:function(){var a=this;if(a.isVideo&&null!==a.media.rendererName&&null!==a.media.rendererName.match(/iframe/i)&&!l["default"].getElementById(a.media.id+"-iframe-overlay")){var b=l["default"].createElement("div"),c=l["default"].getElementById(a.media.id+"_"+a.media.rendererName);b.id=a.media.id+"-iframe-overlay",b.className=a.options.classPrefix+"iframe-overlay",b.addEventListener("click",function(b){a.options.clickToPlayPause&&(a.media.paused?a.media.play():a.media.pause(),b.preventDefault(),b.stopPropagation())}),c.parentNode.insertBefore(b,c)}}},{key:"resetSize",value:function(){var a=this;setTimeout(function(){a.setPlayerSize(a.width,a.height),a.setControlsSize()},50)}},{key:"setPoster",value:function(a){var b=this,c=b.container.querySelector("."+b.options.classPrefix+"poster"),d=c.querySelector("img");d||(d=l["default"].createElement("img"),d.className=b.options.classPrefix+"poster-img",d.width="100%",d.height="100%",c.appendChild(d)),d.setAttribute("src",a),c.style.backgroundImage='url("'+a+'")'}},{key:"changeSkin",value:function(a){var b=this;b.container.className=b.options.classPrefix+"container "+a,b.setPlayerSize(b.width,b.height),b.setControlsSize()}},{key:"globalBind",value:function(a,b){var c=this,d=c.node?c.node.ownerDocument:l["default"];if(a=t.splitEvents(a,c.id),a.d)for(var e=a.d.split(" "),f=0,g=e.length;g>f;f++)e[f].split(".").reduce(function(a,c){return d.addEventListener(c,b,!1),c},"");if(a.w)for(var h=a.w.split(" "),i=0,k=h.length;k>i;i++)h[i].split(".").reduce(function(a,c){return j["default"].addEventListener(c,b,!1),c},"")}},{key:"globalUnbind",value:function(a,b){var c=this,d=c.node?c.node.ownerDocument:l["default"];if(a=t.splitEvents(a,c.id),a.d)for(var e=a.d.split(" "),f=0,g=e.length;g>f;f++)e[f].split(".").reduce(function(a,c){return d.removeEventListener(c,b,!1),c},"");if(a.w)for(var h=a.d.split(" "),i=0,k=h.length;k>i;i++)h[i].split(".").reduce(function(a,c){return j["default"].removeEventListener(c,b,!1),c},"")}},{key:"buildposter",value:function(a,b,c,d){var e=this,f=l["default"].createElement("div");f.className=e.options.classPrefix+"poster "+e.options.classPrefix+"layer",c.appendChild(f);var g=a.media.getAttribute("poster");""!==a.options.poster&&(g=a.options.poster),g?e.setPoster(g):f.style.display="none",d.addEventListener("play",function(){f.style.display="none"}),d.addEventListener("playing",function(){f.style.display="none"}),a.options.showPosterWhenEnded&&a.options.autoRewind&&d.addEventListener("ended",function(){f.style.display=""}),d.addEventListener("error",function(){f.style.display="none"}),a.options.showPosterWhenPaused&&d.addEventListener("pause",function(){d.ended||(f.style.display="")})}},{key:"buildoverlays",value:function(a,b,c,d){if(a.isVideo){var e=this,f=l["default"].createElement("div"),g=l["default"].createElement("div"),h=l["default"].createElement("div"),i=b.querySelector("."+e.options.classPrefix+"time-buffering");f.style.display="none",f.className=e.options.classPrefix+"overlay "+e.options.classPrefix+"layer",f.innerHTML='<div class="'+e.options.classPrefix+'overlay-loading">'+('<span class="'+e.options.classPrefix+'overlay-loading-bg-img"></span>')+"</div>",c.appendChild(f),g.style.display="none",g.className=e.options.classPrefix+"overlay "+e.options.classPrefix+"layer",g.innerHTML='<div class="'+e.options.classPrefix+'overlay-error"></div>',c.appendChild(g),h.className=e.options.classPrefix+"overlay "+e.options.classPrefix+"layer "+e.options.classPrefix+"overlay-play",h.innerHTML='<div class="'+e.options.classPrefix+'overlay-button" role="button" tabindex="0"'+('aria-label="'+r["default"].t("mejs.play")+'" aria-pressed="false"></div>'),h.addEventListener("click",function(){if(e.options.clickToPlayPause){var a=e.container.querySelector("."+e.options.classPrefix+"overlay-button"),b=a.getAttribute("aria-pressed");d.paused?d.play():d.pause(),a.setAttribute("aria-pressed",!!b)}}),c.appendChild(h),null!==e.media.rendererName&&(e.media.rendererName.match(/(youtube|facebook)/)&&!a.media.originalNode.getAttribute("poster")&&!a.options.poster||s.IS_STOCK_ANDROID)&&(h.style.display="none"),d.addEventListener("play",function(){h.style.display="none",f.style.display="none",i&&(i.style.display="none"),g.style.display="none"}),d.addEventListener("playing",function(){h.style.display="none",f.style.display="none",i&&(i.style.display="none"),g.style.display="none"}),d.addEventListener("seeking",function(){h.style.display="none",f.style.display="",i&&(i.style.display="")}),d.addEventListener("seeked",function(){h.style.display="",f.style.display="none",i&&(i.style.display="")}),d.addEventListener("pause",function(){f.style.display="none",s.IS_STOCK_ANDROID||(h.style.display=""),i&&(i.style.display="none")}),d.addEventListener("waiting",function(){f.style.display="",i&&(i.style.display="")}),d.addEventListener("loadeddata",function(){f.style.display="",i&&(i.style.display=""),s.IS_ANDROID&&(d.canplayTimeout=setTimeout(function(){if(l["default"].createEvent){var a=l["default"].createEvent("HTMLEvents");return a.initEvent("canplay",!0,!0),d.dispatchEvent(a)}},300))}),d.addEventListener("canplay",function(){f.style.display="none",i&&(i.style.display="none"),clearTimeout(d.canplayTimeout)}),d.addEventListener("error",function(a){e._handleError(a),f.style.display="none",h.style.display="none",i&&(i.style.display="none"),g.style.display="block",g.querySelector("."+e.options.classPrefix+"overlay-error").innerHTML=a.message}),d.addEventListener("keydown",function(b){e.onkeydown(a,d,b)})}}},{key:"buildkeyboard",value:function(a,b,c,d){var e=this;e.container.addEventListener("keydown",function(){e.keyboardAction=!0}),e.globalBind("keydown",function(b){var c=l["default"].activeElement.closest("."+e.options.classPrefix+"container"),f=e.media.closest("."+e.options.classPrefix+"container");return e.hasFocus=!(!c||!f||c.id!==f.id),e.onkeydown(a,d,b)}),e.globalBind("click",function(a){e.hasFocus=!!a.target.closest("."+e.options.classPrefix+"container")})}},{key:"onkeydown",value:function(a,b,c){if(a.hasFocus&&a.options.enableKeyboard)for(var d=0,e=a.options.keyActions.length;e>d;d++)for(var f=a.options.keyActions[d],g=0,h=f.keys.length;h>g;g++)c.keyCode===f.keys[g]&&(f.action(a,b,c.keyCode,c),c.preventDefault(),c.stopPropagation());return!0}},{key:"play",value:function(){var a=this;a.media.getCurrentTime()<=0&&a.load(),a.media.play()}},{key:"pause",value:function(){try{this.media.pause()}catch(a){}}},{key:"load",value:function(){var a=this;a.isLoaded||a.media.load(),a.isLoaded=!0}},{key:"setMuted",value:function(a){this.media.setMuted(a)}},{key:"setCurrentTime",value:function(a){this.media.setCurrentTime(a)}},{key:"getCurrentTime",value:function(){return this.media.currentTime}},{key:"setVolume",value:function(a){this.media.setVolume(a)}},{key:"getVolume",value:function(){return this.media.volume}},{key:"setSrc",value:function(a){var b=this,c=l["default"].getElementById(b.media.id+"-iframe-overlay");c&&c.remove(),b.media.setSrc(a),b.createIframeLayer()}},{key:"remove",value:function(){var a=this,b=a.media.rendererName;a.media.paused||a.media.pause(); +var c=a.media.originalNode.getAttribute("src");a.media.setSrc("");for(var d in a.options.features){var e=a.options.features[d];if(a["clean"+e])try{a["clean"+e](a)}catch(f){console.error("error cleaning "+e,f)}}var h=a.node.getAttribute("width"),i=a.node.getAttribute("height");if(h?null===h.match("%")&&(h+="px"):h="auto",i?null===i.match("%")&&(i+="px"):i="auto",a.node.style.width=h,a.node.style.height=i,a.isDynamic)a.container.parentNode.insertBefore(a.node,a.container);else{if(a.node.setAttribute("controls",!0),a.node.setAttribute("id",a.node.getAttribute("id").replace("_"+b,"").replace("_from_mejs","")),delete a.node.autoplay,a.media.canPlayType(v.getTypeFromFile(c))&&a.node.setAttribute("src",c),null!==b.match(/iframe/i)){var j=l["default"].getElementById(a.media.id+"-iframe-overlay");j.remove()}var k=a.node.cloneNode(!0);a.container.parentNode.insertBefore(k,a.container),a.node.remove(),delete a.node}if("function"==typeof a.media.destroy&&a.media.destroy(),delete n["default"].players[a.id],"object"===g(a.container)){var m=a.container.parentNode.querySelector("."+a.options.classPrefix+"offscreen");m.remove(),a.container.remove()}a.globalUnbind(),delete a.media.player}}]),a}();j["default"].MediaElementPlayer=z,c["default"]=z,function(a){"undefined"!=typeof a&&(a.fn.mediaelementplayer=function(b){return b===!1?this.each(function(){var b=a(this).data("mediaelementplayer");b&&b.remove(),a(this).removeData("mediaelementplayer")}):this.each(function(){a(this).data("mediaelementplayer",new z(this,b))}),this},a(l["default"]).ready(function(){a("."+y.classPrefix+"player").mediaelementplayer()}))}(n["default"].$)},{19:19,2:2,20:20,21:21,22:22,24:24,3:3,4:4,5:5,6:6}],17:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0}),c.PluginDetector=void 0;var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},f=a(3),g=d(f),h=a(2),i=d(h),j=a(6),k=d(j),l=a(4),m=d(l),n=a(7),o=a(21),p=a(19),q=a(22),r=c.PluginDetector={plugins:[],hasPluginVersion:function(a,b){var c=r.plugins[a];return b[1]=b[1]||0,b[2]=b[2]||0,c[0]>b[0]||c[0]===b[0]&&c[1]>b[1]||c[0]===b[0]&&c[1]===b[1]&&c[2]>=b[2]},addPlugin:function(a,b,c,d,e){r.plugins[a]=r.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var f=[0,0,0],h=void 0,i=void 0;if(null!==p.NAV.plugins&&void 0!==p.NAV.plugins&&"object"===e(p.NAV.plugins[a])){if(h=p.NAV.plugins[a].description,h&&("undefined"==typeof p.NAV.mimeTypes||!p.NAV.mimeTypes[b]||p.NAV.mimeTypes[b].enabledPlugin)){f=h.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(var j=0,k=f.length;k>j;j++)f[j]=parseInt(f[j].match(/\d+/),10)}}else if(void 0!==g["default"].ActiveXObject)try{i=new ActiveXObject(c),i&&(f=d(i))}catch(l){}return f}};r.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[],c=a.GetVariable("$version");return c&&(c=c.split(" ")[1].split(","),b=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]),b});var s={create:function(a,b,c){var d={};d.options=b,d.id=a.id+"_"+d.options.prefix,d.mediaElement=a,d.flashState={},d.flashApi=null,d.flashApiStack=[];for(var f=k["default"].html5media.properties,h=function(a){d.flashState[a]=null;var b=""+a.substring(0,1).toUpperCase()+a.substring(1);d["get"+b]=function(){if(null===d.flashApi)return null;if(void 0===d.flashApi["get_"+a])return null;var b=function(){var b=d.flashApi["get_"+a]();return"buffered"===a?{v:{start:function(){return 0},end:function(){return b},length:1}}:{v:b}}();return"object"===("undefined"==typeof b?"undefined":e(b))?b.v:void 0},d["set"+b]=function(b){"src"===a&&(b=q.absolutizeUrl(b)),null!==d.flashApi&&void 0!==d.flashApi["set_"+a]?d.flashApi["set_"+a](b):d.flashApiStack.push({type:"set",propName:a,value:b})}},j=0,l=f.length;l>j;j++)h(f[j]);var r=k["default"].html5media.methods,s=function(a){d[a]=function(){if(null!==d.flashApi){if(d.flashApi["fire_"+a])try{d.flashApi["fire_"+a]()}catch(b){}}else d.flashApiStack.push({type:"call",methodName:a})}};r.push("stop");for(var t=0,u=r.length;u>t;t++)s(r[t]);for(var v=["rendererready","loadeddata","loadedmetadata","canplay","error"],w=0,x=v.length;x>w;w++){var y=o.createEvent(v[w],d);a.dispatchEvent(y)}g["default"]["__ready__"+d.id]=function(){if(d.flashReady=!0,d.flashApi=i["default"].getElementById("__"+d.id),d.flashApiStack.length)for(var a=0,b=d.flashApiStack.length;b>a;a++){var c=d.flashApiStack[a];if("set"===c.type){var e=c.propName,f=""+e.substring(0,1).toUpperCase()+e.substring(1);d["set"+f](c.value)}else"call"===c.type&&d[c.methodName]()}},g["default"]["__event__"+d.id]=function(a,b){var c=o.createEvent(a,d);c.message=b||"",d.mediaElement.dispatchEvent(c)},d.flashWrapper=i["default"].createElement("div"),["always","sameDomain"].includes(d.options.shimScriptAccess)||(d.options.shimScriptAccess="sameDomain");var z=a.originalNode.autoplay,A=["uid="+d.id,"autoplay="+z,"allowScriptAccess="+d.options.shimScriptAccess],B=null!==a.originalNode&&"video"===a.originalNode.tagName.toLowerCase(),C=B?a.originalNode.height:1,D=B?a.originalNode.width:1;a.originalNode.getAttribute("src")&&A.push("src="+a.originalNode.getAttribute("src")),d.options.enablePseudoStreaming===!0&&(A.push("pseudostreamstart="+d.options.pseudoStreamingStartQueryParam),A.push("pseudostreamtype="+d.options.pseudoStreamingType)),a.appendChild(d.flashWrapper),null!==a.originalNode&&(a.originalNode.style.display="none");var E=[];if(p.IS_IE){var F=i["default"].createElement("div");d.flashWrapper.appendChild(F),E=['classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"','codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"','id="__'+d.id+'"','width="'+D+'"','height="'+C+'"'],B||E.push('style="clip: rect(0 0 0 0); position: absolute;"'),F.outerHTML="<object "+E.join(" ")+">"+('<param name="movie" value="'+d.options.pluginPath+d.options.filename+"?x="+new Date+'" />')+('<param name="flashvars" value="'+A.join("&")+'" />')+'<param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" />'+('<param name="allowScriptAccess" value="'+d.options.shimScriptAccess+'" />')+'<param name="allowFullScreen" value="true" />'+("<div>"+m["default"].t("mejs.install-flash")+"</div>")+"</object>"}else E=['id="__'+d.id+'"','name="__'+d.id+'"','play="true"','loop="false"','quality="high"','bgcolor="#000000"','wmode="transparent"','allowScriptAccess="'+d.options.shimScriptAccess+'"','allowFullScreen="true"','type="application/x-shockwave-flash"','pluginspage="//www.macromedia.com/go/getflashplayer"','src="'+d.options.pluginPath+d.options.filename+'"','flashvars="'+A.join("&")+'"','width="'+D+'"','height="'+C+'"'],B||E.push('style="clip: rect(0 0 0 0); position: absolute;"'),d.flashWrapper.innerHTML="<embed "+E.join(" ")+">";if(d.flashNode=d.flashWrapper.lastChild,d.hide=function(){if(B){d.flashNode.style.position="absolute",d.flashNode.style.width="1px",d.flashNode.style.height="1px";try{d.flashNode.style.clip="rect(0 0 0 0);"}catch(a){}}},d.show=function(){if(B){d.flashNode.style.position="",d.flashNode.style.width="",d.flashNode.style.height="";try{d.flashNode.style.clip=""}catch(a){}}},d.setSize=function(a,b){d.flashNode.style.width=a+"px",d.flashNode.style.height=b+"px",null!==d.flashApi&&"function"==typeof d.flashApi.fire_setSize&&d.flashApi.fire_setSize(a,b)},d.destroy=function(){d.flashNode.remove()},c&&c.length>0)for(var G=0,H=c.length;H>G;G++)if(n.renderer.renderers[b.prefix].canPlayType(c[G].type)){d.setSrc(c[G].src);break}return d}},t=r.hasPluginVersion("flash",[10,0,0]);if(t){q.typeChecks.push(function(a){return a=a.toLowerCase(),a.startsWith("rtmp")?a.includes(".mp3")?"audio/rtmp":"video/rtmp":a.includes(".oga")||a.includes(".ogg")?"audio/ogg":a.includes(".m3u8")?"application/x-mpegURL":a.includes(".mpd")?"application/dash+xml":a.includes(".flv")?"video/flv":null});var u={name:"flash_video",options:{prefix:"flash_video",filename:"mediaelement-flash-video.swf",enablePseudoStreaming:!1,pseudoStreamingStartQueryParam:"start",pseudoStreamingType:"byte"},canPlayType:function(a){return["video/mp4","video/rtmp","audio/rtmp","rtmp/mp4","audio/mp4","video/flv","video/x-flv"].includes(a.toLowerCase())},create:s.create};n.renderer.add(u);var v={name:"flash_hls",options:{prefix:"flash_hls",filename:"mediaelement-flash-video-hls.swf"},canPlayType:function(a){return["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())},create:s.create};n.renderer.add(v);var w={name:"flash_dash",options:{prefix:"flash_dash",filename:"mediaelement-flash-video-mdash.swf"},canPlayType:function(a){return["application/dash+xml"].includes(a.toLowerCase())},create:s.create};n.renderer.add(w);var x={name:"flash_audio",options:{prefix:"flash_audio",filename:"mediaelement-flash-audio.swf"},canPlayType:function(a){return["audio/mp3"].includes(a.toLowerCase())},create:s.create};n.renderer.add(x);var y={name:"flash_audio_ogg",options:{prefix:"flash_audio_ogg",filename:"mediaelement-flash-audio-ogg.swf"},canPlayType:function(a){return["audio/ogg","audio/oga","audio/ogv"].includes(a.toLowerCase())},create:s.create};n.renderer.add(y)}},{19:19,2:2,21:21,22:22,3:3,4:4,6:6,7:7}],18:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=a(7),l=a(21),m=a(19),n={name:"html5",options:{prefix:"html5"},canPlayType:function(a){var b=h["default"].createElement("video");return m.IS_ANDROID&&null!==a.match(/\/mp(3|4)$/gi)||["application/x-mpegurl","vnd.apple.mpegurl","audio/mpegurl","audio/hls","video/hls"].includes(a.toLowerCase())&&m.SUPPORTS_NATIVE_HLS?"yes":b.canPlayType?b.canPlayType(a).replace(/no/,""):""},create:function(a,b,c){var d=a.id+"_"+b.prefix,e=null;void 0===a.originalNode||null===a.originalNode?(e=h["default"].createElement("audio"),a.appendChild(e)):e=a.originalNode,e.setAttribute("id",d);for(var f=j["default"].html5media.properties,g=function(a){var b=""+a.substring(0,1).toUpperCase()+a.substring(1);e["get"+b]=function(){return e[a]},e["set"+b]=function(b){j["default"].html5media.readOnlyProperties.includes(a)||(e[a]=b)}},i=0,m=f.length;m>i;i++)g(f[i]);for(var n=j["default"].html5media.events.concat(["click","mouseover","mouseout"]),o=function(b){e.addEventListener(b,function(b){var c=h["default"].createEvent("HTMLEvents");c.initEvent(b.type,b.bubbles,b.cancelable),a.dispatchEvent(c)})},p=0,q=n.length;q>p;p++)o(n[p]);if(e.setSize=function(a,b){return e.style.width=a+"px",e.style.height=b+"px",e},e.hide=function(){return e.style.display="none",e},e.show=function(){return e.style.display="",e},c&&c.length>0)for(var r=0,s=c.length;s>r;r++)if(k.renderer.renderers[b.prefix].canPlayType(c[r].type)){e.setAttribute("src",c[r].src);break}var t=l.createEvent("rendererready",e);return a.dispatchEvent(t),e}};f["default"].HtmlMediaElement=j["default"].HtmlMediaElement=n,k.renderer.add(n)},{19:19,2:2,21:21,3:3,6:6,7:7}],19:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}Object.defineProperty(c,"__esModule",{value:!0}),c.cancelFullScreen=c.requestFullScreen=c.isFullScreen=c.FULLSCREEN_EVENT_NAME=c.HAS_NATIVE_FULLSCREEN_ENABLED=c.HAS_TRUE_NATIVE_FULLSCREEN=c.HAS_IOS_FULLSCREEN=c.HAS_MS_NATIVE_FULLSCREEN=c.HAS_MOZ_NATIVE_FULLSCREEN=c.HAS_WEBKIT_NATIVE_FULLSCREEN=c.HAS_NATIVE_FULLSCREEN=c.SUPPORTS_NATIVE_HLS=c.SUPPORT_POINTER_EVENTS=c.HAS_MSE=c.IS_STOCK_ANDROID=c.IS_SAFARI=c.IS_FIREFOX=c.IS_CHROME=c.IS_EDGE=c.IS_IE=c.IS_ANDROID=c.IS_IOS=c.IS_IPHONE=c.IS_IPAD=c.UA=c.NAV=void 0;for(var e=a(3),f=d(e),g=a(2),h=d(g),i=a(6),j=d(i),k=c.NAV=f["default"].navigator,l=c.UA=k.userAgent.toLowerCase(),m=c.IS_IPAD=null!==l.match(/ipad/i),n=c.IS_IPHONE=null!==l.match(/iphone/i),o=(c.IS_IOS=n||m,c.IS_ANDROID=null!==l.match(/android/i)),p=c.IS_IE=k.appName.toLowerCase().includes("microsoft")||null!==k.appName.toLowerCase().match(/trident/gi),q=(c.IS_EDGE="msLaunchUri"in k&&!("documentMode"in h["default"])),r=c.IS_CHROME=null!==l.match(/chrome/gi),s=c.IS_FIREFOX=null!==l.match(/firefox/gi),t=c.IS_SAFARI=null!==l.match(/safari/gi)&&!r,u=c.IS_STOCK_ANDROID=null!==l.match(/^mozilla\/\d+\.\d+\s\(linux;\su;/gi),v=(c.HAS_MSE="MediaSource"in f["default"]),w=(c.SUPPORT_POINTER_EVENTS=function(){var a=h["default"].createElement("x"),b=h["default"].documentElement,c=f["default"].getComputedStyle;if(!("pointerEvents"in a.style))return!1;a.style.pointerEvents="auto",a.style.pointerEvents="x",b.appendChild(a);var d=c&&"auto"===c(a,"").pointerEvents;return a.remove(),!!d}()),x=["source","track","audio","video"],y=void 0,z=0,A=x.length;A>z;z++)y=h["default"].createElement(x[z]);var B=c.SUPPORTS_NATIVE_HLS=t||o&&(r||u)||p&&null!==l.match(/edge/gi),C=void 0!==y.webkitEnterFullscreen,D=void 0!==y.requestFullscreen;C&&l.match(/mac os x 10_5/i)&&(D=!1,C=!1);var E=void 0!==y.webkitRequestFullScreen,F=void 0!==y.mozRequestFullScreen,G=void 0!==y.msRequestFullscreen,H=E||F||G,I=H,J="",K=void 0,L=void 0,M=void 0;F?I=h["default"].mozFullScreenEnabled:G&&(I=h["default"].msFullscreenEnabled),r&&(C=!1),H&&(E?J="webkitfullscreenchange":F?J="mozfullscreenchange":G&&(J="MSFullscreenChange"),c.isFullScreen=K=function(){return F?h["default"].mozFullScreen:E?h["default"].webkitIsFullScreen:G?null!==h["default"].msFullscreenElement:void 0},c.requestFullScreen=L=function(a){E?a.webkitRequestFullScreen():F?a.mozRequestFullScreen():G&&a.msRequestFullscreen()},c.cancelFullScreen=M=function(){E?h["default"].webkitCancelFullScreen():F?h["default"].mozCancelFullScreen():G&&h["default"].msExitFullscreen()});var N=c.HAS_NATIVE_FULLSCREEN=D,O=c.HAS_WEBKIT_NATIVE_FULLSCREEN=E,P=c.HAS_MOZ_NATIVE_FULLSCREEN=F,Q=c.HAS_MS_NATIVE_FULLSCREEN=G,R=c.HAS_IOS_FULLSCREEN=C,S=c.HAS_TRUE_NATIVE_FULLSCREEN=H,T=c.HAS_NATIVE_FULLSCREEN_ENABLED=I,U=c.FULLSCREEN_EVENT_NAME=J;c.isFullScreen=K,c.requestFullScreen=L,c.cancelFullScreen=M,j["default"].Features=j["default"].Features||{},j["default"].Features.isiPad=m,j["default"].Features.isiPhone=n,j["default"].Features.isiOS=j["default"].Features.isiPhone||j["default"].Features.isiPad,j["default"].Features.isAndroid=o,j["default"].Features.isIE=p,j["default"].Features.isEdge=q,j["default"].Features.isChrome=r,j["default"].Features.isFirefox=s,j["default"].Features.isSafari=t,j["default"].Features.isStockAndroid=u,j["default"].Features.hasMSE=v,j["default"].Features.supportsNativeHLS=B,j["default"].Features.supportsPointerEvents=w,j["default"].Features.hasiOSFullScreen=R,j["default"].Features.hasNativeFullscreen=N,j["default"].Features.hasWebkitNativeFullScreen=O,j["default"].Features.hasMozNativeFullScreen=P,j["default"].Features.hasMsNativeFullScreen=Q,j["default"].Features.hasTrueNativeFullScreen=S,j["default"].Features.nativeFullScreenEnabled=T,j["default"].Features.fullScreenEventName=U,j["default"].Features.isFullScreen=K,j["default"].Features.requestFullScreen=L,j["default"].Features.cancelFullScreen=M},{2:2,3:3,6:6}],20:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){var b=a.getBoundingClientRect(),c=m["default"].pageXOffset||o["default"].documentElement.scrollLeft,d=m["default"].pageYOffset||o["default"].documentElement.scrollTop;return{top:b.top+d,left:b.left+c}}function f(a,b){u(a,b)?w(a,b):v(a,b)}function g(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:400,c=arguments[2];a.style.opacity||(a.style.opacity=1);var d=null;m["default"].requestAnimationFrame(function e(f){d=d||f;var g=f-d;a.style.opacity=parseFloat(1-g/b,2),g>b?c&&"function"==typeof c&&c():m["default"].requestAnimationFrame(e)})}function h(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:400,c=arguments[2];a.style.opacity||(a.style.opacity=0);var d=null;m["default"].requestAnimationFrame(function e(f){d=d||f;var g=f-d;a.style.opacity=parseFloat(g/b,2),g>b?c&&"function"==typeof c&&c():m["default"].requestAnimationFrame(e)})}function i(a,b){var c=[];a=a.parentNode.firstChild;do(!b||b(a))&&c.push(a);while(a=a.nextSibling);return c}function j(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)}function k(a,b,c,d){var e=m["default"].XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),f="application/x-www-form-urlencoded; charset=UTF-8",g=!1,h="*/".concat("*");switch(b){case"text":f="text/plain";break;case"json":f="application/json, text/javascript";break;case"html":f="text/html";break;case"xml":f="application/xml, text/xml"}f.includes("application/x-www-form-urlencoded")||(h=f+", */*; q=0.01"),e&&(e.open("GET",a,!0),e.setRequestHeader("Accept",h),e.onreadystatechange=function(){if(!g&&4===e.readyState)if(200===e.status){g=!0;var a=void 0;switch(b){case"json":a=JSON.parse(e.responseText);break;case"xml":a=e.responseXML;break;default:a=e.responseText}c(a)}else"function"==typeof d&&d(e.status)},e.send())}Object.defineProperty(c,"__esModule",{value:!0}),c.removeClass=c.addClass=c.hasClass=void 0,c.offset=e,c.toggleClass=f,c.fadeOut=g,c.fadeIn=h,c.siblings=i,c.visible=j,c.ajax=k;var l=a(3),m=d(l),n=a(2),o=d(n),p=a(6),q=d(p),r=void 0,s=void 0,t=void 0;"classList"in o["default"].documentElement?(r=function(a,b){return void 0!==a.classList&&a.classList.contains(b)},s=function(a,b){return a.classList.add(b)},t=function(a,b){return a.classList.remove(b)}):(r=function(a,b){return new RegExp("\\b"+b+"\\b").test(a.className)},s=function(a,b){u(a,b)||(a.className+=" "+b)},t=function(a,b){a.className=a.className.replace(new RegExp("\\b"+b+"\\b","g"),"")});var u=c.hasClass=r,v=c.addClass=s,w=c.removeClass=t;q["default"].Utils=q["default"].Utils||{},q["default"].Utils.offset=e,q["default"].Utils.hasClass=u,q["default"].Utils.addClass=v,q["default"].Utils.removeClass=w,q["default"].Utils.toggleClass=f,q["default"].Utils.fadeIn=h,q["default"].Utils.fadeOut=g,q["default"].Utils.siblings=i,q["default"].Utils.visible=j,q["default"].Utils.ajax=k},{2:2,3:3,6:6}],21:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if("string"!=typeof a)throw new Error("Argument passed must be a string");var b={"&":"&","<":"<",">":">",'"':"""};return a.replace(/[&<>"]/g,function(a){return b[a]})}function f(a,b){var c=this,d=arguments,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!1;if("function"!=typeof a)throw new Error("First argument must be a function");if("number"!=typeof b)throw new Error("Second argument must be a numeric value");var f=void 0;return function(){var g=c,h=d,i=function(){f=null,e||a.apply(g,h)},j=e&&!f;clearTimeout(f),f=setTimeout(i,b),j&&a.apply(g,h)}}function g(a){return Object.getOwnPropertyNames(a).length<=0}function h(a,b){var c=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/,d={d:[],w:[]};return(a||"").split(" ").forEach(function(a){var e=""+a+(b?"."+b:"");e.startsWith(".")?(d.d.push(e),d.w.push(e)):d[c.test(a)?"w":"d"].push(e)}),d.d=d.d.join(" "),d.w=d.w.join(" "),d}function i(a,b){if("string"!=typeof a)throw new Error("Event name must be a string");var c=a.match(/[a-z]+\.([a-z]+)/),d={target:b};return null!==c&&(a=c[0],d.namespace=c[1]),new window.CustomEvent(a,{detail:d})}function j(a,b){return!!(a&&b&&2&a.compareDocumentPosition(b))}function k(a){return"string"==typeof a}Object.defineProperty(c,"__esModule",{value:!0}),c.escapeHTML=e,c.debounce=f,c.isObjectEmpty=g,c.splitEvents=h,c.createEvent=i,c.isNodeAfter=j,c.isString=k;var l=a(6),m=d(l);m["default"].Utils=m["default"].Utils||{},m["default"].Utils.escapeHTML=e,m["default"].Utils.debounce=f,m["default"].Utils.isObjectEmpty=g,m["default"].Utils.splitEvents=h,m["default"].Utils.createEvent=i,m["default"].Utils.isNodeAfter=j,m["default"].Utils.isString=k},{6:6}],22:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");var b=document.createElement("div");return b.innerHTML='<a href="'+m.escapeHTML(a)+'">x</a>',b.firstChild.href}function f(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return a&&!b?h(a):g(b)}function g(a){if("string"!=typeof a)throw new Error("`type` argument must be a string");return a&&~a.indexOf(";")?a.substr(0,a.indexOf(";")):a}function h(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");for(var b=0,c=n.length;c>b;b++){var d=n[b](a);if(d)return d}var e=i(a),f=j(e),g="video/mp4";return f&&(["mp4","m4v","ogg","ogv","webm","flv","mpeg","mov"].includes(f)?g="video/"+f:["mp3","oga","wav","mid","midi"].includes(f)&&(g="audio/"+f)),g}function i(a){if("string"!=typeof a)throw new Error("`url` argument must be a string");var b=a.split("?")[0],c=b.split("\\").pop().split("/").pop();return c.indexOf(".")>-1?c.substring(c.lastIndexOf(".")+1):""}function j(a){if("string"!=typeof a)throw new Error("`extension` argument must be a string");switch(a){case"mp4":case"m4v":return"mp4";case"webm":case"webma":case"webmv":return"webm";case"ogg":case"oga":case"ogv":return"ogg";default:return a}}Object.defineProperty(c,"__esModule",{value:!0}),c.typeChecks=void 0,c.absolutizeUrl=e,c.formatType=f,c.getMimeFromType=g,c.getTypeFromFile=h,c.getExtension=i,c.normalizeExtension=j;var k=a(6),l=d(k),m=a(21),n=c.typeChecks=[];l["default"].Utils=l["default"].Utils||{},l["default"].Utils.typeChecks=n,l["default"].Utils.absolutizeUrl=e,l["default"].Utils.formatType=f,l["default"].Utils.getMimeFromType=g,l["default"].Utils.getTypeFromFile=h,l["default"].Utils.getExtension=i,l["default"].Utils.normalizeExtension=j},{21:21,6:6}],23:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}var e=a(2),f=d(e);!function(a){a.forEach(function(a){a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){this.parentNode.removeChild(this)}})})}([Element.prototype,CharacterData.prototype,DocumentType.prototype]),function(){function a(a,b){b=b||{bubbles:!1,cancelable:!1,detail:void 0};var c=f["default"].createEvent("CustomEvent");return c.initCustomEvent(a,b.bubbles,b.cancelable,b.detail),c}return"function"==typeof window.CustomEvent?!1:(a.prototype=window.Event.prototype,void(window.CustomEvent=a))}(),"function"!=typeof Object.assign&&(Object.assign=function(a){if(null===a||void 0===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1,d=arguments.length;d>c;c++){var e=arguments[c];if(null!==e)for(var f in e)Object.prototype.hasOwnProperty.call(e,f)&&(b[f]=e[f])}return b}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(a,b){if(null===this||void 0===this)throw new TypeError('"this" is null or not defined');var c=Object(this),d=c.length>>>0;if(0===d)return!1;for(var e=0|b,f=Math.max(e>=0?e:d-Math.abs(e),0);d>f;){if(c[f]===a)return!0;f++}return!1}}),String.prototype.includes||(String.prototype.includes=function(a,b){return"number"!=typeof b&&(b=0),b+a.length>this.length?!1:-1!==this.indexOf(a,b)}),String.prototype.startsWith||(String.prototype.startsWith=function(a,b){return b=b||0,this.substr(b,a.length)===a}),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(a){for(var b=(this.document||this.ownerDocument).querySelectorAll(a),c=b.length-1;--c>=0&&b.item(c)!==this;);return c>-1}),window.Element&&!Element.prototype.closest&&(Element.prototype.closest=function(a){var b=(this.document||this.ownerDocument).querySelectorAll(a),c=void 0,d=this;do for(c=b.length;--c>=0&&b.item(c)!==d;);while(0>c&&(d=d.parentElement));return d}),function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),d=Math.max(0,16-(c-a)),e=window.setTimeout(function(){b(c+d)},d);return a=c+d,e}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)})}()},{2:2}],24:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:25;return!(a%1===0)}function f(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:!1,c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!1,d=arguments.length>3&&void 0!==arguments[3]?arguments[3]:25,f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;a=!a||"number"!=typeof a||0>a?0:a;var g=Math.round(.066666*d),h=Math.round(d),i=24*Math.round(3600*d),j=Math.round(600*d),k=e(d)?";":":",l=void 0,m=void 0,n=void 0,o=void 0,p=Math.round(a*d);if(e(d)){0>p&&(p=i+p),p%=i;var q=Math.floor(p/j),r=p%j;p+=9*g*q,r>g&&(p+=g*Math.floor((r-g)/Math.round(60*h-g)));var s=Math.floor(p/h);l=Math.floor(Math.floor(s/60)/60),m=Math.floor(s/60)%60,n=c?s%60:(p/h%60).toFixed(f)}else l=Math.floor(a/3600)%24,m=Math.floor(a/60)%60,n=c?Math.floor(a%60):(a%60).toFixed(f);l=0>=l?0:l,m=0>=m?0:m,n=0>=n?0:n;var t=b||l>0?(10>l?"0"+l:l)+":":"";return t+=(10>m?"0"+m:m)+":",t+=""+(10>n?"0"+n:n),c&&(o=(p%h).toFixed(0),o=0>=o?0:o,t+=10>o?k+"0"+o:""+k+o),t}function g(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:25;if("string"!=typeof a)throw new TypeError("Time must be a string");if(a.indexOf(";")>0&&(a=a.replace(";",":")),!a.match(/\d{2}(\:\d{2}){0,3}/))throw new TypeError("Time code must have the format `00:00:00`");var c=a.split(":"),d=void 0,f=0,g=0,h=0,i=0,j=0,k=Math.round(.066666*b),l=Math.round(b),m=3600*l,n=60*l;switch(c.length){default:case 1:h=parseInt(c[0],10);break;case 2:g=parseInt(c[0],10),h=parseInt(c[1],10);break;case 3:f=parseInt(c[0],10),g=parseInt(c[1],10),h=parseInt(c[2],10);break;case 4:f=parseInt(c[0],10),g=parseInt(c[1],10),h=parseInt(c[2],10),i=parseInt(c[3],10)}return e(b)?(j=60*f+g,d=m*f+n*g+l*h+i-k*(j-Math.floor(j/10))):d=(m*f+n*g+b*h+i)/b,parseFloat(d.toFixed(3))}function h(a,b){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:25;a=!a||"number"!=typeof a||0>a?0:a;for(var d=Math.floor(a/3600)%24,e=Math.floor(a/60)%60,f=Math.floor(a%60),g=Math.floor((a%1*c).toFixed(3)),h=[[g,"f"],[f,"s"],[e,"m"],[d,"h"]],i=b.timeFormat,j=i[1]===i[0],k=j?2:1,l=i.length<k?i[k]:":",m=i[0],n=!1,o=0,p=h.length;p>o;o++)if(i.indexOf(h[o][1])>-1)n=!0;else if(n){for(var q=!1,r=o;p>r;r++)if(h[r][0]>0){q=!0;break}if(!q)break;j||(i=m+i),i=h[o][1]+l+i,j&&(i=h[o][1]+i),m=h[o][1]}b.currentTimeFormat=i}function i(a){if("string"!=typeof a)throw new TypeError("Argument must be a string value");a=a.replace(",",".");var b=a.indexOf(".")>-1?a.split(".")[1].length:0,c=0,d=1;a=a.split(":").reverse();for(var e=0,f=a.length;f>e;e++)d=1,e>0&&(d=Math.pow(60,e)),c+=Number(a[e])*d;return Number(c.toFixed(b))}Object.defineProperty(c,"__esModule",{value:!0}),c.isDropFrame=e,c.secondsToTimeCode=f,c.timeCodeToSeconds=g,c.calculateTimeFormat=h,c.convertSMPTEtoSeconds=i;var j=a(6),k=d(j);k["default"].Utils=k["default"].Utils||{},k["default"].Utils.secondsToTimeCode=f,k["default"].Utils.timeCodeToSeconds=g,k["default"].Utils.calculateTimeFormat=h,k["default"].Utils.convertSMPTEtoSeconds=i},{6:6}]},{},[23,5,4,14,18,17,15,16,8,9,10,11,12,13]); \ No newline at end of file diff --git a/lib/mejs/mejs-skins.css b/lib/mejs/mejs-skins.css deleted file mode 100644 index 5c27cf15..00000000 --- a/lib/mejs/mejs-skins.css +++ /dev/null @@ -1,289 +0,0 @@ -/* TED player */ -.mejs-container.mejs-ted { - -} -.mejs-ted .mejs-controls { - background: #eee; - height: 65px; -} - -.mejs-ted .mejs-button, -.mejs-ted .mejs-time { - position: absolute; - background: #ddd; -} -.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total { - background-color: none; - background: url(controls-ted.png) repeat-x 0 -52px; - height: 6px; -} -.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-buffering { - height: 6px; -} -.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded { - background-color: none; - background: url(controls-ted.png) repeat-x 0 -52px; - width: 0; - height: 6px; -} -.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current { - width: 0; - height: 6px; - background-color: none; - background: url(controls-ted.png) repeat-x 0 -59px; -} -.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle { - display: block; - margin: 0; - width: 14px; - height: 21px; - top: -7px; - border: 0; - background: url(controls-ted.png) no-repeat 0 0; -} -.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float { - display: none; -} -.mejs-ted .mejs-controls .mejs-playpause-button { - top: 29px; - left: 9px; - width: 49px; - height: 28px; -} -.mejs-ted .mejs-controls .mejs-playpause-button button { - width: 49px; - height: 28px; - background: url(controls-ted.png) no-repeat -50px -23px; - margin: 0; - padding: 0; -} -.mejs-ted .mejs-controls .mejs-pause button { - background-position: 0 -23px; -} - -.mejs-ted .mejs-controls .mejs-fullscreen-button { - top: 34px; - right: 9px; - width: 17px; - height: 15px; - background : none; -} -.mejs-ted .mejs-controls .mejs-fullscreen-button button { - width: 19px; - height: 17px; - background: transparent url(controls-ted.png) no-repeat 0 -66px; - margin: 0; - padding: 0; -} -.mejs-ted .mejs-controls .mejs-unfullscreen button { - background: transparent url(controls-ted.png) no-repeat -21px -66px; - margin: 0; - padding: 0; -} -.mejs-ted .mejs-controls .mejs-volume-button { - top: 30px; - right: 35px; - width: 24px; - height: 22px; -} -.mejs-ted .mejs-controls .mejs-mute button { - background: url(controls-ted.png) no-repeat -15px 0; - width: 24px; - height: 22px; - margin: 0; - padding: 0; -} -.mejs-ted .mejs-controls .mejs-unmute button { - background: url(controls-ted.png) no-repeat -40px 0; - width: 24px; - height: 22px; - margin: 0; - padding: 0; -} -.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-slider { - background: #fff; - border: solid 1px #aaa; - border-width: 1px 1px 0 1px; - width: 22px; - height: 65px; - top: -65px; -} -.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-total { - background: url(controls-ted.png) repeat-y -41px -66px; - left: 8px; - width: 6px; - height: 50px; -} -.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-current { - left: 8px; - width: 6px; - background: url(controls-ted.png) repeat-y -48px -66px; - height: 50px; -} - -.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-handle { - display: none; -} - -.mejs-ted .mejs-controls .mejs-time span { - color: #333; -} -.mejs-ted .mejs-controls .mejs-currenttime-container { - position: absolute; - top: 32px; - right: 100px; - border: solid 1px #999; - background: #fff; - color: #333; - padding-top: 2px; - border-radius: 3px; - color: #333; -} -.mejs-ted .mejs-controls .mejs-duration-container { - - position: absolute; - top: 32px; - right: 65px; - border: solid 1px #999; - background: #fff; - color: #333; - padding-top: 2px; - border-radius: 3px; - color: #333; -} - -.mejs-ted .mejs-controls .mejs-time button{ - color: #333; -} -.mejs-ted .mejs-controls .mejs-captions-button { - display: none; -} -/* END: TED player */ - - -/* WMP player */ -.mejs-container.mejs-wmp { - -} -.mejs-wmp .mejs-controls { - background: transparent url(controls-wmp-bg.png) center 16px no-repeat; - height: 65px; -} - -.mejs-wmp .mejs-button, -.mejs-wmp .mejs-time { - position: absolute; - background: transparent; -} -.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total { - background-color: transparent; - border: solid 1px #ccc; - height: 3px; -} -.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-buffering { - height: 3px; -} -.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded { - background-color: rgba(255,255,255,0.3); - width: 0; - height: 3px; -} -.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current { - width: 0; - height: 1px; - background-color: #014CB6; - border: solid 1px #7FC9FA; - border-width: 1px 0; - border-color: #7FC9FA #fff #619FF2 #fff; -} -.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle { - display: block; - margin: 0; - width: 16px; - height: 9px; - top: -3px; - border: 0; - background: url(controls-wmp.png) no-repeat 0 -80px; -} -.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float { - display: none; -} -.mejs-wmp .mejs-controls .mejs-playpause-button { - top: 10px; - left: 50%; - margin: 10px 0 0 -20px; - width: 40px; - height: 40px; - -} -.mejs-wmp .mejs-controls .mejs-playpause-button button { - width: 40px; - height: 40px; - background: url(controls-wmp.png) no-repeat 0 0; - margin: 0; - padding: 0; -} -.mejs-wmp .mejs-controls .mejs-pause button { - background-position: 0 -40px; -} - -.mejs-wmp .mejs-controls .mejs-currenttime-container { - position: absolute; - top: 25px; - left: 50%; - margin-left: -93px; -} -.mejs-wmp .mejs-controls .mejs-duration-container { - position: absolute; - top: 25px; - left: 50%; - margin-left: -58px; -} - - -.mejs-wmp .mejs-controls .mejs-volume-button { - top: 32px; - right: 50%; - margin-right: -55px; - width: 20px; - height: 15px; -} -.mejs-wmp .mejs-controls .mejs-volume-button button { - margin: 0; - padding: 0; - background: url(controls-wmp.png) no-repeat -42px -17px; - width: 20px; - height: 15px; -} -.mejs-wmp .mejs-controls .mejs-unmute button { - margin: 0; - padding: 0; - background: url(controls-wmp.png) no-repeat -42px 0; - width: 20px; - height: 15px; -} -.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider { - background: rgba(102,102,102,0.6); -} - -.mejs-wmp .mejs-controls .mejs-fullscreen-button { - top: 32px; - right: 50%; - margin-right: -82px; - width: 15px; - height: 14px; -} -.mejs-wmp .mejs-controls .mejs-fullscreen-button button { - margin: 0; - padding: 0; - background: url(controls-wmp.png) no-repeat -63px 0; - width: 15px; - height: 14px; -} -.mejs-wmp .mejs-controls .mejs-captions-button { - display: none; -} -/* END: WMP player */ - - - diff --git a/lib/mejs/silverlightmediaelement.xap b/lib/mejs/silverlightmediaelement.xap deleted file mode 100644 index 9d55c2e46ae51017ab91f61b05cf4f4838ab10ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12461 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 Y;npiigG2o9V37YT{69ou_}||D0@79*!2kdN diff --git a/modeles/video.html b/modeles/video.html index 4fae226d..fc60f135 100644 --- a/modeles/video.html +++ b/modeles/video.html @@ -15,10 +15,10 @@ data-id="[(#VAL{mejs-#ID_DOCUMENT}|concat{#ENV{skin}}|md5)]" data-mejsoptions='{"alwaysShowControls": true,"pluginPath":"[(#CHEMIN{lib/mejs/flashmediaelement.swf}|dirname)/]"[,"loop":(#ENV{loop}|?{true,false})],"videoWidth":"100%","videoHeight":"100%"[,"startVolume":"(#ENV{volume})"]}' width="100%" - height="100%" - poster="[(#LOGO_DOCUMENT{vignette}|image_reduire{#GET{largeur},0}|extraire_attribut{src})]" + height="100%"[ + poster="(#LOGO_DOCUMENT{vignette}|image_reduire{#GET{largeur},0}|extraire_attribut{src})"] controls="controls" - preload="none"[ + preload="auto"[ autoplay="autoplay"(#ENV{autoplay}|oui)] > <source type="[(#EXTENSION|in_array{#LISTE{mp4,webm,ogv}}|?{[(#MIME_TYPE|replace{application/,video/})],#MIME_TYPE})]" src="#FICHIER" /> @@ -42,6 +42,6 @@ [<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>] [<script>/*<!\[CDATA\[*/var mejspath='[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]',mejscss='[(#CHEMIN{lib/mejs/mediaelementplayer.min.css}|timestamp)]'; (#INCLURE{javascript/mejs-init.min.js})/*\]\]>*/</script>] -[(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|sinon{#CHEMIN{lib/mejs/mejs-skins.css}}|url_absolue_css})</style>]] +[(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|url_absolue_css})</style>]] </div> </BOUCLE_tous> \ No newline at end of file diff --git a/paquet.xml b/paquet.xml index 62ad77c8..cf4c4f4f 100644 --- a/paquet.xml +++ b/paquet.xml @@ -1,7 +1,7 @@ <paquet prefix="medias" categorie="multimedia" - version="2.17.8" + version="2.18.0" etat="stable" compatibilite="[3.2.0-dev;3.2.*]" logo="prive/themes/spip/images/portfolio-32.png" -- GitLab