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,641 +1,641 @@
1
- jQuery.webshims.register('form-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
- });jQuery.webshims.register('form-number-date-api', function($, webshims, window, document, undefined){
257
- "use strict";
258
-
259
- //ToDo
260
- if(!webshims.getStep){
261
- webshims.getStep = function(elem, type){
262
- var step = $.attr(elem, 'step');
263
- if(step === 'any'){
264
- return step;
265
- }
266
- type = type || getType(elem);
267
- if(!typeModels[type] || !typeModels[type].step){
268
- return step;
269
- }
270
- step = typeProtos.number.asNumber(step);
271
- return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * typeModels[type].stepScaleFactor;
272
- };
273
- }
274
- if(!webshims.addMinMaxNumberToCache){
275
- webshims.addMinMaxNumberToCache = function(attr, elem, cache){
276
- if (!(attr+'AsNumber' in cache)) {
277
- cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
278
- if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
279
- cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
280
- }
281
- }
282
- };
283
- }
284
-
285
- var nan = parseInt('NaN', 10),
286
- doc = document,
287
- typeModels = webshims.inputTypes,
288
- isNumber = function(string){
289
- return (typeof string == 'number' || (string && string == string * 1));
290
- },
291
- supportsType = function(type){
292
- return ($('<input type="'+type+'" />').prop('type') === type);
293
- },
294
- getType = function(elem){
295
- return (elem.getAttribute('type') || '').toLowerCase();
296
- },
297
- isDateTimePart = function(string){
298
- return (isNumber(string) || (string && string == '0' + (string * 1)));
299
- },
300
- addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
301
- addleadingZero = function(val, len){
302
- val = ''+val;
303
- len = len - val.length;
304
- for(var i = 0; i < len; i++){
305
- val = '0'+val;
306
- }
307
- return val;
308
- },
309
- EPS = 1e-7,
310
- typeBugs = webshims.bugs.valueAsNumberSet || webshims.bugs.bustedValidity
311
- ;
312
-
313
- webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
314
- if(val === ''){return false;}
315
- if(!('type' in cache)){
316
- cache.type = getType(input[0]);
317
- }
318
- //stepmismatch with date is computable, but it would be a typeMismatch (performance)
319
- if(cache.type == 'date'){
320
- return false;
321
- }
322
- var ret = (validityState || {}).stepMismatch, base;
323
- if(typeModels[cache.type] && typeModels[cache.type].step){
324
- if( !('step' in cache) ){
325
- cache.step = webshims.getStep(input[0], cache.type);
326
- }
327
-
328
- if(cache.step == 'any'){return false;}
329
-
330
- if(!('valueAsNumber' in cache)){
331
- cache.valueAsNumber = typeModels[cache.type].asNumber( val );
332
- }
333
- if(isNaN(cache.valueAsNumber)){return false;}
334
-
335
- addMinMaxNumberToCache('min', input, cache);
336
- base = cache.minAsNumber;
337
- if(isNaN(base)){
338
- base = typeModels[cache.type].stepBase || 0;
339
- }
340
-
341
- ret = Math.abs((cache.valueAsNumber - base) % cache.step);
342
-
343
- ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
344
- }
345
- return ret;
346
- });
347
-
348
-
349
-
350
- [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
351
- webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
352
- var ret = (validityState || {})[data.name] || false;
353
- if(val === ''){return ret;}
354
- if (!('type' in cache)) {
355
- cache.type = getType(input[0]);
356
- }
357
- if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
358
- if(!('valueAsNumber' in cache)){
359
- cache.valueAsNumber = typeModels[cache.type].asNumber( val );
360
- }
361
- if(isNaN(cache.valueAsNumber)){
362
- return false;
363
- }
364
-
365
- addMinMaxNumberToCache(data.attr, input, cache);
366
-
367
- if(isNaN(cache[data.attr+'AsNumber'])){
368
- return ret;
369
- }
370
- ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
371
- }
372
- return ret;
373
- });
374
- });
375
-
376
- webshims.reflectProperties(['input'], ['max', 'min', 'step']);
377
-
378
-
379
- //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
380
- var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
381
- prop: {
382
- get: function(){
383
- var elem = this;
384
- var type = getType(elem);
385
- var ret = (typeModels[type] && typeModels[type].asNumber) ?
386
- typeModels[type].asNumber($.prop(elem, 'value')) :
387
- (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
388
- if(ret == null){
389
- ret = nan;
390
- }
391
- return ret;
392
- },
393
- set: function(val){
394
- var elem = this;
395
- var type = getType(elem);
396
- if(typeModels[type] && typeModels[type].numberToString){
397
- //is NaN a number?
398
- if(isNaN(val)){
399
- $.prop(elem, 'value', '');
400
- return;
401
- }
402
- var set = typeModels[type].numberToString(val);
403
- if(set !== false){
404
- $.prop(elem, 'value', set);
405
- } else {
406
- webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
407
- }
408
- } else {
409
- valueAsNumberDescriptor.prop._supset && valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
410
- }
411
- }
412
- }
413
- });
414
-
415
- var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
416
- prop: {
417
- get: function(){
418
- var elem = this;
419
- var type = getType(elem);
420
- return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
421
- typeModels[type].asDate($.prop(elem, 'value')) :
422
- valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
423
- },
424
- set: function(value){
425
- var elem = this;
426
- var type = getType(elem);
427
- if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
428
-
429
- if(value === null){
430
- $.prop(elem, 'value', '');
431
- return '';
432
- }
433
- var set = typeModels[type].dateToString(value);
434
- if(set !== false){
435
- $.prop(elem, 'value', set);
436
- return set;
437
- } else {
438
- webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
439
- }
440
- } else {
441
- return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
442
- }
443
- }
444
- }
445
- });
446
-
447
- var typeProtos = {
448
-
449
- number: {
450
- mismatch: function(val){
451
- return !(isNumber(val));
452
- },
453
- step: 1,
454
- //stepBase: 0, 0 = default
455
- stepScaleFactor: 1,
456
- asNumber: function(str){
457
- return (isNumber(str)) ? str * 1 : nan;
458
- },
459
- numberToString: function(num){
460
- return (isNumber(num)) ? num : false;
461
- }
462
- },
463
-
464
- range: {
465
- minDefault: 0,
466
- maxDefault: 100
467
- },
468
-
469
- date: {
470
- mismatch: function(val){
471
- if(!val || !val.split || !(/\d$/.test(val))){return true;}
472
- var valA = val.split(/\u002D/);
473
- if(valA.length !== 3){return true;}
474
- var ret = false;
475
- $.each(valA, function(i, part){
476
- if(!isDateTimePart(part)){
477
- ret = true;
478
- return false;
479
- }
480
- });
481
- if(ret){return ret;}
482
- if(valA[0].length !== 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
483
- ret = true;
484
- }
485
- return (val !== this.dateToString( this.asDate(val, true) ) );
486
- },
487
- step: 1,
488
- //stepBase: 0, 0 = default
489
- stepScaleFactor: 86400000,
490
- asDate: function(val, _noMismatch){
491
- if(!_noMismatch && this.mismatch(val)){
492
- return null;
493
- }
494
- return new Date(this.asNumber(val, true));
495
- },
496
- asNumber: function(str, _noMismatch){
497
- var ret = nan;
498
- if(_noMismatch || !this.mismatch(str)){
499
- str = str.split(/\u002D/);
500
- ret = Date.UTC(str[0], str[1] - 1, str[2]);
501
- }
502
- return ret;
503
- },
504
- numberToString: function(num){
505
- return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
506
- },
507
- dateToString: function(date){
508
- return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
509
- }
510
- },
511
- time: {
512
- mismatch: function(val, _getParsed){
513
- if(!val || !val.split || !(/\d$/.test(val))){return true;}
514
- val = val.split(/\u003A/);
515
- if(val.length < 2 || val.length > 3){return true;}
516
- var ret = false,
517
- sFraction;
518
- if(val[2]){
519
- val[2] = val[2].split(/\u002E/);
520
- sFraction = parseInt(val[2][1], 10);
521
- val[2] = val[2][0];
522
- }
523
- $.each(val, function(i, part){
524
- if(!isDateTimePart(part) || part.length !== 2){
525
- ret = true;
526
- return false;
527
- }
528
- });
529
- if(ret){return true;}
530
- if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
531
- return true;
532
- }
533
- if(val[2] && (val[2] > 59 || val[2] < 0 )){
534
- return true;
535
- }
536
- if(sFraction && isNaN(sFraction)){
537
- return true;
538
- }
539
- if(sFraction){
540
- if(sFraction < 100){
541
- sFraction *= 100;
542
- } else if(sFraction < 10){
543
- sFraction *= 10;
544
- }
545
- }
546
- return (_getParsed === true) ? [val, sFraction] : false;
547
- },
548
- step: 60,
549
- stepBase: 0,
550
- stepScaleFactor: 1000,
551
- asDate: function(val){
552
- val = new Date(this.asNumber(val));
553
- return (isNaN(val)) ? null : val;
554
- },
555
- asNumber: function(val){
556
- var ret = nan;
557
- val = this.mismatch(val, true);
558
- if(val !== true){
559
- ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
560
- if(val[1]){
561
- ret += val[1];
562
- }
563
- }
564
- return ret;
565
- },
566
- dateToString: function(date){
567
- if(date && date.getUTCHours){
568
- var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
569
- tmp = date.getSeconds()
570
- ;
571
- if(tmp != "0"){
572
- str += ':'+ addleadingZero(tmp, 2);
573
- }
574
- tmp = date.getUTCMilliseconds();
575
- if(tmp != "0"){
576
- str += '.'+ addleadingZero(tmp, 3);
577
- }
578
- return str;
579
- } else {
580
- return false;
581
- }
582
- }
583
- }
584
- // ,'datetime-local': {
585
- // mismatch: function(val, _getParsed){
586
- // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
587
- // val = val.split(/\u0054/);
588
- // return ( typeProtos.date.mismatch(val[0]) || typeProtos.time.mismatch(val[1], _getParsed) );
589
- // },
590
- // noAsDate: true,
591
- // asDate: function(val){
592
- // val = new Date(this.asNumber(val));
593
- //
594
- // return (isNaN(val)) ? null : val;
595
- // },
596
- // asNumber: function(val){
597
- // var ret = nan;
598
- // var time = this.mismatch(val, true);
599
- // if(time !== true){
600
- // val = val.split(/\u0054/)[0].split(/\u002D/);
601
- //
602
- // ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
603
- // if(time[1]){
604
- // ret += time[1];
605
- // }
606
- // }
607
- // return ret;
608
- // },
609
- // dateToString: function(date, _getParsed){
610
- // return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
611
- // }
612
- // }
613
- };
614
-
615
- if(typeBugs || !supportsType('range') || !supportsType('time')){
616
- typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
617
- typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
618
- // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
619
- }
620
-
621
- if(typeBugs || !supportsType('number')){
622
- webshims.addInputType('number', typeProtos.number);
623
- }
624
-
625
- if(typeBugs || !supportsType('range')){
626
- webshims.addInputType('range', typeProtos.range);
627
- }
628
- if(typeBugs || !supportsType('date')){
629
- webshims.addInputType('date', typeProtos.date);
630
- }
631
- if(typeBugs || !supportsType('time')){
632
- webshims.addInputType('time', typeProtos.time);
633
- }
634
-
635
- // if(typeBugs || !supportsType('datetime-local')){
636
- // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
637
- // }
638
-
1
+ jQuery.webshims.register('form-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
+ });jQuery.webshims.register('form-number-date-api', function($, webshims, window, document, undefined){
257
+ "use strict";
258
+
259
+ //ToDo
260
+ if(!webshims.getStep){
261
+ webshims.getStep = function(elem, type){
262
+ var step = $.attr(elem, 'step');
263
+ if(step === 'any'){
264
+ return step;
265
+ }
266
+ type = type || getType(elem);
267
+ if(!typeModels[type] || !typeModels[type].step){
268
+ return step;
269
+ }
270
+ step = typeProtos.number.asNumber(step);
271
+ return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * typeModels[type].stepScaleFactor;
272
+ };
273
+ }
274
+ if(!webshims.addMinMaxNumberToCache){
275
+ webshims.addMinMaxNumberToCache = function(attr, elem, cache){
276
+ if (!(attr+'AsNumber' in cache)) {
277
+ cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
278
+ if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
279
+ cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
280
+ }
281
+ }
282
+ };
283
+ }
284
+
285
+ var nan = parseInt('NaN', 10),
286
+ doc = document,
287
+ typeModels = webshims.inputTypes,
288
+ isNumber = function(string){
289
+ return (typeof string == 'number' || (string && string == string * 1));
290
+ },
291
+ supportsType = function(type){
292
+ return ($('<input type="'+type+'" />').prop('type') === type);
293
+ },
294
+ getType = function(elem){
295
+ return (elem.getAttribute('type') || '').toLowerCase();
296
+ },
297
+ isDateTimePart = function(string){
298
+ return (isNumber(string) || (string && string == '0' + (string * 1)));
299
+ },
300
+ addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
301
+ addleadingZero = function(val, len){
302
+ val = ''+val;
303
+ len = len - val.length;
304
+ for(var i = 0; i < len; i++){
305
+ val = '0'+val;
306
+ }
307
+ return val;
308
+ },
309
+ EPS = 1e-7,
310
+ typeBugs = webshims.bugs.bustedValidity
311
+ ;
312
+
313
+ webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
314
+ if(val === ''){return false;}
315
+ if(!('type' in cache)){
316
+ cache.type = getType(input[0]);
317
+ }
318
+ //stepmismatch with date is computable, but it would be a typeMismatch (performance)
319
+ if(cache.type == 'date'){
320
+ return false;
321
+ }
322
+ var ret = (validityState || {}).stepMismatch, base;
323
+ if(typeModels[cache.type] && typeModels[cache.type].step){
324
+ if( !('step' in cache) ){
325
+ cache.step = webshims.getStep(input[0], cache.type);
326
+ }
327
+
328
+ if(cache.step == 'any'){return false;}
329
+
330
+ if(!('valueAsNumber' in cache)){
331
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
332
+ }
333
+ if(isNaN(cache.valueAsNumber)){return false;}
334
+
335
+ addMinMaxNumberToCache('min', input, cache);
336
+ base = cache.minAsNumber;
337
+ if(isNaN(base)){
338
+ base = typeModels[cache.type].stepBase || 0;
339
+ }
340
+
341
+ ret = Math.abs((cache.valueAsNumber - base) % cache.step);
342
+
343
+ ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
344
+ }
345
+ return ret;
346
+ });
347
+
348
+
349
+
350
+ [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
351
+ webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
352
+ var ret = (validityState || {})[data.name] || false;
353
+ if(val === ''){return ret;}
354
+ if (!('type' in cache)) {
355
+ cache.type = getType(input[0]);
356
+ }
357
+ if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
358
+ if(!('valueAsNumber' in cache)){
359
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
360
+ }
361
+ if(isNaN(cache.valueAsNumber)){
362
+ return false;
363
+ }
364
+
365
+ addMinMaxNumberToCache(data.attr, input, cache);
366
+
367
+ if(isNaN(cache[data.attr+'AsNumber'])){
368
+ return ret;
369
+ }
370
+ ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
371
+ }
372
+ return ret;
373
+ });
374
+ });
375
+
376
+ webshims.reflectProperties(['input'], ['max', 'min', 'step']);
377
+
378
+
379
+ //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
380
+ var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
381
+ prop: {
382
+ get: function(){
383
+ var elem = this;
384
+ var type = getType(elem);
385
+ var ret = (typeModels[type] && typeModels[type].asNumber) ?
386
+ typeModels[type].asNumber($.prop(elem, 'value')) :
387
+ (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
388
+ if(ret == null){
389
+ ret = nan;
390
+ }
391
+ return ret;
392
+ },
393
+ set: function(val){
394
+ var elem = this;
395
+ var type = getType(elem);
396
+ if(typeModels[type] && typeModels[type].numberToString){
397
+ //is NaN a number?
398
+ if(isNaN(val)){
399
+ $.prop(elem, 'value', '');
400
+ return;
401
+ }
402
+ var set = typeModels[type].numberToString(val);
403
+ if(set !== false){
404
+ $.prop(elem, 'value', set);
405
+ } else {
406
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
407
+ }
408
+ } else {
409
+ valueAsNumberDescriptor.prop._supset && valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
410
+ }
411
+ }
412
+ }
413
+ });
414
+
415
+ var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
416
+ prop: {
417
+ get: function(){
418
+ var elem = this;
419
+ var type = getType(elem);
420
+ return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
421
+ typeModels[type].asDate($.prop(elem, 'value')) :
422
+ valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
423
+ },
424
+ set: function(value){
425
+ var elem = this;
426
+ var type = getType(elem);
427
+ if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
428
+
429
+ if(value === null){
430
+ $.prop(elem, 'value', '');
431
+ return '';
432
+ }
433
+ var set = typeModels[type].dateToString(value);
434
+ if(set !== false){
435
+ $.prop(elem, 'value', set);
436
+ return set;
437
+ } else {
438
+ webshims.warn('INVALID_STATE_ERR: DOM Exception 11');
439
+ }
440
+ } else {
441
+ return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
442
+ }
443
+ }
444
+ }
445
+ });
446
+
447
+ var typeProtos = {
448
+
449
+ number: {
450
+ mismatch: function(val){
451
+ return !(isNumber(val));
452
+ },
453
+ step: 1,
454
+ //stepBase: 0, 0 = default
455
+ stepScaleFactor: 1,
456
+ asNumber: function(str){
457
+ return (isNumber(str)) ? str * 1 : nan;
458
+ },
459
+ numberToString: function(num){
460
+ return (isNumber(num)) ? num : false;
461
+ }
462
+ },
463
+
464
+ range: {
465
+ minDefault: 0,
466
+ maxDefault: 100
467
+ },
468
+
469
+ date: {
470
+ mismatch: function(val){
471
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
472
+ var valA = val.split(/\u002D/);
473
+ if(valA.length !== 3){return true;}
474
+ var ret = false;
475
+ $.each(valA, function(i, part){
476
+ if(!isDateTimePart(part)){
477
+ ret = true;
478
+ return false;
479
+ }
480
+ });
481
+ if(ret){return ret;}
482
+ if(valA[0].length !== 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
483
+ ret = true;
484
+ }
485
+ return (val !== this.dateToString( this.asDate(val, true) ) );
486
+ },
487
+ step: 1,
488
+ //stepBase: 0, 0 = default
489
+ stepScaleFactor: 86400000,
490
+ asDate: function(val, _noMismatch){
491
+ if(!_noMismatch && this.mismatch(val)){
492
+ return null;
493
+ }
494
+ return new Date(this.asNumber(val, true));
495
+ },
496
+ asNumber: function(str, _noMismatch){
497
+ var ret = nan;
498
+ if(_noMismatch || !this.mismatch(str)){
499
+ str = str.split(/\u002D/);
500
+ ret = Date.UTC(str[0], str[1] - 1, str[2]);
501
+ }
502
+ return ret;
503
+ },
504
+ numberToString: function(num){
505
+ return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
506
+ },
507
+ dateToString: function(date){
508
+ return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
509
+ }
510
+ },
511
+ time: {
512
+ mismatch: function(val, _getParsed){
513
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
514
+ val = val.split(/\u003A/);
515
+ if(val.length < 2 || val.length > 3){return true;}
516
+ var ret = false,
517
+ sFraction;
518
+ if(val[2]){
519
+ val[2] = val[2].split(/\u002E/);
520
+ sFraction = parseInt(val[2][1], 10);
521
+ val[2] = val[2][0];
522
+ }
523
+ $.each(val, function(i, part){
524
+ if(!isDateTimePart(part) || part.length !== 2){
525
+ ret = true;
526
+ return false;
527
+ }
528
+ });
529
+ if(ret){return true;}
530
+ if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
531
+ return true;
532
+ }
533
+ if(val[2] && (val[2] > 59 || val[2] < 0 )){
534
+ return true;
535
+ }
536
+ if(sFraction && isNaN(sFraction)){
537
+ return true;
538
+ }
539
+ if(sFraction){
540
+ if(sFraction < 100){
541
+ sFraction *= 100;
542
+ } else if(sFraction < 10){
543
+ sFraction *= 10;
544
+ }
545
+ }
546
+ return (_getParsed === true) ? [val, sFraction] : false;
547
+ },
548
+ step: 60,
549
+ stepBase: 0,
550
+ stepScaleFactor: 1000,
551
+ asDate: function(val){
552
+ val = new Date(this.asNumber(val));
553
+ return (isNaN(val)) ? null : val;
554
+ },
555
+ asNumber: function(val){
556
+ var ret = nan;
557
+ val = this.mismatch(val, true);
558
+ if(val !== true){
559
+ ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
560
+ if(val[1]){
561
+ ret += val[1];
562
+ }
563
+ }
564
+ return ret;
565
+ },
566
+ dateToString: function(date){
567
+ if(date && date.getUTCHours){
568
+ var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
569
+ tmp = date.getSeconds()
570
+ ;
571
+ if(tmp != "0"){
572
+ str += ':'+ addleadingZero(tmp, 2);
573
+ }
574
+ tmp = date.getUTCMilliseconds();
575
+ if(tmp != "0"){
576
+ str += '.'+ addleadingZero(tmp, 3);
577
+ }
578
+ return str;
579
+ } else {
580
+ return false;
581
+ }
582
+ }
583
+ }
584
+ // ,'datetime-local': {
585
+ // mismatch: function(val, _getParsed){
586
+ // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
587
+ // val = val.split(/\u0054/);
588
+ // return ( typeProtos.date.mismatch(val[0]) || typeProtos.time.mismatch(val[1], _getParsed) );
589
+ // },
590
+ // noAsDate: true,
591
+ // asDate: function(val){
592
+ // val = new Date(this.asNumber(val));
593
+ //
594
+ // return (isNaN(val)) ? null : val;
595
+ // },
596
+ // asNumber: function(val){
597
+ // var ret = nan;
598
+ // var time = this.mismatch(val, true);
599
+ // if(time !== true){
600
+ // val = val.split(/\u0054/)[0].split(/\u002D/);
601
+ //
602
+ // ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
603
+ // if(time[1]){
604
+ // ret += time[1];
605
+ // }
606
+ // }
607
+ // return ret;
608
+ // },
609
+ // dateToString: function(date, _getParsed){
610
+ // return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
611
+ // }
612
+ // }
613
+ };
614
+
615
+ if(typeBugs || !supportsType('range') || !supportsType('time')){
616
+ typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
617
+ typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
618
+ // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
619
+ }
620
+
621
+ if(typeBugs || !supportsType('number')){
622
+ webshims.addInputType('number', typeProtos.number);
623
+ }
624
+
625
+ if(typeBugs || !supportsType('range')){
626
+ webshims.addInputType('range', typeProtos.range);
627
+ }
628
+ if(typeBugs || !supportsType('date')){
629
+ webshims.addInputType('date', typeProtos.date);
630
+ }
631
+ if(typeBugs || !supportsType('time')){
632
+ webshims.addInputType('time', typeProtos.time);
633
+ }
634
+
635
+ // if(typeBugs || !supportsType('datetime-local')){
636
+ // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
637
+ // }
638
+
639
639
  });/* number-date-ui */
