webshims-rails 1.11.3.1 → 1.11.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +114 -104
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +5 -5
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +156 -207
  6. data/vendor/assets/javascripts/webshims/shims/$ajax.js +862 -0
  7. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +20 -0
  8. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +20 -0
  9. data/vendor/assets/javascripts/webshims/shims/color-picker.js +12 -12
  10. data/vendor/assets/javascripts/webshims/shims/combos/1.js +62 -32
  11. data/vendor/assets/javascripts/webshims/shims/combos/10.js +192 -509
  12. data/vendor/assets/javascripts/webshims/shims/combos/11.js +96 -415
  13. data/vendor/assets/javascripts/webshims/shims/combos/12.js +36 -26
  14. data/vendor/assets/javascripts/webshims/shims/combos/13.js +36 -26
  15. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1007 -359
  16. data/vendor/assets/javascripts/webshims/shims/combos/15.js +310 -235
  17. data/vendor/assets/javascripts/webshims/shims/combos/16.js +313 -237
  18. data/vendor/assets/javascripts/webshims/shims/combos/17.js +96 -415
  19. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1003 -678
  20. data/vendor/assets/javascripts/webshims/shims/combos/19.js +1085 -387
  21. data/vendor/assets/javascripts/webshims/shims/combos/2.js +161 -127
  22. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1086 -388
  23. data/vendor/assets/javascripts/webshims/shims/combos/21.js +168 -96
  24. data/vendor/assets/javascripts/webshims/shims/combos/22.js +36 -27
  25. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2 -1
  26. data/vendor/assets/javascripts/webshims/shims/combos/24.js +411 -172
  27. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1085 -387
  28. data/vendor/assets/javascripts/webshims/shims/combos/26.js +96 -94
  29. data/vendor/assets/javascripts/webshims/shims/combos/3.js +163 -140
  30. data/vendor/assets/javascripts/webshims/shims/combos/30.js +166 -141
  31. data/vendor/assets/javascripts/webshims/shims/combos/31.js +159 -126
  32. data/vendor/assets/javascripts/webshims/shims/combos/4.js +103 -109
  33. data/vendor/assets/javascripts/webshims/shims/combos/5.js +98 -417
  34. data/vendor/assets/javascripts/webshims/shims/combos/6.js +101 -418
  35. data/vendor/assets/javascripts/webshims/shims/combos/7.js +168 -142
  36. data/vendor/assets/javascripts/webshims/shims/combos/8.js +165 -141
  37. data/vendor/assets/javascripts/webshims/shims/combos/9.js +195 -510
  38. data/vendor/assets/javascripts/webshims/shims/details.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +96 -94
  40. data/vendor/assets/javascripts/webshims/shims/es5.js +908 -264
  41. data/vendor/assets/javascripts/webshims/shims/excanvas.js +16 -1
  42. data/vendor/assets/javascripts/webshims/shims/form-combat.js +147 -0
  43. data/vendor/assets/javascripts/webshims/shims/form-core.js +60 -31
  44. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +114 -33
  45. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +3 -1
  46. data/vendor/assets/javascripts/webshims/shims/form-message.js +7 -15
  47. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +2 -2
  48. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +88 -410
  49. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +143 -93
  50. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +268 -79
  51. data/vendor/assets/javascripts/webshims/shims/form-validation.js +116 -81
  52. data/vendor/assets/javascripts/webshims/shims/form-validators.js +23 -10
  53. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +605 -9
  54. data/vendor/assets/javascripts/webshims/shims/geolocation.js +51 -39
  55. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js +78 -33
  56. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +24 -6
  57. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-nl.js +110 -49
  58. data/vendor/assets/javascripts/webshims/shims/json-storage.js +3 -1
  59. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +2 -1
  60. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +81 -30
  61. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +131 -54
  62. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +497 -0
  63. data/vendor/assets/javascripts/webshims/shims/range-ui.js +8 -5
  64. data/vendor/assets/javascripts/webshims/shims/sizzle.js +2026 -0
  65. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +401 -521
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +1 -1
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +94 -82
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +250 -321
  69. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  70. data/vendor/assets/javascripts/webshims/shims/track-ui.js +1 -1
  71. data/vendor/assets/javascripts/webshims/shims/track.js +34 -25
  72. metadata +7 -3
@@ -462,8 +462,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
462
462
  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");
463
463
  }
464
464
 
