webshims-rails 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/lib/webshims-rails.rb +1 -1
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/readme.textile +5 -3
  4. data/vendor/assets/javascripts/webshims/dev/extras/custom-validity.js +261 -0
  5. data/vendor/assets/javascripts/webshims/dev/extras/modernizr-custom.js +535 -0
  6. data/vendor/assets/javascripts/webshims/dev/extras/mousepress.js +60 -0
  7. data/vendor/assets/javascripts/webshims/dev/polyfiller.js +1171 -0
  8. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/README +62 -0
  9. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/canvas2png.js +42 -0
  10. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.js +28 -0
  11. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/proxy.php +73 -0
  13. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/save.php +49 -0
  14. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/README +82 -0
  15. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/canvas2png.js +42 -0
  16. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  18. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flashcanvas.js +31 -0
  19. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/proxy.php +73 -0
  20. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/save.php +49 -0
  21. data/vendor/assets/javascripts/webshims/dev/shims/combos/1.js +1710 -0
  22. data/vendor/assets/javascripts/webshims/dev/shims/combos/10.js +3317 -0
  23. data/vendor/assets/javascripts/webshims/dev/shims/combos/11.js +1585 -0
  24. data/vendor/assets/javascripts/webshims/dev/shims/combos/12.js +1587 -0
  25. data/vendor/assets/javascripts/webshims/dev/shims/combos/13.js +1054 -0
  26. data/vendor/assets/javascripts/webshims/dev/shims/combos/14.js +476 -0
  27. data/vendor/assets/javascripts/webshims/dev/shims/combos/15.js +314 -0
  28. data/vendor/assets/javascripts/webshims/dev/shims/combos/16.js +2101 -0
  29. data/vendor/assets/javascripts/webshims/dev/shims/combos/17.js +2264 -0
  30. data/vendor/assets/javascripts/webshims/dev/shims/combos/18.js +2161 -0
  31. data/vendor/assets/javascripts/webshims/dev/shims/combos/19.js +2244 -0
  32. data/vendor/assets/javascripts/webshims/dev/shims/combos/2.js +2294 -0
  33. data/vendor/assets/javascripts/webshims/dev/shims/combos/20.js +1607 -0
  34. data/vendor/assets/javascripts/webshims/dev/shims/combos/21.js +1635 -0
  35. data/vendor/assets/javascripts/webshims/dev/shims/combos/22.js +2409 -0
  36. data/vendor/assets/javascripts/webshims/dev/shims/combos/23.js +2168 -0
  37. data/vendor/assets/javascripts/webshims/dev/shims/combos/24.js +2777 -0
  38. data/vendor/assets/javascripts/webshims/dev/shims/combos/25.js +2204 -0
  39. data/vendor/assets/javascripts/webshims/dev/shims/combos/26.js +2863 -0
  40. data/vendor/assets/javascripts/webshims/dev/shims/combos/27.js +4079 -0
  41. data/vendor/assets/javascripts/webshims/dev/shims/combos/3.js +2971 -0
  42. data/vendor/assets/javascripts/webshims/dev/shims/combos/4.js +823 -0
  43. data/vendor/assets/javascripts/webshims/dev/shims/combos/5.js +1078 -0
  44. data/vendor/assets/javascripts/webshims/dev/shims/combos/59.js +1754 -0
  45. data/vendor/assets/javascripts/webshims/dev/shims/combos/6.js +1230 -0
  46. data/vendor/assets/javascripts/webshims/dev/shims/combos/7.js +1485 -0
  47. data/vendor/assets/javascripts/webshims/dev/shims/combos/8.js +1442 -0
  48. data/vendor/assets/javascripts/webshims/dev/shims/combos/9.js +2515 -0
  49. data/vendor/assets/javascripts/webshims/dev/shims/details.js +146 -0
  50. data/vendor/assets/javascripts/webshims/dev/shims/dom-extend.js +908 -0
  51. data/vendor/assets/javascripts/webshims/dev/shims/es5.js +802 -0
  52. data/vendor/assets/javascripts/webshims/dev/shims/excanvas.js +924 -0
  53. data/vendor/assets/javascripts/webshims/dev/shims/form-core.js +660 -0
  54. data/vendor/assets/javascripts/webshims/dev/shims/form-datalist.js +677 -0
  55. data/vendor/assets/javascripts/webshims/dev/shims/form-message.js +164 -0
  56. data/vendor/assets/javascripts/webshims/dev/shims/form-native-extend.js +256 -0
  57. data/vendor/assets/javascripts/webshims/dev/shims/form-native-fix.js +261 -0
  58. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-api.js +384 -0
  59. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-ui.js +847 -0
  60. data/vendor/assets/javascripts/webshims/dev/shims/form-shim-extend.js +1472 -0
  61. data/vendor/assets/javascripts/webshims/dev/shims/geolocation.js +168 -0
  62. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ar.js +32 -0
  63. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ch-ZN.js +32 -0
  64. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-de.txt +33 -0
  65. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-el.js +32 -0
  66. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-en.txt +34 -0
  67. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-es.js +32 -0
  68. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-fr.js +32 -0
  69. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-he.js +32 -0
  70. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hi.js +32 -0
  71. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hu.js +32 -0
  72. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-it.js +32 -0
  73. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ja.js +32 -0
  74. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-nl.js +32 -0
  75. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-pt-PT.js +32 -0
  76. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ru.js +32 -0
  77. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-sv.js +32 -0
  78. data/vendor/assets/javascripts/webshims/dev/shims/json-storage.js +308 -0
  79. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/license.txt +1 -0
  80. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/player.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/readme.html +87 -0
  82. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-core.js +534 -0
  83. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-native-fix.js +99 -0
  84. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-swf.js +1074 -0
  85. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-yt.js +543 -0
  86. data/vendor/assets/javascripts/webshims/dev/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/dev/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/dev/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/dev/shims/styles/shim.css +677 -0
  90. data/vendor/assets/javascripts/webshims/dev/shims/swf/jwwebshims.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/dev/shims/swf/localStorage.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/dev/shims/track-ui.js +292 -0
  93. data/vendor/assets/javascripts/webshims/dev/shims/track.js +763 -0
  94. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +20 -20
  95. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +29 -29
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +37 -33
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +83 -76
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +44 -42
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -38
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +27 -25
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +60 -55
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +68 -64
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +60 -59
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +66 -64
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +74 -69
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +46 -43
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -47
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +61 -57
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +68 -60
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +82 -77
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +58 -0
  112. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +80 -0
  113. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +103 -0
  114. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +96 -91
  115. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +30 -31
  116. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +37 -39
  117. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +59 -61
  118. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +31 -29
  119. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +38 -37
  120. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +38 -33
  121. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +68 -63
  122. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +22 -20
  123. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +15 -14
  124. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +22 -22
  125. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +22 -22
  126. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +8 -9
  127. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +7 -8
  128. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +23 -21
  129. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +44 -33
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +3 -0
  131. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  132. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +86 -86
  133. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +16 -13
  134. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +30 -30
  135. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +14 -0
  136. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +71 -10
  137. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -0
  138. data/vendor/assets/javascripts/webshims/minified/shims/track.js +20 -0
  139. metadata +101 -5
  140. data/vendor/assets/javascripts/webshims/minified/shims/form-output.js +0 -5
