webshims-rails 1.12.5 → 1.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +111 -132
  4. data/vendor/assets/javascripts/webshims/shims/combos/1.js +40 -37
  5. data/vendor/assets/javascripts/webshims/shims/combos/10.js +217 -36
  6. data/vendor/assets/javascripts/webshims/shims/combos/11.js +151 -29
  7. data/vendor/assets/javascripts/webshims/shims/combos/12.js +70 -93
  8. data/vendor/assets/javascripts/webshims/shims/combos/13.js +70 -93
  9. data/vendor/assets/javascripts/webshims/shims/combos/14.js +90 -13
  10. data/vendor/assets/javascripts/webshims/shims/combos/15.js +202 -59
  11. data/vendor/assets/javascripts/webshims/shims/combos/16.js +208 -70
  12. data/vendor/assets/javascripts/webshims/shims/combos/17.js +151 -29
  13. data/vendor/assets/javascripts/webshims/shims/combos/18.js +155 -30
  14. data/vendor/assets/javascripts/webshims/shims/combos/19.js +79 -20
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +109 -47
  16. data/vendor/assets/javascripts/webshims/shims/combos/20.js +79 -20
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +80 -87
  18. data/vendor/assets/javascripts/webshims/shims/combos/22.js +66 -83
  19. data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -10
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +79 -20
  21. data/vendor/assets/javascripts/webshims/shims/combos/26.js +66 -7
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +100 -25
  23. data/vendor/assets/javascripts/webshims/shims/combos/3.js +192 -47
  24. data/vendor/assets/javascripts/webshims/shims/combos/30.js +193 -49
  25. data/vendor/assets/javascripts/webshims/shims/combos/31.js +103 -36
  26. data/vendor/assets/javascripts/webshims/shims/combos/32.js +5 -3
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +1 -2
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +2048 -0
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +156 -20
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +151 -29
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +152 -31
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +199 -60
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +197 -58
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +218 -38
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +1004 -0
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +1283 -0
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +204 -1248
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +66 -7
  39. data/vendor/assets/javascripts/webshims/shims/es5.js +4 -1
  40. data/vendor/assets/javascripts/webshims/shims/form-combat.js +3 -3
  41. data/vendor/assets/javascripts/webshims/shims/form-core.js +36 -27
  42. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +1 -2
  43. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +137 -0
  44. data/vendor/assets/javascripts/webshims/shims/form-message.js +90 -13
  45. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +129 -15
  46. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +9 -10
  47. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +886 -985
  48. data/vendor/assets/javascripts/webshims/shims/form-validation.js +78 -174
  49. data/vendor/assets/javascripts/webshims/shims/form-validators.js +39 -26
  50. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +45 -17
  51. data/vendor/assets/javascripts/webshims/shims/geolocation.js +10 -3
  52. data/vendor/assets/javascripts/webshims/shims/jme/b.js +71 -246
  53. data/vendor/assets/javascripts/webshims/shims/jme/c.js +133 -1002
  54. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +62 -23
  55. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +73 -10
  56. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +1117 -0
  57. data/vendor/assets/javascripts/webshims/shims/jme/p.js +603 -0
  58. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +5 -2
  59. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -10
  60. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -1
  61. data/vendor/assets/javascripts/webshims/shims/range-ui.js +22 -14
  62. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +29 -344
  63. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +362 -0
  64. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +6 -483
  65. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +488 -0
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +2 -0
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +10 -2
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +6 -2
  69. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  70. data/vendor/assets/javascripts/webshims/shims/track-ui.js +8 -1
  71. data/vendor/assets/javascripts/webshims/shims/track.js +66 -83
  72. metadata +12 -5
  73. data/vendor/assets/javascripts/webshims/shims/$ajax.js +0 -862
  74. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2087
@@ -207,6 +207,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
207
207
  options.addZero = addZero;
208
208
  webshims.loader.addModule('forms-picker', {
209
209
  noAutoCallback: true,
210
+ css: 'styles/forms-picker.css',
210
211
  options: options
211
212
  });
