webshims-rails 1.14.3 → 1.14.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +4 -0
  4. data/vendor/assets/javascripts/webshims/polyfiller.js +141 -139
  5. data/vendor/assets/javascripts/webshims/shims/color-picker.js +1 -3
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +22 -33
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +76 -73
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +73 -61
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +37 -41
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +36 -40
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +7 -7
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +23 -32
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +36 -57
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +73 -61
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +611 -4604
  16. data/vendor/assets/javascripts/webshims/shims/combos/2.js +27 -47
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +61 -31
  18. data/vendor/assets/javascripts/webshims/shims/combos/22.js +24 -16
  19. data/vendor/assets/javascripts/webshims/shims/combos/23.js +13 -25
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +40 -27
  21. data/vendor/assets/javascripts/webshims/shims/combos/27.js +167 -166
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +11 -12
  23. data/vendor/assets/javascripts/webshims/shims/combos/29.js +5 -5
  24. data/vendor/assets/javascripts/webshims/shims/combos/3.js +14 -22
  25. data/vendor/assets/javascripts/webshims/shims/combos/30.js +16 -24
  26. data/vendor/assets/javascripts/webshims/shims/combos/31.js +14 -22
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +2 -2
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +27 -28
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +5 -14
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +78 -66
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +80 -68
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +29 -49
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +27 -47
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +78 -75
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +42 -29
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +116 -40
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +112 -38
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +3 -12
  39. data/vendor/assets/javascripts/webshims/shims/es5.js +4 -4
  40. data/vendor/assets/javascripts/webshims/shims/es6.js +1887 -0
  41. data/vendor/assets/javascripts/webshims/shims/form-core.js +9 -8
  42. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +2 -2
  43. data/vendor/assets/javascripts/webshims/shims/form-inputmode.js +52 -0
  44. data/vendor/assets/javascripts/webshims/shims/form-message.js +2 -2
  45. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +4 -5
  46. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +73 -61
  47. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +7 -8
  48. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +164 -163
  49. data/vendor/assets/javascripts/webshims/shims/form-validation.js +121 -144
  50. data/vendor/assets/javascripts/webshims/shims/jme/_icons.scss +3 -0
  51. data/vendor/assets/javascripts/webshims/shims/jme/alternate-media.js +184 -0
  52. data/vendor/assets/javascripts/webshims/shims/jme/{b.js → base.js} +38 -27
  53. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +129 -39
  54. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +145 -44
  55. data/vendor/assets/javascripts/webshims/shims/jme/jme.eot +0 -0
  56. data/vendor/assets/javascripts/webshims/shims/jme/jme.svg +0 -0
  57. data/vendor/assets/javascripts/webshims/shims/jme/jme.ttf +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/jme/jme.woff +0 -0
  59. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +448 -90
  60. data/vendor/assets/javascripts/webshims/shims/jme/{c.js → mediacontrols.js} +74 -11
  61. data/vendor/assets/javascripts/webshims/shims/jme/{p.js → playlist.js} +4 -2
  62. data/vendor/assets/javascripts/webshims/shims/matchMedia.js +122 -0
  63. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +12 -24
  64. data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +1 -1
  65. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +37 -15
  66. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +3 -3
  67. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +4 -5
  68. data/vendor/assets/javascripts/webshims/shims/picture.js +13 -54
  69. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +13 -20
  70. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +24 -18
  71. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +32 -10
  72. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +43 -47
  73. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +30 -18
  74. data/vendor/assets/javascripts/webshims/shims/styles/transparent.png +0 -0
  75. data/vendor/assets/javascripts/webshims/shims/styles/widget.eot +0 -0
  76. data/vendor/assets/javascripts/webshims/shims/styles/widget.svg +0 -0
  77. data/vendor/assets/javascripts/webshims/shims/styles/widget.ttf +0 -0
  78. data/vendor/assets/javascripts/webshims/shims/styles/widget.woff +0 -0
  79. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/shims/swfmini.js +1 -1
  81. data/vendor/assets/javascripts/webshims/shims/track-ui.js +4 -5
  82. data/vendor/assets/javascripts/webshims/shims/track.js +24 -16
  83. metadata +9 -8
  84. data/vendor/assets/javascripts/webshims/shims/combos/19.js +0 -4745
  85. data/vendor/assets/javascripts/webshims/shims/combos/20.js +0 -4522
  86. data/vendor/assets/javascripts/webshims/shims/combos/32.js +0 -2443
  87. data/vendor/assets/javascripts/webshims/shims/combos/comboinfo.json +0 -1
