webshims-rails 1.14.5 → 1.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -0
  3. data/lib/webshims-rails/version.rb +2 -2
  4. data/readme.textile +7 -0
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +38 -6
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +26 -20
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +54 -19
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +32 -15
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +45 -21
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +45 -21
  11. data/vendor/assets/javascripts/webshims/shims/combos/15.js +22 -4
  12. data/vendor/assets/javascripts/webshims/shims/combos/16.js +48 -24
  13. data/vendor/assets/javascripts/webshims/shims/combos/17.js +32 -15
  14. data/vendor/assets/javascripts/webshims/shims/combos/18.js +18 -81
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +48 -24
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +286 -179
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +19 -1
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +26 -20
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +311 -199
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +22 -17
  21. data/vendor/assets/javascripts/webshims/shims/combos/27.js +22 -17
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +22 -4
  23. data/vendor/assets/javascripts/webshims/shims/combos/30.js +22 -4
  24. data/vendor/assets/javascripts/webshims/shims/combos/31.js +22 -4
  25. data/vendor/assets/javascripts/webshims/shims/combos/34.js +41 -5
  26. data/vendor/assets/javascripts/webshims/shims/combos/4.js +22 -4
  27. data/vendor/assets/javascripts/webshims/shims/combos/5.js +32 -15
  28. data/vendor/assets/javascripts/webshims/shims/combos/6.js +32 -15
  29. data/vendor/assets/javascripts/webshims/shims/combos/7.js +48 -24
  30. data/vendor/assets/javascripts/webshims/shims/combos/8.js +48 -24
  31. data/vendor/assets/javascripts/webshims/shims/combos/9.js +54 -19
  32. data/vendor/assets/javascripts/webshims/shims/combos/98.js +24 -7
  33. data/vendor/assets/javascripts/webshims/shims/combos/99.js +24 -7
  34. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +22 -4
  35. data/vendor/assets/javascripts/webshims/shims/es5.js +3 -1
  36. data/vendor/assets/javascripts/webshims/shims/es6.js +1 -5
  37. data/vendor/assets/javascripts/webshims/shims/filereader.js +22 -17
  38. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +32 -15
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +18 -8
  40. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fa.js +1 -1
  41. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +11 -0
  42. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +16 -0
  43. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +3 -20
  44. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols.js +24 -7
  45. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +26 -20
  46. data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +9 -1
  47. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +267 -178
  48. data/vendor/assets/javascripts/webshims/shims/picture.js +18 -81
  49. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +1 -9
  50. data/vendor/assets/javascripts/webshims/shims/sizzle.js +1 -8
  51. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +4 -0
  52. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +5 -0
  53. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +4 -0
  54. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  55. data/vendor/assets/javascripts/webshims/shims/track.js +19 -1
  56. data/vendor/assets/javascripts/webshims/shims/url.js +316 -0
  57. data/vendor/assets/javascripts/webshims/shims/usermedia-core.js +28 -0
  58. data/vendor/assets/javascripts/webshims/shims/usermedia-shim.js +179 -0
  59. metadata +5 -3
  60. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -511
@@ -29,6 +29,8 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
29
29
  ;
30
30
  return '<div><ul role="presentation">' + items.join('') +'</ul></div>';
31
31
  };
32
+ var domPrefixes = webshims.domPrefixes;
33
+ var prefixed = webshims.prefixed;
32
34
 
33
35
 
34
36
  if(!$.fn.wsTouchClick){
@@ -976,26 +978,7 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
976
978
  return chapterList;
977
979
  }
978
980
 
979
- var domPrefixes = ["webkit", "moz", "o", "ms"];
980
981
 
981
- function prefixed(prop, obj){
982
- var i, testProp;
983
- var ret = false;
984
- if(obj[prop]){
985
- ret = prop;
986
- }
987
- if(!ret){
988
- prop = prop.charAt(0).toUpperCase() + prop.slice(1);
989
- for(i = 0; i < domPrefixes.length; i++){
990
- testProp = domPrefixes[i]+prop;
991
- if(testProp in obj){
992
- ret = testProp;
993
- break;
994
- }
995
- }
996
- }
997
- return ret;
998
- }
999
982
 
1000
983
  $.jme.defineMethod('getChapterTree', getChapterTree);
1001
984
 
@@ -1050,7 +1033,7 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
1050
1033
  data = $.jme.data(this);
1051
1034
  sec = $.prop(data.media, 'duration');
1052
1035
  }
1053
- if(!sec){
1036
+ if(!sec || !isFinite(sec)){
1054
1037
  sec = 0;
1055
1038
  }
1056
1039
  var formated = [];
@@ -50,7 +50,9 @@ webshims.register('mediacontrols', function($, webshims, window){
50
50
  return cache[template] || '';
51
51
  };
52
52
  })();
