webshims-rails 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +261 -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 -1
  6. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +24 -24
  7. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/README +82 -82
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +35 -34
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +79 -82
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +45 -44
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -42
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +28 -27
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +4 -4
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +57 -59
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +64 -66
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +53 -54
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +64 -66
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +72 -73
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +42 -46
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -50
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +55 -59
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +66 -64
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +80 -82
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +60 -59
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +79 -81
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +101 -104
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +94 -95
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +26 -29
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +33 -36
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +51 -54
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +27 -28
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +27 -28
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +39 -38
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +65 -68
  35. data/vendor/assets/javascripts/webshims/minified/shims/details.js +4 -4
  36. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +23 -22
  37. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +19 -22
  38. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +14 -14
  39. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +9 -9
  40. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +18 -19
  41. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +45 -43
  42. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  43. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  44. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +12 -12
  45. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +23 -0
  46. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -1
  47. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +26 -30
  48. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +3 -3
  49. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +689 -686
  50. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  52. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -21
  53. data/vendor/assets/javascripts/webshims/polyfiller.js +1191 -1175
  54. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1754 -1714
  55. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3247 -3320
  56. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1633 -1588
  57. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1636 -1591
  58. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1100 -1058
  59. data/vendor/assets/javascripts/webshims/shims/combos/14.js +476 -476
  60. data/vendor/assets/javascripts/webshims/shims/combos/15.js +316 -314
  61. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2094 -2104
  62. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2258 -2267
  63. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1380 -1364
  64. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2239 -2247
  65. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2339 -2294
  66. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1493 -1606
  67. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1733 -1635
  68. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2295 -2408
  69. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2269 -2168
  70. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2775 -2780
  71. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1505 -1456
  72. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2111 -2115
  73. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3264 -3331
  74. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3020 -2970
  75. data/vendor/assets/javascripts/webshims/shims/combos/4.js +770 -822
  76. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1025 -1077
  77. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1706 -1753
  78. data/vendor/assets/javascripts/webshims/shims/combos/6.js +444 -433
  79. data/vendor/assets/javascripts/webshims/shims/combos/7.js +699 -688
  80. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1488 -1445
  81. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2445 -2518
  82. data/vendor/assets/javascripts/webshims/shims/details.js +148 -146
  83. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +952 -912
  84. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  85. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  86. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -659
  87. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -676
  88. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -163
  89. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  90. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  91. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +61 -50
  92. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1569 -1472
  93. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  94. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  95. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  96. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  97. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  98. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  99. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  100. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  101. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  102. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  103. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  104. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  105. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  106. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  107. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  108. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  109. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  110. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  111. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +536 -533
  112. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +861 -0
  113. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  114. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +957 -1073
  115. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  116. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +689 -686
  117. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/track-ui.js +9 -8
  119. data/vendor/assets/javascripts/webshims/shims/track.js +17 -11
  120. metadata +6 -6
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-native-fix.js +0 -7
  122. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  123. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  124. data/vendor/assets/javascripts/webshims/shims/form-native-fix.js +0 -261
