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
@@ -604,11 +604,29 @@ webshims.register('details', function($, webshims, window, doc, undefined, optio
604
604
  webshims.error('you must provide a language for track in subtitles state');
605
605
  }
606
606
  obj.__wsmode = obj.mode;
607
+
608
+ webshims.defineProperty(obj, '_wsUpdateMode', {
609
+ value: function(){
610
+ $(mediaelem).triggerHandler('updatetrackdisplay');
611
+ },
612
+ enumerable: false
613
+ });
607
614
  }
608
615
 
609
616
  return obj;
610
617
  };
611
618
 
619
+ if(!$.propHooks.mode){
620
+ $.propHooks.mode = {
621
+ set: function(obj, value){
622
+ obj.mode = value;
623
+ if(obj._wsUpdateMode && obj._wsUpdateMode.call){
624
+ obj._wsUpdateMode();
625
+ }
626
+ return obj.mode;
627
+ }
628
+ };
629
+ }
612
630
 
613
631
  /*
614
632
  taken from:
@@ -859,7 +877,7 @@ modified for webshims
859
877
  var name = copyName[copyProp] || copyProp;
860
878
  webshims.onNodeNamesPropertyModify('track', copyProp, function(){
861
879
  var trackData = webshims.data(this, 'trackData');
862
- var track = this;
880
+
863
881
  if(trackData){
864
882
  if(copyProp == 'kind'){
865
883
  refreshTrack(this, trackData);
@@ -282,7 +282,7 @@ webshims.isReady('swfmini', true);
282
282
  }
283
283
 
284
284
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined, options){
285
- var hasSwf = swfmini.hasFlashPlayerVersion('10.0.3');
285
+ var hasSwf = swfmini.hasFlashPlayerVersion('11.3');
286
286
  var mediaelement = webshims.mediaelement;
287
287
 
288
288
  mediaelement.parseRtmp = function(data){
@@ -392,6 +392,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
392
392
  loadYt();
393
393
  }
394
394
  };
395
+
395
396
 
396
397
  webshims.addPolyfill('mediaelement-yt', {
397
398
  test: !hasYt,
@@ -436,7 +437,16 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
436
437
  if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
437
438
  return 'video/youtube';
438
439
  }
439
- if(src.indexOf('rtmp') === 0){
440
+
441
+ if(!src.indexOf('mediastream:') || !src.indexOf('blob:http')){
442
+ return 'usermedia';
443
+ }
444
+
445
+ if(!src.indexOf('webshimstream')){
446
+ return 'jarisplayer/stream';
447
+ }
448
+
449
+ if(!src.indexOf('rtmp')){
440
450
  return nodeName+'/rtmp';
441
451
  }
442
452
  src = src.split('?')[0].split('#')[0].split('.');
@@ -453,28 +463,24 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
453
463
  };
454
464
 
455
465
 
456
- mediaelement.srces = function(mediaElem, srces){
466
+ mediaelement.srces = function(mediaElem){
467
+ var srces = [];
457
468
  mediaElem = $(mediaElem);
458
- if(!srces){
459
- srces = [];
460
- var nodeName = mediaElem[0].nodeName.toLowerCase();
461
- var src = getSrcObj(mediaElem, nodeName);
462
-
463
- if(!src.src){
464
- $('source', mediaElem).each(function(){
465
- src = getSrcObj(this, nodeName);
466
- if(src.src){srces.push(src);}
467
- });
468
- } else {
469
- srces.push(src);
470
- }
471
- return srces;
469
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
470
+ var src = getSrcObj(mediaElem, nodeName);
471
+
472
+ if(!src.src){
473
+ $('source', mediaElem).each(function(){
474
+ src = getSrcObj(this, nodeName);
475
+ if(src.src){srces.push(src);}
476
+ });
472
477
  } else {
473
- webshims.error('setting sources was removed.');
478
+ srces.push(src);
474
479
  }
480
+ return srces;
475
481
  };
476
482
 
477
- 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'];
483
+ 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'];
478
484
 
479
485
  mediaelement.canThirdPlaySrces = function(mediaElem, srces){
480
486
  var ret = '';
@@ -504,7 +510,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
504
510
  srces = srces || mediaelement.srces(mediaElem);
505
511
 
506
512
  $.each(srces, function(i, src){
507
- if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
513
+ if(src.type == 'usermedia' || (src.type && nativeCanPlay.call(mediaElem[0], src.type)) ){
508
514
  ret = src;
509
515
  return false;
510
516
  }
@@ -60,7 +60,6 @@
60
60
  webshims.register('dom-extend', function($, webshims, window, document, undefined){
61
61
  "use strict";
62
62
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
63
- var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
64
63
  var has = Object.prototype.hasOwnProperty;
65
64
  webshims.assumeARIA = true;
66
65
 
@@ -91,7 +90,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
91
90
  }
92
91
 
93
92
  //shortcus
94
- var modules = webshims.modules;
95
93
  var listReg = /\s*,\s*/;
96
94
 
97
95
  //proxying attribute
@@ -476,8 +474,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
476
474
  (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
477
475
  }
478
476
  };
