webshims-rails 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +253 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -10
  6. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +1 -20
  7. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +1 -2
  8. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +1 -30
  9. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +1 -42
  10. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +1 -28
  11. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -0
  13. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -0
  14. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +1 -42
  15. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  16. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +1 -31
  18. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -0
  19. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -0
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +1 -38
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +1 -80
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +1 -45
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +1 -44
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +1 -28
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +1 -19
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +1 -10
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +1 -58
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +1 -66
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +1 -62
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +1 -64
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +1 -73
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -42
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +1 -54
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -57
  35. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +1 -70
  36. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +1 -80
  37. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +1 -60
  38. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +1 -79
  39. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +1 -101
  40. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +1 -95
  41. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +1 -27
  42. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +1 -34
  43. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +1 -56
  44. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +1 -33
  45. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +1 -40
  46. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +1 -39
  47. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +1 -65
  48. data/vendor/assets/javascripts/webshims/minified/shims/details.js +1 -5
  49. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +1 -23
  50. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +1 -15
  51. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +1 -21
  52. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +1 -19
  53. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +1 -22
  54. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +1 -8
  55. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +1 -7
  56. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +1 -10
  57. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +1 -23
  58. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +1 -46
  59. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +1 -5
  60. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +1 -7
  61. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +1 -3
  62. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  63. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +1 -7
  64. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  65. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +1 -3
  66. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +1 -3
  67. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +1 -6
  68. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +1 -6
  69. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +1 -3
  70. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +1 -3
  71. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +1 -4
  72. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +1 -3
  73. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +1 -3
  74. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +1 -8
  75. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +1 -3
  76. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +1 -14
  77. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -0
  78. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  79. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +1 -16
  81. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +1 -23
  82. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -3
  83. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -26
  84. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +1 -14
  85. data/vendor/assets/javascripts/webshims/minified/shims/range-ui.js +1 -0
  86. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +1 -689
  90. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  93. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +1 -9
  94. data/vendor/assets/javascripts/webshims/minified/shims/track.js +1 -21
  95. data/vendor/assets/javascripts/webshims/polyfiller.js +1188 -1191
  96. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvas/README +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  98. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  99. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  100. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  101. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  102. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvasPro/README +82 -82
  103. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  104. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  109. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1752 -1754
  110. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3311 -3247
  111. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1631 -1633
  112. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1697 -1636
  113. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1098 -1100
  114. data/vendor/assets/javascripts/webshims/shims/combos/14.js +477 -476
  115. data/vendor/assets/javascripts/webshims/shims/combos/15.js +317 -316
  116. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2155 -2095
  117. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2320 -2259
  118. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1326 -1322
  119. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2238 -2239
  120. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2341 -2339
  121. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1558 -1493
  122. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1734 -1733
  123. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2361 -2295
  124. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2332 -2269
  125. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2836 -2775
  126. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1549 -1489
  127. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2156 -2095
  128. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3313 -3248
  129. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3022 -3020
  130. data/vendor/assets/javascripts/webshims/shims/combos/4.js +771 -770
  131. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1027 -1025
  132. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1709 -1706
  133. data/vendor/assets/javascripts/webshims/shims/combos/6.js +387 -386
  134. data/vendor/assets/javascripts/webshims/shims/combos/7.js +643 -641
  135. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1547 -1488
  136. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2508 -2445
  137. data/vendor/assets/javascripts/webshims/shims/details.js +148 -148
  138. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +949 -952
  139. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  140. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  141. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -606
  142. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -681
  143. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -164
  144. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  145. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  146. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2 -2
  147. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1568 -1569
  148. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  149. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  150. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  151. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  152. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  153. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  154. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  155. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  156. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  157. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  158. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  159. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  160. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  161. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  162. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  163. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  164. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  165. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  168. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -0
  169. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +597 -536
  170. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +891 -860
  171. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  172. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +960 -957
  173. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  174. data/vendor/assets/javascripts/webshims/shims/range-ui.js +66 -0
  175. data/vendor/assets/javascripts/webshims/shims/styles/details-arrows.png +0 -0
  176. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  177. data/vendor/assets/javascripts/webshims/shims/styles/polyfill-loader.gif +0 -0
  178. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +697 -689
  179. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  180. data/vendor/assets/javascripts/webshims/shims/swf/jwwebshims.swf +0 -0
  181. data/vendor/assets/javascripts/webshims/shims/swf/localStorage.swf +0 -0
  182. data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
  183. data/vendor/assets/javascripts/webshims/shims/track.js +0 -0
  184. metadata +6 -4
