summaryrefslogtreecommitdiff
path: root/www/external/videogular2.2.1
diff options
context:
space:
mode:
Diffstat (limited to 'www/external/videogular2.2.1')
-rw-r--r--www/external/videogular2.2.1/fonts/videogular.dev.svg37
-rw-r--r--www/external/videogular2.2.1/fonts/videogular.eotbin0 -> 2544 bytes
-rw-r--r--www/external/videogular2.2.1/fonts/videogular.svg37
-rw-r--r--www/external/videogular2.2.1/fonts/videogular.ttfbin0 -> 2380 bytes
-rw-r--r--www/external/videogular2.2.1/fonts/videogular.woffbin0 -> 1948 bytes
-rw-r--r--www/external/videogular2.2.1/vg-buffering.min.js1
-rw-r--r--www/external/videogular2.2.1/vg-controls.min.js1
-rw-r--r--www/external/videogular2.2.1/vg-overlay-play.min.js1
-rw-r--r--www/external/videogular2.2.1/videogular-cuepoints.min.css1
-rw-r--r--www/external/videogular2.2.1/videogular-cuepoints.min.js1
-rw-r--r--www/external/videogular2.2.1/videogular.min.css1
-rw-r--r--www/external/videogular2.2.1/videogular.min.js1
12 files changed, 81 insertions, 0 deletions
diff --git a/www/external/videogular2.2.1/fonts/videogular.dev.svg b/www/external/videogular2.2.1/fonts/videogular.dev.svg
new file mode 100644
index 00000000..7d6b86f8
--- /dev/null
+++ b/www/external/videogular2.2.1/fonts/videogular.dev.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG font generated by IcoMoon.
+<iconset grid="16"></iconset>
+</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="512" >
+<font-face units-per-em="512" ascent="480" descent="-32" />
+<missing-glyph horiz-adv-x="512" />
+<glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
+<glyph unicode="&#xe000;" d="M 96,416L 416,224L 96,32 z" data-tags="play, media control, audio" />
+<glyph unicode="&#xe001;" d="M 64,416L 224,416L 224,32L 64,32zM 288,416L 448,416L 448,32L 288,32z" data-tags="pause, media control, audio" />
+<glyph unicode="&#xe002;" d="M 445.020,18.98c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.373-9.372,24.568,0,33.941
+ C 471.868,103.771, 496.001,162.030, 496.001,224c0,61.969-24.133,120.229-67.952,164.049c-9.372,9.373-9.372,24.569,0,33.941
+ c 9.372,9.372, 24.569,9.372, 33.941,0c 52.885-52.886, 82.011-123.2, 82.011-197.99c0-74.791-29.126-145.104-82.011-197.99
+ C 457.304,21.323, 451.162,18.98, 445.020,18.98zM 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+ c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+ C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+ c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+ c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" horiz-adv-x="544" data-tags="volume-high, speaker, media control, audio" />
+<glyph unicode="&#xe003;" d="M 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+ c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+ C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+ c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+ c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" data-tags="volume-medium, speaker, media control, audio" />
+<glyph unicode="&#xe004;" d="M 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+ c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+ c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" data-tags="volume-low, speaker, media control, audio" />
+<glyph unicode="&#xe005;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" data-tags="volume-mute, speaker, media control, audio, mute" />
+<glyph unicode="&#xe006;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 ZM 480,170.426 L 480,128 L 437.574,128 L 384,181.574 L 330.426,128 L 288,128 L 288,170.426 L 341.574,224 L 288,277.574 L 288,320 L 330.426,320 L 384,266.426 L 437.574,320 L 480,320 L 480,277.574 L 426.426,224 Z" data-tags="volume-mute, speaker, media control, audio, mute" />
+<glyph unicode="&#xe007;" d="M 512,480 L 512,288 L 442.87,357.13 L 336.87,251.13 L 283.13,304.87 L 389.13,410.87 L 320,480 ZM 122.87,410.87 L 228.87,304.87 L 175.13,251.13 L 69.13,357.13 L 0,288 L 0,480 L 192,480 ZM 442.87,90.87 L 512,160 L 512-32 L 320-32 L 389.13,37.13 L 283.13,143.13 L 336.87,196.87 ZM 228.87,143.13 L 122.87,37.13 L 192-32 L 0-32 L 0,160 L 69.13,90.87 L 175.13,196.87 Z" data-tags="expand, enlarge, maximize, fullscreen" />
+<glyph unicode="&#xe008;" d="M 32,192 L 224,192 L 224,0 L 154.87,69.13 L 53.87-31.87 L 0.13,21.87 L 101.13,122.87 ZM 410.87,122.87 L 511.87,21.87 L 458.13-31.87 L 357.13,69.13 L 288,0 L 288,192 L 480,192 ZM 480,256 L 288,256 L 288,448 L 357.13,378.87 L 458.13,479.87 L 511.87,426.13 L 410.87,325.13 ZM 154.87,378.87 L 224,448 L 224,256 L 32,256 L 101.13,325.13 L 0.13,426.13 L 53.87,479.87 Z" data-tags="contract, minimize, shrink, collapse" />
+<glyph unicode="&#xe009;" d="M 512,288 L 320,288 L 391.765,359.765 C 355.5,396.028 307.285,416 256,416 C 204.715,416 156.5,396.028 120.235,359.765 C 83.972,323.5 64,275.285 64,224 C 64,172.715 83.972,124.5 120.235,88.235 C 156.5,51.972 204.715,32 256,32 C 307.285,32 355.5,51.972 391.764,88.236 C 394.792,91.263 397.694,94.382 400.492,97.57 L 448.652,55.429 C 401.729,1.846 332.82-32 256-32 C 114.615-32 0,82.615 0,224 C 0,365.385 114.615,480 256,480 C 326.693,480 390.684,451.337 437.008,405.008 L 512,480 L 512,288 Z" data-tags="spinner, loading, busy, wait, wheel, repeat" />
+<glyph unicode="&#x20;" horiz-adv-x="256" />
+</font></defs></svg> \ No newline at end of file
diff --git a/www/external/videogular2.2.1/fonts/videogular.eot b/www/external/videogular2.2.1/fonts/videogular.eot
new file mode 100644
index 00000000..cf6b47e2
--- /dev/null
+++ b/www/external/videogular2.2.1/fonts/videogular.eot
Binary files differ
diff --git a/www/external/videogular2.2.1/fonts/videogular.svg b/www/external/videogular2.2.1/fonts/videogular.svg
new file mode 100644
index 00000000..96d7b5cf
--- /dev/null
+++ b/www/external/videogular2.2.1/fonts/videogular.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG font generated by IcoMoon.
+<iconset grid="16"></iconset>
+</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="512" >
+<font-face units-per-em="512" ascent="480" descent="-32" />
+<missing-glyph horiz-adv-x="512" />
+<glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
+<glyph unicode="&#xe000;" d="M 96,416L 416,224L 96,32 z" />
+<glyph unicode="&#xe001;" d="M 64,416L 224,416L 224,32L 64,32zM 288,416L 448,416L 448,32L 288,32z" />
+<glyph unicode="&#xe002;" d="M 445.020,18.98c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.373-9.372,24.568,0,33.941
+ C 471.868,103.771, 496.001,162.030, 496.001,224c0,61.969-24.133,120.229-67.952,164.049c-9.372,9.373-9.372,24.569,0,33.941
+ c 9.372,9.372, 24.569,9.372, 33.941,0c 52.885-52.886, 82.011-123.2, 82.011-197.99c0-74.791-29.126-145.104-82.011-197.99
+ C 457.304,21.323, 451.162,18.98, 445.020,18.98zM 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+ c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+ C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+ c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+ c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" horiz-adv-x="544" />
+<glyph unicode="&#xe003;" d="M 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+ c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+ C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+ c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+ c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" />
+<glyph unicode="&#xe004;" d="M 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+ c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+ c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" />
+<glyph unicode="&#xe005;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" />
+<glyph unicode="&#xe006;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 ZM 480,170.426 L 480,128 L 437.574,128 L 384,181.574 L 330.426,128 L 288,128 L 288,170.426 L 341.574,224 L 288,277.574 L 288,320 L 330.426,320 L 384,266.426 L 437.574,320 L 480,320 L 480,277.574 L 426.426,224 Z" />
+<glyph unicode="&#xe007;" d="M 512,480 L 512,288 L 442.87,357.13 L 336.87,251.13 L 283.13,304.87 L 389.13,410.87 L 320,480 ZM 122.87,410.87 L 228.87,304.87 L 175.13,251.13 L 69.13,357.13 L 0,288 L 0,480 L 192,480 ZM 442.87,90.87 L 512,160 L 512-32 L 320-32 L 389.13,37.13 L 283.13,143.13 L 336.87,196.87 ZM 228.87,143.13 L 122.87,37.13 L 192-32 L 0-32 L 0,160 L 69.13,90.87 L 175.13,196.87 Z" />
+<glyph unicode="&#xe008;" d="M 32,192 L 224,192 L 224,0 L 154.87,69.13 L 53.87-31.87 L 0.13,21.87 L 101.13,122.87 ZM 410.87,122.87 L 511.87,21.87 L 458.13-31.87 L 357.13,69.13 L 288,0 L 288,192 L 480,192 ZM 480,256 L 288,256 L 288,448 L 357.13,378.87 L 458.13,479.87 L 511.87,426.13 L 410.87,325.13 ZM 154.87,378.87 L 224,448 L 224,256 L 32,256 L 101.13,325.13 L 0.13,426.13 L 53.87,479.87 Z" />
+<glyph unicode="&#xe009;" d="M 512,288 L 320,288 L 391.765,359.765 C 355.5,396.028 307.285,416 256,416 C 204.715,416 156.5,396.028 120.235,359.765 C 83.972,323.5 64,275.285 64,224 C 64,172.715 83.972,124.5 120.235,88.235 C 156.5,51.972 204.715,32 256,32 C 307.285,32 355.5,51.972 391.764,88.236 C 394.792,91.263 397.694,94.382 400.492,97.57 L 448.652,55.429 C 401.729,1.846 332.82-32 256-32 C 114.615-32 0,82.615 0,224 C 0,365.385 114.615,480 256,480 C 326.693,480 390.684,451.337 437.008,405.008 L 512,480 L 512,288 Z" />
+<glyph unicode="&#x20;" horiz-adv-x="256" />
+</font></defs></svg> \ No newline at end of file
diff --git a/www/external/videogular2.2.1/fonts/videogular.ttf b/www/external/videogular2.2.1/fonts/videogular.ttf
new file mode 100644
index 00000000..3837d8ec
--- /dev/null
+++ b/www/external/videogular2.2.1/fonts/videogular.ttf
Binary files differ
diff --git a/www/external/videogular2.2.1/fonts/videogular.woff b/www/external/videogular2.2.1/fonts/videogular.woff
new file mode 100644
index 00000000..0e08bdbb
--- /dev/null
+++ b/www/external/videogular2.2.1/fonts/videogular.woff
Binary files differ
diff --git a/www/external/videogular2.2.1/vg-buffering.min.js b/www/external/videogular2.2.1/vg-buffering.min.js
new file mode 100644
index 00000000..b0bb1ff8
--- /dev/null
+++ b/www/external/videogular2.2.1/vg-buffering.min.js
@@ -0,0 +1 @@
+"use strict";angular.module("com.2fdevs.videogular.plugins.buffering",[]).run(["$templateCache",function(a){a.put("vg-templates/vg-buffering",'<div class="bufferingContainer"> <div ng-class="spinnerClass" class="loadingSpinner"></div> </div>')}]).directive("vgBuffering",["VG_STATES","VG_UTILS",function(a,b){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-buffering"},link:function(c,d,e,f){c.showSpinner=function(){c.spinnerClass={stop:f.isBuffering},d.css("display","block")},c.hideSpinner=function(){c.spinnerClass={stop:f.isBuffering},d.css("display","none")},c.setState=function(a){a?c.showSpinner():c.hideSpinner()},c.onStateChange=function(b){b==a.STOP&&c.hideSpinner()},c.onPlayerReady=function(a){a&&c.hideSpinner()},c.showSpinner(),b.isMobileDevice()?c.hideSpinner():c.$watch(function(){return f.isReady},function(a,b){(1==f.isReady||a!=b)&&c.onPlayerReady(a)}),c.$watch(function(){return f.currentState},function(a,b){a!=b&&c.onStateChange(a)}),c.$watch(function(){return f.isBuffering},function(a,b){a!=b&&c.setState(a)})}}}]); \ No newline at end of file
diff --git a/www/external/videogular2.2.1/vg-controls.min.js b/www/external/videogular2.2.1/vg-controls.min.js
new file mode 100644
index 00000000..27d47e4a
--- /dev/null
+++ b/www/external/videogular2.2.1/vg-controls.min.js
@@ -0,0 +1 @@
+"use strict";angular.module("com.2fdevs.videogular.plugins.controls",[]).run(["$templateCache",function(a){a.put("vg-templates/vg-controls",'<div class="controls-container" ng-mousemove="onMouseMove()" ng-class="animationClass" ng-transclude></div>')}]).directive("vgControls",["$timeout","VG_STATES",function(a,b){return{restrict:"E",require:"^videogular",transclude:!0,templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-controls"},scope:{vgAutohide:"=?",vgAutohideTime:"=?"},link:function(c,d,e,f){var g,h=2e3;c.API=f,c.onMouseMove=function(){c.vgAutohide&&c.showControls()},c.setAutohide=function(d){d&&f.currentState==b.PLAY?g=a(c.hideControls,h):(c.animationClass="",a.cancel(g),c.showControls())},c.setAutohideTime=function(a){h=a},c.hideControls=function(){c.animationClass="hide-animation"},c.showControls=function(){c.animationClass="show-animation",a.cancel(g),c.vgAutohide&&f.currentState==b.PLAY&&(g=a(c.hideControls,h))},f.isConfig?c.$watch("API.config",function(){if(c.API.config){var a=c.API.config.plugins.controls.autohide||!1,b=c.API.config.plugins.controls.autohideTime||2e3;c.vgAutohide=a,c.vgAutohideTime=b,c.setAutohideTime(b),c.setAutohide(a)}}):(void 0!=c.vgAutohide&&c.$watch("vgAutohide",c.setAutohide),void 0!=c.vgAutohideTime&&c.$watch("vgAutohideTime",c.setAutohideTime)),c.$watch(function(){return f.currentState},function(a,b){c.vgAutohide&&c.showControls()})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-fullscreen-button",'<button class="iconButton" ng-click="onClickFullScreen()" ng-class="fullscreenIcon" aria-label="Toggle full screen" type="button"> </button>')}]).directive("vgFullscreenButton",[function(){return{restrict:"E",require:"^videogular",scope:{},templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-fullscreen-button"},link:function(a,b,c,d){a.onChangeFullScreen=function(b){a.fullscreenIcon={enter:!b,exit:b}},a.onClickFullScreen=function(){d.toggleFullScreen()},a.fullscreenIcon={enter:!0},a.$watch(function(){return d.isFullScreen},function(b,c){b!=c&&a.onChangeFullScreen(b)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-play-pause-button",'<button class="iconButton" ng-click="onClickPlayPause()" ng-class="playPauseIcon" aria-label="Play/Pause" type="button"></button>')}]).directive("vgPlayPauseButton",["VG_STATES",function(a){return{restrict:"E",require:"^videogular",scope:{},templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-play-pause-button"},link:function(b,c,d,e){b.setState=function(c){switch(c){case a.PLAY:b.playPauseIcon={pause:!0};break;case a.PAUSE:b.playPauseIcon={play:!0};break;case a.STOP:b.playPauseIcon={play:!0}}},b.onClickPlayPause=function(){e.playPause()},b.playPauseIcon={play:!0},b.$watch(function(){return e.currentState},function(a,c){b.setState(a)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-playback-button",'<button class="playbackValue iconButton" ng-click="onClickPlayback()">{{playback}}x</button>')}]).directive("vgPlaybackButton",[function(){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-playback-button"},scope:{vgSpeeds:"=?"},link:function(a,b,c,d){a.playback="1",a.setPlayback=function(b){a.playback=b,d.setPlayback(parseFloat(b))},a.onClickPlayback=function(){var b=a.vgSpeeds||["0.5","1","1.5","2"],c=b.indexOf(a.playback.toString())+1;c>=b.length?a.playback=b[0]:a.playback=b[c],a.setPlayback(a.playback)},a.$watch(function(){return d.playback},function(b,c){b!=c&&a.setPlayback(b)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").directive("vgScrubBarBuffer",[function(){return{restrict:"E",require:"^videogular",link:function(a,b,c,d){var e=0;a.onUpdateBuffer=function(a){"number"==typeof a&&d.totalTime?(e=100*(a/d.totalTime),b.css("width",e+"%")):b.css("width",0)},a.$watch(function(){return d.bufferEnd},function(b,c){a.onUpdateBuffer(b)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-scrub-bar-cue-points",'<div class="cue-point-timeline"><div ng-repeat="cuePoint in vgCuePoints" class="cue-point" ng-style="cuePoint.$$style"></div></div>')}]).directive("vgScrubBarCuePoints",[function(){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-scrub-bar-cue-points"},scope:{vgCuePoints:"="},link:function(a,b,c,d){a.onPlayerReady=function(){a.updateCuePoints(a.vgCuePoints)},a.updateCuePoints=function(a){var c;if(a){c=parseInt(b[0].clientWidth);for(var e=0,f=a.length;f>e;e++){var g=a[e].timeLapse.end>=0?a[e].timeLapse.end:a[e].timeLapse.start+1,h=1e3*(g-a[e].timeLapse.start),i=100*a[e].timeLapse.start/Math.round(d.totalTime/1e3)+"%",j=0;"number"==typeof h&&d.totalTime&&(j=100*h/d.totalTime+"%"),a[e].$$style={width:j,left:i}}}},a.$watch("vgCuePoints",a.updateCuePoints),a.$watch(function(){return d.totalTime},function(b,c){b>0&&a.onPlayerReady()})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").directive("vgScrubBarCurrentTime",[function(){return{restrict:"E",require:"^videogular",link:function(a,b,c,d){var e=0;a.onUpdateTime=function(a){"number"==typeof a&&d.totalTime?(e=100*(a/d.totalTime),b.css("width",e+"%")):b.css("width",0)},a.$watch(function(){return d.currentTime},function(b,c){a.onUpdateTime(b)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-scrub-bar-thumbnails",'<div class="vg-thumbnails" ng-show="thumbnails" ng-style="thumbnailContainer"><div class="image-thumbnail" ng-style="thumbnails"></div></div><div class="background"></div>')}]).directive("vgScrubBarThumbnails",["VG_UTILS",function(a){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-scrub-bar-thumbnails"},scope:{vgThumbnails:"="},link:function(b,c,d,e){var f=0,g=0,h=c[0].querySelector(".background"),i="string"==typeof b.vgThumbnails;b.thumbnails=!1,b.thumbnailContainer={},b.getOffset=function(a){for(var b=a.target,c=0;b&&!isNaN(b.offsetLeft);)c+=b.offsetLeft-b.scrollLeft,b=b.offsetParent;return a.clientX-c},b.onLoadThumbnails=function(a){f=a.currentTarget.naturalWidth,g=f/100},b.onLoadThumbnail=function(a){g=a.currentTarget.naturalWidth},b.updateThumbnails=function(a){var c=Math.round(100*a/(e.totalTime/1e3)),d=h.scrollWidth*c/100-g/2;if(i){var j=Math.round(f*c/100);b.thumbnailContainer={width:g+"px",left:d+"px"},b.thumbnails={"background-image":'url("'+b.vgThumbnails+'")',"background-position":-j+"px 0px"}}else{var k=e.totalTime/h.scrollWidth/1e3,l={start:Math.floor(a-k/2),end:Math.ceil(a)};if(l.start<0&&(l.start=0),l.end>e.totalTime&&(l.end=e.totalTime),b.thumbnailContainer={left:d+"px"},b.thumbnails={"background-image":"none"},b.vgThumbnails)for(var m=0,n=b.vgThumbnails.length;n>m;m++){var o=b.vgThumbnails[m];if(o.timeLapse.end>=0){if(l.start>=o.timeLapse.start&&(l.end<=o.timeLapse.end||l.end<=o.timeLapse.start)){b.thumbnails={"background-image":'url("'+o.params.thumbnail+'")'};break}}else if(o.timeLapse.start>=l.start&&o.timeLapse.start<=l.end){b.thumbnails={"background-image":'url("'+o.params.thumbnail+'")'};break}}}},b.onMouseMove=function(a){var c=Math.round(a.offsetX*e.mediaElement[0].duration/h.scrollWidth);b.updateThumbnails(c),b.$digest()},b.onTouchMove=function(a){var c=a.touches,d=b.getOffset(c[0]),f=Math.round(d*e.mediaElement[0].duration/h.scrollWidth);b.updateThumbnails(f),b.$digest()},b.onMouseLeave=function(a){b.thumbnails=!1,b.$digest()},b.onTouchLeave=function(a){b.thumbnails=!1,b.$digest()},b.onDestroy=function(){c.unbind("touchmove",b.onTouchMove),c.unbind("touchleave",b.onTouchLeave),c.unbind("touchend",b.onTouchLeave),c.unbind("mousemove",b.onMouseMove),c.unbind("mouseleave",b.onMouseLeave)};var j;i?(j=new Image,j.onload=b.onLoadThumbnails.bind(b),j.src=b.vgThumbnails):(j=new Image,j.onload=b.onLoadThumbnail.bind(b),j.src=b.vgThumbnails[0].params.thumbnail),a.isMobileDevice()?(c.bind("touchmove",b.onTouchMove),c.bind("touchleave",b.onTouchLeave),c.bind("touchend",b.onTouchLeave)):(c.bind("mousemove",b.onMouseMove),c.bind("mouseleave",b.onMouseLeave)),b.$on("destroy",b.onDestroy.bind(b))}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-scrub-bar",'<div role="slider" aria-valuemax="{{ariaTime(API.totalTime)}}" aria-valuenow="{{ariaTime(API.currentTime)}}" aria-valuemin="0" aria-label="Time scrub bar" tabindex="0" ng-keydown="onScrubBarKeyDown($event)"></div><div class="container" ng-transclude></div>')}]).directive("vgScrubBar",["VG_STATES","VG_UTILS",function(a,b){return{restrict:"E",require:"^videogular",transclude:!0,templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-scrub-bar"},scope:{vgThumbnails:"="},link:function(c,d,e,f){var g=!1,h=!1,i=!1,j=37,k=39,l=5,m=0,n=0,o=d[0].querySelector("div[role=slider]");if(c.thumbnails=!1,c.thumbnailContainer={},c.API=f,c.onLoadThumbnails=function(a){m=a.path[0].naturalWidth,n=m/100},c.ariaTime=function(a){return Math.round(a/1e3)},c.getOffset=function(a){for(var b=a.target,c=0;b&&!isNaN(b.offsetLeft);)c+=b.offsetLeft-b.scrollLeft,b=b.offsetParent;return a.clientX-c},c.onScrubBarTouchStart=function(a){var b=a.originalEvent||a,d=b.touches,e=c.getOffset(d[0]);g=!0,h&&(i=!0),f.pause(),f.seekTime(e*f.mediaElement[0].duration/o.scrollWidth),c.$digest()},c.onScrubBarTouchEnd=function(a){a.originalEvent||a;i&&(i=!1,f.play()),g=!1,c.$digest()},c.onScrubBarTouchMove=function(a){var b=a.originalEvent||a,d=b.touches,e=c.getOffset(d[0]);if(c.vgThumbnails&&c.vgThumbnails.length){var h=Math.round(e*f.mediaElement[0].duration/o.scrollWidth),i=Math.round(100*h/(f.totalTime/1e3));c.updateThumbnails(i)}g&&f.seekTime(e*f.mediaElement[0].duration/o.scrollWidth),c.$digest()},c.onScrubBarTouchLeave=function(a){g=!1,c.thumbnails=!1,c.$digest()},c.onScrubBarMouseDown=function(a){a=b.fixEventOffset(a),g=!0,h&&(i=!0),f.pause(),f.seekTime(a.offsetX*f.mediaElement[0].duration/o.scrollWidth),c.$digest()},c.onScrubBarMouseUp=function(a){i&&(i=!1,f.play()),g=!1,c.$digest()},c.onScrubBarMouseMove=function(a){if(c.vgThumbnails&&c.vgThumbnails.length){var d=Math.round(a.offsetX*f.mediaElement[0].duration/o.scrollWidth),e=Math.round(100*d/(f.totalTime/1e3));c.updateThumbnails(e)}g&&(a=b.fixEventOffset(a),f.seekTime(a.offsetX*f.mediaElement[0].duration/o.scrollWidth)),c.$digest()},c.onScrubBarMouseLeave=function(a){g=!1,c.thumbnails=!1,c.$digest()},c.onScrubBarKeyDown=function(a){var b=f.currentTime/f.totalTime*100;a.which===j||a.keyCode===j?(f.seekTime(b-l,!0),a.preventDefault()):(a.which===k||a.keyCode===k)&&(f.seekTime(b+l,!0),a.preventDefault())},c.updateThumbnails=function(a){var b=Math.round(m*a/100),d=o.scrollWidth*a/100-n/2;c.thumbnailContainer={width:n+"px",left:d+"px"},c.thumbnails={"background-image":'url("'+c.vgThumbnails+'")',"background-position":-b+"px 0px"}},c.setState=function(b){if(!g)switch(b){case a.PLAY:h=!0;break;case a.PAUSE:h=!1;break;case a.STOP:h=!1}},c.onDestroy=function(){d.unbind("touchstart",c.onScrubBarTouchStart),d.unbind("touchend",c.onScrubBarTouchEnd),d.unbind("touchmove",c.onScrubBarTouchMove),d.unbind("touchleave",c.onScrubBarTouchLeave),d.unbind("mousedown",c.onScrubBarMouseDown),d.unbind("mouseup",c.onScrubBarMouseUp),d.unbind("mousemove",c.onScrubBarMouseMove),d.unbind("mouseleave",c.onScrubBarMouseLeave)},c.$watch(function(){return f.currentState},function(a,b){a!=b&&c.setState(a)}),c.vgThumbnails){var p=new Image;p.onload=c.onLoadThumbnails.bind(c),p.src=c.vgThumbnails}b.isMobileDevice()?(d.bind("touchstart",c.onScrubBarTouchStart),d.bind("touchend",c.onScrubBarTouchEnd),d.bind("touchmove",c.onScrubBarTouchMove),d.bind("touchleave",c.onScrubBarTouchLeave)):(d.bind("mousedown",c.onScrubBarMouseDown),d.bind("mouseup",c.onScrubBarMouseUp),d.bind("mousemove",c.onScrubBarMouseMove),d.bind("mouseleave",c.onScrubBarMouseLeave)),c.$on("destroy",c.onDestroy.bind(c))}}}]),angular.module("com.2fdevs.videogular.plugins.controls").directive("vgTimeDisplay",[function(){return{require:"^videogular",restrict:"E",link:function(a,b,c,d){a.currentTime=d.currentTime,a.timeLeft=d.timeLeft,a.totalTime=d.totalTime,a.isLive=d.isLive,a.$watch(function(){return d.currentTime},function(b,c){a.currentTime=b}),a.$watch(function(){return d.timeLeft},function(b,c){a.timeLeft=b}),a.$watch(function(){return d.totalTime},function(b,c){a.totalTime=b}),a.$watch(function(){return d.isLive},function(b,c){a.isLive=b})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-mute-button",'<button type="button" class="iconButton" ng-class="muteIcon" ng-click="onClickMute()" ng-focus="onMuteButtonFocus()" ng-blur="onMuteButtonLoseFocus()" ng-mouseleave="onMuteButtonLeave()" ng-keydown="onMuteButtonKeyDown($event)" aria-label="Mute"></button>')}]).directive("vgMuteButton",[function(){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-mute-button"},link:function(a,b,c,d){var e=!1,f=38,g=40,h=.05;a.onClickMute=function(){e?a.currentVolume=a.defaultVolume:(a.currentVolume=0,a.muteIcon={mute:!0}),e=!e,d.setVolume(a.currentVolume)},a.onMuteButtonFocus=function(){a.volumeVisibility="visible"},a.onMuteButtonLoseFocus=function(){a.volumeVisibility="hidden"},a.onMuteButtonLeave=function(){document.activeElement.blur()},a.onMuteButtonKeyDown=function(a){var b,c=null!=d.volume?d.volume:1;a.which===f||a.keyCode===f?(b=c+h,b>1&&(b=1),d.setVolume(b),a.preventDefault()):(a.which===g||a.keyCode===g)&&(b=c-h,0>b&&(b=0),d.setVolume(b),a.preventDefault())},a.onSetVolume=function(b){a.currentVolume=b,e=0===a.currentVolume,e?b>0&&(a.defaultVolume=b):a.defaultVolume=b;var c=Math.round(100*b);0==c?a.muteIcon={mute:!0}:c>0&&25>c?a.muteIcon={level0:!0}:c>=25&&50>c?a.muteIcon={level1:!0}:c>=50&&75>c?a.muteIcon={level2:!0}:c>=75&&(a.muteIcon={level3:!0})},a.defaultVolume=1,a.currentVolume=a.defaultVolume,a.muteIcon={level3:!0},a.onSetVolume(d.volume),a.$watch(function(){return d.volume},function(b,c){b!=c&&a.onSetVolume(b)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").run(["$templateCache",function(a){a.put("vg-templates/vg-volume-bar",'<div class="verticalVolumeBar"> <div class="volumeBackground" ng-click="onClickVolume($event)" ng-mousedown="onMouseDownVolume()" ng-mouseup="onMouseUpVolume()" ng-mousemove="onMouseMoveVolume($event)" ng-mouseleave="onMouseLeaveVolume()"> <div class="volumeValue"></div> <div class="volumeClickArea"></div> </div> </div>')}]).directive("vgVolumeBar",["VG_UTILS",function(a){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-volume-bar"},link:function(b,c,d,e){var f=!1,g=angular.element(c[0].getElementsByClassName("volumeBackground")),h=angular.element(c[0].getElementsByClassName("volumeValue"));b.onClickVolume=function(b){b=a.fixEventOffset(b);var c=parseInt(g.prop("offsetHeight")),d=100*b.offsetY/c,f=1-d/100;e.setVolume(f)},b.onMouseDownVolume=function(){f=!0},b.onMouseUpVolume=function(){f=!1},b.onMouseLeaveVolume=function(){f=!1},b.onMouseMoveVolume=function(b){if(f){b=a.fixEventOffset(b);var c=parseInt(g.prop("offsetHeight")),d=100*b.offsetY/c,h=1-d/100;e.setVolume(h)}},b.updateVolumeView=function(a){a=100*a,h.css("height",a+"%"),h.css("top",100-a+"%")},b.onChangeVisibility=function(a){c.css("visibility",a)},c.css("visibility",b.volumeVisibility),b.$watch("volumeVisibility",b.onChangeVisibility),b.updateVolumeView(e.volume),b.$watch(function(){return e.volume},function(a,c){a!=c&&b.updateVolumeView(a)})}}}]),angular.module("com.2fdevs.videogular.plugins.controls").directive("vgVolume",["VG_UTILS",function(a){return{restrict:"E",link:function(b,c,d){b.onMouseOverVolume=function(){b.$evalAsync(function(){b.volumeVisibility="visible"})},b.onMouseLeaveVolume=function(){b.$evalAsync(function(){b.volumeVisibility="hidden"})},b.onDestroy=function(){c.unbind("mouseover",b.onScrubBarTouchStart),c.unbind("mouseleave",b.onScrubBarTouchEnd)},a.isMobileDevice()?c.css("display","none"):(b.volumeVisibility="hidden",c.bind("mouseover",b.onMouseOverVolume),c.bind("mouseleave",b.onMouseLeaveVolume)),b.$on("destroy",b.onDestroy.bind(b))}}}]); \ No newline at end of file
diff --git a/www/external/videogular2.2.1/vg-overlay-play.min.js b/www/external/videogular2.2.1/vg-overlay-play.min.js
new file mode 100644
index 00000000..8683a621
--- /dev/null
+++ b/www/external/videogular2.2.1/vg-overlay-play.min.js
@@ -0,0 +1 @@
+"use strict";angular.module("com.2fdevs.videogular.plugins.overlayplay",[]).run(["$templateCache",function(a){a.put("vg-templates/vg-overlay-play",'<div class="overlayPlayContainer" ng-click="onClickOverlayPlay()"> <div class="iconButton" ng-class="overlayPlayIcon"></div> </div>')}]).directive("vgOverlayPlay",["VG_STATES",function(a){return{restrict:"E",require:"^videogular",scope:{},templateUrl:function(a,b){return b.vgTemplate||"vg-templates/vg-overlay-play"},link:function(b,c,d,e){b.onChangeState=function(c){switch(c){case a.PLAY:b.overlayPlayIcon={};break;case a.PAUSE:b.overlayPlayIcon={play:!0};break;case a.STOP:b.overlayPlayIcon={play:!0}}},b.onClickOverlayPlay=function(a){e.playPause()},b.overlayPlayIcon={play:!0},b.$watch(function(){return e.currentState},function(a,c){b.onChangeState(a)})}}}]); \ No newline at end of file
diff --git a/www/external/videogular2.2.1/videogular-cuepoints.min.css b/www/external/videogular2.2.1/videogular-cuepoints.min.css
new file mode 100644
index 00000000..d82c9893
--- /dev/null
+++ b/www/external/videogular2.2.1/videogular-cuepoints.min.css
@@ -0,0 +1 @@
+videogular vg-cuepoints{position:relative;display:block;width:100%;height:0}videogular vg-cuepoints vg-cuepoint{position:absolute;top:-16px;display:block;width:2px;height:30px;background-color:red}
diff --git a/www/external/videogular2.2.1/videogular-cuepoints.min.js b/www/external/videogular2.2.1/videogular-cuepoints.min.js
new file mode 100644
index 00000000..ccb5e5c1
--- /dev/null
+++ b/www/external/videogular2.2.1/videogular-cuepoints.min.js
@@ -0,0 +1 @@
+!function(){"use strict";angular.module("uk.ac.soton.ecs.videogular.plugins.cuepoints",[]).directive("vgCuepoints",[function(){return{restrict:"E",require:"^videogular",templateUrl:function(e,t){return t.templateUrl||"videogular-cuepoints/cuepoints.html"},scope:{cuepoints:"=vgCuepointsConfig",theme:"=vgCuepointsTheme"},link:function(e,t,n,i){e.onCuepointClick=function(e){i.seekTime(e.time)},e.cuepointStyle=function(e){return{left:function(e){if(0===i.totalTime)return"-1000";var t=i.totalTime/1e3;return(100*e.time/t).toString()}(e)+"%"}},function(e){e&&angular.element(document).find("head").append("<link rel='stylesheet' href='"+e+"'>")}(e.theme)}}}]).run(["$templateCache",function(e){e.put("videogular-cuepoints/cuepoints.html",'<vg-cuepoint ng-repeat="cuepoint in cuepoints.points" ng-click="onCuepointClick(cuepoint)" ng-style="cuepointStyle(cuepoint)"></vg-cuepoint>')}])}();
diff --git a/www/external/videogular2.2.1/videogular.min.css b/www/external/videogular2.2.1/videogular.min.css
new file mode 100644
index 00000000..6fd8fcfc
--- /dev/null
+++ b/www/external/videogular2.2.1/videogular.min.css
@@ -0,0 +1 @@
+@font-face{font-family:videogular;src:url(fonts/videogular.eot);src:url(fonts/videogular.eot?#iefix) format("embedded-opentype"),url(fonts/videogular.woff) format("woff"),url(fonts/videogular.ttf) format("truetype"),url(fonts/videogular.svg#videogular) format("svg");font-weight:400;font-style:normal}videogular,[videogular]{width:100%;height:100%;position:relative;background-color:#000;display:block;flex-direction:column;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:moz-none;-ms-user-select:none;user-select:none}videogular button,[videogular] button{cursor:pointer}videogular.fullscreen,[videogular].fullscreen{position:fixed;left:0;top:0}videogular vg-media,[videogular] vg-media{width:100%;height:100%;max-width:100%;max-height:100%;display:block}videogular vg-media video,[videogular] vg-media video{width:100%;height:100%;max-width:100%;max-height:100%}videogular .iconButton,[videogular] .iconButton{color:#FFF;font-family:videogular;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;background:0 0;padding:6px;border:0}videogular .iconButton:focus,[videogular] .iconButton:focus{border:1px solid #fff}videogular vg-poster,[videogular] vg-poster{width:100%;height:100%;max-width:100%;max-height:100%;position:absolute;display:block;z-index:1;top:0;pointer-events:none}videogular vg-poster img,[videogular] vg-poster img{width:auto;height:auto;max-width:100%;max-height:100%;top:0;bottom:0;right:0;left:0;margin:auto;position:absolute}videogular vg-poster img.pause,videogular vg-poster img.play,[videogular] vg-poster img.pause,[videogular] vg-poster img.play{display:none}videogular vg-poster img.stop,[videogular] vg-poster img.stop{display:block}videogular vg-overlay-play,[videogular] vg-overlay-play{width:100%;height:100%;max-width:100%;max-height:100%;position:absolute;z-index:2;top:0}videogular vg-overlay-play .play:before,[videogular] vg-overlay-play .play:before{content:"\e000"}videogular vg-overlay-play .overlayPlayContainer,[videogular] vg-overlay-play .overlayPlayContainer{font-size:100px;width:100%;height:100%;max-width:100%;max-height:100%;position:absolute;display:table;cursor:pointer;zoom:1;filter:alpha(opacity=60);opacity:.6}videogular vg-overlay-play .overlayPlayContainer div,[videogular] vg-overlay-play .overlayPlayContainer div{vertical-align:middle;text-align:center;display:table-cell}videogular vg-controls,[videogular] vg-controls{width:100%;height:50px;display:block;position:absolute;z-index:3;bottom:0}videogular vg-controls .controls-container,[videogular] vg-controls .controls-container{width:100%;height:50px;background-color:rgba(0,0,0,.5);position:absolute;display:table;zoom:1}videogular vg-play-pause-button,[videogular] vg-play-pause-button{display:table-cell;width:50px;vertical-align:middle;text-align:center;cursor:pointer}videogular vg-time-display,[videogular] vg-time-display{color:#FFF;display:table-cell;font-family:Arial;font-size:18px;width:75px;vertical-align:middle;text-align:center;cursor:default}videogular .vgTimeDisplay,[videogular] .vgTimeDisplay{display:table-cell;font-family:Arial;font-size:18px;width:auto}videogular vg-scrub-bar,[videogular] vg-scrub-bar{width:auto;display:table-cell;cursor:pointer;vertical-align:middle;position:relative}videogular vg-scrub-bar [role=slider],[videogular] vg-scrub-bar [role=slider]{margin-top:24px;margin-bottom:24px;height:2px;background-color:#000;position:relative}videogular vg-scrub-bar .container,[videogular] vg-scrub-bar .container{position:absolute;width:100%;height:2px;top:24px;padding-left:0}videogular vg-scrub-bar :focus vg-scrub-bar-current-time,[videogular] vg-scrub-bar :focus vg-scrub-bar-current-time{border-right:6px #000 groove}videogular vg-scrub-bar-current-time,[videogular] vg-scrub-bar-current-time{position:absolute;background-color:#FFF;width:100%;height:100%;display:block;cursor:pointer}videogular vg-scrub-bar-buffer,[videogular] vg-scrub-bar-buffer{position:absolute;background-color:#FFF;width:100%;height:100%;display:block;cursor:pointer;zoom:1;filter:alpha(opacity=50);opacity:.5}videogular vg-scrub-bar-cue-points,[videogular] vg-scrub-bar-cue-points{width:100%;height:100%;display:block;position:absolute}videogular vg-scrub-bar-cue-points .cue-point-timeline,[videogular] vg-scrub-bar-cue-points .cue-point-timeline{color:#FFF;padding-top:3px}videogular vg-scrub-bar-cue-points .cue-point-timeline .cue-point,[videogular] vg-scrub-bar-cue-points .cue-point-timeline .cue-point{position:absolute;height:3px;background-color:#FFF}videogular vg-scrub-bar-thumbnails,[videogular] vg-scrub-bar-thumbnails{position:absolute;width:100%;height:100%;display:block;cursor:pointer;bottom:24px;z-index:1}videogular vg-scrub-bar-thumbnails .vg-thumbnails,[videogular] vg-scrub-bar-thumbnails .vg-thumbnails{position:absolute;top:-20px;margin-top:-40px;width:80px;height:60px;overflow:hidden}videogular vg-scrub-bar-thumbnails .vg-thumbnails .image-thumbnail,[videogular] vg-scrub-bar-thumbnails .vg-thumbnails .image-thumbnail{height:60px;background-repeat:no-repeat}videogular vg-scrub-bar-thumbnails .background,[videogular] vg-scrub-bar-thumbnails .background{width:100%;height:50px}videogular vg-playback-button,[videogular] vg-playback-button{display:table-cell;width:50px;vertical-align:middle;text-align:center;cursor:pointer}videogular vg-volume,[videogular] vg-volume{display:table-cell;width:50px;vertical-align:middle;text-align:center;cursor:pointer}videogular vg-volume-bar,[videogular] vg-volume-bar{width:50px;height:100px;top:-100px;margin-left:-25px;vertical-align:middle;text-align:center;position:absolute;cursor:pointer}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){videogular vg-volume-bar,[videogular] vg-volume-bar{zoom:1;filter:alpha(opacity=50);opacity:.5}}videogular vg-fullscreen-button,[videogular] vg-fullscreen-button{display:table-cell;width:50px;vertical-align:middle;text-align:center;cursor:pointer}videogular vg-volume-bar .verticalVolumeBar,[videogular] vg-volume-bar .verticalVolumeBar{width:50px;height:100px;background-color:#000;position:absolute}videogular vg-volume-bar .volumeBackground,[videogular] vg-volume-bar .volumeBackground{width:20px;height:70px;left:15px;top:15px;background-color:#222;position:absolute}videogular vg-volume-bar .volumeValue,[videogular] vg-volume-bar .volumeValue{width:20px;height:100%;background-color:#FFF;position:absolute}videogular vg-volume-bar .volumeClickArea,[videogular] vg-volume-bar .volumeClickArea{width:20px;height:100%;position:absolute}videogular vg-controls .hide-animation,[videogular] vg-controls .hide-animation{animation:hideControlsAnimationFrames ease-out .5s;animation-iteration-count:1;animation-fill-mode:forwards;-webkit-animation:hideControlsAnimationFrames ease-out .5s;-webkit-animation-iteration-count:1;-webkit-animation-fill-mode:forwards;-moz-animation:hideControlsAnimationFrames ease-out .5s;-moz-animation-iteration-count:1;-moz-animation-fill-mode:forwards;-o-animation:hideControlsAnimationFrames ease-out .5s;-o-animation-iteration-count:1;-o-animation-fill-mode:forwards;-ms-animation:hideControlsAnimationFrames ease-out .5s;-ms-animation-iteration-count:1;-ms-animation-fill-mode:forwards}@keyframes hideControlsAnimationFrames{0%{opacity:.5}100%{opacity:0}}@-moz-keyframes hideControlsAnimationFrames{0%{opacity:.5}100%{opacity:0}}@-webkit-keyframes hideControlsAnimationFrames{0%{opacity:.5}100%{opacity:0}}@-o-keyframes hideControlsAnimationFrames{0%{opacity:.5}100%{opacity:0}}@-ms-keyframes hideControlsAnimationFrames{0%{opacity:.5}100%{opacity:0}}videogular vg-controls .show-animation,[videogular] vg-controls .show-animation{animation:showControlsAnimationFrames ease-out .5s;animation-iteration-count:1;animation-fill-mode:forwards;-webkit-animation:showControlsAnimationFrames ease-out .5s;-webkit-animation-iteration-count:1;-webkit-animation-fill-mode:forwards;-moz-animation:showControlsAnimationFrames ease-out .5s;-moz-animation-iteration-count:1;-moz-animation-fill-mode:forwards;-o-animation:showControlsAnimationFrames ease-out .5s;-o-animation-iteration-count:1;-o-animation-fill-mode:forwards;-ms-animation:showControlsAnimationFrames ease-out .5s;-ms-animation-iteration-count:1;-ms-animation-fill-mode:forwards}@keyframes showControlsAnimationFrames{0%{background-color:transparent}100%{background-color:rgba(0,0,0,.5)}}@-moz-keyframes showControlsAnimationFrames{0%{background-color:transparent}100%{background-color:rgba(0,0,0,.5)}}@-webkit-keyframes showControlsAnimationFrames{0%{background-color:transparent}100%{background-color:rgba(0,0,0,.5)}}@-o-keyframes showControlsAnimationFrames{0%{background-color:transparent}100%{background-color:rgba(0,0,0,.5)}}@-ms-keyframes showControlsAnimationFrames{0%{background-color:transparent}100%{background-color:rgba(0,0,0,.5)}}videogular vg-play-pause-button .play:before,[videogular] vg-play-pause-button .play:before{content:"\e000"}videogular vg-play-pause-button .pause:before,[videogular] vg-play-pause-button .pause:before{content:"\e001"}videogular vg-mute-button,[videogular] vg-mute-button{width:50px;display:block}videogular vg-mute-button .level3:before,[videogular] vg-mute-button .level3:before{content:"\e002"}videogular vg-mute-button .level2:before,[videogular] vg-mute-button .level2:before{content:"\e003"}videogular vg-mute-button .level1:before,[videogular] vg-mute-button .level1:before{content:"\e004"}videogular vg-mute-button .level0:before,[videogular] vg-mute-button .level0:before{content:"\e005"}videogular vg-mute-button .mute:before,[videogular] vg-mute-button .mute:before{content:"\e006"}videogular vg-fullscreen-button .enter:before,[videogular] vg-fullscreen-button .enter:before{content:"\e007"}videogular vg-fullscreen-button .exit:before,[videogular] vg-fullscreen-button .exit:before{content:"\e008"}videogular vg-buffering,[videogular] vg-buffering{width:100%;height:100%;position:absolute;z-index:4;top:0}videogular vg-buffering .bufferingContainer,[videogular] vg-buffering .bufferingContainer{width:100%;position:absolute;cursor:pointer;top:50%;margin-top:-50px;zoom:1;filter:alpha(opacity=60);opacity:.6}videogular vg-buffering .loadingSpinner,[videogular] vg-buffering .loadingSpinner{background-color:transparent;border:5px solid #fff;opacity:.9;border-top:5px solid transparent;border-left:5px solid transparent;border-radius:50px;box-shadow:0 0 35px #FFF;width:50px;height:50px;margin:0 auto;-moz-animation:spin .5s infinite linear;-webkit-animation:spin .5s infinite linear}videogular vg-buffering .loadingSpinner .stop,[videogular] vg-buffering .loadingSpinner .stop{-webkit-animation-play-state:paused;-moz-animation-play-state:paused}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(360deg)}}@-moz-keyframes spinoff{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(-360deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@-webkit-keyframes spinoff{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(-360deg)}}videogular vg-ima-ads,[videogular] vg-ima-ads{width:100%;height:100%;position:absolute;z-index:5;top:0;display:none} \ No newline at end of file
diff --git a/www/external/videogular2.2.1/videogular.min.js b/www/external/videogular2.2.1/videogular.min.js
new file mode 100644
index 00000000..b93202cc
--- /dev/null
+++ b/www/external/videogular2.2.1/videogular.min.js
@@ -0,0 +1 @@
+"use strict";angular.module("com.2fdevs.videogular",["ngSanitize"]).run(["$templateCache",function(a){a.put("vg-templates/vg-media-video","<video></video>"),a.put("vg-templates/vg-media-audio","<audio></audio>"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e})}]),angular.module("com.2fdevs.videogular").constant("VG_STATES",{PLAY:"play",PAUSE:"pause",STOP:"stop"}).constant("VG_VOLUME_KEY","videogularVolume"),angular.module("com.2fdevs.videogular").controller("vgController",["$scope","$window","vgConfigLoader","vgFullscreen","VG_UTILS","VG_STATES","VG_VOLUME_KEY",function(a,b,c,d,e,f,g){function h(a,b){return angular.isDefined(a)?"true"===a.toString():!!b}var i=null,j=!1,k=!1,l=!1,m=!1,n=null;this.videogularElement=null,this.clearMedia=function(){this.mediaElement[0].src="",this.mediaElement[0].removeEventListener("canplay",this.onCanPlay.bind(this),!1),this.mediaElement[0].removeEventListener("loadedmetadata",this.onLoadMetaData.bind(this),!1),this.mediaElement[0].removeEventListener("waiting",this.onStartBuffering.bind(this),!1),this.mediaElement[0].removeEventListener("ended",this.onComplete.bind(this),!1),this.mediaElement[0].removeEventListener("playing",this.onStartPlaying.bind(this),!1),this.mediaElement[0].removeEventListener("play",this.onPlay.bind(this),!1),this.mediaElement[0].removeEventListener("pause",this.onPause.bind(this),!1),this.mediaElement[0].removeEventListener("volumechange",this.onVolumeChange.bind(this),!1),this.mediaElement[0].removeEventListener("playbackchange",this.onPlaybackChange.bind(this),!1),this.mediaElement[0].removeEventListener("timeupdate",this.onUpdateTime.bind(this),!1),this.mediaElement[0].removeEventListener("progress",this.onProgress.bind(this),!1),this.mediaElement[0].removeEventListener("seeking",this.onSeeking.bind(this),!1),this.mediaElement[0].removeEventListener("seeked",this.onSeeked.bind(this),!1),this.mediaElement[0].removeEventListener("error",this.onVideoError.bind(this),!1)},this.onRouteChange=function(){(void 0===this.clearMediaOnNavigate||this.clearMediaOnNavigate===!0)&&this.clearMedia()},this.onCanPlay=function(b){this.isBuffering=!1,a.$parent.$digest(a.vgCanPlay({$event:b})),!l&&(this.startTime>0||0===this.startTime)&&(this.seekTime(this.startTime),l=!0)},this.onVideoReady=function(){this.isReady=!0,this.autoPlay=a.vgAutoPlay,this.playsInline=a.vgPlaysInline,this.nativeFullscreen=h(a.vgNativeFullscreen,!0),this.cuePoints=a.vgCuePoints,this.startTime=a.vgStartTime,this.virtualClipDuration=a.vgVirtualClipDuration,this.clearMediaOnNavigate=h(a.vgClearMediaOnNavigate,!0),this.currentState=f.STOP,k=!0,m=this.startTime>=0&&this.virtualClipDuration>0,e.supportsLocalStorage()&&this.setVolume(parseFloat(b.localStorage.getItem(g)||"1")),a.vgConfig?c.loadConfig(a.vgConfig).then(this.onLoadConfig.bind(this)):a.vgPlayerReady({$API:this})},this.onLoadConfig=function(b){this.config=b,a.vgTheme=this.config.theme,a.vgAutoPlay=this.config.autoPlay,a.vgPlaysInline=this.config.playsInline,a.vgNativeFullscreen=this.config.nativeFullscreen,a.vgCuePoints=this.config.cuePoints,a.vgClearMediaOnNavigate=this.config.clearMediaOnNavigate,a.vgStartTime=this.config.startTime,a.vgVirtualClipDuration=this.config.virtualClipDuration,m=a.vgStartTime>=0&&a.vgVirtualClipDuration>0,a.vgPlayerReady({$API:this})},this.onLoadMetaData=function(a){this.isBuffering=!1,this.onUpdateTime(a)},this.onProgress=function(b){this.updateBuffer(b),a.$parent.$digest()},this.updateBuffer=function(a){var b=a.target.buffered;b&&b.length&&(this.buffered=b,this.bufferEnd=1e3*b.end(b.length-1),this.bufferEnd>this.totalTime&&(this.bufferEnd=this.totalTime))},this.onUpdateTime=function(b){var c=1e3*b.target.currentTime,d=this.activeSource&&angular.isDefined(this.activeSource.isLive);this.updateBuffer(b),b.target.duration!=1/0&&null!=b.target.duration&&void 0!=b.target.duration&&1.7976931348623157e308!=b.target.duration?(m?l&&(b.target.currentTime<this.startTime||b.target.currentTime-this.startTime>this.virtualClipDuration)?this.onComplete():(this.currentTime=Math.max(0,c-1e3*this.startTime),this.totalTime=1e3*this.virtualClipDuration,this.timeLeft=1e3*this.virtualClipDuration-this.currentTime):(this.currentTime=c,this.totalTime=1e3*b.target.duration,this.timeLeft=1e3*(b.target.duration-b.target.currentTime)),this.isLive=!1):(this.currentTime=c,this.isLive=!0),d&&(this.isLive=!!this.activeSource.isLive);var e=m?this.currentTime/1e3:b.target.currentTime,f=m?this.totalTime/1e3:b.target.duration;this.cuePoints&&this.checkCuePoints(e),a.vgUpdateTime({$currentTime:e,$duration:f}),"$apply"!=a.$$phase&&"$digest"!=a.$$phase&&a.$parent.$digest()},this.checkCuePoints=function(a){for(var b in this.cuePoints)for(var c=0,d=this.cuePoints[b].length;d>c;c++){var e=this.cuePoints[b][c],f=parseInt(a,10),g=parseInt(e.timeLapse.start,10);e.timeLapse.end||(e.timeLapse.end=e.timeLapse.start+1),a<e.timeLapse.end&&(e.$$isCompleted=!1),e.$$isDirty||f!==g||"function"!=typeof e.onEnter||(e.onEnter(a,e.timeLapse,e.params),e.$$isDirty=!0),a>e.timeLapse.start?(a<e.timeLapse.end&&(e.onUpdate&&e.onUpdate(a,e.timeLapse,e.params),e.$$isDirty||"function"!=typeof e.onEnter||e.onEnter(a,e.timeLapse,e.params)),a>=e.timeLapse.end&&e.onComplete&&!e.$$isCompleted&&(e.$$isCompleted=!0,e.onComplete(a,e.timeLapse,e.params)),e.$$isDirty=!0):(e.onLeave&&e.$$isDirty&&e.onLeave(a,e.timeLapse,e.params),e.$$isDirty=!1)}},this.onPlay=function(){this.setState(f.PLAY),a.$parent.$digest()},this.onPause=function(){var b=m?this.currentTime:this.mediaElement[0].currentTime;0==b?this.setState(f.STOP):this.setState(f.PAUSE),a.$parent.$digest()},this.onVolumeChange=function(){this.volume=this.mediaElement[0].volume,a.$parent.$digest()},this.onPlaybackChange=function(){this.playback=this.mediaElement[0].playbackRate,a.$parent.$digest()},this.onSeeking=function(b){a.vgSeeking({$currentTime:b.target.currentTime,$duration:b.target.duration})},this.onSeeked=function(b){a.vgSeeked({$currentTime:b.target.currentTime,$duration:b.target.duration})},this.seekTime=function(a,b){if(!Number.isFinite(a))throw new TypeError("Expecting a finite number value.");var c;if(b)m?(a=Math.max(0,Math.min(a,100)),c=a*this.virtualClipDuration/100,this.mediaElement[0].currentTime=this.startTime+c):(c=a*this.mediaElement[0].duration/100,this.mediaElement[0].currentTime=c);else if(m){var d=a/this.mediaElement[0].duration;c=l?this.virtualClipDuration*d:0,this.mediaElement[0].currentTime=l?this.startTime+c:this.startTime}else c=a,this.mediaElement[0].currentTime=c;this.currentTime=1e3*c},this.playPause=function(){this.mediaElement[0].paused?this.play():this.pause()},this.setState=function(b){return b&&b!=this.currentState&&(a.vgUpdateState({$state:b}),this.currentState=b),this.currentState},this.play=function(){var a=this.mediaElement[0];!n&&a.paused&&(n=a.play(),n&&n.then&&n["catch"]&&n.then(function(){n=null})["catch"](function(){}),this.setState(f.PLAY))},this.pause=function(){var a=this.mediaElement[0];n?n.then(function(){a.pause()}):a.pause(),this.setState(f.PAUSE)},this.stop=function(){try{this.mediaElement[0].pause();var a=m?this.startTime:0;this.mediaElement[0].currentTime=a,this.currentTime=a,this.buffered=[],this.bufferEnd=0,this.setState(f.STOP)}catch(b){return b}},this.toggleFullScreen=function(){d.isAvailable&&this.nativeFullscreen?this.isFullScreen?e.isMobileDevice()||d.exit():e.isMobileDevice()?e.isiOSDevice()?k?this.enterElementInFullScreen(this.mediaElement[0]):(j=!0,this.play()):this.enterElementInFullScreen(this.mediaElement[0]):this.enterElementInFullScreen(this.videogularElement[0]):(this.isFullScreen?(this.videogularElement.removeClass("fullscreen"),this.videogularElement.css("z-index","auto")):(this.videogularElement.addClass("fullscreen"),this.videogularElement.css("z-index",e.getZIndex())),this.isFullScreen=!this.isFullScreen)},this.enterElementInFullScreen=function(a){d.request(a)},this.changeSource=function(b){this.activeSource=b,angular.isDefined(b.isLive)&&(this.isLive=!!b.isLive),a.vgChangeSource({$source:b})},this.setVolume=function(c){c=Math.max(Math.min(c,1),0),a.vgUpdateVolume({$volume:c}),this.mediaElement[0].volume=c,this.volume=c,e.supportsLocalStorage()&&b.localStorage.setItem(g,c.toString())},this.setPlayback=function(b){a.vgUpdatePlayback({$playBack:b}),this.mediaElement[0].playbackRate=b,this.playback=b},this.updateTheme=function(a){var b,c,d=document.getElementsByTagName("link");if(i)for(b=0,c=d.length;c>b;b++)if(d[b].outerHTML.indexOf(i)>=0){d[b].parentNode.removeChild(d[b]);break}if(a){var e=angular.element(document).find("head"),f=!1;for(b=0,c=d.length;c>b&&!(f=d[b].outerHTML.indexOf(a)>=0);b++);f||e.append("<link rel='stylesheet' href='"+a+"'>"),i=a}},this.onStartBuffering=function(b){this.isBuffering=!0,a.$parent.$digest()},this.onStartPlaying=function(b){this.isBuffering=!1,a.$parent.$digest()},this.onComplete=function(b){a.vgComplete(),this.setState(f.STOP),this.isCompleted=!0,m&&this.stop(),a.$parent.$digest()},this.onVideoError=function(b){a.vgError({$event:b})},this.addListeners=function(){this.mediaElement[0].addEventListener("canplay",this.onCanPlay.bind(this),!1),this.mediaElement[0].addEventListener("loadedmetadata",this.onLoadMetaData.bind(this),!1),this.mediaElement[0].addEventListener("waiting",this.onStartBuffering.bind(this),!1),this.mediaElement[0].addEventListener("ended",this.onComplete.bind(this),!1),this.mediaElement[0].addEventListener("playing",this.onStartPlaying.bind(this),!1),this.mediaElement[0].addEventListener("play",this.onPlay.bind(this),!1),this.mediaElement[0].addEventListener("pause",this.onPause.bind(this),!1),this.mediaElement[0].addEventListener("volumechange",this.onVolumeChange.bind(this),!1),this.mediaElement[0].addEventListener("playbackchange",this.onPlaybackChange.bind(this),!1),this.mediaElement[0].addEventListener("timeupdate",this.onUpdateTime.bind(this),!1),this.mediaElement[0].addEventListener("progress",this.onProgress.bind(this),!1),this.mediaElement[0].addEventListener("seeking",this.onSeeking.bind(this),!1),this.mediaElement[0].addEventListener("seeked",this.onSeeked.bind(this),!1),this.mediaElement[0].addEventListener("error",this.onVideoError.bind(this),!1)},this.init=function(){this.isReady=!1,this.isCompleted=!1,this.buffered=[],this.bufferEnd=0,this.currentTime=0,this.totalTime=0,this.timeLeft=0,this.isLive=!1,this.isFullScreen=!1,this.playback=1,this.isConfig=void 0!=a.vgConfig,this.mediaElement=[{play:function(){},pause:function(){},stop:function(){},addEventListener:function(){},removeEventListener:function(){}}],d.isAvailable&&(this.isFullScreen=d.isFullScreen()),this.updateTheme(a.vgTheme),this.addBindings(),d.isAvailable&&document.addEventListener(d.onchange,this.onFullScreenChange.bind(this))},this.onUpdateTheme=function(a){this.updateTheme(a)},this.onUpdateAutoPlay=function(a){a&&!this.autoPlay&&(this.autoPlay=a,this.play(this))},this.onUpdateStartTime=function(a){if(a&&a!=this.startTime){this.mediaElement[0].currentTime=a,this.startTime=a,m=this.startTime>=0&&this.virtualClipDuration>0;var b={target:this.mediaElement[0]};this.onUpdateTime(b,!0)}},this.onUpdateVirtualClipDuration=function(a){if(a&&a!=this.virtualClipDuration){this.virtualClipDuration=a,m=this.startTime>=0&&this.virtualClipDuration>0;var b={target:this.mediaElement[0]};this.onUpdateTime(b,!0)}},this.onUpdatePlaysInline=function(a){this.playsInline=a},this.onUpdateNativeFullscreen=function(a){this.nativeFullscreen=h(a,!0)},this.onUpdateCuePoints=function(a){this.cuePoints=a,this.checkCuePoints(this.currentTime/1e3)},this.onUpdateClearMediaOnNavigate=function(a){this.clearMediaOnNavigate=h(a,!0)},this.addBindings=function(){a.$watch("vgTheme",this.onUpdateTheme.bind(this)),a.$watch("vgAutoPlay",this.onUpdateAutoPlay.bind(this)),a.$watch("vgStartTime",this.onUpdateStartTime.bind(this)),a.$watch("vgVirtualClipDuration",this.onUpdateVirtualClipDuration.bind(this)),a.$watch("vgPlaysInline",this.onUpdatePlaysInline.bind(this)),a.$watch("vgNativeFullscreen",this.onUpdateNativeFullscreen.bind(this)),a.$watch("vgCuePoints",this.onUpdateCuePoints.bind(this)),a.$watch("vgClearMediaOnNavigate",this.onUpdateClearMediaOnNavigate.bind(this))},this.onFullScreenChange=function(b){this.isFullScreen=d.isFullScreen(),a.$parent.$digest()},a.$on("$destroy",this.clearMedia.bind(this)),a.$on("$routeChangeStart",this.onRouteChange.bind(this)),this.init()}]),angular.module("com.2fdevs.videogular").directive("vgCrossorigin",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setCrossorigin=function(a){a?d.mediaElement.attr("crossorigin",a):d.mediaElement.removeAttr("crossorigin")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setCrossorigin(d.config.crossorigin)}):a.$watch(c.vgCrossorigin,function(b,c){e&&b==c||!b?a.setCrossorigin():(e=b,a.setCrossorigin(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgLoop",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setLoop=function(a){a?d.mediaElement.attr("loop",a):d.mediaElement.removeAttr("loop")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setLoop(d.config.loop)}):a.$watch(c.vgLoop,function(b,c){e&&b==c||!b?a.setLoop():(e=b,a.setLoop(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgMedia",["$timeout","$window","VG_UTILS","VG_STATES",function(a,b,c,d){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){var c=b.vgType||"video";return b.vgTemplate||"vg-templates/vg-media-"+c},scope:{vgNativePlayBlacklist:"=?",vgSrc:"=?",vgType:"=?"},link:function(e,f,g,h){function i(a){h.mediaElement.attr({src:a.src,type:a.type}),h.changeSource(a)}function j(a){var c=b.navigator.userAgent;return a&&angular.isArray(e.vgNativePlayBlacklist)?e.vgNativePlayBlacklist.reduce(function(b,d){return b||angular.isFunction(d)&&d(a,c)},!1):!1}var k;g.vgType&&"video"!==g.vgType?g.vgType="audio":g.vgType="video",e.onChangeSource=function(a,b){k&&a==b||!a||(k=a,h.currentState!==d.PLAY&&(h.currentState=d.STOP),h.sources=k,e.changeSource())},e.changeSource=function(){var b="",d=!1,e=angular.isArray(k)?k:[k],f=e.length?e[0]:null;if(h.mediaElement[0].canPlayType)for(var g=0,l=k.length;l>g;g++){var m=k[g];if(m&&!j(m)&&(b=h.mediaElement[0].canPlayType(m.type),"maybe"==b||"probably"==b)){d=!0,i(m);break}}else f&&!j(f)&&(d=!0,i(f));d?(c.isMobileDevice()&&h.mediaElement[0].load(),a(function(){!h.autoPlay||!c.isCordova()&&c.isMobileDevice()||h.play()})):h.onVideoError()},h.mediaElement=f.find(g.vgType),h.sources=e.vgSrc,h.addListeners(),h.onVideoReady(),e.$watch("vgSrc",e.onChangeSource),e.$watch(function(){return h.sources},e.onChangeSource),e.$watch(function(){return h.playsInline},function(a,b){a?(h.mediaElement.attr("webkit-playsinline",""),h.mediaElement.attr("playsinline","")):(h.mediaElement.removeAttr("webkit-playsinline"),h.mediaElement.removeAttr("playsinline"))}),h.isConfig&&e.$watch(function(){return h.config},function(){h.config&&(e.vgSrc=h.config.sources)})}}}]),angular.module("com.2fdevs.videogular").directive("vgNativeControls",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setControls=function(a){a?d.mediaElement.attr("controls",a):d.mediaElement.removeAttr("controls")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setControls(d.config.controls)}):a.$watch(c.vgNativeControls,function(b,c){e&&b==c||!b?a.setControls():(e=b,a.setControls(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgPreload",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setPreload=function(a){a?d.mediaElement.attr("preload",a):d.mediaElement.removeAttr("preload")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setPreload(d.config.preload)}):a.$watch(c.vgPreload,function(b,c){e&&b==c||!b?a.setPreload():(e=b,a.setPreload(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgTracks",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e,f,g,h=!1;a.onLoadMetaData=function(){h=!0,a.updateTracks()},a.updateTracks=function(){var b=d.mediaElement.children();for(f=0,g=b.length;g>f;f++)b[f].remove&&b[f].remove();if(e)for(f=0,g=e.length;g>f;f++){var c=document.createElement("track");for(var h in e[f])c[h]=e[f][h];c.addEventListener("load",a.onLoadTrack.bind(a,c)),d.mediaElement[0].appendChild(c)}},a.onLoadTrack=function(b){b["default"]?b.mode="showing":b.mode="hidden";for(var c=0,e=d.mediaElement[0].textTracks.length;e>c;c++)b.label==d.mediaElement[0].textTracks[c].label&&(b["default"]?d.mediaElement[0].textTracks[c].mode="showing":d.mediaElement[0].textTracks[c].mode="disabled");b.removeEventListener("load",a.onLoadTrack.bind(a,b))},a.setTracks=function(b){e=b,d.tracks=b,h?a.updateTracks():d.mediaElement[0].addEventListener("loadedmetadata",a.onLoadMetaData.bind(a),!1)},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setTracks(d.config.tracks)}):a.$watch(c.vgTracks,function(b,c){e&&b==c||a.setTracks(b)},!0)}}}}]),angular.module("com.2fdevs.videogular").directive("videogular",[function(){return{restrict:"EA",scope:{vgTheme:"=?",vgAutoPlay:"=?",vgStartTime:"=?",vgVirtualClipDuration:"=?",vgPlaysInline:"=?",vgNativeFullscreen:"=?",vgClearMediaOnNavigate:"=?",vgCuePoints:"=?",vgConfig:"@",vgCanPlay:"&",vgComplete:"&",vgUpdateVolume:"&",vgUpdatePlayback:"&",vgUpdateTime:"&",vgUpdateState:"&",vgPlayerReady:"&",vgChangeSource:"&",vgSeeking:"&",vgSeeked:"&",vgError:"&"},controller:"vgController",controllerAs:"API",link:{pre:function(a,b,c,d){d.videogularElement=angular.element(b)}}}}]),angular.module("com.2fdevs.videogular").service("vgConfigLoader",["$http","$q","$sce",function(a,b,c){this.loadConfig=function(d){var e=b.defer();return a({method:"GET",url:d}).then(function(a){for(var b=a.data,d=0,f=b.sources.length;f>d;d++)b.sources[d].src=c.trustAsResourceUrl(b.sources[d].src);e.resolve(b)},function(){e.reject()}),e.promise}}]),angular.module("com.2fdevs.videogular").service("vgFullscreen",["VG_UTILS",function(a){function b(){var a=!1;return a=c?null!=document[d.element]||c.webkitDisplayingFullscreen:null!=document[d.element]}var c,d=null,e={w3:{enabled:"fullscreenEnabled",element:"fullscreenElement",request:"requestFullscreen",exit:"exitFullscreen",onchange:"fullscreenchange",onerror:"fullscreenerror"},newWebkit:{enabled:"webkitFullscreenEnabled",element:"webkitFullscreenElement",request:"webkitRequestFullscreen",exit:"webkitExitFullscreen",onchange:"webkitfullscreenchange",onerror:"webkitfullscreenerror"},oldWebkit:{enabled:"webkitIsFullScreen",element:"webkitCurrentFullScreenElement",request:"webkitRequestFullScreen",exit:"webkitCancelFullScreen",onchange:"webkitfullscreenchange",onerror:"webkitfullscreenerror"},moz:{enabled:"mozFullScreen",element:"mozFullScreenElement",request:"mozRequestFullScreen",exit:"mozCancelFullScreen",onchange:"mozfullscreenchange",onerror:"mozfullscreenerror"},ios:{enabled:"webkitFullscreenEnabled",element:"webkitFullscreenElement",request:"webkitEnterFullscreen",exit:"webkitExitFullscreen",onchange:"webkitfullscreenchange",onerror:"webkitfullscreenerror"},ms:{enabled:"msFullscreenEnabled",element:"msFullscreenElement",request:"msRequestFullscreen",exit:"msExitFullscreen",onchange:"MSFullscreenChange",onerror:"MSFullscreenError"}};for(var f in e)if(e[f].enabled in document){d=e[f];break}a.isiOSDevice()&&(d=e.ios),this.isAvailable=null!=d,d&&(this.onchange=d.onchange,this.onerror=d.onerror,this.isFullScreen=b,this.exit=function(){document[d.exit]()},this.request=function(a){c=a,c[d.request]()})}]),angular.module("com.2fdevs.videogular").service("VG_UTILS",["$window",function(a){this.fixEventOffset=function(a){var b=navigator.userAgent.match(/Firefox\/(\d+)/i);if(b&&Number.parseInt(b.pop())<39){var c=a.currentTarget.currentStyle||window.getComputedStyle(a.target,null),d=parseInt(c.borderLeftWidth,10),e=parseInt(c.borderTopWidth,10),f=a.currentTarget.getBoundingClientRect(),g=a.clientX-d-f.left,h=a.clientY-e-f.top;a.offsetX=g,a.offsetY=h}return a},this.getZIndex=function(){for(var a,b=1,c=document.getElementsByTagName("*"),d=0,e=c.length;e>d;d++)a=parseInt(window.getComputedStyle(c[d])["z-index"]),a>b&&(b=a+1);return b},this.isMobileDevice=function(){return"undefined"!=typeof window.orientation||-1!==navigator.userAgent.indexOf("IEMobile")},this.isiOSDevice=function(){return navigator.userAgent.match(/ip(hone|ad|od)/i)&&!navigator.userAgent.match(/(iemobile)[\/\s]?([\w\.]*)/i)},this.isCordova=function(){return-1===document.URL.indexOf("http://")&&-1===document.URL.indexOf("https://")},this.supportsLocalStorage=function(){var b="videogular-test-key";try{var c=a.sessionStorage;return c.setItem(b,"1"),c.removeItem(b),"localStorage"in a&&null!==a.localStorage}catch(d){return!1}}}]); \ No newline at end of file