212
213
  webshims.loader.addModule('color-picker', {
@@ -379,8 +380,40 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
379
380
 
380
381
 
381
382
  var formatVal = {
382
- number: function(val, o){
383
- return (val+'').replace(/\,/g, '').replace(/\./, curCfg.numberFormat['.']);
383
+ number: function(val, o, noCorrect){
384
+ var parts, len, i, isNegative;
385
+ if(o && o.nogrouping){
386
+ return (val+'').replace(/\,/g, '').replace(/\./, curCfg.numberFormat['.']);
387
+ }
388
+
389
+ val += '';
390
+
391
+ if(val.charAt(0) == '-'){
392
+ isNegative = true;
393
+ val = val.replace('-', '');
394
+ }
395
+ parts = val.split('.');
396
+ len = parts[0].length;
397
+ i = len - 1;
398
+
399
+ val = "";
400
+ while(i >= 0) {
401
+ val = parts[0].charAt(i) + val;
402
+ if (i > 0 && (len - i) % 3 === 0) {
403
+ val = curCfg.numberFormat[','] + val;
404
+ }
405
+ --i;
406
+ }
407
+ if(parts[1] != null){
408
+ if(!noCorrect){
409
+ parts[1] = parts[1].replace(/\-/g, '0');
410
+ }
411
+ val += curCfg.numberFormat['.'] + parts[1];
412
+ }
413
+ if(isNegative){
414
+ val = '-'+val;
415
+ }
416
+ return val;
384
417
  },
385
418
  time: function(val){
386
419
  var fVal;
@@ -459,10 +492,10 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
459
492
  return ret;
460
493
  }
461
494
  };
462
-
495
+
463
496
  var parseVal = {
464
497
  number: function(val){
465
- return (val+'').replace(curCfg.numberFormat[','], '').replace(curCfg.numberFormat['.'], '.');
498
+ return (val+'').split(curCfg.numberFormat[',']).join('').replace(curCfg.numberFormat['.'], '.');
466
499
  },
467
500
  // week: function(val){
468
501
  // return val;
@@ -531,7 +564,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
531
564
  val = val.split(curCfg.dFormat);
532
565
  }
533
566
  if(val.length == 3 && val[0] && val[1] && val[2] && (!noCorrect || (val[obj.yy].length > 3 && val[obj.mm].length == 2 && val[obj.dd].length == 2))){
534
- if(val[obj.mm] > 12 && val[obj.dd] < 13){
567
+ if(!opts.noDayMonthSwitch && val[obj.mm] > 12 && val[obj.dd] < 13){
535
568
  tmp = val[obj.dd];
536
569
  val[obj.dd] = val[obj.mm];
537
570
  val[obj.mm] = tmp;
@@ -964,7 +997,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
964
997
  },
965
998
  toFixed: function(val, force){
966
999
  var o = this.options;
967
- if(o.toFixed && o.type == 'number' && val && this.valueAsNumber && (force || !this.element.is(':focus')) && (!o.fixOnlyFloat || (this.valueAsNumber % 1)) && !$(this.orig).is(':invalid')){
1000
+ if(o.toFixed && o.type == 'number' && val && !isNaN(this.valueAsNumber) && (force || !this.element.is(':focus')) && (!o.fixOnlyFloat || (this.valueAsNumber % 1))){
968
1001
  val = formatVal[this.type](this.valueAsNumber.toFixed(o.toFixed), this.options);
969
1002
  }
970
1003
  return val;
@@ -973,7 +1006,8 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
973
1006
 
974
1007
  ['defaultValue', 'value'].forEach(function(name){
975
1008
  var isValue = name == 'value';
976
- spinBtnProto[name] = function(val, force){
1009
+ spinBtnProto[name] = function(val, force, isLive){
1010
+ var selectionEnd;
977
1011
  if(!this._init || force || this.options[name] !== val){
978
1012
  if(isValue){
979
1013
  this._beforeValue(val);
@@ -992,7 +1026,14 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
992
1026
  }
993
1027
  });
994
1028
  } else {
995
- this.element.prop(name, this.toFixed(val));
1029
+ val = this.toFixed(val);
1030
+ if(isLive && this._getSelectionEnd){
1031
+ selectionEnd = this._getSelectionEnd(val);
1032
+ }
1033
+ this.element.prop(name, val);
1034
+ if(selectionEnd){
1035
+ this.element.prop('selectionEnd', selectionEnd);
1036
+ }
996
1037
  }
997
1038
  this._propertyChange(name);
998
1039
  this.mirrorValidity();
@@ -1020,7 +1061,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1020
1061
  $.fn.wsBaseWidget = function(opts){
1021
1062
  opts = $.extend({}, opts);
1022
1063
  return this.each(function(){
1023
- $.webshims.objectCreate(wsWidgetProto, {
1064
+ webshims.objectCreate(wsWidgetProto, {
1024
1065
  element: {
1025
1066
  value: $(this)
1026
1067
  }
@@ -1035,7 +1076,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1035
1076
  monthNames: 'monthNamesShort'
1036
1077
  }, opts);
1037
1078
  return this.each(function(){
1038
- $.webshims.objectCreate(spinBtnProto, {
1079
+ webshims.objectCreate(spinBtnProto, {
1039
1080
  element: {
1040
1081
  value: $(this)
1041
1082
  }
@@ -1044,12 +1085,80 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1044
1085
  };
1045
1086
 
1046
1087
  $.fn.spinbtnUI.wsProto = spinBtnProto;
1088
+
1089
+ webshims._format = formatVal;
1047
1090
 
1048
1091
  })();
1049
-
1092
+
1093
+
1094
+ $.fn.wsTouchClick = (function(){
1095
+ var supportsTouchaction = ('touchAction' in document.documentElement.style);
1096
+ var addTouch = !supportsTouchaction && ('ontouchstart' in window) && document.addEventListener;
1097
+ return function(target, handler){
1098
+ var touchData, touchEnd, touchStart;
1099
+
1100
+ if(addTouch){
1101
+
1102
+ touchEnd = function(e){
1103
+ var ret, touch;
1104
+ e = e.originalEvent || {};
1105
+ $(this).off('touchend', touchEnd);
1106
+ var changedTouches = e.changedTouches || e.touches;
1107
+ if(!touchData || !changedTouches || changedTouches.length != 1){
1108
+ return;
1109
+ }
1110
+
1111
+ touch = changedTouches[0];
1112
+ if(Math.abs(touchData.x - touch.pageX) > 40 || Math.abs(touchData.y - touch.pageY) > 40 || Date.now() - touchData.now > 600){
1113
+ return;
1114
+ }
1115
+ e.preventDefault();
1116
+ ret = handler.apply(this, arguments);
1117
+
1118
+ return ret;
1119
+ };
1120
+
1121
+ touchStart = function(e){
1122
+ var touch, elemTarget;
1123
+
1124
+
1125
+ if((!e || e.touches.length != 1)){
1126
+ return;
1127
+ }
1128
+ touch = e.touches[0];
1129
+ elemTarget = target ? $(touch.target).closest(target) : $(this);
1130
+ if(!elemTarget.length){
1131
+ return;
1132
+ }
1133
+ touchData = {
1134
+ x: touch.pageX,
1135
+ y: touch.pageY,
1136
+ now: Date.now()
1137
+ };
1138
+ elemTarget.on('touchend', touchEnd);
1139
+ };
1140
+
1141
+ this.each(function(){
1142
+ this.addEventListener('touchstart', touchStart, true);
1143
+ });
1144
+ } else if(supportsTouchaction){
1145
+ this.css('touch-action', 'manipulation');
1146
+ }
1147
+
1148
+ if($.isFunction(target)){
1149
+ handler = target;
1150
+ target = false;
1151
+ this.on('click', handler);
1152
+ } else {
1153
+ this.on('click', target, handler);
1154
+ }
1155
+ return this;
1156
+ };
1157
+ })();
1158
+
1050
1159
  (function(){
1051
1160
  var picker = {};
1052
-
1161
+ var assumeVirtualKeyBoard = Modernizr.touchevents || Modernizr.touch || (/android|iphone|ipad|ipod|blackberry|iemobile/i.test(navigator.userAgent.toLowerCase()));
1053
1162
  webshims.inlinePopover = {
1054
1163
  _create: function(){
1055
1164
  this.element = $('<div class="ws-inline-picker"><div class="ws-po-box" /></div>').data('wspopover', this);
@@ -1140,7 +1249,11 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1140
1249
  cancel: function(val, popover, data){
1141
1250
  if(!data.options.inlinePicker){
1142
1251
  popover.stopOpen = true;
1143
- data.element.getShadowFocusElement().trigger('focus');
1252
+ if(assumeVirtualKeyBoard){
1253
+ $('button', data.buttonWrapper).trigger('focus');
1254
+ } else {
1255
+ data.element.getShadowFocusElement().trigger('focus');
1256
+ }
1144
1257
  setTimeout(function(){
1145
1258
  popover.stopOpen = false;
1146
1259
  }, 9);
@@ -1231,6 +1344,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1231
1344
 
1232
1345
 
1233
1346
  picker._common = function(data){
1347
+ if(data.options.nopicker){return;}
1234
1348
  var options = data.options;
1235
1349
  var popover = webshims.objectCreate(options.inlinePicker ? webshims.inlinePopover : webshims.wsPopover, {}, $.extend(options.popover || {}, {prepareFor: options.inlinePicker ? data.buttonWrapper : data.element}));
1236
1350
  var opener = $('<button type="button" class="ws-popover-opener"><span /></button>').appendTo(data.buttonWrapper);
@@ -1300,7 +1414,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1300
1414
  }
1301
1415
 
1302
1416
 
1303
- opener.on({click: open});
1417
+ opener.wsTouchClick(open);
1304
1418
 
1305
1419
  if(options.inlinePicker){
1306
1420
  popover.openedByFocus = true;
@@ -1493,7 +1607,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document,
1493
1607
  var init, parent, lastWidth, left, right, isRtl, hasButtons;
1494
1608
  var oriStyleO = data.orig.style;
1495
1609
  var styleO = data.element[0].style;
1496
- if($.support.boxSizing == null && !$.isReady){
1610
+ if($.support.boxSizing == null){
1497
1611
  $(function(){
1498
1612
  parent = data.orig.parentNode;
1499
1613
  });
@@ -30,8 +30,8 @@ var isNumber = function(string){
30
30
  (function(){
31
31
  var find = $.find;
32
32
  var matchesSelector = $.find.matchesSelector;
33
-
34
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
33
+
34
+ var regExp = /(\:valid|\:invalid|\:optional|\:required)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
35
35
  var regFn = function(sel){
36
36
  return sel + '-element';
37
37
  };
@@ -392,14 +392,13 @@ var rsubmittable = /^(?:select|textarea|input)/i;
392
392
  if(validityState){
393
393
  return validityState;
394
394
  }
395
- validityState = $.extend({}, validityPrototype);
395
+ validityState = $.extend({}, validityPrototype);
396
396
 
397
397
  if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
398
398
  return validityState;
399
399
  }
400
- var val = jElm.val(),
401
- cache = {nodeName: elem.nodeName.toLowerCase()}
402
- ;
400
+ var val = jElm.val();
401
+ var cache = {nodeName: elem.nodeName.toLowerCase()};
403
402
 
404
403
  validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
405
404
  if( validityState.customError ){
@@ -426,7 +425,7 @@ var rsubmittable = /^(?:select|textarea|input)/i;
426
425
  baseCheckValidity.unhandledInvalids = false;
427
426
  return baseCheckValidity($(this).getNativeElement()[0], name);
428
427
  }
429
- }
428
+ };
430
429
  });
431
430
 
432
431
  webshims.defineNodeNameProperties(nodeName, inputValidationAPI, 'prop');
@@ -437,7 +436,7 @@ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'requir
437
436
  set: function(value){
438
437
  $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
439
438
  },
440
- initAttr: Modernizr.localstorage //only if we have aria-support
439
+ initAttr: true
441
440
  });
442
441
  webshims.defineNodeNamesBooleanProperty(['input'], 'multiple');
443
442
 
@@ -604,7 +603,7 @@ webshims.addReady(function(context, contextElem){
604
603
 
605
604
  try {
606
605
  if(context == document && !('form' in (document.activeElement || {}))) {
607
- focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
606
+ focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0];
608
607
  if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
609
608
  focusElem.focus();
610
609
  }
@@ -625,7 +624,7 @@ if(!Modernizr.input.list){
625
624
  if(select[0]){
626
625
  options = $.makeArray(select[0].options || []);
627
626
  } else {
628
- options = $('option', elem).get();
627
+ options = elem.getElementsByTagName('option');
629
628
  if(options.length){
630
629
  webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
631
630
  }
@@ -1,455 +1,438 @@
1
1
  webshims.register('form-shim-extend2', function($, webshims, window, document, undefined, options){
2
- "use strict";
3
- var emptyJ = $([]);
4
- var isNumber = function(string){
5
- return (typeof string == 'number' || (string && string == string * 1));
6
- };
7
- var getGroupElements = function(elem){
8
- elem = $(elem);
9
- var name;
10
- var form;
11
- var ret = emptyJ;
12
- if(elem[0].type == 'radio'){
13
- form = elem.prop('form');
14
- name = elem[0].name;
15
- if(!name){
16
- ret = elem;
17
- } else if(form){
18
- ret = $(form[name]);
19
- } else {
20
- ret = $(document.getElementsByName(name)).filter(function(){
21
- return !$.prop(this, 'form');
22
- });
23
- }
24
- ret = ret.filter('[type="radio"]');
25
- }
26
- return ret;
27
- };
2
+ "use strict";
3
+ var isNumber = function(string){
4
+ return (typeof string == 'number' || (string && string == string * 1));
5
+ };
6
+
28
7
  //support getSetAttribute
29
- var supportGetSetAttribute = !(('getSetAttribute' in $.support) && !$.support.getSetAttribute);
8
+ var supportGetSetAttribute = !(('getSetAttribute' in $.support) && !$.support.getSetAttribute);
30
9
  //submitbubbles for IE6-IE8
31
- var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
32
- var addSubmitBubbles = function(form){
33
- if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
34
-
35
- $.event.add( form, 'submit._submit', function( event ) {
36
- event._submit_bubble = true;
37
- });
38
-
39
- form._submit_attached = true;
40
- }
41
- };
42
- if(!supportSubmitBubbles && $.event.special.submit){
43
-
44
- $.event.special.submit.setup = function() {
45
- // Only need this for delegated form submit events
46
- if ( $.nodeName( this, "form" ) ) {
47
- return false;
48
- }
10
+ var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
11
+ var addSubmitBubbles = function(form){
12
+ if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
49
13
 
50
- // Lazy-add a submit handler when a descendant form may potentially be submitted
51
- $.event.add( this, "click._submit keypress._submit", function( e ) {
52
- // Node name check avoids a VML-related crash in IE (#9807)
53
- var elem = e.target,
54
- form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
55
- addSubmitBubbles(form);
56
-
57
- });
58
- // return undefined since we don't need an event listener
59
- };
60
- }
14
+ $.event.add( form, 'submit._submit', function( event ) {
15
+ event._submit_bubble = true;
16
+ });
61
17
 
18
+ form._submit_attached = true;
19
+ }
20
+ };
21
+ if(!supportSubmitBubbles && $.event.special.submit){
62
22
 
23
+ $.event.special.submit.setup = function() {
24
+ // Only need this for delegated form submit events
25
+ if ( $.nodeName( this, "form" ) ) {
26
+ return false;
27
+ }
63
28
 
64
- webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
65
- set: function(value){
66
- $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
67
- },
68
- initAttr: true
69
- });
29
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
30
+ $.event.add( this, "click._submit keypress._submit", function( e ) {
31
+ // Node name check avoids a VML-related crash in IE (#9807)
32
+ var elem = e.target,
33
+ form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
34
+ addSubmitBubbles(form);
70
35
 
71
- webshims.reflectProperties(['input'], ['pattern']);
72
-
73
-
74
- if( !('maxLength' in document.createElement('textarea')) ){
75
- var constrainMaxLength = (function(){
76
- var timer;
77
- var curLength = 0;
78
- var lastElement = $([]);
79
- var max = 1e9;
80
- var constrainLength = function(){
81
- var nowValue = lastElement.prop('value');
82
- var nowLen = nowValue.length;
83
- if(nowLen > curLength && nowLen > max){
84
- nowLen = Math.max(curLength, max);
85
- lastElement.prop('value', nowValue.substr(0, nowLen ));
86
- }
87
- curLength = nowLen;
88
- };
89
- var remove = function(){
90
- clearTimeout(timer);
91
- lastElement.off('.maxlengthconstraint');
36
+ });
37
+ // return undefined since we don't need an event listener
92
38
  };
93
- return function(element, maxLength){
94
- remove();
95
- if(maxLength > -1){
96
- max = maxLength;
97
- curLength = $.prop(element, 'value').length;
98
- lastElement = $(element);
99
- lastElement.on({
100
- 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
101
- setTimeout(constrainLength, 0);
102
- },
103
- 'keyup.maxlengthconstraint': constrainLength,
104
- 'blur.maxlengthconstraint': remove
105
- });
106
- timer = setInterval(constrainLength, 200);
39
+ }
40
+
41
+ webshims.reflectProperties(['input'], ['pattern']);
42
+
43
+
44
+ if( !('maxLength' in document.createElement('textarea')) ){
45
+ var constrainMaxLength = (function(){
46
+ var timer;
47
+ var curLength = 0;
48
+ var lastElement = $([]);
49
+ var max = 1e9;
50
+ var constrainLength = function(){
51
+ var nowValue = lastElement.prop('value');
52
+ var nowLen = nowValue.length;
53
+ if(nowLen > curLength && nowLen > max){
54
+ nowLen = Math.max(curLength, max);
55
+ lastElement.prop('value', nowValue.substr(0, nowLen ));
56
+ }
57
+ curLength = nowLen;
58
+ };
59
+ var remove = function(){
60
+ clearTimeout(timer);
61
+ lastElement.off('.maxlengthconstraint');
62
+ };
63
+ return function(element, maxLength){
64
+ remove();
65
+ if(maxLength > -1){
66
+ max = maxLength;
67
+ curLength = $.prop(element, 'value').length;
68
+ lastElement = $(element);
69
+ lastElement.on({
70
+ 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
71
+ setTimeout(constrainLength, 0);
72
+ },
73
+ 'keyup.maxlengthconstraint': constrainLength,
74
+ 'blur.maxlengthconstraint': remove
75
+ });
76
+ timer = setInterval(constrainLength, 200);
77
+ }
78
+ };
79
+ })();
80
+
81
+ constrainMaxLength.update = function(element, maxLength){
82
+ if($(element).is(':focus')){
83
+ if(!maxLength){
84
+ maxLength = $.prop(element, 'maxlength');
85
+ }
86
+ constrainMaxLength(element, maxLength);
107
87
  }
108
88
  };
109
- })();
110
-
111
- constrainMaxLength.update = function(element, maxLength){
112
- if($(element).is(':focus')){
113
- if(!maxLength){
114
- maxLength = $.prop(element, 'maxlength');
89
+
90
+ $(document).on('focusin', function(e){
91
+ var maxLength;
92
+ if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
93
+ constrainMaxLength(e.target, maxLength);
115
94
  }
116
- constrainMaxLength(element, maxLength);
117
- }
118
- };
119
-
120
- $(document).on('focusin', function(e){
121
- var maxLength;
122
- if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
123
- constrainMaxLength(e.target, maxLength);
124
- }
125
- });
126
-
127
- webshims.defineNodeNameProperty('textarea', 'maxlength', {
128
- attr: {
129
- set: function(val){
130
- this.setAttribute('maxlength', ''+val);
131
- constrainMaxLength.update(this);
95
+ });
96
+
97
+ webshims.defineNodeNameProperty('textarea', 'maxlength', {
98
+ attr: {
99
+ set: function(val){
100
+ this.setAttribute('maxlength', ''+val);
101
+ constrainMaxLength.update(this);
102
+ },
103
+ get: function(){
104
+ var ret = this.getAttribute('maxlength');
105
+ return ret == null ? undefined : ret;
106
+ }
132
107
  },
133
- get: function(){
134
- var ret = this.getAttribute('maxlength');
135
- return ret == null ? undefined : ret;
136
- }
137
- },
138
- prop: {
139
- set: function(val){
140
- if(isNumber(val)){
141
- if(val < 0){
142
- throw('INDEX_SIZE_ERR');
108
+ prop: {
109
+ set: function(val){
110
+ if(isNumber(val)){
111
+ if(val < 0){
112
+ throw('INDEX_SIZE_ERR');
113
+ }
114
+ val = parseInt(val, 10);
115
+ this.setAttribute('maxlength', val);
116
+ constrainMaxLength.update(this, val);
117
+ return;
143
118
  }
144
- val = parseInt(val, 10);
145
- this.setAttribute('maxlength', val);
146
- constrainMaxLength.update(this, val);
147
- return;
119
+ this.setAttribute('maxlength', '0');
120
+ constrainMaxLength.update(this, 0);
121
+ },
122
+ get: function(){
123
+ var val = this.getAttribute('maxlength');
124
+ return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
125
+
148
126
  }
149
- this.setAttribute('maxlength', '0');
150
- constrainMaxLength.update(this, 0);
151
- },
152
- get: function(){
153
- var val = this.getAttribute('maxlength');
154
- return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
155
-
156
- }
157
- }
158
- });
159
- webshims.defineNodeNameProperty('textarea', 'maxLength', {
160
- prop: {
161
- set: function(val){
162
- $.prop(this, 'maxlength', val);
163
- },
164
- get: function(){
165
- return $.prop(this, 'maxlength');
166
127
  }
167
- }
168
- });
169
- }
170
-
171
- if(!supportGetSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
172
- webshims.defineNodeNameProperty('form', 'novalidate', {
173
- attr: {
174
- set: function(val){
175
- this.setAttribute('novalidate', ''+val);
176
- },
177
- get: function(){
178
- var ret = this.getAttribute('novalidate');
179
- return ret == null ? undefined : ret;
128
+ });
129
+ webshims.defineNodeNameProperty('textarea', 'maxLength', {
130
+ prop: {
131
+ set: function(val){
132
+ $.prop(this, 'maxlength', val);
133
+ },
134
+ get: function(){
135
+ return $.prop(this, 'maxlength');
136
+ }
180
137
  }
181
- }
182
- });
183
- }
184
-
138
+ });
139
+ }
185
140
 
186
- if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldsetelements){
187
- (function(){
188
- if(!Modernizr.fieldsetdisabled){
189
- var isFieldsetGroup = /^(?:fieldset)$/i;
190
- var disableElementsSel = 'input, textarea, select, button';
191
- $.extend($.expr[":"], {
192
- "enabled": function( elem ) {
193
- return elem.disabled === false || (isFieldsetGroup.test(elem.nodeName) && webshims.contentAttr(elem, 'disabled') == null && !$(elem).is('fieldset[disabled] *')) ;
141
+ if(!supportGetSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
142
+ webshims.defineNodeNameProperty('form', 'novalidate', {
143
+ attr: {
144
+ set: function(val){
145
+ this.setAttribute('novalidate', ''+val);
194
146
  },
195
-
196
- "disabled": function( elem ) {
197
- return elem.disabled === true || (isFieldsetGroup.test(elem.nodeName) && (webshims.contentAttr(elem, 'disabled') != null || $(elem).is('fieldset[disabled] *')));
147
+ get: function(){
148
+ var ret = this.getAttribute('novalidate');
149
+ return ret == null ? undefined : ret;
198
150
  }
199
- });
200
-
201
-
202
- var groupControl = {
203
- getElements: function(group){
204
- $(disableElementsSel, group).each(groupControl.disable);
205
- },
206
- disable: function(){
207
- if(!this.disabled){
208
- webshims.data(this, 'groupedisabled', true);
209
- this.disabled = true;
210
- }
211
- },
212
- enable: function(){
213
- if(this.disabled && webshims.data(this, 'groupedisabled')){
214
- webshims.data(this, 'groupedisabled', false);
215
- this.disabled = false;
151
+ }
152
+ });
153
+ }
154
+
155
+
156
+ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldsetelements){
157
+ (function(){
158
+ if(!Modernizr.fieldsetdisabled){
159
+ var isFieldsetGroup = {
160
+ fieldset: 1,
161
+ FIELDSET: 1
162
+ };
163
+ var disableElementsSel = 'input, textarea, select, button';
164
+ $.extend($.expr[":"], {
165
+ "enabled": function( elem ) {
166
+ return elem.disabled === false || (isFieldsetGroup[elem.nodeName] && webshims.contentAttr(elem, 'disabled') == null && !$(elem).is('fieldset[disabled] *')) ;
167
+ },
168
+
169
+ "disabled": function( elem ) {
170
+ return elem.disabled === true || (isFieldsetGroup[elem.nodeName] && (webshims.contentAttr(elem, 'disabled') != null || $(elem).is('fieldset[disabled] *')));
216
171
  }
217
- }
218
- };
219
-
220
- $(window).on('unload', function(){
221
- $(disableElementsSel).each(groupControl.enable);
222
- });
223
-
224
- webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', {
225
- set: function(value){
226
-
227
- if(value){
228
- $(disableElementsSel, this).each(groupControl.disable);
229
- } else if(!$(this).is('fieldset[disabled] *')){
230
- var nested = $('fieldset[disabled]', this);
231
- var elements = $(disableElementsSel, this);
232
-
233
- if(nested.length){
234
- elements = elements.not('fieldset[disabled] *');
172
+ });
173
+
174
+
175
+ var groupControl = {
176
+ disable: function(){
177
+ if(!this.disabled){
178
+ webshims.data(this, 'groupedisabled', true);
179
+ this.disabled = true;
180
+ }
181
+ },
182
+ enable: function(){
183
+ if(this.disabled && webshims.data(this, 'groupedisabled')){
184
+ webshims.data(this, 'groupedisabled', false);
185
+ this.disabled = false;
235
186
  }
236
-
237
- elements.each(groupControl.enable);
238
187
  }
239
- },
240
- initAttr: true,
241
- useContentAttribute: true
242
- });
243
-
244
- ['input', 'textarea', 'select', 'button'].forEach(function(nodeName){
245
- var desc = webshims.defineNodeNameProperty(nodeName, 'disabled', {
246
- prop: {
247
- set: function(value){
248
- if(value){
249
- webshims.data(this, 'groupedisabled', false);
250
- desc.prop._supset.call(this, value);
251
- } else if($(this).is('fieldset[disabled] *')){
252
- webshims.data(this, 'groupedisabled', true);
253
- desc.prop._supset.call(this, true);
254
- } else {
255
- webshims.data(this, 'groupedisabled', false);
256
- desc.prop._supset.call(this, value);
188
+ };
189
+
190
+ $(window).on('unload', function(){
191
+ $(disableElementsSel).each(groupControl.enable);
192
+ });
193
+
194
+ webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', {
195
+ set: function(value){
196
+ value = !!value;
197
+
198
+ if(value){
199
+ $(disableElementsSel, this).each(groupControl.disable);
200
+ } else if(!$(this).is('fieldset[disabled] *')){
201
+ var elements = $(this.querySelectorAll(disableElementsSel));
202
+
203
+ if( this.querySelector('fieldset[disabled]') ){
204
+ elements = elements.not('fieldset[disabled] *');
257
205
  }
258
- },
259
- get: function(){
260
- var ret = desc.prop._supget.call(this);
261
- return ret ? !webshims.data(this, 'groupedisabled') : ret;
206
+
207
+ elements.each(groupControl.enable);
262
208
  }
263
209
  },
264
- removeAttr: {
265
- value: function(){
266
- desc.prop.set.call(this, false);
267
- }
268
- }
210
+ initAttr: true,
211
+ useContentAttribute: true
269
212
  });
270
- });
271
-
272
- webshims.addReady(function(context){
273
-
274
- $(context)
275
- .filter('fieldset[disabled], fieldset[disabled] *')
276
- .find(disableElementsSel)
277
- .each(groupControl.disable)
278
- ;
279
- });
280
- }
281
-
282
-
283
- if(!Modernizr.formattribute){
284
- (function(prop, undefined){
285
- $.prop = function(elem, name, value){
286
- var ret;
287
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
288
- ret = document.getElementsByName(name);
289
- if(!ret || !ret.length){
290
- ret = document.getElementById(name);
213
+
214
+ ['input', 'textarea', 'select', 'button'].forEach(function(nodeName){
215
+ var desc = webshims.defineNodeNameProperty(nodeName, 'disabled', {
216
+ prop: {
217
+ set: function(value){
218
+ if(value){
219
+ webshims.data(this, 'groupedisabled', false);
220
+ desc.prop._supset.call(this, value);
221
+ } else if($(this).is('fieldset[disabled] *')){
222
+ webshims.data(this, 'groupedisabled', true);
223
+ desc.prop._supset.call(this, true);
224
+ } else {
225
+ webshims.data(this, 'groupedisabled', false);
226
+ desc.prop._supset.call(this, value);
227
+ }
228
+ },
229
+ get: function(){
230
+ var ret = desc.prop._supget.call(this);
231
+ return ret ? !webshims.data(this, 'groupedisabled') : ret;
232
+ }
233
+ },
234
+ removeAttr: {
235
+ value: function(){
236
+ desc.prop.set.call(this, false);
237
+ }
291
238
  }
292
- if(ret){
293
- ret = $(ret).filter(function(){
294
- return $.prop(this, 'form') == elem;
295
- }).get();
296
- if(ret.length){
297
- return ret.length == 1 ? ret[0] : ret;
239
+ });
240
+ });
241
+
242
+ webshims.addReady(function(context){
243
+
244
+ $(context)
245
+ .filter('fieldset[disabled], fieldset[disabled] *')
246
+ .find(disableElementsSel)
247
+ .each(groupControl.disable)
248
+ ;
249
+ });
250
+ }
251
+
252
+
253
+ if(!Modernizr.formattribute){
254
+ (function(prop, undefined){
255
+ var isForm = {form: 1, FORM: 1};
256
+ $.prop = function(elem, name, value){
257
+ var ret;
258
+ if(elem && elem.nodeType == 1 && value === undefined && isForm[elem.nodeName] && elem.id){
259
+ ret = document.getElementsByName(name);
260
+ if(!ret || !ret.length){
261
+ ret = document.getElementById(name);
262
+ }
263
+ if(ret){
264
+ ret = $(ret).filter(function(){
265
+ return $.prop(this, 'form') == elem;
266
+ }).get();
267
+ if(ret.length){
268
+ return ret.length == 1 ? ret[0] : ret;
269
+ }
298
270
  }
299
271
  }
272
+ return prop.apply(this, arguments);
273
+ };
274
+ })($.prop, undefined);
275
+
276
+ var removeAddedElements = function(form){
277
+ var elements = $.data(form, 'webshimsAddedElements');
278
+ if(elements){
279
+ elements.remove();
280
+ $.removeData(form, 'webshimsAddedElements');
300
281
  }
301
- return prop.apply(this, arguments);
302
282
  };
303
- })($.prop, undefined);
304
-
305
- var removeAddedElements = function(form){
306
- var elements = $.data(form, 'webshimsAddedElements');
307
- if(elements){
308
- elements.remove();
309
- $.removeData(form, 'webshimsAddedElements');
310
- }
311
- };
312
-
313
- webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
314
- prop: {
315
- get: function(){
316
- var form = webshims.contentAttr(this, 'form');
317
- if(form){
318
- form = document.getElementById(form);
319
- if(form && !$.nodeName(form, 'form')){
320
- form = null;
283
+
284
+ webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
285
+ prop: {
286
+ get: function(){
287
+ var form = webshims.contentAttr(this, 'form');
288
+ if(form){
289
+ form = document.getElementById(form);
290
+ if(form && !$.nodeName(form, 'form')){
291
+ form = null;
292
+ }
321
293
  }
322
- }
323
- return form || this.form;
324
- },
325
- writeable: false
326
- }
327
- });
328
-
329
-
330
- webshims.defineNodeNamesProperty(['form'], 'elements', {
331
- prop: {
332
- get: function(){
333
- var id = this.id;
334
- var elements = $.makeArray(this.elements);
335
- if(id){
336
- elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
337
- }
338
- return elements;
339
- },
340
- writeable: false
341
- }
342
- });
343
-
344
-
345
-
346
- $(function(){
347
- var stopPropagation = function(e){
348
- e.stopPropagation();
349
- };
350
- var submitters = {
351
- image: 1,
352
- submit: 1
353
- };
354
- $(document).on('submit', function(e){
355
-
356
- if(!e.isDefaultPrevented()){
357
- var form = e.target;
358
- var id = form.id;
359
- var elements;
360
-
361
-
362
- if(id){
363
- removeAddedElements(form);
364
-
365
- elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
366
- .filter(function(){
367
- return !this.disabled && this.name && this.form != form;
368
- })
369
- .clone()
370
- ;
371
- if(elements.length){
372
- $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
373
- setTimeout(function(){
374
- removeAddedElements(form);
375
- }, 9);
294
+ return form || this.form;
295
+ },
296
+ writeable: false
297
+ }
298
+ });
299
+
300
+ webshims.defineNodeNamesProperty(['form'], 'elements', {
301
+ prop: {
302
+ get: function(){
303
+ var sel, addElements, detachElements;
304
+ var id = this.id;
305
+ var elements = $.makeArray(this.elements);
306
+ if(id){
307
+ detachElements = $.data(this, 'webshimsAddedElements');
308
+ if(detachElements){
309
+ detachElements.detach();
310
+ }
311
+ sel = 'input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]';
312
+ addElements = document.querySelectorAll(sel) || [];
313
+ if(addElements.length){
314
+ elements = $(elements).add(addElements).get();
315
+
316
+ }
317
+ if(detachElements){
318
+ detachElements.appendTo(this);
319
+ }
376
320
  }
377
- elements = null;
378
- }
321
+ return elements;
322
+ },
323
+ writeable: false
379
324
  }
380
325
  });
381
-
382
-
383
- $(document).on('click', function(e){
384
- if(submitters[e.target.type] && !e.isDefaultPrevented() && $(e.target).is('input[form], button[form]')){
385
- var trueForm = $.prop(e.target, 'form');
386
- var formIn = e.target.form;
387
- var clone;
388
- if(trueForm && trueForm != formIn){
389
- clone = $(e.target)
390
- .clone()
391
- .removeAttr('form')
392
- .addClass('webshims-visual-hide')
393
- .on('click', stopPropagation)
394
- .appendTo(trueForm)
395
- ;
396
- if(formIn){
397
- e.preventDefault();
326
+
327
+
328
+
329
+ $(function(){
330
+ var stopPropagation = function(e){
331
+ e.stopPropagation();
332
+ };
333
+ var submitters = {
334
+ image: 1,
335
+ submit: 1
336
+ };
337
+ $(document).on('submit', function(e){
338
+
339
+ if(!e.isDefaultPrevented()){
340
+ var form = e.target;
341
+ var id = form.id;
342
+ var elements;
343
+
344
+
345
+ if(id){
346
+ removeAddedElements(form);
347
+ elements = document.querySelectorAll('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]');
348
+ elements = $(elements)
349
+ .filter(function(){
350
+ return !this.disabled && this.name && this.form != form;
351
+ })
352
+ .clone()
353
+ ;
354
+ if(elements.length){
355
+ $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
356
+ setTimeout(function(){
357
+ removeAddedElements(form);
358
+ }, 9);
359
+ }
360
+ elements = null;
398
361
  }
399
- addSubmitBubbles(trueForm);
400
- clone.trigger('click');
401
- setTimeout(function(){
402
- clone.remove();
403
- clone = null;
404
- }, 9);
405
362
  }
406
- }
363
+ });
364
+
365
+
366
+ $(document).on('click', function(e){
367
+ if(submitters[e.target.type] && !e.isDefaultPrevented() && webshims.contentAttr(e.target, 'form')){
368
+ var trueForm = $.prop(e.target, 'form');
369
+ var formIn = e.target.form;
370
+ var clone;
371
+ if(trueForm && trueForm != formIn){
372
+ clone = $(e.target)
373
+ .clone()
374
+ .removeAttr('form')
375
+ .addClass('webshims-visual-hide')
376
+ .on('click', stopPropagation)
377
+ .appendTo(trueForm)
378
+ ;
379
+ if(formIn){
380
+ e.preventDefault();
381
+ }
382
+ addSubmitBubbles(trueForm);
383
+ clone.trigger('click');
384
+ setTimeout(function(){
385
+ clone.remove();
386
+ clone = null;
387
+ }, 9);
388
+ }
389
+ }
390
+ });
407
391
  });
408
- });
409
-
410
- if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
411
- var rCRLF = /\r?\n/g,
412
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
413
- rselectTextarea = /^(?:select|textarea)/i;
414
- $.fn.serializeArray = function() {
392
+
393
+ if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
394
+ var rCRLF = /\r?\n/g,
395
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
396
+ rselectTextarea = /^(?:select|textarea)/i;
397
+ $.fn.serializeArray = function() {
415
398
  return this.map(function(){
416
399
  var elements = $.prop(this, 'elements');
417
400
  return elements ? $.makeArray( elements ) : this;
418
401
  })
419
- .filter(function(){
420
- return this.name && !$(this).is(':disabled') &&
421
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
422
- rinput.test( this.type ) );
423
- })
424
- .map(function( i, elem ){
425
- var val = $( this ).val();
426
-
427
- return val == null ?
428
- null :
429
- $.isArray( val ) ?
430
- $.map( val, function( val, i ){
431
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
432
- }) :
402
+ .filter(function(){
403
+ return this.name && !$(this).is(':disabled') &&
404
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
405
+ rinput.test( this.type ) );
406
+ })
407
+ .map(function( i, elem ){
408
+ var val = $( this ).val();
409
+
410
+ return val == null ?
411
+ null :
412
+ $.isArray( val ) ?
413
+ $.map( val, function( val, i ){
414
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
415
+ }) :
433
416
  { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
434
- }).get();
417
+ }).get();
435
418
  };
436
- }
437
- }
438
-
439
- if(!Modernizr.fieldsetelements){
440
- webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
441
- prop: {
442
- get: function(){
443
- //add listed elements without keygen, object, output
444
- return $('input, select, textarea, button, fieldset', this).get() || [];
445
- },
446
- writeable: false
447
419
  }
448
- });
449
- }
450
-
451
- })();
452
- }
420
+ }
421
+
422
+ if(!Modernizr.fieldsetelements){
423
+ webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
424
+ prop: {
425
+ get: function(){
426
+ //add listed elements without keygen, object, output
427
+ return this.querySelectorAll('input, select, textarea, button, fieldset') || [];
428
+ },
429
+ writeable: false
430
+ }
431
+ });
432
+ }
433
+
434
+ })();
435
+ }
453
436
 
454
437
  if($('<input />').prop('labels') == null){
455
438
  webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
@@ -458,15 +441,15 @@ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldse
458
441
  if(this.type == 'hidden'){return null;}
459
442
  var id = this.id;
460
443
  var labels = $(this)
461
- .closest('label')
462
- .filter(function(){
463
- var hFor = (this.attributes['for'] || {});
464
- return (!hFor.specified || hFor.value == id);
465
- })
466
- ;
467
-
444
+ .closest('label')
445
+ .filter(function(){
446
+ var hFor = (this.attributes['for'] || {});
447
+ return (!hFor.specified || hFor.value == id);
448
+ })
449
+ ;
450
+
468
451
  if(id) {
469
- labels = labels.add('label[for="'+ id +'"]');
452
+ labels = labels.add(document.querySelectorAll('label[for="'+ id +'"]'));
470
453
  }
471
454
  return labels.get();
472
455
  },
@@ -474,15 +457,15 @@ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldse
474
457
  }
475
458
  });
476
459
  }
477
-
460
+
478
461
  if(!('value' in document.createElement('progress'))){
479
462
  (function(){
480
-
463
+
481
464
  var nan = parseInt('NaN', 10);
482
-
465
+
483
466
  var updateProgress = function(progress){
484
467
  var position = $.prop(progress, 'position');
485
-
468
+
486
469
  $.attr(progress, 'data-position', position);
487
470
  $('> span', progress).css({width: (position < 0 ? 100 : position * 100) +'%'});
488
471
  };
@@ -494,8 +477,8 @@ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldse
494
477
  //jQuery 1.8.x try's to normalize "0" to 0
495
478
  var val = this.getAttribute('value');
496
479
  var ret = -1;
497
-
498
- val = val ? (val * 1) : nan;
480
+
481
+ val = val ? (val * 1) : nan;
499
482
  if(!isNaN(val)){
500
483
  max = $.prop(this, 'max');
501
484
  ret = Math.max(Math.min(val / max, 1), 0);
@@ -515,7 +498,7 @@ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldse
515
498
  }
516
499
  }
517
500
  };
518
-
501
+
519
502
  $.each({value: 0, max: 1}, function(name, defValue){
520
503
  var removeProp = (name == 'value' && !$.fn.finish);
521
504
  desc[name] = {
@@ -564,19 +547,19 @@ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldse
564
547
  }
565
548
  };
566
549
  });
567
-
550
+
568
551
  webshims.createElement(
569
- 'progress',
552
+ 'progress',
570
553
  function(){
571
554
  var labels = $(this)
572
- .attr({role: 'progressbar', 'aria-valuemin': '0'})
573
- .html('<span class="progress-value" />')
574
- .jProp('labels')
575
- .map(function(){
576
- return webshims.getID(this);
577
- })
578
- .get()
579
- ;
555
+ .attr({role: 'progressbar', 'aria-valuemin': '0'})
556
+ .html('<span class="progress-value" />')
557
+ .jProp('labels')
558
+ .map(function(){
559
+ return webshims.getID(this);
560
+ })
561
+ .get()
562
+ ;
580
563
  if(labels.length){
581
564
  $.attr(this, 'aria-labelledby', labels.join(' '));
582
565
  } else {
@@ -588,569 +571,485 @@ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldse
588
571
  updateProgress.isInChange = 'max';
589
572
  updateProgress(this);
590
573
  updateProgress.isInChange = false;
591
- },
574
+ },
592
575
  desc
593
576
  );
594
-
577
+
595
578
  })();
596
579
  }
597
580
 
598
- try {
599
- document.querySelector(':checked');
600
- } catch(er){
601
- (function(){
602
- $('html').addClass('no-csschecked');
603
- var checkInputs = {
604
- radio: 1,
605
- checkbox: 1
606
- };
607
- var selectChange = function(){
608
- var options = this.options || [];
609
- var i, len, option;
610
- for(i = 0, len = options.length; i < len; i++){
611
- option = $(options[i]);
612
- option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
613
- }
614
- };
615
- var checkChange = function(){
616
- var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
617
- var className = this.className || '';
618
- var parent;
619
-
620
- //IE8- has problems to update styles, we help
621
- if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
622
- $(this)[fn]('prop-checked');
623
- if((parent = this.parentNode)){
624
- parent.className = parent.className;
625
- }
626
- }
627
- };
628
-
629
-
630
- webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
631
- webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
632
- webshims.onNodeNamesPropertyModify('option', 'selected', function(){
633
- $(this).closest('select').each(selectChange);
634
- });
635
- webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
636
- var type = this.type;
637
- if(type == 'radio' && boolVal){
638
- getGroupElements(this).each(checkChange);
639
- } else if(checkInputs[type]) {
640
- $(this).each(checkChange);
641
- }
642
- });
643
-
644
- $(document).on('change', function(e){
645
-
646
- if(checkInputs[e.target.type]){
647
- if(e.target.type == 'radio'){
648
- getGroupElements(e.target).each(checkChange);
649
- } else {
650
- $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
651
- }
652
- } else if(e.target.nodeName.toLowerCase() == 'select'){
653
- $(e.target).each(selectChange);
654
- }
655
- });
656
-
657
- webshims.addReady(function(context, contextElem){
658
- $('option, input', context)
659
- .add(contextElem.filter('option, input'))
660
- .each(function(){
661
- var prop;
662
- if(checkInputs[this.type]){
663
- prop = 'checked';
664
- } else if(this.nodeName.toLowerCase() == 'option'){
665
- prop = 'selected';
666
- }
667
- if(prop){
668
- $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
669
- }
670
-
671
- })
672
- ;
673
- });
674
- })();
675
- }
581
+ if(!('setSelectionRange' in document.createElement('input'))){
582
+ (function(){
583
+ var getSelection = function(elem, getStart){
584
+ var range, value, normalizedValue, textInputRange, len, endRange;
585
+ var start = 0;
586
+ var end = 0;
587
+ if (document.selection && (range = document.selection.createRange()) && range.parentElement() == elem) {
588
+ value = $.prop(elem, 'value');
589
+ len = value.length;
590
+ normalizedValue = value.replace(/\r\n/g, "\n");
676
591
 
677
- if(!('setSelectionRange' in document.createElement('input'))){
678
- (function(){
679
- var getSelection = function(elem, getStart){
680
- var range, value, normalizedValue, textInputRange, len, endRange;
681
- var start = 0;
682
- var end = 0;
683
- if (document.selection && (range = document.selection.createRange()) && range.parentElement() == elem) {
684
- value = $.prop(elem, 'value');
685
- len = value.length;
686
- normalizedValue = value.replace(/\r\n/g, "\n");
687
-
688
- textInputRange = elem.createTextRange();
689
- textInputRange.moveToBookmark(range.getBookmark());
690
-
691
-
692
- endRange = elem.createTextRange();
693
- endRange.collapse(false);
694
-
695
- if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
696
- start = end = len;
697
- } else {
698
- if(getStart){
699
- start = -textInputRange.moveStart("character", -len);
700
- start += normalizedValue.slice(0, start).split("\n").length - 1;
592
+ textInputRange = elem.createTextRange();
593
+ textInputRange.moveToBookmark(range.getBookmark());
594
+
595
+
596
+ endRange = elem.createTextRange();
597
+ endRange.collapse(false);
598
+
599
+ if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
600
+ start = end = len;
701
601
  } else {
702
- if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
703
- end = len;
602
+ if(getStart){
603
+ start = -textInputRange.moveStart("character", -len);
604
+ start += normalizedValue.slice(0, start).split("\n").length - 1;
704
605
  } else {
705
- end = -textInputRange.moveEnd("character", -len);
706
- end += normalizedValue.slice(0, end).split("\n").length - 1;
606
+ if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
607
+ end = len;
608
+ } else {
609
+ end = -textInputRange.moveEnd("character", -len);
610
+ end += normalizedValue.slice(0, end).split("\n").length - 1;
611
+ }
707
612
  }
613
+
708
614
  }
709
-
710
615
  }
711
- }
712
- return {
713
- start: start,
714
- end: end
616
+ return {
617
+ start: start,
618
+ end: end
619
+ };
715
620
  };
716
- };
717
-
718
- ['input', 'textarea'].forEach(function(name){
719
- var isTextarea = name == 'textarea';
720
- //email?
721
- var allowedTypes = {text: 1, search: 1, url: 1, tel: 1, password: 1, email: 1};
722
- var error = 'InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable. selection not allowed on this type';
723
- webshims.defineNodeNameProperties(name, {
724
- selectionStart: {
725
- get: function(){
726
- if(isTextarea || allowedTypes[$.prop(this, 'type')]){
727
- return getSelection(this, true).start;
728
- }
729
- webshims.error(error);
730
- },
731
- set: function(v){
732
- if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
733
- var range = this.createTextRange();
734
- range.collapse(true);
735
- range.moveStart('character', v);
736
- range.moveEnd('character', $.prop(this, 'selectionEnd'));
737
- if($(this).is(':focus')){
738
- range.select();
621
+
622
+ ['input', 'textarea'].forEach(function(name){
623
+ var isTextarea = name == 'textarea';
624
+ //email?
625
+ var allowedTypes = {text: 1, search: 1, url: 1, tel: 1, password: 1, email: 1};
626
+ var error = 'InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable. selection not allowed on this type';
627
+ webshims.defineNodeNameProperties(name, {
628
+ selectionStart: {
629
+ get: function(){
630
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
631
+ return getSelection(this, true).start;
739
632
  }
740
- } else {
741
633
  webshims.error(error);
634
+ },
635
+ set: function(v){
636
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
637
+ var range = this.createTextRange();
638
+ range.collapse(true);
639
+ range.moveStart('character', v);
640
+ range.moveEnd('character', $.prop(this, 'selectionEnd'));
641
+ if($(this).is(':focus')){
642
+ range.select();
643
+ }
644
+ } else {
645
+ webshims.error(error);
646
+ }
742
647
  }
743
- }
744
- },
745
- selectionEnd: {
746
- get: function(){
747
- if(isTextarea || allowedTypes[$.prop(this, 'type')]){
748
- return getSelection(this).end;
749
- }
750
- webshims.error(error);
751
648
  },
752
- set: function(v){
753
- if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
754
- var range = this.createTextRange();
755
- var start;
756
- range.collapse(true);
757
- start = getSelection(this, true).start;
758
- range.moveStart('character', start);
759
- range.moveEnd('character', v - start);
760
- if($(this).is(':focus')){
761
- range.select();
649
+ selectionEnd: {
650
+ get: function(){
651
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
652
+ return getSelection(this).end;
762
653
  }
763
- } else {
764
654
  webshims.error(error);
655
+ },
656
+ set: function(v){
657
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
658
+ var range = this.createTextRange();
659
+ var start;
660
+ range.collapse(true);
661
+ start = getSelection(this, true).start;
662
+ range.moveStart('character', start);
663
+ range.moveEnd('character', v - start);
664
+ if($(this).is(':focus')){
665
+ range.select();
666
+ }
667
+ } else {
668
+ webshims.error(error);
669
+ }
765
670
  }
766
- }
767
- },
768
- setSelectionRange: {
769
- value: function(start, end, dir){
770
- if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
771
- var range = this.createTextRange();
772
- range.collapse(true);
773
- range.moveStart('character', start);
774
- range.moveEnd('character', end - start);
775
- if($(this).is(':focus')){
776
- range.select();
671
+ },
672
+ setSelectionRange: {
673
+ value: function(start, end, dir){
674
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
675
+ var range = this.createTextRange();
676
+ range.collapse(true);
677
+ range.moveStart('character', start);
678
+ range.moveEnd('character', end - start);
679
+ if($(this).is(':focus')){
680
+ range.select();
681
+ }
682
+ } else {
683
+ webshims.error(error);
777
684
  }
778
- } else {
779
- webshims.error(error);
780
685
  }
781
686
  }
782
- }
783
- }, 'prop');
784
- });
785
-
786
- })();
787
- }
788
-
789
- (function(){
790
- if(options.noPlaceholderPolyfill){return;}
791
- var bustedPlaceholder;
792
- Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
793
- if(Modernizr.input.placeholder && options.overridePlaceholder){
794
- bustedPlaceholder = true;
795
- }
796
- if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
797
- (function(){
798
- var ua = navigator.userAgent;
799
-
800
- if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
801
- $(window).on('orientationchange', (function(){
802
- var timer;
803
- var retVal = function(i, value){
804
- return value;
805
- };
806
-
807
- var set = function(){
808
- $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
809
- };
810
- return function(e){
811
- clearTimeout(timer);
812
- timer = setTimeout(set, 9);
813
- };
814
- })());
815
- }
687
+ }, 'prop');
688
+ });
689
+
816
690
  })();
817
-
818
- //abort
819
- return;
820
- }
821
-
822
- var isOver = (webshims.cfg.forms.placeholderType == 'over');
823
- var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
824
- var polyfillElements = ['textarea'];
825
- if(!Modernizr.input.placeholder || bustedPlaceholder){
826
- polyfillElements.push('input');
827
691
  }
828
-
829
- var setSelection = function(elem){
830
- try {
831
- $(elem).setSelectionRange(0,0);
832
- return true;
833
- } catch(er){}
834
- };
835
-
836
- var hidePlaceholder = function(elem, data, value, _onFocus){
837
- if(value === false){
838
- value = $.prop(elem, 'value');
839
- }
840
-
841
- if(!isOver && elem.type != 'password'){
842
- if(!value && _onFocus && setSelection(elem)){
843
- var selectTimer = setTimeout(function(){
844
- setSelection(elem);
845
- }, 9);
692
+
693
+ (function(){
694
+ if(options.noPlaceholderPolyfill){return;}
695
+ var bustedPlaceholder;
696
+ Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
697
+ if(Modernizr.input.placeholder && options.overridePlaceholder){
698
+ bustedPlaceholder = true;
699
+ }
700
+ if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
701
+ (function(){
702
+ var ua = navigator.userAgent;
703
+
704
+ if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
705
+ $(window).on('orientationchange', (function(){
706
+ var timer;
707
+ var retVal = function(i, value){
708
+ return value;
709
+ };
710
+
711
+ var set = function(){
712
+ $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
713
+ };
714
+ return function(e){
715
+ clearTimeout(timer);
716
+ timer = setTimeout(set, 9);
717
+ };
718
+ })());
719
+ }
720
+ })();
721
+
722
+ //abort
723
+ return;
724
+ }
725
+
726
+ var isOver = (webshims.cfg.forms.placeholderType == 'over');
727
+ var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
728
+ var polyfillElements = ['textarea'];
729
+ if(!Modernizr.input.placeholder || bustedPlaceholder){
730
+ polyfillElements.push('input');
731
+ }
732
+
733
+ var setSelection = function(elem){
734
+ try {
735
+ $(elem).setSelectionRange(0,0);
736
+ return true;
737
+ } catch(er){}
738
+ };
739
+
740
+ var hidePlaceholder = function(elem, data, value, _onFocus){
741
+ if(value === false){
742
+ value = $.prop(elem, 'value');
743
+ }
744
+
745
+ if(!isOver && elem.type != 'password'){
746
+ if(!value && _onFocus && setSelection(elem)){
747
+ var selectTimer = setTimeout(function(){
748
+ setSelection(elem);
749
+ }, 9);
750
+ $(elem)
751
+ .off('.placeholderremove')
752
+ .on({
753
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
754
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
755
+ elem.value = $.prop(elem, 'value');
756
+ data.box.removeClass('placeholder-visible');
757
+ clearTimeout(selectTimer);
758
+ $(elem).off('.placeholderremove');
759
+ },
760
+ 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
761
+ setSelection(elem);
762
+ clearTimeout(selectTimer);
763
+ selectTimer = setTimeout(function(){
764
+ setSelection(elem);
765
+ }, 9);
766
+ },
767
+ 'blur.placeholderremove': function(){
768
+ clearTimeout(selectTimer);
769
+ $(elem).off('.placeholderremove');
770
+ }
771
+ })
772
+ ;
773
+ return;
774
+ } else if(!_onFocus && !value && elem.value){ //especially on submit
775
+ elem.value = value;
776
+ }
777
+ } else if(!value && _onFocus){
846
778
  $(elem)
847
779
  .off('.placeholderremove')
848
780
  .on({
849
781
  'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
850
782
  if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
851
- elem.value = $.prop(elem, 'value');
852
783
  data.box.removeClass('placeholder-visible');
853
- clearTimeout(selectTimer);
854
784
  $(elem).off('.placeholderremove');
855
785
  },
856
- 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
857
- setSelection(elem);
858
- clearTimeout(selectTimer);
859
- selectTimer = setTimeout(function(){
860
- setSelection(elem);
861
- }, 9);
862
- },
863
786
  'blur.placeholderremove': function(){
864
- clearTimeout(selectTimer);
865
787
  $(elem).off('.placeholderremove');
866
788
  }
867
789
  })
868
790
  ;
869
791
  return;
870
- } else if(!_onFocus && !value && elem.value){ //especially on submit
871
- elem.value = value;
872
792
  }
873
- } else if(!value && _onFocus){
874
- $(elem)
875
- .off('.placeholderremove')
876
- .on({
877
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
878
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
879
- data.box.removeClass('placeholder-visible');
880
- $(elem).off('.placeholderremove');
881
- },
882
- 'blur.placeholderremove': function(){
883
- $(elem).off('.placeholderremove');
884
- }
885
- })
886
- ;
887
- return;
888
- }
889
- data.box.removeClass('placeholder-visible');
890
- },
891
- showPlaceholder = function(elem, data, placeholderTxt){
892
- if(placeholderTxt === false){
893
- placeholderTxt = $.prop(elem, 'placeholder');
894
- }
895
-
896
- if(!isOver && elem.type != 'password'){
897
- elem.value = placeholderTxt;
898
- }
899
- data.box.addClass('placeholder-visible');
900
- },
901
- changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
902
- if(!data){
903
- data = $.data(elem, 'placeHolder');
904
- if(!data){return;}
905
- }
906
- var isVisible = $(elem).hasClass('placeholder-visible');
907
- if(placeholderTxt === false){
908
- placeholderTxt = $.attr(elem, 'placeholder') || '';
909
- }
910
-
911
- $(elem).off('.placeholderremove');
912
-
913
- if(value === false){
914
- value = $.prop(elem, 'value');
915
- }
916
-
917
- if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
918
- if(elem.type == 'password' || isOver || isVisible){
919
- hidePlaceholder(elem, data, '', true);
793
+ data.box.removeClass('placeholder-visible');
794
+ },
795
+ showPlaceholder = function(elem, data, placeholderTxt){
796
+ if(placeholderTxt === false){
797
+ placeholderTxt = $.prop(elem, 'placeholder');
920
798
  }
921
- return;
922
- }
923
-
924
- if(value){
925
- hidePlaceholder(elem, data, value);
926
- return;
927
- }
928
-
929
- if(placeholderTxt && !value){
930
- showPlaceholder(elem, data, placeholderTxt);
931
- } else {
932
- hidePlaceholder(elem, data, value);
933
- }
934
- },
935
- hasLabel = function(elem){
936
- elem = $(elem);
937
- return !!(elem.prop('title') || elem.attr('aria-labelledby') || elem.attr('aria-label') || elem.jProp('labels').length);
938
- },
939
- createPlaceholder = function(elem){
940
- elem = $(elem);
941
- return $( hasLabel(elem) ? '<span class="placeholder-text"></span>' : '<label for="'+ elem.prop('id') +'" class="placeholder-text"></label>');
942
- },
943
- pHolder = (function(){
944
- var allowedPlaceholder = {
945
- text: 1,
946
- search: 1,
947
- url: 1,
948
- email: 1,
949
- password: 1,
950
- tel: 1,
951
- number: 1
799
+
800
+ if(!isOver && elem.type != 'password'){
801
+ elem.value = placeholderTxt;
952
802
  }
953
- ;
954
- if(webshims.modules["form-number-date-ui"].loaded){
955
- delete allowedPlaceholder.number;
956
- }
957
-
958
- return {
959
- create: function(elem){
960
- var data = $.data(elem, 'placeHolder');
961
- var form;
962
- if(data){return data;}
963
- data = $.data(elem, 'placeHolder', {});
964
-
965
- $(elem).on('focus.placeholder blur.placeholder', function(e){
966
- changePlaceholderVisibility(this, false, false, data, e.type );
967
- data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
968
- });
969
-
970
- if((form = $.prop(elem, 'form'))){
971
- $(elem).onWSOff('reset.placeholder', function(e){
972
- setTimeout(function(){
973
- changePlaceholderVisibility(elem, false, false, data, e.type );
974
- }, 0);
975
- }, false, form);
803
+ data.box.addClass('placeholder-visible');
804
+ },
805
+ changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
806
+ if(!data){
807
+ data = $.data(elem, 'placeHolder');
808
+ if(!data){return;}
809
+ }
810
+ var isVisible = $(elem).hasClass('placeholder-visible');
811
+ if(placeholderTxt === false){
812
+ placeholderTxt = $.attr(elem, 'placeholder') || '';
813
+ }
814
+
815
+ $(elem).off('.placeholderremove');
816
+
817
+ if(value === false){
818
+ value = $.prop(elem, 'value');
819
+ }
820
+
821
+ if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
822
+ if(elem.type == 'password' || isOver || isVisible){
823
+ hidePlaceholder(elem, data, '', true);
976
824
  }
977
-
978
- if(elem.type == 'password' || isOver){
979
- data.text = createPlaceholder(elem);
980
- if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
981
- data.box = data.text;
982
- } else {
983
- data.box = $('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
984
- .insertAfter(elem)
985
- ;
986
- data.box.append(elem);
825
+ return;
826
+ }
827
+
828
+ if(value){
829
+ hidePlaceholder(elem, data, value);
830
+ return;
831
+ }
832
+
833
+ if(placeholderTxt && !value){
834
+ showPlaceholder(elem, data, placeholderTxt);
835
+ } else {
836
+ hidePlaceholder(elem, data, value);
837
+ }
838
+ },
839
+ createPlaceholder = function(){
840
+ return $('<span class="placeholder-text"></span>');
841
+ },
842
+ pHolder = (function(){
843
+ var allowedPlaceholder = {
844
+ text: 1,
845
+ search: 1,
846
+ url: 1,
847
+ email: 1,
848
+ password: 1,
849
+ tel: 1,
850
+ number: 1
851
+ }
852
+ ;
853
+ if(webshims.modules["form-number-date-ui"].loaded){
854
+ delete allowedPlaceholder.number;
855
+ }
856
+
857
+ return {
858
+ create: function(elem){
859
+ var data = $.data(elem, 'placeHolder');
860
+ var form;
861
+ if(data){return data;}
862
+ data = $.data(elem, 'placeHolder', {});
863
+
864
+ $(elem).on('focus.placeholder blur.placeholder', function(e){
865
+ changePlaceholderVisibility(this, false, false, data, e.type );
866
+ data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
867
+ });
868
+
869
+ if((form = $.prop(elem, 'form'))){
870
+ $(elem).onWSOff('reset.placeholder', function(e){
871
+ setTimeout(function(){
872
+ changePlaceholderVisibility(elem, false, false, data, e.type );
873
+ }, 0);
874
+ }, false, form);
987
875
  }
988
- data.text
989
- .insertAfter(elem)
990
- .on('mousedown.placeholder', function(){
991
- changePlaceholderVisibility(this, false, false, data, 'focus');
992
- try {
993
- setTimeout(function(){
994
- elem.focus();
995
- }, 0);
996
- } catch(e){}
997
- return false;
998
- })
999
- ;
1000
-
1001
-
1002
- $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
1003
- var prop = $.css(elem, style);
1004
- if(data.text.css(style) != prop){
1005
- data.text.css(style, prop);
876
+
877
+ if(elem.type == 'password' || isOver){
878
+ data.text = createPlaceholder(elem);
879
+ if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
880
+ data.box = data.text;
881
+ } else {
882
+ data.box = $('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
883
+ .insertAfter(elem)
884
+ ;
885
+ data.box.append(elem);
1006
886
  }
1007
- });
1008
- $.each(['Left', 'Top'], function(i, side){
1009
- 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);
1010
- data.text.css('padding'+ side, size);
1011
- });
887
+ data.text
888
+ .insertAfter(elem)
889
+ .on('mousedown.placeholder', function(){
890
+ changePlaceholderVisibility(this, false, false, data, 'focus');
891
+ try {
892
+ setTimeout(function(){
893
+ elem.focus();
894
+ }, 0);
895
+ } catch(e){}
896
+ return false;
897
+ })
898
+ ;
1012
899
 
1013
- $(elem)
1014
- .onWSOff('updateshadowdom', (function(){
1015
- var lastWidth, init, timer;
1016
- var jelm = $(elem);
1017
- var lastPos = {};
1018
- return function(){
1019
- var width, fn;
1020
-
1021
- if((width = elem.offsetWidth)){
1022
-
1023
- fn = function(){
1024
- var pos = jelm.position();
1025
- if(width !== lastWidth){
1026
- lastWidth = width;
1027
- data.text[0].style.width = width +'px';
1028
- }
1029
- if(pos.top !== lastPos.top || pos.left !== lastPos.left){
1030
- lastPos = pos;
1031
- data.text[0].style.top = pos.top +'px';
1032
- data.text[0].style.left = pos.left +'px';
900
+
901
+ $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
902
+ var prop = $.css(elem, style);
903
+ if(data.text.css(style) != prop){
904
+ data.text.css(style, prop);
905
+ }
906
+ });
907
+ $.each(['Left', 'Top'], function(i, side){
908
+ 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);
909
+ data.text.css('padding'+ side, size);
910
+ });
911
+
912
+ $(elem)
913
+ .onWSOff('updateshadowdom', (function(){
914
+ var lastWidth, init, timer;
915
+ var jelm = $(elem);
916
+ var lastPos = {};
917
+ return function(){
918
+ var width, fn;
919
+
920
+ if((width = elem.offsetWidth)){
921
+
922
+ fn = function(){
923
+ var pos = jelm.position();
924
+ if(width !== lastWidth){
925
+ lastWidth = width;
926
+ data.text[0].style.width = width +'px';
927
+ }
928
+ if(pos.top !== lastPos.top || pos.left !== lastPos.left){
929
+ lastPos = pos;
930
+ data.text[0].style.top = pos.top +'px';
931
+ data.text[0].style.left = pos.left +'px';
932
+ }
933
+ };
934
+ if(!init){
935
+ fn();
936
+ init = true;
937
+ } else {
938
+ clearTimeout(timer);
939
+ timer = setTimeout(fn, 99);
1033
940
  }
1034
- };
1035
- if(!init){
1036
- fn();
1037
- init = true;
1038
- } else {
1039
- clearTimeout(timer);
1040
- timer = setTimeout(fn, 99);
1041
941
  }
1042
- }
1043
- };
1044
- })(), true)
1045
- ;
1046
-
1047
- } else {
1048
- var reset = function(e){
1049
- if($(elem).hasClass('placeholder-visible')){
1050
- hidePlaceholder(elem, data, '');
1051
-
1052
- setTimeout(function(){
1053
- if(!e || e.type != 'submit' || e.isDefaultPrevented()){
1054
- changePlaceholderVisibility(elem, false, false, data );
1055
- }
1056
- }, 9);
942
+ };
943
+ })(), true)
944
+ ;
945
+
946
+ } else {
947
+ var reset = function(e){
948
+ if($(elem).hasClass('placeholder-visible')){
949
+ hidePlaceholder(elem, data, '');
950
+
951
+ setTimeout(function(){
952
+ if(!e || e.type != 'submit' || e.isDefaultPrevented()){
953
+ changePlaceholderVisibility(elem, false, false, data );
954
+ }
955
+ }, 9);
956
+ }
957
+ };
958
+
959
+ $(elem).onWSOff('beforeunload', reset, false, window);
960
+ data.box = $(elem);
961
+ if(form){
962
+ $(elem).onWSOff('submit', reset, false, form);
1057
963
  }
1058
- };
1059
-
1060
- $(elem).onWSOff('beforeunload', reset, false, window);
1061
- data.box = $(elem);
1062
- if(form){
1063
- $(elem).onWSOff('submit', reset, false, form);
1064
964
  }
965
+
966
+ return data;
967
+ },
968
+ update: function(elem, val){
969
+ var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
970
+ if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
971
+ webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
972
+ return;
973
+ }
974
+
975
+
976
+ var data = pHolder.create(elem);
977
+ if(data.text){
978
+ data.text.text(val);
979
+ }
980
+
981
+ changePlaceholderVisibility(elem, false, val, data);
1065
982
  }
1066
-
1067
- return data;
1068
- },
1069
- update: function(elem, val){
1070
- var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
1071
- if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
1072
- webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
1073
- return;
1074
- }
1075
-
1076
-
1077
- var data = pHolder.create(elem);
1078
- if(data.text){
1079
- data.text.text(val);
1080
- }
1081
-
1082
- changePlaceholderVisibility(elem, false, val, data);
1083
- }
1084
- };
1085
- })()
1086
- ;
1087
-
1088
- $.webshims.publicMethods = {
1089
- pHolder: pHolder
1090
- };
1091
- polyfillElements.forEach(function(nodeName){
1092
- var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
1093
- attr: {
1094
- set: function(val){
1095
- var elem = this;
1096
- if(bustedPlaceholder){
1097
- webshims.data(elem, 'bustedPlaceholder', val);
1098
- elem.placeholder = '';
1099
- } else {
1100
- webshims.contentAttr(elem, 'placeholder', val);
983
+ };
984
+ })()
985
+ ;
986
+
987
+ $.webshims.publicMethods = {
988
+ pHolder: pHolder
989
+ };
990
+ polyfillElements.forEach(function(nodeName){
991
+ webshims.defineNodeNameProperty(nodeName, 'placeholder', {
992
+ attr: {
993
+ set: function(val){
994
+ var elem = this;
995
+ if(bustedPlaceholder){
996
+ webshims.data(elem, 'bustedPlaceholder', val);
997
+ elem.placeholder = '';
998
+ } else {
999
+ webshims.contentAttr(elem, 'placeholder', val);
1000
+ }
1001
+ pHolder.update(elem, val);
1002
+ },
1003
+ get: function(){
1004
+ var placeholder;
1005
+ if(bustedPlaceholder){
1006
+ placeholder = webshims.data(this, 'bustedPlaceholder');
1007
+ }
1008
+ return placeholder || webshims.contentAttr(this, 'placeholder');
1101
1009
  }
1102
- pHolder.update(elem, val);
1103
1010
  },
1104
- get: function(){
1105
- var placeholder;
1106
- if(bustedPlaceholder){
1107
- placeholder = webshims.data(this, 'bustedPlaceholder');
1108
- }
1109
- return placeholder || webshims.contentAttr(this, 'placeholder');
1110
- }
1111
- },
1112
- reflect: true,
1113
- initAttr: true
1011
+ reflect: true,
1012
+ initAttr: true
1013
+ });
1114
1014
  });
1115
- });
1116
-
1117
-
1118
- polyfillElements.forEach(function(name){
1119
- var placeholderValueDesc = {};
1120
- var desc;
1121
- ['attr', 'prop'].forEach(function(propType){
1122
- placeholderValueDesc[propType] = {
1123
- set: function(val){
1124
- var elem = this;
1125
- var placeholder;
1126
- if(bustedPlaceholder){
1127
- placeholder = webshims.data(elem, 'bustedPlaceholder');
1128
- }
1129
- if(!placeholder){
1130
- placeholder = webshims.contentAttr(elem, 'placeholder');
1131
- }
1132
- $.removeData(elem, 'cachedValidity');
1133
- var ret = desc[propType]._supset.call(elem, val);
1134
- if(placeholder && 'value' in elem){
1135
- changePlaceholderVisibility(elem, val, placeholder);
1015
+
1016
+
1017
+ polyfillElements.forEach(function(name){
1018
+ var placeholderValueDesc = {};
1019
+ var desc;
1020
+ ['attr', 'prop'].forEach(function(propType){
1021
+ placeholderValueDesc[propType] = {
1022
+ set: function(val){
1023
+ var elem = this;
1024
+ var placeholder;
1025
+ if(bustedPlaceholder){
1026
+ placeholder = webshims.data(elem, 'bustedPlaceholder');
1027
+ }
1028
+ if(!placeholder){
1029
+ placeholder = webshims.contentAttr(elem, 'placeholder');
1030
+ }
1031
+ $.removeData(elem, 'cachedValidity');
1032
+ var ret = desc[propType]._supset.call(elem, val);
1033
+ if(placeholder && 'value' in elem){
1034
+ changePlaceholderVisibility(elem, val, placeholder);
1035
+ }
1036
+ return ret;
1037
+ },
1038
+ get: function(){
1039
+ var elem = this;
1040
+ return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
1136
1041
  }
1137
- return ret;
1138
- },
1139
- get: function(){
1140
- var elem = this;
1141
- return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
1142
- }
1143
- };
1042
+ };
1043
+ });
1044
+ desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1144
1045
  });
1145
- desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1146
- });
1147
-
1148
- })();
1046
+
1047
+ })();
1149
1048
 
1150
1049
  (function(){
1151
- var doc = document;
1050
+ var doc = document;
1152
1051
  if( 'value' in document.createElement('output') ){return;}
1153
-
1052
+
1154
1053
  webshims.defineNodeNameProperty('output', 'value', {
1155
1054
  prop: {
1156
1055
  set: function(value){
@@ -1165,8 +1064,8 @@ if(!('setSelectionRange' in document.createElement('input'))){
1165
1064
  }
1166
1065
  }
1167
1066
  });
1168
-
1169
-
1067
+
1068
+
1170
1069
  webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
1171
1070
  if(type == 'removeAttr'){return;}
1172
1071
  var setVal = $.data(this, 'outputShim');
@@ -1174,26 +1073,26 @@ if(!('setSelectionRange' in document.createElement('input'))){
1174
1073
  setVal(value);
1175
1074
  }
1176
1075
  });
1177
-
1076
+
1178
1077
  var outputCreate = function(elem){
1179
- if(elem.getAttribute('aria-live')){return;}
1078
+ if($.data(elem, 'outputShim')){return;}
1180
1079
  elem = $(elem);
1181
1080
  var value = (elem.text() || '').trim();
1182
1081
  var id = elem.prop('id');
1183
1082
  var htmlFor = elem.attr('for');
1184
1083
  var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
1185
- var form = shim[0].form || doc;
1186
1084
  var setValue = function(val){
1187
1085
  shim[0].value = val;
1188
1086
  val = shim[0].value;
1189
1087
  elem.text(val);
1190
1088
  webshims.contentAttr(elem[0], 'value', val);
1191
1089
  };
1192
-
1090
+
1193
1091
  elem[0].defaultValue = value;
1194
1092
  webshims.contentAttr(elem[0], 'value', value);
1195
-
1093
+
1196
1094
  elem.attr({'aria-live': 'polite'});
1095
+
1197
1096
  if(id){
1198
1097
  shim.attr('id', id);
1199
1098
  elem.attr('aria-labelledby', elem.jProp('labels').map(function(){
@@ -1213,13 +1112,13 @@ if(!('setSelectionRange' in document.createElement('input'))){
1213
1112
  shim.data('outputShim', setValue );
1214
1113
  return setValue;
1215
1114
  };
1216
-
1115
+
1217
1116
  webshims.addReady(function(context, contextElem){
1218
- $('output', context).add(contextElem.filter('output')).each(function(){
1117
+ $(context.getElementsByTagName('output')).add(contextElem.filter('output')).each(function(){
1219
1118
  outputCreate(this);
1220
1119
  });
1221
1120
  });
1222
-
1121
+
1223
1122
  /*
1224
1123
  * Implements input event in all browsers
1225
1124
  */
@@ -1233,53 +1132,55 @@ if(!('setSelectionRange' in document.createElement('input'))){
1233
1132
  image: 1,
1234
1133
  reset: 1,
1235
1134
  file: 1
1236
-
1135
+
1237
1136
  //pro forma
1238
1137
  ,color: 1
1239
1138
  },
1240
- observe = function(input){
1241
- var timer,
1242
- lastVal = input.prop('value'),
1243
- trigger = function(e){
1244
- //input === null
1245
- if(!input){return;}
1246
- var newVal = input.prop('value');
1247
- if(newVal !== lastVal){
1248
- lastVal = newVal;
1249
- if(!e || !noInputTriggerEvts[e.type]){
1250
- webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1251
- }
1252
- }
1253
- },
1254
- extraTimer,
1255
- extraTest = function(){
1256
- clearTimeout(extraTimer);
1257
- extraTimer = setTimeout(trigger, 9);
1258
- },
1259
- unbind = function(){
1260
- input.off('focusout', unbind).off('keyup keypress keydown paste cut', extraTest).off('input change updateInput triggerinput', trigger);
1261
- clearInterval(timer);
1262
- setTimeout(function(){
1263
- trigger();
1264
- input = null;
1265
- }, 1);
1266
-
1139
+ timer,
1140
+ lastVal,
1141
+ input,
1142
+ trigger = function(e){
1143
+ if(!input){return;}
1144
+ var newVal = input.prop('value');
1145
+ if(newVal !== lastVal){
1146
+ lastVal = newVal;
1147
+ if(!e || !noInputTriggerEvts[e.type]){
1148
+ webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1267
1149
  }
1268
- ;
1269
-
1150
+ }
1151
+ },
1152
+ extraTimer,
1153
+ extraTest = function(){
1154
+ clearTimeout(extraTimer);
1155
+ extraTimer = setTimeout(trigger, 9);
1156
+ },
1157
+ unbind = function(){
1158
+ clearTimeout(extraTimer);
1270
1159
  clearInterval(timer);
1271
- timer = setInterval(trigger, 200);
1272
- extraTest();
1273
- input.on({
1274
- 'keyup keypress keydown paste cut': extraTest,
1275
- focusout: unbind,
1276
- 'input updateInput change triggerinput': trigger
1277
- });
1160
+ if(input){
1161
+ input.off('focusout', unbind).off('keyup keypress keydown paste cut', extraTest).off('input change updateInput triggerinput', trigger);
1162
+ }
1163
+
1164
+
1278
1165
  }
1279
1166
  ;
1280
-
1167
+ var observe = function(newInput){
1168
+ unbind();
1169
+
1170
+ input = newInput;
1171
+ lastVal = input.prop('value');
1172
+ clearInterval(timer);
1173
+ timer = setInterval(trigger, 200);
1174
+ extraTest();
1175
+ input.on({
1176
+ 'keyup keypress keydown paste cut': extraTest,
1177
+ 'focusout wswidgetfocusout': unbind,
1178
+ 'input updateInput change triggerinput': trigger
1179
+ });
1180
+ };
1181
+
1281
1182
  $(doc)
1282
- .on('focusin', function(e){
1183
+ .on('focusin wswidgetfocusin', function(e){
1283
1184
  if( e.target && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] && !(webshims.data(e.target, 'implemented') || {}).inputwidgets){
1284
1185
  observe($(e.target));
1285
1186
  }