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,384 @@
1
+ jQuery.webshims.register('form-number-date-api', function($, webshims, window, document, undefined){
2
+ "use strict";
3
+
4
+ //ToDo
5
+ if(!webshims.getStep){
6
+ webshims.getStep = function(elem, type){
7
+ var step = $.attr(elem, 'step');
8
+ if(step === 'any'){
9
+ return step;
10
+ }
11
+ type = type || getType(elem);
12
+ if(!typeModels[type] || !typeModels[type].step){
13
+ return step;
14
+ }
15
+ step = typeProtos.number.asNumber(step);
16
+ return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * typeModels[type].stepScaleFactor;
17
+ };
18
+ }
19
+ if(!webshims.addMinMaxNumberToCache){
20
+ webshims.addMinMaxNumberToCache = function(attr, elem, cache){
21
+ if (!(attr+'AsNumber' in cache)) {
22
+ cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
23
+ if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
24
+ cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
25
+ }
26
+ }
27
+ };
28
+ }
29
+
30
+ var nan = parseInt('NaN', 10),
31
+ doc = document,
32
+ typeModels = webshims.inputTypes,
33
+ isNumber = function(string){
34
+ return (typeof string == 'number' || (string && string == string * 1));
35
+ },
36
+ supportsType = function(type){
37
+ return ($('<input type="'+type+'" />').prop('type') === type);
38
+ },
39
+ getType = function(elem){
40
+ return (elem.getAttribute('type') || '').toLowerCase();
41
+ },
42
+ isDateTimePart = function(string){
43
+ return (isNumber(string) || (string && string == '0' + (string * 1)));
44
+ },
45
+ addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
46
+ addleadingZero = function(val, len){
47
+ val = ''+val;
48
+ len = len - val.length;
49
+ for(var i = 0; i < len; i++){
50
+ val = '0'+val;
51
+ }
52
+ return val;
53
+ },
54
+ EPS = 1e-7,
55
+ typeBugs = webshims.bugs.valueAsNumberSet || webshims.bugs.bustedValidity
56
+ ;
57
+
58
+ webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
59
+ if(val === ''){return false;}
60
+ if(!('type' in cache)){
61
+ cache.type = getType(input[0]);
62
+ }
63
+ //stepmismatch with date is computable, but it would be a typeMismatch (performance)
64
+ if(cache.type == 'date'){
65
+ return false;
66
+ }
67
+ var ret = (validityState || {}).stepMismatch, base;
68
+ if(typeModels[cache.type] && typeModels[cache.type].step){
69
+ if( !('step' in cache) ){
70
+ cache.step = webshims.getStep(input[0], cache.type);
71
+ }
72
+
73
+ if(cache.step == 'any'){return false;}
74
+
75
+ if(!('valueAsNumber' in cache)){
76
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
77
+ }
78
+ if(isNaN(cache.valueAsNumber)){return false;}
79
+
80
+ addMinMaxNumberToCache('min', input, cache);
81
+ base = cache.minAsNumber;
82
+ if(isNaN(base)){
83
+ base = typeModels[cache.type].stepBase || 0;
84
+ }
85
+
86
+ ret = Math.abs((cache.valueAsNumber - base) % cache.step);
87
+
88
+ ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
89
+ }
90
+ return ret;
91
+ });
92
+
93
+
94
+
95
+ [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
96
+ webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
97
+ var ret = (validityState || {})[data.name] || false;
98
+ if(val === ''){return ret;}
99
+ if (!('type' in cache)) {
100
+ cache.type = getType(input[0]);
101
+ }
102
+ if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
103
+ if(!('valueAsNumber' in cache)){
104
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
105
+ }
106
+ if(isNaN(cache.valueAsNumber)){
107
+ return false;
108
+ }
109
+
110
+ addMinMaxNumberToCache(data.attr, input, cache);
111
+
112
+ if(isNaN(cache[data.attr+'AsNumber'])){
113
+ return ret;
114
+ }
115
+ ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
116
+ }
117
+ return ret;
118
+ });
119
+ });
120
+
121
+ webshims.reflectProperties(['input'], ['max', 'min', 'step']);
122
+
123
+
124
+ //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
125
+ var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
126
+ prop: {
127
+ get: function(){
128
+ var elem = this;
129
+ var type = getType(elem);
130
+ var ret = (typeModels[type] && typeModels[type].asNumber) ?
131
+ typeModels[type].asNumber($.prop(elem, 'value')) :
132
+ (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
133
+ if(ret == null){
134
+ ret = nan;
135
+ }
136
+ return ret;
137
+ },
138
+ set: function(val){
139
+ var elem = this;
140
+ var type = getType(elem);
141
+ if(typeModels[type] && typeModels[type].numberToString){
142
+ //is NaN a number?
143
+ if(isNaN(val)){
144
+ $.prop(elem, 'value', '');
145
+ return;
146
+ }
147
+ var set = typeModels[type].numberToString(val);
148
+ if(set !== false){
149
+ $.prop(elem, 'value', set);
150
+ } else {
151
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
152
+ }
153
+ } else {
154
+ valueAsNumberDescriptor.prop._supset && valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
155
+ }
156
+ }
157
+ }
158
+ });
159
+
160
+ var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
161
+ prop: {
162
+ get: function(){
163
+ var elem = this;
164
+ var type = getType(elem);
165
+ return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
166
+ typeModels[type].asDate($.prop(elem, 'value')) :
167
+ valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
168
+ },
169
+ set: function(value){
170
+ var elem = this;
171
+ var type = getType(elem);
172
+ if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
173
+
174
+ if(value === null){
175
+ $.prop(elem, 'value', '');
176
+ return '';
177
+ }
178
+ var set = typeModels[type].dateToString(value);
179
+ if(set !== false){
180
+ $.prop(elem, 'value', set);
181
+ return set;
182
+ } else {
183
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
184
+ }
185
+ } else {
186
+ return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
187
+ }
188
+ }
189
+ }
190
+ });
191
+
192
+ var typeProtos = {
193
+
194
+ number: {
195
+ mismatch: function(val){
196
+ return !(isNumber(val));
197
+ },
198
+ step: 1,
199
+ //stepBase: 0, 0 = default
200
+ stepScaleFactor: 1,
201
+ asNumber: function(str){
202
+ return (isNumber(str)) ? str * 1 : nan;
203
+ },
204
+ numberToString: function(num){
205
+ return (isNumber(num)) ? num : false;
206
+ }
207
+ },
208
+
209
+ range: {
210
+ minDefault: 0,
211
+ maxDefault: 100
212
+ },
213
+
214
+ date: {
215
+ mismatch: function(val){
216
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
217
+ var valA = val.split(/\u002D/);
218
+ if(valA.length !== 3){return true;}
219
+ var ret = false;
220
+ $.each(valA, function(i, part){
221
+ if(!isDateTimePart(part)){
222
+ ret = true;
223
+ return false;
224
+ }
225
+ });
226
+ if(ret){return ret;}
227
+ if(valA[0].length !== 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
228
+ ret = true;
229
+ }
230
+ return (val !== this.dateToString( this.asDate(val, true) ) );
231
+ },
232
+ step: 1,
233
+ //stepBase: 0, 0 = default
234
+ stepScaleFactor: 86400000,
235
+ asDate: function(val, _noMismatch){
236
+ if(!_noMismatch && this.mismatch(val)){
237
+ return null;
238
+ }
239
+ return new Date(this.asNumber(val, true));
240
+ },
241
+ asNumber: function(str, _noMismatch){
242
+ var ret = nan;
243
+ if(_noMismatch || !this.mismatch(str)){
244
+ str = str.split(/\u002D/);
245
+ ret = Date.UTC(str[0], str[1] - 1, str[2]);
246
+ }
247
+ return ret;
248
+ },
249
+ numberToString: function(num){
250
+ return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
251
+ },
252
+ dateToString: function(date){
253
+ return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
254
+ }
255
+ }
256
+ // ,time: {
257
+ // mismatch: function(val, _getParsed){
258
+ // if(!val || !val.split || !(/\d$/.test(val))){return true;}
259
+ // val = val.split(/\u003A/);
260
+ // if(val.length < 2 || val.length > 3){return true;}
261
+ // var ret = false,
262
+ // sFraction;
263
+ // if(val[2]){
264
+ // val[2] = val[2].split(/\u002E/);
265
+ // sFraction = parseInt(val[2][1], 10);
266
+ // val[2] = val[2][0];
267
+ // }
268
+ // $.each(val, function(i, part){
269
+ // if(!isDateTimePart(part) || part.length !== 2){
270
+ // ret = true;
271
+ // return false;
272
+ // }
273
+ // });
274
+ // if(ret){return true;}
275
+ // if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
276
+ // return true;
277
+ // }
278
+ // if(val[2] && (val[2] > 59 || val[2] < 0 )){
279
+ // return true;
280
+ // }
281
+ // if(sFraction && isNaN(sFraction)){
282
+ // return true;
283
+ // }
284
+ // if(sFraction){
285
+ // if(sFraction < 100){
286
+ // sFraction *= 100;
287
+ // } else if(sFraction < 10){
288
+ // sFraction *= 10;
289
+ // }
290
+ // }
291
+ // return (_getParsed === true) ? [val, sFraction] : false;
292
+ // },
293
+ // step: 60,
294
+ // stepBase: 0,
295
+ // stepScaleFactor: 1000,
296
+ // asDate: function(val){
297
+ // val = new Date(this.asNumber(val));
298
+ // return (isNaN(val)) ? null : val;
299
+ // },
300
+ // asNumber: function(val){
301
+ // var ret = nan;
302
+ // val = this.mismatch(val, true);
303
+ // if(val !== true){
304
+ // ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
305
+ // if(val[1]){
306
+ // ret += val[1];
307
+ // }
308
+ // }
309
+ // return ret;
310
+ // },
311
+ // dateToString: function(date){
312
+ // if(date && date.getUTCHours){
313
+ // var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
314
+ // tmp = date.getSeconds()
315
+ // ;
316
+ // if(tmp != "0"){
317
+ // str += ':'+ addleadingZero(tmp, 2);
318
+ // }
319
+ // tmp = date.getUTCMilliseconds();
320
+ // if(tmp != "0"){
321
+ // str += '.'+ addleadingZero(tmp, 3);
322
+ // }
323
+ // return str;
324
+ // } else {
325
+ // return false;
326
+ // }
327
+ // }
328
+ // }
329
+ // ,'datetime-local': {
330
+ // mismatch: function(val, _getParsed){
331
+ // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
332
+ // val = val.split(/\u0054/);
333
+ // return ( typeProtos.date.mismatch(val[0]) || typeProtos.time.mismatch(val[1], _getParsed) );
334
+ // },
335
+ // noAsDate: true,
336
+ // asDate: function(val){
337
+ // val = new Date(this.asNumber(val));
338
+ //
339
+ // return (isNaN(val)) ? null : val;
340
+ // },
341
+ // asNumber: function(val){
342
+ // var ret = nan;
343
+ // var time = this.mismatch(val, true);
344
+ // if(time !== true){
345
+ // val = val.split(/\u0054/)[0].split(/\u002D/);
346
+ //
347
+ // ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
348
+ // if(time[1]){
349
+ // ret += time[1];
350
+ // }
351
+ // }
352
+ // return ret;
353
+ // },
354
+ // dateToString: function(date, _getParsed){
355
+ // return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
356
+ // }
357
+ // }
358
+ };
359
+
360
+ if(typeBugs || !supportsType('range') || !supportsType('time')){
361
+ typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
362
+ // typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
363
+ // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
364
+ }
365
+
366
+ if(typeBugs || !supportsType('number')){
367
+ webshims.addInputType('number', typeProtos.number);
368
+ }
369
+
370
+ if(typeBugs || !supportsType('range')){
371
+ webshims.addInputType('range', typeProtos.range);
372
+ }
373
+ if(typeBugs || !supportsType('date')){
374
+ webshims.addInputType('date', typeProtos.date);
375
+ }
376
+ // if(typeBugs || !supportsType('time')){
377
+ // webshims.addInputType('time', typeProtos.time);
378
+ // }
379
+
380
+ // if(typeBugs || !supportsType('datetime-local')){
381
+ // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
382
+ // }
383
+
384
+ });
@@ -0,0 +1,847 @@
1
+ /* number-date-ui */
2
+ /* https://github.com/aFarkas/webshim/issues#issue/23 */
3
+ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
4
+ "use strict";
5
+
6
+ var triggerInlineForm = webshims.triggerInlineForm;
7
+ var modernizrInputTypes = Modernizr.inputtypes;
8
+ var adjustInputWithBtn = (function(){
9
+ var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
10
+ var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
11
+ if($.browser.msie && webshims.browserVersion < 8){
12
+ boxSizing = false;
13
+ }
14
+ var getWidth = function(input){
15
+ var widthFn = "width";
16
+ if(boxSizing){
17
+ widthFn = fns[input.css(boxSizing)] || widthFn;
18
+ }
19
+
20
+ return {
21
+ w: input[widthFn](),
22
+ add: widthFn == "width"
23
+ };
24
+
25
+ };
26
+
27
+
28
+ return function(input, button){
29
+ var inputDim = getWidth(input);
30
+ if(!inputDim.w){return;}
31
+ var controlDim = {
32
+ mL: (parseInt(button.css('marginLeft'), 10) || 0),
33
+ w: button.outerWidth()
34
+ };
35
+ inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
36
+ if(inputDim.mR){
37
+ input.css('marginRight', 0);
38
+ }
39
+ //is inside
40
+ if( controlDim.mL <= (controlDim.w * -1) ){
41
+ button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
42
+ input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
43
+ if(inputDim.add){
44
+ input.css('width', Math.floor(inputDim.w + controlDim.mL));
45
+ }
46
+ } else {
47
+ button.css('marginRight', inputDim.mR);
48
+ input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
49
+ }
50
+ };
51
+ })();
52
+
53
+
54
+ var defaultDatepicker = {};
55
+ var labelID = 0;
56
+ var emptyJ = $([]);
57
+ var isCheckValidity;
58
+ var replaceInputUI = function(context, elem){
59
+ $('input', context).add(elem.filter('input')).each(function(){
60
+ var type = $.prop(this, 'type');
61
+ if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
62
+ replaceInputUI[type]($(this));
63
+ }
64
+ });
65
+ };
66
+ //set date is extremly slow in IE so we do it lazy
67
+ var lazySetDate = function(elem, date){
68
+ if(!options.lazyDate){
69
+ elem.datepicker('setDate', date);
70
+ return;
71
+ }
72
+ var timer = $.data(elem[0], 'setDateLazyTimer');
73
+ if(timer){
74
+ clearTimeout(timer);
75
+ }
76
+ $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
77
+ elem.datepicker('setDate', date);
78
+ $.removeData(elem[0], 'setDateLazyTimer');
79
+ elem = null;
80
+ }, 0));
81
+ };
82
+
83
+
84
+ var copyAttrs = {
85
+ tabindex: 1,
86
+ tabIndex: 1,
87
+ title: 1,
88
+ "aria-required": 1,
89
+ "aria-invalid": 1
90
+ };
91
+ if(!options.copyAttrs){
92
+ options.copyAttrs = {};
93
+ }
94
+
95
+ webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
96
+
97
+ var getDimensions = function(orig){
98
+ return (options.calculateWidth) ?
99
+ {
100
+ css: {
101
+ marginRight: orig.css('marginRight'),
102
+ marginLeft: orig.css('marginLeft')
103
+ },
104
+ outerWidth: orig.outerWidth()
105
+
106
+ } :
107
+ {}
108
+ ;
109
+ };
110
+ var focusAttrs = copyAttrs;
111
+
112
+ replaceInputUI.common = function(orig, shim, methods){
113
+ if(Modernizr.formvalidation){
114
+ orig.bind('firstinvalid', function(e){
115
+ if(!webshims.fromSubmit && isCheckValidity){return;}
116
+ orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
117
+ if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
118
+ webshims.validityAlert.showFor( e.target );
119
+ e.preventDefault();
120
+ evt.preventDefault();
121
+ }
122
+ orig.unbind('invalid.replacedwidgetbubble');
123
+ });
124
+ });
125
+ }
126
+ var i, prop;
127
+ var focusElement = $('input, span.ui-slider-handle', shim);
128
+ var attrs = orig[0].attributes;
129
+ for(i in options.copyAttrs){
130
+ if ((prop = attrs[i]) && prop.specified) {
131
+ if(focusAttrs[i] && focusElement[0]){
132
+ focusElement.attr(i, prop.nodeValue);
133
+ } else {
134
+ shim[0].setAttribute(i, prop.nodeValue);
135
+ }
136
+ }
137
+ }
138
+
139
+ var id = orig.attr('id'),
140
+ label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
141
+ ;
142
+
143
+
144
+
145
+ shim.addClass(orig[0].className);
146
+ webshims.addShadowDom(orig, shim, {
147
+ data: methods || {},
148
+ shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
149
+ shadowChilds: focusElement
150
+ });
151
+
152
+ orig.after(shim);
153
+
154
+ if(orig[0].form){
155
+ $(orig[0].form).bind('reset', function(e){
156
+ if(e.originalEvent && !e.isDefaultPrevented()){
157
+ setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
158
+ }
159
+ });
160
+ }
161
+
162
+ if(label[0]){
163
+ shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
164
+ label.bind('click', function(){
165
+ orig.getShadowFocusElement().focus();
166
+ return false;
167
+ });
168
+ }
169
+ };
170
+
171
+ if(Modernizr.formvalidation){
172
+ ['input', 'form'].forEach(function(name){
173
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
174
+ prop: {
175
+ value: function(){
176
+ isCheckValidity = true;
177
+ var ret = desc.prop._supvalue.apply(this, arguments);
178
+ isCheckValidity = false;
179
+ return ret;
180
+ }
181
+ }
182
+ });
183
+ });
184
+ }
185
+ //date and datetime-local implement if we have to replace
186
+ if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
187
+
188
+ var datetimeFactor = {
189
+ trigger: [0.595,0.395],
190
+ normal: [0.565,0.425]
191
+ };
192
+ var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
193
+
194
+ var configureDatePicker = function(elem, datePicker, change, _wrapper){
195
+ var stopFocusout;
196
+ var focusedOut;
197
+ var resetFocusHandler = function(){
198
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
199
+ stopFocusout = false;
200
+ focusedOut = false;
201
+ };
202
+ var data = datePicker
203
+ .bind('focusin', function(){
204
+ resetFocusHandler();
205
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
206
+ stopFocusout = true;
207
+ });
208
+ })
209
+ .bind('focusout blur', function(e){
210
+ if(stopFocusout){
211
+ focusedOut = true;
212
+ e.stopImmediatePropagation();
213
+ }
214
+ })
215
+ .datepicker($.extend({
216
+ onClose: function(){
217
+ if(focusedOut && datePicker.not(':focus')){
218
+ resetFocusHandler();
219
+ datePicker.trigger('focusout');
220
+ datePicker.triggerHandler('blur');
221
+ } else {
222
+ resetFocusHandler();
223
+ }
224
+ }
225
+ }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
226
+ .bind('change', change)
227
+ .data('datepicker')
228
+ ;
229
+ data.dpDiv.addClass('input-date-datepicker-control');
230
+
231
+ if(_wrapper){
232
+ webshims.triggerDomUpdate(_wrapper[0]);
233
+ }
234
+ ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
235
+ var fn = 'data-placeholder' ? 'attr' : 'prop';
236
+ var val = elem[fn](name);
237
+ if(val){
238
+ elem[fn](name, val);
239
+ }
240
+ });
241
+
242
+ return data;
243
+ };
244
+
245
+ // replaceInputUI['datetime-local'] = function(elem){
246
+ // if(!$.fn.datepicker){return;}
247
+ //
248
+ // 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>'),
249
+ // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
250
+ // datePicker = $('input.input-datetime-local-date', date),
251
+ // datePickerChange = function(e){
252
+ //
253
+ // var value = datePicker.prop('value') || '',
254
+ // timeVal = ''
255
+ // ;
256
+ // if(options.lazyDate){
257
+ // var timer = $.data(datePicker[0], 'setDateLazyTimer');
258
+ // if(timer){
259
+ // clearTimeout(timer);
260
+ // $.removeData(datePicker[0], 'setDateLazyTimer');
261
+ // }
262
+ // }
263
+ //
264
+ // if(value){
265
+ // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
266
+ // try {
267
+ // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
268
+ // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
269
+ // } catch (e) {value = datePicker.prop('value');}
270
+ // }
271
+ // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
272
+ // replaceInputUI['datetime-local'].blockAttr = true;
273
+ // elem.prop('value', value);
274
+ // replaceInputUI['datetime-local'].blockAttr = false;
275
+ // e.stopImmediatePropagation();
276
+ // triggerInlineForm(elem[0], 'input');
277
+ // triggerInlineForm(elem[0], 'change');
278
+ // },
279
+ // data = configureDatePicker(elem, datePicker, datePickerChange, date)
280
+ // ;
281
+ //
282
+ //
283
+ // $('input.input-datetime-local-time', date).bind('change', function(e){
284
+ // var timeVal = $.prop(this, 'value');
285
+ // var val = ['', ''];
286
+ // if(timeVal){
287
+ // val = elem.prop('value').split('T');
288
+ // if((val.length < 2 || !val[0])){
289
+ // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
290
+ // }
291
+ // val[1] = timeVal;
292
+ //
293
+ // if (timeVal) {
294
+ // try {
295
+ // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
296
+ // } catch (e) {}
297
+ // }
298
+ // }
299
+ // val = (!val[0] && !val[1]) ? '' : val.join('T');
300
+ // replaceInputUI['datetime-local'].blockAttr = true;
301
+ // elem.prop('value', val);
302
+ // replaceInputUI['datetime-local'].blockAttr = false;
303
+ // e.stopImmediatePropagation();
304
+ // triggerInlineForm(elem[0], 'input');
305
+ // triggerInlineForm(elem[0], 'change');
306
+ // });
307
+ //
308
+ //
309
+ //
310
+ // date.attr('aria-labelledby', attr.label.attr('id'));
311
+ // attr.label.bind('click', function(){
312
+ // datePicker.focus();
313
+ // return false;
314
+ // });
315
+ //
316
+ // if(attr.css){
317
+ // date.css(attr.css);
318
+ // if(attr.outerWidth){
319
+ // date.outerWidth(attr.outerWidth);
320
+ // var width = date.width();
321
+ // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
322
+ // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
323
+ // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
324
+ // if(data.trigger[0]){
325
+ // adjustInputWithBtn(datePicker, data.trigger);
326
+ // }
327
+ // }
328
+ // }
329
+ //
330
+ //
331
+ // };
332
+ //
333
+ // replaceInputUI['datetime-local'].attrs = {
334
+ // disabled: function(orig, shim, value){
335
+ // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
336
+ // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
337
+ // },
338
+ // step: function(orig, shim, value){
339
+ // $('input.input-datetime-local-time', shim).attr('step', value);
340
+ // },
341
+ // //ToDo: use min also on time
342
+ // min: function(orig, shim, value){
343
+ // if(value){
344
+ // value = (value.split) ? value.split('T') : [];
345
+ // try {
346
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
347
+ // } catch(e){value = false;}
348
+ // }
349
+ // if(!value){
350
+ // value = null;
351
+ // }
352
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
353
+ //
354
+ // },
355
+ // //ToDo: use max also on time
356
+ // max: function(orig, shim, value){
357
+ // if(value){
358
+ // value = (value.split) ? value.split('T') : [];
359
+ // try {
360
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
361
+ // } catch(e){value = false;}
362
+ // }
363
+ // if(!value){
364
+ // value = null;
365
+ // }
366
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
367
+ // },
368
+ // value: function(orig, shim, value){
369
+ // var dateValue;
370
+ // if(value){
371
+ // value = (value.split) ? value.split('T') : [];
372
+ // try {
373
+ // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
374
+ // } catch(e){dateValue = false;}
375
+ // }
376
+ // if(dateValue){
377
+ // if(!replaceInputUI['datetime-local'].blockAttr){
378
+ // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
379
+ // }
380
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
381
+ // } else {
382
+ // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
383
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
384
+ // }
385
+ //
386
+ //
387
+ // }
388
+ // };
389
+
390
+
391
+ replaceInputUI.date = function(elem){
392
+
393
+ if(!$.fn.datepicker){return;}
394
+ var date = $('<input class="input-date" type="text" />'),
395
+
396
+ change = function(e){
397
+
398
+ replaceInputUI.date.blockAttr = true;
399
+ var value;
400
+ if(options.lazyDate){
401
+ var timer = $.data(date[0], 'setDateLazyTimer');
402
+ if(timer){
403
+ clearTimeout(timer);
404
+ $.removeData(date[0], 'setDateLazyTimer');
405
+ }
406
+ }
407
+ try {
408
+ value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
409
+ value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
410
+ } catch(e){
411
+ value = date.prop('value');
412
+ }
413
+ elem.prop('value', value);
414
+ replaceInputUI.date.blockAttr = false;
415
+ e.stopImmediatePropagation();
416
+ triggerInlineForm(elem[0], 'input');
417
+ triggerInlineForm(elem[0], 'change');
418
+ },
419
+ data
420
+
421
+ ;
422
+
423
+ this.common(elem, date, replaceInputUI.date.attrs);
424
+
425
+ data = configureDatePicker(elem, date, change);
426
+
427
+ $(elem)
428
+ .bind('updateshadowdom', function(){
429
+ if (data.trigger[0]) {
430
+ elem.css({display: ''});
431
+ if(elem[0].offsetWidth || elem[0].offsetHeight){
432
+ var attr = getDimensions(elem);
433
+ if (attr.css) {
434
+ date.css(attr.css);
435
+ if (attr.outerWidth) {
436
+ date.outerWidth(attr.outerWidth);
437
+ }
438
+ adjustInputWithBtn(date, data.trigger);
439
+ }
440
+ }
441
+ }
442
+ elem.css({display: 'none'});
443
+ })
444
+ .triggerHandler('updateshadowdom')
445
+ ;
446
+ if (data.trigger[0]) {
447
+ setTimeout(function(){
448
+ webshims.ready('WINDOWLOAD', function(){
449
+ $(elem).triggerHandler('updateshadowdom');
450
+ });
451
+ }, 9);
452
+ }
453
+
454
+ };
455
+
456
+
457
+ replaceInputUI.date.attrs = {
458
+ disabled: function(orig, shim, value){
459
+ $.prop(shim, 'disabled', !!value);
460
+ },
461
+ min: function(orig, shim, value){
462
+ try {
463
+ value = $.datepicker.parseDate('yy-mm-dd', value);
464
+ } catch(e){value = false;}
465
+ if(value){
466
+ $(shim).datepicker('option', 'minDate', value);
467
+ }
468
+ },
469
+ max: function(orig, shim, value){
470
+ try {
471
+ value = $.datepicker.parseDate('yy-mm-dd', value);
472
+ } catch(e){value = false;}
473
+ if(value){
474
+ $(shim).datepicker('option', 'maxDate', value);
475
+ }
476
+ },
477
+ 'data-placeholder': function(orig, shim, value){
478
+ var hintValue = (value || '').split('-');
479
+ var dateFormat;
480
+ if(hintValue.length == 3){
481
+ value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
482
+ }
483
+ $.prop(shim, 'placeholder', value);
484
+ },
485
+ value: function(orig, shim, value){
486
+ if(!replaceInputUI.date.blockAttr){
487
+ try {
488
+ var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
489
+ } catch(e){var dateValue = false;}
490
+
491
+ if(dateValue){
492
+ lazySetDate($(shim), dateValue);
493
+ } else {
494
+ $.prop(shim, 'value', value);
495
+ }
496
+ }
497
+ }
498
+ };
499
+ }
500
+ if (!modernizrInputTypes.range || options.replaceUI) {
501
+ replaceInputUI.range = function(elem){
502
+ if(!$.fn.slider){return;}
503
+ var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
504
+ change = function(e, ui){
505
+ if(e.originalEvent){
506
+ replaceInputUI.range.blockAttr = true;
507
+ elem.prop('value', ui.value);
508
+ replaceInputUI.range.blockAttr = false;
509
+ triggerInlineForm(elem[0], 'input');
510
+ triggerInlineForm(elem[0], 'change');
511
+ }
512
+ }
513
+ ;
514
+
515
+ this.common(elem, range, replaceInputUI.range.attrs);
516
+
517
+
518
+ elem
519
+ .bind('updateshadowdom', function(){
520
+ elem.css({display: ''});
521
+ if (elem[0].offsetWidth || elem[0].offsetHeight) {
522
+ var attr = getDimensions(elem);
523
+ if (attr.css) {
524
+ range.css(attr.css);
525
+ if (attr.outerWidth) {
526
+ range.outerWidth(attr.outerWidth);
527
+ }
528
+ }
529
+ }
530
+ elem.css({display: 'none'});
531
+ })
532
+ .triggerHandler('updateshadowdom')
533
+ ;
534
+
535
+
536
+ range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change);
537
+
538
+ ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
539
+ var val = elem.prop(name);
540
+ var shadow;
541
+ if(name == 'value' && !val){
542
+
543
+ shadow = elem.getShadowElement();
544
+ if(shadow){
545
+ val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
546
+ }
547
+ }
548
+ if(val != null){
549
+ elem.prop(name, val);
550
+ }
551
+ });
552
+ };
553
+
554
+ replaceInputUI.range.attrs = {
555
+ disabled: function(orig, shim, value){
556
+ value = !!value;
557
+ $(shim).slider( "option", "disabled", value );
558
+ $('span', shim)
559
+ .attr({
560
+ 'aria-disabled': value+'',
561
+ 'tabindex': (value) ? '-1' : '0'
562
+ })
563
+ ;
564
+ },
565
+ min: function(orig, shim, value){
566
+ value = (value) ? value * 1 || 0 : 0;
567
+ $(shim).slider( "option", "min", value );
568
+ $('span', shim).attr({'aria-valuemin': value});
569
+ },
570
+ max: function(orig, shim, value){
571
+ value = (value || value === 0) ? value * 1 || 100 : 100;
572
+ $(shim).slider( "option", "max", value );
573
+ $('span', shim).attr({'aria-valuemax': value});
574
+ },
575
+ value: function(orig, shim, value){
576
+ value = $(orig).prop('valueAsNumber');
577
+ if(!isNaN(value)){
578
+ if(!replaceInputUI.range.blockAttr){
579
+ $(shim).slider( "option", "value", value );
580
+ }
581
+ $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
582
+ }
583
+ },
584
+ step: function(orig, shim, value){
585
+ value = (value && $.trim(value)) ? value * 1 || 1 : 1;
586
+ $(shim).slider( "option", "step", value );
587
+ }
588
+ };
589
+ }
590
+
591
+ if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
592
+ var reflectFn = function(val){
593
+ if(webshims.data(this, 'hasShadow')){
594
+ $.prop(this, 'value', $.prop(this, 'value'));
595
+ }
596
+ };
597
+
598
+ webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
599
+ webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
600
+ }
601
+
602
+ $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
603
+ webshims.onNodeNamesPropertyModify('input', attr, function(val){
604
+ var shadowData = webshims.data(this, 'shadowData');
605
+ if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
606
+ shadowData.data[attr](this, shadowData.shadowElement, val);
607
+ }
608
+ }
609
+ );
610
+ });
611
+ if(!options.availabeLangs){
612
+ 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(' ');
613
+ }
614
+
615
+ var getDefaults = function(){
616
+ if(!$.datepicker){return;}
617
+
618
+ webshims.activeLang({
619
+ langObj: $.datepicker.regional,
620
+ module: 'form-number-date-ui',
621
+ callback: function(langObj){
622
+ var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
623
+
624
+
625
+ if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
626
+ $('input.hasDatepicker')
627
+ .filter('.input-date, .input-datetime-local-date')
628
+ .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
629
+ .getNativeElement()
630
+ .filter('[data-placeholder]')
631
+ .attr('data-placeholder', function(i, val){
632
+ return val;
633
+ })
634
+ ;
635
+ }
636
+ $.datepicker.setDefaults(datepickerCFG);
637
+ }
638
+ });
639
+ $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
640
+ };
641
+
642
+ $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
643
+ getDefaults();
644
+
645
+ //implement set/arrow controls
646
+ (function(){
647
+ var supportsType = (function(){
648
+ var types = {};
649
+ return function(type){
650
+ if(type in types){
651
+ return types[type];
652
+ }
653
+ return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
654
+ };
655
+ })();
656
+
657
+ if(supportsType('number')/* && supportsType('time')*/){return;}
658
+ var doc = document;
659
+ var options = webshims.cfg["forms-ext"];
660
+ var typeModels = webshims.inputTypes;
661
+
662
+ var getNextStep = function(input, upDown, cache){
663
+
664
+ cache = cache || {};
665
+
666
+ if( !('type' in cache) ){
667
+ cache.type = $.prop(input, 'type');
668
+ }
669
+ if( !('step' in cache) ){
670
+ cache.step = webshims.getStep(input, cache.type);
671
+ }
672
+ if( !('valueAsNumber' in cache) ){
673
+ cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
674
+ }
675
+ var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
676
+ ret
677
+ ;
678
+ webshims.addMinMaxNumberToCache('min', $(input), cache);
679
+ webshims.addMinMaxNumberToCache('max', $(input), cache);
680
+
681
+ if(isNaN(cache.valueAsNumber)){
682
+ cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
683
+ }
684
+ //make a valid step
685
+ if(cache.step !== 'any'){
686
+ ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
687
+ if(ret && Math.abs(ret) != cache.step){
688
+ cache.valueAsNumber = cache.valueAsNumber - ret;
689
+ }
690
+ }
691
+ ret = cache.valueAsNumber + (delta * upDown);
692
+ //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
693
+ if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
694
+ ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
695
+ } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
696
+ ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
697
+ } else {
698
+ ret = Math.round( ret * 1e7) / 1e7;
699
+ }
700
+ return ret;
701
+ };
702
+
703
+ webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
704
+
705
+ var doSteps = function(input, type, control){
706
+ if(input.disabled || input.readOnly || $(control).hasClass('step-controls')){return;}
707
+ $.prop(input, 'value', typeModels[type].numberToString(getNextStep(input, ($(control).hasClass('step-up')) ? 1 : -1, {type: type})));
708
+ $(input).unbind('blur.stepeventshim');
709
+ triggerInlineForm(input, 'input');
710
+
711
+
712
+ if( doc.activeElement ){
713
+ if(doc.activeElement !== input){
714
+ try {input.focus();} catch(e){}
715
+ }
716
+ setTimeout(function(){
717
+ if(doc.activeElement !== input){
718
+ try {input.focus();} catch(e){}
719
+ }
720
+ $(input)
721
+ .one('blur.stepeventshim', function(){
722
+ triggerInlineForm(input, 'change');
723
+ })
724
+ ;
725
+ }, 0);
726
+
727
+ }
728
+ };
729
+
730
+
731
+ if(options.stepArrows){
732
+ var stepDisableEnable = {
733
+ // don't change getter
734
+ set: function(value){
735
+ var stepcontrols = webshims.data(this, 'step-controls');
736
+ if(stepcontrols){
737
+ stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
738
+ }
739
+ }
740
+ };
741
+ webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
742
+ webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
743
+ }
744
+ var stepKeys = {
745
+ 38: 1,
746
+ 40: -1
747
+ };
748
+ webshims.addReady(function(context, contextElem){
749
+ //ui for numeric values
750
+ if(options.stepArrows){
751
+ $('input', context).add(contextElem.filter('input')).each(function(){
752
+ var type = $.prop(this, 'type');
753
+ if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
754
+ var elem = this;
755
+ var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
756
+ .insertAfter(elem)
757
+ .bind('selectstart dragstart', function(){return false;})
758
+ .bind('mousedown mousepress', function(e){
759
+ doSteps(elem, type, e.target);
760
+ return false;
761
+ })
762
+ .bind('mousepressstart mousepressend', function(e){
763
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
764
+ })
765
+ ;
766
+ var mwheelUpDown = function(e, d){
767
+ if(elem.disabled || elem.readOnly || !d){return;}
768
+ $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, d, {type: type})));
769
+ triggerInlineForm(elem, 'input');
770
+ return false;
771
+ };
772
+ var jElm = $(elem)
773
+ .addClass('has-step-controls')
774
+ .attr({
775
+ readonly: elem.readOnly,
776
+ disabled: elem.disabled,
777
+ autocomplete: 'off',
778
+ role: 'spinbutton'
779
+ })
780
+ .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
781
+ if(elem.disabled || elem.readOnly || !stepKeys[e.keyCode]){return;}
782
+ $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, stepKeys[e.keyCode], {type: type})));
783
+ triggerInlineForm(elem, 'input');
784
+ return false;
785
+ })
786
+ ;
787
+ if(type == 'number'){
788
+ jElm.bind('keypress', (function(){
789
+ var chars = '0123456789.';
790
+ return function(event){
791
+ var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
792
+ return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
793
+ };
794
+ })());
795
+ }
796
+ if($.fn.mwheelIntent){
797
+ jElm.add(controls).bind('mwheelIntent', mwheelUpDown);
798
+ } else if($.fn.mousewheel) {
799
+ jElm
800
+ .bind('focus', function(){
801
+ jElm.add(controls).unbind('.mwhellwebshims')
802
+ .bind('mousewheel.mwhellwebshims', mwheelUpDown)
803
+ ;
804
+ })
805
+ .bind('blur', function(){
806
+ $(elem).add(controls).unbind('.mwhellwebshims');
807
+ })
808
+ ;
809
+ }
810
+ webshims.data(elem, 'step-controls', controls);
811
+ if(options.calculateWidth){
812
+ var init;
813
+ jElm
814
+ .bind('updateshadowdom', function(){
815
+ if(!init && (elem.offsetWidth || elem.offsetHeight)){
816
+ init = true;
817
+ adjustInputWithBtn(jElm, controls);
818
+ controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
819
+ }
820
+ })
821
+ .triggerHandler('updateshadowdom')
822
+ ;
823
+ }
824
+ });
825
+ }
826
+ });
827
+ })();
828
+
829
+
830
+ webshims.addReady(function(context, elem){
831
+ $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
832
+ if($.datepicker || $.fn.slider){
833
+ if($.datepicker && !defaultDatepicker.dateFormat){
834
+ defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
835
+ }
836
+ replaceInputUI(context, elem);
837
+ }
838
+ if($.datepicker && $.fn.slider){
839
+ $(document).unbind('.initinputui');
840
+ } else if(!webshims.modules["input-widgets"].src){
841
+ webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
842
+ }
843
+ });
844
+ });
845
+
846
+ });
847
+