webshims-rails 1.11.3.1 → 1.11.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +114 -104
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +5 -5
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +156 -207
  6. data/vendor/assets/javascripts/webshims/shims/$ajax.js +862 -0
  7. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +20 -0
  8. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +20 -0
  9. data/vendor/assets/javascripts/webshims/shims/color-picker.js +12 -12
  10. data/vendor/assets/javascripts/webshims/shims/combos/1.js +62 -32
  11. data/vendor/assets/javascripts/webshims/shims/combos/10.js +192 -509
  12. data/vendor/assets/javascripts/webshims/shims/combos/11.js +96 -415
  13. data/vendor/assets/javascripts/webshims/shims/combos/12.js +36 -26
  14. data/vendor/assets/javascripts/webshims/shims/combos/13.js +36 -26
  15. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1007 -359
  16. data/vendor/assets/javascripts/webshims/shims/combos/15.js +310 -235
  17. data/vendor/assets/javascripts/webshims/shims/combos/16.js +313 -237
  18. data/vendor/assets/javascripts/webshims/shims/combos/17.js +96 -415
  19. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1003 -678
  20. data/vendor/assets/javascripts/webshims/shims/combos/19.js +1085 -387
  21. data/vendor/assets/javascripts/webshims/shims/combos/2.js +161 -127
  22. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1086 -388
  23. data/vendor/assets/javascripts/webshims/shims/combos/21.js +168 -96
  24. data/vendor/assets/javascripts/webshims/shims/combos/22.js +36 -27
  25. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2 -1
  26. data/vendor/assets/javascripts/webshims/shims/combos/24.js +411 -172
  27. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1085 -387
  28. data/vendor/assets/javascripts/webshims/shims/combos/26.js +96 -94
  29. data/vendor/assets/javascripts/webshims/shims/combos/3.js +163 -140
  30. data/vendor/assets/javascripts/webshims/shims/combos/30.js +166 -141
  31. data/vendor/assets/javascripts/webshims/shims/combos/31.js +159 -126
  32. data/vendor/assets/javascripts/webshims/shims/combos/4.js +103 -109
  33. data/vendor/assets/javascripts/webshims/shims/combos/5.js +98 -417
  34. data/vendor/assets/javascripts/webshims/shims/combos/6.js +101 -418
  35. data/vendor/assets/javascripts/webshims/shims/combos/7.js +168 -142
  36. data/vendor/assets/javascripts/webshims/shims/combos/8.js +165 -141
  37. data/vendor/assets/javascripts/webshims/shims/combos/9.js +195 -510
  38. data/vendor/assets/javascripts/webshims/shims/details.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +96 -94
  40. data/vendor/assets/javascripts/webshims/shims/es5.js +908 -264
  41. data/vendor/assets/javascripts/webshims/shims/excanvas.js +16 -1
  42. data/vendor/assets/javascripts/webshims/shims/form-combat.js +147 -0
  43. data/vendor/assets/javascripts/webshims/shims/form-core.js +60 -31
  44. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +114 -33
  45. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +3 -1
  46. data/vendor/assets/javascripts/webshims/shims/form-message.js +7 -15
  47. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +2 -2
  48. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +88 -410
  49. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +143 -93
  50. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +268 -79
  51. data/vendor/assets/javascripts/webshims/shims/form-validation.js +116 -81
  52. data/vendor/assets/javascripts/webshims/shims/form-validators.js +23 -10
  53. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +605 -9
  54. data/vendor/assets/javascripts/webshims/shims/geolocation.js +51 -39
  55. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js +78 -33
  56. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +24 -6
  57. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-nl.js +110 -49
  58. data/vendor/assets/javascripts/webshims/shims/json-storage.js +3 -1
  59. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +2 -1
  60. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +81 -30
  61. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +131 -54
  62. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +497 -0
  63. data/vendor/assets/javascripts/webshims/shims/range-ui.js +8 -5
  64. data/vendor/assets/javascripts/webshims/shims/sizzle.js +2026 -0
  65. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +401 -521
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +1 -1
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +94 -82
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +250 -321
  69. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  70. data/vendor/assets/javascripts/webshims/shims/track-ui.js +1 -1
  71. data/vendor/assets/javascripts/webshims/shims/track.js +34 -25
  72. metadata +7 -3
