webshims-rails 1.11.6.1 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +126 -72
  4. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +9 -4
  5. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +32 -26
  6. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  7. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +25 -4
  8. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +9 -3
  9. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +9 -4
  10. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  11. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +36 -30
  13. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +25 -4
  14. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +9 -3
  15. data/vendor/assets/javascripts/webshims/shims/combos/1.js +13 -6
  16. data/vendor/assets/javascripts/webshims/shims/combos/10.js +156 -143
  17. data/vendor/assets/javascripts/webshims/shims/combos/11.js +97 -84
  18. data/vendor/assets/javascripts/webshims/shims/combos/12.js +2 -4
  19. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1 -2
  20. data/vendor/assets/javascripts/webshims/shims/combos/14.js +956 -2819
  21. data/vendor/assets/javascripts/webshims/shims/combos/15.js +73 -67
  22. data/vendor/assets/javascripts/webshims/shims/combos/16.js +75 -71
  23. data/vendor/assets/javascripts/webshims/shims/combos/17.js +118 -89
  24. data/vendor/assets/javascripts/webshims/shims/combos/18.js +119 -91
  25. data/vendor/assets/javascripts/webshims/shims/combos/19.js +62 -65
  26. data/vendor/assets/javascripts/webshims/shims/combos/2.js +73 -67
  27. data/vendor/assets/javascripts/webshims/shims/combos/20.js +61 -63
  28. data/vendor/assets/javascripts/webshims/shims/combos/21.js +3 -6
  29. data/vendor/assets/javascripts/webshims/shims/combos/22.js +1 -2
  30. data/vendor/assets/javascripts/webshims/shims/combos/23.js +1 -2
  31. data/vendor/assets/javascripts/webshims/shims/combos/24.js +22 -12
  32. data/vendor/assets/javascripts/webshims/shims/combos/25.js +63 -67
  33. data/vendor/assets/javascripts/webshims/shims/combos/26.js +59 -59
  34. data/vendor/assets/javascripts/webshims/shims/combos/27.js +1 -2
  35. data/vendor/assets/javascripts/webshims/shims/combos/28.js +1915 -0
  36. data/vendor/assets/javascripts/webshims/shims/combos/29.js +817 -0
  37. data/vendor/assets/javascripts/webshims/shims/combos/3.js +71 -63
  38. data/vendor/assets/javascripts/webshims/shims/combos/30.js +72 -65
  39. data/vendor/assets/javascripts/webshims/shims/combos/31.js +71 -63
  40. data/vendor/assets/javascripts/webshims/shims/combos/32.js +2343 -0
  41. data/vendor/assets/javascripts/webshims/shims/combos/33.js +897 -0
  42. data/vendor/assets/javascripts/webshims/shims/combos/4.js +59 -59
  43. data/vendor/assets/javascripts/webshims/shims/combos/5.js +119 -91
  44. data/vendor/assets/javascripts/webshims/shims/combos/6.js +120 -93
  45. data/vendor/assets/javascripts/webshims/shims/combos/7.js +74 -69
  46. data/vendor/assets/javascripts/webshims/shims/combos/8.js +73 -67
  47. data/vendor/assets/javascripts/webshims/shims/combos/9.js +157 -145
  48. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +58 -57
  49. data/vendor/assets/javascripts/webshims/shims/form-combat.js +0 -1
  50. data/vendor/assets/javascripts/webshims/shims/form-core.js +12 -3
  51. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +4 -3
  52. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +20 -3
  53. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +78 -71
  54. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +21 -10
  55. data/vendor/assets/javascripts/webshims/shims/form-validation.js +39 -27
  56. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +173 -128
  57. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-ch-ZN.js → formcfg-ch-CN.js} +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +0 -2
  59. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-CN.js +65 -0
  60. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +1 -1
  61. data/vendor/assets/javascripts/webshims/shims/range-ui.js +18 -11
  62. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +221 -153
  63. data/vendor/assets/javascripts/webshims/shims/styles/progress.gif +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/styles/progress.png +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +5 -0
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +273 -177
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +113 -98
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +114 -88
  69. data/vendor/assets/javascripts/webshims/shims/track-ui.js +2 -2
  70. metadata +10 -7
  71. data/vendor/assets/javascripts/webshims/extras/mousepress.js +0 -60
  72. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Thumbs.db +0 -0
  73. data/vendor/assets/javascripts/webshims/shims/json-storage.js +0 -316
  74. data/vendor/assets/javascripts/webshims/shims/mediagroup.js +0 -29
