webshims-rails 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +261 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -1
  6. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +24 -24
  7. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/README +82 -82
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +35 -34
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +79 -82
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +45 -44
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -42
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +28 -27
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +4 -4
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +57 -59
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +64 -66
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +53 -54
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +64 -66
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +72 -73
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +42 -46
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -50
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +55 -59
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +66 -64
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +80 -82
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +60 -59
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +79 -81
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +101 -104
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +94 -95
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +26 -29
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +33 -36
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +51 -54
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +27 -28
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +27 -28
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +39 -38
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +65 -68
  35. data/vendor/assets/javascripts/webshims/minified/shims/details.js +4 -4
  36. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +23 -22
  37. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +19 -22
  38. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +14 -14
  39. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +9 -9
  40. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +18 -19
  41. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +45 -43
  42. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  43. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  44. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +12 -12
  45. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +23 -0
  46. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -1
  47. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +26 -30
  48. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +3 -3
  49. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +689 -686
  50. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  52. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -21
  53. data/vendor/assets/javascripts/webshims/polyfiller.js +1191 -1175
  54. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1754 -1714
  55. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3247 -3320
  56. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1633 -1588
  57. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1636 -1591
  58. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1100 -1058
  59. data/vendor/assets/javascripts/webshims/shims/combos/14.js +476 -476
  60. data/vendor/assets/javascripts/webshims/shims/combos/15.js +316 -314
  61. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2094 -2104
  62. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2258 -2267
  63. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1380 -1364
  64. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2239 -2247
  65. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2339 -2294
  66. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1493 -1606
  67. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1733 -1635
  68. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2295 -2408
  69. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2269 -2168
  70. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2775 -2780
  71. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1505 -1456
  72. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2111 -2115
  73. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3264 -3331
  74. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3020 -2970
  75. data/vendor/assets/javascripts/webshims/shims/combos/4.js +770 -822
  76. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1025 -1077
  77. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1706 -1753
  78. data/vendor/assets/javascripts/webshims/shims/combos/6.js +444 -433
  79. data/vendor/assets/javascripts/webshims/shims/combos/7.js +699 -688
  80. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1488 -1445
  81. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2445 -2518
  82. data/vendor/assets/javascripts/webshims/shims/details.js +148 -146
  83. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +952 -912
  84. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  85. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  86. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -659
  87. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -676
  88. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -163
  89. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  90. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  91. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +61 -50
  92. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1569 -1472
  93. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  94. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  95. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  96. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  97. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  98. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  99. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  100. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  101. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  102. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  103. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  104. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  105. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  106. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  107. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  108. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  109. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  110. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  111. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +536 -533
  112. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +861 -0
  113. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  114. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +957 -1073
  115. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  116. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +689 -686
  117. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/track-ui.js +9 -8
  119. data/vendor/assets/javascripts/webshims/shims/track.js +17 -11
  120. metadata +6 -6
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-native-fix.js +0 -7
  122. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  123. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  124. data/vendor/assets/javascripts/webshims/shims/form-native-fix.js +0 -261
@@ -1,384 +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
-
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.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
384
  });