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
@@ -1,8 +1,8 @@
1
1
  //DOM-Extension helper
2
- jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
2
+ webshims.register('dom-extend', function($, webshims, window, document, undefined){
3
3
  "use strict";
4
4
 
5
- webshims.assumeARIA = Modernizr.localstorage || Modernizr.video || Modernizr.boxsizing;
5
+ webshims.assumeARIA = $.support.getSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
6
6
 
7
7
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
8
8
  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,6 +11,57 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
11
11
  if(!$.parseHTML){
12
12
  webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
13
13
  }
14
+ if (!webshims.cfg.no$Switch) {
15
+ var switch$ = function(){
16
+ if (window.jQuery && (!window.$ || window.jQuery == window.$) && !window.jQuery.webshims) {
17
+ webshims.error("jQuery was included more than once. Make sure to include it only once! Webshims and other Plugins might not work properly.");
18
+ if (window.$) {
19
+ window.$ = webshims.$;
20
+ }
21
+ window.jQuery = webshims.$;
22
+ }
23
+ if(webshims.M != Modernizr){
24
+ webshims.error("Modernizr was included more than once. Make sure to include it only once! Webshims and other scripts might not work properly.");
25
+ for(var i in Modernizr){
26
+ if(!(i in webshims.M)){
27
+ webshims.M[i] = Modernizr[i];
28
+ }
29
+ }
30
+ Modernizr = webshims.M;
31
+ }
32
+ };
33
+ switch$();
34
+ setTimeout(switch$, 90);
35
+ $(switch$);
36
+ }
37
+ // (function(){
38
+ // var hostNames = {
39
+ // 'afarkas.github.io': 1,
40
+ // localhost: 1,
41
+ // '127.0.0.1': 1
42
+ // };
43
+ //
44
+ // if( webshims.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
45
+ // var list = $('<ul class="webshims-debug-list" />');
46
+ // webshims.errorLog.push = function(message){
47
+ // list.appendTo('body');
48
+ // $('<li style="display: none;">'+ message +'</li>')
49
+ // .appendTo(list)
50
+ // .slideDown()
51
+ // .delay(3000)
52
+ // .slideUp(function(){
53
+ // $(this).remove();
54
+ // if(!$('li', list).length){
55
+ // list.detach();
56
+ // }
57
+ // })
58
+ // ;
59
+ // };
60
+ // $.each(webshims.errorLog, function(i, message){
61
+ // webshims.errorLog.push(message);
62
+ // });
63
+ // }
64
+ // })();
14
65
 
15
66
  //shortcus
16
67
  var modules = webshims.modules;
@@ -28,6 +79,24 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
28
79
  return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
29
80
  };
30
81
 
82
+ //jquery mobile and jquery ui
83
+ if(!$.widget){
84
+ (function(){
85
+ var _cleanData = $.cleanData;
86
+ $.cleanData = function( elems ) {
87
+ if(!$.widget){
88
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
89
+ try {
90
+ $( elem ).triggerHandler( "remove" );
91
+ // http://bugs.jquery.com/ticket/8235
92
+ } catch( e ) {}
93
+ }
94
+ }
95
+ _cleanData( elems );
96
+ };
97
+ })();
98
+ }
99
+
31
100
 
32
101
  $.fn.val = function(val){
33
102
  var elem = this[0];
@@ -61,6 +130,18 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
61
130
  return this.on(evt, fn).each(fn);
62
131
  };
63
132
 
133
+ $.fn.onWSOff = function(evt, fn, trigger, evtDel){
134
+ if(!evtDel){
135
+ evtDel = document;
136
+ }
137
+ $(evtDel)[trigger ? 'onTrigger' : 'on'](evt, fn);
138
+ this.on('remove', function(e){
139
+ if(!e.originalEvent){
140
+ $(evtDel).off(evt, fn);
141
+ }
142
+ });
143
+ };
144
+
64
145
  var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
65
146
  var elementData = function(elem, key, val){
66
147
  elem = elem.jquery ? elem[0] : elem;
@@ -422,7 +503,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
422
503
  implement: function(elem, type){
423
504
  var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
424
505
  if(data[type]){
425
- webshims.info(type +' already implemented for element #'+elem.id);
506
+ webshims.warn(type +' already implemented for element #'+elem.id);
426
507
  return false;
427
508
  }
428
509
  data[type] = true;
@@ -566,6 +647,12 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
566
647
  shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
567
648
  }
568
649
 
650
+ $(nativeElem).on('remove', function(e){
651
+ if (!e.originalEvent) {
652
+ $(shadowElem).remove();
653
+ }
654
+ });
655
+
569
656
  nativeData.hasShadow = shadowElem;
570
657
  shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
571
658
  shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
@@ -1041,32 +1128,9 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1041
1128
 
1042
1129
  })(jQuery, document);
1043
1130
 