@@ -4,7 +4,6 @@ webshims.inputTypes = webshims.inputTypes || {};
4
4
  //some helper-functions
5
5
  var cfg = webshims.cfg.forms;
6
6
  var bugs = webshims.bugs;
7
- var isSubmit;
8
7
 
9
8
  var isNumber = function(string){
10
9
  return (typeof string == 'number' || (string && string == string * 1));
@@ -79,6 +78,7 @@ var validityPrototype = {
79
78
  rangeOverflow: false,
80
79
  stepMismatch: false,
81
80
  tooLong: false,
81
+ tooShort: false,
82
82
  patternMismatch: false,
83
83
  valueMissing: false,
84
84
 
@@ -115,6 +115,9 @@ var getGroupElements = function(elem){
115
115
  }
116
116
  return ret;
117
117
  };
118
+ var patternTypes = {url: 1, email: 1, text: 1, search: 1, tel: 1, password: 1};
119
+ var lengthTypes = $.extend({textarea: 1}, patternTypes);
120
+
118
121
  var validityRules = {
119
122
  valueMissing: function(input, val, cache){
120
123
  if(!input.prop('required')){return false;}
@@ -131,11 +134,12 @@ var validityRules = {
131
134
  }
132
135
  return ret;
133
136
  },
134
- tooLong: function(){
135
- return false;
136
- },
137
137
  patternMismatch: function(input, val, cache) {
138
138
  if(val === '' || cache.nodeName == 'select'){return false;}
139
+ if(!('type' in cache)){
140
+ cache.type = getType(input[0]);
141
+ }
142
+ if(!patternTypes[cache.type]){return false;}
139
143
  var pattern = input.attr('pattern');
140
144
  if(!pattern){return false;}
141
145
  try {
@@ -150,6 +154,20 @@ var validityRules = {
150
154
  }
151
155
  ;
152
156
 
157
+ $.each({tooShort: ['minLength', -1], tooLong: ['maxLength', 1]}, function(name, props){
158
+ validityRules[name] = function(input, val, cache){
159
+ //defaultValue is not the same as dirty flag, but very similiar
160
+ if(cache.nodeName == 'select' || input.prop('defaultValue') == val){return false;}
161
+ if(!('type' in cache)){
162
+ cache.type = getType(input[0]);
163
+ }
164
+ if(!lengthTypes[cache.type]){return false;}
165
+ var prop = input.prop(props[0]);
166
+
167
+ return ( prop > 0 && prop * props[1] < val.length * props[1] );
168
+ };
169
+ });
170
+
153
171
  $.each({typeMismatch: 'mismatch', badInput: 'bad'}, function(name, fn){
154
172
  validityRules[name] = function (input, val, cache){
155
173
  if(val === '' || cache.nodeName == 'select'){return false;}
@@ -200,15 +218,12 @@ $.event.special.invalid = {
200
218
 
201
219
  if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
202
220
 
203
- isSubmit = true;
204
221
  e.testedValidity = true;
205
- var notValid = !($(e.target).checkValidity());
222
+ var notValid = !($(e.target).callProp('reportValidity'));
206
223
  if(notValid){
207
224
  e.stopImmediatePropagation();
208
- isSubmit = false;
209
225
  return false;
210
226
  }
211
- isSubmit = false;
212
227
  }
213
228
  };
214
229
 
@@ -275,6 +290,9 @@ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
275
290
  checkValidity: {
276
291
  value: function(){return true;}
277
292
  },
293
+ reportValidity: {
294
+ value: function(){return true;}
295
+ },
278
296
  willValidate: {
279
297
  value: false
280
298
  },
@@ -289,7 +307,7 @@ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
289
307
  }
290
308
  }, 'prop');
291
309
 
292
- var baseCheckValidity = function(elem){
310
+ var baseCheckValidity = function(elem, type){
293
311
  var e,
294
312
  v = $.prop(elem, 'validity')
295
313
  ;
@@ -301,7 +319,7 @@ var baseCheckValidity = function(elem){
301
319
  if( !v.valid ){
302
320
  e = $.Event('invalid');
303
321
  var jElm = $(elem).trigger(e);
304
- if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
322
+ if(type == 'reportValidity' && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
305
323
  webshims.validityAlert.showFor(jElm);
306
324
  baseCheckValidity.unhandledInvalids = true;
307
325
  }
@@ -310,95 +328,111 @@ var baseCheckValidity = function(elem){
310
328
  return v.valid;
311
329
  };
312
330
  var rsubmittable = /^(?:select|textarea|input)/i;
313
- webshims.defineNodeNameProperty('form', 'checkValidity', {
314
- prop: {
315
- value: function(){
316
-
317
- var ret = true,
318
- elems = $($.prop(this, 'elements')).filter(function(){
319
- if(!rsubmittable.test(this.nodeName)){return false;}
320
- var shadowData = webshims.data(this, 'shadowData');
321
- return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
322
- })
323
- ;
324
-
325
- baseCheckValidity.unhandledInvalids = false;
326
- for(var i = 0, len = elems.length; i < len; i++){
327
- if( !baseCheckValidity(elems[i]) ){
328
- ret = false;
331
+
332
+ ['checkValidity', 'reportValidity'].forEach(function(name){
333
+ webshims.defineNodeNameProperty('form', name, {
334
+ prop: {
335
+ value: function(){
336
+
337
+ var ret = true,
338
+ elems = $($.prop(this, 'elements')).filter(function(){
339
+ if(!rsubmittable.test(this.nodeName)){return false;}
340
+ var shadowData = webshims.data(this, 'shadowData');
341
+ return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
342
+ })
343
+ ;
344
+
345
+ baseCheckValidity.unhandledInvalids = false;
346
+ for(var i = 0, len = elems.length; i < len; i++){
347
+ if( !baseCheckValidity(elems[i], name) ){
348
+ ret = false;
349
+ }
329
350
  }
351
+ return ret;
330
352
  }
331
- return ret;
332
353
  }
333
- }
354
+ });
334
355
  });
335
356
 
336
- webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
337
- checkValidity: {
338
- value: function(){
339
- baseCheckValidity.unhandledInvalids = false;
340
- return baseCheckValidity($(this).getNativeElement()[0]);
341
- }
342
- },
343
- setCustomValidity: {
344
- value: function(error){
345
- $.removeData(this, 'cachedValidity');
346
- webshims.data(this, 'customvalidationMessage', ''+error);
347
- }
348
- },
349
- willValidate: {
350
- writeable: false,
351
- get: (function(){
352
- var types = {
353
- button: 1,
354
- reset: 1,
355
- hidden: 1,
356
- image: 1
357
+
358
+
359
+
360
+ ['input', 'textarea', 'select'].forEach(function(nodeName){
361
+ var inputValidationAPI = {
362
+ setCustomValidity: {
363
+ value: function(error){
364
+ $.removeData(this, 'cachedValidity');
365
+ webshims.data(this, 'customvalidationMessage', ''+error);
366
+ if(bugs.bustedValidity && inputValidationAPI.setCustomValidity.prop._supvalue){
367
+ inputValidationAPI.setCustomValidity.prop._supvalue.apply(this, arguments);
357
368
  }
358
- ;
359
- return function(){
360
- var elem = $(this).getNativeElement()[0];
361
- //elem.name && <- we don't use to make it easier for developers
362
- return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
363
- };
364
- })()
365
- },
366
- validity: {
367
- writeable: false,
368
- get: function(){
369
- var jElm = $(this).getNativeElement();
370
- var elem = jElm[0];
371
- var validityState = $.data(elem, 'cachedValidity');
372
- if(validityState){
373
- return validityState;
374
369
  }
375
- validityState = $.extend({}, validityPrototype);
376
-
377
- if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
370
+ },
371
+ willValidate: {
372
+ writeable: false,
373
+ get: (function(){
374
+ var types = {
375
+ button: 1,
376
+ reset: 1,
377
+ hidden: 1,
378
+ image: 1
379
+ }
380
+ ;
381
+ return function(){
382
+ var elem = $(this).getNativeElement()[0];
383
+ return !!(!elem.readOnly && !types[elem.type] && !$(elem).is(':disabled') );
384
+ };
385
+ })()
386
+ },
387
+ validity: {
388
+ writeable: false,
389
+ get: function(){
390
+ var jElm = $(this).getNativeElement();
391
+ var elem = jElm[0];
392
+ var validityState = $.data(elem, 'cachedValidity');
393
+ if(validityState){
394
+ return validityState;
395
+ }
396
+ validityState = $.extend({}, validityPrototype);
397
+
398
+ if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
399
+ return validityState;
400
+ }
401
+ var val = jElm.val(),
402
+ cache = {nodeName: elem.nodeName.toLowerCase()}
403
+ ;
404
+
405
+ validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
406
+ if( validityState.customError ){
407
+ validityState.valid = false;
408
+ }
409
+
410
+ $.each(validityRules, function(rule, fn){
411
+ if (fn(jElm, val, cache)) {
412
+ validityState[rule] = true;
413
+ validityState.valid = false;
414
+ }
415
+ });
416
+ $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
417
+ jElm = null;
418
+ elem = null;
378
419
  return validityState;
379
420
  }
380
- var val = jElm.val(),
381
- cache = {nodeName: elem.nodeName.toLowerCase()}
382
- ;
383
-
384
- validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
385
- if( validityState.customError ){
386
- validityState.valid = false;
421
+ }
422
+ };
423
+
424
+ ['checkValidity', 'reportValidity'].forEach(function(name){
425
+ inputValidationAPI[name] = {
426
+ value: function(){
427
+ baseCheckValidity.unhandledInvalids = false;
428
+ return baseCheckValidity($(this).getNativeElement()[0], name);
387
429
  }
388
-
389
- $.each(validityRules, function(rule, fn){
390
- if (fn(jElm, val, cache)) {
391
- validityState[rule] = true;
392
- validityState.valid = false;
393
- }
394
- });
395
- $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
396
- jElm = null;
397
- elem = null;
398
- return validityState;
399
430
  }
400
- }
401
- }, 'prop');
431
+ });
432
+
433
+ webshims.defineNodeNameProperties(nodeName, inputValidationAPI, 'prop');
434
+ });
435
+
402
436
 
403
437
  webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
404
438
  set: function(value){
@@ -408,7 +442,7 @@ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'requir
408
442
  });
409
443
  webshims.defineNodeNamesBooleanProperty(['input'], 'multiple');
410
444
 
411
- if(webshims.bugs.bustedValidity){
445
+ if(bugs.bustedValidity){
412
446
 
413
447
  webshims.defineNodeNameProperty('form', 'novalidate', {
414
448
  attr: {
@@ -451,6 +485,22 @@ webshims.defineNodeNameProperty('form', 'noValidate', {
451
485
  }
452
486
  });
453
487
 
488
+ webshims.defineNodeNamesProperty(['input', 'textarea'], 'minLength', {
489
+ prop: {
490
+ set: function(val){
491
+ val *= 1;
492
+ if(val < 0){
493
+ throw('INDEX_SIZE_ERR');
494
+ }
495
+ this.setAttribute('minlength', val || 0);
496
+ },
497
+ get: function(){
498
+ var val = this.getAttribute('minlength');
499
+ return val == null ? -1 : (val * 1) || 0;
500
+ }
501
+ }
502
+ })
503
+
454
504
  if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
455
505
  (function(){
456
506
 
@@ -505,7 +555,7 @@ if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
505
555
  focusedin = false;
506
556
  }
507
557
  if(input){
508
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
558
+ input.off('focusout blur', unbind).off('input change updateInput', trigger);
509
559
  trigger();
510
560
  }
511
561
  input = null;
@@ -548,7 +598,7 @@ webshims.addReady(function(context, contextElem){
548
598
  var focusElem;
549
599
  $('form', context)
550
600
  .add(contextElem.filter('form'))
551
- .bind('invalid', $.noop)
601
+ .on('invalid', $.noop)
552
602
  ;
553
603
 
554
604
  try {
@@ -724,7 +774,7 @@ switch(desc.proptype) {
724
774
  formSubmitterDescriptors[attrName].attr = {
725
775
  set: function(value){
726
776
  formSubmitterDescriptors[attrName].attr._supset.call(this, value);
727
- $(this).unbind(eventName).on(eventName, changeSubmitter);
777
+ $(this).off(eventName).on(eventName, changeSubmitter);
728
778
  },
729
779
  get: function(){
730
780
  return formSubmitterDescriptors[attrName].attr._supget.call(this);
@@ -733,7 +783,7 @@ switch(desc.proptype) {
733
783
  formSubmitterDescriptors[attrName].initAttr = true;
734
784
  formSubmitterDescriptors[attrName].removeAttr = {
735
785
  value: function(){
736
- $(this).unbind(eventName);
786
+ $(this).off(eventName);
737
787
  formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
738
788
  }
739
789
  };
@@ -746,6 +796,9 @@ webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors
746
796
  webshims.register('form-shim-extend2', function($, webshims, window, document, undefined, options){
747
797
  "use strict";
748
798
  var emptyJ = $([]);
799
+ var isNumber = function(string){
800
+ return (typeof string == 'number' || (string && string == string * 1));
801
+ };
749
802
  var getGroupElements = function(elem){
750
803
  elem = $(elem);
751
804
  var name;
@@ -828,7 +881,7 @@ if( !('maxLength' in document.createElement('textarea')) ){
828
881
  };
829
882
  var remove = function(){
830
883
  clearTimeout(timer);
831
- lastElement.unbind('.maxlengthconstraint');
884
+ lastElement.off('.maxlengthconstraint');
832
885
  };
833
886
  return function(element, maxLength){
834
887
  remove();
@@ -908,7 +961,7 @@ if( !('maxLength' in document.createElement('textarea')) ){
908
961
  });
909
962
  }
910
963
 
911
- if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
964
+ if(('getSetAttribute' in $.support) && !$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
912
965
  webshims.defineNodeNameProperty('form', 'novalidate', {
913
966
  attr: {
914
967
  set: function(val){
@@ -923,40 +976,124 @@ if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate'
923
976
  }
924
977
 
925
978
 
926
- if(Modernizr.formattribute === false || !Modernizr.fieldsetdisabled){
979
+ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldsetelements){
927
980
  (function(){
928
-
929
- (function(prop, undefined){
930
- $.prop = function(elem, name, value){
931
- var ret;
932
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
933
- ret = document.getElementsByName(name);
934
- if(!ret || !ret.length){
935
- ret = document.getElementById(name);
981
+ if(!Modernizr.fieldsetdisabled){
982
+ var isFieldsetGroup = /^(?:fieldset)$/i;
983
+ $.extend($.expr[":"], {
984
+ "enabled": function( elem ) {
985
+ return elem.disabled === false || (isFieldsetGroup.test(elem.nodeName) && elem.getAttribute('disabled') == null && !$(elem).is('fieldset[disabled] *')) ;
986
+ },
987
+
988
+ "disabled": function( elem ) {
989
+ return elem.disabled === true || (isFieldsetGroup.test(elem.nodeName) && (elem.getAttribute('disabled') != null || $(elem).is('fieldset[disabled] *')));
990
+ }
991
+ });
992
+
993
+
994
+ var groupControl = {
995
+ getElements: function(group){
996
+ $('input, textarea, select, button', group).each(groupControl.disable);
997
+ },
998
+ disable: function(){
999
+ if(!this.disabled){
1000
+ webshims.data(this, 'groupedisabled', true);
1001
+ this.disabled = true;
936
1002
  }
937
- if(ret){
938
- ret = $(ret).filter(function(){
939
- return $.prop(this, 'form') == elem;
940
- }).get();
941
- if(ret.length){
942
- return ret.length == 1 ? ret[0] : ret;
943
- }
1003
+ },
1004
+ enable: function(){
1005
+ if(this.disabled && webshims.data(this, 'groupedisabled')){
1006
+ webshims.data(this, 'groupedisabled', false);
1007
+ this.disabled = false;
944
1008
  }
945
1009
  }
946
- return prop.apply(this, arguments);
947
1010
  };
948
- })($.prop, undefined);
949
-
950
- var removeAddedElements = function(form){
951
- var elements = $.data(form, 'webshimsAddedElements');
952
- if(elements){
953
- elements.remove();
954
- $.removeData(form, 'webshimsAddedElements');
955
- }
956
- };
1011
+
1012
+ $(window).on('unload', function(){
1013
+ $('input, textarea, select, button').each(groupControl.enable);
1014
+ });
1015
+
1016
+ webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', {
1017
+ set: function(value){
1018
+
1019
+ if(value){
1020
+ $('input, textarea, select, button', this).each(groupControl.disable);
1021
+ } else if(!$(this).is('fieldset[disabled] *')){
1022
+ var nested = $('fieldset[disabled]', this);
1023
+ var elements = $('input, textarea, select, button', this);
1024
+ if(nested.length){
1025
+ elements = elements.filter(':not(fieldset[disabled] *');
1026
+ }
1027
+ elements.each(groupControl.enable);
1028
+ }
1029
+ },
1030
+ initAttr: true
1031
+ });
1032
+
1033
+ ['input', 'textarea', 'select', 'button'].forEach(function(nodeName){
1034
+ var desc = webshims.defineNodeNameProperty(nodeName, 'disabled', {
1035
+ prop: {
1036
+ set: function(value){
1037
+ if(value){
1038
+ webshims.data(this, 'groupedisabled', false);
1039
+ desc.prop._supset.call(this, value);
1040
+ } else if($(this).is('fieldset[disabled] *')){
1041
+ webshims.data(this, 'groupedisabled', true);
1042
+ desc.prop._supset.call(this, true);
1043
+ } else {
1044
+ webshims.data(this, 'groupedisabled', false);
1045
+ desc.prop._supset.call(this, value);
1046
+ }
1047
+ },
1048
+ get: function(){
1049
+ var ret = desc.prop._supget.call(this);
1050
+ return ret ? !webshims.data(this, 'groupedisabled') : ret;
1051
+ }
1052
+ },
1053
+ removeAttr: {
1054
+ value: function(){
1055
+ desc.set.call(this, false);
1056
+ }
1057
+ }
1058
+ });
1059
+ });
1060
+
1061
+ webshims.addReady(function(context){
1062
+ $(context).filter('fieldset[disabled], fieldset[disabled] *').each(groupControl.disable);
1063
+ });
1064
+ }
957
1065
 
958
1066
 
959
1067
  if(!Modernizr.formattribute){
1068
+ (function(prop, undefined){
1069
+ $.prop = function(elem, name, value){
1070
+ var ret;
1071
+ if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
1072
+ ret = document.getElementsByName(name);
1073
+ if(!ret || !ret.length){
1074
+ ret = document.getElementById(name);
1075
+ }
1076
+ if(ret){
1077
+ ret = $(ret).filter(function(){
1078
+ return $.prop(this, 'form') == elem;
1079
+ }).get();
1080
+ if(ret.length){
1081
+ return ret.length == 1 ? ret[0] : ret;
1082
+ }
1083
+ }
1084
+ }
1085
+ return prop.apply(this, arguments);
1086
+ };
1087
+ })($.prop, undefined);
1088
+
1089
+ var removeAddedElements = function(form){
1090
+ var elements = $.data(form, 'webshimsAddedElements');
1091
+ if(elements){
1092
+ elements.remove();
1093
+ $.removeData(form, 'webshimsAddedElements');
1094
+ }
1095
+ };
1096
+
960
1097
  webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
961
1098
  prop: {
962
1099
  get: function(){
@@ -1053,9 +1190,37 @@ if(Modernizr.formattribute === false || !Modernizr.fieldsetdisabled){
1053
1190
  }
1054
1191
  });
1055
1192
  });
1193
+
1194
+ if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
1195
+ var rCRLF = /\r?\n/g,
1196
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
1197
+ rselectTextarea = /^(?:select|textarea)/i;
1198
+ $.fn.serializeArray = function() {
1199
+ return this.map(function(){
1200
+ var elements = $.prop(this, 'elements');
1201
+ return elements ? $.makeArray( elements ) : this;
1202
+ })
1203
+ .filter(function(){
1204
+ return this.name && !$(this).is(':disabled') &&
1205
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
1206
+ rinput.test( this.type ) );
1207
+ })
1208
+ .map(function( i, elem ){
1209
+ var val = $( this ).val();
1210
+
1211
+ return val == null ?
1212
+ null :
1213
+ $.isArray( val ) ?
1214
+ $.map( val, function( val, i ){
1215
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1216
+ }) :
1217
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1218
+ }).get();
1219
+ };
1220
+ }
1056
1221
  }
1057
1222
 
1058
- if(!Modernizr.fieldsetdisabled){
1223
+ if(!Modernizr.fieldsetelements){
1059
1224
  webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
1060
1225
  prop: {
1061
1226
  get: function(){
@@ -1067,34 +1232,6 @@ if(Modernizr.formattribute === false || !Modernizr.fieldsetdisabled){
1067
1232
  });
1068
1233
  }
1069
1234
 
1070
- if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
1071
- var rCRLF = /\r?\n/g,
1072
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
1073
- rselectTextarea = /^(?:select|textarea)/i;
1074
- $.fn.serializeArray = function() {
1075
- return this.map(function(){
1076
- var elements = $.prop(this, 'elements');
1077
- return elements ? $.makeArray( elements ) : this;
1078
- })
1079
- .filter(function(){
1080
- return this.name && !this.disabled &&
1081
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
1082
- rinput.test( this.type ) );
1083
- })
1084
- .map(function( i, elem ){
1085
- var val = $( this ).val();
1086
-
1087
- return val == null ?
1088
- null :
1089
- $.isArray( val ) ?
1090
- $.map( val, function( val, i ){
1091
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1092
- }) :
1093
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1094
- }).get();
1095
- };
1096
- }
1097
-
1098
1235
  })();
1099
1236
  }
1100
1237
 
@@ -1321,6 +1458,118 @@ try {
1321
1458
  })();
1322
1459
  }
1323
1460
 
1461
+ if(!('setSelectionRange' in document.createElement('input'))){
1462
+ (function(){
1463
+ var getSelection = function(elem, getStart){
1464
+ var range, value, normalizedValue, textInputRange, len, endRange;
1465
+ var start = 0;
1466
+ var end = 0;
1467
+ if (document.selection && (range = document.selection.createRange()) && range.parentElement() == elem) {
1468
+ value = $.prop(elem, 'value');
1469
+ len = value.length;
1470
+ normalizedValue = value.replace(/\r\n/g, "\n");
1471
+
1472
+ textInputRange = elem.createTextRange();
1473
+ textInputRange.moveToBookmark(range.getBookmark());
1474
+
1475
+
1476
+ endRange = elem.createTextRange();
1477
+ endRange.collapse(false);
1478
+
1479
+ if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
1480
+ start = end = len;
1481
+ } else {
1482
+ if(getStart){
1483
+ start = -textInputRange.moveStart("character", -len);
1484
+ start += normalizedValue.slice(0, start).split("\n").length - 1;
1485
+ } else {
1486
+ if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
1487
+ end = len;
1488
+ } else {
1489
+ end = -textInputRange.moveEnd("character", -len);
1490
+ end += normalizedValue.slice(0, end).split("\n").length - 1;
1491
+ }
1492
+ }
1493
+
1494
+ }
1495
+ }
1496
+ return {
1497
+ start: start,
1498
+ end: end
1499
+ };
1500
+ };
1501
+
1502
+ ['input', 'textarea'].forEach(function(name){
1503
+ var isTextarea = name == 'textarea';
1504
+ //email?
1505
+ var allowedTypes = {text: 1, search: 1, url: 1, tel: 1, password: 1, email: 1};
1506
+ 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';
1507
+ webshims.defineNodeNameProperties(name, {
1508
+ selectionStart: {
1509
+ get: function(){
1510
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
1511
+ return getSelection(this, true).start;
1512
+ }
1513
+ webshims.error(error);
1514
+ },
1515
+ set: function(v){
1516
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
1517
+ var range = this.createTextRange();
1518
+ range.collapse(true);
1519
+ range.moveStart('character', v);
1520
+ range.moveEnd('character', $.prop(this, 'selectionEnd'));
1521
+ if($(this).is(':focus')){
1522
+ range.select();
1523
+ }
1524
+ } else {
1525
+ webshims.error(error);
1526
+ }
1527
+ }
1528
+ },
1529
+ selectionEnd: {
1530
+ get: function(){
1531
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
1532
+ return getSelection(this).end;
1533
+ }
1534
+ webshims.error(error);
1535
+ },
1536
+ set: function(v){
1537
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
1538
+ var range = this.createTextRange();
1539
+ var start;
1540
+ range.collapse(true);
1541
+ start = getSelection(this, true).start;
1542
+ range.moveStart('character', start);
1543
+ range.moveEnd('character', v - start);
1544
+ if($(this).is(':focus')){
1545
+ range.select();
1546
+ }
1547
+ } else {
1548
+ webshims.error(error);
1549
+ }
1550
+ }
1551
+ },
1552
+ setSelectionRange: {
1553
+ value: function(start, end, dir){
1554
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
1555
+ var range = this.createTextRange();
1556
+ range.collapse(true);
1557
+ range.moveStart('character', start);
1558
+ range.moveEnd('character', end - start);
1559
+ if($(this).is(':focus')){
1560
+ range.select();
1561
+ }
1562
+ } else {
1563
+ webshims.error(error);
1564
+ }
1565
+ }
1566
+ }
1567
+ }, 'prop');
1568
+ });
1569
+
1570
+ })();
1571
+ }
1572
+
1324
1573
  (function(){
1325
1574
  if(options.noPlaceholderPolyfill){return;}
1326
1575
  var bustedPlaceholder;
@@ -1357,24 +1606,14 @@ try {
1357
1606
  var isOver = (webshims.cfg.forms.placeholderType == 'over');
1358
1607
  var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
1359
1608
  var polyfillElements = ['textarea'];
1360
- var debug = webshims.debug !== false;
1361
1609
  if(!Modernizr.input.placeholder || bustedPlaceholder){
1362
1610
  polyfillElements.push('input');
1363
1611
  }
1364
1612
 
1365
1613
  var setSelection = function(elem){
1366
1614
  try {
1367
- if(elem.setSelectionRange){
1368
- elem.setSelectionRange(0, 0);
1369
- return true;
1370
- } else if(elem.createTextRange){
1371
- var range = elem.createTextRange();
1372
- range.collapse(true);
1373
- range.moveEnd('character', 0);
1374
- range.moveStart('character', 0);
1375
- range.select();
1376
- return true;
1377
- }
1615
+ $(elem).setSelectionRange(0,0);
1616
+ return true;
1378
1617
  } catch(er){}
1379
1618
  };
1380
1619
 
@@ -1396,7 +1635,7 @@ try {
1396
1635
  elem.value = $.prop(elem, 'value');
1397
1636
  data.box.removeClass('placeholder-visible');
1398
1637
  clearTimeout(selectTimer);
1399
- $(elem).unbind('.placeholderremove');
1638
+ $(elem).off('.placeholderremove');
1400
1639
  },
1401
1640
  'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
1402
1641
  setSelection(elem);
@@ -1407,7 +1646,7 @@ try {
1407
1646
  },
1408
1647
  'blur.placeholderremove': function(){
1409
1648
  clearTimeout(selectTimer);
1410
- $(elem).unbind('.placeholderremove');
1649
+ $(elem).off('.placeholderremove');
1411
1650
  }
1412
1651
  })
1413
1652
  ;
@@ -1422,10 +1661,10 @@ try {
1422
1661
  'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1423
1662
  if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1424
1663
  data.box.removeClass('placeholder-visible');
1425
- $(elem).unbind('.placeholderremove');
1664
+ $(elem).off('.placeholderremove');
1426
1665
  },
1427
1666
  'blur.placeholderremove': function(){
1428
- $(elem).unbind('.placeholderremove');
1667
+ $(elem).off('.placeholderremove');
1429
1668
  }
1430
1669
  })
1431
1670
  ;
@@ -1453,7 +1692,7 @@ try {
1453
1692
  placeholderTxt = $.attr(elem, 'placeholder') || '';
1454
1693
  }
1455
1694
 
1456
- $(elem).unbind('.placeholderremove');
1695
+ $(elem).off('.placeholderremove');
1457
1696
 
1458
1697
  if(value === false){
1459
1698
  value = $.prop(elem, 'value');
@@ -1526,10 +1765,10 @@ try {
1526
1765
  if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1527
1766
  data.box = data.text;
1528
1767
  } else {
1529
- data.box = $(elem)
1530
- .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1531
- .parent()
1768
+ data.box = $('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1769
+ .insertAfter(elem)
1532
1770
  ;
1771
+ data.box.append(elem);
1533
1772
  }
1534
1773
  data.text
1535
1774
  .insertAfter(elem)
@@ -1784,7 +2023,7 @@ try {
1784
2023
  extraTimer = setTimeout(trigger, 9);
1785
2024
  },
1786
2025
  unbind = function(){
1787
- input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput triggerinput', trigger);
2026
+ input.off('focusout', unbind).off('keyup keypress keydown paste cut', extraTest).off('input change updateInput triggerinput', trigger);
1788
2027
  clearInterval(timer);
1789
2028
  setTimeout(function(){
1790
2029
  trigger();
@@ -1816,4 +2055,4 @@ try {
1816
2055
  })();
1817
2056
 
1818
2057
 
1819
- });
2058
+ });