@@ -1,1607 +1,1494 @@
1
- (function($, Modernizr, webshims){
2
- "use strict";
3
- var hasNative = Modernizr.audio && Modernizr.video;
4
- var supportsLoop = false;
5
- var options = webshims.cfg.mediaelement;
6
- var bugs = webshims.bugs;
7
- var loadSwf = function(){
8
- webshims.ready('mediaelement-swf', function(){
9
- if(!webshims.mediaelement.createSWF){
10
- webshims.modules["mediaelement-swf"].test = $.noop;
11
- webshims.reTest(["mediaelement-swf"], hasNative);
12
- }
13
- });
14
- };
15
- var hasSwf;
16
- if(hasNative){
17
- var videoElem = document.createElement('video');
18
- Modernizr.videoBuffered = ('buffered' in videoElem);
19
- supportsLoop = ('loop' in videoElem);
20
-
21
- webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
22
-
23
- if(!Modernizr.videoBuffered){
24
- webshims.addPolyfill('mediaelement-native-fix', {
25
- f: 'mediaelement',
26
- test: Modernizr.videoBuffered,
27
- d: ['dom-support']
28
- });
29
-
30
- webshims.reTest('mediaelement-native-fix');
31
- }
32
- }
33
-
34
- if(hasNative && !options.preferFlash){
35
- var switchOptions = function(e){
36
- var parent = e.target.parentNode;
37
- if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
38
- webshims.ready('DOM mediaelement', function(){
39
- if(hasSwf){
40
- loadSwf();
41
- }
42
- webshims.ready('WINDOWLOAD mediaelement-swf', function(){
43
- setTimeout(function(){
44
- if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
45
- options.preferFlash = true;
46
- document.removeEventListener('error', switchOptions, true);
47
- $('audio, video').mediaLoad();
48
- webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
49
- } else if(!hasSwf){
50
- document.removeEventListener('error', switchOptions, true);
51
- }
52
- }, 20);
53
- });
54
- });
55
- }
56
- };
57
- document.addEventListener('error', switchOptions, true);
58
- $('audio, video').each(function(){
59
- if(this.error){
60
- switchOptions({target: this});
61
- }
62
- });
63
- }
64
-
65
- bugs.track = false;
66
-
67
- if(Modernizr.track){
68
- (function(){
69
-
70
- if(!bugs.track){
71
- bugs.track = typeof $('<track />')[0].readyState != 'number';
72
- }
73
-
74
- if(!bugs.track){
75
- try {
76
- new TextTrackCue(2, 3, '');
77
- } catch(e){
78
- bugs.track = true;
79
- }
80
- }
81
-
82
- var trackOptions = webshims.cfg.track;
83
- var trackListener = function(e){
84
- $(e.target).filter('track').each(changeApi);
85
- };
86
- var changeApi = function(){
87
- if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
88
- trackOptions.override = true;
89
- webshims.reTest('track');
90
- document.removeEventListener('error', trackListener, true);
91
- if(this && $.nodeName(this, 'track')){
92
- webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
93
- } else {
94
- webshims.info("track support was overwritten. due to bad browser support");
95
- }
96
- }
97
- };
98
- var detectTrackError = function(){
99
- document.addEventListener('error', trackListener, true);
100
-
101
- if(bugs.track){
102
- changeApi();
103
- } else {
104
- $('track').each(changeApi);
105
- }
106
- };
107
- if(!trackOptions.override){
108
- if(webshims.isReady('track')){
109
- detectTrackError();
110
- } else {
111
- $(detectTrackError);
112
- }
113
- }
114
- })();
115
-
116
- }
117
-
118
- webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
119
- hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
120
-
121
- var mediaelement = webshims.mediaelement;
122
-
123
- var getSrcObj = function(elem, nodeName){
124
- elem = $(elem);
125
- var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
126
- if(!src.src){return src;}
127
- var tmp = elem.attr('type');
128
- if(tmp){
129
- src.type = tmp;
130
- src.container = $.trim(tmp.split(';')[0]);
131
- } else {
132
- if(!nodeName){
133
- nodeName = elem[0].nodeName.toLowerCase();
134
- if(nodeName == 'source'){
135
- nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
136
- }
137
- }
138
- tmp = mediaelement.getTypeForSrc(src.src, nodeName );
139
-
140
- if(tmp){
141
- src.type = tmp;
142
- src.container = tmp;
143
- }
144
- }
145
- tmp = elem.attr('media');
146
- if(tmp){
147
- src.media = tmp;
148
- }
149
- return src;
150
- };
151
-
152
-
153
-
154
- var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
155
-
156
- var loadYt = (function(){
157
- var loaded;
158
- return function(){
159
- if(loaded || !hasYt){return;}
160
- loaded = true;
161
- webshims.loader.loadScript("https://www.youtube.com/player_api");
162
- $(function(){
163
- webshims.polyfill("mediaelement-yt");
164
- });
165
- };
166
- })();
167
- var loadThird = function(){
168
- if(hasSwf){
169
- loadSwf();
170
- } else {
171
- loadYt();
172
- }
173
- };
174
-
175
- webshims.addPolyfill('mediaelement-yt', {
176
- test: !hasYt,
177
- d: ['dom-support']
178
- });
179
-
180
- mediaelement.mimeTypes = {
181
- audio: {
182
- //ogm shouldn´t be used!
183
- 'audio/ogg': ['ogg','oga', 'ogm'],
184
- 'audio/ogg;codecs="opus"': 'opus',
185
- 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
186
- 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
187
- 'audio/wav': ['wav'],
188
- 'audio/3gpp': ['3gp','3gpp'],
189
- 'audio/webm': ['webm'],
190
- 'audio/fla': ['flv', 'f4a', 'fla'],
191
- 'application/x-mpegURL': ['m3u8', 'm3u']
192
- },
193
- video: {
194
- //ogm shouldn´t be used!
195
- 'video/ogg': ['ogg','ogv', 'ogm'],
196
- 'video/mpeg': ['mpg','mpeg','mpe'],
197
- 'video/mp4': ['mp4','mpg4', 'm4v'],
198
- 'video/quicktime': ['mov','qt'],
199
- 'video/x-msvideo': ['avi'],
200
- 'video/x-ms-asf': ['asf', 'asx'],
201
- 'video/flv': ['flv', 'f4v'],
202
- 'video/3gpp': ['3gp','3gpp'],
203
- 'video/webm': ['webm'],
204
- 'application/x-mpegURL': ['m3u8', 'm3u'],
205
- 'video/MP2T': ['ts']
206
- }
207
- }
208
- ;
209
-
210
- mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
211
-
212
- mediaelement.getTypeForSrc = function(src, nodeName){
213
- if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
214
- return 'video/youtube';
215
- }
216
- src = src.split('?')[0].split('.');
217
- src = src[src.length - 1];
218
- var mt;
219
-
220
- $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
221
- if(exts.indexOf(src) !== -1){
222
- mt = mimeType;
223
- return false;
224
- }
225
- });
226
- return mt;
227
- };
228
-
229
-
230
- mediaelement.srces = function(mediaElem, srces){
231
- mediaElem = $(mediaElem);
232
- if(!srces){
233
- srces = [];
234
- var nodeName = mediaElem[0].nodeName.toLowerCase();
235
- var src = getSrcObj(mediaElem, nodeName);
236
-
237
- if(!src.src){
238
-
239
- $('source', mediaElem).each(function(){
240
- src = getSrcObj(this, nodeName);
241
- if(src.src){srces.push(src);}
242
- });
243
- } else {
244
- srces.push(src);
245
- }
246
- return srces;
247
- } else {
248
- mediaElem.removeAttr('src').removeAttr('type').find('source').remove();
249
- if(!$.isArray(srces)){
250
- srces = [srces];
251
- }
252
- srces.forEach(function(src){
253
- var source = document.createElement('source');
254
- if(typeof src == 'string'){
255
- src = {src: src};
256
- }
257
- source.setAttribute('src', src.src);
258
- if(src.type){
259
- source.setAttribute('type', src.type);
260
- }
261
- if(src.media){
262
- source.setAttribute('media', src.media);
263
- }
264
- mediaElem.append(source);
265
- });
266
-
267
- }
268
- };
269
-
270
-
271
- $.fn.loadMediaSrc = function(srces, poster){
272
- return this.each(function(){
273
- if(poster !== undefined){
274
- $(this).removeAttr('poster');
275
- if(poster){
276
- $.attr(this, 'poster', poster);
277
- }
278
- }
279
- mediaelement.srces(this, srces);
280
- $(this).mediaLoad();
281
- });
282
- };
283
-
284
- 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', 'jwplayer/jwplayer', 'video/youtube'];
285
-
286
- mediaelement.canThirdPlaySrces = function(mediaElem, srces){
287
- var ret = '';
288
- if(hasSwf || hasYt){
289
- mediaElem = $(mediaElem);
290
- srces = srces || mediaelement.srces(mediaElem);
291
- $.each(srces, function(i, src){
292
- if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
293
- ret = src;
294
- return false;
295
- }
296
- });
297
-
298
- }
299
-
300
- return ret;
301
- };
302
-
303
- var nativeCanPlayType = {};
304
- mediaelement.canNativePlaySrces = function(mediaElem, srces){
305
- var ret = '';
306
- if(hasNative){
307
- mediaElem = $(mediaElem);
308
- var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
309
- if(!nativeCanPlayType[nodeName]){return ret;}
310
- srces = srces || mediaelement.srces(mediaElem);
311
-
312
- $.each(srces, function(i, src){
313
- if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
314
- ret = src;
315
- return false;
316
- }
317
- });
318
- }
319
- return ret;
320
- };
321
-
322
- mediaelement.setError = function(elem, message){
323
- if(!message){
324
- message = "can't play sources";
325
- }
326
-
327
- $(elem).pause().data('mediaerror', message);
328
- webshims.warn('mediaelementError: '+ message);
329
- setTimeout(function(){
330
- if($(elem).data('mediaerror')){
331
- $(elem).trigger('mediaerror');
332
- }
333
- }, 1);
334
- };
335
-
336
- var handleThird = (function(){
337
- var requested;
338
- return function( mediaElem, ret, data ){
339
- webshims.ready(hasSwf ? 'mediaelement-swf' : 'mediaelement-yt', function(){
340
- if(mediaelement.createSWF){
341
- mediaelement.createSWF( mediaElem, ret, data );
342
- } else if(!requested) {
343
- requested = true;
344
- loadThird();
345
- //readd to ready
346
- handleThird( mediaElem, ret, data );
347
- }
348
- });
349
- if(!requested && hasYt && !mediaelement.createSWF){
350
- loadYt();
351
- }
352
- };
353
- })();
354
-
355
- var stepSources = function(elem, data, useSwf, _srces, _noLoop){
356
- var ret;
357
- if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
358
- ret = mediaelement.canThirdPlaySrces(elem, _srces);
359
- if(!ret){
360
- if(_noLoop){
361
- mediaelement.setError(elem, false);
362
- } else {
363
- stepSources(elem, data, false, _srces, true);
364
- }
365
- } else {
366
- handleThird(elem, ret, data);
367
- }
368
- } else {
369
- ret = mediaelement.canNativePlaySrces(elem, _srces);
370
- if(!ret){
371
- if(_noLoop){
372
- mediaelement.setError(elem, false);
373
- if(data && data.isActive == 'third') {
374
- mediaelement.setActive(elem, 'html5', data);
375
- }
376
- } else {
377
- stepSources(elem, data, true, _srces, true);
378
- }
379
- } else if(data && data.isActive == 'third') {
380
- mediaelement.setActive(elem, 'html5', data);
381
- }
382
- }
383
- };
384
- var stopParent = /^(?:embed|object|datalist)$/i;
385
- var selectSource = function(elem, data){
386
- var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
387
- var _srces = mediaelement.srces(elem);
388
- var parent = elem.parentNode;
389
-
390
- clearTimeout(baseData.loadTimer);
391
- $.data(elem, 'mediaerror', false);
392
-
393
- if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
394
- data = data || webshims.data(elem, 'mediaelement');
395
- stepSources(elem, data, options.preferFlash || undefined, _srces);
396
- };
397
-
398
-
399
- $(document).bind('ended', function(e){
400
- var data = webshims.data(e.target, 'mediaelement');
401
- if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
402
- setTimeout(function(){
403
- if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
404
- $(e.target).prop('currentTime', 0).play();
405
- }, 1);
406
-
407
- });
408
- if(!supportsLoop){
409
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
410
- }
411
-
412
- ['audio', 'video'].forEach(function(nodeName){
413
- var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
414
- prop: {
415
- value: function(){
416
- var data = webshims.data(this, 'mediaelement');
417
- selectSource(this, data);
418
- if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
419
- supLoad.prop._supvalue.apply(this, arguments);
420
- }
421
- }
422
- }
423
- });
424
- nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
425
- prop: {
426
- value: function(type){
427
- var ret = '';
428
- if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
429
- ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
430
- if(ret == 'no'){
431
- ret = '';
432
- }
433
- }
434
- if(!ret && hasSwf){
435
- type = $.trim((type || '').split(';')[0]);
436
- if(mediaelement.swfMimeTypes.indexOf(type) != -1){
437
- ret = 'maybe';
438
- }
439
- }
440
- return ret;
441
- }
442
- }
443
- });
444
- });
445
- webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
446
- set: function(){
447
- var elem = this;
448
- var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
449
- clearTimeout(baseData.loadTimer);
450
- baseData.loadTimer = setTimeout(function(){
451
- selectSource(elem);
452
- elem = null;
453
- }, 9);
454
- }
455
- });
456
-
457
- var initMediaElements = function(){
458
-
459
- webshims.addReady(function(context, insertedElement){
460
- $('video, audio', context)
461
- .add(insertedElement.filter('video, audio'))
462
- .each(function(){
463
- if($.browser.msie && webshims.browserVersion > 8 && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])')){
464
- $(this).prop('preload', 'metadata').mediaLoad();
465
- } else {
466
- selectSource(this);
467
- }
468
-
469
-
470
-
471
- if(hasNative){
472
- var bufferTimer;
473
- var lastBuffered;
474
- var elem = this;
475
- var getBufferedString = function(){
476
- var buffered = $.prop(elem, 'buffered');
477
- if(!buffered){return;}
478
- var bufferString = "";
479
- for(var i = 0, len = buffered.length; i < len;i++){
480
- bufferString += buffered.end(i);
481
- }
482
- return bufferString;
483
- };
484
- var testBuffer = function(){
485
- var buffered = getBufferedString();
486
- if(buffered != lastBuffered){
487
- lastBuffered = buffered;
488
- $(elem).triggerHandler('progress');
489
- }
490
- };
491
-
492
- $(this)
493
- .bind('play loadstart progress', function(e){
494
- if(e.type == 'progress'){
495
- lastBuffered = getBufferedString();
496
- }
497
- clearTimeout(bufferTimer);
498
- bufferTimer = setTimeout(testBuffer, 999);
499
- })
500
- .bind('emptied stalled mediaerror abort suspend', function(e){
501
- if(e.type == 'emptied'){
502
- lastBuffered = false;
503
- }
504
- clearTimeout(bufferTimer);
505
- })
506
- ;
507
- }
508
-
509
- })
510
- ;
511
- });
512
- };
513
-
514
- if(Modernizr.track && !bugs.track){
515
- webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
516
- get: function(){
517
- return this._shimActiveCues || this.activeCues;
518
- }
519
- });
520
- }
521
- //set native implementation ready, before swf api is retested
522
- if(hasNative){
523
- webshims.isReady('mediaelement-core', true);
524
- initMediaElements();
525
- webshims.ready('WINDOWLOAD mediaelement', loadThird);
526
- } else {
527
- webshims.ready('mediaelement-swf', initMediaElements);
528
- }
529
- $(function(){
530
- webshims.loader.loadList(['track-ui']);
531
- });
532
-
533
- });
534
- })(jQuery, Modernizr, jQuery.webshims);/*
535
- * todos:
536
- * - decouple muted/volume (needs improvement)
537
- * - implement video <-> flashcanvas pro API
538
- * - improve buffered-property with youtube/rtmp
539
- * - use jwplayer5 api instead of old flash4 api
540
- */
541
-
542
- jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
543
- "use strict";
544
- var SENDEVENT = 'sendEvent';
545
- var mediaelement = webshims.mediaelement;
546
- var swfobject = window.swfobject;
547
- var hasNative = Modernizr.audio && Modernizr.video;
548
- var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
549
- var loadedSwf = 0;
550
- var getProps = {
551
- paused: true,
552
- ended: false,
553
- currentSrc: '',
554
- duration: window.NaN,
555
-
556
- readyState: 0,
557
- networkState: 0,
558
- videoHeight: 0,
559
- videoWidth: 0,
560
- error: null,
561
- buffered: {
562
- start: function(index){
563
- if(index){
564
- webshims.error('buffered index size error');
565
- return;
566
- }
567
- return 0;
568
- },
569
- end: function(index){
570
- if(index){
571
- webshims.error('buffered index size error');
572
- return;
573
- }
574
- return 0;
575
- },
576
- length: 0
577
- }
578
- };
579
- var getPropKeys = Object.keys(getProps);
580
-
581
- var getSetProps = {
582
- currentTime: 0,
583
- volume: 1,
584
- muted: false
585
- };
586
- var getSetPropKeys = Object.keys(getSetProps);
587
-
588
- var playerStateObj = $.extend({
589
- isActive: 'html5',
590
- activating: 'html5',
591
- wasSwfReady: false,
592
- _bufferedEnd: 0,
593
- _bufferedStart: 0,
594
- _metadata: false,
595
- _durationCalcs: -1,
596
- _callMeta: false,
597
- currentTime: 0,
598
- _ppFlag: undefined
599
- }, getProps, getSetProps);
600
-
601
- var idRep = /^jwplayer-/;
602
- var getSwfDataFromID = function(id){
603
-
604
- var elem = document.getElementById(id.replace(idRep, ''));
605
- if(!elem){return;}
606
- var data = webshims.data(elem, 'mediaelement');
607
- return data.isActive == 'third' ? data : null;
608
- };
609
-
610
-
611
- var getSwfDataFromElem = function(elem){
612
- try {
613
- (elem.nodeName);
614
- } catch(er){
615
- return null;
616
- }
617
- var data = webshims.data(elem, 'mediaelement');
618
- return (data && data.isActive== 'third') ? data : null;
619
- };
620
-
621
- var trigger = function(elem, evt){
622
- evt = $.Event(evt);
623
- evt.preventDefault();
624
- $.event.trigger(evt, undefined, elem);
625
- };
626
-
627
- var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
628
- var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
629
-
630
- webshims.extendUNDEFProp(options.jwParams, {
631
- allowscriptaccess: 'always',
632
- allowfullscreen: 'true',
633
- wmode: 'transparent'
634
- });
635
- webshims.extendUNDEFProp(options.jwVars, {
636
- screencolor: 'ffffffff'
637
- });
638
- webshims.extendUNDEFProp(options.jwAttrs, {
639
- bgcolor: '#000000'
640
- });
641
-
642
- var getDuration = function(data, obj){
643
- var curDuration = data.duration;
644
- if(curDuration && data._durationCalcs > 0){return;}
645
- try {
646
- data.duration = data.jwapi.getPlaylist()[0].duration;
647
- if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
648
- data.duration = curDuration;
649
- }
650
- } catch(er){}
651
- if(data.duration && data.duration != data._lastDuration){
652
- trigger(data._elem, 'durationchange');
653
- if(data._elemNodeName == 'audio' || data._callMeta){
654
- mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
655
- }
656
- data._durationCalcs--;
657
- } else {
658
- data._durationCalcs++;
659
- }
660
- };
661
- var setReadyState = function(readyState, data){
662
- if(readyState < 3){
663
- clearTimeout(data._canplaythroughTimer);
664
- }
665
- if(readyState >= 3 && data.readyState < 3){
666
- data.readyState = readyState;
667
- trigger(data._elem, 'canplay');
668
- clearTimeout(data._canplaythroughTimer);
669
- data._canplaythroughTimer = setTimeout(function(){
670
- setReadyState(4, data);
671
- }, 4000);
672
- }
673
- if(readyState >= 4 && data.readyState < 4){
674
- data.readyState = readyState;
675
- trigger(data._elem, 'canplaythrough');
676
- }
677
- data.readyState = readyState;
678
- };
679
-
680
- $.extend($.event.customEvent, {
681
- updatemediaelementdimensions: true,
682
- flashblocker: true,
683
- swfstageresize: true,
684
- mediaelementapichange: true
685
- });
686
-
687
- mediaelement.jwEvents = {
688
- View: {
689
-
690
- PLAY: function(obj){
691
- var data = getSwfDataFromID(obj.id);
692
- if(!data || data.stopPlayPause){return;}
693
- data._ppFlag = true;
694
- if(data.paused == obj.state){
695
- data.paused = !obj.state;
696
- if(data.ended){
697
- data.ended = false;
698
- }
699
- trigger(data._elem, obj.state ? 'play' : 'pause');
700
- }
701
- }
702
- },
703
- Model: {
704
-
705
- BUFFER: function(obj){
706
- var data = getSwfDataFromID(obj.id);
707
- if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
708
- data.networkState = (obj.percentage == 100) ? 1 : 2;
709
- if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
710
- getDuration(data, obj);
711
- }
712
-
713
- if(data.ended){
714
- data.ended = false;
715
- }
716
- if(!data.duration){
717
- return;
718
- }
719
- if(obj.percentage > 2 && obj.percentage < 20){
720
- setReadyState(3, data);
721
- } else if(obj.percentage > 20){
722
- setReadyState(4, data);
723
- }
724
- if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
725
- data._bufferedStart = data.currentTime || 0;
726
- }
727
-
728
- data._bufferedEnd = obj.percentage;
729
- data.buffered.length = 1;
730
- if(obj.percentage == 100){
731
- data.networkState = 1;
732
- setReadyState(4, data);
733
- }
734
- $.event.trigger('progress', undefined, data._elem, true);
735
- },
736
- META: function(obj, data){
737
-
738
- data = data && data.networkState ? data : getSwfDataFromID(obj.id);
739
-
740
- if(!data){return;}
741
- if( !('duration' in obj) ){
742
- data._callMeta = true;
743
- return;
744
- }
745
-
746
- if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
747
-
748
- data._metadata = true;
749
-
750
- var oldDur = data.duration;
751
- if(obj.duration){
752
- data.duration = obj.duration;
753
- }
754
- data._lastDuration = data.duration;
755
- if(obj.height || obj.width){
756
- data.videoHeight = obj.height || 0;
757
- data.videoWidth = obj.width || 0;
758
- }
759
- if(!data.networkState){
760
- data.networkState = 2;
761
- }
762
- if(data.readyState < 1){
763
- setReadyState(1, data);
764
- }
765
- if(data.duration && oldDur !== data.duration){
766
- trigger(data._elem, 'durationchange');
767
- }
768
-
769
- trigger(data._elem, 'loadedmetadata');
770
- },
771
- TIME: function(obj){
772
- var data = getSwfDataFromID(obj.id);
773
- if(!data || data.currentTime === obj.position){return;}
774
- data.currentTime = obj.position;
775
- if(data.duration && data.duration < data.currentTime){
776
- getDuration(data, obj);
777
- }
778
- if(data.readyState < 2){
779
- setReadyState(2, data);
780
- }
781
- if(data.ended){
782
- data.ended = false;
783
- }
784
- trigger(data._elem, 'timeupdate');
785
-
786
- },
787
- STATE: function(obj){
788
- var data = getSwfDataFromID(obj.id);
789
- if(!data){return;}
790
- switch(obj.newstate) {
791
- case 'BUFFERING':
792
-
793
- if(data.ended){
794
- data.ended = false;
795
- }
796
- setReadyState(1, data);
797
- trigger(data._elem, 'waiting');
798
- break;
799
- case 'PLAYING':
800
- data.paused = false;
801
- data._ppFlag = true;
802
- if(!data.duration){
803
- getDuration(data, obj);
804
- }
805
- if(data.readyState < 3){
806
- setReadyState(3, data);
807
- }
808
- if(data.ended){
809
- data.ended = false;
810
- }
811
- trigger(data._elem, 'playing');
812
- break;
813
- case 'PAUSED':
814
- if(!data.paused && !data.stopPlayPause){
815
- data.paused = true;
816
- data._ppFlag = true;
817
- trigger(data._elem, 'pause');
818
- }
819
- break;
820
- case 'COMPLETED':
821
- if(data.readyState < 4){
822
- setReadyState(4, data);
823
- }
824
- data.ended = true;
825
- trigger(data._elem, 'ended');
826
- break;
827
- }
828
- }
829
- }
830
- ,Controller: {
831
-
832
- ERROR: function(obj){
833
- var data = getSwfDataFromID(obj.id);
834
- if(!data){return;}
835
- mediaelement.setError(data._elem, obj.message);
836
- },
837
- SEEK: function(obj){
838
- var data = getSwfDataFromID(obj.id);
839
- if(!data){return;}
840
- if(data.ended){
841
- data.ended = false;
842
- }
843
- if(data.paused){
844
- try {
845
- data.jwapi[SENDEVENT]('play', 'false');
846
- } catch(er){}
847
- }
848
- if(data.currentTime != obj.position){
849
- data.currentTime = obj.position;
850
- trigger(data._elem, 'timeupdate');
851
- }
852
-
853
-
854
- },
855
- VOLUME: function(obj){
856
- var data = getSwfDataFromID(obj.id);
857
- if(!data){return;}
858
- var newVolume = obj.percentage / 100;
859
- if(data.volume == newVolume){return;}
860
- data.volume = newVolume;
861
- trigger(data._elem, 'volumechange');
862
- },
863
- MUTE: function(obj){
864
- if(obj.state){return;}
865
- var data = getSwfDataFromID(obj.id);
866
- if(!data){return;}
867
- if(data.muted == obj.state){return;}
868
- data.muted = obj.state;
869
- trigger(data._elem, 'volumechange');
870
- }
871
- }
872
- };
873
-
874
- var initEvents = function(data){
875
- var passed = true;
876
- $.each(mediaelement.jwEvents, function(mvcName, evts){
877
- $.each(evts, function(evtName){
878
- try {
879
- data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
880
- } catch(er){
881
- passed = false;
882
- return false;
883
- }
884
- });
885
- });
886
- return passed;
887
- };
888
-
889
- var workActionQueue = function(data){
890
- var actionLen = data.actionQueue.length;
891
- var i = 0;
892
- var operation;
893
- if(actionLen && data.isActive == 'third'){
894
- while(data.actionQueue.length && actionLen > i){
895
- i++;
896
- operation = data.actionQueue.shift();
897
- data.jwapi[operation.fn].apply(data.jwapi, operation.args);
898
- }
899
- }
900
- if(data.actionQueue.length){
901
- data.actionQueue = [];
902
- }
903
- };
904
- var startAutoPlay = function(data){
905
- if(!data){return;}
906
- if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
907
- setTimeout(function(){
908
- if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
909
- try {
910
- $(data._elem).play();
911
- } catch(er){}
912
- }
913
- }, 1);
914
- }
915
- };
916
-
917
- var startIntrinsicDimension = function(data){
918
- if(!data || data._elemNodeName != 'video'){return;}
919
- var img;
920
- var widthAuto;
921
- var heightAuto;
922
- var lastIntrinsicSize = {};
923
- var shadowElem;
924
- var errorTimer;
925
- var blockResize;
926
- var lastSize;
927
- var setSize = function(width, height){
928
- if(!height || !width || height < 1 || width < 1 || data.isActive != 'third'){return;}
929
- if(img){
930
- img.remove();
931
- img = false;
932
- }
933
- lastIntrinsicSize.width = width;
934
- lastIntrinsicSize.height = height;
935
- clearTimeout(errorTimer);
936
- widthAuto = data._elem.style.width == 'auto';
937
- heightAuto = data._elem.style.height == 'auto';
938
-
939
- if(!widthAuto && !heightAuto){return;}
940
- var curSize;
941
- shadowElem = shadowElem || $(data._elem).getShadowElement();
942
- var cur;
943
- if(widthAuto && !heightAuto){
944
- cur = shadowElem.height();
945
- width *= cur / height;
946
- height = cur;
947
- } else if(!widthAuto && heightAuto){
948
- cur = shadowElem.width();
949
- height *= cur / width;
950
- width = cur;
951
- }
952
- blockResize = true;
953
- setTimeout(function(){
954
- blockResize = false;
955
- }, 9);
956
-
957
- shadowElem.css({width: width, height: height});
958
- };
959
- var setPosterSrc = function(){
960
- if(data.isActive != 'third' || ($.prop(data._elem, 'readyState') && $.prop(this, 'videoWidth'))){return;}
961
- var posterSrc = $.prop(data._elem, 'poster');
962
- if(!posterSrc){return;}
963
- widthAuto = data._elem.style.width == 'auto';
964
- heightAuto = data._elem.style.height == 'auto';
965
- if(!widthAuto && !heightAuto){return;}
966
- if(img){
967
- img.remove();
968
- img = false;
969
- }
970
- img = $('<img style="position: absolute; height: auto; width: auto; top: 0px; left: 0px; visibility: hidden;" />');
971
- img
972
- .bind('load error alreadycomplete', function(e){
973
- clearTimeout(errorTimer);
974
-
975
- var elem = this;
976
- var width = elem.naturalWidth || elem.width || elem.offsetWidth;
977
- var height = elem.naturalHeight || elem.height || elem.offsetHeight;
978
-
979
- if(height && width){
980
- setSize(width, height);
981
- elem = null;
982
- } else {
983
- setTimeout(function(){
984
- width = elem.naturalWidth || elem.width || elem.offsetWidth;
985
- height = elem.naturalHeight || elem.height || elem.offsetHeight;
986
- setSize(width, height);
987
- if(img){
988
- img.remove();
989
- img = false;
990
- }
991
- elem = null;
992
- }, 9);
993
- }
994
- $(this).unbind();
995
- })
996
- .prop('src', posterSrc)
997
- .appendTo('body')
998
- .each(function(){
999
- if(this.complete || this.error){
1000
- $(this).triggerHandler('alreadycomplete');
1001
- } else {
1002
- clearTimeout(errorTimer);
1003
- errorTimer = setTimeout(function(){
1004
- $(data._elem).triggerHandler('error');
1005
- }, 9999);
1006
- }
1007
- })
1008
- ;
1009
- };
1010
-
1011
- $(data._elem)
1012
- .bind('loadedmetadata', function(){
1013
- setSize($.prop(this, 'videoWidth'), $.prop(this, 'videoHeight'));
1014
- })
1015
- .bind('emptied', setPosterSrc)
1016
- .bind('swfstageresize updatemediaelementdimensions', function(){
1017
- if(blockResize){return;}
1018
- setSize(lastIntrinsicSize.width, lastIntrinsicSize.height);
1019
- })
1020
- .bind('emptied', function(){
1021
- lastIntrinsicSize = {};
1022
- })
1023
- .triggerHandler('swfstageresize')
1024
- ;
1025
-
1026
- setPosterSrc();
1027
- if($.prop(data._elem, 'readyState')){
1028
- setSize($.prop(data._elem, 'videoWidth'), $.prop(data._elem, 'videoHeight'));
1029
- }
1030
- };
1031
-
1032
- mediaelement.playerResize = function(id){
1033
- if(!id){return;}
1034
- var elem = document.getElementById(id.replace(idRep, ''));
1035
-
1036
- if(elem){
1037
- $(elem).triggerHandler('swfstageresize');
1038
- }
1039
- elem = null;
1040
- };
1041
-
1042
-
1043
- $(document).bind('emptied', function(e){
1044
- var data = getSwfDataFromElem(e.target);
1045
- startAutoPlay(data);
1046
- });
1047
-
1048
- var localConnectionTimer;
1049
- mediaelement.jwPlayerReady = function(jwData){
1050
- var data = getSwfDataFromID(jwData.id);
1051
- var passed = true;
1052
- var i = 0;
1053
- var doneFn = function(){
1054
- if(i > 9){return;}
1055
- i++;
1056
- if(initEvents(data)){
1057
- if(!data.wasSwfReady){
1058
- var version = parseFloat( jwData.version, 10);
1059
- if(version < 5.1 || version >= 6){
1060
- webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
1061
- }
1062
- } else {
1063
- $(data._elem).mediaLoad();
1064
-
1065
- }
1066
- data.wasSwfReady = true;
1067
- data.tryedReframeing = 0;
1068
- workActionQueue(data);
1069
- startAutoPlay(data);
1070
- } else {
1071
- clearTimeout(data.reframeTimer);
1072
- data.reframeTimer = setTimeout(doneFn, 9 * i);
1073
- if(i > 2 && data.tryedReframeing < 9){
1074
- data.tryedReframeing++;
1075
- data.shadowElem.css({overflow: 'visible'});
1076
- setTimeout(function(){
1077
- data.shadowElem.css({overflow: 'hidden'});
1078
- }, 16);
1079
- }
1080
- }
1081
- };
1082
- if(!data || !data.jwapi){return;}
1083
- if(!data.tryedReframeing){
1084
- data.tryedReframeing = 0;
1085
- }
1086
- clearTimeout(localConnectionTimer);
1087
- data.jwData = jwData;
1088
- data.shadowElem.removeClass('flashblocker-assumed');
1089
- $.prop(data._elem, 'volume', data.volume);
1090
- $.prop(data._elem, 'muted', data.muted);
1091
- doneFn();
1092
-
1093
- };
1094
-
1095
- var addMediaToStopEvents = $.noop;
1096
- if(hasNative){
1097
- var stopEvents = {
1098
- play: 1,
1099
- playing: 1
1100
- };
1101
- var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
1102
- var hidevents = hideEvtArray.map(function(evt){
1103
- return evt +'.webshimspolyfill';
1104
- }).join(' ');
1105
-
1106
- var hidePlayerEvents = function(event){
1107
- var data = webshims.data(event.target, 'mediaelement');
1108
- if(!data){return;}
1109
- var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
1110
- if( isNativeHTML5 == (data.activating == 'third') ){
1111
- event.stopImmediatePropagation();
1112
- if(stopEvents[event.type] && data.isActive != data.activating){
1113
- $(event.target).pause();
1114
- }
1115
- }
1116
- };
1117
-
1118
- addMediaToStopEvents = function(elem){
1119
- $(elem)
1120
- .unbind(hidevents)
1121
- .bind(hidevents, hidePlayerEvents)
1122
- ;
1123
- hideEvtArray.forEach(function(evt){
1124
- webshims.moveToFirstEvent(elem, evt);
1125
- });
1126
- };
1127
- addMediaToStopEvents(document);
1128
- }
1129
-
1130
-
1131
- mediaelement.setActive = function(elem, type, data){
1132
- if(!data){
1133
- data = webshims.data(elem, 'mediaelement');
1134
- }
1135
- if(!data || data.isActive == type){return;}
1136
- if(type != 'html5' && type != 'third'){
1137
- webshims.warn('wrong type for mediaelement activating: '+ type);
1138
- }
1139
- var shadowData = webshims.data(elem, 'shadowData');
1140
- data.activating = type;
1141
- $(elem).pause();
1142
- data.isActive = type;
1143
- if(type == 'third'){
1144
- shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
1145
- $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
1146
- } else {
1147
- $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
1148
- shadowData.shadowElement = shadowData.shadowFocusElement = false;
1149
- }
1150
- $(elem).trigger('mediaelementapichange');
1151
- };
1152
-
1153
-
1154
-
1155
- var resetSwfProps = (function(){
1156
- var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
1157
- var len = resetProtoProps.length;
1158
- return function(data){
1159
-
1160
- if(!data){return;}
1161
- var lenI = len;
1162
- var networkState = data.networkState;
1163
- setReadyState(0, data);
1164
- while(--lenI){
1165
- delete data[resetProtoProps[lenI]];
1166
- }
1167
- data.actionQueue = [];
1168
- data.buffered.length = 0;
1169
- if(networkState){
1170
- trigger(data._elem, 'emptied');
1171
- }
1172
- };
1173
- })();
1174
-
1175
- var setElementDimension = function(data, hasControls){
1176
- var elem = data._elem;
1177
- var box = data.shadowElem;
1178
- $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
1179
- if(data._elemNodeName == 'audio' && !hasControls){
1180
- box.css({width: 0, height: 0});
1181
- } else {
1182
- box.css({
1183
- width: elem.style.width || $(elem).width(),
1184
- height: elem.style.height || $(elem).height()
1185
- });
1186
- }
1187
- };
1188
-
1189
- mediaelement.createSWF = function( elem, canPlaySrc, data ){
1190
- if(!hasFlash){
1191
- setTimeout(function(){
1192
- $(elem).mediaLoad(); //<- this should produce a mediaerror
1193
- }, 1);
1194
- return;
1195
- }
1196
-
1197
- if(loadedSwf < 1){
1198
- loadedSwf = 1;
1199
- } else {
1200
- loadedSwf++;
1201
- }
1202
- var vars = $.extend({}, options.jwVars, {
1203
- image: $.prop(elem, 'poster') || '',
1204
- file: canPlaySrc.srcProp
1205
- });
1206
- var elemVars = $(elem).data('jwvars') || {};
1207
-
1208
- if(!data){
1209
- data = webshims.data(elem, 'mediaelement');
1210
- }
1211
-
1212
- if(data && data.swfCreated){
1213
- mediaelement.setActive(elem, 'third', data);
1214
- resetSwfProps(data);
1215
- data.currentSrc = canPlaySrc.srcProp;
1216
- $.extend(vars, elemVars);
1217
- options.changeJW(vars, elem, canPlaySrc, data, 'load');
1218
- queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
1219
- return;
1220
- }
1221
-
1222
-
1223
- var hasControls = $.prop(elem, 'controls');
1224
- var elemId = 'jwplayer-'+ webshims.getID(elem);
1225
- var params = $.extend(
1226
- {},
1227
- options.jwParams,
1228
- $(elem).data('jwparams')
1229
- );
1230
- var elemNodeName = elem.nodeName.toLowerCase();
1231
- var attrs = $.extend(
1232
- {},
1233
- options.jwAttrs,
1234
- {
1235
- name: elemId,
1236
- id: elemId
1237
- },
1238
- $(elem).data('jwattrs')
1239
- );
1240
- var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
1241
- .css({
1242
- position: 'relative',
1243
- overflow: 'hidden'
1244
- })
1245
- ;
1246
- data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
1247
- actionQueue: {
1248
- value: []
1249
- },
1250
- shadowElem: {
1251
- value: box
1252
- },
1253
- _elemNodeName: {
1254
- value: elemNodeName
1255
- },
1256
- _elem: {
1257
- value: elem
1258
- },
1259
- currentSrc: {
1260
- value: canPlaySrc.srcProp
1261
- },
1262
- swfCreated: {
1263
- value: true
1264
- },
1265
- buffered: {
1266
- value: {
1267
- start: function(index){
1268
- if(index >= data.buffered.length){
1269
- webshims.error('buffered index size error');
1270
- return;
1271
- }
1272
- return 0;
1273
- },
1274
- end: function(index){
1275
- if(index >= data.buffered.length){
1276
- webshims.error('buffered index size error');
1277
- return;
1278
- }
1279
- return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
1280
- },
1281
- length: 0
1282
- }
1283
- }
1284
- }));
1285
-
1286
- setElementDimension(data, hasControls);
1287
-
1288
- box.insertBefore(elem);
1289
-
1290
- if(hasNative){
1291
- $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
1292
- }
1293
-
1294
- $.extend(vars,
1295
- {
1296
- id: elemId,
1297
- controlbar: hasControls ? options.jwVars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
1298
- icons: ''+ (hasControls && elemNodeName == 'video')
1299
- },
1300
- elemVars,
1301
- {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
1302
- );
1303
- if(vars.plugins){
1304
- vars.plugins += ','+jwplugin;
1305
- } else {
1306
- vars.plugins = jwplugin;
1307
- }
1308
-
1309
-
1310
- webshims.addShadowDom(elem, box);
1311
-
1312
- addMediaToStopEvents(elem);
1313
-
1314
- mediaelement.setActive(elem, 'third', data);
1315
-
1316
- options.changeJW(vars, elem, canPlaySrc, data, 'embed');
1317
-
1318
- $(elem).bind('updatemediaelementdimensions updateshadowdom', function(){
1319
- setElementDimension(data, $.prop(elem, 'controls'));
1320
- });
1321
-
1322
- startIntrinsicDimension(data);
1323
-
1324
- swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
1325
-
1326
- if(swfData.success){
1327
- data.jwapi = swfData.ref;
1328
-
1329
- if(!hasControls){
1330
- $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
1331
- }
1332
- setTimeout(function(){
1333
- if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
1334
- box.addClass('flashblocker-assumed');
1335
- $(elem).trigger('flashblocker');
1336
- webshims.warn("flashblocker assumed");
1337
- }
1338
- $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
1339
- }, 9);
1340
- if(!localConnectionTimer){
1341
- clearTimeout(localConnectionTimer);
1342
- localConnectionTimer = setTimeout(function(){
1343
- var flash = $(swfData.ref);
1344
- if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
1345
- 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");
1346
- } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
1347
- webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
1348
- }
1349
- flash = null;
1350
- }, 8000);
1351
- }
1352
- }
1353
- });
1354
- };
1355
-
1356
-
1357
- var queueSwfMethod = function(elem, fn, args, data){
1358
- data = data || getSwfDataFromElem(elem);
1359
- if(data){
1360
- if(data.jwapi && data.jwapi[fn]){
1361
- data.jwapi[fn].apply(data.jwapi, args || []);
1362
- } else {
1363
- //todo add to queue
1364
- data.actionQueue.push({fn: fn, args: args});
1365
- if(data.actionQueue.length > 10){
1366
- setTimeout(function(){
1367
- if(data.actionQueue.length > 5){
1368
- data.actionQueue.shift();
1369
- }
1370
- }, 99);
1371
- }
1372
- }
1373
- return data;
1374
- }
1375
- return false;
1376
- };
1377
-
1378
- ['audio', 'video'].forEach(function(nodeName){
1379
- var descs = {};
1380
- var mediaSup;
1381
- var createGetProp = function(key){
1382
- if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
1383
-
1384
- descs[key] = {
1385
- get: function(){
1386
- var data = getSwfDataFromElem(this);
1387
- if(data){
1388
- return data[key];
1389
- } else if(hasNative && mediaSup[key].prop._supget) {
1390
- return mediaSup[key].prop._supget.apply(this);
1391
- } else {
1392
- return playerStateObj[key];
1393
- }
1394
- },
1395
- writeable: false
1396
- };
1397
- };
1398
- var createGetSetProp = function(key, setFn){
1399
- createGetProp(key);
1400
- delete descs[key].writeable;
1401
- descs[key].set = setFn;
1402
- };
1403
-
1404
- createGetSetProp('volume', function(v){
1405
- var data = getSwfDataFromElem(this);
1406
- if(data){
1407
- v *= 100;
1408
- if(!isNaN(v)){
1409
- var muted = data.muted;
1410
- if(v < 0 || v > 100){
1411
- webshims.error('volume greater or less than allowed '+ (v / 100));
1412
- }
1413
-
1414
- queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
1415
- if(muted){
1416
- try {
1417
- data.jwapi.sendEvent('mute', 'true');
1418
- } catch(er){}
1419
- }
1420
- v /= 100;
1421
- if(data.volume == v || data.isActive != 'third'){return;}
1422
- data.volume = v;
1423
- trigger(data._elem, 'volumechange');
1424
- data = null;
1425
- }
1426
- } else if(mediaSup.volume.prop._supset) {
1427
- return mediaSup.volume.prop._supset.apply(this, arguments);
1428
- }
1429
- });
1430
-
1431
- createGetSetProp('muted', function(m){
1432
- var data = getSwfDataFromElem(this);
1433
- if(data){
1434
- m = !!m;
1435
- queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
1436
- if(data.muted == m || data.isActive != 'third'){return;}
1437
- data.muted = m;
1438
- trigger(data._elem, 'volumechange');
1439
- data = null;
1440
- } else if(mediaSup.muted.prop._supset) {
1441
- return mediaSup.muted.prop._supset.apply(this, arguments);
1442
- }
1443
- });
1444
-
1445
-
1446
- createGetSetProp('currentTime', function(t){
1447
- var data = getSwfDataFromElem(this);
1448
- if(data){
1449
- t *= 1;
1450
- if (!isNaN(t)) {
1451
- if(data.paused){
1452
- clearTimeout(data.stopPlayPause);
1453
- data.stopPlayPause = setTimeout(function(){
1454
- data.paused = true;
1455
- data.stopPlayPause = false;
1456
- }, 50);
1457
- }
1458
- queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
1459
-
1460
- if(data.paused){
1461
- if(data.readyState > 0){
1462
- data.currentTime = t;
1463
- trigger(data._elem, 'timeupdate');
1464
- }
1465
- try {
1466
- data.jwapi[SENDEVENT]('play', 'false');
1467
- } catch(er){}
1468
-
1469
- }
1470
- }
1471
-
1472
- } else if(mediaSup.currentTime.prop._supset) {
1473
- return mediaSup.currentTime.prop._supset.apply(this, arguments);
1474
- }
1475
- });
1476
-
1477
- ['play', 'pause'].forEach(function(fn){
1478
- descs[fn] = {
1479
- value: function(){
1480
- var data = getSwfDataFromElem(this);
1481
- if(data){
1482
- if(data.stopPlayPause){
1483
- clearTimeout(data.stopPlayPause);
1484
- }
1485
- queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
1486
- setTimeout(function(){
1487
- if(data.isActive == 'third'){
1488
- data._ppFlag = true;
1489
- if(data.paused != (fn != 'play')){
1490
- data.paused = fn != 'play';
1491
- trigger(data._elem, fn);
1492
- }
1493
- }
1494
- }, 1);
1495
- } else if(mediaSup[fn].prop._supvalue) {
1496
- return mediaSup[fn].prop._supvalue.apply(this, arguments);
1497
- }
1498
- }
1499
- };
1500
- });
1501
-
1502
- getPropKeys.forEach(createGetProp);
1503
-
1504
- webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
1505
- var data = getSwfDataFromElem(this);
1506
- $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
1507
-
1508
- if(data){
1509
- try {
1510
- queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
1511
- } catch(er){
1512
- webshims.warn("you need to generate a crossdomain.xml");
1513
- }
1514
- if(nodeName == 'audio'){
1515
- setElementDimension(data, boolProp);
1516
- }
1517
- $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
1518
- }
1519
- });
1520
-
1521
- mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
1522
- });
1523
-
1524
- if(hasFlash){
1525
- var oldClean = $.cleanData;
1526
- var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
1527
- var flashNames = {
1528
- object: 1,
1529
- OBJECT: 1
1530
- };
1531
- $.cleanData = function(elems){
1532
- var i, len, prop;
1533
- if(elems && (len = elems.length) && loadedSwf){
1534
-
1535
- for(i = 0; i < len; i++){
1536
- if(flashNames[elems[i].nodeName]){
1537
- if(SENDEVENT in elems[i]){
1538
- loadedSwf--;
1539
- try {
1540
- elems[i][SENDEVENT]('play', false);
1541
- } catch(er){}
1542
- }
1543
- if(gcBrowser){
1544
- try {
1545
- for (prop in elems[i]) {
1546
- if (typeof elems[i][prop] == "function") {
1547
- elems[i][prop] = null;
1548
- }
1549
- }
1550
- } catch(er){}
1551
- }
1552
- }
1553
- }
1554
-
1555
- }
1556
- return oldClean.apply(this, arguments);
1557
- };
1558
- }
1559
-
1560
- if(!hasNative){
1561
-
1562
- ['poster', 'src'].forEach(function(prop){
1563
- webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
1564
- //attr: {},
1565
- reflect: true,
1566
- propType: 'src'
1567
- });
1568
- });
1569
-
1570
-
1571
- ['autoplay', 'controls'].forEach(function(name){
1572
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
1573
- });
1574
-
1575
- webshims.defineNodeNamesProperties(['audio', 'video'], {
1576
- HAVE_CURRENT_DATA: {
1577
- value: 2
1578
- },
1579
- HAVE_ENOUGH_DATA: {
1580
- value: 4
1581
- },
1582
- HAVE_FUTURE_DATA: {
1583
- value: 3
1584
- },
1585
- HAVE_METADATA: {
1586
- value: 1
1587
- },
1588
- HAVE_NOTHING: {
1589
- value: 0
1590
- },
1591
- NETWORK_EMPTY: {
1592
- value: 0
1593
- },
1594
- NETWORK_IDLE: {
1595
- value: 1
1596
- },
1597
- NETWORK_LOADING: {
1598
- value: 2
1599
- },
1600
- NETWORK_NO_SOURCE: {
1601
- value: 3
1602
- }
1603
-
1604
- }, 'prop');
1605
- }
1606
-
1
+ (function($, Modernizr, webshims){
2
+ "use strict";
3
+ var hasNative = Modernizr.audio && Modernizr.video;
4
+ var supportsLoop = false;
5
+ var options = webshims.cfg.mediaelement;
6
+ var bugs = webshims.bugs;
7
+ var swfType = options.player == 'jwplayer' ? 'mediaelement-swf' : 'mediaelement-jaris'
8
+ var loadSwf = function(){
9
+ webshims.ready(swfType, function(){
10
+ if(!webshims.mediaelement.createSWF){
11
+ webshims.mediaelement.loadSwf = true;
12
+ webshims.reTest([swfType], hasNative);
13
+ }
14
+ });
15
+ };
16
+ var hasSwf;
17
+ if(hasNative){
18
+ var videoElem = document.createElement('video');
19
+ Modernizr.videoBuffered = ('buffered' in videoElem);
20
+ supportsLoop = ('loop' in videoElem);
21
+
22
+ webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
23
+
24
+ if(!Modernizr.videoBuffered){
25
+ webshims.addPolyfill('mediaelement-native-fix', {
26
+ f: 'mediaelement',
27
+ test: Modernizr.videoBuffered,
28
+ d: ['dom-support']
29
+ });
30
+
31
+ webshims.reTest('mediaelement-native-fix');
32
+ }
33
+ }
34
+
35
+ if(hasNative && !options.preferFlash){
36
+ var switchOptions = function(e){
37
+ var parent = e.target.parentNode;
38
+ if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
39
+ webshims.ready('DOM mediaelement', function(){
40
+ if(hasSwf){
41
+ loadSwf();
42
+ }
43
+ webshims.ready('WINDOWLOAD '+swfType, function(){
44
+ setTimeout(function(){
45
+ if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
46
+ options.preferFlash = true;
47
+ document.removeEventListener('error', switchOptions, true);
48
+ $('audio, video').mediaLoad();
49
+ webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
50
+ } else if(!hasSwf){
51
+ document.removeEventListener('error', switchOptions, true);
52
+ }
53
+ }, 20);
54
+ });
55
+ });
56
+ }
57
+ };
58
+ document.addEventListener('error', switchOptions, true);
59
+ $('audio, video').each(function(){
60
+ if(this.error){
61
+ switchOptions({target: this});
62
+ }
63
+ });
64
+ }
65
+
66
+ bugs.track = false;
67
+
68
+ if(Modernizr.track){
69
+ (function(){
70
+
71
+ if(!bugs.track){
72
+ bugs.track = typeof $('<track />')[0].readyState != 'number';
73
+ }
74
+
75
+ if(!bugs.track){
76
+ try {
77
+ new TextTrackCue(2, 3, '');
78
+ } catch(e){
79
+ bugs.track = true;
80
+ }
81
+ }
82
+
83
+ var trackOptions = webshims.cfg.track;
84
+ var trackListener = function(e){
85
+ $(e.target).filter('track').each(changeApi);
86
+ };
87
+ var changeApi = function(){
88
+ if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
89
+ trackOptions.override = true;
90
+ webshims.reTest('track');
91
+ document.removeEventListener('error', trackListener, true);
92
+ if(this && $.nodeName(this, 'track')){
93
+ webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
94
+ } else {
95
+ webshims.info("track support was overwritten. due to bad browser support");
96
+ }
97
+ }
98
+ };
99
+ var detectTrackError = function(){
100
+ document.addEventListener('error', trackListener, true);
101
+
102
+ if(bugs.track){
103
+ changeApi();
104
+ } else {
105
+ $('track').each(changeApi);
106
+ }
107
+ };
108
+ if(!trackOptions.override){
109
+ if(webshims.isReady('track')){
110
+ detectTrackError();
111
+ } else {
112
+ $(detectTrackError);
113
+ }
114
+ }
115
+ })();
116
+
117
+ }
118
+
119
+ webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
120
+ hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
121
+
122
+ var mediaelement = webshims.mediaelement;
123
+
124
+ var getSrcObj = function(elem, nodeName){
125
+ elem = $(elem);
126
+ var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
127
+ if(!src.src){return src;}
128
+ var tmp = elem.attr('type');
129
+ if(tmp){
130
+ src.type = tmp;
131
+ src.container = $.trim(tmp.split(';')[0]);
132
+ } else {
133
+ if(!nodeName){
134
+ nodeName = elem[0].nodeName.toLowerCase();
135
+ if(nodeName == 'source'){
136
+ nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
137
+ }
138
+ }
139
+ tmp = mediaelement.getTypeForSrc(src.src, nodeName );
140
+
141
+ if(tmp){
142
+ src.type = tmp;
143
+ src.container = tmp;
144
+ }
145
+ }
146
+ tmp = elem.attr('media');
147
+ if(tmp){
148
+ src.media = tmp;
149
+ }
150
+ return src;
151
+ };
152
+
153
+
154
+
155
+ var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
156
+
157
+ var loadYt = (function(){
158
+ var loaded;
159
+ return function(){
160
+ if(loaded || !hasYt){return;}
161
+ loaded = true;
162
+ webshims.loader.loadScript("https://www.youtube.com/player_api");
163
+ $(function(){
164
+ webshims.polyfill("mediaelement-yt");
165
+ });
166
+ };
167
+ })();
168
+ var loadThird = function(){
169
+ if(hasSwf){
170
+ loadSwf();
171
+ } else {
172
+ loadYt();
173
+ }
174
+ };
175
+
176
+ webshims.addPolyfill('mediaelement-yt', {
177
+ test: !hasYt,
178
+ d: ['dom-support']
179
+ });
180
+
181
+ mediaelement.mimeTypes = {
182
+ audio: {
183
+ //ogm shouldn´t be used!
184
+ 'audio/ogg': ['ogg','oga', 'ogm'],
185
+ 'audio/ogg;codecs="opus"': 'opus',
186
+ 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
187
+ 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
188
+ 'audio/wav': ['wav'],
189
+ 'audio/3gpp': ['3gp','3gpp'],
190
+ 'audio/webm': ['webm'],
191
+ 'audio/fla': ['flv', 'f4a', 'fla'],
192
+ 'application/x-mpegURL': ['m3u8', 'm3u']
193
+ },
194
+ video: {
195
+ //ogm shouldn´t be used!
196
+ 'video/ogg': ['ogg','ogv', 'ogm'],
197
+ 'video/mpeg': ['mpg','mpeg','mpe'],
198
+ 'video/mp4': ['mp4','mpg4', 'm4v'],
199
+ 'video/quicktime': ['mov','qt'],
200
+ 'video/x-msvideo': ['avi'],
201
+ 'video/x-ms-asf': ['asf', 'asx'],
202
+ 'video/flv': ['flv', 'f4v'],
203
+ 'video/3gpp': ['3gp','3gpp'],
204
+ 'video/webm': ['webm'],
205
+ 'application/x-mpegURL': ['m3u8', 'm3u'],
206
+ 'video/MP2T': ['ts']
207
+ }
208
+ }
209
+ ;
210
+
211
+ mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
212
+
213
+ mediaelement.getTypeForSrc = function(src, nodeName){
214
+ if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
215
+ return 'video/youtube';
216
+ }
217
+ src = src.split('?')[0].split('.');
218
+ src = src[src.length - 1];
219
+ var mt;
220
+
221
+ $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
222
+ if(exts.indexOf(src) !== -1){
223
+ mt = mimeType;
224
+ return false;
225
+ }
226
+ });
227
+ return mt;
228
+ };
229
+
230
+
231
+ mediaelement.srces = function(mediaElem, srces){
232
+ mediaElem = $(mediaElem);
233
+ if(!srces){
234
+ srces = [];
235
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
236
+ var src = getSrcObj(mediaElem, nodeName);
237
+
238
+ if(!src.src){
239
+
240
+ $('source', mediaElem).each(function(){
241
+ src = getSrcObj(this, nodeName);
242
+ if(src.src){srces.push(src);}
243
+ });
244
+ } else {
245
+ srces.push(src);
246
+ }
247
+ return srces;
248
+ } else {
249
+ mediaElem.removeAttr('src').removeAttr('type').find('source').remove();
250
+ if(!$.isArray(srces)){
251
+ srces = [srces];
252
+ }
253
+ srces.forEach(function(src){
254
+ var source = document.createElement('source');
255
+ if(typeof src == 'string'){
256
+ src = {src: src};
257
+ }
258
+ source.setAttribute('src', src.src);
259
+ if(src.type){
260
+ source.setAttribute('type', src.type);
261
+ }
262
+ if(src.media){
263
+ source.setAttribute('media', src.media);
264
+ }
265
+ mediaElem.append(source);
266
+ });
267
+
268
+ }
269
+ };
270
+
271
+
272
+ $.fn.loadMediaSrc = function(srces, poster){
273
+ return this.each(function(){
274
+ if(poster !== undefined){
275
+ $(this).removeAttr('poster');
276
+ if(poster){
277
+ $.attr(this, 'poster', poster);
278
+ }
279
+ }
280
+ mediaelement.srces(this, srces);
281
+ $(this).mediaLoad();
282
+ });
283
+ };
284
+
285
+ 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', 'jwplayer/jwplayer', 'video/youtube'];
286
+
287
+ mediaelement.canThirdPlaySrces = function(mediaElem, srces){
288
+ var ret = '';
289
+ if(hasSwf || hasYt){
290
+ mediaElem = $(mediaElem);
291
+ srces = srces || mediaelement.srces(mediaElem);
292
+ $.each(srces, function(i, src){
293
+ if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
294
+ ret = src;
295
+ return false;
296
+ }
297
+ });
298
+
299
+ }
300
+
301
+ return ret;
302
+ };
303
+
304
+ var nativeCanPlayType = {};
305
+ mediaelement.canNativePlaySrces = function(mediaElem, srces){
306
+ var ret = '';
307
+ if(hasNative){
308
+ mediaElem = $(mediaElem);
309
+ var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
310
+ if(!nativeCanPlayType[nodeName]){return ret;}
311
+ srces = srces || mediaelement.srces(mediaElem);
312
+
313
+ $.each(srces, function(i, src){
314
+ if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
315
+ ret = src;
316
+ return false;
317
+ }
318
+ });
319
+ }
320
+ return ret;
321
+ };
322
+
323
+ mediaelement.setError = function(elem, message){
324
+ if(!message){
325
+ message = "can't play sources";
326
+ }
327
+
328
+ $(elem).pause().data('mediaerror', message);
329
+ webshims.warn('mediaelementError: '+ message);
330
+ setTimeout(function(){
331
+ if($(elem).data('mediaerror')){
332
+ $(elem).trigger('mediaerror');
333
+ }
334
+ }, 1);
335
+ };
336
+
337
+ var handleThird = (function(){
338
+ var requested;
339
+ return function( mediaElem, ret, data ){
340
+ webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
341
+ if(mediaelement.createSWF){
342
+ mediaelement.createSWF( mediaElem, ret, data );
343
+ } else if(!requested) {
344
+ requested = true;
345
+ loadThird();
346
+ //readd to ready
347
+ handleThird( mediaElem, ret, data );
348
+ }
349
+ });
350
+ if(!requested && hasYt && !mediaelement.createSWF){
351
+ loadYt();
352
+ }
353
+ };
354
+ })();
355
+
356
+ var stepSources = function(elem, data, useSwf, _srces, _noLoop){
357
+ var ret;
358
+ if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
359
+ ret = mediaelement.canThirdPlaySrces(elem, _srces);
360
+ if(!ret){
361
+ if(_noLoop){
362
+ mediaelement.setError(elem, false);
363
+ } else {
364
+ stepSources(elem, data, false, _srces, true);
365
+ }
366
+ } else {
367
+ handleThird(elem, ret, data);
368
+ }
369
+ } else {
370
+ ret = mediaelement.canNativePlaySrces(elem, _srces);
371
+ if(!ret){
372
+ if(_noLoop){
373
+ mediaelement.setError(elem, false);
374
+ if(data && data.isActive == 'third') {
375
+ mediaelement.setActive(elem, 'html5', data);
376
+ }
377
+ } else {
378
+ stepSources(elem, data, true, _srces, true);
379
+ }
380
+ } else if(data && data.isActive == 'third') {
381
+ mediaelement.setActive(elem, 'html5', data);
382
+ }
383
+ }
384
+ };
385
+ var stopParent = /^(?:embed|object|datalist)$/i;
386
+ var selectSource = function(elem, data){
387
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
388
+ var _srces = mediaelement.srces(elem);
389
+ var parent = elem.parentNode;
390
+
391
+ clearTimeout(baseData.loadTimer);
392
+ $.data(elem, 'mediaerror', false);
393
+
394
+ if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
395
+ data = data || webshims.data(elem, 'mediaelement');
396
+ stepSources(elem, data, options.preferFlash || undefined, _srces);
397
+ };
398
+
399
+
400
+ $(document).on('ended', function(e){
401
+ var data = webshims.data(e.target, 'mediaelement');
402
+ if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
403
+ setTimeout(function(){
404
+ if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
405
+ $(e.target).prop('currentTime', 0).play();
406
+ }, 1);
407
+
408
+ });
409
+ if(!supportsLoop){
410
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
411
+ }
412
+
413
+ ['audio', 'video'].forEach(function(nodeName){
414
+ var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
415
+ prop: {
416
+ value: function(){
417
+ var data = webshims.data(this, 'mediaelement');
418
+ selectSource(this, data);
419
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
420
+ supLoad.prop._supvalue.apply(this, arguments);
421
+ }
422
+ }
423
+ }
424
+ });
425
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
426
+ prop: {
427
+ value: function(type){
428
+ var ret = '';
429
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
430
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
431
+ if(ret == 'no'){
432
+ ret = '';
433
+ }
434
+ }
435
+ if(!ret && hasSwf){
436
+ type = $.trim((type || '').split(';')[0]);
437
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
438
+ ret = 'maybe';
439
+ }
440
+ }
441
+ return ret;
442
+ }
443
+ }
444
+ });
445
+ });
446
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
447
+ set: function(){
448
+ var elem = this;
449
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
450
+ clearTimeout(baseData.loadTimer);
451
+ baseData.loadTimer = setTimeout(function(){
452
+ selectSource(elem);
453
+ elem = null;
454
+ }, 9);
455
+ }
456
+ });
457
+
458
+ var initMediaElements = function(){
459
+
460
+ webshims.addReady(function(context, insertedElement){
461
+ $('video, audio', context)
462
+ .add(insertedElement.filter('video, audio'))
463
+ .each(function(){
464
+ if($.browser.msie && webshims.browserVersion > 8 && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])')){
465
+ $(this).prop('preload', 'metadata').mediaLoad();
466
+ } else {
467
+ selectSource(this);
468
+ }
469
+
470
+
471
+
472
+ if(hasNative){
473
+ var bufferTimer;
474
+ var lastBuffered;
475
+ var elem = this;
476
+ var getBufferedString = function(){
477
+ var buffered = $.prop(elem, 'buffered');
478
+ if(!buffered){return;}
479
+ var bufferString = "";
480
+ for(var i = 0, len = buffered.length; i < len;i++){
481
+ bufferString += buffered.end(i);
482
+ }
483
+ return bufferString;
484
+ };
485
+ var testBuffer = function(){
486
+ var buffered = getBufferedString();
487
+ if(buffered != lastBuffered){
488
+ lastBuffered = buffered;
489
+ $(elem).triggerHandler('progress');
490
+ }
491
+ };
492
+
493
+ $(this)
494
+ .on({
495
+ 'play loadstart progress': function(e){
496
+ if(e.type == 'progress'){
497
+ lastBuffered = getBufferedString();
498
+ }
499
+ clearTimeout(bufferTimer);
500
+ bufferTimer = setTimeout(testBuffer, 999);
501
+ },
502
+ 'emptied stalled mediaerror abort suspend': function(e){
503
+ if(e.type == 'emptied'){
504
+ lastBuffered = false;
505
+ }
506
+ clearTimeout(bufferTimer);
507
+ }
508
+ })
509
+ ;
510
+ }
511
+
512
+ })
513
+ ;
514
+ });
515
+ };
516
+
517
+ if(Modernizr.track && !bugs.track){
518
+ webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
519
+ get: function(){
520
+ return this._shimActiveCues || this.activeCues;
521
+ }
522
+ });
523
+ }
524
+ //set native implementation ready, before swf api is retested
525
+ if(hasNative){
526
+ webshims.isReady('mediaelement-core', true);
527
+ initMediaElements();
528
+ webshims.ready('WINDOWLOAD mediaelement', loadThird);
529
+ } else {
530
+ webshims.ready(swfType, initMediaElements);
531
+ }
532
+ $(function(){
533
+ webshims.loader.loadList(['track-ui']);
534
+ });
535
+
536
+ });
537
+ })(jQuery, Modernizr, jQuery.webshims);/*
538
+ * todos:
539
+ * - decouple muted/volume (needs improvement)
540
+ * - implement video <-> flashcanvas pro API
541
+ * - improve buffered-property with youtube/rtmp
542
+ * - use jwplayer5 api instead of old flash4 api
543
+ */
544
+
545
+ jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
546
+ "use strict";
547
+ var SENDEVENT = 'sendEvent';
548
+ var mediaelement = webshims.mediaelement;
549
+ var swfobject = window.swfobject;
550
+ var hasNative = Modernizr.audio && Modernizr.video;
551
+ var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
552
+ var loadedSwf = 0;
553
+ var getProps = {
554
+ paused: true,
555
+ ended: false,
556
+ currentSrc: '',
557
+ duration: window.NaN,
558
+
559
+ readyState: 0,
560
+ networkState: 0,
561
+ videoHeight: 0,
562
+ videoWidth: 0,
563
+ error: null,
564
+ buffered: {
565
+ start: function(index){
566
+ if(index){
567
+ webshims.error('buffered index size error');
568
+ return;
569
+ }
570
+ return 0;
571
+ },
572
+ end: function(index){
573
+ if(index){
574
+ webshims.error('buffered index size error');
575
+ return;
576
+ }
577
+ return 0;
578
+ },
579
+ length: 0
580
+ }
581
+ };
582
+ var getPropKeys = Object.keys(getProps);
583
+
584
+ var getSetProps = {
585
+ currentTime: 0,
586
+ volume: 1,
587
+ muted: false
588
+ };
589
+ var getSetPropKeys = Object.keys(getSetProps);
590
+
591
+ var playerStateObj = $.extend({
592
+ isActive: 'html5',
593
+ activating: 'html5',
594
+ wasSwfReady: false,
595
+ _bufferedEnd: 0,
596
+ _bufferedStart: 0,
597
+ _metadata: false,
598
+ _durationCalcs: -1,
599
+ _callMeta: false,
600
+ currentTime: 0,
601
+ _ppFlag: undefined
602
+ }, getProps, getSetProps);
603
+
604
+ var idRep = /^jwplayer-/;
605
+ var getSwfDataFromID = function(id){
606
+
607
+ var elem = document.getElementById(id.replace(idRep, ''));
608
+ if(!elem){return;}
609
+ var data = webshims.data(elem, 'mediaelement');
610
+ return data.isActive == 'third' ? data : null;
611
+ };
612
+
613
+
614
+ var getSwfDataFromElem = function(elem){
615
+ try {
616
+ (elem.nodeName);
617
+ } catch(er){
618
+ return null;
619
+ }
620
+ var data = webshims.data(elem, 'mediaelement');
621
+ return (data && data.isActive== 'third') ? data : null;
622
+ };
623
+
624
+ var trigger = function(elem, evt){
625
+ evt = $.Event(evt);
626
+ evt.preventDefault();
627
+ $.event.trigger(evt, undefined, elem);
628
+ };
629
+
630
+ var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
631
+ var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
632
+
633
+ webshims.extendUNDEFProp(options.params, {
634
+ allowscriptaccess: 'always',
635
+ allowfullscreen: 'true',
636
+ wmode: 'transparent'
637
+ });
638
+ webshims.extendUNDEFProp(options.vars, {
639
+ screencolor: 'ffffffff'
640
+ });
641
+ webshims.extendUNDEFProp(options.attrs, {
642
+ bgcolor: '#000000'
643
+ });
644
+
645
+ var getDuration = function(data, obj){
646
+ var curDuration = data.duration;
647
+ if(curDuration && data._durationCalcs > 0){return;}
648
+ try {
649
+ data.duration = data.jwapi.getPlaylist()[0].duration;
650
+ if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
651
+ data.duration = curDuration;
652
+ }
653
+ } catch(er){}
654
+ if(data.duration && data.duration != data._lastDuration){
655
+ trigger(data._elem, 'durationchange');
656
+ if(data._elemNodeName == 'audio' || data._callMeta){
657
+ mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
658
+ }
659
+ data._durationCalcs--;
660
+ } else {
661
+ data._durationCalcs++;
662
+ }
663
+ };
664
+ var setReadyState = function(readyState, data){
665
+ if(readyState < 3){
666
+ clearTimeout(data._canplaythroughTimer);
667
+ }
668
+ if(readyState >= 3 && data.readyState < 3){
669
+ data.readyState = readyState;
670
+ trigger(data._elem, 'canplay');
671
+ clearTimeout(data._canplaythroughTimer);
672
+ data._canplaythroughTimer = setTimeout(function(){
673
+ setReadyState(4, data);
674
+ }, 4000);
675
+ }
676
+ if(readyState >= 4 && data.readyState < 4){
677
+ data.readyState = readyState;
678
+ trigger(data._elem, 'canplaythrough');
679
+ }
680
+ data.readyState = readyState;
681
+ };
682
+
683
+ $.extend($.event.customEvent, {
684
+ updatemediaelementdimensions: true,
685
+ flashblocker: true,
686
+ swfstageresize: true,
687
+ mediaelementapichange: true
688
+ });
689
+
690
+ mediaelement.jwEvents = {
691
+ View: {
692
+
693
+ PLAY: function(obj){
694
+ var data = getSwfDataFromID(obj.id);
695
+ if(!data || data.stopPlayPause){return;}
696
+ data._ppFlag = true;
697
+ if(data.paused == obj.state){
698
+ data.paused = !obj.state;
699
+ if(data.ended){
700
+ data.ended = false;
701
+ }
702
+ trigger(data._elem, obj.state ? 'play' : 'pause');
703
+ }
704
+ }
705
+ },
706
+ Model: {
707
+
708
+ BUFFER: function(obj){
709
+ var data = getSwfDataFromID(obj.id);
710
+ if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
711
+ data.networkState = (obj.percentage == 100) ? 1 : 2;
712
+ if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
713
+ getDuration(data, obj);
714
+ }
715
+
716
+ if(data.ended){
717
+ data.ended = false;
718
+ }
719
+ if(!data.duration){
720
+ return;
721
+ }
722
+ if(obj.percentage > 2 && obj.percentage < 20){
723
+ setReadyState(3, data);
724
+ } else if(obj.percentage > 20){
725
+ setReadyState(4, data);
726
+ }
727
+ if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
728
+ data._bufferedStart = data.currentTime || 0;
729
+ }
730
+
731
+ data._bufferedEnd = obj.percentage;
732
+ data.buffered.length = 1;
733
+ if(obj.percentage == 100){
734
+ data.networkState = 1;
735
+ setReadyState(4, data);
736
+ }
737
+ $.event.trigger('progress', undefined, data._elem, true);
738
+ },
739
+ META: function(obj, data){
740
+
741
+ data = data && data.networkState ? data : getSwfDataFromID(obj.id);
742
+
743
+ if(!data){return;}
744
+ if( !('duration' in obj) ){
745
+ data._callMeta = true;
746
+ return;
747
+ }
748
+
749
+ if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
750
+
751
+ data._metadata = true;
752
+
753
+ var oldDur = data.duration;
754
+ if(obj.duration){
755
+ data.duration = obj.duration;
756
+ }
757
+ data._lastDuration = data.duration;
758
+ if(obj.height || obj.width){
759
+ data.videoHeight = obj.height || 0;
760
+ data.videoWidth = obj.width || 0;
761
+ }
762
+ if(!data.networkState){
763
+ data.networkState = 2;
764
+ }
765
+ if(data.readyState < 1){
766
+ setReadyState(1, data);
767
+ }
768
+ if(data.duration && oldDur !== data.duration){
769
+ trigger(data._elem, 'durationchange');
770
+ }
771
+
772
+ trigger(data._elem, 'loadedmetadata');
773
+ },
774
+ TIME: function(obj){
775
+ var data = getSwfDataFromID(obj.id);
776
+ if(!data || data.currentTime === obj.position){return;}
777
+ data.currentTime = obj.position;
778
+ if(data.duration && data.duration < data.currentTime){
779
+ getDuration(data, obj);
780
+ }
781
+ if(data.readyState < 2){
782
+ setReadyState(2, data);
783
+ }
784
+ if(data.ended){
785
+ data.ended = false;
786
+ }
787
+ trigger(data._elem, 'timeupdate');
788
+
789
+ },
790
+ STATE: function(obj){
791
+ var data = getSwfDataFromID(obj.id);
792
+ if(!data){return;}
793
+ switch(obj.newstate) {
794
+ case 'BUFFERING':
795
+
796
+ if(data.ended){
797
+ data.ended = false;
798
+ }
799
+ setReadyState(1, data);
800
+ trigger(data._elem, 'waiting');
801
+ break;
802
+ case 'PLAYING':
803
+ data.paused = false;
804
+ data._ppFlag = true;
805
+ if(!data.duration){
806
+ getDuration(data, obj);
807
+ }
808
+ if(data.readyState < 3){
809
+ setReadyState(3, data);
810
+ }
811
+ if(data.ended){
812
+ data.ended = false;
813
+ }
814
+ trigger(data._elem, 'playing');
815
+ break;
816
+ case 'PAUSED':
817
+ if(!data.paused && !data.stopPlayPause){
818
+ data.paused = true;
819
+ data._ppFlag = true;
820
+ trigger(data._elem, 'pause');
821
+ }
822
+ break;
823
+ case 'COMPLETED':
824
+ if(data.readyState < 4){
825
+ setReadyState(4, data);
826
+ }
827
+ data.ended = true;
828
+ trigger(data._elem, 'ended');
829
+ break;
830
+ }
831
+ }
832
+ }
833
+ ,Controller: {
834
+
835
+ ERROR: function(obj){
836
+ var data = getSwfDataFromID(obj.id);
837
+ if(!data){return;}
838
+ mediaelement.setError(data._elem, obj.message);
839
+ },
840
+ SEEK: function(obj){
841
+ var data = getSwfDataFromID(obj.id);
842
+ if(!data){return;}
843
+ if(data.ended){
844
+ data.ended = false;
845
+ }
846
+ if(data.paused){
847
+ try {
848
+ data.jwapi[SENDEVENT]('play', 'false');
849
+ } catch(er){}
850
+ }
851
+ if(data.currentTime != obj.position){
852
+ data.currentTime = obj.position;
853
+ trigger(data._elem, 'timeupdate');
854
+ }
855
+
856
+
857
+ },
858
+ VOLUME: function(obj){
859
+ var data = getSwfDataFromID(obj.id);
860
+ if(!data){return;}
861
+ var newVolume = obj.percentage / 100;
862
+ if(data.volume == newVolume){return;}
863
+ data.volume = newVolume;
864
+ trigger(data._elem, 'volumechange');
865
+ },
866
+ MUTE: function(obj){
867
+ if(obj.state){return;}
868
+ var data = getSwfDataFromID(obj.id);
869
+ if(!data){return;}
870
+ if(data.muted == obj.state){return;}
871
+ data.muted = obj.state;
872
+ trigger(data._elem, 'volumechange');
873
+ }
874
+ }
875
+ };
876
+
877
+ var initEvents = function(data){
878
+ var passed = true;
879
+ $.each(mediaelement.jwEvents, function(mvcName, evts){
880
+ $.each(evts, function(evtName){
881
+ try {
882
+ data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
883
+ } catch(er){
884
+ passed = false;
885
+ return false;
886
+ }
887
+ });
888
+ });
889
+ return passed;
890
+ };
891
+
892
+ var workActionQueue = function(data){
893
+ var actionLen = data.actionQueue.length;
894
+ var i = 0;
895
+ var operation;
896
+ if(actionLen && data.isActive == 'third'){
897
+ while(data.actionQueue.length && actionLen > i){
898
+ i++;
899
+ operation = data.actionQueue.shift();
900
+ data.jwapi[operation.fn].apply(data.jwapi, operation.args);
901
+ }
902
+ }
903
+ if(data.actionQueue.length){
904
+ data.actionQueue = [];
905
+ }
906
+ };
907
+ var startAutoPlay = function(data){
908
+ if(!data){return;}
909
+ if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
910
+ setTimeout(function(){
911
+ if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
912
+ try {
913
+ $(data._elem).play();
914
+ } catch(er){}
915
+ }
916
+ }, 1);
917
+ }
918
+ };
919
+
920
+
921
+ mediaelement.playerResize = function(id){
922
+ if(!id){return;}
923
+ var elem = document.getElementById(id.replace(idRep, ''));
924
+
925
+ if(elem){
926
+ $(elem).triggerHandler('swfstageresize');
927
+ }
928
+ elem = null;
929
+ };
930
+
931
+
932
+ $(document).on('emptied', function(e){
933
+ var data = getSwfDataFromElem(e.target);
934
+ startAutoPlay(data);
935
+ });
936
+
937
+ var localConnectionTimer;
938
+ mediaelement.jwPlayerReady = function(jwData){
939
+ var data = getSwfDataFromID(jwData.id);
940
+ var passed = true;
941
+ var i = 0;
942
+ var doneFn = function(){
943
+ if(i > 9){return;}
944
+ i++;
945
+ if(initEvents(data)){
946
+ if(!data.wasSwfReady){
947
+ var version = parseFloat( jwData.version, 10);
948
+ if(version < 5.1 || version >= 6){
949
+ webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
950
+ }
951
+ } else {
952
+ $(data._elem).mediaLoad();
953
+
954
+ }
955
+ data.wasSwfReady = true;
956
+ data.tryedReframeing = 0;
957
+ workActionQueue(data);
958
+ startAutoPlay(data);
959
+ } else {
960
+ clearTimeout(data.reframeTimer);
961
+ data.reframeTimer = setTimeout(doneFn, 9 * i);
962
+ if(i > 2 && data.tryedReframeing < 9){
963
+ data.tryedReframeing++;
964
+ data.shadowElem.css({overflow: 'visible'});
965
+ setTimeout(function(){
966
+ data.shadowElem.css({overflow: 'hidden'});
967
+ }, 16);
968
+ }
969
+ }
970
+ };
971
+ if(!data || !data.jwapi){return;}
972
+ if(!data.tryedReframeing){
973
+ data.tryedReframeing = 0;
974
+ }
975
+ clearTimeout(localConnectionTimer);
976
+ data.jwData = jwData;
977
+ data.shadowElem.removeClass('flashblocker-assumed');
978
+ $.prop(data._elem, 'volume', data.volume);
979
+ $.prop(data._elem, 'muted', data.muted);
980
+ doneFn();
981
+
982
+ };
983
+
984
+ var addMediaToStopEvents = $.noop;
985
+ if(hasNative){
986
+ var stopEvents = {
987
+ play: 1,
988
+ playing: 1
989
+ };
990
+ var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
991
+ var hidevents = hideEvtArray.map(function(evt){
992
+ return evt +'.webshimspolyfill';
993
+ }).join(' ');
994
+
995
+ var hidePlayerEvents = function(event){
996
+ var data = webshims.data(event.target, 'mediaelement');
997
+ if(!data){return;}
998
+ var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
999
+ if( isNativeHTML5 == (data.activating == 'third') ){
1000
+ event.stopImmediatePropagation();
1001
+ if(stopEvents[event.type] && data.isActive != data.activating){
1002
+ $(event.target).pause();
1003
+ }
1004
+ }
1005
+ };
1006
+
1007
+ addMediaToStopEvents = function(elem){
1008
+ $(elem)
1009
+ .off(hidevents)
1010
+ .on(hidevents, hidePlayerEvents)
1011
+ ;
1012
+ hideEvtArray.forEach(function(evt){
1013
+ webshims.moveToFirstEvent(elem, evt);
1014
+ });
1015
+ };
1016
+ addMediaToStopEvents(document);
1017
+ }
1018
+
1019
+
1020
+ mediaelement.setActive = function(elem, type, data){
1021
+ if(!data){
1022
+ data = webshims.data(elem, 'mediaelement');
1023
+ }
1024
+ if(!data || data.isActive == type){return;}
1025
+ if(type != 'html5' && type != 'third'){
1026
+ webshims.warn('wrong type for mediaelement activating: '+ type);
1027
+ }
1028
+ var shadowData = webshims.data(elem, 'shadowData');
1029
+ data.activating = type;
1030
+ $(elem).pause();
1031
+ data.isActive = type;
1032
+ if(type == 'third'){
1033
+ shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
1034
+ $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
1035
+ } else {
1036
+ $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
1037
+ shadowData.shadowElement = shadowData.shadowFocusElement = false;
1038
+ }
1039
+ $(elem).trigger('mediaelementapichange');
1040
+ };
1041
+
1042
+
1043
+
1044
+ var resetSwfProps = (function(){
1045
+ var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
1046
+ var len = resetProtoProps.length;
1047
+ return function(data){
1048
+
1049
+ if(!data){return;}
1050
+ var lenI = len;
1051
+ var networkState = data.networkState;
1052
+ setReadyState(0, data);
1053
+ while(--lenI){
1054
+ delete data[resetProtoProps[lenI]];
1055
+ }
1056
+ data.actionQueue = [];
1057
+ data.buffered.length = 0;
1058
+ if(networkState){
1059
+ trigger(data._elem, 'emptied');
1060
+ }
1061
+ };
1062
+ })();
1063
+
1064
+ var setElementDimension = function(data, hasControls){
1065
+ var elem = data._elem;
1066
+ var box = data.shadowElem;
1067
+ $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
1068
+ if(data._elemNodeName == 'audio' && !hasControls){
1069
+ box.css({width: 0, height: 0});
1070
+ } else {
1071
+ box.css({
1072
+ width: elem.style.width || $(elem).width(),
1073
+ height: elem.style.height || $(elem).height()
1074
+ });
1075
+ }
1076
+ };
1077
+
1078
+ mediaelement.createSWF = function( elem, canPlaySrc, data ){
1079
+ if(!hasFlash){
1080
+ setTimeout(function(){
1081
+ $(elem).mediaLoad(); //<- this should produce a mediaerror
1082
+ }, 1);
1083
+ return;
1084
+ }
1085
+
1086
+ if(loadedSwf < 1){
1087
+ loadedSwf = 1;
1088
+ } else {
1089
+ loadedSwf++;
1090
+ }
1091
+ var vars = $.extend({}, options.vars, {
1092
+ image: $.prop(elem, 'poster') || '',
1093
+ file: canPlaySrc.srcProp
1094
+ });
1095
+ var elemVars = $(elem).data('vars') || {};
1096
+
1097
+ if(!data){
1098
+ data = webshims.data(elem, 'mediaelement');
1099
+ }
1100
+
1101
+ if(data && data.swfCreated){
1102
+ mediaelement.setActive(elem, 'third', data);
1103
+ resetSwfProps(data);
1104
+ data.currentSrc = canPlaySrc.srcProp;
1105
+ $.extend(vars, elemVars);
1106
+ options.changeSWF(vars, elem, canPlaySrc, data, 'load');
1107
+ queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
1108
+ return;
1109
+ }
1110
+
1111
+
1112
+ var hasControls = $.prop(elem, 'controls');
1113
+ var elemId = 'jwplayer-'+ webshims.getID(elem);
1114
+ var params = $.extend(
1115
+ {},
1116
+ options.params,
1117
+ $(elem).data('params')
1118
+ );
1119
+ var elemNodeName = elem.nodeName.toLowerCase();
1120
+ var attrs = $.extend(
1121
+ {},
1122
+ options.attrs,
1123
+ {
1124
+ name: elemId,
1125
+ id: elemId
1126
+ },
1127
+ $(elem).data('attrs')
1128
+ );
1129
+ var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
1130
+ .css({
1131
+ position: 'relative',
1132
+ overflow: 'hidden'
1133
+ })
1134
+ ;
1135
+ data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
1136
+ actionQueue: {
1137
+ value: []
1138
+ },
1139
+ shadowElem: {
1140
+ value: box
1141
+ },
1142
+ _elemNodeName: {
1143
+ value: elemNodeName
1144
+ },
1145
+ _elem: {
1146
+ value: elem
1147
+ },
1148
+ currentSrc: {
1149
+ value: canPlaySrc.srcProp
1150
+ },
1151
+ swfCreated: {
1152
+ value: true
1153
+ },
1154
+ buffered: {
1155
+ value: {
1156
+ start: function(index){
1157
+ if(index >= data.buffered.length){
1158
+ webshims.error('buffered index size error');
1159
+ return;
1160
+ }
1161
+ return 0;
1162
+ },
1163
+ end: function(index){
1164
+ if(index >= data.buffered.length){
1165
+ webshims.error('buffered index size error');
1166
+ return;
1167
+ }
1168
+ return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
1169
+ },
1170
+ length: 0
1171
+ }
1172
+ }
1173
+ }));
1174
+
1175
+ setElementDimension(data, hasControls);
1176
+
1177
+ box.insertBefore(elem);
1178
+
1179
+ if(hasNative){
1180
+ $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
1181
+ }
1182
+
1183
+ $.extend(vars,
1184
+ {
1185
+ id: elemId,
1186
+ controlbar: hasControls ? options.vars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
1187
+ icons: ''+ (hasControls && elemNodeName == 'video')
1188
+ },
1189
+ elemVars,
1190
+ {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
1191
+ );
1192
+ if(vars.plugins){
1193
+ vars.plugins += ','+jwplugin;
1194
+ } else {
1195
+ vars.plugins = jwplugin;
1196
+ }
1197
+
1198
+
1199
+ webshims.addShadowDom(elem, box);
1200
+
1201
+ addMediaToStopEvents(elem);
1202
+
1203
+ mediaelement.setActive(elem, 'third', data);
1204
+
1205
+ options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
1206
+
1207
+ $(elem).on('updatemediaelementdimensions updateshadowdom', function(){
1208
+ setElementDimension(data, $.prop(elem, 'controls'));
1209
+ });
1210
+
1211
+
1212
+ swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
1213
+
1214
+ if(swfData.success){
1215
+ data.jwapi = swfData.ref;
1216
+
1217
+ if(!hasControls){
1218
+ $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
1219
+ }
1220
+ setTimeout(function(){
1221
+ if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
1222
+ box.addClass('flashblocker-assumed');
1223
+ $(elem).trigger('flashblocker');
1224
+ webshims.warn("flashblocker assumed");
1225
+ }
1226
+ $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
1227
+ }, 9);
1228
+ if(!localConnectionTimer){
1229
+ clearTimeout(localConnectionTimer);
1230
+ localConnectionTimer = setTimeout(function(){
1231
+ var flash = $(swfData.ref);
1232
+ if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
1233
+ 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");
1234
+ } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
1235
+ webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
1236
+ }
1237
+ flash = null;
1238
+ }, 8000);
1239
+ }
1240
+ }
1241
+ });
1242
+ };
1243
+
1244
+
1245
+ var queueSwfMethod = function(elem, fn, args, data){
1246
+ data = data || getSwfDataFromElem(elem);
1247
+ if(data){
1248
+ if(data.jwapi && data.jwapi[fn]){
1249
+ data.jwapi[fn].apply(data.jwapi, args || []);
1250
+ } else {
1251
+ //todo add to queue
1252
+ data.actionQueue.push({fn: fn, args: args});
1253
+ if(data.actionQueue.length > 10){
1254
+ setTimeout(function(){
1255
+ if(data.actionQueue.length > 5){
1256
+ data.actionQueue.shift();
1257
+ }
1258
+ }, 99);
1259
+ }
1260
+ }
1261
+ return data;
1262
+ }
1263
+ return false;
1264
+ };
1265
+
1266
+ ['audio', 'video'].forEach(function(nodeName){
1267
+ var descs = {};
1268
+ var mediaSup;
1269
+ var createGetProp = function(key){
1270
+ if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
1271
+
1272
+ descs[key] = {
1273
+ get: function(){
1274
+ var data = getSwfDataFromElem(this);
1275
+ if(data){
1276
+ return data[key];
1277
+ } else if(hasNative && mediaSup[key].prop._supget) {
1278
+ return mediaSup[key].prop._supget.apply(this);
1279
+ } else {
1280
+ return playerStateObj[key];
1281
+ }
1282
+ },
1283
+ writeable: false
1284
+ };
1285
+ };
1286
+ var createGetSetProp = function(key, setFn){
1287
+ createGetProp(key);
1288
+ delete descs[key].writeable;
1289
+ descs[key].set = setFn;
1290
+ };
1291
+
1292
+ createGetSetProp('volume', function(v){
1293
+ var data = getSwfDataFromElem(this);
1294
+ if(data){
1295
+ v *= 100;
1296
+ if(!isNaN(v)){
1297
+ var muted = data.muted;
1298
+ if(v < 0 || v > 100){
1299
+ webshims.error('volume greater or less than allowed '+ (v / 100));
1300
+ }
1301
+
1302
+ queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
1303
+ if(muted){
1304
+ try {
1305
+ data.jwapi.sendEvent('mute', 'true');
1306
+ } catch(er){}
1307
+ }
1308
+ v /= 100;
1309
+ if(data.volume == v || data.isActive != 'third'){return;}
1310
+ data.volume = v;
1311
+ trigger(data._elem, 'volumechange');
1312
+ data = null;
1313
+ }
1314
+ } else if(mediaSup.volume.prop._supset) {
1315
+ return mediaSup.volume.prop._supset.apply(this, arguments);
1316
+ }
1317
+ });
1318
+
1319
+ createGetSetProp('muted', function(m){
1320
+ var data = getSwfDataFromElem(this);
1321
+ if(data){
1322
+ m = !!m;
1323
+ queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
1324
+ if(data.muted == m || data.isActive != 'third'){return;}
1325
+ data.muted = m;
1326
+ trigger(data._elem, 'volumechange');
1327
+ data = null;
1328
+ } else if(mediaSup.muted.prop._supset) {
1329
+ return mediaSup.muted.prop._supset.apply(this, arguments);
1330
+ }
1331
+ });
1332
+
1333
+
1334
+ createGetSetProp('currentTime', function(t){
1335
+ var data = getSwfDataFromElem(this);
1336
+ if(data){
1337
+ t *= 1;
1338
+ if (!isNaN(t)) {
1339
+ if(data.paused){
1340
+ clearTimeout(data.stopPlayPause);
1341
+ data.stopPlayPause = setTimeout(function(){
1342
+ data.paused = true;
1343
+ data.stopPlayPause = false;
1344
+ }, 50);
1345
+ }
1346
+ queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
1347
+
1348
+ if(data.paused){
1349
+ if(data.readyState > 0){
1350
+ data.currentTime = t;
1351
+ trigger(data._elem, 'timeupdate');
1352
+ }
1353
+ try {
1354
+ data.jwapi[SENDEVENT]('play', 'false');
1355
+ } catch(er){}
1356
+
1357
+ }
1358
+ }
1359
+
1360
+ } else if(mediaSup.currentTime.prop._supset) {
1361
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
1362
+ }
1363
+ });
1364
+
1365
+ ['play', 'pause'].forEach(function(fn){
1366
+ descs[fn] = {
1367
+ value: function(){
1368
+ var data = getSwfDataFromElem(this);
1369
+ if(data){
1370
+ if(data.stopPlayPause){
1371
+ clearTimeout(data.stopPlayPause);
1372
+ }
1373
+ queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
1374
+ setTimeout(function(){
1375
+ if(data.isActive == 'third'){
1376
+ data._ppFlag = true;
1377
+ if(data.paused != (fn != 'play')){
1378
+ data.paused = fn != 'play';
1379
+ trigger(data._elem, fn);
1380
+ }
1381
+ }
1382
+ }, 1);
1383
+ } else if(mediaSup[fn].prop._supvalue) {
1384
+ return mediaSup[fn].prop._supvalue.apply(this, arguments);
1385
+ }
1386
+ }
1387
+ };
1388
+ });
1389
+
1390
+ getPropKeys.forEach(createGetProp);
1391
+
1392
+ webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
1393
+ var data = getSwfDataFromElem(this);
1394
+ $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
1395
+
1396
+ if(data){
1397
+ try {
1398
+ queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
1399
+ } catch(er){
1400
+ webshims.warn("you need to generate a crossdomain.xml");
1401
+ }
1402
+ if(nodeName == 'audio'){
1403
+ setElementDimension(data, boolProp);
1404
+ }
1405
+ $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
1406
+ }
1407
+ });
1408
+
1409
+ mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
1410
+ });
1411
+
1412
+ if(hasFlash){
1413
+ var oldClean = $.cleanData;
1414
+ var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
1415
+ var flashNames = {
1416
+ object: 1,
1417
+ OBJECT: 1
1418
+ };
1419
+ $.cleanData = function(elems){
1420
+ var i, len, prop;
1421
+ if(elems && (len = elems.length) && loadedSwf){
1422
+
1423
+ for(i = 0; i < len; i++){
1424
+ if(flashNames[elems[i].nodeName]){
1425
+ if(SENDEVENT in elems[i]){
1426
+ loadedSwf--;
1427
+ try {
1428
+ elems[i][SENDEVENT]('play', false);
1429
+ } catch(er){}
1430
+ }
1431
+ if(gcBrowser){
1432
+ try {
1433
+ for (prop in elems[i]) {
1434
+ if (typeof elems[i][prop] == "function") {
1435
+ elems[i][prop] = null;
1436
+ }
1437
+ }
1438
+ } catch(er){}
1439
+ }
1440
+ }
1441
+ }
1442
+
1443
+ }
1444
+ return oldClean.apply(this, arguments);
1445
+ };
1446
+ }
1447
+
1448
+ if(!hasNative){
1449
+
1450
+ ['poster', 'src'].forEach(function(prop){
1451
+ webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
1452
+ //attr: {},
1453
+ reflect: true,
1454
+ propType: 'src'
1455
+ });
1456
+ });
1457
+
1458
+
1459
+ ['autoplay', 'controls'].forEach(function(name){
1460
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
1461
+ });
1462
+
1463
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
1464
+ HAVE_CURRENT_DATA: {
1465
+ value: 2
1466
+ },
1467
+ HAVE_ENOUGH_DATA: {
1468
+ value: 4
1469
+ },
1470
+ HAVE_FUTURE_DATA: {
1471
+ value: 3
1472
+ },
1473
+ HAVE_METADATA: {
1474
+ value: 1
1475
+ },
1476
+ HAVE_NOTHING: {
1477
+ value: 0
1478
+ },
1479
+ NETWORK_EMPTY: {
1480
+ value: 0
1481
+ },
1482
+ NETWORK_IDLE: {
1483
+ value: 1
1484
+ },
1485
+ NETWORK_LOADING: {
1486
+ value: 2
1487
+ },
1488
+ NETWORK_NO_SOURCE: {
1489
+ value: 3
1490
+ }
1491
+
1492
+ }, 'prop');
1493
+ }
1607
1494
  });