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,29 +1,6 @@
1
- //additional tests for partial implementation of forms features
2
- (function($){
1
+ webshims.register('form-core', function($, webshims, window, document, undefined, options){
3
2
  "use strict";
4
- var isWebkit = 'webkitURL' in window;
5
- var Modernizr = window.Modernizr;
6
- var webshims = $.webshims;
7
- var bugs = webshims.bugs;
8
- var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
9
- var testRequiredFind = function(){
10
- if(form[0].querySelector){
11
- try {
12
- bugs.findRequired = !(form[0].querySelector('select:required'));
13
- } catch(er){
14
- bugs.findRequired = false;
15
- }
16
- }
17
- };
18
- var inputElem = $('input', form).eq(0);
19
- var onDomextend = function(fn){
20
- webshims.loader.loadList(['dom-extend']);
21
- webshims.ready('dom-extend', fn);
22
- };
23
-
24
- bugs.findRequired = false;
25
- bugs.validationMessage = false;
26
-
3
+
27
4
  webshims.capturingEventPrevented = function(e){
28
5
  if(!e._isPolyfilled){
29
6
  var isDefaultPrevented = e.isDefaultPrevented;
@@ -42,681 +19,225 @@
42
19
  }
43
20
  };
44
21
 
45
- if(!Modernizr.formvalidation || bugs.bustedValidity){
46
- testRequiredFind();
47
- } else {
22
+ if(Modernizr.formvalidation && !webshims.bugs.bustedValidity){
48
23
  //create delegatable events
49
24
  webshims.capturingEvents(['invalid'], true);
50
-
51
- if(window.opera || window.testGoodWithFix){
52
-
53
- form.appendTo('head');
54
-
55
- testRequiredFind();
56
- bugs.validationMessage = !(inputElem.prop('validationMessage'));
25
+ }
26
+
27
+ var isValid = function(elem){
28
+ return ($.prop(elem, 'validity') || {valid: 1}).valid;
29
+ };
30
+ var lazyLoad = function(){
31
+ var toLoad = ['form-validation'];
32
+ if(options.lazyCustomMessages){
33
+ options.customMessages = true;
34
+ toLoad.push('form-message');
35
+ }
36
+ if(options.addValidators){
37
+ toLoad.push('form-validators');
38
+ }
39
+ webshims.reTest(toLoad);
40
+ $(document).off('.lazyloadvalidation');
41
+ };
42
+ /*
43
+ * Selectors for all browsers
44
+ */
45
+ var hasInvalid = function(elem){
46
+ var ret = false;
47
+ $(elem).jProp('elements').each(function(){
48
+ ret = $(this).is(':invalid');
49
+ if(ret){
50
+ return false;
51
+ }
52
+ });
53
+ return ret;
54
+ };
55
+ var rElementsGroup = /^(?:form)$/i;///^(?:form|fieldset)$/i
56
+ $.extend($.expr[":"], {
57
+ "valid-element": function(elem){
58
+ return rElementsGroup.test(elem.nodeName || '') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
59
+ },
60
+ "invalid-element": function(elem){
61
+ return rElementsGroup.test(elem.nodeName || '') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
62
+ },
63
+ "required-element": function(elem){
64
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
65
+ },
66
+ "user-error": function(elem){
67
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
68
+ },
69
+ "optional-element": function(elem){
70
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
71
+ }
72
+ });
73
+
74
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
75
+ $.expr[":"][name] = $.expr.filters[name+"-element"];
76
+ });
77
+
78
+
79
+ $.expr[":"].focus = function( elem ) {
80
+ try {
81
+ var doc = elem.ownerDocument;
82
+ return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
83
+ } catch(e){}
84
+ return false;
85
+ };
86
+
87
+ webshims.triggerInlineForm = function(elem, event){
88
+ $(elem).trigger(event);
89
+ };
90
+
91
+ var lazyLoadProxy = function(obj, fn, args){
92
+ lazyLoad();
93
+ webshims.ready('form-validation', function(){
94
+ obj[fn].apply(obj, args);
95
+ });
96
+ };
97
+
98
+
99
+ webshims.wsPopover = {
100
+ id: 0,
101
+ _create: function(){
102
+ this.options = $.extend({}, webshims.cfg.wspopover, this.options);
103
+ this.id = webshims.wsPopover.id++;
104
+ this.eventns = '.wsoverlay' + this.id;
105
+ this.timers = {};
106
+ 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>');
107
+ this.contentElement = $('.ws-po-box', this.element);
108
+ this.lastElement = $([]);
109
+ this.bindElement();
57
110
 
58
- webshims.reTest(['form-native-extend', 'form-message']);
111
+ this.element.data('wspopover', this);
59
112
 
60
- form.remove();
61
-
62
- $(function(){
63
- onDomextend(function(){
64
-
65
- //Opera shows native validation bubbles in case of input.checkValidity()
66
- // Opera 11.6/12 hasn't fixed this issue right, it's buggy
67
- var preventDefault = function(e){
68
- e.preventDefault();
69
- };
70
-
71
- ['form', 'input', 'textarea', 'select'].forEach(function(name){
72
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
73
- prop: {
74
- value: function(){
75
- if (!webshims.fromSubmit) {
76
- $(this).on('invalid.checkvalidity', preventDefault);
77
- }
78
-
79
- webshims.fromCheckValidity = true;
80
- var ret = desc.prop._supvalue.apply(this, arguments);
81
- if (!webshims.fromSubmit) {
82
- $(this).unbind('invalid.checkvalidity', preventDefault);
83
- }
84
- webshims.fromCheckValidity = false;
85
- return ret;
86
- }
87
- }
88
- });
89
- });
90
-
91
- });
113
+ },
114
+ options: {},
115
+ content: function(html){
116
+ this.contentElement.html(html);
117
+ },
118
+ bindElement: function(){
119
+ var that = this;
120
+ var stopBlur = function(){
121
+ that.stopBlur = false;
122
+ };
123
+ this.preventBlur = function(e){
124
+ that.stopBlur = true;
125
+ clearTimeout(that.timers.stopBlur);
126
+ that.timers.stopBlur = setTimeout(stopBlur, 9);
127
+ };
128
+ this.element.on({
129
+ 'mousedown': this.preventBlur
92
130
  });
131
+ },
132
+ show: function(){
133
+ lazyLoadProxy(this, 'show', arguments);
93
134
  }
94
-
95
- if(isWebkit && !webshims.bugs.bustedValidity){
96
- (function(){
97
- var elems = /^(?:textarea|input)$/i;
98
- var form = false;
99
-
100
- document.addEventListener('contextmenu', function(e){
101
- if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
102
- setTimeout(function(){
103
- form = false;
104
- }, 1);
105
- }
106
- }, false);
107
-
108
- $(window).on('invalid', function(e){
109
- if(e.originalEvent && form && form == e.target.form){
110
- e.wrongWebkitInvalid = true;
111
- e.stopImmediatePropagation();
112
- }
113
- });
114
-
115
- })();
135
+ };
136
+
137
+ /* some extra validation UI */
138
+ webshims.validityAlert = {
139
+ showFor: function(){
140
+ lazyLoadProxy(this, 'showFor', arguments);
116
141
  }
117
- }
118
-
119
- $.webshims.register('form-core', function($, webshims, window, document, undefined, options){
142
+ };
120
143
 
121
- var checkTypes = {checkbox: 1, radio: 1};
122
- var emptyJ = $([]);
123
- var bugs = webshims.bugs;
124
- var getGroupElements = function(elem){
125
- elem = $(elem);
126
- var name;
127
- var form;
128
- var ret = emptyJ;
129
- if(elem[0].type == 'radio'){
130
- form = elem.prop('form');
131
- name = elem[0].name;
132
- if(!name){
133
- ret = elem;
134
- } else if(form){
135
- ret = $(form[name]);
136
- } else {
137
- ret = $(document.getElementsByName(name)).filter(function(){
138
- return !$.prop(this, 'form');
139
- });
140
- }
141
- ret = ret.filter('[type="radio"]');
142
- }
143
- return ret;
144
- };
144
+
145
+ /* extension, but also used to fix native implementation workaround/bugfixes */
146
+ (function(){
147
+ var firstEvent,
148
+ invalids = [],
149
+ stopSubmitTimer,
150
+ form
151
+ ;
145
152
 
146
- var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
147
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
148
- if(key && message[key]){
149
- message = message[key];
150
- }
151
- if(typeof message == 'object'){
152
- validity = validity || $.prop(elem, 'validity') || {valid: 1};
153
- if(!validity.valid){
154
- $.each(validity, function(name, prop){
155
- if(prop && name != 'valid' && message[name]){
156
- message = message[name];
157
- return false;
158
- }
159
- });
160
- }
161
- }
153
+ $(document).on('invalid', function(e){
154
+ if(e.wrongWebkitInvalid){return;}
155
+ var jElm = $(e.target);
162
156
 
163
- if(typeof message == 'object'){
164
- message = message.defaultMessage;
165
- }
166
- return message || '';
167
- };
168
-
169
- /*
170
- * Selectors for all browsers
171
- */
172
- var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
173
- var hasInvalid = function(elem){
174
- var ret = false;
175
- $($.prop(elem, 'elements')).each(function(){
176
- ret = $(this).is(':invalid');
177
- if(ret){
178
- return false;
179
- }
180
- });
181
- return ret;
182
- };
183
- $.extend($.expr[":"], {
184
- "valid-element": function(elem){
185
- return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
186
- },
187
- "invalid-element": function(elem){
188
- return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
189
- },
190
- "required-element": function(elem){
191
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
192
- },
193
- "user-error": function(elem){
194
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
195
- },
196
- "optional-element": function(elem){
197
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
198
- },
199
- "in-range": function(elem){
200
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
201
- return false;
202
- }
203
- var val = $.prop(elem, 'validity');
204
- return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
205
- },
206
- "out-of-range": function(elem){
207
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
208
- return false;
209
- }
210
- var val = $.prop(elem, 'validity');
211
- return !!(val && (val.rangeOverflow || val.rangeUnderflow));
212
- }
213
157
 
214
- });
215
-
216
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
217
- $.expr[":"][name] = $.expr.filters[name+"-element"];
218
- });
219
-
220
-
221
- $.expr[":"].focus = function( elem ) {
222
- try {
223
- var doc = elem.ownerDocument;
224
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
225
- } catch(e){}
226
- return false;
227
- };
228
-
229
-
230
- var customEvents = $.event.customEvent || {};
231
- var isValid = function(elem){
232
- return ($.prop(elem, 'validity') || {valid: 1}).valid;
233
- };
234
-
235
- if (bugs.bustedValidity || bugs.findRequired) {
236
- (function(){
237
- var find = $.find;
238
- var matchesSelector = $.find.matchesSelector;
239
-
240
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
241
- var regFn = function(sel){
242
- return sel + '-element';
243
- };
244
-
245
- $.find = (function(){
246
- var slice = Array.prototype.slice;
247
- var fn = function(sel){
248
- var ar = arguments;
249
- ar = slice.call(ar, 1, ar.length);
250
- ar.unshift(sel.replace(regExp, regFn));
251
- return find.apply(this, ar);
252
- };
253
- for (var i in find) {
254
- if(find.hasOwnProperty(i)){
255
- fn[i] = find[i];
256
- }
257
- }
258
- return fn;
259
- })();
260
- if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
261
- $.find.matchesSelector = function(node, expr){
262
- expr = expr.replace(regExp, regFn);
263
- return matchesSelector.call(this, node, expr);
264
- };
265
- }
266
-
267
- })();
268
- }
269
-
270
- //ToDo needs testing
271
- var oldAttr = $.prop;
272
- var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
273
- $.prop = function(elem, name, val){
274
- var ret = oldAttr.apply(this, arguments);
275
- if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
276
- if(isValid(elem)){
277
- $(elem).getShadowElement().removeClass(invalidClass);
278
- if(name == 'checked' && val) {
279
- getGroupElements(elem).not(elem).removeClass(invalidClass).removeAttr('aria-invalid');
280
- }
281
- }
158
+ if(!firstEvent){
159
+ //trigger firstinvalid
160
+ firstEvent = $.Event('firstinvalid');
161
+ firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
162
+ var firstSystemInvalid = $.Event('firstinvalidsystem');
163
+ $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
164
+ jElm.trigger(firstEvent);
282
165
  }
283
- return ret;
284
- };
285
-
286
- var returnValidityCause = function(validity, elem){
287
- var ret;
288
- $.each(validity, function(name, value){
289
- if(value){
290
- ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
291
- return false;
292
- }
293
- });
294
- return ret;
295
- };
296
-
297
- var isInGroup = function(name){
298
- var ret;
299
- try {
300
- ret = document.activeElement.name === name;
301
- } catch(e){}
302
- return ret;
303
- };
304
- /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-success instead */
305
- var invalidClass = 'user-error';
306
- var validClass = 'user-success';
307
- var stopChangeTypes = {
308
- time: 1,
309
- date: 1,
310
- month: 1,
311
- datetime: 1,
312
- week: 1,
313
- 'datetime-local': 1
314
- };
315
- var switchValidityClass = function(e){
316
- var elem, timer;
317
- if(!e.target){return;}
318
- elem = $(e.target).getNativeElement()[0];
319
- if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
320
- timer = $.data(elem, 'webshimsswitchvalidityclass');
321
- var switchClass = function(){
322
- if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
323
- var validity = $.prop(elem, 'validity');
324
- var shadowElem = $(elem).getShadowElement();
325
- var addClass, removeClass, trigger, generaltrigger, validityCause;
326
-
327
- if(isWebkit && e.type == 'change' && !bugs.bustedValidity && stopChangeTypes[shadowElem.prop('type')] && shadowElem.is(':focus')){return;}
328
-
329
- $(elem).trigger('refreshCustomValidityRules');
330
-
331
- if(validity.valid){
332
- if(!shadowElem.hasClass(validClass)){
333
- addClass = validClass;
334
- removeClass = invalidClass;
335
- generaltrigger = 'changedvaliditystate';
336
- trigger = 'changedvalid';
337
- if(checkTypes[elem.type] && elem.checked){
338
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
339
- }
340
- $.removeData(elem, 'webshimsinvalidcause');
341
- }
342
- } else {
343
- validityCause = returnValidityCause(validity, elem);
344
- if($.data(elem, 'webshimsinvalidcause') != validityCause){
345
- $.data(elem, 'webshimsinvalidcause', validityCause);
346
- generaltrigger = 'changedvaliditystate';
347
- }
348
- if(!shadowElem.hasClass(invalidClass)){
349
- addClass = invalidClass;
350
- removeClass = validClass;
351
- if (checkTypes[elem.type] && !elem.checked) {
352
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
353
- }
354
- trigger = 'changedinvalid';
355
- }
356
- }
357
-
358
- if(addClass){
359
- shadowElem.addClass(addClass).removeClass(removeClass);
360
- //jQuery 1.6.1 IE9 bug (doubble trigger bug)
361
- setTimeout(function(){
362
- $(elem).trigger(trigger);
363
- }, 0);
364
- }
365
- if(generaltrigger){
366
- setTimeout(function(){
367
- $(elem).trigger(generaltrigger);
368
- }, 0);
369
- }
370
-
371
- $.removeData(elem, 'webshimsswitchvalidityclass');
372
- };
373
-
374
- if(timer){
375
- clearTimeout(timer);
376
- }
377
- if(e.type == 'refreshvalidityui'){
378
- switchClass();
379
- } else {
380
- $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
166
+
167
+ //if firstinvalid was prevented all invalids will be also prevented
168
+ if( firstEvent && firstEvent.isDefaultPrevented() ){
169
+ e.preventDefault();
381
170
  }
382
- };
383
-
384
- $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
385
- customEvents.changedvaliditystate = true;
386
- customEvents.refreshCustomValidityRules = true;
387
- customEvents.changedvalid = true;
388
- customEvents.changedinvalid = true;
389
- customEvents.refreshvalidityui = true;
390
-
391
-
392
- webshims.triggerInlineForm = function(elem, event){
393
- $(elem).trigger(event);
394
- };
395
-
396
- webshims.modules["form-core"].getGroupElements = getGroupElements;
397
-
398
-
399
- var setRoot = function(){
400
- webshims.scrollRoot = (isWebkit || document.compatMode == 'BackCompat') ?
401
- $(document.body) :
402
- $(document.documentElement)
403
- ;
404
- };
405
- var minWidth = (Modernizr.boxSizing || Modernizr['display-table'] || $.support.getSetAttribute) ?
406
- 'minWidth' :
407
- 'width'
408
- ;
409
- setRoot();
410
- webshims.ready('DOM', setRoot);
411
-
412
- webshims.getRelOffset = function(posElem, relElem){
413
- posElem = $(posElem);
414
- var offset = $(relElem).offset();
415
- var bodyOffset;
416
- $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
417
- bodyOffset = posElem.offset();
418
- });
419
- offset.top -= bodyOffset.top;
420
- offset.left -= bodyOffset.left;
421
- return offset;
422
- };
423
-
424
- webshims.wsPopover = {
425
- _create: function(){
426
- this.options = $.extend({}, webshims.cfg.wspopover, this.options);
427
- this.id = webshims.wsPopover.id++;
428
- this.eventns = '.wsoverlay'+this.id;
429
- this.timers = {};
430
- 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>');
431
- this.contentElement = $('.ws-po-box', this.element);
432
- this.lastElement = $([]);
433
- this.bindElement();
434
-
435
- this.element.data('wspopover', this);
436
-
437
- },
438
- options: {},
439
- content: function(html){
440
- this.contentElement.html(html);
441
- },
442
- bindElement: function(){
443
- var that = this;
444
- var stopBlur = function(){
445
- that.stopBlur = false;
446
- };
447
- this.preventBlur = function(e){
448
- that.stopBlur = true;
449
- clearTimeout(that.timers.stopBlur);
450
- that.timers.stopBlur = setTimeout(stopBlur, 9);
451
- };
452
- this.element.on({
453
- 'mousedown': this.preventBlur
454
- });
455
- },
456
-
457
- isInElement: function(container, contained){
458
- return container == contained || $.contains(container, contained);
459
- },
460
- show: function(element){
461
- var e = $.Event('wspopoverbeforeshow');
462
- this.element.trigger(e);
463
- if(e.isDefaultPrevented() || this.isVisible){return;}
464
- this.isVisible = true;
465
- element = $(element || this.options.prepareFor).getNativeElement() ;
466
-
467
- var that = this;
468
- var visual = $(element).getShadowElement();
171
+ invalids.push(e.target);
172
+ e.extraData = 'fix';
173
+ clearTimeout(stopSubmitTimer);
174
+ stopSubmitTimer = setTimeout(function(){
175
+ var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
176
+ //reset firstinvalid
177
+ firstEvent = false;
178
+ invalids = [];
179
+ $(e.target).trigger(lastEvent, lastEvent);
180
+ }, 9);
181
+ jElm = null;
182
+ });
183
+ })();
469
184
 
