webshims-rails 0.4.7 → 1.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +15 -0
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +1 -1
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +1 -1
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +197 -166
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1711 -1609
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +2575 -2253
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +2452 -1476
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1405 -1159
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1316 -963
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1862 -179
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +4327 -287
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +3887 -586
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2911 -2159
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +3425 -1730
  16. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2854 -1203
  17. data/vendor/assets/javascripts/webshims/shims/combos/2.js +3351 -2130
  18. data/vendor/assets/javascripts/webshims/shims/combos/20.js +2426 -581
  19. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1915 -1574
  20. data/vendor/assets/javascripts/webshims/shims/combos/22.js +864 -2275
  21. data/vendor/assets/javascripts/webshims/shims/combos/23.js +609 -1811
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +1655 -2736
  23. data/vendor/assets/javascripts/webshims/shims/combos/4.js +1037 -603
  24. data/vendor/assets/javascripts/webshims/shims/combos/5.js +3100 -773
  25. data/vendor/assets/javascripts/webshims/shims/combos/6.js +3631 -840
  26. data/vendor/assets/javascripts/webshims/shims/combos/7.js +3596 -1354
  27. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1731 -188
  28. data/vendor/assets/javascripts/webshims/shims/combos/9.js +3243 -1431
  29. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +107 -18
  30. data/vendor/assets/javascripts/webshims/shims/es5.js +1 -0
  31. data/vendor/assets/javascripts/webshims/shims/form-core.js +553 -464
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +160 -154
  33. data/vendor/assets/javascripts/webshims/shims/form-message.js +73 -49
  34. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +18 -1
  35. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +161 -36
  36. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2130 -813
  37. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +206 -58
  38. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ar.js → formcfg-ar.js} +30 -0
  39. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ch-ZN.js → formcfg-ch-ZN.js} +31 -0
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-de.txt → formcfg-de.txt} +50 -11
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-el.js → formcfg-el.js} +31 -0
  42. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-en.txt → formcfg-en.txt} +44 -11
  43. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-es.js → formcfg-es.js} +31 -0
  44. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-fr.js → formcfg-fr.js} +31 -0
  45. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-he.js → formcfg-he.js} +31 -0
  46. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hi.js → formcfg-hi.js} +31 -0
  47. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hu.js → formcfg-hu.js} +31 -0
  48. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-it.js → formcfg-it.js} +31 -0
  49. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ja.js → formcfg-ja.js} +31 -0
  50. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-nl.js → formcfg-nl.js} +31 -0
  51. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-pt-PT.js → formcfg-pt-PT.js} +31 -0
  52. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ru.js → formcfg-ru.js} +31 -0
  53. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-sv.js → formcfg-sv.js} +32 -0
  54. data/vendor/assets/javascripts/webshims/shims/json-storage.js +16 -10
  55. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +155 -122
  56. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +76 -41
  57. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +8 -16
  58. data/vendor/assets/javascripts/webshims/shims/range-ui.js +388 -0
  59. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +12 -0
  60. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1186 -0
  62. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +868 -548
  63. data/vendor/assets/javascripts/webshims/shims/styles/vertical-range.png +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/swfmini.js +497 -0
  66. data/vendor/assets/javascripts/webshims/shims/track-ui.js +3 -0
  67. data/vendor/assets/javascripts/webshims/shims/track.js +29 -29
  68. metadata +26 -125
  69. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +0 -1
  70. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +0 -1
  71. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +0 -1
  72. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +0 -1
  73. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +0 -1
  74. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +0 -1
  75. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  76. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -73
  77. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -49
  78. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +0 -1
  79. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +0 -1
  82. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -73
  83. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -49
  84. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +0 -1
  85. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +0 -1
  86. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +0 -1
  87. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +0 -1
  88. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +0 -1
  89. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +0 -1
  90. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +0 -1
  91. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +0 -1
  92. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +0 -1
  93. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +0 -1
  94. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +0 -1
  95. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +0 -1
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +0 -1
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +0 -1
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +0 -1
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +0 -1
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +0 -1
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +0 -1
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +0 -1
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +0 -1
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +0 -1
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +0 -1
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +0 -1
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +0 -1
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +0 -1
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +0 -1
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +0 -1
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +0 -1
  112. data/vendor/assets/javascripts/webshims/minified/shims/details.js +0 -1
  113. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +0 -1
  114. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +0 -1
  115. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +0 -1
  116. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +0 -1
  117. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +0 -1
  118. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +0 -1
  119. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +0 -1
  120. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +0 -1
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +0 -1
  122. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +0 -1
  123. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +0 -1
  124. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +0 -1
  125. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +0 -1
  126. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +0 -33
  127. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +0 -1
  128. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +0 -34
  129. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +0 -1
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +0 -1
  131. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +0 -1
  132. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +0 -1
  133. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +0 -1
  134. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +0 -1
  135. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +0 -1
  136. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +0 -1
  137. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +0 -1
  138. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +0 -1
  139. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +0 -1
  140. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +0 -1
  141. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -1
  142. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  143. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -87
  144. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +0 -1
  145. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +0 -1
  146. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +0 -1
  147. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +0 -1
  148. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +0 -1
  149. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  150. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  151. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  152. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +0 -1
  153. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  154. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  155. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  156. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +0 -1
  157. data/vendor/assets/javascripts/webshims/minified/shims/track.js +0 -1
  158. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  159. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  160. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2872
  161. data/vendor/assets/javascripts/webshims/shims/combos/25.js +0 -2376
  162. data/vendor/assets/javascripts/webshims/shims/combos/26.js +0 -3009
  163. data/vendor/assets/javascripts/webshims/shims/combos/27.js +0 -4150
  164. data/vendor/assets/javascripts/webshims/shims/combos/59.js +0 -1747
  165. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -1
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -87
  168. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +0 -972