465
- if(!$.parseHTML){
466
- webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
465
+ if('debug' in webshims){
466
+ webshims.error('Use webshims.setOptions("debug", true||false||"noCombo"); to debug flag');
467
467
  }
468
468
 
469
469
  if (!webshims.cfg.no$Switch) {
@@ -499,7 +499,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
499
499
  // '127.0.0.1': 1
500
500
  // };
501
501
  //
502
- // if( webshims.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
502
+ // if( webshims.cfg.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
503
503
  // var list = $('<ul class="webshims-debug-list" />');
504
504
  // webshims.errorLog.push = function(message){
505
505
  // list.appendTo('body');
@@ -931,7 +931,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
931
931
  };
932
932
 
933
933
  $.extend(webshims, {
934
-
935
934
  getID: (function(){
936
935
  var ID = new Date().getTime();
937
936
  return function(elem){
@@ -961,6 +960,51 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
961
960
  }
962
961
  });
963
962
  },
963
+ getOptions: (function(){
964
+ var regs = {};
965
+ var regFn = function(f, upper){
966
+ return upper.toLowerCase();
967
+ };
968
+ return function(elem, name, bases){
969
+ var data = elementData(elem, 'cfg'+name);
970
+ var dataName;
971
+ var cfg = {};
972
+
973
+ if(data){
974
+ return data;
975
+ }
976
+ data = $(elem).data();
977
+
978
+ if(!bases){
979
+ bases = [true, {}];
980
+ } else if(!Array.isArray(bases)){
981
+ bases = [true, {}, bases];
982
+ } else {
983
+ bases.unshift(true, {});
984
+ }
985
+
986
+ if(data && data[name]){
987
+ if(typeof data[name] == 'object'){
988
+ bases.push(data[name]);
989
+ } else {
990
+ webshims.error('data-'+ name +' attribute has to be a valid JSON, was: '+ data[name]);
991
+ }
992
+ }
993
+
994
+ if(!regs[name]){
995
+ regs[name] = new RegExp('^'+ name +'([A-Z])');
996
+ }
997
+
998
+ for(dataName in data){
999
+ if(regs[name].test(dataName)){
1000
+ cfg[dataName.replace(regs[name], regFn)] = data[dataName];
1001
+ }
1002
+ }
1003
+ bases.push(cfg);
1004
+
1005
+ return elementData(elem, 'cfg'+name, $.extend.apply($, bases));
1006
+ };
1007
+ })(),
964
1008
  //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
965
1009
  createPropDefault: createPropDefault,
966
1010
  data: elementData,
@@ -1048,7 +1092,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1048
1092
  setInterval(this.test, 600);
1049
1093
  $(this.test);
1050
1094
  webshims.ready('WINDOWLOAD', this.test);
1051
- $(document).on('updatelayout', this.handler);
1095
+ $(document).on('updatelayout pageinit collapsibleexpand shown.bs.modal shown.bs.collapse slid.bs.carousel', this.handler);
1052
1096
  $(window).on('resize', this.handler);
1053
1097
  (function(){
1054
1098
  var oldAnimate = $.fn.animate;
@@ -1406,109 +1450,67 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1406
1450
  }
1407
1451
  },
1408
1452
 
1409
- // set current Lang:
1410
- // - webshims.activeLang(lang:string);
1411
- // get current lang
1412
- // - webshims.activeLang();
1413
- // get current lang
1414
- // webshims.activeLang({
1415
- // register: moduleName:string,
1416
- // callback: callback:function
1417
- // });
1418
- // get/set including remoteLang
1419
- // - webshims.activeLang({
1420
- // module: moduleName:string,
1421
- // callback: callback:function,
1422
- // langObj: languageObj:array/object
1423
- // });
1424
1453
  activeLang: (function(){
1425
- var callbacks = [];
1426
- var registeredCallbacks = {};
1427
- var currentLang;
1428
- var shortLang;
1429
- var notLocal = /:\/\/|^\.*\//;
1430
- var loadRemoteLang = function(data, lang, options){
1431
- var langSrc;
1432
- if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
1433
- data.loading = true;
1434
- langSrc = options.langSrc;
1435
- if(!notLocal.test(langSrc)){
1436
- langSrc = webshims.cfg.basePath+langSrc;
1437
- }
1438
- webshims.loader.loadScript(langSrc+lang+'.js', function(){
1439
- if(data.langObj[lang]){
1440
- data.loading = false;
1441
- callLang(data, true);
1442
- } else {
1443
- $(function(){
1444
- if(data.langObj[lang]){
1445
- callLang(data, true);
1446
- }
1447
- data.loading = false;
1454
+ var curLang = [];
1455
+ var langDatas = [];
1456
+ var loading = {};
1457
+ var load = function(src, obj, loadingLang){
1458
+ obj._isLoading = true;
1459
+ if(loading[src]){
1460
+ loading[src].push(obj);
1461
+ } else {
1462
+ loading[src] = [obj];
1463
+ webshims.loader.loadScript(src, function(){
1464
+ if(loadingLang == curLang.join()){
1465
+ $.each(loading[src], function(i, obj){
1466
+ select(obj);
1448
1467
  });
1449
1468
  }
1450
- });
1451
- return true;
1452
- }
1453
- return false;
1454
- };
1455
- var callRegister = function(module){
1456
- if(registeredCallbacks[module]){
1457
- registeredCallbacks[module].forEach(function(data){
1458
- data.callback(currentLang, shortLang, '');
1469
+ delete loading[src];
1459
1470
  });
1460
1471
  }
1461
1472
  };
1462
- var callLang = function(data, _noLoop){
1463
- if(data.activeLang != currentLang && data.activeLang !== shortLang){
1464
- var options = modules[data.module].options;
1465
- if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
1466
- data.activeLang = currentLang;
1467
- data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
1468
- callRegister(data.module);
1469
- } else if( !_noLoop &&
1470
- !loadRemoteLang(data, currentLang, options) &&
1471
- !loadRemoteLang(data, shortLang, options) &&
1472
- data.langObj[''] && data.activeLang !== '' ) {
1473
- data.activeLang = '';
1474
- data.callback(data.langObj[''], currentLang);
1475
- callRegister(data.module);
1473
+ var select = function(obj){
1474
+ var oldLang = obj.__active;
1475
+ var selectLang = function(i, lang){
1476
+ obj._isLoading = false;
1477
+ if(obj[lang] || obj.availableLangs.indexOf(lang) != -1){
1478
+ if(obj[lang]){
1479
+ obj.__active = obj[lang];
1480
+ } else {
1481
+ load(obj.langSrc+lang, obj, curLang.join());
1482
+ }
1483
+ return false;
1476
1484
  }
1485
+ };
1486
+ $.each(curLang, selectLang);
1487
+ if(!obj.__active){
1488
+ obj.__active = obj[''];
1489
+ }
1490
+ if(oldLang != obj.__active){
1491
+ $(obj).trigger('change');
1477
1492
  }
1478
1493
  };
1479
-
1480
-
1481
- var activeLang = function(lang){
1482
-
1483
- if(typeof lang == 'string' && lang !== currentLang){
1484
- currentLang = lang;
1485
- shortLang = currentLang.split('-')[0];
1486
- if(currentLang == shortLang){
1487
- shortLang = false;
1488
- }
1489
- $.each(callbacks, function(i, data){
1490
- callLang(data);
1491
- });
1492
- } else if(typeof lang == 'object'){
1493
-
1494
- if(lang.register){
1495
- if(!registeredCallbacks[lang.register]){
1496
- registeredCallbacks[lang.register] = [];
1494
+ return function(lang){
1495
+ var shortLang;
1496
+ if(typeof lang == 'string'){
1497
+ if(curLang[0] != lang){
1498
+ curLang = [lang];
1499
+ shortLang = curLang[0].split('-')[0];
1500
+ if(shortLang && shortLang != lang){
1501
+ curLang.push(shortLang);
1497
1502
  }
1498
- registeredCallbacks[lang.register].push(lang);
1499
- lang.callback(currentLang, shortLang, '');
1500
- } else {
1501
- if(!lang.activeLang){
1502
- lang.activeLang = '';
1503
- }
1504
- callbacks.push(lang);
1505
- callLang(lang);
1503
+ langDatas.forEach(select);
1504
+ }
1505
+ } else if(typeof lang == 'object'){
1506
+ if(!lang.__active){
1507
+ langDatas.push(lang);
1508
+ select(lang);
1506
1509
  }
1510
+ return lang.__active;
1507
1511
  }
1508
- return currentLang;
1512
+ return curLang[0];
1509
1513
  };
1510
-
1511
- return activeLang;
1512
1514
  })()
1513
1515
  });
1514
1516
 
@@ -1652,39 +1654,65 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1652
1654
  return ret;
1653
1655
  };
1654
1656
 
1655
- $.extend($.expr[":"], {
1656
- "valid-element": function(elem){
1657
- return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1658
- },
1659
- "invalid-element": function(elem){
1660
- return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1661
- },
1662
- "required-element": function(elem){
1663
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1664
- },
1665
- "user-error": function(elem){
1666
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1667
- },
1668
- "optional-element": function(elem){
1669
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1657
+ var extendSels = function(){
1658
+ var exp = $.expr[":"];
1659
+ $.extend(exp, {
1660
+ "valid-element": function(elem){
1661
+ return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1662
+ },
1663
+ "invalid-element": function(elem){
1664
+ return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1665
+ },
1666
+ "required-element": function(elem){
1667
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1668
+ },
1669
+ "user-error": function(elem){
1670
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1671
+ },
1672
+ "optional-element": function(elem){
1673
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1674
+ }
1675
+ });
1676
+
1677
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1678
+ exp[name] = $.expr[":"][name+"-element"];
1679
+ });
1680
+
1681
+ // sizzle/jQuery has a bug with :disabled/:enabled selectors
1682
+ if(Modernizr.fieldsetdisabled && !$('<fieldset disabled=""><input /><fieldset>').find('input').is(':disabled')){
1683
+ $.extend(exp, {
1684
+ "enabled": function( elem ) {
1685
+ return elem.disabled === false && !$(elem).is('fieldset[disabled] *');
1686
+ },
1687
+
1688
+ "disabled": function( elem ) {
1689
+ return elem.disabled === true || ('disabled' in elem && $(elem).is('fieldset[disabled] *'));
1690
+ }
1691
+ });
1670
1692
  }
1671
- });
1672
-
1673
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1674
- $.expr[":"][name] = $.expr.filters[name+"-element"];
1675
- });
1676
-
1677
- //bug was partially fixed in 1.10.0 for IE9, but not IE8 (move to es5 as soon as 1.10.2 is used)
1678
- var pseudoFocus = $.expr[":"].focus;
1679
- $.expr[":"].focus = function(){
1680
- try {
1681
- return pseudoFocus.apply(this, arguments);
1682
- } catch(e){
1683
- webshims.error(e);
1693
+
1694
+
1695
+ //bug was partially fixed in 1.10.0 for IE9, but not IE8 (move to es5 as soon as 1.10.2 is used)
1696
+ if(typeof document.activeElement == 'unknown'){
1697
+ var pseudoFocus = exp.focus;
1698
+ exp.focus = function(){
1699
+ try {
1700
+ return pseudoFocus.apply(this, arguments);
1701
+ } catch(e){
1702
+ webshims.error(e);
1703
+ }
1704
+ return false;
1705
+ };
1684
1706
  }
1685
- return false;
1686
1707
  };
1687
1708
 
1709
+ if($.expr.filters){
1710
+ extendSels();
1711
+ } else {
1712
+ webshims.ready('sizzle', extendSels);
1713
+ }
1714
+
1715
+
1688
1716
  webshims.triggerInlineForm = function(elem, event){
1689
1717
  $(elem).trigger(event);
1690
1718
  };
@@ -1752,7 +1780,10 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1752
1780
 
1753
1781
 
1754
1782
  webshims.getContentValidationMessage = function(elem, validity, key){
1755
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1783
+ if(webshims.errorbox && webshims.errorbox.initIvalContentMessage){
1784
+ webshims.errorbox.initIvalContentMessage(elem);
1785
+ }
1786
+ var message = (webshims.getOptions && webshims.errorbox ? webshims.getOptions(elem, 'errormessage') : $(elem).data('errormessage')) || elem.getAttribute('x-moz-errormessage') || '';
1756
1787
  if(key && message[key]){
1757
1788
  message = message[key];
1758
1789
  } else if(message) {
@@ -1798,7 +1829,7 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1798
1829
 
1799
1830
 
1800
1831
  $(document).on('focusin.lazyloadvalidation', function(e){
1801
- if('form' in e.target && (e.target.list || $(e.target).is(':invalid'))){
1832
+ if('form' in e.target){
1802
1833
  lazyLoad();
1803
1834
  }
1804
1835
  });
@@ -1812,7 +1843,6 @@ webshims.inputTypes = webshims.inputTypes || {};
1812
1843
  //some helper-functions
1813
1844
  var cfg = webshims.cfg.forms;
1814
1845
  var bugs = webshims.bugs;
1815
- var isSubmit;
1816
1846
 
1817
1847
  var isNumber = function(string){
1818
1848
  return (typeof string == 'number' || (string && string == string * 1));
@@ -1887,6 +1917,7 @@ var validityPrototype = {
1887
1917
  rangeOverflow: false,
1888
1918
  stepMismatch: false,
1889
1919
  tooLong: false,
1920
+ tooShort: false,
1890
1921
  patternMismatch: false,
1891
1922
  valueMissing: false,
1892
1923
 
@@ -1923,6 +1954,9 @@ var getGroupElements = function(elem){
1923
1954
  }
1924
1955
  return ret;
1925
1956
  };
1957
+ var patternTypes = {url: 1, email: 1, text: 1, search: 1, tel: 1, password: 1};
1958
+ var lengthTypes = $.extend({textarea: 1}, patternTypes);
1959
+
1926
1960
  var validityRules = {
1927
1961
  valueMissing: function(input, val, cache){
1928
1962
  if(!input.prop('required')){return false;}
@@ -1939,11 +1973,12 @@ var validityRules = {
1939
1973
  }
1940
1974
  return ret;
1941
1975
  },
1942
- tooLong: function(){
1943
- return false;
1944
- },
1945
1976
  patternMismatch: function(input, val, cache) {
1946
1977
  if(val === '' || cache.nodeName == 'select'){return false;}
1978
+ if(!('type' in cache)){
1979
+ cache.type = getType(input[0]);
1980
+ }
1981
+ if(!patternTypes[cache.type]){return false;}
1947
1982
  var pattern = input.attr('pattern');
1948
1983
  if(!pattern){return false;}
1949
1984
  try {
@@ -1958,6 +1993,20 @@ var validityRules = {
1958
1993
  }
1959
1994
  ;
1960
1995
 
1996
+ $.each({tooShort: ['minLength', -1], tooLong: ['maxLength', 1]}, function(name, props){
1997
+ validityRules[name] = function(input, val, cache){
1998
+ //defaultValue is not the same as dirty flag, but very similiar
1999
+ if(cache.nodeName == 'select' || input.prop('defaultValue') == val){return false;}
2000
+ if(!('type' in cache)){
2001
+ cache.type = getType(input[0]);
2002
+ }
2003
+ if(!lengthTypes[cache.type]){return false;}
2004
+ var prop = input.prop(props[0]);
2005
+
2006
+ return ( prop > 0 && prop * props[1] < val.length * props[1] );
2007
+ };
2008
+ });
2009
+
1961
2010
  $.each({typeMismatch: 'mismatch', badInput: 'bad'}, function(name, fn){
1962
2011
  validityRules[name] = function (input, val, cache){
1963
2012
  if(val === '' || cache.nodeName == 'select'){return false;}
@@ -2008,15 +2057,12 @@ $.event.special.invalid = {
2008
2057
 
2009
2058
  if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
2010
2059
 
2011
- isSubmit = true;
2012
2060
  e.testedValidity = true;
2013
- var notValid = !($(e.target).checkValidity());
2061
+ var notValid = !($(e.target).callProp('reportValidity'));
2014
2062
  if(notValid){
2015
2063
  e.stopImmediatePropagation();
2016
- isSubmit = false;
2017
2064
  return false;
2018
2065
  }
2019
- isSubmit = false;
2020
2066
  }
2021
2067
  };
2022
2068
 
@@ -2083,6 +2129,9 @@ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
2083
2129
  checkValidity: {
2084
2130
  value: function(){return true;}
2085
2131
  },
2132
+ reportValidity: {
2133
+ value: function(){return true;}
2134
+ },
2086
2135
  willValidate: {
2087
2136
  value: false
2088
2137
  },
@@ -2097,7 +2146,7 @@ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
2097
2146
  }
2098
2147
  }, 'prop');
2099
2148
 
2100
- var baseCheckValidity = function(elem){
2149
+ var baseCheckValidity = function(elem, type){
2101
2150
  var e,
2102
2151
  v = $.prop(elem, 'validity')
2103
2152
  ;
@@ -2109,7 +2158,7 @@ var baseCheckValidity = function(elem){
2109
2158
  if( !v.valid ){
2110
2159
  e = $.Event('invalid');
2111
2160
  var jElm = $(elem).trigger(e);
2112
- if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
2161
+ if(type == 'reportValidity' && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
2113
2162
  webshims.validityAlert.showFor(jElm);
2114
2163
  baseCheckValidity.unhandledInvalids = true;
2115
2164
  }
@@ -2118,95 +2167,111 @@ var baseCheckValidity = function(elem){
2118
2167
  return v.valid;
2119
2168
  };
2120
2169
  var rsubmittable = /^(?:select|textarea|input)/i;
2121
- webshims.defineNodeNameProperty('form', 'checkValidity', {
2122
- prop: {
2123
- value: function(){
2124
-
2125
- var ret = true,
2126
- elems = $($.prop(this, 'elements')).filter(function(){
2127
- if(!rsubmittable.test(this.nodeName)){return false;}
2128
- var shadowData = webshims.data(this, 'shadowData');
2129
- return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
2130
- })
2131
- ;
2132
-
2133
- baseCheckValidity.unhandledInvalids = false;
2134
- for(var i = 0, len = elems.length; i < len; i++){
2135
- if( !baseCheckValidity(elems[i]) ){
2136
- ret = false;
2170
+
2171
+ ['checkValidity', 'reportValidity'].forEach(function(name){
2172
+ webshims.defineNodeNameProperty('form', name, {
2173
+ prop: {
2174
+ value: function(){
2175
+
2176
+ var ret = true,
2177
+ elems = $($.prop(this, 'elements')).filter(function(){
2178
+ if(!rsubmittable.test(this.nodeName)){return false;}
2179
+ var shadowData = webshims.data(this, 'shadowData');
2180
+ return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
2181
+ })
2182
+ ;
2183
+
2184
+ baseCheckValidity.unhandledInvalids = false;
2185
+ for(var i = 0, len = elems.length; i < len; i++){
2186
+ if( !baseCheckValidity(elems[i], name) ){
2187
+ ret = false;
2188
+ }
2137
2189
  }
2190
+ return ret;
2138
2191
  }
2139
- return ret;
2140
2192
  }
2141
- }
2193
+ });
2142
2194
  });
2143
2195
 
2144
- webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
2145
- checkValidity: {
2146
- value: function(){
2147
- baseCheckValidity.unhandledInvalids = false;
2148
- return baseCheckValidity($(this).getNativeElement()[0]);
2149
- }
2150
- },
2151
- setCustomValidity: {
2152
- value: function(error){
2153
- $.removeData(this, 'cachedValidity');
2154
- webshims.data(this, 'customvalidationMessage', ''+error);
2155
- }
2156
- },
2157
- willValidate: {
2158
- writeable: false,
2159
- get: (function(){
2160
- var types = {
2161
- button: 1,
2162
- reset: 1,
2163
- hidden: 1,
2164
- image: 1
2165
- }
2166
- ;
2167
- return function(){
2168
- var elem = $(this).getNativeElement()[0];
2169
- //elem.name && <- we don't use to make it easier for developers
2170
- return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
2171
- };
2172
- })()
2173
- },
2174
- validity: {
2175
- writeable: false,
2176
- get: function(){
2177
- var jElm = $(this).getNativeElement();
2178
- var elem = jElm[0];
2179
- var validityState = $.data(elem, 'cachedValidity');
2180
- if(validityState){
2181
- return validityState;
2196
+
2197
+
2198
+
2199
+ ['input', 'textarea', 'select'].forEach(function(nodeName){
2200
+ var inputValidationAPI = {
2201
+ setCustomValidity: {
2202
+ value: function(error){
2203
+ $.removeData(this, 'cachedValidity');
2204
+ webshims.data(this, 'customvalidationMessage', ''+error);
2205
+ if(bugs.bustedValidity && inputValidationAPI.setCustomValidity.prop._supvalue){
2206
+ inputValidationAPI.setCustomValidity.prop._supvalue.apply(this, arguments);
2207
+ }
2182
2208
  }
2183
- validityState = $.extend({}, validityPrototype);
2184
-
2185
- if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
2209
+ },
2210
+ willValidate: {
2211
+ writeable: false,
2212
+ get: (function(){
2213
+ var types = {
2214
+ button: 1,
2215
+ reset: 1,
2216
+ hidden: 1,
2217
+ image: 1
2218
+ }
2219
+ ;
2220
+ return function(){
2221
+ var elem = $(this).getNativeElement()[0];
2222
+ return !!(!elem.readOnly && !types[elem.type] && !$(elem).is(':disabled') );
2223
+ };
2224
+ })()
2225
+ },
2226
+ validity: {
2227
+ writeable: false,
2228
+ get: function(){
2229
+ var jElm = $(this).getNativeElement();
2230
+ var elem = jElm[0];
2231
+ var validityState = $.data(elem, 'cachedValidity');
2232
+ if(validityState){
2233
+ return validityState;
2234
+ }
2235
+ validityState = $.extend({}, validityPrototype);
2236
+
2237
+ if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
2238
+ return validityState;
2239
+ }
2240
+ var val = jElm.val(),
2241
+ cache = {nodeName: elem.nodeName.toLowerCase()}
2242
+ ;
2243
+
2244
+ validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
2245
+ if( validityState.customError ){
2246
+ validityState.valid = false;
2247
+ }
2248
+
2249
+ $.each(validityRules, function(rule, fn){
2250
+ if (fn(jElm, val, cache)) {
2251
+ validityState[rule] = true;
2252
+ validityState.valid = false;
2253
+ }
2254
+ });
2255
+ $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
2256
+ jElm = null;
2257
+ elem = null;
2186
2258
  return validityState;
2187
2259
  }
2188
- var val = jElm.val(),
2189
- cache = {nodeName: elem.nodeName.toLowerCase()}
2190
- ;
2191
-
2192
- validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
2193
- if( validityState.customError ){
2194
- validityState.valid = false;
2260
+ }
2261
+ };
2262
+
2263
+ ['checkValidity', 'reportValidity'].forEach(function(name){
2264
+ inputValidationAPI[name] = {
2265
+ value: function(){
2266
+ baseCheckValidity.unhandledInvalids = false;
2267
+ return baseCheckValidity($(this).getNativeElement()[0], name);
2195
2268
  }
2196
-
2197
- $.each(validityRules, function(rule, fn){
2198
- if (fn(jElm, val, cache)) {
2199
- validityState[rule] = true;
2200
- validityState.valid = false;
2201
- }
2202
- });
2203
- $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
2204
- jElm = null;
2205
- elem = null;
2206
- return validityState;
2207
2269
  }
2208
- }
2209
- }, 'prop');
2270
+ });
2271
+
2272
+ webshims.defineNodeNameProperties(nodeName, inputValidationAPI, 'prop');
2273
+ });
2274
+
2210
2275
 
2211
2276
  webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
2212
2277
  set: function(value){
@@ -2216,7 +2281,7 @@ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'requir
2216
2281
  });
2217
2282
  webshims.defineNodeNamesBooleanProperty(['input'], 'multiple');
2218
2283
 
2219
- if(webshims.bugs.bustedValidity){
2284
+ if(bugs.bustedValidity){
2220
2285
 
2221
2286
  webshims.defineNodeNameProperty('form', 'novalidate', {
2222
2287
  attr: {
@@ -2259,6 +2324,22 @@ webshims.defineNodeNameProperty('form', 'noValidate', {
2259
2324
  }
2260
2325
  });
2261
2326
 
2327
+ webshims.defineNodeNamesProperty(['input', 'textarea'], 'minLength', {
2328
+ prop: {
2329
+ set: function(val){
2330
+ val *= 1;
2331
+ if(val < 0){
2332
+ throw('INDEX_SIZE_ERR');
2333
+ }
2334
+ this.setAttribute('minlength', val || 0);
2335
+ },
2336
+ get: function(){
2337
+ var val = this.getAttribute('minlength');
2338
+ return val == null ? -1 : (val * 1) || 0;
2339
+ }
2340
+ }
2341
+ })
2342
+
2262
2343
  if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
2263
2344
  (function(){
2264
2345
 
@@ -2313,7 +2394,7 @@ if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
2313
2394
  focusedin = false;
2314
2395
  }
2315
2396
  if(input){
2316
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
2397
+ input.off('focusout blur', unbind).off('input change updateInput', trigger);
2317
2398
  trigger();
2318
2399
  }
2319
2400
  input = null;
@@ -2356,7 +2437,7 @@ webshims.addReady(function(context, contextElem){
2356
2437
  var focusElem;
2357
2438
  $('form', context)
2358
2439
  .add(contextElem.filter('form'))
2359
- .bind('invalid', $.noop)
2440
+ .on('invalid', $.noop)
2360
2441
  ;
2361
2442
 
2362
2443
  try {
@@ -2532,7 +2613,7 @@ switch(desc.proptype) {
2532
2613
  formSubmitterDescriptors[attrName].attr = {
2533
2614
  set: function(value){
2534
2615
  formSubmitterDescriptors[attrName].attr._supset.call(this, value);
2535
- $(this).unbind(eventName).on(eventName, changeSubmitter);
2616
+ $(this).off(eventName).on(eventName, changeSubmitter);
2536
2617
  },
2537
2618
  get: function(){
2538
2619
  return formSubmitterDescriptors[attrName].attr._supget.call(this);
@@ -2541,7 +2622,7 @@ switch(desc.proptype) {
2541
2622
  formSubmitterDescriptors[attrName].initAttr = true;
2542
2623
  formSubmitterDescriptors[attrName].removeAttr = {
2543
2624
  value: function(){
2544
- $(this).unbind(eventName);
2625
+ $(this).off(eventName);
2545
2626
  formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
2546
2627
  }
2547
2628
  };
@@ -2583,6 +2664,7 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2583
2664
  },
2584
2665
  stepMismatch: 'Invalid input.',
2585
2666
  tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
2667
+ tooShort: 'Please enter at least {%minlength} character(s). You entered {%valueLen}.',
2586
2668
  patternMismatch: 'Invalid input. {%title}',
2587
2669
  valueMissing: {
2588
2670
  defaultMessage: 'Please fill out this field.',
@@ -2639,6 +2721,7 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2639
2721
  },
2640
2722
  stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
2641
2723
  tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
2724
+ tooShort: 'Der eingegebene Text ist zu kurz! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%minlength} das Minimum.',
2642
2725
  patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format. {%title}',
2643
2726
  valueMissing: {
2644
2727
  defaultMessage: 'Bitte geben Sie einen Wert ein.',
@@ -2690,7 +2773,7 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2690
2773
  webshims.info('could not find errormessage for: '+ name +' / '+ type +'. in language: '+webshims.activeLang());
2691
2774
  }
2692
2775
  if(message){
2693
- ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
2776
+ ['value', 'min', 'max', 'title', 'maxlength', 'minlength', 'label'].forEach(function(attr){
2694
2777
  if(message.indexOf('{%'+attr) === -1){return;}
2695
2778
  var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.prop(elem, attr)) || '';
2696
2779
  if(name == 'patternMismatch' && attr == 'title' && !val){
@@ -2720,20 +2803,10 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2720
2803
  implementProperties.push('validationMessage');
2721
2804
  }
2722
2805
 
2723
- webshims.activeLang({
2724
- langObj: validityMessages,
2725
- module: 'form-core',
2726
- callback: function(langObj){
2727
- currentValidationMessage = langObj;
2728
- }
2729
- });
2730
- webshims.activeLang({
2731
- register: 'form-core',
2732
- callback: function(val){
2733
- if(validityMessages[val]){
2734
- currentValidationMessage = validityMessages[val];
2735
- }
2736
- }
2806
+ currentValidationMessage = webshims.activeLang(validityMessages);
2807
+
2808
+ $(validityMessages).on('change', function(e, data){
2809
+ currentValidationMessage = validityMessages.__active;
2737
2810
  });
2738
2811
 
2739
2812
  implementProperties.forEach(function(messageProp){
@@ -3068,7 +3141,9 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3068
3141
  noAutoCallback: true,
3069
3142
  options: $.extend(options, {shadowListProto: shadowListProto})
3070
3143
  });
3071
-
3144
+ if(!options.list){
3145
+ options.list = {};
3146
+ }
3072
3147
  //init datalist update
3073
3148
  initializeDatalist();
3074
3149
  })();
@@ -3119,7 +3194,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3119
3194
  var switchOptions = function(e){
3120
3195
  var media, error, parent;
3121
3196
  if(!options.preferFlash &&
3122
- ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source:last', parent)[0] == e.target)) &&
3197
+ ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source', parent).last()[0] == e.target)) &&
3123
3198
  (media = $(e.target).closest('audio, video')) && (error = media.prop('error')) && !noSwitch[error.code]
3124
3199
  ){
3125
3200
 
@@ -3627,6 +3702,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
3627
3702
  if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
3628
3703
  supLoad.prop._supvalue.apply(this, arguments);
3629
3704
  }
3705
+ $(this).triggerHandler('wsmediareload');
3630
3706
  }
3631
3707
  }
3632
3708
  });