webshims-rails 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +253 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -10
  6. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +1 -20
  7. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +1 -2
  8. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +1 -30
  9. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +1 -42
  10. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +1 -28
  11. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -0
  13. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -0
  14. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +1 -42
  15. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  16. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +1 -31
  18. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -0
  19. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -0
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +1 -38
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +1 -80
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +1 -45
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +1 -44
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +1 -28
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +1 -19
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +1 -10
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +1 -58
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +1 -66
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +1 -62
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +1 -64
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +1 -73
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -42
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +1 -54
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -57
  35. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +1 -70
  36. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +1 -80
  37. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +1 -60
  38. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +1 -79
  39. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +1 -101
  40. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +1 -95
  41. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +1 -27
  42. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +1 -34
  43. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +1 -56
  44. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +1 -33
  45. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +1 -40
  46. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +1 -39
  47. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +1 -65
  48. data/vendor/assets/javascripts/webshims/minified/shims/details.js +1 -5
  49. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +1 -23
  50. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +1 -15
  51. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +1 -21
  52. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +1 -19
  53. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +1 -22
  54. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +1 -8
  55. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +1 -7
  56. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +1 -10
  57. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +1 -23
  58. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +1 -46
  59. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +1 -5
  60. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +1 -7
  61. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +1 -3
  62. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  63. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +1 -7
  64. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  65. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +1 -3
  66. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +1 -3
  67. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +1 -6
  68. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +1 -6
  69. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +1 -3
  70. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +1 -3
  71. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +1 -4
  72. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +1 -3
  73. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +1 -3
  74. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +1 -8
  75. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +1 -3
  76. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +1 -14
  77. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -0
  78. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  79. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +1 -16
  81. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +1 -23
  82. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -3
  83. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -26
  84. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +1 -14
  85. data/vendor/assets/javascripts/webshims/minified/shims/range-ui.js +1 -0
  86. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +1 -689
  90. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  93. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +1 -9
  94. data/vendor/assets/javascripts/webshims/minified/shims/track.js +1 -21
  95. data/vendor/assets/javascripts/webshims/polyfiller.js +1188 -1191
  96. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvas/README +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  98. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  99. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  100. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  101. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  102. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvasPro/README +82 -82
  103. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  104. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  109. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1752 -1754
  110. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3311 -3247
  111. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1631 -1633
  112. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1697 -1636
  113. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1098 -1100
  114. data/vendor/assets/javascripts/webshims/shims/combos/14.js +477 -476
  115. data/vendor/assets/javascripts/webshims/shims/combos/15.js +317 -316
  116. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2155 -2095
  117. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2320 -2259
  118. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1326 -1322
  119. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2238 -2239
  120. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2341 -2339
  121. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1558 -1493
  122. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1734 -1733
  123. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2361 -2295
  124. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2332 -2269
  125. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2836 -2775
  126. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1549 -1489
  127. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2156 -2095
  128. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3313 -3248
  129. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3022 -3020
  130. data/vendor/assets/javascripts/webshims/shims/combos/4.js +771 -770
  131. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1027 -1025
  132. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1709 -1706
  133. data/vendor/assets/javascripts/webshims/shims/combos/6.js +387 -386
  134. data/vendor/assets/javascripts/webshims/shims/combos/7.js +643 -641
  135. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1547 -1488
  136. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2508 -2445
  137. data/vendor/assets/javascripts/webshims/shims/details.js +148 -148
  138. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +949 -952
  139. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  140. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  141. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -606
  142. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -681
  143. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -164
  144. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  145. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  146. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2 -2
  147. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1568 -1569
  148. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  149. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  150. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  151. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  152. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  153. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  154. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  155. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  156. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  157. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  158. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  159. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  160. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  161. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  162. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  163. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  164. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  165. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  168. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -0
  169. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +597 -536
  170. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +891 -860
  171. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  172. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +960 -957
  173. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  174. data/vendor/assets/javascripts/webshims/shims/range-ui.js +66 -0
  175. data/vendor/assets/javascripts/webshims/shims/styles/details-arrows.png +0 -0
  176. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  177. data/vendor/assets/javascripts/webshims/shims/styles/polyfill-loader.gif +0 -0
  178. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +697 -689
  179. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  180. data/vendor/assets/javascripts/webshims/shims/swf/jwwebshims.swf +0 -0
  181. data/vendor/assets/javascripts/webshims/shims/swf/localStorage.swf +0 -0
  182. data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
  183. data/vendor/assets/javascripts/webshims/shims/track.js +0 -0
  184. metadata +6 -4
