webshims-rails 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +261 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -1
  6. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +24 -24
  7. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/README +82 -82
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +35 -34
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +79 -82
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +45 -44
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -42
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +28 -27
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +4 -4
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +57 -59
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +64 -66
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +53 -54
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +64 -66
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +72 -73
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +42 -46
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -50
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +55 -59
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +66 -64
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +80 -82
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +60 -59
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +79 -81
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +101 -104
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +94 -95
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +26 -29
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +33 -36
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +51 -54
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +27 -28
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +27 -28
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +39 -38
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +65 -68
  35. data/vendor/assets/javascripts/webshims/minified/shims/details.js +4 -4
  36. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +23 -22
  37. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +19 -22
  38. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +14 -14
  39. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +9 -9
  40. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +18 -19
  41. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +45 -43
  42. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  43. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  44. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +12 -12
  45. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +23 -0
  46. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -1
  47. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +26 -30
  48. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +3 -3
  49. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +689 -686
  50. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  52. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -21
  53. data/vendor/assets/javascripts/webshims/polyfiller.js +1191 -1175
  54. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1754 -1714
  55. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3247 -3320
  56. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1633 -1588
  57. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1636 -1591
  58. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1100 -1058
  59. data/vendor/assets/javascripts/webshims/shims/combos/14.js +476 -476
  60. data/vendor/assets/javascripts/webshims/shims/combos/15.js +316 -314
  61. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2094 -2104
  62. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2258 -2267
  63. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1380 -1364
  64. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2239 -2247
  65. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2339 -2294
  66. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1493 -1606
  67. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1733 -1635
  68. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2295 -2408
  69. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2269 -2168
  70. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2775 -2780
  71. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1505 -1456
  72. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2111 -2115
  73. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3264 -3331
  74. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3020 -2970
  75. data/vendor/assets/javascripts/webshims/shims/combos/4.js +770 -822
  76. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1025 -1077
  77. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1706 -1753
  78. data/vendor/assets/javascripts/webshims/shims/combos/6.js +444 -433
  79. data/vendor/assets/javascripts/webshims/shims/combos/7.js +699 -688
  80. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1488 -1445
  81. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2445 -2518
  82. data/vendor/assets/javascripts/webshims/shims/details.js +148 -146
  83. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +952 -912
  84. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  85. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  86. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -659
  87. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -676
  88. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -163
  89. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  90. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  91. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +61 -50
  92. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1569 -1472
  93. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  94. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  95. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  96. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  97. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  98. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  99. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  100. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  101. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  102. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  103. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  104. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  105. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  106. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  107. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  108. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  109. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  110. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  111. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +536 -533
  112. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +861 -0
  113. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  114. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +957 -1073
  115. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  116. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +689 -686
  117. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/track-ui.js +9 -8
  119. data/vendor/assets/javascripts/webshims/shims/track.js +17 -11
  120. metadata +6 -6
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-native-fix.js +0 -7
  122. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  123. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  124. data/vendor/assets/javascripts/webshims/shims/form-native-fix.js +0 -261
