webshims-rails 0.4.7 → 1.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +15 -0
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +1 -1
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +1 -1
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +197 -166
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1711 -1609
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +2575 -2253
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +2452 -1476
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1405 -1159
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1316 -963
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1862 -179
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +4327 -287
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +3887 -586
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2911 -2159
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +3425 -1730
  16. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2854 -1203
  17. data/vendor/assets/javascripts/webshims/shims/combos/2.js +3351 -2130
  18. data/vendor/assets/javascripts/webshims/shims/combos/20.js +2426 -581
  19. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1915 -1574
  20. data/vendor/assets/javascripts/webshims/shims/combos/22.js +864 -2275
  21. data/vendor/assets/javascripts/webshims/shims/combos/23.js +609 -1811
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +1655 -2736
  23. data/vendor/assets/javascripts/webshims/shims/combos/4.js +1037 -603
  24. data/vendor/assets/javascripts/webshims/shims/combos/5.js +3100 -773
  25. data/vendor/assets/javascripts/webshims/shims/combos/6.js +3631 -840
  26. data/vendor/assets/javascripts/webshims/shims/combos/7.js +3596 -1354
  27. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1731 -188
  28. data/vendor/assets/javascripts/webshims/shims/combos/9.js +3243 -1431
  29. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +107 -18
  30. data/vendor/assets/javascripts/webshims/shims/es5.js +1 -0
  31. data/vendor/assets/javascripts/webshims/shims/form-core.js +553 -464
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +160 -154
  33. data/vendor/assets/javascripts/webshims/shims/form-message.js +73 -49
  34. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +18 -1
  35. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +161 -36
  36. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2130 -813
  37. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +206 -58
  38. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ar.js → formcfg-ar.js} +30 -0
  39. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ch-ZN.js → formcfg-ch-ZN.js} +31 -0
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-de.txt → formcfg-de.txt} +50 -11
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-el.js → formcfg-el.js} +31 -0
  42. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-en.txt → formcfg-en.txt} +44 -11
  43. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-es.js → formcfg-es.js} +31 -0
  44. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-fr.js → formcfg-fr.js} +31 -0
  45. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-he.js → formcfg-he.js} +31 -0
  46. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hi.js → formcfg-hi.js} +31 -0
  47. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hu.js → formcfg-hu.js} +31 -0
  48. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-it.js → formcfg-it.js} +31 -0
  49. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ja.js → formcfg-ja.js} +31 -0
  50. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-nl.js → formcfg-nl.js} +31 -0
  51. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-pt-PT.js → formcfg-pt-PT.js} +31 -0
  52. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ru.js → formcfg-ru.js} +31 -0
  53. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-sv.js → formcfg-sv.js} +32 -0
  54. data/vendor/assets/javascripts/webshims/shims/json-storage.js +16 -10
  55. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +155 -122
  56. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +76 -41
  57. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +8 -16
  58. data/vendor/assets/javascripts/webshims/shims/range-ui.js +388 -0
  59. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +12 -0
  60. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1186 -0
  62. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +868 -548
  63. data/vendor/assets/javascripts/webshims/shims/styles/vertical-range.png +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/swfmini.js +497 -0
  66. data/vendor/assets/javascripts/webshims/shims/track-ui.js +3 -0
  67. data/vendor/assets/javascripts/webshims/shims/track.js +29 -29
  68. metadata +26 -125
  69. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +0 -1
  70. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +0 -1
  71. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +0 -1
  72. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +0 -1
  73. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +0 -1
  74. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +0 -1
  75. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  76. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -73
  77. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -49
  78. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +0 -1
  79. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +0 -1
  82. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -73
  83. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -49
  84. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +0 -1
  85. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +0 -1
  86. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +0 -1
  87. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +0 -1
  88. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +0 -1
  89. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +0 -1
  90. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +0 -1
  91. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +0 -1
  92. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +0 -1
  93. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +0 -1
  94. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +0 -1
  95. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +0 -1
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +0 -1
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +0 -1
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +0 -1
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +0 -1
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +0 -1
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +0 -1
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +0 -1
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +0 -1
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +0 -1
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +0 -1
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +0 -1
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +0 -1
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +0 -1
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +0 -1
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +0 -1
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +0 -1
  112. data/vendor/assets/javascripts/webshims/minified/shims/details.js +0 -1
  113. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +0 -1
  114. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +0 -1
  115. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +0 -1
  116. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +0 -1
  117. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +0 -1
  118. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +0 -1
  119. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +0 -1
  120. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +0 -1
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +0 -1
  122. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +0 -1
  123. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +0 -1
  124. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +0 -1
  125. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +0 -1
  126. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +0 -33
  127. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +0 -1
  128. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +0 -34
  129. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +0 -1
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +0 -1
  131. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +0 -1
  132. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +0 -1
  133. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +0 -1
  134. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +0 -1
  135. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +0 -1
  136. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +0 -1
  137. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +0 -1
  138. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +0 -1
  139. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +0 -1
  140. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +0 -1
  141. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -1
  142. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  143. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -87
  144. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +0 -1
  145. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +0 -1
  146. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +0 -1
  147. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +0 -1
  148. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +0 -1
  149. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  150. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  151. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  152. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +0 -1
  153. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  154. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  155. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  156. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +0 -1
  157. data/vendor/assets/javascripts/webshims/minified/shims/track.js +0 -1
  158. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  159. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  160. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2872
  161. data/vendor/assets/javascripts/webshims/shims/combos/25.js +0 -2376
  162. data/vendor/assets/javascripts/webshims/shims/combos/26.js +0 -3009
  163. data/vendor/assets/javascripts/webshims/shims/combos/27.js +0 -4150
  164. data/vendor/assets/javascripts/webshims/shims/combos/59.js +0 -1747
  165. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -1
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -87
  168. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +0 -972