@@ -1,99 +1,99 @@
1
- jQuery.webshims.register('mediaelement-native-fix', function($, webshims, window, document, undefined){
2
- if(Modernizr.videoBuffered){return;}
3
-
4
- var getBufferedData = function(elem){
5
- var data = webshims.data(elem, 'mediaelementBuffered');
6
- if(!data){
7
- data = {
8
- buffered: {
9
- start: function(index){
10
- if(index >= data.buffered.length){
11
- webshims.error('buffered index size error');
12
- return;
13
- }
14
- return 0;
15
- },
16
- end: function(index){
17
- if(index >= data.buffered.length){
18
- webshims.error('buffered index size error');
19
- return;
20
- }
21
- return data.loaded;
22
- },
23
- length: 0
24
- },
25
- loaded: 0
26
- };
27
- webshims.data(elem, 'mediaelementBuffered', data);
28
- }
29
- return data;
30
- };
31
-
32
- var loadProgessListener = function(e){
33
- e = e.originalEvent;
34
- if(!e || !('lengthComputable' in e)){return;}
35
- var data = webshims.data(e.target, 'mediaelement');
36
- if(data && data.isActive != 'html5'){return;}
37
- if(e.lengthComputable && 'loaded' in e){
38
- var duration = e.target.duration;
39
- var bufferedData = getBufferedData(e.target);
40
- bufferedData.loaded = (duration) ? e.loaded / e.total * duration : 0;
41
- if(bufferedData.loaded){
42
- bufferedData.buffered.length = 1;
43
- }
44
- if(e.type == 'load'){
45
- $(e.target).triggerHandler('progress');
46
- }
47
- }
48
- };
49
- var removeProgress = function(e){
50
- var data = getBufferedData(e.target);
51
- data.buffered.length = 0;
52
- data.loaded = 0;
53
- };
54
-
55
- ['audio', 'video'].forEach(function(nodeName){
56
- var sup = webshims.defineNodeNameProperty(nodeName, 'buffered', {
57
- prop: {
58
- get: function(){
59
- var data = webshims.data(this, 'mediaelement');
60
-
61
- if(data && data.isActive == 'flash' && sup.prop._supget){
62
- sup.prop._supget.apply(this);
63
- } else {
64
- return getBufferedData(this).buffered;
65
- }
66
- }
67
- }
68
- });
69
- });
70
-
71
- (function(){
72
- var videoElem = document.createElement('video');
73
- if( !('preload' in videoElem) && ('autobuffer' in videoElem)){
74
- var noBufferProps = {
75
- metadata: 1,
76
- none: 1
77
- };
78
- webshims.onNodeNamesPropertyModify(['audio', 'video'], ['preload'], {
79
- set: function(value, boolValue, curType){
80
- if(noBufferProps[value] || curType == 'removeAttr'){
81
- this.autobuffer = false;
82
- } else if( !(webshims.data(this, 'mediaelement') || {}).isActive == 'html5') {
83
- this.autobuffer = true;
84
- }
85
- },
86
- initAttr: true
87
- });
88
- }
89
- })();
90
-
91
- webshims.addReady(function(context, insertedElement){
92
- $('video, audio', context)
93
- .add(insertedElement.filter('video, audio'))
94
- .on('load progress', loadProgessListener)
95
- .on('emptied', removeProgress)
96
- ;
97
- });
98
-
1
+ jQuery.webshims.register('mediaelement-native-fix', function($, webshims, window, document, undefined){
2
+ if(Modernizr.videoBuffered){return;}
3
+
4
+ var getBufferedData = function(elem){
5
+ var data = webshims.data(elem, 'mediaelementBuffered');
6
+ if(!data){
7
+ data = {
8
+ buffered: {
9
+ start: function(index){
10
+ if(index >= data.buffered.length){
11
+ webshims.error('buffered index size error');
12
+ return;
13
+ }
14
+ return 0;
15
+ },
16
+ end: function(index){
17
+ if(index >= data.buffered.length){
18
+ webshims.error('buffered index size error');
19
+ return;
20
+ }
21
+ return data.loaded;
22
+ },
23
+ length: 0
24
+ },
25
+ loaded: 0
26
+ };
27
+ webshims.data(elem, 'mediaelementBuffered', data);
28
+ }
29
+ return data;
30
+ };
31
+
32
+ var loadProgessListener = function(e){
33
+ e = e.originalEvent;
34
+ if(!e || !('lengthComputable' in e)){return;}
35
+ var data = webshims.data(e.target, 'mediaelement');
36
+ if(data && data.isActive != 'html5'){return;}
37
+ if(e.lengthComputable && 'loaded' in e){
38
+ var duration = e.target.duration;
39
+ var bufferedData = getBufferedData(e.target);
40
+ bufferedData.loaded = (duration) ? e.loaded / e.total * duration : 0;
41
+ if(bufferedData.loaded){
42
+ bufferedData.buffered.length = 1;
43
+ }
44
+ if(e.type == 'load'){
45
+ $(e.target).triggerHandler('progress');
46
+ }
47
+ }
48
+ };
49
+ var removeProgress = function(e){
50
+ var data = getBufferedData(e.target);
51
+ data.buffered.length = 0;
52
+ data.loaded = 0;
53
+ };
54
+
55
+ ['audio', 'video'].forEach(function(nodeName){
56
+ var sup = webshims.defineNodeNameProperty(nodeName, 'buffered', {
57
+ prop: {
58
+ get: function(){
59
+ var data = webshims.data(this, 'mediaelement');
60
+
61
+ if(data && data.isActive == 'flash' && sup.prop._supget){
62
+ sup.prop._supget.apply(this);
63
+ } else {
64
+ return getBufferedData(this).buffered;
65
+ }
66
+ }
67
+ }
68
+ });
69
+ });
70
+
71
+ (function(){
72
+ var videoElem = document.createElement('video');
73
+ if( !('preload' in videoElem) && ('autobuffer' in videoElem)){
74
+ var noBufferProps = {
75
+ metadata: 1,
76
+ none: 1
77
+ };
78
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['preload'], {
79
+ set: function(value, boolValue, curType){
80
+ if(noBufferProps[value] || curType == 'removeAttr'){
81
+ this.autobuffer = false;
82
+ } else if( !(webshims.data(this, 'mediaelement') || {}).isActive == 'html5') {
83
+ this.autobuffer = true;
84
+ }
85
+ },
86
+ initAttr: true
87
+ });
88
+ }
89
+ })();
90
+
91
+ webshims.addReady(function(context, insertedElement){
92
+ $('video, audio', context)
93
+ .add(insertedElement.filter('video, audio'))
94
+ .on('load progress', loadProgessListener)
95
+ .on('emptied', removeProgress)
96
+ ;
97
+ });
98
+
99
99
  });
@@ -1,958 +1,961 @@
1
- /*
2
- * todos:
3
- * - decouple muted/volume (needs improvement)
4
- * - implement video <-> flashcanvas pro API
5
- * - improve buffered-property with youtube/rtmp
6
- * - use jwplayer5 api instead of old flash4 api
7
- */
8
-
9
- jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
10
- "use strict";
11
- var SENDEVENT = 'sendEvent';
12
- var mediaelement = webshims.mediaelement;
13
- var swfobject = window.swfobject;
14
- var hasNative = Modernizr.audio && Modernizr.video;
15
- var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
16
- var loadedSwf = 0;
17
- var getProps = {
18
- paused: true,
19
- ended: false,
20
- currentSrc: '',
21
- duration: window.NaN,
22
-
23
- readyState: 0,
24
- networkState: 0,
25
- videoHeight: 0,
26
- videoWidth: 0,
27
- error: null,
28
- buffered: {
29
- start: function(index){
30
- if(index){
31
- webshims.error('buffered index size error');
32
- return;
33
- }
34
- return 0;
35
- },
36
- end: function(index){
37
- if(index){
38
- webshims.error('buffered index size error');
39
- return;
40
- }
41
- return 0;
42
- },
43
- length: 0
44
- }
45
- };
46
- var getPropKeys = Object.keys(getProps);
47
-
48
- var getSetProps = {
49
- currentTime: 0,
50
- volume: 1,
51
- muted: false
52
- };
53
- var getSetPropKeys = Object.keys(getSetProps);
54
-
55
- var playerStateObj = $.extend({
56
- isActive: 'html5',
57
- activating: 'html5',
58
- wasSwfReady: false,
59
- _bufferedEnd: 0,
60
- _bufferedStart: 0,
61
- _metadata: false,
62
- _durationCalcs: -1,
63
- _callMeta: false,
64
- currentTime: 0,
65
- _ppFlag: undefined
66
- }, getProps, getSetProps);
67
-
68
- var idRep = /^jwplayer-/;
69
- var getSwfDataFromID = function(id){
70
-
71
- var elem = document.getElementById(id.replace(idRep, ''));
72
- if(!elem){return;}
73
- var data = webshims.data(elem, 'mediaelement');
74
- return data.isActive == 'third' ? data : null;
75
- };
76
-
77
-
78
- var getSwfDataFromElem = function(elem){
79
- try {
80
- (elem.nodeName);
81
- } catch(er){
82
- return null;
83
- }
84
- var data = webshims.data(elem, 'mediaelement');
85
- return (data && data.isActive== 'third') ? data : null;
86
- };
87
-
88
- var trigger = function(elem, evt){
89
- evt = $.Event(evt);
90
- evt.preventDefault();
91
- $.event.trigger(evt, undefined, elem);
92
- };
93
-
94
- var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
95
- var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
96
-
97
- webshims.extendUNDEFProp(options.params, {
98
- allowscriptaccess: 'always',
99
- allowfullscreen: 'true',
100
- wmode: 'transparent'
101
- });
102
- webshims.extendUNDEFProp(options.vars, {
103
- screencolor: 'ffffffff'
104
- });
105
- webshims.extendUNDEFProp(options.attrs, {
106
- bgcolor: '#000000'
107
- });
108
-
109
- var getDuration = function(data, obj){
110
- var curDuration = data.duration;
111
- if(curDuration && data._durationCalcs > 0){return;}
112
- try {
113
- data.duration = data.jwapi.getPlaylist()[0].duration;
114
- if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
115
- data.duration = curDuration;
116
- }
117
- } catch(er){}
118
- if(data.duration && data.duration != data._lastDuration){
119
- trigger(data._elem, 'durationchange');
120
- if(data._elemNodeName == 'audio' || data._callMeta){
121
- mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
122
- }
123
- data._durationCalcs--;
124
- } else {
125
- data._durationCalcs++;
126
- }
127
- };
128
- var setReadyState = function(readyState, data){
129
- if(readyState < 3){
130
- clearTimeout(data._canplaythroughTimer);
131
- }
132
- if(readyState >= 3 && data.readyState < 3){
133
- data.readyState = readyState;
134
- trigger(data._elem, 'canplay');
135
- clearTimeout(data._canplaythroughTimer);
136
- data._canplaythroughTimer = setTimeout(function(){
137
- setReadyState(4, data);
138
- }, 4000);
139
- }
140
- if(readyState >= 4 && data.readyState < 4){
141
- data.readyState = readyState;
142
- trigger(data._elem, 'canplaythrough');
143
- }
144
- data.readyState = readyState;
145
- };
146
-
147
- $.extend($.event.customEvent, {
148
- updatemediaelementdimensions: true,
149
- flashblocker: true,
150
- swfstageresize: true,
151
- mediaelementapichange: true
152
- });
153
-
154
- mediaelement.jwEvents = {
155
- View: {
156
-
157
- PLAY: function(obj){
158
- var data = getSwfDataFromID(obj.id);
159
- if(!data || data.stopPlayPause){return;}
160
- data._ppFlag = true;
161
- if(data.paused == obj.state){
162
- data.paused = !obj.state;
163
- if(data.ended){
164
- data.ended = false;
165
- }
166
- trigger(data._elem, obj.state ? 'play' : 'pause');
167
- }
168
- }
169
- },
170
- Model: {
171
-
172
- BUFFER: function(obj){
173
- var data = getSwfDataFromID(obj.id);
174
- if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
175
- data.networkState = (obj.percentage == 100) ? 1 : 2;
176
- if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
177
- getDuration(data, obj);
178
- }
179
-
180
- if(data.ended){
181
- data.ended = false;
182
- }
183
- if(!data.duration){
184
- return;
185
- }
186
- if(obj.percentage > 2 && obj.percentage < 20){
187
- setReadyState(3, data);
188
- } else if(obj.percentage > 20){
189
- setReadyState(4, data);
190
- }
191
- if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
192
- data._bufferedStart = data.currentTime || 0;
193
- }
194
-
195
- data._bufferedEnd = obj.percentage;
196
- data.buffered.length = 1;
197
- if(obj.percentage == 100){
198
- data.networkState = 1;
199
- setReadyState(4, data);
200
- }
201
- $.event.trigger('progress', undefined, data._elem, true);
202
- },
203
- META: function(obj, data){
204
-
205
- data = data && data.networkState ? data : getSwfDataFromID(obj.id);
206
-
207
- if(!data){return;}
208
- if( !('duration' in obj) ){
209
- data._callMeta = true;
210
- return;
211
- }
212
-
213
- if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
214
-
215
- data._metadata = true;
216
-
217
- var oldDur = data.duration;
218
- if(obj.duration){
219
- data.duration = obj.duration;
220
- }
221
- data._lastDuration = data.duration;
222
- if(obj.height || obj.width){
223
- data.videoHeight = obj.height || 0;
224
- data.videoWidth = obj.width || 0;
225
- }
226
- if(!data.networkState){
227
- data.networkState = 2;
228
- }
229
- if(data.readyState < 1){
230
- setReadyState(1, data);
231
- }
232
- if(data.duration && oldDur !== data.duration){
233
- trigger(data._elem, 'durationchange');
234
- }
235
-
236
- trigger(data._elem, 'loadedmetadata');
237
- },
238
- TIME: function(obj){
239
- var data = getSwfDataFromID(obj.id);
240
- if(!data || data.currentTime === obj.position){return;}
241
- data.currentTime = obj.position;
242
- if(data.duration && data.duration < data.currentTime){
243
- getDuration(data, obj);
244
- }
245
- if(data.readyState < 2){
246
- setReadyState(2, data);
247
- }
248
- if(data.ended){
249
- data.ended = false;
250
- }
251
- trigger(data._elem, 'timeupdate');
252
-
253
- },
254
- STATE: function(obj){
255
- var data = getSwfDataFromID(obj.id);
256
- if(!data){return;}
257
- switch(obj.newstate) {
258
- case 'BUFFERING':
259
-
260
- if(data.ended){
261
- data.ended = false;
262
- }
263
- setReadyState(1, data);
264
- trigger(data._elem, 'waiting');
265
- break;
266
- case 'PLAYING':
267
- data.paused = false;
268
- data._ppFlag = true;
269
- if(!data.duration){
270
- getDuration(data, obj);
271
- }
272
- if(data.readyState < 3){
273
- setReadyState(3, data);
274
- }
275
- if(data.ended){
276
- data.ended = false;
277
- }
278
- trigger(data._elem, 'playing');
279
- break;
280
- case 'PAUSED':
281
- if(!data.paused && !data.stopPlayPause){
282
- data.paused = true;
283
- data._ppFlag = true;
284
- trigger(data._elem, 'pause');
285
- }
286
- break;
287
- case 'COMPLETED':
288
- if(data.readyState < 4){
289
- setReadyState(4, data);
290
- }
291
- data.ended = true;
292
- trigger(data._elem, 'ended');
293
- break;
294
- }
295
- }
296
- }
297
- ,Controller: {
298
-
299
- ERROR: function(obj){
300
- var data = getSwfDataFromID(obj.id);
301
- if(!data){return;}
302
- mediaelement.setError(data._elem, obj.message);
303
- },
304
- SEEK: function(obj){
305
- var data = getSwfDataFromID(obj.id);
306
- if(!data){return;}
307
- if(data.ended){
308
- data.ended = false;
309
- }
310
- if(data.paused){
311
- try {
312
- data.jwapi[SENDEVENT]('play', 'false');
313
- } catch(er){}
314
- }
315
- if(data.currentTime != obj.position){
316
- data.currentTime = obj.position;
317
- trigger(data._elem, 'timeupdate');
318
- }
319
-
320
-
321
- },
322
- VOLUME: function(obj){
323
- var data = getSwfDataFromID(obj.id);
324
- if(!data){return;}
325
- var newVolume = obj.percentage / 100;
326
- if(data.volume == newVolume){return;}
327
- data.volume = newVolume;
328
- trigger(data._elem, 'volumechange');
329
- },
330
- MUTE: function(obj){
331
- if(obj.state){return;}
332
- var data = getSwfDataFromID(obj.id);
333
- if(!data){return;}
334
- if(data.muted == obj.state){return;}
335
- data.muted = obj.state;
336
- trigger(data._elem, 'volumechange');
337
- }
338
- }
339
- };
340
-
341
- var initEvents = function(data){
342
- var passed = true;
343
- $.each(mediaelement.jwEvents, function(mvcName, evts){
344
- $.each(evts, function(evtName){
345
- try {
346
- data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
347
- } catch(er){
348
- passed = false;
349
- return false;
350
- }
351
- });
352
- });
353
- return passed;
354
- };
355
-
356
- var workActionQueue = function(data){
357
- var actionLen = data.actionQueue.length;
358
- var i = 0;
359
- var operation;
360
- if(actionLen && data.isActive == 'third'){
361
- while(data.actionQueue.length && actionLen > i){
362
- i++;
363
- operation = data.actionQueue.shift();
364
- data.jwapi[operation.fn].apply(data.jwapi, operation.args);
365
- }
366
- }
367
- if(data.actionQueue.length){
368
- data.actionQueue = [];
369
- }
370
- };
371
- var startAutoPlay = function(data){
372
- if(!data){return;}
373
- if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
374
- setTimeout(function(){
375
- if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
376
- try {
377
- $(data._elem).play();
378
- } catch(er){}
379
- }
380
- }, 1);
381
- }
382
- };
383
-
384
-
385
- mediaelement.playerResize = function(id){
386
- if(!id){return;}
387
- var elem = document.getElementById(id.replace(idRep, ''));
388
-
389
- if(elem){
390
- $(elem).triggerHandler('swfstageresize');
391
- }
392
- elem = null;
393
- };
394
-
395
-
396
- $(document).on('emptied', function(e){
397
- var data = getSwfDataFromElem(e.target);
398
- startAutoPlay(data);
399
- });
400
-
401
- var localConnectionTimer;
402
- mediaelement.jwPlayerReady = function(jwData){
403
- var data = getSwfDataFromID(jwData.id);
404
- var passed = true;
405
- var i = 0;
406
- var doneFn = function(){
407
- if(i > 9){return;}
408
- i++;
409
- if(initEvents(data)){
410
- if(!data.wasSwfReady){
411
- var version = parseFloat( jwData.version, 10);
412
- if(version < 5.1 || version >= 6){
413
- webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
414
- }
415
- } else {
416
- $(data._elem).mediaLoad();
417
-
418
- }
419
- data.wasSwfReady = true;
420
- data.tryedReframeing = 0;
421
- workActionQueue(data);
422
- startAutoPlay(data);
423
- } else {
424
- clearTimeout(data.reframeTimer);
425
- data.reframeTimer = setTimeout(doneFn, 9 * i);
426
- if(i > 2 && data.tryedReframeing < 9){
427
- data.tryedReframeing++;
428
- data.shadowElem.css({overflow: 'visible'});
429
- setTimeout(function(){
430
- data.shadowElem.css({overflow: 'hidden'});
431
- }, 16);
432
- }
433
- }
434
- };
435
- if(!data || !data.jwapi){return;}
436
- if(!data.tryedReframeing){
437
- data.tryedReframeing = 0;
438
- }
439
- clearTimeout(localConnectionTimer);
440
- data.jwData = jwData;
441
- data.shadowElem.removeClass('flashblocker-assumed');
442
- $.prop(data._elem, 'volume', data.volume);
443
- $.prop(data._elem, 'muted', data.muted);
444
- doneFn();
445
-
446
- };
447
-
448
- var addMediaToStopEvents = $.noop;
449
- if(hasNative){
450
- var stopEvents = {
451
- play: 1,
452
- playing: 1
453
- };
454
- var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
455
- var hidevents = hideEvtArray.map(function(evt){
456
- return evt +'.webshimspolyfill';
457
- }).join(' ');
458
-
459
- var hidePlayerEvents = function(event){
460
- var data = webshims.data(event.target, 'mediaelement');
461
- if(!data){return;}
462
- var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
463
- if( isNativeHTML5 == (data.activating == 'third') ){
464
- event.stopImmediatePropagation();
465
- if(stopEvents[event.type] && data.isActive != data.activating){
466
- $(event.target).pause();
467
- }
468
- }
469
- };
470
-
471
- addMediaToStopEvents = function(elem){
472
- $(elem)
473
- .off(hidevents)
474
- .on(hidevents, hidePlayerEvents)
475
- ;
476
- hideEvtArray.forEach(function(evt){
477
- webshims.moveToFirstEvent(elem, evt);
478
- });
479
- };
480
- addMediaToStopEvents(document);
481
- }
482
-
483
-
484
- mediaelement.setActive = function(elem, type, data){
485
- if(!data){
486
- data = webshims.data(elem, 'mediaelement');
487
- }
488
- if(!data || data.isActive == type){return;}
489
- if(type != 'html5' && type != 'third'){
490
- webshims.warn('wrong type for mediaelement activating: '+ type);
491
- }
492
- var shadowData = webshims.data(elem, 'shadowData');
493
- data.activating = type;
494
- $(elem).pause();
495
- data.isActive = type;
496
- if(type == 'third'){
497
- shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
498
- $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
499
- } else {
500
- $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
501
- shadowData.shadowElement = shadowData.shadowFocusElement = false;
502
- }
503
- $(elem).trigger('mediaelementapichange');
504
- };
505
-
506
-
507
-
508
- var resetSwfProps = (function(){
509
- var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
510
- var len = resetProtoProps.length;
511
- return function(data){
512
-
513
- if(!data){return;}
514
- var lenI = len;
515
- var networkState = data.networkState;
516
- setReadyState(0, data);
517
- while(--lenI){
518
- delete data[resetProtoProps[lenI]];
519
- }
520
- data.actionQueue = [];
521
- data.buffered.length = 0;
522
- if(networkState){
523
- trigger(data._elem, 'emptied');
524
- }
525
- };
526
- })();
527
-
528
- var setElementDimension = function(data, hasControls){
529
- var elem = data._elem;
530
- var box = data.shadowElem;
531
- $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
532
- if(data._elemNodeName == 'audio' && !hasControls){
533
- box.css({width: 0, height: 0});
534
- } else {
535
- box.css({
536
- width: elem.style.width || $(elem).width(),
537
- height: elem.style.height || $(elem).height()
538
- });
539
- }
540
- };
541
-
542
- mediaelement.createSWF = function( elem, canPlaySrc, data ){
543
- if(!hasFlash){
544
- setTimeout(function(){
545
- $(elem).mediaLoad(); //<- this should produce a mediaerror
546
- }, 1);
547
- return;
548
- }
549
-
550
- if(loadedSwf < 1){
551
- loadedSwf = 1;
552
- } else {
553
- loadedSwf++;
554
- }
555
- var vars = $.extend({}, options.vars, {
556
- image: $.prop(elem, 'poster') || '',
557
- file: canPlaySrc.srcProp
558
- });
559
- var elemVars = $(elem).data('vars') || {};
560
-
561
- if(!data){
562
- data = webshims.data(elem, 'mediaelement');
563
- }
564
-
565
- if(data && data.swfCreated){
566
- mediaelement.setActive(elem, 'third', data);
567
- resetSwfProps(data);
568
- data.currentSrc = canPlaySrc.srcProp;
569
- $.extend(vars, elemVars);
570
- options.changeSWF(vars, elem, canPlaySrc, data, 'load');
571
- queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
572
- return;
573
- }
574
-
575
-
576
- var hasControls = $.prop(elem, 'controls');
577
- var elemId = 'jwplayer-'+ webshims.getID(elem);
578
- var params = $.extend(
579
- {},
580
- options.params,
581
- $(elem).data('params')
582
- );
583
- var elemNodeName = elem.nodeName.toLowerCase();
584
- var attrs = $.extend(
585
- {},
586
- options.attrs,
587
- {
588
- name: elemId,
589
- id: elemId
590
- },
591
- $(elem).data('attrs')
592
- );
593
- var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
594
- .css({
595
- position: 'relative',
596
- overflow: 'hidden'
597
- })
598
- ;
599
- data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
600
- actionQueue: {
601
- value: []
602
- },
603
- shadowElem: {
604
- value: box
605
- },
606
- _elemNodeName: {
607
- value: elemNodeName
608
- },
609
- _elem: {
610
- value: elem
611
- },
612
- currentSrc: {
613
- value: canPlaySrc.srcProp
614
- },
615
- swfCreated: {
616
- value: true
617
- },
618
- buffered: {
619
- value: {
620
- start: function(index){
621
- if(index >= data.buffered.length){
622
- webshims.error('buffered index size error');
623
- return;
624
- }
625
- return 0;
626
- },
627
- end: function(index){
628
- if(index >= data.buffered.length){
629
- webshims.error('buffered index size error');
630
- return;
631
- }
632
- return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
633
- },
634
- length: 0
635
- }
636
- }
637
- }));
638
-
639
- setElementDimension(data, hasControls);
640
-
641
- box.insertBefore(elem);
642
-
643
- if(hasNative){
644
- $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
645
- }
646
-
647
- $.extend(vars,
648
- {
649
- id: elemId,
650
- controlbar: hasControls ? options.vars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
651
- icons: ''+ (hasControls && elemNodeName == 'video')
652
- },
653
- elemVars,
654
- {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
655
- );
656
- if(vars.plugins){
657
- vars.plugins += ','+jwplugin;
658
- } else {
659
- vars.plugins = jwplugin;
660
- }
661
-
662
-
663
- webshims.addShadowDom(elem, box);
664
-
665
- addMediaToStopEvents(elem);
666
-
667
- mediaelement.setActive(elem, 'third', data);
668
-
669
- options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
670
-
671
- $(elem).on('updatemediaelementdimensions updateshadowdom', function(){
672
- setElementDimension(data, $.prop(elem, 'controls'));
673
- });
674
-
675
-
676
- swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
677
-
678
- if(swfData.success){
679
- data.jwapi = swfData.ref;
680
-
681
- if(!hasControls){
682
- $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
683
- }
684
- setTimeout(function(){
685
- if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
686
- box.addClass('flashblocker-assumed');
687
- $(elem).trigger('flashblocker');
688
- webshims.warn("flashblocker assumed");
689
- }
690
- $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
691
- }, 9);
692
- if(!localConnectionTimer){
693
- clearTimeout(localConnectionTimer);
694
- localConnectionTimer = setTimeout(function(){
695
- var flash = $(swfData.ref);
696
- if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
697
- webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
698
- } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
699
- webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
700
- }
701
- flash = null;
702
- }, 8000);
703
- }
704
- }
705
- });
706
- };
707
-
708
-
709
- var queueSwfMethod = function(elem, fn, args, data){
710
- data = data || getSwfDataFromElem(elem);
711
- if(data){
712
- if(data.jwapi && data.jwapi[fn]){
713
- data.jwapi[fn].apply(data.jwapi, args || []);
714
- } else {
715
- //todo add to queue
716
- data.actionQueue.push({fn: fn, args: args});
717
- if(data.actionQueue.length > 10){
718
- setTimeout(function(){
719
- if(data.actionQueue.length > 5){
720
- data.actionQueue.shift();
721
- }
722
- }, 99);
723
- }
724
- }
725
- return data;
726
- }
727
- return false;
728
- };
729
-
730
- ['audio', 'video'].forEach(function(nodeName){
731
- var descs = {};
732
- var mediaSup;
733
- var createGetProp = function(key){
734
- if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
735
-
736
- descs[key] = {
737
- get: function(){
738
- var data = getSwfDataFromElem(this);
739
- if(data){
740
- return data[key];
741
- } else if(hasNative && mediaSup[key].prop._supget) {
742
- return mediaSup[key].prop._supget.apply(this);
743
- } else {
744
- return playerStateObj[key];
745
- }
746
- },
747
- writeable: false
748
- };
749
- };
750
- var createGetSetProp = function(key, setFn){
751
- createGetProp(key);
752
- delete descs[key].writeable;
753
- descs[key].set = setFn;
754
- };
755
-
756
- createGetSetProp('volume', function(v){
757
- var data = getSwfDataFromElem(this);
758
- if(data){
759
- v *= 100;
760
- if(!isNaN(v)){
761
- var muted = data.muted;
762
- if(v < 0 || v > 100){
763
- webshims.error('volume greater or less than allowed '+ (v / 100));
764
- }
765
-
766
- queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
767
- if(muted){
768
- try {
769
- data.jwapi.sendEvent('mute', 'true');
770
- } catch(er){}
771
- }
772
- v /= 100;
773
- if(data.volume == v || data.isActive != 'third'){return;}
774
- data.volume = v;
775
- trigger(data._elem, 'volumechange');
776
- data = null;
777
- }
778
- } else if(mediaSup.volume.prop._supset) {
779
- return mediaSup.volume.prop._supset.apply(this, arguments);
780
- }
781
- });
782
-
783
- createGetSetProp('muted', function(m){
784
- var data = getSwfDataFromElem(this);
785
- if(data){
786
- m = !!m;
787
- queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
788
- if(data.muted == m || data.isActive != 'third'){return;}
789
- data.muted = m;
790
- trigger(data._elem, 'volumechange');
791
- data = null;
792
- } else if(mediaSup.muted.prop._supset) {
793
- return mediaSup.muted.prop._supset.apply(this, arguments);
794
- }
795
- });
796
-
797
-
798
- createGetSetProp('currentTime', function(t){
799
- var data = getSwfDataFromElem(this);
800
- if(data){
801
- t *= 1;
802
- if (!isNaN(t)) {
803
- if(data.paused){
804
- clearTimeout(data.stopPlayPause);
805
- data.stopPlayPause = setTimeout(function(){
806
- data.paused = true;
807
- data.stopPlayPause = false;
808
- }, 50);
809
- }
810
- queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
811
-
812
- if(data.paused){
813
- if(data.readyState > 0){
814
- data.currentTime = t;
815
- trigger(data._elem, 'timeupdate');
816
- }
817
- try {
818
- data.jwapi[SENDEVENT]('play', 'false');
819
- } catch(er){}
820
-
821
- }
822
- }
823
-
824
- } else if(mediaSup.currentTime.prop._supset) {
825
- return mediaSup.currentTime.prop._supset.apply(this, arguments);
826
- }
827
- });
828
-
829
- ['play', 'pause'].forEach(function(fn){
830
- descs[fn] = {
831
- value: function(){
832
- var data = getSwfDataFromElem(this);
833
- if(data){
834
- if(data.stopPlayPause){
835
- clearTimeout(data.stopPlayPause);
836
- }
837
- queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
838
- setTimeout(function(){
839
- if(data.isActive == 'third'){
840
- data._ppFlag = true;
841
- if(data.paused != (fn != 'play')){
842
- data.paused = fn != 'play';
843
- trigger(data._elem, fn);
844
- }
845
- }
846
- }, 1);
847
- } else if(mediaSup[fn].prop._supvalue) {
848
- return mediaSup[fn].prop._supvalue.apply(this, arguments);
849
- }
850
- }
851
- };
852
- });
853
-
854
- getPropKeys.forEach(createGetProp);
855
-
856
- webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
857
- var data = getSwfDataFromElem(this);
858
- $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
859
-
860
- if(data){
861
- try {
862
- queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
863
- } catch(er){
864
- webshims.warn("you need to generate a crossdomain.xml");
865
- }
866
- if(nodeName == 'audio'){
867
- setElementDimension(data, boolProp);
868
- }
869
- $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
870
- }
871
- });
872
-
873
- mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
874
- });
875
-
876
- if(hasFlash){
877
- var oldClean = $.cleanData;
878
- var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
879
- var flashNames = {
880
- object: 1,
881
- OBJECT: 1
882
- };
883
- $.cleanData = function(elems){
884
- var i, len, prop;
885
- if(elems && (len = elems.length) && loadedSwf){
886
-
887
- for(i = 0; i < len; i++){
888
- if(flashNames[elems[i].nodeName]){
889
- if(SENDEVENT in elems[i]){
890
- loadedSwf--;
891
- try {
892
- elems[i][SENDEVENT]('play', false);
893
- } catch(er){}
894
- }
895
- if(gcBrowser){
896
- try {
897
- for (prop in elems[i]) {
898
- if (typeof elems[i][prop] == "function") {
899
- elems[i][prop] = null;
900
- }
901
- }
902
- } catch(er){}
903
- }
904
- }
905
- }
906
-
907
- }
908
- return oldClean.apply(this, arguments);
909
- };
910
- }
911
-
912
- if(!hasNative){
913
-
914
- ['poster', 'src'].forEach(function(prop){
915
- webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
916
- //attr: {},
917
- reflect: true,
918
- propType: 'src'
919
- });
920
- });
921
-
922
-
923
- ['autoplay', 'controls'].forEach(function(name){
924
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
925
- });
926
-
927
- webshims.defineNodeNamesProperties(['audio', 'video'], {
928
- HAVE_CURRENT_DATA: {
929
- value: 2
930
- },
931
- HAVE_ENOUGH_DATA: {
932
- value: 4
933
- },
934
- HAVE_FUTURE_DATA: {
935
- value: 3
936
- },
937
- HAVE_METADATA: {
938
- value: 1
939
- },
940
- HAVE_NOTHING: {
941
- value: 0
942
- },
943
- NETWORK_EMPTY: {
944
- value: 0
945
- },
946
- NETWORK_IDLE: {
947
- value: 1
948
- },
949
- NETWORK_LOADING: {
950
- value: 2
951
- },
952
- NETWORK_NO_SOURCE: {
953
- value: 3
954
- }
955
-
956
- }, 'prop');
957
- }
1
+ /*
2
+ * todos:
3
+ * - decouple muted/volume (needs improvement)
4
+ * - implement video <-> flashcanvas pro API
5
+ * - improve buffered-property with youtube/rtmp
6
+ * - use jwplayer5 api instead of old flash4 api
7
+ */
8
+
9
+ jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
10
+ "use strict";
11
+ var SENDEVENT = 'sendEvent';
12
+ var mediaelement = webshims.mediaelement;
13
+ var swfobject = window.swfobject;
14
+ var hasNative = Modernizr.audio && Modernizr.video;
15
+ var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
16
+ var loadedSwf = 0;
17
+ var getProps = {
18
+ paused: true,
19
+ ended: false,
20
+ currentSrc: '',
21
+ duration: window.NaN,
22
+
23
+ readyState: 0,
24
+ networkState: 0,
25
+ videoHeight: 0,
26
+ videoWidth: 0,
27
+ error: null,
28
+ buffered: {
29
+ start: function(index){
30
+ if(index){
31
+ webshims.error('buffered index size error');
32
+ return;
33
+ }
34
+ return 0;
35
+ },
36
+ end: function(index){
37
+ if(index){
38
+ webshims.error('buffered index size error');
39
+ return;
40
+ }
41
+ return 0;
42
+ },
43
+ length: 0
44
+ }
45
+ };
46
+ var getPropKeys = Object.keys(getProps);
47
+
48
+ var getSetProps = {
49
+ currentTime: 0,
50
+ volume: 1,
51
+ muted: false
52
+ };
53
+ var getSetPropKeys = Object.keys(getSetProps);
54
+
55
+ var playerStateObj = $.extend({
56
+ isActive: 'html5',
57
+ activating: 'html5',
58
+ wasSwfReady: false,
59
+ _bufferedEnd: 0,
60
+ _bufferedStart: 0,
61
+ _metadata: false,
62
+ _durationCalcs: -1,
63
+ _callMeta: false,
64
+ currentTime: 0,
65
+ _ppFlag: undefined
66
+ }, getProps, getSetProps);
67
+
68
+ var idRep = /^jwplayer-/;
69
+ var getSwfDataFromID = function(id){
70
+
71
+ var elem = document.getElementById(id.replace(idRep, ''));
72
+ if(!elem){return;}
73
+ var data = webshims.data(elem, 'mediaelement');
74
+ return data.isActive == 'third' ? data : null;
75
+ };
76
+
77
+
78
+ var getSwfDataFromElem = function(elem){
79
+ try {
80
+ (elem.nodeName);
81
+ } catch(er){
82
+ return null;
83
+ }
84
+ var data = webshims.data(elem, 'mediaelement');
85
+ return (data && data.isActive== 'third') ? data : null;
86
+ };
87
+
88
+ var trigger = function(elem, evt){
89
+ evt = $.Event(evt);
90
+ evt.preventDefault();
91
+ $.event.trigger(evt, undefined, elem);
92
+ };
93
+
94
+ var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
95
+ var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
96
+
97
+ webshims.extendUNDEFProp(options.params, {
98
+ allowscriptaccess: 'always',
99
+ allowfullscreen: 'true',
100
+ wmode: 'transparent'
101
+ });
102
+ webshims.extendUNDEFProp(options.vars, {
103
+ screencolor: 'ffffffff'
104
+ });
105
+ webshims.extendUNDEFProp(options.attrs, {
106
+ bgcolor: '#000000'
107
+ });
108
+
109
+ var getDuration = function(data, obj){
110
+ var curDuration = data.duration;
111
+ if(curDuration && data._durationCalcs > 0){return;}
112
+ try {
113
+ data.duration = data.jwapi.getPlaylist()[0].duration;
114
+ if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
115
+ data.duration = curDuration;
116
+ }
117
+ } catch(er){}
118
+ if(data.duration && data.duration != data._lastDuration){
119
+ trigger(data._elem, 'durationchange');
120
+ if(data._elemNodeName == 'audio' || data._callMeta){
121
+ mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
122
+ }
123
+ data._durationCalcs--;
124
+ } else {
125
+ data._durationCalcs++;
126
+ }
127
+ };
128
+ var setReadyState = function(readyState, data){
129
+ if(readyState < 3){
130
+ clearTimeout(data._canplaythroughTimer);
131
+ }
132
+ if(readyState >= 3 && data.readyState < 3){
133
+ data.readyState = readyState;
134
+ trigger(data._elem, 'canplay');
135
+ clearTimeout(data._canplaythroughTimer);
136
+ data._canplaythroughTimer = setTimeout(function(){
137
+ setReadyState(4, data);
138
+ }, 4000);
139
+ }
140
+ if(readyState >= 4 && data.readyState < 4){
141
+ data.readyState = readyState;
142
+ trigger(data._elem, 'canplaythrough');
143
+ }
144
+ data.readyState = readyState;
145
+ };
146
+
147
+ $.extend($.event.customEvent, {
148
+ updatemediaelementdimensions: true,
149
+ flashblocker: true,
150
+ swfstageresize: true,
151
+ mediaelementapichange: true
152
+ });
153
+
154
+ mediaelement.jwEvents = {
155
+ View: {
156
+
157
+ PLAY: function(obj){
158
+ var data = getSwfDataFromID(obj.id);
159
+ if(!data || data.stopPlayPause){return;}
160
+ data._ppFlag = true;
161
+ if(data.paused == obj.state){
162
+ data.paused = !obj.state;
163
+ if(data.ended){
164
+ data.ended = false;
165
+ }
166
+ trigger(data._elem, obj.state ? 'play' : 'pause');
167
+ }
168
+ }
169
+ },
170
+ Model: {
171
+
172
+ BUFFER: function(obj){
173
+ var data = getSwfDataFromID(obj.id);
174
+ if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
175
+ data.networkState = (obj.percentage == 100) ? 1 : 2;
176
+ if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
177
+ getDuration(data, obj);
178
+ }
179
+
180
+ if(data.ended){
181
+ data.ended = false;
182
+ }
183
+ if(!data.duration){
184
+ return;
185
+ }
186
+ if(obj.percentage > 2 && obj.percentage < 20){
187
+ setReadyState(3, data);
188
+ } else if(obj.percentage > 20){
189
+ setReadyState(4, data);
190
+ }
191
+ if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
192
+ data._bufferedStart = data.currentTime || 0;
193
+ }
194
+
195
+ data._bufferedEnd = obj.percentage;
196
+ data.buffered.length = 1;
197
+ if(obj.percentage == 100){
198
+ data.networkState = 1;
199
+ setReadyState(4, data);
200
+ }
201
+ $.event.trigger('progress', undefined, data._elem, true);
202
+ },
203
+ META: function(obj, data){
204
+
205
+ data = data && data.networkState ? data : getSwfDataFromID(obj.id);
206
+
207
+ if(!data){return;}
208
+ if( !('duration' in obj) ){
209
+ data._callMeta = true;
210
+ return;
211
+ }
212
+
213
+ if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
214
+
215
+ data._metadata = true;
216
+
217
+ var oldDur = data.duration;
218
+ if(obj.duration){
219
+ data.duration = obj.duration;
220
+ }
221
+ data._lastDuration = data.duration;
222
+ if(obj.height || obj.width){
223
+ data.videoHeight = obj.height || 0;
224
+ data.videoWidth = obj.width || 0;
225
+ }
226
+ if(!data.networkState){
227
+ data.networkState = 2;
228
+ }
229
+ if(data.readyState < 1){
230
+ setReadyState(1, data);
231
+ }
232
+ if(data.duration && oldDur !== data.duration){
233
+ trigger(data._elem, 'durationchange');
234
+ }
235
+
236
+ trigger(data._elem, 'loadedmetadata');
237
+ },
238
+ TIME: function(obj){
239
+ var data = getSwfDataFromID(obj.id);
240
+ if(!data || data.currentTime === obj.position){return;}
241
+ data.currentTime = obj.position;
242
+ if(data.duration && data.duration < data.currentTime){
243
+ getDuration(data, obj);
244
+ }
245
+ if(data.readyState < 2){
246
+ setReadyState(2, data);
247
+ }
248
+ if(data.ended){
249
+ data.ended = false;
250
+ }
251
+ trigger(data._elem, 'timeupdate');
252
+
253
+ },
254
+ STATE: function(obj){
255
+ var data = getSwfDataFromID(obj.id);
256
+ if(!data){return;}
257
+ switch(obj.newstate) {
258
+ case 'BUFFERING':
259
+
260
+ if(data.ended){
261
+ data.ended = false;
262
+ }
263
+ setReadyState(1, data);
264
+ trigger(data._elem, 'waiting');
265
+ break;
266
+ case 'PLAYING':
267
+ data.paused = false;
268
+ data._ppFlag = true;
269
+ if(!data.duration){
270
+ getDuration(data, obj);
271
+ }
272
+ if(data.readyState < 3){
273
+ setReadyState(3, data);
274
+ }
275
+ if(data.ended){
276
+ data.ended = false;
277
+ }
278
+ trigger(data._elem, 'playing');
279
+ break;
280
+ case 'PAUSED':
281
+ if(!data.paused && !data.stopPlayPause){
282
+ data.paused = true;
283
+ data._ppFlag = true;
284
+ trigger(data._elem, 'pause');
285
+ }
286
+ break;
287
+ case 'COMPLETED':
288
+ if(data.readyState < 4){
289
+ setReadyState(4, data);
290
+ }
291
+ data.ended = true;
292
+ trigger(data._elem, 'ended');
293
+ break;
294
+ }
295
+ }
296
+ }
297
+ ,Controller: {
298
+
299
+ ERROR: function(obj){
300
+ var data = getSwfDataFromID(obj.id);
301
+ if(!data){return;}
302
+ mediaelement.setError(data._elem, obj.message);
303
+ },
304
+ SEEK: function(obj){
305
+ var data = getSwfDataFromID(obj.id);
306
+ if(!data){return;}
307
+ if(data.ended){
308
+ data.ended = false;
309
+ }
310
+ if(data.paused){
311
+ try {
312
+ data.jwapi[SENDEVENT]('play', 'false');
313
+ } catch(er){}
314
+ }
315
+ if(data.currentTime != obj.position){
316
+ data.currentTime = obj.position;
317
+ trigger(data._elem, 'timeupdate');
318
+ }
319
+
320
+
321
+ },
322
+ VOLUME: function(obj){
323
+ var data = getSwfDataFromID(obj.id);
324
+ if(!data){return;}
325
+ var newVolume = obj.percentage / 100;
326
+ if(data.volume == newVolume){return;}
327
+ data.volume = newVolume;
328
+ trigger(data._elem, 'volumechange');
329
+ },
330
+ MUTE: function(obj){
331
+ if(obj.state){return;}
332
+ var data = getSwfDataFromID(obj.id);
333
+ if(!data){return;}
334
+ if(data.muted == obj.state){return;}
335
+ data.muted = obj.state;
336
+ trigger(data._elem, 'volumechange');
337
+ }
338
+ }
339
+ };
340
+
341
+ var initEvents = function(data){
342
+ var passed = true;
343
+ $.each(mediaelement.jwEvents, function(mvcName, evts){
344
+ $.each(evts, function(evtName){
345
+ try {
346
+ data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
347
+ } catch(er){
348
+ passed = false;
349
+ return false;
350
+ }
351
+ });
352
+ });
353
+ return passed;
354
+ };
355
+
356
+ var workActionQueue = function(data){
357
+ var actionLen = data.actionQueue.length;
358
+ var i = 0;
359
+ var operation;
360
+ if(actionLen && data.isActive == 'third'){
361
+ while(data.actionQueue.length && actionLen > i){
362
+ i++;
363
+ operation = data.actionQueue.shift();
364
+ data.jwapi[operation.fn].apply(data.jwapi, operation.args);
365
+ }
366
+ }
367
+ if(data.actionQueue.length){
368
+ data.actionQueue = [];
369
+ }
370
+ };
371
+ var startAutoPlay = function(data){
372
+ if(!data){return;}
373
+ if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
374
+ setTimeout(function(){
375
+ if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
376
+ try {
377
+ $(data._elem).play();
378
+ } catch(er){}
379
+ }
380
+ }, 1);
381
+ }
382
+ };
383
+
384
+
385
+ mediaelement.playerResize = function(id){
386
+ if(!id){return;}
387
+ var elem = document.getElementById(id.replace(idRep, ''));
388
+
389
+ if(elem){
390
+ $(elem).triggerHandler('swfstageresize');
391
+ }
392
+ elem = null;
393
+ };
394
+
395
+
396
+ $(document).on('emptied', function(e){
397
+ var data = getSwfDataFromElem(e.target);
398
+ startAutoPlay(data);
399
+ });
400
+
401
+ var localConnectionTimer;
402
+ mediaelement.jwPlayerReady = function(jwData){
403
+ var data = getSwfDataFromID(jwData.id);
404
+ var passed = true;
405
+ var i = 0;
406
+ var doneFn = function(){
407
+ if(i > 9){return;}
408
+ i++;
409
+ if(initEvents(data)){
410
+ if(!data.wasSwfReady){
411
+ var version = parseFloat( jwData.version, 10);
412
+ if(version < 5.1 || version >= 6){
413
+ webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
414
+ }
415
+ } else {
416
+ $(data._elem).mediaLoad();
417
+
418
+ }
419
+ data.wasSwfReady = true;
420
+ data.tryedReframeing = 0;
421
+ workActionQueue(data);
422
+ startAutoPlay(data);
423
+ } else {
424
+ clearTimeout(data.reframeTimer);
425
+ data.reframeTimer = setTimeout(doneFn, 9 * i);
426
+ if(i > 2 && data.tryedReframeing < 9){
427
+ data.tryedReframeing++;
428
+ data.shadowElem.css({overflow: 'visible'});
429
+ setTimeout(function(){
430
+ data.shadowElem.css({overflow: 'hidden'});
431
+ }, 16);
432
+ }
433
+ }
434
+ };
435
+ if(!data || !data.jwapi){return;}
436
+ if(!data.tryedReframeing){
437
+ data.tryedReframeing = 0;
438
+ }
439
+ clearTimeout(localConnectionTimer);
440
+ data.jwData = jwData;
441
+ data.shadowElem.removeClass('flashblocker-assumed');
442
+ $.prop(data._elem, 'volume', data.volume);
443
+ $.prop(data._elem, 'muted', data.muted);
444
+ doneFn();
445
+
446
+ };
447
+
448
+ var addMediaToStopEvents = $.noop;
449
+ if(hasNative){
450
+ var stopEvents = {
451
+ play: 1,
452
+ playing: 1
453
+ };
454
+ var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
455
+ var hidevents = hideEvtArray.map(function(evt){
456
+ return evt +'.webshimspolyfill';
457
+ }).join(' ');
458
+
459
+ var hidePlayerEvents = function(event){
460
+ var data = webshims.data(event.target, 'mediaelement');
461
+ if(!data){return;}
462
+ var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
463
+ if( isNativeHTML5 == (data.activating == 'third') ){
464
+ event.stopImmediatePropagation();
465
+ if(stopEvents[event.type] && data.isActive != data.activating){
466
+ $(event.target).pause();
467
+ }
468
+ }
469
+ };
470
+
471
+ addMediaToStopEvents = function(elem){
472
+ $(elem)
473
+ .off(hidevents)
474
+ .on(hidevents, hidePlayerEvents)
475
+ ;
476
+ hideEvtArray.forEach(function(evt){
477
+ webshims.moveToFirstEvent(elem, evt);
478
+ });
479
+ };
480
+ addMediaToStopEvents(document);
481
+ }
482
+
483
+
484
+ mediaelement.setActive = function(elem, type, data){
485
+ if(!data){
486
+ data = webshims.data(elem, 'mediaelement');
487
+ }
488
+ if(!data || data.isActive == type){return;}
489
+ if(type != 'html5' && type != 'third'){
490
+ webshims.warn('wrong type for mediaelement activating: '+ type);
491
+ }
492
+ var shadowData = webshims.data(elem, 'shadowData');
493
+ data.activating = type;
494
+ $(elem).pause();
495
+ data.isActive = type;
496
+ if(type == 'third'){
497
+ shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
498
+ $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
499
+ } else {
500
+ $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
501
+ shadowData.shadowElement = shadowData.shadowFocusElement = false;
502
+ }
503
+ $(elem).trigger('mediaelementapichange');
504
+ };
505
+
506
+
507
+
508
+ var resetSwfProps = (function(){
509
+ var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
510
+ var len = resetProtoProps.length;
511
+ return function(data){
512
+
513
+ if(!data){return;}
514
+ var lenI = len;
515
+ var networkState = data.networkState;
516
+ setReadyState(0, data);
517
+ while(--lenI){
518
+ delete data[resetProtoProps[lenI]];
519
+ }
520
+ data.actionQueue = [];
521
+ data.buffered.length = 0;
522
+ if(networkState){
523
+ trigger(data._elem, 'emptied');
524
+ }
525
+ };
526
+ })();
527
+
528
+ var setElementDimension = function(data, hasControls){
529
+ var elem = data._elem;
530
+ var box = data.shadowElem;
531
+ $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
532
+ if(data._elemNodeName == 'audio' && !hasControls){
533
+ box.css({width: 0, height: 0});
534
+ } else {
535
+ box.css({
536
+ width: elem.style.width || $(elem).width(),
537
+ height: elem.style.height || $(elem).height()
538
+ });
539
+ }
540
+ };
541
+
542
+ mediaelement.createSWF = function( elem, canPlaySrc, data ){
543
+ if(!hasFlash){
544
+ setTimeout(function(){
545
+ $(elem).mediaLoad(); //<- this should produce a mediaerror
546
+ }, 1);
547
+ return;
548
+ }
549
+
550
+ if(loadedSwf < 1){
551
+ loadedSwf = 1;
552
+ } else {
553
+ loadedSwf++;
554
+ }
555
+ var vars = $.extend({}, options.vars, {
556
+ image: $.prop(elem, 'poster') || '',
557
+ file: canPlaySrc.streamId || canPlaySrc.srcProp
558
+ });
559
+ var elemVars = $(elem).data('vars') || {};
560
+
561
+ if(canPlaySrc.server){
562
+ vars.streamer = canPlaySrc.server;
563
+ }
564
+ if(!data){
565
+ data = webshims.data(elem, 'mediaelement');
566
+ }
567
+
568
+ if(data && data.swfCreated){
569
+ mediaelement.setActive(elem, 'third', data);
570
+ resetSwfProps(data);
571
+ data.currentSrc = canPlaySrc.srcProp;
572
+ $.extend(vars, elemVars);
573
+ options.changeSWF(vars, elem, canPlaySrc, data, 'load');
574
+ queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
575
+ return;
576
+ }
577
+
578
+
579
+ var hasControls = $.prop(elem, 'controls');
580
+ var elemId = 'jwplayer-'+ webshims.getID(elem);
581
+ var params = $.extend(
582
+ {},
583
+ options.params,
584
+ $(elem).data('params')
585
+ );
586
+ var elemNodeName = elem.nodeName.toLowerCase();
587
+ var attrs = $.extend(
588
+ {},
589
+ options.attrs,
590
+ {
591
+ name: elemId,
592
+ id: elemId
593
+ },
594
+ $(elem).data('attrs')
595
+ );
596
+ var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
597
+ .css({
598
+ position: 'relative',
599
+ overflow: 'hidden'
600
+ })
601
+ ;
602
+ data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
603
+ actionQueue: {
604
+ value: []
605
+ },
606
+ shadowElem: {
607
+ value: box
608
+ },
609
+ _elemNodeName: {
610
+ value: elemNodeName
611
+ },
612
+ _elem: {
613
+ value: elem
614
+ },
615
+ currentSrc: {
616
+ value: canPlaySrc.srcProp
617
+ },
618
+ swfCreated: {
619
+ value: true
620
+ },
621
+ buffered: {
622
+ value: {
623
+ start: function(index){
624
+ if(index >= data.buffered.length){
625
+ webshims.error('buffered index size error');
626
+ return;
627
+ }
628
+ return 0;
629
+ },
630
+ end: function(index){
631
+ if(index >= data.buffered.length){
632
+ webshims.error('buffered index size error');
633
+ return;
634
+ }
635
+ return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
636
+ },
637
+ length: 0
638
+ }
639
+ }
640
+ }));
641
+
642
+ setElementDimension(data, hasControls);
643
+
644
+ box.insertBefore(elem);
645
+
646
+ if(hasNative){
647
+ $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
648
+ }
649
+
650
+ $.extend(vars,
651
+ {
652
+ id: elemId,
653
+ controlbar: hasControls ? options.vars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
654
+ icons: ''+ (hasControls && elemNodeName == 'video')
655
+ },
656
+ elemVars,
657
+ {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
658
+ );
659
+ if(vars.plugins){
660
+ vars.plugins += ','+jwplugin;
661
+ } else {
662
+ vars.plugins = jwplugin;
663
+ }
664
+
665
+
666
+ webshims.addShadowDom(elem, box);
667
+
668
+ addMediaToStopEvents(elem);
669
+
670
+ mediaelement.setActive(elem, 'third', data);
671
+
672
+ options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
673
+
674
+ $(elem).on('updatemediaelementdimensions updateshadowdom', function(){
675
+ setElementDimension(data, $.prop(elem, 'controls'));
676
+ });
677
+
678
+
679
+ swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
680
+
681
+ if(swfData.success){
682
+ data.jwapi = swfData.ref;
683
+
684
+ if(!hasControls){
685
+ $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
686
+ }
687
+ setTimeout(function(){
688
+ if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
689
+ box.addClass('flashblocker-assumed');
690
+ $(elem).trigger('flashblocker');
691
+ webshims.warn("flashblocker assumed");
692
+ }
693
+ $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
694
+ }, 9);
695
+ if(!localConnectionTimer){
696
+ clearTimeout(localConnectionTimer);
697
+ localConnectionTimer = setTimeout(function(){
698
+ var flash = $(swfData.ref);
699
+ if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
700
+ webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
701
+ } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
702
+ webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
703
+ }
704
+ flash = null;
705
+ }, 8000);
706
+ }
707
+ }
708
+ });
709
+ };
710
+
711
+
712
+ var queueSwfMethod = function(elem, fn, args, data){
713
+ data = data || getSwfDataFromElem(elem);
714
+ if(data){
715
+ if(data.jwapi && data.jwapi[fn]){
716
+ data.jwapi[fn].apply(data.jwapi, args || []);
717
+ } else {
718
+ //todo add to queue
719
+ data.actionQueue.push({fn: fn, args: args});
720
+ if(data.actionQueue.length > 10){
721
+ setTimeout(function(){
722
+ if(data.actionQueue.length > 5){
723
+ data.actionQueue.shift();
724
+ }
725
+ }, 99);
726
+ }
727
+ }
728
+ return data;
729
+ }
730
+ return false;
731
+ };
732
+
733
+ ['audio', 'video'].forEach(function(nodeName){
734
+ var descs = {};
735
+ var mediaSup;
736
+ var createGetProp = function(key){
737
+ if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
738
+
739
+ descs[key] = {
740
+ get: function(){
741
+ var data = getSwfDataFromElem(this);
742
+ if(data){
743
+ return data[key];
744
+ } else if(hasNative && mediaSup[key].prop._supget) {
745
+ return mediaSup[key].prop._supget.apply(this);
746
+ } else {
747
+ return playerStateObj[key];
748
+ }
749
+ },
750
+ writeable: false
751
+ };
752
+ };
753
+ var createGetSetProp = function(key, setFn){
754
+ createGetProp(key);
755
+ delete descs[key].writeable;
756
+ descs[key].set = setFn;
757
+ };
758
+
759
+ createGetSetProp('volume', function(v){
760
+ var data = getSwfDataFromElem(this);
761
+ if(data){
762
+ v *= 100;
763
+ if(!isNaN(v)){
764
+ var muted = data.muted;
765
+ if(v < 0 || v > 100){
766
+ webshims.error('volume greater or less than allowed '+ (v / 100));
767
+ }
768
+
769
+ queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
770
+ if(muted){
771
+ try {
772
+ data.jwapi.sendEvent('mute', 'true');
773
+ } catch(er){}
774
+ }
775
+ v /= 100;
776
+ if(data.volume == v || data.isActive != 'third'){return;}
777
+ data.volume = v;
778
+ trigger(data._elem, 'volumechange');
779
+ data = null;
780
+ }
781
+ } else if(mediaSup.volume.prop._supset) {
782
+ return mediaSup.volume.prop._supset.apply(this, arguments);
783
+ }
784
+ });
785
+
786
+ createGetSetProp('muted', function(m){
787
+ var data = getSwfDataFromElem(this);
788
+ if(data){
789
+ m = !!m;
790
+ queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
791
+ if(data.muted == m || data.isActive != 'third'){return;}
792
+ data.muted = m;
793
+ trigger(data._elem, 'volumechange');
794
+ data = null;
795
+ } else if(mediaSup.muted.prop._supset) {
796
+ return mediaSup.muted.prop._supset.apply(this, arguments);
797
+ }
798
+ });
799
+
800
+
801
+ createGetSetProp('currentTime', function(t){
802
+ var data = getSwfDataFromElem(this);
803
+ if(data){
804
+ t *= 1;
805
+ if (!isNaN(t)) {
806
+ if(data.paused){
807
+ clearTimeout(data.stopPlayPause);
808
+ data.stopPlayPause = setTimeout(function(){
809
+ data.paused = true;
810
+ data.stopPlayPause = false;
811
+ }, 50);
812
+ }
813
+ queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
814
+
815
+ if(data.paused){
816
+ if(data.readyState > 0){
817
+ data.currentTime = t;
818
+ trigger(data._elem, 'timeupdate');
819
+ }
820
+ try {
821
+ data.jwapi[SENDEVENT]('play', 'false');
822
+ } catch(er){}
823
+
824
+ }
825
+ }
826
+
827
+ } else if(mediaSup.currentTime.prop._supset) {
828
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
829
+ }
830
+ });
831
+
832
+ ['play', 'pause'].forEach(function(fn){
833
+ descs[fn] = {
834
+ value: function(){
835
+ var data = getSwfDataFromElem(this);
836
+ if(data){
837
+ if(data.stopPlayPause){
838
+ clearTimeout(data.stopPlayPause);
839
+ }
840
+ queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
841
+ setTimeout(function(){
842
+ if(data.isActive == 'third'){
843
+ data._ppFlag = true;
844
+ if(data.paused != (fn != 'play')){
845
+ data.paused = fn != 'play';
846
+ trigger(data._elem, fn);
847
+ }
848
+ }
849
+ }, 1);
850
+ } else if(mediaSup[fn].prop._supvalue) {
851
+ return mediaSup[fn].prop._supvalue.apply(this, arguments);
852
+ }
853
+ }
854
+ };
855
+ });
856
+
857
+ getPropKeys.forEach(createGetProp);
858
+
859
+ webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
860
+ var data = getSwfDataFromElem(this);
861
+ $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
862
+
863
+ if(data){
864
+ try {
865
+ queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
866
+ } catch(er){
867
+ webshims.warn("you need to generate a crossdomain.xml");
868
+ }
869
+ if(nodeName == 'audio'){
870
+ setElementDimension(data, boolProp);
871
+ }
872
+ $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
873
+ }
874
+ });
875
+
876
+ mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
877
+ });
878
+
879
+ if(hasFlash){
880
+ var oldClean = $.cleanData;
881
+ var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
882
+ var flashNames = {
883
+ object: 1,
884
+ OBJECT: 1
885
+ };
886
+ $.cleanData = function(elems){
887
+ var i, len, prop;
888
+ if(elems && (len = elems.length) && loadedSwf){
889
+
890
+ for(i = 0; i < len; i++){
891
+ if(flashNames[elems[i].nodeName]){
892
+ if(SENDEVENT in elems[i]){
893
+ loadedSwf--;
894
+ try {
895
+ elems[i][SENDEVENT]('play', false);
896
+ } catch(er){}
897
+ }
898
+ if(gcBrowser){
899
+ try {
900
+ for (prop in elems[i]) {
901
+ if (typeof elems[i][prop] == "function") {
902
+ elems[i][prop] = null;
903
+ }
904
+ }
905
+ } catch(er){}
906
+ }
907
+ }
908
+ }
909
+
910
+ }
911
+ return oldClean.apply(this, arguments);
912
+ };
913
+ }
914
+
915
+ if(!hasNative){
916
+
917
+ ['poster', 'src'].forEach(function(prop){
918
+ webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
919
+ //attr: {},
920
+ reflect: true,
921
+ propType: 'src'
922
+ });
923
+ });
924
+
925
+
926
+ ['autoplay', 'controls'].forEach(function(name){
927
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
928
+ });
929
+
930
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
931
+ HAVE_CURRENT_DATA: {
932
+ value: 2
933
+ },
934
+ HAVE_ENOUGH_DATA: {
935
+ value: 4
936
+ },
937
+ HAVE_FUTURE_DATA: {
938
+ value: 3
939
+ },
940
+ HAVE_METADATA: {
941
+ value: 1
942
+ },
943
+ HAVE_NOTHING: {
944
+ value: 0
945
+ },
946
+ NETWORK_EMPTY: {
947
+ value: 0
948
+ },
949
+ NETWORK_IDLE: {
950
+ value: 1
951
+ },
952
+ NETWORK_LOADING: {
953
+ value: 2
954
+ },
955
+ NETWORK_NO_SOURCE: {
956
+ value: 3
957
+ }
958
+
959
+ }, 'prop');
960
+ }
958
961
  });