webshims-rails 1.14.1 → 1.14.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -0
  4. data/vendor/assets/javascripts/webshims/polyfiller.js +3 -8
  5. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  6. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  7. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  8. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  9. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  10. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  11. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  13. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  14. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  15. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  16. data/vendor/assets/javascripts/webshims/shims/color-picker.js +2 -2
  17. data/vendor/assets/javascripts/webshims/shims/combos/1.js +66 -43
  18. data/vendor/assets/javascripts/webshims/shims/combos/10.js +66 -31
  19. data/vendor/assets/javascripts/webshims/shims/combos/11.js +66 -31
  20. data/vendor/assets/javascripts/webshims/shims/combos/12.js +96 -59
  21. data/vendor/assets/javascripts/webshims/shims/combos/13.js +96 -59
  22. data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -0
  23. data/vendor/assets/javascripts/webshims/shims/combos/15.js +4 -1
  24. data/vendor/assets/javascripts/webshims/shims/combos/16.js +70 -44
  25. data/vendor/assets/javascripts/webshims/shims/combos/17.js +66 -31
  26. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1241 -1126
  27. data/vendor/assets/javascripts/webshims/shims/combos/19.js +1272 -1214
  28. data/vendor/assets/javascripts/webshims/shims/combos/2.js +66 -43
  29. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1272 -1214
  30. data/vendor/assets/javascripts/webshims/shims/combos/21.js +61 -92
  31. data/vendor/assets/javascripts/webshims/shims/combos/22.js +30 -16
  32. data/vendor/assets/javascripts/webshims/shims/combos/23.js +66 -43
  33. data/vendor/assets/javascripts/webshims/shims/combos/25.js +41 -85
  34. data/vendor/assets/javascripts/webshims/shims/combos/26.js +1556 -2316
  35. data/vendor/assets/javascripts/webshims/shims/combos/27.js +12 -10
  36. data/vendor/assets/javascripts/webshims/shims/combos/28.js +4 -1
  37. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -0
  38. data/vendor/assets/javascripts/webshims/shims/combos/3.js +0 -0
  39. data/vendor/assets/javascripts/webshims/shims/combos/30.js +0 -0
  40. data/vendor/assets/javascripts/webshims/shims/combos/31.js +0 -0
  41. data/vendor/assets/javascripts/webshims/shims/combos/32.js +1175 -1095
  42. data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -0
  43. data/vendor/assets/javascripts/webshims/shims/combos/34.js +30 -16
  44. data/vendor/assets/javascripts/webshims/shims/combos/4.js +0 -0
  45. data/vendor/assets/javascripts/webshims/shims/combos/5.js +66 -31
  46. data/vendor/assets/javascripts/webshims/shims/combos/6.js +66 -31
  47. data/vendor/assets/javascripts/webshims/shims/combos/7.js +66 -43
  48. data/vendor/assets/javascripts/webshims/shims/combos/8.js +66 -43
  49. data/vendor/assets/javascripts/webshims/shims/combos/9.js +66 -31
  50. data/vendor/assets/javascripts/webshims/shims/combos/97.js +63 -28
  51. data/vendor/assets/javascripts/webshims/shims/combos/98.js +149 -74
  52. data/vendor/assets/javascripts/webshims/shims/combos/99.js +149 -74
  53. data/vendor/assets/javascripts/webshims/shims/combos/comboinfo.json +1 -1
  54. data/vendor/assets/javascripts/webshims/shims/details.js +0 -0
  55. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +0 -0
  56. data/vendor/assets/javascripts/webshims/shims/es5.js +1175 -1095
  57. data/vendor/assets/javascripts/webshims/shims/excanvas.js +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/filereader.js +10 -9
  59. data/vendor/assets/javascripts/webshims/shims/form-combat.js +0 -0
  60. data/vendor/assets/javascripts/webshims/shims/form-core.js +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +0 -0
  62. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +0 -0
  63. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/form-message.js +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +0 -0
  66. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -0
  67. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +40 -11
  68. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +4 -1
  69. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +2 -1
  70. data/vendor/assets/javascripts/webshims/shims/form-validation.js +80 -47
  71. data/vendor/assets/javascripts/webshims/shims/form-validators.js +19 -8
  72. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +21 -1
  73. data/vendor/assets/javascripts/webshims/shims/geolocation.js +0 -0
  74. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ar.js +0 -0
  75. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ch-CN.js +0 -0
  76. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-cs.js +0 -0
  77. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js +0 -0
  78. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-el.js +0 -0
  79. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +0 -0
  80. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-es.js +0 -0
  81. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fa.js +130 -0
  82. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fr.js +0 -0
  83. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-he.js +0 -0
  84. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hi.js +0 -0
  85. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hu.js +0 -0
  86. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-it.js +0 -0
  87. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ja.js +0 -0
  88. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-lt.js +0 -0
  89. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-nl.js +0 -0
  90. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pl.js +0 -0
  91. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-BR.js +0 -0
  92. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-PT.js +0 -0
  93. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt.js +0 -0
  94. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ru.js +0 -0
  95. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-sv.js +0 -0
  96. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-CN.js +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-TW.js +130 -0
  98. data/vendor/assets/javascripts/webshims/shims/jajax.js +0 -0
  99. data/vendor/assets/javascripts/webshims/shims/jme/_icons.scss +186 -0
  100. data/vendor/assets/javascripts/webshims/shims/jme/b.js +63 -28
  101. data/vendor/assets/javascripts/webshims/shims/jme/c.js +86 -46
  102. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +317 -211
  103. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +59 -223
  104. data/vendor/assets/javascripts/webshims/shims/jme/jme.eot +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/jme/jme.svg +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/jme/jme.ttf +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/jme/jme.woff +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +66 -14
  109. data/vendor/assets/javascripts/webshims/shims/jme/p.js +0 -0
  110. data/vendor/assets/javascripts/webshims/shims/jpicker/ChangeLog.txt +0 -0
  111. data/vendor/assets/javascripts/webshims/shims/jpicker/ReadMe.txt +0 -0
  112. data/vendor/assets/javascripts/webshims/shims/jpicker/images/AlphaBar.png +0 -0
  113. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Bars.png +0 -0
  114. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Maps.png +0 -0
  115. data/vendor/assets/javascripts/webshims/shims/jpicker/images/NoColor.png +0 -0
  116. data/vendor/assets/javascripts/webshims/shims/jpicker/images/bar-opacity.png +0 -0
  117. data/vendor/assets/javascripts/webshims/shims/jpicker/images/map-opacity.png +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/jpicker/images/mappoint.gif +0 -0
  119. data/vendor/assets/javascripts/webshims/shims/jpicker/images/picker.gif +0 -0
  120. data/vendor/assets/javascripts/webshims/shims/jpicker/images/preview-opacity.png +0 -0
  121. data/vendor/assets/javascripts/webshims/shims/jpicker/images/rangearrows.gif +0 -0
  122. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +55 -48
  123. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +66 -43
  124. data/vendor/assets/javascripts/webshims/shims/mediaelement-debug.js +833 -0
  125. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +31 -76
  126. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +0 -0
  127. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +0 -0
  128. data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.cdn.swf +0 -0
  129. data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.min.swf +0 -0
  130. data/vendor/assets/javascripts/webshims/shims/moxie/js/moxie.js +1542 -2303
  131. data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.cdn.xap +0 -0
  132. data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.min.xap +0 -0
  133. data/vendor/assets/javascripts/webshims/shims/picture.js +160 -79
  134. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +0 -0
  135. data/vendor/assets/javascripts/webshims/shims/promise.js +0 -0
  136. data/vendor/assets/javascripts/webshims/shims/range-ui.js +26 -20
  137. data/vendor/assets/javascripts/webshims/shims/sizzle.js +0 -0
  138. data/vendor/assets/javascripts/webshims/shims/styles/color-picker.png +0 -0
  139. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +444 -326
  140. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +379 -300
  141. data/vendor/assets/javascripts/webshims/shims/styles/progress.gif +0 -0
  142. data/vendor/assets/javascripts/webshims/shims/styles/progress.png +0 -0
  143. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +8 -8
  144. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-shim.scss +0 -0
  145. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +0 -14
  146. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +104 -85
  147. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +20 -32
  148. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +0 -0
  149. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +14 -34
  150. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +920 -728
  151. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +471 -391
  152. data/vendor/assets/javascripts/webshims/shims/styles/widget.eot +0 -0
  153. data/vendor/assets/javascripts/webshims/shims/styles/widget.svg +0 -0
  154. data/vendor/assets/javascripts/webshims/shims/styles/widget.ttf +0 -0
  155. data/vendor/assets/javascripts/webshims/shims/styles/widget.woff +0 -0
  156. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  157. data/vendor/assets/javascripts/webshims/shims/swfmini-embed.js +0 -0
  158. data/vendor/assets/javascripts/webshims/shims/swfmini.js +0 -0
  159. data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
  160. data/vendor/assets/javascripts/webshims/shims/track.js +30 -16
  161. metadata +8 -4
  162. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +0 -12
  163. data/vendor/assets/javascripts/webshims/shims/swf/filereader.swf +0 -0