@@ -1,1747 +0,0 @@
1
- //additional tests for partial implementation of forms features
2
- (function($){
3
- "use strict";
4
- var isWebkit = /webkit/i.test(navigator.userAgent);
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
-
27
- webshims.capturingEventPrevented = function(e){
28
- if(!e._isPolyfilled){
29
- var isDefaultPrevented = e.isDefaultPrevented;
30
- var preventDefault = e.preventDefault;
31
- e.preventDefault = function(){
32
- clearTimeout($.data(e.target, e.type + 'DefaultPrevented'));
33
- $.data(e.target, e.type + 'DefaultPrevented', setTimeout(function(){
34
- $.removeData(e.target, e.type + 'DefaultPrevented');
35
- }, 30));
36
- return preventDefault.apply(this, arguments);
37
- };
38
- e.isDefaultPrevented = function(){
39
- return !!(isDefaultPrevented.apply(this, arguments) || $.data(e.target, e.type + 'DefaultPrevented') || false);
40
- };
41
- e._isPolyfilled = true;
42
- }
43
- };
44
-
45
- if(!Modernizr.formvalidation || bugs.bustedValidity){
46
- testRequiredFind();
47
- } else {
48
- //create delegatable events
49
- webshims.capturingEvents(['input']);
50
- webshims.capturingEvents(['invalid'], true);
51
-
52
- if(window.opera || window.testGoodWithFix){
53
-
54
- form.appendTo('head');
55
-
56
- testRequiredFind();
57
- bugs.validationMessage = !(inputElem.prop('validationMessage'));
58
-
59
- webshims.reTest(['form-native-extend', 'form-message']);
60
-
61
- form.remove();
62
-
63
- $(function(){
64
- onDomextend(function(){
65
-
66
- //Opera shows native validation bubbles in case of input.checkValidity()
67
- // Opera 11.6/12 hasn't fixed this issue right, it's buggy
68
- var preventDefault = function(e){
69
- e.preventDefault();
70
- };
71
-
72
- ['form', 'input', 'textarea', 'select'].forEach(function(name){
73
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
74
- prop: {
75
- value: function(){
76
- if (!webshims.fromSubmit) {
77
- $(this).on('invalid.checkvalidity', preventDefault);
78
- }
79
-
80
- webshims.fromCheckValidity = true;
81
- var ret = desc.prop._supvalue.apply(this, arguments);
82
- if (!webshims.fromSubmit) {
83
- $(this).unbind('invalid.checkvalidity', preventDefault);
84
- }
85
- webshims.fromCheckValidity = false;
86
- return ret;
87
- }
88
- }
89
- });
90
- });
91
-
92
- });
93
- });
94
- }
95
-
96
- if(isWebkit && !webshims.bugs.bustedValidity){
97
- (function(){
98
- var elems = /^(?:textarea|input)$/i;
99
- var form = false;
100
-
101
- document.addEventListener('contextmenu', function(e){
102
- if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
103
- setTimeout(function(){
104
- form = false;
105
- }, 1);
106
- }
107
- }, false);
108
-
109
- $(window).on('invalid', function(e){
110
- if(e.originalEvent && form && form == e.target.form){
111
- e.wrongWebkitInvalid = true;
112
- e.stopImmediatePropagation();
113
- }
114
- });
115
-
116
- })();
117
- }
118
- }
119
-
120
-
121
-
122
- jQuery.webshims.register('form-core', function($, webshims, window, document, undefined, options){
123
- "use strict";
124
-
125
-
126
- var checkTypes = {checkbox: 1, radio: 1};
127
- var emptyJ = $([]);
128
- var bugs = webshims.bugs;
129
- var groupTypes = {radio: 1};
130
- var getGroupElements = function(elem){
131
- elem = $(elem);
132
- var name;
133
- var form;
134
- var ret = emptyJ;
135
- if(groupTypes[elem[0].type]){
136
- form = elem.prop('form');
137
- name = elem[0].name;
138
- if(!name){
139
- ret = elem;
140
- } else if(form){
141
- ret = $(form[name]);
142
- } else {
143
- ret = $(document.getElementsByName(name)).filter(function(){
144
- return !$.prop(this, 'form');
145
- });
146
- }
147
- ret = ret.filter('[type="radio"]');
148
- }
149
- return ret;
150
- };
151
-
152
- var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
153
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
154
- if(key && message[key]){
155
- message = message[key];
156
- }
157
- if(typeof message == 'object'){
158
- validity = validity || $.prop(elem, 'validity') || {valid: 1};
159
- if(!validity.valid){
160
- $.each(validity, function(name, prop){
161
- if(prop && name != 'valid' && message[name]){
162
- message = message[name];
163
- return false;
164
- }
165
- });
166
- }
167
- }
168
-
169
- if(typeof message == 'object'){
170
- message = message.defaultMessage;
171
- }
172
- return message || '';
173
- };
174
-
175
- /*
176
- * Selectors for all browsers
177
- */
178
- var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
179
- var hasInvalid = function(elem){
180
- var ret = false;
181
- $($.prop(elem, 'elements')).each(function(){
182
- ret = $(this).is(':invalid');
183
- if(ret){
184
- return false;
185
- }
186
- });
187
- return ret;
188
- };
189
- $.extend($.expr[":"], {
190
- "valid-element": function(elem){
191
- return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
192
- },
193
- "invalid-element": function(elem){
194
- return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
195
- },
196
- "required-element": function(elem){
197
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
198
- },
199
- "user-error": function(elem){
200
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
201
- },
202
- "optional-element": function(elem){
203
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
204
- },
205
- "in-range": function(elem){
206
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
207
- return false;
208
- }
209
- var val = $.prop(elem, 'validity');
210
- return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
211
- },
212
- "out-of-range": function(elem){
213
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
214
- return false;
215
- }
216
- var val = $.prop(elem, 'validity');
217
- return !!(val && (val.rangeOverflow || val.rangeUnderflow));
218
- }
219
-
220
- });
221
-
222
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
223
- $.expr[":"][name] = $.expr.filters[name+"-element"];
224
- });
225
-
226
-
227
- $.expr[":"].focus = function( elem ) {
228
- try {
229
- var doc = elem.ownerDocument;
230
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
231
- } catch(e){}
232
- return false;
233
- };
234
-
235
- if(Modernizr.formvalidation && isWebkit && !webshims.bugs.bustedValidity){
236
- (function(){
237
- var retriggerRadioValidity = function(){
238
- var validity;
239
- if((validity = this.validity) && !validity.customError){
240
- this.setCustomValidity('');
241
- }
242
- };
243
-
244
- webshims.addReady(function(context, insertedElement){
245
- if(context !== document){
246
- $('input[type="radio"]:invalid', context)
247
- .add(insertedElement.filter('input[type="radio"]:invalid'))
248
- .each(retriggerRadioValidity)
249
- ;
250
- }
251
- });
252
- })();
253
- }
254
-
255
- var customEvents = $.event.customEvent || {};
256
- var isValid = function(elem){
257
- return ($.prop(elem, 'validity') || {valid: 1}).valid;
258
- };
259
-
260
- if (bugs.bustedValidity || bugs.findRequired) {
261
- (function(){
262
- var find = $.find;
263
- var matchesSelector = $.find.matchesSelector;
264
-
265
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
266
- var regFn = function(sel){
267
- return sel + '-element';
268
- };
269
-
270
- $.find = (function(){
271
- var slice = Array.prototype.slice;
272
- var fn = function(sel){
273
- var ar = arguments;
274
- ar = slice.call(ar, 1, ar.length);
275
- ar.unshift(sel.replace(regExp, regFn));
276
- return find.apply(this, ar);
277
- };
278
- for (var i in find) {
279
- if(find.hasOwnProperty(i)){
280
- fn[i] = find[i];
281
- }
282
- }
283
- return fn;
284
- })();
285
- if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
286
- $.find.matchesSelector = function(node, expr){
287
- expr = expr.replace(regExp, regFn);
288
- return matchesSelector.call(this, node, expr);
289
- };
290
- }
291
-
292
- })();
293
- }
294
-
295
- //ToDo needs testing
296
- var oldAttr = $.prop;
297
- var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
298
- $.prop = function(elem, name, val){
299
- var ret = oldAttr.apply(this, arguments);
300
- if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
301
- if(isValid(elem)){
302
- $(elem).getShadowElement().removeClass(invalidClasses);
303
- if(name == 'checked' && val) {
304
- getGroupElements(elem).not(elem).removeClass(invalidClasses).removeAttr('aria-invalid');
305
- }
306
- }
307
- }
308
- return ret;
309
- };
310
-
311
- var returnValidityCause = function(validity, elem){
312
- var ret;
313
- $.each(validity, function(name, value){
314
- if(value){
315
- ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
316
- return false;
317
- }
318
- });
319
- return ret;
320
- };
321
-
322
- var isInGroup = function(name){
323
- var ret;
324
- try {
325
- ret = document.activeElement.name === name;
326
- } catch(e){}
327
- return ret;
328
- };
329
- /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-success instead */
330
- var invalidClass = 'user-error';
331
- var invalidClasses = 'user-error form-ui-invalid';
332
- var validClass = 'user-success';
333
- var validClasses = 'user-success form-ui-valid';
334
- var switchValidityClass = function(e){
335
- var elem, timer;
336
- if(!e.target){return;}
337
- elem = $(e.target).getNativeElement()[0];
338
- if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
339
- timer = $.data(elem, 'webshimsswitchvalidityclass');
340
- var switchClass = function(){
341
- if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
342
- var validity = $.prop(elem, 'validity');
343
- var shadowElem = $(elem).getShadowElement();
344
- var addClass, removeClass, trigger, generaltrigger, validityCause;
345
-
346
- $(elem).trigger('refreshCustomValidityRules');
347
- if(validity.valid){
348
- if(!shadowElem.hasClass(validClass)){
349
- addClass = validClasses;
350
- removeClass = invalidClasses;
351
- generaltrigger = 'changedvaliditystate';
352
- trigger = 'changedvalid';
353
- if(checkTypes[elem.type] && elem.checked){
354
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
355
- }
356
- $.removeData(elem, 'webshimsinvalidcause');
357
- }
358
- } else {
359
- validityCause = returnValidityCause(validity, elem);
360
- if($.data(elem, 'webshimsinvalidcause') != validityCause){
361
- $.data(elem, 'webshimsinvalidcause', validityCause);
362
- generaltrigger = 'changedvaliditystate';
363
- }
364
- if(!shadowElem.hasClass(invalidClass)){
365
- addClass = invalidClasses;
366
- removeClass = validClasses;
367
- if (checkTypes[elem.type] && !elem.checked) {
368
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
369
- }
370
- trigger = 'changedinvalid';
371
- }
372
- }
373
- if(addClass){
374
- shadowElem.addClass(addClass).removeClass(removeClass);
375
- //jQuery 1.6.1 IE9 bug (doubble trigger bug)
376
- setTimeout(function(){
377
- $(elem).trigger(trigger);
378
- }, 0);
379
- }
380
- if(generaltrigger){
381
- setTimeout(function(){
382
- $(elem).trigger(generaltrigger);
383
- }, 0);
384
- }
385
- $.removeData(e.target, 'webshimsswitchvalidityclass');
386
- };
387
-
388
- if(timer){
389
- clearTimeout(timer);
390
- }
391
- if(e.type == 'refreshvalidityui'){
392
- switchClass();
393
- } else {
394
- $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
395
- }
396
- };
397
-
398
- $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
399
- customEvents.changedvaliditystate = true;
400
- customEvents.refreshCustomValidityRules = true;
401
- customEvents.changedvalid = true;
402
- customEvents.changedinvalid = true;
403
- customEvents.refreshvalidityui = true;
404
-
405
-
406
- webshims.triggerInlineForm = function(elem, event){
407
- $(elem).trigger(event);
408
- };
409
-
410
- webshims.modules["form-core"].getGroupElements = getGroupElements;
411
-
412
-
413
- var setRoot = function(){
414
- webshims.scrollRoot = (isWebkit || document.compatMode == 'BackCompat') ?
415
- $(document.body) :
416
- $(document.documentElement)
417
- ;
418
- };
419
- setRoot();
420
- webshims.ready('DOM', setRoot);
421
-
422
- webshims.getRelOffset = function(posElem, relElem){
423
- posElem = $(posElem);
424
- var offset = $(relElem).offset();
425
- var bodyOffset;
426
- $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
427
- bodyOffset = posElem.offset();
428
- });
429
- offset.top -= bodyOffset.top;
430
- offset.left -= bodyOffset.left;
431
- return offset;
432
- };
433
-
434
- /* some extra validation UI */
435
- webshims.validityAlert = (function(){
436
- var alertElem = 'span';
437
- var errorBubble;
438
- var hideTimer = false;
439
- var focusTimer = false;
440
- var resizeTimer = false;
441
- var boundHide;
442
-
443
- var api = {
444
- hideDelay: 5000,
445
-
446
- showFor: function(elem, message, noFocusElem, noBubble){
447
- api._create();
448
- elem = $(elem);
449
- var visual = $(elem).getShadowElement();
450
- var offset = api.getOffsetFromBody(visual);
451
- api.clear();
452
- if(noBubble){
453
- this.hide();
454
- } else {
455
-
456
- this.getMessage(elem, message);
457
- this.position(visual, offset);
458
-
459
- this.show();
460
- if(this.hideDelay){
461
- hideTimer = setTimeout(boundHide, this.hideDelay);
462
- }
463
- $(window)
464
- .on('resize.validityalert reposoverlay.validityalert', function(){
465
- clearTimeout(resizeTimer);
466
- resizeTimer = setTimeout(function(){
467
- api.position(visual);
468
- }, 9);
469
- })
470
- ;
471
- }
472
-
473
- if(!noFocusElem){
474
- this.setFocus(visual, offset);
475
- }
476
- },
477
- getOffsetFromBody: function(elem){
478
- return webshims.getRelOffset(errorBubble, elem);
479
- },
480
- setFocus: function(visual, offset){
481
- var focusElem = $(visual).getShadowFocusElement();
482
- var scrollTop = webshims.scrollRoot.scrollTop();
483
- var elemTop = ((offset || focusElem.offset()).top) - 30;
484
- var smooth;
485
-
486
- if(webshims.getID && alertElem == 'label'){
487
- errorBubble.attr('for', webshims.getID(focusElem));
488
- }
489
-
490
- if(scrollTop > elemTop){
491
- webshims.scrollRoot.animate(
492
- {scrollTop: elemTop - 5},
493
- {
494
- queue: false,
495
- duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
496
- }
497
- );
498
- smooth = true;
499
- }
500
- try {
501
- focusElem[0].focus();
502
- } catch(e){}
503
- if(smooth){
504
- webshims.scrollRoot.scrollTop(scrollTop);
505
- setTimeout(function(){
506
- webshims.scrollRoot.scrollTop(scrollTop);
507
- }, 0);
508
- }
509
- setTimeout(function(){
510
- $(document).on('focusout.validityalert', boundHide);
511
- }, 10);
512
- $(window).triggerHandler('reposoverlay');
513
- },
514
- getMessage: function(elem, message){
515
- if (!message) {
516
- message = getContentValidationMessage(elem[0]) || elem.prop('customValidationMessage') || elem.prop('validationMessage');
517
- }
518
- if (message) {
519
- $('span.va-box', errorBubble).text(message);
520
- }
521
- else {
522
- this.hide();
523
- }
524
- },
525
- position: function(elem, offset){
526
- offset = offset ? $.extend({}, offset) : api.getOffsetFromBody(elem);
527
- offset.top += elem.outerHeight();
528
- errorBubble.css(offset);
529
- },
530
- show: function(){
531
- if(errorBubble.css('display') === 'none'){
532
- errorBubble.css({opacity: 0}).show();
533
- }
534
- errorBubble.addClass('va-visible').fadeTo(400, 1);
535
- },
536
- hide: function(){
537
- errorBubble.removeClass('va-visible').fadeOut();
538
- },
539
- clear: function(){
540
- clearTimeout(focusTimer);
541
- clearTimeout(hideTimer);
542
- $(document).unbind('.validityalert');
543
- $(window).unbind('.validityalert');
544
- errorBubble.stop().removeAttr('for');
545
- },
546
- _create: function(){
547
- if(errorBubble){return;}
548
- 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'});
549
- webshims.ready('DOM', function(){
550
- errorBubble.appendTo('body');
551
- if($.fn.bgIframe){
552
- errorBubble.bgIframe();
553
- }
554
- });
555
- }
556
- };
557
-
558
-
559
- boundHide = $.proxy(api, 'hide');
560
-
561
- return api;
562
- })();
563
-
564
-
565
- /* extension, but also used to fix native implementation workaround/bugfixes */
566
- (function(){
567
- var firstEvent,
568
- invalids = [],
569
- stopSubmitTimer,
570
- form
571
- ;
572
-
573
- $(document).on('invalid', function(e){
574
- if(e.wrongWebkitInvalid){return;}
575
- var jElm = $(e.target);
576
- var shadowElem = jElm.getShadowElement();
577
- if(!shadowElem.hasClass(invalidClass)){
578
- shadowElem.addClass(invalidClasses).removeClass(validClasses);
579
- setTimeout(function(){
580
- $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
581
- }, 0);
582
- }
583
-
584
- if(!firstEvent){
585
- //trigger firstinvalid
586
- firstEvent = $.Event('firstinvalid');
587
- firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
588
- var firstSystemInvalid = $.Event('firstinvalidsystem');
589
- $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
590
- jElm.trigger(firstEvent);
591
- }
592
-
593
- //if firstinvalid was prevented all invalids will be also prevented
594
- if( firstEvent && firstEvent.isDefaultPrevented() ){
595
- e.preventDefault();
596
- }
597
- invalids.push(e.target);
598
- e.extraData = 'fix';
599
- clearTimeout(stopSubmitTimer);
600
- stopSubmitTimer = setTimeout(function(){
601
- var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
602
- //reset firstinvalid
603
- firstEvent = false;
604
- invalids = [];
605
- $(e.target).trigger(lastEvent, lastEvent);
606
- }, 9);
607
- jElm = null;
608
- shadowElem = null;
609
- });
610
- })();
611
-
612
- $.fn.getErrorMessage = function(){
613
- var message = '';
614
- var elem = this[0];
615
- if(elem){
616
- message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
617
- }
618
- return message;
619
- };
620
-
621
- if(options.replaceValidationUI){
622
- webshims.ready('DOM forms', function(){
623
- $(document).on('firstinvalid', function(e){
624
- if(!e.isInvalidUIPrevented()){
625
- e.preventDefault();
626
- $.webshims.validityAlert.showFor( e.target );
627
- }
628
- });
629
- });
630
- }
631
- });
632
-
633
- })(jQuery);
634
- jQuery.webshims.register('form-native-extend', function($, webshims, window, doc, undefined, options){
635
- "use strict";
636
- var Modernizr = window.Modernizr;
637
- var modernizrInputTypes = Modernizr.inputtypes;
638
- if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){return;}
639
- var typeModels = webshims.inputTypes;
640
- var validityRules = {};
641
-
642
- webshims.addInputType = function(type, obj){
643
- typeModels[type] = obj;
644
- };
645
-
646
- webshims.addValidityRule = function(type, fn){
647
- validityRules[type] = fn;
648
- };
649
-
650
- webshims.addValidityRule('typeMismatch',function (input, val, cache, validityState){
651
- if(val === ''){return false;}
652
- var ret = validityState.typeMismatch;
653
- if(!('type' in cache)){
654
- cache.type = (input[0].getAttribute('type') || '').toLowerCase();
655
- }
656
-
657
- if(typeModels[cache.type] && typeModels[cache.type].mismatch){
658
- ret = typeModels[cache.type].mismatch(val, input);
659
- }
660
- return ret;
661
- });
662
-
663
- var overrideNativeMessages = options.overrideMessages;
664
-
665
- var overrideValidity = (!modernizrInputTypes.number || !modernizrInputTypes.time || !modernizrInputTypes.range || overrideNativeMessages);
666
- var validityProps = ['customError','typeMismatch','rangeUnderflow','rangeOverflow','stepMismatch','tooLong','patternMismatch','valueMissing','valid'];
667
-
668
- var validityChanger = (overrideNativeMessages)? ['value', 'checked'] : ['value'];
669
- var validityElements = [];
670
- var testValidity = function(elem, init){
671
- if(!elem){return;}
672
- var type = (elem.getAttribute && elem.getAttribute('type') || elem.type || '').toLowerCase();
673
-
674
- if(!overrideNativeMessages && !typeModels[type]){
675
- return;
676
- }
677
-
678
- if(overrideNativeMessages && !init && type == 'radio' && elem.name){
679
- $(doc.getElementsByName( elem.name )).each(function(){
680
- $.prop(this, 'validity');
681
- });
682
- } else {
683
- $.prop(elem, 'validity');
684
- }
685
- };
686
-
687
- var oldSetCustomValidity = {};
688
- ['input', 'textarea', 'select'].forEach(function(name){
689
- var desc = webshims.defineNodeNameProperty(name, 'setCustomValidity', {
690
- prop: {
691
- value: function(error){
692
- error = error+'';
693
- var elem = (name == 'input') ? $(this).getNativeElement()[0] : this;
694
- desc.prop._supvalue.call(elem, error);
695
-
696
- if(webshims.bugs.validationMessage){
697
- webshims.data(elem, 'customvalidationMessage', error);
698
- }
699
- if(overrideValidity){
700
- webshims.data(elem, 'hasCustomError', !!(error));
701
- testValidity(elem);
702
- }
703
- }
704
- }
705
- });
706
- oldSetCustomValidity[name] = desc.prop._supvalue;
707
- });
708
-
709
-
710
- if(overrideValidity || overrideNativeMessages){
711
- validityChanger.push('min');
712
- validityChanger.push('max');
713
- validityChanger.push('step');
714
- validityElements.push('input');
715
- }
716
- if(overrideNativeMessages){
717
- validityChanger.push('required');
718
- validityChanger.push('pattern');
719
- validityElements.push('select');
720
- validityElements.push('textarea');
721
- }
722
-
723
- if(overrideValidity){
724
- var stopValidity;
725
- validityElements.forEach(function(nodeName){
726
-
727
- var oldDesc = webshims.defineNodeNameProperty(nodeName, 'validity', {
728
- prop: {
729
- get: function(){
730
- if(stopValidity){return;}
731
- var elem = (nodeName == 'input') ? $(this).getNativeElement()[0] : this;
732
-
733
- var validity = oldDesc.prop._supget.call(elem);
734
-
735
- if(!validity){
736
- return validity;
737
- }
738
- var validityState = {};
739
- validityProps.forEach(function(prop){
740
- validityState[prop] = validity[prop];
741
- });
742
-
743
- if( !$.prop(elem, 'willValidate') ){
744
- return validityState;
745
- }
746
- stopValidity = true;
747
- var jElm = $(elem),
748
- cache = {type: (elem.getAttribute && elem.getAttribute('type') || '').toLowerCase(), nodeName: (elem.nodeName || '').toLowerCase()},
749
- val = jElm.val(),
750
- customError = !!(webshims.data(elem, 'hasCustomError')),
751
- setCustomMessage
752
- ;
753
- stopValidity = false;
754
- validityState.customError = customError;
755
-
756
- if( validityState.valid && validityState.customError ){
757
- validityState.valid = false;
758
- } else if(!validityState.valid) {
759
- var allFalse = true;
760
- $.each(validityState, function(name, prop){
761
- if(prop){
762
- allFalse = false;
763
- return false;
764
- }
765
- });
766
-
767
- if(allFalse){
768
- validityState.valid = true;
769
- }
770
-
771
- }
772
-
773
- $.each(validityRules, function(rule, fn){
774
- validityState[rule] = fn(jElm, val, cache, validityState);
775
- if( validityState[rule] && (validityState.valid || !setCustomMessage) && (overrideNativeMessages || (typeModels[cache.type] && typeModels[cache.type].mismatch)) ) {
776
- oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, rule));
777
- validityState.valid = false;
778
- setCustomMessage = true;
779
- }
780
- });
781
- if(validityState.valid){
782
- oldSetCustomValidity[nodeName].call(elem, '');
783
- webshims.data(elem, 'hasCustomError', false);
784
- } else if(overrideNativeMessages && !setCustomMessage && !customError){
785
- $.each(validityState, function(name, prop){
786
- if(name !== 'valid' && prop){
787
- oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
788
- return false;
789
- }
790
- });
791
- }
792
- return validityState;
793
- },
794
- writeable: false
795
-
796
- }
797
- });
798
- });
799
-
800
- validityChanger.forEach(function(prop){
801
- webshims.onNodeNamesPropertyModify(validityElements, prop, function(s){
802
- testValidity(this);
803
- });
804
- });
805
-
806
- if(doc.addEventListener){
807
- var inputThrottle;
808
- var testPassValidity = function(e){
809
- if(!('form' in e.target)){return;}
810
- var form = e.target.form;
811
- clearTimeout(inputThrottle);
812
- testValidity(e.target);
813
- if(form && overrideNativeMessages){
814
- $('input', form).each(function(){
815
- if(this.type == 'password'){
816
- testValidity(this);
817
- }
818
- });
819
- }
820
- };
821
-
822
- doc.addEventListener('change', testPassValidity, true);
823
-
824
- if(overrideNativeMessages){
825
- doc.addEventListener('blur', testPassValidity, true);
826
- doc.addEventListener('keydown', function(e){
827
- if(e.keyCode != 13){return;}
828
- testPassValidity(e);
829
- }, true);
830
- }
831
-
832
- doc.addEventListener('input', function(e){
833
- clearTimeout(inputThrottle);
834
- inputThrottle = setTimeout(function(){
835
- testValidity(e.target);
836
- }, 290);
837
- }, true);
838
- }
839
-
840
- var validityElementsSel = validityElements.join(',');
841
-
842
- webshims.addReady(function(context, elem){
843
- $(validityElementsSel, context).add(elem.filter(validityElementsSel)).each(function(){
844
- $.prop(this, 'validity');
845
- });
846
- });
847
-
848
-
849
- if(overrideNativeMessages){
850
- webshims.ready('DOM form-message', function(){
851
- webshims.activeLang({
852
- register: 'form-core',
853
- callback: function(){
854
- $('input, select, textarea')
855
- .getNativeElement()
856
- .each(function(){
857
- if(webshims.data(this, 'hasCustomError')){return;}
858
- var elem = this;
859
- var validity = $.prop(elem, 'validity') || {valid: true};
860
- var nodeName;
861
- if(validity.valid){return;}
862
- nodeName = (elem.nodeName || '').toLowerCase();
863
- $.each(validity, function(name, prop){
864
- if(name !== 'valid' && prop){
865
- oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
866
- return false;
867
- }
868
- });
869
- })
870
- ;
871
- }
872
- });
873
- });
874
- }
875
-
876
- } //end: overrideValidity
877
-
878
- webshims.defineNodeNameProperty('input', 'type', {
879
- prop: {
880
- get: function(){
881
- var elem = this;
882
- var type = (elem.getAttribute('type') || '').toLowerCase();
883
- return (webshims.inputTypes[type]) ? type : elem.type;
884
- }
885
- }
886
- });
887
-
888
-
889
- });
890
- jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
891
- "use strict";
892
- var validityMessages = webshims.validityMessages;
893
-
894
- var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
895
-
896
- validityMessages['en'] = $.extend(true, {
897
- typeMismatch: {
898
- email: 'Please enter an email address.',
899
- url: 'Please enter a URL.',
900
- number: 'Please enter a number.',
901
- date: 'Please enter a date.',
902
- time: 'Please enter a time.',
903
- range: 'Invalid input.',
904
- "datetime-local": 'Please enter a datetime.'
905
- },
906
- rangeUnderflow: {
907
- defaultMessage: 'Value must be greater than or equal to {%min}.'
908
- },
909
- rangeOverflow: {
910
- defaultMessage: 'Value must be less than or equal to {%max}.'
911
- },
912
- stepMismatch: 'Invalid input.',
913
- tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
914
-
915
- patternMismatch: 'Invalid input. {%title}',
916
- valueMissing: {
917
- defaultMessage: 'Please fill out this field.',
918
- checkbox: 'Please check this box if you want to proceed.'
919
- }
920
- }, (validityMessages['en'] || validityMessages['en-US'] || {}));
921
-
922
-
923
- ['select', 'radio'].forEach(function(type){
924
- if(typeof validityMessages['en'].valueMissing == 'object'){
925
- validityMessages['en'].valueMissing[type] = 'Please select an option.';
926
- }
927
- });
928
-
929
- ['date', 'time', 'datetime-local'].forEach(function(type){
930
- if(typeof validityMessages['en'].rangeUnderflow == 'object'){
931
- validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
932
- }
933
- });
934
- ['date', 'time', 'datetime-local'].forEach(function(type){
935
- if(typeof validityMessages['en'].rangeOverflow == 'object'){
936
- validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
937
- }
938
- });
939
-
940
- validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en'];
941
- validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
942
-
943
- validityMessages['de'] = $.extend(true, {
944
- typeMismatch: {
945
- email: '{%value} ist keine zulässige E-Mail-Adresse',
946
- url: '{%value} ist keine zulässige Webadresse',
947
- number: '{%value} ist keine Nummer!',
948
- date: '{%value} ist kein Datum',
949
- time: '{%value} ist keine Uhrzeit',
950
- range: '{%value} ist keine Nummer!',
951
- "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
952
- },
953
- rangeUnderflow: {
954
- defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.'
955
- },
956
- rangeOverflow: {
957
- defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.'
958
- },
959
- stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
960
- tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
961
- patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}',
962
- valueMissing: {
963
- defaultMessage: 'Bitte geben Sie einen Wert ein',
964
- checkbox: 'Bitte aktivieren Sie das Kästchen'
965
- }
966
- }, (validityMessages['de'] || {}));
967
-
968
- ['select', 'radio'].forEach(function(type){
969
- if(typeof validityMessages['de'].valueMissing == 'object'){
970
- validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus';
971
- }
972
- });
973
-
974
- ['date', 'time', 'datetime-local'].forEach(function(type){
975
- if(typeof validityMessages['de'].rangeUnderflow == 'object'){
976
- validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
977
- }
978
- });
979
- ['date', 'time', 'datetime-local'].forEach(function(type){
980
- if(typeof validityMessages['de'].rangeOverflow == 'object'){
981
- validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
982
- }
983
- });
984
-
985
- var currentValidationMessage = validityMessages[''];
986
-
987
-
988
- webshims.createValidationMessage = function(elem, name){
989
- var message = currentValidationMessage[name];
990
- if(message && typeof message !== 'string'){
991
- message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
992
- }
993
- if(message){
994
- ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
995
- if(message.indexOf('{%'+attr) === -1){return;}
996
- var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || '';
997
- if(name == 'patternMismatch' && attr == 'title' && !val){
998
- webshims.error('no title for patternMismatch provided. Always add a title attribute.');
999
- }
1000
- message = message.replace('{%'+ attr +'}', val);
1001
- if('value' == attr){
1002
- message = message.replace('{%valueLen}', val.length);
1003
- }
1004
- });
1005
- }
1006
- return message || '';
1007
- };
1008
-
1009
-
1010
- if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
1011
- implementProperties.push('validationMessage');
1012
- }
1013
-
1014
- webshims.activeLang({
1015
- langObj: validityMessages,
1016
- module: 'form-core',
1017
- callback: function(langObj){
1018
- currentValidationMessage = langObj;
1019
- }
1020
- });
1021
-
1022
- implementProperties.forEach(function(messageProp){
1023
- webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, {
1024
- prop: {
1025
- value: '',
1026
- writeable: false
1027
- }
1028
- });
1029
- ['input', 'select', 'textarea'].forEach(function(nodeName){
1030
- var desc = webshims.defineNodeNameProperty(nodeName, messageProp, {
1031
- prop: {
1032
- get: function(){
1033
- var elem = this;
1034
- var message = '';
1035
- if(!$.prop(elem, 'willValidate')){
1036
- return message;
1037
- }
1038
-
1039
- var validity = $.prop(elem, 'validity') || {valid: 1};
1040
-
1041
- if(validity.valid){return message;}
1042
- message = webshims.getContentValidationMessage(elem, validity);
1043
-
1044
- if(message){return message;}
1045
-
1046
- if(validity.customError && elem.nodeName){
1047
- message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage');
1048
- if(message){return message;}
1049
- }
1050
- $.each(validity, function(name, prop){
1051
- if(name == 'valid' || !prop){return;}
1052
-
1053
- message = webshims.createValidationMessage(elem, name);
1054
- if(message){
1055
- return false;
1056
- }
1057
- });
1058
- return message || '';
1059
- },
1060
- writeable: false
1061
- }
1062
- });
1063
- });
1064
-
1065
- });
1066
- });
1067
- jQuery.webshims.register('form-datalist', function($, webshims, window, document, undefined){
1068
- "use strict";
1069
- var doc = document;
1070
-
1071
- /*
1072
- * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
1073
- */
1074
- webshims.propTypes.element = function(descs){
1075
- webshims.createPropDefault(descs, 'attr');
1076
- if(descs.prop){return;}
1077
- descs.prop = {
1078
- get: function(){
1079
- var elem = descs.attr.get.call(this);
1080
- if(elem){
1081
- elem = document.getElementById(elem);
1082
- if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
1083
- elem = null;
1084
- }
1085
- }
1086
- return elem || null;
1087
- },
1088
- writeable: false
1089
- };
1090
- };
1091
-
1092
-
1093
- /*
1094
- * Implements datalist element and list attribute
1095
- */
1096
-
1097
- (function(){
1098
- var formsCFG = $.webshims.cfg.forms;
1099
- var listSupport = Modernizr.input.list;
1100
- if(listSupport && !formsCFG.customDatalist){return;}
1101
-
1102
- var initializeDatalist = function(){
1103
-
1104
-
1105
- if(!listSupport){
1106
- webshims.defineNodeNameProperty('datalist', 'options', {
1107
- prop: {
1108
- writeable: false,
1109
- get: function(){
1110
- var elem = this;
1111
- var select = $('select', elem);
1112
- var options;
1113
- if(select[0]){
1114
- options = select[0].options;
1115
- } else {
1116
- options = $('option', elem).get();
1117
- if(options.length){
1118
- webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
1119
- }
1120
- }
1121
- return options;
1122
- }
1123
- }
1124
- });
1125
- }
1126
-
1127
- var inputListProto = {
1128
- //override autocomplete
1129
- autocomplete: {
1130
- attr: {
1131
- get: function(){
1132
- var elem = this;
1133
- var data = $.data(elem, 'datalistWidget');
1134
- if(data){
1135
- return data._autocomplete;
1136
- }
1137
- return ('autocomplete' in elem) ? elem.autocomplete : elem.getAttribute('autocomplete');
1138
- },
1139
- set: function(value){
1140
- var elem = this;
1141
- var data = $.data(elem, 'datalistWidget');
1142
- if(data){
1143
- data._autocomplete = value;
1144
- if(value == 'off'){
1145
- data.hideList();
1146
- }
1147
- } else {
1148
- if('autocomplete' in elem){
1149
- elem.autocomplete = value;
1150
- } else {
1151
- elem.setAttribute('autocomplete', value);
1152
- }
1153
- }
1154
- }
1155
- }
1156
- }
1157
- };
1158
-
1159
- // if(formsCFG.customDatalist && (!listSupport || !('selectedOption') in $('<input />')[0])){
1160
- // //currently not supported x-browser (FF4 has not implemented and is not polyfilled )
1161
- // inputListProto.selectedOption = {
1162
- // prop: {
1163
- // writeable: false,
1164
- // get: function(){
1165
- // var elem = this;
1166
- // var list = $.prop(elem, 'list');
1167
- // var ret = null;
1168
- // var value, options;
1169
- // if(!list){return ret;}
1170
- // value = $.prop(elem, 'value');
1171
- // if(!value){return ret;}
1172
- // options = $.prop(list, 'options');
1173
- // if(!options.length){return ret;}
1174
- // $.each(options, function(i, option){
1175
- // if(value == $.prop(option, 'value')){
1176
- // ret = option;
1177
- // return false;
1178
- // }
1179
- // });
1180
- // return ret;
1181
- // }
1182
- // }
1183
- // };
1184
- // }
1185
-
1186
- if(!listSupport){
1187
- inputListProto['list'] = {
1188
- attr: {
1189
- get: function(){
1190
- var val = webshims.contentAttr(this, 'list');
1191
- return (val == null) ? undefined : val;
1192
- },
1193
- set: function(value){
1194
- var elem = this;
1195
- webshims.contentAttr(elem, 'list', value);
1196
- webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
1197
- }
1198
- },
1199
- initAttr: true,
1200
- reflect: true,
1201
- propType: 'element',
1202
- propNodeName: 'datalist'
1203
- };
1204
- } else {
1205
- //options only return options, if option-elements are rooted: but this makes this part of HTML5 less backwards compatible
1206
- if(!($('<datalist><select><option></option></select></datalist>').prop('options') || []).length ){
1207
- webshims.defineNodeNameProperty('datalist', 'options', {
1208
- prop: {
1209
- writeable: false,
1210
- get: function(){
1211
- var options = this.options || [];
1212
- if(!options.length){
1213
- var elem = this;
1214
- var select = $('select', elem);
1215
- if(select[0] && select[0].options && select[0].options.length){
1216
- options = select[0].options;
1217
- }
1218
- }
1219
- return options;
1220
- }
1221
- }
1222
- });
1223
- }
1224
- inputListProto['list'] = {
1225
- attr: {
1226
- get: function(){
1227
- var val = webshims.contentAttr(this, 'list');
1228
- if(val != null){
1229
- this.removeAttribute('list');
1230
- } else {
1231
- val = $.data(this, 'datalistListAttr');
1232
- }
1233
-
1234
- return (val == null) ? undefined : val;
1235
- },
1236
- set: function(value){
1237
- var elem = this;
1238
- $.data(elem, 'datalistListAttr', value);
1239
- webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
1240
- }
1241
- },
1242
- initAttr: true,
1243
- reflect: true,
1244
- propType: 'element',
1245
- propNodeName: 'datalist'
1246
- };
1247
- }
1248
-
1249
-
1250
- webshims.defineNodeNameProperties('input', inputListProto);
1251
-
1252
- if($.event.customEvent){
1253
- $.event.customEvent.updateDatalist = true;
1254
- $.event.customEvent.updateInput = true;
1255
- $.event.customEvent.datalistselect = true;
1256
- }
1257
- webshims.addReady(function(context, contextElem){
1258
- contextElem
1259
- .filter('datalist > select, datalist, datalist > option, datalist > select > option')
1260
- .closest('datalist')
1261
- .triggerHandler('updateDatalist')
1262
- ;
1263
-
1264
- });
1265
-
1266
-
1267
- };
1268
-
1269
-
1270
- /*
1271
- * ShadowList
1272
- */
1273
- var listidIndex = 0;
1274
-
1275
- var noDatalistSupport = {
1276
- submit: 1,
1277
- button: 1,
1278
- reset: 1,
1279
- hidden: 1,
1280
-
1281
- //ToDo
1282
- range: 1,
1283
- date: 1
1284
- };
1285
- var globStoredOptions = {};
1286
- var getStoredOptions = function(name){
1287
- if(!name){return [];}
1288
- if(globStoredOptions[name]){
1289
- return globStoredOptions[name];
1290
- }
1291
- var data;
1292
- try {
1293
- data = JSON.parse(localStorage.getItem('storedDatalistOptions'+name));
1294
- } catch(e){}
1295
- globStoredOptions[name] = data || [];
1296
- return data || [];
1297
- };
1298
- var storeOptions = function(name, val){
1299
- if(!name){return;}
1300
- val = val || [];
1301
- try {
1302
- localStorage.setItem( 'storedDatalistOptions'+name, JSON.stringify(val) );
1303
- } catch(e){}
1304
- };
1305
-
1306
- var getText = function(elem){
1307
- return (elem.textContent || elem.innerText || $.text([ elem ]) || '');
1308
- };
1309
-
1310
- var shadowListProto = {
1311
- _create: function(opts){
1312
-
1313
- if(noDatalistSupport[$.prop(opts.input, 'type')]){return;}
1314
- var datalist = opts.datalist;
1315
- var data = $.data(opts.input, 'datalistWidget');
1316
- if(datalist && data && data.datalist !== datalist){
1317
- data.datalist = datalist;
1318
- data.id = opts.id;
1319
-
1320
- data.shadowList.prop('className', 'datalist-polyfill '+ (data.datalist.className || '') + ' '+ data.datalist.id +'-shadowdom');
1321
- if(formsCFG.positionDatalist){
1322
- data.shadowList.insertAfter(opts.input);
1323
- } else {
1324
- data.shadowList.appendTo('body');
1325
- }
1326
- $(data.datalist)
1327
- .off('updateDatalist.datalistWidget')
1328
- .on('updateDatalist.datalistWidget', $.proxy(data, '_resetListCached'))
1329
- ;
1330
- data._resetListCached();
1331
- return;
1332
- } else if(!datalist){
1333
- if(data){
1334
- data.destroy();
1335
- }
1336
- return;
1337
- } else if(data && data.datalist === datalist){
1338
- return;
1339
- }
1340
- listidIndex++;
1341
- var that = this;
1342
- this.hideList = $.proxy(that, 'hideList');
1343
- this.timedHide = function(){
1344
- clearTimeout(that.hideTimer);
1345
- that.hideTimer = setTimeout(that.hideList, 9);
1346
- };
1347
- this.datalist = datalist;
1348
- this.id = opts.id;
1349
- this.hasViewableData = true;
1350
- this._autocomplete = $.attr(opts.input, 'autocomplete');
1351
- $.data(opts.input, 'datalistWidget', this);
1352
- this.shadowList = $('<div class="datalist-polyfill '+ (this.datalist.className || '') + ' '+ this.datalist.id +'-shadowdom' +'" />');
1353
-
1354
- if(formsCFG.positionDatalist || $(opts.input).hasClass('position-datalist')){
1355
- this.shadowList.insertAfter(opts.input);
1356
- } else {
1357
- this.shadowList.appendTo('body');
1358
- }
1359
-
1360
- this.index = -1;
1361
- this.input = opts.input;
1362
- this.arrayOptions = [];
1363
-
1364
- this.shadowList
1365
- .delegate('li', 'mouseenter.datalistWidget mousedown.datalistWidget click.datalistWidget', function(e){
1366
- var items = $('li:not(.hidden-item)', that.shadowList);
1367
- var select = (e.type == 'mousedown' || e.type == 'click');
1368
- that.markItem(items.index(e.currentTarget), select, items);
1369
- if(e.type == 'click'){
1370
- that.hideList();
1371
- if(formsCFG.customDatalist){
1372
- $(opts.input).trigger('datalistselect');
1373
- }
1374
- }
1375
- return (e.type != 'mousedown');
1376
- })
1377
- .on('focusout', this.timedHide)
1378
- ;
1379
-
1380
- opts.input.setAttribute('autocomplete', 'off');
1381
-
1382
- $(opts.input)
1383
- .attr({
1384
- //role: 'combobox',
1385
- 'aria-haspopup': 'true'
1386
- })
1387
- .on({
1388
- 'input.datalistWidget': function(){
1389
- if(!that.triggeredByDatalist){
1390
- that.changedValue = false;
1391
- that.showHideOptions();
1392
- }
1393
- },
1394
- 'keydown.datalistWidget': function(e){
1395
- var keyCode = e.keyCode;
1396
- var activeItem;
1397
- var items;
1398
- if(keyCode == 40 && !that.showList()){
1399
- that.markItem(that.index + 1, true);
1400
- return false;
1401
- }
1402
-
1403
- if(!that.isListVisible){return;}
1404
-
1405
-
1406
- if(keyCode == 38){
1407
- that.markItem(that.index - 1, true);
1408
- return false;
1409
- }
1410
- if(!e.shiftKey && (keyCode == 33 || keyCode == 36)){
1411
- that.markItem(0, true);
1412
- return false;
1413
- }
1414
- if(!e.shiftKey && (keyCode == 34 || keyCode == 35)){
1415
- items = $('li:not(.hidden-item)', that.shadowList);
1416
- that.markItem(items.length - 1, true, items);
1417
- return false;
1418
- }
1419
- if(keyCode == 13 || keyCode == 27){
1420
- if (keyCode == 13){
1421
- activeItem = $('li.active-item:not(.hidden-item)', that.shadowList);
1422
- that.changeValue( $('li.active-item:not(.hidden-item)', that.shadowList) );
1423
- }
1424
- that.hideList();
1425
- if(formsCFG.customDatalist && activeItem && activeItem[0]){
1426
- $(opts.input).trigger('datalistselect');
1427
- }
1428
- return false;
1429
- }
1430
- },
1431
- 'focus.datalistWidget': function(){
1432
- if($(this).hasClass('list-focus')){
1433
- that.showList();
1434
- }
1435
- },
1436
- 'mousedown.datalistWidget': function(){
1437
- if($(this).is(':focus')){
1438
- that.showList();
1439
- }
1440
- },
1441
- 'blur.datalistWidget': this.timedHide
1442
- })
1443
- ;
1444
-
1445
-
1446
- $(this.datalist)
1447
- .off('updateDatalist.datalistWidget')
1448
- .on('updateDatalist.datalistWidget', $.proxy(this, '_resetListCached'))
1449
- ;
1450
-
1451
- this._resetListCached();
1452
-
1453
- if(opts.input.form && (opts.input.name || opts.input.id)){
1454
- $(opts.input.form).on('submit.datalistWidget'+opts.input.id, function(){
1455
- if(!$(opts.input).hasClass('no-datalist-cache') && that._autocomplete != 'off'){
1456
- var val = $.prop(opts.input, 'value');
1457
- var name = (opts.input.name || opts.input.id) + $.prop(opts.input, 'type');
1458
- if(!that.storedOptions){
1459
- that.storedOptions = getStoredOptions( name );
1460
- }
1461
- if(val && that.storedOptions.indexOf(val) == -1){
1462
- that.storedOptions.push(val);
1463
- storeOptions(name, that.storedOptions );
1464
- }
1465
- }
1466
- });
1467
- }
1468
- $(window).on('unload.datalist'+this.id+' beforeunload.datalist'+this.id, function(){
1469
- that.destroy();
1470
- });
1471
- },
1472
- destroy: function(){
1473
- var autocomplete = $.attr(this.input, 'autocomplete');
1474
- $(this.input)
1475
- .off('.datalistWidget')
1476
- .removeData('datalistWidget')
1477
- ;
1478
- this.shadowList.remove();
1479
- $(document).off('.datalist'+this.id);
1480
- $(window).off('.datalist'+this.id);
1481
- if(this.input.form && this.input.id){
1482
- $(this.input.form).off('submit.datalistWidget'+this.input.id);
1483
- }
1484
- this.input.removeAttribute('aria-haspopup');
1485
- if(autocomplete === undefined){
1486
- this.input.removeAttribute('autocomplete');
1487
- } else {
1488
- $(this.input).attr('autocomplete', autocomplete);
1489
- }
1490
- },
1491
- _resetListCached: function(e){
1492
- var that = this;
1493
- var forceShow;
1494
- this.needsUpdate = true;
1495
- this.lastUpdatedValue = false;
1496
- this.lastUnfoundValue = '';
1497
-
1498
- if(!this.updateTimer){
1499
- if(window.QUnit || (forceShow = (e && document.activeElement == that.input))){
1500
- that.updateListOptions(forceShow);
1501
- } else {
1502
- webshims.ready('WINDOWLOAD', function(){
1503
- that.updateTimer = setTimeout(function(){
1504
- that.updateListOptions();
1505
- that = null;
1506
- listidIndex = 1;
1507
- }, 200 + (100 * listidIndex));
1508
- });
1509
- }
1510
- }
1511
- },
1512
- maskHTML: function(str){
1513
- return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
1514
- },
1515
- updateListOptions: function(_forceShow){
1516
- this.needsUpdate = false;
1517
- clearTimeout(this.updateTimer);
1518
- this.updateTimer = false;
1519
- this.shadowList
1520
- .css({
1521
- fontSize: $.css(this.input, 'fontSize'),
1522
- fontFamily: $.css(this.input, 'fontFamily')
1523
- })
1524
- ;
1525
- this.searchStart = formsCFG.customDatalist && $(this.input).hasClass('search-start');
1526
-
1527
- var list = [];
1528
-
1529
- var values = [];
1530
- var allOptions = [];
1531
- var rElem, rItem, rOptions, rI, rLen, item;
1532
- for(rOptions = $.prop(this.datalist, 'options'), rI = 0, rLen = rOptions.length; rI < rLen; rI++){
1533
- rElem = rOptions[rI];
1534
- if(rElem.disabled){return;}
1535
- rItem = {
1536
- value: $(rElem).val() || '',
1537
- text: $.trim($.attr(rElem, 'label') || getText(rElem)),
1538
- className: rElem.className || '',
1539
- style: $.attr(rElem, 'style') || ''
1540
- };
1541
- if(!rItem.text){
1542
- rItem.text = rItem.value;
1543
- } else if(rItem.text != rItem.value){
1544
- rItem.className += ' different-label-value';
1545
- }
1546
- values[rI] = rItem.value;
1547
- allOptions[rI] = rItem;
1548
- }
1549
-
1550
- if(!this.storedOptions){
1551
- this.storedOptions = ($(this.input).hasClass('no-datalist-cache') || this._autocomplete == 'off') ? [] : getStoredOptions((this.input.name || this.input.id) + $.prop(this.input, 'type'));
1552
- }
1553
-
1554
- this.storedOptions.forEach(function(val, i){
1555
- if(values.indexOf(val) == -1){
1556
- allOptions.push({value: val, text: val, className: 'stored-suggest', style: ''});
1557
- }
1558
- });
1559
-
1560
- for(rI = 0, rLen = allOptions.length; rI < rLen; rI++){
1561
- item = allOptions[rI];
1562
- list[rI] = '<li class="'+ item.className +'" style="'+ item.style +'" tabindex="-1" role="listitem"><span class="option-label">'+ this.maskHTML(item.text) +'</span> <span class="option-value">'+ this.maskHTML(item.value) +'</span></li>';
1563
- }
1564
-
1565
- this.arrayOptions = allOptions;
1566
- this.shadowList.html('<div class="datalist-outer-box"><div class="datalist-box"><ul role="list">'+ list.join("\n") +'</ul></div></div>');
1567
-
1568
- if($.fn.bgIframe){
1569
- this.shadowList.bgIframe();
1570
- }
1571
-
1572
- if(_forceShow || this.isListVisible){
1573
- this.showHideOptions();
1574
- }
1575
- },
1576
- showHideOptions: function(_fromShowList){
1577
- var value = $.prop(this.input, 'value').toLowerCase();
1578
- //first check prevent infinite loop, second creates simple lazy optimization
1579
- if(value === this.lastUpdatedValue || (this.lastUnfoundValue && value.indexOf(this.lastUnfoundValue) === 0)){
1580
- return;
1581
- }
1582
-
1583
- this.lastUpdatedValue = value;
1584
- var found = false;
1585
- var startSearch = this.searchStart;
1586
- var lis = $('li', this.shadowList);
1587
- if(value){
1588
- this.arrayOptions.forEach(function(item, i){
1589
- var search;
1590
- if(!('lowerText' in item)){
1591
- if(item.text != item.value){
1592
- item.lowerText = item.value.toLowerCase() + item.text.toLowerCase();
1593
- } else {
1594
- item.lowerText = item.text.toLowerCase();
1595
- }
1596
- }
1597
- search = item.lowerText.indexOf(value);
1598
- search = startSearch ? !search : search !== -1;
1599
- if(search){
1600
- $(lis[i]).removeClass('hidden-item');
1601
- found = true;
1602
- } else {
1603
- $(lis[i]).addClass('hidden-item');
1604
- }
1605
- });
1606
- } else if(lis.length) {
1607
- lis.removeClass('hidden-item');
1608
- found = true;
1609
- }
1610
-
1611
- this.hasViewableData = found;
1612
- if(!_fromShowList && found){
1613
- this.showList();
1614
- }
1615
- if(!found){
1616
- this.lastUnfoundValue = value;
1617
- this.hideList();
1618
- }
1619
- },
1620
- setPos: function(){
1621
- this.shadowList.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0});
1622
- var css = (formsCFG.positionDatalist) ? $(this.input).position() : webshims.getRelOffset(this.shadowList, this.input);
1623
- css.top += $(this.input).outerHeight();
1624
- css.width = $(this.input).outerWidth() - (parseInt(this.shadowList.css('borderLeftWidth'), 10) || 0) - (parseInt(this.shadowList.css('borderRightWidth'), 10) || 0);
1625
- this.shadowList.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(css);
1626
- return css;
1627
- },
1628
- showList: function(){
1629
- if(this.isListVisible){return false;}
1630
- if(this.needsUpdate){
1631
- this.updateListOptions();
1632
- }
1633
- this.showHideOptions(true);
1634
- if(!this.hasViewableData){return false;}
1635
- this.isListVisible = true;
1636
- var that = this;
1637
-
1638
- that.setPos();
1639
- that.shadowList.addClass('datalist-visible').find('li.active-item').removeClass('active-item');
1640
-
1641
- $(window).unbind('.datalist'+that.id);
1642
- $(document)
1643
- .off('.datalist'+that.id)
1644
- .on('mousedown.datalist'+that.id +' focusin.datalist'+that.id, function(e){
1645
- if(e.target === that.input || that.shadowList[0] === e.target || $.contains( that.shadowList[0], e.target )){
1646
- clearTimeout(that.hideTimer);
1647
- setTimeout(function(){
1648
- clearTimeout(that.hideTimer);
1649
- }, 9);
1650
- } else {
1651
- that.timedHide();
1652
- }
1653
- })
1654
- .on('updateshadowdom.datalist'+that.id, function(){
1655
- that.setPos();
1656
- })
1657
- ;
1658
- return true;
1659
- },
1660
- hideList: function(){
1661
- if(!this.isListVisible){return false;}
1662
- var that = this;
1663
- var triggerChange = function(e){
1664
- if(that.changedValue){
1665
- $(that.input).trigger('change');
1666
- }
1667
- that.changedValue = false;
1668
- };
1669
-
1670
- that.shadowList.removeClass('datalist-visible list-item-active');
1671
- that.index = -1;
1672
- that.isListVisible = false;
1673
- if(that.changedValue){
1674
- that.triggeredByDatalist = true;
1675
- webshims.triggerInlineForm && webshims.triggerInlineForm(that.input, 'input');
1676
- if($(that.input).is(':focus')){
1677
- $(that.input).one('blur', triggerChange);
1678
- } else {
1679
- triggerChange();
1680
- }
1681
- that.triggeredByDatalist = false;
1682
- }
1683
- $(document).unbind('.datalist'+that.id);
1684
- $(window)
1685
- .off('.datalist'+that.id)
1686
- .one('resize.datalist'+that.id, function(){
1687
- that.shadowList.css({top: 0, left: 0});
1688
- })
1689
- ;
1690
- return true;
1691
- },
1692
- scrollIntoView: function(elem){
1693
- var ul = $('ul', this.shadowList);
1694
- var div = $('div.datalist-box', this.shadowList);
1695
- var elemPos = elem.position();
1696
- var containerHeight;
1697
- elemPos.top -= (parseInt(ul.css('paddingTop'), 10) || 0) + (parseInt(ul.css('marginTop'), 10) || 0) + (parseInt(ul.css('borderTopWidth'), 10) || 0);
1698
- if(elemPos.top < 0){
1699
- div.scrollTop( div.scrollTop() + elemPos.top - 2);
1700
- return;
1701
- }
1702
- elemPos.top += elem.outerHeight();
1703
- containerHeight = div.height();
1704
- if(elemPos.top > containerHeight){
1705
- div.scrollTop( div.scrollTop() + (elemPos.top - containerHeight) + 2);
1706
- }
1707
- },
1708
- changeValue: function(activeItem){
1709
- if(!activeItem[0]){return;}
1710
- var newValue = $('span.option-value', activeItem).text();
1711
- var oldValue = $.prop(this.input, 'value');
1712
- if(newValue != oldValue){
1713
- $(this.input)
1714
- .prop('value', newValue)
1715
- .triggerHandler('updateInput')
1716
- ;
1717
- this.changedValue = true;
1718
- }
1719
- },
1720
- markItem: function(index, doValue, items){
1721
- var activeItem;
1722
- var goesUp;
1723
-
1724
- items = items || $('li:not(.hidden-item)', this.shadowList);
1725
- if(!items.length){return;}
1726
- if(index < 0){
1727
- index = items.length - 1;
1728
- } else if(index >= items.length){
1729
- index = 0;
1730
- }
1731
- items.removeClass('active-item');
1732
- this.shadowList.addClass('list-item-active');
1733
- activeItem = items.filter(':eq('+ index +')').addClass('active-item');
1734
-
1735
- if(doValue){
1736
- this.changeValue(activeItem);
1737
- this.scrollIntoView(activeItem);
1738
- }
1739
- this.index = index;
1740
- }
1741
- };
1742
-
1743
- //init datalist update
1744
- initializeDatalist();
1745
- })();
1746
-
1747
- });