1044
- //additional tests for partial implementation of forms features
1045
- (function($){
1131
+ webshims.register('form-core', function($, webshims, window, document, undefined, options){
1046
1132
  "use strict";
1047
- var isWebkit = 'webkitURL' in window;
1048
- var Modernizr = window.Modernizr;
1049
- var webshims = $.webshims;
1050
- var bugs = webshims.bugs;
1051
- var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
1052
- var testRequiredFind = function(){
1053
- if(form[0].querySelector){
1054
- try {
1055
- bugs.findRequired = !(form[0].querySelector('select:required'));
1056
- } catch(er){
1057
- bugs.findRequired = false;
1058
- }
1059
- }
1060
- };
1061
- var inputElem = $('input', form).eq(0);
1062
- var onDomextend = function(fn){
1063
- webshims.loader.loadList(['dom-extend']);
1064
- webshims.ready('dom-extend', fn);
1065
- };
1066
-
1067
- bugs.findRequired = false;
1068
- bugs.validationMessage = false;
1069
-
1133
+
1070
1134
  webshims.capturingEventPrevented = function(e){
1071
1135
  if(!e._isPolyfilled){
1072
1136
  var isDefaultPrevented = e.isDefaultPrevented;
@@ -1085,689 +1149,238 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1085
1149
  }
1086
1150
  };
1087
1151
 
1088
- if(!Modernizr.formvalidation || bugs.bustedValidity){
1089
- testRequiredFind();
1090
- } else {
1152
+ if(Modernizr.formvalidation && !webshims.bugs.bustedValidity){
1091
1153
  //create delegatable events
1092
1154
  webshims.capturingEvents(['invalid'], true);
1093
-
1094
- if(window.opera || window.testGoodWithFix){
1095
-
1096
- form.appendTo('head');
1097
-
1098
- testRequiredFind();
1099
- bugs.validationMessage = !(inputElem.prop('validationMessage'));
1155
+ }
1156
+
1157
+ var isValid = function(elem){
1158
+ return ($.prop(elem, 'validity') || {valid: 1}).valid;
1159
+ };
1160
+ var lazyLoad = function(){
1161
+ var toLoad = ['form-validation'];
1162
+ if(options.lazyCustomMessages){
1163
+ options.customMessages = true;
1164
+ toLoad.push('form-message');
1165
+ }
1166
+ if(options.addValidators){
1167
+ toLoad.push('form-validators');
1168
+ }
1169
+ webshims.reTest(toLoad);
1170
+ $(document).off('.lazyloadvalidation');
1171
+ };
1172
+ /*
1173
+ * Selectors for all browsers
1174
+ */
1175
+ var hasInvalid = function(elem){
1176
+ var ret = false;
1177
+ $(elem).jProp('elements').each(function(){
1178
+ ret = $(this).is(':invalid');
1179
+ if(ret){
1180
+ return false;
1181
+ }
1182
+ });
1183
+ return ret;
1184
+ };
1185
+ var rElementsGroup = /^(?:form)$/i;///^(?:form|fieldset)$/i
1186
+ $.extend($.expr[":"], {
1187
+ "valid-element": function(elem){
1188
+ return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1189
+ },
1190
+ "invalid-element": function(elem){
1191
+ return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1192
+ },
1193
+ "required-element": function(elem){
1194
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1195
+ },
1196
+ "user-error": function(elem){
1197
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1198
+ },
1199
+ "optional-element": function(elem){
1200
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1201
+ }
1202
+ });
1203
+
1204
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1205
+ $.expr[":"][name] = $.expr.filters[name+"-element"];
1206
+ });
1207
+
1208
+
1209
+ $.expr[":"].focus = function( elem ) {
1210
+ try {
1211
+ var doc = elem.ownerDocument;
1212
+ return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
1213
+ } catch(e){}
1214
+ return false;
1215
+ };
1216
+
1217
+ webshims.triggerInlineForm = function(elem, event){
1218
+ $(elem).trigger(event);
1219
+ };
1220
+
1221
+ var lazyLoadProxy = function(obj, fn, args){
1222
+ lazyLoad();
1223
+ webshims.ready('form-validation', function(){
1224
+ obj[fn].apply(obj, args);
1225
+ });
1226
+ };
1227
+
1228
+
1229
+ webshims.wsPopover = {
1230
+ id: 0,
1231
+ _create: function(){
1232
+ this.options = $.extend({}, webshims.cfg.wspopover, this.options);
1233
+ this.id = webshims.wsPopover.id++;
1234
+ this.eventns = '.wsoverlay' + this.id;
1235
+ this.timers = {};
1236
+ 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>');
1237
+ this.contentElement = $('.ws-po-box', this.element);
1238
+ this.lastElement = $([]);
1239
+ this.bindElement();
1100
1240
 
1101
- webshims.reTest(['form-native-extend', 'form-message']);
1241
+ this.element.data('wspopover', this);
1102
1242
 
1103
- form.remove();
1104
-
1105
- $(function(){
1106
- onDomextend(function(){
1107
-
1108
- //Opera shows native validation bubbles in case of input.checkValidity()
1109
- // Opera 11.6/12 hasn't fixed this issue right, it's buggy
1110
- var preventDefault = function(e){
1111
- e.preventDefault();
1112
- };
1113
-
1114
- ['form', 'input', 'textarea', 'select'].forEach(function(name){
1115
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
1116
- prop: {
1117
- value: function(){
1118
- if (!webshims.fromSubmit) {
1119
- $(this).on('invalid.checkvalidity', preventDefault);
1120
- }
1121
-
1122
- webshims.fromCheckValidity = true;
1123
- var ret = desc.prop._supvalue.apply(this, arguments);
1124
- if (!webshims.fromSubmit) {
1125
- $(this).unbind('invalid.checkvalidity', preventDefault);
1126
- }
1127
- webshims.fromCheckValidity = false;
1128
- return ret;
1129
- }
1130
- }
1131
- });
1132
- });
1133
-
1134
- });
1243
+ },
1244
+ options: {},
1245
+ content: function(html){
1246
+ this.contentElement.html(html);
1247
+ },
1248
+ bindElement: function(){
1249
+ var that = this;
1250
+ var stopBlur = function(){
1251
+ that.stopBlur = false;
1252
+ };
1253
+ this.preventBlur = function(e){
1254
+ that.stopBlur = true;
1255
+ clearTimeout(that.timers.stopBlur);
1256
+ that.timers.stopBlur = setTimeout(stopBlur, 9);
1257
+ };
1258
+ this.element.on({
1259
+ 'mousedown': this.preventBlur
1135
1260
  });
1261
+ },
1262
+ show: function(){
1263
+ lazyLoadProxy(this, 'show', arguments);
1136
1264
  }
1137
-
1138
- if(isWebkit && !webshims.bugs.bustedValidity){
1139
- (function(){
1140
- var elems = /^(?:textarea|input)$/i;
1141
- var form = false;
1142
-
1143
- document.addEventListener('contextmenu', function(e){
1144
- if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
1145
- setTimeout(function(){
1146
- form = false;
1147
- }, 1);
1148
- }
1149
- }, false);
1150
-
1151
- $(window).on('invalid', function(e){
1152
- if(e.originalEvent && form && form == e.target.form){
1153
- e.wrongWebkitInvalid = true;
1154
- e.stopImmediatePropagation();
1155
- }
1156
- });
1157
-
1158
- })();
1265
+ };
1266
+
1267
+ /* some extra validation UI */
1268
+ webshims.validityAlert = {
1269
+ showFor: function(){
1270
+ lazyLoadProxy(this, 'showFor', arguments);
1159
1271
  }
1160
- }
1161
-
1162
- $.webshims.register('form-core', function($, webshims, window, document, undefined, options){
1272
+ };
1163
1273
 
1164
- var checkTypes = {checkbox: 1, radio: 1};
1165
- var emptyJ = $([]);
1166
- var bugs = webshims.bugs;
1167
- var getGroupElements = function(elem){
1168
- elem = $(elem);
1169
- var name;
1170
- var form;
1171
- var ret = emptyJ;
1172
- if(elem[0].type == 'radio'){
1173
- form = elem.prop('form');
1174
- name = elem[0].name;
1175
- if(!name){
1176
- ret = elem;
1177
- } else if(form){
1178
- ret = $(form[name]);
1179
- } else {
1180
- ret = $(document.getElementsByName(name)).filter(function(){
1181
- return !$.prop(this, 'form');
1182
- });
1183
- }
1184
- ret = ret.filter('[type="radio"]');
1185
- }
1186
- return ret;
1187
- };
1274
+
1275
+ /* extension, but also used to fix native implementation workaround/bugfixes */
1276
+ (function(){
1277
+ var firstEvent,
1278
+ invalids = [],
1279
+ stopSubmitTimer,
1280
+ form
1281
+ ;
1188
1282
 
1189
- var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
1190
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1191
- if(key && message[key]){
1192
- message = message[key];
1193
- }
1194
- if(typeof message == 'object'){
1195
- validity = validity || $.prop(elem, 'validity') || {valid: 1};
1196
- if(!validity.valid){
1197
- $.each(validity, function(name, prop){
1198
- if(prop && name != 'valid' && message[name]){
1199
- message = message[name];
1200
- return false;
1201
- }
1202
- });
1203
- }
1204
- }
1283
+ $(document).on('invalid', function(e){
1284
+ if(e.wrongWebkitInvalid){return;}
1285
+ var jElm = $(e.target);
1205
1286
 
1206
- if(typeof message == 'object'){
1207
- message = message.defaultMessage;
1208
- }
1209
- return message || '';
1210
- };
1211
-
1212
- /*
1213
- * Selectors for all browsers
1214
- */
1215
- var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
1216
- var hasInvalid = function(elem){
1217
- var ret = false;
1218
- $($.prop(elem, 'elements')).each(function(){
1219
- ret = $(this).is(':invalid');
1220
- if(ret){
1221
- return false;
1222
- }
1223
- });
1224
- return ret;
1225
- };
1226
- $.extend($.expr[":"], {
1227
- "valid-element": function(elem){
1228
- return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1229
- },
1230
- "invalid-element": function(elem){
1231
- return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1232
- },
1233
- "required-element": function(elem){
1234
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1235
- },
1236
- "user-error": function(elem){
1237
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1238
- },
1239
- "optional-element": function(elem){
1240
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1241
- },
1242
- "in-range": function(elem){
1243
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
1244
- return false;
1245
- }
1246
- var val = $.prop(elem, 'validity');
1247
- return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
1248
- },
1249
- "out-of-range": function(elem){
1250
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
1251
- return false;
1252
- }
1253
- var val = $.prop(elem, 'validity');
1254
- return !!(val && (val.rangeOverflow || val.rangeUnderflow));
1255
- }
1256
-
1257
- });
1258
-
1259
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1260
- $.expr[":"][name] = $.expr.filters[name+"-element"];
1261
- });
1262
-
1263
-
1264
- $.expr[":"].focus = function( elem ) {
1265
- try {
1266
- var doc = elem.ownerDocument;
1267
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
1268
- } catch(e){}
1269
- return false;
1270
- };
1271
-
1272
-
1273
- var customEvents = $.event.customEvent || {};
1274
- var isValid = function(elem){
1275
- return ($.prop(elem, 'validity') || {valid: 1}).valid;
1276
- };
1277
-
1278
- if (bugs.bustedValidity || bugs.findRequired) {
1279
- (function(){
1280
- var find = $.find;
1281
- var matchesSelector = $.find.matchesSelector;
1282
-
1283
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
1284
- var regFn = function(sel){
1285
- return sel + '-element';
1286
- };
1287
-
1288
- $.find = (function(){
1289
- var slice = Array.prototype.slice;
1290
- var fn = function(sel){
1291
- var ar = arguments;
1292
- ar = slice.call(ar, 1, ar.length);
1293
- ar.unshift(sel.replace(regExp, regFn));
1294
- return find.apply(this, ar);
1295
- };
1296
- for (var i in find) {
1297
- if(find.hasOwnProperty(i)){
1298
- fn[i] = find[i];
1299
- }
1300
- }
1301
- return fn;
1302
- })();
1303
- if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
1304
- $.find.matchesSelector = function(node, expr){
1305
- expr = expr.replace(regExp, regFn);
1306
- return matchesSelector.call(this, node, expr);
1307
- };
1308
- }
1309
-
1310
- })();
1311
- }
1312
-
1313
- //ToDo needs testing
1314
- var oldAttr = $.prop;
1315
- var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
1316
- $.prop = function(elem, name, val){
1317
- var ret = oldAttr.apply(this, arguments);
1318
- if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
1319
- if(isValid(elem)){
1320
- $(elem).getShadowElement().removeClass(invalidClass);
1321
- if(name == 'checked' && val) {
1322
- getGroupElements(elem).not(elem).removeClass(invalidClass).removeAttr('aria-invalid');
1323
- }
1324
- }
1325
- }
1326
- return ret;
1327
- };
1328
-
1329
- var returnValidityCause = function(validity, elem){
1330
- var ret;
1331
- $.each(validity, function(name, value){
1332
- if(value){
1333
- ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
1334
- return false;
1335
- }
1336
- });
1337
- return ret;
1338
- };
1339
-
1340
- var isInGroup = function(name){
1341
- var ret;
1342
- try {
1343
- ret = document.activeElement.name === name;
1344
- } catch(e){}
1345
- return ret;
1346
- };
1347
- /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-success instead */
1348
- var invalidClass = 'user-error';
1349
- var validClass = 'user-success';
1350
- var stopChangeTypes = {
1351
- time: 1,
1352
- date: 1,
1353
- month: 1,
1354
- datetime: 1,
1355
- week: 1,
1356
- 'datetime-local': 1
1357
- };
1358
- var switchValidityClass = function(e){
1359
- var elem, timer;
1360
- if(!e.target){return;}
1361
- elem = $(e.target).getNativeElement()[0];
1362
- if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
1363
- timer = $.data(elem, 'webshimsswitchvalidityclass');
1364
- var switchClass = function(){
1365
- if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
1366
- var validity = $.prop(elem, 'validity');
1367
- var shadowElem = $(elem).getShadowElement();
1368
- var addClass, removeClass, trigger, generaltrigger, validityCause;
1369
-
1370
- if(isWebkit && e.type == 'change' && !bugs.bustedValidity && stopChangeTypes[shadowElem.prop('type')] && shadowElem.is(':focus')){return;}
1371
-
1372
- $(elem).trigger('refreshCustomValidityRules');
1373
-
1374
- if(validity.valid){
1375
- if(!shadowElem.hasClass(validClass)){
1376
- addClass = validClass;
1377
- removeClass = invalidClass;
1378
- generaltrigger = 'changedvaliditystate';
1379
- trigger = 'changedvalid';
1380
- if(checkTypes[elem.type] && elem.checked){
1381
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
1382
- }
1383
- $.removeData(elem, 'webshimsinvalidcause');
1384
- }
1385
- } else {
1386
- validityCause = returnValidityCause(validity, elem);
1387
- if($.data(elem, 'webshimsinvalidcause') != validityCause){
1388
- $.data(elem, 'webshimsinvalidcause', validityCause);
1389
- generaltrigger = 'changedvaliditystate';
1390
- }
1391
- if(!shadowElem.hasClass(invalidClass)){
1392
- addClass = invalidClass;
1393
- removeClass = validClass;
1394
- if (checkTypes[elem.type] && !elem.checked) {
1395
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
1396
- }
1397
- trigger = 'changedinvalid';
1398
- }
1399
- }
1400
-
1401
- if(addClass){
1402
- shadowElem.addClass(addClass).removeClass(removeClass);
1403
- //jQuery 1.6.1 IE9 bug (doubble trigger bug)
1404
- setTimeout(function(){
1405
- $(elem).trigger(trigger);
1406
- }, 0);
1407
- }
1408
- if(generaltrigger){
1409
- setTimeout(function(){
1410
- $(elem).trigger(generaltrigger);
1411
- }, 0);
1412
- }
1413
-
1414
- $.removeData(elem, 'webshimsswitchvalidityclass');
1415
- };
1416
1287
 
1417
- if(timer){
1418
- clearTimeout(timer);
1288
+ if(!firstEvent){
1289
+ //trigger firstinvalid
1290
+ firstEvent = $.Event('firstinvalid');
1291
+ firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
1292
+ var firstSystemInvalid = $.Event('firstinvalidsystem');
1293
+ $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
1294
+ jElm.trigger(firstEvent);
1419
1295
  }
1420
- if(e.type == 'refreshvalidityui'){
1421
- switchClass();
1422
- } else {
1423
- $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
1296
+
1297
+ //if firstinvalid was prevented all invalids will be also prevented
1298
+ if( firstEvent && firstEvent.isDefaultPrevented() ){
1299
+ e.preventDefault();
1424
1300
  }
1425
- };
1426
-
1427
- $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
1428
- customEvents.changedvaliditystate = true;
1429
- customEvents.refreshCustomValidityRules = true;
1430
- customEvents.changedvalid = true;
1431
- customEvents.changedinvalid = true;
1432
- customEvents.refreshvalidityui = true;
1433
-
1434
-
1435
- webshims.triggerInlineForm = function(elem, event){
1436
- $(elem).trigger(event);
1437
- };
1438
-
1439
- webshims.modules["form-core"].getGroupElements = getGroupElements;
1440
-
1441
-
1442
- var setRoot = function(){
1443
- webshims.scrollRoot = (isWebkit || document.compatMode == 'BackCompat') ?
1444
- $(document.body) :
1445
- $(document.documentElement)
1446
- ;
1447
- };
1448
- var minWidth = (Modernizr.boxSizing || Modernizr['display-table'] || $.support.getSetAttribute) ?
1449
- 'minWidth' :
1450
- 'width'
1451
- ;
1452
- setRoot();
1453
- webshims.ready('DOM', setRoot);
1454
-
1455
- webshims.getRelOffset = function(posElem, relElem){
1456
- posElem = $(posElem);
1457
- var offset = $(relElem).offset();
1458
- var bodyOffset;
1459
- $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
1460
- bodyOffset = posElem.offset();
1461
- });
1462
- offset.top -= bodyOffset.top;
1463
- offset.left -= bodyOffset.left;
1464
- return offset;
1465
- };
1466
-
1467
- webshims.wsPopover = {
1468
- _create: function(){
1469
- this.options = $.extend({}, webshims.cfg.wspopover, this.options);
1470
- this.id = webshims.wsPopover.id++;
1471
- this.eventns = '.wsoverlay'+this.id;
1472
- this.timers = {};
1473
- 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>');
1474
- this.contentElement = $('.ws-po-box', this.element);
1475
- this.lastElement = $([]);
1476
- this.bindElement();
1477
-
1478
- this.element.data('wspopover', this);
1479
-
1480
- },
1481
- options: {},
1482
- content: function(html){
1483
- this.contentElement.html(html);
1484
- },
1485
- bindElement: function(){
1486
- var that = this;
1487
- var stopBlur = function(){
1488
- that.stopBlur = false;
1489
- };
1490
- this.preventBlur = function(e){
1491
- that.stopBlur = true;
1492
- clearTimeout(that.timers.stopBlur);
1493
- that.timers.stopBlur = setTimeout(stopBlur, 9);
1494
- };
1495
- this.element.on({
1496
- 'mousedown': this.preventBlur
1497
- });
1498
- },
1499
-
1500
- isInElement: function(container, contained){
1501
- return container == contained || $.contains(container, contained);
1502
- },
1503
- show: function(element){
1504
- var e = $.Event('wspopoverbeforeshow');
1505
- this.element.trigger(e);
1506
- if(e.isDefaultPrevented() || this.isVisible){return;}
1507
- this.isVisible = true;
1508
- element = $(element || this.options.prepareFor).getNativeElement() ;
1509
-
1510
- var that = this;
1511
- var visual = $(element).getShadowElement();
1301
+ invalids.push(e.target);
1302
+ e.extraData = 'fix';
1303
+ clearTimeout(stopSubmitTimer);
1304
+ stopSubmitTimer = setTimeout(function(){
1305
+ var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
1306
+ //reset firstinvalid
1307
+ firstEvent = false;
1308
+ invalids = [];
1309
+ $(e.target).trigger(lastEvent, lastEvent);
1310
+ }, 9);
1311
+ jElm = null;
1312
+ });
1313
+ })();
1512
1314
 
