webshims-rails 1.10.3 → 1.10.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +96 -73
  4. data/vendor/assets/javascripts/webshims/shims/color-picker.js +2415 -0
  5. data/vendor/assets/javascripts/webshims/shims/combos/1.js +248 -745
  6. data/vendor/assets/javascripts/webshims/shims/combos/10.js +771 -1206
  7. data/vendor/assets/javascripts/webshims/shims/combos/11.js +679 -1201
  8. data/vendor/assets/javascripts/webshims/shims/combos/12.js +46 -65
  9. data/vendor/assets/javascripts/webshims/shims/combos/13.js +45 -64
  10. data/vendor/assets/javascripts/webshims/shims/combos/14.js +94 -7
  11. data/vendor/assets/javascripts/webshims/shims/combos/15.js +557 -1189
  12. data/vendor/assets/javascripts/webshims/shims/combos/16.js +598 -1249
  13. data/vendor/assets/javascripts/webshims/shims/combos/17.js +697 -1208
  14. data/vendor/assets/javascripts/webshims/shims/combos/18.js +697 -1208
  15. data/vendor/assets/javascripts/webshims/shims/combos/19.js +145 -78
  16. data/vendor/assets/javascripts/webshims/shims/combos/2.js +472 -1280
  17. data/vendor/assets/javascripts/webshims/shims/combos/20.js +144 -77
  18. data/vendor/assets/javascripts/webshims/shims/combos/21.js +14 -15
  19. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2 -2
  20. data/vendor/assets/javascripts/webshims/shims/combos/23.js +45 -64
  21. data/vendor/assets/javascripts/webshims/shims/combos/24.js +848 -0
  22. data/vendor/assets/javascripts/webshims/shims/combos/25.js +4373 -0
  23. data/vendor/assets/javascripts/webshims/shims/combos/26.js +1516 -0
  24. data/vendor/assets/javascripts/webshims/shims/combos/27.js +884 -0
  25. data/vendor/assets/javascripts/webshims/shims/combos/28.js +2067 -0
  26. data/vendor/assets/javascripts/webshims/shims/combos/29.js +1156 -0
  27. data/vendor/assets/javascripts/webshims/shims/combos/3.js +313 -700
  28. data/vendor/assets/javascripts/webshims/shims/combos/30.js +1868 -0
  29. data/vendor/assets/javascripts/webshims/shims/combos/31.js +1663 -0
  30. data/vendor/assets/javascripts/webshims/shims/combos/4.js +111 -20
  31. data/vendor/assets/javascripts/webshims/shims/combos/5.js +747 -1321
  32. data/vendor/assets/javascripts/webshims/shims/combos/6.js +837 -1809
  33. data/vendor/assets/javascripts/webshims/shims/combos/7.js +435 -1239
  34. data/vendor/assets/javascripts/webshims/shims/combos/8.js +360 -766
  35. data/vendor/assets/javascripts/webshims/shims/combos/9.js +843 -1676
  36. data/vendor/assets/javascripts/webshims/shims/details.js +1 -1
  37. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +90 -3
  38. data/vendor/assets/javascripts/webshims/shims/filereader.js +386 -0
  39. data/vendor/assets/javascripts/webshims/shims/form-core.js +201 -680
  40. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +418 -0
  41. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +69 -467
  42. data/vendor/assets/javascripts/webshims/shims/form-message.js +21 -17
  43. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +19 -82
  44. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +17 -6
  45. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +570 -1185
  46. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +181 -28
  47. data/vendor/assets/javascripts/webshims/shims/form-validation.js +599 -0
  48. data/vendor/assets/javascripts/webshims/{extras/custom-validity.js → shims/form-validators.js} +33 -38
  49. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +865 -0
  50. data/vendor/assets/javascripts/webshims/shims/geolocation.js +2 -2
  51. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.txt +37 -34
  52. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.txt +88 -48
  53. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-lt.js +74 -0
  54. data/vendor/assets/javascripts/webshims/shims/jpicker/ChangeLog.txt +121 -0
  55. data/vendor/assets/javascripts/webshims/shims/jpicker/ReadMe.txt +47 -0
  56. data/vendor/assets/javascripts/webshims/shims/jpicker/images/AlphaBar.png +0 -0
  57. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Bars.png +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Maps.png +0 -0
  59. data/vendor/assets/javascripts/webshims/shims/jpicker/images/NoColor.png +0 -0
  60. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Thumbs.db +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/jpicker/images/bar-opacity.png +0 -0
  62. data/vendor/assets/javascripts/webshims/shims/jpicker/images/map-opacity.png +0 -0
  63. data/vendor/assets/javascripts/webshims/shims/jpicker/images/mappoint.gif +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/jpicker/images/picker.gif +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/jpicker/images/preview-opacity.png +0 -0
  66. data/vendor/assets/javascripts/webshims/shims/jpicker/images/rangearrows.gif +0 -0
  67. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +257 -0
  68. data/vendor/assets/javascripts/webshims/shims/json-storage.js +4 -4
  69. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +44 -63
  70. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +10 -11
  71. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +2 -1
  72. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +5 -3
  73. data/vendor/assets/javascripts/webshims/shims/range-ui.js +110 -17
  74. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  75. data/vendor/assets/javascripts/webshims/shims/styles/range-track.png +0 -0
  76. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +104 -21
  77. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +90 -16
  78. data/vendor/assets/javascripts/webshims/shims/styles/vertical-range.png +0 -0
  79. data/vendor/assets/javascripts/webshims/shims/swf/filereader.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/shims/swfmini.js +1 -1
  81. data/vendor/assets/javascripts/webshims/shims/track-ui.js +35 -3
  82. data/vendor/assets/javascripts/webshims/shims/track.js +1 -1
  83. metadata +33 -3
@@ -8,7 +8,7 @@ var swfmini = function() {
8
8
 
9
9
  var UNDEF = "undefined",
10
10
  OBJECT = "object",
11
- webshims = jQuery.webshims,
11
+ webshims = jQuery.webshims || window.webshims,
12
12
  SHOCKWAVE_FLASH = "Shockwave Flash",
13
13
  SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
14
14
  FLASH_MIME_TYPE = "application/x-shockwave-flash",
@@ -1300,10 +1300,10 @@ if((!advancedObjectProperties || !Object.create || !Object.defineProperties || !
1300
1300
 
1301
1301
 
1302
1302
  //DOM-Extension helper
1303
- jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
1303
+ webshims.register('dom-extend', function($, webshims, window, document, undefined){
1304
1304
  "use strict";
1305
1305
 
1306
- webshims.assumeARIA = Modernizr.localstorage || Modernizr.video || Modernizr.boxsizing;
1306
+ webshims.assumeARIA = $.support.getSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
1307
1307
 
1308
1308
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
1309
1309
  webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
@@ -1312,6 +1312,57 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1312
1312
  if(!$.parseHTML){
1313
1313
  webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
1314
1314
  }
1315
+ if (!webshims.cfg.no$Switch) {
1316
+ var switch$ = function(){
1317
+ if (window.jQuery && (!window.$ || window.jQuery == window.$) && !window.jQuery.webshims) {
1318
+ webshims.error("jQuery was included more than once. Make sure to include it only once! Webshims and other Plugins might not work properly.");
1319
+ if (window.$) {
1320
+ window.$ = webshims.$;
1321
+ }
1322
+ window.jQuery = webshims.$;
1323
+ }
1324
+ if(webshims.M != Modernizr){
1325
+ webshims.error("Modernizr was included more than once. Make sure to include it only once! Webshims and other scripts might not work properly.");
1326
+ for(var i in Modernizr){
1327
+ if(!(i in webshims.M)){
1328
+ webshims.M[i] = Modernizr[i];
1329
+ }
1330
+ }
1331
+ Modernizr = webshims.M;
1332
+ }
1333
+ };
1334
+ switch$();
1335
+ setTimeout(switch$, 90);
1336
+ $(switch$);
1337
+ }
1338
+ // (function(){
1339
+ // var hostNames = {
1340
+ // 'afarkas.github.io': 1,
1341
+ // localhost: 1,
1342
+ // '127.0.0.1': 1
1343
+ // };
1344
+ //
1345
+ // if( webshims.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
1346
+ // var list = $('<ul class="webshims-debug-list" />');
1347
+ // webshims.errorLog.push = function(message){
1348
+ // list.appendTo('body');
1349
+ // $('<li style="display: none;">'+ message +'</li>')
1350
+ // .appendTo(list)
1351
+ // .slideDown()
1352
+ // .delay(3000)
1353
+ // .slideUp(function(){
1354
+ // $(this).remove();
1355
+ // if(!$('li', list).length){
1356
+ // list.detach();
1357
+ // }
1358
+ // })
1359
+ // ;
1360
+ // };
1361
+ // $.each(webshims.errorLog, function(i, message){
1362
+ // webshims.errorLog.push(message);
1363
+ // });
1364
+ // }
1365
+ // })();
1315
1366
 
1316
1367
  //shortcus
1317
1368
  var modules = webshims.modules;
@@ -1329,6 +1380,24 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1329
1380
  return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
1330
1381
  };
1331
1382
 
1383
+ //jquery mobile and jquery ui
1384
+ if(!$.widget){
1385
+ (function(){
1386
+ var _cleanData = $.cleanData;
1387
+ $.cleanData = function( elems ) {
1388
+ if(!$.widget){
1389
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
1390
+ try {
1391
+ $( elem ).triggerHandler( "remove" );
1392
+ // http://bugs.jquery.com/ticket/8235
1393
+ } catch( e ) {}
1394
+ }
1395
+ }
1396
+ _cleanData( elems );
1397
+ };
1398
+ })();
1399
+ }
1400
+
1332
1401
 
1333
1402
  $.fn.val = function(val){
1334
1403
  var elem = this[0];
@@ -1362,6 +1431,18 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1362
1431
  return this.on(evt, fn).each(fn);
1363
1432
  };
1364
1433
 
1434
+ $.fn.onWSOff = function(evt, fn, trigger, evtDel){
1435
+ if(!evtDel){
1436
+ evtDel = document;
1437
+ }
1438
+ $(evtDel)[trigger ? 'onTrigger' : 'on'](evt, fn);
1439
+ this.on('remove', function(e){
1440
+ if(!e.originalEvent){
1441
+ $(evtDel).off(evt, fn);
1442
+ }
1443
+ });
1444
+ };
1445
+
1365
1446
  var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
1366
1447
  var elementData = function(elem, key, val){
1367
1448
  elem = elem.jquery ? elem[0] : elem;
@@ -1723,7 +1804,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1723
1804
  implement: function(elem, type){
1724
1805
  var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
1725
1806
  if(data[type]){
1726
- webshims.info(type +' already implemented for element #'+elem.id);
1807
+ webshims.warn(type +' already implemented for element #'+elem.id);
1727
1808
  return false;
1728
1809
  }
1729
1810
  data[type] = true;
@@ -1867,6 +1948,12 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1867
1948
  shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
1868
1949
  }
1869
1950
 
1951
+ $(nativeElem).on('remove', function(e){
1952
+ if (!e.originalEvent) {
1953
+ $(shadowElem).remove();
1954
+ }
1955
+ });
1956
+
1870
1957
  nativeData.hasShadow = shadowElem;
1871
1958
  shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
1872
1959
  shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
@@ -2347,7 +2434,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
2347
2434
  var hasNative = Modernizr.audio && Modernizr.video;
2348
2435
  var supportsLoop = false;
2349
2436
  var bugs = webshims.bugs;
2350
-
2437
+ var swfType = 'mediaelement-jaris';
2351
2438
  var loadSwf = function(){
2352
2439
  webshims.ready(swfType, function(){
2353
2440
  if(!webshims.mediaelement.createSWF){
@@ -2357,7 +2444,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
2357
2444
  });
2358
2445
  };
2359
2446
  var options = webshims.cfg.mediaelement;
2360
- var swfType = 'mediaelement-jaris';
2447
+ var hasFullTrackSupport;
2361
2448
  var hasSwf;
2362
2449
  if(!options){
2363
2450
  webshims.error("mediaelement wasn't implemented but loaded");
@@ -2370,14 +2457,11 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
2370
2457
 
2371
2458
  webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
2372
2459
 
2373
- if(!Modernizr.videoBuffered){
2460
+ if(!Modernizr.videoBuffered ){
2374
2461
  webshims.addPolyfill('mediaelement-native-fix', {
2375
- f: 'mediaelement',
2376
- test: Modernizr.videoBuffered,
2377
2462
  d: ['dom-support']
2378
2463
  });
2379
-
2380
- webshims.reTest('mediaelement-native-fix');
2464
+ webshims.loader.loadList(['mediaelement-native-fix']);
2381
2465
  }
2382
2466
  }
2383
2467
 
@@ -2388,9 +2472,9 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
2388
2472
  };
2389
2473
  var switchOptions = function(e){
2390
2474
  var media;
2391
- var parent = e.target.parentNode;
2475
+ var parent;
2392
2476
  if(!options.preferFlash &&
2393
- ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) &&
2477
+ ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source:last', parent)[0] == e.target)) &&
2394
2478
  (media = $(e.target).closest('audio, video')) && !noSwitch[media.prop('error')]
2395
2479
  ){
2396
2480
  $(function(){
@@ -2404,7 +2488,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
2404
2488
  $('audio, video').each(function(){
2405
2489
  webshims.mediaelement.selectSource(this);
2406
2490
  });
2407
- webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
2491
+ webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
2408
2492
  }
2409
2493
  }, 9);
2410
2494
  });
@@ -2439,43 +2523,9 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
2439
2523
  bugs.track = true;
2440
2524
  }
2441
2525
  }
2442
-
2443
- var trackOptions = webshims.cfg.track;
2444
- var trackListener = function(e){
2445
- $(e.target).filter('track').each(changeApi);
2446
- };
2447
- var changeApi = function(){
2448
- if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
2449
- trackOptions.override = true;
2450
- webshims.reTest('track');
2451
- document.removeEventListener('error', trackListener, true);
2452
- if(this && $.nodeName(this, 'track')){
2453
- webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
2454
- } else {
2455
- webshims.info("track support was overwritten. due to bad browser support");
2456
- }
2457
- return false;
2458
- }
2459
- };
2460
- var detectTrackError = function(){
2461
- document.addEventListener('error', trackListener, true);
2462
-
2463
- if(bugs.track){
2464
- changeApi();
2465
- } else {
2466
- $('track').each(changeApi);
2467
- }
2468
- };
2469
- if(!trackOptions.override){
2470
- if(webshims.isReady('track')){
2471
- detectTrackError();
2472
- } else {
2473
- $(detectTrackError);
2474
- }
2475
- }
2476
2526
  })();