@@ -0,0 +1,2161 @@
1
+ jQuery.webshims.register('form-datalist', function($, webshims, window, document, undefined){
2
+ var doc = document;
3
+
4
+ /*
5
+ * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
6
+ */
7
+ webshims.propTypes.element = function(descs){
8
+ webshims.createPropDefault(descs, 'attr');
9
+ if(descs.prop){return;}
10
+ descs.prop = {
11
+ get: function(){
12
+ var elem = descs.attr.get.call(this);
13
+ if(elem){
14
+ elem = document.getElementById(elem);
15
+ if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
16
+ elem = null;
17
+ }
18
+ }
19
+ return elem || null;
20
+ },
21
+ writeable: false
22
+ };
23
+ };
24
+
25
+
26
+ /*
27
+ * Implements datalist element and list attribute
28
+ */
29
+
30
+ (function(){
31
+ var formsCFG = $.webshims.cfg.forms;
32
+ var listSupport = Modernizr.input.list;
33
+ if(listSupport && !formsCFG.customDatalist){return;}
34
+
35
+ var initializeDatalist = function(){
36
+
37
+
38
+ if(!listSupport){
39
+ webshims.defineNodeNameProperty('datalist', 'options', {
40
+ prop: {
41
+ writeable: false,
42
+ get: function(){
43
+ var elem = this;
44
+ var select = $('select', elem);
45
+ var options;
46
+ if(select[0]){
47
+ options = select[0].options;
48
+ } else {
49
+ options = $('option', elem).get();
50
+ if(options.length){
51
+ webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
52
+ }
53
+ }
54
+ return options;
55
+ }
56
+ }
57
+ });
58
+ }
59
+
60
+ var inputListProto = {
61
+ //override autocomplete
62
+ autocomplete: {
63
+ attr: {
64
+ get: function(){
65
+ var elem = this;
66
+ var data = $.data(elem, 'datalistWidget');
67
+ if(data){
68
+ return data._autocomplete;
69
+ }
70
+ return ('autocomplete' in elem) ? elem.autocomplete : elem.getAttribute('autocomplete');
71
+ },
72
+ set: function(value){
73
+ var elem = this;
74
+ var data = $.data(elem, 'datalistWidget');
75
+ if(data){
76
+ data._autocomplete = value;
77
+ if(value == 'off'){
78
+ data.hideList();
79
+ }
80
+ } else {
81
+ if('autocomplete' in elem){
82
+ elem.autocomplete = value;
83
+ } else {
84
+ elem.setAttribute('autocomplete', value);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ };
91
+
92
+ // if(formsCFG.customDatalist && (!listSupport || !('selectedOption') in $('<input />')[0])){
93
+ // //currently not supported x-browser (FF4 has not implemented and is not polyfilled )
94
+ // inputListProto.selectedOption = {
95
+ // prop: {
96
+ // writeable: false,
97
+ // get: function(){
98
+ // var elem = this;
99
+ // var list = $.prop(elem, 'list');
100
+ // var ret = null;
101
+ // var value, options;
102
+ // if(!list){return ret;}
103
+ // value = $.prop(elem, 'value');
104
+ // if(!value){return ret;}
105
+ // options = $.prop(list, 'options');
106
+ // if(!options.length){return ret;}
107
+ // $.each(options, function(i, option){
108
+ // if(value == $.prop(option, 'value')){
109
+ // ret = option;
110
+ // return false;
111
+ // }
112
+ // });
113
+ // return ret;
114
+ // }
115
+ // }
116
+ // };
117
+ // }
118
+
119
+ if(!listSupport){
120
+ inputListProto['list'] = {
121
+ attr: {
122
+ get: function(){
123
+ var val = webshims.contentAttr(this, 'list');
124
+ return (val == null) ? undefined : val;
125
+ },
126
+ set: function(value){
127
+ var elem = this;
128
+ webshims.contentAttr(elem, 'list', value);
129
+ webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
130
+ }
131
+ },
132
+ initAttr: true,
133
+ reflect: true,
134
+ propType: 'element',
135
+ propNodeName: 'datalist'
136
+ };
137
+ } else {
138
+ //options only return options, if option-elements are rooted: but this makes this part of HTML5 less backwards compatible
139
+ if(!($('<datalist><select><option></option></select></datalist>').prop('options') || []).length ){
140
+ webshims.defineNodeNameProperty('datalist', 'options', {
141
+ prop: {
142
+ writeable: false,
143
+ get: function(){
144
+ var options = this.options || [];
145
+ if(!options.length){
146
+ var elem = this;
147
+ var select = $('select', elem);
148
+ if(select[0] && select[0].options && select[0].options.length){
149
+ options = select[0].options;
150
+ }
151
+ }
152
+ return options;
153
+ }
154
+ }
155
+ });
156
+ }
157
+ inputListProto['list'] = {
158
+ attr: {
159
+ get: function(){
160
+ var val = webshims.contentAttr(this, 'list');
161
+ if(val != null){
162
+ this.removeAttribute('list');
163
+ } else {
164
+ val = $.data(this, 'datalistListAttr');
165
+ }
166
+
167
+ return (val == null) ? undefined : val;
168
+ },
169
+ set: function(value){
170
+ var elem = this;
171
+ $.data(elem, 'datalistListAttr', value);
172
+ webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
173
+ }
174
+ },
175
+ initAttr: true,
176
+ reflect: true,
177
+ propType: 'element',
178
+ propNodeName: 'datalist'
179
+ };
180
+ }
181
+
182
+
183
+ webshims.defineNodeNameProperties('input', inputListProto);
184
+
185
+ if($.event.customEvent){
186
+ $.event.customEvent.updateDatalist = true;
187
+ $.event.customEvent.updateInput = true;
188
+ $.event.customEvent.datalistselect = true;
189
+ }
190
+ webshims.addReady(function(context, contextElem){
191
+ contextElem
192
+ .filter('datalist > select, datalist, datalist > option, datalist > select > option')
193
+ .closest('datalist')
194
+ .triggerHandler('updateDatalist')
195
+ ;
196
+
197
+ });
198
+
199
+
200
+ };
201
+
202
+
203
+ /*
204
+ * ShadowList
205
+ */
206
+ var listidIndex = 0;
207
+
208
+ var noDatalistSupport = {
209
+ submit: 1,
210
+ button: 1,
211
+ reset: 1,
212
+ hidden: 1,
213
+
214
+ //ToDo
215
+ range: 1,
216
+ date: 1
217
+ };
218
+ var lteie6 = ($.browser.msie && parseInt($.browser.version, 10) < 7);
219
+ var globStoredOptions = {};
220
+ var getStoredOptions = function(name){
221
+ if(!name){return [];}
222
+ if(globStoredOptions[name]){
223
+ return globStoredOptions[name];
224
+ }
225
+ var data;
226
+ try {
227
+ data = JSON.parse(localStorage.getItem('storedDatalistOptions'+name));
228
+ } catch(e){}
229
+ globStoredOptions[name] = data || [];
230
+ return data || [];
231
+ };
232
+ var storeOptions = function(name, val){
233
+ if(!name){return;}
234
+ val = val || [];
235
+ try {
236
+ localStorage.setItem( 'storedDatalistOptions'+name, JSON.stringify(val) );
237
+ } catch(e){}
238
+ };
239
+
240
+ var getText = function(elem){
241
+ return (elem.textContent || elem.innerText || $.text([ elem ]) || '');
242
+ };
243
+
244
+ var shadowListProto = {
245
+ _create: function(opts){
246
+
247
+ if(noDatalistSupport[$.prop(opts.input, 'type')]){return;}
248
+ var datalist = opts.datalist;
249
+ var data = $.data(opts.input, 'datalistWidget');
250
+ if(datalist && data && data.datalist !== datalist){
251
+ data.datalist = datalist;
252
+ data.id = opts.id;
253
+
254
+ data.shadowList.prop('className', 'datalist-polyfill '+ (data.datalist.className || '') + ' '+ data.datalist.id +'-shadowdom');
255
+ if(formsCFG.positionDatalist){
256
+ data.shadowList.insertAfter(opts.input);
257
+ } else {
258
+ data.shadowList.appendTo('body');
259
+ }
260
+ $(data.datalist)
261
+ .unbind('updateDatalist.datalistWidget')
262
+ .bind('updateDatalist.datalistWidget', $.proxy(data, '_resetListCached'))
263
+ ;
264
+ data._resetListCached();
265
+ return;
266
+ } else if(!datalist){
267
+ if(data){
268
+ data.destroy();
269
+ }
270
+ return;
271
+ } else if(data && data.datalist === datalist){
272
+ return;
273
+ }
274
+ listidIndex++;
275
+ var that = this;
276
+ this.hideList = $.proxy(that, 'hideList');
277
+ this.timedHide = function(){
278
+ clearTimeout(that.hideTimer);
279
+ that.hideTimer = setTimeout(that.hideList, 9);
280
+ };
281
+ this.datalist = datalist;
282
+ this.id = opts.id;
283
+ this.hasViewableData = true;
284
+ this._autocomplete = $.attr(opts.input, 'autocomplete');
285
+ $.data(opts.input, 'datalistWidget', this);
286
+ this.shadowList = $('<div class="datalist-polyfill '+ (this.datalist.className || '') + ' '+ this.datalist.id +'-shadowdom' +'" />');
287
+
288
+ if(formsCFG.positionDatalist || $(opts.input).hasClass('position-datalist')){
289
+ this.shadowList.insertAfter(opts.input);
290
+ } else {
291
+ this.shadowList.appendTo('body');
292
+ }
293
+
294
+ this.index = -1;
295
+ this.input = opts.input;
296
+ this.arrayOptions = [];
297
+
298
+ this.shadowList
299
+ .delegate('li', 'mouseenter.datalistWidget mousedown.datalistWidget click.datalistWidget', function(e){
300
+ var items = $('li:not(.hidden-item)', that.shadowList);
301
+ var select = (e.type == 'mousedown' || e.type == 'click');
302
+ that.markItem(items.index(e.currentTarget), select, items);
303
+ if(e.type == 'click'){
304
+ that.hideList();
305
+ if(formsCFG.customDatalist){
306
+ $(opts.input).trigger('datalistselect');
307
+ }
308
+ }
309
+ return (e.type != 'mousedown');
310
+ })
311
+ .bind('focusout', this.timedHide)
312
+ ;
313
+
314
+ opts.input.setAttribute('autocomplete', 'off');
315
+
316
+ $(opts.input)
317
+ .attr({
318
+ //role: 'combobox',
319
+ 'aria-haspopup': 'true'
320
+ })
321
+ .bind('input.datalistWidget', function(){
322
+ if(!that.triggeredByDatalist){
323
+ that.changedValue = false;
324
+ that.showHideOptions();
325
+ }
326
+ })
327
+
328
+ .bind('keydown.datalistWidget', function(e){
329
+ var keyCode = e.keyCode;
330
+ var activeItem;
331
+ var items;
332
+ if(keyCode == 40 && !that.showList()){
333
+ that.markItem(that.index + 1, true);
334
+ return false;
335
+ }
336
+
337
+ if(!that.isListVisible){return;}
338
+
339
+
340
+ if(keyCode == 38){
341
+ that.markItem(that.index - 1, true);
342
+ return false;
343
+ }
344
+ if(!e.shiftKey && (keyCode == 33 || keyCode == 36)){
345
+ that.markItem(0, true);
346
+ return false;
347
+ }
348
+ if(!e.shiftKey && (keyCode == 34 || keyCode == 35)){
349
+ items = $('li:not(.hidden-item)', that.shadowList);
350
+ that.markItem(items.length - 1, true, items);
351
+ return false;
352
+ }
353
+ if(keyCode == 13 || keyCode == 27){
354
+ if (keyCode == 13){
355
+ activeItem = $('li.active-item:not(.hidden-item)', that.shadowList);
356
+ that.changeValue( $('li.active-item:not(.hidden-item)', that.shadowList) );
357
+ }
358
+ that.hideList();
359
+ if(formsCFG.customDatalist && activeItem && activeItem[0]){
360
+ $(opts.input).trigger('datalistselect');
361
+ }
362
+ return false;
363
+ }
364
+ })
365
+ .bind('focus.datalistWidget', function(){
366
+ if($(this).hasClass('list-focus')){
367
+ that.showList();
368
+ }
369
+ })
370
+ .bind('mousedown.datalistWidget', function(){
371
+ if($(this).is(':focus')){
372
+ that.showList();
373
+ }
374
+ })
375
+ .bind('blur.datalistWidget', this.timedHide)
376
+ ;
377
+
378
+
379
+ $(this.datalist)
380
+ .unbind('updateDatalist.datalistWidget')
381
+ .bind('updateDatalist.datalistWidget', $.proxy(this, '_resetListCached'))
382
+ ;
383
+
384
+ this._resetListCached();
385
+
386
+ if(opts.input.form && (opts.input.name || opts.input.id)){
387
+ $(opts.input.form).bind('submit.datalistWidget'+opts.input.id, function(){
388
+ if(!$(opts.input).hasClass('no-datalist-cache') && that._autocomplete != 'off'){
389
+ var val = $.prop(opts.input, 'value');
390
+ var name = (opts.input.name || opts.input.id) + $.prop(opts.input, 'type');
391
+ if(!that.storedOptions){
392
+ that.storedOptions = getStoredOptions( name );
393
+ }
394
+ if(val && that.storedOptions.indexOf(val) == -1){
395
+ that.storedOptions.push(val);
396
+ storeOptions(name, that.storedOptions );
397
+ }
398
+ }
399
+ });
400
+ }
401
+ $(window).bind('unload.datalist'+this.id+' beforeunload.datalist'+this.id, function(){
402
+ that.destroy();
403
+ });
404
+ },
405
+ destroy: function(){
406
+ var autocomplete = $.attr(this.input, 'autocomplete');
407
+ $(this.input)
408
+ .unbind('.datalistWidget')
409
+ .removeData('datalistWidget')
410
+ ;
411
+ this.shadowList.remove();
412
+ $(document).unbind('.datalist'+this.id);
413
+ $(window).unbind('.datalist'+this.id);
414
+ if(this.input.form && this.input.id){
415
+ $(this.input.form).unbind('submit.datalistWidget'+this.input.id);
416
+ }
417
+ this.input.removeAttribute('aria-haspopup');
418
+ if(autocomplete === undefined){
419
+ this.input.removeAttribute('autocomplete');
420
+ } else {
421
+ $(this.input).attr('autocomplete', autocomplete);
422
+ }
423
+ },
424
+ _resetListCached: function(e){
425
+ var that = this;
426
+ var forceShow;
427
+ this.needsUpdate = true;
428
+ this.lastUpdatedValue = false;
429
+ this.lastUnfoundValue = '';
430
+
431
+ if(!this.updateTimer){
432
+ if(window.QUnit || (forceShow = (e && document.activeElement == that.input))){
433
+ that.updateListOptions(forceShow);
434
+ } else {
435
+ webshims.ready('WINDOWLOAD', function(){
436
+ that.updateTimer = setTimeout(function(){
437
+ that.updateListOptions();
438
+ that = null;
439
+ listidIndex = 1;
440
+ }, 200 + (100 * listidIndex));
441
+ });
442
+ }
443
+ }
444
+ },
445
+ updateListOptions: function(_forceShow){
446
+ this.needsUpdate = false;
447
+ clearTimeout(this.updateTimer);
448
+ this.updateTimer = false;
449
+ this.shadowList
450
+ .css({
451
+ fontSize: $.css(this.input, 'fontSize'),
452
+ fontFamily: $.css(this.input, 'fontFamily')
453
+ })
454
+ ;
455
+ this.searchStart = formsCFG.customDatalist && $(this.input).hasClass('search-start');
456
+
457
+ var list = [];
458
+
459
+ var values = [];
460
+ var allOptions = [];
461
+ var rElem, rItem, rOptions, rI, rLen, item;
462
+ for(rOptions = $.prop(this.datalist, 'options'), rI = 0, rLen = rOptions.length; rI < rLen; rI++){
463
+ rElem = rOptions[rI];
464
+ if(rElem.disabled){return;}
465
+ rItem = {
466
+ value: $(rElem).val() || '',
467
+ text: $.trim($.attr(rElem, 'label') || getText(rElem)),
468
+ className: rElem.className || '',
469
+ style: $.attr(rElem, 'style') || ''
470
+ };
471
+ if(!rItem.text){
472
+ rItem.text = rItem.value;
473
+ } else if(rItem.text != rItem.value){
474
+ rItem.className += ' different-label-value';
475
+ }
476
+ values[rI] = rItem.value;
477
+ allOptions[rI] = rItem;
478
+ }
479
+
480
+ if(!this.storedOptions){
481
+ this.storedOptions = ($(this.input).hasClass('no-datalist-cache') || this._autocomplete == 'off') ? [] : getStoredOptions((this.input.name || this.input.id) + $.prop(this.input, 'type'));
482
+ }
483
+
484
+ this.storedOptions.forEach(function(val, i){
485
+ if(values.indexOf(val) == -1){
486
+ allOptions.push({value: val, text: val, className: 'stored-suggest', style: ''});
487
+ }
488
+ });
489
+
490
+ for(rI = 0, rLen = allOptions.length; rI < rLen; rI++){
491
+ item = allOptions[rI];
492
+ list[rI] = '<li class="'+ item.className +'" style="'+ item.style +'" tabindex="-1" role="listitem"><span class="option-label">'+ item.text +'</span> <span class="option-value">'+item.value+'</span></li>';
493
+ }
494
+
495
+ this.arrayOptions = allOptions;
496
+ this.shadowList.html('<div class="datalist-outer-box"><div class="datalist-box"><ul role="list">'+ list.join("\n") +'</ul></div></div>');
497
+
498
+ if($.fn.bgIframe && lteie6){
499
+ this.shadowList.bgIframe();
500
+ }
501
+
502
+ if(_forceShow || this.isListVisible){
503
+ this.showHideOptions();
504
+ }
505
+ },
506
+ showHideOptions: function(_fromShowList){
507
+ var value = $.prop(this.input, 'value').toLowerCase();
508
+ //first check prevent infinite loop, second creates simple lazy optimization
509
+ if(value === this.lastUpdatedValue || (this.lastUnfoundValue && value.indexOf(this.lastUnfoundValue) === 0)){
510
+ return;
511
+ }
512
+
513
+ this.lastUpdatedValue = value;
514
+ var found = false;
515
+ var startSearch = this.searchStart;
516
+ var lis = $('li', this.shadowList);
517
+ if(value){
518
+ this.arrayOptions.forEach(function(item, i){
519
+ var search;
520
+ if(!('lowerText' in item)){
521
+ if(item.text != item.value){
522
+ item.lowerText = item.value.toLowerCase() + item.text.toLowerCase();
523
+ } else {
524
+ item.lowerText = item.text.toLowerCase();
525
+ }
526
+ }
527
+ search = item.lowerText.indexOf(value);
528
+ search = startSearch ? !search : search !== -1;
529
+ if(search){
530
+ $(lis[i]).removeClass('hidden-item');
531
+ found = true;
532
+ } else {
533
+ $(lis[i]).addClass('hidden-item');
534
+ }
535
+ });
536
+ } else if(lis.length) {
537
+ lis.removeClass('hidden-item');
538
+ found = true;
539
+ }
540
+
541
+ this.hasViewableData = found;
542
+ if(!_fromShowList && found){
543
+ this.showList();
544
+ }
545
+ if(!found){
546
+ this.lastUnfoundValue = value;
547
+ this.hideList();
548
+ }
549
+ },
550
+ setPos: function(){
551
+ this.shadowList.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0});
552
+ var css = (formsCFG.positionDatalist) ? $(this.input).position() : webshims.getRelOffset(this.shadowList, this.input);
553
+ css.top += $(this.input).outerHeight();
554
+ css.width = $(this.input).outerWidth() - (parseInt(this.shadowList.css('borderLeftWidth'), 10) || 0) - (parseInt(this.shadowList.css('borderRightWidth'), 10) || 0);
555
+ this.shadowList.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(css);
556
+ return css;
557
+ },
558
+ showList: function(){
559
+ if(this.isListVisible){return false;}
560
+ if(this.needsUpdate){
561
+ this.updateListOptions();
562
+ }
563
+ this.showHideOptions(true);
564
+ if(!this.hasViewableData){return false;}
565
+ this.isListVisible = true;
566
+ var that = this;
567
+
568
+ that.setPos();
569
+ that.shadowList.addClass('datalist-visible').find('li.active-item').removeClass('active-item');
570
+
571
+ $(window).unbind('.datalist'+that.id);
572
+ $(document)
573
+ .unbind('.datalist'+that.id)
574
+ .bind('mousedown.datalist'+that.id +' focusin.datalist'+that.id, function(e){
575
+ if(e.target === that.input || that.shadowList[0] === e.target || $.contains( that.shadowList[0], e.target )){
576
+ clearTimeout(that.hideTimer);
577
+ setTimeout(function(){
578
+ clearTimeout(that.hideTimer);
579
+ }, 9);
580
+ } else {
581
+ that.timedHide();
582
+ }
583
+ })
584
+ .bind('updateshadowdom.datalist'+that.id, function(){
585
+ that.setPos();
586
+ })
587
+ ;
588
+ return true;
589
+ },
590
+ hideList: function(){
591
+ if(!this.isListVisible){return false;}
592
+ var that = this;
593
+ var triggerChange = function(e){
594
+ if(that.changedValue){
595
+ $(that.input).trigger('change');
596
+ }
597
+ that.changedValue = false;
598
+ };
599
+
600
+ that.shadowList.removeClass('datalist-visible list-item-active');
601
+ that.index = -1;
602
+ that.isListVisible = false;
603
+ if(that.changedValue){
604
+ that.triggeredByDatalist = true;
605
+ webshims.triggerInlineForm && webshims.triggerInlineForm(that.input, 'input');
606
+ if($(that.input).is(':focus')){
607
+ $(that.input).one('blur', triggerChange);
608
+ } else {
609
+ triggerChange();
610
+ }
611
+ that.triggeredByDatalist = false;
612
+ }
613
+ $(document).unbind('.datalist'+that.id);
614
+ $(window)
615
+ .unbind('.datalist'+that.id)
616
+ .one('resize.datalist'+that.id, function(){
617
+ that.shadowList.css({top: 0, left: 0});
618
+ })
619
+ ;
620
+ return true;
621
+ },
622
+ scrollIntoView: function(elem){
623
+ var ul = $('ul', this.shadowList);
624
+ var div = $('div.datalist-box', this.shadowList);
625
+ var elemPos = elem.position();
626
+ var containerHeight;
627
+ elemPos.top -= (parseInt(ul.css('paddingTop'), 10) || 0) + (parseInt(ul.css('marginTop'), 10) || 0) + (parseInt(ul.css('borderTopWidth'), 10) || 0);
628
+ if(elemPos.top < 0){
629
+ div.scrollTop( div.scrollTop() + elemPos.top - 2);
630
+ return;
631
+ }
632
+ elemPos.top += elem.outerHeight();
633
+ containerHeight = div.height();
634
+ if(elemPos.top > containerHeight){
635
+ div.scrollTop( div.scrollTop() + (elemPos.top - containerHeight) + 2);
636
+ }
637
+ },
638
+ changeValue: function(activeItem){
639
+ if(!activeItem[0]){return;}
640
+ var newValue = $('span.option-value', activeItem).text();
641
+ var oldValue = $.prop(this.input, 'value');
642
+ if(newValue != oldValue){
643
+ $(this.input)
644
+ .prop('value', newValue)
645
+ .triggerHandler('updateInput')
646
+ ;
647
+ this.changedValue = true;
648
+ }
649
+ },
650
+ markItem: function(index, doValue, items){
651
+ var activeItem;
652
+ var goesUp;
653
+
654
+ items = items || $('li:not(.hidden-item)', this.shadowList);
655
+ if(!items.length){return;}
656
+ if(index < 0){
657
+ index = items.length - 1;
658
+ } else if(index >= items.length){
659
+ index = 0;
660
+ }
661
+ items.removeClass('active-item');
662
+ this.shadowList.addClass('list-item-active');
663
+ activeItem = items.filter(':eq('+ index +')').addClass('active-item');
664
+
665
+ if(doValue){
666
+ this.changeValue(activeItem);
667
+ this.scrollIntoView(activeItem);
668
+ }
669
+ this.index = index;
670
+ }
671
+ };
672
+
673
+ //init datalist update
674
+ initializeDatalist();
675
+ })();
676
+
677
+ });jQuery.webshims.register('form-extend', function($, webshims, window, doc, undefined, options){
678
+ "use strict";
679
+ var Modernizr = window.Modernizr;
680
+ var modernizrInputTypes = Modernizr.inputtypes;
681
+ if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){return;}
682
+ var typeModels = webshims.inputTypes;
683
+ var validityRules = {};
684
+
685
+ webshims.addInputType = function(type, obj){
686
+ typeModels[type] = obj;
687
+ };
688
+
689
+ webshims.addValidityRule = function(type, fn){
690
+ validityRules[type] = fn;
691
+ };
692
+
693
+ webshims.addValidityRule('typeMismatch',function (input, val, cache, validityState){
694
+ if(val === ''){return false;}
695
+ var ret = validityState.typeMismatch;
696
+ if(!('type' in cache)){
697
+ cache.type = (input[0].getAttribute('type') || '').toLowerCase();
698
+ }
699
+
700
+ if(typeModels[cache.type] && typeModels[cache.type].mismatch){
701
+ ret = typeModels[cache.type].mismatch(val, input);
702
+ }
703
+ return ret;
704
+ });
705
+
706
+ var overrideNativeMessages = options.overrideMessages;
707
+
708
+ var overrideValidity = (!modernizrInputTypes.number || !modernizrInputTypes.time || !modernizrInputTypes.range || overrideNativeMessages);
709
+ var validityProps = ['customError','typeMismatch','rangeUnderflow','rangeOverflow','stepMismatch','tooLong','patternMismatch','valueMissing','valid'];
710
+
711
+ var validityChanger = (overrideNativeMessages)? ['value', 'checked'] : ['value'];
712
+ var validityElements = [];
713
+ var testValidity = function(elem, init){
714
+ if(!elem){return;}
715
+ var type = (elem.getAttribute && elem.getAttribute('type') || elem.type || '').toLowerCase();
716
+
717
+ if(!overrideNativeMessages && !typeModels[type]){
718
+ return;
719
+ }
720
+
721
+ if(overrideNativeMessages && !init && type == 'radio' && elem.name){
722
+ $(doc.getElementsByName( elem.name )).each(function(){
723
+ $.prop(this, 'validity');
724
+ });
725
+ } else {
726
+ $.prop(elem, 'validity');
727
+ }
728
+ };
729
+
730
+ var oldSetCustomValidity = {};
731
+ ['input', 'textarea', 'select'].forEach(function(name){
732
+ var desc = webshims.defineNodeNameProperty(name, 'setCustomValidity', {
733
+ prop: {
734
+ value: function(error){
735
+ error = error+'';
736
+ var elem = (name == 'input') ? $(this).getNativeElement()[0] : this;
737
+ desc.prop._supvalue.call(elem, error);
738
+
739
+ if(webshims.bugs.validationMessage){
740
+ webshims.data(elem, 'customvalidationMessage', error);
741
+ }
742
+ if(overrideValidity){
743
+ webshims.data(elem, 'hasCustomError', !!(error));
744
+ testValidity(elem);
745
+ }
746
+ }
747
+ }
748
+ });
749
+ oldSetCustomValidity[name] = desc.prop._supvalue;
750
+ });
751
+
752
+
753
+ if(overrideValidity || overrideNativeMessages){
754
+ validityChanger.push('min');
755
+ validityChanger.push('max');
756
+ validityChanger.push('step');
757
+ validityElements.push('input');
758
+ }
759
+ if(overrideNativeMessages){
760
+ validityChanger.push('required');
761
+ validityChanger.push('pattern');
762
+ validityElements.push('select');
763
+ validityElements.push('textarea');
764
+ }
765
+
766
+ if(overrideValidity){
767
+ var stopValidity;
768
+ validityElements.forEach(function(nodeName){
769
+
770
+ var oldDesc = webshims.defineNodeNameProperty(nodeName, 'validity', {
771
+ prop: {
772
+ get: function(){
773
+ if(stopValidity){return;}
774
+ var elem = (nodeName == 'input') ? $(this).getNativeElement()[0] : this;
775
+
776
+ var validity = oldDesc.prop._supget.call(elem);
777
+
778
+ if(!validity){
779
+ return validity;
780
+ }
781
+ var validityState = {};
782
+ validityProps.forEach(function(prop){
783
+ validityState[prop] = validity[prop];
784
+ });
785
+
786
+ if( !$.prop(elem, 'willValidate') ){
787
+ return validityState;
788
+ }
789
+ stopValidity = true;
790
+ var jElm = $(elem),
791
+ cache = {type: (elem.getAttribute && elem.getAttribute('type') || '').toLowerCase(), nodeName: (elem.nodeName || '').toLowerCase()},
792
+ val = jElm.val(),
793
+ customError = !!(webshims.data(elem, 'hasCustomError')),
794
+ setCustomMessage
795
+ ;
796
+ stopValidity = false;
797
+ validityState.customError = customError;
798
+
799
+ if( validityState.valid && validityState.customError ){
800
+ validityState.valid = false;
801
+ } else if(!validityState.valid) {
802
+ var allFalse = true;
803
+ $.each(validityState, function(name, prop){
804
+ if(prop){
805
+ allFalse = false;
806
+ return false;
807
+ }
808
+ });
809
+
810
+ if(allFalse){
811
+ validityState.valid = true;
812
+ }
813
+
814
+ }
815
+
816
+ $.each(validityRules, function(rule, fn){
817
+ validityState[rule] = fn(jElm, val, cache, validityState);
818
+ if( validityState[rule] && (validityState.valid || !setCustomMessage) && (overrideNativeMessages || (typeModels[cache.type] && typeModels[cache.type].mismatch)) ) {
819
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, rule));
820
+ validityState.valid = false;
821
+ setCustomMessage = true;
822
+ }
823
+ });
824
+ if(validityState.valid){
825
+ oldSetCustomValidity[nodeName].call(elem, '');
826
+ webshims.data(elem, 'hasCustomError', false);
827
+ } else if(overrideNativeMessages && !setCustomMessage && !customError){
828
+ $.each(validityState, function(name, prop){
829
+ if(name !== 'valid' && prop){
830
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
831
+ return false;
832
+ }
833
+ });
834
+ }
835
+ return validityState;
836
+ },
837
+ writeable: false
838
+
839
+ }
840
+ });
841
+ });
842
+
843
+ validityChanger.forEach(function(prop){
844
+ webshims.onNodeNamesPropertyModify(validityElements, prop, function(s){
845
+ testValidity(this);
846
+ });
847
+ });
848
+
849
+ if(doc.addEventListener){
850
+ var inputThrottle;
851
+ var testPassValidity = function(e){
852
+ if(!('form' in e.target)){return;}
853
+ var form = e.target.form;
854
+ clearTimeout(inputThrottle);
855
+ testValidity(e.target);
856
+ if(form && overrideNativeMessages){
857
+ $('input', form).each(function(){
858
+ if(this.type == 'password'){
859
+ testValidity(this);
860
+ }
861
+ });
862
+ }
863
+ };
864
+
865
+ doc.addEventListener('change', testPassValidity, true);
866
+
867
+ if(overrideNativeMessages){
868
+ doc.addEventListener('blur', testPassValidity, true);
869
+ doc.addEventListener('keydown', function(e){
870
+ if(e.keyCode != 13){return;}
871
+ testPassValidity(e);
872
+ }, true);
873
+ }
874
+
875
+ doc.addEventListener('input', function(e){
876
+ clearTimeout(inputThrottle);
877
+ inputThrottle = setTimeout(function(){
878
+ testValidity(e.target);
879
+ }, 290);
880
+ }, true);
881
+ }
882
+
883
+ var validityElementsSel = validityElements.join(',');
884
+
885
+ webshims.addReady(function(context, elem){
886
+ $(validityElementsSel, context).add(elem.filter(validityElementsSel)).each(function(){
887
+ $.prop(this, 'validity');
888
+ });
889
+ });
890
+
891
+
892
+ if(overrideNativeMessages){
893
+ webshims.ready('DOM form-message', function(){
894
+ webshims.activeLang({
895
+ register: 'form-core',
896
+ callback: function(){
897
+ $('input, select, textarea')
898
+ .getNativeElement()
899
+ .each(function(){
900
+ if(webshims.data(this, 'hasCustomError')){return;}
901
+ var elem = this;
902
+ var validity = $.prop(elem, 'validity') || {valid: true};
903
+ var nodeName;
904
+ if(validity.valid){return;}
905
+ nodeName = (elem.nodeName || '').toLowerCase();
906
+ $.each(validity, function(name, prop){
907
+ if(name !== 'valid' && prop){
908
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
909
+ return false;
910
+ }
911
+ });
912
+ })
913
+ ;
914
+ }
915
+ });
916
+ });
917
+ }
918
+
919
+ } //end: overrideValidity
920
+
921
+ webshims.defineNodeNameProperty('input', 'type', {
922
+ prop: {
923
+ get: function(){
924
+ var elem = this;
925
+ var type = (elem.getAttribute('type') || '').toLowerCase();
926
+ return (webshims.inputTypes[type]) ? type : elem.type;
927
+ }
928
+ }
929
+ });
930
+
931
+
932
+ });jQuery.webshims.register('form-number-date-api', function($, webshims, window, document, undefined){
933
+ "use strict";
934
+
935
+ //ToDo
936
+ if(!webshims.getStep){
937
+ webshims.getStep = function(elem, type){
938
+ var step = $.attr(elem, 'step');
939
+ if(step === 'any'){
940
+ return step;
941
+ }
942
+ type = type || getType(elem);
943
+ if(!typeModels[type] || !typeModels[type].step){
944
+ return step;
945
+ }
946
+ step = typeProtos.number.asNumber(step);
947
+ return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * typeModels[type].stepScaleFactor;
948
+ };
949
+ }
950
+ if(!webshims.addMinMaxNumberToCache){
951
+ webshims.addMinMaxNumberToCache = function(attr, elem, cache){
952
+ if (!(attr+'AsNumber' in cache)) {
953
+ cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
954
+ if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
955
+ cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
956
+ }
957
+ }
958
+ };
959
+ }
960
+
961
+ var nan = parseInt('NaN', 10),
962
+ doc = document,
963
+ typeModels = webshims.inputTypes,
964
+ isNumber = function(string){
965
+ return (typeof string == 'number' || (string && string == string * 1));
966
+ },
967
+ supportsType = function(type){
968
+ return ($('<input type="'+type+'" />').prop('type') === type);
969
+ },
970
+ getType = function(elem){
971
+ return (elem.getAttribute('type') || '').toLowerCase();
972
+ },
973
+ isDateTimePart = function(string){
974
+ return (isNumber(string) || (string && string == '0' + (string * 1)));
975
+ },
976
+ addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
977
+ addleadingZero = function(val, len){
978
+ val = ''+val;
979
+ len = len - val.length;
980
+ for(var i = 0; i < len; i++){
981
+ val = '0'+val;
982
+ }
983
+ return val;
984
+ },
985
+ EPS = 1e-7,
986
+ typeBugs = webshims.bugs.valueAsNumberSet || webshims.bugs.bustedValidity
987
+ ;
988
+
989
+ webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
990
+ if(val === ''){return false;}
991
+ if(!('type' in cache)){
992
+ cache.type = getType(input[0]);
993
+ }
994
+ //stepmismatch with date is computable, but it would be a typeMismatch (performance)
995
+ if(cache.type == 'date'){
996
+ return false;
997
+ }
998
+ var ret = (validityState || {}).stepMismatch, base;
999
+ if(typeModels[cache.type] && typeModels[cache.type].step){
1000
+ if( !('step' in cache) ){
1001
+ cache.step = webshims.getStep(input[0], cache.type);
1002
+ }
1003
+
1004
+ if(cache.step == 'any'){return false;}
1005
+
1006
+ if(!('valueAsNumber' in cache)){
1007
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
1008
+ }
1009
+ if(isNaN(cache.valueAsNumber)){return false;}
1010
+
1011
+ addMinMaxNumberToCache('min', input, cache);
1012
+ base = cache.minAsNumber;
1013
+ if(isNaN(base)){
1014
+ base = typeModels[cache.type].stepBase || 0;
1015
+ }
1016
+
1017
+ ret = Math.abs((cache.valueAsNumber - base) % cache.step);
1018
+
1019
+ ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
1020
+ }
1021
+ return ret;
1022
+ });
1023
+
1024
+
1025
+
1026
+ [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
1027
+ webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
1028
+ var ret = (validityState || {})[data.name] || false;
1029
+ if(val === ''){return ret;}
1030
+ if (!('type' in cache)) {
1031
+ cache.type = getType(input[0]);
1032
+ }
1033
+ if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
1034
+ if(!('valueAsNumber' in cache)){
1035
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
1036
+ }
1037
+ if(isNaN(cache.valueAsNumber)){
1038
+ return false;
1039
+ }
1040
+
1041
+ addMinMaxNumberToCache(data.attr, input, cache);
1042
+
1043
+ if(isNaN(cache[data.attr+'AsNumber'])){
1044
+ return ret;
1045
+ }
1046
+ ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
1047
+ }
1048
+ return ret;
1049
+ });
1050
+ });
1051
+
1052
+ webshims.reflectProperties(['input'], ['max', 'min', 'step']);
1053
+
1054
+
1055
+ //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
1056
+ var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
1057
+ prop: {
1058
+ get: function(){
1059
+ var elem = this;
1060
+ var type = getType(elem);
1061
+ var ret = (typeModels[type] && typeModels[type].asNumber) ?
1062
+ typeModels[type].asNumber($.prop(elem, 'value')) :
1063
+ (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
1064
+ if(ret == null){
1065
+ ret = nan;
1066
+ }
1067
+ return ret;
1068
+ },
1069
+ set: function(val){
1070
+ var elem = this;
1071
+ var type = getType(elem);
1072
+ if(typeModels[type] && typeModels[type].numberToString){
1073
+ //is NaN a number?
1074
+ if(isNaN(val)){
1075
+ $.prop(elem, 'value', '');
1076
+ return;
1077
+ }
1078
+ var set = typeModels[type].numberToString(val);
1079
+ if(set !== false){
1080
+ $.prop(elem, 'value', set);
1081
+ } else {
1082
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
1083
+ }
1084
+ } else {
1085
+ valueAsNumberDescriptor.prop._supset && valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
1086
+ }
1087
+ }
1088
+ }
1089
+ });
1090
+
1091
+ var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
1092
+ prop: {
1093
+ get: function(){
1094
+ var elem = this;
1095
+ var type = getType(elem);
1096
+ return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
1097
+ typeModels[type].asDate($.prop(elem, 'value')) :
1098
+ valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
1099
+ },
1100
+ set: function(value){
1101
+ var elem = this;
1102
+ var type = getType(elem);
1103
+ if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
1104
+
1105
+ if(value === null){
1106
+ $.prop(elem, 'value', '');
1107
+ return '';
1108
+ }
1109
+ var set = typeModels[type].dateToString(value);
1110
+ if(set !== false){
1111
+ $.prop(elem, 'value', set);
1112
+ return set;
1113
+ } else {
1114
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
1115
+ }
1116
+ } else {
1117
+ return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
1118
+ }
1119
+ }
1120
+ }
1121
+ });
1122
+
1123
+ var typeProtos = {
1124
+
1125
+ number: {
1126
+ mismatch: function(val){
1127
+ return !(isNumber(val));
1128
+ },
1129
+ step: 1,
1130
+ //stepBase: 0, 0 = default
1131
+ stepScaleFactor: 1,
1132
+ asNumber: function(str){
1133
+ return (isNumber(str)) ? str * 1 : nan;
1134
+ },
1135
+ numberToString: function(num){
1136
+ return (isNumber(num)) ? num : false;
1137
+ }
1138
+ },
1139
+
1140
+ range: {
1141
+ minDefault: 0,
1142
+ maxDefault: 100
1143
+ },
1144
+
1145
+ date: {
1146
+ mismatch: function(val){
1147
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
1148
+ var valA = val.split(/\u002D/);
1149
+ if(valA.length !== 3){return true;}
1150
+ var ret = false;
1151
+ $.each(valA, function(i, part){
1152
+ if(!isDateTimePart(part)){
1153
+ ret = true;
1154
+ return false;
1155
+ }
1156
+ });
1157
+ if(ret){return ret;}
1158
+ if(valA[0].length !== 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
1159
+ ret = true;
1160
+ }
1161
+ return (val !== this.dateToString( this.asDate(val, true) ) );
1162
+ },
1163
+ step: 1,
1164
+ //stepBase: 0, 0 = default
1165
+ stepScaleFactor: 86400000,
1166
+ asDate: function(val, _noMismatch){
1167
+ if(!_noMismatch && this.mismatch(val)){
1168
+ return null;
1169
+ }
1170
+ return new Date(this.asNumber(val, true));
1171
+ },
1172
+ asNumber: function(str, _noMismatch){
1173
+ var ret = nan;
1174
+ if(_noMismatch || !this.mismatch(str)){
1175
+ str = str.split(/\u002D/);
1176
+ ret = Date.UTC(str[0], str[1] - 1, str[2]);
1177
+ }
1178
+ return ret;
1179
+ },
1180
+ numberToString: function(num){
1181
+ return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
1182
+ },
1183
+ dateToString: function(date){
1184
+ return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
1185
+ }
1186
+ }
1187
+ // ,time: {
1188
+ // mismatch: function(val, _getParsed){
1189
+ // if(!val || !val.split || !(/\d$/.test(val))){return true;}
1190
+ // val = val.split(/\u003A/);
1191
+ // if(val.length < 2 || val.length > 3){return true;}
1192
+ // var ret = false,
1193
+ // sFraction;
1194
+ // if(val[2]){
1195
+ // val[2] = val[2].split(/\u002E/);
1196
+ // sFraction = parseInt(val[2][1], 10);
1197
+ // val[2] = val[2][0];
1198
+ // }
1199
+ // $.each(val, function(i, part){
1200
+ // if(!isDateTimePart(part) || part.length !== 2){
1201
+ // ret = true;
1202
+ // return false;
1203
+ // }
1204
+ // });
1205
+ // if(ret){return true;}
1206
+ // if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
1207
+ // return true;
1208
+ // }
1209
+ // if(val[2] && (val[2] > 59 || val[2] < 0 )){
1210
+ // return true;
1211
+ // }
1212
+ // if(sFraction && isNaN(sFraction)){
1213
+ // return true;
1214
+ // }
1215
+ // if(sFraction){
1216
+ // if(sFraction < 100){
1217
+ // sFraction *= 100;
1218
+ // } else if(sFraction < 10){
1219
+ // sFraction *= 10;
1220
+ // }
1221
+ // }
1222
+ // return (_getParsed === true) ? [val, sFraction] : false;
1223
+ // },
1224
+ // step: 60,
1225
+ // stepBase: 0,
1226
+ // stepScaleFactor: 1000,
1227
+ // asDate: function(val){
1228
+ // val = new Date(this.asNumber(val));
1229
+ // return (isNaN(val)) ? null : val;
1230
+ // },
1231
+ // asNumber: function(val){
1232
+ // var ret = nan;
1233
+ // val = this.mismatch(val, true);
1234
+ // if(val !== true){
1235
+ // ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
1236
+ // if(val[1]){
1237
+ // ret += val[1];
1238
+ // }
1239
+ // }
1240
+ // return ret;
1241
+ // },
1242
+ // dateToString: function(date){
1243
+ // if(date && date.getUTCHours){
1244
+ // var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
1245
+ // tmp = date.getSeconds()
1246
+ // ;
1247
+ // if(tmp != "0"){
1248
+ // str += ':'+ addleadingZero(tmp, 2);
1249
+ // }
1250
+ // tmp = date.getUTCMilliseconds();
1251
+ // if(tmp != "0"){
1252
+ // str += '.'+ addleadingZero(tmp, 3);
1253
+ // }
1254
+ // return str;
1255
+ // } else {
1256
+ // return false;
1257
+ // }
1258
+ // }
1259
+ // }
1260
+ // ,'datetime-local': {
1261
+ // mismatch: function(val, _getParsed){
1262
+ // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
1263
+ // val = val.split(/\u0054/);
1264
+ // return ( typeProtos.date.mismatch(val[0]) || typeProtos.time.mismatch(val[1], _getParsed) );
1265
+ // },
1266
+ // noAsDate: true,
1267
+ // asDate: function(val){
1268
+ // val = new Date(this.asNumber(val));
1269
+ //
1270
+ // return (isNaN(val)) ? null : val;
1271
+ // },
1272
+ // asNumber: function(val){
1273
+ // var ret = nan;
1274
+ // var time = this.mismatch(val, true);
1275
+ // if(time !== true){
1276
+ // val = val.split(/\u0054/)[0].split(/\u002D/);
1277
+ //
1278
+ // ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
1279
+ // if(time[1]){
1280
+ // ret += time[1];
1281
+ // }
1282
+ // }
1283
+ // return ret;
1284
+ // },
1285
+ // dateToString: function(date, _getParsed){
1286
+ // return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
1287
+ // }
1288
+ // }
1289
+ };
1290
+
1291
+ if(typeBugs || !supportsType('range') || !supportsType('time')){
1292
+ typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
1293
+ // typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
1294
+ // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
1295
+ }
1296
+
1297
+ if(typeBugs || !supportsType('number')){
1298
+ webshims.addInputType('number', typeProtos.number);
1299
+ }
1300
+
1301
+ if(typeBugs || !supportsType('range')){
1302
+ webshims.addInputType('range', typeProtos.range);
1303
+ }
1304
+ if(typeBugs || !supportsType('date')){
1305
+ webshims.addInputType('date', typeProtos.date);
1306
+ }
1307
+ // if(typeBugs || !supportsType('time')){
1308
+ // webshims.addInputType('time', typeProtos.time);
1309
+ // }
1310
+
1311
+ // if(typeBugs || !supportsType('datetime-local')){
1312
+ // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
1313
+ // }
1314
+
1315
+ });/* number-date-ui */
1316
+ /* https://github.com/aFarkas/webshim/issues#issue/23 */
1317
+ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
1318
+ "use strict";
1319
+
1320
+ var triggerInlineForm = webshims.triggerInlineForm;
1321
+ var modernizrInputTypes = Modernizr.inputtypes;
1322
+ var adjustInputWithBtn = (function(){
1323
+ var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
1324
+ var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
1325
+ if($.browser.msie && webshims.browserVersion < 8){
1326
+ boxSizing = false;
1327
+ }
1328
+ var getWidth = function(input){
1329
+ var widthFn = "width";
1330
+ if(boxSizing){
1331
+ widthFn = fns[input.css(boxSizing)] || widthFn;
1332
+ }
1333
+
1334
+ return {
1335
+ w: input[widthFn](),
1336
+ add: widthFn == "width"
1337
+ };
1338
+
1339
+ };
1340
+
1341
+
1342
+ return function(input, button){
1343
+ var inputDim = getWidth(input);
1344
+ if(!inputDim.w){return;}
1345
+ var controlDim = {
1346
+ mL: (parseInt(button.css('marginLeft'), 10) || 0),
1347
+ w: button.outerWidth()
1348
+ };
1349
+ inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
1350
+ if(inputDim.mR){
1351
+ input.css('marginRight', 0);
1352
+ }
1353
+ //is inside
1354
+ if( controlDim.mL <= (controlDim.w * -1) ){
1355
+ button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
1356
+ input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
1357
+ if(inputDim.add){
1358
+ input.css('width', Math.floor(inputDim.w + controlDim.mL));
1359
+ }
1360
+ } else {
1361
+ button.css('marginRight', inputDim.mR);
1362
+ input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
1363
+ }
1364
+ };
1365
+ })();
1366
+
1367
+
1368
+ var defaultDatepicker = {};
1369
+ var labelID = 0;
1370
+ var emptyJ = $([]);
1371
+ var isCheckValidity;
1372
+ var replaceInputUI = function(context, elem){
1373
+ $('input', context).add(elem.filter('input')).each(function(){
1374
+ var type = $.prop(this, 'type');
1375
+ if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
1376
+ replaceInputUI[type]($(this));
1377
+ }
1378
+ });
1379
+ };
1380
+ //set date is extremly slow in IE so we do it lazy
1381
+ var lazySetDate = function(elem, date){
1382
+ if(!options.lazyDate){
1383
+ elem.datepicker('setDate', date);
1384
+ return;
1385
+ }
1386
+ var timer = $.data(elem[0], 'setDateLazyTimer');
1387
+ if(timer){
1388
+ clearTimeout(timer);
1389
+ }
1390
+ $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
1391
+ elem.datepicker('setDate', date);
1392
+ $.removeData(elem[0], 'setDateLazyTimer');
1393
+ elem = null;
1394
+ }, 0));
1395
+ };
1396
+
1397
+
1398
+ var copyAttrs = {
1399
+ tabindex: 1,
1400
+ tabIndex: 1,
1401
+ title: 1,
1402
+ "aria-required": 1,
1403
+ "aria-invalid": 1
1404
+ };
1405
+ if(!options.copyAttrs){
1406
+ options.copyAttrs = {};
1407
+ }
1408
+
1409
+ webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
1410
+
1411
+ var getDimensions = function(orig){
1412
+ return (options.calculateWidth) ?
1413
+ {
1414
+ css: {
1415
+ marginRight: orig.css('marginRight'),
1416
+ marginLeft: orig.css('marginLeft')
1417
+ },
1418
+ outerWidth: orig.outerWidth()
1419
+
1420
+ } :
1421
+ {}
1422
+ ;
1423
+ };
1424
+ var focusAttrs = copyAttrs;
1425
+
1426
+ replaceInputUI.common = function(orig, shim, methods){
1427
+ if(Modernizr.formvalidation){
1428
+ orig.bind('firstinvalid', function(e){
1429
+ if(!webshims.fromSubmit && isCheckValidity){return;}
1430
+ orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
1431
+ if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
1432
+ webshims.validityAlert.showFor( e.target );
1433
+ e.preventDefault();
1434
+ evt.preventDefault();
1435
+ }
1436
+ orig.unbind('invalid.replacedwidgetbubble');
1437
+ });
1438
+ });
1439
+ }
1440
+ var i, prop;
1441
+ var focusElement = $('input, span.ui-slider-handle', shim);
1442
+ var attrs = orig[0].attributes;
1443
+ for(i in options.copyAttrs){
1444
+ if ((prop = attrs[i]) && prop.specified) {
1445
+ if(focusAttrs[i] && focusElement[0]){
1446
+ focusElement.attr(i, prop.nodeValue);
1447
+ } else {
1448
+ shim[0].setAttribute(i, prop.nodeValue);
1449
+ }
1450
+ }
1451
+ }
1452
+
1453
+ var id = orig.attr('id'),
1454
+ label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
1455
+ ;
1456
+
1457
+
1458
+
1459
+ shim.addClass(orig[0].className);
1460
+ webshims.addShadowDom(orig, shim, {
1461
+ data: methods || {},
1462
+ shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
1463
+ shadowChilds: focusElement
1464
+ });
1465
+
1466
+ orig.after(shim);
1467
+
1468
+ if(orig[0].form){
1469
+ $(orig[0].form).bind('reset', function(e){
1470
+ if(e.originalEvent && !e.isDefaultPrevented()){
1471
+ setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
1472
+ }
1473
+ });
1474
+ }
1475
+
1476
+ if(label[0]){
1477
+ shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
1478
+ label.bind('click', function(){
1479
+ orig.getShadowFocusElement().focus();
1480
+ return false;
1481
+ });
1482
+ }
1483
+ };
1484
+
1485
+ if(Modernizr.formvalidation){
1486
+ ['input', 'form'].forEach(function(name){
1487
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
1488
+ prop: {
1489
+ value: function(){
1490
+ isCheckValidity = true;
1491
+ var ret = desc.prop._supvalue.apply(this, arguments);
1492
+ isCheckValidity = false;
1493
+ return ret;
1494
+ }
1495
+ }
1496
+ });
1497
+ });
1498
+ }
1499
+ //date and datetime-local implement if we have to replace
1500
+ if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
1501
+
1502
+ var datetimeFactor = {
1503
+ trigger: [0.595,0.395],
1504
+ normal: [0.565,0.425]
1505
+ };
1506
+ var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
1507
+
1508
+ var configureDatePicker = function(elem, datePicker, change, _wrapper){
1509
+ var stopFocusout;
1510
+ var focusedOut;
1511
+ var resetFocusHandler = function(){
1512
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
1513
+ stopFocusout = false;
1514
+ focusedOut = false;
1515
+ };
1516
+ var data = datePicker
1517
+ .bind('focusin', function(){
1518
+ resetFocusHandler();
1519
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
1520
+ stopFocusout = true;
1521
+ });
1522
+ })
1523
+ .bind('focusout blur', function(e){
1524
+ if(stopFocusout){
1525
+ focusedOut = true;
1526
+ e.stopImmediatePropagation();
1527
+ }
1528
+ })
1529
+ .datepicker($.extend({
1530
+ onClose: function(){
1531
+ if(focusedOut && datePicker.not(':focus')){
1532
+ resetFocusHandler();
1533
+ datePicker.trigger('focusout');
1534
+ datePicker.triggerHandler('blur');
1535
+ } else {
1536
+ resetFocusHandler();
1537
+ }
1538
+ }
1539
+ }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
1540
+ .bind('change', change)
1541
+ .data('datepicker')
1542
+ ;
1543
+ data.dpDiv.addClass('input-date-datepicker-control');
1544
+
1545
+ if(_wrapper){
1546
+ webshims.triggerDomUpdate(_wrapper[0]);
1547
+ }
1548
+ ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
1549
+ var fn = 'data-placeholder' ? 'attr' : 'prop';
1550
+ var val = elem[fn](name);
1551
+ if(val){
1552
+ elem[fn](name, val);
1553
+ }
1554
+ });
1555
+
1556
+ return data;
1557
+ };
1558
+
1559
+ // replaceInputUI['datetime-local'] = function(elem){
1560
+ // if(!$.fn.datepicker){return;}
1561
+ //
1562
+ // var date = $('<span role="group" class="input-datetime-local"><input type="text" class="input-datetime-local-date" /><input type="time" class="input-datetime-local-time" /></span>'),
1563
+ // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
1564
+ // datePicker = $('input.input-datetime-local-date', date),
1565
+ // datePickerChange = function(e){
1566
+ //
1567
+ // var value = datePicker.prop('value') || '',
1568
+ // timeVal = ''
1569
+ // ;
1570
+ // if(options.lazyDate){
1571
+ // var timer = $.data(datePicker[0], 'setDateLazyTimer');
1572
+ // if(timer){
1573
+ // clearTimeout(timer);
1574
+ // $.removeData(datePicker[0], 'setDateLazyTimer');
1575
+ // }
1576
+ // }
1577
+ //
1578
+ // if(value){
1579
+ // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
1580
+ // try {
1581
+ // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
1582
+ // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
1583
+ // } catch (e) {value = datePicker.prop('value');}
1584
+ // }
1585
+ // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
1586
+ // replaceInputUI['datetime-local'].blockAttr = true;
1587
+ // elem.prop('value', value);
1588
+ // replaceInputUI['datetime-local'].blockAttr = false;
1589
+ // e.stopImmediatePropagation();
1590
+ // triggerInlineForm(elem[0], 'input');
1591
+ // triggerInlineForm(elem[0], 'change');
1592
+ // },
1593
+ // data = configureDatePicker(elem, datePicker, datePickerChange, date)
1594
+ // ;
1595
+ //
1596
+ //
1597
+ // $('input.input-datetime-local-time', date).bind('change', function(e){
1598
+ // var timeVal = $.prop(this, 'value');
1599
+ // var val = ['', ''];
1600
+ // if(timeVal){
1601
+ // val = elem.prop('value').split('T');
1602
+ // if((val.length < 2 || !val[0])){
1603
+ // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
1604
+ // }
1605
+ // val[1] = timeVal;
1606
+ //
1607
+ // if (timeVal) {
1608
+ // try {
1609
+ // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
1610
+ // } catch (e) {}
1611
+ // }
1612
+ // }
1613
+ // val = (!val[0] && !val[1]) ? '' : val.join('T');
1614
+ // replaceInputUI['datetime-local'].blockAttr = true;
1615
+ // elem.prop('value', val);
1616
+ // replaceInputUI['datetime-local'].blockAttr = false;
1617
+ // e.stopImmediatePropagation();
1618
+ // triggerInlineForm(elem[0], 'input');
1619
+ // triggerInlineForm(elem[0], 'change');
1620
+ // });
1621
+ //
1622
+ //
1623
+ //
1624
+ // date.attr('aria-labelledby', attr.label.attr('id'));
1625
+ // attr.label.bind('click', function(){
1626
+ // datePicker.focus();
1627
+ // return false;
1628
+ // });
1629
+ //
1630
+ // if(attr.css){
1631
+ // date.css(attr.css);
1632
+ // if(attr.outerWidth){
1633
+ // date.outerWidth(attr.outerWidth);
1634
+ // var width = date.width();
1635
+ // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
1636
+ // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
1637
+ // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
1638
+ // if(data.trigger[0]){
1639
+ // adjustInputWithBtn(datePicker, data.trigger);
1640
+ // }
1641
+ // }
1642
+ // }
1643
+ //
1644
+ //
1645
+ // };
1646
+ //
1647
+ // replaceInputUI['datetime-local'].attrs = {
1648
+ // disabled: function(orig, shim, value){
1649
+ // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
1650
+ // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
1651
+ // },
1652
+ // step: function(orig, shim, value){
1653
+ // $('input.input-datetime-local-time', shim).attr('step', value);
1654
+ // },
1655
+ // //ToDo: use min also on time
1656
+ // min: function(orig, shim, value){
1657
+ // if(value){
1658
+ // value = (value.split) ? value.split('T') : [];
1659
+ // try {
1660
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
1661
+ // } catch(e){value = false;}
1662
+ // }
1663
+ // if(!value){
1664
+ // value = null;
1665
+ // }
1666
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
1667
+ //
1668
+ // },
1669
+ // //ToDo: use max also on time
1670
+ // max: function(orig, shim, value){
1671
+ // if(value){
1672
+ // value = (value.split) ? value.split('T') : [];
1673
+ // try {
1674
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
1675
+ // } catch(e){value = false;}
1676
+ // }
1677
+ // if(!value){
1678
+ // value = null;
1679
+ // }
1680
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
1681
+ // },
1682
+ // value: function(orig, shim, value){
1683
+ // var dateValue;
1684
+ // if(value){
1685
+ // value = (value.split) ? value.split('T') : [];
1686
+ // try {
1687
+ // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
1688
+ // } catch(e){dateValue = false;}
1689
+ // }
1690
+ // if(dateValue){
1691
+ // if(!replaceInputUI['datetime-local'].blockAttr){
1692
+ // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
1693
+ // }
1694
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
1695
+ // } else {
1696
+ // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
1697
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
1698
+ // }
1699
+ //
1700
+ //
1701
+ // }
1702
+ // };
1703
+
1704
+
1705
+ replaceInputUI.date = function(elem){
1706
+
1707
+ if(!$.fn.datepicker){return;}
1708
+ var date = $('<input class="input-date" type="text" />'),
1709
+
1710
+ change = function(e){
1711
+
1712
+ replaceInputUI.date.blockAttr = true;
1713
+ var value;
1714
+ if(options.lazyDate){
1715
+ var timer = $.data(date[0], 'setDateLazyTimer');
1716
+ if(timer){
1717
+ clearTimeout(timer);
1718
+ $.removeData(date[0], 'setDateLazyTimer');
1719
+ }
1720
+ }
1721
+ try {
1722
+ value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
1723
+ value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
1724
+ } catch(e){
1725
+ value = date.prop('value');
1726
+ }
1727
+ elem.prop('value', value);
1728
+ replaceInputUI.date.blockAttr = false;
1729
+ e.stopImmediatePropagation();
1730
+ triggerInlineForm(elem[0], 'input');
1731
+ triggerInlineForm(elem[0], 'change');
1732
+ },
1733
+ data
1734
+
1735
+ ;
1736
+
1737
+ this.common(elem, date, replaceInputUI.date.attrs);
1738
+
1739
+ data = configureDatePicker(elem, date, change);
1740
+
1741
+ $(elem)
1742
+ .bind('updateshadowdom', function(){
1743
+ if (data.trigger[0]) {
1744
+ elem.css({display: ''});
1745
+ if(elem[0].offsetWidth || elem[0].offsetHeight){
1746
+ var attr = getDimensions(elem);
1747
+ if (attr.css) {
1748
+ date.css(attr.css);
1749
+ if (attr.outerWidth) {
1750
+ date.outerWidth(attr.outerWidth);
1751
+ }
1752
+ adjustInputWithBtn(date, data.trigger);
1753
+ }
1754
+ }
1755
+ }
1756
+ elem.css({display: 'none'});
1757
+ })
1758
+ .triggerHandler('updateshadowdom')
1759
+ ;
1760
+ if (data.trigger[0]) {
1761
+ setTimeout(function(){
1762
+ webshims.ready('WINDOWLOAD', function(){
1763
+ $(elem).triggerHandler('updateshadowdom');
1764
+ });
1765
+ }, 9);
1766
+ }
1767
+
1768
+ };
1769
+
1770
+
1771
+ replaceInputUI.date.attrs = {
1772
+ disabled: function(orig, shim, value){
1773
+ $.prop(shim, 'disabled', !!value);
1774
+ },
1775
+ min: function(orig, shim, value){
1776
+ try {
1777
+ value = $.datepicker.parseDate('yy-mm-dd', value);
1778
+ } catch(e){value = false;}
1779
+ if(value){
1780
+ $(shim).datepicker('option', 'minDate', value);
1781
+ }
1782
+ },
1783
+ max: function(orig, shim, value){
1784
+ try {
1785
+ value = $.datepicker.parseDate('yy-mm-dd', value);
1786
+ } catch(e){value = false;}
1787
+ if(value){
1788
+ $(shim).datepicker('option', 'maxDate', value);
1789
+ }
1790
+ },
1791
+ 'data-placeholder': function(orig, shim, value){
1792
+ var hintValue = (value || '').split('-');
1793
+ var dateFormat;
1794
+ if(hintValue.length == 3){
1795
+ value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
1796
+ }
1797
+ $.prop(shim, 'placeholder', value);
1798
+ },
1799
+ value: function(orig, shim, value){
1800
+ if(!replaceInputUI.date.blockAttr){
1801
+ try {
1802
+ var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
1803
+ } catch(e){var dateValue = false;}
1804
+
1805
+ if(dateValue){
1806
+ lazySetDate($(shim), dateValue);
1807
+ } else {
1808
+ $.prop(shim, 'value', value);
1809
+ }
1810
+ }
1811
+ }
1812
+ };
1813
+ }
1814
+ if (!modernizrInputTypes.range || options.replaceUI) {
1815
+ replaceInputUI.range = function(elem){
1816
+ if(!$.fn.slider){return;}
1817
+ var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
1818
+ change = function(e, ui){
1819
+ if(e.originalEvent){
1820
+ replaceInputUI.range.blockAttr = true;
1821
+ elem.prop('value', ui.value);
1822
+ replaceInputUI.range.blockAttr = false;
1823
+ triggerInlineForm(elem[0], 'input');
1824
+ triggerInlineForm(elem[0], 'change');
1825
+ }
1826
+ }
1827
+ ;
1828
+
1829
+ this.common(elem, range, replaceInputUI.range.attrs);
1830
+
1831
+
1832
+ elem
1833
+ .bind('updateshadowdom', function(){
1834
+ elem.css({display: ''});
1835
+ if (elem[0].offsetWidth || elem[0].offsetHeight) {
1836
+ var attr = getDimensions(elem);
1837
+ if (attr.css) {
1838
+ range.css(attr.css);
1839
+ if (attr.outerWidth) {
1840
+ range.outerWidth(attr.outerWidth);
1841
+ }
1842
+ }
1843
+ }
1844
+ elem.css({display: 'none'});
1845
+ })
1846
+ .triggerHandler('updateshadowdom')
1847
+ ;
1848
+
1849
+
1850
+ range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change);
1851
+
1852
+ ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
1853
+ var val = elem.prop(name);
1854
+ var shadow;
1855
+ if(name == 'value' && !val){
1856
+
1857
+ shadow = elem.getShadowElement();
1858
+ if(shadow){
1859
+ val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
1860
+ }
1861
+ }
1862
+ if(val != null){
1863
+ elem.prop(name, val);
1864
+ }
1865
+ });
1866
+ };
1867
+
1868
+ replaceInputUI.range.attrs = {
1869
+ disabled: function(orig, shim, value){
1870
+ value = !!value;
1871
+ $(shim).slider( "option", "disabled", value );
1872
+ $('span', shim)
1873
+ .attr({
1874
+ 'aria-disabled': value+'',
1875
+ 'tabindex': (value) ? '-1' : '0'
1876
+ })
1877
+ ;
1878
+ },
1879
+ min: function(orig, shim, value){
1880
+ value = (value) ? value * 1 || 0 : 0;
1881
+ $(shim).slider( "option", "min", value );
1882
+ $('span', shim).attr({'aria-valuemin': value});
1883
+ },
1884
+ max: function(orig, shim, value){
1885
+ value = (value || value === 0) ? value * 1 || 100 : 100;
1886
+ $(shim).slider( "option", "max", value );
1887
+ $('span', shim).attr({'aria-valuemax': value});
1888
+ },
1889
+ value: function(orig, shim, value){
1890
+ value = $(orig).prop('valueAsNumber');
1891
+ if(!isNaN(value)){
1892
+ if(!replaceInputUI.range.blockAttr){
1893
+ $(shim).slider( "option", "value", value );
1894
+ }
1895
+ $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
1896
+ }
1897
+ },
1898
+ step: function(orig, shim, value){
1899
+ value = (value && $.trim(value)) ? value * 1 || 1 : 1;
1900
+ $(shim).slider( "option", "step", value );
1901
+ }
1902
+ };
1903
+ }
1904
+
1905
+ if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
1906
+ var reflectFn = function(val){
1907
+ if(webshims.data(this, 'hasShadow')){
1908
+ $.prop(this, 'value', $.prop(this, 'value'));
1909
+ }
1910
+ };
1911
+
1912
+ webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
1913
+ webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
1914
+ }
1915
+
1916
+ $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
1917
+ webshims.onNodeNamesPropertyModify('input', attr, function(val){
1918
+ var shadowData = webshims.data(this, 'shadowData');
1919
+ if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
1920
+ shadowData.data[attr](this, shadowData.shadowElement, val);
1921
+ }
1922
+ }
1923
+ );
1924
+ });
1925
+ if(!options.availabeLangs){
1926
+ options.availabeLangs = 'af ar ar-DZ az bg bs ca cs da de el en-AU en-GB en-NZ eo es et eu fa fi fo fr fr-CH gl he hr hu hy id is it ja ko kz lt lv ml ms nl no pl pt-BR rm ro ru sk sl sq sr sr-SR sv ta th tr uk vi zh-CN zh-HK zh-TW'.split(' ');
1927
+ }
1928
+
1929
+ var getDefaults = function(){
1930
+ if(!$.datepicker){return;}
1931
+
1932
+ webshims.activeLang({
1933
+ langObj: $.datepicker.regional,
1934
+ module: 'form-number-date-ui',
1935
+ callback: function(langObj){
1936
+ var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1937
+
1938
+
1939
+ if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1940
+ $('input.hasDatepicker')
1941
+ .filter('.input-date, .input-datetime-local-date')
1942
+ .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1943
+ .getNativeElement()
1944
+ .filter('[data-placeholder]')
1945
+ .attr('data-placeholder', function(i, val){
1946
+ return val;
1947
+ })
1948
+ ;
1949
+ }
1950
+ $.datepicker.setDefaults(datepickerCFG);
1951
+ }
1952
+ });
1953
+ $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1954
+ };
1955
+
1956
+ $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1957
+ getDefaults();
1958
+
1959
+ //implement set/arrow controls
1960
+ (function(){
1961
+ var supportsType = (function(){
1962
+ var types = {};
1963
+ return function(type){
1964
+ if(type in types){
1965
+ return types[type];
1966
+ }
1967
+ return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1968
+ };
1969
+ })();
1970
+
1971
+ if(supportsType('number')/* && supportsType('time')*/){return;}
1972
+ var doc = document;
1973
+ var options = webshims.cfg["forms-ext"];
1974
+ var typeModels = webshims.inputTypes;
1975
+
1976
+ var getNextStep = function(input, upDown, cache){
1977
+
1978
+ cache = cache || {};
1979
+
1980
+ if( !('type' in cache) ){
1981
+ cache.type = $.prop(input, 'type');
1982
+ }
1983
+ if( !('step' in cache) ){
1984
+ cache.step = webshims.getStep(input, cache.type);
1985
+ }
1986
+ if( !('valueAsNumber' in cache) ){
1987
+ cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1988
+ }
1989
+ var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1990
+ ret
1991
+ ;
1992
+ webshims.addMinMaxNumberToCache('min', $(input), cache);
1993
+ webshims.addMinMaxNumberToCache('max', $(input), cache);
1994
+
1995
+ if(isNaN(cache.valueAsNumber)){
1996
+ cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1997
+ }
1998
+ //make a valid step
1999
+ if(cache.step !== 'any'){
2000
+ ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
2001
+ if(ret && Math.abs(ret) != cache.step){
2002
+ cache.valueAsNumber = cache.valueAsNumber - ret;
2003
+ }
2004
+ }
2005
+ ret = cache.valueAsNumber + (delta * upDown);
2006
+ //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
2007
+ if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
2008
+ ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
2009
+ } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
2010
+ ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
2011
+ } else {
2012
+ ret = Math.round( ret * 1e7) / 1e7;
2013
+ }
2014
+ return ret;
2015
+ };
2016
+
2017
+ webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
2018
+
2019
+ var doSteps = function(input, type, control){
2020
+ if(input.disabled || input.readOnly || $(control).hasClass('step-controls')){return;}
2021
+ $.prop(input, 'value', typeModels[type].numberToString(getNextStep(input, ($(control).hasClass('step-up')) ? 1 : -1, {type: type})));
2022
+ $(input).unbind('blur.stepeventshim');
2023
+ triggerInlineForm(input, 'input');
2024
+
2025
+
2026
+ if( doc.activeElement ){
2027
+ if(doc.activeElement !== input){
2028
+ try {input.focus();} catch(e){}
2029
+ }
2030
+ setTimeout(function(){
2031
+ if(doc.activeElement !== input){
2032
+ try {input.focus();} catch(e){}
2033
+ }
2034
+ $(input)
2035
+ .one('blur.stepeventshim', function(){
2036
+ triggerInlineForm(input, 'change');
2037
+ })
2038
+ ;
2039
+ }, 0);
2040
+
2041
+ }
2042
+ };
2043
+
2044
+
2045
+ if(options.stepArrows){
2046
+ var stepDisableEnable = {
2047
+ // don't change getter
2048
+ set: function(value){
2049
+ var stepcontrols = webshims.data(this, 'step-controls');
2050
+ if(stepcontrols){
2051
+ stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
2052
+ }
2053
+ }
2054
+ };
2055
+ webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
2056
+ webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
2057
+ }
2058
+ var stepKeys = {
2059
+ 38: 1,
2060
+ 40: -1
2061
+ };
2062
+ webshims.addReady(function(context, contextElem){
2063
+ //ui for numeric values
2064
+ if(options.stepArrows){
2065
+ $('input', context).add(contextElem.filter('input')).each(function(){
2066
+ var type = $.prop(this, 'type');
2067
+ if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
2068
+ var elem = this;
2069
+ var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
2070
+ .insertAfter(elem)
2071
+ .bind('selectstart dragstart', function(){return false;})
2072
+ .bind('mousedown mousepress', function(e){
2073
+ doSteps(elem, type, e.target);
2074
+ return false;
2075
+ })
2076
+ .bind('mousepressstart mousepressend', function(e){
2077
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
2078
+ })
2079
+ ;
2080
+ var mwheelUpDown = function(e, d){
2081
+ if(elem.disabled || elem.readOnly || !d){return;}
2082
+ $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, d, {type: type})));
2083
+ triggerInlineForm(elem, 'input');
2084
+ return false;
2085
+ };
2086
+ var jElm = $(elem)
2087
+ .addClass('has-step-controls')
2088
+ .attr({
2089
+ readonly: elem.readOnly,
2090
+ disabled: elem.disabled,
2091
+ autocomplete: 'off',
2092
+ role: 'spinbutton'
2093
+ })
2094
+ .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
2095
+ if(elem.disabled || elem.readOnly || !stepKeys[e.keyCode]){return;}
2096
+ $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, stepKeys[e.keyCode], {type: type})));
2097
+ triggerInlineForm(elem, 'input');
2098
+ return false;
2099
+ })
2100
+ ;
2101
+ if(type == 'number'){
2102
+ jElm.bind('keypress', (function(){
2103
+ var chars = '0123456789.';
2104
+ return function(event){
2105
+ var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
2106
+ return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
2107
+ };
2108
+ })());
2109
+ }
2110
+ if($.fn.mwheelIntent){
2111
+ jElm.add(controls).bind('mwheelIntent', mwheelUpDown);
2112
+ } else if($.fn.mousewheel) {
2113
+ jElm
2114
+ .bind('focus', function(){
2115
+ jElm.add(controls).unbind('.mwhellwebshims')
2116
+ .bind('mousewheel.mwhellwebshims', mwheelUpDown)
2117
+ ;
2118
+ })
2119
+ .bind('blur', function(){
2120
+ $(elem).add(controls).unbind('.mwhellwebshims');
2121
+ })
2122
+ ;
2123
+ }
2124
+ webshims.data(elem, 'step-controls', controls);
2125
+ if(options.calculateWidth){
2126
+ var init;
2127
+ jElm
2128
+ .bind('updateshadowdom', function(){
2129
+ if(!init && (elem.offsetWidth || elem.offsetHeight)){
2130
+ init = true;
2131
+ adjustInputWithBtn(jElm, controls);
2132
+ controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
2133
+ }
2134
+ })
2135
+ .triggerHandler('updateshadowdom')
2136
+ ;
2137
+ }
2138
+ });
2139
+ }
2140
+ });
2141
+ })();
2142
+
2143
+
2144
+ webshims.addReady(function(context, elem){
2145
+ $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
2146
+ if($.datepicker || $.fn.slider){
2147
+ if($.datepicker && !defaultDatepicker.dateFormat){
2148
+ defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
2149
+ }
2150
+ replaceInputUI(context, elem);
2151
+ }
2152
+ if($.datepicker && $.fn.slider){
2153
+ $(document).unbind('.initinputui');
2154
+ } else if(!webshims.modules["input-widgets"].src){
2155
+ webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
2156
+ }
2157
+ });
2158
+ });
2159
+
2160
+ });
2161
+