1513
- this.clear();
1514
- this.element.removeClass('ws-po-visible').css('display', 'none');
1515
-
1516
- this.prepareFor(element, visual);
1517
-
1518
- this.position(visual);
1519
- that.timers.show = setTimeout(function(){
1520
- that.element.css('display', '');
1521
- that.timers.show = setTimeout(function(){
1522
- that.element.addClass('ws-po-visible').trigger('wspopovershow');
1523
- }, 9);
1524
- }, 9);
1525
- $(document).on('focusin'+this.eventns+' mousedown'+this.eventns, function(e){
1526
- 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)){
1527
- that.hide();
1528
- }
1529
- });
1530
- $(window).on('resize'+this.eventns + ' pospopover'+this.eventns, function(){
1531
- clearTimeout(that.timers.repos);
1532
- that.timers.repos = setTimeout(function(){
1533
- that.position(visual);
1534
- }, 900);
1535
- });
1536
- },
1537
- prepareFor: function(element, visual){
1538
- var onBlur;
1539
- var opts = $.extend({}, this.options, $(element.prop('form') || []).data('wspopover') || {}, element.data('wspopover'));
1540
- var that = this;
1541
- var css = {};
1542
- this.lastElement = $(element).getShadowFocusElement();
1543
- if(opts.appendTo == 'element'){
1544
- this.element.insertAfter(element);
1545
- } else {
1546
- this.element.appendTo(opts.appendTo);
1547
- }
1548
-
1549
- this.element.attr({
1550
- 'data-class': element.prop('className'),
1551
- 'data-id': element.prop('id')
1552
- });
1553
-
1554
- css[minWidth] = opts.constrainWidth ? visual.outerWidth() : '';
1555
-
1556
- this.element.css(css);
1557
-
1558
- if(opts.hideOnBlur){
1559
- onBlur = function(e){
1560
- if(that.stopBlur){
1561
- e.stopImmediatePropagation();
1562
- } else {
1563
- that.hide();
1564
- }
1565
- };
1566
-
1567
- that.timers.bindBlur = setTimeout(function(){
1568
- that.lastElement.off(that.eventns).on('focusout'+that.eventns + ' blur'+that.eventns, onBlur);
1569
- that.lastElement.getNativeElement().off(that.eventns);
1570
- }, 10);
1571
-
1572
-
1573
- }
1574
-
1575
- if(!this.prepared){
1576
-
1577
- if($.fn.bgIframe){
1578
- this.element.bgIframe();
1315
+
1316
+ webshims.getContentValidationMessage = function(elem, validity, key){
1317
+ var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1318
+ if(key && message[key]){
1319
+ message = message[key];
1320
+ }
1321
+ if(typeof message == 'object'){
1322
+ validity = validity || $.prop(elem, 'validity') || {valid: 1};
1323
+ if(!validity.valid){
1324
+ $.each(validity, function(name, prop){
1325
+ if(prop && name != 'valid' && message[name]){
1326
+ message = message[name];
1327
+ return false;
1579
1328
  }
1580
- }
1581
- this.prepared = true;
1582
- },
1583
- clear: function(){
1584
- $(window).off(this.eventns);
1585
- $(document).off(this.eventns);
1586
-
1587
- this.stopBlur = false;
1588
- $.each(this.timers, function(timerName, val){
1589
- clearTimeout(val);
1590
1329
  });
1591
- },
1592
- hide: function(){
1593
- var e = $.Event('wspopoverbeforehide');
1594
- this.element.trigger(e);
1595
- if(e.isDefaultPrevented() || !this.isVisible){return;}
1596
- this.isVisible = false;
1597
- var that = this;
1598
- var forceHide = function(){
1599
- that.element.css('display', 'none').attr({'data-id': '', 'data-class': '', 'hidden': 'hidden'});
1600
- clearTimeout(that.timers.forcehide);
1601
- };
1602
- this.clear();
1603
- this.element.removeClass('ws-po-visible').trigger('wspopoverhide');
1604
- $(window).on('resize'+this.eventns, forceHide);
1605
- that.timers.forcehide = setTimeout(forceHide, 999);
1606
- },
1607
- position: function(element){
1608
- var offset = webshims.getRelOffset(this.element.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0}).removeAttr('hidden'), element);
1609
- offset.top += element.outerHeight();
1610
- this.element.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(offset);
1611
1330
  }
1612
- };
1613
-
1614
- webshims.wsPopover.id = 0;
1615
-
1616
- /* some extra validation UI */
1617
- webshims.validityAlert = (function(){
1618
-
1619
-
1620
- var focusTimer = false;
1621
-
1622
- var api = webshims.objectCreate(webshims.wsPopover, {}, options.messagePopover);
1623
- var boundHide = api.hide.bind(api);
1624
-
1625
- api.element.addClass('validity-alert').attr({role: 'alert'});
1626
- $.extend(api, {
1627
- hideDelay: 5000,
1628
- showFor: function(elem, message, noFocusElem, noBubble){
1629
-
1630
- elem = $(elem).getNativeElement();
1631
- this.clear();
1632
- this.hide();
1633
- if(!noBubble){
1634
- this.getMessage(elem, message);
1635
-
1636
- this.show(elem);
1637
- if(this.hideDelay){
1638
- this.timers.delayedHide = setTimeout(boundHide, this.hideDelay);
1639
- }
1640
-
1641
- }
1642
-
1643
- if(!noFocusElem){
1644
- this.setFocus(elem);
1645
- }
1646
- },
1647
- setFocus: function(element){
1648
- var focusElem = $(element).getShadowFocusElement();
1649
- var scrollTop = webshims.scrollRoot.scrollTop();
1650
- var elemTop = focusElem.offset().top - 30;
1651
- var smooth;
1652
-
1653
- if(scrollTop > elemTop){
1654
- webshims.scrollRoot.animate(
1655
- {scrollTop: elemTop - 5},
1656
- {
1657
- queue: false,
1658
- duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
1659
- }
1660
- );
1661
- smooth = true;
1662
- }
1663
- try {
1664
- focusElem[0].focus();
1665
- } catch(e){}
1666
- if(smooth){
1667
- webshims.scrollRoot.scrollTop(scrollTop);
1668
- setTimeout(function(){
1669
- webshims.scrollRoot.scrollTop(scrollTop);
1670
- }, 0);
1671
- }
1672
-
1673
- $(window).triggerHandler('pospopover'+this.eventns);
1674
- },
1675
- getMessage: function(elem, message){
1676
- if (!message) {
1677
- message = getContentValidationMessage(elem[0]) || elem.prop('customValidationMessage') || elem.prop('validationMessage');
1678
- }
1679
- if (message) {
1680
- api.contentElement.text(message);
1681
- } else {
1682
- this.hide();
1683
- }
1684
- }
1685
- });
1686
-
1687
-
1688
- return api;
1689
- })();
1690
-
1331
+ }
1691
1332
 
1692
- /* extension, but also used to fix native implementation workaround/bugfixes */
1693
- (function(){
1694
- var firstEvent,
1695
- invalids = [],
1696
- stopSubmitTimer,
1697
- form
1698
- ;
1699
-
1700
- $(document).on('invalid', function(e){
1701
- if(e.wrongWebkitInvalid){return;}
1702
- var jElm = $(e.target);
1703
- var shadowElem = jElm.getShadowElement();
1704
- if(!shadowElem.hasClass(invalidClass)){
1705
- shadowElem.addClass(invalidClass).removeClass(validClass);
1706
- setTimeout(function(){
1707
- $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
1708
- }, 0);
1709
- }
1710
-
1711
- if(!firstEvent){
1712
- //trigger firstinvalid
1713
- firstEvent = $.Event('firstinvalid');
1714
- firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
1715
- var firstSystemInvalid = $.Event('firstinvalidsystem');
1716
- $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
1717
- jElm.trigger(firstEvent);
1718
- }
1333
+ if(typeof message == 'object'){
1334
+ message = message.defaultMessage;
1335
+ }
1336
+ return message || '';
1337
+ };
1338
+
1339
+ $.fn.getErrorMessage = function(key){
1340
+ var message = '';
1341
+ var elem = this[0];
1342
+ if(elem){
1343
+ message = webshims.getContentValidationMessage(elem, false, key) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
1344
+ }
1345
+ return message;
1346
+ };
1719
1347
 
1720
- //if firstinvalid was prevented all invalids will be also prevented
1721
- if( firstEvent && firstEvent.isDefaultPrevented() ){
1348
+
1349
+ webshims.ready('forms', function(){
1350
+ $(document).on('focusin.lazyloadvalidation', function(e){
1351
+ if('form' in e.target && $(e.target).is(':invalid')){
1352
+ lazyLoad();
1353
+ }
1354
+ });
1355
+ });
1356
+ webshims.ready('WINDOWLOAD', lazyLoad);
1357
+ if(options.overrideMessages){
1358
+ options.customMessages = true;
1359
+ webshims.reTest('form-message');
1360
+ webshims.error('overrideMessages is deprecated. use customMessages instead.');
1361
+ }
1362
+ if(options.replaceValidationUI){
1363
+ webshims.ready('DOM forms', function(){
1364
+ $(document).on('firstinvalid', function(e){
1365
+ if(!e.isInvalidUIPrevented()){
1722
1366
  e.preventDefault();
1367
+ webshims.validityAlert.showFor( e.target );
1723
1368
  }
1724
- invalids.push(e.target);
1725
- e.extraData = 'fix';
1726
- clearTimeout(stopSubmitTimer);
1727
- stopSubmitTimer = setTimeout(function(){
1728
- var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
1729
- //reset firstinvalid
1730
- firstEvent = false;
1731
- invalids = [];
1732
- $(e.target).trigger(lastEvent, lastEvent);
1733
- }, 9);
1734
- jElm = null;
1735
- shadowElem = null;
1736
- });
1737
- })();
1738
-
1739
- $.fn.getErrorMessage = function(){
1740
- var message = '';
1741
- var elem = this[0];
1742
- if(elem){
1743
- message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
1744
- }
1745
- return message;
1746
- };
1747
-
1748
- if(options.replaceValidationUI){
1749
- if(options.overrideMessages && (options.customMessages || options.customMessages == null)){
1750
- options.customMessages = true;
1751
- options.overrideMessages = false;
1752
- webshims.info("set overrideMessages to false. Use customMessages instead");
1753
- }
1754
- webshims.ready('DOM forms', function(){
1755
- $(document).on('firstinvalid', function(e){
1756
- if(!e.isInvalidUIPrevented()){
1757
- e.preventDefault();
1758
- $.webshims.validityAlert.showFor( e.target );
1759
- }
1760
- });
1761
1369
  });
1762
- }
1763
- });
1370
+ });
1371
+ }
1372
+ });
1373
+
1764
1374
 
