webshims-rails 0.4.5 → 0.4.6

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