@@ -1,1102 +1,1455 @@
1
- //DOM-Extension helper
2
- jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
1
+ (function($, Modernizr, webshims){
3
2
  "use strict";
4
- //shortcus
5
- var modules = webshims.modules;
6
- var listReg = /\s*,\s*/;
7
-
8
- //proxying attribute
9
- var olds = {};
10
- var havePolyfill = {};
11
- var extendedProps = {};
12
- var extendQ = {};
13
- var modifyProps = {};
14
-
15
- var oldVal = $.fn.val;
16
- var singleVal = function(elem, name, val, pass, _argless){
17
- return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
18
- };
19
-
20
- $.fn.onTrigger = function(evt, fn){
21
- return this.on(evt, fn).each(fn);
22
- };
3
+ var hasNative = Modernizr.audio && Modernizr.video;
4
+ var supportsLoop = false;
5
+ var bugs = webshims.bugs;
23
6
 
24
- $.fn.val = function(val){
25
- var elem = this[0];
26
- if(arguments.length && val == null){
27
- val = '';
28
- }
29
- if(!arguments.length){
30
- if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
31
- return $.prop(elem, 'value', val, 'val', true);
32
- }
33
- if($.isArray(val)){
34
- return oldVal.apply(this, arguments);
35
- }
36
- var isFunction = $.isFunction(val);
37
- return this.each(function(i){
38
- elem = this;
39
- if(elem.nodeType === 1){
40
- if(isFunction){
41
- var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
42
- if(genVal == null){
43
- genVal = '';
44
- }
45
- $.prop(elem, 'value', genVal, 'val') ;
46
- } else {
47
- $.prop(elem, 'value', val, 'val');
48
- }
7
+ var loadSwf = function(){
8
+ webshims.ready(swfType, function(){
9
+ if(!webshims.mediaelement.createSWF){
10
+ webshims.mediaelement.loadSwf = true;
11
+ webshims.reTest([swfType], hasNative);
49
12
  }
50
13
  });
51
14
  };
52
-
53
- var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
54
- var elementData = function(elem, key, val){
55
- elem = elem.jquery ? elem[0] : elem;
56
- if(!elem){return val || {};}
57
- var data = $.data(elem, dataID);
58
- if(val !== undefined){
59
- if(!data){
60
- data = $.data(elem, dataID, {});
61
- }
62
- if(key){
63
- data[key] = val;
64
- }
65
- }
15
+ var options = webshims.cfg.mediaelement;
16
+ var swfType = 'mediaelement-jaris';
17
+ var hasSwf;
18
+ if(!options){
19
+ webshims.error("mediaelement wasn't implemented but loaded");
20
+ return;
21
+ }
22
+ if(hasNative){
23
+ var videoElem = document.createElement('video');
24
+ Modernizr.videoBuffered = ('buffered' in videoElem);
25
+ supportsLoop = ('loop' in videoElem);
66
26
 
67
- return key ? data && data[key] : data;
68
- };
69
-
70
-
71
- [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
72
- $.fn[data.name] = function(){
73
- return this.map(function(){
74
- var shadowData = elementData(this, 'shadowData');
75
- return shadowData && shadowData[data.prop] || this;
27
+ webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
28
+
29
+ if(!Modernizr.videoBuffered){
30
+ webshims.addPolyfill('mediaelement-native-fix', {
31
+ f: 'mediaelement',
32
+ test: Modernizr.videoBuffered,
33
+ d: ['dom-support']
76
34
  });
35
+
36
+ webshims.reTest('mediaelement-native-fix');
37
+ }
38
+ }
39
+
40
+ if(hasNative && !options.preferFlash){
41
+ var noSwitch = {
42
+ 1: 1,
43
+ 2: 1
77
44
  };
78
- });
45
+ var switchOptions = function(e){
46
+ var media;
47
+ var parent = e.target.parentNode;
48
+ if(!options.preferFlash &&
49
+ ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) &&
50
+ (media = $(e.target).closest('audio, video')) && !noSwitch[media.prop('error')]
51
+ ){
52
+ $(function(){
53
+ if(hasSwf && !options.preferFlash){
54
+ loadSwf();
55
+ webshims.ready('WINDOWLOAD '+swfType, function(){
56
+ setTimeout(function(){
57
+ if(!options.preferFlash && webshims.mediaelement.createSWF && !media.is('.nonnative-api-active')){
58
+ options.preferFlash = true;
59
+ document.removeEventListener('error', switchOptions, true);
60
+ $('audio, video').each(function(){
61
+ webshims.mediaelement.selectSource(this);
62
+ });
63
+ webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
64
+ }
65
+ }, 9);
66
+ });
67
+ } else{
68
+ document.removeEventListener('error', switchOptions, true);
69
+ }
70
+ });
71
+ }
72
+ };
73
+ document.addEventListener('error', switchOptions, true);
74
+ $('audio, video').each(function(){
75
+ var error = $.prop(this, 'error');
76
+ if(error && !noSwitch[error]){
77
+ switchOptions({target: this});
78
+ return false;
79
+ }
80
+ });
81
+ }
79
82
 
80
83
 
81
- ['removeAttr', 'prop', 'attr'].forEach(function(type){
82
- olds[type] = $[type];
83
- $[type] = function(elem, name, value, pass, _argless){
84
- var isVal = (pass == 'val');
85
- var oldMethod = !isVal ? olds[type] : singleVal;
86
- if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
87
- return oldMethod(elem, name, value, pass, _argless);
88
- }
89
-
90
- var nodeName = (elem.nodeName || '').toLowerCase();
91
- var desc = extendedProps[nodeName];
92
- var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
93
- var propMethod;
94
- var oldValMethod;
95
- var ret;
96
-
84
+ if(Modernizr.track && !bugs.track){
85
+ (function(){
97
86
 
98
- if(!desc){
99
- desc = extendedProps['*'];
100
- }
101
- if(desc){
102
- desc = desc[name];
87
+ if(!bugs.track){
88
+ bugs.track = typeof $('<track />')[0].readyState != 'number';
103
89
  }
104
90
 
105
- if(desc){
106
- propMethod = desc[curType];
91
+ if(!bugs.track){
92
+ try {
93
+ new TextTrackCue(2, 3, '');
94
+ } catch(e){
95
+ bugs.track = true;
96
+ }
107
97
  }
108
98
 
109
- if(propMethod){
110
- if(name == 'value'){
111
- oldValMethod = propMethod.isVal;
112
- propMethod.isVal = isVal;
113
- }
114
- if(curType === 'removeAttr'){
115
- return propMethod.value.call(elem);
116
- } else if(value === undefined){
117
- return (propMethod.get) ?
118
- propMethod.get.call(elem) :
119
- propMethod.value
120
- ;
121
- } else if(propMethod.set) {
122
- if(type == 'attr' && value === true){
123
- value = name;
99
+ var trackOptions = webshims.cfg.track;
100
+ var trackListener = function(e){
101
+ $(e.target).filter('track').each(changeApi);
102
+ };
103
+ var changeApi = function(){
104
+ if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
105
+ trackOptions.override = true;
106
+ webshims.reTest('track');
107
+ document.removeEventListener('error', trackListener, true);
108
+ if(this && $.nodeName(this, 'track')){
109
+ webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
110
+ } else {
111
+ webshims.info("track support was overwritten. due to bad browser support");
124
112
  }
125
-
126
- ret = propMethod.set.call(elem, value);
113
+ return false;
127
114
  }
128
- if(name == 'value'){
129
- propMethod.isVal = oldValMethod;
130
- }
131
- } else {
132
- ret = oldMethod(elem, name, value, pass, _argless);
133
- }
134
- if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
115
+ };
116
+ var detectTrackError = function(){
117
+ document.addEventListener('error', trackListener, true);
135
118
 
136
- var boolValue;
137
- if(curType == 'removeAttr'){
138
- boolValue = false;
139
- } else if(curType == 'prop'){
140
- boolValue = !!(value);
119
+ if(bugs.track){
120
+ changeApi();
141
121
  } else {
142
- boolValue = true;
122
+ $('track').each(changeApi);
123
+ }
124
+ };
125
+ if(!trackOptions.override){
126
+ if(webshims.isReady('track')){
127
+ detectTrackError();
128
+ } else {
129
+ $(detectTrackError);
143
130
  }
144
-
145
- modifyProps[nodeName][name].forEach(function(fn){
146
- if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
147
- fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
148
- }
149
- });
150
131
  }
151
- return ret;
152
- };
132
+ })();
153
133
 
154
- extendQ[type] = function(nodeName, prop, desc){
155
-
156
- if(!extendedProps[nodeName]){
157
- extendedProps[nodeName] = {};
134
+ }
135
+
136
+ webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
137
+ hasSwf = swfmini.hasFlashPlayerVersion('9.0.115');
138
+ $('html').addClass(hasSwf ? 'swf' : 'no-swf');
139
+ var mediaelement = webshims.mediaelement;
140
+ mediaelement.parseRtmp = function(data){
141
+ var src = data.src.split('://');
142
+ var paths = src[1].split('/');
143
+ var i, len, found;
144
+ data.server = src[0]+'://'+paths[0]+'/';
145
+ data.streamId = [];
146
+ for(i = 1, len = paths.length; i < len; i++){
147
+ if(!found && paths[i].indexOf(':') !== -1){
148
+ paths[i] = paths[i].split(':')[1];
149
+ found = true;
158
150
  }
159
- if(!extendedProps[nodeName][prop]){
160
- extendedProps[nodeName][prop] = {};
151
+ if(!found){
152
+ data.server += paths[i]+'/';
153
+ } else {
154
+ data.streamId.push(paths[i]);
161
155
  }
162
- var oldDesc = extendedProps[nodeName][prop][type];
163
- var getSup = function(propType, descriptor, oDesc){
164
- if(descriptor && descriptor[propType]){
165
- return descriptor[propType];
166
- }
167
- if(oDesc && oDesc[propType]){
168
- return oDesc[propType];
169
- }
170
- if(type == 'prop' && prop == 'value'){
171
- return function(value){
172
- var elem = this;
173
- return (desc.isVal) ?
174
- singleVal(elem, prop, value, false, (arguments.length === 0)) :
175
- olds[type](elem, prop, value)
176
- ;
177
- };
178
- }
179
- if(type == 'prop' && propType == 'value' && desc.value.apply){
180
- return function(value){
181
- var sup = olds[type](this, prop);
182
- if(sup && sup.apply){
183
- sup = sup.apply(this, arguments);
184
- }
185
- return sup;
186
- };
187
- }
188
- return function(value){
189
- return olds[type](this, prop, value);
190
- };
191
- };
192
- extendedProps[nodeName][prop][type] = desc;
193
- if(desc.value === undefined){
194
- if(!desc.set){
195
- desc.set = desc.writeable ?
196
- getSup('set', desc, oldDesc) :
197
- (webshims.cfg.useStrict && prop == 'prop') ?
198
- function(){throw(prop +' is readonly on '+ nodeName);} :
199
- $.noop
200
- ;
201
- }
202
- if(!desc.get){
203
- desc.get = getSup('get', desc, oldDesc);
156
+ }
157
+ if(!data.streamId.length){
158
+ webshims.error('Could not parse rtmp url');
159
+ }
160
+ data.streamId = data.streamId.join('/');
161
+ };
162
+ var getSrcObj = function(elem, nodeName){
163
+ elem = $(elem);
164
+ var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
165
+ var tmp;
166
+
167
+ if(!src.src){return src;}
168
+
169
+ tmp = elem.attr('data-server');
170
+ if(tmp != null){
171
+ src.server = tmp;
172
+ }
173
+
174
+ tmp = elem.attr('type');
175
+ if(tmp){
176
+ src.type = tmp;
177
+ src.container = $.trim(tmp.split(';')[0]);
178
+ } else {
179
+ if(!nodeName){
180
+ nodeName = elem[0].nodeName.toLowerCase();
181
+ if(nodeName == 'source'){
182
+ nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
204
183
  }
205
-
206
184
  }
207
-
208
- ['value', 'get', 'set'].forEach(function(descProp){
209
- if(desc[descProp]){
210
- desc['_sup'+descProp] = getSup(descProp, oldDesc);
185
+ if(src.server){
186
+ src.type = nodeName+'/rtmp';
187
+ src.container = nodeName+'/rtmp';
188
+ } else {
189
+
190
+ tmp = mediaelement.getTypeForSrc( src.src, nodeName, src );
191
+
192
+ if(tmp){
193
+ src.type = tmp;
194
+ src.container = tmp;
211
195
  }
196
+ }
197
+ }
198
+ tmp = elem.attr('media');
199
+ if(tmp){
200
+ src.media = tmp;
201
+ }
202
+ if(src.type == 'audio/rtmp' || src.type == 'video/rtmp'){
203
+ if(src.server){
204
+ src.streamId = src.src;
205
+ } else {
206
+ mediaelement.parseRtmp(src);
207
+ }
208
+ }
209
+ return src;
210
+ };
211
+
212
+
213
+
214
+ var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
215
+
216
+ var loadTrackUi = function(){
217
+ if(loadTrackUi.loaded){return;}
218
+ loadTrackUi.loaded = true;
219
+ $(function(){
220
+ webshims.loader.loadList(['track-ui']);
221
+ });
222
+ };
223
+ var loadYt = (function(){
224
+ var loaded;
225
+ return function(){
226
+ if(loaded || !hasYt){return;}
227
+ loaded = true;
228
+ webshims.loader.loadScript("https://www.youtube.com/player_api");
229
+ $(function(){
230
+ webshims._polyfill(["mediaelement-yt"]);
212
231
  });
213
232
  };
214
-
233
+ })();
234
+ var loadThird = function(){
235
+ if(hasSwf){
236
+ loadSwf();
237
+ } else {
238
+ loadYt();
239
+ }
240
+ };
241
+
242
+ webshims.addPolyfill('mediaelement-yt', {
243
+ test: !hasYt,
244
+ d: ['dom-support']
215
245
  });
216
246
 
217
- //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
218
- var isExtendNativeSave = Modernizr.ES5;
219
- var extendNativeValue = (function(){
220
- var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
221
- var has = Object.prototype.hasOwnProperty;
222
- return function(nodeName, prop, desc){
223
- var elem;
224
- var elemProto;
225
- if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
226
- var sup = elem[prop];
227
- desc._supvalue = function(){
228
- if(sup && sup.apply){
229
- return sup.apply(this, arguments);
230
- }
231
- return sup;
232
- };
233
- elemProto[prop] = desc.value;
234
- } else {
235
- desc._supvalue = function(){
236
- var data = elementData(this, 'propValue');
237
- if(data && data[prop] && data[prop].apply){
238
- return data[prop].apply(this, arguments);
239
- }
240
- return data && data[prop];
241
- };
242
- initProp.extendValue(nodeName, prop, desc.value);
247
+ mediaelement.mimeTypes = {
248
+ audio: {
249
+ //ogm shouldn´t be used!
250
+ 'audio/ogg': ['ogg','oga', 'ogm'],
251
+ 'audio/ogg;codecs="opus"': 'opus',
252
+ 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
253
+ 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
254
+ 'audio/wav': ['wav'],
255
+ 'audio/3gpp': ['3gp','3gpp'],
256
+ 'audio/webm': ['webm'],
257
+ 'audio/fla': ['flv', 'f4a', 'fla'],
258
+ 'application/x-mpegURL': ['m3u8', 'm3u']
259
+ },
260
+ video: {
261
+ //ogm shouldn´t be used!
262
+ 'video/ogg': ['ogg','ogv', 'ogm'],
263
+ 'video/mpeg': ['mpg','mpeg','mpe'],
264
+ 'video/mp4': ['mp4','mpg4', 'm4v'],
265
+ 'video/quicktime': ['mov','qt'],
266
+ 'video/x-msvideo': ['avi'],
267
+ 'video/x-ms-asf': ['asf', 'asx'],
268
+ 'video/flv': ['flv', 'f4v'],
269
+ 'video/3gpp': ['3gp','3gpp'],
270
+ 'video/webm': ['webm'],
271
+ 'application/x-mpegURL': ['m3u8', 'm3u'],
272
+ 'video/MP2T': ['ts']
243
273
  }
244
- desc.value._supvalue = desc._supvalue;
245
- };
246
- })();
247
-
248
- var initProp = (function(){
249
-
250
- var initProps = {};
274
+ }
275
+ ;
276
+
277
+ mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
278
+
279
+ mediaelement.getTypeForSrc = function(src, nodeName, data){
280
+ if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
281
+ return 'video/youtube';
282
+ }
283
+ if(src.indexOf('rtmp') === 0){
284
+ return nodeName+'/rtmp';
285
+ }
286
+ src = src.split('?')[0].split('.');
287
+ src = src[src.length - 1];
288
+ var mt;
251
289
 
252
- webshims.addReady(function(context, contextElem){
253
- var nodeNameCache = {};
254
- var getElementsByName = function(name){
255
- if(!nodeNameCache[name]){
256
- nodeNameCache[name] = $(context.getElementsByTagName(name));
257
- if(contextElem[0] && $.nodeName(contextElem[0], name)){
258
- nodeNameCache[name] = nodeNameCache[name].add(contextElem);
259
- }
260
- }
261
- };
262
-
290
+ $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
291
+ if(exts.indexOf(src) !== -1){
292
+ mt = mimeType;
293
+ return false;
294
+ }
295
+ });
296
+ return mt;
297
+ };
298
+
299
+
300
+ mediaelement.srces = function(mediaElem, srces){
301
+ mediaElem = $(mediaElem);
302
+ if(!srces){
303
+ srces = [];
304
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
305
+ var src = getSrcObj(mediaElem, nodeName);
263
306
 
264
- $.each(initProps, function(name, fns){
265
- getElementsByName(name);
266
- if(!fns || !fns.forEach){
267
- webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
268
- return;
269
- }
270
- fns.forEach(function(fn){
271
- nodeNameCache[name].each(fn);
307
+ if(!src.src){
308
+
309
+ $('source', mediaElem).each(function(){
310
+ src = getSrcObj(this, nodeName);
311
+ if(src.src){srces.push(src);}
272
312
  });
273
- });
274
- nodeNameCache = null;
275
- });
276
-
277
- var tempCache;
278
- var emptyQ = $([]);
279
- var createNodeNameInit = function(nodeName, fn){
280
- if(!initProps[nodeName]){
281
- initProps[nodeName] = [fn];
282
313
  } else {
283
- initProps[nodeName].push(fn);
314
+ srces.push(src);
284
315
  }
285
- if($.isDOMReady){
286
- (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
316
+ return srces;
317
+ } else {
318
+ mediaElem.removeAttr('src').removeAttr('type').find('source').remove();
319
+ if(!$.isArray(srces)){
320
+ srces = [srces];
287
321
  }
288
- };
289
-
290
- var elementExtends = {};
291
- return {
292
- createTmpCache: function(nodeName){
293
- if($.isDOMReady){
294
- tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
322
+ srces.forEach(function(src){
323
+ var source = document.createElement('source');
324
+ if(typeof src == 'string'){
325
+ src = {src: src};
326
+ }
327
+ source.setAttribute('src', src.src);
328
+ if(src.type){
329
+ source.setAttribute('type', src.type);
330
+ }
331
+ if(src.media){
332
+ source.setAttribute('media', src.media);
333
+ }
334
+ mediaElem.append(source);
335
+ });
336
+
337
+ }
338
+ };
339
+
340
+
341
+ $.fn.loadMediaSrc = function(srces, poster){
342
+ return this.each(function(){
343
+ if(poster !== undefined){
344
+ $(this).removeAttr('poster');
345
+ if(poster){
346
+ $.attr(this, 'poster', poster);
295
347
  }
296
- return tempCache || emptyQ;
297
- },
298
- flushTmpCache: function(){
299
- tempCache = null;
300
- },
301
- content: function(nodeName, prop){
302
- createNodeNameInit(nodeName, function(){
303
- var val = $.attr(this, prop);
304
- if(val != null){
305
- $.attr(this, prop, val);
306
- }
307
- });
308
- },
309
- createElement: function(nodeName, fn){
310
- createNodeNameInit(nodeName, fn);
311
- },
312
- extendValue: function(nodeName, prop, value){
313
- createNodeNameInit(nodeName, function(){
314
- $(this).each(function(){
315
- var data = elementData(this, 'propValue', {});
316
- data[prop] = this[prop];
317
- this[prop] = value;
318
- });
319
- });
320
348
  }
321
- };
322
- })();
323
-
324
- var createPropDefault = function(descs, removeType){
325
- if(descs.defaultValue === undefined){
326
- descs.defaultValue = '';
349
+ mediaelement.srces(this, srces);
350
+ $(this).mediaLoad();
351
+ });
352
+ };
353
+
354
+ mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
355
+
356
+ mediaelement.canThirdPlaySrces = function(mediaElem, srces){
357
+ var ret = '';
358
+ if(hasSwf || hasYt){
359
+ mediaElem = $(mediaElem);
360
+ srces = srces || mediaelement.srces(mediaElem);
361
+ $.each(srces, function(i, src){
362
+ if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
363
+ ret = src;
364
+ return false;
365
+ }
366
+ });
367
+
327
368
  }
328
- if(!descs.removeAttr){
329
- descs.removeAttr = {
330
- value: function(){
331
- descs[removeType || 'prop'].set.call(this, descs.defaultValue);
332
- descs.removeAttr._supvalue.call(this);
369
+
370
+ return ret;
371
+ };
372
+
373
+ var nativeCanPlayType = {};
374
+ mediaelement.canNativePlaySrces = function(mediaElem, srces){
375
+ var ret = '';
376
+ if(hasNative){
377
+ mediaElem = $(mediaElem);
378
+ var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
379
+ var nativeCanPlay = (nativeCanPlayType[nodeName] || {prop: {_supvalue: false}}).prop._supvalue || mediaElem[0].canPlayType;
380
+ if(!nativeCanPlay){return ret;}
381
+ srces = srces || mediaelement.srces(mediaElem);
382
+
383
+ $.each(srces, function(i, src){
384
+ if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
385
+ ret = src;
386
+ return false;
333
387
  }
334
- };
388
+ });
335
389
  }
336
- if(!descs.attr){
337
- descs.attr = {};
390
+ return ret;
391
+ };
392
+
393
+ mediaelement.setError = function(elem, message){
394
+ if(!message){
395
+ message = "can't play sources";
338
396
  }
397
+
398
+ $(elem).pause().data('mediaerror', message);
399
+ webshims.error('mediaelementError: '+ message);
400
+ setTimeout(function(){
401
+ if($(elem).data('mediaerror')){
402
+ $(elem).trigger('mediaerror');
403
+ }
404
+ }, 1);
339
405
  };
340
406
 
341
- $.extend(webshims, {
342
-
343
- getID: (function(){
344
- var ID = new Date().getTime();
345
- return function(elem){
346
- elem = $(elem);
347
- var id = elem.attr('id');
348
- if(!id){
349
- ID++;
350
- id = 'ID-'+ ID;
351
- elem.attr('id', id);
352
- }
353
- return id;
354
- };
355
- })(),
356
- extendUNDEFProp: function(obj, props){
357
- $.each(props, function(name, prop){
358
- if( !(name in obj) ){
359
- obj[name] = prop;
407
+ var handleThird = (function(){
408
+ var requested;
409
+ return function( mediaElem, ret, data ){
410
+ if(!requested){
411
+ loadTrackUi();
412
+ }
413
+ webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
414
+ if(mediaelement.createSWF){
415
+ mediaelement.createSWF( mediaElem, ret, data );
416
+ } else if(!requested) {
417
+ requested = true;
418
+ loadThird();
419
+ //readd to ready
420
+ handleThird( mediaElem, ret, data );
360
421
  }
361
422
  });
362
- },
363
- //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
364
- createPropDefault: createPropDefault,
365
- data: elementData,
366
- moveToFirstEvent: function(elem, eventType, bindType){
367
- var events = ($._data(elem, 'events') || {})[eventType];
368
- var fn;
369
-
370
- if(events && events.length > 1){
371
- fn = events.pop();
372
- if(!bindType){
373
- bindType = 'bind';
423
+ if(!requested && hasYt && !mediaelement.createSWF){
424
+ loadYt();
425
+ }
426
+ };
427
+ })();
428
+
429
+ var stepSources = function(elem, data, useSwf, _srces, _noLoop){
430
+ var ret;
431
+ if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
432
+ ret = mediaelement.canThirdPlaySrces(elem, _srces);
433
+ if(!ret){
434
+ if(_noLoop){
435
+ mediaelement.setError(elem, false);
436
+ } else {
437
+ stepSources(elem, data, false, _srces, true);
374
438
  }
375
- if(bindType == 'bind' && events.delegateCount){
376
- events.splice( events.delegateCount, 0, fn);
439
+ } else {
440
+ handleThird(elem, ret, data);
441
+ }
442
+ } else {
443
+ ret = mediaelement.canNativePlaySrces(elem, _srces);
444
+ if(!ret){
445
+ if(_noLoop){
446
+ mediaelement.setError(elem, false);
447
+ if(data && data.isActive == 'third') {
448
+ mediaelement.setActive(elem, 'html5', data);
449
+ }
377
450
  } else {
378
- events.unshift( fn );
451
+ stepSources(elem, data, true, _srces, true);
379
452
  }
380
-
381
-
453
+ } else if(data && data.isActive == 'third') {
454
+ mediaelement.setActive(elem, 'html5', data);
382
455
  }
383
- elem = null;
384
- },
385
- addShadowDom: (function(){
386
- var resizeTimer;
387
- var lastHeight;
388
- var lastWidth;
389
-
390
- var docObserve = {
391
- init: false,
392
- runs: 0,
393
- test: function(){
394
- var height = docObserve.getHeight();
395
- var width = docObserve.getWidth();
396
-
397
- if(height != docObserve.height || width != docObserve.width){
398
- docObserve.height = height;
399
- docObserve.width = width;
400
- docObserve.handler({type: 'docresize'});
401
- docObserve.runs++;
402
- if(docObserve.runs < 9){
403
- setTimeout(docObserve.test, 90);
456
+ }
457
+ };
458
+ var stopParent = /^(?:embed|object|datalist)$/i;
459
+ var selectSource = function(elem, data){
460
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
461
+ var _srces = mediaelement.srces(elem);
462
+ var parent = elem.parentNode;
463
+
464
+ clearTimeout(baseData.loadTimer);
465
+ $.data(elem, 'mediaerror', false);
466
+
467
+ if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
468
+ data = data || webshims.data(elem, 'mediaelement');
469
+ stepSources(elem, data, options.preferFlash || undefined, _srces);
470
+ };
471
+ mediaelement.selectSource = selectSource;
472
+
473
+
474
+ $(document).on('ended', function(e){
475
+ var data = webshims.data(e.target, 'mediaelement');
476
+ if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
477
+ setTimeout(function(){
478
+ if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
479
+ $(e.target).prop('currentTime', 0).play();
480
+ }, 1);
481
+
482
+ });
483
+
484
+ webshims.ready('dom-support', function(){
485
+ if(!supportsLoop){
486
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
487
+ }
488
+
489
+ ['audio', 'video'].forEach(function(nodeName){
490
+ var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
491
+ prop: {
492
+ value: function(){
493
+ var data = webshims.data(this, 'mediaelement');
494
+ selectSource(this, data);
495
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
496
+ supLoad.prop._supvalue.apply(this, arguments);
404
497
  }
405
- } else {
406
- docObserve.runs = 0;
407
498
  }
408
- },
409
- handler: function(e){
410
- clearTimeout(resizeTimer);
411
- resizeTimer = setTimeout(function(){
412
- if(e.type == 'resize'){
413
- var width = $(window).width();
414
- var height = $(window).width();
415
- if(height == lastHeight && width == lastWidth){
416
- return;
499
+ }
500
+ });
501
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
502
+ prop: {
503
+ value: function(type){
504
+ var ret = '';
505
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
506
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
507
+ if(ret == 'no'){
508
+ ret = '';
417
509
  }
418
- lastHeight = height;
419
- lastWidth = width;
420
-
421
- docObserve.height = docObserve.getHeight();
422
- docObserve.width = docObserve.getWidth();
423
-
424
510
  }
425
- $(document).triggerHandler('updateshadowdom');
426
- }, (e.type == 'resize') ? 50 : 9);
427
- },
428
- _create: function(){
429
- $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){
430
- var body = document.body;
431
- var doc = document.documentElement;
432
- docObserve[type] = function(){
433
- return Math.max(
434
- body[ "scroll" + name ], doc[ "scroll" + name ],
435
- body[ "offset" + name ], doc[ "offset" + name ],
436
- doc[ "client" + name ]
437
- );
438
- };
439
- });
440
- },
441
- start: function(){
442
- if(!this.init && document.body){
443
- this.init = true;
444
- this._create();
445
- this.height = docObserve.getHeight();
446
- this.width = docObserve.getWidth();
447
- setInterval(this.test, 600);
448
- $(this.test);
449
- webshims.ready('WINDOWLOAD', this.test);
450
- $(window).bind('resize', this.handler);
451
- (function(){
452
- var oldAnimate = $.fn.animate;
453
- var animationTimer;
454
-
455
- $.fn.animate = function(){
456
- clearTimeout(animationTimer);
457
- animationTimer = setTimeout(function(){
458
- docObserve.test();
459
- }, 99);
460
-
461
- return oldAnimate.apply(this, arguments);
462
- };
463
- })();
464
- }
465
- }
466
- };
467
-
468
-
469
- webshims.docObserve = function(){
470
- webshims.ready('DOM', function(){
471
- docObserve.start();
472
- });
473
- };
474
- return function(nativeElem, shadowElem, opts){
475
- opts = opts || {};
476
- if(nativeElem.jquery){
477
- nativeElem = nativeElem[0];
478
- }
479
- if(shadowElem.jquery){
480
- shadowElem = shadowElem[0];
481
- }
482
- var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
483
- var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
484
- var shadowFocusElementData = {};
485
- if(!opts.shadowFocusElement){
486
- opts.shadowFocusElement = shadowElem;
487
- } else if(opts.shadowFocusElement){
488
- if(opts.shadowFocusElement.jquery){
489
- opts.shadowFocusElement = opts.shadowFocusElement[0];
511
+ if(!ret && hasSwf){
512
+ type = $.trim((type || '').split(';')[0]);
513
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
514
+ ret = 'maybe';
515
+ }
516
+ }
517
+ return ret;
490
518
  }
491
- shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
492
- }
493
-
494
- nativeData.hasShadow = shadowElem;
495
- shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
496
- shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
497
- nativeElement: nativeElem,
498
- shadowElement: shadowElem,
499
- shadowFocusElement: opts.shadowFocusElement
500
- };
501
- if(opts.shadowChilds){
502
- opts.shadowChilds.each(function(){
503
- elementData(this, 'shadowData', shadowData.shadowData);
504
- });
505
519
  }
520
+ });
521
+ });
522
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
523
+ set: function(){
524
+ var elem = this;
525
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
526
+ clearTimeout(baseData.loadTimer);
527
+ baseData.loadTimer = setTimeout(function(){
528
+ selectSource(elem);
529
+ elem = null;
530
+ }, 9);
531
+ }
532
+ });
533
+ });
534
+
535
+ var initMediaElements = function(){
536
+ var testFixMedia = function(){
537
+ if(webshims.implement(this, 'mediaelement')){
538
+ selectSource(this);
506
539
 
507
- if(opts.data){
508
- shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
509
- }
510
- opts = null;
511
- webshims.docObserve();
512
- };
513
- })(),
514
- propTypes: {
515
- standard: function(descs, name){
516
- createPropDefault(descs);
517
- if(descs.prop){return;}
518
- descs.prop = {
519
- set: function(val){
520
- descs.attr.set.call(this, ''+val);
521
- },
522
- get: function(){
523
- return descs.attr.get.call(this) || descs.defaultValue;
524
- }
525
- };
526
-
527
- },
528
- "boolean": function(descs, name){
529
-
530
- createPropDefault(descs);
531
- if(descs.prop){return;}
532
- descs.prop = {
533
- set: function(val){
534
- if(val){
535
- descs.attr.set.call(this, "");
536
- } else {
537
- descs.removeAttr.value.call(this);
540
+ if(hasNative){
541
+ var bufferTimer;
542
+ var lastBuffered;
543
+ var elem = this;
544
+ var getBufferedString = function(){
545
+ var buffered = $.prop(elem, 'buffered');
546
+ if(!buffered){return;}
547
+ var bufferString = "";
548
+ for(var i = 0, len = buffered.length; i < len;i++){
549
+ bufferString += buffered.end(i);
538
550
  }
539
- },
540
- get: function(){
541
- return descs.attr.get.call(this) != null;
542
- }
543
- };
544
- },
545
- "src": (function(){
546
- var anchor = document.createElement('a');
547
- anchor.style.display = "none";
548
- return function(descs, name){
549
-
550
- createPropDefault(descs);
551
- if(descs.prop){return;}
552
- descs.prop = {
553
- set: function(val){
554
- descs.attr.set.call(this, val);
555
- },
556
- get: function(){
557
- var href = this.getAttribute(name);
558
- var ret;
559
- if(href == null){return '';}
560
-
561
- anchor.setAttribute('href', href+'' );
562
-
563
- if(!$.support.hrefNormalized){
564
- try {
565
- $(anchor).insertAfter(this);
566
- ret = anchor.getAttribute('href', 4);
567
- } catch(er){
568
- ret = anchor.getAttribute('href', 4);
569
- }
570
- $(anchor).detach();
571
- }
572
- return ret || anchor.href;
551
+ return bufferString;
552
+ };
553
+ var testBuffer = function(){
554
+ var buffered = getBufferedString();
555
+ if(buffered != lastBuffered){
556
+ lastBuffered = buffered;
557
+ $(elem).triggerHandler('progress');
573
558
  }
574
559
  };
575
- };
576
- })(),
577
- enumarated: function(descs, name){
578
560
 
579
- createPropDefault(descs);
580
- if(descs.prop){return;}
581
- descs.prop = {
582
- set: function(val){
583
- descs.attr.set.call(this, val);
584
- },
585
- get: function(){
586
- var val = (descs.attr.get.call(this) || '').toLowerCase();
587
- if(!val || descs.limitedTo.indexOf(val) == -1){
588
- val = descs.defaultValue;
561
+ $(this)
562
+ .on({
563
+ 'play loadstart progress': function(e){
564
+ if(e.type == 'progress'){
565
+ lastBuffered = getBufferedString();
566
+ }
567
+ clearTimeout(bufferTimer);
568
+ bufferTimer = setTimeout(testBuffer, 999);
569
+ },
570
+ 'emptied stalled mediaerror abort suspend': function(e){
571
+ if(e.type == 'emptied'){
572
+ lastBuffered = false;
573
+ }
574
+ clearTimeout(bufferTimer);
589
575
  }
590
- return val;
591
- }
592
- };
576
+ })
577
+ ;
578
+ if('ActiveXObject' in window && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay],.nonnative-api-active)')){
579
+ $(this).prop('preload', 'metadata').mediaLoad();
580
+ }
593
581
  }
594
-
595
- // ,unsignedLong: $.noop
596
- // ,"doubble": $.noop
597
- // ,"long": $.noop
598
- // ,tokenlist: $.noop
599
- // ,settableTokenlist: $.noop
600
- },
601
- reflectProperties: function(nodeNames, props){
602
- if(typeof props == 'string'){
603
- props = props.split(listReg);
604
582
  }
605
- props.forEach(function(prop){
606
- webshims.defineNodeNamesProperty(nodeNames, prop, {
607
- prop: {
608
- set: function(val){
609
- $.attr(this, prop, val);
610
- },
611
- get: function(){
612
- return $.attr(this, prop) || '';
613
- }
614
- }
615
- });
583
+
584
+ };
585
+ var handleMedia = false;
586
+
587
+
588
+ webshims.ready('dom-support', function(){
589
+ handleMedia = true;
590
+ webshims.addReady(function(context, insertedElement){
591
+ var media = $('video, audio', context)
592
+ .add(insertedElement.filter('video, audio'))
593
+ .each(testFixMedia)
594
+ ;
595
+ if(!loadTrackUi.loaded && $('track', media).length){
596
+ loadTrackUi();
597
+ }
598
+ media = null;
616
599
  });
617
- },
618
- defineNodeNameProperty: function(nodeName, prop, descs){
619
- havePolyfill[prop] = true;
620
-
621
- if(descs.reflect){
622
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
600
+ });
601
+
602
+ if(hasNative && !handleMedia){
603
+ webshims.addReady(function(context, insertedElement){
604
+ if(!handleMedia){
605
+ $('video, audio', context)
606
+ .add(insertedElement.filter('video, audio'))
607
+ .each(function(){
608
+ if(!mediaelement.canNativePlaySrces(this) || (!loadTrackUi.loaded && $('track', this).length)){
609
+ loadThird();
610
+ handleMedia = true;
611
+ return false;
612
+ }
613
+ })
614
+ ;
615
+ }
616
+ });
617
+ }
618
+ };
619
+
620
+ if(Modernizr.track && !bugs.track){
621
+ webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
622
+ get: function(){
623
+ return this._shimActiveCues || this.activeCues;
623
624
  }
625
+ });
626
+ }
627
+ //set native implementation ready, before swf api is retested
628
+ if(hasNative){
629
+ webshims.isReady('mediaelement-core', true);
630
+ initMediaElements();
631
+ webshims.ready('WINDOWLOAD mediaelement', loadThird);
632
+ } else {
633
+ webshims.ready(swfType, initMediaElements);
634
+ }
635
+ webshims.ready('WINDOWLOAD mediaelement', loadTrackUi);
636
+ });
637
+ })(jQuery, Modernizr, jQuery.webshims);
638
+ jQuery.webshims.register('track', function($, webshims, window, document, undefined){
639
+ "use strict";
640
+ var mediaelement = webshims.mediaelement;
641
+ var id = new Date().getTime();
642
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
643
+ //descriptions are not really shown, but they are inserted into the dom
644
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
645
+ var notImplemented = function(){
646
+ webshims.error('not implemented yet');
647
+ };
648
+ var dummyTrack = $('<track />');
649
+ var supportTrackMod = Modernizr.ES5 && Modernizr.objectAccessor;
650
+ var createEventTarget = function(obj){
651
+ var eventList = {};
652
+ obj.addEventListener = function(name, fn){
653
+ if(eventList[name]){
654
+ webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
655
+ }
656
+ eventList[name] = fn;
624
657
 
625
- ['prop', 'attr', 'removeAttr'].forEach(function(type){
626
- var desc = descs[type];
627
- if(desc){
628
- if(type === 'prop'){
629
- desc = $.extend({writeable: true}, desc);
630
- } else {
631
- desc = $.extend({}, desc, {writeable: true});
632
- }
633
-
634
- extendQ[type](nodeName, prop, desc);
635
- if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
636
- extendNativeValue(nodeName, prop, desc);
637
- }
638
- descs[type] = desc;
658
+ };
659
+ obj.removeEventListener = function(name, fn){
660
+ if(eventList[name] && eventList[name] != fn){
661
+ webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
662
+ }
663
+ if(eventList[name]){
664
+ delete eventList[name];
665
+ }
666
+ };
667
+ return obj;
668
+ };
669
+
670
+ var cueListProto = {
671
+ getCueById: function(id){
672
+ var cue = null;
673
+ for(var i = 0, len = this.length; i < len; i++){
674
+ if(this[i].id === id){
675
+ cue = this[i];
676
+ break;
639
677
  }
640
- });
641
- if(descs.initAttr){
642
- initProp.content(nodeName, prop);
643
678
  }
644
- return descs;
679
+ return cue;
680
+ }
681
+ };
682
+ var numericModes = {
683
+ 0: 'disabled',
684
+ 1: 'hidden',
685
+ 2: 'showing'
686
+ };
687
+
688
+ var textTrackProto = {
689
+ shimActiveCues: null,
690
+ _shimActiveCues: null,
691
+ activeCues: null,
692
+ cues: null,
693
+ kind: 'subtitles',
694
+ label: '',
695
+ language: '',
696
+ mode: 'disabled',
697
+ readyState: 0,
698
+ oncuechange: null,
699
+ toString: function() {
700
+ return "[object TextTrack]";
645
701
  },
646
-
647
- defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
648
- var olddesc;
649
- for(var prop in descs){
650
- if(!_noTmpCache && descs[prop].initAttr){
651
- initProp.createTmpCache(name);
702
+ addCue: function(cue){
703
+ if(!this.cues){
704
+ this.cues = mediaelement.createCueList();
705
+ } else {
706
+ var lastCue = this.cues[this.cues.length-1];
707
+ if(lastCue && lastCue.startTime > cue.startTime){
708
+ webshims.error("cue startTime higher than previous cue's startTime");
652
709
  }
653
- if(propType){
654
- if(descs[prop][propType]){
655
- //webshims.log('override: '+ name +'['+prop +'] for '+ propType);
656
- } else {
657
- descs[prop][propType] = {};
658
- ['value', 'set', 'get'].forEach(function(copyProp){
659
- if(copyProp in descs[prop]){
660
- descs[prop][propType][copyProp] = descs[prop][copyProp];
661
- delete descs[prop][copyProp];
662
- }
663
- });
664
- }
710
+ }
711
+ if(cue.track && cue.track.removeCue){
712
+ cue.track.removeCue(cue);
713
+ }
714
+ cue.track = this;
715
+ this.cues.push(cue);
716
+ },
717
+ //ToDo: make it more dynamic
718
+ removeCue: function(cue){
719
+ var cues = this.cues || [];
720
+ var i = 0;
721
+ var len = cues.length;
722
+ if(cue.track != this){
723
+ webshims.error("cue not part of track");
724
+ return;
725
+ }
726
+ for(; i < len; i++){
727
+ if(cues[i] === cue){
728
+ cues.splice(i, 1);
729
+ cue.track = null;
730
+ break;
665
731
  }
666
- descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
667
732
  }
668
- if(!_noTmpCache){
669
- initProp.flushTmpCache();
733
+ if(cue.track){
734
+ webshims.error("cue not part of track");
735
+ return;
670
736
  }
671
- return descs;
672
737
  },
738
+ DISABLED: 'disabled',
739
+ OFF: 'disabled',
740
+ HIDDEN: 'hidden',
741
+ SHOWING: 'showing',
742
+ ERROR: 3,
743
+ LOADED: 2,
744
+ LOADING: 1,
745
+ NONE: 0
746
+ };
747
+ var copyProps = ['kind', 'label', 'srclang'];
748
+ var copyName = {srclang: 'language'};
749
+
750
+ var owns = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
751
+
752
+ var updateMediaTrackList = function(baseData, trackList){
753
+ var removed = [];
754
+ var added = [];
755
+ var newTracks = [];
756
+ var i, len;
757
+ if(!baseData){
758
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
759
+ }
673
760
 
674
- createElement: function(nodeName, create, descs){
675
- var ret;
676
- if($.isFunction(create)){
677
- create = {
678
- after: create
679
- };
761
+ if(!trackList){
762
+ baseData.blockTrackListUpdate = true;
763
+ trackList = $.prop(this, 'textTracks');
764
+ baseData.blockTrackListUpdate = false;
765
+ }
766
+
767
+ clearTimeout(baseData.updateTrackListTimer);
768
+
769
+ $('track', this).each(function(){
770
+ var track = $.prop(this, 'track');
771
+ newTracks.push(track);
772
+ if(trackList.indexOf(track) == -1){
773
+ added.push(track);
774
+ }
775
+ });
776
+
777
+ if(baseData.scriptedTextTracks){
778
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
779
+ newTracks.push(baseData.scriptedTextTracks[i]);
780
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
781
+ added.push(baseData.scriptedTextTracks[i]);
782
+ }
680
783
  }
681
- initProp.createTmpCache(nodeName);
682
- if(create.before){
683
- initProp.createElement(nodeName, create.before);
784
+ }
785
+
786
+ for(i = 0, len = trackList.length; i < len; i++){
787
+ if(newTracks.indexOf(trackList[i]) == -1){
788
+ removed.push(trackList[i]);
684
789
  }
685
- if(descs){
686
- ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
790
+ }
791
+
792
+ if(removed.length || added.length){
793
+ trackList.splice(0);
794
+
795
+ for(i = 0, len = newTracks.length; i < len; i++){
796
+ trackList.push(newTracks[i]);
687
797
  }
688
- if(create.after){
689
- initProp.createElement(nodeName, create.after);
798
+ for(i = 0, len = removed.length; i < len; i++){
799
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
690
800
  }
691
- initProp.flushTmpCache();
692
- return ret;
693
- },
694
- onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
695
- if(typeof nodeNames == 'string'){
696
- nodeNames = nodeNames.split(listReg);
801
+ for(i = 0, len = added.length; i < len; i++){
802
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
697
803
  }
698
- if($.isFunction(desc)){
699
- desc = {set: desc};
804
+ if(baseData.scriptedTextTracks || removed.length){
805
+ $(this).triggerHandler('updatetrackdisplay');
700
806
  }
701
-
702
- nodeNames.forEach(function(name){
703
- if(!modifyProps[name]){
704
- modifyProps[name] = {};
705
- }
706
- if(typeof props == 'string'){
707
- props = props.split(listReg);
708
- }
709
- if(desc.initAttr){
710
- initProp.createTmpCache(name);
807
+ }
808
+ };
809
+
810
+ var refreshTrack = function(track, trackData){
811
+ if(!trackData){
812
+ trackData = webshims.data(track, 'trackData');
813
+ }
814
+ if(trackData && !trackData.isTriggering){
815
+ trackData.isTriggering = true;
816
+ setTimeout(function(){
817
+ if(!(trackData.track || {}).readyState){
818
+ $(track).triggerHandler('checktrackmode');
819
+ } else {
820
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
711
821
  }
712
- props.forEach(function(prop){
713
- if(!modifyProps[name][prop]){
714
- modifyProps[name][prop] = [];
715
- havePolyfill[prop] = true;
716
- }
717
- if(desc.set){
718
- if(only){
719
- desc.set.only = only;
822
+ trackData.isTriggering = false;
823
+ }, 1);
824
+ }
825
+ };
826
+
827
+ var emptyDiv = $('<div />')[0];
828
+ window.TextTrackCue = function(startTime, endTime, text){
829
+ if(arguments.length != 3){
830
+ webshims.error("wrong arguments.length for TextTrackCue.constructor");
831
+ }
832
+
833
+ this.startTime = startTime;
834
+ this.endTime = endTime;
835
+ this.text = text;
836
+
837
+ this.id = "";
838
+ this.pauseOnExit = false;
839
+
840
+ createEventTarget(this);
841
+ };
842
+
843
+ window.TextTrackCue.prototype = {
844
+
845
+ onenter: null,
846
+ onexit: null,
847
+ pauseOnExit: false,
848
+ getCueAsHTML: function(){
849
+ var lastText = "";
850
+ var parsedText = "";
851
+ var fragment = document.createDocumentFragment();
852
+ var fn;
853
+ if(!owns(this, 'getCueAsHTML')){
854
+ fn = this.getCueAsHTML = function(){
855
+ var i, len;
856
+ if(lastText != this.text){
857
+ lastText = this.text;
858
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
859
+ emptyDiv.innerHTML = parsedText;
860
+
861
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
862
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
720
863
  }
721
- modifyProps[name][prop].push(desc.set);
722
- }
723
-
724
- if(desc.initAttr){
725
- initProp.content(name, prop);
726
864
  }
727
- });
728
- initProp.flushTmpCache();
865
+ return fragment.cloneNode(true);
866
+ };
729
867
 
730
- });
731
- },
732
- defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
733
- if(!descs){
734
- descs = {};
735
868
  }
736
- if($.isFunction(descs)){
737
- descs.set = descs;
869
+ return fn ? fn.apply(this, arguments) : fragment.cloneNode(true);
870
+ },
871
+ track: null,
872
+
873
+
874
+ id: ''
875
+ //todo-->
876
+ // ,
877
+ // snapToLines: true,
878
+ // line: 'auto',
879
+ // size: 100,
880
+ // position: 50,
881
+ // vertical: '',
882
+ // align: 'middle'
883
+ };
884
+
885
+
886
+
887
+
888
+
889
+ mediaelement.createCueList = function(){
890
+ return $.extend([], cueListProto);
891
+ };
892
+
893
+ mediaelement.parseCueTextToHTML = (function(){
894
+ var tagSplits = /(<\/?[^>]+>)/ig;
895
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
896
+ var regEnd = /\<\s*\//;
897
+ var addToTemplate = function(localName, attribute, tag, html){
898
+ var ret;
899
+ if(regEnd.test(html)){
900
+ ret = '</'+ localName +'>';
901
+ } else {
902
+ tag.splice(0, 1);
903
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '&#34;')) +'">';
738
904
  }
739
- webshims.defineNodeNamesProperty(elementNames, prop, {
740
- attr: {
741
- set: function(val){
742
- this.setAttribute(prop, val);
743
- if(descs.set){
744
- descs.set.call(this, true);
745
- }
746
- },
747
- get: function(){
748
- var ret = this.getAttribute(prop);
749
- return (ret == null) ? undefined : prop;
905
+ return ret;
906
+ };
907
+ var replacer = function(html){
908
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
909
+ if(tag[0]){
910
+ tag[0] = tag[0].toLowerCase();
911
+ if(allowedTags.test(tag[0])){
912
+ if(tag[0] == 'c'){
913
+ html = addToTemplate('span', 'class', tag, html);
914
+ } else if(tag[0] == 'v'){
915
+ html = addToTemplate('q', 'title', tag, html);
750
916
  }
751
- },
752
- removeAttr: {
753
- value: function(){
754
- this.removeAttribute(prop);
755
- if(descs.set){
756
- descs.set.call(this, false);
757
- }
917
+ } else {
918
+ html = "";
919
+ }
920
+ }
921
+ return html;
922
+ };
923
+
924
+ return function(cueText){
925
+ return cueText.replace(tagSplits, replacer);
926
+ };
927
+ })();
928
+
929
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
930
+ var loadEvents = 'play playing timeupdate updatetrackdisplay';
931
+ var obj = trackData.track;
932
+ var load = function(){
933
+ var src = $.prop(track, 'src');
934
+ var error;
935
+ var ajax;
936
+ if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
937
+ $(mediaelem).unbind(loadEvents, load);
938
+ $(track).unbind('checktrackmode', load);
939
+ if(!obj.readyState){
940
+ error = function(){
941
+ obj.readyState = 3;
942
+ obj.cues = null;
943
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
944
+ $(track).triggerHandler('error');
945
+ };
946
+ obj.readyState = 1;
947
+ try {
948
+ obj.cues = mediaelement.createCueList();
949
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
950
+ ajax = $.ajax({
951
+ dataType: 'text',
952
+ url: src,
953
+ success: function(text){
954
+ if(ajax.getResponseHeader('content-type') != 'text/vtt'){
955
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
956
+ }
957
+ mediaelement.parseCaptions(text, obj, function(cues){
958
+ if(cues && 'length' in cues){
959
+ obj.readyState = 2;
960
+ $(track).triggerHandler('load');
961
+ $(mediaelem).triggerHandler('updatetrackdisplay');
962
+ } else {
963
+ error();
964
+ }
965
+ });
966
+
967
+ },
968
+ error: error
969
+ });
970
+ } catch(er){
971
+ error();
972
+ webshims.warn(er);
758
973
  }
759
- },
760
- reflect: true,
761
- propType: 'boolean',
762
- initAttr: descs.initAttr || false
763
- });
764
- },
765
- contentAttr: function(elem, name, val){
766
- if(!elem.nodeName){return;}
767
- var attr;
768
- if(val === undefined){
769
- attr = (elem.attributes[name] || {});
770
- val = attr.specified ? attr.value : null;
771
- return (val == null) ? undefined : val;
974
+ }
772
975
  }
976
+ };
977
+ obj.readyState = 0;
978
+ obj.shimActiveCues = null;
979
+ obj._shimActiveCues = null;
980
+ obj.activeCues = null;
981
+ obj.cues = null;
982
+ $(mediaelem).unbind(loadEvents, load);
983
+ $(track).unbind('checktrackmode', load);
984
+ $(mediaelem).on(loadEvents, load);
985
+ $(track).on('checktrackmode', load);
986
+ if(_default){
987
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
988
+ load();
989
+ }
990
+ };
991
+
992
+ mediaelement.createTextTrack = function(mediaelem, track){
993
+ var obj, trackData;
994
+ if(track.nodeName){
995
+ trackData = webshims.data(track, 'trackData');
773
996
 
774
- if(typeof val == 'boolean'){
775
- if(!val){
776
- elem.removeAttribute(name);
777
- } else {
778
- elem.setAttribute(name, name);
779
- }
780
- } else {
781
- elem.setAttribute(name, val);
997
+ if(trackData){
998
+ refreshTrack(track, trackData);
999
+ obj = trackData.track;
782
1000
  }
783
- },
1001
+ }
784
1002
 
785
- // set current Lang:
786
- // - webshims.activeLang(lang:string);
787
- // get current lang
788
- // - webshims.activeLang();
789
- // get current lang
790
- // webshims.activeLang({
791
- // register: moduleName:string,
792
- // callback: callback:function
793
- // });
794
- // get/set including removeLang
795
- // - webshims.activeLang({
796
- // module: moduleName:string,
797
- // callback: callback:function,
798
- // langObj: languageObj:array/object
799
- // });
800
- activeLang: (function(){
801
- var callbacks = [];
802
- var registeredCallbacks = {};
803
- var currentLang;
804
- var shortLang;
805
- var notLocal = /:\/\/|^\.*\//;
806
- var loadRemoteLang = function(data, lang, options){
807
- var langSrc;
808
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
809
- data.loading = true;
810
- langSrc = options.langSrc;
811
- if(!notLocal.test(langSrc)){
812
- langSrc = webshims.cfg.basePath+langSrc;
1003
+ if(!obj){
1004
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
1005
+
1006
+ if(!supportTrackMod){
1007
+ copyProps.forEach(function(copyProp){
1008
+ var prop = $.prop(track, copyProp);
1009
+ if(prop){
1010
+ obj[copyName[copyProp] || copyProp] = prop;
813
1011
  }
814
- webshims.loader.loadScript(langSrc+lang+'.js', function(){
815
- if(data.langObj[lang]){
816
- data.loading = false;
817
- callLang(data, true);
818
- } else {
819
- $(function(){
820
- if(data.langObj[lang]){
821
- callLang(data, true);
822
- }
823
- data.loading = false;
824
- });
825
- }
1012
+ });
1013
+ }
1014
+
1015
+
1016
+ if(track.nodeName){
1017
+
1018
+ if(supportTrackMod){
1019
+ copyProps.forEach(function(copyProp){
1020
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
1021
+ get: function(){
1022
+ return $.prop(track, copyProp);
1023
+ }
1024
+ });
826
1025
  });
827
- return true;
828
1026
  }
829
- return false;
830
- };
831
- var callRegister = function(module){
832
- if(registeredCallbacks[module]){
833
- registeredCallbacks[module].forEach(function(data){
834
- data.callback();
1027
+
1028
+ trackData = webshims.data(track, 'trackData', {track: obj});
1029
+ mediaelement.loadTextTrack(mediaelem, track, trackData, ($.prop(track, 'default') && $(track).siblings('track[default]')[ADDBACK]()[0] == track));
1030
+ } else {
1031
+ if(supportTrackMod){
1032
+ copyProps.forEach(function(copyProp){
1033
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
1034
+ value: track[copyProp],
1035
+ writeable: false
1036
+ });
835
1037
  });
836
1038
  }
837
- };
838
- var callLang = function(data, _noLoop){
839
- if(data.activeLang != currentLang && data.activeLang !== shortLang){
840
- var options = modules[data.module].options;
841
- if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
842
- data.activeLang = currentLang;
843
- data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
844
- callRegister(data.module);
845
- } else if( !_noLoop &&
846
- !loadRemoteLang(data, currentLang, options) &&
847
- !loadRemoteLang(data, shortLang, options) &&
848
- data.langObj[''] && data.activeLang !== '' ) {
849
- data.activeLang = '';
850
- data.callback(data.langObj[''], currentLang);
851
- callRegister(data.module);
1039
+ obj.cues = mediaelement.createCueList();
1040
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
1041
+ obj.mode = 'hidden';
1042
+ obj.readyState = 2;
1043
+ }
1044
+ }
1045
+ return obj;
1046
+ };
1047
+
1048
+
1049
+ /*
1050
+ taken from:
1051
+ Captionator 0.5.1 [CaptionCrunch]
1052
+ Christopher Giffard, 2011
1053
+ Share and enjoy
1054
+
1055
+ https://github.com/cgiffard/Captionator
1056
+
1057
+ modified for webshims
1058
+ */
1059
+ mediaelement.parseCaptionChunk = (function(){
1060
+ // Set up timestamp parsers
1061
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
1062
+ var GoogleTimestampParser = /^([\d\.]+)\s+\+([\d\.]+)\s*(.*)/;
1063
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
1064
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
1065
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
1066
+
1067
+ return function(subtitleElement,objectCount){
1068
+ var cueDefaults = [];
1069
+
1070
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, cueSettings = "", id, specialCueData;
1071
+ var timestampMatch, tmpCue;
1072
+
1073
+ // WebVTT Special Cue Logic
1074
+ if ((specialCueData = WebVTTDEFAULTSCueParser.exec(subtitleElement))) {
1075
+ // cueDefaults = specialCueData.slice(2).join("");
1076
+ // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
1077
+ return null;
1078
+ } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
1079
+ return null;
1080
+ } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
1081
+ return null; // At this stage, we don't want to do anything with these.
1082
+ }
1083
+
1084
+ subtitleParts = subtitleElement.split(/\n/g);
1085
+
1086
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
1087
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
1088
+ subtitleParts.shift();
1089
+ }
1090
+
1091
+ if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
1092
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
1093
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
1094
+ }
1095
+
1096
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
1097
+ var timestamp = subtitleParts[subtitlePartIndex];
1098
+
1099
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
1100
+
1101
+ // WebVTT
1102
+
1103
+ timeData = timestampMatch.slice(1);
1104
+
1105
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
1106
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
1107
+ parseInt((timeData[2]||0),10) + // Seconds
1108
+ parseFloat("0." + (timeData[3]||0)); // MS
1109
+
1110
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
1111
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
1112
+ parseInt((timeData[6]||0),10) + // Seconds
1113
+ parseFloat("0." + (timeData[7]||0)); // MS
1114
+ /*
1115
+ if (timeData[8]) {
1116
+ cueSettings = timeData[8];
852
1117
  }
1118
+ */
853
1119
  }
854
- };
1120
+
1121
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
1122
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
1123
+ break;
1124
+ }
1125
+
1126
+ if (!timeIn && !timeOut) {
1127
+ // We didn't extract any time information. Assume the cue is invalid!
1128
+ webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
1129
+ return null;
1130
+ }
1131
+ /*
1132
+ // Consolidate cue settings, convert defaults to object
1133
+ var compositeCueSettings =
1134
+ cueDefaults
1135
+ .reduce(function(previous,current,index,array){
1136
+ previous[current.split(":")[0]] = current.split(":")[1];
1137
+ return previous;
1138
+ },{});
1139
+
1140
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
1141
+ compositeCueSettings =
1142
+ cueSettings
1143
+ .split(/\s+/g)
1144
+ .filter(function(set) { return set && !!set.length; })
1145
+ // Convert array to a key/val object
1146
+ .reduce(function(previous,current,index,array){
1147
+ previous[current.split(":")[0]] = current.split(":")[1];
1148
+ return previous;
1149
+ },compositeCueSettings);
1150
+
1151
+ // Turn back into string like the TextTrackCue constructor expects
1152
+ cueSettings = "";
1153
+ for (var key in compositeCueSettings) {
1154
+ if (compositeCueSettings.hasOwnProperty(key)) {
1155
+ cueSettings += !!cueSettings.length ? " " : "";
1156
+ cueSettings += key + ":" + compositeCueSettings[key];
1157
+ }
1158
+ }
1159
+ */
1160
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
1161
+ html = subtitleParts.join("\n");
1162
+ tmpCue = new TextTrackCue(timeIn, timeOut, html);
1163
+ if(id){
1164
+ tmpCue.id = id;
1165
+ }
1166
+ return tmpCue;
1167
+ };
1168
+ })();
1169
+
1170
+ mediaelement.parseCaptions = function(captionData, track, complete) {
1171
+ var subtitles = mediaelement.createCueList();
1172
+ var cue, lazyProcess, regWevVTT;
1173
+ var startDate;
1174
+ var isWEBVTT;
1175
+ if (captionData) {
855
1176
 
1177
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
856
1178
 
857
- var activeLang = function(lang){
1179
+ lazyProcess = function(i, len){
858
1180
 
859
- if(typeof lang == 'string' && lang !== currentLang){
860
- currentLang = lang;
861
- shortLang = currentLang.split('-')[0];
862
- if(currentLang == shortLang){
863
- shortLang = false;
864
- }
865
- $.each(callbacks, function(i, data){
866
- callLang(data);
867
- });
868
- } else if(typeof lang == 'object'){
869
-
870
- if(lang.register){
871
- if(!registeredCallbacks[lang.register]){
872
- registeredCallbacks[lang.register] = [];
1181
+ for(; i < len; i++){
1182
+ cue = captionData[i];
1183
+ if(regWevVTT.test(cue)){
1184
+ isWEBVTT = true;
1185
+ } else if(cue.replace(/\s*/ig,"").length){
1186
+ if(!isWEBVTT){
1187
+ webshims.error('please use WebVTT format. This is the standard');
1188
+ complete(null);
1189
+ break;
873
1190
  }
874
- registeredCallbacks[lang.register].push(lang);
875
- lang.callback();
876
- } else {
877
- if(!lang.activeLang){
878
- lang.activeLang = '';
1191
+ cue = mediaelement.parseCaptionChunk(cue, i);
1192
+ if(cue){
1193
+ track.addCue(cue);
879
1194
  }
880
- callbacks.push(lang);
881
- callLang(lang);
882
1195
  }
1196
+ if(startDate < (new Date().getTime()) - 30){
1197
+ i++;
1198
+ setTimeout(function(){
1199
+ startDate = new Date().getTime();
1200
+ lazyProcess(i, len);
1201
+ }, 90);
1202
+
1203
+ break;
1204
+ }
1205
+ }
1206
+ if(i >= len){
1207
+ if(!isWEBVTT){
1208
+ webshims.error('please use WebVTT format. This is the standard');
1209
+ }
1210
+ complete(track.cues);
883
1211
  }
884
- return currentLang;
885
1212
  };
886
1213
 
887
- return activeLang;
888
- })()
889
- });
890
-
891
- $.each({
892
- defineNodeNamesProperty: 'defineNodeNameProperty',
893
- defineNodeNamesProperties: 'defineNodeNameProperties',
894
- createElements: 'createElement'
895
- }, function(name, baseMethod){
896
- webshims[name] = function(names, a, b, c){
897
- if(typeof names == 'string'){
898
- names = names.split(listReg);
899
- }
900
- var retDesc = {};
901
- names.forEach(function(nodeName){
902
- retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
903
- });
904
- return retDesc;
905
- };
906
- });
1214
+ captionData = captionData.replace(/\r\n/g,"\n");
1215
+
1216
+ setTimeout(function(){
1217
+ captionData = captionData.replace(/\r/g,"\n");
1218
+ setTimeout(function(){
1219
+ startDate = new Date().getTime();
1220
+ captionData = captionData.split(/\n\n+/g);
1221
+ lazyProcess(0, captionData.length);
1222
+ }, 9);
1223
+ }, 9);
1224
+
1225
+ } else {
1226
+ webshims.error("Required parameter captionData not supplied.");
1227
+ }
1228
+ };
907
1229
 
908
- webshims.isReady('webshimLocalization', true);
909
- });
910
- //html5a11y
911
- (function($, document){
912
- //if we support basic styleing or do not support ARIA (assumed) abort
913
- if(!Modernizr.localstorage || ('hidden' in document.createElement('a'))){return;}
914
1230
 
915
- var elemMappings = {
916
- article: "article",
917
- aside: "complementary",
918
- section: "region",
919
- nav: "navigation",
920
- address: "contentinfo"
921
- };
922
- var addRole = function(elem, role){
923
- var hasRole = elem.getAttribute('role');
924
- if (!hasRole) {
925
- elem.setAttribute('role', role);
1231
+ mediaelement.createTrackList = function(mediaelem, baseData){
1232
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
1233
+ if(!baseData.textTracks){
1234
+ baseData.textTracks = [];
1235
+ webshims.defineProperties(baseData.textTracks, {
1236
+ onaddtrack: {value: null},
1237
+ onremovetrack: {value: null}
1238
+ });
1239
+ createEventTarget(baseData.textTracks);
926
1240
  }
1241
+ return baseData.textTracks;
927
1242
  };
928
1243
 
929
- $.webshims.addReady(function(context, contextElem){
930
- $.each(elemMappings, function(name, role){
931
- var elems = $(name, context).add(contextElem.filter(name));
932
- for (var i = 0, len = elems.length; i < len; i++) {
933
- addRole(elems[i], role);
1244
+ if(!Modernizr.track){
1245
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
1246
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
1247
+
1248
+ webshims.defineNodeNameProperties('track', {
1249
+ src: {
1250
+ //attr: {},
1251
+ reflect: true,
1252
+ propType: 'src'
934
1253
  }
935
1254
  });
936
- if (context === document) {
937
- var header = document.getElementsByTagName('header')[0];
938
- var footers = document.getElementsByTagName('footer');
939
- var footerLen = footers.length;
940
- if (header && !$(header).closest('section, article')[0]) {
941
- addRole(header, 'banner');
942
- }
943
- if (!footerLen) {
944
- return;
1255
+ }
1256
+
1257
+ webshims.defineNodeNameProperties('track', {
1258
+ kind: {
1259
+ attr: Modernizr.track ? {
1260
+ set: function(value){
1261
+ var trackData = webshims.data(this, 'trackData');
1262
+ this.setAttribute('data-kind', value);
1263
+ if(trackData){
1264
+ trackData.attrKind = value;
1265
+ }
1266
+ },
1267
+ get: function(){
1268
+ var trackData = webshims.data(this, 'trackData');
1269
+ if(trackData && ('attrKind' in trackData)){
1270
+ return trackData.attrKind;
1271
+ }
1272
+ return this.getAttribute('kind');
1273
+ }
1274
+ } : {},
1275
+ reflect: true,
1276
+ propType: 'enumarated',
1277
+ defaultValue: 'subtitles',
1278
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
1279
+ }
1280
+ });
1281
+
1282
+ $.each(copyProps, function(i, copyProp){
1283
+ var name = copyName[copyProp] || copyProp;
1284
+ webshims.onNodeNamesPropertyModify('track', copyProp, function(){
1285
+ var trackData = webshims.data(this, 'trackData');
1286
+ var track = this;
1287
+ if(trackData){
1288
+ if(copyProp == 'kind'){
1289
+ refreshTrack(this, trackData);
1290
+ }
1291
+ if(!supportTrackMod){
1292
+ trackData.track[name] = $.prop(this, copyProp);
1293
+ }
1294
+ clearTimeout(trackData.changedTrackPropTimer);
1295
+ trackData.changedTrackPropTimer = setTimeout(function(){
1296
+ $(track).trigger('updatesubtitlestate');
1297
+ }, 1);
945
1298
  }
946
- var footer = footers[footerLen - 1];
947
- if (!$(footer).closest('section, article')[0]) {
948
- addRole(footer, 'contentinfo');
1299
+ });
1300
+ });
1301
+
1302
+
1303
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
1304
+ if(val){
1305
+ var data = webshims.data(this, 'trackData');
1306
+ var media;
1307
+ if(data){
1308
+ media = $(this).closest('video, audio');
1309
+ if(media[0]){
1310
+ mediaelement.loadTextTrack(media, this, data);
1311
+ }
949
1312
  }
950
1313
  }
1314
+
951
1315
  });
952
1316
 
953
- })(jQuery, document);
954
-
955
- jQuery.webshims.register('details', function($, webshims, window, doc, undefined, options){
956
- var isInterActiveSummary = function(summary){
957
- var details = $(summary).parent('details');
958
- if(details[0] && details.children(':first').get(0) === summary){
959
- return details;
1317
+ //
1318
+
1319
+ webshims.defineNodeNamesProperties(['track'], {
1320
+ ERROR: {
1321
+ value: 3
1322
+ },
1323
+ LOADED: {
1324
+ value: 2
1325
+ },
1326
+ LOADING: {
1327
+ value: 1
1328
+ },
1329
+ NONE: {
1330
+ value: 0
1331
+ },
1332
+ readyState: {
1333
+ get: function(){
1334
+ return ($.prop(this, 'track') || {readyState: 0}).readyState;
1335
+ },
1336
+ writeable: false
1337
+ },
1338
+ track: {
1339
+ get: function(){
1340
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
1341
+ },
1342
+ writeable: false
960
1343
  }
961
- };
1344
+ }, 'prop');
962
1345
 
963
- var bindDetailsSummary = function(summary, details){
964
- summary = $(summary);
965
- details = $(details);
966
- var oldSummary = $.data(details[0], 'summaryElement');
967
- $.data(summary[0], 'detailsElement', details);
968
- if(!oldSummary || summary[0] !== oldSummary[0]){
969
- if(oldSummary){
970
- if(oldSummary.hasClass('fallback-summary')){
971
- oldSummary.remove();
972
- } else {
973
- oldSummary
974
- .unbind('.summaryPolyfill')
975
- .removeData('detailsElement')
976
- .removeAttr('role')
977
- .removeAttr('tabindex')
978
- .removeAttr('aria-expanded')
979
- .removeClass('summary-button')
980
- .find('span.details-open-indicator')
981
- .remove()
982
- ;
1346
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
1347
+ textTracks: {
1348
+ get: function(){
1349
+ var media = this;
1350
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
1351
+ var tracks = mediaelement.createTrackList(media, baseData);
1352
+ if(!baseData.blockTrackListUpdate){
1353
+ updateMediaTrackList.call(media, baseData, tracks);
983
1354
  }
1355
+ return tracks;
1356
+ },
1357
+ writeable: false
1358
+ },
1359
+ addTextTrack: {
1360
+ value: function(kind, label, lang){
1361
+ var textTrack = mediaelement.createTextTrack(this, {
1362
+ kind: dummyTrack.prop('kind', kind || '').prop('kind'),
1363
+ label: label || '',
1364
+ srclang: lang || ''
1365
+ });
1366
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
1367
+ if (!baseData.scriptedTextTracks) {
1368
+ baseData.scriptedTextTracks = [];
1369
+ }
1370
+ baseData.scriptedTextTracks.push(textTrack);
1371
+ updateMediaTrackList.call(this);
1372
+ return textTrack;
1373
+ }
1374
+ }
1375
+ }, 'prop');
1376
+
1377
+
1378
+ $(document).on('emptied ended updatetracklist', function(e){
1379
+ if($(e.target).is('audio, video')){
1380
+ var baseData = webshims.data(e.target, 'mediaelementBase');
1381
+ if(baseData){
1382
+ clearTimeout(baseData.updateTrackListTimer);
1383
+ baseData.updateTrackListTimer = setTimeout(function(){
1384
+ updateMediaTrackList.call(e.target, baseData);
1385
+ }, 0);
984
1386
  }
985
- $.data(details[0], 'summaryElement', summary);
986
- details.prop('open', details.prop('open'));
987
1387
  }
1388
+ });
1389
+
1390
+ var getNativeReadyState = function(trackElem, textTrack){
1391
+ return textTrack.readyState || trackElem.readyState;
988
1392
  };
989
- var getSummary = function(details){
990
- var summary = $.data(details, 'summaryElement');
991
- if(!summary){
992
- summary = $('> summary:first-child', details);
993
- if(!summary[0]){
994
- $(details).prependPolyfill('<summary class="fallback-summary">'+ options.text +'</summary>');
995
- summary = $.data(details, 'summaryElement');
996
- } else {
997
- bindDetailsSummary(summary, details);
1393
+ var stopOriginalEvent = function(e){
1394
+ if(e.originalEvent){
1395
+ e.stopImmediatePropagation();
1396
+ }
1397
+ };
1398
+ var startTrackImplementation = function(){
1399
+ if(webshims.implement(this, 'track')){
1400
+ var shimedTrack = $.prop(this, 'track');
1401
+ var origTrack = this.track;
1402
+ var kind;
1403
+ var readyState;
1404
+ if(origTrack){
1405
+ kind = $.prop(this, 'kind');
1406
+ readyState = getNativeReadyState(this, origTrack);
1407
+ if (origTrack.mode || readyState) {
1408
+ shimedTrack.mode = numericModes[origTrack.mode] || origTrack.mode;
1409
+ }
1410
+ //disable track from showing + remove UI
1411
+ if(kind != 'descriptions'){
1412
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
1413
+ this.kind = 'metadata';
1414
+ $(this).attr({kind: kind});
1415
+ }
1416
+
998
1417
  }
1418
+ $(this).on('load error', stopOriginalEvent);
999
1419
  }
1000
- return summary;
1001
1420
  };
1002
-
1003
- // var isOriginalPrevented = function(e){
1004
- // var src = e.originalEvent;
1005
- // if(!src){return e.isDefaultPrevented();}
1006
- //
1007
- // return src.defaultPrevented || src.returnValue === false ||
1008
- // src.getPreventDefault && src.getPreventDefault();
1009
- // };
1010
-
1011
- webshims.createElement('summary', function(){
1012
- var details = isInterActiveSummary(this);
1013
- if(!details || $.data(this, 'detailsElement')){return;}
1014
- var timer;
1015
- var stopNativeClickTest;
1016
- var tabindex = $.attr(this, 'tabIndex') || '0';
1017
- bindDetailsSummary(this, details);
1018
- $(this)
1019
- .on({
1020
- 'focus.summaryPolyfill': function(){
1021
- $(this).addClass('summary-has-focus');
1022
- },
1023
- 'blur.summaryPolyfill': function(){
1024
- $(this).removeClass('summary-has-focus');
1025
- },
1026
- 'mouseenter.summaryPolyfill': function(){
1027
- $(this).addClass('summary-has-hover');
1028
- },
1029
- 'mouseleave.summaryPolyfill': function(){
1030
- $(this).removeClass('summary-has-hover');
1031
- },
1032
- 'click.summaryPolyfill': function(e){
1033
- var details = isInterActiveSummary(this);
1034
- if(details){
1035
- if(!stopNativeClickTest && e.originalEvent){
1036
- stopNativeClickTest = true;
1037
- e.stopImmediatePropagation();
1038
- e.preventDefault();
1039
- $(this).trigger('click');
1040
- stopNativeClickTest = false;
1041
- return false;
1042
- } else {
1043
- clearTimeout(timer);
1044
-
1045
- timer = setTimeout(function(){
1046
- if(!e.isDefaultPrevented()){
1047
- details.prop('open', !details.prop('open'));
1048
- }
1049
- }, 0);
1050
- }
1051
- }
1052
- },
1053
- 'keydown.summaryPolyfill': function(e){
1054
- if( (e.keyCode == 13 || e.keyCode == 32) && !e.isDefaultPrevented()){
1055
- stopNativeClickTest = true;
1056
- e.preventDefault();
1057
- $(this).trigger('click');
1058
- stopNativeClickTest = false;
1421
+ webshims.addReady(function(context, insertedElement){
1422
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
1423
+ $('video, audio', context)
1424
+ .add(insertedMedia)
1425
+ .each(function(){
1426
+ updateMediaTrackList.call(this);
1427
+ })
1428
+ .each(function(){
1429
+ if(Modernizr.track){
1430
+ var shimedTextTracks = $.prop(this, 'textTracks');
1431
+ var origTextTracks = this.textTracks;
1432
+ if(shimedTextTracks.length != origTextTracks.length){
1433
+ webshims.error("textTracks couldn't be copied");
1059
1434
  }
1435
+
1436
+ $('track', this).each(startTrackImplementation);
1060
1437
  }
1061
1438
  })
1062
- .attr({tabindex: tabindex, role: 'button'})
1063
- .prepend('<span class="details-open-indicator" />')
1064
1439
  ;
1065
- webshims.moveToFirstEvent(this, 'click');
1440
+ insertedMedia.each(function(){
1441
+ var media = this;
1442
+ var baseData = webshims.data(media, 'mediaelementBase');
1443
+ if(baseData){
1444
+ clearTimeout(baseData.updateTrackListTimer);
1445
+ baseData.updateTrackListTimer = setTimeout(function(){
1446
+ updateMediaTrackList.call(media, baseData);
1447
+ }, 9);
1448
+ }
1449
+ });
1066
1450
  });
1067
1451
 
1068
- var initDetails;
1069
- webshims.defineNodeNamesBooleanProperty('details', 'open', function(val){
1070
- var summary = $($.data(this, 'summaryElement'));
1071
- if(!summary){return;}
1072
- var action = (val) ? 'removeClass' : 'addClass';
1073
- var details = $(this);
1074
- if (!initDetails && options.animate){
1075
- details.stop().css({width: '', height: ''});
1076
- var start = {
1077
- width: details.width(),
1078
- height: details.height()
1079
- };
1080
- }
1081
- summary.attr('aria-expanded', ''+val);
1082
- details[action]('closed-details-summary').children().not(summary[0])[action]('closed-details-child');
1083
- if(!initDetails && options.animate){
1084
- var end = {
1085
- width: details.width(),
1086
- height: details.height()
1087
- };
1088
- details.css(start).animate(end, {
1089
- complete: function(){
1090
- $(this).css({width: '', height: ''});
1091
- }
1092
- });
1093
- }
1094
-
1095
- });
1096
- webshims.createElement('details', function(){
1097
- initDetails = true;
1098
- var summary = getSummary(this);
1099
- $.prop(this, 'open', $.prop(this, 'open'));
1100
- initDetails = false;
1101
- });
1102
- });
1452
+ if(Modernizr.track){
1453
+ $('video, audio').trigger('trackapichange');
1454
+ }
1455
+ });