webshims-rails 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +30 -29
  3. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +12 -12
  4. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +76 -76
  5. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +12 -12
  6. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +12 -12
  7. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +27 -27
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +12 -12
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +14 -14
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +63 -60
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +59 -59
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -1
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -1
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +67 -67
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +59 -58
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +81 -80
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +103 -102
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +34 -31
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +41 -38
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +35 -35
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +67 -67
  22. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +17 -17
  23. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +10 -8
  24. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +24 -23
  25. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -1
  26. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +9 -0
  27. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  28. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -20
  29. data/vendor/assets/javascripts/webshims/polyfiller.js +144 -140
  30. data/vendor/assets/javascripts/webshims/shims/combos/1.js +10 -6
  31. data/vendor/assets/javascripts/webshims/shims/combos/10.js +11 -7
  32. data/vendor/assets/javascripts/webshims/shims/combos/11.js +10 -6
  33. data/vendor/assets/javascripts/webshims/shims/combos/12.js +10 -6
  34. data/vendor/assets/javascripts/webshims/shims/combos/13.js +10 -6
  35. data/vendor/assets/javascripts/webshims/shims/combos/16.js +10 -6
  36. data/vendor/assets/javascripts/webshims/shims/combos/17.js +10 -6
  37. data/vendor/assets/javascripts/webshims/shims/combos/18.js +986 -924
  38. data/vendor/assets/javascripts/webshims/shims/combos/19.js +10 -6
  39. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/combos/22.js +1 -1
  41. data/vendor/assets/javascripts/webshims/shims/combos/24.js +10 -6
  42. data/vendor/assets/javascripts/webshims/shims/combos/25.js +820 -768
  43. data/vendor/assets/javascripts/webshims/shims/combos/26.js +820 -768
  44. data/vendor/assets/javascripts/webshims/shims/combos/27.js +821 -769
  45. data/vendor/assets/javascripts/webshims/shims/combos/6.js +986 -924
  46. data/vendor/assets/javascripts/webshims/shims/combos/7.js +986 -924
  47. data/vendor/assets/javascripts/webshims/shims/combos/8.js +10 -6
  48. data/vendor/assets/javascripts/webshims/shims/combos/9.js +11 -7
  49. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +10 -6
  50. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +77 -77
  51. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +909 -847
  52. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +1 -1
  53. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +9 -0
  54. data/vendor/assets/javascripts/webshims/shims/track-ui.js +300 -291
  55. data/vendor/assets/javascripts/webshims/shims/track.js +810 -762
  56. metadata +10 -5
@@ -252,80 +252,80 @@ jQuery.webshims.register('form-number-date-api', function($, webshims, window, d
252
252
  dateToString: function(date){
253
253
  return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
254
254
  }
255
+ },
256
+ time: {
257
+ mismatch: function(val, _getParsed){
258
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
259
+ val = val.split(/\u003A/);
260
+ if(val.length < 2 || val.length > 3){return true;}
261
+ var ret = false,
262
+ sFraction;
263
+ if(val[2]){
264
+ val[2] = val[2].split(/\u002E/);
265
+ sFraction = parseInt(val[2][1], 10);
266
+ val[2] = val[2][0];
267
+ }
268
+ $.each(val, function(i, part){
269
+ if(!isDateTimePart(part) || part.length !== 2){
270
+ ret = true;
271
+ return false;
272
+ }
273
+ });
274
+ if(ret){return true;}
275
+ if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
276
+ return true;
277
+ }
278
+ if(val[2] && (val[2] > 59 || val[2] < 0 )){
279
+ return true;
280
+ }
281
+ if(sFraction && isNaN(sFraction)){
282
+ return true;
283
+ }
284
+ if(sFraction){
285
+ if(sFraction < 100){
286
+ sFraction *= 100;
287
+ } else if(sFraction < 10){
288
+ sFraction *= 10;
289
+ }
290
+ }
291
+ return (_getParsed === true) ? [val, sFraction] : false;
292
+ },
293
+ step: 60,
294
+ stepBase: 0,
295
+ stepScaleFactor: 1000,
296
+ asDate: function(val){
297
+ val = new Date(this.asNumber(val));
298
+ return (isNaN(val)) ? null : val;
299
+ },
300
+ asNumber: function(val){
301
+ var ret = nan;
302
+ val = this.mismatch(val, true);
303
+ if(val !== true){
304
+ ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
305
+ if(val[1]){
306
+ ret += val[1];
307
+ }
308
+ }
309
+ return ret;
310
+ },
311
+ dateToString: function(date){
312
+ if(date && date.getUTCHours){
313
+ var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
314
+ tmp = date.getSeconds()
315
+ ;
316
+ if(tmp != "0"){
317
+ str += ':'+ addleadingZero(tmp, 2);
318
+ }
319
+ tmp = date.getUTCMilliseconds();
320
+ if(tmp != "0"){
321
+ str += '.'+ addleadingZero(tmp, 3);
322
+ }
323
+ return str;
324
+ } else {
325
+ return false;
326
+ }
327
+ }
255
328
  }
256
- // ,time: {
257
- // mismatch: function(val, _getParsed){
258
- // if(!val || !val.split || !(/\d$/.test(val))){return true;}
259
- // val = val.split(/\u003A/);
260
- // if(val.length < 2 || val.length > 3){return true;}
261
- // var ret = false,
262
- // sFraction;
263
- // if(val[2]){
264
- // val[2] = val[2].split(/\u002E/);
265
- // sFraction = parseInt(val[2][1], 10);
266
- // val[2] = val[2][0];
267
- // }
268
- // $.each(val, function(i, part){
269
- // if(!isDateTimePart(part) || part.length !== 2){
270
- // ret = true;
271
- // return false;
272
- // }
273
- // });
274
- // if(ret){return true;}
275
- // if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
276
- // return true;
277
- // }
278
- // if(val[2] && (val[2] > 59 || val[2] < 0 )){
279
- // return true;
280
- // }
281
- // if(sFraction && isNaN(sFraction)){
282
- // return true;
283
- // }
284
- // if(sFraction){
285
- // if(sFraction < 100){
286
- // sFraction *= 100;
287
- // } else if(sFraction < 10){
288
- // sFraction *= 10;
289
- // }
290
- // }
291
- // return (_getParsed === true) ? [val, sFraction] : false;
292
- // },
293
- // step: 60,
294
- // stepBase: 0,
295
- // stepScaleFactor: 1000,
296
- // asDate: function(val){
297
- // val = new Date(this.asNumber(val));
298
- // return (isNaN(val)) ? null : val;
299
- // },
300
- // asNumber: function(val){
301
- // var ret = nan;
302
- // val = this.mismatch(val, true);
303
- // if(val !== true){
304
- // ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
305
- // if(val[1]){
306
- // ret += val[1];
307
- // }
308
- // }
309
- // return ret;
310
- // },
311
- // dateToString: function(date){
312
- // if(date && date.getUTCHours){
313
- // var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
314
- // tmp = date.getSeconds()
315
- // ;
316
- // if(tmp != "0"){
317
- // str += ':'+ addleadingZero(tmp, 2);
318
- // }
319
- // tmp = date.getUTCMilliseconds();
320
- // if(tmp != "0"){
321
- // str += '.'+ addleadingZero(tmp, 3);
322
- // }
323
- // return str;
324
- // } else {
325
- // return false;
326
- // }
327
- // }
328
- // }
329
329
  // ,'datetime-local': {
330
330
  // mismatch: function(val, _getParsed){
331
331
  // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
