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('jmebase', function($, webshims, window, doc, undefined){
2
2
  "use strict";
3
3
  var props = {};
4
4
  var fns = {};
@@ -9,8 +9,11 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
9
9
 
10
10
  webshims.cfg.mediaelement.jme = options;
11
11
 
12
+ if(!$.jme){
13
+ $.jme = {};
14
+ }
12
15
 
13
- $.jme = {
16
+ $.extend($.jme, {
14
17
  pluginsClasses: [],
15
18
  pluginsSel: '',
16
19
  plugins: {},
@@ -56,6 +59,10 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
56
59
  }
57
60
  this.runPlugin('.'+plugin.className);
58
61
  },
62
+ configmenuPlugins: {},
63
+ addToConfigmenu: function(name, create){
64
+ this.configmenuPlugins[name] = create;
65
+ },
59
66
  defineMethod: function(name, fn){
60
67
  fns[name] = fn;
61
68
  },
@@ -95,7 +102,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
95
102
  }
96
103
  }
97
104
  }
98
- };
105
+ });
99
106
 
100
107
  $.fn.jmeProp = function(name, value){
101
108
  return $.access( this, $.jme.prop, name, value, arguments.length > 1 );
@@ -105,6 +112,10 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
105
112
  var args = slice.call( arguments, 1 );
106
113
  var ret;
107
114
  this.each(function(){
115
+ if(!$.jme.data(this).media){
116
+ $(this).closest(baseSelector).jmePlayer();
117
+ webshims.warn('jmeFn called to early or on wrong element!');
118
+ }
108
119
  ret = (fns[fn] || $.prop(this, fn)).apply(this, args);
109
120
  if(ret !== undefined){
110
121
  return false;
@@ -182,11 +193,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
182
193
  $.fn.jmePlayer = function(opts){
183
194
 
184
195
  return this.each(function(){
185
- if(opts){
186
- $.jme.data(this, $.extend(true, {}, opts));
187
- }
188
196
 
189
- var mediaUpdateFn, canPlay, removeCanPlay, canplayTimer, lastState, stopEmptiedEvent;
197
+
198
+ var mediaUpdateFn, canPlay, removeCanPlay, canplayTimer, lastState, stopEmptiedEvent, forceRender;
190
199
  var media = $('audio, video', this).eq(0);
191
200
  var base = $(this);
192
201
 
@@ -198,7 +207,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
198
207
  mediaData.player = base;
199
208
  mediaData.media = media;
200
209
  if(!jmeData.media){
201
-
210
+ forceRender = function(){
211
+ base[0].className = base[0].className;
212
+ };
202
213
  removeCanPlay = function(){
203
214
  media.off('canplay', canPlay);
204
215
  clearTimeout(canplayTimer);
@@ -257,6 +268,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
257
268
  if(state){
258
269
  lastState = state;
259
270
  base.attr('data-state', state);
271
+ setTimeout(forceRender);
260
272
  }
261
273
  };
262
274
 
@@ -340,16 +352,16 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
340
352
  return [{src: src}];
341
353
  }
342
354
  srces = $.map($('source', data.media).get(), function(source){
355
+ var i, len;
343
356
  var src = {
344
357
  src: $.prop(source, 'src')
345
358
  };
346
- var tmp = $.attr(source, 'media');
347
- if(tmp){
348
- src.media = tmp;
349
- }
350
- tmp = $.attr(source, 'type');
351
- if(tmp){
352
- src.type = tmp;
359
+ var attributes = source.attributes;
360
+
361
+ for(i = 0, len = attributes.length; i < len; i++){
362
+ if(!('specified' in attributes[i]) || attributes[i].specified){
363
+ src[attributes[i].nodeName] = attributes[i].nodeValue;
364
+ }
353
365
  }
354
366
  return src;
355
367
  });
@@ -421,18 +433,17 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
421
433
  data.player.triggerHandler('controlsadded');
422
434
  }
423
435
  });
424
- webshims.isReady('jme', true);
425
- webshims.addReady($.jme.initJME);
426
- webshims._polyfill(['mediaelement']);
427
- webshims.isReady('jme-base', true);
428
-
429
- if(webshims.cfg.debug !== false){
430
- $(function(){
431
- if(document.getElementsByTagName('video').length && !document.querySelector(baseSelector)){
432
- webshims.warn("found video element but video wasn't wrapped inside a ."+ baseSelector +" element. Will not add control UI");
433
- }
434
- });
435
- }
436
+
437
+ webshims.ready('DOM mediaelement', function(){
438
+ webshims.isReady('jme', true);
439
+ webshims.addReady($.jme.initJME);
440
+ webshims.isReady('jme-base', true);
441
+
442
+ if(webshims.cfg.debug !== false && document.getElementsByTagName('video').length && !document.querySelector(baseSelector)){
443
+ webshims.warn("found video element but video wasn't wrapped inside a ."+ baseSelector +" element. Will not add control UI");
444
+ }
445
+ });
446
+
436
447
  });
437
448
  ;webshims.register('mediacontrols', function($, webshims, window){
438
449
  "use strict";
@@ -441,9 +452,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
441
452
  var options = webshims.cfg.mediaelement.jme;
442
453
  var baseSelector = options.selector;
443
454
  var jme = $.jme;
444
- var unknowStructure = '<div class="{%class%}"></div>'
455
+ var unknownStructure = '<div class="{%class%}"></div>';
445
456
  var btnStructure = '<button class="{%class%}" type="button" aria-label="{%text%}"></button>';
446
- var slideStructure = '<div class="{%class%} media-range"></div>';
457
+ var slideStructure = '<div class="{%class%} media-range" aria-label="{%text%}"></div>';
447
458
  var timeStructure = '<div class="{%class%}">00:00</div>';
448
459
 
449
460
  var noVolumeClass = (function(){
@@ -475,7 +486,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
475
486
  if(plugin){
476
487
  if(!plugin.structure){
477
488
  webshims.warn('no structure option provided for plugin: '+ matchName +'. Fallback to standard div');
478
- plugin.structure = unknowStructure;
489
+ plugin.structure = unknownStructure;
479
490
  }
480
491
  return plugin.structure.replace('{%class%}', matchName).replace('{%text%}', plugin.text || '');
481
492
  }
@@ -580,18 +591,55 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
580
591
  }
581
592
  };
582
593
  })();
594
+ var $poster = $('<div class="ws-poster" />').insertAfter(data.media);
583
595
  var posterState = (function(){
584
- var lastPosterState, lastYoutubeState;
596
+ var lastPosterState, lastYoutubeState, lastPoster;
585
597
  var hasFlash = window.swfmini && swfmini.hasFlashPlayerVersion('10.0.3');
586
598
  var regYt = /youtube\.com\/[watch\?|v\/]+/i;
599
+
600
+ var isInitial = data.media.prop('paused');
601
+ if(isInitial){
602
+ data.player.addClass('initial-state');
603
+ }
604
+ if(!('backgroundSize' in $poster[0].style)){
605
+ data.player.addClass('no-backgroundsize');
606
+ }
607
+ data.media.on('playing waiting seeked seeking', function(){
608
+ if(isInitial){
609
+ isInitial = false;
610
+ data.player.removeClass('initial-state');
611
+ }
612
+ });
587
613
  return function(){
588
- var hasPoster = !!data.media.attr('poster');
589
- var hasYt = (hasFlash && hasPoster) ? false : regYt.test(data.media.prop('currentSrc') || '');
614
+ var poster = data.media.attr('poster');
615
+ var hasPoster = !!poster;
616
+ var currentSrc = data.media.prop('currentSrc') || '';
617
+ var isYt = regYt.test(currentSrc);
618
+ var hasYt = (hasFlash && hasPoster) ? false : isYt;
619
+
620
+ if(!hasPoster && isYt){
621
+ poster = currentSrc.match(/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i) || '';
622
+ if(poster){
623
+ poster = 'https://img.youtube.com/vi/'+ poster[1] +'/0.jpg';
624
+ hasPoster = !!poster;
625
+ }
626
+ }
627
+
628
+ if(lastPoster !== poster){
629
+ lastPoster = poster;
630
+ $poster[0].style.backgroundImage = poster ? 'url('+poster+')' : '';
631
+ }
632
+
590
633
  if(lastPosterState !== hasPoster){
591
634
  lastPosterState = hasPoster;
592
635
  data.player[hasPoster ? 'removeClass' : 'addClass']('no-poster');
593
636
  }
594
637
 
638
+ if(data.media.prop('paused')){
639
+ data.player.addClass('initial-state');
640
+ isInitial = true;
641
+ }
642
+
595
643
  if(lastYoutubeState !== hasYt){
596
644
  lastYoutubeState = hasYt;
597
645
  data.player[hasYt ? 'addClass' : 'removeClass']('has-ytposter');
@@ -602,13 +650,15 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
602
650
 
603
651
  userActivity._create(data.player, data.media, data.player);
604
652
 
605
- data.media.on('emptied', posterState);
653
+ data.media.on('emptied loadstart', function(){
654
+ setTimeout(posterState);
655
+ });
606
656
 
607
657
  playerSize();
608
658
  posterState();
609
659
  webshims.ready('dom-support', function(){
610
660
  data.player.onWSOff('updateshadowdom', playerSize);
611
- controls.add(data._controlbar).addClass(webshims.shadowClass);
661
+ controls.add(data._controlbar).add($poster).addClass(webshims.shadowClass);
612
662
  webshims.addShadowDom();
613
663
  });
614
664
  }
@@ -641,7 +691,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
641
691
 
642
692
  jme.registerPlugin('volume-slider', {
643
693
  structure: slideStructure,
644
-
694
+ text: 'volume level',
645
695
  _create: lazyLoadPlugin()
646
696
  });
647
697
 
@@ -651,6 +701,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
651
701
  options: {
652
702
  format: ['mm', 'ss']
653
703
  },
704
+ text: 'time position',
654
705
  _create: lazyLoadPlugin()
655
706
  });
656
707
 
@@ -725,12 +776,18 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
725
776
  _create: lazyLoadPlugin()
726
777
  });
727
778
 
779
+ jme.registerPlugin('mediaconfigmenu', {
780
+ structure: btnStructure,
781
+ text: 'configuration',
782
+ _create: lazyLoadPlugin()
783
+ });
784
+
728
785
 
729
786
  jme.registerPlugin('captions', {
730
787
  structure: btnStructure,
731
788
  text: 'subtitles',
732
789
  _create: function(control, media, base){
733
- var trackElems = media.find('track');
790
+ var trackElems = media.find('track').filter(':not([kind]), [kind="subtitles"], [data-kind="subtitles"], [kind="captions"], [data-kind="captions"]');
734
791
  control.wsclonedcheckbox = $(control).clone().attr({role: 'checkbox'}).insertBefore(control);
735
792
  base.attr('data-tracks', trackElems.length > 1 ? 'many' : trackElems.length);
736
793
  control.attr('aria-haspopup', 'true');
@@ -738,9 +795,26 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
738
795
  }
739
796
  });
740
797
 
798
+
799
+ jme.registerPlugin('chapters', {
800
+ structure: btnStructure,
801
+ text: 'chapters',
802
+ _create: function(control, media, base){
803
+ var trackElems = media.find('track').filter('[kind="chapters"], [data-kind="chapters"]');
804
+ control.attr('aria-haspopup', 'true');
805
+ if(trackElems.length){
806
+ webshims._polyfill(['track']);
807
+ base.addClass('has-chapter-tracks');
808
+ }
809
+ lazyLoadPlugin().apply(this, arguments);
810
+ }
811
+ });
812
+
813
+
814
+
741
815
  webshims.ready(webshims.cfg.mediaelement.plugins.concat(['mediaelement', 'jme-base']), function(){
742
816
  if(!options.barTemplate){
743
- options.barTemplate = '<div class="play-pause-container">{{play-pause}}</div><div class="playlist-container"><div class="playlist-box">{{playlist-prev}}{{playlist-next}}</div></div><div class="currenttime-container">{{currenttime-display}}</div><div class="progress-container">{{time-slider}}</div><div class="duration-container">{{duration-display}}</div><div class="mute-container">{{mute-unmute}}</div><div class="volume-container">{{volume-slider}}</div><div class="subtitle-container"><div class="subtitle-controls">{{captions}}</div></div><div class="fullscreen-container">{{fullscreen}}</div>';
817
+ options.barTemplate = '<div class="play-pause-container">{{play-pause}}</div><div class="playlist-container"><div class="playlist-box"><div class="playlist-button-container">{{playlist-prev}}</div><div class="playlist-button-container">{{playlist-next}}</div></div></div><div class="currenttime-container">{{currenttime-display}}</div><div class="progress-container">{{time-slider}}</div><div class="duration-container">{{duration-display}}</div><div class="mute-container">{{mute-unmute}}</div><div class="volume-container">{{volume-slider}}</div><div class="chapters-container"><div class="chapters-controls mediamenu-wrapper">{{chapters}}</div></div><div class="subtitle-container mediamenu-wrapper"><div class="subtitle-controls">{{captions}}</div></div><div class="mediaconfig-container"><div class="mediaconfig-controls mediamenu-wrapper">{{mediaconfigmenu}}</div></div><div class="fullscreen-container">{{fullscreen}}</div>';
744
818
  }
745
819
  if(!options.barStructure){
746
820
  options.barStructure = '<div class="jme-media-overlay"></div><div class="jme-controlbar'+ noVolumeClass +'" tabindex="-1"><div class="jme-cb-box"></div></div>';
@@ -752,7 +826,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
752
826
  });
753
827
  webshims.ready('WINDOWLOAD', loadLazy);
754
828
  });
755
- ;webshims.ready('jme DOM', function(){
829
+ ;webshims.ready('jme-base DOM', function(){
756
830
  "use strict";
757
831
  var webshims = window.webshims;
758
832
  var $ = webshims.$;
@@ -1139,7 +1213,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
1139
1213
  $.each(item.tracks || [], function(i, track){
1140
1214
  $('<track />').attr(track).appendTo(media);
1141
1215
  });
1142
-
1216
+ if(!item.srces){
1217
+ item.srces = item;
1218
+ }
1143
1219
  media.jmeProp('srces', item.srces);
1144
1220
  },
1145
1221
  _getItem: function(item){
@@ -1,4 +1,4 @@
1
- webshims.register('jme', function($, webshims, window, doc, undefined){
1
+ webshims.register('jmebase', function($, webshims, window, doc, undefined){
2
2
  "use strict";
3
3
  var props = {};
4
4
  var fns = {};
@@ -9,8 +9,11 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
9
9
 
10
10
  webshims.cfg.mediaelement.jme = options;
11
11
 
12
+ if(!$.jme){
13
+ $.jme = {};
14
+ }
12
15
 
13
- $.jme = {
16
+ $.extend($.jme, {
14
17
  pluginsClasses: [],
15
18
  pluginsSel: '',
16
19
  plugins: {},
@@ -56,6 +59,10 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
56
59
  }
57
60
  this.runPlugin('.'+plugin.className);
58
61
  },
62
+ configmenuPlugins: {},
63
+ addToConfigmenu: function(name, create){
64
+ this.configmenuPlugins[name] = create;
65
+ },
59
66
  defineMethod: function(name, fn){
60
67
  fns[name] = fn;
61
68
  },
@@ -95,7 +102,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
95
102
  }
96
103
  }
97
104
  }
98
- };
105
+ });
99
106
 
100
107
  $.fn.jmeProp = function(name, value){
101
108
  return $.access( this, $.jme.prop, name, value, arguments.length > 1 );
@@ -105,6 +112,10 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
105
112
  var args = slice.call( arguments, 1 );
106
113
  var ret;
107
114
  this.each(function(){
115
+ if(!$.jme.data(this).media){
116
+ $(this).closest(baseSelector).jmePlayer();
117
+ webshims.warn('jmeFn called to early or on wrong element!');
118
+ }
108
119
  ret = (fns[fn] || $.prop(this, fn)).apply(this, args);
109
120
  if(ret !== undefined){
110
121
  return false;
@@ -182,11 +193,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
182
193
  $.fn.jmePlayer = function(opts){
183
194
 
184
195
  return this.each(function(){
185
- if(opts){
186
- $.jme.data(this, $.extend(true, {}, opts));
187
- }
188
196
 
189
- var mediaUpdateFn, canPlay, removeCanPlay, canplayTimer, lastState, stopEmptiedEvent;
197
+
198
+ var mediaUpdateFn, canPlay, removeCanPlay, canplayTimer, lastState, stopEmptiedEvent, forceRender;
190
199
  var media = $('audio, video', this).eq(0);
191
200
  var base = $(this);
192
201
 
@@ -198,7 +207,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
198
207
  mediaData.player = base;
199
208
  mediaData.media = media;
200
209
  if(!jmeData.media){
201
-
210
+ forceRender = function(){
211
+ base[0].className = base[0].className;
212
+ };
202
213
  removeCanPlay = function(){
203
214
  media.off('canplay', canPlay);
204
215
  clearTimeout(canplayTimer);
@@ -257,6 +268,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
257
268
  if(state){
258
269
  lastState = state;
259
270
  base.attr('data-state', state);
271
+ setTimeout(forceRender);
260
272
  }
261
273
  };
262
274
 
@@ -340,16 +352,16 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
340
352
  return [{src: src}];
341
353
  }
342
354
  srces = $.map($('source', data.media).get(), function(source){
355
+ var i, len;
343
356
  var src = {
344
357
  src: $.prop(source, 'src')
345
358
  };
346
- var tmp = $.attr(source, 'media');
347
- if(tmp){
348
- src.media = tmp;
349
- }
350
- tmp = $.attr(source, 'type');
351
- if(tmp){
352
- src.type = tmp;
359
+ var attributes = source.attributes;
360
+
361
+ for(i = 0, len = attributes.length; i < len; i++){
362
+ if(!('specified' in attributes[i]) || attributes[i].specified){
363
+ src[attributes[i].nodeName] = attributes[i].nodeValue;
364
+ }
353
365
  }
354
366
  return src;
355
367
  });
@@ -421,18 +433,17 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
421
433
  data.player.triggerHandler('controlsadded');
422
434
  }
423
435
  });
424
- webshims.isReady('jme', true);
425
- webshims.addReady($.jme.initJME);
426
- webshims._polyfill(['mediaelement']);
427
- webshims.isReady('jme-base', true);
428
-
429
- if(webshims.cfg.debug !== false){
430
- $(function(){
431
- if(document.getElementsByTagName('video').length && !document.querySelector(baseSelector)){
432
- webshims.warn("found video element but video wasn't wrapped inside a ."+ baseSelector +" element. Will not add control UI");
433
- }
434
- });
435
- }
436
+
437
+ webshims.ready('DOM mediaelement', function(){
438
+ webshims.isReady('jme', true);
439
+ webshims.addReady($.jme.initJME);
440
+ webshims.isReady('jme-base', true);
441
+
442
+ if(webshims.cfg.debug !== false && document.getElementsByTagName('video').length && !document.querySelector(baseSelector)){
443
+ webshims.warn("found video element but video wasn't wrapped inside a ."+ baseSelector +" element. Will not add control UI");
444
+ }
445
+ });
446
+
436
447
  });
437
448
  ;webshims.register('mediacontrols', function($, webshims, window){
438
449
  "use strict";
@@ -441,9 +452,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
441
452
  var options = webshims.cfg.mediaelement.jme;
442
453
  var baseSelector = options.selector;
443
454
  var jme = $.jme;
444
- var unknowStructure = '<div class="{%class%}"></div>'
455
+ var unknownStructure = '<div class="{%class%}"></div>';
445
456
  var btnStructure = '<button class="{%class%}" type="button" aria-label="{%text%}"></button>';
446
- var slideStructure = '<div class="{%class%} media-range"></div>';
457
+ var slideStructure = '<div class="{%class%} media-range" aria-label="{%text%}"></div>';
447
458
  var timeStructure = '<div class="{%class%}">00:00</div>';
448
459
 
449
460
  var noVolumeClass = (function(){
@@ -475,7 +486,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
475
486
  if(plugin){
476
487
  if(!plugin.structure){
477
488
  webshims.warn('no structure option provided for plugin: '+ matchName +'. Fallback to standard div');
478
- plugin.structure = unknowStructure;
489
+ plugin.structure = unknownStructure;
479
490
  }
480
491
  return plugin.structure.replace('{%class%}', matchName).replace('{%text%}', plugin.text || '');
481
492
  }
@@ -580,18 +591,55 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
580
591
  }
581
592
  };
582
593
  })();
594
+ var $poster = $('<div class="ws-poster" />').insertAfter(data.media);
583
595
  var posterState = (function(){
584
- var lastPosterState, lastYoutubeState;
596
+ var lastPosterState, lastYoutubeState, lastPoster;
585
597
  var hasFlash = window.swfmini && swfmini.hasFlashPlayerVersion('10.0.3');
586
598
  var regYt = /youtube\.com\/[watch\?|v\/]+/i;
599
+
600
+ var isInitial = data.media.prop('paused');
601
+ if(isInitial){
602
+ data.player.addClass('initial-state');
603
+ }
604
+ if(!('backgroundSize' in $poster[0].style)){
605
+ data.player.addClass('no-backgroundsize');
606
+ }
607
+ data.media.on('playing waiting seeked seeking', function(){
608
+ if(isInitial){
609
+ isInitial = false;
610
+ data.player.removeClass('initial-state');
611
+ }
612
+ });
587
613
  return function(){
588
- var hasPoster = !!data.media.attr('poster');
589
- var hasYt = (hasFlash && hasPoster) ? false : regYt.test(data.media.prop('currentSrc') || '');
614
+ var poster = data.media.attr('poster');
615
+ var hasPoster = !!poster;
616
+ var currentSrc = data.media.prop('currentSrc') || '';
617
+ var isYt = regYt.test(currentSrc);
618
+ var hasYt = (hasFlash && hasPoster) ? false : isYt;
619
+
620
+ if(!hasPoster && isYt){
621
+ poster = currentSrc.match(/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i) || '';
622
+ if(poster){
623
+ poster = 'https://img.youtube.com/vi/'+ poster[1] +'/0.jpg';
624
+ hasPoster = !!poster;
625
+ }
626
+ }
627
+
628
+ if(lastPoster !== poster){
629
+ lastPoster = poster;
630
+ $poster[0].style.backgroundImage = poster ? 'url('+poster+')' : '';
631
+ }
632
+
590
633
  if(lastPosterState !== hasPoster){
591
634
  lastPosterState = hasPoster;
592
635
  data.player[hasPoster ? 'removeClass' : 'addClass']('no-poster');
593
636
  }
594
637
 
638
+ if(data.media.prop('paused')){
639
+ data.player.addClass('initial-state');
640
+ isInitial = true;
641
+ }
642
+
595
643
  if(lastYoutubeState !== hasYt){
596
644
  lastYoutubeState = hasYt;
597
645
  data.player[hasYt ? 'addClass' : 'removeClass']('has-ytposter');
@@ -602,13 +650,15 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
602
650
 
603
651
  userActivity._create(data.player, data.media, data.player);
604
652
 
605
- data.media.on('emptied', posterState);
653
+ data.media.on('emptied loadstart', function(){
654
+ setTimeout(posterState);
655
+ });
606
656
 
607
657
  playerSize();
608
658
  posterState();
609
659
  webshims.ready('dom-support', function(){
610
660
  data.player.onWSOff('updateshadowdom', playerSize);
611
- controls.add(data._controlbar).addClass(webshims.shadowClass);
661
+ controls.add(data._controlbar).add($poster).addClass(webshims.shadowClass);
612
662
  webshims.addShadowDom();
613
663
  });
614
664
  }
@@ -641,7 +691,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
641
691
 
642
692
  jme.registerPlugin('volume-slider', {
643
693
  structure: slideStructure,
644
-
694
+ text: 'volume level',
645
695
  _create: lazyLoadPlugin()
646
696
  });
647
697
 
@@ -651,6 +701,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
651
701
  options: {
652
702
  format: ['mm', 'ss']
653
703
  },
704
+ text: 'time position',
654
705
  _create: lazyLoadPlugin()
655
706
  });
656
707
 
@@ -725,12 +776,18 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
725
776
  _create: lazyLoadPlugin()
726
777
  });
727
778
 
779
+ jme.registerPlugin('mediaconfigmenu', {
780
+ structure: btnStructure,
781
+ text: 'configuration',
782
+ _create: lazyLoadPlugin()
783
+ });
784
+
728
785
 
729
786
  jme.registerPlugin('captions', {
730
787
  structure: btnStructure,
731
788
  text: 'subtitles',
732
789
  _create: function(control, media, base){
733
- var trackElems = media.find('track');
790
+ var trackElems = media.find('track').filter(':not([kind]), [kind="subtitles"], [data-kind="subtitles"], [kind="captions"], [data-kind="captions"]');
734
791
  control.wsclonedcheckbox = $(control).clone().attr({role: 'checkbox'}).insertBefore(control);
735
792
  base.attr('data-tracks', trackElems.length > 1 ? 'many' : trackElems.length);
736
793
  control.attr('aria-haspopup', 'true');
@@ -738,9 +795,26 @@ webshims.register('jme', function($, webshims, window, doc, undefined){
738
795
  }
739
796
  });
740
797
 
798
+
799
+ jme.registerPlugin('chapters', {
800
+ structure: btnStructure,
801
+ text: 'chapters',
802
+ _create: function(control, media, base){
803
+ var trackElems = media.find('track').filter('[kind="chapters"], [data-kind="chapters"]');
804
+ control.attr('aria-haspopup', 'true');
805
+ if(trackElems.length){
806
+ webshims._polyfill(['track']);
807
+ base.addClass('has-chapter-tracks');
808
+ }
809
+ lazyLoadPlugin().apply(this, arguments);
810
+ }
811
+ });
812
+
813
+
814
+
741
815
  webshims.ready(webshims.cfg.mediaelement.plugins.concat(['mediaelement', 'jme-base']), function(){
742
816
  if(!options.barTemplate){
743
- options.barTemplate = '<div class="play-pause-container">{{play-pause}}</div><div class="playlist-container"><div class="playlist-box">{{playlist-prev}}{{playlist-next}}</div></div><div class="currenttime-container">{{currenttime-display}}</div><div class="progress-container">{{time-slider}}</div><div class="duration-container">{{duration-display}}</div><div class="mute-container">{{mute-unmute}}</div><div class="volume-container">{{volume-slider}}</div><div class="subtitle-container"><div class="subtitle-controls">{{captions}}</div></div><div class="fullscreen-container">{{fullscreen}}</div>';
817
+ options.barTemplate = '<div class="play-pause-container">{{play-pause}}</div><div class="playlist-container"><div class="playlist-box"><div class="playlist-button-container">{{playlist-prev}}</div><div class="playlist-button-container">{{playlist-next}}</div></div></div><div class="currenttime-container">{{currenttime-display}}</div><div class="progress-container">{{time-slider}}</div><div class="duration-container">{{duration-display}}</div><div class="mute-container">{{mute-unmute}}</div><div class="volume-container">{{volume-slider}}</div><div class="chapters-container"><div class="chapters-controls mediamenu-wrapper">{{chapters}}</div></div><div class="subtitle-container mediamenu-wrapper"><div class="subtitle-controls">{{captions}}</div></div><div class="mediaconfig-container"><div class="mediaconfig-controls mediamenu-wrapper">{{mediaconfigmenu}}</div></div><div class="fullscreen-container">{{fullscreen}}</div>';
744
818
  }
745
819
  if(!options.barStructure){
746
820
  options.barStructure = '<div class="jme-media-overlay"></div><div class="jme-controlbar'+ noVolumeClass +'" tabindex="-1"><div class="jme-cb-box"></div></div>';
@@ -62,7 +62,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
62
62
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
63
63
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
64
64
  var has = Object.prototype.hasOwnProperty;
65
- webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
65
+ webshims.assumeARIA = true;
66
66
 
67
67
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
68
68
  webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
@@ -81,15 +81,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
81
81
  }
82
82
  window.jQuery = webshims.$;
83
83
  }
84
- if(webshims.M != Modernizr){
85
- webshims.error("Modernizr was included more than once. Make sure to include it only once! Webshims and other scripts might not work properly.");
86
- for(var i in Modernizr){
87
- if(!(i in webshims.M)){
88
- webshims.M[i] = Modernizr[i];
89
- }
90
- }
91
- Modernizr = webshims.M;
92
- }
93
84
  };
94
85
  switch$();
95
86
  setTimeout(switch$, 90);
@@ -418,7 +409,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
418
409
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
419
410
 
420
411
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
421
- var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
412
+ var isExtendNativeSave = webshims.support.advancedObjectProperties && webshims.support.objectAccessor;
422
413
  return function(nodeName, prop, desc){
423
414
  var elem , elemProto;
424
415
  if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
@@ -729,7 +720,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
729
720
  });
730
721
  }
731
722
  webshims.ready('WINDOWLOAD', this.test);
732
- $(document).on('updatelayout.webshim pageinit popupafteropen panelbeforeopen tabsactivate collapsibleexpand shown.bs.modal shown.bs.collapse slid.bs.carousel', this.handler);
723
+ $(document).on('updatelayout.webshim pageinit popupafteropen panelbeforeopen tabsactivate collapsibleexpand shown.bs.modal shown.bs.collapse slid.bs.carousel playerdimensionchange', this.handler);
733
724
  $(window).on('resize', this.handler);
734
725
  }
735
726
  }