@@ -0,0 +1,817 @@
1
+ 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 runTest = false;
8
+ var validityRules = {};
9
+ var updateValidity = (function(){
10
+ var timer;
11
+ var getValidity = function(){
12
+ $(this).prop('validity');
13
+ };
14
+ var update = function(){
15
+ $('input').each(getValidity);
16
+ };
17
+ return function(){
18
+ clearTimeout(timer);
19
+ timer = setTimeout(update, 9);
20
+ };
21
+ })();
22
+ webshims.addInputType = function(type, obj){
23
+ typeModels[type] = obj;
24
+ runTest = true;
25
+ //update validity of all implemented input types
26
+ if($.isDOMReady && Modernizr.formvalidation && !webshims.bugs.bustedValidity){
27
+ updateValidity();
28
+ }
29
+ };
30
+
31
+ webshims.addValidityRule = function(type, fn){
32
+ validityRules[type] = fn;
33
+ };
34
+
35
+ $.each({typeMismatch: 'mismatch', badInput: 'bad'}, function(name, fn){
36
+ webshims.addValidityRule(name, function (input, val, cache, validityState){
37
+ if(val === ''){return false;}
38
+ var ret = validityState[name];
39
+ if(!('type' in cache)){
40
+ cache.type = (input[0].getAttribute('type') || '').toLowerCase();
41
+ }
42
+
43
+ if(typeModels[cache.type] && typeModels[cache.type][fn]){
44
+ ret = typeModels[cache.type][fn](val, input);
45
+ }
46
+ return ret || false;
47
+ });
48
+ });
49
+
50
+ var formsExtModule = webshims.modules['form-number-date-api'];
51
+ var overrideValidity = formsExtModule.loaded && !formsExtModule.test();
52
+ var validityProps = ['customError', 'badInput','typeMismatch','rangeUnderflow','rangeOverflow','stepMismatch','tooLong', 'tooShort','patternMismatch','valueMissing','valid'];
53
+
54
+ var validityChanger = ['value'];
55
+ var validityElements = [];
56
+ var testValidity = function(elem, init){
57
+ if(!elem && !runTest){return;}
58
+ var type = (elem.getAttribute && elem.getAttribute('type') || elem.type || '').toLowerCase();
59
+ if(typeModels[type]){
60
+ $.prop(elem, 'validity');
61
+ }
62
+ };
63
+
64
+ var oldSetCustomValidity = {};
65
+ ['input', 'textarea', 'select'].forEach(function(name){
66
+ var desc = webshims.defineNodeNameProperty(name, 'setCustomValidity', {
67
+ prop: {
68
+ value: function(error){
69
+ error = error+'';
70
+ var elem = (name == 'input') ? $(this).getNativeElement()[0] : this;
71
+ desc.prop._supvalue.call(elem, error);
72
+
73
+
74
+ if(overrideValidity){
75
+ webshims.data(elem, 'hasCustomError', !!(error));
76
+ testValidity(elem);
77
+ }
78
+ }
79
+ }
80
+ });
81
+ oldSetCustomValidity[name] = desc.prop._supvalue;
82
+ });
83
+
84
+
85
+ if(overrideValidity){
86
+ validityChanger.push('min');
87
+ validityChanger.push('max');
88
+ validityChanger.push('step');
89
+ validityElements.push('input');
90
+ }
91
+
92
+
93
+ if(overrideValidity){
94
+ var stopValidity;
95
+ validityElements.forEach(function(nodeName){
96
+
97
+ var oldDesc = webshims.defineNodeNameProperty(nodeName, 'validity', {
98
+ prop: {
99
+ get: function(){
100
+ if(stopValidity){return;}
101
+ var elem = (nodeName == 'input') ? $(this).getNativeElement()[0] : this;
102
+
103
+ var validity = oldDesc.prop._supget.call(elem);
104
+
105
+ if(!validity){
106
+ return validity;
107
+ }
108
+ var validityState = {};
109
+ validityProps.forEach(function(prop){
110
+ validityState[prop] = validity[prop] || false;
111
+ });
112
+
113
+ if( !$.prop(elem, 'willValidate') ){
114
+ return validityState;
115
+ }
116
+ stopValidity = true;
117
+ var jElm = $(elem),
118
+ cache = {type: (elem.getAttribute && elem.getAttribute('type') || elem.type || '').toLowerCase(), nodeName: (elem.nodeName || '').toLowerCase()},
119
+ val = jElm.val(),
120
+ customError = !!(webshims.data(elem, 'hasCustomError')),
121
+ setCustomMessage
122
+ ;
123
+ stopValidity = false;
124
+ validityState.customError = customError;
125
+
126
+ if( validityState.valid && validityState.customError ){
127
+ validityState.valid = false;
128
+ } else if(!validityState.valid) {
129
+ var allFalse = true;
130
+ $.each(validityState, function(name, prop){
131
+ if(prop){
132
+ allFalse = false;
133
+ return false;
134
+ }
135
+ });
136
+
137
+ if(allFalse){
138
+ validityState.valid = true;
139
+ }
140
+
141
+ }
142
+
143
+ $.each(validityRules, function(rule, fn){
144
+ validityState[rule] = fn(jElm, val, cache, validityState);
145
+ if( validityState[rule] && (validityState.valid || !setCustomMessage) && ((typeModels[cache.type])) ) {
146
+ oldSetCustomValidity[nodeName].call(elem, webshims.createValidationMessage(elem, rule));
147
+ validityState.valid = false;
148
+ setCustomMessage = true;
149
+ }
150
+ });
151
+ if(validityState.valid){
152
+ oldSetCustomValidity[nodeName].call(elem, '');
153
+ webshims.data(elem, 'hasCustomError', false);
154
+ }
155
+ return validityState;
156
+ },
157
+ writeable: false
158
+
159
+ }
160
+ });
161
+ });
162
+
163
+ validityChanger.forEach(function(prop){
164
+ webshims.onNodeNamesPropertyModify(validityElements, prop, function(s){
165
+ testValidity(this);
166
+ });
167
+ });
168
+
169
+ if(doc.addEventListener){
170
+ var inputThrottle;
171
+ var testPassValidity = function(e){
172
+ if(!('form' in e.target)){return;}
173
+ clearTimeout(inputThrottle);
174
+ testValidity(e.target);
175
+ };
176
+
177
+ doc.addEventListener('change', testPassValidity, true);
178
+
179
+
180
+ doc.addEventListener('input', function(e){
181
+ clearTimeout(inputThrottle);
182
+ inputThrottle = setTimeout(function(){
183
+ testValidity(e.target);
184
+ }, 290);
185
+ }, true);
186
+ }
187
+
188
+ var validityElementsSel = validityElements.join(',');
189
+
190
+ webshims.addReady(function(context, elem){
191
+ if(runTest){
192
+ $(validityElementsSel, context).add(elem.filter(validityElementsSel)).each(function(){
193
+ testValidity(this);
194
+ });
195
+ }
196
+ });
197
+
198
+
199
+ } //end: overrideValidity
200
+
201
+ webshims.defineNodeNameProperty('input', 'type', {
202
+ prop: {
203
+ get: function(){
204
+ var elem = this;
205
+ var type = (elem.getAttribute && elem.getAttribute('type') || '').toLowerCase();
206
+ return (webshims.inputTypes[type]) ? type : elem.type;
207
+ }
208
+ }
209
+ });
210
+
211
+
212
+ });;webshims.register('form-number-date-api', function($, webshims, window, document, undefined, options){
213
+ "use strict";
214
+ if(!webshims.addInputType){
215
+ webshims.error("you can not call forms-ext feature after calling forms feature. call both at once instead: $.webshims.polyfill('forms forms-ext')");
216
+ }
217
+
218
+ if(!webshims.getStep){
219
+ webshims.getStep = function(elem, type){
220
+ var step = $.attr(elem, 'step');
221
+ if(step === 'any'){
222
+ return step;
223
+ }
224
+ type = type || getType(elem);
225
+ if(!typeModels[type] || !typeModels[type].step){
226
+ return step;
227
+ }
228
+ step = typeProtos.number.asNumber(step);
229
+ return ((!isNaN(step) && step > 0) ? step : typeModels[type].step) * (typeModels[type].stepScaleFactor || 1);
230
+ };
231
+ }
232
+ if(!webshims.addMinMaxNumberToCache){
233
+ webshims.addMinMaxNumberToCache = function(attr, elem, cache){
234
+ if (!(attr+'AsNumber' in cache)) {
235
+ cache[attr+'AsNumber'] = typeModels[cache.type].asNumber(elem.attr(attr));
236
+ if(isNaN(cache[attr+'AsNumber']) && (attr+'Default' in typeModels[cache.type])){
237
+ cache[attr+'AsNumber'] = typeModels[cache.type][attr+'Default'];
238
+ }
239
+ }
240
+ };
241
+ }
242
+
243
+ var nan = parseInt('NaN', 10),
244
+ doc = document,
245
+ typeModels = webshims.inputTypes,
246
+ isNumber = function(string){
247
+ return (typeof string == 'number' || (string && string == string * 1));
248
+ },
249
+ supportsType = function(type){
250
+ return ($('<input type="'+type+'" />').prop('type') === type);
251
+ },
252
+ getType = function(elem){
253
+ return (elem.getAttribute('type') || '').toLowerCase();
254
+ },
255
+ isDateTimePart = function(string){
256
+ return (string && !(isNaN(string * 1)));
257
+ },
258
+ addMinMaxNumberToCache = webshims.addMinMaxNumberToCache,
259
+ addleadingZero = function(val, len){
260
+ val = ''+val;
261
+ len = len - val.length;
262
+ for(var i = 0; i < len; i++){
263
+ val = '0'+val;
264
+ }
265
+ return val;
266
+ },
267
+ EPS = 1e-7,
268
+ typeBugs = webshims.bugs.bustedValidity
269
+ ;
270
+
271
+ webshims.addValidityRule('stepMismatch', function(input, val, cache, validityState){
272
+ if(val === ''){return false;}
273
+ if(!('type' in cache)){
274
+ cache.type = getType(input[0]);
275
+ }
276
+ if(cache.type == 'week'){return false;}
277
+ var base, attrVal;
278
+ var ret = (validityState || {}).stepMismatch || false;
279
+ if(typeModels[cache.type] && typeModels[cache.type].step){
280
+ if( !('step' in cache) ){
281
+ cache.step = webshims.getStep(input[0], cache.type);
282
+ }
283
+
284
+ if(cache.step == 'any'){return false;}
285
+
286
+ if(!('valueAsNumber' in cache)){
287
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
288
+ }
289
+ if(isNaN(cache.valueAsNumber)){return false;}
290
+
291
+ addMinMaxNumberToCache('min', input, cache);
292
+ base = cache.minAsNumber;
293
+
294
+ if(isNaN(base) && (attrVal = input.prop('defaultValue'))){
295
+ base = typeModels[cache.type].asNumber( attrVal );
296
+ }
297
+
298
+ if(isNaN(base)){
299
+ base = typeModels[cache.type].stepBase || 0;
300
+ }
301
+
302
+ ret = Math.abs((cache.valueAsNumber - base) % cache.step);
303
+
304
+ ret = !( ret <= EPS || Math.abs(ret - cache.step) <= EPS );
305
+ }
306
+ return ret;
307
+ });
308
+
309
+
310
+
311
+ [{name: 'rangeOverflow', attr: 'max', factor: 1}, {name: 'rangeUnderflow', attr: 'min', factor: -1}].forEach(function(data, i){
312
+ webshims.addValidityRule(data.name, function(input, val, cache, validityState) {
313
+ var ret = (validityState || {})[data.name] || false;
314
+ if(val === ''){return ret;}
315
+ if (!('type' in cache)) {
316
+ cache.type = getType(input[0]);
317
+ }
318
+ if (typeModels[cache.type] && typeModels[cache.type].asNumber) {
319
+ if(!('valueAsNumber' in cache)){
320
+ cache.valueAsNumber = typeModels[cache.type].asNumber( val );
321
+ }
322
+ if(isNaN(cache.valueAsNumber)){
323
+ return false;
324
+ }
325
+
326
+ addMinMaxNumberToCache(data.attr, input, cache);
327
+
328
+ if(isNaN(cache[data.attr+'AsNumber'])){
329
+ return ret;
330
+ }
331
+ ret = ( cache[data.attr+'AsNumber'] * data.factor < cache.valueAsNumber * data.factor - EPS );
332
+ }
333
+ return ret;
334
+ });
335
+ });
336
+
337
+ webshims.reflectProperties(['input'], ['max', 'min', 'step']);
338
+
339
+
340
+ //IDLs and methods, that aren't part of constrain validation, but strongly tight to it
341
+ var valueAsNumberDescriptor = webshims.defineNodeNameProperty('input', 'valueAsNumber', {
342
+ prop: {
343
+ get: function(){
344
+ var elem = this;
345
+ var type = getType(elem);
346
+ var ret = (typeModels[type] && typeModels[type].asNumber) ?
347
+ typeModels[type].asNumber($.prop(elem, 'value')) :
348
+ (valueAsNumberDescriptor.prop._supget && valueAsNumberDescriptor.prop._supget.apply(elem, arguments));
349
+ if(ret == null){
350
+ ret = nan;
351
+ }
352
+ return ret;
353
+ },
354
+ set: function(val){
355
+ var elem = this;
356
+ var type = getType(elem);
357
+ if(typeModels[type] && typeModels[type].numberToString){
358
+ //is NaN a number?
359
+ if(isNaN(val)){
360
+ $.prop(elem, 'value', '');
361
+ return;
362
+ }
363
+ var set = typeModels[type].numberToString(val);
364
+ if(set !== false){
365
+ $.prop(elem, 'value', set);
366
+ } else {
367
+ webshims.error('INVALID_STATE_ERR: DOM Exception 11');
368
+ }
369
+ } else if(valueAsNumberDescriptor.prop._supset) {
370
+ valueAsNumberDescriptor.prop._supset.apply(elem, arguments);
371
+ }
372
+ }
373
+ }
374
+ });
375
+
376
+ var valueAsDateDescriptor = webshims.defineNodeNameProperty('input', 'valueAsDate', {
377
+ prop: {
378
+ get: function(){
379
+ var elem = this;
380
+ var type = getType(elem);
381
+ return (typeModels[type] && typeModels[type].asDate && !typeModels[type].noAsDate) ?
382
+ typeModels[type].asDate($.prop(elem, 'value')) :
383
+ valueAsDateDescriptor.prop._supget && valueAsDateDescriptor.prop._supget.call(elem) || null;
384
+ },
385
+ set: function(value){
386
+ var elem = this;
387
+ var type = getType(elem);
388
+ if(typeModels[type] && typeModels[type].dateToString && !typeModels[type].noAsDate){
389
+
390
+ if(value === null){
391
+ $.prop(elem, 'value', '');
392
+ return '';
393
+ }
394
+ var set = typeModels[type].dateToString(value);
395
+ if(set !== false){
396
+ $.prop(elem, 'value', set);
397
+ return set;
398
+ } else {
399
+ webshims.error('INVALID_STATE_ERR: DOM Exception 11');
400
+ }
401
+ } else {
402
+ return valueAsDateDescriptor.prop._supset && valueAsDateDescriptor.prop._supset.apply(elem, arguments) || null;
403
+ }
404
+ }
405
+ }
406
+ });
407
+
408
+ $.each({stepUp: 1, stepDown: -1}, function(name, stepFactor){
409
+ var stepDescriptor = webshims.defineNodeNameProperty('input', name, {
410
+ prop: {
411
+ value: function(factor){
412
+ var step, val, dateVal, valModStep, alignValue, cache, base, attrVal;
413
+ var type = getType(this);
414
+ if(typeModels[type] && typeModels[type].asNumber){
415
+ cache = {type: type};
416
+ if(!factor){
417
+ factor = 1;
418
+ webshims.warn("you should always use a factor for stepUp/stepDown");
419
+ }
420
+ factor *= stepFactor;
421
+
422
+ val = $.prop(this, 'valueAsNumber');
423
+
424
+ if(isNaN(val)){
425
+ webshims.info("valueAsNumber is NaN can't apply stepUp/stepDown ");
426
+ throw('invalid state error');
427
+ }
428
+
429
+ step = webshims.getStep(this, type);
430
+
431
+ if(step == 'any'){
432
+ webshims.info("step is 'any' can't apply stepUp/stepDown");
433
+ throw('invalid state error');
434
+ }
435
+
436
+ webshims.addMinMaxNumberToCache('min', $(this), cache);
437
+ webshims.addMinMaxNumberToCache('max', $(this), cache);
438
+
439
+ base = cache.minAsNumber;
440
+
441
+ if(isNaN(base) && (attrVal = $.prop(this, 'defaultValue'))){
442
+ base = typeModels[type].asNumber( attrVal );
443
+ }
444
+
445
+ if(!base){
446
+ base = 0;
447
+ }
448
+
449
+ step *= factor;
450
+
451
+ val = (val + step).toFixed(5) * 1;
452
+
453
+ valModStep = (val - base) % step;
454
+
455
+ if ( valModStep && (Math.abs(valModStep) > EPS) ) {
456
+ alignValue = val - valModStep;
457
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
458
+ val = alignValue.toFixed(5) * 1;
459
+ }
460
+
461
+ if( (!isNaN(cache.maxAsNumber) && val > cache.maxAsNumber) || (!isNaN(cache.minAsNumber) && val < cache.minAsNumber) ){
462
+ webshims.info("max/min overflow can't apply stepUp/stepDown");
463
+ throw('invalid state error');
464
+ }
465
+
466
+ $.prop(this, 'valueAsNumber', val);
467
+
468
+ } else if(stepDescriptor.prop && stepDescriptor.prop._supvalue){
469
+ return stepDescriptor.prop._supvalue.apply(this, arguments);
470
+ } else {
471
+ webshims.info("no step method for type: "+ type);
472
+ throw('invalid state error');
473
+ }
474
+ }
475
+ }
476
+ });
477
+ });
478
+
479
+ /*
480
+ * ToDO: WEEK
481
+ */
482
+ // var getWeek = function(date){
483
+ // var time;
484
+ // var checkDate = new Date(date.getTime());
485
+ //
486
+ // checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
487
+ //
488
+ // time = checkDate.getTime();
489
+ // checkDate.setMonth(0);
490
+ // checkDate.setDate(1);
491
+ // return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
492
+ // };
493
+ //
494
+ // var setWeek = function(year, week){
495
+ // var date = new Date(year, 0, 1);
496
+ //
497
+ // week = (week - 1) * 86400000 * 7;
498
+ // date = new Date(date.getTime() + week);
499
+ // date.setDate(date.getDate() + 1 - (date.getDay() || 7));
500
+ // return date;
501
+ // };
502
+
503
+ var typeProtos = {
504
+
505
+ number: {
506
+ bad: function(val){
507
+ return !(isNumber(val));
508
+ },
509
+ step: 1,
510
+ //stepBase: 0, 0 = default
511
+ stepScaleFactor: 1,
512
+ asNumber: function(str){
513
+ return (isNumber(str)) ? str * 1 : nan;
514
+ },
515
+ numberToString: function(num){
516
+ return (isNumber(num)) ? num : false;
517
+ }
518
+ },
519
+
520
+ range: {
521
+ minDefault: 0,
522
+ maxDefault: 100
523
+ },
524
+ color: {
525
+ bad: (function(){
526
+ var cReg = /^\u0023[a-f0-9]{6}$/;
527
+ return function(val){
528
+ return (!val || val.length != 7 || !(cReg.test(val)));
529
+ };
530
+ })()
531
+ },
532
+ date: {
533
+ bad: function(val){
534
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
535
+ var i;
536
+ var valA = val.split(/\u002D/);
537
+ if(valA.length !== 3){return true;}
538
+ var ret = false;
539
+
540
+
541
+ if(valA[0].length < 4 || valA[1].length != 2 || valA[1] > 12 || valA[2].length != 2 || valA[2] > 33){
542
+ ret = true;
543
+ } else {
544
+ for(i = 0; i < 3; i++){
545
+ if(!isDateTimePart(valA[i])){
546
+ ret = true;
547
+ break;
548
+ }
549
+ }
550
+ }
551
+
552
+ return ret || (val !== this.dateToString( this.asDate(val, true) ) );
553
+ },
554
+ step: 1,
555
+ //stepBase: 0, 0 = default
556
+ stepScaleFactor: 86400000,
557
+ asDate: function(val, _noMismatch){
558
+ if(!_noMismatch && this.bad(val)){
559
+ return null;
560
+ }
561
+ return new Date(this.asNumber(val, true));
562
+ },
563
+ asNumber: function(str, _noMismatch){
564
+ var ret = nan;
565
+ if(_noMismatch || !this.bad(str)){
566
+ str = str.split(/\u002D/);
567
+ ret = Date.UTC(str[0], str[1] - 1, str[2]);
568
+ }
569
+ return ret;
570
+ },
571
+ numberToString: function(num){
572
+ return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
573
+ },
574
+ dateToString: function(date){
575
+ return (date && date.getFullYear) ? addleadingZero(date.getUTCFullYear(), 4) +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
576
+ }
577
+ },
578
+ /*
579
+ * ToDO: WEEK
580
+ */
581
+ // week: {
582
+ // bad: function(val){
583
+ // if(!val || !val.split){return true;}
584
+ // var valA = val.split('-W');
585
+ // var ret = true;
586
+ // if(valA.length == 2 && valA[0].length > 3 && valA.length == 2){
587
+ // ret = this.dateToString(setWeek(valA[0], valA[1])) != val;
588
+ // }
589
+ // return ret;
590
+ // },
591
+ // step: 1,
592
+ // stepScaleFactor: 604800000,
593
+ // stepBase: -259200000,
594
+ // asDate: function(str, _noMismatch){
595
+ // var ret = null;
596
+ // if(_noMismatch || !this.bad(str)){
597
+ // ret = str.split('-W');
598
+ // ret = setWeek(ret[0], ret[1]);
599
+ // }
600
+ // return ret;
601
+ // },
602
+ // asNumber: function(str, _noMismatch){
603
+ // var ret = nan;
604
+ // var date = this.asDate(str, _noMismatch);
605
+ // if(date && date.getUTCFullYear){
606
+ // ret = date.getTime();
607
+ // }
608
+ // return ret;
609
+ // },
610
+ // dateToString: function(date){
611
+ // var week, checkDate;
612
+ // var ret = false;
613
+ // if(date && date.getFullYear){
614
+ // week = getWeek(date);
615
+ // if(week == 1){
616
+ // checkDate = new Date(date.getTime());
617
+ // checkDate.setDate(checkDate.getDate() + 7);
618
+ // date.setUTCFullYear(checkDate.getUTCFullYear());
619
+ // }
620
+ // ret = addleadingZero(date.getUTCFullYear(), 4) +'-W'+addleadingZero(week, 2);
621
+ // }
622
+ // return ret;
623
+ // },
624
+ // numberToString: function(num){
625
+ // return (isNumber(num)) ? this.dateToString(new Date( num * 1)) : false;
626
+ // }
627
+ // },
628
+ time: {
629
+ bad: function(val, _getParsed){
630
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
631
+ val = val.split(/\u003A/);
632
+ if(val.length < 2 || val.length > 3){return true;}
633
+ var ret = false,
634
+ sFraction;
635
+ if(val[2]){
636
+ val[2] = val[2].split(/\u002E/);
637
+ sFraction = parseInt(val[2][1], 10);
638
+ val[2] = val[2][0];
639
+ }
640
+ $.each(val, function(i, part){
641
+ if(!isDateTimePart(part) || part.length !== 2){
642
+ ret = true;
643
+ return false;
644
+ }
645
+ });
646
+ if(ret){return true;}
647
+ if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
648
+ return true;
649
+ }
650
+ if(val[2] && (val[2] > 59 || val[2] < 0 )){
651
+ return true;
652
+ }
653
+ if(sFraction && isNaN(sFraction)){
654
+ return true;
655
+ }
656
+ if(sFraction){
657
+ if(sFraction < 100){
658
+ sFraction *= 100;
659
+ } else if(sFraction < 10){
660
+ sFraction *= 10;
661
+ }
662
+ }
663
+ return (_getParsed === true) ? [val, sFraction] : false;
664
+ },
665
+ step: 60,
666
+ stepBase: 0,
667
+ stepScaleFactor: 1000,
668
+ asDate: function(val){
669
+ val = new Date(this.asNumber(val));
670
+ return (isNaN(val)) ? null : val;
671
+ },
672
+ asNumber: function(val){
673
+ var ret = nan;
674
+ val = this.bad(val, true);
675
+ if(val !== true){
676
+ ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
677
+ if(val[1]){
678
+ ret += val[1];
679
+ }
680
+ }
681
+ return ret;
682
+ },
683
+ dateToString: function(date){
684
+ if(date && date.getUTCHours){
685
+ var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
686
+ tmp = date.getSeconds()
687
+ ;
688
+ if(tmp != "0"){
689
+ str += ':'+ addleadingZero(tmp, 2);
690
+ }
691
+ tmp = date.getUTCMilliseconds();
692
+ if(tmp != "0"){
693
+ str += '.'+ addleadingZero(tmp, 3);
694
+ }
695
+ return str;
696
+ } else {
697
+ return false;
698
+ }
699
+ }
700
+ },
701
+ month: {
702
+ bad: function(val){
703
+ return typeProtos.date.bad(val+'-01');
704
+ },
705
+ step: 1,
706
+ stepScaleFactor: false,
707
+ //stepBase: 0, 0 = default
708
+ asDate: function(val){
709
+ return new Date(typeProtos.date.asNumber(val+'-01'));
710
+ },
711
+ asNumber: function(val){
712
+ //1970-01
713
+ var ret = nan;
714
+ if(val && !this.bad(val)){
715
+ val = val.split(/\u002D/);
716
+ val[0] = (val[0] * 1) - 1970;
717
+ val[1] = (val[1] * 1) - 1;
718
+ ret = (val[0] * 12) + val[1];
719
+ }
720
+ return ret;
721
+ },
722
+ numberToString: function(num){
723
+ var mod;
724
+ var ret = false;
725
+ if(isNumber(num)){
726
+ mod = (num % 12);
727
+ num = ((num - mod) / 12) + 1970;
728
+ mod += 1;
729
+ if(mod < 1){
730
+ num -= 1;
731
+ mod += 12;
732
+ }
733
+ ret = addleadingZero(num, 4)+'-'+addleadingZero(mod, 2);
734
+
735
+ }
736
+
737
+ return ret;
738
+ },
739
+ dateToString: function(date){
740
+ if(date && date.getUTCHours){
741
+ var str = typeProtos.date.dateToString(date);
742
+ return (str.split && (str = str.split(/\u002D/))) ? str[0]+'-'+str[1] : false;
743
+ } else {
744
+ return false;
745
+ }
746
+ }
747
+ }
748
+ ,'datetime-local': {
749
+ bad: function(val, _getParsed){
750
+ if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
751
+ val = val.split(/\u0054/);
752
+ return ( typeProtos.date.bad(val[0]) || typeProtos.time.bad(val[1], _getParsed) );
753
+ },
754
+ noAsDate: true,
755
+ asDate: function(val){
756
+ val = new Date(this.asNumber(val));
757
+
758
+ return (isNaN(val)) ? null : val;
759
+ },
760
+ asNumber: function(val){
761
+ var ret = nan;
762
+ var time = this.bad(val, true);
763
+ if(time !== true){
764
+ val = val.split(/\u0054/)[0].split(/\u002D/);
765
+
766
+ ret = Date.UTC(val[0], val[1] - 1, val[2], time[0][0], time[0][1], time[0][2] || 0);
767
+ if(time[1]){
768
+ ret += time[1];
769
+ }
770
+ }
771
+ return ret;
772
+ },
773
+ dateToString: function(date, _getParsed){
774
+ return typeProtos.date.dateToString(date) +'T'+ typeProtos.time.dateToString(date, _getParsed);
775
+ }
776
+ }
777
+ };
778
+
779
+ if(typeBugs || !supportsType('range') || !supportsType('time') || !supportsType('month') || !supportsType('datetime-local')){
780
+ typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
781
+ typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
782
+ typeProtos.month = $.extend({}, typeProtos.date, typeProtos.month);
783
+ typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
784
+ }
785
+
786
+ //
787
+ ['number', 'month', 'range', 'date', 'time', 'color', 'datetime-local'].forEach(function(type){
788
+ if(typeBugs || !supportsType(type)){
789
+ webshims.addInputType(type, typeProtos[type]);
790
+ }
791
+ });
792
+
793
+ if($('<input />').prop('labels') == null){
794
+ webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
795
+ prop: {
796
+ get: function(){
797
+ if(this.type == 'hidden'){return null;}
798
+ var id = this.id;
799
+ var labels = $(this)
800
+ .closest('label')
801
+ .filter(function(){
802
+ var hFor = (this.attributes['for'] || {});
803
+ return (!hFor.specified || hFor.value == id);
804
+ })
805
+ ;
806
+
807
+ if(id) {
808
+ labels = labels.add('label[for="'+ id +'"]');
809
+ }
810
+ return labels.get();
811
+ },
812
+ writeable: false
813
+ }
814
+ });
815
+ }
816
+
817
+ });