webshims-rails 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +261 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -1
  6. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +24 -24
  7. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/README +82 -82
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +35 -34
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +79 -82
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +45 -44
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -42
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +28 -27
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +4 -4
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +57 -59
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +64 -66
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +53 -54
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +64 -66
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +72 -73
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +42 -46
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -50
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +55 -59
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +66 -64
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +80 -82
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +60 -59
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +79 -81
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +101 -104
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +94 -95
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +26 -29
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +33 -36
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +51 -54
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +27 -28
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +27 -28
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +39 -38
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +65 -68
  35. data/vendor/assets/javascripts/webshims/minified/shims/details.js +4 -4
  36. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +23 -22
  37. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +19 -22
  38. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +14 -14
  39. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +9 -9
  40. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +18 -19
  41. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +45 -43
  42. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  43. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  44. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +12 -12
  45. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +23 -0
  46. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -1
  47. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +26 -30
  48. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +3 -3
  49. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +689 -686
  50. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  52. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -21
  53. data/vendor/assets/javascripts/webshims/polyfiller.js +1191 -1175
  54. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1754 -1714
  55. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3247 -3320
  56. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1633 -1588
  57. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1636 -1591
  58. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1100 -1058
  59. data/vendor/assets/javascripts/webshims/shims/combos/14.js +476 -476
  60. data/vendor/assets/javascripts/webshims/shims/combos/15.js +316 -314
  61. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2094 -2104
  62. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2258 -2267
  63. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1380 -1364
  64. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2239 -2247
  65. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2339 -2294
  66. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1493 -1606
  67. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1733 -1635
  68. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2295 -2408
  69. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2269 -2168
  70. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2775 -2780
  71. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1505 -1456
  72. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2111 -2115
  73. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3264 -3331
  74. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3020 -2970
  75. data/vendor/assets/javascripts/webshims/shims/combos/4.js +770 -822
  76. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1025 -1077
  77. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1706 -1753
  78. data/vendor/assets/javascripts/webshims/shims/combos/6.js +444 -433
  79. data/vendor/assets/javascripts/webshims/shims/combos/7.js +699 -688
  80. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1488 -1445
  81. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2445 -2518
  82. data/vendor/assets/javascripts/webshims/shims/details.js +148 -146
  83. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +952 -912
  84. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  85. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  86. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -659
  87. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -676
  88. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -163
  89. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  90. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  91. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +61 -50
  92. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1569 -1472
  93. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  94. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  95. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  96. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  97. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  98. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  99. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  100. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  101. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  102. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  103. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  104. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  105. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  106. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  107. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  108. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  109. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  110. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  111. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +536 -533
  112. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +861 -0
  113. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  114. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +957 -1073
  115. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  116. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +689 -686
  117. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/track-ui.js +9 -8
  119. data/vendor/assets/javascripts/webshims/shims/track.js +17 -11
  120. metadata +6 -6
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-native-fix.js +0 -7
  122. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  123. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  124. data/vendor/assets/javascripts/webshims/shims/form-native-fix.js +0 -261
@@ -111,15 +111,15 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
111
111
 
