webshims-rails 0.4.5 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +253 -253
  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/polyfiller.js +1 -1
  6. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +1 -1
  7. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +1 -1
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +1 -1
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +1 -1
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +1 -1
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +1 -1
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -1
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +1 -1
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -1
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +1 -1
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +1 -1
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +1 -1
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +1 -1
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +1 -1
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +1 -1
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +1 -1
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +1 -1
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +1 -1
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +1 -1
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +1 -1
  26. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +1 -1
  27. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +1 -1
  28. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  29. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  30. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +1 -1
  31. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +1 -1
  32. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -1
  33. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  34. data/vendor/assets/javascripts/webshims/polyfiller.js +1188 -1188
  35. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +82 -82
  36. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1752 -1752
  37. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3310 -3311
  38. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1631 -1631
  39. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1695 -1696
  40. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1098 -1098
  41. data/vendor/assets/javascripts/webshims/shims/combos/14.js +477 -477
  42. data/vendor/assets/javascripts/webshims/shims/combos/15.js +317 -317
  43. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2177 -2154
  44. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2354 -2319
  45. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1322 -1322
  46. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2262 -2238
  47. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2376 -2340
  48. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1557 -1558
  49. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1745 -1733
  50. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2360 -2361
  51. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2342 -2331
  52. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2859 -2836
  53. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1547 -1548
  54. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2178 -2155
  55. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3311 -3312
  56. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3058 -3022
  57. data/vendor/assets/javascripts/webshims/shims/combos/4.js +807 -771
  58. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1063 -1027
  59. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1745 -1709
  60. data/vendor/assets/javascripts/webshims/shims/combos/6.js +384 -384
  61. data/vendor/assets/javascripts/webshims/shims/combos/7.js +640 -640
  62. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1546 -1547
  63. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2507 -2508
  64. data/vendor/assets/javascripts/webshims/shims/details.js +148 -148
  65. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +949 -949
  66. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  67. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  68. data/vendor/assets/javascripts/webshims/shims/form-core.js +630 -606
  69. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -681
  70. data/vendor/assets/javascripts/webshims/shims/form-message.js +176 -164
  71. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  72. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  73. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1568 -1568
  74. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  75. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  76. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  77. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  78. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  79. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  80. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  81. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  82. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  83. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  84. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  85. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  86. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  87. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  88. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  89. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  90. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  91. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  92. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +596 -597
  93. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +891 -891
  94. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  95. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +960 -960
  96. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  97. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +697 -697
  98. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  99. metadata +2 -4
  100. data/vendor/assets/javascripts/webshims/minified/shims/range-ui.js +0 -1
  101. data/vendor/assets/javascripts/webshims/shims/range-ui.js +0 -66
