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,892 +1,892 @@
1
- jQuery.webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
2
- "use strict";
3
-
4
- var mediaelement = webshims.mediaelement;
5
- var swfobject = window.swfobject;
6
- var hasNative = Modernizr.audio && Modernizr.video;
7
- var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
8
- var loadedSwf = 0;
9
- var getProps = {
10
- paused: true,
11
- ended: false,
12
- currentSrc: '',
13
- duration: window.NaN,
14
- readyState: 0,
15
- networkState: 0,
16
- videoHeight: 0,
17
- videoWidth: 0,
18
- error: null,
19
- buffered: {
20
- start: function(index){
21
- if(index){
22
- webshims.error('buffered index size error');
23
- return;
24
- }
25
- return 0;
26
- },
27
- end: function(index){
28
- if(index){
29
- webshims.error('buffered index size error');
30
- return;
31
- }
32
- return 0;
33
- },
34
- length: 0
35
- }
36
- };
37
- var getPropKeys = Object.keys(getProps);
38
-
39
- var getSetProps = {
40
- currentTime: 0,
41
- volume: 1,
42
- muted: false
43
- };
44
- var getSetPropKeys = Object.keys(getSetProps);
45
-
46
- var playerStateObj = $.extend({
47
- isActive: 'html5',
48
- activating: 'html5',
49
- wasSwfReady: false,
50
- _bufferedEnd: 0,
51
- _bufferedStart: 0,
52
- currentTime: 0,
53
- _ppFlag: undefined,
54
- _calledMeta: false,
55
- lastDuration: 0
56
- }, getProps, getSetProps);
57
-
58
- var idRep = /^jarisplayer-/;
59
- var getSwfDataFromID = function(id){
60
-
61
- var elem = document.getElementById(id.replace(idRep, ''));
62
- if(!elem){return;}
63
- var data = webshims.data(elem, 'mediaelement');
64
- return data.isActive == 'third' ? data : null;
65
- };
66
-
67
-
68
- var getSwfDataFromElem = function(elem){
69
- try {
70
- (elem.nodeName);
71
- } catch(er){
72
- return null;
73
- }
74
- var data = webshims.data(elem, 'mediaelement');
75
- return (data && data.isActive== 'third') ? data : null;
76
- };
77
-
78
- var trigger = function(elem, evt){
79
- evt = $.Event(evt);
80
- evt.preventDefault();
81
- $.event.trigger(evt, undefined, elem);
82
- };
83
-
84
- var playerSwfPath = options.playerPath || webshims.cfg.basePath + "swf/" + (options.playerName || 'JarisFLVPlayer.swf');
85
-
86
- webshims.extendUNDEFProp(options.params, {
87
- allowscriptaccess: 'always',
88
- allowfullscreen: 'true',
89
- wmode: 'transparent',
90
- allowNetworking: 'all'
91
- });
92
- webshims.extendUNDEFProp(options.vars, {
93
- controltype: '1',
94
- jsapi: '1'
95
- });
96
- webshims.extendUNDEFProp(options.attrs, {
97
- bgcolor: '#000000'
98
- });
99
-
100
- var setReadyState = function(readyState, data){
101
- if(readyState < 3){
102
- clearTimeout(data._canplaythroughTimer);
103
- }
104
- if(readyState >= 3 && data.readyState < 3){
105
- data.readyState = readyState;
106
- trigger(data._elem, 'canplay');
107
- if(!data.paused){
108
- trigger(data._elem, 'playing');
109
- }
110
- clearTimeout(data._canplaythroughTimer);
111
- data._canplaythroughTimer = setTimeout(function(){
112
- setReadyState(4, data);
113
- }, 4000);
114
- }
115
- if(readyState >= 4 && data.readyState < 4){
116
- data.readyState = readyState;
117
- trigger(data._elem, 'canplaythrough');
118
- }
119
- data.readyState = readyState;
120
- };
121
-
122
- $.extend($.event.customEvent, {
123
- updatemediaelementdimensions: true,
124
- flashblocker: true,
125
- swfstageresize: true,
126
- mediaelementapichange: true
127
- });
128
-
129
- mediaelement.jarisEvent = {};
130
- var localConnectionTimer;
131
- var onEvent = {
132
- onPlayPause: function(jaris, data, override){
133
- var playing, type;
134
- if(override == null){
135
- try {
136
- playing = data.api.api_get("isPlaying");
137
- } catch(e){}
138
- } else {
139
- playing = override;
140
- }
141
- if(playing == data.paused){
142
-
143
- data.paused = !playing;
144
- type = data.paused ? 'pause' : 'play';
145
- data._ppFlag = true;
146
- trigger(data._elem, type);
147
- if(data.readyState < 3){
148
- setReadyState(3, data);
149
- }
150
- if(!data.paused){
151
- trigger(data._elem, 'playing');
152
- }
153
- }
154
- },
155
- onNotBuffering: function(jaris, data){
156
- setReadyState(3, data);
157
- },
158
- onDataInitialized: function(jaris, data){
159
-
160
- var oldDur = data.duration;
161
- var durDelta;
162
- data.duration = jaris.duration;
163
- if(oldDur == data.duration || isNaN(data.duration)){return;}
164
-
165
- if(data._calledMeta && ((durDelta = Math.abs(data.lastDuration - data.duration)) < 2)){return;}
166
-
167
-
168
-
169
- data.videoHeight = jaris.height;
170
- data.videoWidth = jaris.width;
171
-
172
- if(!data.networkState){
173
- data.networkState = 2;
174
- }
175
- if(data.readyState < 1){
176
- setReadyState(1, data);
177
- }
178
- clearTimeout(data._durationChangeTimer);
179
- if(data._calledMeta && data.duration){
180
- data._durationChangeTimer = setTimeout(function(){
181
- data.lastDuration = data.duration;
182
- trigger(data._elem, 'durationchange');
183
- }, durDelta > 50 ? 0 : durDelta > 9 ? 9 : 99);
184
- } else {
185
- data.lastDuration = data.duration;
186
- if(data.duration){
187
- trigger(data._elem, 'durationchange');
188
- }
189
- if(!data._calledMeta){
190
- trigger(data._elem, 'loadedmetadata');
191
- }
192
- }
193
- data._calledMeta = true;
194
- },
195
- onBuffering: function(jaris, data){
196
- if(data.ended){
197
- data.ended = false;
198
- }
199
- setReadyState(1, data);
200
- trigger(data._elem, 'waiting');
201
- },
202
- onTimeUpdate: function(jaris, data){
203
- if(data.ended){
204
- data.ended = false;
205
- }
206
- if(data.readyState < 3){
207
- setReadyState(3, data);
208
- trigger(data._elem, 'playing');
209
- }
210
-
211
- trigger(data._elem, 'timeupdate');
212
- },
213
- onProgress: function(jaris, data){
214
- if(data.ended){
215
- data.ended = false;
216
- }
217
- if(!data.duration || isNaN(data.duration)){
218
- return;
219
- }
220
- var percentage = jaris.loaded / jaris.total;
221
- if(percentage > 0.02 && percentage < 0.2){
222
- setReadyState(3, data);
223
- } else if(percentage > 0.2){
224
- if(percentage > 0.99){
225
- data.networkState = 1;
226
- }
227
- setReadyState(4, data);
228
- }
229
- if(data._bufferedEnd && (data._bufferedEnd > percentage)){
230
- data._bufferedStart = data.currentTime || 0;
231
- }
232
-
233
- data._bufferedEnd = percentage;
234
- data.buffered.length = 1;
235
-
236
- $.event.trigger('progress', undefined, data._elem, true);
237
- },
238
- onPlaybackFinished: function(jaris, data){
239
- if(data.readyState < 4){
240
- setReadyState(4, data);
241
- }
242
- data.ended = true;
243
- trigger(data._elem, 'ended');
244
- },
245
- onVolumeChange: function(jaris, data){
246
- if(data.volume != jaris.volume || data.muted != jaris.mute){
247
- data.volume = jaris.volume;
248
- data.muted = jaris.mute;
249
- trigger(data._elem, 'volumechange');
250
- }
251
- },
252
- ready: (function(){
253
- var testAPI = function(data){
254
- var passed = true;
255
-
256
- try {
257
- data.api.api_get('volume');
258
- } catch(er){
259
- passed = false;
260
- }
261
- return passed;
262
- };
263
-
264
- return function(jaris, data){
265
- var i = 0;
266
- var doneFn = function(){
267
- if(i > 9){
268
- data.tryedReframeing = 0;
269
- return;
270
- }
271
- i++;
272
-
273
- data.tryedReframeing++;
274
- if(testAPI(data)){
275
- data.wasSwfReady = true;
276
- data.tryedReframeing = 0;
277
- startAutoPlay(data);
278
- workActionQueue(data);
279
- } else if(data.tryedReframeing < 6) {
280
- if(data.tryedReframeing < 3){
281
- data.reframeTimer = setTimeout(doneFn, 9);
282
- data.shadowElem.css({overflow: 'visible'});
283
- setTimeout(function(){
284
- data.shadowElem.css({overflow: 'hidden'});
285
- }, 1);
286
- } else {
287
- data.shadowElem.css({overflow: 'hidden'});
288
- $(data._elem).mediaLoad();
289
- }
290
- } else {
291
- clearTimeout(data.reframeTimer);
292
- webshims.error("reframing error");
293
- }
294
- };
295
- if(!data || !data.api){return;}
296
- if(!data.tryedReframeing){
297
- data.tryedReframeing = 0;
298
- }
299
- clearTimeout(localConnectionTimer);
300
- clearTimeout(data.reframeTimer);
301
- data.shadowElem.removeClass('flashblocker-assumed');
302
-
303
- if(!i){
304
- doneFn();
305
- } else {
306
- data.reframeTimer = setTimeout(doneFn, 9);
307
- }
308
-
309
- };
310
- })()
311
- };
312
-
313
- onEvent.onMute = onEvent.onVolumeChange;
314
-
315
-
316
- var workActionQueue = function(data){
317
- var actionLen = data.actionQueue.length;
318
- var i = 0;
319
- var operation;
320
-
321
- if(actionLen && data.isActive == 'third'){
322
- while(data.actionQueue.length && actionLen > i){
323
- i++;
324
- operation = data.actionQueue.shift();
325
- try{
326
- data.api[operation.fn].apply(data.api, operation.args);
327
- } catch(er){
328
- webshims.warn(er);
329
- }
330
- }
331
- }
332
- if(data.actionQueue.length){
333
- data.actionQueue = [];
334
- }
335
- };
336
- var startAutoPlay = function(data){
337
- if(!data){return;}
338
- if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
339
- setTimeout(function(){
340
- if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
341
-
342
- try {
343
- $(data._elem).play();
344
- data._ppFlag = true;
345
- } catch(er){}
346
- }
347
- }, 1);
348
- }
349
-
350
- if(data.muted){
351
- $.prop(data._elem, 'muted', true);
352
- }
353
- if(data.volume != 1){
354
- $.prop(data._elem, 'volume', data.volume);
355
- }
356
- };
357
-
358
-
359
- var addMediaToStopEvents = $.noop;
360
- if(hasNative){
361
- var stopEvents = {
362
- play: 1,
363
- playing: 1
364
- };
365
- var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
366
- var hidevents = hideEvtArray.map(function(evt){
367
- return evt +'.webshimspolyfill';
368
- }).join(' ');
369
-
370
- var hidePlayerEvents = function(event){
371
- var data = webshims.data(event.target, 'mediaelement');
372
- if(!data){return;}
373
- var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
374
- if( isNativeHTML5 == (data.activating == 'third') ){
375
- event.stopImmediatePropagation();
376
- if(stopEvents[event.type] && data.isActive != data.activating){
377
- $(event.target).pause();
378
- }
379
- }
380
- };
381
-
382
- addMediaToStopEvents = function(elem){
383
- $(elem)
384
- .off(hidevents)
385
- .on(hidevents, hidePlayerEvents)
386
- ;
387
- hideEvtArray.forEach(function(evt){
388
- webshims.moveToFirstEvent(elem, evt);
389
- });
390
- };
391
- addMediaToStopEvents(document);
392
- }
393
-
394
-
395
- mediaelement.setActive = function(elem, type, data){
396
- if(!data){
397
- data = webshims.data(elem, 'mediaelement');
398
- }
399
- if(!data || data.isActive == type){return;}
400
- if(type != 'html5' && type != 'third'){
401
- webshims.warn('wrong type for mediaelement activating: '+ type);
402
- }
403
- var shadowData = webshims.data(elem, 'shadowData');
404
- data.activating = type;
405
- $(elem).pause();
406
- data.isActive = type;
407
- if(type == 'third'){
408
- shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
409
- $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
410
- } else {
411
- $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
412
- shadowData.shadowElement = shadowData.shadowFocusElement = false;
413
- }
414
- $(elem).trigger('mediaelementapichange');
415
- };
416
-
417
-
418
-
419
- var resetSwfProps = (function(){
420
- var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth'];
421
- var len = resetProtoProps.length;
422
- return function(data){
423
-
424
- if(!data){return;}
425
- var lenI = len;
426
- var networkState = data.networkState;
427
- setReadyState(0, data);
428
- clearTimeout(data._durationChangeTimer);
429
- while(--lenI > -1){
430
- delete data[resetProtoProps[lenI]];
431
- }
432
- data.actionQueue = [];
433
- data.buffered.length = 0;
434
- if(networkState){
435
- trigger(data._elem, 'emptied');
436
- }
437
- };
438
- })();
439
-
440
- var setElementDimension = function(data, hasControls){
441
- var elem = data._elem;
442
- var box = data.shadowElem;
443
- $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
444
- if(data._elemNodeName == 'audio' && !hasControls){
445
- box.css({width: 0, height: 0});
446
- } else {
447
- box.css({
448
- width: elem.style.width || $(elem).width(),
449
- height: elem.style.height || $(elem).height()
450
- });
451
- }
452
- };
453
-
454
- mediaelement.createSWF = function( elem, canPlaySrc, data ){
455
- if(!hasFlash){
456
- setTimeout(function(){
457
- $(elem).mediaLoad(); //<- this should produce a mediaerror
458
- }, 1);
459
- return;
460
- }
461
-
462
- if(loadedSwf < 1){
463
- loadedSwf = 1;
464
- } else {
465
- loadedSwf++;
466
- }
467
- var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
468
- var vars = $.extend({}, options.vars, {
469
- poster: $.prop(elem, 'poster') || '',
470
- source: canPlaySrc.streamId || canPlaySrc.srcProp,
471
- server: canPlaySrc.server || ''
472
- });
473
- var elemVars = $(elem).data('vars') || {};
474
-
475
- if(!data){
476
- data = webshims.data(elem, 'mediaelement');
477
- }
478
-
479
- var hasControls = $.prop(elem, 'controls');
480
- var elemId = 'jarisplayer-'+ webshims.getID(elem);
481
-
482
- var params = $.extend(
483
- {},
484
- options.params,
485
- $(elem).data('params')
486
- );
487
- var elemNodeName = elem.nodeName.toLowerCase();
488
- var attrs = $.extend(
489
- {},
490
- options.attrs,
491
- {
492
- name: elemId,
493
- id: elemId
494
- },
495
- $(elem).data('attrs')
496
- );
497
- var box;
498
-
499
- if(data && data.swfCreated){
500
- mediaelement.setActive(elem, 'third', data);
501
-
502
- data.currentSrc = canPlaySrc.srcProp;
503
-
504
- data.shadowElem.html('<div id="'+ elemId +'">');
505
-
506
- data.api = false;
507
- data.actionQueue = [];
508
- box = data.shadowElem;
509
- resetSwfProps(data);
510
- } else {
511
- box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
512
- .css({
513
- position: 'relative',
514
- overflow: 'hidden'
515
- })
516
- ;
517
- data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
518
- actionQueue: {
519
- value: []
520
- },
521
- shadowElem: {
522
- value: box
523
- },
524
- _elemNodeName: {
525
- value: elemNodeName
526
- },
527
- _elem: {
528
- value: elem
529
- },
530
- currentSrc: {
531
- value: canPlaySrc.srcProp
532
- },
533
- swfCreated: {
534
- value: true
535
- },
536
- id: {
537
- value: elemId.replace(/-/g, '')
538
- },
539
- buffered: {
540
- value: {
541
- start: function(index){
542
- if(index >= data.buffered.length){
543
- webshims.error('buffered index size error');
544
- return;
545
- }
546
- return 0;
547
- },
548
- end: function(index){
549
- if(index >= data.buffered.length){
550
- webshims.error('buffered index size error');
551
- return;
552
- }
553
- return ( (data.duration - data._bufferedStart) * data._bufferedEnd) + data._bufferedStart;
554
- },
555
- length: 0
556
- }
557
- }
558
- }));
559
- setElementDimension(data, hasControls);
560
-
561
- box.insertBefore(elem);
562
-
563
- if(hasNative){
564
- $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
565
- }
566
-
567
- webshims.addShadowDom(elem, box);
568
- addMediaToStopEvents(elem);
569
- mediaelement.setActive(elem, 'third', data);
570
- $(elem).on('updatemediaelementdimensions updateshadowdom', function(){
571
- setElementDimension(data, $.prop(elem, 'controls'));
572
- });
573
- }
574
-
575
- if(!mediaelement.jarisEvent[data.id]){
576
- mediaelement.jarisEvent[data.id] = function(jaris){
577
- if(jaris.type == 'ready'){
578
- if(data.api){
579
- onEvent[jaris.type](jaris, data);
580
- } else {
581
- setTimeout(function(){
582
- onEvent[jaris.type](jaris, data);
583
- }, 9);
584
- }
585
- } else {
586
- data.currentTime = jaris.position;
587
-
588
- if(data.api){
589
- if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
590
- onEvent.onDataInitialized(jaris, data);
591
- }
592
-
593
- if(!data._ppFlag && jaris.type != 'onPlayPause'){
594
- onEvent.onPlayPause(jaris, data);
595
- }
596
-
597
- if(onEvent[jaris.type]){
598
- onEvent[jaris.type](jaris, data);
599
- }
600
- }
601
- data.duration = jaris.duration;
602
- }
603
-
604
- };
605
- }
606
-
607
- $.extend(vars,
608
- {
609
- id: elemId,
610
- evtId: data.id,
611
- controls: ''+hasControls,
612
- autostart: 'false',
613
- nodename: elemNodeName
614
- },
615
- elemVars
616
- );
617
-
618
- if(isRtmp){
619
- vars.streamtype = 'rtmp';
620
- } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
621
- vars.type = 'audio';
622
- vars.streamtype = 'file';
623
- } else if(canPlaySrc.type == 'video/youtube'){
624
- vars.streamtype = 'youtube';
625
- }
626
- options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
627
- clearTimeout(data.flashBlock);
628
- swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
629
-
630
- if(swfData.success){
631
-
632
- data.api = swfData.ref;
633
-
634
- if(!hasControls){
635
- $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
636
- }
637
-
638
- data.flashBlock = setTimeout(function(){
639
- if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
640
- box.addClass('flashblocker-assumed');
641
- $(elem).trigger('flashblocker');
642
- webshims.warn("flashblocker assumed");
643
- }
644
- $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
645
- }, 9);
646
-
647
- if(!localConnectionTimer){
648
- clearTimeout(localConnectionTimer);
649
- localConnectionTimer = setTimeout(function(){
650
- var flash = $(swfData.ref);
651
- if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
652
- 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");
653
- } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
654
- webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
655
- }
656
- flash = null;
657
- }, 8000);
658
- }
659
- }
660
- });
661
-
662
- };
663
-
664
-
665
- var queueSwfMethod = function(elem, fn, args, data){
666
- data = data || getSwfDataFromElem(elem);
667
-
668
- if(data){
669
- if(data.api && data.api[fn]){
670
- data.api[fn].apply(data.api, args || []);
671
- } else {
672
- //todo add to queue
673
- data.actionQueue.push({fn: fn, args: args});
674
-
675
- if(data.actionQueue.length > 10){
676
- setTimeout(function(){
677
- if(data.actionQueue.length > 5){
678
- data.actionQueue.shift();
679
- }
680
- }, 99);
681
- }
682
- }
683
- return data;
684
- }
685
- return false;
686
- };
687
-
688
- ['audio', 'video'].forEach(function(nodeName){
689
- var descs = {};
690
- var mediaSup;
691
- var createGetProp = function(key){
692
- if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
693
-
694
- descs[key] = {
695
- get: function(){
696
- var data = getSwfDataFromElem(this);
697
- if(data){
698
- return data[key];
699
- } else if(hasNative && mediaSup[key].prop._supget) {
700
- return mediaSup[key].prop._supget.apply(this);
701
- } else {
702
- return playerStateObj[key];
703
- }
704
- },
705
- writeable: false
706
- };
707
- };
708
- var createGetSetProp = function(key, setFn){
709
- createGetProp(key);
710
- delete descs[key].writeable;
711
- descs[key].set = setFn;
712
- };
713
-
714
- createGetSetProp('volume', function(v){
715
- var data = getSwfDataFromElem(this);
716
- if(data){
717
- v *= 1;
718
- if(!isNaN(v)){
719
-
720
- if(v < 0 || v > 1){
721
- webshims.error('volume greater or less than allowed '+ (v / 100));
722
- }
723
-
724
- queueSwfMethod(this, 'api_volume', [v], data);
725
-
726
-
727
- if(data.volume != v){
728
- data.volume = v;
729
- trigger(data._elem, 'volumechange');
730
- }
731
- data = null;
732
- }
733
- } else if(mediaSup.volume.prop._supset) {
734
- return mediaSup.volume.prop._supset.apply(this, arguments);
735
- }
736
- });
737
-
738
- createGetSetProp('muted', function(m){
739
- var data = getSwfDataFromElem(this);
740
- if(data){
741
- m = !!m;
742
- queueSwfMethod(this, 'api_muted', [m], data);
743
- if(data.muted != m){
744
- data.muted = m;
745
- trigger(data._elem, 'volumechange');
746
- }
747
- data = null;
748
- } else if(mediaSup.muted.prop._supset) {
749
- return mediaSup.muted.prop._supset.apply(this, arguments);
750
- }
751
- });
752
-
753
-
754
- createGetSetProp('currentTime', function(t){
755
- var data = getSwfDataFromElem(this);
756
- if(data){
757
- t *= 1;
758
- if (!isNaN(t)) {
759
- queueSwfMethod(this, 'api_seek', [t], data);
760
- }
761
-
762
- } else if(mediaSup.currentTime.prop._supset) {
763
- return mediaSup.currentTime.prop._supset.apply(this, arguments);
764
- }
765
- });
766
-
767
- ['play', 'pause'].forEach(function(fn){
768
- descs[fn] = {
769
- value: function(){
770
- var data = getSwfDataFromElem(this);
771
- if(data){
772
- if(data.stopPlayPause){
773
- clearTimeout(data.stopPlayPause);
774
- }
775
- queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
776
-
777
- data._ppFlag = true;
778
- if(data.paused != (fn != 'play')){
779
- data.paused = fn != 'play';
780
- trigger(data._elem, fn);
781
- }
782
- } else if(mediaSup[fn].prop._supvalue) {
783
- return mediaSup[fn].prop._supvalue.apply(this, arguments);
784
- }
785
- }
786
- };
787
- });
788
-
789
- getPropKeys.forEach(createGetProp);
790
-
791
- webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
792
- var data = getSwfDataFromElem(this);
793
- $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
794
-
795
- if(data){
796
- webshims.warn("changing controls currently not fully supported with jaris player");
797
- if(nodeName == 'audio'){
798
- setElementDimension(data, boolProp);
799
- }
800
-
801
- queueSwfMethod(this, 'api_controls', [boolProp], data);
802
- }
803
- });
804
-
805
- mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
806
- });
807
-
808
- if(hasFlash){
809
- var oldClean = $.cleanData;
810
- var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
811
- var flashNames = {
812
- object: 1,
813
- OBJECT: 1
814
- };
815
- $.cleanData = function(elems){
816
- var i, len, prop;
817
- if(elems && (len = elems.length) && loadedSwf){
818
-
819
- for(i = 0; i < len; i++){
820
- if(flashNames[elems[i].nodeName]){
821
- if('api_pause' in elems[i]){
822
- loadedSwf--;
823
- try {
824
- elems[i].api_pause();
825
- } catch(er){}
826
- }
827
- if(gcBrowser){
828
- try {
829
- for (prop in elems[i]) {
830
- if (typeof elems[i][prop] == "function") {
831
- elems[i][prop] = null;
832
- }
833
- }
834
- } catch(er){}
835
- }
836
- }
837
- }
838
-
839
- }
840
- return oldClean.apply(this, arguments);
841
- };
842
- }
843
-
844
- if(!hasNative){
845
-
846
- ['poster', 'src'].forEach(function(prop){
847
- webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
848
- //attr: {},
849
- reflect: true,
850
- propType: 'src'
851
- });
852
- });
853
-
854
-
855
- ['autoplay', 'controls'].forEach(function(name){
856
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
857
- });
858
-
859
- webshims.defineNodeNamesProperties(['audio', 'video'], {
860
- HAVE_CURRENT_DATA: {
861
- value: 2
862
- },
863
- HAVE_ENOUGH_DATA: {
864
- value: 4
865
- },
866
- HAVE_FUTURE_DATA: {
867
- value: 3
868
- },
869
- HAVE_METADATA: {
870
- value: 1
871
- },
872
- HAVE_NOTHING: {
873
- value: 0
874
- },
875
- NETWORK_EMPTY: {
876
- value: 0
877
- },
878
- NETWORK_IDLE: {
879
- value: 1
880
- },
881
- NETWORK_LOADING: {
882
- value: 2
883
- },
884
- NETWORK_NO_SOURCE: {
885
- value: 3
886
- }
887
-
888
- }, 'prop');
889
- }
890
-
891
-
1
+ jQuery.webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
2
+ "use strict";
3
+
4
+ var mediaelement = webshims.mediaelement;
5
+ var swfobject = window.swfobject;
6
+ var hasNative = Modernizr.audio && Modernizr.video;
7
+ var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
8
+ var loadedSwf = 0;
9
+ var getProps = {
10
+ paused: true,
11
+ ended: false,
12
+ currentSrc: '',
13
+ duration: window.NaN,
14
+ readyState: 0,
15
+ networkState: 0,
16
+ videoHeight: 0,
17
+ videoWidth: 0,
18
+ error: null,
19
+ buffered: {
20
+ start: function(index){
21
+ if(index){
22
+ webshims.error('buffered index size error');
23
+ return;
24
+ }
25
+ return 0;
26
+ },
27
+ end: function(index){
28
+ if(index){
29
+ webshims.error('buffered index size error');
30
+ return;
31
+ }
32
+ return 0;
33
+ },
34
+ length: 0
35
+ }
36
+ };
37
+ var getPropKeys = Object.keys(getProps);
38
+
39
+ var getSetProps = {
40
+ currentTime: 0,
41
+ volume: 1,
42
+ muted: false
43
+ };
44
+ var getSetPropKeys = Object.keys(getSetProps);
45
+
46
+ var playerStateObj = $.extend({
47
+ isActive: 'html5',
48
+ activating: 'html5',
49
+ wasSwfReady: false,
50
+ _bufferedEnd: 0,
51
+ _bufferedStart: 0,
52
+ currentTime: 0,
53
+ _ppFlag: undefined,
54
+ _calledMeta: false,
55
+ lastDuration: 0
56
+ }, getProps, getSetProps);
57
+
58
+ var idRep = /^jarisplayer-/;
59
+ var getSwfDataFromID = function(id){
60
+
61
+ var elem = document.getElementById(id.replace(idRep, ''));
62
+ if(!elem){return;}
63
+ var data = webshims.data(elem, 'mediaelement');
64
+ return data.isActive == 'third' ? data : null;
65
+ };
66
+
67
+
68
+ var getSwfDataFromElem = function(elem){
69
+ try {
70
+ (elem.nodeName);
71
+ } catch(er){
72
+ return null;
73
+ }
74
+ var data = webshims.data(elem, 'mediaelement');
75
+ return (data && data.isActive== 'third') ? data : null;
76
+ };
77
+
78
+ var trigger = function(elem, evt){
79
+ evt = $.Event(evt);
80
+ evt.preventDefault();
81
+ $.event.trigger(evt, undefined, elem);
82
+ };
83
+
84
+ var playerSwfPath = options.playerPath || webshims.cfg.basePath + "swf/" + (options.playerName || 'JarisFLVPlayer.swf');
85
+
86
+ webshims.extendUNDEFProp(options.params, {
87
+ allowscriptaccess: 'always',
88
+ allowfullscreen: 'true',
89
+ wmode: 'transparent',
90
+ allowNetworking: 'all'
91
+ });
92
+ webshims.extendUNDEFProp(options.vars, {
93
+ controltype: '1',
94
+ jsapi: '1'
95
+ });
96
+ webshims.extendUNDEFProp(options.attrs, {
97
+ bgcolor: '#000000'
98
+ });
99
+
100
+ var setReadyState = function(readyState, data){
101
+ if(readyState < 3){
102
+ clearTimeout(data._canplaythroughTimer);
103
+ }
104
+ if(readyState >= 3 && data.readyState < 3){
105
+ data.readyState = readyState;
106
+ trigger(data._elem, 'canplay');
107
+ if(!data.paused){
108
+ trigger(data._elem, 'playing');
109
+ }
110
+ clearTimeout(data._canplaythroughTimer);
111
+ data._canplaythroughTimer = setTimeout(function(){
112
+ setReadyState(4, data);
113
+ }, 4000);
114
+ }
115
+ if(readyState >= 4 && data.readyState < 4){
116
+ data.readyState = readyState;
117
+ trigger(data._elem, 'canplaythrough');
118
+ }
119
+ data.readyState = readyState;
120
+ };
121
+
122
+ $.extend($.event.customEvent, {
123
+ updatemediaelementdimensions: true,
124
+ flashblocker: true,
125
+ swfstageresize: true,
126
+ mediaelementapichange: true
127
+ });
128
+
129
+ mediaelement.jarisEvent = {};
130
+ var localConnectionTimer;
131
+ var onEvent = {
132
+ onPlayPause: function(jaris, data, override){
133
+ var playing, type;
134
+ if(override == null){
135
+ try {
136
+ playing = data.api.api_get("isPlaying");
137
+ } catch(e){}
138
+ } else {
139
+ playing = override;
140
+ }
141
+ if(playing == data.paused){
142
+
143
+ data.paused = !playing;
144
+ type = data.paused ? 'pause' : 'play';
145
+ data._ppFlag = true;
146
+ trigger(data._elem, type);
147
+ if(data.readyState < 3){
148
+ setReadyState(3, data);
149
+ }
150
+ if(!data.paused){
151
+ trigger(data._elem, 'playing');
152
+ }
153
+ }
154
+ },
155
+ onNotBuffering: function(jaris, data){
156
+ setReadyState(3, data);
157
+ },
158
+ onDataInitialized: function(jaris, data){
159
+
160
+ var oldDur = data.duration;
161
+ var durDelta;
162
+ data.duration = jaris.duration;
163
+ if(oldDur == data.duration || isNaN(data.duration)){return;}
164
+
165
+ if(data._calledMeta && ((durDelta = Math.abs(data.lastDuration - data.duration)) < 2)){return;}
166
+
167
+
168
+
169
+ data.videoHeight = jaris.height;
170
+ data.videoWidth = jaris.width;
171
+
172
+ if(!data.networkState){
173
+ data.networkState = 2;
174
+ }
175
+ if(data.readyState < 1){
176
+ setReadyState(1, data);
177
+ }
178
+ clearTimeout(data._durationChangeTimer);
179
+ if(data._calledMeta && data.duration){
180
+ data._durationChangeTimer = setTimeout(function(){
181
+ data.lastDuration = data.duration;
182
+ trigger(data._elem, 'durationchange');
183
+ }, durDelta > 50 ? 0 : durDelta > 9 ? 9 : 99);
184
+ } else {
185
+ data.lastDuration = data.duration;
186
+ if(data.duration){
187
+ trigger(data._elem, 'durationchange');
188
+ }
189
+ if(!data._calledMeta){
190
+ trigger(data._elem, 'loadedmetadata');
191
+ }
192
+ }
193
+ data._calledMeta = true;
194
+ },
195
+ onBuffering: function(jaris, data){
196
+ if(data.ended){
197
+ data.ended = false;
198
+ }
199
+ setReadyState(1, data);
200
+ trigger(data._elem, 'waiting');
201
+ },
202
+ onTimeUpdate: function(jaris, data){
203
+ if(data.ended){
204
+ data.ended = false;
205
+ }
206
+ if(data.readyState < 3){
207
+ setReadyState(3, data);
208
+ trigger(data._elem, 'playing');
209
+ }
210
+
211
+ trigger(data._elem, 'timeupdate');
212
+ },
213
+ onProgress: function(jaris, data){
214
+ if(data.ended){
215
+ data.ended = false;
216
+ }
217
+ if(!data.duration || isNaN(data.duration)){
218
+ return;
219
+ }
220
+ var percentage = jaris.loaded / jaris.total;
221
+ if(percentage > 0.02 && percentage < 0.2){
222
+ setReadyState(3, data);
223
+ } else if(percentage > 0.2){
224
+ if(percentage > 0.99){
225
+ data.networkState = 1;
226
+ }
227
+ setReadyState(4, data);
228
+ }
229
+ if(data._bufferedEnd && (data._bufferedEnd > percentage)){
230
+ data._bufferedStart = data.currentTime || 0;
231
+ }
232
+
233
+ data._bufferedEnd = percentage;
234
+ data.buffered.length = 1;
235
+
236
+ $.event.trigger('progress', undefined, data._elem, true);
237
+ },
238
+ onPlaybackFinished: function(jaris, data){
239
+ if(data.readyState < 4){
240
+ setReadyState(4, data);
241
+ }
242
+ data.ended = true;
243
+ trigger(data._elem, 'ended');
244
+ },
245
+ onVolumeChange: function(jaris, data){
246
+ if(data.volume != jaris.volume || data.muted != jaris.mute){
247
+ data.volume = jaris.volume;
248
+ data.muted = jaris.mute;
249
+ trigger(data._elem, 'volumechange');
250
+ }
251
+ },
252
+ ready: (function(){
253
+ var testAPI = function(data){
254
+ var passed = true;
255
+
256
+ try {
257
+ data.api.api_get('volume');
258
+ } catch(er){
259
+ passed = false;
260
+ }
261
+ return passed;
262
+ };
263
+
264
+ return function(jaris, data){
265
+ var i = 0;
266
+ var doneFn = function(){
267
+ if(i > 9){
268
+ data.tryedReframeing = 0;
269
+ return;
270
+ }
271
+ i++;
272
+
273
+ data.tryedReframeing++;
274
+ if(testAPI(data)){
275
+ data.wasSwfReady = true;
276
+ data.tryedReframeing = 0;
277
+ startAutoPlay(data);
278
+ workActionQueue(data);
279
+ } else if(data.tryedReframeing < 6) {
280
+ if(data.tryedReframeing < 3){
281
+ data.reframeTimer = setTimeout(doneFn, 9);
282
+ data.shadowElem.css({overflow: 'visible'});
283
+ setTimeout(function(){
284
+ data.shadowElem.css({overflow: 'hidden'});
285
+ }, 1);
286
+ } else {
287
+ data.shadowElem.css({overflow: 'hidden'});
288
+ $(data._elem).mediaLoad();
289
+ }
290
+ } else {
291
+ clearTimeout(data.reframeTimer);
292
+ webshims.error("reframing error");
293
+ }
294
+ };
295
+ if(!data || !data.api){return;}
296
+ if(!data.tryedReframeing){
297
+ data.tryedReframeing = 0;
298
+ }
299
+ clearTimeout(localConnectionTimer);
300
+ clearTimeout(data.reframeTimer);
301
+ data.shadowElem.removeClass('flashblocker-assumed');
302
+
303
+ if(!i){
304
+ doneFn();
305
+ } else {
306
+ data.reframeTimer = setTimeout(doneFn, 9);
307
+ }
308
+
309
+ };
310
+ })()
311
+ };
312
+
313
+ onEvent.onMute = onEvent.onVolumeChange;
314
+
315
+
316
+ var workActionQueue = function(data){
317
+ var actionLen = data.actionQueue.length;
318
+ var i = 0;
319
+ var operation;
320
+
321
+ if(actionLen && data.isActive == 'third'){
322
+ while(data.actionQueue.length && actionLen > i){
323
+ i++;
324
+ operation = data.actionQueue.shift();
325
+ try{
326
+ data.api[operation.fn].apply(data.api, operation.args);
327
+ } catch(er){
328
+ webshims.warn(er);
329
+ }
330
+ }
331
+ }
332
+ if(data.actionQueue.length){
333
+ data.actionQueue = [];
334
+ }
335
+ };
336
+ var startAutoPlay = function(data){
337
+ if(!data){return;}
338
+ if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
339
+ setTimeout(function(){
340
+ if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
341
+
342
+ try {
343
+ $(data._elem).play();
344
+ data._ppFlag = true;
345
+ } catch(er){}
346
+ }
347
+ }, 1);
348
+ }
349
+
350
+ if(data.muted){
351
+ $.prop(data._elem, 'muted', true);
352
+ }
353
+ if(data.volume != 1){
354
+ $.prop(data._elem, 'volume', data.volume);
355
+ }
356
+ };
357
+
358
+
359
+ var addMediaToStopEvents = $.noop;
360
+ if(hasNative){
361
+ var stopEvents = {
362
+ play: 1,
363
+ playing: 1
364
+ };
365
+ var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
366
+ var hidevents = hideEvtArray.map(function(evt){
367
+ return evt +'.webshimspolyfill';
368
+ }).join(' ');
369
+
370
+ var hidePlayerEvents = function(event){
371
+ var data = webshims.data(event.target, 'mediaelement');
372
+ if(!data){return;}
373
+ var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
374
+ if( isNativeHTML5 == (data.activating == 'third') ){
375
+ event.stopImmediatePropagation();
376
+ if(stopEvents[event.type] && data.isActive != data.activating){
377
+ $(event.target).pause();
378
+ }
379
+ }
380
+ };
381
+
382
+ addMediaToStopEvents = function(elem){
383
+ $(elem)
384
+ .off(hidevents)
385
+ .on(hidevents, hidePlayerEvents)
386
+ ;
387
+ hideEvtArray.forEach(function(evt){
388
+ webshims.moveToFirstEvent(elem, evt);
389
+ });
390
+ };
391
+ addMediaToStopEvents(document);
392
+ }
393
+
394
+
395
+ mediaelement.setActive = function(elem, type, data){
396
+ if(!data){
397
+ data = webshims.data(elem, 'mediaelement');
398
+ }
399
+ if(!data || data.isActive == type){return;}
400
+ if(type != 'html5' && type != 'third'){
401
+ webshims.warn('wrong type for mediaelement activating: '+ type);
402
+ }
403
+ var shadowData = webshims.data(elem, 'shadowData');
404
+ data.activating = type;
405
+ $(elem).pause();
406
+ data.isActive = type;
407
+ if(type == 'third'){
408
+ shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
409
+ $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
410
+ } else {
411
+ $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
412
+ shadowData.shadowElement = shadowData.shadowFocusElement = false;
413
+ }
414
+ $(elem).trigger('mediaelementapichange');
415
+ };
416
+
417
+
418
+
419
+ var resetSwfProps = (function(){
420
+ var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth'];
421
+ var len = resetProtoProps.length;
422
+ return function(data){
423
+
424
+ if(!data){return;}
425
+ var lenI = len;
426
+ var networkState = data.networkState;
427
+ setReadyState(0, data);
428
+ clearTimeout(data._durationChangeTimer);
429
+ while(--lenI > -1){
430
+ delete data[resetProtoProps[lenI]];
431
+ }
432
+ data.actionQueue = [];
433
+ data.buffered.length = 0;
434
+ if(networkState){
435
+ trigger(data._elem, 'emptied');
436
+ }
437
+ };
438
+ })();
439
+
440
+ var setElementDimension = function(data, hasControls){
441
+ var elem = data._elem;
442
+ var box = data.shadowElem;
443
+ $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
444
+ if(data._elemNodeName == 'audio' && !hasControls){
445
+ box.css({width: 0, height: 0});
446
+ } else {
447
+ box.css({
448
+ width: elem.style.width || $(elem).width(),
449
+ height: elem.style.height || $(elem).height()
450
+ });
451
+ }
452
+ };
453
+
454
+ mediaelement.createSWF = function( elem, canPlaySrc, data ){
455
+ if(!hasFlash){
456
+ setTimeout(function(){
457
+ $(elem).mediaLoad(); //<- this should produce a mediaerror
458
+ }, 1);
459
+ return;
460
+ }
461
+
462
+ if(loadedSwf < 1){
463
+ loadedSwf = 1;
464
+ } else {
465
+ loadedSwf++;
466
+ }
467
+ var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
468
+ var vars = $.extend({}, options.vars, {
469
+ poster: $.attr(elem, 'poster') && $.prop(elem, 'poster') || '',
470
+ source: canPlaySrc.streamId || canPlaySrc.srcProp,
471
+ server: canPlaySrc.server || ''
472
+ });
473
+ var elemVars = $(elem).data('vars') || {};
474
+
475
+ if(!data){
476
+ data = webshims.data(elem, 'mediaelement');
477
+ }
478
+
479
+ var hasControls = $.prop(elem, 'controls');
480
+ var elemId = 'jarisplayer-'+ webshims.getID(elem);
481
+
482
+ var params = $.extend(
483
+ {},
484
+ options.params,
485
+ $(elem).data('params')
486
+ );
487
+ var elemNodeName = elem.nodeName.toLowerCase();
488
+ var attrs = $.extend(
489
+ {},
490
+ options.attrs,
491
+ {
492
+ name: elemId,
493
+ id: elemId
494
+ },
495
+ $(elem).data('attrs')
496
+ );
497
+ var box;
498
+
499
+ if(data && data.swfCreated){
500
+ mediaelement.setActive(elem, 'third', data);
501
+
502
+ data.currentSrc = canPlaySrc.srcProp;
503
+
504
+ data.shadowElem.html('<div id="'+ elemId +'">');
505
+
506
+ data.api = false;
507
+ data.actionQueue = [];
508
+ box = data.shadowElem;
509
+ resetSwfProps(data);
510
+ } else {
511
+ box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
512
+ .css({
513
+ position: 'relative',
514
+ overflow: 'hidden'
515
+ })
516
+ ;
517
+ data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
518
+ actionQueue: {
519
+ value: []
520
+ },
521
+ shadowElem: {
522
+ value: box
523
+ },
524
+ _elemNodeName: {
525
+ value: elemNodeName
526
+ },
527
+ _elem: {
528
+ value: elem
529
+ },
530
+ currentSrc: {
531
+ value: canPlaySrc.srcProp
532
+ },
533
+ swfCreated: {
534
+ value: true
535
+ },
536
+ id: {
537
+ value: elemId.replace(/-/g, '')
538
+ },
539
+ buffered: {
540
+ value: {
541
+ start: function(index){
542
+ if(index >= data.buffered.length){
543
+ webshims.error('buffered index size error');
544
+ return;
545
+ }
546
+ return 0;
547
+ },
548
+ end: function(index){
549
+ if(index >= data.buffered.length){
550
+ webshims.error('buffered index size error');
551
+ return;
552
+ }
553
+ return ( (data.duration - data._bufferedStart) * data._bufferedEnd) + data._bufferedStart;
554
+ },
555
+ length: 0
556
+ }
557
+ }
558
+ }));
559
+ setElementDimension(data, hasControls);
560
+
561
+ box.insertBefore(elem);
562
+
563
+ if(hasNative){
564
+ $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
565
+ }
566
+
567
+ webshims.addShadowDom(elem, box);
568
+ addMediaToStopEvents(elem);
569
+ mediaelement.setActive(elem, 'third', data);
570
+ $(elem).on('updatemediaelementdimensions updateshadowdom', function(){
571
+ setElementDimension(data, $.prop(elem, 'controls'));
572
+ });
573
+ }
574
+
575
+ if(!mediaelement.jarisEvent[data.id]){
576
+ mediaelement.jarisEvent[data.id] = function(jaris){
577
+ if(jaris.type == 'ready'){
578
+ if(data.api){
579
+ onEvent[jaris.type](jaris, data);
580
+ } else {
581
+ setTimeout(function(){
582
+ onEvent[jaris.type](jaris, data);
583
+ }, 9);
584
+ }
585
+ } else {
586
+ data.currentTime = jaris.position;
587
+
588
+ if(data.api){
589
+ if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
590
+ onEvent.onDataInitialized(jaris, data);
591
+ }
592
+
593
+ if(!data._ppFlag && jaris.type != 'onPlayPause'){
594
+ onEvent.onPlayPause(jaris, data);
595
+ }
596
+
597
+ if(onEvent[jaris.type]){
598
+ onEvent[jaris.type](jaris, data);
599
+ }
600
+ }
601
+ data.duration = jaris.duration;
602
+ }
603
+
604
+ };
605
+ }
606
+
607
+ $.extend(vars,
608
+ {
609
+ id: elemId,
610
+ evtId: data.id,
611
+ controls: ''+hasControls,
612
+ autostart: 'false',
613
+ nodename: elemNodeName
614
+ },
615
+ elemVars
616
+ );
617
+
618
+ if(isRtmp){
619
+ vars.streamtype = 'rtmp';
620
+ } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
621
+ vars.type = 'audio';
622
+ vars.streamtype = 'file';
623
+ } else if(canPlaySrc.type == 'video/youtube'){
624
+ vars.streamtype = 'youtube';
625
+ }
626
+ options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
627
+ clearTimeout(data.flashBlock);
628
+ swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
629
+
630
+ if(swfData.success){
631
+
632
+ data.api = swfData.ref;
633
+
634
+ if(!hasControls){
635
+ $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
636
+ }
637
+
638
+ data.flashBlock = setTimeout(function(){
639
+ if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
640
+ box.addClass('flashblocker-assumed');
641
+ $(elem).trigger('flashblocker');
642
+ webshims.warn("flashblocker assumed");
643
+ }
644
+ $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
645
+ }, 9);
646
+
647
+ if(!localConnectionTimer){
648
+ clearTimeout(localConnectionTimer);
649
+ localConnectionTimer = setTimeout(function(){
650
+ var flash = $(swfData.ref);
651
+ if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
652
+ 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");
653
+ } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
654
+ webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
655
+ }
656
+ flash = null;
657
+ }, 8000);
658
+ }
659
+ }
660
+ });
661
+
662
+ };
663
+
664
+
665
+ var queueSwfMethod = function(elem, fn, args, data){
666
+ data = data || getSwfDataFromElem(elem);
667
+
668
+ if(data){
669
+ if(data.api && data.api[fn]){
670
+ data.api[fn].apply(data.api, args || []);
671
+ } else {
672
+ //todo add to queue
673
+ data.actionQueue.push({fn: fn, args: args});
674
+
675
+ if(data.actionQueue.length > 10){
676
+ setTimeout(function(){
677
+ if(data.actionQueue.length > 5){
678
+ data.actionQueue.shift();
679
+ }
680
+ }, 99);
681
+ }
682
+ }
683
+ return data;
684
+ }
685
+ return false;
686
+ };
687
+
688
+ ['audio', 'video'].forEach(function(nodeName){
689
+ var descs = {};
690
+ var mediaSup;
691
+ var createGetProp = function(key){
692
+ if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
693
+
694
+ descs[key] = {
695
+ get: function(){
696
+ var data = getSwfDataFromElem(this);
697
+ if(data){
698
+ return data[key];
699
+ } else if(hasNative && mediaSup[key].prop._supget) {
700
+ return mediaSup[key].prop._supget.apply(this);
701
+ } else {
702
+ return playerStateObj[key];
703
+ }
704
+ },
705
+ writeable: false
706
+ };
707
+ };
708
+ var createGetSetProp = function(key, setFn){
709
+ createGetProp(key);
710
+ delete descs[key].writeable;
711
+ descs[key].set = setFn;
712
+ };
713
+
714
+ createGetSetProp('volume', function(v){
715
+ var data = getSwfDataFromElem(this);
716
+ if(data){
717
+ v *= 1;
718
+ if(!isNaN(v)){
719
+
720
+ if(v < 0 || v > 1){
721
+ webshims.error('volume greater or less than allowed '+ (v / 100));
722
+ }
723
+
724
+ queueSwfMethod(this, 'api_volume', [v], data);
725
+
726
+
727
+ if(data.volume != v){
728
+ data.volume = v;
729
+ trigger(data._elem, 'volumechange');
730
+ }
731
+ data = null;
732
+ }
733
+ } else if(mediaSup.volume.prop._supset) {
734
+ return mediaSup.volume.prop._supset.apply(this, arguments);
735
+ }
736
+ });
737
+
738
+ createGetSetProp('muted', function(m){
739
+ var data = getSwfDataFromElem(this);
740
+ if(data){
741
+ m = !!m;
742
+ queueSwfMethod(this, 'api_muted', [m], data);
743
+ if(data.muted != m){
744
+ data.muted = m;
745
+ trigger(data._elem, 'volumechange');
746
+ }
747
+ data = null;
748
+ } else if(mediaSup.muted.prop._supset) {
749
+ return mediaSup.muted.prop._supset.apply(this, arguments);
750
+ }
751
+ });
752
+
753
+
754
+ createGetSetProp('currentTime', function(t){
755
+ var data = getSwfDataFromElem(this);
756
+ if(data){
757
+ t *= 1;
758
+ if (!isNaN(t)) {
759
+ queueSwfMethod(this, 'api_seek', [t], data);
760
+ }
761
+
762
+ } else if(mediaSup.currentTime.prop._supset) {
763
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
764
+ }
765
+ });
766
+
767
+ ['play', 'pause'].forEach(function(fn){
768
+ descs[fn] = {
769
+ value: function(){
770
+ var data = getSwfDataFromElem(this);
771
+ if(data){
772
+ if(data.stopPlayPause){
773
+ clearTimeout(data.stopPlayPause);
774
+ }
775
+ queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
776
+
777
+ data._ppFlag = true;
778
+ if(data.paused != (fn != 'play')){
779
+ data.paused = fn != 'play';
780
+ trigger(data._elem, fn);
781
+ }
782
+ } else if(mediaSup[fn].prop._supvalue) {
783
+ return mediaSup[fn].prop._supvalue.apply(this, arguments);
784
+ }
785
+ }
786
+ };
787
+ });
788
+
789
+ getPropKeys.forEach(createGetProp);
790
+
791
+ webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
792
+ var data = getSwfDataFromElem(this);
793
+ $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
794
+
795
+ if(data){
796
+ webshims.warn("changing controls currently not fully supported with jaris player");
797
+ if(nodeName == 'audio'){
798
+ setElementDimension(data, boolProp);
799
+ }
800
+
801
+ queueSwfMethod(this, 'api_controls', [boolProp], data);
802
+ }
803
+ });
804
+
805
+ mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
806
+ });
807
+
808
+ if(hasFlash){
809
+ var oldClean = $.cleanData;
810
+ var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
811
+ var flashNames = {
812
+ object: 1,
813
+ OBJECT: 1
814
+ };
815
+ $.cleanData = function(elems){
816
+ var i, len, prop;
817
+ if(elems && (len = elems.length) && loadedSwf){
818
+
819
+ for(i = 0; i < len; i++){
820
+ if(flashNames[elems[i].nodeName]){
821
+ if('api_pause' in elems[i]){
822
+ loadedSwf--;
823
+ try {
824
+ elems[i].api_pause();
825
+ } catch(er){}
826
+ }
827
+ if(gcBrowser){
828
+ try {
829
+ for (prop in elems[i]) {
830
+ if (typeof elems[i][prop] == "function") {
831
+ elems[i][prop] = null;
832
+ }
833
+ }
834
+ } catch(er){}
835
+ }
836
+ }
837
+ }
838
+
839
+ }
840
+ return oldClean.apply(this, arguments);
841
+ };
842
+ }
843
+
844
+ if(!hasNative){
845
+
846
+ ['poster', 'src'].forEach(function(prop){
847
+ webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
848
+ //attr: {},
849
+ reflect: true,
850
+ propType: 'src'
851
+ });
852
+ });
853
+
854
+
855
+ ['autoplay', 'controls'].forEach(function(name){
856
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
857
+ });
858
+
859
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
860
+ HAVE_CURRENT_DATA: {
861
+ value: 2
862
+ },
863
+ HAVE_ENOUGH_DATA: {
864
+ value: 4
865
+ },
866
+ HAVE_FUTURE_DATA: {
867
+ value: 3
868
+ },
869
+ HAVE_METADATA: {
870
+ value: 1
871
+ },
872
+ HAVE_NOTHING: {
873
+ value: 0
874
+ },
875
+ NETWORK_EMPTY: {
876
+ value: 0
877
+ },
878
+ NETWORK_IDLE: {
879
+ value: 1
880
+ },
881
+ NETWORK_LOADING: {
882
+ value: 2
883
+ },
884
+ NETWORK_NO_SOURCE: {
885
+ value: 3
886
+ }
887
+
888
+ }, 'prop');
889
+ }
890
+
891
+
892
892
  });