112
112
  replaceInputUI.common = function(orig, shim, methods){
113
113
  if(Modernizr.formvalidation){
114
- orig.bind('firstinvalid', function(e){
114
+ orig.on('firstinvalid', function(e){
115
115
  if(!webshims.fromSubmit && isCheckValidity){return;}
116
- orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
116
+ orig.off('invalid.replacedwidgetbubble').on('invalid.replacedwidgetbubble', function(evt){
117
117
  if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
118
118
  webshims.validityAlert.showFor( e.target );
119
119
  e.preventDefault();
120
120
  evt.preventDefault();
121
121
  }
122
- orig.unbind('invalid.replacedwidgetbubble');
122
+ orig.off('invalid.replacedwidgetbubble');
123
123
  });
124
124
  });
125
125
  }
@@ -152,7 +152,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
152
152
  orig.after(shim);
153
153
 
154
154
  if(orig[0].form){
155
- $(orig[0].form).bind('reset', function(e){
155
+ $(orig[0].form).on('reset', function(e){
156
156
  if(e.originalEvent && !e.isDefaultPrevented()){
157
157
  setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
158
158
  }
@@ -161,7 +161,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
161
161
 
162
162
  if(label[0]){
163
163
  shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
164
- label.bind('click', function(){
164
+ label.on('click', function(){
165
165
  orig.getShadowFocusElement().focus();
166
166
  return false;
167
167
  });
@@ -200,16 +200,18 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
200
200
  focusedOut = false;
201
201
  };
202
202
  var data = datePicker
203
- .bind('focusin', function(){
204
- resetFocusHandler();
205
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
206
- stopFocusout = true;
207
- });
208
- })
209
- .bind('focusout blur', function(e){
210
- if(stopFocusout){
211
- focusedOut = true;
212
- e.stopImmediatePropagation();
203
+ .on({
204
+ focusin: function(){
205
+ resetFocusHandler();
206
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
207
+ stopFocusout = true;
208
+ });
209
+ },
210
+ 'focusout blur': function(e){
211
+ if(stopFocusout){
212
+ focusedOut = true;
213
+ e.stopImmediatePropagation();
214
+ }
213
215
  }
214
216
  })
215
217
  .datepicker($.extend({
@@ -223,7 +225,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
223
225
  }
224
226
  }
225
227
  }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
226
- .bind('change', change)
228
+ .on('change', change)
227
229
  .data('datepicker')
228
230
  ;
229
231
  data.dpDiv.addClass('input-date-datepicker-control');
@@ -425,7 +427,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
425
427
  data = configureDatePicker(elem, date, change);
426
428
 
427
429
  $(elem)
428
- .bind('updateshadowdom', function(){
430
+ .on('updateshadowdom', function(){
429
431
  if (data.trigger[0]) {
430
432
  elem.css({display: ''});
431
433
  if(elem[0].offsetWidth || elem[0].offsetHeight){
@@ -515,7 +517,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
515
517
 
516
518
 
517
519
  elem
518
- .bind('updateshadowdom', function(){
520
+ .on('updateshadowdom', function(){
519
521
  elem.css({display: ''});
520
522
  if (elem[0].offsetWidth || elem[0].offsetHeight) {
521
523
  var attr = getDimensions(elem);
@@ -532,11 +534,16 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
532
534
  ;
533
535
 
534
536
 
535
- range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change).bind('slidechange', function(e){
536
- if(e.originalEvent){
537
- triggerInlineForm(elem[0], 'change');
538
- }
539
- });
537
+ range.slider($.extend(true, {}, options.slider, elem.data('slider')))
538
+ .on({
539
+ slide: change,
540
+ slidechange: function(e){
541
+ if(e.originalEvent){
542
+ triggerInlineForm(elem[0], 'change');
543
+ }
544
+ }
545
+ })
546
+ ;
540
547
 
541
548
  ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
542
549
  var val = elem.prop(name);
@@ -591,7 +598,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
591
598
  };
592
599
  }
593
600
 
594
- if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
601
+ if(options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range){
595
602
  var reflectFn = function(val){
596
603
  if(webshims.data(this, 'hasShadow')){
597
604
  $.prop(this, 'value', $.prop(this, 'value'));
@@ -642,7 +649,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
642
649
  $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
643
650
  };
644
651
 
645
- $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
652
+ $(document).on('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
646
653
  getDefaults();
647
654
 
648
655
  //implement set/arrow controls
@@ -764,7 +771,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
764
771
 
765
772
  function init(){
766
773
  blockChangeValue = $(elem)
767
- .bind({
774
+ .on({
768
775
  'change.stepcontrol focus.stepcontrol': function(e){
769
776
  if(!blockBlurChange || e.type != 'focus'){
770
777
  blockChangeValue = $.prop(elem, 'value');
@@ -803,19 +810,21 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
803
810
  var uiEvents = changeInput(elem, type);
804
811
  var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
805
812
  .insertAfter(elem)
806
- .bind('selectstart dragstart', function(){return false;})
807
- .bind('mousedown mousepress', function(e){
808
- if(!$(e.target).hasClass('step-controls')){
809
- uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
810
- }
811
- uiEvents.setFocus();
812
- return false;
813
- })
814
- .bind('mousepressstart mousepressend', function(e){
815
- if(e.type == 'mousepressend'){
816
- uiEvents.triggerChange();
813
+ .on({
814
+ 'selectstart dragstart': function(){return false;},
815
+ 'mousedown mousepress': function(e){
816
+ if(!$(e.target).hasClass('step-controls')){
817
+ uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
818
+ }
819
+ uiEvents.setFocus();
820
+ return false;
821
+ },
822
+ 'mousepressstart mousepressend': function(e){
823
+ if(e.type == 'mousepressend'){
824
+ uiEvents.triggerChange();
825
+ }
826
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
817
827
  }
818
- $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
819
828
  })
820
829
  ;
821
830
  var mwheelUpDown = function(e, d){
@@ -833,13 +842,13 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
833
842
  autocomplete: 'off',
834
843
  role: 'spinbutton'
835
844
  })
836
- .bind('keyup', function(e){
845
+ .on('keyup', function(e){
837
846
  var step = stepKeys[e.keyCode];
838
847
  if(step){
839
848
  uiEvents.triggerChange(step);
840
849
  }
841
850
  })
842
- .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
851
+ .on(($.browser.msie) ? 'keydown' : 'keypress', function(e){
843
852
  var step = stepKeys[e.keyCode];
844
853
  if(step){
845
854
  uiEvents.step(step);
@@ -849,7 +858,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
849
858
  ;
850
859
 
851
860
  if(allowedChars[type]){
852
- jElm.bind('keypress', (function(){
861
+ jElm.on('keypress', (function(){
853
862
  var chars = allowedChars[type];
854
863
  return function(event){
855
864
  var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
@@ -859,13 +868,15 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
859
868
  }
860
869
 
861
870
  jElm
862
- .bind('focus', function(){
863
- jElm.add(controls).unbind('.mwhellwebshims')
864
- .bind('mousewheel.mwhellwebshims', mwheelUpDown)
865
- ;
866
- })
867
- .bind('blur', function(){
868
- $(elem).add(controls).unbind('.mwhellwebshims');
871
+ .on({
872
+ focus: function(){
873
+ jElm.add(controls).off('.mwhellwebshims')
874
+ .on('mousewheel.mwhellwebshims', mwheelUpDown)
875
+ ;
876
+ },
877
+ blur: function(){
878
+ $(elem).add(controls).off('.mwhellwebshims');
879
+ }
869
880
  })
870
881
  ;
871
882
 
@@ -873,7 +884,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
873
884
  if(options.calculateWidth){
874
885
  var init;
875
886
  jElm
876
- .bind('updateshadowdom', function(){
887
+ .on('updateshadowdom', function(){
877
888
  if(!init && (elem.offsetWidth || elem.offsetHeight)){
878
889
  init = true;
879
890
  adjustInputWithBtn(jElm, controls);
@@ -890,7 +901,7 @@ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, do
890
901
 
891
902
 
892
903
  webshims.addReady(function(context, elem){
893
- $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
904
+ $(document).on('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
894
905
  if($.datepicker || $.fn.slider){
895
906
  if($.datepicker && !defaultDatepicker.dateFormat){
896
907
  defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
@@ -1,1472 +1,1569 @@
1
- if(!Modernizr.formvalidation || jQuery.webshims.bugs.bustedValidity){
2
- jQuery.webshims.register('form-extend', function($, webshims, window, document){
3
- webshims.inputTypes = webshims.inputTypes || {};
4
- //some helper-functions
5
- var cfg = webshims.cfg.forms;
6
- var isSubmit;
7
-
8
- var isNumber = function(string){
9
- return (typeof string == 'number' || (string && string == string * 1));
10
- },
11
- typeModels = webshims.inputTypes,
12
- checkTypes = {
13
- radio: 1,
14
- checkbox: 1
15
- },
16
- getType = function(elem){
17
- return (elem.getAttribute('type') || elem.type || '').toLowerCase();
18
- }
19
- ;
20
-
21
- //API to add new input types
22
- webshims.addInputType = function(type, obj){
23
- typeModels[type] = obj;
24
- };
25
-
26
- //contsrain-validation-api
27
- var validityPrototype = {
28
- customError: false,
29
-
30
- typeMismatch: false,
31
- rangeUnderflow: false,
32
- rangeOverflow: false,
33
- stepMismatch: false,
34
- tooLong: false,
35
- patternMismatch: false,
36
- valueMissing: false,
37
-
38
- valid: true
39
- };
40
-
41
- var isPlaceholderOptionSelected = function(select){
42
- if(select.type == 'select-one' && select.size < 2){
43
- var option = $('> option:first-child', select);
44
- return !!option.prop('selected');
45
- }
46
- return false;
47
- };
48
-
49
- var validityRules = {
50
- valueMissing: function(input, val, cache){
51
- if(!input.prop('required')){return false;}
52
- var ret = false;
53
- if(!('type' in cache)){
54
- cache.type = getType(input[0]);
55
- }
56
- if(cache.nodeName == 'select'){
57
- ret = (!val && (input[0].selectedIndex < 0 || isPlaceholderOptionSelected(input[0]) ));
58
- } else if(checkTypes[cache.type]){
59
- ret = (cache.type == 'checkbox') ? !input.is(':checked') : !webshims.modules["form-core"].getGroupElements(input).filter(':checked')[0];
60
- } else {
61
- ret = !(val);
62
- }
63
- return ret;
64
- },
65
- tooLong: function(input, val, cache){
66
- return false;
67
- },
68
- typeMismatch: function (input, val, cache){
69
- if(val === '' || cache.nodeName == 'select'){return false;}
70
- var ret = false;
71
- if(!('type' in cache)){
72
- cache.type = getType(input[0]);
73
- }
74
-
75
- if(typeModels[cache.type] && typeModels[cache.type].mismatch){
76
- ret = typeModels[cache.type].mismatch(val, input);
77
- } else if('validity' in input[0]){
78
- ret = input[0].validity.typeMismatch;
79
- }
80
- return ret;
81
- },
82
- patternMismatch: function(input, val, cache) {
83
- if(val === '' || cache.nodeName == 'select'){return false;}
84
- var pattern = input.attr('pattern');
85
- if(!pattern){return false;}
86
- try {
87
- pattern = new RegExp('^(?:' + pattern + ')$');
88
- } catch(er){
89
- webshims.error('invalid pattern value: "'+ pattern +'" | '+ er);
90
- pattern = false;
91
- }
92
- if(!pattern){return false;}
93
- return !(pattern.test(val));
94
- }
95
- }
96
- ;
97
-
98
- webshims.addValidityRule = function(type, fn){
99
- validityRules[type] = fn;
100
- };
101
-
102
- $.event.special.invalid = {
103
- add: function(){
104
- $.event.special.invalid.setup.call(this.form || this);
105
- },
106
- setup: function(){
107
- var form = this.form || this;
108
- if( $.data(form, 'invalidEventShim') ){
109
- form = null;
110
- return;
111
- }
112
- $(form)
113
- .data('invalidEventShim', true)
114
- .bind('submit', $.event.special.invalid.handler)
115
- ;
116
- webshims.moveToFirstEvent(form, 'submit');
117
- if(webshims.bugs.bustedValidity && $.nodeName(form, 'form')){
118
- (function(){
119
- var noValidate = form.getAttribute('novalidate');
120
- form.setAttribute('novalidate', 'novalidate');
121
- webshims.data(form, 'bustedNoValidate', (noValidate == null) ? null : noValidate);
122
- })();
123
- }
124
- form = null;
125
- },
126
- teardown: $.noop,
127
- handler: function(e, d){
128
-
129
- if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
130
-
131
- isSubmit = true;
132
- e.testedValidity = true;
133
- var notValid = !($(e.target).checkValidity());
134
- if(notValid){
135
- e.stopImmediatePropagation();
136
- isSubmit = false;
137
- return false;
138
- }
139
- isSubmit = false;
140
- }
141
- };
142
-
143
- var addSubmitBubbles = function(form){
144
- if (!$.support.submitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
145
-
146
- $.event.add( form, 'submit._submit', function( event ) {
147
- event._submit_bubble = true;
148
- });
149
-
150
- form._submit_attached = true;
151
- }
152
- };
153
- if(!$.support.submitBubbles && $.event.special.submit){
154
- $.event.special.submit.setup = function() {
155
- // Only need this for delegated form submit events
156
- if ( $.nodeName( this, "form" ) ) {
157
- return false;
158
- }
159
-
160
- // Lazy-add a submit handler when a descendant form may potentially be submitted
161
- $.event.add( this, "click._submit keypress._submit", function( e ) {
162
- // Node name check avoids a VML-related crash in IE (#9807)
163
- var elem = e.target,
164
- form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
165
- addSubmitBubbles(form);
166
-
167
- });
168
- // return undefined since we don't need an event listener
169
- };
170
- }
171
-
172
- $.event.special.submit = $.event.special.submit || {setup: function(){return false;}};
173
- var submitSetup = $.event.special.submit.setup;
174
- $.extend($.event.special.submit, {
175
- setup: function(){
176
- if($.nodeName(this, 'form')){
177
- $(this).bind('invalid', $.noop);
178
- } else {
179
- $('form', this).bind('invalid', $.noop);
180
- }
181
- return submitSetup.apply(this, arguments);
182
- }
183
- });
184
-
185
- $(window).bind('invalid', $.noop);
186
-
187
-
188
- webshims.addInputType('email', {
189
- mismatch: (function(){
190
- //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
191
- var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+-\/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
192
- return function(val){
193
- return !test.test(val);
194
- };
195
- })()
196
- });
197
-
198
- webshims.addInputType('url', {
199
- mismatch: (function(){
200
- //taken from scott gonzales
201
- var test = cfg.urlReg || /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
202
- return function(val){
203
- return !test.test(val);
204
- };
205
- })()
206
- });
207
-
208
- webshims.defineNodeNameProperty('input', 'type', {
209
- prop: {
210
- get: function(){
211
- var elem = this;
212
- var type = (elem.getAttribute('type') || '').toLowerCase();
213
- return (webshims.inputTypes[type]) ? type : elem.type;
214
- }
215
- }
216
- });
217
-
218
- // IDLs for constrain validation API
219
- //ToDo: add object to this list
220
- webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
221
- checkValidity: {
222
- value: function(){return true;}
223
- },
224
- willValidate: {
225
- value: false
226
- },
227
- setCustomValidity: {
228
- value: $.noop
229
- },
230
- validity: {
231
- writeable: false,
232
- get: function(){
233
- return $.extend({}, validityPrototype);
234
- }
235
- }
236
- }, 'prop');
237
-
238
- var baseCheckValidity = function(elem){
239
- var e,
240
- v = $.prop(elem, 'validity')
241
- ;
242
- if(v){
243
- $.data(elem, 'cachedValidity', v);
244
- } else {
245
- return true;
246
- }
247
- if( !v.valid ){
248
- e = $.Event('invalid');
249
- var jElm = $(elem).trigger(e);
250
- if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
251
- webshims.validityAlert.showFor(jElm);
252
- baseCheckValidity.unhandledInvalids = true;
253
- }
254
- }
255
- $.removeData(elem, 'cachedValidity');
256
- return v.valid;
257
- };
258
- var rsubmittable = /^(?:select|textarea|input)/i;
259
- webshims.defineNodeNameProperty('form', 'checkValidity', {
260
- prop: {
261
- value: function(){
262
-
263
- var ret = true,
264
- elems = $($.prop(this, 'elements')).filter(function(){
265
- if(!rsubmittable.test(this.nodeName)){return false;}
266
- var shadowData = webshims.data(this, 'shadowData');
267
- return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
268
- })
269
- ;
270
-
271
- baseCheckValidity.unhandledInvalids = false;
272
- for(var i = 0, len = elems.length; i < len; i++){
273
- if( !baseCheckValidity(elems[i]) ){
274
- ret = false;
275
- }
276
- }
277
- return ret;
278
- }
279
- }
280
- });
281
-
282
- webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
283
- checkValidity: {
284
- value: function(){
285
- baseCheckValidity.unhandledInvalids = false;
286
- return baseCheckValidity($(this).getNativeElement()[0]);
287
- }
288
- },
289
- setCustomValidity: {
290
- value: function(error){
291
- $.removeData(this, 'cachedValidity');
292
- webshims.data(this, 'customvalidationMessage', ''+error);
293
- }
294
- },
295
- willValidate: {
296
- writeable: false,
297
- get: (function(){
298
- var types = {
299
- button: 1,
300
- reset: 1,
301
- hidden: 1,
302
- image: 1
303
- }
304
- ;
305
- return function(){
306
- var elem = $(this).getNativeElement()[0];
307
- //elem.name && <- we don't use to make it easier for developers
308
- return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
309
- };
310
- })()
311
- },
312
- validity: {
313
- writeable: false,
314
- get: function(){
315
- var jElm = $(this).getNativeElement();
316
- var elem = jElm[0];
317
- var validityState = $.data(elem, 'cachedValidity');
318
- if(validityState){
319
- return validityState;
320
- }
321
- validityState = $.extend({}, validityPrototype);
322
-
323
- if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
324
- return validityState;
325
- }
326
- var val = jElm.val(),
327
- cache = {nodeName: elem.nodeName.toLowerCase()}
328
- ;
329
-
330
- validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
331
- if( validityState.customError ){
332
- validityState.valid = false;
333
- }
334
-
335
- $.each(validityRules, function(rule, fn){
336
- if (fn(jElm, val, cache)) {
337
- validityState[rule] = true;
338
- validityState.valid = false;
339
- }
340
- });
341
- $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
342
- jElm = null;
343
- elem = null;
344
- return validityState;
345
- }
346
- }
347
- }, 'prop');
348
-
349
- webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
350
- set: function(value){
351
- $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
352
- },
353
- initAttr: (!$.browser.msie || webshims.browserVersion > 7)//only if we have aria-support
354
- });
355
-
356
- webshims.reflectProperties(['input'], ['pattern']);
357
-
358
-
359
- if( !('maxLength' in document.createElement('textarea')) ){
360
- var constrainMaxLength = (function(){
361
- var timer;
362
- var curLength = 0;
363
- var lastElement = $([]);
364
- var max = 1e9;
365
- var constrainLength = function(){
366
- var nowValue = lastElement.prop('value');
367
- var nowLen = nowValue.length;
368
- if(nowLen > curLength && nowLen > max){
369
- nowLen = Math.max(curLength, max);
370
- lastElement.prop('value', nowValue.substr(0, nowLen ));
371
- }
372
- curLength = nowLen;
373
- };
374
- var remove = function(){
375
- clearTimeout(timer);
376
- lastElement.unbind('.maxlengthconstraint');
377
- };
378
- return function(element, maxLength){
379
- remove();
380
- if(maxLength > -1){
381
- max = maxLength;
382
- curLength = $.prop(element, 'value').length;
383
- lastElement = $(element);
384
- lastElement.bind('keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint', function(e){
385
- setTimeout(constrainLength, 0);
386
- });
387
- lastElement.bind('keyup.maxlengthconstraint', constrainLength);
388
- lastElement.bind('blur.maxlengthconstraint', remove);
389
- timer = setInterval(constrainLength, 200);
390
- }
391
- };
392
- })();
393
-
394
- constrainMaxLength.update = function(element, maxLength){
395
- if($(element).is(':focus')){
396
- if(maxLength == null){
397
- maxLength = $.prop(element, 'maxlength');
398
- }
399
- constrainMaxLength(e.target, maxLength);
400
- }
401
- };
402
-
403
- $(document).bind('focusin', function(e){
404
- var maxLength;
405
- if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
406
- constrainMaxLength(e.target, maxLength);
407
- }
408
- });
409
-
410
- webshims.defineNodeNameProperty('textarea', 'maxlength', {
411
- attr: {
412
- set: function(val){
413
- this.setAttribute('maxlength', ''+val);
414
- constrainMaxLength.update(this);
415
- },
416
- get: function(){
417
- var ret = this.getAttribute('maxlength');
418
- return ret == null ? undefined : ret;
419
- }
420
- },
421
- prop: {
422
- set: function(val){
423
- if(isNumber(val)){
424
- if(val < 0){
425
- throw('INDEX_SIZE_ERR');
426
- }
427
- val = parseInt(val, 10);
428
- this.setAttribute('maxlength', val);
429
- constrainMaxLength.update(this, val);
430
- return;
431
- }
432
- this.setAttribute('maxlength', ''+ 0);
433
- constrainMaxLength.update(this, 0);
434
- },
435
- get: function(){
436
- var val = this.getAttribute('maxlength');
437
- return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
438
-
439
- }
440
- }
441
- });
442
- webshims.defineNodeNameProperty('textarea', 'maxLength', {
443
- prop: {
444
- set: function(val){
445
- $.prop(this, 'maxlength', val);
446
- },
447
- get: function(){
448
- return $.prop(this, 'maxlength');
449
- }
450
- }
451
- });
452
- }
453
-
454
-
455
-
456
- var submitterTypes = {submit: 1, button: 1, image: 1};
457
- var formSubmitterDescriptors = {};
458
- [
459
- {
460
- name: "enctype",
461
- limitedTo: {
462
- "application/x-www-form-urlencoded": 1,
463
- "multipart/form-data": 1,
464
- "text/plain": 1
465
- },
466
- defaultProp: "application/x-www-form-urlencoded",
467
- proptype: "enum"
468
- },
469
- {
470
- name: "method",
471
- limitedTo: {
472
- "get": 1,
473
- "post": 1
474
- },
475
- defaultProp: "get",
476
- proptype: "enum"
477
- },
478
- {
479
- name: "action",
480
- proptype: "url"
481
- },
482
- {
483
- name: "target"
484
- },
485
- {
486
- name: "novalidate",
487
- propName: "noValidate",
488
- proptype: "boolean"
489
- }
490
- ].forEach(function(desc){
491
- var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){
492
- return f.toUpperCase();
493
- });
494
- var attrName = 'form'+ desc.name;
495
- var formName = desc.name;
496
- var eventName = 'click.webshimssubmittermutate'+formName;
497
-
498
- var changeSubmitter = function(){
499
- var elem = this;
500
- if( !('form' in elem) || !submitterTypes[elem.type] ){return;}
501
- var form = $.prop(elem, 'form');
502
- if(!form){return;}
503
- var attr = $.attr(elem, attrName);
504
- if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){
505
-
506
- var oldAttr = $.attr(form, formName);
507
-
508
- $.attr(form, formName, attr);
509
- setTimeout(function(){
510
- if(oldAttr != null){
511
- $.attr(form, formName, oldAttr);
512
- } else {
513
- try {
514
- $(form).removeAttr(formName);
515
- } catch(er){
516
- form.removeAttribute(formName);
517
- }
518
- }
519
- }, 9);
520
- }
521
- };
522
-
523
-
524
-
525
- switch(desc.proptype) {
526
- case "url":
527
- var urlForm = document.createElement('form');
528
- formSubmitterDescriptors[propName] = {
529
- prop: {
530
- set: function(value){
531
- $.attr(this, attrName, value);
532
- },
533
- get: function(){
534
- var value = $.attr(this, attrName);
535
- if(value == null){return '';}
536
- urlForm.setAttribute('action', value);
537
- return urlForm.action;
538
- }
539
- }
540
- };
541
- break;
542
- case "boolean":
543
- formSubmitterDescriptors[propName] = {
544
- prop: {
545
- set: function(val){
546
- val = !!val;
547
- if(val){
548
- $.attr(this, 'formnovalidate', 'formnovalidate');
549
- } else {
550
- $(this).removeAttr('formnovalidate');
551
- }
552
- },
553
- get: function(){
554
- return $.attr(this, 'formnovalidate') != null;
555
- }
556
- }
557
- };
558
- break;
559
- case "enum":
560
- formSubmitterDescriptors[propName] = {
561
- prop: {
562
- set: function(value){
563
- $.attr(this, attrName, value);
564
- },
565
- get: function(){
566
- var value = $.attr(this, attrName);
567
- return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value;
568
- }
569
- }
570
- };
571
- break;
572
- default:
573
- formSubmitterDescriptors[propName] = {
574
- prop: {
575
- set: function(value){
576
- $.attr(this, attrName, value);
577
- },
578
- get: function(){
579
- var value = $.attr(this, attrName);
580
- return (value != null) ? value : "";
581
- }
582
- }
583
- };
584
- }
585
-
586
-
587
- if(!formSubmitterDescriptors[attrName]){
588
- formSubmitterDescriptors[attrName] = {};
589
- }
590
- formSubmitterDescriptors[attrName].attr = {
591
- set: function(value){
592
- formSubmitterDescriptors[attrName].attr._supset.call(this, value);
593
- $(this).unbind(eventName).bind(eventName, changeSubmitter);
594
- },
595
- get: function(){
596
- return formSubmitterDescriptors[attrName].attr._supget.call(this);
597
- }
598
- };
599
- formSubmitterDescriptors[attrName].initAttr = true;
600
- formSubmitterDescriptors[attrName].removeAttr = {
601
- value: function(){
602
- $(this).unbind(eventName);
603
- formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
604
- }
605
- };
606
- });
607
-
608
- webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
609
-
610
-
611
- if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
612
- webshims.defineNodeNameProperty('form', 'novalidate', {
613
- attr: {
614
- set: function(val){
615
- this.setAttribute('novalidate', ''+val);
616
- },
617
- get: function(){
618
- var ret = this.getAttribute('novalidate');
619
- return ret == null ? undefined : ret;
620
- }
621
- }
622
- });
623
- } else if(webshims.bugs.bustedValidity){
624
-
625
- webshims.defineNodeNameProperty('form', 'novalidate', {
626
- attr: {
627
- set: function(val){
628
- webshims.data(this, 'bustedNoValidate', ''+val);
629
- },
630
- get: function(){
631
- var ret = webshims.data(this, 'bustedNoValidate');
632
- return ret == null ? undefined : ret;
633
- }
634
- },
635
- removeAttr: {
636
- value: function(){
637
- webshims.data(this, 'bustedNoValidate', null);
638
- }
639
- }
640
- });
641
-
642
- $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){
643
- validityRules[name] = function(elem){
644
- return (elem[0].validity || {})[name] || false;
645
- };
646
- });
647
-
648
- }
649
-
650
- webshims.defineNodeNameProperty('form', 'noValidate', {
651
- prop: {
652
- set: function(val){
653
- val = !!val;
654
- if(val){
655
- $.attr(this, 'novalidate', 'novalidate');
656
- } else {
657
- $(this).removeAttr('novalidate');
658
- }
659
- },
660
- get: function(){
661
- return $.attr(this, 'novalidate') != null;
662
- }
663
- }
664
- });
665
-
666
- if($.browser.webkit && Modernizr.inputtypes.date){
667
- (function(){
668
-
669
- var noInputTriggerEvts = {updateInput: 1, input: 1},
670
- fixInputTypes = {
671
- date: 1,
672
- time: 1,
673
- "datetime-local": 1
674
- },
675
- noFocusEvents = {
676
- focusout: 1,
677
- blur: 1
678
- },
679
- changeEvts = {
680
- updateInput: 1,
681
- change: 1
682
- },
683
- observe = function(input){
684
- var timer,
685
- focusedin = true,
686
- lastInputVal = input.prop('value'),
687
- lastChangeVal = lastInputVal,
688
- trigger = function(e){
689
- //input === null
690
- if(!input){return;}
691
- var newVal = input.prop('value');
692
-
693
- if(newVal !== lastInputVal){
694
- lastInputVal = newVal;
695
- if(!e || !noInputTriggerEvts[e.type]){
696
- input.trigger('input');
697
- }
698
- }
699
- if(e && changeEvts[e.type]){
700
- lastChangeVal = newVal;
701
- }
702
- if(!focusedin && newVal !== lastChangeVal){
703
- input.trigger('change');
704
- }
705
- },
706
- extraTimer,
707
- extraTest = function(){
708
- clearTimeout(extraTimer);
709
- extraTimer = setTimeout(trigger, 9);
710
- },
711
- unbind = function(e){
712
- clearInterval(timer);
713
- setTimeout(function(){
714
- if(e && noFocusEvents[e.type]){
715
- focusedin = false;
716
- }
717
- if(input){
718
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
719
- trigger();
720
- }
721
- input = null;
722
- }, 1);
723
-
724
- }
725
- ;
726
-
727
- clearInterval(timer);
728
- timer = setInterval(trigger, 160);
729
- extraTest();
730
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
731
- input.bind('focusout blur', unbind).bind('input updateInput change', trigger);
732
- }
733
- ;
734
- if($.event.customEvent){
735
- $.event.customEvent.updateInput = true;
736
- }
737
-
738
- (function(){
739
-
740
- var correctValue = function(elem){
741
- var i = 1;
742
- var len = 3;
743
- var abort, val;
744
- if(elem.type == 'date' && (isSubmit || !$(elem).is(':focus'))){
745
- val = elem.value;
746
- if(val && val.length < 10 && (val = val.split('-')) && val.length == len){
747
- for(; i < len; i++){
748
- if(val[i].length == 1){
749
- val[i] = '0'+val[i];
750
- } else if(val[i].length != 2){
751
- abort = true;
752
- break;
753
- }
754
- }
755
- if(!abort){
756
- val = val.join('-');
757
- $.prop(elem, 'value', val);
758
- return val;
759
- }
760
- }
761
- }
762
- };
763
- var inputCheckValidityDesc, formCheckValidityDesc, inputValueDesc, inputValidityDesc;
764
-
765
- inputCheckValidityDesc = webshims.defineNodeNameProperty('input', 'checkValidity', {
766
- prop: {
767
- value: function(){
768
- correctValue(this);
769
- return inputCheckValidityDesc.prop._supvalue.apply(this, arguments);
770
- }
771
- }
772
- });
773
-
774
- formCheckValidityDesc = webshims.defineNodeNameProperty('form', 'checkValidity', {
775
- prop: {
776
- value: function(){
777
- $('input', this).each(function(){
778
- correctValue(this);
779
- });
780
- return formCheckValidityDesc.prop._supvalue.apply(this, arguments);
781
- }
782
- }
783
- });
784
-
785
- inputValueDesc = webshims.defineNodeNameProperty('input', 'value', {
786
- prop: {
787
- set: function(){
788
- return inputValueDesc.prop._supset.apply(this, arguments);
789
- },
790
- get: function(){
791
- return correctValue(this) || inputValueDesc.prop._supget.apply(this, arguments);
792
- }
793
- }
794
- });
795
-
796
- inputValidityDesc = webshims.defineNodeNameProperty('input', 'validity', {
797
- prop: {
798
- writeable: false,
799
- get: function(){
800
- correctValue(this);
801
- return inputValidityDesc.prop._supget.apply(this, arguments);
802
- }
803
- }
804
- });
805
-
806
- $(document).bind('change', function(e){
807
- isChangeSubmit = true;
808
- correctValue(e.target);
809
- isChangeSubmit = false;
810
- });
811
-
812
- })();
813
-
814
- $(document)
815
- .bind('focusin', function(e){
816
- if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){
817
- observe($(e.target));
818
- }
819
- })
820
- ;
821
-
822
-
823
- })();
824
- }
825
-
826
- webshims.addReady(function(context, contextElem){
827
- //start constrain-validation
828
- var focusElem;
829
- $('form', context)
830
- .add(contextElem.filter('form'))
831
- .bind('invalid', $.noop)
832
- ;
833
-
834
- try {
835
- if(context == document && !('form' in (document.activeElement || {}))) {
836
- focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
837
- if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
838
- focusElem.focus();
839
- }
840
- }
841
- }
842
- catch (er) {}
843
-
844
- });
845
-
846
- if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){
847
- (function(){
848
- (function(prop, undefined){
849
- $.prop = function(elem, name, value){
850
- var ret;
851
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
852
- ret = document.getElementsByName(name);
853
- if(!ret || !ret.length){
854
- ret = document.getElementById(name);
855
- }
856
- if(ret){
857
- ret = $(ret).filter(function(){
858
- return $.prop(this, 'form') == elem;
859
- }).get();
860
- if(ret.length){
861
- return ret.length == 1 ? ret[0] : ret;
862
- }
863
- }
864
- }
865
- return prop.apply(this, arguments);
866
- };
867
- })($.prop, undefined);
868
- var removeAddedElements = function(form){
869
- var elements = $.data(form, 'webshimsAddedElements');
870
- if(elements){
871
- elements.remove();
872
- $.removeData(form, 'webshimsAddedElements');
873
- }
874
- };
875
- var rCRLF = /\r?\n/g,
876
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
877
- rselectTextarea = /^(?:select|textarea)/i;
878
-
879
- if(!Modernizr.formattribute){
880
- webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
881
- prop: {
882
- get: function(){
883
- var form = webshims.contentAttr(this, 'form');
884
- if(form){
885
- form = document.getElementById(form);
886
- if(form && !$.nodeName(form, 'form')){
887
- form = null;
888
- }
889
- }
890
- return form || this.form;
891
- },
892
- writeable: false
893
- }
894
- });
895
-
896
-
897
- webshims.defineNodeNamesProperty(['form'], 'elements', {
898
- prop: {
899
- get: function(){
900
- var id = this.id;
901
- var elements = $.makeArray(this.elements);
902
- if(id){
903
- elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
904
- }
905
- return elements;
906
- },
907
- writeable: false
908
- }
909
- });
910
-
911
-
912
-
913
- $(function(){
914
- var stopPropagation = function(e){
915
- e.stopPropagation();
916
- };
917
- $(document).bind('submit', function(e){
918
-
919
- if(!e.isDefaultPrevented()){
920
- var form = e.target;
921
- var id = form.id;
922
- var elements;
923
-
924
-
925
- if(id){
926
- removeAddedElements(form);
927
-
928
- elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
929
- .filter(function(){
930
- return !this.disabled && this.name && this.form != form;
931
- })
932
- .clone()
933
- ;
934
- if(elements.length){
935
- $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
936
- setTimeout(function(){
937
- removeAddedElements(form);
938
- }, 9);
939
- }
940
- elements = null;
941
- }
942
- }
943
- });
944
-
945
- $(document).bind('click', function(e){
946
- if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){
947
- var trueForm = $.prop(e.target, 'form');
948
- var formIn = e.target.form;
949
- var clone;
950
- if(trueForm && trueForm != formIn){
951
- clone = $(e.target)
952
- .clone()
953
- .removeAttr('form')
954
- .addClass('webshims-visual-hide')
955
- .bind('click', stopPropagation)
956
- .appendTo(trueForm)
957
- ;
958
- if(formIn){
959
- e.preventDefault();
960
- }
961
- addSubmitBubbles(trueForm);
962
- clone.trigger('click');
963
- setTimeout(function(){
964
- clone.remove();
965
- clone = null;
966
- }, 9);
967
- }
968
- }
969
- });
970
- });
971
- }
972
-
973
- if(!Modernizr.fieldsetdisabled){
974
- webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
975
- prop: {
976
- get: function(){
977
- //add listed elements without keygen, object, output
978
- return $('input, select, textarea, button, fieldset', this).get() || [];
979
- },
980
- writeable: false
981
- }
982
- });
983
- }
984
-
985
- $.fn.serializeArray = function() {
986
- return this.map(function(){
987
- var elements = $.prop(this, 'elements');
988
- return elements ? $.makeArray( elements ) : this;
989
- })
990
- .filter(function(){
991
- return this.name && !this.disabled &&
992
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
993
- rinput.test( this.type ) );
994
- })
995
- .map(function( i, elem ){
996
- var val = $( this ).val();
997
-
998
- return val == null ?
999
- null :
1000
- $.isArray( val ) ?
1001
- $.map( val, function( val, i ){
1002
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1003
- }) :
1004
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1005
- }).get();
1006
- };
1007
-
1008
- })();
1009
- }
1010
-
1011
- (function(){
1012
- Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
1013
- var bustedTextarea = $.browser.webkit && Modernizr.textareaPlaceholder && webshims.browserVersion < 535;
1014
- if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedTextarea){return;}
1015
-
1016
- var isOver = (webshims.cfg.forms.placeholderType == 'over');
1017
- var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
1018
- var polyfillElements = ['textarea'];
1019
- if(!Modernizr.input.placeholder){
1020
- polyfillElements.push('input');
1021
- }
1022
-
1023
- var setSelection = function(elem){
1024
- try {
1025
- if(elem.setSelectionRange){
1026
- elem.setSelectionRange(0, 0);
1027
- return true;
1028
- } else if(elem.createTextRange){
1029
- var range = elem.createTextRange();
1030
- range.collapse(true);
1031
- range.moveEnd('character', 0);
1032
- range.moveStart('character', 0);
1033
- range.select();
1034
- return true;
1035
- }
1036
- } catch(er){}
1037
- };
1038
-
1039
- var hidePlaceholder = function(elem, data, value, _onFocus){
1040
- if(value === false){
1041
- value = $.prop(elem, 'value');
1042
- }
1043
- if(!isOver && elem.type != 'password'){
1044
- if(!value && _onFocus && setSelection(elem)){
1045
- var selectTimer = setTimeout(function(){
1046
- setSelection(elem);
1047
- }, 9);
1048
- $(elem)
1049
- .unbind('.placeholderremove')
1050
- .bind('keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove', function(e){
1051
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1052
- elem.value = $.prop(elem, 'value');
1053
- data.box.removeClass('placeholder-visible');
1054
- clearTimeout(selectTimer);
1055
- $(elem).unbind('.placeholderremove');
1056
- })
1057
- .bind('mousedown.placeholderremove drag.placeholderremove select.placeholderremove', function(e){
1058
- setSelection(elem);
1059
- clearTimeout(selectTimer);
1060
- selectTimer = setTimeout(function(){
1061
- setSelection(elem);
1062
- }, 9);
1063
- })
1064
- .bind('blur.placeholderremove', function(){
1065
- clearTimeout(selectTimer);
1066
- $(elem).unbind('.placeholderremove');
1067
- })
1068
- ;
1069
- return;
1070
- }
1071
- elem.value = value;
1072
- } else if(!value && _onFocus){
1073
- $(elem)
1074
- .unbind('.placeholderremove')
1075
- .bind('keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove', function(e){
1076
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1077
- data.box.removeClass('placeholder-visible');
1078
- $(elem).unbind('.placeholderremove');
1079
- })
1080
- .bind('blur.placeholderremove', function(){
1081
- $(elem).unbind('.placeholderremove');
1082
- })
1083
- ;
1084
- return;
1085
- }
1086
- data.box.removeClass('placeholder-visible');
1087
- },
1088
- showPlaceholder = function(elem, data, placeholderTxt){
1089
- if(placeholderTxt === false){
1090
- placeholderTxt = $.prop(elem, 'placeholder');
1091
- }
1092
-
1093
- if(!isOver && elem.type != 'password'){
1094
- elem.value = placeholderTxt;
1095
- }
1096
- data.box.addClass('placeholder-visible');
1097
- },
1098
- changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
1099
- if(!data){
1100
- data = $.data(elem, 'placeHolder');
1101
- if(!data){return;}
1102
- }
1103
- $(elem).unbind('.placeholderremove');
1104
- if(type == 'focus' || (!type && $(elem).is(':focus'))){
1105
- if(elem.type == 'password' || isOver || $(elem).hasClass('placeholder-visible')){
1106
- hidePlaceholder(elem, data, '', true);
1107
- }
1108
- return;
1109
- }
1110
- if(value === false){
1111
- value = $.prop(elem, 'value');
1112
- }
1113
- if(value){
1114
- hidePlaceholder(elem, data, value);
1115
- return;
1116
- }
1117
- if(placeholderTxt === false){
1118
- placeholderTxt = $.attr(elem, 'placeholder') || '';
1119
- }
1120
- if(placeholderTxt && !value){
1121
- showPlaceholder(elem, data, placeholderTxt);
1122
- } else {
1123
- hidePlaceholder(elem, data, value);
1124
- }
1125
- },
1126
- createPlaceholder = function(elem){
1127
- elem = $(elem);
1128
- var id = elem.prop('id'),
1129
- hasLabel = !!(elem.prop('title') || elem.attr('aria-labelledby'))
1130
- ;
1131
- if(!hasLabel && id){
1132
- hasLabel = !!( $('label[for="'+ id +'"]', elem[0].form)[0] );
1133
- }
1134
- if(!hasLabel){
1135
- if(!id){
1136
- id = $.webshims.getID(elem);
1137
- }
1138
- hasLabel = !!($('label #'+ id)[0]);
1139
- }
1140
- return $( hasLabel ? '<span class="placeholder-text"></span>' : '<label for="'+ id +'" class="placeholder-text"></label>');
1141
- },
1142
- pHolder = (function(){
1143
- var delReg = /\n|\r|\f|\t/g,
1144
- allowedPlaceholder = {
1145
- text: 1,
1146
- search: 1,
1147
- url: 1,
1148
- email: 1,
1149
- password: 1,
1150
- tel: 1
1151
- }
1152
- ;
1153
-
1154
- return {
1155
- create: function(elem){
1156
- var data = $.data(elem, 'placeHolder');
1157
- var form;
1158
- var responsiveElem;
1159
- if(data){return data;}
1160
- data = $.data(elem, 'placeHolder', {});
1161
-
1162
- $(elem).bind('focus.placeholder blur.placeholder', function(e){
1163
- changePlaceholderVisibility(this, false, false, data, e.type );
1164
- data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
1165
- });
1166
-
1167
- if((form = $.prop(elem, 'form'))){
1168
- $(form).bind('reset.placeholder', function(e){
1169
- setTimeout(function(){
1170
- changePlaceholderVisibility(elem, false, false, data, e.type );
1171
- }, 0);
1172
- });
1173
- }
1174
-
1175
- if(elem.type == 'password' || isOver){
1176
- data.text = createPlaceholder(elem);
1177
- if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1178
- responsiveElem = true;
1179
- data.box = data.text;
1180
- } else {
1181
- data.box = $(elem)
1182
- .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1183
- .parent()
1184
- ;
1185
- }
1186
- data.text
1187
- .insertAfter(elem)
1188
- .bind('mousedown.placeholder', function(){
1189
- changePlaceholderVisibility(this, false, false, data, 'focus');
1190
- try {
1191
- setTimeout(function(){
1192
- elem.focus();
1193
- }, 0);
1194
- } catch(e){}
1195
- return false;
1196
- })
1197
- ;
1198
-
1199
-
1200
- $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
1201
- var prop = $.css(elem, style);
1202
- if(data.text.css(style) != prop){
1203
- data.text.css(style, prop);
1204
- }
1205
- });
1206
- $.each(['Left', 'Top'], function(i, side){
1207
- var size = (parseInt($.css(elem, 'padding'+ side), 10) || 0) + Math.max((parseInt($.css(elem, 'margin'+ side), 10) || 0), 0) + (parseInt($.css(elem, 'border'+ side +'Width'), 10) || 0);
1208
- data.text.css('padding'+ side, size);
1209
- });
1210
-
1211
- $(elem)
1212
- .bind('updateshadowdom', function(){
1213
- var height, width;
1214
- if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
1215
- data.text
1216
- .css({
1217
- width: width,
1218
- height: height
1219
- })
1220
- .css($(elem).position())
1221
- ;
1222
- }
1223
- })
1224
- .triggerHandler('updateshadowdom')
1225
- ;
1226
-
1227
- } else {
1228
- var reset = function(e){
1229
- if($(elem).hasClass('placeholder-visible')){
1230
- hidePlaceholder(elem, data, '');
1231
- if(e && e.type == 'submit'){
1232
- setTimeout(function(){
1233
- if(e.isDefaultPrevented()){
1234
- changePlaceholderVisibility(elem, false, false, data );
1235
- }
1236
- }, 9);
1237
- }
1238
- }
1239
- };
1240
-
1241
- $(window).bind('beforeunload', reset);
1242
- data.box = $(elem);
1243
- if(form){
1244
- $(form).submit(reset);
1245
- }
1246
- }
1247
-
1248
- return data;
1249
- },
1250
- update: function(elem, val){
1251
- var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
1252
- if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
1253
- webshims.error('placeholder not allowed on input[type="'+type+'"]');
1254
- if(type == 'date'){
1255
- webshims.error('but you can use data-placeholder for input[type="date"]');
1256
- }
1257
- return;
1258
- }
1259
-
1260
-
1261
- var data = pHolder.create(elem);
1262
- if(data.text){
1263
- data.text.text(val);
1264
- }
1265
-
1266
- changePlaceholderVisibility(elem, false, val, data);
1267
- }
1268
- };
1269
- })()
1270
- ;
1271
-
1272
- $.webshims.publicMethods = {
1273
- pHolder: pHolder
1274
- };
1275
- polyfillElements.forEach(function(nodeName){
1276
- var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
1277
- attr: {
1278
- set: function(val){
1279
- var elem = this;
1280
- if(bustedTextarea){
1281
- webshims.data(elem, 'textareaPlaceholder', val);
1282
- elem.placeholder = '';
1283
- } else {
1284
- webshims.contentAttr(elem, 'placeholder', val);
1285
- }
1286
- pHolder.update(elem, val);
1287
- },
1288
- get: function(){
1289
- var ret = (bustedTextarea) ? webshims.data(this, 'textareaPlaceholder') : '';
1290
- return ret || webshims.contentAttr(this, 'placeholder');
1291
- }
1292
- },
1293
- reflect: true,
1294
- initAttr: true
1295
- });
1296
- });
1297
-
1298
-
1299
- polyfillElements.forEach(function(name){
1300
- var placeholderValueDesc = {};
1301
- var desc;
1302
- ['attr', 'prop'].forEach(function(propType){
1303
- placeholderValueDesc[propType] = {
1304
- set: function(val){
1305
- var elem = this;
1306
- var placeholder;
1307
- if(bustedTextarea){
1308
- placeholder = webshims.data(elem, 'textareaPlaceholder');
1309
- }
1310
- if(!placeholder){
1311
- placeholder = webshims.contentAttr(elem, 'placeholder');
1312
- }
1313
- $.removeData(elem, 'cachedValidity');
1314
- var ret = desc[propType]._supset.call(elem, val);
1315
- if(placeholder && 'value' in elem){
1316
- changePlaceholderVisibility(elem, val, placeholder);
1317
- }
1318
- return ret;
1319
- },
1320
- get: function(){
1321
- var elem = this;
1322
- return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
1323
- }
1324
- };
1325
- });
1326
- desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1327
- });
1328
-
1329
- })();
1330
-
1331
- (function(){
1332
- var doc = document;
1333
- if( 'value' in document.createElement('output') ){return;}
1334
-
1335
- webshims.defineNodeNameProperty('output', 'value', {
1336
- prop: {
1337
- set: function(value){
1338
- var setVal = $.data(this, 'outputShim');
1339
- if(!setVal){
1340
- setVal = outputCreate(this);
1341
- }
1342
- setVal(value);
1343
- },
1344
- get: function(){
1345
- return webshims.contentAttr(this, 'value') || $(this).text() || '';
1346
- }
1347
- }
1348
- });
1349
-
1350
-
1351
- webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
1352
- if(type == 'removeAttr'){return;}
1353
- var setVal = $.data(this, 'outputShim');
1354
- if(setVal){
1355
- setVal(value);
1356
- }
1357
- });
1358
-
1359
- var outputCreate = function(elem){
1360
- if(elem.getAttribute('aria-live')){return;}
1361
- elem = $(elem);
1362
- var value = (elem.text() || '').trim();
1363
- var id = elem.attr('id');
1364
- var htmlFor = elem.attr('for');
1365
- var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
1366
- var form = shim[0].form || doc;
1367
- var setValue = function(val){
1368
- shim[0].value = val;
1369
- val = shim[0].value;
1370
- elem.text(val);
1371
- webshims.contentAttr(elem[0], 'value', val);
1372
- };
1373
-
1374
- elem[0].defaultValue = value;
1375
- webshims.contentAttr(elem[0], 'value', value);
1376
-
1377
- elem.attr({'aria-live': 'polite'});
1378
- if(id){
1379
- shim.attr('id', id);
1380
- elem.attr('aria-labelledby', webshims.getID($('label[for="'+id+'"]', form)));
1381
- }
1382
- if(htmlFor){
1383
- id = webshims.getID(elem);
1384
- htmlFor.split(' ').forEach(function(control){
1385
- control = document.getElementById(control);
1386
- if(control){
1387
- control.setAttribute('aria-controls', id);
1388
- }
1389
- });
1390
- }
1391
- elem.data('outputShim', setValue );
1392
- shim.data('outputShim', setValue );
1393
- return setValue;
1394
- };
1395
-
1396
- webshims.addReady(function(context, contextElem){
1397
- $('output', context).add(contextElem.filter('output')).each(function(){
1398
- outputCreate(this);
1399
- });
1400
- });
1401
-
1402
- /*
1403
- * Implements input event in all browsers
1404
- */
1405
- (function(){
1406
- var noInputTriggerEvts = {updateInput: 1, input: 1},
1407
- noInputTypes = {
1408
- radio: 1,
1409
- checkbox: 1,
1410
- submit: 1,
1411
- button: 1,
1412
- image: 1,
1413
- reset: 1,
1414
- file: 1
1415
-
1416
- //pro forma
1417
- ,color: 1
1418
- //,range: 1
1419
- },
1420
- observe = function(input){
1421
- var timer,
1422
- lastVal = input.prop('value'),
1423
- trigger = function(e){
1424
- //input === null
1425
- if(!input){return;}
1426
- var newVal = input.prop('value');
1427
-
1428
- if(newVal !== lastVal){
1429
- lastVal = newVal;
1430
- if(!e || !noInputTriggerEvts[e.type]){
1431
- webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1432
- }
1433
- }
1434
- },
1435
- extraTimer,
1436
- extraTest = function(){
1437
- clearTimeout(extraTimer);
1438
- extraTimer = setTimeout(trigger, 9);
1439
- },
1440
- unbind = function(){
1441
- input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
1442
- clearInterval(timer);
1443
- setTimeout(function(){
1444
- trigger();
1445
- input = null;
1446
- }, 1);
1447
-
1448
- }
1449
- ;
1450
-
1451
- clearInterval(timer);
1452
- timer = setInterval(trigger, 99);
1453
- extraTest();
1454
- input.bind('keyup keypress keydown paste cut', extraTest).bind('focusout', unbind).bind('input updateInput change', trigger);
1455
- }
1456
- ;
1457
- if($.event.customEvent){
1458
- $.event.customEvent.updateInput = true;
1459
- }
1460
-
1461
- $(doc)
1462
- .bind('focusin', function(e){
1463
- if( e.target && e.target.type && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] ){
1464
- observe($(e.target));
1465
- }
1466
- })
1467
- ;
1468
- })();
1469
- })();
1470
-
1471
- }); //webshims.ready end
1472
- }//end formvalidation
1
+ if(!Modernizr.formvalidation || jQuery.webshims.bugs.bustedValidity){
2
+ jQuery.webshims.register('form-extend', function($, webshims, window, document){
3
+ "use strict";
4
+ webshims.inputTypes = webshims.inputTypes || {};
5
+ //some helper-functions
6
+ var cfg = webshims.cfg.forms;
7
+ var isSubmit;
8
+
9
+ var isNumber = function(string){
10
+ return (typeof string == 'number' || (string && string == string * 1));
11
+ },
12
+ typeModels = webshims.inputTypes,
13
+ checkTypes = {
14
+ radio: 1,
15
+ checkbox: 1
16
+ },
17
+ getType = function(elem){
18
+ return (elem.getAttribute('type') || elem.type || '').toLowerCase();
19
+ }
20
+ ;
21
+
22
+ //API to add new input types
23
+ webshims.addInputType = function(type, obj){
24
+ typeModels[type] = obj;
25
+ };
26
+
27
+ //contsrain-validation-api
28
+ var validityPrototype = {
29
+ customError: false,
30
+
31
+ typeMismatch: false,
32
+ rangeUnderflow: false,
33
+ rangeOverflow: false,
34
+ stepMismatch: false,
35
+ tooLong: false,
36
+ patternMismatch: false,
37
+ valueMissing: false,
38
+
39
+ valid: true
40
+ };
41
+
42
+ var isPlaceholderOptionSelected = function(select){
43
+ if(select.type == 'select-one' && select.size < 2){
44
+ var option = $('> option:first-child', select);
45
+ return !!option.prop('selected');
46
+ }
47
+ return false;
48
+ };
49
+
50
+ var validityRules = {
51
+ valueMissing: function(input, val, cache){
52
+ if(!input.prop('required')){return false;}
53
+ var ret = false;
54
+ if(!('type' in cache)){
55
+ cache.type = getType(input[0]);
56
+ }
57
+ if(cache.nodeName == 'select'){
58
+ ret = (!val && (input[0].selectedIndex < 0 || isPlaceholderOptionSelected(input[0]) ));
59
+ } else if(checkTypes[cache.type]){
60
+ ret = (cache.type == 'checkbox') ? !input.is(':checked') : !webshims.modules["form-core"].getGroupElements(input).filter(':checked')[0];
61
+ } else {
62
+ ret = !(val);
63
+ }
64
+ return ret;
65
+ },
66
+ tooLong: function(){
67
+ return false;
68
+ },
69
+ typeMismatch: function (input, val, cache){
70
+ if(val === '' || cache.nodeName == 'select'){return false;}
71
+ var ret = false;
72
+ if(!('type' in cache)){
73
+ cache.type = getType(input[0]);
74
+ }
75
+
76
+ if(typeModels[cache.type] && typeModels[cache.type].mismatch){
77
+ ret = typeModels[cache.type].mismatch(val, input);
78
+ } else if('validity' in input[0]){
79
+ ret = input[0].validity.typeMismatch;
80
+ }
81
+ return ret;
82
+ },
83
+ patternMismatch: function(input, val, cache) {
84
+ if(val === '' || cache.nodeName == 'select'){return false;}
85
+ var pattern = input.attr('pattern');
86
+ if(!pattern){return false;}
87
+ try {
88
+ pattern = new RegExp('^(?:' + pattern + ')$');
89
+ } catch(er){
90
+ webshims.error('invalid pattern value: "'+ pattern +'" | '+ er);
91
+ pattern = false;
92
+ }
93
+ if(!pattern){return false;}
94
+ return !(pattern.test(val));
95
+ }
96
+ }
97
+ ;
98
+
99
+ webshims.addValidityRule = function(type, fn){
100
+ validityRules[type] = fn;
101
+ };
102
+
103
+ $.event.special.invalid = {
104
+ add: function(){
105
+ $.event.special.invalid.setup.call(this.form || this);
106
+ },
107
+ setup: function(){
108
+ var form = this.form || this;
109
+ if( $.data(form, 'invalidEventShim') ){
110
+ form = null;
111
+ return;
112
+ }
113
+ $(form)
114
+ .data('invalidEventShim', true)
115
+ .on('submit', $.event.special.invalid.handler)
116
+ ;
117
+ webshims.moveToFirstEvent(form, 'submit');
118
+ if(webshims.bugs.bustedValidity && $.nodeName(form, 'form')){
119
+ (function(){
120
+ var noValidate = form.getAttribute('novalidate');
121
+ form.setAttribute('novalidate', 'novalidate');
122
+ webshims.data(form, 'bustedNoValidate', (noValidate == null) ? null : noValidate);
123
+ })();
124
+ }
125
+ form = null;
126
+ },
127
+ teardown: $.noop,
128
+ handler: function(e, d){
129
+
130
+ if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
131
+
132
+ isSubmit = true;
133
+ e.testedValidity = true;
134
+ var notValid = !($(e.target).checkValidity());
135
+ if(notValid){
136
+ e.stopImmediatePropagation();
137
+ isSubmit = false;
138
+ return false;
139
+ }
140
+ isSubmit = false;
141
+ }
142
+ };
143
+
144
+ var addSubmitBubbles = function(form){
145
+ if (!$.support.submitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
146
+
147
+ $.event.add( form, 'submit._submit', function( event ) {
148
+ event._submit_bubble = true;
149
+ });
150
+
151
+ form._submit_attached = true;
152
+ }
153
+ };
154
+ if(!$.support.submitBubbles && $.event.special.submit){
155
+ $.event.special.submit.setup = function() {
156
+ // Only need this for delegated form submit events
157
+ if ( $.nodeName( this, "form" ) ) {
158
+ return false;
159
+ }
160
+
161
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
162
+ $.event.add( this, "click._submit keypress._submit", function( e ) {
163
+ // Node name check avoids a VML-related crash in IE (#9807)
164
+ var elem = e.target,
165
+ form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
166
+ addSubmitBubbles(form);
167
+
168
+ });
169
+ // return undefined since we don't need an event listener
170
+ };
171
+ }
172
+
173
+ $.event.special.submit = $.event.special.submit || {setup: function(){return false;}};
174
+ var submitSetup = $.event.special.submit.setup;
175
+ $.extend($.event.special.submit, {
176
+ setup: function(){
177
+ if($.nodeName(this, 'form')){
178
+ $(this).on('invalid', $.noop);
179
+ } else {
180
+ $('form', this).on('invalid', $.noop);
181
+ }
182
+ return submitSetup.apply(this, arguments);
183
+ }
184
+ });
185
+
186
+ $(window).on('invalid', $.noop);
187
+
188
+
189
+ webshims.addInputType('email', {
190
+ mismatch: (function(){
191
+ //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
192
+ var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+-\/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
193
+ return function(val){
194
+ return !test.test(val);
195
+ };
196
+ })()
197
+ });
198
+
199
+ webshims.addInputType('url', {
200
+ mismatch: (function(){
201
+ //taken from scott gonzales
202
+ var test = cfg.urlReg || /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
203
+ return function(val){
204
+ return !test.test(val);
205
+ };
206
+ })()
207
+ });
208
+
209
+ webshims.defineNodeNameProperty('input', 'type', {
210
+ prop: {
211
+ get: function(){
212
+ var elem = this;
213
+ var type = (elem.getAttribute('type') || '').toLowerCase();
214
+ return (webshims.inputTypes[type]) ? type : elem.type;
215
+ }
216
+ }
217
+ });
218
+
219
+ // IDLs for constrain validation API
220
+ //ToDo: add object to this list
221
+ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
222
+ checkValidity: {
223
+ value: function(){return true;}
224
+ },
225
+ willValidate: {
226
+ value: false
227
+ },
228
+ setCustomValidity: {
229
+ value: $.noop
230
+ },
231
+ validity: {
232
+ writeable: false,
233
+ get: function(){
234
+ return $.extend({}, validityPrototype);
235
+ }
236
+ }
237
+ }, 'prop');
238
+
239
+ var baseCheckValidity = function(elem){
240
+ var e,
241
+ v = $.prop(elem, 'validity')
242
+ ;
243
+ if(v){
244
+ $.data(elem, 'cachedValidity', v);
245
+ } else {
246
+ return true;
247
+ }
248
+ if( !v.valid ){
249
+ e = $.Event('invalid');
250
+ var jElm = $(elem).trigger(e);
251
+ if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
252
+ webshims.validityAlert.showFor(jElm);
253
+ baseCheckValidity.unhandledInvalids = true;
254
+ }
255
+ }
256
+ $.removeData(elem, 'cachedValidity');
257
+ return v.valid;
258
+ };
259
+ var rsubmittable = /^(?:select|textarea|input)/i;
260
+ webshims.defineNodeNameProperty('form', 'checkValidity', {
261
+ prop: {
262
+ value: function(){
263
+
264
+ var ret = true,
265
+ elems = $($.prop(this, 'elements')).filter(function(){
266
+ if(!rsubmittable.test(this.nodeName)){return false;}
267
+ var shadowData = webshims.data(this, 'shadowData');
268
+ return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
269
+ })
270
+ ;
271
+
272
+ baseCheckValidity.unhandledInvalids = false;
273
+ for(var i = 0, len = elems.length; i < len; i++){
274
+ if( !baseCheckValidity(elems[i]) ){
275
+ ret = false;
276
+ }
277
+ }
278
+ return ret;
279
+ }
280
+ }
281
+ });
282
+
283
+ webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
284
+ checkValidity: {
285
+ value: function(){
286
+ baseCheckValidity.unhandledInvalids = false;
287
+ return baseCheckValidity($(this).getNativeElement()[0]);
288
+ }
289
+ },
290
+ setCustomValidity: {
291
+ value: function(error){
292
+ $.removeData(this, 'cachedValidity');
293
+ webshims.data(this, 'customvalidationMessage', ''+error);
294
+ }
295
+ },
296
+ willValidate: {
297
+ writeable: false,
298
+ get: (function(){
299
+ var types = {
300
+ button: 1,
301
+ reset: 1,
302
+ hidden: 1,
303
+ image: 1
304
+ }
305
+ ;
306
+ return function(){
307
+ var elem = $(this).getNativeElement()[0];
308
+ //elem.name && <- we don't use to make it easier for developers
309
+ return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
310
+ };
311
+ })()
312
+ },
313
+ validity: {
314
+ writeable: false,
315
+ get: function(){
316
+ var jElm = $(this).getNativeElement();
317
+ var elem = jElm[0];
318
+ var validityState = $.data(elem, 'cachedValidity');
319
+ if(validityState){
320
+ return validityState;
321
+ }
322
+ validityState = $.extend({}, validityPrototype);
323
+
324
+ if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
325
+ return validityState;
326
+ }
327
+ var val = jElm.val(),
328
+ cache = {nodeName: elem.nodeName.toLowerCase()}
329
+ ;
330
+
331
+ validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
332
+ if( validityState.customError ){
333
+ validityState.valid = false;
334
+ }
335
+
336
+ $.each(validityRules, function(rule, fn){
337
+ if (fn(jElm, val, cache)) {
338
+ validityState[rule] = true;
339
+ validityState.valid = false;
340
+ }
341
+ });
342
+ $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
343
+ jElm = null;
344
+ elem = null;
345
+ return validityState;
346
+ }
347
+ }
348
+ }, 'prop');
349
+
350
+ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
351
+ set: function(value){
352
+ $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
353
+ },
354
+ initAttr: (!$.browser.msie || webshims.browserVersion > 7)//only if we have aria-support
355
+ });
356
+
357
+ webshims.reflectProperties(['input'], ['pattern']);
358
+
359
+
360
+ if( !('maxLength' in document.createElement('textarea')) ){
361
+ var constrainMaxLength = (function(){
362
+ var timer;
363
+ var curLength = 0;
364
+ var lastElement = $([]);
365
+ var max = 1e9;
366
+ var constrainLength = function(){
367
+ var nowValue = lastElement.prop('value');
368
+ var nowLen = nowValue.length;
369
+ if(nowLen > curLength && nowLen > max){
370
+ nowLen = Math.max(curLength, max);
371
+ lastElement.prop('value', nowValue.substr(0, nowLen ));
372
+ }
373
+ curLength = nowLen;
374
+ };
375
+ var remove = function(){
376
+ clearTimeout(timer);
377
+ lastElement.unbind('.maxlengthconstraint');
378
+ };
379
+ return function(element, maxLength){
380
+ remove();
381
+ if(maxLength > -1){
382
+ max = maxLength;
383
+ curLength = $.prop(element, 'value').length;
384
+ lastElement = $(element);
385
+ lastElement.on({
386
+ 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
387
+ setTimeout(constrainLength, 0);
388
+ },
389
+ 'keyup.maxlengthconstraint': constrainLength,
390
+ 'blur.maxlengthconstraint': remove
391
+ });
392
+ timer = setInterval(constrainLength, 200);
393
+ }
394
+ };
395
+ })();
396
+
397
+ constrainMaxLength.update = function(element, maxLength){
398
+ if($(element).is(':focus')){
399
+ if(!maxLength){
400
+ maxLength = $.prop(element, 'maxlength');
401
+ }
402
+ constrainMaxLength(element, maxLength);
403
+ }
404
+ };
405
+
406
+ $(document).on('focusin', function(e){
407
+ var maxLength;
408
+ if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
409
+ constrainMaxLength(e.target, maxLength);
410
+ }
411
+ });
412
+
413
+ webshims.defineNodeNameProperty('textarea', 'maxlength', {
414
+ attr: {
415
+ set: function(val){
416
+ this.setAttribute('maxlength', ''+val);
417
+ constrainMaxLength.update(this);
418
+ },
419
+ get: function(){
420
+ var ret = this.getAttribute('maxlength');
421
+ return ret == null ? undefined : ret;
422
+ }
423
+ },
424
+ prop: {
425
+ set: function(val){
426
+ if(isNumber(val)){
427
+ if(val < 0){
428
+ throw('INDEX_SIZE_ERR');
429
+ }
430
+ val = parseInt(val, 10);
431
+ this.setAttribute('maxlength', val);
432
+ constrainMaxLength.update(this, val);
433
+ return;
434
+ }
435
+ this.setAttribute('maxlength', '0');
436
+ constrainMaxLength.update(this, 0);
437
+ },
438
+ get: function(){
439
+ var val = this.getAttribute('maxlength');
440
+ return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
441
+
442
+ }
443
+ }
444
+ });
445
+ webshims.defineNodeNameProperty('textarea', 'maxLength', {
446
+ prop: {
447
+ set: function(val){
448
+ $.prop(this, 'maxlength', val);
449
+ },
450
+ get: function(){
451
+ return $.prop(this, 'maxlength');
452
+ }
453
+ }
454
+ });
455
+ }
456
+
457
+
458
+
459
+ var submitterTypes = {submit: 1, button: 1, image: 1};
460
+ var formSubmitterDescriptors = {};
461
+ [
462
+ {
463
+ name: "enctype",
464
+ limitedTo: {
465
+ "application/x-www-form-urlencoded": 1,
466
+ "multipart/form-data": 1,
467
+ "text/plain": 1
468
+ },
469
+ defaultProp: "application/x-www-form-urlencoded",
470
+ proptype: "enum"
471
+ },
472
+ {
473
+ name: "method",
474
+ limitedTo: {
475
+ "get": 1,
476
+ "post": 1
477
+ },
478
+ defaultProp: "get",
479
+ proptype: "enum"
480
+ },
481
+ {
482
+ name: "action",
483
+ proptype: "url"
484
+ },
485
+ {
486
+ name: "target"
487
+ },
488
+ {
489
+ name: "novalidate",
490
+ propName: "noValidate",
491
+ proptype: "boolean"
492
+ }
493
+ ].forEach(function(desc){
494
+ var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){
495
+ return f.toUpperCase();
496
+ });
497
+ var attrName = 'form'+ desc.name;
498
+ var formName = desc.name;
499
+ var eventName = 'click.webshimssubmittermutate'+formName;
500
+
501
+ var changeSubmitter = function(){
502
+ var elem = this;
503
+ if( !('form' in elem) || !submitterTypes[elem.type] ){return;}
504
+ var form = $.prop(elem, 'form');
505
+ if(!form){return;}
506
+ var attr = $.attr(elem, attrName);
507
+ if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){
508
+
509
+ var oldAttr = $.attr(form, formName);
510
+
511
+ $.attr(form, formName, attr);
512
+ setTimeout(function(){
513
+ if(oldAttr != null){
514
+ $.attr(form, formName, oldAttr);
515
+ } else {
516
+ try {
517
+ $(form).removeAttr(formName);
518
+ } catch(er){
519
+ form.removeAttribute(formName);
520
+ }
521
+ }
522
+ }, 9);
523
+ }
524
+ };
525
+
526
+
527
+
528
+ switch(desc.proptype) {
529
+ case "url":
530
+ var urlForm = document.createElement('form');
531
+ formSubmitterDescriptors[propName] = {
532
+ prop: {
533
+ set: function(value){
534
+ $.attr(this, attrName, value);
535
+ },
536
+ get: function(){
537
+ var value = $.attr(this, attrName);
538
+ if(value == null){return '';}
539
+ urlForm.setAttribute('action', value);
540
+ return urlForm.action;
541
+ }
542
+ }
543
+ };
544
+ break;
545
+ case "boolean":
546
+ formSubmitterDescriptors[propName] = {
547
+ prop: {
548
+ set: function(val){
549
+ val = !!val;
550
+ if(val){
551
+ $.attr(this, 'formnovalidate', 'formnovalidate');
552
+ } else {
553
+ $(this).removeAttr('formnovalidate');
554
+ }
555
+ },
556
+ get: function(){
557
+ return $.attr(this, 'formnovalidate') != null;
558
+ }
559
+ }
560
+ };
561
+ break;
562
+ case "enum":
563
+ formSubmitterDescriptors[propName] = {
564
+ prop: {
565
+ set: function(value){
566
+ $.attr(this, attrName, value);
567
+ },
568
+ get: function(){
569
+ var value = $.attr(this, attrName);
570
+ return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value;
571
+ }
572
+ }
573
+ };
574
+ break;
575
+ default:
576
+ formSubmitterDescriptors[propName] = {
577
+ prop: {
578
+ set: function(value){
579
+ $.attr(this, attrName, value);
580
+ },
581
+ get: function(){
582
+ var value = $.attr(this, attrName);
583
+ return (value != null) ? value : "";
584
+ }
585
+ }
586
+ };
587
+ }
588
+
589
+
590
+ if(!formSubmitterDescriptors[attrName]){
591
+ formSubmitterDescriptors[attrName] = {};
592
+ }
593
+ formSubmitterDescriptors[attrName].attr = {
594
+ set: function(value){
595
+ formSubmitterDescriptors[attrName].attr._supset.call(this, value);
596
+ $(this).unbind(eventName).on(eventName, changeSubmitter);
597
+ },
598
+ get: function(){
599
+ return formSubmitterDescriptors[attrName].attr._supget.call(this);
600
+ }
601
+ };
602
+ formSubmitterDescriptors[attrName].initAttr = true;
603
+ formSubmitterDescriptors[attrName].removeAttr = {
604
+ value: function(){
605
+ $(this).unbind(eventName);
606
+ formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
607
+ }
608
+ };
609
+ });
610
+
611
+ webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
612
+
613
+
614
+ if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
615
+ webshims.defineNodeNameProperty('form', 'novalidate', {
616
+ attr: {
617
+ set: function(val){
618
+ this.setAttribute('novalidate', ''+val);
619
+ },
620
+ get: function(){
621
+ var ret = this.getAttribute('novalidate');
622
+ return ret == null ? undefined : ret;
623
+ }
624
+ }
625
+ });
626
+ } else if(webshims.bugs.bustedValidity){
627
+
628
+ webshims.defineNodeNameProperty('form', 'novalidate', {
629
+ attr: {
630
+ set: function(val){
631
+ webshims.data(this, 'bustedNoValidate', ''+val);
632
+ },
633
+ get: function(){
634
+ var ret = webshims.data(this, 'bustedNoValidate');
635
+ return ret == null ? undefined : ret;
636
+ }
637
+ },
638
+ removeAttr: {
639
+ value: function(){
640
+ webshims.data(this, 'bustedNoValidate', null);
641
+ }
642
+ }
643
+ });
644
+
645
+ $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){
646
+ validityRules[name] = function(elem){
647
+ return (elem[0].validity || {})[name] || false;
648
+ };
649
+ });
650
+
651
+ }
652
+
653
+ webshims.defineNodeNameProperty('form', 'noValidate', {
654
+ prop: {
655
+ set: function(val){
656
+ val = !!val;
657
+ if(val){
658
+ $.attr(this, 'novalidate', 'novalidate');
659
+ } else {
660
+ $(this).removeAttr('novalidate');
661
+ }
662
+ },
663
+ get: function(){
664
+ return $.attr(this, 'novalidate') != null;
665
+ }
666
+ }
667
+ });
668
+
669
+ if($.browser.webkit && Modernizr.inputtypes.date){
670
+ (function(){
671
+
672
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
673
+ fixInputTypes = {
674
+ date: 1,
675
+ time: 1,
676
+ "datetime-local": 1
677
+ },
678
+ noFocusEvents = {
679
+ focusout: 1,
680
+ blur: 1
681
+ },
682
+ changeEvts = {
683
+ updateInput: 1,
684
+ change: 1
685
+ },
686
+ observe = function(input){
687
+ var timer,
688
+ focusedin = true,
689
+ lastInputVal = input.prop('value'),
690
+ lastChangeVal = lastInputVal,
691
+ trigger = function(e){
692
+ //input === null
693
+ if(!input){return;}
694
+ var newVal = input.prop('value');
695
+
696
+ if(newVal !== lastInputVal){
697
+ lastInputVal = newVal;
698
+ if(!e || !noInputTriggerEvts[e.type]){
699
+ input.trigger('input');
700
+ }
701
+ }
702
+ if(e && changeEvts[e.type]){
703
+ lastChangeVal = newVal;
704
+ }
705
+ if(!focusedin && newVal !== lastChangeVal){
706
+ input.trigger('change');
707
+ }
708
+ },
709
+ extraTimer,
710
+ extraTest = function(){
711
+ clearTimeout(extraTimer);
712
+ extraTimer = setTimeout(trigger, 9);
713
+ },
714
+ unbind = function(e){
715
+ clearInterval(timer);
716
+ setTimeout(function(){
717
+ if(e && noFocusEvents[e.type]){
718
+ focusedin = false;
719
+ }
720
+ if(input){
721
+ input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
722
+ trigger();
723
+ }
724
+ input = null;
725
+ }, 1);
726
+
727
+ }
728
+ ;
729
+
730
+ clearInterval(timer);
731
+ timer = setInterval(trigger, 160);
732
+ extraTest();
733
+ input
734
+ .off({
735
+ 'focusout blur': unbind,
736
+ 'input change updateInput': trigger
737
+ })
738
+ .on({
739
+ 'focusout blur': unbind,
740
+ 'input updateInput change': trigger
741
+ })
742
+ ;
743
+ }
744
+ ;
745
+ if($.event.customEvent){
746
+ $.event.customEvent.updateInput = true;
747
+ }
748
+
749
+ (function(){
750
+
751
+ var correctValue = function(elem){
752
+ var i = 1;
753
+ var len = 3;
754
+ var abort, val;
755
+ if(elem.type == 'date' && (isSubmit || !$(elem).is(':focus'))){
756
+ val = elem.value;
757
+ if(val && val.length < 10 && (val = val.split('-')) && val.length == len){
758
+ for(; i < len; i++){
759
+ if(val[i].length == 1){
760
+ val[i] = '0'+val[i];
761
+ } else if(val[i].length != 2){
762
+ abort = true;
763
+ break;
764
+ }
765
+ }
766
+ if(!abort){
767
+ val = val.join('-');
768
+ $.prop(elem, 'value', val);
769
+ return val;
770
+ }
771
+ }
772
+ }
773
+ };
774
+ var inputCheckValidityDesc, formCheckValidityDesc, inputValueDesc, inputValidityDesc;
775
+
776
+ inputCheckValidityDesc = webshims.defineNodeNameProperty('input', 'checkValidity', {
777
+ prop: {
778
+ value: function(){
779
+ correctValue(this);
780
+ return inputCheckValidityDesc.prop._supvalue.apply(this, arguments);
781
+ }
782
+ }
783
+ });
784
+
785
+ formCheckValidityDesc = webshims.defineNodeNameProperty('form', 'checkValidity', {
786
+ prop: {
787
+ value: function(){
788
+ $('input', this).each(function(){
789
+ correctValue(this);
790
+ });
791
+ return formCheckValidityDesc.prop._supvalue.apply(this, arguments);
792
+ }
793
+ }
794
+ });
795
+
796
+ inputValueDesc = webshims.defineNodeNameProperty('input', 'value', {
797
+ prop: {
798
+ set: function(){
799
+ return inputValueDesc.prop._supset.apply(this, arguments);
800
+ },
801
+ get: function(){
802
+ return correctValue(this) || inputValueDesc.prop._supget.apply(this, arguments);
803
+ }
804
+ }
805
+ });
806
+
807
+ inputValidityDesc = webshims.defineNodeNameProperty('input', 'validity', {
808
+ prop: {
809
+ writeable: false,
810
+ get: function(){
811
+ correctValue(this);
812
+ return inputValidityDesc.prop._supget.apply(this, arguments);
813
+ }
814
+ }
815
+ });
816
+
817
+ $(document).on('change', function(e){
818
+ isChangeSubmit = true;
819
+ correctValue(e.target);
820
+ isChangeSubmit = false;
821
+ });
822
+
823
+ })();
824
+
825
+ $(document)
826
+ .on('focusin', function(e){
827
+ if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){
828
+ observe($(e.target));
829
+ }
830
+ })
831
+ ;
832
+
833
+
834
+ })();
835
+ }
836
+
837
+ webshims.addReady(function(context, contextElem){
838
+ //start constrain-validation
839
+ var focusElem;
840
+ $('form', context)
841
+ .add(contextElem.filter('form'))
842
+ .bind('invalid', $.noop)
843
+ ;
844
+
845
+ try {
846
+ if(context == document && !('form' in (document.activeElement || {}))) {
847
+ focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
848
+ if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
849
+ focusElem.focus();
850
+ }
851
+ }
852
+ }
853
+ catch (er) {}
854
+
855
+ });
856
+
857
+ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){
858
+ (function(){
859
+ (function(prop, undefined){
860
+ $.prop = function(elem, name, value){
861
+ var ret;
862
+ if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
863
+ ret = document.getElementsByName(name);
864
+ if(!ret || !ret.length){
865
+ ret = document.getElementById(name);
866
+ }
867
+ if(ret){
868
+ ret = $(ret).filter(function(){
869
+ return $.prop(this, 'form') == elem;
870
+ }).get();
871
+ if(ret.length){
872
+ return ret.length == 1 ? ret[0] : ret;
873
+ }
874
+ }
875
+ }
876
+ return prop.apply(this, arguments);
877
+ };
878
+ })($.prop, undefined);
879
+ var removeAddedElements = function(form){
880
+ var elements = $.data(form, 'webshimsAddedElements');
881
+ if(elements){
882
+ elements.remove();
883
+ $.removeData(form, 'webshimsAddedElements');
884
+ }
885
+ };
886
+ var rCRLF = /\r?\n/g,
887
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
888
+ rselectTextarea = /^(?:select|textarea)/i;
889
+
890
+ if(!Modernizr.formattribute){
891
+ webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
892
+ prop: {
893
+ get: function(){
894
+ var form = webshims.contentAttr(this, 'form');
895
+ if(form){
896
+ form = document.getElementById(form);
897
+ if(form && !$.nodeName(form, 'form')){
898
+ form = null;
899
+ }
900
+ }
901
+ return form || this.form;
902
+ },
903
+ writeable: false
904
+ }
905
+ });
906
+
907
+
908
+ webshims.defineNodeNamesProperty(['form'], 'elements', {
909
+ prop: {
910
+ get: function(){
911
+ var id = this.id;
912
+ var elements = $.makeArray(this.elements);
913
+ if(id){
914
+ elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
915
+ }
916
+ return elements;
917
+ },
918
+ writeable: false
919
+ }
920
+ });
921
+
922
+
923
+
924
+ $(function(){
925
+ var stopPropagation = function(e){
926
+ e.stopPropagation();
927
+ };
928
+ $(document).on('submit', function(e){
929
+
930
+ if(!e.isDefaultPrevented()){
931
+ var form = e.target;
932
+ var id = form.id;
933
+ var elements;
934
+
935
+
936
+ if(id){
937
+ removeAddedElements(form);
938
+
939
+ elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
940
+ .filter(function(){
941
+ return !this.disabled && this.name && this.form != form;
942
+ })
943
+ .clone()
944
+ ;
945
+ if(elements.length){
946
+ $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
947
+ setTimeout(function(){
948
+ removeAddedElements(form);
949
+ }, 9);
950
+ }
951
+ elements = null;
952
+ }
953
+ }
954
+ });
955
+
956
+ $(document).on('click', function(e){
957
+ if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){
958
+ var trueForm = $.prop(e.target, 'form');
959
+ var formIn = e.target.form;
960
+ var clone;
961
+ if(trueForm && trueForm != formIn){
962
+ clone = $(e.target)
963
+ .clone()
964
+ .removeAttr('form')
965
+ .addClass('webshims-visual-hide')
966
+ .on('click', stopPropagation)
967
+ .appendTo(trueForm)
968
+ ;
969
+ if(formIn){
970
+ e.preventDefault();
971
+ }
972
+ addSubmitBubbles(trueForm);
973
+ clone.trigger('click');
974
+ setTimeout(function(){
975
+ clone.remove();
976
+ clone = null;
977
+ }, 9);
978
+ }
979
+ }
980
+ });
981
+ });
982
+ }
983
+
984
+ if(!Modernizr.fieldsetdisabled){
985
+ webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
986
+ prop: {
987
+ get: function(){
988
+ //add listed elements without keygen, object, output
989
+ return $('input, select, textarea, button, fieldset', this).get() || [];
990
+ },
991
+ writeable: false
992
+ }
993
+ });
994
+ }
995
+
996
+ $.fn.serializeArray = function() {
997
+ return this.map(function(){
998
+ var elements = $.prop(this, 'elements');
999
+ return elements ? $.makeArray( elements ) : this;
1000
+ })
1001
+ .filter(function(){
1002
+ return this.name && !this.disabled &&
1003
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
1004
+ rinput.test( this.type ) );
1005
+ })
1006
+ .map(function( i, elem ){
1007
+ var val = $( this ).val();
1008
+
1009
+ return val == null ?
1010
+ null :
1011
+ $.isArray( val ) ?
1012
+ $.map( val, function( val, i ){
1013
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1014
+ }) :
1015
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1016
+ }).get();
1017
+ };
1018
+
1019
+ })();
1020
+ }
1021
+
1022
+ try {
1023
+ document.querySelector(':checked');
1024
+ } catch(er){
1025
+ (function(){
1026
+ var checkInputs = {
1027
+ radio: 1,
1028
+ checkbox: 1
1029
+ };
1030
+ var selectChange = function(){
1031
+ var options = this.options || [];
1032
+ var i, len, option;
1033
+ for(i = 0, len = options.length; i < len; i++){
1034
+ option = $(options[i]);
1035
+ option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
1036
+ }
1037
+ };
1038
+ var checkChange = function(){
1039
+ var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
1040
+ var className = this.className || '';
1041
+ var parent;
1042
+
1043
+ //IE8- has problems to update styles, we help
1044
+ if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
1045
+ $(this)[fn]('prop-checked');
1046
+ if((parent = this.parentNode)){
1047
+ parent.className = parent.className;
1048
+ }
1049
+ }
1050
+ };
1051
+
1052
+
1053
+ webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
1054
+ webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
1055
+ webshims.onNodeNamesPropertyModify('option', 'selected', function(){
1056
+ $(this).closest('select').each(selectChange);
1057
+ });
1058
+ webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
1059
+ var type = this.type;
1060
+ if(type == 'radio' && boolVal){
1061
+ webshims.modules["form-core"].getGroupElements(this).each(checkChange);
1062
+ } else if(checkInputs[type]) {
1063
+ $(this).each(checkChange);
1064
+ }
1065
+ });
1066
+
1067
+ $(document).on('change', function(e){
1068
+
1069
+ if(checkInputs[e.target.type]){
1070
+ if(e.target.type == 'radio'){
1071
+ webshims.modules["form-core"].getGroupElements(e.target).each(checkChange);
1072
+ } else {
1073
+ $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
1074
+ }
1075
+ } else if(e.target.nodeName.toLowerCase() == 'select'){
1076
+ $(e.target).each(selectChange);
1077
+ }
1078
+ });
1079
+
1080
+ webshims.addReady(function(context, contextElem){
1081
+ $('option, input', context)
1082
+ .add(contextElem.filter('option, input'))
1083
+ .each(function(){
1084
+ var prop;
1085
+ if(checkInputs[this.type]){
1086
+ prop = 'checked';
1087
+ } else if(this.nodeName.toLowerCase() == 'option'){
1088
+ prop = 'selected';
1089
+ }
1090
+ if(prop){
1091
+ $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
1092
+ }
1093
+
1094
+ })
1095
+ ;
1096
+ });
1097
+ })();
1098
+ }
1099
+
1100
+ (function(){
1101
+ Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
1102
+ var bustedTextarea = $.browser.webkit && Modernizr.textareaPlaceholder && webshims.browserVersion < 535;
1103
+ if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedTextarea){return;}
1104
+
1105
+ var isOver = (webshims.cfg.forms.placeholderType == 'over');
1106
+ var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
1107
+ var polyfillElements = ['textarea'];
1108
+ if(!Modernizr.input.placeholder){
1109
+ polyfillElements.push('input');
1110
+ }
1111
+
1112
+ var setSelection = function(elem){
1113
+ try {
1114
+ if(elem.setSelectionRange){
1115
+ elem.setSelectionRange(0, 0);
1116
+ return true;
1117
+ } else if(elem.createTextRange){
1118
+ var range = elem.createTextRange();
1119
+ range.collapse(true);
1120
+ range.moveEnd('character', 0);
1121
+ range.moveStart('character', 0);
1122
+ range.select();
1123
+ return true;
1124
+ }
1125
+ } catch(er){}
1126
+ };
1127
+
1128
+ var hidePlaceholder = function(elem, data, value, _onFocus){
1129
+ if(value === false){
1130
+ value = $.prop(elem, 'value');
1131
+ }
1132
+ if(!isOver && elem.type != 'password'){
1133
+ if(!value && _onFocus && setSelection(elem)){
1134
+ var selectTimer = setTimeout(function(){
1135
+ setSelection(elem);
1136
+ }, 9);
1137
+ $(elem)
1138
+ .off('.placeholderremove')
1139
+ .on({
1140
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1141
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1142
+ elem.value = $.prop(elem, 'value');
1143
+ data.box.removeClass('placeholder-visible');
1144
+ clearTimeout(selectTimer);
1145
+ $(elem).unbind('.placeholderremove');
1146
+ },
1147
+ 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
1148
+ setSelection(elem);
1149
+ clearTimeout(selectTimer);
1150
+ selectTimer = setTimeout(function(){
1151
+ setSelection(elem);
1152
+ }, 9);
1153
+ },
1154
+ 'blur.placeholderremove': function(){
1155
+ clearTimeout(selectTimer);
1156
+ $(elem).unbind('.placeholderremove');
1157
+ }
1158
+ })
1159
+ ;
1160
+ return;
1161
+ }
1162
+ elem.value = value;
1163
+ } else if(!value && _onFocus){
1164
+ $(elem)
1165
+ .off('.placeholderremove')
1166
+ .on({
1167
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1168
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1169
+ data.box.removeClass('placeholder-visible');
1170
+ $(elem).unbind('.placeholderremove');
1171
+ },
1172
+ 'blur.placeholderremove': function(){
1173
+ $(elem).unbind('.placeholderremove');
1174
+ }
1175
+ })
1176
+ ;
1177
+ return;
1178
+ }
1179
+ data.box.removeClass('placeholder-visible');
1180
+ },
1181
+ showPlaceholder = function(elem, data, placeholderTxt){
1182
+ if(placeholderTxt === false){
1183
+ placeholderTxt = $.prop(elem, 'placeholder');
1184
+ }
1185
+
1186
+ if(!isOver && elem.type != 'password'){
1187
+ elem.value = placeholderTxt;
1188
+ }
1189
+ data.box.addClass('placeholder-visible');
1190
+ },
1191
+ changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
1192
+ if(!data){
1193
+ data = $.data(elem, 'placeHolder');
1194
+ if(!data){return;}
1195
+ }
1196
+ $(elem).unbind('.placeholderremove');
1197
+ if(type == 'focus' || (!type && $(elem).is(':focus'))){
1198
+ if(elem.type == 'password' || isOver || $(elem).hasClass('placeholder-visible')){
1199
+ hidePlaceholder(elem, data, '', true);
1200
+ }
1201
+ return;
1202
+ }
1203
+ if(value === false){
1204
+ value = $.prop(elem, 'value');
1205
+ }
1206
+ if(value){
1207
+ hidePlaceholder(elem, data, value);
1208
+ return;
1209
+ }
1210
+ if(placeholderTxt === false){
1211
+ placeholderTxt = $.attr(elem, 'placeholder') || '';
1212
+ }
1213
+ if(placeholderTxt && !value){
1214
+ showPlaceholder(elem, data, placeholderTxt);
1215
+ } else {
1216
+ hidePlaceholder(elem, data, value);
1217
+ }
1218
+ },
1219
+ createPlaceholder = function(elem){
1220
+ elem = $(elem);
1221
+ var id = elem.prop('id'),
1222
+ hasLabel = !!(elem.prop('title') || elem.attr('aria-labelledby'))
1223
+ ;
1224
+ if(!hasLabel && id){
1225
+ hasLabel = !!( $('label[for="'+ id +'"]', elem[0].form)[0] );
1226
+ }
1227
+ if(!hasLabel){
1228
+ if(!id){
1229
+ id = $.webshims.getID(elem);
1230
+ }
1231
+ hasLabel = !!($('label #'+ id)[0]);
1232
+ }
1233
+ return $( hasLabel ? '<span class="placeholder-text"></span>' : '<label for="'+ id +'" class="placeholder-text"></label>');
1234
+ },
1235
+ pHolder = (function(){
1236
+ var delReg = /\n|\r|\f|\t/g,
1237
+ allowedPlaceholder = {
1238
+ text: 1,
1239
+ search: 1,
1240
+ url: 1,
1241
+ email: 1,
1242
+ password: 1,
1243
+ tel: 1
1244
+ }
1245
+ ;
1246
+
1247
+ return {
1248
+ create: function(elem){
1249
+ var data = $.data(elem, 'placeHolder');
1250
+ var form;
1251
+ var responsiveElem;
1252
+ if(data){return data;}
1253
+ data = $.data(elem, 'placeHolder', {});
1254
+
1255
+ $(elem).on('focus.placeholder blur.placeholder', function(e){
1256
+ changePlaceholderVisibility(this, false, false, data, e.type );
1257
+ data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
1258
+ });
1259
+
1260
+ if((form = $.prop(elem, 'form'))){
1261
+ $(form).on('reset.placeholder', function(e){
1262
+ setTimeout(function(){
1263
+ changePlaceholderVisibility(elem, false, false, data, e.type );
1264
+ }, 0);
1265
+ });
1266
+ }
1267
+
1268
+ if(elem.type == 'password' || isOver){
1269
+ data.text = createPlaceholder(elem);
1270
+ if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1271
+ responsiveElem = true;
1272
+ data.box = data.text;
1273
+ } else {
1274
+ data.box = $(elem)
1275
+ .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1276
+ .parent()
1277
+ ;
1278
+ }
1279
+ data.text
1280
+ .insertAfter(elem)
1281
+ .on('mousedown.placeholder', function(){
1282
+ changePlaceholderVisibility(this, false, false, data, 'focus');
1283
+ try {
1284
+ setTimeout(function(){
1285
+ elem.focus();
1286
+ }, 0);
1287
+ } catch(e){}
1288
+ return false;
1289
+ })
1290
+ ;
1291
+
1292
+
1293
+ $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
1294
+ var prop = $.css(elem, style);
1295
+ if(data.text.css(style) != prop){
1296
+ data.text.css(style, prop);
1297
+ }
1298
+ });
1299
+ $.each(['Left', 'Top'], function(i, side){
1300
+ var size = (parseInt($.css(elem, 'padding'+ side), 10) || 0) + Math.max((parseInt($.css(elem, 'margin'+ side), 10) || 0), 0) + (parseInt($.css(elem, 'border'+ side +'Width'), 10) || 0);
1301
+ data.text.css('padding'+ side, size);
1302
+ });
1303
+
1304
+ $(elem)
1305
+ .on('updateshadowdom', function(){
1306
+ var height, width;
1307
+ if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
1308
+ data.text
1309
+ .css({
1310
+ width: width,
1311
+ height: height
1312
+ })
1313
+ .css($(elem).position())
1314
+ ;
1315
+ }
1316
+ })
1317
+ .triggerHandler('updateshadowdom')
1318
+ ;
1319
+
1320
+ } else {
1321
+ var reset = function(e){
1322
+ if($(elem).hasClass('placeholder-visible')){
1323
+ hidePlaceholder(elem, data, '');
1324
+ if(e && e.type == 'submit'){
1325
+ setTimeout(function(){
1326
+ if(e.isDefaultPrevented()){
1327
+ changePlaceholderVisibility(elem, false, false, data );
1328
+ }
1329
+ }, 9);
1330
+ }
1331
+ }
1332
+ };
1333
+
1334
+ $(window).on('beforeunload', reset);
1335
+ data.box = $(elem);
1336
+ if(form){
1337
+ $(form).submit(reset);
1338
+ }
1339
+ }
1340
+
1341
+ return data;
1342
+ },
1343
+ update: function(elem, val){
1344
+ var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
1345
+ if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
1346
+ webshims.error('placeholder not allowed on input[type="'+type+'"]');
1347
+ if(type == 'date'){
1348
+ webshims.error('but you can use data-placeholder for input[type="date"]');
1349
+ }
1350
+ return;
1351
+ }
1352
+
1353
+
1354
+ var data = pHolder.create(elem);
1355
+ if(data.text){
1356
+ data.text.text(val);
1357
+ }
1358
+
1359
+ changePlaceholderVisibility(elem, false, val, data);
1360
+ }
1361
+ };
1362
+ })()
1363
+ ;
1364
+
1365
+ $.webshims.publicMethods = {
1366
+ pHolder: pHolder
1367
+ };
1368
+ polyfillElements.forEach(function(nodeName){
1369
+ var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
1370
+ attr: {
1371
+ set: function(val){
1372
+ var elem = this;
1373
+ if(bustedTextarea){
1374
+ webshims.data(elem, 'textareaPlaceholder', val);
1375
+ elem.placeholder = '';
1376
+ } else {
1377
+ webshims.contentAttr(elem, 'placeholder', val);
1378
+ }
1379
+ pHolder.update(elem, val);
1380
+ },
1381
+ get: function(){
1382
+ var ret = (bustedTextarea) ? webshims.data(this, 'textareaPlaceholder') : '';
1383
+ return ret || webshims.contentAttr(this, 'placeholder');
1384
+ }
1385
+ },
1386
+ reflect: true,
1387
+ initAttr: true
1388
+ });
1389
+ });
1390
+
1391
+
1392
+ polyfillElements.forEach(function(name){
1393
+ var placeholderValueDesc = {};
1394
+ var desc;
1395
+ ['attr', 'prop'].forEach(function(propType){
1396
+ placeholderValueDesc[propType] = {
1397
+ set: function(val){
1398
+ var elem = this;
1399
+ var placeholder;
1400
+ if(bustedTextarea){
1401
+ placeholder = webshims.data(elem, 'textareaPlaceholder');
1402
+ }
1403
+ if(!placeholder){
1404
+ placeholder = webshims.contentAttr(elem, 'placeholder');
1405
+ }
1406
+ $.removeData(elem, 'cachedValidity');
1407
+ var ret = desc[propType]._supset.call(elem, val);
1408
+ if(placeholder && 'value' in elem){
1409
+ changePlaceholderVisibility(elem, val, placeholder);
1410
+ }
1411
+ return ret;
1412
+ },
1413
+ get: function(){
1414
+ var elem = this;
1415
+ return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
1416
+ }
1417
+ };
1418
+ });
1419
+ desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1420
+ });
1421
+
1422
+ })();
1423
+
1424
+ (function(){
1425
+ var doc = document;
1426
+ if( 'value' in document.createElement('output') ){return;}
1427
+
1428
+ webshims.defineNodeNameProperty('output', 'value', {
1429
+ prop: {
1430
+ set: function(value){
1431
+ var setVal = $.data(this, 'outputShim');
1432
+ if(!setVal){
1433
+ setVal = outputCreate(this);
1434
+ }
1435
+ setVal(value);
1436
+ },
1437
+ get: function(){
1438
+ return webshims.contentAttr(this, 'value') || $(this).text() || '';
1439
+ }
1440
+ }
1441
+ });
1442
+
1443
+
1444
+ webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
1445
+ if(type == 'removeAttr'){return;}
1446
+ var setVal = $.data(this, 'outputShim');
1447
+ if(setVal){
1448
+ setVal(value);
1449
+ }
1450
+ });
1451
+
1452
+ var outputCreate = function(elem){
1453
+ if(elem.getAttribute('aria-live')){return;}
1454
+ elem = $(elem);
1455
+ var value = (elem.text() || '').trim();
1456
+ var id = elem.attr('id');
1457
+ var htmlFor = elem.attr('for');
1458
+ var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
1459
+ var form = shim[0].form || doc;
1460
+ var setValue = function(val){
1461
+ shim[0].value = val;
1462
+ val = shim[0].value;
1463
+ elem.text(val);
1464
+ webshims.contentAttr(elem[0], 'value', val);
1465
+ };
1466
+
1467
+ elem[0].defaultValue = value;
1468
+ webshims.contentAttr(elem[0], 'value', value);
1469
+
1470
+ elem.attr({'aria-live': 'polite'});
1471
+ if(id){
1472
+ shim.attr('id', id);
1473
+ elem.attr('aria-labelledby', webshims.getID($('label[for="'+id+'"]', form)));
1474
+ }
1475
+ if(htmlFor){
1476
+ id = webshims.getID(elem);
1477
+ htmlFor.split(' ').forEach(function(control){
1478
+ control = document.getElementById(control);
1479
+ if(control){
1480
+ control.setAttribute('aria-controls', id);
1481
+ }
1482
+ });
1483
+ }
1484
+ elem.data('outputShim', setValue );
1485
+ shim.data('outputShim', setValue );
1486
+ return setValue;
1487
+ };
1488
+
1489
+ webshims.addReady(function(context, contextElem){
1490
+ $('output', context).add(contextElem.filter('output')).each(function(){
1491
+ outputCreate(this);
1492
+ });
1493
+ });
1494
+
1495
+ /*
1496
+ * Implements input event in all browsers
1497
+ */
1498
+ (function(){
1499
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
1500
+ noInputTypes = {
1501
+ radio: 1,
1502
+ checkbox: 1,
1503
+ submit: 1,
1504
+ button: 1,
1505
+ image: 1,
1506
+ reset: 1,
1507
+ file: 1
1508
+
1509
+ //pro forma
1510
+ ,color: 1
1511
+ //,range: 1
1512
+ },
1513
+ observe = function(input){
1514
+ var timer,
1515
+ lastVal = input.prop('value'),
1516
+ trigger = function(e){
1517
+ //input === null
1518
+ if(!input){return;}
1519
+ var newVal = input.prop('value');
1520
+
1521
+ if(newVal !== lastVal){
1522
+ lastVal = newVal;
1523
+ if(!e || !noInputTriggerEvts[e.type]){
1524
+ webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1525
+ }
1526
+ }
1527
+ },
1528
+ extraTimer,
1529
+ extraTest = function(){
1530
+ clearTimeout(extraTimer);
1531
+ extraTimer = setTimeout(trigger, 9);
1532
+ },
1533
+ unbind = function(){
1534
+ input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
1535
+ clearInterval(timer);
1536
+ setTimeout(function(){
1537
+ trigger();
1538
+ input = null;
1539
+ }, 1);
1540
+
1541
+ }
1542
+ ;
1543
+
1544
+ clearInterval(timer);
1545
+ timer = setInterval(trigger, 99);
1546
+ extraTest();
1547
+ input.on({
1548
+ 'keyup keypress keydown paste cut': extraTest,
1549
+ focusout: unbind,
1550
+ 'input updateInput change': trigger
1551
+ });
1552
+ }
1553
+ ;
1554
+ if($.event.customEvent){
1555
+ $.event.customEvent.updateInput = true;
1556
+ }
1557
+
1558
+ $(doc)
1559
+ .on('focusin', function(e){
1560
+ if( e.target && e.target.type && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] ){
1561
+ observe($(e.target));
1562
+ }
1563
+ })
1564
+ ;
1565
+ })();
1566
+ })();
1567
+
1568
+ }); //webshims.ready end
1569
+ }//end formvalidation