53
- var ios6 = /iP(hone|od|ad)/i.test(navigator.platform) && parseInt(((navigator.appVersion).match(/OS (\d+)_\d+/) || ['','8'])[1], 10) < 7;
53
+ var ios = /iP(hone|od|ad)/i.test(navigator.platform);
54
+ var ios6 = ios && parseInt(((navigator.appVersion).match(/OS (\d+)_\d+/) || ['','8'])[1], 10) < 7;
55
+ var hasYtBug = (!window.Modernizr || !Modernizr.videoautoplay) && (ios || /android/i.test(navigator.userAgent));
54
56
  var loadLazy = function(){
55
57
  if(!loadLazy.loaded){
56
58
  loadLazy.loaded = true;
@@ -77,7 +79,8 @@ webshims.register('mediacontrols', function($, webshims, window){
77
79
  };
78
80
 
79
81
  webshims.loader.addModule('mediacontrols-lazy', {
80
- src: 'jme/mediacontrols-lazy'
82
+ src: 'jme/mediacontrols-lazy',
83
+ d: ['dom-support']
81
84
  });
82
85
 
83
86
  var userActivity = {
@@ -100,6 +103,11 @@ webshims.register('mediacontrols', function($, webshims, window){
100
103
  data.media.removeAttr('controls');
101
104
  data.media.mediaLoad();
102
105
  }
106
+
107
+ if(hasYtBug){
108
+ data.player.addClass('has-yt-bug');
109
+ }
110
+
103
111
  data.media.prop('controls', false);
104
112
  structure = getBarHtml();
105
113
  data._controlbar = $( options.barStructure );
@@ -146,7 +154,7 @@ webshims.register('mediacontrols', function($, webshims, window){
146
154
  })();
147
155
  var $poster = $('<div class="ws-poster" />').insertAfter(data.media);
148
156
  var posterState = (function(){
149
- var lastPosterState, lastYoutubeState, lastPoster;
157
+ var lastPosterState, lastYoutubeState, lastPoster, isYt;
150
158
  var hasFlash = window.swfmini && swfmini.hasFlashPlayerVersion('10.0.3');
151
159
  var regYt = /youtube\.com\/[watch\?|v\/]+/i;
152
160
 
@@ -162,8 +170,10 @@ webshims.register('mediacontrols', function($, webshims, window){
162
170
  data.player.addClass('no-backgroundsize');
163
171
  }
164
172
  data.media.on('play playing waiting seeked seeking', function(e){
165
-
166
- if(isInitial){
173
+ if(!e){
174
+ e.type = 'playing';
175
+ }
176
+ if(isInitial && (!isYt || !hasYtBug || e.type == 'playing' || data.media.prop('readyState') > 1)){
167
177
  isInitial = false;
168
178
  data.player.removeClass('initial-state');
169
179
  }
@@ -179,12 +189,16 @@ webshims.register('mediacontrols', function($, webshims, window){
179
189
  data.player.addClass('ended-state');
180
190
  }
181
191
  });
192
+
182
193
  return function(){
194
+ var hasYt;
183
195
  var poster = data.media.attr('poster');
184
196
  var hasPoster = !!poster;
185
197
  var currentSrc = data.media.prop('currentSrc') || '';
186
- var isYt = regYt.test(currentSrc);
187
- var hasYt = (hasFlash && hasPoster) ? false : isYt;
198
+
199
+ isYt = regYt.test(currentSrc);
200
+
201
+ hasYt = (hasFlash && hasPoster) ? false : isYt;
188
202
 
189
203
  if(!hasPoster && isYt){
190
204
  poster = currentSrc.match(/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i) || '';
@@ -214,6 +228,9 @@ webshims.register('mediacontrols', function($, webshims, window){
214
228
  data.player.removeClass('ended-state');
215
229
  }
216
230
 
231
+ //https://code.google.com/p/gdata-issues/issues/detail?id=5415
232
+ data.player[isYt ? 'addClass' : 'removeClass']('yt-video');
233
+
217
234
  if(lastYoutubeState !== hasYt){
218
235
  lastYoutubeState = hasYt;
219
236
  data.player[hasYt ? 'addClass' : 'removeClass']('has-ytposter');
@@ -59,7 +59,7 @@
59
59
  }
60
60
 
61
61
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined, options){
62
- var hasSwf = swfmini.hasFlashPlayerVersion('10.0.3');
62
+ var hasSwf = swfmini.hasFlashPlayerVersion('11.3');
63
63
  var mediaelement = webshims.mediaelement;
64
64
 
65
65
  mediaelement.parseRtmp = function(data){
@@ -169,6 +169,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
169
169
  loadYt();
170
170
  }
171
171
  };
172
+
172
173
 
173
174
  webshims.addPolyfill('mediaelement-yt', {
174
175
  test: !hasYt,
@@ -213,7 +214,16 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
213
214
  if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
214
215
  return 'video/youtube';
215
216
  }
216
- if(src.indexOf('rtmp') === 0){
217
+
218
+ if(!src.indexOf('mediastream:') || !src.indexOf('blob:http')){
219
+ return 'usermedia';
220
+ }
221
+
222
+ if(!src.indexOf('webshimstream')){
223
+ return 'jarisplayer/stream';
224
+ }
225
+
226
+ if(!src.indexOf('rtmp')){
217
227
  return nodeName+'/rtmp';
218
228
  }
219
229
  src = src.split('?')[0].split('#')[0].split('.');
@@ -230,28 +240,24 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
230
240
  };
231
241
 
232
242
 
233
- mediaelement.srces = function(mediaElem, srces){
243
+ mediaelement.srces = function(mediaElem){
244
+ var srces = [];
234
245
  mediaElem = $(mediaElem);
235
- if(!srces){
236
- srces = [];
237
- var nodeName = mediaElem[0].nodeName.toLowerCase();
238
- var src = getSrcObj(mediaElem, nodeName);
239
-
240
- if(!src.src){
241
- $('source', mediaElem).each(function(){
242
- src = getSrcObj(this, nodeName);
243
- if(src.src){srces.push(src);}
244
- });
245
- } else {
246
- srces.push(src);
247
- }
248
- return srces;
246
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
247
+ var src = getSrcObj(mediaElem, nodeName);
248
+
249
+ if(!src.src){
250
+ $('source', mediaElem).each(function(){
251
+ src = getSrcObj(this, nodeName);
252
+ if(src.src){srces.push(src);}
253
+ });
249
254
  } else {
250
- webshims.error('setting sources was removed.');
255
+ srces.push(src);
251
256
  }
257
+ return srces;
252
258
  };
253
259
 
254
- mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
260
+ mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'jarisplayer/stream', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
255
261
 
256
262
  mediaelement.canThirdPlaySrces = function(mediaElem, srces){
257
263
  var ret = '';
@@ -281,7 +287,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
281
287
  srces = srces || mediaelement.srces(mediaElem);
282
288
 
283
289
  $.each(srces, function(i, src){
284
- if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
290
+ if(src.type == 'usermedia' || (src.type && nativeCanPlay.call(mediaElem[0], src.type)) ){
285
291
  ret = src;
286
292
  return false;
287
293
  }
@@ -472,7 +472,8 @@
472
472
  .attr({
473
473
  src: src.src,
474
474
  'data-type': container,
475
- 'controls': 'controls'
475
+ 'controls': 'controls',
476
+ preload: 'none'
476
477
  })
477
478
  ;
478
479
  var resolvePromise = function(){
@@ -517,6 +518,8 @@
517
518
  duration: $media.prop('duration'),
518
519
  height: $media.prop('videoHeight'),
519
520
  width: $media.prop('videoWidth')
521
+ //todo at test for seekable
522
+ //,seekable: ($media.prop('seekable') || []).length
520
523
  };
521
524
  }
522
525
  src.decode[provider].success = true;
@@ -554,6 +557,11 @@
554
557
  .on('mediaerror loadedmetadata', resolve)
555
558
  .appendTo($element)
556
559
  ;
560
+
561
+ if(provider == 'native'){
562
+ $media.on('error', resolve);
563
+ }
564
+
557
565
  $element.appendTo($container);
558
566
  timeoutTimer = setTimeout(resolve, 40000);
559
567
  playTimer = setTimeout(function(){
@@ -1,11 +1,11 @@
1
1
  webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
2
2
  "use strict";
3
-
3
+
4
4
  var mediaelement = webshims.mediaelement;
5
5
  var swfmini = window.swfmini;
6
6
  var support = webshims.support;
7
7
  var hasNative = support.mediaelement;
8
- var hasFlash = swfmini.hasFlashPlayerVersion('9.0.115');
8
+ var hasFlash = swfmini.hasFlashPlayerVersion('11.3');
9
9
  var loadedSwf = 0;
10
10
  var needsLoadPreload = 'ActiveXObject' in window && hasNative;
11
11
  var getProps = {
@@ -38,18 +38,19 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
38
38
  }
39
39
  };
40
40
  var getPropKeys = Object.keys(getProps);
41
-
41
+
42
42
  var getSetProps = {
43
43
  currentTime: 0,
44
44
  volume: 1,
45
45
  muted: false
46
46
  };
47
47
  var getSetPropKeys = Object.keys(getSetProps);
48
-
48
+
49
49
  var playerStateObj = $.extend({
50
50
  isActive: 'html5',
51
- activating: 'html5',
51
+ activating: 'html5',
52
52
  wasSwfReady: false,
53
+ _usermedia: null,
53
54
  _bufferedEnd: 0,
54
55
  _bufferedStart: 0,
55
56
  currentTime: 0,
@@ -59,8 +60,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
59
60
  lastDuration: 0,
60
61
  _timeDif: 0.3
61
62
  }, getProps, getSetProps);
62
-
63
-
63
+
64
+
64
65
  var getSwfDataFromElem = function(elem){
65
66
  try {
66
67
  (elem.nodeName);
@@ -70,15 +71,15 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
70
71
  var data = webshims.data(elem, 'mediaelement');
71
72
  return (data && data.isActive == 'third') ? data : null;
72
73
  };
73
-
74
+
74
75
  var trigger = function(elem, evt){
75
76
  evt = $.Event(evt);
76
77
  evt.preventDefault();
77
78
  $.event.trigger(evt, undefined, elem);
78
79
  };
79
-
80
+
80
81
  var playerSwfPath = options.playerPath || webshims.cfg.basePath + "swf/" + (options.playerName || 'JarisFLVPlayer.swf');
81
-
82
+
82
83
  webshims.extendUNDEFProp(options.params, {
83
84
  allowscriptaccess: 'always',
84
85
  allowfullscreen: 'true',
@@ -92,7 +93,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
92
93
  webshims.extendUNDEFProp(options.attrs, {
93
94
  bgcolor: '#000000'
94
95
  });
95
-
96
+ options.playerPath = playerSwfPath;
97
+
96
98
  var setReadyState = function(readyState, data){
97
99
  if(readyState < 3){
98
100
  clearTimeout(data._canplaythroughTimer);
@@ -120,8 +122,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
120
122
  $(data._elem).triggerHandler('seeked');
121
123
  }
122
124
  };
123
-
124
-
125
+
126
+
125
127
  mediaelement.jarisEvent = {};
126
128
  var localConnectionTimer;
127
129
  var onEvent = {
@@ -136,7 +138,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
136
138
  playing = override;
137
139
  }
138
140
  if(playing == idled || playing == null){
139
-
141
+
140
142
  data.paused = !playing;
141
143
  type = data.paused ? 'pause' : 'play';
142
144
  data._ppFlag = true;
@@ -151,7 +153,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
151
153
  },
152
154
  onSeek: function(jaris, data){
153
155
  data._lastSeektime = jaris.seekTime;
154
-
156
+
155
157
  data.seeking = true;
156
158
  $(data._elem).triggerHandler('seeking');
157
159
  clearTimeout(data._seekedTimer);
@@ -167,19 +169,19 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
167
169
  setReadyState(3, data);
168
170
  },
169
171
  onDataInitialized: function(jaris, data){
170
-
172
+
171
173
  var oldDur = data.duration;
172
174
  var durDelta;
173
175
  data.duration = jaris.duration;
174
176
  if(oldDur == data.duration || isNaN(data.duration)){return;}
175
-
177
+
176
178
  if(data._calledMeta && ((durDelta = Math.abs(data.lastDuration - data.duration)) < 2)){return;}
177
-
178
-
179
-
179
+
180
+
181
+
180
182
  data.videoHeight = jaris.height;
181
183
  data.videoWidth = jaris.width;
182
-
184
+
183
185
  if(!data.networkState){
184
186
  data.networkState = 2;
185
187
  }
@@ -235,7 +237,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
235
237
  data.lastCalledTime = data.currentTime;
236
238
  $.event.trigger('timeupdate', undefined, data._elem, true);
237
239
  }
238
-
240
+
239
241
  },
240
242
  onProgress: function(jaris, data){
241
243
  if(data.ended){
@@ -245,7 +247,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
245
247
  return;
246
248
  }
247
249
  var percentage = jaris.loaded / jaris.total;
248
-
250
+
249
251
  if(percentage > 0.02 && percentage < 0.2){
250
252
  setReadyState(3, data);
251
253
  } else if(percentage > 0.2){
@@ -258,10 +260,10 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
258
260
  if(data._bufferedEnd && (data._bufferedEnd > percentage)){
259
261
  data._bufferedStart = data.currentTime || 0;
260
262
  }
261
-
263
+
262
264
  data._bufferedEnd = percentage;
263
265
  data.buffered.length = 1;
264
-
266
+
265
267
  $.event.trigger('progress', undefined, data._elem, true);
266
268
  },
267
269
  onPlaybackFinished: function(jaris, data){
@@ -281,7 +283,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
281
283
  ready: (function(){
282
284
  var testAPI = function(data){
283
285
  var passed = true;
284
-
286
+
285
287
  try {
286
288
  data.api.api_get('volume');
287
289
  } catch(er){
@@ -289,17 +291,17 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
289
291
  }
290
292
  return passed;
291
293
  };
292
-
294
+
293
295
  return function(jaris, data){
294
296
  var i = 0;
295
-
297
+
296
298
  var doneFn = function(){
297
299
  if(i > 9){
298
300
  data.tryedReframeing = 0;
299
301
  return;
300
302
  }
301
303
  i++;
302
-
304
+
303
305
  data.tryedReframeing++;
304
306
  if(testAPI(data)){
305
307
  data.wasSwfReady = true;
@@ -329,25 +331,25 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
329
331
  clearTimeout(localConnectionTimer);
330
332
  clearTimeout(data.reframeTimer);
331
333
  data.shadowElem.removeClass('flashblocker-assumed');
332
-
334
+
333
335
  if(!i){
334
336
  doneFn();
335
337
  } else {
336
338
  data.reframeTimer = setTimeout(doneFn, 9);
337
339
  }
338
-
340
+
339
341
  };
340
342
  })()
341
343
  };
342
-
344
+
343
345
  onEvent.onMute = onEvent.onVolumeChange;
344
-
345
-
346
+ mediaelement.onEvent = onEvent;
347
+
346
348
  var workActionQueue = function(data){
347
349
  var actionLen = data.actionQueue.length;
348
350
  var i = 0;
349
351
  var operation;
350
-
352
+
351
353
  if(actionLen && data.isActive == 'third'){
352
354
  while(data.actionQueue.length && actionLen > i){
353
355
  i++;
@@ -368,7 +370,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
368
370
  if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
369
371
  setTimeout(function(){
370
372
  if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
371
-
373
+
372
374
  try {
373
375
  $(data._elem).play();
374
376
  data._ppFlag = true;
@@ -376,7 +378,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
376
378
  }
377
379
  }, 1);
378
380
  }
379
-
381
+
380
382
  if(data.muted){
381
383
  $.prop(data._elem, 'muted', true);
382
384
  }
@@ -384,8 +386,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
384
386
  $.prop(data._elem, 'volume', data.volume);
385
387
  }
386
388
  };
387
-
388
-
389
+
390
+
389
391
  var addMediaToStopEvents = $.noop;
390
392
  if(hasNative){
391
393
  var stopEvents = {
@@ -396,14 +398,14 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
396
398
  var hidevents = hideEvtArray.map(function(evt){
397
399
  return evt +'.webshimspolyfill';
398
400
  }).join(' ');
399
-
401
+
400
402
  var hidePlayerEvents = function(event){
401
403
  var data = webshims.data(event.target, 'mediaelement');
402
404
  if(!data){return;}
403
405
  var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
404
406
  if( isNativeHTML5 == (data.activating == 'third') ){
405
407
  event.stopImmediatePropagation();
406
-
408
+
407
409
  if(stopEvents[event.type]){
408
410
  if(data.isActive != data.activating){
409
411
  $(event.target).pause();
@@ -413,7 +415,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
413
415
  }
414
416
  }
415
417
  };
416
-
418
+
417
419
  addMediaToStopEvents = function(elem){
418
420
  $(elem)
419
421
  .off(hidevents)
@@ -425,8 +427,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
425
427
  };
426
428
  addMediaToStopEvents(document);
427
429
  }
428
-
429
-
430
+
431
+
430
432
  mediaelement.setActive = function(elem, type, data){
431
433
  if(!data){
432
434
  data = webshims.data(elem, 'mediaelement');
@@ -448,14 +450,14 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
448
450
  }
449
451
  $(elem).trigger('mediaelementapichange');
450
452
  };
451
-
452
-
453
-
453
+
454
+
455
+
454
456
  var resetSwfProps = (function(){
455
- var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', 'lastCalledTime', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
457
+ var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', 'lastCalledTime', '_usermedia', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
456
458
  var len = resetProtoProps.length;
457
459
  return function(data){
458
-
460
+
459
461
  if(!data){return;}
460
462
  clearTimeout(data._seekedTimer);
461
463
  var lenI = len;
@@ -472,8 +474,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
472
474
  }
473
475
  };
474
476
  })();
475
-
476
-
477
+
478
+
477
479
  var getComputedDimension = (function(){
478
480
  var dimCache = {};
479
481
  var getVideoDims = function(data){
@@ -495,7 +497,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
495
497
  width: this.width,
496
498
  height: this.height
497
499
  };
498
-
500
+
499
501
  if(dimCache[poster].height && dimCache[poster].width){
500
502
  setElementDimension(data, $.prop(data._elem, 'controls'));
501
503
  } else {
@@ -511,12 +513,12 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
511
513
  }
512
514
  return ret || {width: 300, height: data._elemNodeName == 'video' ? 150 : 50};
513
515
  };
514
-
516
+
515
517
  var getCssStyle = function(elem, style){
516
518
  return elem.style[style] || (elem.currentStyle && elem.currentStyle[style]) || (window.getComputedStyle && (window.getComputedStyle( elem, null ) || {} )[style]) || '';
517
519
  };
518
520
  var minMaxProps = ['minWidth', 'maxWidth', 'minHeight', 'maxHeight'];
519
-
521
+
520
522
  var addMinMax = function(elem, ret){
521
523
  var i, prop;
522
524
  var hasMinMax = false;
@@ -530,7 +532,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
530
532
  return hasMinMax;
531
533
  };
532
534
  var retFn = function(data){
533
- var videoDims, ratio, hasMinMax;
535
+ var videoDims, ratio;
534
536
  var elem = data._elem;
535
537
  var autos = {
536
538
  width: getCssStyle(elem, 'width') == 'auto',
@@ -540,11 +542,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
540
542
  width: !autos.width && $(elem).width(),
541
543
  height: !autos.height && $(elem).height()
542
544
  };
543
-
545
+
544
546
  if(autos.width || autos.height){
545
547
  videoDims = getVideoDims(data);
546
548
  ratio = videoDims.width / videoDims.height;
547
-
549
+
548
550
  if(autos.width && autos.height){
549
551
  ret.width = videoDims.width;
550
552
  ret.height = videoDims.height;
@@ -553,12 +555,12 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
553
555
  } else if(autos.height){
554
556
  ret.height = ret.width / ratio;
555
557
  }
556
-
558
+
557
559
  if(addMinMax(elem, ret)){
558
560
  data.shadowElem.css(ret);
559
561
  if(autos.width){
560
562
  ret.width = data.shadowElem.height() * ratio;
561
- }
563
+ }
562
564
  if(autos.height){
563
565
  ret.height = ((autos.width) ? ret.width : data.shadowElem.width()) / ratio;
564
566
  }
@@ -566,11 +568,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
566
568
  data.shadowElem.css(ret);
567
569
  ret.height = data.shadowElem.width() / ratio;
568
570
  ret.width = ret.height * ratio;
569
-
571
+
570
572
  data.shadowElem.css(ret);
571
573
  ret.width = data.shadowElem.height() * ratio;
572
574
  ret.height = ret.width / ratio;
573
-
575
+
574
576
  }
575
577
  if(!webshims.support.mediaelement){
576
578
  ret.width = data.shadowElem.width();
@@ -580,13 +582,13 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
580
582
  }
581
583
  return ret;
582
584
  };
583
-
585
+
584
586
  return retFn;
585
587
  })();
586
-
588
+
587
589
  var setElementDimension = function(data, hasControls){
588
590
  var dims;
589
-
591
+
590
592
  var box = data.shadowElem;
591
593
  $(data._elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
592
594
 
@@ -601,7 +603,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
601
603
  }
602
604
  }
603
605
  };
604
-
606
+
605
607
  var bufferSrc = (function(){
606
608
  var preloads = {
607
609
  '': 1,
@@ -616,17 +618,17 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
616
618
  return !!(preloads[preload] || (preload == 'metadata' && $(elem).is('.preload-in-doubt, video:not([poster])')));
617
619
  };
618
620
  })();
619
-
621
+
620
622
  var regs = {
621
- A: /&amp;/g,
622
- a: /&/g,
623
- e: /\=/g,
624
- q: /\?/g
625
- },
626
- replaceVar = function(val){
627
- return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
628
- };
629
-
623
+ A: /&amp;/g,
624
+ a: /&/g,
625
+ e: /\=/g,
626
+ q: /\?/g
627
+ },
628
+ replaceVar = function(val){
629
+ return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
630
+ };
631
+
630
632
  if('matchMedia' in window){
631
633
  var allowMediaSorting = false;
632
634
  try {
@@ -640,14 +642,15 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
640
642
  } catch(er){
641
643
  return 0;
642
644
  }
643
- return src1 == src2 ?
645
+ return src1 == src2 ?
644
646
  0 :
645
647
  src1 ? -1
646
- : 1;
648
+ : 1;
647
649
  };
648
650
  }
649
651
  }
650
652
 
653
+ mediaelement.resetSwfProps = resetSwfProps;
651
654
  mediaelement.createSWF = function( elem, canPlaySrc, data ){
652
655
  if(!hasFlash){
653
656
  setTimeout(function(){
@@ -655,7 +658,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
655
658
  }, 1);
656
659
  return;
657
660
  }
658
-
661
+
659
662
  var attrStyle = {};
660
663
 
661
664
  if(loadedSwf < 1){
@@ -666,55 +669,40 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
666
669
  if(!data){
667
670
  data = webshims.data(elem, 'mediaelement');
668
671
  }
669
-
672
+
670
673
  if((attrStyle.height = $.attr(elem, 'height') || '') || (attrStyle.width = $.attr(elem, 'width') || '')){
671
674
  $(elem).css(attrStyle);
672
675
  webshims.warn("width or height content attributes used. Webshims prefers the usage of CSS (computed styles or inline styles) to detect size of a video/audio. It's really more powerfull.");
673
676
  }
674
-
675
- var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
676
- var vars = $.extend({}, options.vars, {
677
- poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
678
- source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
679
- server: replaceVar(canPlaySrc.server || '')
680
- });
681
- var elemVars = $(elem).data('vars') || {};
682
-
683
-
684
-
677
+ var box;
678
+ var streamRequest = canPlaySrc.streamrequest;
679
+ var isStream = canPlaySrc.type == 'jarisplayer/stream';
680
+
681
+
685
682
  var hasControls = $.prop(elem, 'controls');
686
683
  var elemId = 'jarisplayer-'+ webshims.getID(elem);
687
-
688
- var params = $.extend(
689
- {},
690
- options.params,
691
- $(elem).data('params')
692
- );
684
+
685
+
693
686
  var elemNodeName = elem.nodeName.toLowerCase();
694
- var attrs = $.extend(
695
- {},
696
- options.attrs,
697
- {
698
- name: elemId,
699
- id: elemId
700
- },
701
- $(elem).data('attrs')
702
- );
687
+
703
688
  var setDimension = function(){
704
689
  if(data.isActive == 'third'){
705
690
  setElementDimension(data, $.prop(elem, 'controls'));
706
691
  }
707
692
  };
708
-
709
- var box;
710
-
693
+
694
+ if(isStream && !streamRequest){
695
+ webshim.usermedia.attach(elem, canPlaySrc, data);
696
+ return;
697
+ }
698
+
711
699
  if(data && data.swfCreated){
712
700
  mediaelement.setActive(elem, 'third', data);
713
-
701
+
714
702
  data.currentSrc = '';
715
-
703
+
716
704
  data.shadowElem.html('<div id="'+ elemId +'">');
717
-
705
+
718
706
  data.api = false;
719
707
  data.actionQueue = [];
720
708
  box = data.shadowElem;
@@ -743,7 +731,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
743
731
  value: elem
744
732
  },
745
733
  currentSrc: {
746
- value: canPlaySrc.srcProp
734
+ value: streamRequest ? '' : canPlaySrc.srcProp
747
735
  },
748
736
  swfCreated: {
749
737
  value: true
@@ -771,26 +759,27 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
771
759
  }
772
760
  }
773
761
  }));
774
-
775
-
776
-
762
+
763
+
764
+
777
765
  box.insertBefore(elem);
778
-
766
+
779
767
  if(hasNative){
780
768
  $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
781
769
  }
782
-
770
+
783
771
  webshims.addShadowDom(elem, box);
784
772
  if(!webshims.data(elem, 'mediaelement')){
785
773
  webshims.data(elem, 'mediaelement', data);
786
774
  }
787
775
  addMediaToStopEvents(elem);
788
-
776
+
789
777
  mediaelement.setActive(elem, 'third', data);
790
-
778
+
791
779
  setElementDimension(data, hasControls);
792
-
780
+
793
781
  $(elem)
782
+
794
783
  .on({
795
784
  'updatemediaelementdimensions loadedmetadata emptied': setDimension,
796
785
  'remove': function(e){
@@ -804,14 +793,13 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
804
793
  .onWSOff('updateshadowdom', setDimension)
805
794
  ;
806
795
  }
807
-
796
+
808
797
  if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
809
798
  webshims.error('something went wrong');
810
799
  return;
811
800
  } else if(!mediaelement.jarisEvent[data.id]){
812
-
801
+
813
802
  mediaelement.jarisEvent[data.id] = function(jaris){
814
-
815
803
  if(jaris.type == 'ready'){
816
804
  var onReady = function(){
817
805
  if(data.api){
@@ -836,11 +824,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
836
824
  if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
837
825
  onEvent.onDataInitialized(jaris, data);
838
826
  }
839
-
827
+
840
828
  if(!data._ppFlag && jaris.type != 'onPlayPause'){
841
829
  onEvent.onPlayPause(jaris, data);
842
830
  }
843
-
831
+
844
832
  if(onEvent[jaris.type]){
845
833
  onEvent[jaris.type](jaris, data);
846
834
  }
@@ -850,29 +838,68 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
850
838
  };
851
839
  mediaelement.jarisEvent[data.id].elem = elem;
852
840
  }
853
-
854
- $.extend(vars,
841
+
842
+ createSwf(elem, canPlaySrc, data, elemId, hasControls, elemNodeName);
843
+
844
+ if(!streamRequest){
845
+ trigger(data._elem, 'loadstart');
846
+ }
847
+ };
848
+
849
+ var createSwf = function(elem, canPlaySrc, data, elemId, hasControls, elemNodeName){
850
+ var vars, elemVars, params, attrs;
851
+ var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
852
+ var isUserStream = canPlaySrc.type == 'jarisplayer/stream';
853
+
854
+ vars = $.extend({}, options.vars, {
855
+ poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
856
+ source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
857
+ server: replaceVar(canPlaySrc.server || '')
858
+ });
859
+
860
+ elemVars = $(elem).data('vars') || {};
861
+
862
+ $.extend(vars,
855
863
  {
856
864
  id: elemId,
857
865
  evtId: data.id,
858
- controls: ''+hasControls,
866
+ controls: ''+(!isUserStream && hasControls),
859
867
  autostart: 'false',
860
868
  nodename: elemNodeName
861
869
  },
862
870
  elemVars
863
871
  );
864
-
872
+
865
873
  if(isRtmp){
866
874
  vars.streamtype = 'rtmp';
875
+ } else if(isUserStream){
876
+ vars.streamtype = 'usermedia';
867
877
  } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
868
878
  vars.type = 'audio';
869
879
  vars.streamtype = 'file';
870
880
  } else if(canPlaySrc.type == 'video/youtube'){
871
881
  vars.streamtype = 'youtube';
872
882
  }
883
+
884
+ attrs = $.extend(
885
+ {},
886
+ options.attrs,
887
+ {
888
+ name: elemId,
889
+ id: elemId
890
+ },
891
+ $(elem).data('attrs')
892
+ );
893
+
894
+ params = $.extend(
895
+ {},
896
+ options.params,
897
+ $(elem).data('params')
898
+ );
899
+
873
900
  options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
874
901
  clearTimeout(data.flashBlock);
875
-
902
+
876
903
  swfmini.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.115", false, vars, params, attrs, function(swfData){
877
904
  if(swfData.success){
878
905
  var fBlocker = function(){
@@ -884,13 +911,13 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
884
911
  $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
885
912
  };
886
913
  data.api = swfData.ref;
887
-
914
+
888
915
  if(!hasControls){
889
916
  $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
890
917
  }
891
-
918
+
892
919
  data.flashBlock = setTimeout(fBlocker, 99);
893
-
920
+
894
921
  if(!localConnectionTimer){
895
922
  clearTimeout(localConnectionTimer);
896
923
  localConnectionTimer = setTimeout(function(){
@@ -904,23 +931,24 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
904
931
  flash = null;
905
932
  }, 8000);
906
933
  }
934
+ if(isUserStream){
935
+ webshim.usermedia.request(elem, canPlaySrc, data);
936
+ }
907
937
  }
908
938
  });
909
-
910
- trigger(data._elem, 'loadstart');
911
939
  };
912
-
913
-
940
+
941
+
914
942
  var queueSwfMethod = function(elem, fn, args, data){
915
943
  data = data || getSwfDataFromElem(elem);
916
-
944
+
917
945
  if(data){
918
946
  if(data.api && data.api[fn]){
919
947
  data.api[fn].apply(data.api, args || []);
920
948
  } else {
921
949
  //todo add to queue
922
950
  data.actionQueue.push({fn: fn, args: args});
923
-
951
+
924
952
  if(data.actionQueue.length > 10){
925
953
  setTimeout(function(){
926
954
  if(data.actionQueue.length > 5){
@@ -933,13 +961,14 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
933
961
  }
934
962
  return false;
935
963
  };
936
-
964
+ mediaelement.queueSwfMethod = queueSwfMethod;
965
+
937
966
  ['audio', 'video'].forEach(function(nodeName){
938
967
  var descs = {};
939
968
  var mediaSup;
940
969
  var createGetProp = function(key){
941
970
  if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
942
-
971
+
943
972
  descs[key] = {
944
973
  get: function(){
945
974
  var data = getSwfDataFromElem(this);
@@ -959,33 +988,33 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
959
988
  delete descs[key].writeable;
960
989
  descs[key].set = setFn;
961
990
  };
962
-
991
+
963
992
  createGetSetProp('seeking');
964
-
993
+
965
994
  createGetSetProp('volume', function(v){
966
995
  var data = getSwfDataFromElem(this);
967
996
  if(data){
968
997
  v *= 1;
969
998
  if(!isNaN(v)){
970
-
999
+
971
1000
  if(v < 0 || v > 1){
972
1001
  webshims.error('volume greater or less than allowed '+ (v / 100));
973
1002
  }
974
-
1003
+
975
1004
  queueSwfMethod(this, 'api_volume', [v], data);
976
-
977
-
1005
+
1006
+
978
1007
  if(data.volume != v){
979
1008
  data.volume = v;
980
1009
  trigger(data._elem, 'volumechange');
981
1010
  }
982
1011
  data = null;
983
- }
1012
+ }
984
1013
  } else if(mediaSup.volume.prop._supset) {
985
1014
  return mediaSup.volume.prop._supset.apply(this, arguments);
986
1015
  }
987
1016
  });
988
-
1017
+
989
1018
  createGetSetProp('muted', function(m){
990
1019
  var data = getSwfDataFromElem(this);
991
1020
  if(data){
@@ -1000,8 +1029,8 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1000
1029
  return mediaSup.muted.prop._supset.apply(this, arguments);
1001
1030
  }
1002
1031
  });
1003
-
1004
-
1032
+
1033
+
1005
1034
  createGetSetProp('currentTime', function(t){
1006
1035
  var data = getSwfDataFromElem(this);
1007
1036
  if(data){
@@ -1009,23 +1038,23 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1009
1038
  if (!isNaN(t)) {
1010
1039
  queueSwfMethod(this, 'api_seek', [t], data);
1011
1040
  }
1012
-
1041
+
1013
1042
  } else if(mediaSup.currentTime.prop._supset) {
1014
1043
  return mediaSup.currentTime.prop._supset.apply(this, arguments);
1015
1044
  }
1016
1045
  });
1017
-
1046
+
1018
1047
  ['play', 'pause'].forEach(function(fn){
1019
1048
  descs[fn] = {
1020
1049
  value: function(){
1021
1050
  var data = getSwfDataFromElem(this);
1022
-
1051
+
1023
1052
  if(data){
1024
1053
  if(data.stopPlayPause){
1025
1054
  clearTimeout(data.stopPlayPause);
1026
1055
  }
1027
1056
  queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
1028
-
1057
+
1029
1058
  data._ppFlag = true;
1030
1059
  if(data.paused != (fn != 'play')){
1031
1060
  data.paused = fn != 'play';
@@ -1037,14 +1066,14 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1037
1066
  }
1038
1067
  };
1039
1068
  });
1040
-
1069
+
1041
1070
  getPropKeys.forEach(createGetProp);
1042
-
1071
+
1043
1072
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
1044
1073
  var data = getSwfDataFromElem(this);
1045
-
1074
+
1046
1075
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
1047
-
1076
+
1048
1077
  if(data){
1049
1078
  if(nodeName == 'audio'){
1050
1079
  setElementDimension(data, boolProp);
@@ -1052,12 +1081,12 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1052
1081
  queueSwfMethod(this, 'api_controls', [boolProp], data);
1053
1082
  }
1054
1083
  });
1055
-
1056
-
1084
+
1085
+
1057
1086
  webshims.onNodeNamesPropertyModify(nodeName, 'preload', function(val){
1058
1087
  var data, baseData, elem;
1059
-
1060
-
1088
+
1089
+
1061
1090
  if(bufferSrc(this)){
1062
1091
  data = getSwfDataFromElem(this);
1063
1092
  if(data){
@@ -1072,9 +1101,9 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1072
1101
  }
1073
1102
  }
1074
1103
  });
1075
-
1104
+
1076
1105
  mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
1077
-
1106
+
1078
1107
  if(!support.mediaDefaultMuted){
1079
1108
  webshims.defineNodeNameProperties(nodeName, {
1080
1109
  defaultMuted: {
@@ -1092,8 +1121,68 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1092
1121
  }, 'prop');
1093
1122
  }
1094
1123
  });
1095
-
1096
-
1124
+
1125
+ var addCanvasBridge = function(){
1126
+ if(!window.CanvasRenderingContext2D){
1127
+ return false;
1128
+ }
1129
+ var _drawImage = CanvasRenderingContext2D.prototype.drawImage;
1130
+ var slice = Array.prototype.slice;
1131
+ var isVideo = {
1132
+ video: 1,
1133
+ VIDEO: 1
1134
+ };
1135
+ var tested = {};
1136
+
1137
+ if(!_drawImage){
1138
+ webshim.error('canvas.drawImage feature is needed. In IE8 flashvanvas pro can be used');
1139
+ }
1140
+
1141
+ CanvasRenderingContext2D.prototype.drawImage = function(elem){
1142
+ var data, img, args, imgData;
1143
+ var context = this;
1144
+
1145
+ if(isVideo[elem.nodeName] && (data = webshims.data(elem, 'mediaelement')) && data.isActive == 'third' && data.api.api_image){
1146
+
1147
+ try {
1148
+ imgData = data.api.api_image();
1149
+ } catch (er){
1150
+ webshims.error(er);
1151
+ }
1152
+ if(!tested[data.currentSrc]){
1153
+ tested[data.currentSrc] = true;
1154
+ if(imgData == null){
1155
+ webshims.error('video has to be same origin or a crossdomain.xml has to be provided. Video has to be visible for flash API');
1156
+ }
1157
+ }
1158
+
1159
+ args = slice.call(arguments, 1);
1160
+ img = new Image();
1161
+
1162
+ //todo find a performant sync way
1163
+ img.onload = function(){
1164
+ args.unshift(this);
1165
+ _drawImage.apply(context, args);
1166
+ img.onload = null;
1167
+ };
1168
+
1169
+ img.src = 'data:image/jpeg;base64,'+imgData;
1170
+
1171
+ if(img.complete){
1172
+ img.onload();
1173
+ }
1174
+ return;
1175
+ }
1176
+ return _drawImage.apply(this, arguments);
1177
+ };
1178
+ return true;
1179
+ };
1180
+
1181
+ if(!addCanvasBridge()){
1182
+ webshims.ready('canvas', addCanvasBridge);
1183
+ }
1184
+
1185
+
1097
1186
  if(hasFlash && $.cleanData){
1098
1187
  var oldClean = $.cleanData;
1099
1188
  var objElem = document.createElement('object');
@@ -1107,12 +1196,12 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1107
1196
  object: 1,
1108
1197
  OBJECT: 1
1109
1198
  };
1110
-
1199
+
1111
1200
  $.cleanData = function(elems){
1112
1201
  var i, len, prop;
1113
1202
  var ret = oldClean.apply(this, arguments);
1114
1203
  if(elems && (len = elems.length) && loadedSwf){
1115
-
1204
+
1116
1205
  for(i = 0; i < len; i++){
1117
1206
  if(flashNames[elems[i].nodeName] && 'api_destroy' in elems[i]){
1118
1207
  loadedSwf--;
@@ -1128,14 +1217,14 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1128
1217
  } catch(er){console.log(er);}
1129
1218
  }
1130
1219
  }
1131
-
1220
+
1132
1221
  }
1133
1222
  return ret;
1134
1223
  };
1135
1224
  }
1136
1225
 
1137
1226
  if(!hasNative){
1138
-
1227
+
1139
1228
  ['poster', 'src'].forEach(function(prop){
1140
1229
  webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
1141
1230
  //attr: {},
@@ -1143,21 +1232,21 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1143
1232
  propType: 'src'
1144
1233
  });
1145
1234
  });
1146
-
1235
+
1147
1236
  webshims.defineNodeNamesProperty(['audio', 'video'], 'preload', {
1148
1237
  reflect: true,
1149
1238
  propType: 'enumarated',
1150
1239
  defaultValue: '',
1151
1240
  limitedTo: ['', 'auto', 'metadata', 'none']
1152
1241
  });
1153
-
1242
+
1154
1243
  webshims.reflectProperties('source', ['type', 'media']);
1155
-
1156
-
1244
+
1245
+
1157
1246
  ['autoplay', 'controls'].forEach(function(name){
1158
1247
  webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
1159
1248
  });
1160
-
1249
+
1161
1250
  webshims.defineNodeNamesProperties(['audio', 'video'], {
1162
1251
  HAVE_CURRENT_DATA: {
1163
1252
  value: 2
@@ -1186,7 +1275,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1186
1275
  NETWORK_NO_SOURCE: {
1187
1276
  value: 3
1188
1277
  }
1189
-
1278
+
1190
1279
  }, 'prop');
1191
1280
 
1192
1281
 
@@ -1212,7 +1301,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
1212
1301
  var media, error, parent;
1213
1302
  if(
1214
1303
  ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source', parent).last()[0] == e.target)) &&
1215
- (media = $(e.target).closest('audio, video')) && !media.hasClass('nonnative-api-active')
1304
+ (media = $(e.target).closest('audio, video')) && !media.hasClass('nonnative-api-active')
1216
1305
  ){
1217
1306
  error = media.prop('error');
1218
1307
  setTimeout(function(){