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,1230 @@
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
+ });/* number-date-ui */
385
+ /* https://github.com/aFarkas/webshim/issues#issue/23 */
386
+ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
387
+ "use strict";
388
+
389
+ var triggerInlineForm = webshims.triggerInlineForm;
390
+ var modernizrInputTypes = Modernizr.inputtypes;
391
+ var adjustInputWithBtn = (function(){
392
+ var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
393
+ var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
394
+ if($.browser.msie && webshims.browserVersion < 8){
395
+ boxSizing = false;
396
+ }
397
+ var getWidth = function(input){
398
+ var widthFn = "width";
399
+ if(boxSizing){
400
+ widthFn = fns[input.css(boxSizing)] || widthFn;
401
+ }
402
+
403
+ return {
404
+ w: input[widthFn](),
405
+ add: widthFn == "width"
406
+ };
407
+
408
+ };
409
+
410
+
411
+ return function(input, button){
412
+ var inputDim = getWidth(input);
413
+ if(!inputDim.w){return;}
414
+ var controlDim = {
415
+ mL: (parseInt(button.css('marginLeft'), 10) || 0),
416
+ w: button.outerWidth()
417
+ };
418
+ inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
419
+ if(inputDim.mR){
420
+ input.css('marginRight', 0);
421
+ }
422
+ //is inside
423
+ if( controlDim.mL <= (controlDim.w * -1) ){
424
+ button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
425
+ input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
426
+ if(inputDim.add){
427
+ input.css('width', Math.floor(inputDim.w + controlDim.mL));
428
+ }
429
+ } else {
430
+ button.css('marginRight', inputDim.mR);
431
+ input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
432
+ }
433
+ };
434
+ })();
435
+
436
+
437
+ var defaultDatepicker = {};
438
+ var labelID = 0;
439
+ var emptyJ = $([]);
440
+ var isCheckValidity;
441
+ var replaceInputUI = function(context, elem){
442
+ $('input', context).add(elem.filter('input')).each(function(){
443
+ var type = $.prop(this, 'type');
444
+ if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
445
+ replaceInputUI[type]($(this));
446
+ }
447
+ });
448
+ };
449
+ //set date is extremly slow in IE so we do it lazy
450
+ var lazySetDate = function(elem, date){
451
+ if(!options.lazyDate){
452
+ elem.datepicker('setDate', date);
453
+ return;
454
+ }
455
+ var timer = $.data(elem[0], 'setDateLazyTimer');
456
+ if(timer){
457
+ clearTimeout(timer);
458
+ }
459
+ $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
460
+ elem.datepicker('setDate', date);
461
+ $.removeData(elem[0], 'setDateLazyTimer');
462
+ elem = null;
463
+ }, 0));
464
+ };
465
+
466
+
467
+ var copyAttrs = {
468
+ tabindex: 1,
469
+ tabIndex: 1,
470
+ title: 1,
471
+ "aria-required": 1,
472
+ "aria-invalid": 1
473
+ };
474
+ if(!options.copyAttrs){
475
+ options.copyAttrs = {};
476
+ }
477
+
478
+ webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
479
+
480
+ var getDimensions = function(orig){
481
+ return (options.calculateWidth) ?
482
+ {
483
+ css: {
484
+ marginRight: orig.css('marginRight'),
485
+ marginLeft: orig.css('marginLeft')
486
+ },
487
+ outerWidth: orig.outerWidth()
488
+
489
+ } :
490
+ {}
491
+ ;
492
+ };
493
+ var focusAttrs = copyAttrs;
494
+
495
+ replaceInputUI.common = function(orig, shim, methods){
496
+ if(Modernizr.formvalidation){
497
+ orig.bind('firstinvalid', function(e){
498
+ if(!webshims.fromSubmit && isCheckValidity){return;}
499
+ orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
500
+ if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
501
+ webshims.validityAlert.showFor( e.target );
502
+ e.preventDefault();
503
+ evt.preventDefault();
504
+ }
505
+ orig.unbind('invalid.replacedwidgetbubble');
506
+ });
507
+ });
508
+ }
509
+ var i, prop;
510
+ var focusElement = $('input, span.ui-slider-handle', shim);
511
+ var attrs = orig[0].attributes;
512
+ for(i in options.copyAttrs){
513
+ if ((prop = attrs[i]) && prop.specified) {
514
+ if(focusAttrs[i] && focusElement[0]){
515
+ focusElement.attr(i, prop.nodeValue);
516
+ } else {
517
+ shim[0].setAttribute(i, prop.nodeValue);
518
+ }
519
+ }
520
+ }
521
+
522
+ var id = orig.attr('id'),
523
+ label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
524
+ ;
525
+
526
+
527
+
528
+ shim.addClass(orig[0].className);
529
+ webshims.addShadowDom(orig, shim, {
530
+ data: methods || {},
531
+ shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
532
+ shadowChilds: focusElement
533
+ });
534
+
535
+ orig.after(shim);
536
+
537
+ if(orig[0].form){
538
+ $(orig[0].form).bind('reset', function(e){
539
+ if(e.originalEvent && !e.isDefaultPrevented()){
540
+ setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
541
+ }
542
+ });
543
+ }
544
+
545
+ if(label[0]){
546
+ shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
547
+ label.bind('click', function(){
548
+ orig.getShadowFocusElement().focus();
549
+ return false;
550
+ });
551
+ }
552
+ };
553
+
554
+ if(Modernizr.formvalidation){
555
+ ['input', 'form'].forEach(function(name){
556
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
557
+ prop: {
558
+ value: function(){
559
+ isCheckValidity = true;
560
+ var ret = desc.prop._supvalue.apply(this, arguments);
561
+ isCheckValidity = false;
562
+ return ret;
563
+ }
564
+ }
565
+ });
566
+ });
567
+ }
568
+ //date and datetime-local implement if we have to replace
569
+ if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
570
+
571
+ var datetimeFactor = {
572
+ trigger: [0.595,0.395],
573
+ normal: [0.565,0.425]
574
+ };
575
+ var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
576
+
577
+ var configureDatePicker = function(elem, datePicker, change, _wrapper){
578
+ var stopFocusout;
579
+ var focusedOut;
580
+ var resetFocusHandler = function(){
581
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
582
+ stopFocusout = false;
583
+ focusedOut = false;
584
+ };
585
+ var data = datePicker
586
+ .bind('focusin', function(){
587
+ resetFocusHandler();
588
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
589
+ stopFocusout = true;
590
+ });
591
+ })
592
+ .bind('focusout blur', function(e){
593
+ if(stopFocusout){
594
+ focusedOut = true;
595
+ e.stopImmediatePropagation();
596
+ }
597
+ })
598
+ .datepicker($.extend({
599
+ onClose: function(){
600
+ if(focusedOut && datePicker.not(':focus')){
601
+ resetFocusHandler();
602
+ datePicker.trigger('focusout');
603
+ datePicker.triggerHandler('blur');
604
+ } else {
605
+ resetFocusHandler();
606
+ }
607
+ }
608
+ }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
609
+ .bind('change', change)
610
+ .data('datepicker')
611
+ ;
612
+ data.dpDiv.addClass('input-date-datepicker-control');
613
+
614
+ if(_wrapper){
615
+ webshims.triggerDomUpdate(_wrapper[0]);
616
+ }
617
+ ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
618
+ var fn = 'data-placeholder' ? 'attr' : 'prop';
619
+ var val = elem[fn](name);
620
+ if(val){
621
+ elem[fn](name, val);
622
+ }
623
+ });
624
+
625
+ return data;
626
+ };
627
+
628
+ // replaceInputUI['datetime-local'] = function(elem){
629
+ // if(!$.fn.datepicker){return;}
630
+ //
631
+ // 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>'),
632
+ // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
633
+ // datePicker = $('input.input-datetime-local-date', date),
634
+ // datePickerChange = function(e){
635
+ //
636
+ // var value = datePicker.prop('value') || '',
637
+ // timeVal = ''
638
+ // ;
639
+ // if(options.lazyDate){
640
+ // var timer = $.data(datePicker[0], 'setDateLazyTimer');
641
+ // if(timer){
642
+ // clearTimeout(timer);
643
+ // $.removeData(datePicker[0], 'setDateLazyTimer');
644
+ // }
645
+ // }
646
+ //
647
+ // if(value){
648
+ // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
649
+ // try {
650
+ // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
651
+ // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
652
+ // } catch (e) {value = datePicker.prop('value');}
653
+ // }
654
+ // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
655
+ // replaceInputUI['datetime-local'].blockAttr = true;
656
+ // elem.prop('value', value);
657
+ // replaceInputUI['datetime-local'].blockAttr = false;
658
+ // e.stopImmediatePropagation();
659
+ // triggerInlineForm(elem[0], 'input');
660
+ // triggerInlineForm(elem[0], 'change');
661
+ // },
662
+ // data = configureDatePicker(elem, datePicker, datePickerChange, date)
663
+ // ;
664
+ //
665
+ //
666
+ // $('input.input-datetime-local-time', date).bind('change', function(e){
667
+ // var timeVal = $.prop(this, 'value');
668
+ // var val = ['', ''];
669
+ // if(timeVal){
670
+ // val = elem.prop('value').split('T');
671
+ // if((val.length < 2 || !val[0])){
672
+ // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
673
+ // }
674
+ // val[1] = timeVal;
675
+ //
676
+ // if (timeVal) {
677
+ // try {
678
+ // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
679
+ // } catch (e) {}
680
+ // }
681
+ // }
682
+ // val = (!val[0] && !val[1]) ? '' : val.join('T');
683
+ // replaceInputUI['datetime-local'].blockAttr = true;
684
+ // elem.prop('value', val);
685
+ // replaceInputUI['datetime-local'].blockAttr = false;
686
+ // e.stopImmediatePropagation();
687
+ // triggerInlineForm(elem[0], 'input');
688
+ // triggerInlineForm(elem[0], 'change');
689
+ // });
690
+ //
691
+ //
692
+ //
693
+ // date.attr('aria-labelledby', attr.label.attr('id'));
694
+ // attr.label.bind('click', function(){
695
+ // datePicker.focus();
696
+ // return false;
697
+ // });
698
+ //
699
+ // if(attr.css){
700
+ // date.css(attr.css);
701
+ // if(attr.outerWidth){
702
+ // date.outerWidth(attr.outerWidth);
703
+ // var width = date.width();
704
+ // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
705
+ // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
706
+ // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
707
+ // if(data.trigger[0]){
708
+ // adjustInputWithBtn(datePicker, data.trigger);
709
+ // }
710
+ // }
711
+ // }
712
+ //
713
+ //
714
+ // };
715
+ //
716
+ // replaceInputUI['datetime-local'].attrs = {
717
+ // disabled: function(orig, shim, value){
718
+ // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
719
+ // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
720
+ // },
721
+ // step: function(orig, shim, value){
722
+ // $('input.input-datetime-local-time', shim).attr('step', value);
723
+ // },
724
+ // //ToDo: use min also on time
725
+ // min: function(orig, shim, value){
726
+ // if(value){
727
+ // value = (value.split) ? value.split('T') : [];
728
+ // try {
729
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
730
+ // } catch(e){value = false;}
731
+ // }
732
+ // if(!value){
733
+ // value = null;
734
+ // }
735
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
736
+ //
737
+ // },
738
+ // //ToDo: use max also on time
739
+ // max: function(orig, shim, value){
740
+ // if(value){
741
+ // value = (value.split) ? value.split('T') : [];
742
+ // try {
743
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
744
+ // } catch(e){value = false;}
745
+ // }
746
+ // if(!value){
747
+ // value = null;
748
+ // }
749
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
750
+ // },
751
+ // value: function(orig, shim, value){
752
+ // var dateValue;
753
+ // if(value){
754
+ // value = (value.split) ? value.split('T') : [];
755
+ // try {
756
+ // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
757
+ // } catch(e){dateValue = false;}
758
+ // }
759
+ // if(dateValue){
760
+ // if(!replaceInputUI['datetime-local'].blockAttr){
761
+ // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
762
+ // }
763
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
764
+ // } else {
765
+ // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
766
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
767
+ // }
768
+ //
769
+ //
770
+ // }
771
+ // };
772
+
773
+
774
+ replaceInputUI.date = function(elem){
775
+
776
+ if(!$.fn.datepicker){return;}
777
+ var date = $('<input class="input-date" type="text" />'),
778
+
779
+ change = function(e){
780
+
781
+ replaceInputUI.date.blockAttr = true;
782
+ var value;
783
+ if(options.lazyDate){
784
+ var timer = $.data(date[0], 'setDateLazyTimer');
785
+ if(timer){
786
+ clearTimeout(timer);
787
+ $.removeData(date[0], 'setDateLazyTimer');
788
+ }
789
+ }
790
+ try {
791
+ value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
792
+ value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
793
+ } catch(e){
794
+ value = date.prop('value');
795
+ }
796
+ elem.prop('value', value);
797
+ replaceInputUI.date.blockAttr = false;
798
+ e.stopImmediatePropagation();
799
+ triggerInlineForm(elem[0], 'input');
800
+ triggerInlineForm(elem[0], 'change');
801
+ },
802
+ data
803
+
804
+ ;
805
+
806
+ this.common(elem, date, replaceInputUI.date.attrs);
807
+
808
+ data = configureDatePicker(elem, date, change);
809
+
810
+ $(elem)
811
+ .bind('updateshadowdom', function(){
812
+ if (data.trigger[0]) {
813
+ elem.css({display: ''});
814
+ if(elem[0].offsetWidth || elem[0].offsetHeight){
815
+ var attr = getDimensions(elem);
816
+ if (attr.css) {
817
+ date.css(attr.css);
818
+ if (attr.outerWidth) {
819
+ date.outerWidth(attr.outerWidth);
820
+ }
821
+ adjustInputWithBtn(date, data.trigger);
822
+ }
823
+ }
824
+ }
825
+ elem.css({display: 'none'});
826
+ })
827
+ .triggerHandler('updateshadowdom')
828
+ ;
829
+ if (data.trigger[0]) {
830
+ setTimeout(function(){
831
+ webshims.ready('WINDOWLOAD', function(){
832
+ $(elem).triggerHandler('updateshadowdom');
833
+ });
834
+ }, 9);
835
+ }
836
+
837
+ };
838
+
839
+
840
+ replaceInputUI.date.attrs = {
841
+ disabled: function(orig, shim, value){
842
+ $.prop(shim, 'disabled', !!value);
843
+ },
844
+ min: function(orig, shim, value){
845
+ try {
846
+ value = $.datepicker.parseDate('yy-mm-dd', value);
847
+ } catch(e){value = false;}
848
+ if(value){
849
+ $(shim).datepicker('option', 'minDate', value);
850
+ }
851
+ },
852
+ max: function(orig, shim, value){
853
+ try {
854
+ value = $.datepicker.parseDate('yy-mm-dd', value);
855
+ } catch(e){value = false;}
856
+ if(value){
857
+ $(shim).datepicker('option', 'maxDate', value);
858
+ }
859
+ },
860
+ 'data-placeholder': function(orig, shim, value){
861
+ var hintValue = (value || '').split('-');
862
+ var dateFormat;
863
+ if(hintValue.length == 3){
864
+ value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
865
+ }
866
+ $.prop(shim, 'placeholder', value);
867
+ },
868
+ value: function(orig, shim, value){
869
+ if(!replaceInputUI.date.blockAttr){
870
+ try {
871
+ var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
872
+ } catch(e){var dateValue = false;}
873
+
874
+ if(dateValue){
875
+ lazySetDate($(shim), dateValue);
876
+ } else {
877
+ $.prop(shim, 'value', value);
878
+ }
879
+ }
880
+ }
881
+ };
882
+ }
883
+ if (!modernizrInputTypes.range || options.replaceUI) {
884
+ replaceInputUI.range = function(elem){
885
+ if(!$.fn.slider){return;}
886
+ var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
887
+ change = function(e, ui){
888
+ if(e.originalEvent){
889
+ replaceInputUI.range.blockAttr = true;
890
+ elem.prop('value', ui.value);
891
+ replaceInputUI.range.blockAttr = false;
892
+ triggerInlineForm(elem[0], 'input');
893
+ triggerInlineForm(elem[0], 'change');
894
+ }
895
+ }
896
+ ;
897
+
898
+ this.common(elem, range, replaceInputUI.range.attrs);
899
+
900
+
901
+ elem
902
+ .bind('updateshadowdom', function(){
903
+ elem.css({display: ''});
904
+ if (elem[0].offsetWidth || elem[0].offsetHeight) {
905
+ var attr = getDimensions(elem);
906
+ if (attr.css) {
907
+ range.css(attr.css);
908
+ if (attr.outerWidth) {
909
+ range.outerWidth(attr.outerWidth);
910
+ }
911
+ }
912
+ }
913
+ elem.css({display: 'none'});
914
+ })
915
+ .triggerHandler('updateshadowdom')
916
+ ;
917
+
918
+
919
+ range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change);
920
+
921
+ ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
922
+ var val = elem.prop(name);
923
+ var shadow;
924
+ if(name == 'value' && !val){
925
+
926
+ shadow = elem.getShadowElement();
927
+ if(shadow){
928
+ val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
929
+ }
930
+ }
931
+ if(val != null){
932
+ elem.prop(name, val);
933
+ }
934
+ });
935
+ };
936
+
937
+ replaceInputUI.range.attrs = {
938
+ disabled: function(orig, shim, value){
939
+ value = !!value;
940
+ $(shim).slider( "option", "disabled", value );
941
+ $('span', shim)
942
+ .attr({
943
+ 'aria-disabled': value+'',
944
+ 'tabindex': (value) ? '-1' : '0'
945
+ })
946
+ ;
947
+ },
948
+ min: function(orig, shim, value){
949
+ value = (value) ? value * 1 || 0 : 0;
950
+ $(shim).slider( "option", "min", value );
951
+ $('span', shim).attr({'aria-valuemin': value});
952
+ },
953
+ max: function(orig, shim, value){
954
+ value = (value || value === 0) ? value * 1 || 100 : 100;
955
+ $(shim).slider( "option", "max", value );
956
+ $('span', shim).attr({'aria-valuemax': value});
957
+ },
958
+ value: function(orig, shim, value){
959
+ value = $(orig).prop('valueAsNumber');
960
+ if(!isNaN(value)){
961
+ if(!replaceInputUI.range.blockAttr){
962
+ $(shim).slider( "option", "value", value );
963
+ }
964
+ $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
965
+ }
966
+ },
967
+ step: function(orig, shim, value){
968
+ value = (value && $.trim(value)) ? value * 1 || 1 : 1;
969
+ $(shim).slider( "option", "step", value );
970
+ }
971
+ };
972
+ }
973
+
974
+ if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
975
+ var reflectFn = function(val){
976
+ if(webshims.data(this, 'hasShadow')){
977
+ $.prop(this, 'value', $.prop(this, 'value'));
978
+ }
979
+ };
980
+
981
+ webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
982
+ webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
983
+ }
984
+
985
+ $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
986
+ webshims.onNodeNamesPropertyModify('input', attr, function(val){
987
+ var shadowData = webshims.data(this, 'shadowData');
988
+ if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
989
+ shadowData.data[attr](this, shadowData.shadowElement, val);
990
+ }
991
+ }
992
+ );
993
+ });
994
+ if(!options.availabeLangs){
995
+ 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(' ');
996
+ }
997
+
998
+ var getDefaults = function(){
999
+ if(!$.datepicker){return;}
1000
+
1001
+ webshims.activeLang({
1002
+ langObj: $.datepicker.regional,
1003
+ module: 'form-number-date-ui',
1004
+ callback: function(langObj){
1005
+ var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1006
+
1007
+
1008
+ if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1009
+ $('input.hasDatepicker')
1010
+ .filter('.input-date, .input-datetime-local-date')
1011
+ .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1012
+ .getNativeElement()
1013
+ .filter('[data-placeholder]')
1014
+ .attr('data-placeholder', function(i, val){
1015
+ return val;
1016
+ })
1017
+ ;
1018
+ }
1019
+ $.datepicker.setDefaults(datepickerCFG);
1020
+ }
1021
+ });
1022
+ $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1023
+ };
1024
+
1025
+ $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1026
+ getDefaults();
1027
+
1028
+ //implement set/arrow controls
1029
+ (function(){
1030
+ var supportsType = (function(){
1031
+ var types = {};
1032
+ return function(type){
1033
+ if(type in types){
1034
+ return types[type];
1035
+ }
1036
+ return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1037
+ };
1038
+ })();
1039
+
1040
+ if(supportsType('number')/* && supportsType('time')*/){return;}
1041
+ var doc = document;
1042
+ var options = webshims.cfg["forms-ext"];
1043
+ var typeModels = webshims.inputTypes;
1044
+
1045
+ var getNextStep = function(input, upDown, cache){
1046
+
1047
+ cache = cache || {};
1048
+
1049
+ if( !('type' in cache) ){
1050
+ cache.type = $.prop(input, 'type');
1051
+ }
1052
+ if( !('step' in cache) ){
1053
+ cache.step = webshims.getStep(input, cache.type);
1054
+ }
1055
+ if( !('valueAsNumber' in cache) ){
1056
+ cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1057
+ }
1058
+ var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1059
+ ret
1060
+ ;
1061
+ webshims.addMinMaxNumberToCache('min', $(input), cache);
1062
+ webshims.addMinMaxNumberToCache('max', $(input), cache);
1063
+
1064
+ if(isNaN(cache.valueAsNumber)){
1065
+ cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1066
+ }
1067
+ //make a valid step
1068
+ if(cache.step !== 'any'){
1069
+ ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
1070
+ if(ret && Math.abs(ret) != cache.step){
1071
+ cache.valueAsNumber = cache.valueAsNumber - ret;
1072
+ }
1073
+ }
1074
+ ret = cache.valueAsNumber + (delta * upDown);
1075
+ //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
1076
+ if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
1077
+ ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
1078
+ } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
1079
+ ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
1080
+ } else {
1081
+ ret = Math.round( ret * 1e7) / 1e7;
1082
+ }
1083
+ return ret;
1084
+ };
1085
+
1086
+ webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
1087
+
1088
+ var doSteps = function(input, type, control){
1089
+ if(input.disabled || input.readOnly || $(control).hasClass('step-controls')){return;}
1090
+ $.prop(input, 'value', typeModels[type].numberToString(getNextStep(input, ($(control).hasClass('step-up')) ? 1 : -1, {type: type})));
1091
+ $(input).unbind('blur.stepeventshim');
1092
+ triggerInlineForm(input, 'input');
1093
+
1094
+
1095
+ if( doc.activeElement ){
1096
+ if(doc.activeElement !== input){
1097
+ try {input.focus();} catch(e){}
1098
+ }
1099
+ setTimeout(function(){
1100
+ if(doc.activeElement !== input){
1101
+ try {input.focus();} catch(e){}
1102
+ }
1103
+ $(input)
1104
+ .one('blur.stepeventshim', function(){
1105
+ triggerInlineForm(input, 'change');
1106
+ })
1107
+ ;
1108
+ }, 0);
1109
+
1110
+ }
1111
+ };
1112
+
1113
+
1114
+ if(options.stepArrows){
1115
+ var stepDisableEnable = {
1116
+ // don't change getter
1117
+ set: function(value){
1118
+ var stepcontrols = webshims.data(this, 'step-controls');
1119
+ if(stepcontrols){
1120
+ stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
1121
+ }
1122
+ }
1123
+ };
1124
+ webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
1125
+ webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
1126
+ }
1127
+ var stepKeys = {
1128
+ 38: 1,
1129
+ 40: -1
1130
+ };
1131
+ webshims.addReady(function(context, contextElem){
1132
+ //ui for numeric values
1133
+ if(options.stepArrows){
1134
+ $('input', context).add(contextElem.filter('input')).each(function(){
1135
+ var type = $.prop(this, 'type');
1136
+ if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
1137
+ var elem = this;
1138
+ var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
1139
+ .insertAfter(elem)
1140
+ .bind('selectstart dragstart', function(){return false;})
1141
+ .bind('mousedown mousepress', function(e){
1142
+ doSteps(elem, type, e.target);
1143
+ return false;
1144
+ })
1145
+ .bind('mousepressstart mousepressend', function(e){
1146
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1147
+ })
1148
+ ;
1149
+ var mwheelUpDown = function(e, d){
1150
+ if(elem.disabled || elem.readOnly || !d){return;}
1151
+ $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, d, {type: type})));
1152
+ triggerInlineForm(elem, 'input');
1153
+ return false;
1154
+ };
1155
+ var jElm = $(elem)
1156
+ .addClass('has-step-controls')
1157
+ .attr({
1158
+ readonly: elem.readOnly,
1159
+ disabled: elem.disabled,
1160
+ autocomplete: 'off',
1161
+ role: 'spinbutton'
1162
+ })
1163
+ .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1164
+ if(elem.disabled || elem.readOnly || !stepKeys[e.keyCode]){return;}
1165
+ $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, stepKeys[e.keyCode], {type: type})));
1166
+ triggerInlineForm(elem, 'input');
1167
+ return false;
1168
+ })
1169
+ ;
1170
+ if(type == 'number'){
1171
+ jElm.bind('keypress', (function(){
1172
+ var chars = '0123456789.';
1173
+ return function(event){
1174
+ var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
1175
+ return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
1176
+ };
1177
+ })());
1178
+ }
1179
+ if($.fn.mwheelIntent){
1180
+ jElm.add(controls).bind('mwheelIntent', mwheelUpDown);
1181
+ } else if($.fn.mousewheel) {
1182
+ jElm
1183
+ .bind('focus', function(){
1184
+ jElm.add(controls).unbind('.mwhellwebshims')
1185
+ .bind('mousewheel.mwhellwebshims', mwheelUpDown)
1186
+ ;
1187
+ })
1188
+ .bind('blur', function(){
1189
+ $(elem).add(controls).unbind('.mwhellwebshims');
1190
+ })
1191
+ ;
1192
+ }
1193
+ webshims.data(elem, 'step-controls', controls);
1194
+ if(options.calculateWidth){
1195
+ var init;
1196
+ jElm
1197
+ .bind('updateshadowdom', function(){
1198
+ if(!init && (elem.offsetWidth || elem.offsetHeight)){
1199
+ init = true;
1200
+ adjustInputWithBtn(jElm, controls);
1201
+ controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
1202
+ }
1203
+ })
1204
+ .triggerHandler('updateshadowdom')
1205
+ ;
1206
+ }
1207
+ });
1208
+ }
1209
+ });
1210
+ })();
1211
+
1212
+
1213
+ webshims.addReady(function(context, elem){
1214
+ $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1215
+ if($.datepicker || $.fn.slider){
1216
+ if($.datepicker && !defaultDatepicker.dateFormat){
1217
+ defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
1218
+ }
1219
+ replaceInputUI(context, elem);
1220
+ }
1221
+ if($.datepicker && $.fn.slider){
1222
+ $(document).unbind('.initinputui');
1223
+ } else if(!webshims.modules["input-widgets"].src){
1224
+ webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
1225
+ }
1226
+ });
1227
+ });
1228
+
1229
+ });
1230
+