2477
-
2478
2527
  }
2528
+ hasFullTrackSupport = Modernizr.track && !bugs.track;
2479
2529
 
2480
2530
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
2481
2531
  hasSwf = swfmini.hasFlashPlayerVersion('9.0.115');
@@ -2560,7 +2610,8 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2560
2610
  var loadTrackUi = function(){
2561
2611
  if(loadTrackUi.loaded){return;}
2562
2612
  loadTrackUi.loaded = true;
2563
- $(function(){
2613
+ webshims.ready('WINDOWLOAD', function(){
2614
+ loadThird();
2564
2615
  webshims.loader.loadList(['track-ui']);
2565
2616
  });
2566
2617
  };
@@ -2733,27 +2784,40 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2733
2784
  }
2734
2785
  return ret;
2735
2786
  };
2736
-
2787
+ var emptyType = (/^\s*application\/octet\-stream\s*$/i);
2788
+ var getRemoveEmptyType = function(){
2789
+ var ret = emptyType.test($.attr(this, 'type') || '');
2790
+ if(ret){
2791
+ $(this).removeAttr('type');
2792
+ }
2793
+ return ret;
2794
+ };
2737
2795
  mediaelement.setError = function(elem, message){
2738
- if(!message){
2739
- message = "can't play sources";
2796
+ if($('source', elem).filter(getRemoveEmptyType).length){
2797
+ webshims.error('"application/octet-stream" is a useless mimetype for audio/video. Please change this attribute.');
2798
+ try {
2799
+ $(elem).mediaLoad();
2800
+ } catch(er){}
2801
+ } else {
2802
+ if(!message){
2803
+ message = "can't play sources";
2804
+ }
2805
+ $(elem).pause().data('mediaerror', message);
2806
+ webshims.error('mediaelementError: '+ message);
2807
+ setTimeout(function(){
2808
+ if($(elem).data('mediaerror')){
2809
+ $(elem).trigger('mediaerror');
2810
+ }
2811
+ }, 1);
2740
2812
  }
2741
2813
 
2742
- $(elem).pause().data('mediaerror', message);
2743
- webshims.error('mediaelementError: '+ message);
2744
- setTimeout(function(){
2745
- if($(elem).data('mediaerror')){
2746
- $(elem).trigger('mediaerror');
2747
- }
2748
- }, 1);
2814
+
2749
2815
  };
2750
2816
 
2751
2817
  var handleThird = (function(){
2752
2818
  var requested;
2753
2819
  return function( mediaElem, ret, data ){
2754
- if(!requested){
2755
- loadTrackUi();
2756
- }
2820
+
2757
2821
  webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
2758
2822
  if(mediaelement.createSWF){
2759
2823
  mediaelement.createSWF( mediaElem, ret, data );
@@ -2898,6 +2962,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2898
2962
  var buffered = getBufferedString();
2899
2963
  if(buffered != lastBuffered){
2900
2964
  lastBuffered = buffered;
2965
+ webshims.info('needed to trigger progress manually');
2901
2966
  $(elem).triggerHandler('progress');
2902
2967
  }
2903
2968
  };
@@ -2949,11 +3014,14 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2949
3014
  $('video, audio', context)
2950
3015
  .add(insertedElement.filter('video, audio'))
2951
3016
  .each(function(){
2952
- if(!mediaelement.canNativePlaySrces(this) || (!loadTrackUi.loaded && $('track', this).length)){
3017
+ if(!mediaelement.canNativePlaySrces(this)){
2953
3018
  loadThird();
2954
3019
  handleMedia = true;
2955
3020
  return false;
2956
3021
  }
3022
+ if((!hasFullTrackSupport || webshims.modules.track.options.override) && !loadTrackUi.loaded && $('track', this).length){
3023
+ loadTrackUi();
3024
+ }
2957
3025
  })
2958
3026
  ;
2959
3027
  }
@@ -2961,7 +3029,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2961
3029
  }
2962
3030
  };
2963
3031
 
2964
- if(Modernizr.track && !bugs.track){
3032
+ if(hasFullTrackSupport){
2965
3033
  webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
2966
3034
  get: function(){
2967
3035
  return this._shimActiveCues || this.activeCues;
@@ -2976,10 +3044,10 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
2976
3044
  } else {
2977
3045
  webshims.ready(swfType, initMediaElements);
2978
3046
  }
2979
- webshims.ready('WINDOWLOAD mediaelement', loadTrackUi);
3047
+ webshims.ready('track', loadTrackUi);
2980
3048
  });
2981
- })(jQuery, Modernizr, jQuery.webshims);
2982
- jQuery.webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
3049
+ })(jQuery, Modernizr, webshims);
3050
+ webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
2983
3051
  "use strict";
2984
3052
 
2985
3053
  var mediaelement = webshims.mediaelement;
