webshims-rails 1.11.2 → 1.11.3

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 (38) hide show
  1. checksums.yaml +6 -14
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +3 -4
  4. data/vendor/assets/javascripts/webshims/shims/combos/1.js +20 -8
  5. data/vendor/assets/javascripts/webshims/shims/combos/10.js +43 -2
  6. data/vendor/assets/javascripts/webshims/shims/combos/11.js +3 -0
  7. data/vendor/assets/javascripts/webshims/shims/combos/12.js +12 -4
  8. data/vendor/assets/javascripts/webshims/shims/combos/13.js +12 -4
  9. data/vendor/assets/javascripts/webshims/shims/combos/14.js +40 -2
  10. data/vendor/assets/javascripts/webshims/shims/combos/15.js +48 -6
  11. data/vendor/assets/javascripts/webshims/shims/combos/16.js +60 -10
  12. data/vendor/assets/javascripts/webshims/shims/combos/17.js +3 -0
  13. data/vendor/assets/javascripts/webshims/shims/combos/18.js +3 -0
  14. data/vendor/assets/javascripts/webshims/shims/combos/19.js +115 -17
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +60 -10
  16. data/vendor/assets/javascripts/webshims/shims/combos/20.js +115 -17
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +63 -11
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +12 -4
  19. data/vendor/assets/javascripts/webshims/shims/combos/24.js +3 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +115 -17
  21. data/vendor/assets/javascripts/webshims/shims/combos/26.js +40 -2
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +48 -6
  23. data/vendor/assets/javascripts/webshims/shims/combos/30.js +48 -6
  24. data/vendor/assets/javascripts/webshims/shims/combos/31.js +48 -6
  25. data/vendor/assets/javascripts/webshims/shims/combos/4.js +40 -2
  26. data/vendor/assets/javascripts/webshims/shims/combos/5.js +3 -0
  27. data/vendor/assets/javascripts/webshims/shims/combos/6.js +3 -0
  28. data/vendor/assets/javascripts/webshims/shims/combos/7.js +60 -10
  29. data/vendor/assets/javascripts/webshims/shims/combos/8.js +60 -10
  30. data/vendor/assets/javascripts/webshims/shims/combos/9.js +43 -2
  31. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +40 -2
  32. data/vendor/assets/javascripts/webshims/shims/form-core.js +8 -4
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +3 -0
  34. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +3 -5
  35. data/vendor/assets/javascripts/webshims/shims/form-validation.js +137 -0
  36. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +12 -4
  37. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +63 -11
  38. metadata +6 -6
@@ -1412,6 +1412,9 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1412
1412
  if(!langCfg['datetime-local']){
1413
1413
  langCfg['datetime-local'] = {};
1414
1414
  }
1415
+ if(!langCfg.time){
1416
+ langCfg.time = {};
1417
+ }
1415
1418
  if(!langCfg['datetime-local'].currentText && langCfg.time.currentText){
1416
1419
  langCfg['datetime-local'].currentText = langCfg.time.currentText;
1417
1420
  }
@@ -2215,6 +2215,9 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
2215
2215
  if(!langCfg['datetime-local']){
2216
2216
  langCfg['datetime-local'] = {};
2217
2217
  }
2218
+ if(!langCfg.time){
2219
+ langCfg.time = {};
2220
+ }
2218
2221
  if(!langCfg['datetime-local'].currentText && langCfg.time.currentText){
2219
2222
  langCfg['datetime-local'].currentText = langCfg.time.currentText;
2220
2223
  }
@@ -1258,6 +1258,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1258
1258
  "use strict";
1259
1259
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
1260
1260
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
1261
+ var has = Object.prototype.hasOwnProperty;
1261
1262
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
1262
1263
 
1263
1264
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
@@ -1330,6 +1331,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1330
1331
  //proxying attribute
1331
1332
  var olds = {};
1332
1333
  var havePolyfill = {};
1334
+ var hasPolyfillMethod = {};
1333
1335
  var extendedProps = {};
1334
1336
  var extendQ = {};
1335
1337
  var modifyProps = {};
@@ -1435,6 +1437,39 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1435
1437
  };
1436
1438
  });
1437
1439
 