479
-
480
- var elementExtends = {};
477
+
481
478
  return {
482
479
  createTmpCache: function(nodeName){
483
480
  if($.isDOMReady){
@@ -529,6 +526,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
529
526
  };
530
527
 
531
528
  $.extend(webshims, {
529
+ xProps: havePolyfill,
532
530
  getID: (function(){
533
531
  var ID = new Date().getTime();
534
532
  return function(elem){
@@ -542,6 +540,26 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
542
540
  return id;
543
541
  };
544
542
  })(),
543
+ domPrefixes: ["ws", "webkit", "moz", "ms", "o"],
544
+
545
+ prefixed: function (prop, obj){
546
+ var i, testProp;
547
+ var ret = false;
548
+ if(obj[prop]){
549
+ ret = prop;
550
+ }
551
+ if(!ret){
552
+ prop = prop.charAt(0).toUpperCase() + prop.slice(1);
553
+ for(i = 0; i < webshims.domPrefixes.length; i++){
554
+ testProp = webshims.domPrefixes[i]+prop;
555
+ if(testProp in obj){
556
+ ret = testProp;
557
+ break;
558
+ }
559
+ }
560
+ }
561
+ return ret;
562
+ },
545
563
  shadowClass: 'wsshadow-'+(Date.now()),
546
564
  implement: function(elem, type){
547
565
  var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
@@ -1659,35 +1677,40 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1659
1677
  } catch(e){}
1660
1678
  printMessage();
1661
1679
  if(hasXDomain == null){
1662
- $.ajax({
1663
- url: 'crossdomain.xml',
1664
- type: 'HEAD',
1665
- dataType: 'xml',
1666
- success: function(){
1667
- hasXDomain = 'yes';
1668
- },
1669
- error: function(){
1670
- hasXDomain = 'no';
1671
- },
1672
- complete: function(){
1673
- try {
1674
- sessionStorage.setItem('wsXdomain.xml', hasXDomain);
1675
- } catch(e){}
1676
- printMessage();
1677
- }
1678
- });
1680
+ try {
1681
+ $.ajax({
1682
+ url: 'crossdomain.xml',
1683
+ type: 'HEAD',
1684
+ dataType: 'xml',
1685
+ success: function(){
1686
+ hasXDomain = 'yes';
1687
+ },
1688
+ error: function(){
1689
+ hasXDomain = 'no';
1690
+ },
1691
+ complete: function(){
1692
+ try {
1693
+ sessionStorage.setItem('wsXdomain.xml', hasXDomain);
1694
+ } catch(e){}
1695
+ printMessage();
1696
+ }
1697
+ });
1698
+ } catch(e){}
1679
1699
  }
1680
1700
  });
1681
1701
  }
1702
+ if(document.readyState == 'complete'){
1703
+ webshims.isReady('WINDOWLOAD', true);
1704
+ }
1682
1705
  });
1683
1706
  ;webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
1684
1707
  "use strict";
1685
-
1708
+
1686
1709
  var mediaelement = webshims.mediaelement;
1687
1710
  var swfmini = window.swfmini;
1688
1711
  var support = webshims.support;
1689
1712
  var hasNative = support.mediaelement;
1690
- var hasFlash = swfmini.hasFlashPlayerVersion('9.0.115');
1713
+ var hasFlash = swfmini.hasFlashPlayerVersion('11.3');
1691
1714
  var loadedSwf = 0;
1692
1715
  var needsLoadPreload = 'ActiveXObject' in window && hasNative;
1693
1716
  var getProps = {
@@ -1720,18 +1743,19 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1720
1743
  }
1721
1744
  };
1722
1745
  var getPropKeys = Object.keys(getProps);
1723
-
1746
+
1724
1747
  var getSetProps = {
1725
1748
  currentTime: 0,
1726
1749
  volume: 1,
1727
1750
  muted: false
1728
1751
  };
1729
1752
  var getSetPropKeys = Object.keys(getSetProps);
1730
-
1753
+
1731
1754
  var playerStateObj = $.extend({
1732
1755
  isActive: 'html5',
1733
- activating: 'html5',
1756
+ activating: 'html5',
1734
1757
  wasSwfReady: false,
1758
+ _usermedia: null,
1735
1759
  _bufferedEnd: 0,
1736
1760
  _bufferedStart: 0,
1737
1761
  currentTime: 0,
@@ -1741,8 +1765,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1741
1765
  lastDuration: 0,
1742
1766
  _timeDif: 0.3
1743
1767
  }, getProps, getSetProps);