640
640
  /* https://github.com/aFarkas/webshim/issues#issue/23 */
641
641
  jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
@@ -749,15 +749,15 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
749
749
 
750
750
  replaceInputUI.common = function(orig, shim, methods){
751
751
  if(Modernizr.formvalidation){
752
- orig.bind('firstinvalid', function(e){
752
+ orig.on('firstinvalid', function(e){
753
753
  if(!webshims.fromSubmit && isCheckValidity){return;}
754
- orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
754
+ orig.off('invalid.replacedwidgetbubble').on('invalid.replacedwidgetbubble', function(evt){
755
755
  if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
756
756
  webshims.validityAlert.showFor( e.target );
757
757
  e.preventDefault();
758
758
  evt.preventDefault();
759
759
  }
760
- orig.unbind('invalid.replacedwidgetbubble');
760
+ orig.off('invalid.replacedwidgetbubble');
761
761
  });
762
762
  });
763
763
  }
@@ -790,7 +790,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
790
790
  orig.after(shim);
791
791
 
792
792
  if(orig[0].form){
793
- $(orig[0].form).bind('reset', function(e){
793
+ $(orig[0].form).on('reset', function(e){
794
794
  if(e.originalEvent && !e.isDefaultPrevented()){
795
795
  setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
796
796
  }
@@ -799,7 +799,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
799
799
 
800
800
  if(label[0]){
801
801
  shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
802
- label.bind('click', function(){
802
+ label.on('click', function(){
803
803
  orig.getShadowFocusElement().focus();
804
804
  return false;
805
805
  });
@@ -838,16 +838,18 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
838
838
  focusedOut = false;
839
839
  };
840
840
  var data = datePicker
841
- .bind('focusin', function(){
842
- resetFocusHandler();
843
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
844
- stopFocusout = true;
845
- });
846
- })
847
- .bind('focusout blur', function(e){
848
- if(stopFocusout){
849
- focusedOut = true;
850
- e.stopImmediatePropagation();
841
+ .on({
842
+ focusin: function(){
843
+ resetFocusHandler();
844
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
845
+ stopFocusout = true;
846
+ });
847
+ },
848
+ 'focusout blur': function(e){
849
+ if(stopFocusout){
850
+ focusedOut = true;
851
+ e.stopImmediatePropagation();
852
+ }
851
853
  }
852
854
  })
853
855
  .datepicker($.extend({
@@ -861,7 +863,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
861
863
  }
862
864
  }
863
865
  }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
864
- .bind('change', change)
866
+ .on('change', change)
865
867
  .data('datepicker')
866
868
  ;
867
869
  data.dpDiv.addClass('input-date-datepicker-control');
@@ -1063,7 +1065,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1063
1065
  data = configureDatePicker(elem, date, change);
1064
1066
 
1065
1067
  $(elem)
1066
- .bind('updateshadowdom', function(){
1068
+ .on('updateshadowdom', function(){
1067
1069
  if (data.trigger[0]) {
1068
1070
  elem.css({display: ''});
1069
1071
  if(elem[0].offsetWidth || elem[0].offsetHeight){
@@ -1153,7 +1155,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1153
1155
 
1154
1156
 
1155
1157
  elem
1156
- .bind('updateshadowdom', function(){
1158
+ .on('updateshadowdom', function(){
1157
1159
  elem.css({display: ''});
1158
1160
  if (elem[0].offsetWidth || elem[0].offsetHeight) {
1159
1161
  var attr = getDimensions(elem);
@@ -1170,11 +1172,16 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1170
1172
  ;
1171
1173
 
1172
1174
 
1173
- range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change).bind('slidechange', function(e){
1174
- if(e.originalEvent){
1175
- triggerInlineForm(elem[0], 'change');
1176
- }
1177
- });
1175
+ range.slider($.extend(true, {}, options.slider, elem.data('slider')))
1176
+ .on({
1177
+ slide: change,
1178
+ slidechange: function(e){
1179
+ if(e.originalEvent){
1180
+ triggerInlineForm(elem[0], 'change');
1181
+ }
1182
+ }
1183
+ })
1184
+ ;
1178
1185
 
1179
1186
  ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
1180
1187
  var val = elem.prop(name);
@@ -1229,7 +1236,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1229
1236
  };
1230
1237
  }
1231
1238
 
1232
- if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
1239
+ if(options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range){
1233
1240
  var reflectFn = function(val){
1234
1241
  if(webshims.data(this, 'hasShadow')){
1235
1242
  $.prop(this, 'value', $.prop(this, 'value'));
@@ -1280,7 +1287,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1280
1287
  $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1281
1288
  };
1282
1289
 
1283
- $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1290
+ $(document).on('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1284
1291
  getDefaults();
1285
1292
 
1286
1293
  //implement set/arrow controls
@@ -1402,7 +1409,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1402
1409
 
1403
1410
  function init(){
1404
1411
  blockChangeValue = $(elem)
1405
- .bind({
1412
+ .on({
1406
1413
  'change.stepcontrol focus.stepcontrol': function(e){
1407
1414
  if(!blockBlurChange || e.type != 'focus'){
1408
1415
  blockChangeValue = $.prop(elem, 'value');
@@ -1441,19 +1448,21 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1441
1448
  var uiEvents = changeInput(elem, type);
1442
1449
  var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
1443
1450
  .insertAfter(elem)
1444
- .bind('selectstart dragstart', function(){return false;})
1445
- .bind('mousedown mousepress', function(e){
1446
- if(!$(e.target).hasClass('step-controls')){
1447
- uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
1448
- }
1449
- uiEvents.setFocus();
1450
- return false;
1451
- })
1452
- .bind('mousepressstart mousepressend', function(e){
1453
- if(e.type == 'mousepressend'){
1454
- uiEvents.triggerChange();
1451
+ .on({
1452
+ 'selectstart dragstart': function(){return false;},
1453
+ 'mousedown mousepress': function(e){
1454
+ if(!$(e.target).hasClass('step-controls')){
1455
+ uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
1456
+ }
1457
+ uiEvents.setFocus();
1458
+ return false;
1459
+ },
1460
+ 'mousepressstart mousepressend': function(e){
1461
+ if(e.type == 'mousepressend'){
1462
+ uiEvents.triggerChange();
1463
+ }
1464
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1455
1465
  }
1456
- $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1457
1466
  })
1458
1467
  ;
1459
1468
  var mwheelUpDown = function(e, d){
@@ -1471,13 +1480,13 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1471
1480
  autocomplete: 'off',
1472
1481
  role: 'spinbutton'
1473
1482
  })
1474
- .bind('keyup', function(e){
1483
+ .on('keyup', function(e){
1475
1484
  var step = stepKeys[e.keyCode];
1476
1485
  if(step){
1477
1486
  uiEvents.triggerChange(step);
1478
1487
  }
1479
1488
  })
1480
- .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1489
+ .on(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1481
1490
  var step = stepKeys[e.keyCode];
1482
1491
  if(step){
1483
1492
  uiEvents.step(step);
@@ -1487,7 +1496,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1487
1496
  ;
1488
1497
 
1489
1498
  if(allowedChars[type]){
1490
- jElm.bind('keypress', (function(){
1499
+ jElm.on('keypress', (function(){
1491
1500
  var chars = allowedChars[type];
1492
1501
  return function(event){
1493
1502
  var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
@@ -1497,13 +1506,15 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1497
1506
  }
1498
1507
 
1499
1508
  jElm
1500
- .bind('focus', function(){
1501
- jElm.add(controls).unbind('.mwhellwebshims')
1502
- .bind('mousewheel.mwhellwebshims', mwheelUpDown)
1503
- ;
1504
- })
1505
- .bind('blur', function(){
1506
- $(elem).add(controls).unbind('.mwhellwebshims');
1509
+ .on({
1510
+ focus: function(){
1511
+ jElm.add(controls).off('.mwhellwebshims')
1512
+ .on('mousewheel.mwhellwebshims', mwheelUpDown)
1513
+ ;
1514
+ },
1515
+ blur: function(){
1516
+ $(elem).add(controls).off('.mwhellwebshims');
1517
+ }
1507
1518
  })
1508
1519
  ;
1509
1520
 
@@ -1511,7 +1522,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1511
1522
  if(options.calculateWidth){
1512
1523
  var init;
1513
1524
  jElm
1514
- .bind('updateshadowdom', function(){
1525
+ .on('updateshadowdom', function(){
1515
1526
  if(!init && (elem.offsetWidth || elem.offsetHeight)){
1516
1527
  init = true;
1517
1528
  adjustInputWithBtn(jElm, controls);
@@ -1528,7 +1539,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
1528
1539
 
1529
1540
 
1530
1541
  webshims.addReady(function(context, elem){
1531
- $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1542
+ $(document).on('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1532
1543
  if($.datepicker || $.fn.slider){
1533
1544
  if($.datepicker && !defaultDatepicker.dateFormat){
1534
1545
  defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;