@@ -1,643 +1,643 @@
1
- jQuery.webshims.register('form-native-extend', function($, webshims, window, doc, undefined, options){
2
- "use strict";
3
- var Modernizr = window.Modernizr;
4
- var modernizrInputTypes = Modernizr.inputtypes;
5
- if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){return;}
6
- var typeModels = webshims.inputTypes;
7
- var validityRules = {};
8
-
9
- webshims.addInputType = function(type, obj){
10
- typeModels[type] = obj;
11
- };
12
-
13
- webshims.addValidityRule = function(type, fn){
14
- validityRules[type] = fn;
15
- };
16
-
17
- webshims.addValidityRule('typeMismatch',function (input, val, cache, validityState){
18
- if(val === ''){return false;}
19
- var ret = validityState.typeMismatch;
20
- if(!('type' in cache)){
21
- cache.type = (input[0].getAttribute('type') || '').toLowerCase();
22
- }
23
-
24
- if(typeModels[cache.type] && typeModels[cache.type].mismatch){
25
- ret = typeModels[cache.type].mismatch(val, input);
26
- }
27
- return ret;
28
- });
29
-
30
- var overrideNativeMessages = options.overrideMessages;
31
-
32
- var overrideValidity = (!modernizrInputTypes.number || !modernizrInputTypes.time || !modernizrInputTypes.range || overrideNativeMessages);
33
- var validityProps = ['customError','typeMismatch','rangeUnderflow','rangeOverflow','stepMismatch','tooLong','patternMismatch','valueMissing','valid'];
34
-
35
- var validityChanger = (overrideNativeMessages)? ['value', 'checked'] : ['value'];
36
- var validityElements = [];
37
- var testValidity = function(elem, init){
38
- if(!elem){return;}
39
- var type = (elem.getAttribute && elem.getAttribute('type') || elem.type || '').toLowerCase();
40
-
41
- if(!overrideNativeMessages && !typeModels[type]){
42
- return;
43
- }
44
-
45
- if(overrideNativeMessages && !init && type == 'radio' && elem.name){
46
- $(doc.getElementsByName( elem.name )).each(function(){
47
- $.prop(this, 'validity');
48
- });
49
- } else {
50
- $.prop(elem, 'validity');
51
- }
52
- };
53
-
54
- var oldSetCustomValidity = {};
55
- ['input', 'textarea', 'select'].forEach(function(name){
56
- var desc = webshims.defineNodeNameProperty(name, 'setCustomValidity', {
57
- prop: {
58
- value: function(error){
59
- error = error+'';
60
- var elem = (name == 'input') ? $(this).getNativeElement()[0] : this;
61
- desc.prop._supvalue.call(elem, error);
62
-
63
- if(webshims.bugs.validationMessage){
64
- webshims.data(elem, 'customvalidationMessage', error);
65
- }
66
- if(overrideValidity){
67
- webshims.data(elem, 'hasCustomError', !!(error));
68
- testValidity(elem);
69
- }
70
- }
71
- }
72
- });
73
- oldSetCustomValidity[name] = desc.prop._supvalue;
74
- });
75
-
76
-
77
- if(overrideValidity || overrideNativeMessages){
78
- validityChanger.push('min');
79
- validityChanger.push('max');
80
- validityChanger.push('step');
81
- validityElements.push('input');
82
- }
83
- if(overrideNativeMessages){
84
- validityChanger.push('required');
85
- validityChanger.push('pattern');
86
- validityElements.push('select');
87
- validityElements.push('textarea');
88
- }
89
-
90
- if(overrideValidity){
91
- var stopValidity;
92
- validityElements.forEach(function(nodeName){
93
-
94
- var oldDesc = webshims.defineNodeNameProperty(nodeName, 'validity', {
95
- prop: {
96
- get: function(){
97
- if(stopValidity){return;}
98
- var elem = (nodeName == 'input') ? $(this).getNativeElement()[0] : this;
99
-
100
- var validity = oldDesc.prop._supget.call(elem);
101
-
102
- if(!validity){
103
- return validity;
104
- }
105
- var validityState = {};
106
- validityProps.forEach(function(prop){
107
- validityState[prop] = validity[prop];
108
- });
109
-
110
- if( !$.prop(elem, 'willValidate') ){
111
- return validityState;
112
- }
113
- stopValidity = true;
114
- var jElm = $(elem),
115
- cache = {type: (elem.getAttribute && elem.getAttribute('type') || '').toLowerCase(), nodeName: (elem.nodeName || '').toLowerCase()},
116
- val = jElm.val(),
117
- customError = !!(webshims.data(elem, 'hasCustomError')),
118
- setCustomMessage
119
- ;
120
- stopValidity = false;
121
- validityState.customError = customError;
122
-
123
- if( validityState.valid && validityState.customError ){
124
- validityState.valid = false;
125
- } else if(!validityState.valid) {
126
- var allFalse = true;
127
- $.each(validityState, function(name, prop){
128
- if(prop){
129
- allFalse = false;
130
- return false;
131
- }
132
- });
133
-
134
- if(allFalse){
135
- validityState.valid = true;
136
- }
137
-
138
- }
139
-
140
- $.each(validityRules, function(rule, fn){
141
- validityState[rule] = fn(jElm, val, cache, validityState);
142
- if( validityState[rule] && (validityState.valid || !setCustomMessage) && (overrideNativeMessages || (typeModels[cache.type] && typeModels[cache.type].mismatch)) ) {
143
- oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, rule));
144
- validityState.valid = false;
145
- setCustomMessage = true;
146
- }
147
- });
148
- if(validityState.valid){
149
- oldSetCustomValidity[nodeName].call(elem, '');
150
- webshims.data(elem, 'hasCustomError', false);
151
- } else if(overrideNativeMessages && !setCustomMessage && !customError){
152
- $.each(validityState, function(name, prop){
153
- if(name !== 'valid' && prop){
154
- oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
155
- return false;
156
- }
157
- });
158
- }
159
- return validityState;
160
- },
161
- writeable: false
162
-
163
- }
164
- });
165
- });
166
-
167
- validityChanger.forEach(function(prop){
168
- webshims.onNodeNamesPropertyModify(validityElements, prop, function(s){
169
- testValidity(this);
170
- });
171
- });
172
-
173
- if(doc.addEventListener){
174
- var inputThrottle;
175
- var testPassValidity = function(e){
176
- if(!('form' in e.target)){return;}
177
- var form = e.target.form;
178
- clearTimeout(inputThrottle);
179
- testValidity(e.target);
180
- if(form && overrideNativeMessages){
181
- $('input', form).each(function(){
182
- if(this.type == 'password'){
183
- testValidity(this);
184
- }
185
- });
186
- }
187
- };
188
-
189
- doc.addEventListener('change', testPassValidity, true);
190
-
191
- if(overrideNativeMessages){
192
- doc.addEventListener('blur', testPassValidity, true);
193
- doc.addEventListener('keydown', function(e){
194
- if(e.keyCode != 13){return;}
195
- testPassValidity(e);
196
- }, true);
197
- }
198
-
199
- doc.addEventListener('input', function(e){
200
- clearTimeout(inputThrottle);
201
- inputThrottle = setTimeout(function(){
202
- testValidity(e.target);
203
- }, 290);
204
- }, true);
205
- }
206
-
207
- var validityElementsSel = validityElements.join(',');
208
-
209
- webshims.addReady(function(context, elem){
210
- $(validityElementsSel, context).add(elem.filter(validityElementsSel)).each(function(){
211
- $.prop(this, 'validity');
212
- });
213
- });
214
-
215
-
216
- if(overrideNativeMessages){
217
- webshims.ready('DOM form-message', function(){
218
- webshims.activeLang({
219
- register: 'form-core',
220
- callback: function(){
221
- $('input, select, textarea')
222
- .getNativeElement()
223
- .each(function(){
224
- if(webshims.data(this, 'hasCustomError')){return;}
225
- var elem = this;
226
- var validity = $.prop(elem, 'validity') || {valid: true};
227
- var nodeName;
228
- if(validity.valid){return;}
229
- nodeName = (elem.nodeName || '').toLowerCase();
230
- $.each(validity, function(name, prop){
231
- if(name !== 'valid' && prop){
232
- oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
233
- return false;
234
- }
235
- });
236
- })
237
- ;
238
- }
239
- });
240
- });
241
- }
242
-
243
- } //end: overrideValidity
244
-
245
- webshims.defineNodeNameProperty('input', 'type', {
246
- prop: {
247
- get: function(){
248
- var elem = this;
249
- var type = (elem.getAttribute('type') || '').toLowerCase();
250
- return (webshims.inputTypes[type]) ? type : elem.type;
251
- }
252
- }
253
- });
254
-
255
-
256
- });
257
- jQuery.webshims.register('form-number-date-api', function($, webshims, window, document, undefined){
258
- "use strict";
259
-
260
- //ToDo
261
- if(!webshims.getStep){
262
- webshims.getStep = function(elem, type){
263
- var step = $.attr(elem, 'step');
264
- if(step === 'any'){
265
- return step;
266
- }
267
- type = type || getType(elem);
268
- if(!typeModels[type] || !typeModels[type].step){
269
- return step;
270
- }
271
- step = typeProtos.number.asNumber(step);
272
- return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * typeModels[type].stepScaleFactor;
273
- };
274
- }
275
- if(!webshims.addMinMaxNumberToCache){
276
- webshims.addMinMaxNumberToCache = function(attr, elem, cache){
277
- if (!(attr+'AsNumber' in cache)) {
278
- cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
279
- if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
280
- cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
281
- }
282
- }
283
- };
284
- }
285
-
286
- var nan = parseInt('NaN', 10),
287
- doc = document,
288
- typeModels = webshims.inputTypes,
289
- isNumber = function(string){
290
- return (typeof string == 'number' || (string && string == string * 1));
291
- },
292
- supportsType = function(type){
293
- return ($('<input type="'+type+'" />').prop('type') === type);
294
- },
295
- getType = function(elem){
296
- return (elem.getAttribute('type') || '').toLowerCase();
297
- },
298
- isDateTimePart = function(string){
299
- return (isNumber(string) || (string && string == '0' + (string * 1)));
300
- },
301
- addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
302
- addleadingZero = function(val, len){
303
- val = ''+val;
304
- len = len - val.length;
305
- for(var i = 0; i < len; i++){
306
- val = '0'+val;
307
- }
308
- return val;
309
- },
310
- EPS = 1e-7,
311
- typeBugs = webshims.bugs.bustedValidity
312
- ;
313
-
314
- webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
315
- if(val === ''){return false;}
316
- if(!('type' in cache)){
317
- cache.type = getType(input[0]);
318
- }
319
- //stepmismatch with date is computable, but it would be a typeMismatch (performance)
320
- if(cache.type == 'date'){
321
- return false;
322
- }
323
- var ret = (validityState || {}).stepMismatch, base;
324
- if(typeModels[cache.type] && typeModels[cache.type].step){
325
- if( !('step' in cache) ){
326
- cache.step = webshims.getStep(input[0], cache.type);
327
- }
328
-
329
- if(cache.step == 'any'){return false;}
330
-
331
- if(!('valueAsNumber' in cache)){
332
- cache.valueAsNumber = typeModels[cache.type].asNumber( val );
333
- }
334
- if(isNaN(cache.valueAsNumber)){return false;}
335
-
336
- addMinMaxNumberToCache('min', input, cache);
337
- base = cache.minAsNumber;
338
- if(isNaN(base)){
339
- base = typeModels[cache.type].stepBase || 0;
340
- }
341
-
342
- ret = Math.abs((cache.valueAsNumber - base) % cache.step);
343
-
344
- ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
345
- }
346
- return ret;
347
- });
348
-
349
-
350
-
351
- [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
352
- webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
353
- var ret = (validityState || {})[data.name] || false;
354
- if(val === ''){return ret;}
355
- if (!('type' in cache)) {
356
- cache.type = getType(input[0]);
357
- }
358
- if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
359
- if(!('valueAsNumber' in cache)){
360
- cache.valueAsNumber = typeModels[cache.type].asNumber( val );
361
- }
362
- if(isNaN(cache.valueAsNumber)){
363
- return false;
364
- }
365
-
366
- addMinMaxNumberToCache(data.attr, input, cache);
367
-
368
- if(isNaN(cache[data.attr+'AsNumber'])){
369
- return ret;
370
- }
371
- ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
372
- }
373
- return ret;
374
- });
375
- });
376
-
377
- webshims.reflectProperties(['input'], ['max', 'min', 'step']);
378
-
379
-
380
- //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
381
- var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
382
- prop: {
383
- get: function(){
384
- var elem = this;
385
- var type = getType(elem);
386
- var ret = (typeModels[type] && typeModels[type].asNumber) ?
387
- typeModels[type].asNumber($.prop(elem, 'value')) :
388
- (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
389
- if(ret == null){
390
- ret = nan;
391
- }
392
- return ret;
393
- },
394
- set: function(val){
395
- var elem = this;
396
- var type = getType(elem);
397
- if(typeModels[type] && typeModels[type].numberToString){
398
- //is NaN a number?
399
- if(isNaN(val)){
400
- $.prop(elem, 'value', '');
401
- return;
402
- }
403
- var set = typeModels[type].numberToString(val);
404
- if(set !== false){
405
- $.prop(elem, 'value', set);
406
- } else {
407
- webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
408
- }
409
- } else {
410
- valueAsNumberDescriptor.prop._supset && valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
411
- }
412
- }
413
- }
414
- });
415
-
416
- var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
417
- prop: {
418
- get: function(){
419
- var elem = this;
420
- var type = getType(elem);
421
- return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
422
- typeModels[type].asDate($.prop(elem, 'value')) :
423
- valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
424
- },
425
- set: function(value){
426
- var elem = this;
427
- var type = getType(elem);
428
- if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
429
-
430
- if(value === null){
431
- $.prop(elem, 'value', '');
432
- return '';
433
- }
434
- var set = typeModels[type].dateToString(value);
435
- if(set !== false){
436
- $.prop(elem, 'value', set);
437
- return set;
438
- } else {
439
- webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
440
- }
441
- } else {
442
- return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
443
- }
444
- }
445
- }
446
- });
447
-
448
- var typeProtos = {
449
-
450
- number: {
451
- mismatch: function(val){
452
- return !(isNumber(val));
453
- },
454
- step: 1,
455
- //stepBase: 0, 0 = default
456
- stepScaleFactor: 1,
457
- asNumber: function(str){
458
- return (isNumber(str)) ? str * 1 : nan;
459
- },
460
- numberToString: function(num){
461
- return (isNumber(num)) ? num : false;
462
- }
463
- },
464
-
465
- range: {
466
- minDefault: 0,
467
- maxDefault: 100
468
- },
469
-
470
- date: {
471
- mismatch: function(val){
472
- if(!val || !val.split || !(/\d$/.test(val))){return true;}
473
- var valA = val.split(/\u002D/);
474
- if(valA.length !== 3){return true;}
475
- var ret = false;
476
- $.each(valA, function(i, part){
477
- if(!isDateTimePart(part)){
478
- ret = true;
479
- return false;
480
- }
481
- });
482
- if(ret){return ret;}
483
- if(valA[0].length !== 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
484
- ret = true;
485
- }
486
- return (val !== this.dateToString( this.asDate(val, true) ) );
487
- },
488
- step: 1,
489
- //stepBase: 0, 0 = default
490
- stepScaleFactor: 86400000,
491
- asDate: function(val, _noMismatch){
492
- if(!_noMismatch && this.mismatch(val)){
493
- return null;
494
- }
495
- return new Date(this.asNumber(val, true));
496
- },
497
- asNumber: function(str, _noMismatch){
498
- var ret = nan;
499
- if(_noMismatch || !this.mismatch(str)){
500
- str = str.split(/\u002D/);
501
- ret = Date.UTC(str[0], str[1] - 1, str[2]);
502
- }
503
- return ret;
504
- },
505
- numberToString: function(num){
506
- return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
507
- },
508
- dateToString: function(date){
509
- return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
510
- }
511
- },
512
- time: {
513
- mismatch: function(val, _getParsed){
514
- if(!val || !val.split || !(/\d$/.test(val))){return true;}
515
- val = val.split(/\u003A/);
516
- if(val.length < 2 || val.length > 3){return true;}
517
- var ret = false,
518
- sFraction;
519
- if(val[2]){
520
- val[2] = val[2].split(/\u002E/);
521
- sFraction = parseInt(val[2][1], 10);
522
- val[2] = val[2][0];
523
- }
524
- $.each(val, function(i, part){
525
- if(!isDateTimePart(part) || part.length !== 2){
526
- ret = true;
527
- return false;
528
- }
529
- });
530
- if(ret){return true;}
531
- if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
532
- return true;
533
- }
534
- if(val[2] && (val[2] > 59 || val[2] < 0 )){
535
- return true;
536
- }
537
- if(sFraction && isNaN(sFraction)){
538
- return true;
539
- }
540
- if(sFraction){
541
- if(sFraction < 100){
542
- sFraction *= 100;
543
- } else if(sFraction < 10){
544
- sFraction *= 10;
545
- }
546
- }
547
- return (_getParsed === true) ? [val, sFraction] : false;
548
- },
549
- step: 60,
550
- stepBase: 0,
551
- stepScaleFactor: 1000,
552
- asDate: function(val){
553
- val = new Date(this.asNumber(val));
554
- return (isNaN(val)) ? null : val;
555
- },
556
- asNumber: function(val){
557
- var ret = nan;
558
- val = this.mismatch(val, true);
559
- if(val !== true){
560
- ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
561
- if(val[1]){
562
- ret += val[1];
563
- }
564
- }
565
- return ret;
566
- },
567
- dateToString: function(date){
568
- if(date && date.getUTCHours){
569
- var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
570
- tmp = date.getSeconds()
571
- ;
572
- if(tmp != "0"){
573
- str += ':'+ addleadingZero(tmp, 2);
574
- }
575
- tmp = date.getUTCMilliseconds();
576
- if(tmp != "0"){
577
- str += '.'+ addleadingZero(tmp, 3);
578
- }
579
- return str;
580
- } else {
581
- return false;
582
- }
583
- }
584
- }
585
- // ,'datetime-local': {
586
- // mismatch: function(val, _getParsed){
587
- // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
588
- // val = val.split(/\u0054/);
589
- // return ( typeProtos.date.mismatch(val[0]) || typeProtos.time.mismatch(val[1], _getParsed) );
590
- // },
591
- // noAsDate: true,
592
- // asDate: function(val){
593
- // val = new Date(this.asNumber(val));
594
- //
595
- // return (isNaN(val)) ? null : val;
596
- // },
597
- // asNumber: function(val){
598
- // var ret = nan;
599
- // var time = this.mismatch(val, true);
600
- // if(time !== true){
601
- // val = val.split(/\u0054/)[0].split(/\u002D/);
602
- //
603
- // ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
604
- // if(time[1]){
605
- // ret += time[1];
606
- // }
607
- // }
608
- // return ret;
609
- // },
610
- // dateToString: function(date, _getParsed){
611
- // return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
612
- // }
613
- // }
614
- };
615
-
616
- if(typeBugs || !supportsType('range') || !supportsType('time')){
617
- typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
618
- typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
619
- // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
620
- }
621
-
622
- if(typeBugs || !supportsType('number')){
623
- webshims.addInputType('number', typeProtos.number);
624
- }
625
-
626
- if(typeBugs || !supportsType('range')){
627
- webshims.addInputType('range', typeProtos.range);
628
- }
629
- if(typeBugs || !supportsType('date')){
630
- webshims.addInputType('date', typeProtos.date);
631
- }
632
- if(typeBugs || !supportsType('time')){
633
- webshims.addInputType('time', typeProtos.time);
634
- }
635
-
636
- // if(typeBugs || !supportsType('datetime-local')){
637
- // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
638
- // }
639
-
640
- });
1
+ jQuery.webshims.register('form-native-extend', function($, webshims, window, doc, undefined, options){
2
+ "use strict";
3
+ var Modernizr = window.Modernizr;
4
+ var modernizrInputTypes = Modernizr.inputtypes;
5
+ if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){return;}
6
+ var typeModels = webshims.inputTypes;
7
+ var validityRules = {};
8
+
9
+ webshims.addInputType = function(type, obj){
10
+ typeModels[type] = obj;
11
+ };
12
+
13
+ webshims.addValidityRule = function(type, fn){
14
+ validityRules[type] = fn;
15
+ };
16
+
17
+ webshims.addValidityRule('typeMismatch',function (input, val, cache, validityState){
18
+ if(val === ''){return false;}
19
+ var ret = validityState.typeMismatch;
20
+ if(!('type' in cache)){
21
+ cache.type = (input[0].getAttribute('type') || '').toLowerCase();
22
+ }
23
+
24
+ if(typeModels[cache.type] && typeModels[cache.type].mismatch){
25
+ ret = typeModels[cache.type].mismatch(val, input);
26
+ }
27
+ return ret;
28
+ });
29
+
30
+ var overrideNativeMessages = options.overrideMessages;
31
+
32
+ var overrideValidity = (!modernizrInputTypes.number || !modernizrInputTypes.time || !modernizrInputTypes.range || overrideNativeMessages);
33
+ var validityProps = ['customError','typeMismatch','rangeUnderflow','rangeOverflow','stepMismatch','tooLong','patternMismatch','valueMissing','valid'];
34
+
35
+ var validityChanger = (overrideNativeMessages)? ['value', 'checked'] : ['value'];
36
+ var validityElements = [];
37
+ var testValidity = function(elem, init){
38
+ if(!elem){return;}
39
+ var type = (elem.getAttribute && elem.getAttribute('type') || elem.type || '').toLowerCase();
40
+
41
+ if(!overrideNativeMessages && !typeModels[type]){
42
+ return;
43
+ }
44
+
45
+ if(overrideNativeMessages && !init && type == 'radio' && elem.name){
46
+ $(doc.getElementsByName( elem.name )).each(function(){
47
+ $.prop(this, 'validity');
48
+ });
49
+ } else {
50
+ $.prop(elem, 'validity');
51
+ }
52
+ };
53
+
54
+ var oldSetCustomValidity = {};
55
+ ['input', 'textarea', 'select'].forEach(function(name){
56
+ var desc = webshims.defineNodeNameProperty(name, 'setCustomValidity', {
57
+ prop: {
58
+ value: function(error){
59
+ error = error+'';
60
+ var elem = (name == 'input') ? $(this).getNativeElement()[0] : this;
61
+ desc.prop._supvalue.call(elem, error);
62
+
63
+ if(webshims.bugs.validationMessage){
64
+ webshims.data(elem, 'customvalidationMessage', error);
65
+ }
66
+ if(overrideValidity){
67
+ webshims.data(elem, 'hasCustomError', !!(error));
68
+ testValidity(elem);
69
+ }
70
+ }
71
+ }
72
+ });
73
+ oldSetCustomValidity[name] = desc.prop._supvalue;
74
+ });
75
+
76
+
77
+ if(overrideValidity || overrideNativeMessages){
78
+ validityChanger.push('min');
79
+ validityChanger.push('max');
80
+ validityChanger.push('step');
81
+ validityElements.push('input');
82
+ }
83
+ if(overrideNativeMessages){
84
+ validityChanger.push('required');
85
+ validityChanger.push('pattern');
86
+ validityElements.push('select');
87
+ validityElements.push('textarea');
88
+ }
89
+
90
+ if(overrideValidity){
91
+ var stopValidity;
92
+ validityElements.forEach(function(nodeName){
93
+
94
+ var oldDesc = webshims.defineNodeNameProperty(nodeName, 'validity', {
95
+ prop: {
96
+ get: function(){
97
+ if(stopValidity){return;}
98
+ var elem = (nodeName == 'input') ? $(this).getNativeElement()[0] : this;
99
+
100
+ var validity = oldDesc.prop._supget.call(elem);
101
+
102
+ if(!validity){
103
+ return validity;
104
+ }
105
+ var validityState = {};
106
+ validityProps.forEach(function(prop){
107
+ validityState[prop] = validity[prop];
108
+ });
109
+
110
+ if( !$.prop(elem, 'willValidate') ){
111
+ return validityState;
112
+ }
113
+ stopValidity = true;
114
+ var jElm = $(elem),
115
+ cache = {type: (elem.getAttribute && elem.getAttribute('type') || '').toLowerCase(), nodeName: (elem.nodeName || '').toLowerCase()},
116
+ val = jElm.val(),
117
+ customError = !!(webshims.data(elem, 'hasCustomError')),
118
+ setCustomMessage
119
+ ;
120
+ stopValidity = false;
121
+ validityState.customError = customError;
122
+
123
+ if( validityState.valid && validityState.customError ){
124
+ validityState.valid = false;
125
+ } else if(!validityState.valid) {
126
+ var allFalse = true;
127
+ $.each(validityState, function(name, prop){
128
+ if(prop){
129
+ allFalse = false;
130
+ return false;
131
+ }
132
+ });
133
+
134
+ if(allFalse){
135
+ validityState.valid = true;
136
+ }
137
+
138
+ }
139
+
140
+ $.each(validityRules, function(rule, fn){
141
+ validityState[rule] = fn(jElm, val, cache, validityState);
142
+ if( validityState[rule] && (validityState.valid || !setCustomMessage) && (overrideNativeMessages || (typeModels[cache.type] && typeModels[cache.type].mismatch)) ) {
143
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, rule));
144
+ validityState.valid = false;
145
+ setCustomMessage = true;
146
+ }
147
+ });
148
+ if(validityState.valid){
149
+ oldSetCustomValidity[nodeName].call(elem, '');
150
+ webshims.data(elem, 'hasCustomError', false);
151
+ } else if(overrideNativeMessages && !setCustomMessage && !customError){
152
+ $.each(validityState, function(name, prop){
153
+ if(name !== 'valid' && prop){
154
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
155
+ return false;
156
+ }
157
+ });
158
+ }
159
+ return validityState;
160
+ },
161
+ writeable: false
162
+
163
+ }
164
+ });
165
+ });
166
+
167
+ validityChanger.forEach(function(prop){
168
+ webshims.onNodeNamesPropertyModify(validityElements, prop, function(s){
169
+ testValidity(this);
170
+ });
171
+ });
172
+
173
+ if(doc.addEventListener){
174
+ var inputThrottle;
175
+ var testPassValidity = function(e){
176
+ if(!('form' in e.target)){return;}
177
+ var form = e.target.form;
178
+ clearTimeout(inputThrottle);
179
+ testValidity(e.target);
180
+ if(form && overrideNativeMessages){
181
+ $('input', form).each(function(){
182
+ if(this.type == 'password'){
183
+ testValidity(this);
184
+ }
185
+ });
186
+ }
187
+ };
188
+
189
+ doc.addEventListener('change', testPassValidity, true);
190
+
191
+ if(overrideNativeMessages){
192
+ doc.addEventListener('blur', testPassValidity, true);
193
+ doc.addEventListener('keydown', function(e){
194
+ if(e.keyCode != 13){return;}
195
+ testPassValidity(e);
196
+ }, true);
197
+ }
198
+
199
+ doc.addEventListener('input', function(e){
200
+ clearTimeout(inputThrottle);
201
+ inputThrottle = setTimeout(function(){
202
+ testValidity(e.target);
203
+ }, 290);
204
+ }, true);
205
+ }
206
+
207
+ var validityElementsSel = validityElements.join(',');
208
+
209
+ webshims.addReady(function(context, elem){
210
+ $(validityElementsSel, context).add(elem.filter(validityElementsSel)).each(function(){
211
+ $.prop(this, 'validity');
212
+ });
213
+ });
214
+
215
+
216
+ if(overrideNativeMessages){
217
+ webshims.ready('DOM form-message', function(){
218
+ webshims.activeLang({
219
+ register: 'form-core',
220
+ callback: function(){
221
+ $('input, select, textarea')
222
+ .getNativeElement()
223
+ .each(function(){
224
+ if(webshims.data(this, 'hasCustomError')){return;}
225
+ var elem = this;
226
+ var validity = $.prop(elem, 'validity') || {valid: true};
227
+ var nodeName;
228
+ if(validity.valid){return;}
229
+ nodeName = (elem.nodeName || '').toLowerCase();
230
+ $.each(validity, function(name, prop){
231
+ if(name !== 'valid' && prop){
232
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, name));
233
+ return false;
234
+ }
235
+ });
236
+ })
237
+ ;
238
+ }
239
+ });
240
+ });
241
+ }
242
+
243
+ } //end: overrideValidity
244
+
245
+ webshims.defineNodeNameProperty('input', 'type', {
246
+ prop: {
247
+ get: function(){
248
+ var elem = this;
249
+ var type = (elem.getAttribute('type') || '').toLowerCase();
250
+ return (webshims.inputTypes[type]) ? type : elem.type;
251
+ }
252
+ }
253
+ });
254
+
255
+
256
+ });
257
+ jQuery.webshims.register('form-number-date-api', function($, webshims, window, document, undefined){
258
+ "use strict";
259
+
260
+ //ToDo
261
+ if(!webshims.getStep){
262
+ webshims.getStep = function(elem, type){
263
+ var step = $.attr(elem, 'step');
264
+ if(step === 'any'){
265
+ return step;
266
+ }
267
+ type = type || getType(elem);
268
+ if(!typeModels[type] || !typeModels[type].step){
269
+ return step;
270
+ }
271
+ step = typeProtos.number.asNumber(step);
272
+ return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * typeModels[type].stepScaleFactor;
273
+ };
274
+ }
275
+ if(!webshims.addMinMaxNumberToCache){
276
+ webshims.addMinMaxNumberToCache = function(attr, elem, cache){
277
+ if (!(attr+'AsNumber' in cache)) {
278
+ cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
279
+ if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
280
+ cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
281
+ }
282
+ }
283
+ };
284
+ }
285
+
286
+ var nan = parseInt('NaN', 10),
287
+ doc = document,
288
+ typeModels = webshims.inputTypes,
289
+ isNumber = function(string){
290
+ return (typeof string == 'number' || (string && string == string * 1));
291
+ },
292
+ supportsType = function(type){
293
+ return ($('<input type="'+type+'" />').prop('type') === type);
294
+ },
295
+ getType = function(elem){
296
+ return (elem.getAttribute('type') || '').toLowerCase();
297
+ },
298
+ isDateTimePart = function(string){
299
+ return (isNumber(string) || (string && string == '0' + (string * 1)));
300
+ },
301
+ addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
302
+ addleadingZero = function(val, len){
303
+ val = ''+val;
304
+ len = len - val.length;
305
+ for(var i = 0; i < len; i++){
306
+ val = '0'+val;
307
+ }
308
+ return val;
309
+ },
310
+ EPS = 1e-7,
311
+ typeBugs = webshims.bugs.bustedValidity
312
+ ;
313
+
314
+ webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
315
+ if(val === ''){return false;}
316
+ if(!('type' in cache)){
317
+ cache.type = getType(input[0]);
318
+ }
319
+ //stepmismatch with date is computable, but it would be a typeMismatch (performance)
320
+ if(cache.type == 'date'){
321
+ return false;
322
+ }
323
+ var ret = (validityState || {}).stepMismatch, base;
324
+ if(typeModels[cache.type] && typeModels[cache.type].step){
325
+ if( !('step' in cache) ){
326
+ cache.step = webshims.getStep(input[0], cache.type);
327
+ }
328
+
329
+ if(cache.step == 'any'){return false;}
330
+
331
+ if(!('valueAsNumber' in cache)){
332
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
333
+ }
334
+ if(isNaN(cache.valueAsNumber)){return false;}
335
+
336
+ addMinMaxNumberToCache('min', input, cache);
337
+ base = cache.minAsNumber;
338
+ if(isNaN(base)){
339
+ base = typeModels[cache.type].stepBase || 0;
340
+ }
341
+
342
+ ret = Math.abs((cache.valueAsNumber - base) % cache.step);
343
+
344
+ ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
345
+ }
346
+ return ret;
347
+ });
348
+
349
+
350
+
351
+ [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
352
+ webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
353
+ var ret = (validityState || {})[data.name] || false;
354
+ if(val === ''){return ret;}
355
+ if (!('type' in cache)) {
356
+ cache.type = getType(input[0]);
357
+ }
358
+ if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
359
+ if(!('valueAsNumber' in cache)){
360
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
361
+ }
362
+ if(isNaN(cache.valueAsNumber)){
363
+ return false;
364
+ }
365
+
366
+ addMinMaxNumberToCache(data.attr, input, cache);
367
+
368
+ if(isNaN(cache[data.attr+'AsNumber'])){
369
+ return ret;
370
+ }
371
+ ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
372
+ }
373
+ return ret;
374
+ });
375
+ });
376
+
377
+ webshims.reflectProperties(['input'], ['max', 'min', 'step']);
378
+
379
+
380
+ //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
381
+ var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
382
+ prop: {
383
+ get: function(){
384
+ var elem = this;
385
+ var type = getType(elem);
386
+ var ret = (typeModels[type] && typeModels[type].asNumber) ?
387
+ typeModels[type].asNumber($.prop(elem, 'value')) :
388
+ (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
389
+ if(ret == null){
390
+ ret = nan;
391
+ }
392
+ return ret;
393
+ },
394
+ set: function(val){
395
+ var elem = this;
396
+ var type = getType(elem);
397
+ if(typeModels[type] && typeModels[type].numberToString){
398
+ //is NaN a number?
399
+ if(isNaN(val)){
400
+ $.prop(elem, 'value', '');
401
+ return;
402
+ }
403
+ var set = typeModels[type].numberToString(val);
404
+ if(set !== false){
405
+ $.prop(elem, 'value', set);
406
+ } else {
407
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
408
+ }
409
+ } else {
410
+ valueAsNumberDescriptor.prop._supset && valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
411
+ }
412
+ }
413
+ }
414
+ });
415
+
416
+ var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
417
+ prop: {
418
+ get: function(){
419
+ var elem = this;
420
+ var type = getType(elem);
421
+ return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
422
+ typeModels[type].asDate($.prop(elem, 'value')) :
423
+ valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
424
+ },
425
+ set: function(value){
426
+ var elem = this;
427
+ var type = getType(elem);
428
+ if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
429
+
430
+ if(value === null){
431
+ $.prop(elem, 'value', '');
432
+ return '';
433
+ }
434
+ var set = typeModels[type].dateToString(value);
435
+ if(set !== false){
436
+ $.prop(elem, 'value', set);
437
+ return set;
438
+ } else {
439
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
440
+ }
441
+ } else {
442
+ return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
443
+ }
444
+ }
445
+ }
446
+ });
447
+
448
+ var typeProtos = {
449
+
450
+ number: {
451
+ mismatch: function(val){
452
+ return !(isNumber(val));
453
+ },
454
+ step: 1,
455
+ //stepBase: 0, 0 = default
456
+ stepScaleFactor: 1,
457
+ asNumber: function(str){
458
+ return (isNumber(str)) ? str * 1 : nan;
459
+ },
460
+ numberToString: function(num){
461
+ return (isNumber(num)) ? num : false;
462
+ }
463
+ },
464
+
465
+ range: {
466
+ minDefault: 0,
467
+ maxDefault: 100
468
+ },
469
+
470
+ date: {
471
+ mismatch: function(val){
472
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
473
+ var valA = val.split(/\u002D/);
474
+ if(valA.length !== 3){return true;}
475
+ var ret = false;
476
+ $.each(valA, function(i, part){
477
+ if(!isDateTimePart(part)){
478
+ ret = true;
479
+ return false;
480
+ }
481
+ });
482
+ if(ret){return ret;}
483
+ if(valA[0].length !== 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
484
+ ret = true;
485
+ }
486
+ return (val !== this.dateToString( this.asDate(val, true) ) );
487
+ },
488
+ step: 1,
489
+ //stepBase: 0, 0 = default
490
+ stepScaleFactor: 86400000,
491
+ asDate: function(val, _noMismatch){
492
+ if(!_noMismatch && this.mismatch(val)){
493
+ return null;
494
+ }
495
+ return new Date(this.asNumber(val, true));
496
+ },
497
+ asNumber: function(str, _noMismatch){
498
+ var ret = nan;
499
+ if(_noMismatch || !this.mismatch(str)){
500
+ str = str.split(/\u002D/);
501
+ ret = Date.UTC(str[0], str[1] - 1, str[2]);
502
+ }
503
+ return ret;
504
+ },
505
+ numberToString: function(num){
506
+ return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
507
+ },
508
+ dateToString: function(date){
509
+ return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
510
+ }
511
+ },
512
+ time: {
513
+ mismatch: function(val, _getParsed){
514
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
515
+ val = val.split(/\u003A/);
516
+ if(val.length < 2 || val.length > 3){return true;}
517
+ var ret = false,
518
+ sFraction;
519
+ if(val[2]){
520
+ val[2] = val[2].split(/\u002E/);
521
+ sFraction = parseInt(val[2][1], 10);
522
+ val[2] = val[2][0];
523
+ }
524
+ $.each(val, function(i, part){
525
+ if(!isDateTimePart(part) || part.length !== 2){
526
+ ret = true;
527
+ return false;
528
+ }
529
+ });
530
+ if(ret){return true;}
531
+ if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
532
+ return true;
533
+ }
534
+ if(val[2] && (val[2] > 59 || val[2] < 0 )){
535
+ return true;
536
+ }
537
+ if(sFraction && isNaN(sFraction)){
538
+ return true;
539
+ }
540
+ if(sFraction){
541
+ if(sFraction < 100){
542
+ sFraction *= 100;
543
+ } else if(sFraction < 10){
544
+ sFraction *= 10;
545
+ }
546
+ }
547
+ return (_getParsed === true) ? [val, sFraction] : false;
548
+ },
549
+ step: 60,
550
+ stepBase: 0,
551
+ stepScaleFactor: 1000,
552
+ asDate: function(val){
553
+ val = new Date(this.asNumber(val));
554
+ return (isNaN(val)) ? null : val;
555
+ },
556
+ asNumber: function(val){
557
+ var ret = nan;
558
+ val = this.mismatch(val, true);
559
+ if(val !== true){
560
+ ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
561
+ if(val[1]){
562
+ ret += val[1];
563
+ }
564
+ }
565
+ return ret;
566
+ },
567
+ dateToString: function(date){
568
+ if(date && date.getUTCHours){
569
+ var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
570
+ tmp = date.getSeconds()
571
+ ;
572
+ if(tmp != "0"){
573
+ str += ':'+ addleadingZero(tmp, 2);
574
+ }
575
+ tmp = date.getUTCMilliseconds();
576
+ if(tmp != "0"){
577
+ str += '.'+ addleadingZero(tmp, 3);
578
+ }
579
+ return str;
580
+ } else {
581
+ return false;
582
+ }
583
+ }
584
+ }
585
+ // ,'datetime-local': {
586
+ // mismatch: function(val, _getParsed){
587
+ // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
588
+ // val = val.split(/\u0054/);
589
+ // return ( typeProtos.date.mismatch(val[0]) || typeProtos.time.mismatch(val[1], _getParsed) );
590
+ // },
591
+ // noAsDate: true,
592
+ // asDate: function(val){
593
+ // val = new Date(this.asNumber(val));
594
+ //
595
+ // return (isNaN(val)) ? null : val;
596
+ // },
597
+ // asNumber: function(val){
598
+ // var ret = nan;
599
+ // var time = this.mismatch(val, true);
600
+ // if(time !== true){
601
+ // val = val.split(/\u0054/)[0].split(/\u002D/);
602
+ //
603
+ // ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
604
+ // if(time[1]){
605
+ // ret += time[1];
606
+ // }
607
+ // }
608
+ // return ret;
609
+ // },
610
+ // dateToString: function(date, _getParsed){
611
+ // return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
612
+ // }
613
+ // }
614
+ };
615
+
616
+ if(typeBugs || !supportsType('range') || !supportsType('time')){
617
+ typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
618
+ typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
619
+ // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
620
+ }
621
+
622
+ if(typeBugs || !supportsType('number')){
623
+ webshims.addInputType('number', typeProtos.number);
624
+ }
625
+
626
+ if(typeBugs || !supportsType('range')){
627
+ webshims.addInputType('range', typeProtos.range);
628
+ }
629
+ if(typeBugs || !supportsType('date')){
630
+ webshims.addInputType('date', typeProtos.date);
631
+ }
632
+ if(typeBugs || !supportsType('time')){
633
+ webshims.addInputType('time', typeProtos.time);
634
+ }
635
+
636
+ // if(typeBugs || !supportsType('datetime-local')){
637
+ // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
638
+ // }
639
+
640
+ });
641
641
  /* number-date-ui */
642
642
  /* https://github.com/aFarkas/webshim/issues#issue/23 */
643
643
  jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){