@@ -1,543 +1,543 @@
1
- jQuery.webshims.register('mediaelement-yt', function($, webshims, window, document, undefined, options){
2
- "use strict";
3
- var mediaelement = webshims.mediaelement;
4
- var ytAPI = jQuery.Deferred();
5
- window.onYouTubePlayerAPIReady = function() {
6
- ytAPI.resolve();
7
- };
8
- if(window.YT && YT.Player){
9
- window.onYouTubePlayerAPIReady();
10
- }
11
-
12
- var getProps = {
13
- paused: true,
14
- ended: false,
15
- currentSrc: '',
16
- duration: window.NaN,
17
-
18
- readyState: 0,
19
- networkState: 0,
20
- videoHeight: 0,
21
- videoWidth: 0,
22
- error: null,
23
- buffered: {
24
- start: function(index){
25
- if(index){
26
- webshims.error('buffered index size error');
27
- return;
28
- }
29
- return 0;
30
- },
31
- end: function(index){
32
- if(index){
33
- webshims.error('buffered index size error');
34
- return;
35
- }
36
- return 0;
37
- },
38
- length: 0
39
- }
40
- };
41
- var getPropKeys = Object.keys(getProps);
42
-
43
- var getSetProps = {
44
- currentTime: 0,
45
- volume: 1,
46
- muted: false
47
- };
48
- var getSetPropKeys = Object.keys(getSetProps);
49
-
50
- var playerStateObj = $.extend({
51
- isActive: 'html5',
52
- activating: 'html5',
53
- wasSwfReady: false,
54
- _metadata: false,
55
- _callMeta: false,
56
- currentTime: 0,
57
- _buffered: 0,
58
- _ppFlag: undefined
59
- }, getProps, getSetProps);
60
-
61
- var trigger = function(elem, evt){
62
- evt = $.Event(evt);
63
- evt.preventDefault();
64
- $.event.trigger(evt, undefined, elem);
65
- };
66
-
67
- var resetSwfProps = (function(){
68
- var resetProtoProps = ['_buffered', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta'];
69
- var len = resetProtoProps.length;
70
- return function(data){
71
-
72
- if(!data){return;}
73
- var lenI = len;
74
- var networkState = data.networkState;
75
- data.readyState = 0;
76
- while(--lenI){
77
- delete data[resetProtoProps[lenI]];
78
- }
79
- data.buffered.length = 0;
80
- clearInterval(data._timeInterval);
81
- if(networkState){
82
- trigger(data._elem, 'emptied');
83
- }
84
- };
85
- })();
86
-
87
- var setElementDimension = function(data){
88
- var elem = data._elem;
89
- var box = data.shadowElem;
90
- box.css({
91
- width: elem.style.width || $(elem).width(),
92
- height: elem.style.height || $(elem).height()
93
- });
94
- };
95
-
96
- var getYtDataFromElem = function(elem){
97
- try {
98
- (elem.nodeName);
99
- } catch(er){
100
- return null;
101
- }
102
- var data = webshims.data(elem, 'mediaelement');
103
- return (data && data.isActive == 'third') ? data : null;
104
- };
105
-
106
- var getYtId = function(src){
107
- var found;
108
- src = src.split('?');
109
- if(src[0].indexOf('youtube.com/watch') != -1 && src[1]){
110
- src = src[1].split('&');
111
- $.each(src, function(i, name){
112
- name = name.split('=');
113
- if(name[0] == 'v'){
114
- src = name[1];
115
- found = true;
116
- return false;
117
- }
118
- });
119
- } else if(src[0].indexOf('youtube.com/v/') != -1) {
120
- src = src[0].split('/');
121
- $.each(src, function(i, name){
122
- if(found){
123
- src = name;
124
- return false;
125
- }
126
-
127
- if(name == 'v'){
128
- found = true;
129
- }
130
- });
131
- }
132
- if(!found){
133
- webshims.warn('no youtube id found: '+ src);
134
- }
135
- return src;
136
- };
137
-
138
- var startAutoPlay = function(data){
139
- if(!data){return;}
140
- if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
141
- setTimeout(function(){
142
- if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
143
- try {
144
- $(data._elem).play();
145
- } catch(er){}
146
- }
147
- }, 1);
148
- }
149
- };
150
-
151
- var addMediaToStopEvents = $.noop;
152
- (function(){
153
- var stopEvents = {
154
- play: 1,
155
- playing: 1
156
- };
157
- var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
158
- var hidevents = hideEvtArray.map(function(evt){
159
- return evt +'.webshimspolyfill';
160
- }).join(' ');
161
-
162
- var hidePlayerEvents = function(event){
163
- var data = webshims.data(event.target, 'mediaelement');
164
- if(!data){return;}
165
- var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
166
- if( isNativeHTML5 == (data.activating == 'third') ){
167
- event.stopImmediatePropagation();
168
- if(stopEvents[event.type] && data.isActive != data.activating){
169
- $(event.target).pause();
170
- }
171
- }
172
- };
173
-
174
- addMediaToStopEvents = function(elem){
175
- $(elem)
176
- .unbind(hidevents)
177
- .bind(hidevents, hidePlayerEvents)
178
- ;
179
- hideEvtArray.forEach(function(evt){
180
- webshims.moveToFirstEvent(elem, evt);
181
- });
182
- };
183
- addMediaToStopEvents(document);
184
- })();
185
-
186
- $(document).bind('emptied', function(e){
187
- var data = getYtDataFromElem(e.target);
188
- startAutoPlay(data);
189
- });
190
-
191
-
192
-
193
- mediaelement.setActive = function(elem, type, data){
194
- if(!data){
195
- data = webshims.data(elem, 'mediaelement');
196
- }
197
- if(!data || data.isActive == type){return;}
198
- if(type != 'html5' && type != 'third'){
199
- webshims.warn('wrong type for mediaelement activating: '+ type);
200
- }
201
- var shadowData = webshims.data(elem, 'shadowData');
202
- data.activating = type;
203
- $(elem).pause();
204
- data.isActive = type;
205
- if(type == 'third'){
206
- shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
207
- $(elem).addClass('yt-api-active nonnative-api-active').hide().getShadowElement().show();
208
- } else {
209
- clearInterval(data._timeInterval);
210
- $(elem).removeClass('yt-api-active nonnative-api-active').show().getShadowElement().hide();
211
- shadowData.shadowElement = shadowData.shadowFocusElement = false;
212
- }
213
- $(elem).trigger('mediaelementapichange');
214
- };
215
-
216
-
217
- var handlePlayPauseState = function(state, data){
218
- data._ppFlag = true;
219
- if(state == 'playing'){
220
- handlePlayPauseState('play', data);
221
- if(data.readyState < 3){
222
- data.readyState = 3;
223
- trigger(data._elem, 'canplay');
224
- }
225
- $(data._elem).trigger('playing');
226
- }
227
-
228
- if(state == 'play' && data.paused){
229
- data.paused = false;
230
- trigger(data._elem, 'play');
231
- } else if(state == 'pause' && !data.paused){
232
- data.paused = true;
233
- trigger(data._elem, 'pause');
234
- }
235
- };
236
-
237
- var addYtAPI = function(mediaElm, elemId, data, ytID){
238
- ytAPI.done(function(){
239
- var handleBuffered = function(){
240
- var buffered, bufFac;
241
- if(data._metadata && data._ytAPI.getVideoLoadedFraction){
242
- bufFac = data._ytAPI.getVideoLoadedFraction();
243
- buffered = bufFac * data.duration;
244
- if(data._buffered !== buffered){
245
- data._buffered = buffered;
246
- data.buffered.length = 1;
247
- $(mediaElm).trigger('progress');
248
- }
249
- if(bufFac > 0.99){
250
- data.networkState = 1;
251
- }
252
- if(data.readyState < 4 && data.currentTime && (data._buffered - data.currentTime > 9 || bufFac > 0.9) ){
253
- data.readyState = 4;
254
- trigger(data._elem, 'canplaythrough');
255
- }
256
- }
257
- };
258
- var getTime = function(){
259
- if(data._ytAPI && data._ytAPI.getCurrentTime){
260
- var currentTime = data._ytAPI.getCurrentTime();
261
- if(data.currentTime != currentTime){
262
- data.currentTime = currentTime;
263
- $(mediaElm).trigger('timeupdate');
264
- }
265
- handleBuffered();
266
- }
267
- };
268
-
269
- var getData = function(){
270
- if(data.isActive == 'third' && data._ytAPI && data._ytAPI.getVolume){
271
-
272
- var volume = data._ytAPI.getVolume() / 100;
273
- var muted = data._ytAPI.isMuted();
274
- var triggerVolume;
275
- if(volume != data.volume){
276
- data.volume = volume;
277
- triggerVolume = true;
278
- }
279
- if(muted != data.muted){
280
- data.muted = muted;
281
- triggerVolume = true;
282
- }
283
- getTime();
284
- handleBuffered();
285
- if(triggerVolume){
286
- $(mediaElm).trigger('volumechange');
287
- }
288
- }
289
- };
290
- var getIntervalTime = function(){
291
- clearInterval(data._timeInterval);
292
- data._timeInterval = setInterval(function(){
293
- var currentTime = data._ytAPI.getCurrentTime();
294
- if(data.currentTime != currentTime){
295
- data.currentTime = currentTime;
296
- $(mediaElm).trigger('timeupdate');
297
- }
298
- }, 350);
299
- };
300
- data._ytAPI = new YT.Player(elemId, {
301
- height: '100%',
302
- width: '100%',
303
- playerVars: {
304
- allowfullscreen: true,
305
- fs: 1,
306
- rel: 0,
307
- showinfo: 0,
308
- autohide: 1,
309
- controls: $.prop(mediaElm, 'controls') ? 1:0
310
- },
311
-
312
- videoId: ytID,
313
- events: {
314
- 'onReady': function(e){
315
- startAutoPlay(data);
316
- setTimeout(getData, 9);
317
- setInterval(getData, 5000);
318
- },
319
-
320
- 'onStateChange': function(e){
321
- if(!e.target.getDuration){return;}
322
- var callMeta;
323
- if(!data._metadata){
324
- var duration = e.target.getDuration();
325
- if(duration){
326
- data._metadata = true;
327
- data.duration = duration;
328
- if(data.readyState < 1){
329
- data.readyState = 1;
330
- }
331
- if(data.networkState < 1){
332
- data.networkState = 2;
333
- }
334
- callMeta = true;
335
- }
336
- }
337
-
338
- if(callMeta){
339
- $(mediaElm)
340
- .trigger('durationchange')
341
- .trigger('loadedmetadata')
342
- ;
343
- }
344
- setTimeout(getData, 9);
345
- if(e.data == 1){
346
- handlePlayPauseState('playing', data);
347
- getIntervalTime();
348
- } else if(e.data == 2){
349
- clearInterval(data._timeInterval);
350
- handlePlayPauseState('pause', data);
351
- } else if(e.data == 3){
352
- if(data.readyState > 2){
353
- data.readyState = 2;
354
- }
355
- data.networkState = 2;
356
- $(mediaElm).trigger('waiting');
357
- } else if(e.data === 0){
358
- if(data.readyState > 4){
359
- data.readyState = 4;
360
- }
361
- data.networkState = 1;
362
- clearInterval(data._timeInterval);
363
- $(mediaElm).trigger('ended');
364
- }
365
- }
366
- }
367
- });
368
-
369
- $(mediaElm).bind('updateytdata', getData);
370
-
371
- });
372
- };
373
-
374
- mediaelement.createSWF = function(mediaElem, src, data){
375
- if(!data){
376
- data = webshims.data(mediaElem, 'mediaelement');
377
- }
378
- var ytID = getYtId(src.src);
379
- if(data){
380
- mediaelement.setActive(mediaElem, 'third', data);
381
- resetSwfProps(data);
382
- data.currentSrc = src.srcProp;
383
- ytAPI.done(function(){
384
- if(data._ytAPI.loadVideoById){
385
- data._ytAPI.loadVideoById(ytID);
386
- }
387
- });
388
-
389
- return;
390
- }
391
- var hasControls = $.prop(mediaElem, 'controls');
392
- var elemId = 'yt-'+ webshims.getID(mediaElem);
393
- var box = $('<div class="polyfill-video polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
394
- .css({
395
- position: 'relative',
396
- overflow: 'hidden'
397
- })
398
- ;
399
-
400
-
401
-
402
- data = webshims.data(mediaElem, 'mediaelement', webshims.objectCreate(playerStateObj, {
403
- shadowElem: {
404
- value: box
405
- },
406
- _elem: {
407
- value: mediaElem
408
- },
409
- currentSrc: {
410
- value: src.srcProp
411
- },
412
- buffered: {
413
- value: {
414
- start: function(index){
415
- if(index >= data.buffered.length){
416
- webshims.error('buffered index size error');
417
- return;
418
- }
419
- return 0;
420
- },
421
- end: function(index){
422
- if(index >= data.buffered.length){
423
- webshims.error('buffered index size error');
424
- return;
425
- }
426
- return data._buffered;
427
- },
428
- length: 0
429
- }
430
- }
431
- }));
432
-
433
-
434
-
435
- setElementDimension(data);
436
- box.insertBefore(mediaElem);
437
-
438
- webshims.addShadowDom(mediaElem, box);
439
- mediaelement.setActive(mediaElem, 'third', data);
440
- addMediaToStopEvents(mediaElem);
441
-
442
- addYtAPI(mediaElem, elemId, data, ytID);
443
- $(mediaElem).bind('updatemediaelementdimensions updateshadowdom', function(){
444
- setElementDimension(data);
445
- });
446
- };
447
-
448
- (function(){
449
- var triggerUpdate = function(data){
450
- clearTimeout(data.updateDataTimer);
451
- data.updateDataTimer = setTimeout(function(){
452
- $(data._elem).triggerHandler('updateytdata');
453
- }, 9);
454
- };
455
- var descs = {};
456
- var mediaSup;
457
- var createGetProp = function(key){
458
- descs[key] = {
459
- get: function(){
460
- var data = getYtDataFromElem(this);
461
- if(data){
462
- return data[key];
463
- } else {
464
- return mediaSup[key].prop._supget.apply(this);
465
- }
466
- },
467
- writeable: false
468
- };
469
- };
470
- var createGetSetProp = function(key, setFn){
471
- createGetProp(key);
472
- delete descs[key].writeable;
473
- descs[key].set = setFn;
474
- };
475
-
476
- getPropKeys.forEach(createGetProp);
477
-
478
- createGetSetProp('currentTime', function(t){
479
- var data = getYtDataFromElem(this);
480
- if(data){
481
- t *= 1;
482
- if (!isNaN(t) && data._ytAPI && data._ytAPI.seekTo) {
483
- data._ytAPI.seekTo(t);
484
- triggerUpdate(data);
485
- }
486
- } else {
487
- return mediaSup.currentTime.prop._supset.apply(this, arguments);
488
- }
489
- });
490
-
491
- createGetSetProp('muted', function(mute){
492
- var data = getYtDataFromElem(this);
493
- if(data){
494
- if (data._ytAPI && data._ytAPI.mute) {
495
- data._ytAPI[mute ? 'mute' : 'unMute']();
496
- triggerUpdate(data);
497
- }
498
-
499
- } else {
500
- return mediaSup.muted.prop._supset.apply(this, arguments);
501
- }
502
- });
503
-
504
- createGetSetProp('volume', function(v){
505
- var data = getYtDataFromElem(this);
506
- if(data){
507
- v *= 100;
508
- if (!isNaN(v) && data._ytAPI && data._ytAPI.setVolume) {
509
- if(v < 0 || v > 100){
510
- webshims.error('volume greater or less than allowed '+ (v / 100));
511
- }
512
- data._ytAPI.setVolume(v);
513
- triggerUpdate(data);
514
- }
515
-
516
- } else {
517
- return mediaSup.volume.prop._supset.apply(this, arguments);
518
- }
519
- });
520
-
521
- $.each(['play', 'pause'], function(i, name){
522
- var ytName = name+'Video';
523
- descs[name] = {
524
- value: function(){
525
- var data = getYtDataFromElem(this);
526
- if(data){
527
- if(data._ytAPI && data._ytAPI[ytName]){
528
- data._ytAPI[ytName]();
529
- handlePlayPauseState(name, data);
530
- }
531
- } else {
532
- return mediaSup[name].prop._supvalue.apply(this, arguments);
533
- }
534
- }
535
- };
536
-
537
- });
538
- mediaSup = webshims.defineNodeNameProperties('video', descs, 'prop');
539
- })();
540
-
541
-
542
-
543
- });
1
+ jQuery.webshims.register('mediaelement-yt', function($, webshims, window, document, undefined, options){
2
+ "use strict";
3
+ var mediaelement = webshims.mediaelement;
4
+ var ytAPI = jQuery.Deferred();
5
+ window.onYouTubePlayerAPIReady = function() {
6
+ ytAPI.resolve();
7
+ };
8
+ if(window.YT && YT.Player){
9
+ window.onYouTubePlayerAPIReady();
10
+ }
11
+
12
+ var getProps = {
13
+ paused: true,
14
+ ended: false,
15
+ currentSrc: '',
16
+ duration: window.NaN,
17
+
18
+ readyState: 0,
19
+ networkState: 0,
20
+ videoHeight: 0,
21
+ videoWidth: 0,
22
+ error: null,
23
+ buffered: {
24
+ start: function(index){
25
+ if(index){
26
+ webshims.error('buffered index size error');
27
+ return;
28
+ }
29
+ return 0;
30
+ },
31
+ end: function(index){
32
+ if(index){
33
+ webshims.error('buffered index size error');
34
+ return;
35
+ }
36
+ return 0;
37
+ },
38
+ length: 0
39
+ }
40
+ };
41
+ var getPropKeys = Object.keys(getProps);
42
+
43
+ var getSetProps = {
44
+ currentTime: 0,
45
+ volume: 1,
46
+ muted: false
47
+ };
48
+ var getSetPropKeys = Object.keys(getSetProps);
49
+
50
+ var playerStateObj = $.extend({
51
+ isActive: 'html5',
52
+ activating: 'html5',
53
+ wasSwfReady: false,
54
+ _metadata: false,
55
+ _callMeta: false,
56
+ currentTime: 0,
57
+ _buffered: 0,
58
+ _ppFlag: undefined
59
+ }, getProps, getSetProps);
60
+
61
+ var trigger = function(elem, evt){
62
+ evt = $.Event(evt);
63
+ evt.preventDefault();
64
+ $.event.trigger(evt, undefined, elem);
65
+ };
66
+
67
+ var resetSwfProps = (function(){
68
+ var resetProtoProps = ['_buffered', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta'];
69
+ var len = resetProtoProps.length;
70
+ return function(data){
71
+
72
+ if(!data){return;}
73
+ var lenI = len;
74
+ var networkState = data.networkState;
75
+ data.readyState = 0;
76
+ while(--lenI){
77
+ delete data[resetProtoProps[lenI]];
78
+ }
79
+ data.buffered.length = 0;
80
+ clearInterval(data._timeInterval);
81
+ if(networkState){
82
+ trigger(data._elem, 'emptied');
83
+ }
84
+ };
85
+ })();
86
+
87
+ var setElementDimension = function(data){
88
+ var elem = data._elem;
89
+ var box = data.shadowElem;
90
+ box.css({
91
+ width: elem.style.width || $(elem).width(),
92
+ height: elem.style.height || $(elem).height()
93
+ });
94
+ };
95
+
96
+ var getYtDataFromElem = function(elem){
97
+ try {
98
+ (elem.nodeName);
99
+ } catch(er){
100
+ return null;
101
+ }
102
+ var data = webshims.data(elem, 'mediaelement');
103
+ return (data && data.isActive == 'third') ? data : null;
104
+ };
105
+
106
+ var getYtId = function(src){
107
+ var found;
108
+ src = src.split('?');
109
+ if(src[0].indexOf('youtube.com/watch') != -1 && src[1]){
110
+ src = src[1].split('&');
111
+ $.each(src, function(i, name){
112
+ name = name.split('=');
113
+ if(name[0] == 'v'){
114
+ src = name[1];
115
+ found = true;
116
+ return false;
117
+ }
118
+ });
119
+ } else if(src[0].indexOf('youtube.com/v/') != -1) {
120
+ src = src[0].split('/');
121
+ $.each(src, function(i, name){
122
+ if(found){
123
+ src = name;
124
+ return false;
125
+ }
126
+
127
+ if(name == 'v'){
128
+ found = true;
129
+ }
130
+ });
131
+ }
132
+ if(!found){
133
+ webshims.warn('no youtube id found: '+ src);
134
+ }
135
+ return src;
136
+ };
137
+
138
+ var startAutoPlay = function(data){
139
+ if(!data){return;}
140
+ if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
141
+ setTimeout(function(){
142
+ if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
143
+ try {
144
+ $(data._elem).play();
145
+ } catch(er){}
146
+ }
147
+ }, 1);
148
+ }
149
+ };
150
+
151
+ var addMediaToStopEvents = $.noop;
152
+ (function(){
153
+ var stopEvents = {
154
+ play: 1,
155
+ playing: 1
156
+ };
157
+ var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
158
+ var hidevents = hideEvtArray.map(function(evt){
159
+ return evt +'.webshimspolyfill';
160
+ }).join(' ');
161
+
162
+ var hidePlayerEvents = function(event){
163
+ var data = webshims.data(event.target, 'mediaelement');
164
+ if(!data){return;}
165
+ var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
166
+ if( isNativeHTML5 == (data.activating == 'third') ){
167
+ event.stopImmediatePropagation();
168
+ if(stopEvents[event.type] && data.isActive != data.activating){
169
+ $(event.target).pause();
170
+ }
171
+ }
172
+ };
173
+
174
+ addMediaToStopEvents = function(elem){
175
+ $(elem)
176
+ .off(hidevents)
177
+ .on(hidevents, hidePlayerEvents)
178
+ ;
179
+ hideEvtArray.forEach(function(evt){
180
+ webshims.moveToFirstEvent(elem, evt);
181
+ });
182
+ };
183
+ addMediaToStopEvents(document);
184
+ })();
185
+
186
+ $(document).on('emptied', function(e){
187
+ var data = getYtDataFromElem(e.target);
188
+ startAutoPlay(data);
189
+ });
190
+
191
+
192
+
193
+ mediaelement.setActive = function(elem, type, data){
194
+ if(!data){
195
+ data = webshims.data(elem, 'mediaelement');
196
+ }
197
+ if(!data || data.isActive == type){return;}
198
+ if(type != 'html5' && type != 'third'){
199
+ webshims.warn('wrong type for mediaelement activating: '+ type);
200
+ }
201
+ var shadowData = webshims.data(elem, 'shadowData');
202
+ data.activating = type;
203
+ $(elem).pause();
204
+ data.isActive = type;
205
+ if(type == 'third'){
206
+ shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
207
+ $(elem).addClass('yt-api-active nonnative-api-active').hide().getShadowElement().show();
208
+ } else {
209
+ clearInterval(data._timeInterval);
210
+ $(elem).removeClass('yt-api-active nonnative-api-active').show().getShadowElement().hide();
211
+ shadowData.shadowElement = shadowData.shadowFocusElement = false;
212
+ }
213
+ $(elem).trigger('mediaelementapichange');
214
+ };
215
+
216
+
217
+ var handlePlayPauseState = function(state, data){
218
+ data._ppFlag = true;
219
+ if(state == 'playing'){
220
+ handlePlayPauseState('play', data);
221
+ if(data.readyState < 3){
222
+ data.readyState = 3;
223
+ trigger(data._elem, 'canplay');
224
+ }
225
+ $(data._elem).trigger('playing');
226
+ }
227
+
228
+ if(state == 'play' && data.paused){
229
+ data.paused = false;
230
+ trigger(data._elem, 'play');
231
+ } else if(state == 'pause' && !data.paused){
232
+ data.paused = true;
233
+ trigger(data._elem, 'pause');
234
+ }
235
+ };
236
+
237
+ var addYtAPI = function(mediaElm, elemId, data, ytID){
238
+ ytAPI.done(function(){
239
+ var handleBuffered = function(){
240
+ var buffered, bufFac;
241
+ if(data._metadata && data._ytAPI.getVideoLoadedFraction){
242
+ bufFac = data._ytAPI.getVideoLoadedFraction();
243
+ buffered = bufFac * data.duration;
244
+ if(data._buffered !== buffered){
245
+ data._buffered = buffered;
246
+ data.buffered.length = 1;
247
+ $(mediaElm).trigger('progress');
248
+ }
249
+ if(bufFac > 0.99){
250
+ data.networkState = 1;
251
+ }
252
+ if(data.readyState < 4 && data.currentTime && (data._buffered - data.currentTime > 9 || bufFac > 0.9) ){
253
+ data.readyState = 4;
254
+ trigger(data._elem, 'canplaythrough');
255
+ }
256
+ }
257
+ };
258
+ var getTime = function(){
259
+ if(data._ytAPI && data._ytAPI.getCurrentTime){
260
+ var currentTime = data._ytAPI.getCurrentTime();
261
+ if(data.currentTime != currentTime){
262
+ data.currentTime = currentTime;
263
+ $(mediaElm).trigger('timeupdate');
264
+ }
265
+ handleBuffered();
266
+ }
267
+ };
268
+
269
+ var getData = function(){
270
+ if(data.isActive == 'third' && data._ytAPI && data._ytAPI.getVolume){
271
+
272
+ var volume = data._ytAPI.getVolume() / 100;
273
+ var muted = data._ytAPI.isMuted();
274
+ var triggerVolume;
275
+ if(volume != data.volume){
276
+ data.volume = volume;
277
+ triggerVolume = true;
278
+ }
279
+ if(muted != data.muted){
280
+ data.muted = muted;
281
+ triggerVolume = true;
282
+ }
283
+ getTime();
284
+ handleBuffered();
285
+ if(triggerVolume){
286
+ $(mediaElm).trigger('volumechange');
287
+ }
288
+ }
289
+ };
290
+ var getIntervalTime = function(){
291
+ clearInterval(data._timeInterval);
292
+ data._timeInterval = setInterval(function(){
293
+ var currentTime = data._ytAPI.getCurrentTime();
294
+ if(data.currentTime != currentTime){
295
+ data.currentTime = currentTime;
296
+ $(mediaElm).trigger('timeupdate');
297
+ }
298
+ }, 350);
299
+ };
300
+ data._ytAPI = new YT.Player(elemId, {
301
+ height: '100%',
302
+ width: '100%',
303
+ playerVars: {
304
+ allowfullscreen: true,
305
+ fs: 1,
306
+ rel: 0,
307
+ showinfo: 0,
308
+ autohide: 1,
309
+ controls: $.prop(mediaElm, 'controls') ? 1:0
310
+ },
311
+
312
+ videoId: ytID,
313
+ events: {
314
+ 'onReady': function(e){
315
+ startAutoPlay(data);
316
+ setTimeout(getData, 9);
317
+ setInterval(getData, 5000);
318
+ },
319
+
320
+ 'onStateChange': function(e){
321
+ if(!e.target.getDuration){return;}
322
+ var callMeta;
323
+ if(!data._metadata){
324
+ var duration = e.target.getDuration();
325
+ if(duration){
326
+ data._metadata = true;
327
+ data.duration = duration;
328
+ if(data.readyState < 1){
329
+ data.readyState = 1;
330
+ }
331
+ if(data.networkState < 1){
332
+ data.networkState = 2;
333
+ }
334
+ callMeta = true;
335
+ }
336
+ }
337
+
338
+ if(callMeta){
339
+ $(mediaElm)
340
+ .trigger('durationchange')
341
+ .trigger('loadedmetadata')
342
+ ;
343
+ }
344
+ setTimeout(getData, 9);
345
+ if(e.data == 1){
346
+ handlePlayPauseState('playing', data);
347
+ getIntervalTime();
348
+ } else if(e.data == 2){
349
+ clearInterval(data._timeInterval);
350
+ handlePlayPauseState('pause', data);
351
+ } else if(e.data == 3){
352
+ if(data.readyState > 2){
353
+ data.readyState = 2;
354
+ }
355
+ data.networkState = 2;
356
+ $(mediaElm).trigger('waiting');
357
+ } else if(e.data === 0){
358
+ if(data.readyState > 4){
359
+ data.readyState = 4;
360
+ }
361
+ data.networkState = 1;
362
+ clearInterval(data._timeInterval);
363
+ $(mediaElm).trigger('ended');
364
+ }
365
+ }
366
+ }
367
+ });
368
+
369
+ $(mediaElm).on('updateytdata', getData);
370
+
371
+ });
372
+ };
373
+
374
+ mediaelement.createSWF = function(mediaElem, src, data){
375
+ if(!data){
376
+ data = webshims.data(mediaElem, 'mediaelement');
377
+ }
378
+ var ytID = getYtId(src.src);
379
+ if(data){
380
+ mediaelement.setActive(mediaElem, 'third', data);
381
+ resetSwfProps(data);
382
+ data.currentSrc = src.srcProp;
383
+ ytAPI.done(function(){
384
+ if(data._ytAPI.loadVideoById){
385
+ data._ytAPI.loadVideoById(ytID);
386
+ }
387
+ });
388
+
389
+ return;
390
+ }
391
+ var hasControls = $.prop(mediaElem, 'controls');
392
+ var elemId = 'yt-'+ webshims.getID(mediaElem);
393
+ var box = $('<div class="polyfill-video polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
394
+ .css({
395
+ position: 'relative',
396
+ overflow: 'hidden'
397
+ })
398
+ ;
399
+
400
+
401
+
402
+ data = webshims.data(mediaElem, 'mediaelement', webshims.objectCreate(playerStateObj, {
403
+ shadowElem: {
404
+ value: box
405
+ },
406
+ _elem: {
407
+ value: mediaElem
408
+ },
409
+ currentSrc: {
410
+ value: src.srcProp
411
+ },
412
+ buffered: {
413
+ value: {
414
+ start: function(index){
415
+ if(index >= data.buffered.length){
416
+ webshims.error('buffered index size error');
417
+ return;
418
+ }
419
+ return 0;
420
+ },
421
+ end: function(index){
422
+ if(index >= data.buffered.length){
423
+ webshims.error('buffered index size error');
424
+ return;
425
+ }
426
+ return data._buffered;
427
+ },
428
+ length: 0
429
+ }
430
+ }
431
+ }));
432
+
433
+
434
+
435
+ setElementDimension(data);
436
+ box.insertBefore(mediaElem);
437
+
438
+ webshims.addShadowDom(mediaElem, box);
439
+ mediaelement.setActive(mediaElem, 'third', data);
440
+ addMediaToStopEvents(mediaElem);
441
+
442
+ addYtAPI(mediaElem, elemId, data, ytID);
443
+ $(mediaElem).on('updatemediaelementdimensions updateshadowdom', function(){
444
+ setElementDimension(data);
445
+ });
446
+ };
447
+
448
+ (function(){
449
+ var triggerUpdate = function(data){
450
+ clearTimeout(data.updateDataTimer);
451
+ data.updateDataTimer = setTimeout(function(){
452
+ $(data._elem).triggerHandler('updateytdata');
453
+ }, 9);
454
+ };
455
+ var descs = {};
456
+ var mediaSup;
457
+ var createGetProp = function(key){
458
+ descs[key] = {
459
+ get: function(){
460
+ var data = getYtDataFromElem(this);
461
+ if(data){
462
+ return data[key];
463
+ } else {
464
+ return mediaSup[key].prop._supget.apply(this);
465
+ }
466
+ },
467
+ writeable: false
468
+ };
469
+ };
470
+ var createGetSetProp = function(key, setFn){
471
+ createGetProp(key);
472
+ delete descs[key].writeable;
473
+ descs[key].set = setFn;
474
+ };
475
+
476
+ getPropKeys.forEach(createGetProp);
477
+
478
+ createGetSetProp('currentTime', function(t){
479
+ var data = getYtDataFromElem(this);
480
+ if(data){
481
+ t *= 1;
482
+ if (!isNaN(t) && data._ytAPI && data._ytAPI.seekTo) {
483
+ data._ytAPI.seekTo(t);
484
+ triggerUpdate(data);
485
+ }
486
+ } else {
487
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
488
+ }
489
+ });
490
+
491
+ createGetSetProp('muted', function(mute){
492
+ var data = getYtDataFromElem(this);
493
+ if(data){
494
+ if (data._ytAPI && data._ytAPI.mute) {
495
+ data._ytAPI[mute ? 'mute' : 'unMute']();
496
+ triggerUpdate(data);
497
+ }
498
+
499
+ } else {
500
+ return mediaSup.muted.prop._supset.apply(this, arguments);
501
+ }
502
+ });
503
+
504
+ createGetSetProp('volume', function(v){
505
+ var data = getYtDataFromElem(this);
506
+ if(data){
507
+ v *= 100;
508
+ if (!isNaN(v) && data._ytAPI && data._ytAPI.setVolume) {
509
+ if(v < 0 || v > 100){
510
+ webshims.error('volume greater or less than allowed '+ (v / 100));
511
+ }
512
+ data._ytAPI.setVolume(v);
513
+ triggerUpdate(data);
514
+ }
515
+
516
+ } else {
517
+ return mediaSup.volume.prop._supset.apply(this, arguments);
518
+ }
519
+ });
520
+
521
+ $.each(['play', 'pause'], function(i, name){
522
+ var ytName = name+'Video';
523
+ descs[name] = {
524
+ value: function(){
525
+ var data = getYtDataFromElem(this);
526
+ if(data){
527
+ if(data._ytAPI && data._ytAPI[ytName]){
528
+ data._ytAPI[ytName]();
529
+ handlePlayPauseState(name, data);
530
+ }
531
+ } else {
532
+ return mediaSup[name].prop._supvalue.apply(this, arguments);
533
+ }
534
+ }
535
+ };
536
+
537
+ });
538
+ mediaSup = webshims.defineNodeNameProperties('video', descs, 'prop');
539
+ })();
540
+
541
+
542
+
543
+ });