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
@@ -10,8 +10,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
10
10
  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");
11
11
  }
12
12
 
13
- if(!$.parseHTML){
14
- webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
13
+ if('debug' in webshims){
14
+ webshims.error('Use webshims.setOptions("debug", true||false||"noCombo"); to debug flag');
15
15
  }
16
16
 
17
17
  if (!webshims.cfg.no$Switch) {
@@ -47,7 +47,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
47
47
  // '127.0.0.1': 1
48
48
  // };
49
49
  //
50
- // if( webshims.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
50
+ // if( webshims.cfg.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
51
51
  // var list = $('<ul class="webshims-debug-list" />');
52
52
  // webshims.errorLog.push = function(message){
53
53
  // list.appendTo('body');
@@ -479,7 +479,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
479
479
  };
480
480
 
481
481
  $.extend(webshims, {
482
-
483
482
  getID: (function(){
484
483
  var ID = new Date().getTime();
485
484
  return function(elem){
@@ -509,6 +508,51 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
509
508
  }
510
509
  });
511
510
  },
511
+ getOptions: (function(){
512
+ var regs = {};
513
+ var regFn = function(f, upper){
514
+ return upper.toLowerCase();
515
+ };
516
+ return function(elem, name, bases){
517
+ var data = elementData(elem, 'cfg'+name);
518
+ var dataName;
519
+ var cfg = {};
520
+
521
+ if(data){
522
+ return data;
523
+ }
524
+ data = $(elem).data();
525
+
526
+ if(!bases){
527
+ bases = [true, {}];
528
+ } else if(!Array.isArray(bases)){
529
+ bases = [true, {}, bases];
530
+ } else {
531
+ bases.unshift(true, {});
532
+ }
533
+
534
+ if(data && data[name]){
535
+ if(typeof data[name] == 'object'){
536
+ bases.push(data[name]);
537
+ } else {
538
+ webshims.error('data-'+ name +' attribute has to be a valid JSON, was: '+ data[name]);
539
+ }
540
+ }
541
+
542
+ if(!regs[name]){
543
+ regs[name] = new RegExp('^'+ name +'([A-Z])');
544
+ }
545
+
546
+ for(dataName in data){
547
+ if(regs[name].test(dataName)){
548
+ cfg[dataName.replace(regs[name], regFn)] = data[dataName];
549
+ }
550
+ }
551
+ bases.push(cfg);
552
+
553
+ return elementData(elem, 'cfg'+name, $.extend.apply($, bases));
554
+ };
555
+ })(),
512
556
  //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
513
557
  createPropDefault: createPropDefault,
514
558
  data: elementData,
@@ -596,7 +640,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
596
640
  setInterval(this.test, 600);
597
641
  $(this.test);
598
642
  webshims.ready('WINDOWLOAD', this.test);
599
- $(document).on('updatelayout', this.handler);
643
+ $(document).on('updatelayout pageinit collapsibleexpand shown.bs.modal shown.bs.collapse slid.bs.carousel', this.handler);
600
644
  $(window).on('resize', this.handler);
601
645
  (function(){
602
646
  var oldAnimate = $.fn.animate;
@@ -954,109 +998,67 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
954
998
  }
955
999
  },
956
1000
 
957
- // set current Lang:
958
- // - webshims.activeLang(lang:string);
959
- // get current lang
960
- // - webshims.activeLang();
961
- // get current lang
962
- // webshims.activeLang({
963
- // register: moduleName:string,
964
- // callback: callback:function
965
- // });
966
- // get/set including remoteLang
967
- // - webshims.activeLang({
968
- // module: moduleName:string,
969
- // callback: callback:function,
970
- // langObj: languageObj:array/object
971
- // });
972
1001
  activeLang: (function(){
973
- var callbacks = [];
974
- var registeredCallbacks = {};
975
- var currentLang;
976
- var shortLang;
977
- var notLocal = /:\/\/|^\.*\//;
978
- var loadRemoteLang = function(data, lang, options){
979
- var langSrc;
980
- if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
981
- data.loading = true;
982
- langSrc = options.langSrc;
983
- if(!notLocal.test(langSrc)){
984
- langSrc = webshims.cfg.basePath+langSrc;
985
- }
986
- webshims.loader.loadScript(langSrc+lang+'.js', function(){
987
- if(data.langObj[lang]){
988
- data.loading = false;
989
- callLang(data, true);
990
- } else {
991
- $(function(){
992
- if(data.langObj[lang]){
993
- callLang(data, true);
994
- }
995
- data.loading = false;
1002
+ var curLang = [];
1003
+ var langDatas = [];
1004
+ var loading = {};
1005
+ var load = function(src, obj, loadingLang){
1006
+ obj._isLoading = true;
1007
+ if(loading[src]){
1008
+ loading[src].push(obj);
1009
+ } else {
1010
+ loading[src] = [obj];
1011
+ webshims.loader.loadScript(src, function(){
1012
+ if(loadingLang == curLang.join()){
1013
+ $.each(loading[src], function(i, obj){
1014
+ select(obj);
996
1015
  });
997
1016
  }
998
- });
999
- return true;
1000
- }
1001
- return false;
1002
- };
1003
- var callRegister = function(module){
1004
- if(registeredCallbacks[module]){
1005
- registeredCallbacks[module].forEach(function(data){
1006
- data.callback(currentLang, shortLang, '');
1017
+ delete loading[src];
1007
1018
  });
1008
1019
  }
1009
1020
  };
1010
- var callLang = function(data, _noLoop){
1011
- if(data.activeLang != currentLang && data.activeLang !== shortLang){
1012
- var options = modules[data.module].options;
1013
- if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
1014
- data.activeLang = currentLang;
1015
- data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
1016
- callRegister(data.module);
1017
- } else if( !_noLoop &&
1018
- !loadRemoteLang(data, currentLang, options) &&
1019
- !loadRemoteLang(data, shortLang, options) &&
1020
- data.langObj[''] && data.activeLang !== '' ) {
1021
- data.activeLang = '';
1022
- data.callback(data.langObj[''], currentLang);
1023
- callRegister(data.module);
1021
+ var select = function(obj){
1022
+ var oldLang = obj.__active;
1023
+ var selectLang = function(i, lang){
1024
+ obj._isLoading = false;
1025
+ if(obj[lang] || obj.availableLangs.indexOf(lang) != -1){
1026
+ if(obj[lang]){
1027
+ obj.__active = obj[lang];
1028
+ } else {
1029
+ load(obj.langSrc+lang, obj, curLang.join());
1030
+ }
1031
+ return false;
1024
1032
  }
1033
+ };
1034
+ $.each(curLang, selectLang);
1035
+ if(!obj.__active){
1036
+ obj.__active = obj[''];
1037
+ }
1038
+ if(oldLang != obj.__active){
1039
+ $(obj).trigger('change');
1025
1040
  }
1026
1041
  };
1027
-
1028
-
1029
- var activeLang = function(lang){
1030
-
1031
- if(typeof lang == 'string' && lang !== currentLang){
1032
- currentLang = lang;
1033
- shortLang = currentLang.split('-')[0];
1034
- if(currentLang == shortLang){
1035
- shortLang = false;
1042
+ return function(lang){
1043
+ var shortLang;
1044
+ if(typeof lang == 'string'){
1045
+ if(curLang[0] != lang){
1046
+ curLang = [lang];
1047
+ shortLang = curLang[0].split('-')[0];
1048
+ if(shortLang && shortLang != lang){
1049
+ curLang.push(shortLang);
1050
+ }
1051
+ langDatas.forEach(select);
1036
1052
  }
1037
- $.each(callbacks, function(i, data){
1038
- callLang(data);
1039
- });
1040
1053
  } else if(typeof lang == 'object'){
1041
-
1042
- if(lang.register){
1043
- if(!registeredCallbacks[lang.register]){
1044
- registeredCallbacks[lang.register] = [];
1045
- }
1046
- registeredCallbacks[lang.register].push(lang);
1047
- lang.callback(currentLang, shortLang, '');
1048
- } else {
1049
- if(!lang.activeLang){
1050
- lang.activeLang = '';
1051
- }
1052
- callbacks.push(lang);
1053
- callLang(lang);
1054
+ if(!lang.__active){
1055
+ langDatas.push(lang);
1056
+ select(lang);
1054
1057
  }
1058
+ return lang.__active;
1055
1059
  }
1056
- return currentLang;
1060
+ return curLang[0];
1057
1061
  };
1058
-
1059
- return activeLang;
1060
1062
  })()
1061
1063
  });
1062
1064
 
@@ -1200,39 +1202,65 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1200
1202
  return ret;
1201
1203
  };
1202
1204
 
1203
- $.extend($.expr[":"], {
1204
- "valid-element": function(elem){
1205
- return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1206
- },
1207
- "invalid-element": function(elem){
1208
- return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1209
- },
1210
- "required-element": function(elem){
1211
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1212
- },
1213
- "user-error": function(elem){
1214
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1215
- },
1216
- "optional-element": function(elem){
1217
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1205
+ var extendSels = function(){
1206
+ var exp = $.expr[":"];
1207
+ $.extend(exp, {
1208
+ "valid-element": function(elem){
1209
+ return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1210
+ },
1211
+ "invalid-element": function(elem){
1212
+ return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1213
+ },
1214
+ "required-element": function(elem){
1215
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1216
+ },
1217
+ "user-error": function(elem){
1218
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1219
+ },
1220
+ "optional-element": function(elem){
1221
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1222
+ }
1223
+ });
1224
+
1225
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1226
+ exp[name] = $.expr[":"][name+"-element"];
1227
+ });
1228
+
1229
+ // sizzle/jQuery has a bug with :disabled/:enabled selectors
1230
+ if(Modernizr.fieldsetdisabled && !$('<fieldset disabled=""><input /><fieldset>').find('input').is(':disabled')){
1231
+ $.extend(exp, {
1232
+ "enabled": function( elem ) {
1233
+ return elem.disabled === false && !$(elem).is('fieldset[disabled] *');
1234
+ },
1235
+
1236
+ "disabled": function( elem ) {
1237
+ return elem.disabled === true || ('disabled' in elem && $(elem).is('fieldset[disabled] *'));
1238
+ }
1239
+ });
1218
1240
  }
1219
- });
1220
-
1221
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1222
- $.expr[":"][name] = $.expr.filters[name+"-element"];
1223
- });
1224
-
1225
- //bug was partially fixed in 1.10.0 for IE9, but not IE8 (move to es5 as soon as 1.10.2 is used)
1226
- var pseudoFocus = $.expr[":"].focus;
1227
- $.expr[":"].focus = function(){
1228
- try {
1229
- return pseudoFocus.apply(this, arguments);
1230
- } catch(e){
1231
- webshims.error(e);
1241
+
1242
+
1243
+ //bug was partially fixed in 1.10.0 for IE9, but not IE8 (move to es5 as soon as 1.10.2 is used)
1244
+ if(typeof document.activeElement == 'unknown'){
1245
+ var pseudoFocus = exp.focus;
1246
+ exp.focus = function(){
1247
+ try {
1248
+ return pseudoFocus.apply(this, arguments);
1249
+ } catch(e){
1250
+ webshims.error(e);
1251
+ }
1252
+ return false;
1253
+ };
1232
1254
  }
1233
- return false;
1234
1255
  };
1235
1256
 
1257
+ if($.expr.filters){
1258
+ extendSels();
1259
+ } else {
1260
+ webshims.ready('sizzle', extendSels);
1261
+ }
1262
+
1263
+
1236
1264
  webshims.triggerInlineForm = function(elem, event){
1237
1265
  $(elem).trigger(event);
1238
1266
  };
@@ -1300,7 +1328,10 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1300
1328
 
1301
1329
 
1302
1330
  webshims.getContentValidationMessage = function(elem, validity, key){
1303
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1331
+ if(webshims.errorbox && webshims.errorbox.initIvalContentMessage){
1332
+ webshims.errorbox.initIvalContentMessage(elem);
1333
+ }
1334
+ var message = (webshims.getOptions && webshims.errorbox ? webshims.getOptions(elem, 'errormessage') : $(elem).data('errormessage')) || elem.getAttribute('x-moz-errormessage') || '';
1304
1335
  if(key && message[key]){
1305
1336
  message = message[key];
1306
1337
  } else if(message) {
@@ -1346,7 +1377,7 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1346
1377
 
1347
1378
 
1348
1379
  $(document).on('focusin.lazyloadvalidation', function(e){
1349
- if('form' in e.target && (e.target.list || $(e.target).is(':invalid'))){
1380
+ if('form' in e.target){
1350
1381
  lazyLoad();
1351
1382
  }
1352
1383
  });
@@ -1360,7 +1391,6 @@ webshims.inputTypes = webshims.inputTypes || {};
1360
1391
  //some helper-functions
1361
1392
  var cfg = webshims.cfg.forms;
1362
1393
  var bugs = webshims.bugs;
1363
- var isSubmit;
1364
1394
 
1365
1395
  var isNumber = function(string){
1366
1396
  return (typeof string == 'number' || (string && string == string * 1));
@@ -1435,6 +1465,7 @@ var validityPrototype = {
1435
1465
  rangeOverflow: false,
1436
1466
  stepMismatch: false,
1437
1467
  tooLong: false,
1468
+ tooShort: false,
1438
1469
  patternMismatch: false,
1439
1470
  valueMissing: false,
1440
1471
 
@@ -1471,6 +1502,9 @@ var getGroupElements = function(elem){
1471
1502
  }
1472
1503
  return ret;
1473
1504
  };
1505
+ var patternTypes = {url: 1, email: 1, text: 1, search: 1, tel: 1, password: 1};
1506
+ var lengthTypes = $.extend({textarea: 1}, patternTypes);
1507
+
1474
1508
  var validityRules = {
1475
1509
  valueMissing: function(input, val, cache){
1476
1510
  if(!input.prop('required')){return false;}
@@ -1487,11 +1521,12 @@ var validityRules = {
1487
1521
  }
1488
1522
  return ret;
1489
1523
  },
1490
- tooLong: function(){
1491
- return false;
1492
- },
1493
1524
  patternMismatch: function(input, val, cache) {
1494
1525
  if(val === '' || cache.nodeName == 'select'){return false;}
1526
+ if(!('type' in cache)){
1527
+ cache.type = getType(input[0]);
1528
+ }
1529
+ if(!patternTypes[cache.type]){return false;}
1495
1530
  var pattern = input.attr('pattern');
1496
1531
  if(!pattern){return false;}
1497
1532
  try {
@@ -1506,6 +1541,20 @@ var validityRules = {
1506
1541
  }
1507
1542
  ;
1508
1543
 
1544
+ $.each({tooShort: ['minLength', -1], tooLong: ['maxLength', 1]}, function(name, props){
1545
+ validityRules[name] = function(input, val, cache){
1546
+ //defaultValue is not the same as dirty flag, but very similiar
1547
+ if(cache.nodeName == 'select' || input.prop('defaultValue') == val){return false;}
1548
+ if(!('type' in cache)){
1549
+ cache.type = getType(input[0]);
1550
+ }
1551
+ if(!lengthTypes[cache.type]){return false;}
1552
+ var prop = input.prop(props[0]);
1553
+
1554
+ return ( prop > 0 && prop * props[1] < val.length * props[1] );
1555
+ };
1556
+ });
1557
+
1509
1558
  $.each({typeMismatch: 'mismatch', badInput: 'bad'}, function(name, fn){
1510
1559
  validityRules[name] = function (input, val, cache){
1511
1560
  if(val === '' || cache.nodeName == 'select'){return false;}
@@ -1556,15 +1605,12 @@ $.event.special.invalid = {
1556
1605
 
1557
1606
  if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
1558
1607
 
1559
- isSubmit = true;
1560
1608
  e.testedValidity = true;
1561
- var notValid = !($(e.target).checkValidity());
1609
+ var notValid = !($(e.target).callProp('reportValidity'));
1562
1610
  if(notValid){
1563
1611
  e.stopImmediatePropagation();
1564
- isSubmit = false;
1565
1612
  return false;
1566
1613
  }
1567
- isSubmit = false;
1568
1614
  }
1569
1615
  };
1570
1616
 
@@ -1631,6 +1677,9 @@ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
1631
1677
  checkValidity: {
1632
1678
  value: function(){return true;}
1633
1679
  },
1680
+ reportValidity: {
1681
+ value: function(){return true;}
1682
+ },
1634
1683
  willValidate: {
1635
1684
  value: false
1636
1685
  },
@@ -1645,7 +1694,7 @@ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
1645
1694
  }
1646
1695
  }, 'prop');
1647
1696
 
1648
- var baseCheckValidity = function(elem){
1697
+ var baseCheckValidity = function(elem, type){
1649
1698
  var e,
1650
1699
  v = $.prop(elem, 'validity')
1651
1700
  ;
@@ -1657,7 +1706,7 @@ var baseCheckValidity = function(elem){
1657
1706
  if( !v.valid ){
1658
1707
  e = $.Event('invalid');
1659
1708
  var jElm = $(elem).trigger(e);
1660
- if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
1709
+ if(type == 'reportValidity' && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
1661
1710
  webshims.validityAlert.showFor(jElm);
1662
1711
  baseCheckValidity.unhandledInvalids = true;
1663
1712
  }
@@ -1666,95 +1715,111 @@ var baseCheckValidity = function(elem){
1666
1715
  return v.valid;
1667
1716
  };
1668
1717
  var rsubmittable = /^(?:select|textarea|input)/i;
1669
- webshims.defineNodeNameProperty('form', 'checkValidity', {
1670
- prop: {
1671
- value: function(){
1672
-
1673
- var ret = true,
1674
- elems = $($.prop(this, 'elements')).filter(function(){
1675
- if(!rsubmittable.test(this.nodeName)){return false;}
1676
- var shadowData = webshims.data(this, 'shadowData');
1677
- return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
1678
- })
1679
- ;
1680
-
1681
- baseCheckValidity.unhandledInvalids = false;
1682
- for(var i = 0, len = elems.length; i < len; i++){
1683
- if( !baseCheckValidity(elems[i]) ){
1684
- ret = false;
1718
+
1719
+ ['checkValidity', 'reportValidity'].forEach(function(name){
1720
+ webshims.defineNodeNameProperty('form', name, {
1721
+ prop: {
1722
+ value: function(){
1723
+
1724
+ var ret = true,
1725
+ elems = $($.prop(this, 'elements')).filter(function(){
1726
+ if(!rsubmittable.test(this.nodeName)){return false;}
1727
+ var shadowData = webshims.data(this, 'shadowData');
1728
+ return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
1729
+ })
1730
+ ;
1731
+
1732
+ baseCheckValidity.unhandledInvalids = false;
1733
+ for(var i = 0, len = elems.length; i < len; i++){
1734
+ if( !baseCheckValidity(elems[i], name) ){
1735
+ ret = false;
1736
+ }
1685
1737
  }
1738
+ return ret;
1686
1739
  }
1687
- return ret;
1688
1740
  }
1689
- }
1741
+ });
1690
1742
  });
1691
1743
 
1692
- webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
1693
- checkValidity: {
1694
- value: function(){
1695
- baseCheckValidity.unhandledInvalids = false;
1696
- return baseCheckValidity($(this).getNativeElement()[0]);
1697
- }
1698
- },
1699
- setCustomValidity: {
1700
- value: function(error){
1701
- $.removeData(this, 'cachedValidity');
1702
- webshims.data(this, 'customvalidationMessage', ''+error);
1703
- }
1704
- },
1705
- willValidate: {
1706
- writeable: false,
1707
- get: (function(){
1708
- var types = {
1709
- button: 1,
1710
- reset: 1,
1711
- hidden: 1,
1712
- image: 1
1713
- }
1714
- ;
1715
- return function(){
1716
- var elem = $(this).getNativeElement()[0];
1717
- //elem.name && <- we don't use to make it easier for developers
1718
- return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
1719
- };
1720
- })()
1721
- },
1722
- validity: {
1723
- writeable: false,
1724
- get: function(){
1725
- var jElm = $(this).getNativeElement();
1726
- var elem = jElm[0];
1727
- var validityState = $.data(elem, 'cachedValidity');
1728
- if(validityState){
1729
- return validityState;
1744
+
1745
+
1746
+
1747
+ ['input', 'textarea', 'select'].forEach(function(nodeName){
1748
+ var inputValidationAPI = {
1749
+ setCustomValidity: {
1750
+ value: function(error){
1751
+ $.removeData(this, 'cachedValidity');
1752
+ webshims.data(this, 'customvalidationMessage', ''+error);
1753
+ if(bugs.bustedValidity && inputValidationAPI.setCustomValidity.prop._supvalue){
1754
+ inputValidationAPI.setCustomValidity.prop._supvalue.apply(this, arguments);
1755
+ }
1730
1756
  }
1731
- validityState = $.extend({}, validityPrototype);
1732
-
1733
- if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
1757
+ },
1758
+ willValidate: {
1759
+ writeable: false,
1760
+ get: (function(){
1761
+ var types = {
1762
+ button: 1,
1763
+ reset: 1,
1764
+ hidden: 1,
1765
+ image: 1
1766
+ }
1767
+ ;
1768
+ return function(){
1769
+ var elem = $(this).getNativeElement()[0];
1770
+ return !!(!elem.readOnly && !types[elem.type] && !$(elem).is(':disabled') );
1771
+ };
1772
+ })()
1773
+ },
1774
+ validity: {
1775
+ writeable: false,
1776
+ get: function(){
1777
+ var jElm = $(this).getNativeElement();
1778
+ var elem = jElm[0];
1779
+ var validityState = $.data(elem, 'cachedValidity');
1780
+ if(validityState){
1781
+ return validityState;
1782
+ }
1783
+ validityState = $.extend({}, validityPrototype);
1784
+
1785
+ if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
1786
+ return validityState;
1787
+ }
1788
+ var val = jElm.val(),
1789
+ cache = {nodeName: elem.nodeName.toLowerCase()}
1790
+ ;
1791
+
1792
+ validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
1793
+ if( validityState.customError ){
1794
+ validityState.valid = false;
1795
+ }
1796
+
1797
+ $.each(validityRules, function(rule, fn){
1798
+ if (fn(jElm, val, cache)) {
1799
+ validityState[rule] = true;
1800
+ validityState.valid = false;
1801
+ }
1802
+ });
1803
+ $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
1804
+ jElm = null;
1805
+ elem = null;
1734
1806
  return validityState;
1735
1807
  }
1736
- var val = jElm.val(),
1737
- cache = {nodeName: elem.nodeName.toLowerCase()}
1738
- ;
1739
-
1740
- validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
1741
- if( validityState.customError ){
1742
- validityState.valid = false;
1808
+ }
1809
+ };
1810
+
1811
+ ['checkValidity', 'reportValidity'].forEach(function(name){
1812
+ inputValidationAPI[name] = {
1813
+ value: function(){
1814
+ baseCheckValidity.unhandledInvalids = false;
1815
+ return baseCheckValidity($(this).getNativeElement()[0], name);
1743
1816
  }
1744
-
1745
- $.each(validityRules, function(rule, fn){
1746
- if (fn(jElm, val, cache)) {
1747
- validityState[rule] = true;
1748
- validityState.valid = false;
1749
- }
1750
- });
1751
- $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
1752
- jElm = null;
1753
- elem = null;
1754
- return validityState;
1755
1817
  }
1756
- }
1757
- }, 'prop');
1818
+ });
1819
+
1820
+ webshims.defineNodeNameProperties(nodeName, inputValidationAPI, 'prop');
1821
+ });
1822
+
1758
1823
 
1759
1824
  webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
1760
1825
  set: function(value){
@@ -1764,7 +1829,7 @@ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'requir
1764
1829
  });
1765
1830
  webshims.defineNodeNamesBooleanProperty(['input'], 'multiple');
1766
1831
 
1767
- if(webshims.bugs.bustedValidity){
1832
+ if(bugs.bustedValidity){
1768
1833
 
1769
1834
  webshims.defineNodeNameProperty('form', 'novalidate', {
1770
1835
  attr: {
@@ -1807,6 +1872,22 @@ webshims.defineNodeNameProperty('form', 'noValidate', {
1807
1872
  }
1808
1873
  });
1809
1874
 
1875
+ webshims.defineNodeNamesProperty(['input', 'textarea'], 'minLength', {
1876
+ prop: {
1877
+ set: function(val){
1878
+ val *= 1;
1879
+ if(val < 0){
1880
+ throw('INDEX_SIZE_ERR');
1881
+ }
1882
+ this.setAttribute('minlength', val || 0);
1883
+ },
1884
+ get: function(){
1885
+ var val = this.getAttribute('minlength');
1886
+ return val == null ? -1 : (val * 1) || 0;
1887
+ }
1888
+ }
1889
+ })
1890
+
1810
1891
  if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
1811
1892
  (function(){
1812
1893
 
@@ -1861,7 +1942,7 @@ if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
1861
1942
  focusedin = false;
1862
1943
  }
1863
1944
  if(input){
1864
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
1945
+ input.off('focusout blur', unbind).off('input change updateInput', trigger);
1865
1946
  trigger();
1866
1947
  }
1867
1948
  input = null;
@@ -1904,7 +1985,7 @@ webshims.addReady(function(context, contextElem){
1904
1985
  var focusElem;
1905
1986
  $('form', context)
1906
1987
  .add(contextElem.filter('form'))
1907
- .bind('invalid', $.noop)
1988
+ .on('invalid', $.noop)
1908
1989
  ;
1909
1990
 
1910
1991
  try {
@@ -2080,7 +2161,7 @@ switch(desc.proptype) {
2080
2161
  formSubmitterDescriptors[attrName].attr = {
2081
2162
  set: function(value){
2082
2163
  formSubmitterDescriptors[attrName].attr._supset.call(this, value);
2083
- $(this).unbind(eventName).on(eventName, changeSubmitter);
2164
+ $(this).off(eventName).on(eventName, changeSubmitter);
2084
2165
  },
2085
2166
  get: function(){
2086
2167
  return formSubmitterDescriptors[attrName].attr._supget.call(this);
@@ -2089,7 +2170,7 @@ switch(desc.proptype) {
2089
2170
  formSubmitterDescriptors[attrName].initAttr = true;
2090
2171
  formSubmitterDescriptors[attrName].removeAttr = {
2091
2172
  value: function(){
2092
- $(this).unbind(eventName);
2173
+ $(this).off(eventName);
2093
2174
  formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
2094
2175
  }
2095
2176
  };
@@ -2131,6 +2212,7 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2131
2212
  },
2132
2213
  stepMismatch: 'Invalid input.',
2133
2214
  tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
2215
+ tooShort: 'Please enter at least {%minlength} character(s). You entered {%valueLen}.',
2134
2216
  patternMismatch: 'Invalid input. {%title}',
2135
2217
  valueMissing: {
2136
2218
  defaultMessage: 'Please fill out this field.',
@@ -2187,6 +2269,7 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2187
2269
  },
2188
2270
  stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
2189
2271
  tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
2272
+ tooShort: 'Der eingegebene Text ist zu kurz! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%minlength} das Minimum.',
2190
2273
  patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format. {%title}',
2191
2274
  valueMissing: {
2192
2275
  defaultMessage: 'Bitte geben Sie einen Wert ein.',
@@ -2238,7 +2321,7 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2238
2321
  webshims.info('could not find errormessage for: '+ name +' / '+ type +'. in language: '+webshims.activeLang());
2239
2322
  }
2240
2323
  if(message){
2241
- ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
2324
+ ['value', 'min', 'max', 'title', 'maxlength', 'minlength', 'label'].forEach(function(attr){
2242
2325
  if(message.indexOf('{%'+attr) === -1){return;}
2243
2326
  var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.prop(elem, attr)) || '';
2244
2327
  if(name == 'patternMismatch' && attr == 'title' && !val){
@@ -2268,20 +2351,10 @@ webshims.register('form-message', function($, webshims, window, document, undefi
2268
2351
  implementProperties.push('validationMessage');
2269
2352
  }
2270
2353
 
2271
- webshims.activeLang({
2272
- langObj: validityMessages,
2273
- module: 'form-core',
2274
- callback: function(langObj){
2275
- currentValidationMessage = langObj;
2276
- }
2277
- });
2278
- webshims.activeLang({
2279
- register: 'form-core',
2280
- callback: function(val){
2281
- if(validityMessages[val]){
2282
- currentValidationMessage = validityMessages[val];
2283
- }
2284
- }
2354
+ currentValidationMessage = webshims.activeLang(validityMessages);
2355
+
2356
+ $(validityMessages).on('change', function(e, data){
2357
+ currentValidationMessage = validityMessages.__active;
2285
2358
  });
2286
2359
 
2287
2360
  implementProperties.forEach(function(messageProp){
@@ -2616,7 +2689,9 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
2616
2689
  noAutoCallback: true,
2617
2690
  options: $.extend(options, {shadowListProto: shadowListProto})
2618
2691
  });
2619
-
2692
+ if(!options.list){
2693
+ options.list = {};
2694
+ }
2620
2695
  //init datalist update
2621
2696
  initializeDatalist();
2622
2697
  })();