1440
+ //add support for $('video').trigger('play') in case extendNative is set to false
1441
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
1442
+ (function(oldTrigger){
1443
+ $.event.trigger = function(event, data, elem, onlyHandlers){
1444
+
1445
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
1446
+ return oldTrigger.apply(this, arguments);
1447
+ }
1448
+ var ret, isOrig, origName;
1449
+ var origFn = elem[event];
1450
+ var polyfilledFn = $.prop(elem, event);
1451
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
1452
+ if(changeFn){
1453
+ origName = '__ws'+event;
1454
+ isOrig = (event in elem) && has.call(elem, event);
1455
+ elem[event] = polyfilledFn;
1456
+ elem[origName] = origFn;
1457
+ }
1458
+
1459
+ ret = oldTrigger.apply(this, arguments);
1460
+ if (changeFn) {
1461
+ if(isOrig){
1462
+ elem[event] = origFn;
1463
+ } else {
1464
+ delete elem[event];
1465
+ }
1466
+ delete elem[origName];
1467
+ }
1468
+
1469
+ return ret;
1470
+ };
1471
+ })($.event.trigger);
1472
+ }
1438
1473
 
1439
1474
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
1440
1475
  olds[type] = $[type];
@@ -1519,6 +1554,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1519
1554
  }
1520
1555
  var oldDesc = extendedProps[nodeName][prop][type];
1521
1556
  var getSup = function(propType, descriptor, oDesc){
1557
+ var origProp;
1522
1558
  if(descriptor && descriptor[propType]){
1523
1559
  return descriptor[propType];
1524
1560
  }
@@ -1535,8 +1571,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1535
1571
  };
1536
1572
  }