@@ -3583,8 +3651,10 @@ jQuery.webshims.register('mediaelement-jaris', function($, webshims, window, doc
3583
3651
  webshims.addShadowDom(elem, box);
3584
3652
  addMediaToStopEvents(elem);
3585
3653
  mediaelement.setActive(elem, 'third', data);
3586
- $(elem).on('updatemediaelementdimensions', setDimension);
3587
- $(document).on('updateshadowdom', setDimension);
3654
+ $(elem)
3655
+ .on({'updatemediaelementdimensions': setDimension})
3656
+ .onWSOff('updateshadowdom', setDimension)
3657
+ ;
3588
3658
  }
3589
3659
 
3590
3660
  if(!mediaelement.jarisEvent[data.id]){
@@ -3846,13 +3916,11 @@ jQuery.webshims.register('mediaelement-jaris', function($, webshims, window, doc
3846
3916
  if(elems && (len = elems.length) && loadedSwf){
3847
3917
 
3848
3918
  for(i = 0; i < len; i++){
3849
- if(flashNames[elems[i].nodeName]){
3850
- if('api_pause' in elems[i]){
3851
- loadedSwf--;
3852
- try {
3853
- elems[i].api_pause();
3854
- } catch(er){}
3855
- }
3919
+ if(flashNames[elems[i].nodeName] && 'api_pause' in elems[i]){
3920
+ loadedSwf--;
3921
+ try {
3922
+ elems[i].api_pause();
3923
+ } catch(er){}
3856
3924
  }
3857
3925
  }
3858
3926
 
@@ -3915,5 +3983,4 @@ jQuery.webshims.register('mediaelement-jaris', function($, webshims, window, doc
3915
3983
  }, 'prop');
3916
3984
  }
3917
3985
 
3918
-
3919
3986
  });
@@ -8,7 +8,7 @@ var swfmini = function() {
8
8
 
9
9
  var UNDEF = "undefined",
10
10
  OBJECT = "object",
11
- webshims = jQuery.webshims,
11
+ webshims = jQuery.webshims || window.webshims,
12
12
  SHOCKWAVE_FLASH = "Shockwave Flash",
13
13
  SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
14
14
  FLASH_MIME_TYPE = "application/x-shockwave-flash",
@@ -497,10 +497,10 @@ var swfmini = function() {
497
497
  }();
498
498
 
499
499
  //DOM-Extension helper
500
- jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
500
+ webshims.register('dom-extend', function($, webshims, window, document, undefined){
501
501
  "use strict";
502
502
 
503
- webshims.assumeARIA = Modernizr.localstorage || Modernizr.video || Modernizr.boxsizing;
503
+ webshims.assumeARIA = $.support.getSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
504
504
 
505
505
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
506
506
  webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
@@ -509,6 +509,57 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
509
509
  if(!$.parseHTML){
510
510
  webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
511
511
  }
512
+ if (!webshims.cfg.no$Switch) {
513
+ var switch$ = function(){
514
+ if (window.jQuery && (!window.$ || window.jQuery == window.$) && !window.jQuery.webshims) {
515
+ webshims.error("jQuery was included more than once. Make sure to include it only once! Webshims and other Plugins might not work properly.");
516
+ if (window.$) {
517
+ window.$ = webshims.$;
518
+ }
519
+ window.jQuery = webshims.$;
520
+ }
521
+ if(webshims.M != Modernizr){
522
+ webshims.error("Modernizr was included more than once. Make sure to include it only once! Webshims and other scripts might not work properly.");
523
+ for(var i in Modernizr){
524
+ if(!(i in webshims.M)){
525
+ webshims.M[i] = Modernizr[i];
526
+ }
527
+ }
528
+ Modernizr = webshims.M;
529
+ }
530
+ };
531
+ switch$();
532
+ setTimeout(switch$, 90);
533
+ $(switch$);
534
+ }
535
+ // (function(){
536
+ // var hostNames = {
537
+ // 'afarkas.github.io': 1,
538
+ // localhost: 1,
539
+ // '127.0.0.1': 1
540
+ // };
541
+ //
542
+ // if( webshims.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
543
+ // var list = $('<ul class="webshims-debug-list" />');
544
+ // webshims.errorLog.push = function(message){
545
+ // list.appendTo('body');
546
+ // $('<li style="display: none;">'+ message +'</li>')
547
+ // .appendTo(list)
548
+ // .slideDown()
549
+ // .delay(3000)
550
+ // .slideUp(function(){
551
+ // $(this).remove();
552
+ // if(!$('li', list).length){
553
+ // list.detach();
554
+ // }
555
+ // })
556
+ // ;
557
+ // };
558
+ // $.each(webshims.errorLog, function(i, message){
559
+ // webshims.errorLog.push(message);
560
+ // });
561
+ // }
562
+ // })();
512
563
 
513
564
  //shortcus
514
565
  var modules = webshims.modules;
@@ -526,6 +577,24 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
526
577
  return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
527
578
  };
528
579
 
580
+ //jquery mobile and jquery ui
581
+ if(!$.widget){
582
+ (function(){
583
+ var _cleanData = $.cleanData;
584
+ $.cleanData = function( elems ) {
585
+ if(!$.widget){
586
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
587
+ try {
588
+ $( elem ).triggerHandler( "remove" );
589
+ // http://bugs.jquery.com/ticket/8235
590
+ } catch( e ) {}
591
+ }
592
+ }
593
+ _cleanData( elems );
594
+ };
595
+ })();
596
+ }
597
+
529
598
 
530
599
  $.fn.val = function(val){
531
600
  var elem = this[0];
@@ -559,6 +628,18 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
559
628
  return this.on(evt, fn).each(fn);
560
629
  };
561
630
 
631
+ $.fn.onWSOff = function(evt, fn, trigger, evtDel){
632
+ if(!evtDel){
633
+ evtDel = document;
634
+ }
635
+ $(evtDel)[trigger ? 'onTrigger' : 'on'](evt, fn);
636
+ this.on('remove', function(e){
637
+ if(!e.originalEvent){
638
+ $(evtDel).off(evt, fn);
639
+ }
640
+ });
641
+ };
642
+
562
643
  var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
563
644
  var elementData = function(elem, key, val){
564
645
  elem = elem.jquery ? elem[0] : elem;
@@ -920,7 +1001,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
920
1001
  implement: function(elem, type){
921
1002
  var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
922
1003
  if(data[type]){
923
- webshims.info(type +' already implemented for element #'+elem.id);
1004
+ webshims.warn(type +' already implemented for element #'+elem.id);
924
1005
  return false;
925
1006
  }
926
1007
  data[type] = true;
@@ -1064,6 +1145,12 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1064
1145
  shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
1065
1146
  }
1066
1147
 
1148
+ $(nativeElem).on('remove', function(e){
1149
+ if (!e.originalEvent) {
1150
+ $(shadowElem).remove();
1151
+ }
1152
+ });
1153
+
1067
1154
  nativeData.hasShadow = shadowElem;
1068
1155
  shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
1069
1156
  shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
@@ -1539,32 +1626,9 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1539
1626
 
1540
1627
  })(jQuery, document);
1541
1628
 
1542
- //additional tests for partial implementation of forms features
1543
- (function($){
1629
+ webshims.register('form-core', function($, webshims, window, document, undefined, options){
1544
1630
  "use strict";
1545
- var isWebkit = 'webkitURL' in window;
1546
- var Modernizr = window.Modernizr;
1547
- var webshims = $.webshims;
1548
- var bugs = webshims.bugs;
1549
- var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
1550
- var testRequiredFind = function(){
1551
- if(form[0].querySelector){
1552
- try {
1553
- bugs.findRequired = !(form[0].querySelector('select:required'));
1554
- } catch(er){
1555
- bugs.findRequired = false;
1556
- }
1557
- }
1558
- };
1559
- var inputElem = $('input', form).eq(0);
1560
- var onDomextend = function(fn){
1561
- webshims.loader.loadList(['dom-extend']);
1562
- webshims.ready('dom-extend', fn);
1563
- };
1564
-
1565
- bugs.findRequired = false;
1566
- bugs.validationMessage = false;
1567
-
1631
+
1568
1632
  webshims.capturingEventPrevented = function(e){
1569
1633
  if(!e._isPolyfilled){
1570
1634
  var isDefaultPrevented = e.isDefaultPrevented;
@@ -1583,771 +1647,322 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1583
1647
  }
1584
1648
  };
1585
1649
 
1586
- if(!Modernizr.formvalidation || bugs.bustedValidity){
1587
- testRequiredFind();
1588
- } else {
1650
+ if(Modernizr.formvalidation && !webshims.bugs.bustedValidity){
1589
1651
  //create delegatable events
1590
1652
  webshims.capturingEvents(['invalid'], true);
1591
-
1592
- if(window.opera || window.testGoodWithFix){
1593
-
1594
- form.appendTo('head');
1595
-
1596
- testRequiredFind();
1597
- bugs.validationMessage = !(inputElem.prop('validationMessage'));
1653
+ }
1654
+
1655
+ var isValid = function(elem){
1656
+ return ($.prop(elem, 'validity') || {valid: 1}).valid;
1657
+ };
1658
+ var lazyLoad = function(){
1659
+ var toLoad = ['form-validation'];
1660
+ if(options.lazyCustomMessages){
1661
+ options.customMessages = true;
1662
+ toLoad.push('form-message');
1663
+ }
1664
+ if(options.addValidators){
1665
+ toLoad.push('form-validators');
1666
+ }
1667
+ webshims.reTest(toLoad);
1668
+ $(document).off('.lazyloadvalidation');
1669
+ };
1670
+ /*
1671
+ * Selectors for all browsers
1672
+ */
1673
+ var hasInvalid = function(elem){
1674
+ var ret = false;
1675
+ $(elem).jProp('elements').each(function(){
1676
+ ret = $(this).is(':invalid');
1677
+ if(ret){
1678
+ return false;
1679
+ }
1680
+ });
1681
+ return ret;
1682
+ };
1683
+ var rElementsGroup = /^(?:form)$/i;///^(?:form|fieldset)$/i
1684
+ $.extend($.expr[":"], {
1685
+ "valid-element": function(elem){
1686
+ return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1687
+ },
1688
+ "invalid-element": function(elem){
1689
+ return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1690
+ },
1691
+ "required-element": function(elem){
1692
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1693
+ },
1694
+ "user-error": function(elem){
1695
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1696
+ },
1697
+ "optional-element": function(elem){
1698
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1699
+ }
1700
+ });
1701
+
1702
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1703
+ $.expr[":"][name] = $.expr.filters[name+"-element"];
1704
+ });
1705
+
1706
+
1707
+ $.expr[":"].focus = function( elem ) {
1708
+ try {
1709
+ var doc = elem.ownerDocument;
1710
+ return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
1711
+ } catch(e){}
1712
+ return false;
1713
+ };
1714
+
1715
+ webshims.triggerInlineForm = function(elem, event){
1716
+ $(elem).trigger(event);
1717
+ };
1718
+
1719
+ var lazyLoadProxy = function(obj, fn, args){
1720
+ lazyLoad();
1721
+ webshims.ready('form-validation', function(){
1722
+ obj[fn].apply(obj, args);
1723
+ });
1724
+ };
1725
+
1726
+
1727
+ webshims.wsPopover = {
1728
+ id: 0,
1729
+ _create: function(){
1730
+ this.options = $.extend({}, webshims.cfg.wspopover, this.options);
1731
+ this.id = webshims.wsPopover.id++;
1732
+ this.eventns = '.wsoverlay' + this.id;
1733
+ this.timers = {};
1734
+ this.element = $('<div class="ws-popover" tabindex="-1"><div class="ws-po-outerbox"><div class="ws-po-arrow"><div class="ws-po-arrowbox" /></div><div class="ws-po-box" /></div></div>');
1735
+ this.contentElement = $('.ws-po-box', this.element);
1736
+ this.lastElement = $([]);
1737
+ this.bindElement();
1598
1738
 
1599
- webshims.reTest(['form-native-extend', 'form-message']);
1739
+ this.element.data('wspopover', this);
1600
1740
 
1601
- form.remove();
1602
-
1603
- $(function(){
1604
- onDomextend(function(){
1605
-
1606
- //Opera shows native validation bubbles in case of input.checkValidity()
1607
- // Opera 11.6/12 hasn't fixed this issue right, it's buggy
1608
- var preventDefault = function(e){
1609
- e.preventDefault();
1610
- };
1611
-
1612
- ['form', 'input', 'textarea', 'select'].forEach(function(name){
1613
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
1614
- prop: {
1615
- value: function(){
1616
- if (!webshims.fromSubmit) {
1617
- $(this).on('invalid.checkvalidity', preventDefault);
1618
- }
1619
-
1620
- webshims.fromCheckValidity = true;
1621
- var ret = desc.prop._supvalue.apply(this, arguments);
1622
- if (!webshims.fromSubmit) {
1623
- $(this).unbind('invalid.checkvalidity', preventDefault);
1624
- }
1625
- webshims.fromCheckValidity = false;
1626
- return ret;
1627
- }
1628
- }
1629
- });
1630
- });
1631
-
1632
- });
1741
+ },
1742
+ options: {},
1743
+ content: function(html){
1744
+ this.contentElement.html(html);
1745
+ },
1746
+ bindElement: function(){
1747
+ var that = this;
1748
+ var stopBlur = function(){
1749
+ that.stopBlur = false;
1750
+ };
1751
+ this.preventBlur = function(e){
1752
+ that.stopBlur = true;
1753
+ clearTimeout(that.timers.stopBlur);
1754
+ that.timers.stopBlur = setTimeout(stopBlur, 9);
1755
+ };
1756
+ this.element.on({
1757
+ 'mousedown': this.preventBlur
1633
1758
  });
1759
+ },
1760
+ show: function(){
1761
+ lazyLoadProxy(this, 'show', arguments);
1762
+ }
1763
+ };
1764
+
1765
+ /* some extra validation UI */
1766
+ webshims.validityAlert = {
1767
+ showFor: function(){
1768
+ lazyLoadProxy(this, 'showFor', arguments);
1634
1769
  }
1770
+ };
1771
+
1772
+
1773
+ /* extension, but also used to fix native implementation workaround/bugfixes */
1774
+ (function(){
1775
+ var firstEvent,
1776
+ invalids = [],
1777
+ stopSubmitTimer,
1778
+ form
1779
+ ;
1635
1780
 
1636
- if(isWebkit && !webshims.bugs.bustedValidity){
1637
- (function(){
1638
- var elems = /^(?:textarea|input)$/i;
1639
- var form = false;
1640
-
1641
- document.addEventListener('contextmenu', function(e){
1642
- if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
1643
- setTimeout(function(){
1644
- form = false;
1645
- }, 1);
1646
- }
1647
- }, false);
1648
-
1649
- $(window).on('invalid', function(e){
1650
- if(e.originalEvent && form && form == e.target.form){
1651
- e.wrongWebkitInvalid = true;
1652
- e.stopImmediatePropagation();
1781
+ $(document).on('invalid', function(e){
1782
+ if(e.wrongWebkitInvalid){return;}
1783
+ var jElm = $(e.target);
1784
+
1785
+
1786
+ if(!firstEvent){
1787
+ //trigger firstinvalid
1788
+ firstEvent = $.Event('firstinvalid');
1789
+ firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
1790
+ var firstSystemInvalid = $.Event('firstinvalidsystem');
1791
+ $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
1792
+ jElm.trigger(firstEvent);
1793
+ }
1794
+
1795
+ //if firstinvalid was prevented all invalids will be also prevented
1796
+ if( firstEvent && firstEvent.isDefaultPrevented() ){
1797
+ e.preventDefault();
1798
+ }
1799
+ invalids.push(e.target);
1800
+ e.extraData = 'fix';
1801
+ clearTimeout(stopSubmitTimer);
1802
+ stopSubmitTimer = setTimeout(function(){
1803
+ var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
1804
+ //reset firstinvalid
1805
+ firstEvent = false;
1806
+ invalids = [];
1807
+ $(e.target).trigger(lastEvent, lastEvent);
1808
+ }, 9);
1809
+ jElm = null;
1810
+ });
1811
+ })();
1812
+
1813
+
1814
+ webshims.getContentValidationMessage = function(elem, validity, key){
1815
+ var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1816
+ if(key && message[key]){
1817
+ message = message[key];
1818
+ }
1819
+ if(typeof message == 'object'){
1820
+ validity = validity || $.prop(elem, 'validity') || {valid: 1};
1821
+ if(!validity.valid){
1822
+ $.each(validity, function(name, prop){
1823
+ if(prop && name != 'valid' && message[name]){
1824
+ message = message[name];
1825
+ return false;
1653
1826
  }
1654
1827
  });
1655
-
1656
- })();
1657
- }
1658
- }
1659
-
1660
- $.webshims.register('form-core', function($, webshims, window, document, undefined, options){
1661
-
1662
- var checkTypes = {checkbox: 1, radio: 1};
1663
- var emptyJ = $([]);
1664
- var bugs = webshims.bugs;
1665
- var getGroupElements = function(elem){
1666
- elem = $(elem);
1667
- var name;
1668
- var form;
1669
- var ret = emptyJ;
1670
- if(elem[0].type == 'radio'){
1671
- form = elem.prop('form');
1672
- name = elem[0].name;
1673
- if(!name){
1674
- ret = elem;
1675
- } else if(form){
1676
- ret = $(form[name]);
1677
- } else {
1678
- ret = $(document.getElementsByName(name)).filter(function(){
1679
- return !$.prop(this, 'form');
1680
- });
1681
- }
1682
- ret = ret.filter('[type="radio"]');
1683
1828
  }
1684
- return ret;
1685
- };
1829
+ }
1686
1830
 
1687
- var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
1688
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1689
- if(key && message[key]){
1690
- message = message[key];
1691
- }
1692
- if(typeof message == 'object'){
1693
- validity = validity || $.prop(elem, 'validity') || {valid: 1};
1694
- if(!validity.valid){
1695
- $.each(validity, function(name, prop){
1696
- if(prop && name != 'valid' && message[name]){
1697
- message = message[name];
1698
- return false;
1699
- }
1700
- });
1701
- }
1702
- }
1703
-
1704
- if(typeof message == 'object'){
1705
- message = message.defaultMessage;
1831
+ if(typeof message == 'object'){
1832
+ message = message.defaultMessage;
1833
+ }
1834
+ return message || '';
1835
+ };
1836
+
1837
+ $.fn.getErrorMessage = function(key){
1838
+ var message = '';
1839
+ var elem = this[0];
1840
+ if(elem){
1841
+ message = webshims.getContentValidationMessage(elem, false, key) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
1842
+ }
1843
+ return message;
1844
+ };
1845
+
1846
+
1847
+ webshims.ready('forms', function(){
1848
+ $(document).on('focusin.lazyloadvalidation', function(e){
1849
+ if('form' in e.target && $(e.target).is(':invalid')){
1850
+ lazyLoad();
1706
1851
  }
1707
- return message || '';
1708
- };
1709
-
1710
- /*
1711
- * Selectors for all browsers
1712
- */
1713
- var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
1714
- var hasInvalid = function(elem){
1715
- var ret = false;
1716
- $($.prop(elem, 'elements')).each(function(){
1717
- ret = $(this).is(':invalid');
1718
- if(ret){
1719
- return false;
1852
+ });
1853
+ });
1854
+ webshims.ready('WINDOWLOAD', lazyLoad);
1855
+ if(options.overrideMessages){
1856
+ options.customMessages = true;
1857
+ webshims.reTest('form-message');
1858
+ webshims.error('overrideMessages is deprecated. use customMessages instead.');
1859
+ }
1860
+ if(options.replaceValidationUI){
1861
+ webshims.ready('DOM forms', function(){
1862
+ $(document).on('firstinvalid', function(e){
1863
+ if(!e.isInvalidUIPrevented()){
1864
+ e.preventDefault();
1865
+ webshims.validityAlert.showFor( e.target );
1720
1866
  }
1721
1867
  });
1722
- return ret;
1723
- };
1724
- $.extend($.expr[":"], {
1725
- "valid-element": function(elem){
1726
- return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1727
- },
1728
- "invalid-element": function(elem){
1729
- return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1730
- },
1731
- "required-element": function(elem){
1732
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1733
- },
1734
- "user-error": function(elem){
1735
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1736
- },
1737
- "optional-element": function(elem){
1738
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1739
- },
1740
- "in-range": function(elem){
1741
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
1742
- return false;
1743
- }
1744
- var val = $.prop(elem, 'validity');
1745
- return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
1746
- },
1747
- "out-of-range": function(elem){
1748
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
1749
- return false;
1750
- }
1751
- var val = $.prop(elem, 'validity');
1752
- return !!(val && (val.rangeOverflow || val.rangeUnderflow));
1753
- }
1754
-
1755
1868
  });
1756
-
1757
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1758
- $.expr[":"][name] = $.expr.filters[name+"-element"];
1869
+ }
1870
+ });
1871
+
1872
+
1873
+ webshims.register('form-datalist', function($, webshims, window, document, undefined, options){
1874
+ "use strict";
1875
+ var doc = document;
1876
+ var lazyLoad = function(name){
1877
+ if(!name || typeof name != 'string'){
1878
+ name = 'DOM';
1879
+ }
1880
+ if(!lazyLoad[name+'Loaded']){
1881
+ lazyLoad[name+'Loaded'] = true;
1882
+ webshims.ready(name, function(){
1883
+ webshims.loader.loadList(['form-datalist-lazy']);
1884
+ });
1885
+ }
1886
+ };
1887
+ var noDatalistSupport = {
1888
+ submit: 1,
1889
+ button: 1,
1890
+ reset: 1,
1891
+ hidden: 1,
1892
+
1893
+ range: 1,
1894
+ date: 1,
1895
+ month: 1
1896
+ };
1897
+ if(webshims.modules["form-number-date-ui"].loaded){
1898
+ $.extend(noDatalistSupport, {
1899
+ number: 1,
1900
+ time: 1
1759
1901
  });
1760
-
1761
-
1762
- $.expr[":"].focus = function( elem ) {
1763
- try {
1764
- var doc = elem.ownerDocument;
1765
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
1766
- } catch(e){}
1767
- return false;
1768
- };
1769
-
1770
-
1771
- var customEvents = $.event.customEvent || {};
1772
- var isValid = function(elem){
1773
- return ($.prop(elem, 'validity') || {valid: 1}).valid;
1902
+ }
1903
+
1904
+
1905
+ /*
1906
+ * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
1907
+ */
1908
+ webshims.propTypes.element = function(descs){
1909
+ webshims.createPropDefault(descs, 'attr');
1910
+ if(descs.prop){return;}
1911
+ descs.prop = {
1912
+ get: function(){
1913
+ var elem = $.attr(this, 'list');
1914
+ if(elem){
1915
+ elem = document.getElementById(elem);
1916
+ if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
1917
+ elem = null;
1918
+ }
1919
+ }
1920
+ return elem || null;
1921
+ },
1922
+ writeable: false
1774
1923
  };
1924
+ };
1925
+
1926
+
1927
+ /*
1928
+ * Implements datalist element and list attribute
1929
+ */
1930
+
1931
+ (function(){
1932
+ var formsCFG = $.webshims.cfg.forms;
1933
+ var listSupport = Modernizr.input.list;
1934
+ if(listSupport && !formsCFG.customDatalist){return;}
1775
1935
 
1776
- if (bugs.bustedValidity || bugs.findRequired) {
1777
- (function(){
1778
- var find = $.find;
1779
- var matchesSelector = $.find.matchesSelector;
1936
+ var initializeDatalist = function(){
1780
1937
 
1781
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
1782
- var regFn = function(sel){
1783
- return sel + '-element';
1784
- };
1785
1938
 
1786
- $.find = (function(){
1787
- var slice = Array.prototype.slice;
1788
- var fn = function(sel){
1789
- var ar = arguments;
1790
- ar = slice.call(ar, 1, ar.length);
1791
- ar.unshift(sel.replace(regExp, regFn));
1792
- return find.apply(this, ar);
1793
- };
1794
- for (var i in find) {
1795
- if(find.hasOwnProperty(i)){
1796
- fn[i] = find[i];
1797
- }
1798
- }
1799
- return fn;
1800
- })();
1801
- if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
1802
- $.find.matchesSelector = function(node, expr){
1803
- expr = expr.replace(regExp, regFn);
1804
- return matchesSelector.call(this, node, expr);
1805
- };
1806
- }
1807
-
1808
- })();
1809
- }
1810
-
1811
- //ToDo needs testing
1812
- var oldAttr = $.prop;
1813
- var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
1814
- $.prop = function(elem, name, val){
1815
- var ret = oldAttr.apply(this, arguments);
1816
- if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
1817
- if(isValid(elem)){
1818
- $(elem).getShadowElement().removeClass(invalidClass);
1819
- if(name == 'checked' && val) {
1820
- getGroupElements(elem).not(elem).removeClass(invalidClass).removeAttr('aria-invalid');
1821
- }
1822
- }
1823
- }
1824
- return ret;
1825
- };
1826
-
1827
- var returnValidityCause = function(validity, elem){
1828
- var ret;
1829
- $.each(validity, function(name, value){
1830
- if(value){
1831
- ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
1832
- return false;
1833
- }
1834
- });
1835
- return ret;
1836
- };
1837
-
1838
- var isInGroup = function(name){
1839
- var ret;
1840
- try {
1841
- ret = document.activeElement.name === name;
1842
- } catch(e){}
1843
- return ret;
1844
- };
1845
- /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-success instead */
1846
- var invalidClass = 'user-error';
1847
- var validClass = 'user-success';
1848
- var stopChangeTypes = {
1849
- time: 1,
1850
- date: 1,
1851
- month: 1,
1852
- datetime: 1,
1853
- week: 1,
1854
- 'datetime-local': 1
1855
- };
1856
- var switchValidityClass = function(e){
1857
- var elem, timer;
1858
- if(!e.target){return;}
1859
- elem = $(e.target).getNativeElement()[0];
1860
- if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
1861
- timer = $.data(elem, 'webshimsswitchvalidityclass');
1862
- var switchClass = function(){
1863
- if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
1864
- var validity = $.prop(elem, 'validity');
1865
- var shadowElem = $(elem).getShadowElement();
1866
- var addClass, removeClass, trigger, generaltrigger, validityCause;
1867
-
1868
- if(isWebkit && e.type == 'change' && !bugs.bustedValidity && stopChangeTypes[shadowElem.prop('type')] && shadowElem.is(':focus')){return;}
1869
-
1870
- $(elem).trigger('refreshCustomValidityRules');
1871
-
1872
- if(validity.valid){
1873
- if(!shadowElem.hasClass(validClass)){
1874
- addClass = validClass;
1875
- removeClass = invalidClass;
1876
- generaltrigger = 'changedvaliditystate';
1877
- trigger = 'changedvalid';
1878
- if(checkTypes[elem.type] && elem.checked){
1879
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
1880
- }
1881
- $.removeData(elem, 'webshimsinvalidcause');
1882
- }
1883
- } else {
1884
- validityCause = returnValidityCause(validity, elem);
1885
- if($.data(elem, 'webshimsinvalidcause') != validityCause){
1886
- $.data(elem, 'webshimsinvalidcause', validityCause);
1887
- generaltrigger = 'changedvaliditystate';
1888
- }
1889
- if(!shadowElem.hasClass(invalidClass)){
1890
- addClass = invalidClass;
1891
- removeClass = validClass;
1892
- if (checkTypes[elem.type] && !elem.checked) {
1893
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
1894
- }
1895
- trigger = 'changedinvalid';
1896
- }
1897
- }
1898
-
1899
- if(addClass){
1900
- shadowElem.addClass(addClass).removeClass(removeClass);
1901
- //jQuery 1.6.1 IE9 bug (doubble trigger bug)
1902
- setTimeout(function(){
1903
- $(elem).trigger(trigger);
1904
- }, 0);
1905
- }
1906
- if(generaltrigger){
1907
- setTimeout(function(){
1908
- $(elem).trigger(generaltrigger);
1909
- }, 0);
1910
- }
1911
-
1912
- $.removeData(elem, 'webshimsswitchvalidityclass');
1913
- };
1914
-
1915
- if(timer){
1916
- clearTimeout(timer);
1917
- }
1918
- if(e.type == 'refreshvalidityui'){
1919
- switchClass();
1920
- } else {
1921
- $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
1922
- }
1923
- };
1924
-
1925
- $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
1926
- customEvents.changedvaliditystate = true;
1927
- customEvents.refreshCustomValidityRules = true;
1928
- customEvents.changedvalid = true;
1929
- customEvents.changedinvalid = true;
1930
- customEvents.refreshvalidityui = true;
1931
-
1932
-
1933
- webshims.triggerInlineForm = function(elem, event){
1934
- $(elem).trigger(event);
1935
- };
1936
-
1937
- webshims.modules["form-core"].getGroupElements = getGroupElements;
1938
-
1939
-
1940
- var setRoot = function(){
1941
- webshims.scrollRoot = (isWebkit || document.compatMode == 'BackCompat') ?
1942
- $(document.body) :
1943
- $(document.documentElement)
1944
- ;
1945
- };
1946
- var minWidth = (Modernizr.boxSizing || Modernizr['display-table'] || $.support.getSetAttribute) ?
1947
- 'minWidth' :
1948
- 'width'
1949
- ;
1950
- setRoot();
1951
- webshims.ready('DOM', setRoot);
1952
-
1953
- webshims.getRelOffset = function(posElem, relElem){
1954
- posElem = $(posElem);
1955
- var offset = $(relElem).offset();
1956
- var bodyOffset;
1957
- $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
1958
- bodyOffset = posElem.offset();
1959
- });
1960
- offset.top -= bodyOffset.top;
1961
- offset.left -= bodyOffset.left;
1962
- return offset;
1963
- };
1964
-
1965
- webshims.wsPopover = {
1966
- _create: function(){
1967
- this.options = $.extend({}, webshims.cfg.wspopover, this.options);
1968
- this.id = webshims.wsPopover.id++;
1969
- this.eventns = '.wsoverlay'+this.id;
1970
- this.timers = {};
1971
- this.element = $('<div class="ws-popover" tabindex="-1"><div class="ws-po-outerbox"><div class="ws-po-arrow"><div class="ws-po-arrowbox" /></div><div class="ws-po-box" /></div></div>');
1972
- this.contentElement = $('.ws-po-box', this.element);
1973
- this.lastElement = $([]);
1974
- this.bindElement();
1975
-
1976
- this.element.data('wspopover', this);
1977
-
1978
- },
1979
- options: {},
1980
- content: function(html){
1981
- this.contentElement.html(html);
1982
- },
1983
- bindElement: function(){
1984
- var that = this;
1985
- var stopBlur = function(){
1986
- that.stopBlur = false;
1987
- };
1988
- this.preventBlur = function(e){
1989
- that.stopBlur = true;
1990
- clearTimeout(that.timers.stopBlur);
1991
- that.timers.stopBlur = setTimeout(stopBlur, 9);
1992
- };
1993
- this.element.on({
1994
- 'mousedown': this.preventBlur
1995
- });
1996
- },
1997
-
1998
- isInElement: function(container, contained){
1999
- return container == contained || $.contains(container, contained);
2000
- },
2001
- show: function(element){
2002
- var e = $.Event('wspopoverbeforeshow');
2003
- this.element.trigger(e);
2004
- if(e.isDefaultPrevented() || this.isVisible){return;}
2005
- this.isVisible = true;
2006
- element = $(element || this.options.prepareFor).getNativeElement() ;
2007
-
2008
- var that = this;
2009
- var visual = $(element).getShadowElement();
2010
-
2011
- this.clear();
2012
- this.element.removeClass('ws-po-visible').css('display', 'none');
2013
-
2014
- this.prepareFor(element, visual);
2015
-
2016
- this.position(visual);
2017
- that.timers.show = setTimeout(function(){
2018
- that.element.css('display', '');
2019
- that.timers.show = setTimeout(function(){
2020
- that.element.addClass('ws-po-visible').trigger('wspopovershow');
2021
- }, 9);
2022
- }, 9);
2023
- $(document).on('focusin'+this.eventns+' mousedown'+this.eventns, function(e){
2024
- if(that.options.hideOnBlur && !that.stopBlur && !that.isInElement(that.lastElement[0] || document.body, e.target) && !that.isInElement(element[0] || document.body, e.target) && !that.isInElement(that.element[0], e.target)){
2025
- that.hide();
2026
- }
2027
- });
2028
- $(window).on('resize'+this.eventns + ' pospopover'+this.eventns, function(){
2029
- clearTimeout(that.timers.repos);
2030
- that.timers.repos = setTimeout(function(){
2031
- that.position(visual);
2032
- }, 900);
2033
- });
2034
- },
2035
- prepareFor: function(element, visual){
2036
- var onBlur;
2037
- var opts = $.extend({}, this.options, $(element.prop('form') || []).data('wspopover') || {}, element.data('wspopover'));
2038
- var that = this;
2039
- var css = {};
2040
- this.lastElement = $(element).getShadowFocusElement();
2041
- if(opts.appendTo == 'element'){
2042
- this.element.insertAfter(element);
2043
- } else {
2044
- this.element.appendTo(opts.appendTo);
2045
- }
2046
-
2047
- this.element.attr({
2048
- 'data-class': element.prop('className'),
2049
- 'data-id': element.prop('id')
2050
- });
2051
-
2052
- css[minWidth] = opts.constrainWidth ? visual.outerWidth() : '';
2053
-
2054
- this.element.css(css);
2055
-
2056
- if(opts.hideOnBlur){
2057
- onBlur = function(e){
2058
- if(that.stopBlur){
2059
- e.stopImmediatePropagation();
2060
- } else {
2061
- that.hide();
2062
- }
2063
- };
2064
-
2065
- that.timers.bindBlur = setTimeout(function(){
2066
- that.lastElement.off(that.eventns).on('focusout'+that.eventns + ' blur'+that.eventns, onBlur);
2067
- that.lastElement.getNativeElement().off(that.eventns);
2068
- }, 10);
2069
-
2070
-
2071
- }
2072
-
2073
- if(!this.prepared){
2074
-
2075
- if($.fn.bgIframe){
2076
- this.element.bgIframe();
2077
- }
2078
- }
2079
- this.prepared = true;
2080
- },
2081
- clear: function(){
2082
- $(window).off(this.eventns);
2083
- $(document).off(this.eventns);
2084
-
2085
- this.stopBlur = false;
2086
- $.each(this.timers, function(timerName, val){
2087
- clearTimeout(val);
2088
- });
2089
- },
2090
- hide: function(){
2091
- var e = $.Event('wspopoverbeforehide');
2092
- this.element.trigger(e);
2093
- if(e.isDefaultPrevented() || !this.isVisible){return;}
2094
- this.isVisible = false;
2095
- var that = this;
2096
- var forceHide = function(){
2097
- that.element.css('display', 'none').attr({'data-id': '', 'data-class': '', 'hidden': 'hidden'});
2098
- clearTimeout(that.timers.forcehide);
2099
- };
2100
- this.clear();
2101
- this.element.removeClass('ws-po-visible').trigger('wspopoverhide');
2102
- $(window).on('resize'+this.eventns, forceHide);
2103
- that.timers.forcehide = setTimeout(forceHide, 999);
2104
- },
2105
- position: function(element){
2106
- var offset = webshims.getRelOffset(this.element.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0}).removeAttr('hidden'), element);
2107
- offset.top += element.outerHeight();
2108
- this.element.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(offset);
2109
- }
2110
- };
2111
-
2112
- webshims.wsPopover.id = 0;
2113
-
2114
- /* some extra validation UI */
2115
- webshims.validityAlert = (function(){
2116
-
2117
-
2118
- var focusTimer = false;
2119
-
2120
- var api = webshims.objectCreate(webshims.wsPopover, {}, options.messagePopover);
2121
- var boundHide = api.hide.bind(api);
2122
-
2123
- api.element.addClass('validity-alert').attr({role: 'alert'});
2124
- $.extend(api, {
2125
- hideDelay: 5000,
2126
- showFor: function(elem, message, noFocusElem, noBubble){
2127
-
2128
- elem = $(elem).getNativeElement();
2129
- this.clear();
2130
- this.hide();
2131
- if(!noBubble){
2132
- this.getMessage(elem, message);
2133
-
2134
- this.show(elem);
2135
- if(this.hideDelay){
2136
- this.timers.delayedHide = setTimeout(boundHide, this.hideDelay);
2137
- }
2138
-
2139
- }
2140
-
2141
- if(!noFocusElem){
2142
- this.setFocus(elem);
2143
- }
2144
- },
2145
- setFocus: function(element){
2146
- var focusElem = $(element).getShadowFocusElement();
2147
- var scrollTop = webshims.scrollRoot.scrollTop();
2148
- var elemTop = focusElem.offset().top - 30;
2149
- var smooth;
2150
-
2151
- if(scrollTop > elemTop){
2152
- webshims.scrollRoot.animate(
2153
- {scrollTop: elemTop - 5},
2154
- {
2155
- queue: false,
2156
- duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
2157
- }
2158
- );
2159
- smooth = true;
2160
- }
2161
- try {
2162
- focusElem[0].focus();
2163
- } catch(e){}
2164
- if(smooth){
2165
- webshims.scrollRoot.scrollTop(scrollTop);
2166
- setTimeout(function(){
2167
- webshims.scrollRoot.scrollTop(scrollTop);
2168
- }, 0);
2169
- }
2170
-
2171
- $(window).triggerHandler('pospopover'+this.eventns);
2172
- },
2173
- getMessage: function(elem, message){
2174
- if (!message) {
2175
- message = getContentValidationMessage(elem[0]) || elem.prop('customValidationMessage') || elem.prop('validationMessage');
2176
- }
2177
- if (message) {
2178
- api.contentElement.text(message);
2179
- } else {
2180
- this.hide();
2181
- }
2182
- }
2183
- });
2184
-
2185
-
2186
- return api;
2187
- })();
2188
-
2189
-
2190
- /* extension, but also used to fix native implementation workaround/bugfixes */
2191
- (function(){
2192
- var firstEvent,
2193
- invalids = [],
2194
- stopSubmitTimer,
2195
- form
2196
- ;
2197
-
2198
- $(document).on('invalid', function(e){
2199
- if(e.wrongWebkitInvalid){return;}
2200
- var jElm = $(e.target);
2201
- var shadowElem = jElm.getShadowElement();
2202
- if(!shadowElem.hasClass(invalidClass)){
2203
- shadowElem.addClass(invalidClass).removeClass(validClass);
2204
- setTimeout(function(){
2205
- $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
2206
- }, 0);
2207
- }
2208
-
2209
- if(!firstEvent){
2210
- //trigger firstinvalid
2211
- firstEvent = $.Event('firstinvalid');
2212
- firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
2213
- var firstSystemInvalid = $.Event('firstinvalidsystem');
2214
- $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
2215
- jElm.trigger(firstEvent);
2216
- }
2217
-
2218
- //if firstinvalid was prevented all invalids will be also prevented
2219
- if( firstEvent && firstEvent.isDefaultPrevented() ){
2220
- e.preventDefault();
2221
- }
2222
- invalids.push(e.target);
2223
- e.extraData = 'fix';
2224
- clearTimeout(stopSubmitTimer);
2225
- stopSubmitTimer = setTimeout(function(){
2226
- var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
2227
- //reset firstinvalid
2228
- firstEvent = false;
2229
- invalids = [];
2230
- $(e.target).trigger(lastEvent, lastEvent);
2231
- }, 9);
2232
- jElm = null;
2233
- shadowElem = null;
2234
- });
2235
- })();
2236
-
2237
- $.fn.getErrorMessage = function(){
2238
- var message = '';
2239
- var elem = this[0];
2240
- if(elem){
2241
- message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
2242
- }
2243
- return message;
2244
- };
2245
-
2246
- if(options.replaceValidationUI){
2247
- if(options.overrideMessages && (options.customMessages || options.customMessages == null)){
2248
- options.customMessages = true;
2249
- options.overrideMessages = false;
2250
- webshims.info("set overrideMessages to false. Use customMessages instead");
2251
- }
2252
- webshims.ready('DOM forms', function(){
2253
- $(document).on('firstinvalid', function(e){
2254
- if(!e.isInvalidUIPrevented()){
2255
- e.preventDefault();
2256
- $.webshims.validityAlert.showFor( e.target );
2257
- }
2258
- });
2259
- });
2260
- }
2261
- });
2262
-
2263
- })(jQuery);
2264
- jQuery.webshims.register('form-datalist', function($, webshims, window, document, undefined, options){
2265
- "use strict";
2266
- var doc = document;
2267
-
2268
- /*
2269
- * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
2270
- */
2271
- webshims.propTypes.element = function(descs){
2272
- webshims.createPropDefault(descs, 'attr');
2273
- if(descs.prop){return;}
2274
- descs.prop = {
2275
- get: function(){
2276
- var elem = $.attr(this, 'list');
2277
- if(elem){
2278
- elem = document.getElementById(elem);
2279
- if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
2280
- elem = null;
2281
- }
2282
- }
2283
- return elem || null;
2284
- },
2285
- writeable: false
2286
- };
2287
- };
2288
-
2289
-
2290
- /*
2291
- * Implements datalist element and list attribute
2292
- */
2293
-
2294
- (function(){
2295
- var formsCFG = $.webshims.cfg.forms;
2296
- var listSupport = Modernizr.input.list;
2297
- if(listSupport && !formsCFG.customDatalist){return;}
2298
-
2299
- var initializeDatalist = function(){
2300
-
2301
-
2302
- if(!listSupport){
2303
- webshims.defineNodeNameProperty('datalist', 'options', {
2304
- prop: {
2305
- writeable: false,
2306
- get: function(){
2307
- var elem = this;
2308
- var select = $('select', elem);
2309
- var options;
2310
- if(select[0]){
2311
- options = select[0].options;
2312
- } else {
2313
- options = $('option', elem).get();
2314
- if(options.length){
2315
- webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
2316
- }
2317
- }
2318
- return options;
2319
- }
2320
- }
2321
- });
2322
- }
2323
-
2324
- var inputListProto = {
2325
- //override autocomplete
2326
- autocomplete: {
2327
- attr: {
2328
- get: function(){
2329
- var elem = this;
2330
- var data = $.data(elem, 'datalistWidget');
2331
- if(data){
2332
- return data._autocomplete;
2333
- }
2334
- return ('autocomplete' in elem) ? elem.autocomplete : elem.getAttribute('autocomplete');
2335
- },
2336
- set: function(value){
2337
- var elem = this;
2338
- var data = $.data(elem, 'datalistWidget');
2339
- if(data){
2340
- data._autocomplete = value;
2341
- if(value == 'off'){
2342
- data.hideList();
2343
- }
2344
- } else {
2345
- if('autocomplete' in elem){
2346
- elem.autocomplete = value;
2347
- } else {
2348
- elem.setAttribute('autocomplete', value);
2349
- }
2350
- }
1939
+ var inputListProto = {
1940
+ //override autocomplete
1941
+ autocomplete: {
1942
+ attr: {
1943
+ get: function(){
1944
+ var elem = this;
1945
+ var data = $.data(elem, 'datalistWidget');
1946
+ if(data){
1947
+ return data._autocomplete;
1948
+ }
1949
+ return ('autocomplete' in elem) ? elem.autocomplete : elem.getAttribute('autocomplete');
1950
+ },
1951
+ set: function(value){
1952
+ var elem = this;
1953
+ var data = $.data(elem, 'datalistWidget');
1954
+ if(data){
1955
+ data._autocomplete = value;
1956
+ if(value == 'off'){
1957
+ data.hideList();
1958
+ }
1959
+ } else {
1960
+ if('autocomplete' in elem){
1961
+ elem.autocomplete = value;
1962
+ } else {
1963
+ elem.setAttribute('autocomplete', value);
1964
+ }
1965
+ }
2351
1966
  }
2352
1967
  }
2353
1968
  }
@@ -2380,27 +1995,8 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2380
1995
  };
2381
1996
  }
2382
1997
 
2383
- if(!listSupport){
2384
-
2385
- inputListProto['list'] = {
2386
- attr: {
2387
- get: function(){
2388
- var val = webshims.contentAttr(this, 'list');
2389
- return (val == null) ? undefined : val;
2390
- },
2391
- set: function(value){
2392
- var elem = this;
2393
- webshims.contentAttr(elem, 'list', value);
2394
- webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
2395
- $(elem).triggerHandler('listdatalistchange');
2396
- }
2397
- },
2398
- initAttr: true,
2399
- reflect: true,
2400
- propType: 'element',
2401
- propNodeName: 'datalist'
2402
- };
2403
- } else {
1998
+
1999
+ if(listSupport){
2404
2000
  //options only return options, if option-elements are rooted: but this makes this part of HTML5 less backwards compatible
2405
2001
  if(!($('<datalist><select><option></option></select></datalist>').prop('options') || []).length ){
2406
2002
  webshims.defineNodeNameProperty('datalist', 'options', {
@@ -2420,13 +2016,15 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2420
2016
  }
2421
2017
  });
2422
2018
  }
2423
- inputListProto['list'] = {
2019
+ inputListProto.list = {
2424
2020
  attr: {
2425
2021
  get: function(){
2426
2022
  var val = webshims.contentAttr(this, 'list');
2427
2023
  if(val != null){
2428
2024
  $.data(this, 'datalistListAttr', val);
2429
- this.removeAttribute('list');
2025
+ if(!noDatalistSupport[$.prop(this, 'type')] && !noDatalistSupport[$.attr(this, 'type')]){
2026
+ this.removeAttribute('list');
2027
+ }
2430
2028
  } else {
2431
2029
  val = $.data(this, 'datalistListAttr');
2432
2030
  }
@@ -2436,7 +2034,15 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2436
2034
  set: function(value){
2437
2035
  var elem = this;
2438
2036
  $.data(elem, 'datalistListAttr', value);
2439
- webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
2037
+ if (!noDatalistSupport[$.prop(this, 'type')] && !noDatalistSupport[$.attr(this, 'type')]) {
2038
+ webshims.objectCreate(shadowListProto, undefined, {
2039
+ input: elem,
2040
+ id: value,
2041
+ datalist: $.prop(elem, 'list')
2042
+ });
2043
+ } else {
2044
+ elem.setAttribute('list', value);
2045
+ }
2440
2046
  $(elem).triggerHandler('listdatalistchange');
2441
2047
  }
2442
2048
  },
@@ -2456,62 +2062,14 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2456
2062
  .each(function(){
2457
2063
  $(this).triggerHandler('updateDatalist');
2458
2064
  })
2459
-
2460
2065
  ;
2461
-
2462
2066
  });
2463
-
2464
-
2465
2067
  };
2466
2068
 
2467
2069
 
2468
2070
  /*
2469
2071
  * ShadowList
2470
2072
  */
2471
- var listidIndex = 0;
2472
- var noDatalistSupport = {
2473
- submit: 1,
2474
- button: 1,
2475
- reset: 1,
2476
- hidden: 1,
2477
-
2478
- range: 1,
2479
- date: 1,
2480
- month: 1
2481
- };
2482
- if(webshims.modules["form-number-date-ui"].loaded){
2483
- $.extend(noDatalistSupport, {
2484
- number: 1,
2485
- time: 1
2486
- });
2487
- }
2488
-
2489
- var globStoredOptions = {};
2490
- var getStoredOptions = function(name){
2491
- if(!name){return [];}
2492
- if(globStoredOptions[name]){
2493
- return globStoredOptions[name];
2494
- }
2495
- var data;
2496
- try {
2497
- data = JSON.parse(localStorage.getItem('storedDatalistOptions'+name));
2498
- } catch(e){}
2499
- globStoredOptions[name] = data || [];
2500
- return data || [];
2501
- };
2502
- var storeOptions = function(name, val){
2503
- if(!name){return;}
2504
- val = val || [];
2505
- try {
2506
- localStorage.setItem( 'storedDatalistOptions'+name, JSON.stringify(val) );
2507
- } catch(e){}
2508
- };
2509
-
2510
- var getText = function(elem){
2511
- return (elem.textContent || elem.innerText || $.text([ elem ]) || '');
2512
- };
2513
- var lReg = /</g;
2514
- var gReg = />/g;
2515
2073
 
2516
2074
  var shadowListProto = {
2517
2075
  _create: function(opts){
@@ -2519,6 +2077,7 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2519
2077
  if(noDatalistSupport[$.prop(opts.input, 'type')] || noDatalistSupport[$.attr(opts.input, 'type')]){return;}
2520
2078
  var datalist = opts.datalist;
2521
2079
  var data = $.data(opts.input, 'datalistWidget');
2080
+ var that = this;
2522
2081
  if(datalist && data && data.datalist !== datalist){
2523
2082
  data.datalist = datalist;
2524
2083
  data.id = opts.id;
@@ -2539,9 +2098,8 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2539
2098
  } else if(data && data.datalist === datalist){
2540
2099
  return;
2541
2100
  }
2542
- listidIndex++;
2543
- var that = this;
2544
- this.hideList = $.proxy(that, 'hideList');
2101
+
2102
+
2545
2103
 
2546
2104
  this.datalist = datalist;
2547
2105
  this.id = opts.id;
@@ -2549,121 +2107,21 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2549
2107
  this._autocomplete = $.attr(opts.input, 'autocomplete');
2550
2108
  $.data(opts.input, 'datalistWidget', this);
2551
2109
 
2552
- this.popover = webshims.objectCreate(webshims.wsPopover, {}, options.datalistPopover);
2553
- this.shadowList = this.popover.element.addClass('datalist-polyfill');
2554
-
2555
-
2556
- this.index = -1;
2557
- this.input = opts.input;
2558
- this.arrayOptions = [];
2559
-
2560
- this.shadowList
2561
- .delegate('li', 'mouseenter.datalistWidget mousedown.datalistWidget click.datalistWidget', function(e){
2562
- var items = $('li:not(.hidden-item)', that.shadowList);
2563
- var select = (e.type == 'mousedown' || e.type == 'click');
2564
- that.markItem(items.index(e.currentTarget), select, items);
2565
- if(e.type == 'click'){
2566
- that.hideList();
2567
- if(formsCFG.customDatalist){
2568
- $(opts.input).getNativeElement().trigger('datalistselect');
2569
- }
2570
- }
2571
- return (e.type != 'mousedown');
2572
- })
2573
- ;
2574
-
2575
- opts.input.setAttribute('autocomplete', 'off');
2110
+ lazyLoad('WINDOWLOAD');
2576
2111
 
2577
- $(opts.input)
2578
- .attr({
2579
- //role: 'combobox',
2580
- 'aria-haspopup': 'true'
2581
- })
2582
- .on({
2583
- 'input.datalistWidget': function(){
2584
- if(!that.triggeredByDatalist){
2585
- that.changedValue = false;
2586
- that.showHideOptions();
2587
- }
2588
- },
2589
- 'keydown.datalistWidget': function(e){
2590
- var keyCode = e.keyCode;
2591
- var activeItem;
2592
- var items;
2593
- if(keyCode == 40 && !that.showList()){
2594
- that.markItem(that.index + 1, true);
2595
- return false;
2596
- }
2597
-
2598
- if(!that.popover.isVisible){return;}
2599
-
2600
-
2601
- if(keyCode == 38){
2602
- that.markItem(that.index - 1, true);
2603
- return false;
2604
- }
2605
- if(!e.shiftKey && (keyCode == 33 || keyCode == 36)){
2606
- that.markItem(0, true);
2607
- return false;
2608
- }
2609
- if(!e.shiftKey && (keyCode == 34 || keyCode == 35)){
2610
- items = $('li:not(.hidden-item)', that.shadowList);
2611
- that.markItem(items.length - 1, true, items);
2612
- return false;
2613
- }
2614
- if(keyCode == 13 || keyCode == 27){
2615
- if (keyCode == 13){
2616
- activeItem = $('li.active-item:not(.hidden-item)', that.shadowList);
2617
- that.changeValue( $('li.active-item:not(.hidden-item)', that.shadowList) );
2618
- }
2619
- that.hideList();
2620
- if(formsCFG.customDatalist && activeItem && activeItem[0]){
2621
- $(opts.input).getNativeElement().trigger('datalistselect');
2622
- }
2623
- return false;
2624
- }
2625
- },
2626
- 'focus.datalistWidget': function(){
2627
- if($(this).hasClass('list-focus')){
2628
- that.showList();
2629
- }
2630
- },
2631
- 'mousedown.datalistWidget': function(){
2632
- if($(this).is(':focus')){
2633
- that.showList();
2634
- }
2635
- }
2636
- })
2637
- ;
2638
-
2639
-
2640
- $(this.datalist)
2641
- .off('updateDatalist.datalistWidget')
2642
- .on('updateDatalist.datalistWidget', $.proxy(this, '_resetListCached'))
2643
- ;
2644
-
2645
- this._resetListCached();
2646
-
2647
- if(opts.input.form && (opts.input.name || opts.input.id)){
2648
- $(opts.input.form).on('submit.datalistWidget'+opts.input.id, function(){
2649
- if(!$(opts.input).hasClass('no-datalist-cache') && that._autocomplete != 'off'){
2650
- var val = $.prop(opts.input, 'value');
2651
- var name = (opts.input.name || opts.input.id) + $.prop(opts.input, 'type');
2652
- if(!that.storedOptions){
2653
- that.storedOptions = getStoredOptions( name );
2654
- }
2655
- if(val && that.storedOptions.indexOf(val) == -1){
2656
- that.storedOptions.push(val);
2657
- storeOptions(name, that.storedOptions );
2658
- }
2112
+ if(webshims.isReady('form-datalist-lazy')){
2113
+ this._lazyCreate(opts);
2114
+ } else {
2115
+ $(opts.input).one('focus', lazyLoad);
2116
+ webshims.ready('form-datalist-lazy', function(){
2117
+ if(!that._destroyed){
2118
+ that._lazyCreate(opts);
2659
2119
  }
2660
2120
  });
2661
2121
  }
2662
- $(window).on('unload.datalist'+this.id+' beforeunload.datalist'+this.id, function(){
2663
- that.destroy();
2664
- });
2665
2122
  },
2666
- destroy: function(){
2123
+ destroy: function(e){
2124
+ var input;
2667
2125
  var autocomplete = $.attr(this.input, 'autocomplete');
2668
2126
  $(this.input)
2669
2127
  .off('.datalistWidget')
@@ -2681,268 +2139,21 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2681
2139
  } else {
2682
2140
  $(this.input).attr('autocomplete', autocomplete);
2683
2141
  }
2684
- },
2685
- _resetListCached: function(e){
2686
- var that = this;
2687
- var forceShow;
2688
- this.needsUpdate = true;
2689
- this.lastUpdatedValue = false;
2690
- this.lastUnfoundValue = '';
2691
-
2692
- if(!this.updateTimer){
2693
- if(window.QUnit || (forceShow = ($(that.input).is(':focus') && ($(that.input).hasClass('list-focus') || $.prop(that.input, 'value'))) )){
2694
- that.updateListOptions(forceShow);
2695
- } else {
2696
- webshims.ready('WINDOWLOAD', function(){
2697
- that.updateTimer = setTimeout(function(){
2698
- that.updateListOptions();
2699
- that = null;
2700
- listidIndex = 1;
2701
- }, 200 + (100 * listidIndex));
2702
- });
2703
- }
2704
- }
2705
- },
2706
- updateListOptions: function(_forceShow){
2707
- this.needsUpdate = false;
2708
- clearTimeout(this.updateTimer);
2709
- this.updateTimer = false;
2710
-
2711
- this.searchStart = formsCFG.customDatalist && $(this.input).hasClass('search-start');
2712
- this.addMarkElement = options.addMark || $(this.input).hasClass('mark-option-text');
2713
-
2714
- var list = [];
2715
-
2716
- var values = [];
2717
- var allOptions = [];
2718
- var rElem, rItem, rOptions, rI, rLen, item, value;
2719
- for(rOptions = $.prop(this.datalist, 'options'), rI = 0, rLen = rOptions.length; rI < rLen; rI++){
2720
- rElem = rOptions[rI];
2721
- if(!rElem.disabled && (value = $(rElem).val())){
2722
- rItem = {
2723
- value: value.replace(lReg, '&lt;').replace(gReg, '&gt;'),
2724
- label: $.trim($.attr(rElem, 'label') || getText(rElem)).replace(lReg, '&lt;').replace(gReg, '&gt;'),
2725
- className: rElem.className || ''
2726
- };
2727
-
2728
- if(rItem.label){
2729
- rItem.className += ' has-option-label';
2730
- }
2731
- values.push(rItem.value);
2732
- allOptions.push(rItem);
2733
- }
2734
- }
2735
-
2736
- if(!this.storedOptions){
2737
- this.storedOptions = ($(this.input).hasClass('no-datalist-cache') || this._autocomplete == 'off') ? [] : getStoredOptions((this.input.name || this.input.id) + $.prop(this.input, 'type'));
2738
- }
2739
-
2740
- this.storedOptions.forEach(function(val, i){
2741
- if(values.indexOf(val) == -1){
2742
- allOptions.push({value: val, label: '', className: 'stored-suggest', style: ''});
2743
- }
2744
- });
2745
-
2746
- for(rI = 0, rLen = allOptions.length; rI < rLen; rI++){
2747
- item = allOptions[rI];
2748
- list[rI] = '<li class="'+ item.className +'" tabindex="-1" role="listitem">'+ this.getOptionContent(item) +'</li>';
2749
- }
2750
-
2751
- this.arrayOptions = allOptions;
2752
- this.popover.contentElement.html('<div class="datalist-box"><ul role="list">'+ list.join("\n") +'</ul></div>');
2753
-
2754
-
2755
- if(_forceShow || this.popover.isVisible){
2756
- this.showHideOptions();
2757
- }
2758
- },
2759
- getOptionContent: function(item){
2760
- var content = '';
2761
- if(options.getOptionContent){
2762
- content = options.apply(this, arguments) || '';
2763
- } else {
2764
- content = '<span class="option-value">'+ item.value +'</span>';
2765
- if(item.label){
2766
- content += ' <span class="option-label">'+ item.label +'</span>';
2767
- }
2768
- }
2769
- return content;
2770
- },
2771
- showHideOptions: function(_fromShowList){
2772
- var value = $.prop(this.input, 'value').toLowerCase();
2773
-
2774
- //first check prevent infinite loop, second creates simple lazy optimization
2775
- if(value === this.lastUpdatedValue){
2776
- return;
2777
- }
2778
- if(this.lastUnfoundValue && value.indexOf(this.lastUnfoundValue) === 0){
2779
- this.hideList();
2780
- return;
2781
- }
2782
-
2783
-
2784
- this.lastUpdatedValue = value;
2785
- var found = false;
2786
- var startSearch = this.searchStart;
2787
- var lis = $('li', this.shadowList);
2788
- var that = this;
2789
- if(value){
2790
-
2791
- this.arrayOptions.forEach(function(item, i){
2792
- var search, searchIndex, foundName;
2793
- if(!('lowerValue' in item)){
2794
- item.lowerValue = item.value.toLowerCase();
2795
- if(item.label && item.label != item.value ){
2796
- item.lowerLabel = item.label.toLowerCase();
2797
- }
2798
- }
2799
-
2800
- if(value != item.lowerValue && item.lowerLabel != value){
2801
- searchIndex = item.lowerValue.indexOf(value);
2802
- search = startSearch ? !searchIndex : searchIndex !== -1;
2803
- if(search){
2804
- foundName = 'value';
2805
- } else if(item.lowerLabel){
2806
- searchIndex = item.lowerLabel.indexOf(value);
2807
- search = startSearch ? !searchIndex : searchIndex !== -1;
2808
- foundName = 'label';
2809
- }
2810
- }
2811
-
2812
- if(search){
2813
- that.addMark($(lis[i]).removeClass('hidden-item'), item, foundName, searchIndex, value.length);
2814
- found = true;
2815
- } else {
2816
- $(lis[i]).addClass('hidden-item');
2817
- }
2818
- });
2819
- } else if(lis.length) {
2820
- this.removeMark(lis.removeClass('hidden-item'));
2821
- found = true;
2822
- }
2823
-
2824
- this.hasViewableData = found;
2825
- if(!_fromShowList && found){
2826
- this.showList();
2827
- }
2828
-
2829
- if(!found){
2830
- this.lastUnfoundValue = value;
2831
- this.hideList();
2832
- } else {
2833
- this.lastUnfoundValue = false;
2834
- }
2835
- },
2836
- otherType: {
2837
- value: 'label',
2838
- label: 'value'
2839
- },
2840
- addMark: function(elem, item, prop, start, length){
2841
- if(this.addMarkElement){
2842
- var text = item[prop].substr(start, length);
2843
- text = item[prop].replace(text ,'<mark>'+ text +'</mark>');
2844
- $('.option-'+ this.otherType[prop] +' > mark', elem).each(this._replaceMark);
2845
- $('.option-'+prop, elem).html(text);
2846
-
2847
- }
2848
- },
2849
- _replaceMark: function(){
2850
- var content = $(this).html();
2851
- $(this).replaceWith(content);
2852
- },
2853
- removeMark: function(lis){
2854
- if(this.addMarkElement){
2855
- $('mark', lis).each(this._replaceMark);
2856
- }
2857
- },
2858
- showList: function(){
2859
- if(this.popover.isVisible){return false;}
2860
- if(this.needsUpdate){
2861
- this.updateListOptions();
2862
- }
2863
- this.showHideOptions(true);
2864
- if(!this.hasViewableData){return false;}
2865
- var that = this;
2866
-
2867
- that.shadowList.find('li.active-item').removeClass('active-item');
2868
- that.popover.show(this.input);
2869
-
2870
-
2871
- return true;
2872
- },
2873
- hideList: function(){
2874
- if(!this.popover.isVisible){return false;}
2875
- var that = this;
2876
-
2877
-
2878
- this.popover.hide();
2879
- that.shadowList.removeClass('datalist-visible list-item-active');
2880
- that.index = -1;
2881
- if(that.changedValue){
2882
- that.triggeredByDatalist = true;
2883
- $(that.input).trigger('input').trigger('change');
2884
- that.changedValue = false;
2885
- that.triggeredByDatalist = false;
2886
- }
2887
-
2888
- return true;
2889
- },
2890
- scrollIntoView: function(elem){
2891
- var ul = $('ul', this.shadowList);
2892
- var div = $('div.datalist-box', this.shadowList);
2893
- var elemPos = elem.position();
2894
- var containerHeight;
2895
- elemPos.top -= (parseInt(ul.css('paddingTop'), 10) || 0) + (parseInt(ul.css('marginTop'), 10) || 0) + (parseInt(ul.css('borderTopWidth'), 10) || 0);
2896
- if(elemPos.top < 0){
2897
- div.scrollTop( div.scrollTop() + elemPos.top - 2);
2898
- return;
2899
- }
2900
- elemPos.top += elem.outerHeight();
2901
- containerHeight = div.height();
2902
- if(elemPos.top > containerHeight){
2903
- div.scrollTop( div.scrollTop() + (elemPos.top - containerHeight) + 2);
2904
- }
2905
- },
2906
- changeValue: function(activeItem){
2907
- if(!activeItem[0]){return;}
2908
- var spinner;
2909
- var newValue = $('span.option-value', activeItem).text();
2910
- var oldValue = $.prop(this.input, 'value');
2911
- if(newValue != oldValue){
2912
-
2913
- $(this.input)
2914
- .prop('value', newValue)
2915
- .triggerHandler('updateInput')
2916
- ;
2917
- this.changedValue = true;
2918
- if((spinner = $.data(this.input, 'wsspinner')) && spinner.setInput){
2919
- spinner.setInput(newValue);
2920
- }
2921
- }
2922
- },
2923
- markItem: function(index, doValue, items){
2924
- var activeItem;
2925
- var goesUp;
2926
-
2927
- items = items || $('li:not(.hidden-item)', this.shadowList);
2928
- if(!items.length){return;}
2929
- if(index < 0){
2930
- index = items.length - 1;
2931
- } else if(index >= items.length){
2932
- index = 0;
2933
- }
2934
- items.removeClass('active-item');
2935
- this.shadowList.addClass('list-item-active');
2936
- activeItem = items.filter(':eq('+ index +')').addClass('active-item');
2937
-
2938
- if(doValue){
2939
- this.changeValue(activeItem);
2940
- this.scrollIntoView(activeItem);
2142
+ if(e && e.type == 'beforeunload'){
2143
+ input = this.input;
2144
+ setTimeout(function(){
2145
+ $.attr(input, 'list', $.attr(input, 'list'));
2146
+ }, 9);
2941
2147
  }
2942
- this.index = index;
2148
+ this._destroyed = true;
2943
2149
  }
2944
2150
  };
2945
2151
 
2152
+ webshims.loader.addModule('form-datalist-lazy', {
2153
+ noAutoCallback: true,
2154
+ options: $.extend(options, {shadowListProto: shadowListProto})
2155
+ });
2156
+
2946
2157
  //init datalist update
2947
2158
  initializeDatalist();
2948
2159
  })();
@@ -2953,7 +2164,7 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2953
2164
  var hasNative = Modernizr.audio && Modernizr.video;
2954
2165
  var supportsLoop = false;
2955
2166
  var bugs = webshims.bugs;
2956
-
2167
+ var swfType = 'mediaelement-jaris';
2957
2168
  var loadSwf = function(){
2958
2169
  webshims.ready(swfType, function(){
2959
2170
  if(!webshims.mediaelement.createSWF){
@@ -2963,7 +2174,7 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2963
2174
  });
2964
2175
  };
2965
2176
  var options = webshims.cfg.mediaelement;
2966
- var swfType = 'mediaelement-jaris';
2177
+ var hasFullTrackSupport;
2967
2178
  var hasSwf;
2968
2179
  if(!options){
2969
2180
  webshims.error("mediaelement wasn't implemented but loaded");
@@ -2976,14 +2187,11 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2976
2187
 
2977
2188
  webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
2978
2189
 
2979
- if(!Modernizr.videoBuffered){
2190
+ if(!Modernizr.videoBuffered ){
2980
2191
  webshims.addPolyfill('mediaelement-native-fix', {
2981
- f: 'mediaelement',
2982
- test: Modernizr.videoBuffered,
2983
2192
  d: ['dom-support']
2984
2193
  });
2985
-
2986
- webshims.reTest('mediaelement-native-fix');
2194
+ webshims.loader.loadList(['mediaelement-native-fix']);
2987
2195
  }
2988
2196
  }
2989
2197
 
@@ -2994,9 +2202,9 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
2994
2202
  };
2995
2203
  var switchOptions = function(e){
2996
2204
  var media;
2997
- var parent = e.target.parentNode;
2205
+ var parent;
2998
2206
  if(!options.preferFlash &&
2999
- ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) &&
2207
+ ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source:last', parent)[0] == e.target)) &&
3000
2208
  (media = $(e.target).closest('audio, video')) && !noSwitch[media.prop('error')]
3001
2209
  ){
3002
2210
  $(function(){
@@ -3010,7 +2218,7 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
3010
2218
  $('audio, video').each(function(){
3011
2219
  webshims.mediaelement.selectSource(this);
3012
2220
  });
3013
- webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
2221
+ webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
3014
2222
  }
3015
2223
  }, 9);
3016
2224
  });
@@ -3045,43 +2253,9 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
3045
2253
  bugs.track = true;
3046
2254
  }
3047
2255
  }
3048
-
3049
- var trackOptions = webshims.cfg.track;
3050
- var trackListener = function(e){
3051
- $(e.target).filter('track').each(changeApi);
3052
- };
3053
- var changeApi = function(){
3054
- if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
3055
- trackOptions.override = true;
3056
- webshims.reTest('track');
3057
- document.removeEventListener('error', trackListener, true);
3058
- if(this && $.nodeName(this, 'track')){
3059
- webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
3060
- } else {
3061
- webshims.info("track support was overwritten. due to bad browser support");
3062
- }
3063
- return false;
3064
- }
3065
- };
3066
- var detectTrackError = function(){
3067
- document.addEventListener('error', trackListener, true);
3068
-
3069
- if(bugs.track){
3070
- changeApi();
3071
- } else {
3072
- $('track').each(changeApi);
3073
- }
3074
- };
3075
- if(!trackOptions.override){
3076
- if(webshims.isReady('track')){
3077
- detectTrackError();
3078
- } else {
3079
- $(detectTrackError);
3080
- }
3081
- }
3082
2256
  })();
3083
-
3084
2257
  }
2258
+ hasFullTrackSupport = Modernizr.track && !bugs.track;
3085
2259
 
3086
2260
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
3087
2261
  hasSwf = swfmini.hasFlashPlayerVersion('9.0.115');
@@ -3166,7 +2340,8 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3166
2340
  var loadTrackUi = function(){
3167
2341
  if(loadTrackUi.loaded){return;}
3168
2342
  loadTrackUi.loaded = true;
3169
- $(function(){
2343
+ webshims.ready('WINDOWLOAD', function(){
2344
+ loadThird();
3170
2345
  webshims.loader.loadList(['track-ui']);
3171
2346
  });
3172
2347
  };
@@ -3339,27 +2514,40 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3339
2514
  }
3340
2515
  return ret;
3341
2516
  };
3342
-
2517
+ var emptyType = (/^\s*application\/octet\-stream\s*$/i);
2518
+ var getRemoveEmptyType = function(){
2519
+ var ret = emptyType.test($.attr(this, 'type') || '');
2520
+ if(ret){
2521
+ $(this).removeAttr('type');
2522
+ }
2523
+ return ret;
2524
+ };
3343
2525
  mediaelement.setError = function(elem, message){
3344
- if(!message){
3345
- message = "can't play sources";
2526
+ if($('source', elem).filter(getRemoveEmptyType).length){
2527
+ webshims.error('"application/octet-stream" is a useless mimetype for audio/video. Please change this attribute.');
2528
+ try {
2529
+ $(elem).mediaLoad();
2530
+ } catch(er){}
2531
+ } else {
2532
+ if(!message){
2533
+ message = "can't play sources";
2534
+ }
2535
+ $(elem).pause().data('mediaerror', message);
2536
+ webshims.error('mediaelementError: '+ message);
2537
+ setTimeout(function(){
2538
+ if($(elem).data('mediaerror')){
2539
+ $(elem).trigger('mediaerror');
2540
+ }
2541
+ }, 1);
3346
2542
  }
3347
2543
 
3348
- $(elem).pause().data('mediaerror', message);
3349
- webshims.error('mediaelementError: '+ message);
3350
- setTimeout(function(){
3351
- if($(elem).data('mediaerror')){
3352
- $(elem).trigger('mediaerror');
3353
- }
3354
- }, 1);
2544
+
3355
2545
  };
3356
2546
 
3357
2547
  var handleThird = (function(){
3358
2548
  var requested;
3359
2549
  return function( mediaElem, ret, data ){
3360
- if(!requested){
3361
- loadTrackUi();
3362
- }
2550
+
3363
2551
  webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
3364
2552
  if(mediaelement.createSWF){
3365
2553
  mediaelement.createSWF( mediaElem, ret, data );
@@ -3504,6 +2692,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3504
2692
  var buffered = getBufferedString();
3505
2693
  if(buffered != lastBuffered){
3506
2694
  lastBuffered = buffered;
2695
+ webshims.info('needed to trigger progress manually');
3507
2696
  $(elem).triggerHandler('progress');
3508
2697
  }
3509
2698
  };
@@ -3555,11 +2744,14 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3555
2744
  $('video, audio', context)
3556
2745
  .add(insertedElement.filter('video, audio'))
3557
2746
  .each(function(){
3558
- if(!mediaelement.canNativePlaySrces(this) || (!loadTrackUi.loaded && $('track', this).length)){
2747
+ if(!mediaelement.canNativePlaySrces(this)){
3559
2748
  loadThird();
3560
2749
  handleMedia = true;
3561
2750
  return false;
3562
2751
  }
2752
+ if((!hasFullTrackSupport || webshims.modules.track.options.override) && !loadTrackUi.loaded && $('track', this).length){
2753
+ loadTrackUi();
2754
+ }
3563
2755
  })
3564
2756
  ;
3565
2757
  }
@@ -3567,7 +2759,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3567
2759
  }
3568
2760
  };
3569
2761
 
3570
- if(Modernizr.track && !bugs.track){
2762
+ if(hasFullTrackSupport){
3571
2763
  webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
3572
2764
  get: function(){
3573
2765
  return this._shimActiveCues || this.activeCues;
@@ -3582,6 +2774,6 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3582
2774
  } else {
3583
2775
  webshims.ready(swfType, initMediaElements);
3584
2776
  }
3585
- webshims.ready('WINDOWLOAD mediaelement', loadTrackUi);
2777
+ webshims.ready('track', loadTrackUi);
3586
2778
  });
3587
- })(jQuery, Modernizr, jQuery.webshims);
2779
+ })(jQuery, Modernizr, webshims);