webshims-rails 1.14.5 → 1.14.6

Sign up to get free protection for your applications and to get access to all the features.
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(){