1744
-
1745
-
1768
+
1769
+
1746
1770
  var getSwfDataFromElem = function(elem){
1747
1771
  try {
1748
1772
  (elem.nodeName);
@@ -1752,15 +1776,15 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1752
1776
  var data = webshims.data(elem, 'mediaelement');
1753
1777
  return (data && data.isActive == 'third') ? data : null;
1754
1778
  };
1755
-
1779
+
1756
1780
  var trigger = function(elem, evt){
1757
1781
  evt = $.Event(evt);
1758
1782
  evt.preventDefault();
1759
1783
  $.event.trigger(evt, undefined, elem);
1760
1784
  };
1761
-
1785
+
1762
1786
  var playerSwfPath = options.playerPath || webshims.cfg.basePath + "swf/" + (options.playerName || 'JarisFLVPlayer.swf');
1763
-
1787
+
1764
1788
  webshims.extendUNDEFProp(options.params, {
1765
1789
  allowscriptaccess: 'always',
1766
1790
  allowfullscreen: 'true',
@@ -1774,7 +1798,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1774
1798
  webshims.extendUNDEFProp(options.attrs, {
1775
1799
  bgcolor: '#000000'
1776
1800
  });
1777
-
1801
+ options.playerPath = playerSwfPath;
1802
+
1778
1803
  var setReadyState = function(readyState, data){
1779
1804
  if(readyState < 3){
1780
1805
  clearTimeout(data._canplaythroughTimer);
@@ -1802,8 +1827,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1802
1827
  $(data._elem).triggerHandler('seeked');
1803
1828
  }
1804
1829
  };
1805
-
1806
-
1830
+
1831
+
1807
1832
  mediaelement.jarisEvent = {};
1808
1833
  var localConnectionTimer;
1809
1834
  var onEvent = {
@@ -1818,7 +1843,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1818
1843
  playing = override;
1819
1844
  }
1820
1845
  if(playing == idled || playing == null){
1821
-
1846
+
1822
1847
  data.paused = !playing;
1823
1848
  type = data.paused ? 'pause' : 'play';
1824
1849
  data._ppFlag = true;
@@ -1833,7 +1858,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1833
1858
  },
1834
1859
  onSeek: function(jaris, data){
1835
1860
  data._lastSeektime = jaris.seekTime;
1836
-
1861
+
1837
1862
  data.seeking = true;
1838
1863
  $(data._elem).triggerHandler('seeking');
1839
1864
  clearTimeout(data._seekedTimer);
@@ -1849,19 +1874,19 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1849
1874
  setReadyState(3, data);
1850
1875
  },
1851
1876
  onDataInitialized: function(jaris, data){
1852
-
1877
+
1853
1878
  var oldDur = data.duration;
1854
1879
  var durDelta;
1855
1880
  data.duration = jaris.duration;
1856
1881
  if(oldDur == data.duration || isNaN(data.duration)){return;}
1857
-
1882
+
1858
1883
  if(data._calledMeta && ((durDelta = Math.abs(data.lastDuration - data.duration)) < 2)){return;}
1859
-
1860
-
1861
-
1884
+
1885
+
1886
+
1862
1887
  data.videoHeight = jaris.height;
1863
1888
  data.videoWidth = jaris.width;
1864
-
1889
+
1865
1890
  if(!data.networkState){
1866
1891
  data.networkState = 2;
1867
1892
  }
@@ -1917,7 +1942,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1917
1942
  data.lastCalledTime = data.currentTime;
1918
1943
  $.event.trigger('timeupdate', undefined, data._elem, true);
1919
1944
  }
1920
-
1945
+
1921
1946
  },
1922
1947
  onProgress: function(jaris, data){
1923
1948
  if(data.ended){
@@ -1927,7 +1952,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1927
1952
  return;
1928
1953
  }
1929
1954
  var percentage = jaris.loaded / jaris.total;
1930
-
1955
+
1931
1956
  if(percentage > 0.02 && percentage < 0.2){
1932
1957
  setReadyState(3, data);
1933
1958
  } else if(percentage > 0.2){
@@ -1940,10 +1965,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1940
1965
  if(data._bufferedEnd && (data._bufferedEnd > percentage)){
1941
1966
  data._bufferedStart = data.currentTime || 0;
1942
1967
  }
1943
-
1968
+
1944
1969
  data._bufferedEnd = percentage;
1945
1970
  data.buffered.length = 1;
1946
-
1971
+
1947
1972
  $.event.trigger('progress', undefined, data._elem, true);
1948
1973
  },
1949
1974
  onPlaybackFinished: function(jaris, data){
@@ -1963,7 +1988,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1963
1988
  ready: (function(){
1964
1989
  var testAPI = function(data){
1965
1990
  var passed = true;
1966
-
1991
+
1967
1992
  try {
1968
1993
  data.api.api_get('volume');
1969
1994
  } catch(er){
@@ -1971,17 +1996,17 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1971
1996
  }
1972
1997
  return passed;
1973
1998
  };
1974
-
1999
+
1975
2000
  return function(jaris, data){
1976
2001
  var i = 0;
1977
-
2002
+
1978
2003
  var doneFn = function(){
1979
2004
  if(i > 9){
1980
2005
  data.tryedReframeing = 0;
1981
2006
  return;
1982
2007
  }
1983
2008
  i++;
1984
-
2009
+
1985
2010
  data.tryedReframeing++;
1986
2011
  if(testAPI(data)){
1987
2012
  data.wasSwfReady = true;
@@ -2011,25 +2036,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2011
2036
  clearTimeout(localConnectionTimer);
2012
2037
  clearTimeout(data.reframeTimer);
2013
2038
  data.shadowElem.removeClass('flashblocker-assumed');
2014
-
2039
+
2015
2040
  if(!i){
2016
2041
  doneFn();
2017
2042
  } else {
2018
2043
  data.reframeTimer = setTimeout(doneFn, 9);
2019
2044
  }
2020
-
2045
+
2021
2046
  };
2022
2047
  })()
2023
2048
  };
2024
-
2049
+
2025
2050
  onEvent.onMute = onEvent.onVolumeChange;
2026
-
2027
-
2051
+ mediaelement.onEvent = onEvent;
2052
+
2028
2053
  var workActionQueue = function(data){
2029
2054
  var actionLen = data.actionQueue.length;
2030
2055
  var i = 0;
2031
2056
  var operation;
2032
-
2057
+
2033
2058
  if(actionLen && data.isActive == 'third'){
2034
2059
  while(data.actionQueue.length && actionLen > i){
2035
2060
  i++;
@@ -2050,7 +2075,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2050
2075
  if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
2051
2076
  setTimeout(function(){
2052
2077
  if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
2053
-
2078
+
2054
2079
  try {
2055
2080
  $(data._elem).play();
2056
2081
  data._ppFlag = true;
@@ -2058,7 +2083,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2058
2083
  }
2059
2084
  }, 1);
2060
2085
  }
2061
-
2086
+
2062
2087
  if(data.muted){
2063
2088
  $.prop(data._elem, 'muted', true);
2064
2089
  }
@@ -2066,8 +2091,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2066
2091
  $.prop(data._elem, 'volume', data.volume);
2067
2092
  }
2068
2093
  };
2069
-
2070
-
2094
+
2095
+
2071
2096
  var addMediaToStopEvents = $.noop;
2072
2097
  if(hasNative){
2073
2098
  var stopEvents = {
@@ -2078,14 +2103,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2078
2103
  var hidevents = hideEvtArray.map(function(evt){
2079
2104
  return evt +'.webshimspolyfill';
2080
2105
  }).join(' ');
2081
-
2106
+
2082
2107
  var hidePlayerEvents = function(event){
2083
2108
  var data = webshims.data(event.target, 'mediaelement');
2084
2109
  if(!data){return;}
2085
2110
  var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
2086
2111
  if( isNativeHTML5 == (data.activating == 'third') ){
2087
2112
  event.stopImmediatePropagation();
2088
-
2113
+
2089
2114
  if(stopEvents[event.type]){
2090
2115
  if(data.isActive != data.activating){
2091
2116
  $(event.target).pause();
@@ -2095,7 +2120,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2095
2120
  }
2096
2121
  }
2097
2122
  };
2098
-
2123
+
2099
2124
  addMediaToStopEvents = function(elem){
2100
2125
  $(elem)
2101
2126
  .off(hidevents)
@@ -2107,8 +2132,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2107
2132
  };
2108
2133
  addMediaToStopEvents(document);
2109
2134
  }
2110
-
2111
-
2135
+
2136
+
2112
2137
  mediaelement.setActive = function(elem, type, data){
2113
2138
  if(!data){
2114
2139
  data = webshims.data(elem, 'mediaelement');
@@ -2130,14 +2155,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2130
2155
  }
2131
2156
  $(elem).trigger('mediaelementapichange');
2132
2157
  };
2133
-
2134
-
2135
-
2158
+
2159
+
2160
+
2136
2161
  var resetSwfProps = (function(){
2137
- var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', 'lastCalledTime', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
2162
+ var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', 'lastCalledTime', '_usermedia', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
2138
2163
  var len = resetProtoProps.length;
2139
2164
  return function(data){
2140
-
2165
+
2141
2166
  if(!data){return;}
2142
2167
  clearTimeout(data._seekedTimer);
2143
2168
  var lenI = len;
@@ -2154,8 +2179,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2154
2179
  }
2155
2180
  };
2156
2181
  })();
2157
-
2158
-
2182
+
2183
+
2159
2184
  var getComputedDimension = (function(){
2160
2185
  var dimCache = {};
2161
2186
  var getVideoDims = function(data){
@@ -2177,7 +2202,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2177
2202
  width: this.width,
2178
2203
  height: this.height
2179
2204
  };
2180
-
2205
+
2181
2206
  if(dimCache[poster].height && dimCache[poster].width){
2182
2207
  setElementDimension(data, $.prop(data._elem, 'controls'));
2183
2208
  } else {
@@ -2193,12 +2218,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2193
2218
  }
2194
2219
  return ret || {width: 300, height: data._elemNodeName == 'video' ? 150 : 50};
2195
2220
  };
2196
-
2221
+
2197
2222
  var getCssStyle = function(elem, style){
2198
2223
  return elem.style[style] || (elem.currentStyle && elem.currentStyle[style]) || (window.getComputedStyle && (window.getComputedStyle( elem, null ) || {} )[style]) || '';
2199
2224
  };
2200
2225
  var minMaxProps = ['minWidth', 'maxWidth', 'minHeight', 'maxHeight'];
2201
-
2226
+
2202
2227
  var addMinMax = function(elem, ret){
2203
2228
  var i, prop;
2204
2229
  var hasMinMax = false;
@@ -2212,7 +2237,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2212
2237
  return hasMinMax;
2213
2238
  };
2214
2239
  var retFn = function(data){
2215
- var videoDims, ratio, hasMinMax;
2240
+ var videoDims, ratio;
2216
2241
  var elem = data._elem;
2217
2242
  var autos = {
2218
2243
  width: getCssStyle(elem, 'width') == 'auto',
@@ -2222,11 +2247,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2222
2247
  width: !autos.width && $(elem).width(),
2223
2248
  height: !autos.height && $(elem).height()
2224
2249
  };
2225
-
2250
+
2226
2251
  if(autos.width || autos.height){
2227
2252
  videoDims = getVideoDims(data);
2228
2253
  ratio = videoDims.width / videoDims.height;
2229
-
2254
+
2230
2255
  if(autos.width && autos.height){
2231
2256
  ret.width = videoDims.width;
2232
2257
  ret.height = videoDims.height;
@@ -2235,12 +2260,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2235
2260
  } else if(autos.height){
2236
2261
  ret.height = ret.width / ratio;
2237
2262
  }
2238
-
2263
+
2239
2264
  if(addMinMax(elem, ret)){
2240
2265
  data.shadowElem.css(ret);
2241
2266
  if(autos.width){
2242
2267
  ret.width = data.shadowElem.height() * ratio;
2243
- }
2268
+ }
2244
2269
  if(autos.height){
2245
2270
  ret.height = ((autos.width) ? ret.width : data.shadowElem.width()) / ratio;
2246
2271
  }
@@ -2248,11 +2273,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2248
2273
  data.shadowElem.css(ret);
2249
2274
  ret.height = data.shadowElem.width() / ratio;
2250
2275
  ret.width = ret.height * ratio;
2251
-
2276
+
2252
2277
  data.shadowElem.css(ret);
2253
2278
  ret.width = data.shadowElem.height() * ratio;
2254
2279
  ret.height = ret.width / ratio;
2255
-
2280
+
2256
2281
  }
2257
2282
  if(!webshims.support.mediaelement){
2258
2283
  ret.width = data.shadowElem.width();
@@ -2262,13 +2287,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2262
2287
  }
2263
2288
  return ret;
2264
2289
  };
2265
-
2290
+
2266
2291
  return retFn;
2267
2292
  })();
2268
-
2293
+
2269
2294
  var setElementDimension = function(data, hasControls){
2270
2295
  var dims;
2271
-
2296
+
2272
2297
  var box = data.shadowElem;
2273
2298
  $(data._elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
2274
2299
 
@@ -2283,7 +2308,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2283
2308
  }
2284
2309
  }
2285
2310
  };
2286
-
2311
+
2287
2312
  var bufferSrc = (function(){
2288
2313
  var preloads = {
2289
2314
  '': 1,
@@ -2298,17 +2323,17 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2298
2323
  return !!(preloads[preload] || (preload == 'metadata' && $(elem).is('.preload-in-doubt, video:not([poster])')));
2299
2324
  };
2300
2325
  })();
2301
-
2326
+
2302
2327
  var regs = {
2303
- A: /&amp;/g,
2304
- a: /&/g,
2305
- e: /\=/g,
2306
- q: /\?/g
2307
- },
2308
- replaceVar = function(val){
2309
- return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
2310
- };
2311
-
2328
+ A: /&amp;/g,
2329
+ a: /&/g,
2330
+ e: /\=/g,
2331
+ q: /\?/g
2332
+ },
2333
+ replaceVar = function(val){
2334
+ return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
2335
+ };
2336
+
2312
2337
  if('matchMedia' in window){
2313
2338
  var allowMediaSorting = false;
2314
2339
  try {
@@ -2322,14 +2347,15 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2322
2347
  } catch(er){
2323
2348
  return 0;
2324
2349
  }
2325
- return src1 == src2 ?
2350
+ return src1 == src2 ?
2326
2351
  0 :
2327
2352
  src1 ? -1
2328
- : 1;
2353
+ : 1;
2329
2354
  };
2330
2355
  }
2331
2356
  }
2332
2357
 
2358
+ mediaelement.resetSwfProps = resetSwfProps;
2333
2359
  mediaelement.createSWF = function( elem, canPlaySrc, data ){
2334
2360
  if(!hasFlash){
2335
2361
  setTimeout(function(){
@@ -2337,7 +2363,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2337
2363
  }, 1);
2338
2364
  return;
2339
2365
  }
2340
-
2366
+
2341
2367
  var attrStyle = {};
2342
2368
 
2343
2369
  if(loadedSwf < 1){
@@ -2348,55 +2374,40 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2348
2374
  if(!data){
2349
2375
  data = webshims.data(elem, 'mediaelement');
2350
2376
  }
2351
-
2377
+
2352
2378
  if((attrStyle.height = $.attr(elem, 'height') || '') || (attrStyle.width = $.attr(elem, 'width') || '')){
2353
2379
  $(elem).css(attrStyle);
2354
2380
  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.");
2355
2381
  }
2356
-
2357
- var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
2358
- var vars = $.extend({}, options.vars, {
2359
- poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
2360
- source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
2361
- server: replaceVar(canPlaySrc.server || '')
2362
- });
2363
- var elemVars = $(elem).data('vars') || {};
2364
-
2365
-
2366
-
2382
+ var box;
2383
+ var streamRequest = canPlaySrc.streamrequest;
2384
+ var isStream = canPlaySrc.type == 'jarisplayer/stream';
2385
+
2386
+
2367
2387
  var hasControls = $.prop(elem, 'controls');
2368
2388
  var elemId = 'jarisplayer-'+ webshims.getID(elem);
2369
-
2370
- var params = $.extend(
2371
- {},
2372
- options.params,
2373
- $(elem).data('params')
2374
- );
2389
+
2390
+
2375
2391
  var elemNodeName = elem.nodeName.toLowerCase();
2376
- var attrs = $.extend(
2377
- {},
2378
- options.attrs,
2379
- {
2380
- name: elemId,
2381
- id: elemId
2382
- },
2383
- $(elem).data('attrs')
2384
- );
2392
+
2385
2393
  var setDimension = function(){
2386
2394
  if(data.isActive == 'third'){
2387
2395
  setElementDimension(data, $.prop(elem, 'controls'));
2388
2396
  }
2389
2397
  };
2390
-
2391
- var box;
2392
-
2398
+
2399
+ if(isStream && !streamRequest){
2400
+ webshim.usermedia.attach(elem, canPlaySrc, data);
2401
+ return;
2402
+ }
2403
+
2393
2404
  if(data && data.swfCreated){
2394
2405
  mediaelement.setActive(elem, 'third', data);
2395
-
2406
+
2396
2407
  data.currentSrc = '';
2397
-
2408
+
2398
2409
  data.shadowElem.html('<div id="'+ elemId +'">');
2399
-
2410
+
2400
2411
  data.api = false;
2401
2412
  data.actionQueue = [];
2402
2413
  box = data.shadowElem;
@@ -2425,7 +2436,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2425
2436
  value: elem
2426
2437
  },
2427
2438
  currentSrc: {
2428
- value: canPlaySrc.srcProp
2439
+ value: streamRequest ? '' : canPlaySrc.srcProp
2429
2440
  },
2430
2441
  swfCreated: {
2431
2442
  value: true
@@ -2453,26 +2464,27 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2453
2464
  }
2454
2465
  }
2455
2466
  }));
