webshims-rails 1.14.5 → 1.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -0
  3. data/lib/webshims-rails/version.rb +2 -2
  4. data/readme.textile +7 -0
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +38 -6
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +26 -20
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +54 -19
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +32 -15
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +45 -21
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +45 -21
  11. data/vendor/assets/javascripts/webshims/shims/combos/15.js +22 -4
  12. data/vendor/assets/javascripts/webshims/shims/combos/16.js +48 -24
  13. data/vendor/assets/javascripts/webshims/shims/combos/17.js +32 -15
  14. data/vendor/assets/javascripts/webshims/shims/combos/18.js +18 -81
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +48 -24
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +286 -179
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +19 -1
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +26 -20
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +311 -199
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +22 -17
  21. data/vendor/assets/javascripts/webshims/shims/combos/27.js +22 -17
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +22 -4
  23. data/vendor/assets/javascripts/webshims/shims/combos/30.js +22 -4
  24. data/vendor/assets/javascripts/webshims/shims/combos/31.js +22 -4
  25. data/vendor/assets/javascripts/webshims/shims/combos/34.js +41 -5
  26. data/vendor/assets/javascripts/webshims/shims/combos/4.js +22 -4
  27. data/vendor/assets/javascripts/webshims/shims/combos/5.js +32 -15
  28. data/vendor/assets/javascripts/webshims/shims/combos/6.js +32 -15
  29. data/vendor/assets/javascripts/webshims/shims/combos/7.js +48 -24
  30. data/vendor/assets/javascripts/webshims/shims/combos/8.js +48 -24
  31. data/vendor/assets/javascripts/webshims/shims/combos/9.js +54 -19
  32. data/vendor/assets/javascripts/webshims/shims/combos/98.js +24 -7
  33. data/vendor/assets/javascripts/webshims/shims/combos/99.js +24 -7
  34. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +22 -4
  35. data/vendor/assets/javascripts/webshims/shims/es5.js +3 -1
  36. data/vendor/assets/javascripts/webshims/shims/es6.js +1 -5
  37. data/vendor/assets/javascripts/webshims/shims/filereader.js +22 -17
  38. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +32 -15
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +18 -8
  40. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fa.js +1 -1
  41. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +11 -0
  42. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +16 -0
  43. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +3 -20
  44. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols.js +24 -7
  45. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +26 -20
  46. data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +9 -1
  47. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +267 -178
  48. data/vendor/assets/javascripts/webshims/shims/picture.js +18 -81
  49. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +1 -9
  50. data/vendor/assets/javascripts/webshims/shims/sizzle.js +1 -8
  51. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +4 -0
  52. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +5 -0
  53. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +4 -0
  54. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  55. data/vendor/assets/javascripts/webshims/shims/track.js +19 -1
  56. data/vendor/assets/javascripts/webshims/shims/url.js +316 -0
  57. data/vendor/assets/javascripts/webshims/shims/usermedia-core.js +28 -0
  58. data/vendor/assets/javascripts/webshims/shims/usermedia-shim.js +179 -0
  59. metadata +5 -3
  60. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -511
@@ -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(){