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
@@ -507,80 +507,80 @@ jQuery.webshims.register('form-extend', function($, webshims, window, doc, undef
507
507
  dateToString: function(date){
508
508
  return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
509
509
  }
510
+ },
511
+ time: {
512
+ mismatch: function(val, _getParsed){
513
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
514
+ val = val.split(/\u003A/);
515
+ if(val.length < 2 || val.length > 3){return true;}
516
+ var ret = false,
517
+ sFraction;
518
+ if(val[2]){
519
+ val[2] = val[2].split(/\u002E/);
520
+ sFraction = parseInt(val[2][1], 10);
521
+ val[2] = val[2][0];
522
+ }
523
+ $.each(val, function(i, part){
524
+ if(!isDateTimePart(part) || part.length !== 2){
525
+ ret = true;
526
+ return false;
527
+ }
528
+ });
529
+ if(ret){return true;}
530
+ if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
531
+ return true;
532
+ }
533
+ if(val[2] && (val[2] > 59 || val[2] < 0 )){
534
+ return true;
535
+ }
536
+ if(sFraction && isNaN(sFraction)){
537
+ return true;
538
+ }
539
+ if(sFraction){
540
+ if(sFraction < 100){
541
+ sFraction *= 100;
542
+ } else if(sFraction < 10){
543
+ sFraction *= 10;
544
+ }
545
+ }
546
+ return (_getParsed === true) ? [val, sFraction] : false;
547
+ },
548
+ step: 60,
549
+ stepBase: 0,
550
+ stepScaleFactor: 1000,
551
+ asDate: function(val){
552
+ val = new Date(this.asNumber(val));
553
+ return (isNaN(val)) ? null : val;
554
+ },
555
+ asNumber: function(val){
556
+ var ret = nan;
557
+ val = this.mismatch(val, true);
558
+ if(val !== true){
559
+ ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
560
+ if(val[1]){
561
+ ret += val[1];
562
+ }
563
+ }
564
+ return ret;
565
+ },
566
+ dateToString: function(date){
567
+ if(date && date.getUTCHours){
568
+ var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
569
+ tmp = date.getSeconds()
570
+ ;
571
+ if(tmp != "0"){
572
+ str += ':'+ addleadingZero(tmp, 2);
573
+ }
574
+ tmp = date.getUTCMilliseconds();
575
+ if(tmp != "0"){
576
+ str += '.'+ addleadingZero(tmp, 3);
577
+ }
578
+ return str;
579
+ } else {
580
+ return false;
581
+ }
582
+ }
510
583
  }
511
- // ,time: {
512
- // mismatch: function(val, _getParsed){
513
- // if(!val || !val.split || !(/\d$/.test(val))){return true;}
514
- // val = val.split(/\u003A/);
515
- // if(val.length < 2 || val.length > 3){return true;}
516
- // var ret = false,
517
- // sFraction;
518
- // if(val[2]){
519
- // val[2] = val[2].split(/\u002E/);
520
- // sFraction = parseInt(val[2][1], 10);
521
- // val[2] = val[2][0];
522
- // }
523
- // $.each(val, function(i, part){
524
- // if(!isDateTimePart(part) || part.length !== 2){
525
- // ret = true;
526
- // return false;
527
- // }
528
- // });
529
- // if(ret){return true;}
530
- // if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
531
- // return true;
532
- // }
533
- // if(val[2] && (val[2] > 59 || val[2] < 0 )){
534
- // return true;
535
- // }
536
- // if(sFraction && isNaN(sFraction)){
537
- // return true;
538
- // }
539
- // if(sFraction){
540
- // if(sFraction < 100){
541
- // sFraction *= 100;
542
- // } else if(sFraction < 10){
543
- // sFraction *= 10;
544
- // }
545
- // }
546
- // return (_getParsed === true) ? [val, sFraction] : false;
547
- // },
548
- // step: 60,
549
- // stepBase: 0,
550
- // stepScaleFactor: 1000,
551
- // asDate: function(val){
552
- // val = new Date(this.asNumber(val));
553
- // return (isNaN(val)) ? null : val;
554
- // },
555
- // asNumber: function(val){
556
- // var ret = nan;
557
- // val = this.mismatch(val, true);
558
- // if(val !== true){
559
- // ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
560
- // if(val[1]){
561
- // ret += val[1];
562
- // }
563
- // }
564
- // return ret;
565
- // },
566
- // dateToString: function(date){
567
- // if(date && date.getUTCHours){
568
- // var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
569
- // tmp = date.getSeconds()
570
- // ;
571
- // if(tmp != "0"){
572
- // str += ':'+ addleadingZero(tmp, 2);
573
- // }
574
- // tmp = date.getUTCMilliseconds();
575
- // if(tmp != "0"){
576
- // str += '.'+ addleadingZero(tmp, 3);
577
- // }
578
- // return str;
579
- // } else {
580
- // return false;
581
- // }
582
- // }
583
- // }
584
584
  // ,'datetime-local': {
585
585
  // mismatch: function(val, _getParsed){
586
586
  // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