@@ -1,4 +1,4 @@
1
- webshims.register('jme', function($, webshims, window, doc, undefined){
1
+ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undefined){
2
2
  "use strict";
3
3
  var plugins = $.jme.plugins;
4
4
  var pseudoClasses = 'pseudoClasses';
@@ -24,77 +24,88 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
24
24
  var className = (track.kind == 'caption') ? 'caption-type' : 'subtitle-type';
25
25
  var lang = track.language;
26
26
  lang = (lang) ? ' <span class="track-lang">'+ lang +'</span>' : '';
27
- return '<li class="'+ className +'" role="presentation"><button role="menuitemcheckbox" type="button">'+ track.label + lang +'</button></li>';
27
+ return '<li class="'+ className +'" role="presentation"><button role="menuitemcheckbox" type="button" tabindex="-1">'+ track.label + lang +'</button></li>';
28
28
  })
29
29
  ;
30
- return '<div><ul>' + items.join('') +'</ul></div>';
30
+ return '<div><ul role="presentation">' + items.join('') +'</ul></div>';
31
31
  };
32
32
 
33
33
 
34
- $.fn.wsTouchClick = (function(){
35
- var supportsTouchaction = ('touchAction' in document.documentElement.style);
36
- var addTouch = !supportsTouchaction && ('ontouchstart' in window) && document.addEventListener;
37
- return function(target, handler){
38
- var touchData, touchEnd, touchStart;
34
+ if(!$.fn.wsTouchClick){
39
35
 
40
- if(addTouch){
41
-
42
- touchEnd = function(e){
43
- var ret, touch;
44
- e = e.originalEvent || {};
45
- $(this).off('touchend touchcancel', touchEnd);
46
- var changedTouches = e.changedTouches || e.touches;
47
- if(e.type == 'touchcancel' || !touchData || !changedTouches || changedTouches.length != 1){
48
- return;
36
+ $.fn.wsTouchClick = (function(){
37
+ var supportsTouchaction = ('touchAction' in document.documentElement.style);
38
+ var addTouch = !supportsTouchaction && ('ontouchstart' in window) && document.addEventListener;
39
+ return function(target, handler){
40
+ var touchData, touchEnd, touchStart, stopClick, allowClick;
41
+ var runHandler = function(){
42
+ if(!stopClick){
43
+ return handler.apply(this, arguments);
49
44
  }
45
+ };
46
+ if(addTouch){
47
+ allowClick = function(){
48
+ stopClick = false;
49
+ };
50
+ touchEnd = function(e){
51
+ var ret, touch;
52
+ e = e.originalEvent || {};
53
+ $(this).off('touchend touchcancel', touchEnd);
54
+ var changedTouches = e.changedTouches || e.touches;
55
+ if(e.type == 'touchcancel' || !touchData || !changedTouches || changedTouches.length != 1){
56
+ return;
57
+ }
50
58
 
51
- touch = changedTouches[0];
52
- if(Math.abs(touchData.x - touch.pageX) > 40 || Math.abs(touchData.y - touch.pageY) > 40 || Date.now() - touchData.now > 300){
53
- return;
54
- }
55
- e.preventDefault();
56
- ret = handler.apply(this, arguments);
59
+ touch = changedTouches[0];
60
+ if(Math.abs(touchData.x - touch.pageX) > 40 || Math.abs(touchData.y - touch.pageY) > 40 || Date.now() - touchData.now > 300){
61
+ return;
62
+ }
57
63
 
58
- return ret;
59
- };
64
+ e.preventDefault();
65
+ stopClick = true;
66
+ setTimeout(allowClick, 400);
60
67
 
61
- touchStart = function(e){
62
- var touch, elemTarget;
68
+ ret = handler.apply(this, arguments);
63
69
 
70
+ return ret;
71
+ };
64
72
 
65
- if((!e || e.touches.length != 1)){
66
- return;
67
- }
68
- touch = e.touches[0];
69
- elemTarget = target ? $(touch.target).closest(target) : $(this);
70
- if(!elemTarget.length){
71
- return;
72
- }
73
- touchData = {
74
- x: touch.pageX,
75
- y: touch.pageY,
76
- now: Date.now()
73
+ touchStart = function(e){
74
+ var touch, elemTarget;
75
+ if((!e || e.touches.length != 1)){
76
+ return;
77
+ }
78
+ touch = e.touches[0];
79
+ elemTarget = target ? $(touch.target).closest(target) : $(this);
80
+ if(!elemTarget.length){
81
+ return;
82
+ }
83
+ touchData = {
84
+ x: touch.pageX,
85
+ y: touch.pageY,
86
+ now: Date.now()
87
+ };
88
+ elemTarget.on('touchend touchcancel', touchEnd);
77
89
  };
78
- elemTarget.on('touchend touchcancel', touchEnd);
79
- };
80
90
 
81
- this.each(function(){
82
- this.addEventListener('touchstart', touchStart, true);
83
- });
84
- } else if(supportsTouchaction){
85
- this.css('touch-action', 'manipulation');
86
- }
91
+ this.each(function(){
92
+ this.addEventListener('touchstart', touchStart, true);
93
+ });
94
+ } else if(supportsTouchaction){
95
+ this.css('touch-action', 'manipulation');
96
+ }
87
97
 
88
- if($.isFunction(target)){
89
- handler = target;
90
- target = false;
91
- this.on('click', handler);
92
- } else {
93
- this.on('click', target, handler);
94
- }
95
- return this;
96
- };
97
- })();
98
+ if($.isFunction(target)){
99
+ handler = target;
100
+ target = false;
101
+ this.on('click', runHandler);
102
+ } else {
103
+ this.on('click', target, runHandler);
104
+ }
105
+ return this;
106
+ };
107
+ })();
108
+ }
98
109
 
99
110
 
100
111
  function createGetSetHandler(fns){
@@ -231,14 +242,18 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
231
242
  stopFocus = true;
232
243
  clearTimeout(focusTimer);
233
244
  if(markedFocus && specialUnStop[e.type] && e.target.className.indexOf('ws-a11y-focus') != -1){
234
- delay = 0;
245
+ delay = 1;
235
246
  }
236
247
  focusTimer = setTimeout(unStop, delay);
237
248
  },
238
249
  focusin: function(e){
239
- if(!stopFocus && e.originalEvent){
240
- markedFocus = true;
241
- $(e.target).addClass('ws-a11y-focus');
250
+ if(!stopFocus && e.originalEvent && ($.prop(e.target, 'tabIndex') > -1 || $.attr(e.target, 'role'))){
251
+ setTimeout(function(){
252
+ if(!stopFocus){
253
+ markedFocus = true;
254
+ $(e.target).addClass('ws-a11y-focus');
255
+ }
256
+ }, 20);
242
257
  }
243
258
  },
244
259
  focusout: function(e){
@@ -389,17 +404,18 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
389
404
  var widgetLeft = (control.offset() || {left: 0}).left;
390
405
  var widgetWidth = control.innerWidth();
391
406
  var posLeft = function(x){
392
- var perc = (x - widgetLeft) / widgetWidth * 100;
393
- timeShow
394
- .html(media.jmeFn('formatTime', duration * perc / 100))
395
- .css({left: perc+'%'})
396
- ;
407
+ var perc = ((x - widgetLeft) / widgetWidth * 100);
408
+ var marginLeft = -(timeShow.outerWidth() / 2);
409
+ timeShow[0].innerHTML = media.jmeFn('formatTime', duration * perc / 100);
410
+
411
+ timeShow[0].style.left = perc+'%';
412
+ timeShow[0].style.marginLeft = marginLeft+'px';
397
413
  };
398
414
 
399
415
  $.fn.rangeUI.normalizeTouch(e);
400
416
  setTimeout(function(){
401
- posLeft(e.pageX);
402
417
  timeShow.addClass('show-time-select');
418
+ posLeft(e.pageX);
403
419
  });
404
420
  if(document.addEventListener){
405
421
  document.addEventListener('touchend', hideTime, true);
@@ -528,6 +544,114 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
528
544
  updateControl();
529
545
  }
530
546
  },
547
+ chapters: {
548
+ _create: function(control, media, base){
549
+ var plugin = this;
550
+ webshims.ready('track', function(){
551
+ var menuObj, wasPlayed, hasTrack, preloadTimer, $bar;
552
+ var timedPreload = function(){
553
+ clearTimeout(preloadTimer);
554
+ preloadTimer = setTimeout(setPreload, 999);
555
+ };
556
+ var setPreload = function(){
557
+ var preload;
558
+ if(hasTrack && !media.prop('readyState')){
559
+ preload = media.attr('preload');
560
+ if(preload != 'auto'){
561
+ preload = 'auto';
562
+ media.prop('preload', preload);
563
+ }
564
+ }
565
+ };
566
+ var createMenuButton = function(){
567
+ if(menuObj){return;}
568
+ menuObj = new $.jme.ButtonMenu(control, '<div class="mediamenu chapter-menu" />', function(e, button){
569
+ var paused = media.prop('paused');
570
+ var readyState = media.prop('readyState');
571
+ if(!wasPlayed || readyState < 2){
572
+ media.play();
573
+ if(paused){
574
+ media.pause();
575
+ }
576
+ }
577
+ if(readyState < 2){
578
+ setTimeout(function(){
579
+ media.prop('currentTime', $(button).data('starttime'));
580
+ }, 99);
581
+ }
582
+
583
+ if(readyState){
584
+ media.prop('currentTime', $(button).data('starttime'));
585
+ }
586
+
587
+ });
588
+ };
589
+
590
+ var buildMenu = function(currentTrack, chapterList){
591
+
592
+ if($bar){
593
+ $bar.remove();
594
+ $bar = null;
595
+ }
596
+
597
+ if(currentTrack && chapterList.length){
598
+ var chapters = chapterList.map(createChapterList, {
599
+ html: '<button type="button" data-starttime="{{startTime}}" data-endtime="{{endTime}}" role="menuitem" tabindex="-1">{{title}}</button>'
600
+ });
601
+ var text = currentTrack.label || plugin.text;
602
+
603
+ //$bar = chapterList.map(createChapterBar);
604
+
605
+ //$('.time-slider', base).append('<ul role="presentation" class="mediachapter-bar">'+ $bar.join('\n') + '</ul>');
606
+
607
+ hasTrack = true;
608
+ base.addClass('has-chapter-tracks');
609
+ createMenuButton();
610
+ control.attr('aria-label', text);
611
+ menuObj.addMenu('<div class="mediamenu chapter-menu" aria-label="'+ text +'"><div><h5>'+ text +'</h5><ul role="presentation">'+ chapters.join('\n') +'</div></ul></div>')
612
+ } else {
613
+ hasTrack = false;
614
+ control.attr('aria-label', plugin.text);
615
+ base.removeClass('has-chapter-tracks');
616
+ }
617
+
618
+ };
619
+
620
+ media.on({
621
+ play: function(){
622
+ wasPlayed = true;
623
+ },
624
+ 'emptied loadstart': function(){
625
+ wasPlayed = false;
626
+ timedPreload();
627
+ }
628
+ });
629
+ webshims.ready('WINDOWLOAD', timedPreload);
630
+ base.jmeFn('getMediaChapters', buildMenu);
631
+
632
+ });
633
+ }
634
+ },
635
+ mediaconfigmenu: {
636
+ _create: function(control, media, base){
637
+ var timer;
638
+ var menu = new $.jme.ButtonMenu(control, '<div class="mediamenu" ><div /></div>');
639
+ var innerMenu = menu.menu.find('div');
640
+ var enableDisable = function(){
641
+ base[innerMenu[0].getElementsByTagName('*').length ? 'addClass' : 'removeClass']('has-config-menu');
642
+ };
643
+ var timedEnable = function(){
644
+ clearTimeout(timer);
645
+ timer = setTimeout(enableDisable);
646
+ };
647
+ $.each($.jme.configmenuPlugins, function(name, create){
648
+ create(innerMenu, media, base, menu);
649
+ });
650
+
651
+ enableDisable();
652
+ media.on('loadstart emptied loadedmetadata', timedEnable);
653
+ }
654
+ },
531
655
  captions: {
532
656
  pseudoClasses: {
533
657
  menu: 'subtitle-menu'
@@ -593,7 +717,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
593
717
  }
594
718
 
595
719
  function updateMode(){
720
+ if(!menuObj || !menuObj.menu || !menuObj.menu.length){return;}
596
721
  $('button', menuObj.menu).each(function(i){
722
+ if(!tracks[i]){return false;}
597
723
  var checked = (tracks[i].mode == 'showing') ? 'true' : 'false';
598
724
  if(!i){
599
725
  checkbox.attr('aria-checked', checked);
@@ -613,20 +739,16 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
613
739
  base.attr('data-tracks', tracks.length > 1 ? 'many' : tracks.length);
614
740
 
615
741
  if(tracks.length){
616
- createSubtitleMenu('<div class="'+that[pseudoClasses].menu +'" >'+ (getTrackMenu(tracks)) +'</div>');
742
+ createSubtitleMenu('<div class="mediamenu '+that[pseudoClasses].menu +'" >'+ (getTrackMenu(tracks)) +'</div>');
617
743
 
618
744
  $('span.jme-text, label span.jme-text', checkbox).text((tracks[0].label || ' ') + (tracks[0].lang || ''));
619
745
 
620
746
  if(!base.hasClass(that[pseudoClasses].hasTrack) || base.hasClass(that[pseudoClasses].noTrack)){
621
747
  control.prop('disabled', false);
622
- base.triggerHandler('controlschanged');
623
748
  }
624
749
 
625
750
  } else if(!base.hasClass(that[pseudoClasses].noTrack) || base.hasClass(that[pseudoClasses].hasTrack)){
626
751
  control.prop('disabled', true);
627
- base
628
- .triggerHandler('controlschanged')
629
- ;
630
752
  }
631
753
  }
632
754
 
@@ -658,6 +780,223 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
658
780
  }
659
781
  });
660
782
 
783
+ var trackFilters = {
784
+ chapters: function(track){
785
+ return track.kind == 'chapters';
786
+ },
787
+ notDisabled: function(track){
788
+ return track.mode != 'disabled';
789
+ },
790
+ activeLang: function(track){
791
+ return track.language == webshims.activeLang();
792
+ },
793
+ activePartialLang: function(track){
794
+ return track.language == webshims.activeLang().split('-')[0];
795
+ }
796
+ };
797
+
798
+ function getBestChapterTrack(tracks){
799
+ var ret = $.grep(tracks, trackFilters.chapters);
800
+ var last = ret;
801
+ if(ret.length > 1){
802
+ ret = $.grep(ret, trackFilters.chapters);
803
+ }
804
+
805
+ if(!ret.length){
806
+ ret = last;
807
+ } else if(ret.length > 1){
808
+ ret = $.grep(ret, trackFilters.notDisabled);
809
+ }
810
+
811
+ if(!ret.length){
812
+ ret = last;
813
+ } else if(ret.length > 1){
814
+ ret = $.grep(ret, trackFilters.activeLang);
815
+ }
816
+
817
+ if(!ret.length){
818
+ ret = last;
819
+ } else if(ret.length > 1){
820
+ ret = $.grep(ret, trackFilters.activePartialLang);
821
+ }
822
+
823
+ return ret[0] || last[0] || null;
824
+ }
825
+
826
+ var showMode = {
827
+ captions: 'showing',
828
+ subtitles: 'showing'
829
+ };
830
+
831
+ $.jme.defineMethod('activateTrack', function(track, success){
832
+ var data = $.jme.data(this);
833
+ if(!data.media){return;}
834
+ var textTrack, timer;
835
+ var callIndex = 0;
836
+ var checkTrackState = function(){
837
+ clearTimeout(timer);
838
+ if(textTrack && textTrack.cues && textTrack.cues.length){
839
+ success(textTrack);
840
+ success = $.noop;
841
+ data.media.find('track').off('load', checkTrackState);
842
+ } else if(callIndex < 9){
843
+ timer = setTimeout(checkTrackState, 100 * callIndex);
844
+ callIndex++;
845
+ }
846
+ };
847
+ if(track.jquery){
848
+ track = track[0];
849
+ }
850
+ if(track.nodeName){
851
+ textTrack = $.prop(track, 'track');
852
+ } else {
853
+ textTrack = track;
854
+ }
855
+
856
+ if($.prop(textTrack, 'mode') == 'disabled'){
857
+ $.prop(textTrack, 'mode', showMode[$.prop(textTrack, 'mode')] || 'hidden');
858
+ }
859
+ data.media.prop('textTracks');
860
+ data.media.find('track').on('load', checkTrackState);
861
+ setTimeout(checkTrackState);
862
+ });
863
+
864
+ $.jme.defineMethod('getMediaChapters', function(success){
865
+ var data = $.jme.data(this);
866
+ if(!data.media){return;}
867
+ var currentChapterTrack;
868
+ var textTracks = data.media.prop('textTracks');
869
+
870
+ var updateChapterTrack = (function(){
871
+ var timer;
872
+
873
+ var update = function(){
874
+ var oldChapterTrack;
875
+ var selectedChapterTrack = getBestChapterTrack(textTracks);
876
+ if(currentChapterTrack === selectedChapterTrack){return;}
877
+ oldChapterTrack = currentChapterTrack;
878
+ currentChapterTrack = selectedChapterTrack;
879
+ if(selectedChapterTrack){
880
+ data.media.jmeFn('activateTrack', currentChapterTrack, function(){
881
+ var chapterTree = getChapterTree(currentChapterTrack);
882
+ success(currentChapterTrack, chapterTree, oldChapterTrack);
883
+
884
+ });
885
+ } else {
886
+ success(currentChapterTrack, [], oldChapterTrack);
887
+ }
888
+
889
+ };
890
+ return function(){
891
+ clearTimeout(timer);
892
+ timer = setTimeout(update);
893
+ };
894
+ })();
895
+
896
+ updateChapterTrack();
897
+ $([textTracks]).on('addtrack removetrack change', updateChapterTrack);
898
+ data.player.on('updatesubtitlestate', updateChapterTrack);
899
+ data.media.on('updatetrackdisplay emptied', updateChapterTrack);
900
+ });
901
+
902
+ function createChapterList(chapter){
903
+ var item = '<li role="presentation">'+ (this.html.replace('{{startTime}}', chapter.startTime).replace('{{endTime}}', chapter.endTime).replace('{{title}}', chapter.title));
904
+ if(chapter.list && chapter.list.length){
905
+ item += '\n<ul role="presentation">'+ chapter.list.map(createChapterList, this).join('\n\t') +'</ul>\n';
906
+ }
907
+ item += '</li>';
908
+ return item;
909
+ }
910
+
911
+ function createChapterBar(chapter){
912
+ var item = '<li role="presentation" style="'+ chapter.style +'" data-start="'+chapter.startTime+'" data-end="'+chapter.endTime+'"><span>'+chapter.title+'</span>';
913
+ if(chapter.list && chapter.list.length){
914
+ item += '\n<ul role="presentation">'+ chapter.list.map(createChapterBar).join('\n\t') +'</ul>\n';
915
+ }
916
+ item += '</li>';
917
+ return item;
918
+ }
919
+
920
+ function addChapterRelatives(chapterList){
921
+ var i, start, end, multi;
922
+ if(chapterList.length){
923
+ start = chapterList[0].startTime;
924
+ end = chapterList[chapterList.length - 1].endTime;
925
+ multi = 100 / (end - start);
926
+ for(i = 0; i < chapterList.length; i++){
927
+ chapterList[i].rel = (chapterList[i].endTime - chapterList[i].startTime) * multi;
928
+ if(i == chapterList.length - 1){
929
+ chapterList[i].last = true;
930
+ chapterList[i].style = 'overflow: hidden;';
931
+ } else {
932
+ chapterList[i].style = 'float: left; width: '+chapterList[i].rel+'%;';
933
+ }
934
+ addChapterRelatives(chapterList[i].list);
935
+ }
936
+ }
937
+ }
938
+
939
+ function getChapterTree(track){
940
+ var name ='__chaptertree'+track.cues.length;
941
+ if(track[name]){return track[name];}
942
+ var cue, i, chapter, start, end;
943
+ var chapterList = [];
944
+ var currentChapter = null;
945
+ for(i = 0; i < track.cues.length; i++){
946
+ cue = track.cues[i];
947
+ if(currentChapter && currentChapter.startTime > cue.startTime){
948
+ continue;
949
+ }
950
+ if(currentChapter && cue.startTime >= currentChapter.endTime){
951
+ currentChapter = currentChapter.parent;
952
+ }
953
+
954
+ if(currentChapter && cue.endTime > currentChapter.endTime){
955
+ continue;
956
+ }
957
+ chapter = {
958
+ startTime: cue.startTime,
959
+ endTime: cue.endTime,
960
+ parent: currentChapter,
961
+ list: [],
962
+ title: cue.text,
963
+ cue: cue
964
+ };
965
+ if(currentChapter){
966
+ currentChapter.list.push(chapter);
967
+ } else {
968
+ currentChapter = chapter;
969
+ chapterList.push(chapter);
970
+ }
971
+ }
972
+
973
+ addChapterRelatives(chapterList);
974
+ track[name] = chapterList;
975
+ return chapterList;
976
+ }
977
+
978
+ var domPrefixes = ["webkit", "moz", "o", "ms"];
979
+
980
+ function prefixed(prop, obj){
981
+ var i, testProp;
982
+ var ret = false;
983
+ if(obj[prop]){
984
+ ret = prop;
985
+ }
986
+ if(!ret){
987
+ prop = prop.charAt(0).toUpperCase() + prop.slice(1);
988
+ for(i = 0; i < domPrefixes.length; i++){
989
+ testProp = domPrefixes[i]+prop;
990
+ if(testProp in obj){
991
+ ret = testProp;
992
+ break;
993
+ }
994
+ }
995
+ }
996
+ return ret;
997
+ }
998
+
999
+ $.jme.defineMethod('getChapterTree', getChapterTree);
661
1000
 
662
1001
  $.jme.defineMethod('concerningRange', function(type, time){
663
1002
  var elem = this;
@@ -739,7 +1078,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
739
1078
  var doc = document.documentElement;
740
1079
 
741
1080
  var fullScreenApi = {
742
- supportsFullScreen: Modernizr.prefixed('fullscreenEnabled', document, false) || Modernizr.prefixed('fullScreenEnabled', document, false),
1081
+ supportsFullScreen: prefixed('fullscreenEnabled', document) || prefixed('fullScreenEnabled', document),
743
1082
  isFullScreen: function() { return false; },
744
1083
  requestFullScreen: function(elem){
745
1084
  var tmpData;
@@ -822,11 +1161,11 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
822
1161
  // update methods to do something useful
823
1162
  if (fullScreenApi.supportsFullScreen) {
824
1163
  fullScreenApi.enabledName = fullScreenApi.supportsFullScreen;
825
- fullScreenApi.exitName = Modernizr.prefixed("exitFullscreen", document, false) || Modernizr.prefixed("cancelFullScreen", document, false);
826
- fullScreenApi.elementName = Modernizr.prefixed("fullscreenElement", document, false) || Modernizr.prefixed("fullScreenElement", document, false);
1164
+ fullScreenApi.exitName = prefixed("exitFullscreen", document) || prefixed("cancelFullScreen", document);
1165
+ fullScreenApi.elementName = prefixed("fullscreenElement", document) || prefixed("fullScreenElement", document);
827
1166
  fullScreenApi.supportsFullScreen = !!fullScreenApi.supportsFullScreen;
828
1167
  if(fullScreenApi.elementName != 'fullscreenElement' || fullScreenApi.exitName != 'exitFullscreen' || fullScreenApi.enabledName != 'fullscreenEnabled'){
829
- $.each(Modernizr._domPrefixes, function(i, prefix){
1168
+ $.each(domPrefixes, function(i, prefix){
830
1169
  var requestName = prefix+'RequestFullscreen';
831
1170
  if((requestName in doc) || ((requestName = prefix+'RequestFullScreen') && (requestName in doc))){
832
1171
  fullScreenApi.eventName = prefix + 'fullscreenchange';
@@ -1002,7 +1341,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
1002
1341
 
1003
1342
 
1004
1343
  $.jme.ButtonMenu = function(button, menu, clickHandler){
1005
-
1344
+ var that = this;
1006
1345
  this.button = $(button).attr({'aria-haspopup': 'true'});
1007
1346
 
1008
1347
  this.clickHandler = clickHandler;
@@ -1014,7 +1353,16 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
1014
1353
 
1015
1354
  this.addMenu(menu);
1016
1355
  this._closeFocusOut();
1017
- this.button.wsTouchClick(this.toggle);
1356
+
1357
+ this.button
1358
+ .wsTouchClick(this.toggle)
1359
+ .on('keydown', function(e){
1360
+ if(!that.isVisible && (e.keyCode == 38 || e.keyCode == 40)){
1361
+ that.show();
1362
+ return false;
1363
+ }
1364
+ })
1365
+ ;
1018
1366
  };
1019
1367
 
1020
1368
  $.jme.ButtonMenu.prototype = {
@@ -1023,12 +1371,17 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
1023
1371
  this.menu.remove();
1024
1372
  }
1025
1373
  this.menu = $(menu);
1026
- this.buttons = $('button', this.menu);
1374
+
1027
1375
  this.menu.insertAfter(this.button);
1028
- this.menu
1029
- .on('keydown', this.keyIndex)
1030
- .wsTouchClick('button', this._buttonClick)
1031
- ;
1376
+ if(this.clickHandler){
1377
+ this.buttons = $('button', this.menu);
1378
+ this.menu
1379
+ .attr('role', 'menu')
1380
+ .on('keydown', this.keyIndex)
1381
+ .wsTouchClick('button', this._buttonClick)
1382
+ ;
1383
+
1384
+ }
1032
1385
  },
1033
1386
  _closeFocusOut: function(){
1034
1387
  var that = this;
@@ -1041,33 +1394,38 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
1041
1394
  };
1042
1395
  this.menu
1043
1396
  .parent()
1044
- .on('focusin', stopFocusOut)
1045
- .on('mousedown', stopFocusOut)
1397
+ .on('focusin mousedown click touchend', stopFocusOut)
1046
1398
  .on('focusout', function(e){
1047
1399
  timer = setTimeout(function(){
1400
+ that.activeElement = false;
1048
1401
  that.hide();
1049
1402
  }, 40);
1050
1403
  })
1051
1404
  ;
1052
1405
  },
1053
1406
  _buttonClick: function(e){
1054
- this.clickHandler(this.buttons.index(e.currentTarget), e.currentTarget);
1055
- this.hide();
1407
+ if(this.clickHandler){
1408
+ this.clickHandler(this.buttons.index(e.currentTarget), e.currentTarget);
1409
+ this.hide();
1410
+ }
1056
1411
  },
1057
1412
  keyIndex: function(e){
1058
1413
  var dir = (e.keyCode == 40) ? 1 : (e.keyCode == 38) ? -1 : 0;
1414
+ if(e.keyCode == 27){
1415
+ this.hide();
1416
+ }
1059
1417
  if(dir){
1060
1418
  var buttons = this.buttons.not(':disabled');
1061
1419
  var activeButton = buttons.filter(':focus');
1062
1420
 
1063
1421
  activeButton = buttons[buttons.index(activeButton) + dir] || buttons.filter(dir > 0 ? ':first' : ':last');
1064
- activeButton.focus();
1422
+ activeButton.trigger('focus');
1065
1423
  e.preventDefault();
1066
1424
  }
1067
1425
  },
1068
1426
  show: function(){
1069
1427
  if(this.isVisible){return;}
1070
- var buttons = this.buttons.not(':disabled');
1428
+ var buttons = $('button, select, input, textarea', this.menu).not(':disabled, [aria-diabled="true"]');
1071
1429
  this.isVisible = true;
1072
1430
  this.menu.addClass('visible-menu');
1073
1431
  try {
@@ -1077,7 +1435,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
1077
1435
  }
1078
1436
 
1079
1437
  setTimeout(function(){
1080
- $(buttons.filter('[aria-checked="true"]')[0] || buttons[0]).focus();
1438
+ $(buttons.filter('[aria-checked="true"]').last()[0] || buttons[0]).trigger('focus');
1081
1439
  }, 60);
1082
1440
  },
1083
1441
  toggle: function(){