@@ -359,7 +359,7 @@ jQuery.webshims.register('form-number-date-api', function($, webshims, window, d
359
359
 
360
360
  if(typeBugs || !supportsType('range') || !supportsType('time')){
361
361
  typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
362
- // typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
362
+ typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
363
363
  // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
364
364
  }
365
365
 
@@ -373,858 +373,920 @@ jQuery.webshims.register('form-number-date-api', function($, webshims, window, d
373
373
  if(typeBugs || !supportsType('date')){
374
374
  webshims.addInputType('date', typeProtos.date);
375
375
  }
376
- // if(typeBugs || !supportsType('time')){
377
- // webshims.addInputType('time', typeProtos.time);
378
- // }
376
+ if(typeBugs || !supportsType('time')){
377
+ webshims.addInputType('time', typeProtos.time);
378
+ }
379
379
 
380
380
  // if(typeBugs || !supportsType('datetime-local')){
381
381
  // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
382
382
  // }
383
383
 
384
- });/* number-date-ui */
385
- /* https://github.com/aFarkas/webshim/issues#issue/23 */
386
- jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
387
- "use strict";
388
-
389
- var triggerInlineForm = webshims.triggerInlineForm;
390
- var modernizrInputTypes = Modernizr.inputtypes;
391
- var adjustInputWithBtn = (function(){
392
- var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
393
- var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
394
- if($.browser.msie && webshims.browserVersion < 8){
395
- boxSizing = false;
396
- }
397
- var getWidth = function(input){
398
- var widthFn = "width";
399
- if(boxSizing){
400
- widthFn = fns[input.css(boxSizing)] || widthFn;
401
- }
402
-
403
- return {
404
- w: input[widthFn](),
405
- add: widthFn == "width"
406
- };
407
-
408
- };
409
-
410
-
411
- return function(input, button){
412
- var inputDim = getWidth(input);
413
- if(!inputDim.w){return;}
414
- var controlDim = {
415
- mL: (parseInt(button.css('marginLeft'), 10) || 0),
416
- w: button.outerWidth()
417
- };
418
- inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
419
- if(inputDim.mR){
420
- input.css('marginRight', 0);
421
- }
422
- //is inside
423
- if( controlDim.mL <= (controlDim.w * -1) ){
424
- button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
425
- input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
426
- if(inputDim.add){
427
- input.css('width', Math.floor(inputDim.w + controlDim.mL));
428
- }
429
- } else {
430
- button.css('marginRight', inputDim.mR);
431
- input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
432
- }
433
- };
434
- })();
435
-
436
-
437
- var defaultDatepicker = {};
438
- var labelID = 0;
439
- var emptyJ = $([]);
440
- var isCheckValidity;
441
- var replaceInputUI = function(context, elem){
442
- $('input', context).add(elem.filter('input')).each(function(){
443
- var type = $.prop(this, 'type');
444
- if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
445
- replaceInputUI[type]($(this));
446
- }
447
- });
448
- };
449
- //set date is extremly slow in IE so we do it lazy
450
- var lazySetDate = function(elem, date){
451
- if(!options.lazyDate){
452
- elem.datepicker('setDate', date);
453
- return;
454
- }
455
- var timer = $.data(elem[0], 'setDateLazyTimer');
456
- if(timer){
457
- clearTimeout(timer);
458
- }
459
- $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
460
- elem.datepicker('setDate', date);
461
- $.removeData(elem[0], 'setDateLazyTimer');
462
- elem = null;
463
- }, 0));
464
- };
465
-
466
-
467
- var copyAttrs = {
468
- tabindex: 1,
469
- tabIndex: 1,
470
- title: 1,
471
- "aria-required": 1,
472
- "aria-invalid": 1
473
- };
474
- if(!options.copyAttrs){
475
- options.copyAttrs = {};
476
- }
477
-
478
- webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
479
-
480
- var getDimensions = function(orig){
481
- return (options.calculateWidth) ?
482
- {
483
- css: {
484
- marginRight: orig.css('marginRight'),
485
- marginLeft: orig.css('marginLeft')
486
- },
487
- outerWidth: orig.outerWidth()
488
-
489
- } :
490
- {}
491
- ;
492
- };
493
- var focusAttrs = copyAttrs;
494
-
495
- replaceInputUI.common = function(orig, shim, methods){
496
- if(Modernizr.formvalidation){
497
- orig.bind('firstinvalid', function(e){
498
- if(!webshims.fromSubmit && isCheckValidity){return;}
499
- orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
500
- if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
501
- webshims.validityAlert.showFor( e.target );
502
- e.preventDefault();
503
- evt.preventDefault();
504
- }
505
- orig.unbind('invalid.replacedwidgetbubble');
506
- });
507
- });
508
- }
509
- var i, prop;
510
- var focusElement = $('input, span.ui-slider-handle', shim);
511
- var attrs = orig[0].attributes;
512
- for(i in options.copyAttrs){
513
- if ((prop = attrs[i]) && prop.specified) {
514
- if(focusAttrs[i] && focusElement[0]){
515
- focusElement.attr(i, prop.nodeValue);
516
- } else {
517
- shim[0].setAttribute(i, prop.nodeValue);
518
- }
519
- }
520
- }
521
-
522
- var id = orig.attr('id'),
523
- label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
524
- ;
525
-
526
-
527
-
528
- shim.addClass(orig[0].className);
529
- webshims.addShadowDom(orig, shim, {
530
- data: methods || {},
531
- shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
532
- shadowChilds: focusElement
533
- });
534
-
535
- orig.after(shim);
536
-
537
- if(orig[0].form){
538
- $(orig[0].form).bind('reset', function(e){
539
- if(e.originalEvent && !e.isDefaultPrevented()){
540
- setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
541
- }
542
- });
543
- }
544
-
545
- if(label[0]){
546
- shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
547
- label.bind('click', function(){
548
- orig.getShadowFocusElement().focus();
549
- return false;
550
- });
551
- }
552
- };
553
-
554
- if(Modernizr.formvalidation){
555
- ['input', 'form'].forEach(function(name){
556
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
557
- prop: {
558
- value: function(){
559
- isCheckValidity = true;
560
- var ret = desc.prop._supvalue.apply(this, arguments);
561
- isCheckValidity = false;
562
- return ret;
563
- }
564
- }
565
- });
566
- });
567
- }
568
- //date and datetime-local implement if we have to replace
569
- if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
570
-
571
- var datetimeFactor = {
572
- trigger: [0.595,0.395],
573
- normal: [0.565,0.425]
574
- };
575
- var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
576
-
577
- var configureDatePicker = function(elem, datePicker, change, _wrapper){
578
- var stopFocusout;
579
- var focusedOut;
580
- var resetFocusHandler = function(){
581
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
582
- stopFocusout = false;
583
- focusedOut = false;
584
- };
585
- var data = datePicker
586
- .bind('focusin', function(){
587
- resetFocusHandler();
588
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
589
- stopFocusout = true;
590
- });
591
- })
592
- .bind('focusout blur', function(e){
593
- if(stopFocusout){
594
- focusedOut = true;
595
- e.stopImmediatePropagation();
596
- }
597
- })
598
- .datepicker($.extend({
599
- onClose: function(){
600
- if(focusedOut && datePicker.not(':focus')){
601
- resetFocusHandler();
602
- datePicker.trigger('focusout');
603
- datePicker.triggerHandler('blur');
604
- } else {
605
- resetFocusHandler();
606
- }
607
- }
608
- }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
609
- .bind('change', change)
610
- .data('datepicker')
611
- ;
612
- data.dpDiv.addClass('input-date-datepicker-control');
613
-
614
- if(_wrapper){
615
- webshims.triggerDomUpdate(_wrapper[0]);
616
- }
617
- ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
618
- var fn = 'data-placeholder' ? 'attr' : 'prop';
619
- var val = elem[fn](name);
620
- if(val){
621
- elem[fn](name, val);
622
- }
623
- });
624
-
625
- return data;
626
- };
627
-
628
- // replaceInputUI['datetime-local'] = function(elem){
629
- // if(!$.fn.datepicker){return;}
630
- //
631
- // var date = $('<span role="group" class="input-datetime-local"><input type="text" class="input-datetime-local-date" /><input type="time" class="input-datetime-local-time" /></span>'),
632
- // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
633
- // datePicker = $('input.input-datetime-local-date', date),
634
- // datePickerChange = function(e){
635
- //
636
- // var value = datePicker.prop('value') || '',
637
- // timeVal = ''
638
- // ;
639
- // if(options.lazyDate){
640
- // var timer = $.data(datePicker[0], 'setDateLazyTimer');
641
- // if(timer){
642
- // clearTimeout(timer);
643
- // $.removeData(datePicker[0], 'setDateLazyTimer');
644
- // }
645
- // }
646
- //
647
- // if(value){
648
- // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
649
- // try {
650
- // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
651
- // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
652
- // } catch (e) {value = datePicker.prop('value');}
653
- // }
654
- // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
655
- // replaceInputUI['datetime-local'].blockAttr = true;
656
- // elem.prop('value', value);
657
- // replaceInputUI['datetime-local'].blockAttr = false;
658
- // e.stopImmediatePropagation();
659
- // triggerInlineForm(elem[0], 'input');
660
- // triggerInlineForm(elem[0], 'change');
661
- // },
662
- // data = configureDatePicker(elem, datePicker, datePickerChange, date)
663
- // ;
664
- //
665
- //
666
- // $('input.input-datetime-local-time', date).bind('change', function(e){
667
- // var timeVal = $.prop(this, 'value');
668
- // var val = ['', ''];
669
- // if(timeVal){
670
- // val = elem.prop('value').split('T');
671
- // if((val.length < 2 || !val[0])){
672
- // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
673
- // }
674
- // val[1] = timeVal;
675
- //
676
- // if (timeVal) {
677
- // try {
678
- // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
679
- // } catch (e) {}
680
- // }
681
- // }
682
- // val = (!val[0] && !val[1]) ? '' : val.join('T');
683
- // replaceInputUI['datetime-local'].blockAttr = true;
684
- // elem.prop('value', val);
685
- // replaceInputUI['datetime-local'].blockAttr = false;
686
- // e.stopImmediatePropagation();
687
- // triggerInlineForm(elem[0], 'input');
688
- // triggerInlineForm(elem[0], 'change');
689
- // });
690
- //
691
- //
692
- //
693
- // date.attr('aria-labelledby', attr.label.attr('id'));
694
- // attr.label.bind('click', function(){
695
- // datePicker.focus();
696
- // return false;
697
- // });
698
- //
699
- // if(attr.css){
700
- // date.css(attr.css);
701
- // if(attr.outerWidth){
702
- // date.outerWidth(attr.outerWidth);
703
- // var width = date.width();
704
- // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
705
- // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
706
- // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
707
- // if(data.trigger[0]){
708
- // adjustInputWithBtn(datePicker, data.trigger);
709
- // }
710
- // }
711
- // }
712
- //
713
- //
714
- // };
715
- //
716
- // replaceInputUI['datetime-local'].attrs = {
717
- // disabled: function(orig, shim, value){
718
- // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
719
- // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
720
- // },
721
- // step: function(orig, shim, value){
722
- // $('input.input-datetime-local-time', shim).attr('step', value);
723
- // },
724
- // //ToDo: use min also on time
725
- // min: function(orig, shim, value){
726
- // if(value){
727
- // value = (value.split) ? value.split('T') : [];
728
- // try {
729
- // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
730
- // } catch(e){value = false;}
731
- // }
732
- // if(!value){
733
- // value = null;
734
- // }
735
- // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
736
- //
737
- // },
738
- // //ToDo: use max also on time
739
- // max: function(orig, shim, value){
740
- // if(value){
741
- // value = (value.split) ? value.split('T') : [];
742
- // try {
743
- // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
744
- // } catch(e){value = false;}
745
- // }
746
- // if(!value){
747
- // value = null;
748
- // }
749
- // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
750
- // },
751
- // value: function(orig, shim, value){
752
- // var dateValue;
753
- // if(value){
754
- // value = (value.split) ? value.split('T') : [];
755
- // try {
756
- // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
757
- // } catch(e){dateValue = false;}
758
- // }
759
- // if(dateValue){
760
- // if(!replaceInputUI['datetime-local'].blockAttr){
761
- // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
762
- // }
763
- // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
764
- // } else {
765
- // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
766
- // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
767
- // }
768
- //
769
- //
770
- // }
771
- // };
772
-
773
-
774
- replaceInputUI.date = function(elem){
775
-
776
- if(!$.fn.datepicker){return;}
777
- var date = $('<input class="input-date" type="text" />'),
778
-
779
- change = function(e){
780
-
781
- replaceInputUI.date.blockAttr = true;
782
- var value;
783
- if(options.lazyDate){
784
- var timer = $.data(date[0], 'setDateLazyTimer');
785
- if(timer){
786
- clearTimeout(timer);
787
- $.removeData(date[0], 'setDateLazyTimer');
788
- }
789
- }
790
- try {
791
- value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
792
- value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
793
- } catch(e){
794
- value = date.prop('value');
795
- }
796
- elem.prop('value', value);
797
- replaceInputUI.date.blockAttr = false;
798
- e.stopImmediatePropagation();
799
- triggerInlineForm(elem[0], 'input');
800
- triggerInlineForm(elem[0], 'change');
801
- },
802
- data
803
-
804
- ;
805
-
806
- this.common(elem, date, replaceInputUI.date.attrs);
807
-
808
- data = configureDatePicker(elem, date, change);
809
-
810
- $(elem)
811
- .bind('updateshadowdom', function(){
812
- if (data.trigger[0]) {
813
- elem.css({display: ''});
814
- if(elem[0].offsetWidth || elem[0].offsetHeight){
815
- var attr = getDimensions(elem);
816
- if (attr.css) {
817
- date.css(attr.css);
818
- if (attr.outerWidth) {
819
- date.outerWidth(attr.outerWidth);
820
- }
821
- adjustInputWithBtn(date, data.trigger);
822
- }
823
- }
824
- }
825
- elem.css({display: 'none'});
826
- })
827
- .triggerHandler('updateshadowdom')
828
- ;
829
- if (data.trigger[0]) {
830
- setTimeout(function(){
831
- webshims.ready('WINDOWLOAD', function(){
832
- $(elem).triggerHandler('updateshadowdom');
833
- });
834
- }, 9);
835
- }
836
-
837
- };
838
-
839
-
840
- replaceInputUI.date.attrs = {
841
- disabled: function(orig, shim, value){
842
- $.prop(shim, 'disabled', !!value);
843
- },
844
- min: function(orig, shim, value){
845
- try {
846
- value = $.datepicker.parseDate('yy-mm-dd', value);
847
- } catch(e){value = false;}
848
- if(value){
849
- $(shim).datepicker('option', 'minDate', value);
850
- }
851
- },
852
- max: function(orig, shim, value){
853
- try {
854
- value = $.datepicker.parseDate('yy-mm-dd', value);
855
- } catch(e){value = false;}
856
- if(value){
857
- $(shim).datepicker('option', 'maxDate', value);
858
- }
859
- },
860
- 'data-placeholder': function(orig, shim, value){
861
- var hintValue = (value || '').split('-');
862
- var dateFormat;
863
- if(hintValue.length == 3){
864
- value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
865
- }
866
- $.prop(shim, 'placeholder', value);
867
- },
868
- value: function(orig, shim, value){
869
- if(!replaceInputUI.date.blockAttr){
870
- try {
871
- var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
872
- } catch(e){var dateValue = false;}
873
-
874
- if(dateValue){
875
- lazySetDate($(shim), dateValue);
876
- } else {
877
- $.prop(shim, 'value', value);
878
- }
879
- }
880
- }
881
- };
882
- }
883
- if (!modernizrInputTypes.range || options.replaceUI) {
884
- replaceInputUI.range = function(elem){
885
- if(!$.fn.slider){return;}
886
- var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
887
- change = function(e, ui){
888
- if(e.originalEvent){
889
- replaceInputUI.range.blockAttr = true;
890
- elem.prop('value', ui.value);
891
- replaceInputUI.range.blockAttr = false;
892
- triggerInlineForm(elem[0], 'input');
893
- triggerInlineForm(elem[0], 'change');
894
- }
895
- }
896
- ;
897
-
898
- this.common(elem, range, replaceInputUI.range.attrs);
899
-
900
-
901
- elem
902
- .bind('updateshadowdom', function(){
903
- elem.css({display: ''});
904
- if (elem[0].offsetWidth || elem[0].offsetHeight) {
905
- var attr = getDimensions(elem);
906
- if (attr.css) {
907
- range.css(attr.css);
908
- if (attr.outerWidth) {
909
- range.outerWidth(attr.outerWidth);
910
- }
911
- }
912
- }
913
- elem.css({display: 'none'});
914
- })
915
- .triggerHandler('updateshadowdom')
916
- ;
917
-
918
-
919
- range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change);
920
-
921
- ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
922
- var val = elem.prop(name);
923
- var shadow;
924
- if(name == 'value' && !val){
925
-
926
- shadow = elem.getShadowElement();
927
- if(shadow){
928
- val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
929
- }
930
- }
931
- if(val != null){
932
- elem.prop(name, val);
933
- }
934
- });
935
- };
936
-
937
- replaceInputUI.range.attrs = {
938
- disabled: function(orig, shim, value){
939
- value = !!value;
940
- $(shim).slider( "option", "disabled", value );
941
- $('span', shim)
942
- .attr({
943
- 'aria-disabled': value+'',
944
- 'tabindex': (value) ? '-1' : '0'
945
- })
946
- ;
947
- },
948
- min: function(orig, shim, value){
949
- value = (value) ? value * 1 || 0 : 0;
950
- $(shim).slider( "option", "min", value );
951
- $('span', shim).attr({'aria-valuemin': value});
952
- },
953
- max: function(orig, shim, value){
954
- value = (value || value === 0) ? value * 1 || 100 : 100;
955
- $(shim).slider( "option", "max", value );
956
- $('span', shim).attr({'aria-valuemax': value});
957
- },
958
- value: function(orig, shim, value){
959
- value = $(orig).prop('valueAsNumber');
960
- if(!isNaN(value)){
961
- if(!replaceInputUI.range.blockAttr){
962
- $(shim).slider( "option", "value", value );
963
- }
964
- $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
965
- }
966
- },
967
- step: function(orig, shim, value){
968
- value = (value && $.trim(value)) ? value * 1 || 1 : 1;
969
- $(shim).slider( "option", "step", value );
970
- }
971
- };
972
- }
973
-
974
- if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
975
- var reflectFn = function(val){
976
- if(webshims.data(this, 'hasShadow')){
977
- $.prop(this, 'value', $.prop(this, 'value'));
978
- }
979
- };
980
-
981
- webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
982
- webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
983
- }
984
-
985
- $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
986
- webshims.onNodeNamesPropertyModify('input', attr, function(val){
987
- var shadowData = webshims.data(this, 'shadowData');
988
- if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
989
- shadowData.data[attr](this, shadowData.shadowElement, val);
990
- }
991
- }
992
- );
993
- });
994
- if(!options.availabeLangs){
995
- options.availabeLangs = 'af ar ar-DZ az bg bs ca cs da de el en-AU en-GB en-NZ eo es et eu fa fi fo fr fr-CH gl he hr hu hy id is it ja ko kz lt lv ml ms nl no pl pt-BR rm ro ru sk sl sq sr sr-SR sv ta th tr uk vi zh-CN zh-HK zh-TW'.split(' ');
996
- }
997
-
998
- var getDefaults = function(){
999
- if(!$.datepicker){return;}
1000
-
1001
- webshims.activeLang({
1002
- langObj: $.datepicker.regional,
1003
- module: 'form-number-date-ui',
1004
- callback: function(langObj){
1005
- var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1006
-
1007
-
1008
- if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1009
- $('input.hasDatepicker')
1010
- .filter('.input-date, .input-datetime-local-date')
1011
- .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1012
- .getNativeElement()
1013
- .filter('[data-placeholder]')
1014
- .attr('data-placeholder', function(i, val){
1015
- return val;
1016
- })
1017
- ;
1018
- }
1019
- $.datepicker.setDefaults(datepickerCFG);
1020
- }
1021
- });
1022
- $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1023
- };
1024
-
1025
- $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1026
- getDefaults();
1027
-
1028
- //implement set/arrow controls
1029
- (function(){
1030
- var supportsType = (function(){
1031
- var types = {};
1032
- return function(type){
1033
- if(type in types){
1034
- return types[type];
1035
- }
1036
- return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1037
- };
1038
- })();
1039
-
1040
- if(supportsType('number')/* && supportsType('time')*/){return;}
1041
- var doc = document;
1042
- var options = webshims.cfg["forms-ext"];
1043
- var typeModels = webshims.inputTypes;
1044
-
1045
- var getNextStep = function(input, upDown, cache){
1046
-
1047
- cache = cache || {};
1048
-
1049
- if( !('type' in cache) ){
1050
- cache.type = $.prop(input, 'type');
1051
- }
1052
- if( !('step' in cache) ){
1053
- cache.step = webshims.getStep(input, cache.type);
1054
- }
1055
- if( !('valueAsNumber' in cache) ){
1056
- cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1057
- }
1058
- var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1059
- ret
1060
- ;
1061
- webshims.addMinMaxNumberToCache('min', $(input), cache);
1062
- webshims.addMinMaxNumberToCache('max', $(input), cache);
1063
-
1064
- if(isNaN(cache.valueAsNumber)){
1065
- cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1066
- }
1067
- //make a valid step
1068
- if(cache.step !== 'any'){
1069
- ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
1070
- if(ret && Math.abs(ret) != cache.step){
1071
- cache.valueAsNumber = cache.valueAsNumber - ret;
1072
- }
1073
- }
1074
- ret = cache.valueAsNumber + (delta * upDown);
1075
- //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
1076
- if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
1077
- ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
1078
- } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
1079
- ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
1080
- } else {
1081
- ret = Math.round( ret * 1e7) / 1e7;
1082
- }
1083
- return ret;
1084
- };
1085
-
1086
- webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
1087
-
1088
- var doSteps = function(input, type, control){
1089
- if(input.disabled || input.readOnly || $(control).hasClass('step-controls')){return;}
1090
- $.prop(input, 'value', typeModels[type].numberToString(getNextStep(input, ($(control).hasClass('step-up')) ? 1 : -1, {type: type})));
1091
- $(input).unbind('blur.stepeventshim');
1092
- triggerInlineForm(input, 'input');
1093
-
1094
-
1095
- if( doc.activeElement ){
1096
- if(doc.activeElement !== input){
1097
- try {input.focus();} catch(e){}
1098
- }
1099
- setTimeout(function(){
1100
- if(doc.activeElement !== input){
1101
- try {input.focus();} catch(e){}
1102
- }
1103
- $(input)
1104
- .one('blur.stepeventshim', function(){
1105
- triggerInlineForm(input, 'change');
1106
- })
1107
- ;
1108
- }, 0);
1109
-
1110
- }
1111
- };
1112
-
1113
-
1114
- if(options.stepArrows){
1115
- var stepDisableEnable = {
1116
- // don't change getter
1117
- set: function(value){
1118
- var stepcontrols = webshims.data(this, 'step-controls');
1119
- if(stepcontrols){
1120
- stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
1121
- }
1122
- }
1123
- };
1124
- webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
1125
- webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
1126
- }
1127
- var stepKeys = {
1128
- 38: 1,
1129
- 40: -1
1130
- };
1131
- webshims.addReady(function(context, contextElem){
1132
- //ui for numeric values
1133
- if(options.stepArrows){
1134
- $('input', context).add(contextElem.filter('input')).each(function(){
1135
- var type = $.prop(this, 'type');
1136
- if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
1137
- var elem = this;
1138
- var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
1139
- .insertAfter(elem)
1140
- .bind('selectstart dragstart', function(){return false;})
1141
- .bind('mousedown mousepress', function(e){
1142
- doSteps(elem, type, e.target);
1143
- return false;
1144
- })
1145
- .bind('mousepressstart mousepressend', function(e){
1146
- $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1147
- })
1148
- ;
1149
- var mwheelUpDown = function(e, d){
1150
- if(elem.disabled || elem.readOnly || !d){return;}
1151
- $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, d, {type: type})));
1152
- triggerInlineForm(elem, 'input');
1153
- return false;
1154
- };
1155
- var jElm = $(elem)
1156
- .addClass('has-step-controls')
1157
- .attr({
1158
- readonly: elem.readOnly,
1159
- disabled: elem.disabled,
1160
- autocomplete: 'off',
1161
- role: 'spinbutton'
1162
- })
1163
- .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1164
- if(elem.disabled || elem.readOnly || !stepKeys[e.keyCode]){return;}
1165
- $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, stepKeys[e.keyCode], {type: type})));
1166
- triggerInlineForm(elem, 'input');
1167
- return false;
1168
- })
1169
- ;
1170
- if(type == 'number'){
1171
- jElm.bind('keypress', (function(){
1172
- var chars = '0123456789.';
1173
- return function(event){
1174
- var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
1175
- return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
1176
- };
1177
- })());
1178
- }
1179
- if($.fn.mwheelIntent){
1180
- jElm.add(controls).bind('mwheelIntent', mwheelUpDown);
1181
- } else if($.fn.mousewheel) {
1182
- jElm
1183
- .bind('focus', function(){
1184
- jElm.add(controls).unbind('.mwhellwebshims')
1185
- .bind('mousewheel.mwhellwebshims', mwheelUpDown)
1186
- ;
1187
- })
1188
- .bind('blur', function(){
1189
- $(elem).add(controls).unbind('.mwhellwebshims');
1190
- })
1191
- ;
1192
- }
1193
- webshims.data(elem, 'step-controls', controls);
1194
- if(options.calculateWidth){
1195
- var init;
1196
- jElm
1197
- .bind('updateshadowdom', function(){
1198
- if(!init && (elem.offsetWidth || elem.offsetHeight)){
1199
- init = true;
1200
- adjustInputWithBtn(jElm, controls);
1201
- controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
1202
- }
1203
- })
1204
- .triggerHandler('updateshadowdom')
1205
- ;
1206
- }
1207
- });
1208
- }
1209
- });
1210
- })();
1211
-
1212
-
1213
- webshims.addReady(function(context, elem){
1214
- $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1215
- if($.datepicker || $.fn.slider){
1216
- if($.datepicker && !defaultDatepicker.dateFormat){
1217
- defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
1218
- }
1219
- replaceInputUI(context, elem);
1220
- }
1221
- if($.datepicker && $.fn.slider){
1222
- $(document).unbind('.initinputui');
1223
- } else if(!webshims.modules["input-widgets"].src){
1224
- webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
1225
- }
1226
- });
1227
- });
1228
-
1229
- });
1230
-
384
+ });/* number-date-ui */
385
+ /* https://github.com/aFarkas/webshim/issues#issue/23 */
386
+ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
387
+ "use strict";
388
+
389
+ var triggerInlineForm = webshims.triggerInlineForm;
390
+ var modernizrInputTypes = Modernizr.inputtypes;
391
+ var adjustInputWithBtn = (function(){
392
+ var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
393
+ var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
394
+ if($.browser.msie && webshims.browserVersion < 8){
395
+ boxSizing = false;
396
+ }
397
+ var getWidth = function(input){
398
+ var widthFn = "width";
399
+ if(boxSizing){
400
+ widthFn = fns[input.css(boxSizing)] || widthFn;
401
+ }
402
+
403
+ return {
404
+ w: input[widthFn](),
405
+ add: widthFn == "width"
406
+ };
407
+
408
+ };
409
+
410
+
411
+ return function(input, button){
412
+ var inputDim = getWidth(input);
413
+ if(!inputDim.w){return;}
414
+ var controlDim = {
415
+ mL: (parseInt(button.css('marginLeft'), 10) || 0),
416
+ w: button.outerWidth()
417
+ };
418
+ inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
419
+ if(inputDim.mR){
420
+ input.css('marginRight', 0);
421
+ }
422
+ //is inside
423
+ if( controlDim.mL <= (controlDim.w * -1) ){
424
+ button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
425
+ input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
426
+ if(inputDim.add){
427
+ input.css('width', Math.floor(inputDim.w + controlDim.mL));
428
+ }
429
+ } else {
430
+ button.css('marginRight', inputDim.mR);
431
+ input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
432
+ }
433
+ };
434
+ })();
435
+
436
+
437
+ var defaultDatepicker = {};
438
+ var labelID = 0;
439
+ var emptyJ = $([]);
440
+ var isCheckValidity;
441
+ var replaceInputUI = function(context, elem){
442
+ $('input', context).add(elem.filter('input')).each(function(){
443
+ var type = $.prop(this, 'type');
444
+ if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
445
+ replaceInputUI[type]($(this));
446
+ }
447
+ });
448
+ };
449
+ //set date is extremly slow in IE so we do it lazy
450
+ var lazySetDate = function(elem, date){
451
+ if(!options.lazyDate){
452
+ elem.datepicker('setDate', date);
453
+ return;
454
+ }
455
+ var timer = $.data(elem[0], 'setDateLazyTimer');
456
+ if(timer){
457
+ clearTimeout(timer);
458
+ }
459
+ $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
460
+ elem.datepicker('setDate', date);
461
+ $.removeData(elem[0], 'setDateLazyTimer');
462
+ elem = null;
463
+ }, 0));
464
+ };
465
+
466
+
467
+ var copyAttrs = {
468
+ tabindex: 1,
469
+ tabIndex: 1,
470
+ title: 1,
471
+ "aria-required": 1,
472
+ "aria-invalid": 1
473
+ };
474
+ if(!options.copyAttrs){
475
+ options.copyAttrs = {};
476
+ }
477
+
478
+ webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
479
+
480
+ var getDimensions = function(orig){
481
+ return (options.calculateWidth) ?
482
+ {
483
+ css: {
484
+ marginRight: orig.css('marginRight'),
485
+ marginLeft: orig.css('marginLeft')
486
+ },
487
+ outerWidth: orig.outerWidth()
488
+
489
+ } :
490
+ {}
491
+ ;
492
+ };
493
+ var focusAttrs = copyAttrs;
494
+
495
+ replaceInputUI.common = function(orig, shim, methods){
496
+ if(Modernizr.formvalidation){
497
+ orig.bind('firstinvalid', function(e){
498
+ if(!webshims.fromSubmit && isCheckValidity){return;}
499
+ orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
500
+ if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
501
+ webshims.validityAlert.showFor( e.target );
502
+ e.preventDefault();
503
+ evt.preventDefault();
504
+ }
505
+ orig.unbind('invalid.replacedwidgetbubble');
506
+ });
507
+ });
508
+ }
509
+ var i, prop;
510
+ var focusElement = $('input, span.ui-slider-handle', shim);
511
+ var attrs = orig[0].attributes;
512
+ for(i in options.copyAttrs){
513
+ if ((prop = attrs[i]) && prop.specified) {
514
+ if(focusAttrs[i] && focusElement[0]){
515
+ focusElement.attr(i, prop.nodeValue);
516
+ } else {
517
+ shim[0].setAttribute(i, prop.nodeValue);
518
+ }
519
+ }
520
+ }
521
+
522
+ var id = orig.attr('id'),
523
+ label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
524
+ ;
525
+
526
+
527
+
528
+ shim.addClass(orig[0].className);
529
+ webshims.addShadowDom(orig, shim, {
530
+ data: methods || {},
531
+ shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
532
+ shadowChilds: focusElement
533
+ });
534
+
535
+ orig.after(shim);
536
+
537
+ if(orig[0].form){
538
+ $(orig[0].form).bind('reset', function(e){
539
+ if(e.originalEvent && !e.isDefaultPrevented()){
540
+ setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
541
+ }
542
+ });
543
+ }
544
+
545
+ if(label[0]){
546
+ shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
547
+ label.bind('click', function(){
548
+ orig.getShadowFocusElement().focus();
549
+ return false;
550
+ });
551
+ }
552
+ };
553
+
554
+ if(Modernizr.formvalidation){
555
+ ['input', 'form'].forEach(function(name){
556
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
557
+ prop: {
558
+ value: function(){
559
+ isCheckValidity = true;
560
+ var ret = desc.prop._supvalue.apply(this, arguments);
561
+ isCheckValidity = false;
562
+ return ret;
563
+ }
564
+ }
565
+ });
566
+ });
567
+ }
568
+ //date and datetime-local implement if we have to replace
569
+ if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
570
+
571
+ var datetimeFactor = {
572
+ trigger: [0.595,0.395],
573
+ normal: [0.565,0.425]
574
+ };
575
+ var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
576
+
577
+ var configureDatePicker = function(elem, datePicker, change, _wrapper){
578
+ var stopFocusout;
579
+ var focusedOut;
580
+ var resetFocusHandler = function(){
581
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
582
+ stopFocusout = false;
583
+ focusedOut = false;
584
+ };
585
+ var data = datePicker
586
+ .bind('focusin', function(){
587
+ resetFocusHandler();
588
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
589
+ stopFocusout = true;
590
+ });
591
+ })
592
+ .bind('focusout blur', function(e){
593
+ if(stopFocusout){
594
+ focusedOut = true;
595
+ e.stopImmediatePropagation();
596
+ }
597
+ })
598
+ .datepicker($.extend({
599
+ onClose: function(){
600
+ if(focusedOut && datePicker.not(':focus')){
601
+ resetFocusHandler();
602
+ datePicker.trigger('focusout');
603
+ datePicker.triggerHandler('blur');
604
+ } else {
605
+ resetFocusHandler();
606
+ }
607
+ }
608
+ }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
609
+ .bind('change', change)
610
+ .data('datepicker')
611
+ ;
612
+ data.dpDiv.addClass('input-date-datepicker-control');
613
+
614
+ if(_wrapper){
615
+ webshims.triggerDomUpdate(_wrapper[0]);
616
+ }
617
+ ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
618
+ var fn = 'data-placeholder' ? 'attr' : 'prop';
619
+ var val = elem[fn](name);
620
+ if(val){
621
+ elem[fn](name, val);
622
+ }
623
+ });
624
+
625
+ return data;
626
+ };
627
+
628
+ // replaceInputUI['datetime-local'] = function(elem){
629
+ // if(!$.fn.datepicker){return;}
630
+ //
631
+ // var date = $('<span role="group" class="input-datetime-local"><input type="text" class="input-datetime-local-date" /><input type="time" class="input-datetime-local-time" /></span>'),
632
+ // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
633
+ // datePicker = $('input.input-datetime-local-date', date),
634
+ // datePickerChange = function(e){
635
+ //
636
+ // var value = datePicker.prop('value') || '',
637
+ // timeVal = ''
638
+ // ;
639
+ // if(options.lazyDate){
640
+ // var timer = $.data(datePicker[0], 'setDateLazyTimer');
641
+ // if(timer){
642
+ // clearTimeout(timer);
643
+ // $.removeData(datePicker[0], 'setDateLazyTimer');
644
+ // }
645
+ // }
646
+ //
647
+ // if(value){
648
+ // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
649
+ // try {
650
+ // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
651
+ // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
652
+ // } catch (e) {value = datePicker.prop('value');}
653
+ // }
654
+ // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
655
+ // replaceInputUI['datetime-local'].blockAttr = true;
656
+ // elem.prop('value', value);
657
+ // replaceInputUI['datetime-local'].blockAttr = false;
658
+ // e.stopImmediatePropagation();
659
+ // triggerInlineForm(elem[0], 'input');
660
+ // triggerInlineForm(elem[0], 'change');
661
+ // },
662
+ // data = configureDatePicker(elem, datePicker, datePickerChange, date)
663
+ // ;
664
+ //
665
+ //
666
+ // $('input.input-datetime-local-time', date).bind('change', function(e){
667
+ // var timeVal = $.prop(this, 'value');
668
+ // var val = ['', ''];
669
+ // if(timeVal){
670
+ // val = elem.prop('value').split('T');
671
+ // if((val.length < 2 || !val[0])){
672
+ // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
673
+ // }
674
+ // val[1] = timeVal;
675
+ //
676
+ // if (timeVal) {
677
+ // try {
678
+ // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
679
+ // } catch (e) {}
680
+ // }
681
+ // }
682
+ // val = (!val[0] && !val[1]) ? '' : val.join('T');
683
+ // replaceInputUI['datetime-local'].blockAttr = true;
684
+ // elem.prop('value', val);
685
+ // replaceInputUI['datetime-local'].blockAttr = false;
686
+ // e.stopImmediatePropagation();
687
+ // triggerInlineForm(elem[0], 'input');
688
+ // triggerInlineForm(elem[0], 'change');
689
+ // });
690
+ //
691
+ //
692
+ //
693
+ // date.attr('aria-labelledby', attr.label.attr('id'));
694
+ // attr.label.bind('click', function(){
695
+ // datePicker.focus();
696
+ // return false;
697
+ // });
698
+ //
699
+ // if(attr.css){
700
+ // date.css(attr.css);
701
+ // if(attr.outerWidth){
702
+ // date.outerWidth(attr.outerWidth);
703
+ // var width = date.width();
704
+ // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
705
+ // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
706
+ // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
707
+ // if(data.trigger[0]){
708
+ // adjustInputWithBtn(datePicker, data.trigger);
709
+ // }
710
+ // }
711
+ // }
712
+ //
713
+ //
714
+ // };
715
+ //
716
+ // replaceInputUI['datetime-local'].attrs = {
717
+ // disabled: function(orig, shim, value){
718
+ // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
719
+ // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
720
+ // },
721
+ // step: function(orig, shim, value){
722
+ // $('input.input-datetime-local-time', shim).attr('step', value);
723
+ // },
724
+ // //ToDo: use min also on time
725
+ // min: function(orig, shim, value){
726
+ // if(value){
727
+ // value = (value.split) ? value.split('T') : [];
728
+ // try {
729
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
730
+ // } catch(e){value = false;}
731
+ // }
732
+ // if(!value){
733
+ // value = null;
734
+ // }
735
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
736
+ //
737
+ // },
738
+ // //ToDo: use max also on time
739
+ // max: function(orig, shim, value){
740
+ // if(value){
741
+ // value = (value.split) ? value.split('T') : [];
742
+ // try {
743
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
744
+ // } catch(e){value = false;}
745
+ // }
746
+ // if(!value){
747
+ // value = null;
748
+ // }
749
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
750
+ // },
751
+ // value: function(orig, shim, value){
752
+ // var dateValue;
753
+ // if(value){
754
+ // value = (value.split) ? value.split('T') : [];
755
+ // try {
756
+ // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
757
+ // } catch(e){dateValue = false;}
758
+ // }
759
+ // if(dateValue){
760
+ // if(!replaceInputUI['datetime-local'].blockAttr){
761
+ // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
762
+ // }
763
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
764
+ // } else {
765
+ // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
766
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
767
+ // }
768
+ //
769
+ //
770
+ // }
771
+ // };
772
+
773
+
774
+ replaceInputUI.date = function(elem){
775
+
776
+ if(!$.fn.datepicker){return;}
777
+ var date = $('<input class="input-date" type="text" />'),
778
+
779
+ change = function(e){
780
+
781
+ replaceInputUI.date.blockAttr = true;
782
+ var value;
783
+ if(options.lazyDate){
784
+ var timer = $.data(date[0], 'setDateLazyTimer');
785
+ if(timer){
786
+ clearTimeout(timer);
787
+ $.removeData(date[0], 'setDateLazyTimer');
788
+ }
789
+ }
790
+ try {
791
+ value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
792
+ value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
793
+ } catch(e){
794
+ value = date.prop('value');
795
+ }
796
+ elem.prop('value', value);
797
+ replaceInputUI.date.blockAttr = false;
798
+ e.stopImmediatePropagation();
799
+ triggerInlineForm(elem[0], 'input');
800
+ triggerInlineForm(elem[0], 'change');
801
+ },
802
+ data
803
+
804
+ ;
805
+
806
+ this.common(elem, date, replaceInputUI.date.attrs);
807
+
808
+ data = configureDatePicker(elem, date, change);
809
+
810
+ $(elem)
811
+ .bind('updateshadowdom', function(){
812
+ if (data.trigger[0]) {
813
+ elem.css({display: ''});
814
+ if(elem[0].offsetWidth || elem[0].offsetHeight){
815
+ var attr = getDimensions(elem);
816
+ if (attr.css) {
817
+ date.css(attr.css);
818
+ if (attr.outerWidth) {
819
+ date.outerWidth(attr.outerWidth);
820
+ }
821
+ adjustInputWithBtn(date, data.trigger);
822
+ }
823
+ }
824
+ }
825
+ elem.css({display: 'none'});
826
+ })
827
+ .triggerHandler('updateshadowdom')
828
+ ;
829
+ if (data.trigger[0]) {
830
+ setTimeout(function(){
831
+ webshims.ready('WINDOWLOAD', function(){
832
+ $(elem).triggerHandler('updateshadowdom');
833
+ });
834
+ }, 9);
835
+ }
836
+
837
+ };
838
+
839
+
840
+ replaceInputUI.date.attrs = {
841
+ disabled: function(orig, shim, value){
842
+ $.prop(shim, 'disabled', !!value);
843
+ },
844
+ min: function(orig, shim, value){
845
+ try {
846
+ value = $.datepicker.parseDate('yy-mm-dd', value);
847
+ } catch(e){value = false;}
848
+ if(value){
849
+ $(shim).datepicker('option', 'minDate', value);
850
+ }
851
+ },
852
+ max: function(orig, shim, value){
853
+ try {
854
+ value = $.datepicker.parseDate('yy-mm-dd', value);
855
+ } catch(e){value = false;}
856
+ if(value){
857
+ $(shim).datepicker('option', 'maxDate', value);
858
+ }
859
+ },
860
+ 'data-placeholder': function(orig, shim, value){
861
+ var hintValue = (value || '').split('-');
862
+ var dateFormat;
863
+ if(hintValue.length == 3){
864
+ value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
865
+ }
866
+ $.prop(shim, 'placeholder', value);
867
+ },
868
+ value: function(orig, shim, value){
869
+ if(!replaceInputUI.date.blockAttr){
870
+ try {
871
+ var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
872
+ } catch(e){var dateValue = false;}
873
+
874
+ if(dateValue){
875
+ lazySetDate($(shim), dateValue);
876
+ } else {
877
+ $.prop(shim, 'value', value);
878
+ }
879
+ }
880
+ }
881
+ };
882
+ }
883
+ if (!modernizrInputTypes.range || options.replaceUI) {
884
+ replaceInputUI.range = function(elem){
885
+ if(!$.fn.slider){return;}
886
+ var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
887
+ change = function(e, ui){
888
+ if(e.originalEvent){
889
+ replaceInputUI.range.blockAttr = true;
890
+ elem.prop('value', ui.value);
891
+ replaceInputUI.range.blockAttr = false;
892
+ triggerInlineForm(elem[0], 'input');
893
+ }
894
+ }
895
+ ;
896
+
897
+ this.common(elem, range, replaceInputUI.range.attrs);
898
+
899
+
900
+ elem
901
+ .bind('updateshadowdom', function(){
902
+ elem.css({display: ''});
903
+ if (elem[0].offsetWidth || elem[0].offsetHeight) {
904
+ var attr = getDimensions(elem);
905
+ if (attr.css) {
906
+ range.css(attr.css);
907
+ if (attr.outerWidth) {
908
+ range.outerWidth(attr.outerWidth);
909
+ }
910
+ }
911
+ }
912
+ elem.css({display: 'none'});
913
+ })
914
+ .triggerHandler('updateshadowdom')
915
+ ;
916
+
917
+
918
+ range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change).bind('slidechange', function(e){
919
+ if(e.originalEvent){
920
+ triggerInlineForm(elem[0], 'change');
921
+ }
922
+ });
923
+
924
+ ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
925
+ var val = elem.prop(name);
926
+ var shadow;
927
+ if(name == 'value' && !val){
928
+
929
+ shadow = elem.getShadowElement();
930
+ if(shadow){
931
+ val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
932
+ }
933
+ }
934
+ if(val != null){
935
+ elem.prop(name, val);
936
+ }
937
+ });
938
+ };
939
+
940
+ replaceInputUI.range.attrs = {
941
+ disabled: function(orig, shim, value){
942
+ value = !!value;
943
+ $(shim).slider( "option", "disabled", value );
944
+ $('span', shim)
945
+ .attr({
946
+ 'aria-disabled': value+'',
947
+ 'tabindex': (value) ? '-1' : '0'
948
+ })
949
+ ;
950
+ },
951
+ min: function(orig, shim, value){
952
+ value = (value) ? value * 1 || 0 : 0;
953
+ $(shim).slider( "option", "min", value );
954
+ $('span', shim).attr({'aria-valuemin': value});
955
+ },
956
+ max: function(orig, shim, value){
957
+ value = (value || value === 0) ? value * 1 || 100 : 100;
958
+ $(shim).slider( "option", "max", value );
959
+ $('span', shim).attr({'aria-valuemax': value});
960
+ },
961
+ value: function(orig, shim, value){
962
+ value = $(orig).prop('valueAsNumber');
963
+ if(!isNaN(value)){
964
+ if(!replaceInputUI.range.blockAttr){
965
+ $(shim).slider( "option", "value", value );
966
+ }
967
+ $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
968
+ }
969
+ },
970
+ step: function(orig, shim, value){
971
+ value = (value && $.trim(value)) ? value * 1 || 1 : 1;
972
+ $(shim).slider( "option", "step", value );
973
+ }
974
+ };
975
+ }
976
+
977
+ if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
978
+ var reflectFn = function(val){
979
+ if(webshims.data(this, 'hasShadow')){
980
+ $.prop(this, 'value', $.prop(this, 'value'));
981
+ }
982
+ };
983
+
984
+ webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
985
+ webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
986
+ }
987
+
988
+ $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
989
+ webshims.onNodeNamesPropertyModify('input', attr, function(val){
990
+ var shadowData = webshims.data(this, 'shadowData');
991
+ if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
992
+ shadowData.data[attr](this, shadowData.shadowElement, val);
993
+ }
994
+ }
995
+ );
996
+ });
997
+ if(!options.availabeLangs){
998
+ options.availabeLangs = 'af ar ar-DZ az bg bs ca cs da de el en-AU en-GB en-NZ eo es et eu fa fi fo fr fr-CH gl he hr hu hy id is it ja ko kz lt lv ml ms nl no pl pt-BR rm ro ru sk sl sq sr sr-SR sv ta th tr uk vi zh-CN zh-HK zh-TW'.split(' ');
999
+ }
1000
+
1001
+ var getDefaults = function(){
1002
+ if(!$.datepicker){return;}
1003
+
1004
+ webshims.activeLang({
1005
+ langObj: $.datepicker.regional,
1006
+ module: 'form-number-date-ui',
1007
+ callback: function(langObj){
1008
+ var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1009
+
1010
+
1011
+ if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1012
+ $('input.hasDatepicker')
1013
+ .filter('.input-date, .input-datetime-local-date')
1014
+ .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1015
+ .getNativeElement()
1016
+ .filter('[data-placeholder]')
1017
+ .attr('data-placeholder', function(i, val){
1018
+ return val;
1019
+ })
1020
+ ;
1021
+ }
1022
+ $.datepicker.setDefaults(datepickerCFG);
1023
+ }
1024
+ });
1025
+ $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1026
+ };
1027
+
1028
+ $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1029
+ getDefaults();
1030
+
1031
+ //implement set/arrow controls
1032
+ (function(){
1033
+ var supportsType = (function(){
1034
+ var types = {};
1035
+ return function(type){
1036
+ if(type in types){
1037
+ return types[type];
1038
+ }
1039
+ return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1040
+ };
1041
+ })();
1042
+
1043
+ if(supportsType('number') && supportsType('time')){return;}
1044
+ var doc = document;
1045
+ var options = webshims.cfg["forms-ext"];
1046
+ var typeModels = webshims.inputTypes;
1047
+ var allowedChars = {
1048
+ number: '0123456789.',
1049
+ time: '0123456789:.'
1050
+ };
1051
+
1052
+ var getNextStep = function(input, upDown, cache){
1053
+
1054
+ cache = cache || {};
1055
+
1056
+ if( !('type' in cache) ){
1057
+ cache.type = $.prop(input, 'type');
1058
+ }
1059
+ if( !('step' in cache) ){
1060
+ cache.step = webshims.getStep(input, cache.type);
1061
+ }
1062
+ if( !('valueAsNumber' in cache) ){
1063
+ cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1064
+ }
1065
+ var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1066
+ ret
1067
+ ;
1068
+ webshims.addMinMaxNumberToCache('min', $(input), cache);
1069
+ webshims.addMinMaxNumberToCache('max', $(input), cache);
1070
+
1071
+ if(isNaN(cache.valueAsNumber)){
1072
+ cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1073
+ }
1074
+ //make a valid step
1075
+ if(cache.step !== 'any'){
1076
+ ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
1077
+ if(ret && Math.abs(ret) != cache.step){
1078
+ cache.valueAsNumber = cache.valueAsNumber - ret;
1079
+ }
1080
+ }
1081
+ ret = cache.valueAsNumber + (delta * upDown);
1082
+ //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
1083
+ if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
1084
+ ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
1085
+ } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
1086
+ ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
1087
+ } else {
1088
+ ret = Math.round( ret * 1e7) / 1e7;
1089
+ }
1090
+ return ret;
1091
+ };
1092
+
1093
+ webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
1094
+
1095
+
1096
+ if(options.stepArrows){
1097
+ var stepDisableEnable = {
1098
+ // don't change getter
1099
+ set: function(value){
1100
+ var stepcontrols = webshims.data(this, 'step-controls');
1101
+ if(stepcontrols){
1102
+ stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
1103
+ }
1104
+ }
1105
+ };
1106
+ webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
1107
+ webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
1108
+ }
1109
+ var stepKeys = {
1110
+ 38: 1,
1111
+ 40: -1
1112
+ };
1113
+
1114
+ var changeInput = function(elem, type){
1115
+ var blockBlurChange = false;
1116
+ var DELAY = 9;
1117
+ var doChangeValue, blockChangeValue;
1118
+
1119
+ function step(dir){
1120
+ if($.prop(elem, 'disabled') || elem.readOnly || !dir){return;}
1121
+ doChangeValue = typeModels[type].numberToString(getNextStep(elem, dir, {type: type}));
1122
+ $.prop(elem, 'value', doChangeValue);
1123
+ triggerInlineForm(elem, 'input');
1124
+ }
1125
+
1126
+ function setFocus(){
1127
+ blockBlurChange = true;
1128
+ setTimeout(function(){
1129
+ blockBlurChange = false;
1130
+ }, DELAY + 9);
1131
+ setTimeout(function(){
1132
+ if(!$(elem).is(':focus')){
1133
+ try{
1134
+ elem.focus();
1135
+ } catch(e){}
1136
+ }
1137
+ }, 1);
1138
+ }
1139
+
1140
+ function triggerChange(){
1141
+ var curValue = $.prop(elem, 'value');
1142
+ if(curValue == doChangeValue && curValue != blockChangeValue && typeof curValue == 'string'){
1143
+ triggerInlineForm(elem, 'change');
1144
+ }
1145
+ blockChangeValue = curValue;
1146
+ }
1147
+
1148
+ function init(){
1149
+ blockChangeValue = $(elem)
1150
+ .bind({
1151
+ 'change.stepcontrol focus.stepcontrol': function(e){
1152
+ if(!blockBlurChange || e.type != 'focus'){
1153
+ blockChangeValue = $.prop(elem, 'value');
1154
+ }
1155
+ },
1156
+ 'blur.stepcontrol': function(){
1157
+ if(!blockBlurChange){
1158
+ setTimeout(function(){
1159
+ if(!blockBlurChange && !$(elem).is(':focus')){
1160
+ triggerChange();
1161
+ }
1162
+ doChangeValue = false;
1163
+ }, DELAY);
1164
+ }
1165
+ }
1166
+ })
1167
+ .prop('value')
1168
+ ;
1169
+ }
1170
+
1171
+ init();
1172
+ return {
1173
+ triggerChange: triggerChange,
1174
+ step: step,
1175
+ setFocus: setFocus
1176
+ };
1177
+ };
1178
+
1179
+ webshims.addReady(function(context, contextElem){
1180
+ //ui for numeric values
1181
+ if(options.stepArrows){
1182
+ $('input', context).add(contextElem.filter('input')).each(function(){
1183
+ var type = $.prop(this, 'type');
1184
+ if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
1185
+ var elem = this;
1186
+ var uiEvents = changeInput(elem, type);
1187
+ var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
1188
+ .insertAfter(elem)
1189
+ .bind('selectstart dragstart', function(){return false;})
1190
+ .bind('mousedown mousepress', function(e){
1191
+ if(!$(e.target).hasClass('step-controls')){
1192
+ uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
1193
+ }
1194
+ uiEvents.setFocus();
1195
+ return false;
1196
+ })
1197
+ .bind('mousepressstart mousepressend', function(e){
1198
+ if(e.type == 'mousepressend'){
1199
+ uiEvents.triggerChange();
1200
+ }
1201
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1202
+ })
1203
+ ;
1204
+ var mwheelUpDown = function(e, d){
1205
+ if(d){
1206
+ uiEvents.step(d);
1207
+ return false;
1208
+ }
1209
+ };
1210
+
1211
+ var jElm = $(elem)
1212
+ .addClass('has-step-controls')
1213
+ .attr({
1214
+ readonly: elem.readOnly,
1215
+ disabled: elem.disabled,
1216
+ autocomplete: 'off',
1217
+ role: 'spinbutton'
1218
+ })
1219
+ .bind('keyup', function(e){
1220
+ var step = stepKeys[e.keyCode];
1221
+ if(step){
1222
+ uiEvents.triggerChange(step);
1223
+ }
1224
+ })
1225
+ .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1226
+ var step = stepKeys[e.keyCode];
1227
+ if(step){
1228
+ uiEvents.step(step);
1229
+ return false;
1230
+ }
1231
+ })
1232
+ ;
1233
+
1234
+ if(allowedChars[type]){
1235
+ jElm.bind('keypress', (function(){
1236
+ var chars = allowedChars[type];
1237
+ return function(event){
1238
+ var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
1239
+ return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
1240
+ };
1241
+ })());
1242
+ }
1243
+
1244
+ jElm
1245
+ .bind('focus', function(){
1246
+ jElm.add(controls).unbind('.mwhellwebshims')
1247
+ .bind('mousewheel.mwhellwebshims', mwheelUpDown)
1248
+ ;
1249
+ })
1250
+ .bind('blur', function(){
1251
+ $(elem).add(controls).unbind('.mwhellwebshims');
1252
+ })
1253
+ ;
1254
+
1255
+ webshims.data(elem, 'step-controls', controls);
1256
+ if(options.calculateWidth){
1257
+ var init;
1258
+ jElm
1259
+ .bind('updateshadowdom', function(){
1260
+ if(!init && (elem.offsetWidth || elem.offsetHeight)){
1261
+ init = true;
1262
+ adjustInputWithBtn(jElm, controls);
1263
+ controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
1264
+ }
1265
+ })
1266
+ .triggerHandler('updateshadowdom')
1267
+ ;
1268
+ }
1269
+ });
1270
+ }
1271
+ });
1272
+ })();
1273
+
1274
+
1275
+ webshims.addReady(function(context, elem){
1276
+ $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1277
+ if($.datepicker || $.fn.slider){
1278
+ if($.datepicker && !defaultDatepicker.dateFormat){
1279
+ defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
1280
+ }
1281
+ replaceInputUI(context, elem);
1282
+ }
1283
+ if($.datepicker && $.fn.slider){
1284
+ $(document).unbind('.initinputui');
1285
+ } else if(!webshims.modules["input-widgets"].src){
1286
+ webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
1287
+ }
1288
+ });
1289
+ });
1290
+
1291
+ });
1292
+