1537
1573
  if(type == 'prop' && propType == 'value' && desc.value.apply){
1574
+ origProp = '__ws'+prop;
1575
+ hasPolyfillMethod[prop] = true;
1538
1576
  return function(value){
1539
- var sup = olds[type](this, prop);
1577
+ var sup = this[origProp] || olds[type](this, prop);
1540
1578
  if(sup && sup.apply){
1541
1579
  sup = sup.apply(this, arguments);
1542
1580
  }
@@ -1574,7 +1612,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1574
1612
 
1575
1613
  var extendNativeValue = (function(){
1576
1614
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
1577
- var has = Object.prototype.hasOwnProperty;
1615
+
1578
1616
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
1579
1617
  var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
1580
1618
  return function(nodeName, prop, desc){
@@ -2492,7 +2530,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2492
2530
  src.server = tmp;
2493
2531
  }
2494
2532
 
2495
- tmp = elem.attr('type');
2533
+ tmp = elem.attr('type') || elem.attr('data-type');
2496
2534
  if(tmp){
2497
2535
  src.type = tmp;
2498
2536
  src.container = $.trim(tmp.split(';')[0]);
@@ -2516,6 +2554,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2516
2554
  }
2517
2555
  }
2518
2556
  }
2557
+
2558
+ if(!src.container){
2559
+ $(elem).attr('data-wsrecheckmimetype', '');
2560
+ }
2561
+
2519
2562
  tmp = elem.attr('media');
2520
2563
  if(tmp){
2521
2564
  src.media = tmp;
@@ -2749,15 +2792,18 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2749
2792
 
2750
2793
  var handleThird = (function(){
2751
2794
  var requested;
2795
+ var readyType = hasSwf ? swfType : 'mediaelement-yt';
2752
2796
  return function( mediaElem, ret, data ){
2797
+ //readd to ready
2753
2798
 
2754
- webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
2755
- if(mediaelement.createSWF){
2799
+
2800
+ webshims.ready(readyType, function(){
2801
+ if(mediaelement.createSWF && $(mediaElem).parent()[0]){
2756
2802
  mediaelement.createSWF( mediaElem, ret, data );
2757
2803
  } else if(!requested) {
2758
2804
  requested = true;
2759
2805
  loadThird();
2760
- //readd to ready
2806
+
2761
2807
  handleThird( mediaElem, ret, data );
2762
2808
  }
2763
2809
  });
@@ -3098,15 +3144,6 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3098
3144
  lastDuration: 0
3099
3145
  }, getProps, getSetProps);
3100
3146
 
3101
- var idRep = /^jarisplayer-/;
3102
- var getSwfDataFromID = function(id){
3103
-
3104
- var elem = document.getElementById(id.replace(idRep, ''));
3105
- if(!elem){return;}
3106
- var data = webshims.data(elem, 'mediaelement');
3107
- return data.isActive == 'third' ? data : null;
3108
- };
3109
-
3110
3147
 
3111
3148
  var getSwfDataFromElem = function(elem){
3112
3149
  try {
@@ -3699,6 +3736,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3699
3736
  box = data.shadowElem;
3700
3737
  resetSwfProps(data);
3701
3738
  } else {
3739
+ $(document.getElementById('wrapper-'+ elemId )).remove();
3702
3740
  box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
3703
3741
  .css({
3704
3742
  position: 'relative',
@@ -3781,8 +3819,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3781
3819
  ;
3782
3820
  }
3783
3821
 
3784
-
3785
- if(!mediaelement.jarisEvent[data.id] || mediaelement.jarisEvent[data.id].elem != elem){
3822
+ if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
3823
+ webshims.error('something went wrong');
3824
+ return;
3825
+ } else if(!mediaelement.jarisEvent[data.id]){
3826
+
3786
3827
  mediaelement.jarisEvent[data.id] = function(jaris){
3787
3828
 
3788
3829
  if(jaris.type == 'ready'){
@@ -3988,6 +4029,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3988
4029
  descs[fn] = {
3989
4030
  value: function(){
3990
4031
  var data = getSwfDataFromElem(this);
4032
+
3991
4033
  if(data){
3992
4034
  if(data.stopPlayPause){
3993
4035
  clearTimeout(data.stopPlayPause);
@@ -4010,6 +4052,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4010
4052
 
4011
4053
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
4012
4054
  var data = getSwfDataFromElem(this);
4055
+
4013
4056
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
4014
4057
 
4015
4058
  if(data){
@@ -4143,5 +4186,60 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
4143
4186
  } else if(!('media' in document.createElement('source'))){
4144
4187
  webshims.reflectProperties('source', ['media']);
4145
4188
  }
4189
+ if(options.experimentallyMimetypeCheck){
4190
+ (function(){
4191
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
4192
+ var getMimeType = function(){
4193
+ var done;
4194
+ var unknown = 'media/unknown please provide mime type';
4195
+ var media = $(this);
4196
+ var xhrs = [];
4197
+ media
4198
+ .not('.ws-after-check')
4199
+ .find('source')
4200
+ [ADDBACK]()
4201
+ .filter('[data-wsrecheckmimetype]:not([type])')
4202
+ .each(function(){
4203
+ var source = $(this).removeAttr('data-wsrecheckmimetype');
4204
+ var error = function(){
4205
+ source.attr('data-type', unknown);
4206
+ };
4207
+ try {
4208
+ xhrs.push(
4209
+ $.ajax({
4210
+ type: 'head',
4211
+ url: $.attr(this, 'src'),
4212
+ success: function(content, status, xhr){
4213
+ var mime = xhr.getResponseHeader('Content-Type');
4214
+ if(mime){
4215
+ done = true;
4216
+ }
4217
+ source.attr('data-type', mime || unknown);
4218
+ },
4219
+ error: error
4220
+ })
4221
+ )
4222
+ ;
4223
+ } catch(er){
4224
+ error();
4225
+ }
4226
+ })
4227
+ ;
4228
+ if(xhrs.length){
4229
+ media.addClass('ws-after-check');
4230
+ $.when.apply($, xhrs).always(function(){
4231
+ media.mediaLoad();
4232
+ setTimeout(function(){
4233
+ media.removeClass('ws-after-check');
4234
+ }, 9);
4235
+ });
4236
+ }
4237
+ };
4238
+ $('audio.media-error, video.media-error').each(getMimeType);
4239
+ $(document).on('mediaerror', function(e){
4240
+ getMimeType.call(e.target);
4241
+ });
4242
+ })();
4243
+ }
4146
4244
 
4147
4245
  });
@@ -455,6 +455,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
455
455
  "use strict";
456
456
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
457
457
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
458
+ var has = Object.prototype.hasOwnProperty;
458
459
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
459
460
 
460
461
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
@@ -527,6 +528,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
527
528
  //proxying attribute
528
529
  var olds = {};
529
530
  var havePolyfill = {};
531
+ var hasPolyfillMethod = {};
530
532
  var extendedProps = {};
531
533
  var extendQ = {};
532
534
  var modifyProps = {};
@@ -632,6 +634,39 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
632
634
  };
633
635
  });
634
636
 
637
+ //add support for $('video').trigger('play') in case extendNative is set to false
638
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
639
+ (function(oldTrigger){
640
+ $.event.trigger = function(event, data, elem, onlyHandlers){
641
+
642
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
643
+ return oldTrigger.apply(this, arguments);
644
+ }
645
+ var ret, isOrig, origName;
646
+ var origFn = elem[event];
647
+ var polyfilledFn = $.prop(elem, event);
648
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
649
+ if(changeFn){
650
+ origName = '__ws'+event;
651
+ isOrig = (event in elem) && has.call(elem, event);
652
+ elem[event] = polyfilledFn;
653
+ elem[origName] = origFn;
654
+ }
655
+
656
+ ret = oldTrigger.apply(this, arguments);
657
+ if (changeFn) {
658
+ if(isOrig){
659
+ elem[event] = origFn;
660
+ } else {
661
+ delete elem[event];
662
+ }
663
+ delete elem[origName];
664
+ }
665
+
666
+ return ret;
667
+ };
668
+ })($.event.trigger);
669
+ }
635
670
 
636
671
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
637
672
  olds[type] = $[type];
@@ -716,6 +751,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
716
751
  }
717
752
  var oldDesc = extendedProps[nodeName][prop][type];
718
753
  var getSup = function(propType, descriptor, oDesc){
754
+ var origProp;
719
755
  if(descriptor && descriptor[propType]){
720
756
  return descriptor[propType];
721
757
  }
@@ -732,8 +768,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
732
768
  };
733
769
  }
734
770
  if(type == 'prop' && propType == 'value' && desc.value.apply){
771
+ origProp = '__ws'+prop;
772
+ hasPolyfillMethod[prop] = true;
735
773
  return function(value){
736
- var sup = olds[type](this, prop);
774
+ var sup = this[origProp] || olds[type](this, prop);
737
775
  if(sup && sup.apply){
738
776
  sup = sup.apply(this, arguments);
739
777
  }
@@ -771,7 +809,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
771
809
 
772
810
  var extendNativeValue = (function(){
773
811
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
774
- var has = Object.prototype.hasOwnProperty;
812
+
775
813
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
776
814
  var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
777
815
  return function(nodeName, prop, desc){
@@ -1599,17 +1637,21 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1599
1637
  /*
1600
1638
  * Selectors for all browsers
1601
1639
  */
1640
+ var rElementsGroup = /^(?:form|fieldset)$/i;
1602
1641
  var hasInvalid = function(elem){
1603
1642
  var ret = false;
1604
1643
  $(elem).jProp('elements').each(function(){
1605
- ret = $(this).is(':invalid');
1606
- if(ret){
1607
- return false;
1644
+ if(!rElementsGroup.test(elem.nodeName || '')){
1645
+ ret = $(this).is(':invalid');
1646
+ if(ret){
1647
+ return false;
1648
+ }
1608
1649
  }
1650
+
1609
1651
  });
1610
1652
  return ret;
1611
1653
  };
1612
- var rElementsGroup = /^(?:form)$/i;///^(?:form|fieldset)$/i
1654
+
1613
1655
  $.extend($.expr[":"], {
1614
1656
  "valid-element": function(elem){
1615
1657
  return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
@@ -2192,7 +2234,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2192
2234
  src.server = tmp;
2193
2235
  }
2194
2236
 
2195
- tmp = elem.attr('type');
2237
+ tmp = elem.attr('type') || elem.attr('data-type');
2196
2238
  if(tmp){
2197
2239
  src.type = tmp;
2198
2240
  src.container = $.trim(tmp.split(';')[0]);
@@ -2216,6 +2258,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2216
2258
  }
2217
2259
  }
2218
2260
  }
2261
+
2262
+ if(!src.container){
2263
+ $(elem).attr('data-wsrecheckmimetype', '');
2264
+ }
2265
+
2219
2266
  tmp = elem.attr('media');
2220
2267
  if(tmp){
2221
2268
  src.media = tmp;
@@ -2449,15 +2496,18 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2449
2496
 
2450
2497
  var handleThird = (function(){
2451
2498
  var requested;
2499
+ var readyType = hasSwf ? swfType : 'mediaelement-yt';
2452
2500
  return function( mediaElem, ret, data ){
2501
+ //readd to ready
2453
2502
 
2454
- webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
2455
- if(mediaelement.createSWF){
2503
+
2504
+ webshims.ready(readyType, function(){
2505
+ if(mediaelement.createSWF && $(mediaElem).parent()[0]){
2456
2506
  mediaelement.createSWF( mediaElem, ret, data );
2457
2507
  } else if(!requested) {
2458
2508
  requested = true;
2459
2509
  loadThird();
2460
- //readd to ready
2510
+
2461
2511
  handleThird( mediaElem, ret, data );
2462
2512
  }
2463
2513
  });
@@ -806,6 +806,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
806
806
  "use strict";
807
807
  var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
808
808
  var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
809
+ var has = Object.prototype.hasOwnProperty;
809
810
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
810
811
 
811
812
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
@@ -878,6 +879,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
878
879
  //proxying attribute
879
880
  var olds = {};
880
881
  var havePolyfill = {};
882
+ var hasPolyfillMethod = {};
881
883
  var extendedProps = {};
882
884
  var extendQ = {};
883
885
  var modifyProps = {};
@@ -983,6 +985,39 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
983
985
  };
984
986
  });
985
987
 
988
+ //add support for $('video').trigger('play') in case extendNative is set to false
989
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
990
+ (function(oldTrigger){
991
+ $.event.trigger = function(event, data, elem, onlyHandlers){
992
+
993
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
994
+ return oldTrigger.apply(this, arguments);
995
+ }
996
+ var ret, isOrig, origName;
997
+ var origFn = elem[event];
998
+ var polyfilledFn = $.prop(elem, event);
999
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
1000
+ if(changeFn){
1001
+ origName = '__ws'+event;
1002
+ isOrig = (event in elem) && has.call(elem, event);
1003
+ elem[event] = polyfilledFn;
1004
+ elem[origName] = origFn;
1005
+ }
1006
+
1007
+ ret = oldTrigger.apply(this, arguments);
1008
+ if (changeFn) {
1009
+ if(isOrig){
1010
+ elem[event] = origFn;
1011
+ } else {
1012
+ delete elem[event];
1013
+ }
1014
+ delete elem[origName];
1015
+ }
1016
+
1017
+ return ret;
1018
+ };
1019
+ })($.event.trigger);
1020
+ }
986
1021
 
987
1022
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
988
1023
  olds[type] = $[type];
@@ -1067,6 +1102,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1067
1102
  }
1068
1103
  var oldDesc = extendedProps[nodeName][prop][type];
1069
1104
  var getSup = function(propType, descriptor, oDesc){
1105
+ var origProp;
1070
1106
  if(descriptor && descriptor[propType]){
1071
1107
  return descriptor[propType];
1072
1108
  }
@@ -1083,8 +1119,10 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1083
1119
  };
1084
1120
  }
1085
1121
  if(type == 'prop' && propType == 'value' && desc.value.apply){
1122
+ origProp = '__ws'+prop;
1123
+ hasPolyfillMethod[prop] = true;
1086
1124
  return function(value){
1087
- var sup = olds[type](this, prop);
1125
+ var sup = this[origProp] || olds[type](this, prop);
1088
1126
  if(sup && sup.apply){
1089
1127
  sup = sup.apply(this, arguments);
1090
1128
  }
@@ -1122,7 +1160,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1122
1160
 
1123
1161
  var extendNativeValue = (function(){
1124
1162
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
1125
- var has = Object.prototype.hasOwnProperty;
1163
+
1126
1164
  //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
1127
1165
  var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
1128
1166
  return function(nodeName, prop, desc){
@@ -2040,7 +2078,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2040
2078
  src.server = tmp;
2041
2079
  }
2042
2080
 
2043
- tmp = elem.attr('type');
2081
+ tmp = elem.attr('type') || elem.attr('data-type');
2044
2082
  if(tmp){
2045
2083
  src.type = tmp;
2046
2084
  src.container = $.trim(tmp.split(';')[0]);
@@ -2064,6 +2102,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2064
2102
  }
2065
2103
  }
2066
2104
  }
2105
+
2106
+ if(!src.container){
2107
+ $(elem).attr('data-wsrecheckmimetype', '');
2108
+ }
2109
+
2067
2110
  tmp = elem.attr('media');
2068
2111
  if(tmp){
2069
2112
  src.media = tmp;
@@ -2297,15 +2340,18 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2297
2340
 
2298
2341
  var handleThird = (function(){
2299
2342
  var requested;
2343
+ var readyType = hasSwf ? swfType : 'mediaelement-yt';
2300
2344
  return function( mediaElem, ret, data ){
2345
+ //readd to ready
2346
+
2301
2347
 
2302
- webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
2303
- if(mediaelement.createSWF){
2348
+ webshims.ready(readyType, function(){
2349
+ if(mediaelement.createSWF && $(mediaElem).parent()[0]){
2304
2350
  mediaelement.createSWF( mediaElem, ret, data );
2305
2351
  } else if(!requested) {
2306
2352
  requested = true;
2307
2353
  loadThird();
2308
- //readd to ready
2354
+
2309
2355
  handleThird( mediaElem, ret, data );
2310
2356
  }
2311
2357
  });
@@ -2646,15 +2692,6 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
2646
2692
  lastDuration: 0
2647
2693
  }, getProps, getSetProps);
2648
2694
 
2649
- var idRep = /^jarisplayer-/;
2650
- var getSwfDataFromID = function(id){
2651
-
2652
- var elem = document.getElementById(id.replace(idRep, ''));
2653
- if(!elem){return;}
2654
- var data = webshims.data(elem, 'mediaelement');
2655
- return data.isActive == 'third' ? data : null;
2656
- };
2657
-
2658
2695
 
2659
2696
  var getSwfDataFromElem = function(elem){
2660
2697
  try {
@@ -3247,6 +3284,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3247
3284
  box = data.shadowElem;
3248
3285
  resetSwfProps(data);
3249
3286
  } else {
3287
+ $(document.getElementById('wrapper-'+ elemId )).remove();
3250
3288
  box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
3251
3289
  .css({
3252
3290
  position: 'relative',
@@ -3329,8 +3367,11 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3329
3367
  ;
3330
3368
  }
3331
3369
 
3332
-
3333
- if(!mediaelement.jarisEvent[data.id] || mediaelement.jarisEvent[data.id].elem != elem){
3370
+ if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
3371
+ webshims.error('something went wrong');
3372
+ return;
3373
+ } else if(!mediaelement.jarisEvent[data.id]){
3374
+
3334
3375
  mediaelement.jarisEvent[data.id] = function(jaris){
3335
3376
 
3336
3377
  if(jaris.type == 'ready'){
@@ -3536,6 +3577,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3536
3577
  descs[fn] = {
3537
3578
  value: function(){
3538
3579
  var data = getSwfDataFromElem(this);
3580
+
3539
3581
  if(data){
3540
3582
  if(data.stopPlayPause){
3541
3583
  clearTimeout(data.stopPlayPause);
@@ -3558,6 +3600,7 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3558
3600
 
3559
3601
  webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
3560
3602
  var data = getSwfDataFromElem(this);
3603
+
3561
3604
  $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
3562
3605
 
3563
3606
  if(data){
@@ -3691,5 +3734,60 @@ webshims.register('mediaelement-jaris', function($, webshims, window, document,
3691
3734
  } else if(!('media' in document.createElement('source'))){
3692
3735
  webshims.reflectProperties('source', ['media']);
3693
3736
  }
3737
+ if(options.experimentallyMimetypeCheck){
3738
+ (function(){
3739
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
3740
+ var getMimeType = function(){
3741
+ var done;
3742
+ var unknown = 'media/unknown please provide mime type';
3743
+ var media = $(this);
3744
+ var xhrs = [];
3745
+ media
3746
+ .not('.ws-after-check')
3747
+ .find('source')
3748
+ [ADDBACK]()
3749
+ .filter('[data-wsrecheckmimetype]:not([type])')
3750
+ .each(function(){
3751
+ var source = $(this).removeAttr('data-wsrecheckmimetype');
3752
+ var error = function(){
3753
+ source.attr('data-type', unknown);
3754
+ };
3755
+ try {
3756
+ xhrs.push(
3757
+ $.ajax({
3758
+ type: 'head',
3759
+ url: $.attr(this, 'src'),
3760
+ success: function(content, status, xhr){
3761
+ var mime = xhr.getResponseHeader('Content-Type');
3762
+ if(mime){
3763
+ done = true;
3764
+ }
3765
+ source.attr('data-type', mime || unknown);
3766
+ },
3767
+ error: error
3768
+ })
3769
+ )
3770
+ ;
3771
+ } catch(er){
3772
+ error();
3773
+ }
3774
+ })
3775
+ ;
3776
+ if(xhrs.length){
3777
+ media.addClass('ws-after-check');
3778
+ $.when.apply($, xhrs).always(function(){
3779
+ media.mediaLoad();
3780
+ setTimeout(function(){
3781
+ media.removeClass('ws-after-check');
3782
+ }, 9);
3783
+ });
3784
+ }
3785
+ };
3786
+ $('audio.media-error, video.media-error').each(getMimeType);
3787
+ $(document).on('mediaerror', function(e){
3788
+ getMimeType.call(e.target);
3789
+ });
3790
+ })();
3791
+ }
3694
3792
 
3695
3793
  });