@@ -491,8 +491,8 @@
491
491
  data.seeking = false;
492
492
  }, 300);
493
493
  },
494
- onConnectionFailed: function(){
495
- webshims.error('media error');
494
+ onConnectionFailed: function(jaris, data){
495
+ mediaelement.setError(data._elem, 'flash connection error');
496
496
  },
497
497
  onNotBuffering: function(jaris, data){
498
498
  setReadyState(3, data);
@@ -1408,6 +1408,13 @@
1408
1408
 
1409
1409
  if(hasFlash && $.cleanData){
1410
1410
  var oldClean = $.cleanData;
1411
+ var objElem = document.createElement('object');
1412
+ var noRemove = {
1413
+ SetVariable: 1,
1414
+ GetVariable: 1,
1415
+ SetReturnValue: 1,
1416
+ GetReturnValue: 1
1417
+ };
1411
1418
  var flashNames = {
1412
1419
  object: 1,
1413
1420
  OBJECT: 1
@@ -1415,6 +1422,7 @@
1415
1422
 
1416
1423
  $.cleanData = function(elems){
1417
1424
  var i, len, prop;
1425
+ var ret = oldClean.apply(this, arguments);
1418
1426
  if(elems && (len = elems.length) && loadedSwf){
1419
1427
 
1420
1428
  for(i = 0; i < len; i++){
@@ -1424,7 +1432,7 @@
1424
1432
  elems[i].api_pause();
1425
1433
  if(elems[i].readyState == 4){
1426
1434
  for (prop in elems[i]) {
1427
- if (typeof elems[i][prop] == "function") {
1435
+ if (!noRemove[prop] && !objElem[prop] && typeof elems[i][prop] == "function") {
1428
1436
  elems[i][prop] = null;
1429
1437
  }
1430
1438
  }
@@ -1434,7 +1442,7 @@
1434
1442
  }
1435
1443
 
1436
1444
  }
1437
- return oldClean.apply(this, arguments);
1445
+ return ret;
1438
1446
  };
1439
1447
  }
1440
1448
 
@@ -1506,62 +1514,6 @@
1506
1514
  } else if(!('media' in document.createElement('source'))){
1507
1515
  webshims.reflectProperties('source', ['media']);
1508
1516
  }
1509
- if(options.experimentallyMimetypeCheck){
1510
- (function(){
1511
- var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
1512
- var getMimeType = function(){
1513
- var done;
1514
- var unknown = 'media/unknown please provide mime type';
1515
- var media = $(this);
1516
- var xhrs = [];
1517
- media
1518
- .not('.ws-after-check')
1519
- .find('source')
1520
- [ADDBACK]()
1521
- .filter('[data-wsrecheckmimetype]:not([type])')
1522
- .each(function(){
1523
- var source = $(this).removeAttr('data-wsrecheckmimetype');
1524
- var error = function(){
1525
- source.attr('data-type', unknown);
1526
- };
1527
- try {
1528
- xhrs.push(
1529
- $.ajax({
1530
- type: 'head',
1531
- url: $.attr(this, 'src'),
1532
- success: function(content, status, xhr){
1533
- var mime = xhr.getResponseHeader('Content-Type');
1534
- if(mime){
1535
- done = true;
1536
- }
1537
- source.attr('data-type', mime || unknown);
1538
- },
1539
- error: error
1540
- })
1541
- )
1542
- ;
1543
- } catch(er){
1544
- error();
1545
- }
1546
- })
1547
- ;
1548
- if(xhrs.length){
1549
- media.addClass('ws-after-check');
1550
- $.when.apply($, xhrs).always(function(){
1551
- media.mediaLoad();
1552
- setTimeout(function(){
1553
- media.removeClass('ws-after-check');
1554
- }, 9);
1555
- });
1556
- }
1557
- };
1558
- $('audio.media-error, video.media-error').each(getMimeType);
1559
- $(document).on('mediaerror', function(e){
1560
- getMimeType.call(e.target);
1561
- });
1562
- })();
1563
- }
1564
-
1565
1517
 
1566
1518
  if(hasNative && hasFlash && !options.preferFlash){
1567
1519
  var switchErrors = {
@@ -1570,35 +1522,38 @@
1570
1522
  };
1571
1523
  var switchOptions = function(e){
1572
1524
  var media, error, parent;
1573
- if(!options.preferFlash &&
1525
+ if(
1574
1526
  ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source', parent).last()[0] == e.target)) &&
1575
- (media = $(e.target).closest('audio, video')) && (error = media.prop('error')) && switchErrors[error.code]
1527
+ (media = $(e.target).closest('audio, video')) && !media.is('.nonnative-api-active')
1576
1528
  ){
1577
-
1578
- if(!options.preferFlash){
1529
+ error = media.prop('error');
1530
+ setTimeout(function(){
1579
1531
  if(!media.is('.nonnative-api-active')){
1580
- options.preferFlash = true;
1581
- document.removeEventListener('error', switchOptions, true);
1582
- $('audio, video').each(function(){
1583
- webshims.mediaelement.selectSource(this);
1584
- });
1585
- webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error')+ 'first error: '+ error);
1532
+ if(error && switchErrors[error.code]){
1533
+ options.preferFlash = true;
1534
+ document.removeEventListener('error', switchOptions, true);
1535
+ $('audio, video').each(function(){
1536
+ webshims.mediaelement.selectSource(this);
1537
+ });
1538
+ webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.currentSrc+" Mediaerror: "+ media.prop('error')+ ' error.code: '+ error.code);
1539
+ }
1540
+ webshims.warn('There was a mediaelement error. Run the following line in your console to get more info: webshim.mediaelement.loadDebugger();')
1586
1541
  }
1587
- } else{
1588
- document.removeEventListener('error', switchOptions, true);
1589
- }
1542
+ });
1543
+
1544
+
1590
1545
  }
1591
1546
  };
1547
+
1548
+ document.addEventListener('error', switchOptions, true);
1592
1549
  setTimeout(function(){
1593
- document.addEventListener('error', switchOptions, true);
1594
1550
  $('audio, video').each(function(){
1595
1551
  var error = $.prop(this, 'error');
1596
1552
  if(error && switchErrors[error]){
1597
1553
  switchOptions({target: this});
1598
- return false;
1599
1554
  }
1600
1555
  });
1601
- }, 9);
1556
+ });
1602
1557
  }
1603
1558
 
1604
1559
  });