1765
- })(jQuery);
1766
- jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
1375
+ webshims.register('form-message', function($, webshims, window, document, undefined, options){
1767
1376
  "use strict";
1377
+ if(options.overrideMessages){
1378
+ options.customMessages = true;
1379
+ webshims.error('overrideMessages is deprecated. use customMessages instead.');
1380
+ }
1768
1381
  var validityMessages = webshims.validityMessages;
1769
1382
 
1770
- var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
1383
+ var implementProperties = options.customMessages ? ['customValidationMessage'] : [];
1771
1384
 
1772
1385
  validityMessages.en = $.extend(true, {
1773
1386
  typeMismatch: {
@@ -1798,17 +1411,17 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
1798
1411
 
1799
1412
  if(typeof validityMessages['en'].valueMissing == 'object'){
1800
1413
  ['select', 'radio'].forEach(function(type){
1801
- validityMessages.en.valueMissing[type] = 'Please select an option.';
1414
+ validityMessages.en.valueMissing[type] = validityMessages.en.valueMissing[type] || 'Please select an option.';
1802
1415
  });
1803
1416
  }
1804
1417
  if(typeof validityMessages.en.rangeUnderflow == 'object'){
1805
1418
  ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
1806
- validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
1419
+ validityMessages.en.rangeUnderflow[type] = validityMessages.en.rangeUnderflow[type] || 'Value must be at or after {%min}.';
1807
1420
  });
1808
1421
  }
1809
1422
  if(typeof validityMessages.en.rangeOverflow == 'object'){
1810
1423
  ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
1811
- validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
1424
+ validityMessages.en.rangeOverflow[type] = validityMessages.en.rangeOverflow[type] || 'Value must be at or before {%max}.';
1812
1425
  });
1813
1426
  }
1814
1427
 
@@ -1844,17 +1457,17 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
1844
1457
 
1845
1458
  if(typeof validityMessages.de.valueMissing == 'object'){
1846
1459
  ['select', 'radio'].forEach(function(type){
1847
- validityMessages.de.valueMissing[type] = 'Bitte wählen Sie eine Option aus.';
1460
+ validityMessages.de.valueMissing[type] = validityMessages.de.valueMissing[type] || 'Bitte wählen Sie eine Option aus.';
1848
1461
  });
1849
1462
  }
1850
1463
  if(typeof validityMessages.de.rangeUnderflow == 'object'){
1851
1464
  ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
1852
- validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
1465
+ validityMessages.de.rangeUnderflow[type] = validityMessages.de.rangeUnderflow[type] || '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
1853
1466
  });