@@ -614,7 +614,7 @@ jQuery.webshims.register('form-extend', function($, webshims, window, doc, undef
614
614
 
615
615
  if(typeBugs || !supportsType('range') || !supportsType('time')){
616
616
  typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
617
- // typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
617
+ typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
618
618
  // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
619
619
  }
620
620
 
@@ -628,858 +628,920 @@ jQuery.webshims.register('form-extend', function($, webshims, window, doc, undef
628
628
  if(typeBugs || !supportsType('date')){
629
629
  webshims.addInputType('date', typeProtos.date);
630
630
  }
631
- // if(typeBugs || !supportsType('time')){
632
- // webshims.addInputType('time', typeProtos.time);
633
- // }
631
+ if(typeBugs || !supportsType('time')){
632
+ webshims.addInputType('time', typeProtos.time);
633
+ }
634
634
 
635
635
  // if(typeBugs || !supportsType('datetime-local')){
636
636
  // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
637
637
  // }
638
638
 
639
- });/* number-date-ui */
640
- /* https://github.com/aFarkas/webshim/issues#issue/23 */
641
- jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
642
- "use strict";
643
-
644
- var triggerInlineForm = webshims.triggerInlineForm;
645
- var modernizrInputTypes = Modernizr.inputtypes;
646
- var adjustInputWithBtn = (function(){
647
- var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
648
- var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
649
- if($.browser.msie && webshims.browserVersion < 8){
650
- boxSizing = false;
651
- }
652
- var getWidth = function(input){
653
- var widthFn = "width";
654
- if(boxSizing){
655
- widthFn = fns[input.css(boxSizing)] || widthFn;
656
- }
657
-
658
- return {
659
- w: input[widthFn](),
660
- add: widthFn == "width"
661
- };
662
-
663
- };
664
-
665
-
666
- return function(input, button){
667
- var inputDim = getWidth(input);
668
- if(!inputDim.w){return;}
669
- var controlDim = {
670
- mL: (parseInt(button.css('marginLeft'), 10) || 0),
671
- w: button.outerWidth()
672
- };
673
- inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
674
- if(inputDim.mR){
675
- input.css('marginRight', 0);
676
- }
677
- //is inside
678
- if( controlDim.mL <= (controlDim.w * -1) ){
679
- button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
680
- input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
681
- if(inputDim.add){
682
- input.css('width', Math.floor(inputDim.w + controlDim.mL));
683
- }
684
- } else {
685
- button.css('marginRight', inputDim.mR);
686
- input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
687
- }
688
- };
689
- })();
690
-
691
-
692
- var defaultDatepicker = {};
693
- var labelID = 0;
694
- var emptyJ = $([]);
695
- var isCheckValidity;
696
- var replaceInputUI = function(context, elem){
697
- $('input', context).add(elem.filter('input')).each(function(){
698
- var type = $.prop(this, 'type');
699
- if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
700
- replaceInputUI[type]($(this));
701
- }
702
- });
703
- };
704
- //set date is extremly slow in IE so we do it lazy
705
- var lazySetDate = function(elem, date){
706
- if(!options.lazyDate){
707
- elem.datepicker('setDate', date);
708
- return;
709
- }
710
- var timer = $.data(elem[0], 'setDateLazyTimer');
711
- if(timer){
712
- clearTimeout(timer);
713
- }
714
- $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
715
- elem.datepicker('setDate', date);
716
- $.removeData(elem[0], 'setDateLazyTimer');
717
- elem = null;
718
- }, 0));
719
- };
720
-
721
-
722
- var copyAttrs = {
723
- tabindex: 1,
724
- tabIndex: 1,
725
- title: 1,
726
- "aria-required": 1,
727
- "aria-invalid": 1
728
- };
729
- if(!options.copyAttrs){
730
- options.copyAttrs = {};
731
- }
732
-
733
- webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
734
-
735
- var getDimensions = function(orig){
736
- return (options.calculateWidth) ?
737
- {
738
- css: {
739
- marginRight: orig.css('marginRight'),
740
- marginLeft: orig.css('marginLeft')
741
- },
742
- outerWidth: orig.outerWidth()
743
-
744
- } :
745
- {}
746
- ;
747
- };
748
- var focusAttrs = copyAttrs;
749
-
750
- replaceInputUI.common = function(orig, shim, methods){
751
- if(Modernizr.formvalidation){
752
- orig.bind('firstinvalid', function(e){
753
- if(!webshims.fromSubmit && isCheckValidity){return;}
754
- orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
755
- if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
756
- webshims.validityAlert.showFor( e.target );
757
- e.preventDefault();
758
- evt.preventDefault();
759
- }
760
- orig.unbind('invalid.replacedwidgetbubble');
761
- });
762
- });
763
- }
764
- var i, prop;
765
- var focusElement = $('input, span.ui-slider-handle', shim);
766
- var attrs = orig[0].attributes;
767
- for(i in options.copyAttrs){
768
- if ((prop = attrs[i]) && prop.specified) {
769
- if(focusAttrs[i] && focusElement[0]){
770
- focusElement.attr(i, prop.nodeValue);
771
- } else {
772
- shim[0].setAttribute(i, prop.nodeValue);
773
- }
774
- }
775
- }
776
-
777
- var id = orig.attr('id'),
778
- label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
779
- ;
780
-
781
-
782
-
783
- shim.addClass(orig[0].className);
784
- webshims.addShadowDom(orig, shim, {
785
- data: methods || {},
786
- shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
787
- shadowChilds: focusElement
788
- });
789
-
790
- orig.after(shim);
791
-
792
- if(orig[0].form){
793
- $(orig[0].form).bind('reset', function(e){
794
- if(e.originalEvent && !e.isDefaultPrevented()){
795
- setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
796
- }
797
- });
798
- }
799
-
800
- if(label[0]){
801
- shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
802
- label.bind('click', function(){
803
- orig.getShadowFocusElement().focus();
804
- return false;
805
- });
806
- }
807
- };
808
-
809
- if(Modernizr.formvalidation){
810
- ['input', 'form'].forEach(function(name){
811
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
812
- prop: {
813
- value: function(){
814
- isCheckValidity = true;
815
- var ret = desc.prop._supvalue.apply(this, arguments);
816
- isCheckValidity = false;
817
- return ret;
818
- }
819
- }
820
- });
821
- });
822
- }
823
- //date and datetime-local implement if we have to replace
824
- if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
825
-
826
- var datetimeFactor = {
827
- trigger: [0.595,0.395],
828
- normal: [0.565,0.425]
829
- };
830
- var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
831
-
832
- var configureDatePicker = function(elem, datePicker, change, _wrapper){
833
- var stopFocusout;
834
- var focusedOut;
835
- var resetFocusHandler = function(){
836
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
837
- stopFocusout = false;
838
- focusedOut = false;
839
- };
840
- var data = datePicker
841
- .bind('focusin', function(){
842
- resetFocusHandler();
843
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
844
- stopFocusout = true;
845
- });
846
- })
847
- .bind('focusout blur', function(e){
848
- if(stopFocusout){
849
- focusedOut = true;
850
- e.stopImmediatePropagation();
851
- }
852
- })
853
- .datepicker($.extend({
854
- onClose: function(){
855
- if(focusedOut && datePicker.not(':focus')){
856
- resetFocusHandler();
857
- datePicker.trigger('focusout');
858
- datePicker.triggerHandler('blur');
859
- } else {
860
- resetFocusHandler();
861
- }
862
- }
863
- }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
864
- .bind('change', change)
865
- .data('datepicker')
866
- ;
867
- data.dpDiv.addClass('input-date-datepicker-control');
868
-
869
- if(_wrapper){
870
- webshims.triggerDomUpdate(_wrapper[0]);
871
- }
872
- ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
873
- var fn = 'data-placeholder' ? 'attr' : 'prop';
874
- var val = elem[fn](name);
875
- if(val){
876
- elem[fn](name, val);
877
- }
878
- });
879
-
880
- return data;
881
- };
882
-
883
- // replaceInputUI['datetime-local'] = function(elem){
884
- // if(!$.fn.datepicker){return;}
885
- //
886
- // 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>'),
887
- // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
888
- // datePicker = $('input.input-datetime-local-date', date),
889
- // datePickerChange = function(e){
890
- //
891
- // var value = datePicker.prop('value') || '',
892
- // timeVal = ''
893
- // ;
894
- // if(options.lazyDate){
895
- // var timer = $.data(datePicker[0], 'setDateLazyTimer');
896
- // if(timer){
897
- // clearTimeout(timer);
898
- // $.removeData(datePicker[0], 'setDateLazyTimer');
899
- // }
900
- // }
901
- //
902
- // if(value){
903
- // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
904
- // try {
905
- // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
906
- // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
907
- // } catch (e) {value = datePicker.prop('value');}
908
- // }
909
- // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
910
- // replaceInputUI['datetime-local'].blockAttr = true;
911
- // elem.prop('value', value);
912
- // replaceInputUI['datetime-local'].blockAttr = false;
913
- // e.stopImmediatePropagation();
914
- // triggerInlineForm(elem[0], 'input');
915
- // triggerInlineForm(elem[0], 'change');
916
- // },
917
- // data = configureDatePicker(elem, datePicker, datePickerChange, date)
918
- // ;
919
- //
920
- //
921
- // $('input.input-datetime-local-time', date).bind('change', function(e){
922
- // var timeVal = $.prop(this, 'value');
923
- // var val = ['', ''];
924
- // if(timeVal){
925
- // val = elem.prop('value').split('T');
926
- // if((val.length < 2 || !val[0])){
927
- // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
928
- // }
929
- // val[1] = timeVal;
930
- //
931
- // if (timeVal) {
932
- // try {
933
- // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
934
- // } catch (e) {}
935
- // }
936
- // }
937
- // val = (!val[0] && !val[1]) ? '' : val.join('T');
938
- // replaceInputUI['datetime-local'].blockAttr = true;
939
- // elem.prop('value', val);
940
- // replaceInputUI['datetime-local'].blockAttr = false;
941
- // e.stopImmediatePropagation();
942
- // triggerInlineForm(elem[0], 'input');
943
- // triggerInlineForm(elem[0], 'change');
944
- // });
945
- //
946
- //
947
- //
948
- // date.attr('aria-labelledby', attr.label.attr('id'));
949
- // attr.label.bind('click', function(){
950
- // datePicker.focus();
951
- // return false;
952
- // });
953
- //
954
- // if(attr.css){
955
- // date.css(attr.css);
956
- // if(attr.outerWidth){
957
- // date.outerWidth(attr.outerWidth);
958
- // var width = date.width();
959
- // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
960
- // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
961
- // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
962
- // if(data.trigger[0]){
963
- // adjustInputWithBtn(datePicker, data.trigger);
964
- // }
965
- // }
966
- // }
967
- //
968
- //
969
- // };
970
- //
971
- // replaceInputUI['datetime-local'].attrs = {
972
- // disabled: function(orig, shim, value){
973
- // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
974
- // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
975
- // },
976
- // step: function(orig, shim, value){
977
- // $('input.input-datetime-local-time', shim).attr('step', value);
978
- // },
979
- // //ToDo: use min also on time
980
- // min: function(orig, shim, value){
981
- // if(value){
982
- // value = (value.split) ? value.split('T') : [];
983
- // try {
984
- // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
985
- // } catch(e){value = false;}
986
- // }
987
- // if(!value){
988
- // value = null;
989
- // }
990
- // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
991
- //
992
- // },
993
- // //ToDo: use max also on time
994
- // max: function(orig, shim, value){
995
- // if(value){
996
- // value = (value.split) ? value.split('T') : [];
997
- // try {
998
- // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
999
- // } catch(e){value = false;}
1000
- // }
1001
- // if(!value){
1002
- // value = null;
1003
- // }
1004
- // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
1005
- // },
1006
- // value: function(orig, shim, value){
1007
- // var dateValue;
1008
- // if(value){
1009
- // value = (value.split) ? value.split('T') : [];
1010
- // try {
1011
- // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
1012
- // } catch(e){dateValue = false;}
1013
- // }
1014
- // if(dateValue){
1015
- // if(!replaceInputUI['datetime-local'].blockAttr){
1016
- // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
1017
- // }
1018
- // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
1019
- // } else {
1020
- // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
1021
- // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
1022
- // }
1023
- //
1024
- //
1025
- // }
1026
- // };
1027
-
1028
-
1029
- replaceInputUI.date = function(elem){
1030
-
1031
- if(!$.fn.datepicker){return;}
1032
- var date = $('<input class="input-date" type="text" />'),
1033
-
1034
- change = function(e){
1035
-
1036
- replaceInputUI.date.blockAttr = true;
1037
- var value;
1038
- if(options.lazyDate){
1039
- var timer = $.data(date[0], 'setDateLazyTimer');
1040
- if(timer){
1041
- clearTimeout(timer);
1042
- $.removeData(date[0], 'setDateLazyTimer');
1043
- }
1044
- }
1045
- try {
1046
- value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
1047
- value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
1048
- } catch(e){
1049
- value = date.prop('value');
1050
- }
1051
- elem.prop('value', value);
1052
- replaceInputUI.date.blockAttr = false;
1053
- e.stopImmediatePropagation();
1054
- triggerInlineForm(elem[0], 'input');
1055
- triggerInlineForm(elem[0], 'change');
1056
- },
1057
- data
1058
-
1059
- ;
1060
-
1061
- this.common(elem, date, replaceInputUI.date.attrs);
1062
-
1063
- data = configureDatePicker(elem, date, change);
1064
-
1065
- $(elem)
1066
- .bind('updateshadowdom', function(){
1067
- if (data.trigger[0]) {
1068
- elem.css({display: ''});
1069
- if(elem[0].offsetWidth || elem[0].offsetHeight){
1070
- var attr = getDimensions(elem);
1071
- if (attr.css) {
1072
- date.css(attr.css);
1073
- if (attr.outerWidth) {
1074
- date.outerWidth(attr.outerWidth);
1075
- }
1076
- adjustInputWithBtn(date, data.trigger);
1077
- }
1078
- }
1079
- }
1080
- elem.css({display: 'none'});
1081
- })
1082
- .triggerHandler('updateshadowdom')
1083
- ;
1084
- if (data.trigger[0]) {
1085
- setTimeout(function(){
1086
- webshims.ready('WINDOWLOAD', function(){
1087
- $(elem).triggerHandler('updateshadowdom');
1088
- });
1089
- }, 9);
1090
- }
1091
-
1092
- };
1093
-
1094
-
1095
- replaceInputUI.date.attrs = {
1096
- disabled: function(orig, shim, value){
1097
- $.prop(shim, 'disabled', !!value);
1098
- },
1099
- min: function(orig, shim, value){
1100
- try {
1101
- value = $.datepicker.parseDate('yy-mm-dd', value);
1102
- } catch(e){value = false;}
1103
- if(value){
1104
- $(shim).datepicker('option', 'minDate', value);
1105
- }
1106
- },
1107
- max: function(orig, shim, value){
1108
- try {
1109
- value = $.datepicker.parseDate('yy-mm-dd', value);
1110
- } catch(e){value = false;}
1111
- if(value){
1112
- $(shim).datepicker('option', 'maxDate', value);
1113
- }
1114
- },
1115
- 'data-placeholder': function(orig, shim, value){
1116
- var hintValue = (value || '').split('-');
1117
- var dateFormat;
1118
- if(hintValue.length == 3){
1119
- value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
1120
- }
1121
- $.prop(shim, 'placeholder', value);
1122
- },
1123
- value: function(orig, shim, value){
1124
- if(!replaceInputUI.date.blockAttr){
1125
- try {
1126
- var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
1127
- } catch(e){var dateValue = false;}
1128
-
1129
- if(dateValue){
1130
- lazySetDate($(shim), dateValue);
1131
- } else {
1132
- $.prop(shim, 'value', value);
1133
- }
1134
- }
1135
- }
1136
- };
1137
- }
1138
- if (!modernizrInputTypes.range || options.replaceUI) {
1139
- replaceInputUI.range = function(elem){
1140
- if(!$.fn.slider){return;}
1141
- var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
1142
- change = function(e, ui){
1143
- if(e.originalEvent){
1144
- replaceInputUI.range.blockAttr = true;
1145
- elem.prop('value', ui.value);
1146
- replaceInputUI.range.blockAttr = false;
1147
- triggerInlineForm(elem[0], 'input');
1148
- triggerInlineForm(elem[0], 'change');
1149
- }
1150
- }
1151
- ;
1152
-
1153
- this.common(elem, range, replaceInputUI.range.attrs);
1154
-
1155
-
1156
- elem
1157
- .bind('updateshadowdom', function(){
1158
- elem.css({display: ''});
1159
- if (elem[0].offsetWidth || elem[0].offsetHeight) {
1160
- var attr = getDimensions(elem);
1161
- if (attr.css) {
1162
- range.css(attr.css);
1163
- if (attr.outerWidth) {
1164
- range.outerWidth(attr.outerWidth);
1165
- }
1166
- }
1167
- }
1168
- elem.css({display: 'none'});
1169
- })
1170
- .triggerHandler('updateshadowdom')
1171
- ;
1172
-
1173
-
1174
- range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change);
1175
-
1176
- ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
1177
- var val = elem.prop(name);
1178
- var shadow;
1179
- if(name == 'value' && !val){
1180
-
1181
- shadow = elem.getShadowElement();
1182
- if(shadow){
1183
- val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
1184
- }
1185
- }
1186
- if(val != null){
1187
- elem.prop(name, val);
1188
- }
1189
- });
1190
- };
1191
-
1192
- replaceInputUI.range.attrs = {
1193
- disabled: function(orig, shim, value){
1194
- value = !!value;
1195
- $(shim).slider( "option", "disabled", value );
1196
- $('span', shim)
1197
- .attr({
1198
- 'aria-disabled': value+'',
1199
- 'tabindex': (value) ? '-1' : '0'
1200
- })
1201
- ;
1202
- },
1203
- min: function(orig, shim, value){
1204
- value = (value) ? value * 1 || 0 : 0;
1205
- $(shim).slider( "option", "min", value );
1206
- $('span', shim).attr({'aria-valuemin': value});
1207
- },
1208
- max: function(orig, shim, value){
1209
- value = (value || value === 0) ? value * 1 || 100 : 100;
1210
- $(shim).slider( "option", "max", value );
1211
- $('span', shim).attr({'aria-valuemax': value});
1212
- },
1213
- value: function(orig, shim, value){
1214
- value = $(orig).prop('valueAsNumber');
1215
- if(!isNaN(value)){
1216
- if(!replaceInputUI.range.blockAttr){
1217
- $(shim).slider( "option", "value", value );
1218
- }
1219
- $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
1220
- }
1221
- },
1222
- step: function(orig, shim, value){
1223
- value = (value && $.trim(value)) ? value * 1 || 1 : 1;
1224
- $(shim).slider( "option", "step", value );
1225
- }
1226
- };
1227
- }
1228
-
1229
- if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
1230
- var reflectFn = function(val){
1231
- if(webshims.data(this, 'hasShadow')){
1232
- $.prop(this, 'value', $.prop(this, 'value'));
1233
- }
1234
- };
1235
-
1236
- webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
1237
- webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
1238
- }
1239
-
1240
- $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
1241
- webshims.onNodeNamesPropertyModify('input', attr, function(val){
1242
- var shadowData = webshims.data(this, 'shadowData');
1243
- if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
1244
- shadowData.data[attr](this, shadowData.shadowElement, val);
1245
- }
1246
- }
1247
- );
1248
- });
1249
- if(!options.availabeLangs){
1250
- 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(' ');
1251
- }
1252
-
1253
- var getDefaults = function(){
1254
- if(!$.datepicker){return;}
1255
-
1256
- webshims.activeLang({
1257
- langObj: $.datepicker.regional,
1258
- module: 'form-number-date-ui',
1259
- callback: function(langObj){
1260
- var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1261
-
1262
-
1263
- if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1264
- $('input.hasDatepicker')
1265
- .filter('.input-date, .input-datetime-local-date')
1266
- .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1267
- .getNativeElement()
1268
- .filter('[data-placeholder]')
1269
- .attr('data-placeholder', function(i, val){
1270
- return val;
1271
- })
1272
- ;
1273
- }
1274
- $.datepicker.setDefaults(datepickerCFG);
1275
- }
1276
- });
1277
- $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1278
- };
1279
-
1280
- $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1281
- getDefaults();
1282
-
1283
- //implement set/arrow controls
1284
- (function(){
1285
- var supportsType = (function(){
1286
- var types = {};
1287
- return function(type){
1288
- if(type in types){
1289
- return types[type];
1290
- }
1291
- return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1292
- };
1293
- })();
1294
-
1295
- if(supportsType('number')/* && supportsType('time')*/){return;}
1296
- var doc = document;
1297
- var options = webshims.cfg["forms-ext"];
1298
- var typeModels = webshims.inputTypes;
1299
-
1300
- var getNextStep = function(input, upDown, cache){
1301
-
1302
- cache = cache || {};
1303
-
1304
- if( !('type' in cache) ){
1305
- cache.type = $.prop(input, 'type');
1306
- }
1307
- if( !('step' in cache) ){
1308
- cache.step = webshims.getStep(input, cache.type);
1309
- }
1310
- if( !('valueAsNumber' in cache) ){
1311
- cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1312
- }
1313
- var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1314
- ret
1315
- ;
1316
- webshims.addMinMaxNumberToCache('min', $(input), cache);
1317
- webshims.addMinMaxNumberToCache('max', $(input), cache);
1318
-
1319
- if(isNaN(cache.valueAsNumber)){
1320
- cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1321
- }
1322
- //make a valid step
1323
- if(cache.step !== 'any'){
1324
- ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
1325
- if(ret && Math.abs(ret) != cache.step){
1326
- cache.valueAsNumber = cache.valueAsNumber - ret;
1327
- }
1328
- }
1329
- ret = cache.valueAsNumber + (delta * upDown);
1330
- //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
1331
- if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
1332
- ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
1333
- } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
1334
- ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
1335
- } else {
1336
- ret = Math.round( ret * 1e7) / 1e7;
1337
- }
1338
- return ret;
1339
- };
1340
-
1341
- webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
1342
-
1343
- var doSteps = function(input, type, control){
1344
- if(input.disabled || input.readOnly || $(control).hasClass('step-controls')){return;}
1345
- $.prop(input, 'value', typeModels[type].numberToString(getNextStep(input, ($(control).hasClass('step-up')) ? 1 : -1, {type: type})));
1346
- $(input).unbind('blur.stepeventshim');
1347
- triggerInlineForm(input, 'input');
1348
-
1349
-
1350
- if( doc.activeElement ){
1351
- if(doc.activeElement !== input){
1352
- try {input.focus();} catch(e){}
1353
- }
1354
- setTimeout(function(){
1355
- if(doc.activeElement !== input){
1356
- try {input.focus();} catch(e){}
1357
- }
1358
- $(input)
1359
- .one('blur.stepeventshim', function(){
1360
- triggerInlineForm(input, 'change');
1361
- })
1362
- ;
1363
- }, 0);
1364
-
1365
- }
1366
- };
1367
-
1368
-
1369
- if(options.stepArrows){
1370
- var stepDisableEnable = {
1371
- // don't change getter
1372
- set: function(value){
1373
- var stepcontrols = webshims.data(this, 'step-controls');
1374
- if(stepcontrols){
1375
- stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
1376
- }
1377
- }
1378
- };
1379
- webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
1380
- webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
1381
- }
1382
- var stepKeys = {
1383
- 38: 1,
1384
- 40: -1
1385
- };
1386
- webshims.addReady(function(context, contextElem){
1387
- //ui for numeric values
1388
- if(options.stepArrows){
1389
- $('input', context).add(contextElem.filter('input')).each(function(){
1390
- var type = $.prop(this, 'type');
1391
- if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
1392
- var elem = this;
1393
- var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
1394
- .insertAfter(elem)
1395
- .bind('selectstart dragstart', function(){return false;})
1396
- .bind('mousedown mousepress', function(e){
1397
- doSteps(elem, type, e.target);
1398
- return false;
1399
- })
1400
- .bind('mousepressstart mousepressend', function(e){
1401
- $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1402
- })
1403
- ;
1404
- var mwheelUpDown = function(e, d){
1405
- if(elem.disabled || elem.readOnly || !d){return;}
1406
- $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, d, {type: type})));
1407
- triggerInlineForm(elem, 'input');
1408
- return false;
1409
- };
1410
- var jElm = $(elem)
1411
- .addClass('has-step-controls')
1412
- .attr({
1413
- readonly: elem.readOnly,
1414
- disabled: elem.disabled,
1415
- autocomplete: 'off',
1416
- role: 'spinbutton'
1417
- })
1418
- .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1419
- if(elem.disabled || elem.readOnly || !stepKeys[e.keyCode]){return;}
1420
- $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, stepKeys[e.keyCode], {type: type})));
1421
- triggerInlineForm(elem, 'input');
1422
- return false;
1423
- })
1424
- ;
1425
- if(type == 'number'){
1426
- jElm.bind('keypress', (function(){
1427
- var chars = '0123456789.';
1428
- return function(event){
1429
- var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
1430
- return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
1431
- };
1432
- })());
1433
- }
1434
- if($.fn.mwheelIntent){
1435
- jElm.add(controls).bind('mwheelIntent', mwheelUpDown);
1436
- } else if($.fn.mousewheel) {
1437
- jElm
1438
- .bind('focus', function(){
1439
- jElm.add(controls).unbind('.mwhellwebshims')
1440
- .bind('mousewheel.mwhellwebshims', mwheelUpDown)
1441
- ;
1442
- })
1443
- .bind('blur', function(){
1444
- $(elem).add(controls).unbind('.mwhellwebshims');
1445
- })
1446
- ;
1447
- }
1448
- webshims.data(elem, 'step-controls', controls);
1449
- if(options.calculateWidth){
1450
- var init;
1451
- jElm
1452
- .bind('updateshadowdom', function(){
1453
- if(!init && (elem.offsetWidth || elem.offsetHeight)){
1454
- init = true;
1455
- adjustInputWithBtn(jElm, controls);
1456
- controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
1457
- }
1458
- })
1459
- .triggerHandler('updateshadowdom')
1460
- ;
1461
- }
1462
- });
1463
- }
1464
- });
1465
- })();
1466
-
1467
-
1468
- webshims.addReady(function(context, elem){
1469
- $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1470
- if($.datepicker || $.fn.slider){
1471
- if($.datepicker && !defaultDatepicker.dateFormat){
1472
- defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
1473
- }
1474
- replaceInputUI(context, elem);
1475
- }
1476
- if($.datepicker && $.fn.slider){
1477
- $(document).unbind('.initinputui');
1478
- } else if(!webshims.modules["input-widgets"].src){
1479
- webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
1480
- }
1481
- });
1482
- });
1483
-
1484
- });
1485
-
639
+ });/* number-date-ui */
640
+ /* https://github.com/aFarkas/webshim/issues#issue/23 */
641
+ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
642
+ "use strict";
643
+
644
+ var triggerInlineForm = webshims.triggerInlineForm;
645
+ var modernizrInputTypes = Modernizr.inputtypes;
646
+ var adjustInputWithBtn = (function(){
647
+ var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
648
+ var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
649
+ if($.browser.msie && webshims.browserVersion < 8){
650
+ boxSizing = false;
651
+ }
652
+ var getWidth = function(input){
653
+ var widthFn = "width";
654
+ if(boxSizing){
655
+ widthFn = fns[input.css(boxSizing)] || widthFn;
656
+ }
657
+
658
+ return {
659
+ w: input[widthFn](),
660
+ add: widthFn == "width"
661
+ };
662
+
663
+ };
664
+
665
+
666
+ return function(input, button){
667
+ var inputDim = getWidth(input);
668
+ if(!inputDim.w){return;}
669
+ var controlDim = {
670
+ mL: (parseInt(button.css('marginLeft'), 10) || 0),
671
+ w: button.outerWidth()
672
+ };
673
+ inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
674
+ if(inputDim.mR){
675
+ input.css('marginRight', 0);
676
+ }
677
+ //is inside
678
+ if( controlDim.mL <= (controlDim.w * -1) ){
679
+ button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
680
+ input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
681
+ if(inputDim.add){
682
+ input.css('width', Math.floor(inputDim.w + controlDim.mL));
683
+ }
684
+ } else {
685
+ button.css('marginRight', inputDim.mR);
686
+ input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
687
+ }
688
+ };
689
+ })();
690
+
691
+
692
+ var defaultDatepicker = {};
693
+ var labelID = 0;
694
+ var emptyJ = $([]);
695
+ var isCheckValidity;
696
+ var replaceInputUI = function(context, elem){
697
+ $('input', context).add(elem.filter('input')).each(function(){
698
+ var type = $.prop(this, 'type');
699
+ if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
700
+ replaceInputUI[type]($(this));
701
+ }
702
+ });
703
+ };
704
+ //set date is extremly slow in IE so we do it lazy
705
+ var lazySetDate = function(elem, date){
706
+ if(!options.lazyDate){
707
+ elem.datepicker('setDate', date);
708
+ return;
709
+ }
710
+ var timer = $.data(elem[0], 'setDateLazyTimer');
711
+ if(timer){
712
+ clearTimeout(timer);
713
+ }
714
+ $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
715
+ elem.datepicker('setDate', date);
716
+ $.removeData(elem[0], 'setDateLazyTimer');
717
+ elem = null;
718
+ }, 0));
719
+ };
720
+
721
+
722
+ var copyAttrs = {
723
+ tabindex: 1,
724
+ tabIndex: 1,
725
+ title: 1,
726
+ "aria-required": 1,
727
+ "aria-invalid": 1
728
+ };
729
+ if(!options.copyAttrs){
730
+ options.copyAttrs = {};
731
+ }
732
+
733
+ webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
734
+
735
+ var getDimensions = function(orig){
736
+ return (options.calculateWidth) ?
737
+ {
738
+ css: {
739
+ marginRight: orig.css('marginRight'),
740
+ marginLeft: orig.css('marginLeft')
741
+ },
742
+ outerWidth: orig.outerWidth()
743
+
744
+ } :
745
+ {}
746
+ ;
747
+ };
748
+ var focusAttrs = copyAttrs;
749
+
750
+ replaceInputUI.common = function(orig, shim, methods){
751
+ if(Modernizr.formvalidation){
752
+ orig.bind('firstinvalid', function(e){
753
+ if(!webshims.fromSubmit && isCheckValidity){return;}
754
+ orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
755
+ if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
756
+ webshims.validityAlert.showFor( e.target );
757
+ e.preventDefault();
758
+ evt.preventDefault();
759
+ }
760
+ orig.unbind('invalid.replacedwidgetbubble');
761
+ });
762
+ });
763
+ }
764
+ var i, prop;
765
+ var focusElement = $('input, span.ui-slider-handle', shim);
766
+ var attrs = orig[0].attributes;
767
+ for(i in options.copyAttrs){
768
+ if ((prop = attrs[i]) && prop.specified) {
769
+ if(focusAttrs[i] && focusElement[0]){
770
+ focusElement.attr(i, prop.nodeValue);
771
+ } else {
772
+ shim[0].setAttribute(i, prop.nodeValue);
773
+ }
774
+ }
775
+ }
776
+
777
+ var id = orig.attr('id'),
778
+ label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
779
+ ;
780
+
781
+
782
+
783
+ shim.addClass(orig[0].className);
784
+ webshims.addShadowDom(orig, shim, {
785
+ data: methods || {},
786
+ shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
787
+ shadowChilds: focusElement
788
+ });
789
+
790
+ orig.after(shim);
791
+
792
+ if(orig[0].form){
793
+ $(orig[0].form).bind('reset', function(e){
794
+ if(e.originalEvent && !e.isDefaultPrevented()){
795
+ setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
796
+ }
797
+ });
798
+ }
799
+
800
+ if(label[0]){
801
+ shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
802
+ label.bind('click', function(){
803
+ orig.getShadowFocusElement().focus();
804
+ return false;
805
+ });
806
+ }
807
+ };
808
+
809
+ if(Modernizr.formvalidation){
810
+ ['input', 'form'].forEach(function(name){
811
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
812
+ prop: {
813
+ value: function(){
814
+ isCheckValidity = true;
815
+ var ret = desc.prop._supvalue.apply(this, arguments);
816
+ isCheckValidity = false;
817
+ return ret;
818
+ }
819
+ }
820
+ });
821
+ });
822
+ }
823
+ //date and datetime-local implement if we have to replace
824
+ if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
825
+
826
+ var datetimeFactor = {
827
+ trigger: [0.595,0.395],
828
+ normal: [0.565,0.425]
829
+ };
830
+ var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
831
+
832
+ var configureDatePicker = function(elem, datePicker, change, _wrapper){
833
+ var stopFocusout;
834
+ var focusedOut;
835
+ var resetFocusHandler = function(){
836
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
837
+ stopFocusout = false;
838
+ focusedOut = false;
839
+ };
840
+ var data = datePicker
841
+ .bind('focusin', function(){
842
+ resetFocusHandler();
843
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
844
+ stopFocusout = true;
845
+ });
846
+ })
847
+ .bind('focusout blur', function(e){
848
+ if(stopFocusout){
849
+ focusedOut = true;
850
+ e.stopImmediatePropagation();
851
+ }
852
+ })
853
+ .datepicker($.extend({
854
+ onClose: function(){
855
+ if(focusedOut && datePicker.not(':focus')){
856
+ resetFocusHandler();
857
+ datePicker.trigger('focusout');
858
+ datePicker.triggerHandler('blur');
859
+ } else {
860
+ resetFocusHandler();
861
+ }
862
+ }
863
+ }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
864
+ .bind('change', change)
865
+ .data('datepicker')
866
+ ;
867
+ data.dpDiv.addClass('input-date-datepicker-control');
868
+
869
+ if(_wrapper){
870
+ webshims.triggerDomUpdate(_wrapper[0]);
871
+ }
872
+ ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
873
+ var fn = 'data-placeholder' ? 'attr' : 'prop';
874
+ var val = elem[fn](name);
875
+ if(val){
876
+ elem[fn](name, val);
877
+ }
878
+ });
879
+
880
+ return data;
881
+ };
882
+
883
+ // replaceInputUI['datetime-local'] = function(elem){
884
+ // if(!$.fn.datepicker){return;}
885
+ //
886
+ // 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>'),
887
+ // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
888
+ // datePicker = $('input.input-datetime-local-date', date),
889
+ // datePickerChange = function(e){
890
+ //
891
+ // var value = datePicker.prop('value') || '',
892
+ // timeVal = ''
893
+ // ;
894
+ // if(options.lazyDate){
895
+ // var timer = $.data(datePicker[0], 'setDateLazyTimer');
896
+ // if(timer){
897
+ // clearTimeout(timer);
898
+ // $.removeData(datePicker[0], 'setDateLazyTimer');
899
+ // }
900
+ // }
901
+ //
902
+ // if(value){
903
+ // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
904
+ // try {
905
+ // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
906
+ // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
907
+ // } catch (e) {value = datePicker.prop('value');}
908
+ // }
909
+ // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
910
+ // replaceInputUI['datetime-local'].blockAttr = true;
911
+ // elem.prop('value', value);
912
+ // replaceInputUI['datetime-local'].blockAttr = false;
913
+ // e.stopImmediatePropagation();
914
+ // triggerInlineForm(elem[0], 'input');
915
+ // triggerInlineForm(elem[0], 'change');
916
+ // },
917
+ // data = configureDatePicker(elem, datePicker, datePickerChange, date)
918
+ // ;
919
+ //
920
+ //
921
+ // $('input.input-datetime-local-time', date).bind('change', function(e){
922
+ // var timeVal = $.prop(this, 'value');
923
+ // var val = ['', ''];
924
+ // if(timeVal){
925
+ // val = elem.prop('value').split('T');
926
+ // if((val.length < 2 || !val[0])){
927
+ // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
928
+ // }
929
+ // val[1] = timeVal;
930
+ //
931
+ // if (timeVal) {
932
+ // try {
933
+ // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
934
+ // } catch (e) {}
935
+ // }
936
+ // }
937
+ // val = (!val[0] && !val[1]) ? '' : val.join('T');
938
+ // replaceInputUI['datetime-local'].blockAttr = true;
939
+ // elem.prop('value', val);
940
+ // replaceInputUI['datetime-local'].blockAttr = false;
941
+ // e.stopImmediatePropagation();
942
+ // triggerInlineForm(elem[0], 'input');
943
+ // triggerInlineForm(elem[0], 'change');
944
+ // });
945
+ //
946
+ //
947
+ //
948
+ // date.attr('aria-labelledby', attr.label.attr('id'));
949
+ // attr.label.bind('click', function(){
950
+ // datePicker.focus();
951
+ // return false;
952
+ // });
953
+ //
954
+ // if(attr.css){
955
+ // date.css(attr.css);
956
+ // if(attr.outerWidth){
957
+ // date.outerWidth(attr.outerWidth);
958
+ // var width = date.width();
959
+ // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
960
+ // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
961
+ // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
962
+ // if(data.trigger[0]){
963
+ // adjustInputWithBtn(datePicker, data.trigger);
964
+ // }
965
+ // }
966
+ // }
967
+ //
968
+ //
969
+ // };
970
+ //
971
+ // replaceInputUI['datetime-local'].attrs = {
972
+ // disabled: function(orig, shim, value){
973
+ // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
974
+ // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
975
+ // },
976
+ // step: function(orig, shim, value){
977
+ // $('input.input-datetime-local-time', shim).attr('step', value);
978
+ // },
979
+ // //ToDo: use min also on time
980
+ // min: function(orig, shim, value){
981
+ // if(value){
982
+ // value = (value.split) ? value.split('T') : [];
983
+ // try {
984
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
985
+ // } catch(e){value = false;}
986
+ // }
987
+ // if(!value){
988
+ // value = null;
989
+ // }
990
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
991
+ //
992
+ // },
993
+ // //ToDo: use max also on time
994
+ // max: function(orig, shim, value){
995
+ // if(value){
996
+ // value = (value.split) ? value.split('T') : [];
997
+ // try {
998
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
999
+ // } catch(e){value = false;}
1000
+ // }
1001
+ // if(!value){
1002
+ // value = null;
1003
+ // }
1004
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
1005
+ // },
1006
+ // value: function(orig, shim, value){
1007
+ // var dateValue;
1008
+ // if(value){
1009
+ // value = (value.split) ? value.split('T') : [];
1010
+ // try {
1011
+ // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
1012
+ // } catch(e){dateValue = false;}
1013
+ // }
1014
+ // if(dateValue){
1015
+ // if(!replaceInputUI['datetime-local'].blockAttr){
1016
+ // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
1017
+ // }
1018
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
1019
+ // } else {
1020
+ // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
1021
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
1022
+ // }
1023
+ //
1024
+ //
1025
+ // }
1026
+ // };
1027
+
1028
+
1029
+ replaceInputUI.date = function(elem){
1030
+
1031
+ if(!$.fn.datepicker){return;}
1032
+ var date = $('<input class="input-date" type="text" />'),
1033
+
1034
+ change = function(e){
1035
+
1036
+ replaceInputUI.date.blockAttr = true;
1037
+ var value;
1038
+ if(options.lazyDate){
1039
+ var timer = $.data(date[0], 'setDateLazyTimer');
1040
+ if(timer){
1041
+ clearTimeout(timer);
1042
+ $.removeData(date[0], 'setDateLazyTimer');
1043
+ }
1044
+ }
1045
+ try {
1046
+ value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
1047
+ value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
1048
+ } catch(e){
1049
+ value = date.prop('value');
1050
+ }
1051
+ elem.prop('value', value);
1052
+ replaceInputUI.date.blockAttr = false;
1053
+ e.stopImmediatePropagation();
1054
+ triggerInlineForm(elem[0], 'input');
1055
+ triggerInlineForm(elem[0], 'change');
1056
+ },
1057
+ data
1058
+
1059
+ ;
1060
+
1061
+ this.common(elem, date, replaceInputUI.date.attrs);
1062
+
1063
+ data = configureDatePicker(elem, date, change);
1064
+
1065
+ $(elem)
1066
+ .bind('updateshadowdom', function(){
1067
+ if (data.trigger[0]) {
1068
+ elem.css({display: ''});
1069
+ if(elem[0].offsetWidth || elem[0].offsetHeight){
1070
+ var attr = getDimensions(elem);
1071
+ if (attr.css) {
1072
+ date.css(attr.css);
1073
+ if (attr.outerWidth) {
1074
+ date.outerWidth(attr.outerWidth);
1075
+ }
1076
+ adjustInputWithBtn(date, data.trigger);
1077
+ }
1078
+ }
1079
+ }
1080
+ elem.css({display: 'none'});
1081
+ })
1082
+ .triggerHandler('updateshadowdom')
1083
+ ;
1084
+ if (data.trigger[0]) {
1085
+ setTimeout(function(){
1086
+ webshims.ready('WINDOWLOAD', function(){
1087
+ $(elem).triggerHandler('updateshadowdom');
1088
+ });
1089
+ }, 9);
1090
+ }
1091
+
1092
+ };
1093
+
1094
+
1095
+ replaceInputUI.date.attrs = {
1096
+ disabled: function(orig, shim, value){
1097
+ $.prop(shim, 'disabled', !!value);
1098
+ },
1099
+ min: function(orig, shim, value){
1100
+ try {
1101
+ value = $.datepicker.parseDate('yy-mm-dd', value);
1102
+ } catch(e){value = false;}
1103
+ if(value){
1104
+ $(shim).datepicker('option', 'minDate', value);
1105
+ }
1106
+ },
1107
+ max: function(orig, shim, value){
1108
+ try {
1109
+ value = $.datepicker.parseDate('yy-mm-dd', value);
1110
+ } catch(e){value = false;}
1111
+ if(value){
1112
+ $(shim).datepicker('option', 'maxDate', value);
1113
+ }
1114
+ },
1115
+ 'data-placeholder': function(orig, shim, value){
1116
+ var hintValue = (value || '').split('-');
1117
+ var dateFormat;
1118
+ if(hintValue.length == 3){
1119
+ value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
1120
+ }
1121
+ $.prop(shim, 'placeholder', value);
1122
+ },
1123
+ value: function(orig, shim, value){
1124
+ if(!replaceInputUI.date.blockAttr){
1125
+ try {
1126
+ var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
1127
+ } catch(e){var dateValue = false;}
1128
+
1129
+ if(dateValue){
1130
+ lazySetDate($(shim), dateValue);
1131
+ } else {
1132
+ $.prop(shim, 'value', value);
1133
+ }
1134
+ }
1135
+ }
1136
+ };
1137
+ }
1138
+ if (!modernizrInputTypes.range || options.replaceUI) {
1139
+ replaceInputUI.range = function(elem){
1140
+ if(!$.fn.slider){return;}
1141
+ var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
1142
+ change = function(e, ui){
1143
+ if(e.originalEvent){
1144
+ replaceInputUI.range.blockAttr = true;
1145
+ elem.prop('value', ui.value);
1146
+ replaceInputUI.range.blockAttr = false;
1147
+ triggerInlineForm(elem[0], 'input');
1148
+ }
1149
+ }
1150
+ ;
1151
+
1152
+ this.common(elem, range, replaceInputUI.range.attrs);
1153
+
1154
+
1155
+ elem
1156
+ .bind('updateshadowdom', function(){
1157
+ elem.css({display: ''});
1158
+ if (elem[0].offsetWidth || elem[0].offsetHeight) {
1159
+ var attr = getDimensions(elem);
1160
+ if (attr.css) {
1161
+ range.css(attr.css);
1162
+ if (attr.outerWidth) {
1163
+ range.outerWidth(attr.outerWidth);
1164
+ }
1165
+ }
1166
+ }
1167
+ elem.css({display: 'none'});
1168
+ })
1169
+ .triggerHandler('updateshadowdom')
1170
+ ;
1171
+
1172
+
1173
+ range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change).bind('slidechange', function(e){
1174
+ if(e.originalEvent){
1175
+ triggerInlineForm(elem[0], 'change');
1176
+ }
1177
+ });
1178
+
1179
+ ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
1180
+ var val = elem.prop(name);
1181
+ var shadow;
1182
+ if(name == 'value' && !val){
1183
+
1184
+ shadow = elem.getShadowElement();
1185
+ if(shadow){
1186
+ val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
1187
+ }
1188
+ }
1189
+ if(val != null){
1190
+ elem.prop(name, val);
1191
+ }
1192
+ });
1193
+ };
1194
+
1195
+ replaceInputUI.range.attrs = {
1196
+ disabled: function(orig, shim, value){
1197
+ value = !!value;
1198
+ $(shim).slider( "option", "disabled", value );
1199
+ $('span', shim)
1200
+ .attr({
1201
+ 'aria-disabled': value+'',
1202
+ 'tabindex': (value) ? '-1' : '0'
1203
+ })
1204
+ ;
1205
+ },
1206
+ min: function(orig, shim, value){
1207
+ value = (value) ? value * 1 || 0 : 0;
1208
+ $(shim).slider( "option", "min", value );
1209
+ $('span', shim).attr({'aria-valuemin': value});
1210
+ },
1211
+ max: function(orig, shim, value){
1212
+ value = (value || value === 0) ? value * 1 || 100 : 100;
1213
+ $(shim).slider( "option", "max", value );
1214
+ $('span', shim).attr({'aria-valuemax': value});
1215
+ },
1216
+ value: function(orig, shim, value){
1217
+ value = $(orig).prop('valueAsNumber');
1218
+ if(!isNaN(value)){
1219
+ if(!replaceInputUI.range.blockAttr){
1220
+ $(shim).slider( "option", "value", value );
1221
+ }
1222
+ $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
1223
+ }
1224
+ },
1225
+ step: function(orig, shim, value){
1226
+ value = (value && $.trim(value)) ? value * 1 || 1 : 1;
1227
+ $(shim).slider( "option", "step", value );
1228
+ }
1229
+ };
1230
+ }
1231
+
1232
+ if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
1233
+ var reflectFn = function(val){
1234
+ if(webshims.data(this, 'hasShadow')){
1235
+ $.prop(this, 'value', $.prop(this, 'value'));
1236
+ }
1237
+ };
1238
+
1239
+ webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
1240
+ webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
1241
+ }
1242
+
1243
+ $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
1244
+ webshims.onNodeNamesPropertyModify('input', attr, function(val){
1245
+ var shadowData = webshims.data(this, 'shadowData');
1246
+ if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
1247
+ shadowData.data[attr](this, shadowData.shadowElement, val);
1248
+ }
1249
+ }
1250
+ );
1251
+ });
1252
+ if(!options.availabeLangs){
1253
+ 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(' ');
1254
+ }
1255
+
1256
+ var getDefaults = function(){
1257
+ if(!$.datepicker){return;}
1258
+
1259
+ webshims.activeLang({
1260
+ langObj: $.datepicker.regional,
1261
+ module: 'form-number-date-ui',
1262
+ callback: function(langObj){
1263
+ var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1264
+
1265
+
1266
+ if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1267
+ $('input.hasDatepicker')
1268
+ .filter('.input-date, .input-datetime-local-date')
1269
+ .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1270
+ .getNativeElement()
1271
+ .filter('[data-placeholder]')
1272
+ .attr('data-placeholder', function(i, val){
1273
+ return val;
1274
+ })
1275
+ ;
1276
+ }
1277
+ $.datepicker.setDefaults(datepickerCFG);
1278
+ }
1279
+ });
1280
+ $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1281
+ };
1282
+
1283
+ $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1284
+ getDefaults();
1285
+
1286
+ //implement set/arrow controls
1287
+ (function(){
1288
+ var supportsType = (function(){
1289
+ var types = {};
1290
+ return function(type){
1291
+ if(type in types){
1292
+ return types[type];
1293
+ }
1294
+ return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1295
+ };
1296
+ })();
1297
+
1298
+ if(supportsType('number') && supportsType('time')){return;}
1299
+ var doc = document;
1300
+ var options = webshims.cfg["forms-ext"];
1301
+ var typeModels = webshims.inputTypes;
1302
+ var allowedChars = {
1303
+ number: '0123456789.',
1304
+ time: '0123456789:.'
1305
+ };
1306
+
1307
+ var getNextStep = function(input, upDown, cache){
1308
+
1309
+ cache = cache || {};
1310
+
1311
+ if( !('type' in cache) ){
1312
+ cache.type = $.prop(input, 'type');
1313
+ }
1314
+ if( !('step' in cache) ){
1315
+ cache.step = webshims.getStep(input, cache.type);
1316
+ }
1317
+ if( !('valueAsNumber' in cache) ){
1318
+ cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1319
+ }
1320
+ var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1321
+ ret
1322
+ ;
1323
+ webshims.addMinMaxNumberToCache('min', $(input), cache);
1324
+ webshims.addMinMaxNumberToCache('max', $(input), cache);
1325
+
1326
+ if(isNaN(cache.valueAsNumber)){
1327
+ cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1328
+ }
1329
+ //make a valid step
1330
+ if(cache.step !== 'any'){
1331
+ ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
1332
+ if(ret && Math.abs(ret) != cache.step){
1333
+ cache.valueAsNumber = cache.valueAsNumber - ret;
1334
+ }
1335
+ }
1336
+ ret = cache.valueAsNumber + (delta * upDown);
1337
+ //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
1338
+ if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
1339
+ ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
1340
+ } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
1341
+ ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
1342
+ } else {
1343
+ ret = Math.round( ret * 1e7) / 1e7;
1344
+ }
1345
+ return ret;
1346
+ };
1347
+
1348
+ webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
1349
+
1350
+
1351
+ if(options.stepArrows){
1352
+ var stepDisableEnable = {
1353
+ // don't change getter
1354
+ set: function(value){
1355
+ var stepcontrols = webshims.data(this, 'step-controls');
1356
+ if(stepcontrols){
1357
+ stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
1358
+ }
1359
+ }
1360
+ };
1361
+ webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
1362
+ webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
1363
+ }
1364
+ var stepKeys = {
1365
+ 38: 1,
1366
+ 40: -1
1367
+ };
1368
+
1369
+ var changeInput = function(elem, type){
1370
+ var blockBlurChange = false;
1371
+ var DELAY = 9;
1372
+ var doChangeValue, blockChangeValue;
1373
+
1374
+ function step(dir){
1375
+ if($.prop(elem, 'disabled') || elem.readOnly || !dir){return;}
1376
+ doChangeValue = typeModels[type].numberToString(getNextStep(elem, dir, {type: type}));
1377
+ $.prop(elem, 'value', doChangeValue);
1378
+ triggerInlineForm(elem, 'input');
1379
+ }
1380
+
1381
+ function setFocus(){
1382
+ blockBlurChange = true;
1383
+ setTimeout(function(){
1384
+ blockBlurChange = false;
1385
+ }, DELAY + 9);
1386
+ setTimeout(function(){
1387
+ if(!$(elem).is(':focus')){
1388
+ try{
1389
+ elem.focus();
1390
+ } catch(e){}
1391
+ }
1392
+ }, 1);
1393
+ }
1394
+
1395
+ function triggerChange(){
1396
+ var curValue = $.prop(elem, 'value');
1397
+ if(curValue == doChangeValue && curValue != blockChangeValue && typeof curValue == 'string'){
1398
+ triggerInlineForm(elem, 'change');
1399
+ }
1400
+ blockChangeValue = curValue;
1401
+ }
1402
+
1403
+ function init(){
1404
+ blockChangeValue = $(elem)
1405
+ .bind({
1406
+ 'change.stepcontrol focus.stepcontrol': function(e){
1407
+ if(!blockBlurChange || e.type != 'focus'){
1408
+ blockChangeValue = $.prop(elem, 'value');
1409
+ }
1410
+ },
1411
+ 'blur.stepcontrol': function(){
1412
+ if(!blockBlurChange){
1413
+ setTimeout(function(){
1414
+ if(!blockBlurChange && !$(elem).is(':focus')){
1415
+ triggerChange();
1416
+ }
1417
+ doChangeValue = false;
1418
+ }, DELAY);
1419
+ }
1420
+ }
1421
+ })
1422
+ .prop('value')
1423
+ ;
1424
+ }
1425
+
1426
+ init();
1427
+ return {
1428
+ triggerChange: triggerChange,
1429
+ step: step,
1430
+ setFocus: setFocus
1431
+ };
1432
+ };
1433
+
1434
+ webshims.addReady(function(context, contextElem){
1435
+ //ui for numeric values
1436
+ if(options.stepArrows){
1437
+ $('input', context).add(contextElem.filter('input')).each(function(){
1438
+ var type = $.prop(this, 'type');
1439
+ if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
1440
+ var elem = this;
1441
+ var uiEvents = changeInput(elem, type);
1442
+ var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
1443
+ .insertAfter(elem)
1444
+ .bind('selectstart dragstart', function(){return false;})
1445
+ .bind('mousedown mousepress', function(e){
1446
+ if(!$(e.target).hasClass('step-controls')){
1447
+ uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
1448
+ }
1449
+ uiEvents.setFocus();
1450
+ return false;
1451
+ })
1452
+ .bind('mousepressstart mousepressend', function(e){
1453
+ if(e.type == 'mousepressend'){
1454
+ uiEvents.triggerChange();
1455
+ }
1456
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
1457
+ })
1458
+ ;
1459
+ var mwheelUpDown = function(e, d){
1460
+ if(d){
1461
+ uiEvents.step(d);
1462
+ return false;
1463
+ }
1464
+ };
1465
+
1466
+ var jElm = $(elem)
1467
+ .addClass('has-step-controls')
1468
+ .attr({
1469
+ readonly: elem.readOnly,
1470
+ disabled: elem.disabled,
1471
+ autocomplete: 'off',
1472
+ role: 'spinbutton'
1473
+ })
1474
+ .bind('keyup', function(e){
1475
+ var step = stepKeys[e.keyCode];
1476
+ if(step){
1477
+ uiEvents.triggerChange(step);
1478
+ }
1479
+ })
1480
+ .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
1481
+ var step = stepKeys[e.keyCode];
1482
+ if(step){
1483
+ uiEvents.step(step);
1484
+ return false;
1485
+ }
1486
+ })
1487
+ ;
1488
+
1489
+ if(allowedChars[type]){
1490
+ jElm.bind('keypress', (function(){
1491
+ var chars = allowedChars[type];
1492
+ return function(event){
1493
+ var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
1494
+ return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
1495
+ };
1496
+ })());
1497
+ }
1498
+
1499
+ jElm
1500
+ .bind('focus', function(){
1501
+ jElm.add(controls).unbind('.mwhellwebshims')
1502
+ .bind('mousewheel.mwhellwebshims', mwheelUpDown)
1503
+ ;
1504
+ })
1505
+ .bind('blur', function(){
1506
+ $(elem).add(controls).unbind('.mwhellwebshims');
1507
+ })
1508
+ ;
1509
+
1510
+ webshims.data(elem, 'step-controls', controls);
1511
+ if(options.calculateWidth){
1512
+ var init;
1513
+ jElm
1514
+ .bind('updateshadowdom', function(){
1515
+ if(!init && (elem.offsetWidth || elem.offsetHeight)){
1516
+ init = true;
1517
+ adjustInputWithBtn(jElm, controls);
1518
+ controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
1519
+ }
1520
+ })
1521
+ .triggerHandler('updateshadowdom')
1522
+ ;
1523
+ }
1524
+ });
1525
+ }
1526
+ });
1527
+ })();
1528
+
1529
+
1530
+ webshims.addReady(function(context, elem){
1531
+ $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
1532
+ if($.datepicker || $.fn.slider){
1533
+ if($.datepicker && !defaultDatepicker.dateFormat){
1534
+ defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
1535
+ }
1536
+ replaceInputUI(context, elem);
1537
+ }
1538
+ if($.datepicker && $.fn.slider){
1539
+ $(document).unbind('.initinputui');
1540
+ } else if(!webshims.modules["input-widgets"].src){
1541
+ webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
1542
+ }
1543
+ });
1544
+ });
1545
+
1546
+ });
1547
+