470
- this.clear();
471
- this.element.removeClass('ws-po-visible').css('display', 'none');
472
-
473
- this.prepareFor(element, visual);
474
-
475
- this.position(visual);
476
- that.timers.show = setTimeout(function(){
477
- that.element.css('display', '');
478
- that.timers.show = setTimeout(function(){
479
- that.element.addClass('ws-po-visible').trigger('wspopovershow');
480
- }, 9);
481
- }, 9);
482
- $(document).on('focusin'+this.eventns+' mousedown'+this.eventns, function(e){
483
- 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)){
484
- that.hide();
485
- }
486
- });
487
- $(window).on('resize'+this.eventns + ' pospopover'+this.eventns, function(){
488
- clearTimeout(that.timers.repos);
489
- that.timers.repos = setTimeout(function(){
490
- that.position(visual);
491
- }, 900);
492
- });
493
- },
494
- prepareFor: function(element, visual){
495
- var onBlur;
496
- var opts = $.extend({}, this.options, $(element.prop('form') || []).data('wspopover') || {}, element.data('wspopover'));
497
- var that = this;
498
- var css = {};
499
- this.lastElement = $(element).getShadowFocusElement();
500
- if(opts.appendTo == 'element'){
501
- this.element.insertAfter(element);
502
- } else {
503
- this.element.appendTo(opts.appendTo);
504
- }
505
-
506
- this.element.attr({
507
- 'data-class': element.prop('className'),
508
- 'data-id': element.prop('id')
509
- });
510
-
511
- css[minWidth] = opts.constrainWidth ? visual.outerWidth() : '';
512
-
513
- this.element.css(css);
514
-
515
- if(opts.hideOnBlur){
516
- onBlur = function(e){
517
- if(that.stopBlur){
518
- e.stopImmediatePropagation();
519
- } else {
520
- that.hide();
521
- }
522
- };
523
-
524
- that.timers.bindBlur = setTimeout(function(){
525
- that.lastElement.off(that.eventns).on('focusout'+that.eventns + ' blur'+that.eventns, onBlur);
526
- that.lastElement.getNativeElement().off(that.eventns);
527
- }, 10);
528
-
529
-
530
- }
531
-
532
- if(!this.prepared){
533
-
534
- if($.fn.bgIframe){
535
- this.element.bgIframe();
185
+
186
+ webshims.getContentValidationMessage = function(elem, validity, key){
187
+ var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
188
+ if(key && message[key]){
189
+ message = message[key];
190
+ }
191
+ if(typeof message == 'object'){
192
+ validity = validity || $.prop(elem, 'validity') || {valid: 1};
193
+ if(!validity.valid){
194
+ $.each(validity, function(name, prop){
195
+ if(prop && name != 'valid' && message[name]){
196
+ message = message[name];
197
+ return false;
536
198
  }
537
- }
538
- this.prepared = true;
539
- },
540
- clear: function(){
541
- $(window).off(this.eventns);
542
- $(document).off(this.eventns);
543
-
544
- this.stopBlur = false;
545
- $.each(this.timers, function(timerName, val){
546
- clearTimeout(val);
547
199
  });
548
- },
549
- hide: function(){
550
- var e = $.Event('wspopoverbeforehide');
551
- this.element.trigger(e);
552
- if(e.isDefaultPrevented() || !this.isVisible){return;}
553
- this.isVisible = false;
554
- var that = this;
555
- var forceHide = function(){
556
- that.element.css('display', 'none').attr({'data-id': '', 'data-class': '', 'hidden': 'hidden'});
557
- clearTimeout(that.timers.forcehide);
558
- };
559
- this.clear();
560
- this.element.removeClass('ws-po-visible').trigger('wspopoverhide');
561
- $(window).on('resize'+this.eventns, forceHide);
562
- that.timers.forcehide = setTimeout(forceHide, 999);
563
- },
564
- position: function(element){
565
- var offset = webshims.getRelOffset(this.element.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0}).removeAttr('hidden'), element);
566
- offset.top += element.outerHeight();
567
- this.element.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(offset);
568
200
  }
569
- };
570
-
571
- webshims.wsPopover.id = 0;
572
-
573
- /* some extra validation UI */
574
- webshims.validityAlert = (function(){
575
-
576
-
577
- var focusTimer = false;
578
-
579
- var api = webshims.objectCreate(webshims.wsPopover, {}, options.messagePopover);
580
- var boundHide = api.hide.bind(api);
581
-
582
- api.element.addClass('validity-alert').attr({role: 'alert'});
583
- $.extend(api, {
584
- hideDelay: 5000,
585
- showFor: function(elem, message, noFocusElem, noBubble){
586
-
587
- elem = $(elem).getNativeElement();
588
- this.clear();
589
- this.hide();
590
- if(!noBubble){
591
- this.getMessage(elem, message);
592
-
593
- this.show(elem);
594
- if(this.hideDelay){
595
- this.timers.delayedHide = setTimeout(boundHide, this.hideDelay);
596
- }
597
-
598
- }
599
-
600
- if(!noFocusElem){
601
- this.setFocus(elem);
602
- }
603
- },
604
- setFocus: function(element){
605
- var focusElem = $(element).getShadowFocusElement();
606
- var scrollTop = webshims.scrollRoot.scrollTop();
607
- var elemTop = focusElem.offset().top - 30;
608
- var smooth;
609
-
610
- if(scrollTop > elemTop){
611
- webshims.scrollRoot.animate(
612
- {scrollTop: elemTop - 5},
613
- {
614
- queue: false,
615
- duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
616
- }
617
- );
618
- smooth = true;
619
- }
620
- try {
621
- focusElem[0].focus();
622
- } catch(e){}
623
- if(smooth){
624
- webshims.scrollRoot.scrollTop(scrollTop);
625
- setTimeout(function(){
626
- webshims.scrollRoot.scrollTop(scrollTop);
627
- }, 0);
628
- }
629
-
630
- $(window).triggerHandler('pospopover'+this.eventns);
631
- },
632
- getMessage: function(elem, message){
633
- if (!message) {
634
- message = getContentValidationMessage(elem[0]) || elem.prop('customValidationMessage') || elem.prop('validationMessage');
635
- }
636
- if (message) {
637
- api.contentElement.text(message);
638
- } else {
639
- this.hide();
640
- }
641
- }
642
- });
643
-
644
-
645
- return api;
646
- })();
647
-
201
+ }
648
202
 
649
- /* extension, but also used to fix native implementation workaround/bugfixes */
650
- (function(){
651
- var firstEvent,
652
- invalids = [],
653
- stopSubmitTimer,
654
- form
655
- ;
656
-
657
- $(document).on('invalid', function(e){
658
- if(e.wrongWebkitInvalid){return;}
659
- var jElm = $(e.target);
660
- var shadowElem = jElm.getShadowElement();
661
- if(!shadowElem.hasClass(invalidClass)){
662
- shadowElem.addClass(invalidClass).removeClass(validClass);
663
- setTimeout(function(){
664
- $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
665
- }, 0);
666
- }
667
-
668
- if(!firstEvent){
669
- //trigger firstinvalid
670
- firstEvent = $.Event('firstinvalid');
671
- firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
672
- var firstSystemInvalid = $.Event('firstinvalidsystem');
673
- $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
674
- jElm.trigger(firstEvent);
675
- }
203
+ if(typeof message == 'object'){
204
+ message = message.defaultMessage;
205
+ }
206
+ return message || '';
207
+ };
676
208
 
677
- //if firstinvalid was prevented all invalids will be also prevented
678
- if( firstEvent && firstEvent.isDefaultPrevented() ){
209
+ $.fn.getErrorMessage = function(key){
210
+ var message = '';
211
+ var elem = this[0];
212
+ if(elem){
213
+ message = webshims.getContentValidationMessage(elem, false, key) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
214
+ }
215
+ return message;
216
+ };
217
+
218
+
219
+ webshims.ready('forms', function(){
220
+ $(document).on('focusin.lazyloadvalidation', function(e){
221
+ if('form' in e.target && $(e.target).is(':invalid')){
222
+ lazyLoad();
223
+ }
224
+ });
225
+ });
226
+ webshims.ready('WINDOWLOAD', lazyLoad);
227
+ if(options.overrideMessages){
228
+ options.customMessages = true;
229
+ webshims.reTest('form-message');
230
+ webshims.error('overrideMessages is deprecated. use customMessages instead.');
231
+ }
232
+ if(options.replaceValidationUI){
233
+ webshims.ready('DOM forms', function(){
234
+ $(document).on('firstinvalid', function(e){
235
+ if(!e.isInvalidUIPrevented()){
679
236
  e.preventDefault();
237
+ webshims.validityAlert.showFor( e.target );
680
238
  }
681
- invalids.push(e.target);
682
- e.extraData = 'fix';
683
- clearTimeout(stopSubmitTimer);
684
- stopSubmitTimer = setTimeout(function(){
685
- var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
686
- //reset firstinvalid
687
- firstEvent = false;
688
- invalids = [];
689
- $(e.target).trigger(lastEvent, lastEvent);
690
- }, 9);
691
- jElm = null;
692
- shadowElem = null;
693
- });
694
- })();
695
-
696
- $.fn.getErrorMessage = function(){
697
- var message = '';
698
- var elem = this[0];
699
- if(elem){
700
- message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
701
- }
702
- return message;
703
- };
704
-
705
- if(options.replaceValidationUI){
706
- if(options.overrideMessages && (options.customMessages || options.customMessages == null)){
707
- options.customMessages = true;
708
- options.overrideMessages = false;
709
- webshims.info("set overrideMessages to false. Use customMessages instead");
710
- }
711
- webshims.ready('DOM forms', function(){
712
- $(document).on('firstinvalid', function(e){
713
- if(!e.isInvalidUIPrevented()){
714
- e.preventDefault();
715
- $.webshims.validityAlert.showFor( e.target );
716
- }
717
- });
718
239
  });
719
- }
720
- });
240
+ });
241
+ }
242
+ });
721
243
 
722
- })(jQuery);