1854
1467
  }
1855
1468
  if(typeof validityMessages.de.rangeOverflow == 'object'){
1856
1469
  ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
1857
- validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
1470
+ validityMessages.de.rangeOverflow[type] = validityMessages.de.rangeOverflow[type] || '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
1858
1471
  });
1859
1472
  }
1860
1473
 
@@ -1872,12 +1485,12 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
1872
1485
  };
1873
1486
 
1874
1487
  webshims.createValidationMessage = function(elem, name){
1875
- var spinner;
1488
+ var widget;
1876
1489
  var message = getMessageFromObj(currentValidationMessage[name], elem);
1877
-
1490
+ var type = $.prop(elem, 'type');
1878
1491
  if(!message){
1879
- message = getMessageFromObj(validityMessages[''][name], elem) || 'invalid value';
1880
- webshims.info('could not find errormessage for: '+ name +' / '+ $.prop(elem, 'type') +'. in language: '+$.webshims.activeLang());
1492
+ message = getMessageFromObj(validityMessages[''][name], elem) || $.prop(elem, 'validationMessage');
1493
+ webshims.info('could not find errormessage for: '+ name +' / '+ type +'. in language: '+$.webshims.activeLang());
1881
1494
  }
1882
1495
  if(message){
1883
1496
  ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
@@ -1887,11 +1500,11 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
1887
1500
  webshims.error('no title for patternMismatch provided. Always add a title attribute.');
1888
1501
  }
1889
1502
  if(valueVals[attr]){
1890
- if(!spinner){
1891
- spinner = $(elem).getShadowElement().data('wsspinner');
1503
+ if(!widget){
1504
+ widget = $(elem).getShadowElement().data('wsWidget'+type);
1892
1505
  }
1893
- if(spinner && spinner.formatValue){
1894
- val = spinner.formatValue(val, false);
1506
+ if(widget && widget.formatValue){
1507
+ val = widget.formatValue(val, false);
1895
1508
  }
1896
1509
  }
1897
1510
  message = message.replace('{%'+ attr +'}', val);
@@ -1906,7 +1519,7 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
1906
1519
  };
1907
1520
 
1908
1521
 
1909
- if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
1522
+ if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){
1910
1523
  implementProperties.push('validationMessage');
1911
1524
  }
1912
1525