@@ -1898,6 +1853,26 @@
1898
1853
  return cueText.replace(tagSplits, replacer);
1899
1854
  };
1900
1855
  })();
1856
+ var mapTtmlToVtt = function(i){
1857
+ var content = i+'';
1858
+ var begin = this.getAttribute('begin') || '';
1859
+ var end = this.getAttribute('end') || '';
1860
+ var text = $.trim($.text(this));
1861
+ if(!/\./.test(begin)){
1862
+ begin += '.000';
1863
+ }
1864
+ if(!/\./.test(end)){
1865
+ end += '.000';
1866
+ }
1867
+ content += '\n';
1868
+ content += begin +' --> '+end+'\n';
1869
+ content += text;
1870
+ return content;
1871
+ };
1872
+ var ttmlTextToVTT = function(ttml){
1873
+ ttml = $.parseXML(ttml) || [];
1874
+ return $(ttml).find('[begin][end]').map(mapTtmlToVtt).get().join('\n\n') || '';
1875
+ };
1901
1876
 
1902
1877
  mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
1903
1878
  var loadEvents = 'play playing';
@@ -1925,7 +1900,11 @@
1925
1900
  dataType: 'text',
1926
1901
  url: src,
1927
1902
  success: function(text){
1928
- if(ajax.getResponseHeader('content-type') != 'text/vtt'){
1903
+ var contentType = ajax.getResponseHeader('content-type');
1904
+
1905
+ if(!contentType.indexOf('application/xml')){
1906
+ text = ttmlTextToVTT(text);
1907
+ } else if(contentType.indexOf('text/vtt')){
1929
1908
  webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
1930
1909
  }
1931
1910
  mediaelement.parseCaptions(text, obj, function(cues){
@@ -2045,25 +2024,20 @@ modified for webshims
2045
2024
  */
2046
2025
  mediaelement.parseCaptionChunk = (function(){
2047
2026
  // Set up timestamp parsers
2048
- var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
2027
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
2049
2028
  var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
2050
2029
  var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
2051
2030
  var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
2031
+ var SRTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s*(.*)/;
2052
2032
 
2053
2033
  return function(subtitleElement,objectCount){
2054
2034
 
2055
- var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id, specialCueData;
2035
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id;
2056
2036
  var timestampMatch, tmpCue;
2057
2037
 
2058
2038
  // WebVTT Special Cue Logic
2059
- if (WebVTTDEFAULTSCueParser.exec(subtitleElement)) {
2060
- // cueDefaults = specialCueData.slice(2).join("");
2061
- // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
2039
+ if (WebVTTDEFAULTSCueParser.exec(subtitleElement) || WebVTTCOMMENTCueParser.exec(subtitleElement) || WebVTTSTYLECueParser.exec(subtitleElement)) {
2062
2040
  return null;
2063
- } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
2064
- return null;
2065
- } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
2066
- return null; // At this stage, we don't want to do anything with these.
2067
2041
  }
2068
2042
 
2069
2043
  subtitleParts = subtitleElement.split(/\n/g);
@@ -2081,7 +2055,7 @@ modified for webshims
2081
2055
  for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
2082
2056
  var timestamp = subtitleParts[subtitlePartIndex];
2083
2057
 
2084
- if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
2058
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp)) || (timestampMatch = SRTTimestampParser.exec(timestamp))) {
2085
2059
 
2086
2060
  // WebVTT
2087
2061
 
@@ -2168,11 +2142,6 @@ modified for webshims
2168
2142
  if(regWevVTT.test(cue)){
2169
2143
  isWEBVTT = true;
2170
2144
  } else if(cue.replace(/\s*/ig,"").length){
2171
- if(!isWEBVTT){
2172
- webshims.error('please use WebVTT format. This is the standard');
2173
- complete(null);
2174
- break;
2175
- }
2176
2145
  cue = mediaelement.parseCaptionChunk(cue, i);
2177
2146
  if(cue){
2178
2147
  track.addCue(cue);
@@ -442,6 +442,26 @@ webshims.register('details', function($, webshims, window, doc, undefined, optio
442
442
  return cueText.replace(tagSplits, replacer);
443
443
  };
444
444
  })();
445
+ var mapTtmlToVtt = function(i){
446
+ var content = i+'';
447
+ var begin = this.getAttribute('begin') || '';
448
+ var end = this.getAttribute('end') || '';
449
+ var text = $.trim($.text(this));
450
+ if(!/\./.test(begin)){
451
+ begin += '.000';
452
+ }
453
+ if(!/\./.test(end)){
454
+ end += '.000';
455
+ }
456
+ content += '\n';
457
+ content += begin +' --> '+end+'\n';
458
+ content += text;
459
+ return content;
460
+ };
461
+ var ttmlTextToVTT = function(ttml){
462
+ ttml = $.parseXML(ttml) || [];
463
+ return $(ttml).find('[begin][end]').map(mapTtmlToVtt).get().join('\n\n') || '';
464
+ };
445
465
 
446
466
  mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
447
467
  var loadEvents = 'play playing';
@@ -469,7 +489,11 @@ webshims.register('details', function($, webshims, window, doc, undefined, optio
469
489
  dataType: 'text',
470
490
  url: src,
471
491
  success: function(text){
472
- if(ajax.getResponseHeader('content-type') != 'text/vtt'){
492
+ var contentType = ajax.getResponseHeader('content-type');
493
+
494
+ if(!contentType.indexOf('application/xml')){
495
+ text = ttmlTextToVTT(text);
496
+ } else if(contentType.indexOf('text/vtt')){
473
497
  webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
474
498
  }
475
499
  mediaelement.parseCaptions(text, obj, function(cues){
@@ -589,25 +613,20 @@ modified for webshims
589
613
  */
590
614
  mediaelement.parseCaptionChunk = (function(){
591
615
  // Set up timestamp parsers
592
- var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
616
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
593
617
  var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
594
618
  var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
595
619
  var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
620
+ var SRTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s*(.*)/;
596
621
 
597
622
  return function(subtitleElement,objectCount){
598
623
 
599
- var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id, specialCueData;
624
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id;
600
625
  var timestampMatch, tmpCue;
601
626
 
602
627
  // WebVTT Special Cue Logic
603
- if (WebVTTDEFAULTSCueParser.exec(subtitleElement)) {
604
- // cueDefaults = specialCueData.slice(2).join("");
605
- // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
606
- return null;
607
- } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
628
+ if (WebVTTDEFAULTSCueParser.exec(subtitleElement) || WebVTTCOMMENTCueParser.exec(subtitleElement) || WebVTTSTYLECueParser.exec(subtitleElement)) {
608
629
  return null;
609
- } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
610
- return null; // At this stage, we don't want to do anything with these.
611
630
  }
612
631
 
613
632
  subtitleParts = subtitleElement.split(/\n/g);
@@ -625,7 +644,7 @@ modified for webshims
625
644
  for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
626
645
  var timestamp = subtitleParts[subtitlePartIndex];
627
646
 
628
- if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
647
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp)) || (timestampMatch = SRTTimestampParser.exec(timestamp))) {
629
648
 
630
649
  // WebVTT
631
650
 
@@ -712,11 +731,6 @@ modified for webshims
712
731
  if(regWevVTT.test(cue)){
713
732
  isWEBVTT = true;
714
733
  } else if(cue.replace(/\s*/ig,"").length){
715
- if(!isWEBVTT){
716
- webshims.error('please use WebVTT format. This is the standard');
717
- complete(null);
718
- break;
719
- }
720
734
  cue = mediaelement.parseCaptionChunk(cue, i);
721
735
  if(cue){
722
736
  track.addCue(cue);
@@ -238,7 +238,7 @@ webshims.isReady('swfmini', true);
238
238
 
239
239
  var wsCfg = webshims.cfg;
240
240
  var options = wsCfg.mediaelement;
241
- var hasSwf;
241
+ var isIE = navigator.userAgent.indexOf('MSIE') != -1;
242
242
  if(!options){
243
243
  webshims.error("mediaelement wasn't implemented but loaded");
244
244
  return;
@@ -253,7 +253,7 @@ webshims.isReady('swfmini', true);
253
253
 
254
254
  webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
255
255
 
256
- if( !Modernizr.videoBuffered || !supportsLoop || (!Modernizr.mediaDefaultMuted && navigator.userAgent.indexOf('MSIE') != -1 && 'ActiveXObject' in window) ){
256
+ if( !Modernizr.videoBuffered || !supportsLoop || (!Modernizr.mediaDefaultMuted && isIE && 'ActiveXObject' in window) ){
257
257
  webshims.addPolyfill('mediaelement-native-fix', {
258
258
  d: ['dom-support']
259
259
  });
@@ -281,7 +281,7 @@ webshims.isReady('swfmini', true);
281
281
  }
282
282
 
283
283
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined, options){
284
- hasSwf = swfmini.hasFlashPlayerVersion('10.0.3');
284
+ var hasSwf = swfmini.hasFlashPlayerVersion('10.0.3');
285
285
  var mediaelement = webshims.mediaelement;
286
286
 
287
287
  mediaelement.parseRtmp = function(data){
@@ -343,11 +343,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
343
343
  }
344
344
  }
345
345
  }
346
-
347
- if(!src.container){
348
- $(elem).attr('data-wsrecheckmimetype', '');
349
- }
350
-
346
+
351
347
  tmp = elem.attr('media');
352
348
  if(tmp){
353
349
  src.media = tmp;
@@ -477,11 +473,6 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
477
473
  }
478
474
  };
479
475
 
480
-
481
- $.fn.loadMediaSrc = function(){
482
- webshims.error('loadMediaSrc was removed.');
483
- };
484
-
485
476
  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'];
486
477
 
487
478
  mediaelement.canThirdPlaySrces = function(mediaElem, srces){
@@ -539,7 +530,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
539
530
  message = "can't play sources";
540
531
  }
541
532
  $(elem).pause().data('mediaerror', message);
542
- webshims.error('mediaelementError: '+ message);
533
+ webshims.error('mediaelementError: '+ message +'. Run the following line in your console to get more info: webshim.mediaelement.loadDebugger();');
543
534
  setTimeout(function(){
544
535
  if($(elem).data('mediaerror')){
545
536
  $(elem).addClass('media-error').trigger('mediaerror');
@@ -571,36 +562,49 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
571
562
  }
572
563
  };
573
564
  })();
574
-
575
- var stepSources = function(elem, data, useSwf, _srces, _noLoop){
576
- var ret;
577
- if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
578
- ret = mediaelement.canThirdPlaySrces(elem, _srces);
579
- if(!ret){
580
- if(_noLoop){
581
- mediaelement.setError(elem, false);
582
- } else {
583
- stepSources(elem, data, false, _srces, true);
584
- }
585
- } else {
586
- handleThird(elem, ret, data);
565
+
566
+ var activate = {
567
+ native: function(elem, src, data){
568
+ if(data && data.isActive == 'third') {
569
+ mediaelement.setActive(elem, 'html5', data);
587
570
  }
588
- } else {
589
- ret = mediaelement.canNativePlaySrces(elem, _srces);
590
- if(!ret){
591
- if(_noLoop){
592
- mediaelement.setError(elem, false);
593
- if(data && data.isActive == 'third') {
594
- mediaelement.setActive(elem, 'html5', data);
595
- }
596
- } else {
597
- stepSources(elem, data, true, _srces, true);
598
- }
599
- } else if(data && data.isActive == 'third') {
571
+ },
572
+ third: handleThird
573
+ };
574
+
575
+ var stepSources = function(elem, data, srces){
576
+ var i, src;
577
+ var testOrder = [{test: 'canNativePlaySrces', activate: 'native'}, {test: 'canThirdPlaySrces', activate: 'third'}];
578
+ if(options.preferFlash || (data && data.isActive == 'third') ){
579
+ testOrder.reverse();
580
+ }
581
+ for(i = 0; i < 2; i++){
582
+ src = mediaelement[testOrder[i].test](elem, srces);
583
+ if(src){
584
+ activate[testOrder[i].activate](elem, src, data);
585
+ break;
586
+ }
587
+ }
588
+
589
+ if(!src){
590
+ mediaelement.setError(elem, false);
591
+ if(data && data.isActive == 'third') {
600
592
  mediaelement.setActive(elem, 'html5', data);
601
593
  }
602
594
  }
603
595
  };
596
+ var allowedPreload = {'metadata': 1, 'auto': 1, '': 1};
597
+ var fixPreload = function(elem){
598
+ var preload, img;
599
+ if(elem.getAttribute('preload') == 'none'){
600
+ if(allowedPreload[(preload = $.attr(elem, 'data-preload'))]){
601
+ $.attr(elem, 'preload', preload);
602
+ } else if(hasNative && (preload = elem.getAttribute('poster'))){
603
+ img = document.createElement('img');
604
+ img.src = preload;
605
+ }
606
+ }
607
+ };
604
608
  var stopParent = /^(?:embed|object|datalist)$/i;
605
609
  var selectSource = function(elem, data){
606
610
  var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
@@ -616,7 +620,9 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
616
620
  if(mediaelement.sortMedia){
617
621
  _srces.sort(mediaelement.sortMedia);
618
622
  }
619
- stepSources(elem, data, options.preferFlash || undefined, _srces);
623
+ fixPreload(elem);
624
+ stepSources(elem, data, _srces);
625
+
620
626
  };
621
627
  mediaelement.selectSource = selectSource;
622
628
 
@@ -627,20 +633,22 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
627
633
  setTimeout(function(){
628
634
  if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
629
635
  $(e.target).prop('currentTime', 0).play();
630
- }, 1);
636
+ });
631
637
 
632
638
  });
633
639
 
634
640
  var handleMedia = false;
641
+
635
642
  var initMediaElements = function(){
636
643
  var testFixMedia = function(){
644
+
637
645
  if(webshims.implement(this, 'mediaelement')){
638
646
  selectSource(this);
639
647
  if(!Modernizr.mediaDefaultMuted && $.attr(this, 'muted') != null){
640
648
  $.prop(this, 'muted', true);
641
649
  }
650
+
642
651
  }
643
-
644
652
  };
645
653
 
646
654
  webshims.ready('dom-support', function(){
@@ -656,6 +664,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
656
664
  prop: {
657
665
  value: function(){
658
666
  var data = webshims.data(this, 'mediaelement');
667
+
659
668
  selectSource(this, data);
660
669
  if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
661
670
  supLoad.prop._supvalue.apply(this, arguments);
@@ -667,6 +676,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
667
676
  }
668
677
  }
669
678
  });
679
+
670
680
  nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
671
681
  prop: {
672
682
  value: function(type){
@@ -683,6 +693,9 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
683
693
  ret = 'maybe';
684
694
  }
685
695
  }
696
+ if(!ret && hasYt && type == 'video/youtube'){
697
+ ret = 'maybe';
698
+ }
686
699
  return ret;
687
700
  }
688
701
  }
@@ -732,8 +745,18 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
732
745
  });
733
746
  }
734
747
  };
735
-
736
748
 
749
+ mediaelement.loadDebugger = function(){
750
+ webshims.ready('dom-support', function(){
751
+ webshims.loader.loadScript('mediaelement-debug');
752
+ });
753
+ };
754
+
755
+ if(({noCombo: 1, media: 1})[webshims.cfg.debug]){
756
+ $(document).on('mediaerror', function(e){
757
+ mediaelement.loadDebugger();
758
+ });
759
+ }
737
760
  //set native implementation ready, before swf api is retested
738
761
  if(hasNative){
739
762
  webshims.isReady('mediaelement-core', true);