@@ -1,771 +1,772 @@
1
- //additional tests for partial implementation of forms features
2
- (function($){
3
- "use strict";
4
- var Modernizr = window.Modernizr;
5
- var webshims = $.webshims;
6
- var bugs = webshims.bugs;
7
- var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
8
- var testRequiredFind = function(){
9
- if(form[0].querySelector){
10
- try {
11
- bugs.findRequired = !(form[0].querySelector('select:required'));
12
- } catch(er){
13
- bugs.findRequired = false;
14
- }
15
- }
16
- };
17
- var inputElem = $('input', form).eq(0);
18
- var onDomextend = function(fn){
19
- webshims.loader.loadList(['dom-extend']);
20
- webshims.ready('dom-extend', fn);
21
- };
22
-
23
- bugs.findRequired = false;
24
- bugs.validationMessage = false;
25
-
26
- webshims.capturingEventPrevented = function(e){
27
- if(!e._isPolyfilled){
28
- var isDefaultPrevented = e.isDefaultPrevented;
29
- var preventDefault = e.preventDefault;
30
- e.preventDefault = function(){
31
- clearTimeout($.data(e.target, e.type + 'DefaultPrevented'));
32
- $.data(e.target, e.type + 'DefaultPrevented', setTimeout(function(){
33
- $.removeData(e.target, e.type + 'DefaultPrevented');
34
- }, 30));
35
- return preventDefault.apply(this, arguments);
36
- };
37
- e.isDefaultPrevented = function(){
38
- return !!(isDefaultPrevented.apply(this, arguments) || $.data(e.target, e.type + 'DefaultPrevented') || false);
39
- };
40
- e._isPolyfilled = true;
41
- }
42
- };
43
-
44
- if(!Modernizr.formvalidation || bugs.bustedValidity){
45
- testRequiredFind();
46
- return;
47
- }
48
-
49
- //create delegatable events
50
- webshims.capturingEvents(['input']);
51
- webshims.capturingEvents(['invalid'], true);
52
-
53
- if(window.opera || window.testGoodWithFix){
54
-
55
- form.appendTo('head');
56
-
57
- testRequiredFind();
58
- bugs.validationMessage = !(inputElem.prop('validationMessage'));
59
-
60
- webshims.reTest(['form-extend', 'form-message']);
61
-
62
- form.remove();
63
-
64
- $(function(){
65
- onDomextend(function(){
66
-
67
- //Opera shows native validation bubbles in case of input.checkValidity()
68
- // Opera 11.6/12 hasn't fixed this issue right, it's buggy
69
- var preventDefault = function(e){
70
- e.preventDefault();
71
- };
72
-
73
- ['form', 'input', 'textarea', 'select'].forEach(function(name){
74
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
75
- prop: {
76
- value: function(){
77
- if (!webshims.fromSubmit) {
78
- $(this).on('invalid.checkvalidity', preventDefault);
79
- }
80
-
81
- webshims.fromCheckValidity = true;
82
- var ret = desc.prop._supvalue.apply(this, arguments);
83
- if (!webshims.fromSubmit) {
84
- $(this).unbind('invalid.checkvalidity', preventDefault);
85
- }
86
- webshims.fromCheckValidity = false;
87
- return ret;
88
- }
89
- }
90
- });
91
- });
92
-
93
- });
94
- });
95
- }
96
-
97
- if($.browser.webkit && !webshims.bugs.bustedValidity){
98
- (function(){
99
- var elems = /^(?:textarea|input)$/i;
100
- var form = false;
101
-
102
- document.addEventListener('contextmenu', function(e){
103
- if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
104
- setTimeout(function(){
105
- form = false;
106
- }, 1);
107
- }
108
- }, false);
109
-
110
- $(window).on('invalid', function(e){
111
- if(e.originalEvent && form && form == e.target.form){
112
- e.wrongWebkitInvalid = true;
113
- e.stopImmediatePropagation();
114
- }
115
- });
116
- })();
117
- }
118
- })(jQuery);
119
-
120
- jQuery.webshims.register('form-core', function($, webshims, window, document, undefined, options){
121
- "use strict";
122
-
123
- var groupTypes = {radio: 1};
124
- var checkTypes = {checkbox: 1, radio: 1};
125
- var emptyJ = $([]);
126
- var bugs = webshims.bugs;
127
- var getGroupElements = function(elem){
128
- elem = $(elem);
129
- var name;
130
- var form;
131
- var ret = emptyJ;
132
- if(groupTypes[elem[0].type]){
133
- form = elem.prop('form');
134
- name = elem[0].name;
135
- if(!name){
136
- ret = elem;
137
- } else if(form){
138
- ret = $(form[name]);
139
- } else {
140
- ret = $(document.getElementsByName(name)).filter(function(){
141
- return !$.prop(this, 'form');
142
- });
143
- }
144
- ret = ret.filter('[type="radio"]');
145
- }
146
- return ret;
147
- };
148
-
149
- var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
150
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
151
- if(key && message[key]){
152
- message = message[key];
153
- }
154
- if(typeof message == 'object'){
155
- validity = validity || $.prop(elem, 'validity') || {valid: 1};
156
- if(!validity.valid){
157
- $.each(validity, function(name, prop){
158
- if(prop && name != 'valid' && message[name]){
159
- message = message[name];
160
- return false;
161
- }
162
- });
163
- }
164
- }
165
-
166
- if(typeof message == 'object'){
167
- message = message.defaultMessage;
168
- }
169
- return message || '';
170
- };
171
-
172
- /*
173
- * Selectors for all browsers
174
- */
175
- var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
176
- var hasInvalid = function(elem){
177
- var ret = false;
178
- $($.prop(elem, 'elements')).each(function(){
179
- ret = $(this).is(':invalid');
180
- if(ret){
181
- return false;
182
- }
183
- });
184
- return ret;
185
- };
186
- $.extend($.expr[":"], {
187
- "valid-element": function(elem){
188
- return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
189
- },
190
- "invalid-element": function(elem){
191
- return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
192
- },
193
- "required-element": function(elem){
194
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
195
- },
196
- "user-error": function(elem){
197
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
198
- },
199
- "optional-element": function(elem){
200
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
201
- },
202
- "in-range": function(elem){
203
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
204
- return false;
205
- }
206
- var val = $.prop(elem, 'validity');
207
- return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
208
- },
209
- "out-of-range": function(elem){
210
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
211
- return false;
212
- }
213
- var val = $.prop(elem, 'validity');
214
- return !!(val && (val.rangeOverflow || val.rangeUnderflow));
215
- }
216
-
217
- });
218
-
219
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
220
- $.expr[":"][name] = $.expr.filters[name+"-element"];
221
- });
222
-
223
-
224
- $.expr[":"].focus = function( elem ) {
225
- try {
226
- var doc = elem.ownerDocument;
227
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
228
- } catch(e){}
229
- return false;
230
- };
231
-
232
- var customEvents = $.event.customEvent || {};
233
- var isValid = function(elem){
234
- return ($.prop(elem, 'validity') || {valid: 1}).valid;
235
- };
236
-
237
- if (bugs.bustedValidity || bugs.findRequired) {
238
- (function(){
239
- var find = $.find;
240
- var matchesSelector = $.find.matchesSelector;
241
-
242
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
243
- var regFn = function(sel){
244
- return sel + '-element';
245
- };
246
-
247
- $.find = (function(){
248
- var slice = Array.prototype.slice;
249
- var fn = function(sel){
250
- var ar = arguments;
251
- ar = slice.call(ar, 1, ar.length);
252
- ar.unshift(sel.replace(regExp, regFn));
253
- return find.apply(this, ar);
254
- };
255
- for (var i in find) {
256
- if(find.hasOwnProperty(i)){
257
- fn[i] = find[i];
258
- }
259
- }
260
- return fn;
261
- })();
262
- if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
263
- $.find.matchesSelector = function(node, expr){
264
- expr = expr.replace(regExp, regFn);
265
- return matchesSelector.call(this, node, expr);
266
- };
267
- }
268
-
269
- })();
270
- }
271
-
272
- //ToDo needs testing
273
- var oldAttr = $.prop;
274
- var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
275
- $.prop = function(elem, name, val){
276
- var ret = oldAttr.apply(this, arguments);
277
- if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
278
- if(isValid(elem)){
279
- $(elem).getShadowElement().removeClass(invalidClasses);
280
- if(name == 'checked' && val) {
281
- getGroupElements(elem).not(elem).removeClass(invalidClasses).removeAttr('aria-invalid');
282
- }
283
- }
284
- }
285
- return ret;
286
- };
287
-
288
- var returnValidityCause = function(validity, elem){
289
- var ret;
290
- $.each(validity, function(name, value){
291
- if(value){
292
- ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
293
- return false;
294
- }
295
- });
296
- return ret;
297
- };
298
-
299
- var isInGroup = function(name){
300
- var ret;
301
- try {
302
- ret = document.activeElement.name === name;
303
- } catch(e){}
304
- return ret;
305
- };
306
- /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-succes instead */
307
- var invalidClass = 'user-error';
308
- var invalidClasses = 'user-error form-ui-invalid';
309
- var validClass = 'user-success';
310
- var validClasses = 'user-success form-ui-valid';
311
- var switchValidityClass = function(e){
312
- var elem, timer;
313
- if(!e.target){return;}
314
- elem = $(e.target).getNativeElement()[0];
315
- if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
316
- timer = $.data(elem, 'webshimsswitchvalidityclass');
317
- var switchClass = function(){
318
- if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
319
- var validity = $.prop(elem, 'validity');
320
- var shadowElem = $(elem).getShadowElement();
321
- var addClass, removeClass, trigger, generaltrigger, validityCause;
322
-
323
- $(elem).trigger('refreshCustomValidityRules');
324
- if(validity.valid){
325
- if(!shadowElem.hasClass(validClass)){
326
- addClass = validClasses;
327
- removeClass = invalidClasses;
328
- generaltrigger = 'changedvaliditystate';
329
- trigger = 'changedvalid';
330
- if(checkTypes[elem.type] && elem.checked){
331
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
332
- }
333
- $.removeData(elem, 'webshimsinvalidcause');
334
- }
335
- } else {
336
- validityCause = returnValidityCause(validity, elem);
337
- if($.data(elem, 'webshimsinvalidcause') != validityCause){
338
- $.data(elem, 'webshimsinvalidcause', validityCause);
339
- generaltrigger = 'changedvaliditystate';
340
- }
341
- if(!shadowElem.hasClass(invalidClass)){
342
- addClass = invalidClasses;
343
- removeClass = validClasses;
344
- if (checkTypes[elem.type] && !elem.checked) {
345
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
346
- }
347
- trigger = 'changedinvalid';
348
- }
349
- }
350
- if(addClass){
351
- shadowElem.addClass(addClass).removeClass(removeClass);
352
- //jQuery 1.6.1 IE9 bug (doubble trigger bug)
353
- setTimeout(function(){
354
- $(elem).trigger(trigger);
355
- }, 0);
356
- }
357
- if(generaltrigger){
358
- setTimeout(function(){
359
- $(elem).trigger(generaltrigger);
360
- }, 0);
361
- }
362
- $.removeData(e.target, 'webshimsswitchvalidityclass');
363
- };
364
-
365
- if(timer){
366
- clearTimeout(timer);
367
- }
368
- if(e.type == 'refreshvalidityui'){
369
- switchClass();
370
- } else {
371
- $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
372
- }
373
- };
374
-
375
- $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
376
- customEvents.changedvaliditystate = true;
377
- customEvents.refreshCustomValidityRules = true;
378
- customEvents.changedvalid = true;
379
- customEvents.changedinvalid = true;
380
- customEvents.refreshvalidityui = true;
381
-
382
-
383
- webshims.triggerInlineForm = function(elem, event){
384
- $(elem).trigger(event);
385
- };
386
-
387
- webshims.modules["form-core"].getGroupElements = getGroupElements;
388
-
389
-
390
- var setRoot = function(){
391
- webshims.scrollRoot = ($.browser.webkit || document.compatMode == 'BackCompat') ?
392
- $(document.body) :
393
- $(document.documentElement)
394
- ;
395
- };
396
- setRoot();
397
- webshims.ready('DOM', setRoot);
398
-
399
- webshims.getRelOffset = function(posElem, relElem){
400
- posElem = $(posElem);
401
- var offset = $(relElem).offset();
402
- var bodyOffset;
403
- $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
404
- bodyOffset = posElem.offset();
405
- });
406
- offset.top -= bodyOffset.top;
407
- offset.left -= bodyOffset.left;
408
- return offset;
409
- };
410
-
411
- /* some extra validation UI */
412
- webshims.validityAlert = (function(){
413
- var alertElem = (!$.browser.msie || parseInt($.browser.version, 10) > 7) ? 'span' : 'label';
414
- var errorBubble;
415
- var hideTimer = false;
416
- var focusTimer = false;
417
- var resizeTimer = false;
418
- var boundHide;
419
-
420
- var api = {
421
- hideDelay: 5000,
422
-
423
- showFor: function(elem, message, noFocusElem, noBubble){
424
- api._create();
425
- elem = $(elem);
426
- var visual = $(elem).getShadowElement();
427
- var offset = api.getOffsetFromBody(visual);
428
- api.clear();
429
- if(noBubble){
430
- this.hide();
431
- } else {
432
- this.getMessage(elem, message);
433
- this.position(visual, offset);
434
-
435
- this.show();
436
- if(this.hideDelay){
437
- hideTimer = setTimeout(boundHide, this.hideDelay);
438
- }
439
- $(window)
440
- .on('resize.validityalert', function(){
441
- clearTimeout(resizeTimer);
442
- resizeTimer = setTimeout(function(){
443
- api.position(visual);
444
- }, 9);
445
- })
446
- ;
447
- }
448
-
449
- if(!noFocusElem){
450
- this.setFocus(visual, offset);
451
- }
452
- },
453
- getOffsetFromBody: function(elem){
454
- return webshims.getRelOffset(errorBubble, elem);
455
- },
456
- setFocus: function(visual, offset){
457
- var focusElem = $(visual).getShadowFocusElement();
458
- var scrollTop = webshims.scrollRoot.scrollTop();
459
- var elemTop = ((offset || focusElem.offset()).top) - 30;
460
- var smooth;
461
-
462
- if(webshims.getID && alertElem == 'label'){
463
- errorBubble.attr('for', webshims.getID(focusElem));
464
- }
465
-
466
- if(scrollTop > elemTop){
467
- webshims.scrollRoot.animate(
468
- {scrollTop: elemTop - 5},
469
- {
470
- queue: false,
471
- duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
472
- }
473
- );
474
- smooth = true;
475
- }
476
- try {
477
- focusElem[0].focus();
478
- } catch(e){}
479
- if(smooth){
480
- webshims.scrollRoot.scrollTop(scrollTop);
481
- setTimeout(function(){
482
- webshims.scrollRoot.scrollTop(scrollTop);
483
- }, 0);
484
- }
485
- setTimeout(function(){
486
- $(document).on('focusout.validityalert', boundHide);
487
- }, 10);
488
- },
489
- getMessage: function(elem, message){
490
- if (!message) {
491
- message = getContentValidationMessage(elem[0]) || elem.prop('validationMessage');
492
- }
493
- if (message) {
494
- $('span.va-box', errorBubble).text(message);
495
- }
496
- else {
497
- this.hide();
498
- }
499
- },
500
- position: function(elem, offset){
501
- offset = offset ? $.extend({}, offset) : api.getOffsetFromBody(elem);
502
- offset.top += elem.outerHeight();
503
- errorBubble.css(offset);
504
- },
505
- show: function(){
506
- if(errorBubble.css('display') === 'none'){
507
- errorBubble.css({opacity: 0}).show();
508
- }
509
- errorBubble.addClass('va-visible').fadeTo(400, 1);
510
- },
511
- hide: function(){
512
- errorBubble.removeClass('va-visible').fadeOut();
513
- },
514
- clear: function(){
515
- clearTimeout(focusTimer);
516
- clearTimeout(hideTimer);
517
- $(document).unbind('.validityalert');
518
- $(window).unbind('.validityalert');
519
- errorBubble.stop().removeAttr('for');
520
- },
521
- _create: function(){
522
- if(errorBubble){return;}
523
- errorBubble = api.errorBubble = $('<'+alertElem+' class="validity-alert-wrapper" role="alert"><span class="validity-alert"><span class="va-arrow"><span class="va-arrow-box"></span></span><span class="va-box"></span></span></'+alertElem+'>').css({position: 'absolute', display: 'none'});
524
- webshims.ready('DOM', function(){
525
- errorBubble.appendTo('body');
526
- if($.fn.bgIframe && $.browser.msie && parseInt($.browser.version, 10) < 7){
527
- errorBubble.bgIframe();
528
- }
529
- });
530
- }
531
- };
532
-
533
-
534
- boundHide = $.proxy(api, 'hide');
535
-
536
- return api;
537
- })();
538
-
539
-
540
- /* extension, but also used to fix native implementation workaround/bugfixes */
541
- (function(){
542
- var firstEvent,
543
- invalids = [],
544
- stopSubmitTimer,
545
- form
546
- ;
547
-
548
- $(document).on('invalid', function(e){
549
- if(e.wrongWebkitInvalid){return;}
550
- var jElm = $(e.target);
551
- var shadowElem = jElm.getShadowElement();
552
- if(!shadowElem.hasClass(invalidClass)){
553
- shadowElem.addClass(invalidClasses).removeClass(validClasses);
554
- setTimeout(function(){
555
- $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
556
- }, 0);
557
- }
558
-
559
- if(!firstEvent){
560
- //trigger firstinvalid
561
- firstEvent = $.Event('firstinvalid');
562
- firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
563
- var firstSystemInvalid = $.Event('firstinvalidsystem');
564
- $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
565
- jElm.trigger(firstEvent);
566
- }
567
-
568
- //if firstinvalid was prevented all invalids will be also prevented
569
- if( firstEvent && firstEvent.isDefaultPrevented() ){
570
- e.preventDefault();
571
- }
572
- invalids.push(e.target);
573
- e.extraData = 'fix';
574
- clearTimeout(stopSubmitTimer);
575
- stopSubmitTimer = setTimeout(function(){
576
- var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
577
- //reset firstinvalid
578
- firstEvent = false;
579
- invalids = [];
580
- $(e.target).trigger(lastEvent, lastEvent);
581
- }, 9);
582
- jElm = null;
583
- shadowElem = null;
584
- });
585
- })();
586
-
587
- $.fn.getErrorMessage = function(){
588
- var message = '';
589
- var elem = this[0];
590
- if(elem){
591
- message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
592
- }
593
- return message;
594
- };
595
-
596
- if(options.replaceValidationUI){
597
- webshims.ready('DOM forms', function(){
598
- $(document).on('firstinvalid', function(e){
599
- if(!e.isInvalidUIPrevented()){
600
- e.preventDefault();
601
- $.webshims.validityAlert.showFor( e.target, $(e.target).prop('customValidationMessage') );
602
- }
603
- });
604
- });
605
- }
606
-
607
- });jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
608
- "use strict";
609
- var validityMessages = webshims.validityMessages;
610
-
611
- var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
612
-
613
- validityMessages['en'] = $.extend(true, {
614
- typeMismatch: {
615
- email: 'Please enter an email address.',
616
- url: 'Please enter a URL.',
617
- number: 'Please enter a number.',
618
- date: 'Please enter a date.',
619
- time: 'Please enter a time.',
620
- range: 'Invalid input.',
621
- "datetime-local": 'Please enter a datetime.'
622
- },
623
- rangeUnderflow: {
624
- defaultMessage: 'Value must be greater than or equal to {%min}.'
625
- },
626
- rangeOverflow: {
627
- defaultMessage: 'Value must be less than or equal to {%max}.'
628
- },
629
- stepMismatch: 'Invalid input.',
630
- tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
631
-
632
- patternMismatch: 'Invalid input. {%title}',
633
- valueMissing: {
634
- defaultMessage: 'Please fill out this field.',
635
- checkbox: 'Please check this box if you want to proceed.'
636
- }
637
- }, (validityMessages['en'] || validityMessages['en-US'] || {}));
638
-
639
-
640
- ['select', 'radio'].forEach(function(type){
641
- validityMessages['en'].valueMissing[type] = 'Please select an option.';
642
- });
643
-
644
- ['date', 'time', 'datetime-local'].forEach(function(type){
645
- validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
646
- });
647
- ['date', 'time', 'datetime-local'].forEach(function(type){
648
- validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
649
- });
650
-
651
- validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en'];
652
- validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
653
-
654
- validityMessages['de'] = $.extend(true, {
655
- typeMismatch: {
656
- email: '{%value} ist keine zulässige E-Mail-Adresse',
657
- url: '{%value} ist keine zulässige Webadresse',
658
- number: '{%value} ist keine Nummer!',
659
- date: '{%value} ist kein Datum',
660
- time: '{%value} ist keine Uhrzeit',
661
- range: '{%value} ist keine Nummer!',
662
- "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
663
- },
664
- rangeUnderflow: {
665
- defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.'
666
- },
667
- rangeOverflow: {
668
- defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.'
669
- },
670
- stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
671
- tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
672
- patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}',
673
- valueMissing: {
674
- defaultMessage: 'Bitte geben Sie einen Wert ein',
675
- checkbox: 'Bitte aktivieren Sie das Kästchen'
676
- }
677
- }, (validityMessages['de'] || {}));
678
-
679
- ['select', 'radio'].forEach(function(type){
680
- validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus';
681
- });
682
-
683
- ['date', 'time', 'datetime-local'].forEach(function(type){
684
- validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
685
- });
686
- ['date', 'time', 'datetime-local'].forEach(function(type){
687
- validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
688
- });
689
-
690
- var currentValidationMessage = validityMessages[''];
691
-
692
-
693
- webshims.createValidationMessage = function(elem, name){
694
- var message = currentValidationMessage[name];
695
- if(message && typeof message !== 'string'){
696
- message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
697
- }
698
- if(message){
699
- ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
700
- if(message.indexOf('{%'+attr) === -1){return;}
701
- var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || '';
702
- if(name == 'patternMismatch' && attr == 'title' && !val){
703
- webshims.error('no title for patternMismatch provided. Always add a title attribute.');
704
- }
705
- message = message.replace('{%'+ attr +'}', val);
706
- if('value' == attr){
707
- message = message.replace('{%valueLen}', val.length);
708
- }
709
- });
710
- }
711
- return message || '';
712
- };
713
-
714
-
715
- if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
716
- implementProperties.push('validationMessage');
717
- }
718
-
719
- webshims.activeLang({
720
- langObj: validityMessages,
721
- module: 'form-core',
722
- callback: function(langObj){
723
- currentValidationMessage = langObj;
724
- }
725
- });
726
-
727
- implementProperties.forEach(function(messageProp){
728
- webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, {
729
- prop: {
730
- value: '',
731
- writeable: false
732
- }
733
- });
734
- ['input', 'select', 'textarea'].forEach(function(nodeName){
735
- var desc = webshims.defineNodeNameProperty(nodeName, messageProp, {
736
- prop: {
737
- get: function(){
738
- var elem = this;
739
- var message = '';
740
- if(!$.prop(elem, 'willValidate')){
741
- return message;
742
- }
743
-
744
- var validity = $.prop(elem, 'validity') || {valid: 1};
745
-
746
- if(validity.valid){return message;}
747
- message = webshims.getContentValidationMessage(elem, validity);
748
-
749
- if(message){return message;}
750
-
751
- if(validity.customError && elem.nodeName){
752
- message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage');
753
- if(message){return message;}
754
- }
755
- $.each(validity, function(name, prop){
756
- if(name == 'valid' || !prop){return;}
757
-
758
- message = webshims.createValidationMessage(elem, name);
759
- if(message){
760
- return false;
761
- }
762
- });
763
- return message || '';
764
- },
765
- writeable: false
766
- }
767
- });
768
- });
769
-
770
- });
1
+ //additional tests for partial implementation of forms features
2
+ (function($){
3
+ "use strict";
4
+ var Modernizr = window.Modernizr;
5
+ var webshims = $.webshims;
6
+ var bugs = webshims.bugs;
7
+ var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
8
+ var testRequiredFind = function(){
9
+ if(form[0].querySelector){
10
+ try {
11
+ bugs.findRequired = !(form[0].querySelector('select:required'));
12
+ } catch(er){
13
+ bugs.findRequired = false;
14
+ }
15
+ }
16
+ };
17
+ var inputElem = $('input', form).eq(0);
18
+ var onDomextend = function(fn){
19
+ webshims.loader.loadList(['dom-extend']);
20
+ webshims.ready('dom-extend', fn);
21
+ };
22
+
23
+ bugs.findRequired = false;
24
+ bugs.validationMessage = false;
25
+
26
+ webshims.capturingEventPrevented = function(e){
27
+ if(!e._isPolyfilled){
28
+ var isDefaultPrevented = e.isDefaultPrevented;
29
+ var preventDefault = e.preventDefault;
30
+ e.preventDefault = function(){
31
+ clearTimeout($.data(e.target, e.type + 'DefaultPrevented'));
32
+ $.data(e.target, e.type + 'DefaultPrevented', setTimeout(function(){
33
+ $.removeData(e.target, e.type + 'DefaultPrevented');
34
+ }, 30));
35
+ return preventDefault.apply(this, arguments);
36
+ };
37
+ e.isDefaultPrevented = function(){
38
+ return !!(isDefaultPrevented.apply(this, arguments) || $.data(e.target, e.type + 'DefaultPrevented') || false);
39
+ };
40
+ e._isPolyfilled = true;
41
+ }
42
+ };
43
+
44
+ if(!Modernizr.formvalidation || bugs.bustedValidity){
45
+ testRequiredFind();
46
+ return;
47
+ }
48
+
49
+ //create delegatable events
50
+ webshims.capturingEvents(['input']);
51
+ webshims.capturingEvents(['invalid'], true);
52
+
53
+ if(window.opera || window.testGoodWithFix){
54
+
55
+ form.appendTo('head');
56
+
57
+ testRequiredFind();
58
+ bugs.validationMessage = !(inputElem.prop('validationMessage'));
59
+
60
+ webshims.reTest(['form-native-extend', 'form-message']);
61
+
62
+ form.remove();
63
+
64
+ $(function(){
65
+ onDomextend(function(){
66
+
67
+ //Opera shows native validation bubbles in case of input.checkValidity()
68
+ // Opera 11.6/12 hasn't fixed this issue right, it's buggy
69
+ var preventDefault = function(e){
70
+ e.preventDefault();
71
+ };
72
+
73
+ ['form', 'input', 'textarea', 'select'].forEach(function(name){
74
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
75
+ prop: {
76
+ value: function(){
77
+ if (!webshims.fromSubmit) {
78
+ $(this).on('invalid.checkvalidity', preventDefault);
79
+ }
80
+
81
+ webshims.fromCheckValidity = true;
82
+ var ret = desc.prop._supvalue.apply(this, arguments);
83
+ if (!webshims.fromSubmit) {
84
+ $(this).unbind('invalid.checkvalidity', preventDefault);
85
+ }
86
+ webshims.fromCheckValidity = false;
87
+ return ret;
88
+ }
89
+ }
90
+ });
91
+ });
92
+
93
+ });
94
+ });
95
+ }
96
+
97
+ if($.browser.webkit && !webshims.bugs.bustedValidity){
98
+ (function(){
99
+ var elems = /^(?:textarea|input)$/i;
100
+ var form = false;
101
+
102
+ document.addEventListener('contextmenu', function(e){
103
+ if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
104
+ setTimeout(function(){
105
+ form = false;
106
+ }, 1);
107
+ }
108
+ }, false);
109
+
110
+ $(window).on('invalid', function(e){
111
+ if(e.originalEvent && form && form == e.target.form){
112
+ e.wrongWebkitInvalid = true;
113
+ e.stopImmediatePropagation();
114
+ }
115
+ });
116
+ })();
117
+ }
118
+ })(jQuery);
119
+
120
+ jQuery.webshims.register('form-core', function($, webshims, window, document, undefined, options){
121
+ "use strict";
122
+
123
+ var groupTypes = {radio: 1};
124
+ var checkTypes = {checkbox: 1, radio: 1};
125
+ var emptyJ = $([]);
126
+ var bugs = webshims.bugs;
127
+ var getGroupElements = function(elem){
128
+ elem = $(elem);
129
+ var name;
130
+ var form;
131
+ var ret = emptyJ;
132
+ if(groupTypes[elem[0].type]){
133
+ form = elem.prop('form');
134
+ name = elem[0].name;
135
+ if(!name){
136
+ ret = elem;
137
+ } else if(form){
138
+ ret = $(form[name]);
139
+ } else {
140
+ ret = $(document.getElementsByName(name)).filter(function(){
141
+ return !$.prop(this, 'form');
142
+ });
143
+ }
144
+ ret = ret.filter('[type="radio"]');
145
+ }
146
+ return ret;
147
+ };
148
+
149
+ var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
150
+ var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
151
+ if(key && message[key]){
152
+ message = message[key];
153
+ }
154
+ if(typeof message == 'object'){
155
+ validity = validity || $.prop(elem, 'validity') || {valid: 1};
156
+ if(!validity.valid){
157
+ $.each(validity, function(name, prop){
158
+ if(prop && name != 'valid' && message[name]){
159
+ message = message[name];
160
+ return false;
161
+ }
162
+ });
163
+ }
164
+ }
165
+
166
+ if(typeof message == 'object'){
167
+ message = message.defaultMessage;
168
+ }
169
+ return message || '';
170
+ };
171
+
172
+ /*
173
+ * Selectors for all browsers
174
+ */
175
+ var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
176
+ var hasInvalid = function(elem){
177
+ var ret = false;
178
+ $($.prop(elem, 'elements')).each(function(){
179
+ ret = $(this).is(':invalid');
180
+ if(ret){
181
+ return false;
182
+ }
183
+ });
184
+ return ret;
185
+ };
186
+ $.extend($.expr[":"], {
187
+ "valid-element": function(elem){
188
+ return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
189
+ },
190
+ "invalid-element": function(elem){
191
+ return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
192
+ },
193
+ "required-element": function(elem){
194
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
195
+ },
196
+ "user-error": function(elem){
197
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
198
+ },
199
+ "optional-element": function(elem){
200
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
201
+ },
202
+ "in-range": function(elem){
203
+ if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
204
+ return false;
205
+ }
206
+ var val = $.prop(elem, 'validity');
207
+ return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
208
+ },
209
+ "out-of-range": function(elem){
210
+ if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
211
+ return false;
212
+ }
213
+ var val = $.prop(elem, 'validity');
214
+ return !!(val && (val.rangeOverflow || val.rangeUnderflow));
215
+ }
216
+
217
+ });
218
+
219
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
220
+ $.expr[":"][name] = $.expr.filters[name+"-element"];
221
+ });
222
+
223
+
224
+ $.expr[":"].focus = function( elem ) {
225
+ try {
226
+ var doc = elem.ownerDocument;
227
+ return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
228
+ } catch(e){}
229
+ return false;
230
+ };
231
+
232
+ var customEvents = $.event.customEvent || {};
233
+ var isValid = function(elem){
234
+ return ($.prop(elem, 'validity') || {valid: 1}).valid;
235
+ };
236
+
237
+ if (bugs.bustedValidity || bugs.findRequired) {
238
+ (function(){
239
+ var find = $.find;
240
+ var matchesSelector = $.find.matchesSelector;
241
+
242
+ var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
243
+ var regFn = function(sel){
244
+ return sel + '-element';
245
+ };
246
+
247
+ $.find = (function(){
248
+ var slice = Array.prototype.slice;
249
+ var fn = function(sel){
250
+ var ar = arguments;
251
+ ar = slice.call(ar, 1, ar.length);
252
+ ar.unshift(sel.replace(regExp, regFn));
253
+ return find.apply(this, ar);
254
+ };
255
+ for (var i in find) {
256
+ if(find.hasOwnProperty(i)){
257
+ fn[i] = find[i];
258
+ }
259
+ }
260
+ return fn;
261
+ })();
262
+ if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
263
+ $.find.matchesSelector = function(node, expr){
264
+ expr = expr.replace(regExp, regFn);
265
+ return matchesSelector.call(this, node, expr);
266
+ };
267
+ }
268
+
269
+ })();
270
+ }
271
+
272
+ //ToDo needs testing
273
+ var oldAttr = $.prop;
274
+ var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
275
+ $.prop = function(elem, name, val){
276
+ var ret = oldAttr.apply(this, arguments);
277
+ if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
278
+ if(isValid(elem)){
279
+ $(elem).getShadowElement().removeClass(invalidClasses);
280
+ if(name == 'checked' && val) {
281
+ getGroupElements(elem).not(elem).removeClass(invalidClasses).removeAttr('aria-invalid');
282
+ }
283
+ }
284
+ }
285
+ return ret;
286
+ };
287
+
288
+ var returnValidityCause = function(validity, elem){
289
+ var ret;
290
+ $.each(validity, function(name, value){
291
+ if(value){
292
+ ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
293
+ return false;
294
+ }
295
+ });
296
+ return ret;
297
+ };
298
+
299
+ var isInGroup = function(name){
300
+ var ret;
301
+ try {
302
+ ret = document.activeElement.name === name;
303
+ } catch(e){}
304
+ return ret;
305
+ };
306
+ /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-succes instead */
307
+ var invalidClass = 'user-error';
308
+ var invalidClasses = 'user-error form-ui-invalid';
309
+ var validClass = 'user-success';
310
+ var validClasses = 'user-success form-ui-valid';
311
+ var switchValidityClass = function(e){
312
+ var elem, timer;
313
+ if(!e.target){return;}
314
+ elem = $(e.target).getNativeElement()[0];
315
+ if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
316
+ timer = $.data(elem, 'webshimsswitchvalidityclass');
317
+ var switchClass = function(){
318
+ if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
319
+ var validity = $.prop(elem, 'validity');
320
+ var shadowElem = $(elem).getShadowElement();
321
+ var addClass, removeClass, trigger, generaltrigger, validityCause;
322
+
323
+ $(elem).trigger('refreshCustomValidityRules');
324
+ if(validity.valid){
325
+ if(!shadowElem.hasClass(validClass)){
326
+ addClass = validClasses;
327
+ removeClass = invalidClasses;
328
+ generaltrigger = 'changedvaliditystate';
329
+ trigger = 'changedvalid';
330
+ if(checkTypes[elem.type] && elem.checked){
331
+ getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
332
+ }
333
+ $.removeData(elem, 'webshimsinvalidcause');
334
+ }
335
+ } else {
336
+ validityCause = returnValidityCause(validity, elem);
337
+ if($.data(elem, 'webshimsinvalidcause') != validityCause){
338
+ $.data(elem, 'webshimsinvalidcause', validityCause);
339
+ generaltrigger = 'changedvaliditystate';
340
+ }
341
+ if(!shadowElem.hasClass(invalidClass)){
342
+ addClass = invalidClasses;
343
+ removeClass = validClasses;
344
+ if (checkTypes[elem.type] && !elem.checked) {
345
+ getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
346
+ }
347
+ trigger = 'changedinvalid';
348
+ }
349
+ }
350
+ if(addClass){
351
+ shadowElem.addClass(addClass).removeClass(removeClass);
352
+ //jQuery 1.6.1 IE9 bug (doubble trigger bug)
353
+ setTimeout(function(){
354
+ $(elem).trigger(trigger);
355
+ }, 0);
356
+ }
357
+ if(generaltrigger){
358
+ setTimeout(function(){
359
+ $(elem).trigger(generaltrigger);
360
+ }, 0);
361
+ }
362
+ $.removeData(e.target, 'webshimsswitchvalidityclass');
363
+ };
364
+
365
+ if(timer){
366
+ clearTimeout(timer);
367
+ }
368
+ if(e.type == 'refreshvalidityui'){
369
+ switchClass();
370
+ } else {
371
+ $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
372
+ }
373
+ };
374
+
375
+ $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
376
+ customEvents.changedvaliditystate = true;
377
+ customEvents.refreshCustomValidityRules = true;
378
+ customEvents.changedvalid = true;
379
+ customEvents.changedinvalid = true;
380
+ customEvents.refreshvalidityui = true;
381
+
382
+
383
+ webshims.triggerInlineForm = function(elem, event){
384
+ $(elem).trigger(event);
385
+ };
386
+
387
+ webshims.modules["form-core"].getGroupElements = getGroupElements;
388
+
389
+
390
+ var setRoot = function(){
391
+ webshims.scrollRoot = ($.browser.webkit || document.compatMode == 'BackCompat') ?
392
+ $(document.body) :
393
+ $(document.documentElement)
394
+ ;
395
+ };
396
+ setRoot();
397
+ webshims.ready('DOM', setRoot);
398
+
399
+ webshims.getRelOffset = function(posElem, relElem){
400
+ posElem = $(posElem);
401
+ var offset = $(relElem).offset();
402
+ var bodyOffset;
403
+ $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
404
+ bodyOffset = posElem.offset();
405
+ });
406
+ offset.top -= bodyOffset.top;
407
+ offset.left -= bodyOffset.left;
408
+ return offset;
409
+ };
410
+
411
+ /* some extra validation UI */
412
+ webshims.validityAlert = (function(){
413
+ var alertElem = (!$.browser.msie || parseInt($.browser.version, 10) > 7) ? 'span' : 'label';
414
+ var errorBubble;
415
+ var hideTimer = false;
416
+ var focusTimer = false;
417
+ var resizeTimer = false;
418
+ var boundHide;
419
+
420
+ var api = {
421
+ hideDelay: 5000,
422
+
423
+ showFor: function(elem, message, noFocusElem, noBubble){
424
+ api._create();
425
+ elem = $(elem);
426
+ var visual = $(elem).getShadowElement();
427
+ var offset = api.getOffsetFromBody(visual);
428
+ api.clear();
429
+ if(noBubble){
430
+ this.hide();
431
+ } else {
432
+ this.getMessage(elem, message);
433
+ this.position(visual, offset);
434
+
435
+ this.show();
436
+ if(this.hideDelay){
437
+ hideTimer = setTimeout(boundHide, this.hideDelay);
438
+ }
439
+ $(window)
440
+ .on('resize.validityalert', function(){
441
+ clearTimeout(resizeTimer);
442
+ resizeTimer = setTimeout(function(){
443
+ api.position(visual);
444
+ }, 9);
445
+ })
446
+ ;
447
+ }
448
+
449
+ if(!noFocusElem){
450
+ this.setFocus(visual, offset);
451
+ }
452
+ },
453
+ getOffsetFromBody: function(elem){
454
+ return webshims.getRelOffset(errorBubble, elem);
455
+ },
456
+ setFocus: function(visual, offset){
457
+ var focusElem = $(visual).getShadowFocusElement();
458
+ var scrollTop = webshims.scrollRoot.scrollTop();
459
+ var elemTop = ((offset || focusElem.offset()).top) - 30;
460
+ var smooth;
461
+
462
+ if(webshims.getID && alertElem == 'label'){
463
+ errorBubble.attr('for', webshims.getID(focusElem));
464
+ }
465
+
466
+ if(scrollTop > elemTop){
467
+ webshims.scrollRoot.animate(
468
+ {scrollTop: elemTop - 5},
469
+ {
470
+ queue: false,
471
+ duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
472
+ }
473
+ );
474
+ smooth = true;
475
+ }
476
+ try {
477
+ focusElem[0].focus();
478
+ } catch(e){}
479
+ if(smooth){
480
+ webshims.scrollRoot.scrollTop(scrollTop);
481
+ setTimeout(function(){
482
+ webshims.scrollRoot.scrollTop(scrollTop);
483
+ }, 0);
484
+ }
485
+ setTimeout(function(){
486
+ $(document).on('focusout.validityalert', boundHide);
487
+ }, 10);
488
+ },
489
+ getMessage: function(elem, message){
490
+ if (!message) {
491
+ message = getContentValidationMessage(elem[0]) || elem.prop('validationMessage');
492
+ }
493
+ if (message) {
494
+ $('span.va-box', errorBubble).text(message);
495
+ }
496
+ else {
497
+ this.hide();
498
+ }
499
+ },
500
+ position: function(elem, offset){
501
+ offset = offset ? $.extend({}, offset) : api.getOffsetFromBody(elem);
502
+ offset.top += elem.outerHeight();
503
+ errorBubble.css(offset);
504
+ },
505
+ show: function(){
506
+ if(errorBubble.css('display') === 'none'){
507
+ errorBubble.css({opacity: 0}).show();
508
+ }
509
+ errorBubble.addClass('va-visible').fadeTo(400, 1);
510
+ },
511
+ hide: function(){
512
+ errorBubble.removeClass('va-visible').fadeOut();
513
+ },
514
+ clear: function(){
515
+ clearTimeout(focusTimer);
516
+ clearTimeout(hideTimer);
517
+ $(document).unbind('.validityalert');
518
+ $(window).unbind('.validityalert');
519
+ errorBubble.stop().removeAttr('for');
520
+ },
521
+ _create: function(){
522
+ if(errorBubble){return;}
523
+ errorBubble = api.errorBubble = $('<'+alertElem+' class="validity-alert-wrapper" role="alert"><span class="validity-alert"><span class="va-arrow"><span class="va-arrow-box"></span></span><span class="va-box"></span></span></'+alertElem+'>').css({position: 'absolute', display: 'none'});
524
+ webshims.ready('DOM', function(){
525
+ errorBubble.appendTo('body');
526
+ if($.fn.bgIframe && $.browser.msie && parseInt($.browser.version, 10) < 7){
527
+ errorBubble.bgIframe();
528
+ }
529
+ });
530
+ }
531
+ };
532
+
533
+
534
+ boundHide = $.proxy(api, 'hide');
535
+
536
+ return api;
537
+ })();
538
+
539
+
540
+ /* extension, but also used to fix native implementation workaround/bugfixes */
541
+ (function(){
542
+ var firstEvent,
543
+ invalids = [],
544
+ stopSubmitTimer,
545
+ form
546
+ ;
547
+
548
+ $(document).on('invalid', function(e){
549
+ if(e.wrongWebkitInvalid){return;}
550
+ var jElm = $(e.target);
551
+ var shadowElem = jElm.getShadowElement();
552
+ if(!shadowElem.hasClass(invalidClass)){
553
+ shadowElem.addClass(invalidClasses).removeClass(validClasses);
554
+ setTimeout(function(){
555
+ $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
556
+ }, 0);
557
+ }
558
+
559
+ if(!firstEvent){
560
+ //trigger firstinvalid
561
+ firstEvent = $.Event('firstinvalid');
562
+ firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
563
+ var firstSystemInvalid = $.Event('firstinvalidsystem');
564
+ $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
565
+ jElm.trigger(firstEvent);
566
+ }
567
+
568
+ //if firstinvalid was prevented all invalids will be also prevented
569
+ if( firstEvent && firstEvent.isDefaultPrevented() ){
570
+ e.preventDefault();
571
+ }
572
+ invalids.push(e.target);
573
+ e.extraData = 'fix';
574
+ clearTimeout(stopSubmitTimer);
575
+ stopSubmitTimer = setTimeout(function(){
576
+ var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
577
+ //reset firstinvalid
578
+ firstEvent = false;
579
+ invalids = [];
580
+ $(e.target).trigger(lastEvent, lastEvent);
581
+ }, 9);
582
+ jElm = null;
583
+ shadowElem = null;
584
+ });
585
+ })();
586
+
587
+ $.fn.getErrorMessage = function(){
588
+ var message = '';
589
+ var elem = this[0];
590
+ if(elem){
591
+ message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
592
+ }
593
+ return message;
594
+ };
595
+
596
+ if(options.replaceValidationUI){
597
+ webshims.ready('DOM forms', function(){
598
+ $(document).on('firstinvalid', function(e){
599
+ if(!e.isInvalidUIPrevented()){
600
+ e.preventDefault();
601
+ $.webshims.validityAlert.showFor( e.target, $(e.target).prop('customValidationMessage') );
602
+ }
603
+ });
604
+ });
605
+ }
606
+
607
+ });
608
+ jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
609
+ "use strict";
610
+ var validityMessages = webshims.validityMessages;
611
+
612
+ var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
613
+
614
+ validityMessages['en'] = $.extend(true, {
615
+ typeMismatch: {
616
+ email: 'Please enter an email address.',
617
+ url: 'Please enter a URL.',
618
+ number: 'Please enter a number.',
619
+ date: 'Please enter a date.',
620
+ time: 'Please enter a time.',
621
+ range: 'Invalid input.',
622
+ "datetime-local": 'Please enter a datetime.'
623
+ },
624
+ rangeUnderflow: {
625
+ defaultMessage: 'Value must be greater than or equal to {%min}.'
626
+ },
627
+ rangeOverflow: {
628
+ defaultMessage: 'Value must be less than or equal to {%max}.'
629
+ },
630
+ stepMismatch: 'Invalid input.',
631
+ tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
632
+
633
+ patternMismatch: 'Invalid input. {%title}',
634
+ valueMissing: {
635
+ defaultMessage: 'Please fill out this field.',
636
+ checkbox: 'Please check this box if you want to proceed.'
637
+ }
638
+ }, (validityMessages['en'] || validityMessages['en-US'] || {}));
639
+
640
+
641
+ ['select', 'radio'].forEach(function(type){
642
+ validityMessages['en'].valueMissing[type] = 'Please select an option.';
643
+ });
644
+
645
+ ['date', 'time', 'datetime-local'].forEach(function(type){
646
+ validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
647
+ });
648
+ ['date', 'time', 'datetime-local'].forEach(function(type){
649
+ validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
650
+ });
651
+
652
+ validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en'];
653
+ validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
654
+
655
+ validityMessages['de'] = $.extend(true, {
656
+ typeMismatch: {
657
+ email: '{%value} ist keine zulässige E-Mail-Adresse',
658
+ url: '{%value} ist keine zulässige Webadresse',
659
+ number: '{%value} ist keine Nummer!',
660
+ date: '{%value} ist kein Datum',
661
+ time: '{%value} ist keine Uhrzeit',
662
+ range: '{%value} ist keine Nummer!',
663
+ "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
664
+ },
665
+ rangeUnderflow: {
666
+ defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.'
667
+ },
668
+ rangeOverflow: {
669
+ defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.'
670
+ },
671
+ stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
672
+ tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
673
+ patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}',
674
+ valueMissing: {
675
+ defaultMessage: 'Bitte geben Sie einen Wert ein',
676
+ checkbox: 'Bitte aktivieren Sie das Kästchen'
677
+ }
678
+ }, (validityMessages['de'] || {}));
679
+
680
+ ['select', 'radio'].forEach(function(type){
681
+ validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus';
682
+ });
683
+
684
+ ['date', 'time', 'datetime-local'].forEach(function(type){
685
+ validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
686
+ });
687
+ ['date', 'time', 'datetime-local'].forEach(function(type){
688
+ validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
689
+ });
690
+
691
+ var currentValidationMessage = validityMessages[''];
692
+
693
+
694
+ webshims.createValidationMessage = function(elem, name){
695
+ var message = currentValidationMessage[name];
696
+ if(message && typeof message !== 'string'){
697
+ message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
698
+ }
699
+ if(message){
700
+ ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
701
+ if(message.indexOf('{%'+attr) === -1){return;}
702
+ var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || '';
703
+ if(name == 'patternMismatch' && attr == 'title' && !val){
704
+ webshims.error('no title for patternMismatch provided. Always add a title attribute.');
705
+ }
706
+ message = message.replace('{%'+ attr +'}', val);
707
+ if('value' == attr){
708
+ message = message.replace('{%valueLen}', val.length);
709
+ }
710
+ });
711
+ }
712
+ return message || '';
713
+ };
714
+
715
+
716
+ if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
717
+ implementProperties.push('validationMessage');
718
+ }
719
+
720
+ webshims.activeLang({
721
+ langObj: validityMessages,
722
+ module: 'form-core',
723
+ callback: function(langObj){
724
+ currentValidationMessage = langObj;
725
+ }
726
+ });
727
+
728
+ implementProperties.forEach(function(messageProp){
729
+ webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, {
730
+ prop: {
731
+ value: '',
732
+ writeable: false
733
+ }
734
+ });
735
+ ['input', 'select', 'textarea'].forEach(function(nodeName){
736
+ var desc = webshims.defineNodeNameProperty(nodeName, messageProp, {
737
+ prop: {
738
+ get: function(){
739
+ var elem = this;
740
+ var message = '';
741
+ if(!$.prop(elem, 'willValidate')){
742
+ return message;
743
+ }
744
+
745
+ var validity = $.prop(elem, 'validity') || {valid: 1};
746
+
747
+ if(validity.valid){return message;}
748
+ message = webshims.getContentValidationMessage(elem, validity);
749
+
750
+ if(message){return message;}
751
+
752
+ if(validity.customError && elem.nodeName){
753
+ message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage');
754
+ if(message){return message;}
755
+ }
756
+ $.each(validity, function(name, prop){
757
+ if(name == 'valid' || !prop){return;}
758
+
759
+ message = webshims.createValidationMessage(elem, name);
760
+ if(message){
761
+ return false;
762
+ }
763
+ });
764
+ return message || '';
765
+ },
766
+ writeable: false
767
+ }
768
+ });
769
+ });
770
+
771
+ });
771
772
  });