2456
-
2457
-
2458
-
2467
+
2468
+
2469
+
2459
2470
  box.insertBefore(elem);
2460
-
2471
+
2461
2472
  if(hasNative){
2462
2473
  $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
2463
2474
  }
2464
-
2475
+
2465
2476
  webshims.addShadowDom(elem, box);
2466
2477
  if(!webshims.data(elem, 'mediaelement')){
2467
2478
  webshims.data(elem, 'mediaelement', data);
2468
2479
  }
2469
2480
  addMediaToStopEvents(elem);
2470
-
2481
+
2471
2482
  mediaelement.setActive(elem, 'third', data);
2472
-
2483
+
2473
2484
  setElementDimension(data, hasControls);
2474
-
2485
+
2475
2486
  $(elem)
2487
+
2476
2488
  .on({
2477
2489
  'updatemediaelementdimensions loadedmetadata emptied': setDimension,
2478
2490
  'remove': function(e){
@@ -2486,14 +2498,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2486
2498
  .onWSOff('updateshadowdom', setDimension)
2487
2499
  ;
2488
2500
  }
2489
-
2501
+
2490
2502
  if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
2491
2503
  webshims.error('something went wrong');
2492
2504
  return;
2493
2505
  } else if(!mediaelement.jarisEvent[data.id]){
2494
-
2506
+
2495
2507
  mediaelement.jarisEvent[data.id] = function(jaris){
2496
-
2497
2508
  if(jaris.type == 'ready'){
2498
2509
  var onReady = function(){
2499
2510
  if(data.api){
@@ -2518,11 +2529,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2518
2529
  if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
2519
2530
  onEvent.onDataInitialized(jaris, data);
2520
2531
  }
2521
-
2532
+
2522
2533
  if(!data._ppFlag && jaris.type != 'onPlayPause'){
2523
2534
  onEvent.onPlayPause(jaris, data);
2524
2535
  }
2525
-
2536
+
2526
2537
  if(onEvent[jaris.type]){
2527
2538
  onEvent[jaris.type](jaris, data);
2528
2539
  }
@@ -2532,29 +2543,68 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2532
2543
  };
2533
2544
  mediaelement.jarisEvent[data.id].elem = elem;
2534
2545
  }
2535
-
2536
- $.extend(vars,
2546
+
2547
+ createSwf(elem, canPlaySrc, data, elemId, hasControls, elemNodeName);
2548
+
2549
+ if(!streamRequest){
2550
+ trigger(data._elem, 'loadstart');
2551
+ }
2552
+ };
2553
+
2554
+ var createSwf = function(elem, canPlaySrc, data, elemId, hasControls, elemNodeName){
2555
+ var vars, elemVars, params, attrs;
2556
+ var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
2557
+ var isUserStream = canPlaySrc.type == 'jarisplayer/stream';
2558
+
2559
+ vars = $.extend({}, options.vars, {
2560
+ poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
2561
+ source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
2562
+ server: replaceVar(canPlaySrc.server || '')
2563
+ });
2564
+
2565
+ elemVars = $(elem).data('vars') || {};
2566
+
2567
+ $.extend(vars,
2537
2568
  {
2538
2569
  id: elemId,
2539
2570
  evtId: data.id,
2540
- controls: ''+hasControls,
2571
+ controls: ''+(!isUserStream && hasControls),
2541
2572
  autostart: 'false',
2542
2573
  nodename: elemNodeName
2543
2574
  },
2544
2575
  elemVars
2545
2576
  );
2546
-
2577
+
2547
2578
  if(isRtmp){
2548
2579
  vars.streamtype = 'rtmp';
2580
+ } else if(isUserStream){
2581
+ vars.streamtype = 'usermedia';
2549
2582
  } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
2550
2583
  vars.type = 'audio';
2551
2584
  vars.streamtype = 'file';
2552
2585
  } else if(canPlaySrc.type == 'video/youtube'){
2553
2586
  vars.streamtype = 'youtube';
2554
2587
  }
2588
+
2589
+ attrs = $.extend(
2590
+ {},
2591
+ options.attrs,
2592
+ {
2593
+ name: elemId,
2594
+ id: elemId
2595
+ },
2596
+ $(elem).data('attrs')
2597
+ );
2598
+
2599
+ params = $.extend(
2600
+ {},
2601
+ options.params,
2602
+ $(elem).data('params')
2603
+ );
2604
+
2555
2605
  options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
2556
2606
  clearTimeout(data.flashBlock);
2557
-
2607
+
2558
2608
  swfmini.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.115", false, vars, params, attrs, function(swfData){
2559
2609
  if(swfData.success){
2560
2610
  var fBlocker = function(){
@@ -2566,13 +2616,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2566
2616
  $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
2567
2617
  };
2568
2618
  data.api = swfData.ref;
2569
-
2619
+
2570
2620
  if(!hasControls){
2571
2621
  $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
2572
2622
  }
2573
-
2623
+
2574
2624
  data.flashBlock = setTimeout(fBlocker, 99);
2575
-
2625
+
2576
2626
  if(!localConnectionTimer){
2577
2627
  clearTimeout(localConnectionTimer);
2578
2628
  localConnectionTimer = setTimeout(function(){
@@ -2586,23 +2636,24 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2586
2636
  flash = null;
2587
2637
  }, 8000);
2588
2638
  }
2639
+ if(isUserStream){
2640
+ webshim.usermedia.request(elem, canPlaySrc, data);
2641
+ }
2589
2642
  }
2590
2643
  });
2591
-
2592
- trigger(data._elem, 'loadstart');
2593
2644
  };
2594
-
2595
-
2645
+
2646
+
2596
2647
  var queueSwfMethod = function(elem, fn, args, data){
2597
2648
  data = data || getSwfDataFromElem(elem);
2598
-
2649
+
2599
2650
  if(data){
2600
2651
  if(data.api && data.api[fn]){
2601
2652
  data.api[fn].apply(data.api, args || []);
2602
2653
  } else {
2603
2654
  //todo add to queue
2604
2655
  data.actionQueue.push({fn: fn, args: args});
2605
-
2656
+
2606
2657
  if(data.actionQueue.length > 10){
2607
2658
  setTimeout(function(){
2608
2659
  if(data.actionQueue.length > 5){
@@ -2615,13 +2666,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2615
2666
  }
2616
2667
  return false;
2617
2668
  };
2618
-
2669
+ mediaelement.queueSwfMethod = queueSwfMethod;
2670
+
2619
2671
  ['audio', 'video'].forEach(function(nodeName){
2620
2672
  var descs = {};
2621
2673
  var mediaSup;
2622
2674
  var createGetProp = function(key){
2623
2675
  if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
2624
-
2676
+
2625
2677
  descs[key] = {
2626
2678
  get: function(){
2627
2679
  var data = getSwfDataFromElem(this);
@@ -2641,33 +2693,33 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2641
2693
  delete descs[key].writeable;
2642
2694
  descs[key].set = setFn;
2643
2695
  };
2644
-
2696
+
2645
2697
  createGetSetProp('seeking');
2646
-
2698
+
2647
2699
  createGetSetProp('volume', function(v){
2648
2700
  var data = getSwfDataFromElem(this);
2649
2701
  if(data){
2650
2702
  v *= 1;
2651
2703
  if(!isNaN(v)){
2652
-
2704
+
2653
2705
  if(v < 0 || v > 1){
2654
2706
  webshims.error('volume greater or less than allowed '+ (v / 100));
2655
2707
  }
2656
-
2708
+
2657
2709
  queueSwfMethod(this, 'api_volume', [v], data);
2658
-
2659
-
2710
+
2711
+
2660
2712
  if(data.volume != v){
2661
2713
  data.volume = v;
2662
2714
  trigger(data._elem, 'volumechange');
2663
2715
  }
2664
2716
  data = null;
2665
- }
2717
+ }
2666
2718
  } else if(mediaSup.volume.prop._supset) {
2667
2719
  return mediaSup.volume.prop._supset.apply(this, arguments);
2668
2720
  }
2669
2721
  });
2670
-
2722
+
2671
2723
  createGetSetProp('muted', function(m){
2672
2724
  var data = getSwfDataFromElem(this);
2673
2725
  if(data){
@@ -2682,8 +2734,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2682
2734
  return mediaSup.muted.prop._supset.apply(this, arguments);
2683
2735
  }
2684
2736
  });
2685
-
2686
-
2737
+
2738
+
2687
2739
  createGetSetProp('currentTime', function(t){
2688
2740
  var data = getSwfDataFromElem(this);
2689
2741
  if(data){
@@ -2691,23 +2743,23 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2691
2743
  if (!isNaN(t)) {
2692
2744
  queueSwfMethod(this, 'api_seek', [t], data);
2693
2745
  }
2694
-
2746
+
2695
2747
  } else if(mediaSup.currentTime.prop._supset) {
2696
2748
  return mediaSup.currentTime.prop._supset.apply(this, arguments);
2697
2749
  }
2698
2750
  });
2699
-
2751
+
2700
2752
  ['play', 'pause'].forEach(function(fn){
2701
2753
  descs[fn] = {
2702
2754
  value: function(){
2703
2755
  var data = getSwfDataFromElem(this);
2704
-
2756
+
2705
2757
  if(data){
2706
2758
  if(data.stopPlayPause){
2707
2759
  clearTimeout(data.stopPlayPause);
2708
2760
  }
2709
2761
  queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
2710
-
2762
+
2711
2763
  data._ppFlag = true;
2712
2764
  if(data.paused != (fn != 'play')){
2713
2765
  data.paused = fn != 'play';
@@ -2719,14 +2771,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2719
2771
  }
2720
2772
  };
2721
2773
  });
2722
-
2774
+
2723
2775
  getPropKeys.forEach(createGetProp);
2724
-
2776
+
2725
2777
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
2726
2778
  var data = getSwfDataFromElem(this);
2727
-
2779
+
2728
2780
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
2729
-
2781
+
2730
2782
  if(data){
2731
2783
  if(nodeName == 'audio'){
2732
2784
  setElementDimension(data, boolProp);
@@ -2734,12 +2786,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2734
2786
  queueSwfMethod(this, 'api_controls', [boolProp], data);
2735
2787
  }
2736
2788
  });
2737
-
2738
-
2789
+
2790
+
2739
2791
  webshims.onNodeNamesPropertyModify(nodeName, 'preload', function(val){
2740
2792
  var data, baseData, elem;
2741
-
2742
-
2793
+
2794
+
2743
2795
  if(bufferSrc(this)){
2744
2796
  data = getSwfDataFromElem(this);
2745
2797
  if(data){
@@ -2754,9 +2806,9 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2754
2806
  }
2755
2807
  }
2756
2808
  });
2757
-
2809
+
2758
2810
  mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
2759
-
2811
+
2760
2812
  if(!support.mediaDefaultMuted){
2761
2813
  webshims.defineNodeNameProperties(nodeName, {
2762
2814
  defaultMuted: {
@@ -2774,8 +2826,68 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2774
2826
  }, 'prop');
2775
2827
  }
2776
2828
  });
2777
-
2778
-
2829
+
2830
+ var addCanvasBridge = function(){
2831
+ if(!window.CanvasRenderingContext2D){
2832
+ return false;
2833
+ }
2834
+ var _drawImage = CanvasRenderingContext2D.prototype.drawImage;
2835
+ var slice = Array.prototype.slice;
2836
+ var isVideo = {
2837
+ video: 1,
2838
+ VIDEO: 1
2839
+ };
2840
+ var tested = {};
2841
+
2842
+ if(!_drawImage){
2843
+ webshim.error('canvas.drawImage feature is needed. In IE8 flashvanvas pro can be used');
2844
+ }
2845
+
2846
+ CanvasRenderingContext2D.prototype.drawImage = function(elem){
2847
+ var data, img, args, imgData;
2848
+ var context = this;
2849
+
2850
+ if(isVideo[elem.nodeName] && (data = webshims.data(elem, 'mediaelement')) && data.isActive == 'third' && data.api.api_image){
2851
+
2852
+ try {
2853
+ imgData = data.api.api_image();
2854
+ } catch (er){
2855
+ webshims.error(er);
2856
+ }
2857
+ if(!tested[data.currentSrc]){
2858
+ tested[data.currentSrc] = true;
2859
+ if(imgData == null){
2860
+ webshims.error('video has to be same origin or a crossdomain.xml has to be provided. Video has to be visible for flash API');
2861
+ }
2862
+ }
2863
+
2864
+ args = slice.call(arguments, 1);
2865
+ img = new Image();
2866
+
2867
+ //todo find a performant sync way
2868
+ img.onload = function(){
2869
+ args.unshift(this);
2870
+ _drawImage.apply(context, args);
2871
+ img.onload = null;
2872
+ };
2873
+
2874
+ img.src = 'data:image/jpeg;base64,'+imgData;
2875
+
2876
+ if(img.complete){
2877
+ img.onload();
2878
+ }
2879
+ return;
2880
+ }
2881
+ return _drawImage.apply(this, arguments);
2882
+ };
2883
+ return true;
2884
+ };
2885
+
2886
+ if(!addCanvasBridge()){
2887
+ webshims.ready('canvas', addCanvasBridge);
2888
+ }
2889
+
2890
+
2779
2891
  if(hasFlash && $.cleanData){
2780
2892
  var oldClean = $.cleanData;
2781
2893
  var objElem = document.createElement('object');
@@ -2789,12 +2901,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2789
2901
  object: 1,
2790
2902
  OBJECT: 1
2791
2903
  };
2792
-
2904
+
2793
2905
  $.cleanData = function(elems){
2794
2906
  var i, len, prop;
2795
2907
  var ret = oldClean.apply(this, arguments);
2796
2908
  if(elems && (len = elems.length) && loadedSwf){
2797
-
2909
+
2798
2910
  for(i = 0; i < len; i++){
2799
2911
  if(flashNames[elems[i].nodeName] && 'api_destroy' in elems[i]){
2800
2912
  loadedSwf--;
@@ -2810,14 +2922,14 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2810
2922
  } catch(er){console.log(er);}
2811
2923
  }
2812
2924
  }
2813
-
2925
+
2814
2926
  }
2815
2927
  return ret;
2816
2928
  };
2817
2929
  }
2818
2930
 
2819
2931
  if(!hasNative){
2820
-
2932
+
2821
2933
  ['poster', 'src'].forEach(function(prop){
2822
2934
  webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
2823
2935
  //attr: {},
@@ -2825,21 +2937,21 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2825
2937
  propType: 'src'
2826
2938
  });
2827
2939
  });
2828
-
2940
+
2829
2941
  webshims.defineNodeNamesProperty(['audio', 'video'], 'preload', {
2830
2942
  reflect: true,
2831
2943
  propType: 'enumarated',
2832
2944
  defaultValue: '',
2833
2945
  limitedTo: ['', 'auto', 'metadata', 'none']
2834
2946
  });
2835
-
2947
+
2836
2948
  webshims.reflectProperties('source', ['type', 'media']);
2837
-
2838
-
2949
+
2950
+
2839
2951
  ['autoplay', 'controls'].forEach(function(name){
2840
2952
  webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
2841
2953
  });
2842
-
2954
+
2843
2955
  webshims.defineNodeNamesProperties(['audio', 'video'], {
2844
2956
  HAVE_CURRENT_DATA: {
2845
2957
  value: 2
@@ -2868,7 +2980,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2868
2980
  NETWORK_NO_SOURCE: {
2869
2981
  value: 3
2870
2982
  }
2871
-
2983
+
2872
2984
  }, 'prop');
2873
2985
 
2874
2986
 
@@ -2894,7 +3006,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
2894
3006
  var media, error, parent;
2895
3007
  if(
2896
3008
  ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source', parent).last()[0] == e.target)) &&
2897
- (media = $(e.target).closest('audio, video')) && !media.hasClass('nonnative-api-active')
3009
+ (media = $(e.target).closest('audio, video')) && !media.hasClass('nonnative-api-active')
2898
3010
  ){
2899
3011
  error = media.prop('error');
2900
3012
  setTimeout(function(){