webshims-rails 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +41 -20
  4. data/vendor/assets/javascripts/webshims/shims/combos/10.js +212 -42
  5. data/vendor/assets/javascripts/webshims/shims/combos/11.js +196 -37
  6. data/vendor/assets/javascripts/webshims/shims/combos/12.js +82 -36
  7. data/vendor/assets/javascripts/webshims/shims/combos/13.js +82 -36
  8. data/vendor/assets/javascripts/webshims/shims/combos/14.js +17 -6
  9. data/vendor/assets/javascripts/webshims/shims/combos/15.js +234 -1247
  10. data/vendor/assets/javascripts/webshims/shims/combos/16.js +234 -1247
  11. data/vendor/assets/javascripts/webshims/shims/combos/17.js +202 -45
  12. data/vendor/assets/javascripts/webshims/shims/combos/18.js +202 -45
  13. data/vendor/assets/javascripts/webshims/shims/combos/19.js +16 -5
  14. data/vendor/assets/javascripts/webshims/shims/combos/2.js +51 -11
  15. data/vendor/assets/javascripts/webshims/shims/combos/20.js +16 -5
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +82 -36
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +82 -36
  18. data/vendor/assets/javascripts/webshims/shims/combos/24.js +1689 -997
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +16 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +16 -5
  21. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -5
  22. data/vendor/assets/javascripts/webshims/shims/combos/30.js +51 -11
  23. data/vendor/assets/javascripts/webshims/shims/combos/31.js +51 -11
  24. data/vendor/assets/javascripts/webshims/shims/combos/4.js +16 -5
  25. data/vendor/assets/javascripts/webshims/shims/combos/5.js +202 -45
  26. data/vendor/assets/javascripts/webshims/shims/combos/6.js +237 -51
  27. data/vendor/assets/javascripts/webshims/shims/combos/7.js +51 -11
  28. data/vendor/assets/javascripts/webshims/shims/combos/8.js +16 -5
  29. data/vendor/assets/javascripts/webshims/shims/combos/9.js +247 -48
  30. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +17 -5
  31. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +21 -3
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +35 -6
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +6 -8
  34. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +134 -24
  35. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +152 -1205
  36. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +1076 -0
  37. data/vendor/assets/javascripts/webshims/shims/form-validation.js +47 -20
  38. data/vendor/assets/javascripts/webshims/shims/form-validators.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-de.txt → formcfg-de.js} +3 -0
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-en.txt → formcfg-en.js} +5 -1
  42. data/vendor/assets/javascripts/webshims/shims/json-storage.js +1 -1
  43. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
  44. data/vendor/assets/javascripts/webshims/shims/range-ui.js +62 -13
  45. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +610 -0
  46. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +10 -0
  47. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +743 -0
  48. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1 -755
  49. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +0 -606
  50. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/shims/track-ui.js +36 -23
  52. data/vendor/assets/javascripts/webshims/shims/track.js +82 -36
  53. metadata +8 -6
  54. data/vendor/assets/javascripts/webshims/shims/combos/28.js +0 -2196
  55. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1167
@@ -1,4 +1,3 @@
1
- if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){
2
1
  webshims.register('form-shim-extend', function($, webshims, window, document, undefined, options){
3
2
  "use strict";
4
3
  webshims.inputTypes = webshims.inputTypes || {};
@@ -93,7 +92,7 @@ var isPlaceholderOptionSelected = function(select){
93
92
  }
94
93
  return false;
95
94
  };
96
- var modules = webshims.modules;
95
+
97
96
  var emptyJ = $([]);
98
97
  var getGroupElements = function(elem){
99
98
  elem = $(elem);
@@ -213,36 +212,6 @@ $.event.special.invalid = {
213
212
  }
214
213
  };
215
214
 
216
- var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
217
- var addSubmitBubbles = function(form){
218
- if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
219
-
220
- $.event.add( form, 'submit._submit', function( event ) {
221
- event._submit_bubble = true;
222
- });
223
-
224
- form._submit_attached = true;
225
- }
226
- };
227
- if(!supportSubmitBubbles && $.event.special.submit){
228
- $.event.special.submit.setup = function() {
229
- // Only need this for delegated form submit events
230
- if ( $.nodeName( this, "form" ) ) {
231
- return false;
232
- }
233
-
234
- // Lazy-add a submit handler when a descendant form may potentially be submitted
235
- $.event.add( this, "click._submit keypress._submit", function( e ) {
236
- // Node name check avoids a VML-related crash in IE (#9807)
237
- var elem = e.target,
238
- form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
239
- addSubmitBubbles(form);
240
-
241
- });
242
- // return undefined since we don't need an event listener
243
- };
244
- }
245
-
246
215
  $.event.special.submit = $.event.special.submit || {setup: function(){return false;}};
247
216
  var submitSetup = $.event.special.submit.setup;
248
217
  $.extend($.event.special.submit, {
@@ -255,24 +224,27 @@ $.extend($.event.special.submit, {
255
224
  return submitSetup.apply(this, arguments);
256
225
  }
257
226
  });
258
-
259
- $(window).on('invalid', $.noop);
227
+ webshims.ready('form-shim-extend2 WINDOWLOAD', function(){
228
+ $(window).on('invalid', $.noop);
229
+ });
260
230
 
261
231
 
262
232
  webshims.addInputType('email', {
263
233
  mismatch: (function(){
264
234
  //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
265
235
  var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
266
- return function(val){
267
- // optional punycode support: https://github.com/bestiejs/punycode.js
268
- if(window.punycode && punycode.toASCII){
269
- try {
270
- if( test.test(punycode.toASCII(val)) ){
271
- return false;
272
- }
273
- } catch(er){}
236
+ var splitReg = /\s*,\s*/g;
237
+ return function(val, input){
238
+ var ret = false;
239
+ val = $(input).prop('multiple') ? val.split(splitReg) : [val];
240
+
241
+ for(var i = 0; i < val.length; i++){
242
+ if(!test.test(val[i])){
243
+ ret = true;
244
+ break;
245
+ }
274
246
  }
275
- return !test.test(val);
247
+ return ret;
276
248
  };
277
249
  })()
278
250
  });
@@ -434,277 +406,9 @@ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'requir
434
406
  },
435
407
  initAttr: Modernizr.localstorage //only if we have aria-support
436
408
  });
409
+ webshims.defineNodeNamesBooleanProperty(['input'], 'multiple');
437
410
 
438
- webshims.reflectProperties(['input'], ['pattern']);
439
-
440
-
441
- if( !('maxLength' in document.createElement('textarea')) ){
442
- var constrainMaxLength = (function(){
443
- var timer;
444
- var curLength = 0;
445
- var lastElement = $([]);
446
- var max = 1e9;
447
- var constrainLength = function(){
448
- var nowValue = lastElement.prop('value');
449
- var nowLen = nowValue.length;
450
- if(nowLen > curLength && nowLen > max){
451
- nowLen = Math.max(curLength, max);
452
- lastElement.prop('value', nowValue.substr(0, nowLen ));
453
- }
454
- curLength = nowLen;
455
- };
456
- var remove = function(){
457
- clearTimeout(timer);
458
- lastElement.unbind('.maxlengthconstraint');
459
- };
460
- return function(element, maxLength){
461
- remove();
462
- if(maxLength > -1){
463
- max = maxLength;
464
- curLength = $.prop(element, 'value').length;
465
- lastElement = $(element);
466
- lastElement.on({
467
- 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
468
- setTimeout(constrainLength, 0);
469
- },
470
- 'keyup.maxlengthconstraint': constrainLength,
471
- 'blur.maxlengthconstraint': remove
472
- });
473
- timer = setInterval(constrainLength, 200);
474
- }
475
- };
476
- })();
477
-
478
- constrainMaxLength.update = function(element, maxLength){
479
- if($(element).is(':focus')){
480
- if(!maxLength){
481
- maxLength = $.prop(element, 'maxlength');
482
- }
483
- constrainMaxLength(element, maxLength);
484
- }
485
- };
486
-
487
- $(document).on('focusin', function(e){
488
- var maxLength;
489
- if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
490
- constrainMaxLength(e.target, maxLength);
491
- }
492
- });
493
-
494
- webshims.defineNodeNameProperty('textarea', 'maxlength', {
495
- attr: {
496
- set: function(val){
497
- this.setAttribute('maxlength', ''+val);
498
- constrainMaxLength.update(this);
499
- },
500
- get: function(){
501
- var ret = this.getAttribute('maxlength');
502
- return ret == null ? undefined : ret;
503
- }
504
- },
505
- prop: {
506
- set: function(val){
507
- if(isNumber(val)){
508
- if(val < 0){
509
- throw('INDEX_SIZE_ERR');
510
- }
511
- val = parseInt(val, 10);
512
- this.setAttribute('maxlength', val);
513
- constrainMaxLength.update(this, val);
514
- return;
515
- }
516
- this.setAttribute('maxlength', '0');
517
- constrainMaxLength.update(this, 0);
518
- },
519
- get: function(){
520
- var val = this.getAttribute('maxlength');
521
- return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
522
-
523
- }
524
- }
525
- });
526
- webshims.defineNodeNameProperty('textarea', 'maxLength', {
527
- prop: {
528
- set: function(val){
529
- $.prop(this, 'maxlength', val);
530
- },
531
- get: function(){
532
- return $.prop(this, 'maxlength');
533
- }
534
- }
535
- });
536
- }
537
-
538
-
539
-
540
- var submitterTypes = {submit: 1, button: 1, image: 1};
541
- var formSubmitterDescriptors = {};
542
- [
543
- {
544
- name: "enctype",
545
- limitedTo: {
546
- "application/x-www-form-urlencoded": 1,
547
- "multipart/form-data": 1,
548
- "text/plain": 1
549
- },
550
- defaultProp: "application/x-www-form-urlencoded",
551
- proptype: "enum"
552
- },
553
- {
554
- name: "method",
555
- limitedTo: {
556
- "get": 1,
557
- "post": 1
558
- },
559
- defaultProp: "get",
560
- proptype: "enum"
561
- },
562
- {
563
- name: "action",
564
- proptype: "url"
565
- },
566
- {
567
- name: "target"
568
- },
569
- {
570
- name: "novalidate",
571
- propName: "noValidate",
572
- proptype: "boolean"
573
- }
574
- ].forEach(function(desc){
575
- var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){
576
- return f.toUpperCase();
577
- });
578
- var attrName = 'form'+ desc.name;
579
- var formName = desc.name;
580
- var eventName = 'click.webshimssubmittermutate'+formName;
581
-
582
- var changeSubmitter = function(){
583
- var elem = this;
584
- if( !('form' in elem) || !submitterTypes[elem.type] ){return;}
585
- var form = $.prop(elem, 'form');
586
- if(!form){return;}
587
- var attr = $.attr(elem, attrName);
588
- if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){
589
-
590
- var oldAttr = $.attr(form, formName);
591
-
592
- $.attr(form, formName, attr);
593
- setTimeout(function(){
594
- if(oldAttr != null){
595
- $.attr(form, formName, oldAttr);
596
- } else {
597
- try {
598
- $(form).removeAttr(formName);
599
- } catch(er){
600
- form.removeAttribute(formName);
601
- }
602
- }
603
- }, 9);
604
- }
605
- };
606
-
607
-
608
-
609
- switch(desc.proptype) {
610
- case "url":
611
- var urlForm = document.createElement('form');
612
- formSubmitterDescriptors[propName] = {
613
- prop: {
614
- set: function(value){
615
- $.attr(this, attrName, value);
616
- },
617
- get: function(){
618
- var value = $.attr(this, attrName);
619
- if(value == null){return '';}
620
- urlForm.setAttribute('action', value);
621
- return urlForm.action;
622
- }
623
- }
624
- };
625
- break;
626
- case "boolean":
627
- formSubmitterDescriptors[propName] = {
628
- prop: {
629
- set: function(val){
630
- val = !!val;
631
- if(val){
632
- $.attr(this, 'formnovalidate', 'formnovalidate');
633
- } else {
634
- $(this).removeAttr('formnovalidate');
635
- }
636
- },
637
- get: function(){
638
- return $.attr(this, 'formnovalidate') != null;
639
- }
640
- }
641
- };
642
- break;
643
- case "enum":
644
- formSubmitterDescriptors[propName] = {
645
- prop: {
646
- set: function(value){
647
- $.attr(this, attrName, value);
648
- },
649
- get: function(){
650
- var value = $.attr(this, attrName);
651
- return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value;
652
- }
653
- }
654
- };
655
- break;
656
- default:
657
- formSubmitterDescriptors[propName] = {
658
- prop: {
659
- set: function(value){
660
- $.attr(this, attrName, value);
661
- },
662
- get: function(){
663
- var value = $.attr(this, attrName);
664
- return (value != null) ? value : "";
665
- }
666
- }
667
- };
668
- }
669
-
670
-
671
- if(!formSubmitterDescriptors[attrName]){
672
- formSubmitterDescriptors[attrName] = {};
673
- }
674
- formSubmitterDescriptors[attrName].attr = {
675
- set: function(value){
676
- formSubmitterDescriptors[attrName].attr._supset.call(this, value);
677
- $(this).unbind(eventName).on(eventName, changeSubmitter);
678
- },
679
- get: function(){
680
- return formSubmitterDescriptors[attrName].attr._supget.call(this);
681
- }
682
- };
683
- formSubmitterDescriptors[attrName].initAttr = true;
684
- formSubmitterDescriptors[attrName].removeAttr = {
685
- value: function(){
686
- $(this).unbind(eventName);
687
- formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
688
- }
689
- };
690
- });
691
-
692
- webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
693
-
694
-
695
- if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
696
- webshims.defineNodeNameProperty('form', 'novalidate', {
697
- attr: {
698
- set: function(val){
699
- this.setAttribute('novalidate', ''+val);
700
- },
701
- get: function(){
702
- var ret = this.getAttribute('novalidate');
703
- return ret == null ? undefined : ret;
704
- }
705
- }
706
- });
707
- } else if(webshims.bugs.bustedValidity){
411
+ if(webshims.bugs.bustedValidity){
708
412
 
709
413
  webshims.defineNodeNameProperty('form', 'novalidate', {
710
414
  attr: {
@@ -868,7 +572,7 @@ if(!Modernizr.input.list){
868
572
  var select = $('select', elem);
869
573
  var options;
870
574
  if(select[0]){
871
- options = select[0].options;
575
+ options = $.makeArray(select[0].options || []);
872
576
  } else {
873
577
  options = $('option', elem).get();
874
578
  if(options.length){
@@ -879,919 +583,162 @@ if(!Modernizr.input.list){
879
583
  }
880
584
  }
881
585
  });
882
-
883
- webshims.ready('form-datalist', function(){
884
- webshims.defineNodeNameProperties('input', {
885
- list: {
886
- attr: {
887
- get: function(){
888
- var val = webshims.contentAttr(this, 'list');
889
- return (val == null) ? undefined : val;
890
- },
891
- set: function(value){
892
- var elem = this;
893
- webshims.contentAttr(elem, 'list', value);
894
- webshims.objectCreate(options.shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
895
- $(elem).triggerHandler('listdatalistchange');
896
- }
897
- },
898
- initAttr: true,
899
- reflect: true,
900
- propType: 'element',
901
- propNodeName: 'datalist'
902
- }
903
- });
904
- });
905
-
906
586
  }
907
587
 
908
- if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){
909
- (function(){
910
- (function(prop, undefined){
911
- $.prop = function(elem, name, value){
912
- var ret;
913
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
914
- ret = document.getElementsByName(name);
915
- if(!ret || !ret.length){
916
- ret = document.getElementById(name);
917
- }
918
- if(ret){
919
- ret = $(ret).filter(function(){
920
- return $.prop(this, 'form') == elem;
921
- }).get();
922
- if(ret.length){
923
- return ret.length == 1 ? ret[0] : ret;
924
- }
925
- }
926
- }
927
- return prop.apply(this, arguments);
928
- };
929
- })($.prop, undefined);
930
- var removeAddedElements = function(form){
931
- var elements = $.data(form, 'webshimsAddedElements');
932
- if(elements){
933
- elements.remove();
934
- $.removeData(form, 'webshimsAddedElements');
935
- }
936
- };
937
-
938
-
939
- if(!Modernizr.formattribute){
940
- webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
941
- prop: {
942
- get: function(){
943
- var form = webshims.contentAttr(this, 'form');
944
- if(form){
945
- form = document.getElementById(form);
946
- if(form && !$.nodeName(form, 'form')){
947
- form = null;
948
- }
949
- }
950
- return form || this.form;
951
- },
952
- writeable: false
953
- }
954
- });
955
-
956
-
957
- webshims.defineNodeNamesProperty(['form'], 'elements', {
958
- prop: {
959
- get: function(){
960
- var id = this.id;
961
- var elements = $.makeArray(this.elements);
962
- if(id){
963
- elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
964
- }
965
- return elements;
966
- },
967
- writeable: false
968
- }
969
- });
970
-
971
-
972
-
973
- $(function(){
974
- var stopPropagation = function(e){
975
- e.stopPropagation();
976
- };
977
- $(document).on('submit', function(e){
978
-
979
- if(!e.isDefaultPrevented()){
980
- var form = e.target;
981
- var id = form.id;
982
- var elements;
983
-
984
-
985
- if(id){
986
- removeAddedElements(form);
987
-
988
- elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
989
- .filter(function(){
990
- return !this.disabled && this.name && this.form != form;
991
- })
992
- .clone()
993
- ;
994
- if(elements.length){
995
- $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
996
- setTimeout(function(){
997
- removeAddedElements(form);
998
- }, 9);
999
- }
1000
- elements = null;
1001
- }
1002
- }
1003
- });
1004
-
1005
- $(document).on('click', function(e){
1006
- if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){
1007
- var trueForm = $.prop(e.target, 'form');
1008
- var formIn = e.target.form;
1009
- var clone;
1010
- if(trueForm && trueForm != formIn){
1011
- clone = $(e.target)
1012
- .clone()
1013
- .removeAttr('form')
1014
- .addClass('webshims-visual-hide')
1015
- .on('click', stopPropagation)
1016
- .appendTo(trueForm)
1017
- ;
1018
- if(formIn){
1019
- e.preventDefault();
1020
- }
1021
- addSubmitBubbles(trueForm);
1022
- clone.trigger('click');
1023
- setTimeout(function(){
1024
- clone.remove();
1025
- clone = null;
1026
- }, 9);
1027
- }
1028
- }
1029
- });
1030
- });
1031
- }
1032
-
1033
- if(!Modernizr.fieldsetdisabled){
1034
- webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
1035
- prop: {
1036
- get: function(){
1037
- //add listed elements without keygen, object, output
1038
- return $('input, select, textarea, button, fieldset', this).get() || [];
1039
- },
1040
- writeable: false
1041
- }
1042
- });
1043
- }
1044
-
1045
- if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
1046
- var rCRLF = /\r?\n/g,
1047
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
1048
- rselectTextarea = /^(?:select|textarea)/i;
1049
- $.fn.serializeArray = function() {
1050
- return this.map(function(){
1051
- var elements = $.prop(this, 'elements');
1052
- return elements ? $.makeArray( elements ) : this;
1053
- })
1054
- .filter(function(){
1055
- return this.name && !this.disabled &&
1056
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
1057
- rinput.test( this.type ) );
1058
- })
1059
- .map(function( i, elem ){
1060
- var val = $( this ).val();
1061
-
1062
- return val == null ?
1063
- null :
1064
- $.isArray( val ) ?
1065
- $.map( val, function( val, i ){
1066
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1067
- }) :
1068
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1069
- }).get();
1070
- };
1071
- }
1072
-
1073
- })();
1074
- }
1075
588
 
1076
- if($('<input />').prop('labels') == null){
1077
- webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
1078
- prop: {
1079
- get: function(){
1080
- if(this.type == 'hidden'){return null;}
1081
- var id = this.id;
1082
- var labels = $(this)
1083
- .closest('label')
1084
- .filter(function(){
1085
- var hFor = (this.attributes['for'] || {});
1086
- return (!hFor.specified || hFor.value == id);
1087
- })
1088
- ;
1089
-
1090
- if(id) {
1091
- labels = labels.add('label[for="'+ id +'"]');
1092
- }
1093
- return labels.get();
1094
- },
1095
- writeable: false
1096
- }
1097
- });
589
+
590
+ var submitterTypes = {submit: 1, button: 1, image: 1};
591
+ var formSubmitterDescriptors = {};
592
+ [
593
+ {
594
+ name: "enctype",
595
+ limitedTo: {
596
+ "application/x-www-form-urlencoded": 1,
597
+ "multipart/form-data": 1,
598
+ "text/plain": 1
599
+ },
600
+ defaultProp: "application/x-www-form-urlencoded",
601
+ proptype: "enum"
602
+ },
603
+ {
604
+ name: "method",
605
+ limitedTo: {
606
+ "get": 1,
607
+ "post": 1
608
+ },
609
+ defaultProp: "get",
610
+ proptype: "enum"
611
+ },
612
+ {
613
+ name: "action",
614
+ proptype: "url"
615
+ },
616
+ {
617
+ name: "target"
618
+ },
619
+ {
620
+ name: "novalidate",
621
+ propName: "noValidate",
622
+ proptype: "boolean"
1098
623
  }
624
+ ].forEach(function(desc){
625
+ var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){
626
+ return f.toUpperCase();
627
+ });
628
+ var attrName = 'form'+ desc.name;
629
+ var formName = desc.name;
630
+ var eventName = 'click.webshimssubmittermutate'+formName;
1099
631
 
1100
- if(!('value' in document.createElement('progress'))){
1101
- (function(){
1102
-
1103
- var nan = parseInt('NaN', 10);
1104
-
1105
- var updateProgress = function(progress){
1106
- var position;
1107
-
1108
-
1109
- position = $.prop(progress, 'position');
1110
-
1111
- $.attr(progress, 'data-position', position);
1112
- $('> span', progress).css({width: (position < 0 ? 100 : position * 100) +'%'});
1113
- };
1114
- var desc = {
1115
- position: {
1116
- prop: {
1117
- get: function(){
1118
- var max;
1119
- //jQuery 1.8.x try's to normalize "0" to 0
1120
- var val = this.getAttribute('value');
1121
- var ret = -1;
1122
-
1123
- val = val ? (val * 1) : nan;
1124
- if(!isNaN(val)){
1125
- max = $.prop(this, 'max');
1126
- ret = Math.max(Math.min(val / max, 1), 0);
1127
- if(updateProgress.isInChange){
1128
- $.attr(this, 'aria-valuenow', ret * 100);
1129
- if(updateProgress.isInChange == 'max'){
1130
- $.attr(this, 'aria-valuemax', max);
1131
- }
1132
- }
1133
- } else if(updateProgress.isInChange) {
1134
- $(this).removeAttr('aria-valuenow');
1135
- }
1136
- return ret;
1137
- },
1138
- writeable: false
1139
- }
1140
- }
1141
- };
1142
-
1143
- $.each({value: 0, max: 1}, function(name, defValue){
1144
- var removeProp = (name == 'value' && !$.fn.finish);
1145
- desc[name] = {
1146
- attr: {
1147
- set: function(value){
1148
- var ret = desc[name].attr._supset.call(this, value);
1149
- updateProgress.isInChange = name;
1150
- updateProgress(this);
1151
- updateProgress.isInChange = false;
1152
- return ret;
1153
- }
1154
- },
1155
- removeAttr: {
1156
- value: function(){
1157
- this.removeAttribute(name);
1158
- if(removeProp){
1159
- try {
1160
- delete this.value;
1161
- } catch(er){}
1162
- }
1163
- updateProgress.isInChange = name;
1164
- updateProgress(this);
1165
- updateProgress.isInChange = false;
1166
- }
1167
- },
1168
- prop: {
1169
- get: function(){
1170
- var max;
1171
- var ret = (desc[name].attr.get.call(this) * 1);
1172
- if(ret < 0 || isNaN(ret)){
1173
- ret = defValue;
1174
- } else if(name == 'value'){
1175
- ret = Math.min(ret, $.prop(this, 'max'));
1176
- } else if(ret === 0){
1177
- ret = defValue;
1178
- }
1179
- return ret;
1180
- },
1181
- set: function(value){
1182
- value = value * 1;
1183
- if(isNaN(value)){
1184
- webshims.error('Floating-point value is not finite.');
1185
- }
1186
- return desc[name].attr.set.call(this, value);
1187
- }
1188
- }
1189
- };
1190
- });
1191
-
1192
- webshims.createElement(
1193
- 'progress',
1194
- function(){
1195
- var labels = $(this)
1196
- .attr({role: 'progressbar', 'aria-valuemin': '0'})
1197
- .html('<span class="progress-value" />')
1198
- .jProp('labels')
1199
- .map(function(){
1200
- return webshims.getID(this);
1201
- })
1202
- .get()
1203
- ;
1204
- if(labels.length){
1205
- $.attr(this, 'aria-labelledby', labels.join(' '));
1206
- } else {
1207
- webshims.info("you should use label elements for your prgogress elements");
1208
- }
1209
-
1210
- updateProgress.isInChange = 'max';
1211
- updateProgress(this);
1212
- updateProgress.isInChange = false;
1213
- },
1214
- desc
1215
- );
1216
-
1217
- })();
1218
- }
1219
-
1220
- try {
1221
- document.querySelector(':checked');
1222
- } catch(er){
1223
- (function(){
1224
- $('html').addClass('no-csschecked');
1225
- var checkInputs = {
1226
- radio: 1,
1227
- checkbox: 1
1228
- };
1229
- var selectChange = function(){
1230
- var options = this.options || [];
1231
- var i, len, option;
1232
- for(i = 0, len = options.length; i < len; i++){
1233
- option = $(options[i]);
1234
- option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
1235
- }
1236
- };
1237
- var checkChange = function(){
1238
- var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
1239
- var className = this.className || '';
1240
- var parent;
632
+ var changeSubmitter = function(){
633
+ var elem = this;
634
+ if( !('form' in elem) || !submitterTypes[elem.type] ){return;}
635
+ var form = $.prop(elem, 'form');
636
+ if(!form){return;}
637
+ var attr = $.attr(elem, attrName);
638
+ if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){
1241
639
 
1242
- //IE8- has problems to update styles, we help
1243
- if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
1244
- $(this)[fn]('prop-checked');
1245
- if((parent = this.parentNode)){
1246
- parent.className = parent.className;
1247
- }
1248
- }
1249
- };
1250
-
1251
-
1252
- webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
1253
- webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
1254
- webshims.onNodeNamesPropertyModify('option', 'selected', function(){
1255
- $(this).closest('select').each(selectChange);
1256
- });
1257
- webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
1258
- var type = this.type;
1259
- if(type == 'radio' && boolVal){
1260
- getGroupElements(this).each(checkChange);
1261
- } else if(checkInputs[type]) {
1262
- $(this).each(checkChange);
1263
- }
1264
- });
1265
-
1266
- $(document).on('change', function(e){
640
+ var oldAttr = $.attr(form, formName);
1267
641
 
1268
- if(checkInputs[e.target.type]){
1269
- if(e.target.type == 'radio'){
1270
- getGroupElements(e.target).each(checkChange);
642
+ $.attr(form, formName, attr);
643
+ setTimeout(function(){
644
+ if(oldAttr != null){
645
+ $.attr(form, formName, oldAttr);
1271
646
  } else {
1272
- $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
1273
- }
1274
- } else if(e.target.nodeName.toLowerCase() == 'select'){
1275
- $(e.target).each(selectChange);
1276
- }
1277
- });
1278
-
1279
- webshims.addReady(function(context, contextElem){
1280
- $('option, input', context)
1281
- .add(contextElem.filter('option, input'))
1282
- .each(function(){
1283
- var prop;
1284
- if(checkInputs[this.type]){
1285
- prop = 'checked';
1286
- } else if(this.nodeName.toLowerCase() == 'option'){
1287
- prop = 'selected';
1288
- }
1289
- if(prop){
1290
- $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
647
+ try {
648
+ $(form).removeAttr(formName);
649
+ } catch(er){
650
+ form.removeAttribute(formName);
1291
651
  }
1292
-
1293
- })
1294
- ;
1295
- });
1296
- })();
1297
- }
1298
-
1299
- (function(){
1300
- var bustedPlaceholder;
1301
- Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
1302
- if(Modernizr.input.placeholder && options.overridePlaceholder){
1303
- bustedPlaceholder = true;
1304
- }
1305
- if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
1306
- (function(){
1307
- var ua = navigator.userAgent;
1308
-
1309
- if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
1310
- $(window).on('orientationchange', (function(){
1311
- var timer;
1312
- var retVal = function(i, value){
1313
- return value;
1314
- };
1315
-
1316
- var set = function(){
1317
- $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
1318
- };
1319
- return function(e){
1320
- clearTimeout(timer);
1321
- timer = setTimeout(set, 9);
1322
- };
1323
- })());
1324
- }
1325
- })();
1326
-
1327
- //abort
1328
- return;
1329
- }
1330
-
1331
- var isOver = (webshims.cfg.forms.placeholderType == 'over');
1332
- var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
1333
- var polyfillElements = ['textarea'];
1334
- var debug = webshims.debug !== false;
1335
- if(!Modernizr.input.placeholder || bustedPlaceholder){
1336
- polyfillElements.push('input');
1337
- }
1338
-
1339
- var setSelection = function(elem){
1340
- try {
1341
- if(elem.setSelectionRange){
1342
- elem.setSelectionRange(0, 0);
1343
- return true;
1344
- } else if(elem.createTextRange){
1345
- var range = elem.createTextRange();
1346
- range.collapse(true);
1347
- range.moveEnd('character', 0);
1348
- range.moveStart('character', 0);
1349
- range.select();
1350
- return true;
1351
- }
1352
- } catch(er){}
652
+ }
653
+ }, 9);
654
+ }
1353
655
  };
1354
656
 
1355
- var hidePlaceholder = function(elem, data, value, _onFocus){
1356
- if(value === false){
1357
- value = $.prop(elem, 'value');
1358
- }
1359
-
1360
- if(!isOver && elem.type != 'password'){
1361
- if(!value && _onFocus && setSelection(elem)){
1362
- var selectTimer = setTimeout(function(){
1363
- setSelection(elem);
1364
- }, 9);
1365
- $(elem)
1366
- .off('.placeholderremove')
1367
- .on({
1368
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1369
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1370
- elem.value = $.prop(elem, 'value');
1371
- data.box.removeClass('placeholder-visible');
1372
- clearTimeout(selectTimer);
1373
- $(elem).unbind('.placeholderremove');
1374
- },
1375
- 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
1376
- setSelection(elem);
1377
- clearTimeout(selectTimer);
1378
- selectTimer = setTimeout(function(){
1379
- setSelection(elem);
1380
- }, 9);
1381
- },
1382
- 'blur.placeholderremove': function(){
1383
- clearTimeout(selectTimer);
1384
- $(elem).unbind('.placeholderremove');
1385
- }
1386
- })
1387
- ;
1388
- return;
1389
- } else if(!_onFocus && !value && elem.value){ //especially on submit
1390
- elem.value = value;
1391
- }
1392
- } else if(!value && _onFocus){
1393
- $(elem)
1394
- .off('.placeholderremove')
1395
- .on({
1396
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1397
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1398
- data.box.removeClass('placeholder-visible');
1399
- $(elem).unbind('.placeholderremove');
1400
- },
1401
- 'blur.placeholderremove': function(){
1402
- $(elem).unbind('.placeholderremove');
1403
- }
1404
- })
1405
- ;
1406
- return;
1407
- }
1408
- data.box.removeClass('placeholder-visible');
1409
- },
1410
- showPlaceholder = function(elem, data, placeholderTxt){
1411
- if(placeholderTxt === false){
1412
- placeholderTxt = $.prop(elem, 'placeholder');
1413
- }
1414
-
1415
- if(!isOver && elem.type != 'password'){
1416
- elem.value = placeholderTxt;
1417
- }
1418
- data.box.addClass('placeholder-visible');
1419
- },
1420
- changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
1421
- if(!data){
1422
- data = $.data(elem, 'placeHolder');
1423
- if(!data){return;}
1424
- }
1425
- var isVisible = $(elem).hasClass('placeholder-visible');
1426
- if(placeholderTxt === false){
1427
- placeholderTxt = $.attr(elem, 'placeholder') || '';
1428
- }
1429
-
1430
- $(elem).unbind('.placeholderremove');
1431
-
1432
- if(value === false){
1433
- value = $.prop(elem, 'value');
1434
- }
1435
-
1436
- if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
1437
- if(elem.type == 'password' || isOver || isVisible){
1438
- hidePlaceholder(elem, data, '', true);
1439
- }
1440
- return;
1441
- }
1442
-
1443
- if(value){
1444
- hidePlaceholder(elem, data, value);
1445
- return;
1446
- }
1447
-
1448
- if(placeholderTxt && !value){
1449
- showPlaceholder(elem, data, placeholderTxt);
1450
- } else {
1451
- hidePlaceholder(elem, data, value);
1452
- }
1453
- },
1454
- hasLabel = function(elem){
1455
- elem = $(elem);
1456
- return !!(elem.prop('title') || elem.attr('aria-labelledby') || elem.attr('aria-label') || elem.jProp('labels').length);
1457
- },
1458
- createPlaceholder = function(elem){
1459
- elem = $(elem);
1460
- return $( hasLabel(elem) ? '<span class="placeholder-text"></span>' : '<label for="'+ elem.prop('id') +'" class="placeholder-text"></label>');
1461
- },
1462
- pHolder = (function(){
1463
- var delReg = /\n|\r|\f|\t/g,
1464
- allowedPlaceholder = {
1465
- text: 1,
1466
- search: 1,
1467
- url: 1,
1468
- email: 1,
1469
- password: 1,
1470
- tel: 1,
1471
- number: 1
1472
- }
1473
- ;
1474
-
1475
- if(modules["form-number-date-ui"].loaded){
1476
- delete allowedPlaceholder.number;
1477
- }
1478
-
1479
- return {
1480
- create: function(elem){
1481
- var data = $.data(elem, 'placeHolder');
1482
- var form;
1483
- var responsiveElem;
1484
- if(data){return data;}
1485
- data = $.data(elem, 'placeHolder', {});
1486
-
1487
- $(elem).on('focus.placeholder blur.placeholder', function(e){
1488
- changePlaceholderVisibility(this, false, false, data, e.type );
1489
- data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
1490
- });
1491
-
1492
- if((form = $.prop(elem, 'form'))){
1493
- $(elem).onWSOff('reset.placeholder', function(e){
1494
- setTimeout(function(){
1495
- changePlaceholderVisibility(elem, false, false, data, e.type );
1496
- }, 0);
1497
- }, false, form);
657
+
658
+
659
+ switch(desc.proptype) {
660
+ case "url":
661
+ var urlForm = document.createElement('form');
662
+ formSubmitterDescriptors[propName] = {
663
+ prop: {
664
+ set: function(value){
665
+ $.attr(this, attrName, value);
666
+ },
667
+ get: function(){
668
+ var value = $.attr(this, attrName);
669
+ if(value == null){return '';}
670
+ urlForm.setAttribute('action', value);
671
+ return urlForm.action;
1498
672
  }
1499
-
1500
- if(elem.type == 'password' || isOver){
1501
- data.text = createPlaceholder(elem);
1502
- if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1503
- responsiveElem = true;
1504
- data.box = data.text;
673
+ }
674
+ };
675
+ break;
676
+ case "boolean":
677
+ formSubmitterDescriptors[propName] = {
678
+ prop: {
679
+ set: function(val){
680
+ val = !!val;
681
+ if(val){
682
+ $.attr(this, 'formnovalidate', 'formnovalidate');
1505
683
  } else {
1506
- data.box = $(elem)
1507
- .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1508
- .parent()
1509
- ;
1510
- }
1511
- data.text
1512
- .insertAfter(elem)
1513
- .on('mousedown.placeholder', function(){
1514
- changePlaceholderVisibility(this, false, false, data, 'focus');
1515
- try {
1516
- setTimeout(function(){
1517
- elem.focus();
1518
- }, 0);
1519
- } catch(e){}
1520
- return false;
1521
- })
1522
- ;
1523
-
1524
-
1525
- $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
1526
- var prop = $.css(elem, style);
1527
- if(data.text.css(style) != prop){
1528
- data.text.css(style, prop);
1529
- }
1530
- });
1531
- $.each(['Left', 'Top'], function(i, side){
1532
- 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);
1533
- data.text.css('padding'+ side, size);
1534
- });
1535
-
1536
- $(elem)
1537
- .onWSOff('updateshadowdom', function(){
1538
- var height, width;
1539
- if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
1540
- data.text
1541
- .css({
1542
- width: width,
1543
- height: height
1544
- })
1545
- .css($(elem).position())
1546
- ;
1547
- }
1548
- }, true)
1549
- ;
1550
-
1551
- } else {
1552
- var reset = function(e){
1553
- if($(elem).hasClass('placeholder-visible')){
1554
- hidePlaceholder(elem, data, '');
1555
-
1556
- setTimeout(function(){
1557
- if(!e || e.type != 'submit' || e.isDefaultPrevented()){
1558
- changePlaceholderVisibility(elem, false, false, data );
1559
- }
1560
- }, 9);
1561
- }
1562
- };
1563
-
1564
- $(elem).onWSOff('beforeunload', reset, false, window);
1565
- data.box = $(elem);
1566
- if(form){
1567
- $(elem).onWSOff('submit', reset, false, form);
684
+ $(this).removeAttr('formnovalidate');
1568
685
  }
686
+ },
687
+ get: function(){
688
+ return $.attr(this, 'formnovalidate') != null;
1569
689
  }
1570
-
1571
- return data;
1572
- },
1573
- update: function(elem, val){
1574
- var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
1575
- if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
1576
- webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
1577
- return;
1578
- }
1579
-
1580
-
1581
- var data = pHolder.create(elem);
1582
- if(data.text){
1583
- data.text.text(val);
1584
- }
1585
-
1586
- changePlaceholderVisibility(elem, false, val, data);
1587
690
  }
1588
691
  };
1589
- })()
1590
- ;
1591
-
1592
- $.webshims.publicMethods = {
1593
- pHolder: pHolder
1594
- };
1595
- polyfillElements.forEach(function(nodeName){
1596
- var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
1597
- attr: {
1598
- set: function(val){
1599
- var elem = this;
1600
- if(bustedPlaceholder){
1601
- webshims.data(elem, 'bustedPlaceholder', val);
1602
- elem.placeholder = '';
1603
- } else {
1604
- webshims.contentAttr(elem, 'placeholder', val);
1605
- }
1606
- pHolder.update(elem, val);
1607
- },
1608
- get: function(){
1609
- var placeholder;
1610
- if(bustedPlaceholder){
1611
- placeholder = webshims.data(this, 'bustedPlaceholder');
692
+ break;
693
+ case "enum":
694
+ formSubmitterDescriptors[propName] = {
695
+ prop: {
696
+ set: function(value){
697
+ $.attr(this, attrName, value);
698
+ },
699
+ get: function(){
700
+ var value = $.attr(this, attrName);
701
+ return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value;
1612
702
  }
1613
- return placeholder || webshims.contentAttr(this, 'placeholder');
1614
703
  }
1615
- },
1616
- reflect: true,
1617
- initAttr: true
1618
- });
1619
- });
1620
-
1621
-
1622
- polyfillElements.forEach(function(name){
1623
- var placeholderValueDesc = {};
1624
- var desc;
1625
- ['attr', 'prop'].forEach(function(propType){
1626
- placeholderValueDesc[propType] = {
1627
- set: function(val){
1628
- var elem = this;
1629
- var placeholder;
1630
- if(bustedPlaceholder){
1631
- placeholder = webshims.data(elem, 'bustedPlaceholder');
1632
- }
1633
- if(!placeholder){
1634
- placeholder = webshims.contentAttr(elem, 'placeholder');
1635
- }
1636
- $.removeData(elem, 'cachedValidity');
1637
- var ret = desc[propType]._supset.call(elem, val);
1638
- if(placeholder && 'value' in elem){
1639
- changePlaceholderVisibility(elem, val, placeholder);
704
+ };
705
+ break;
706
+ default:
707
+ formSubmitterDescriptors[propName] = {
708
+ prop: {
709
+ set: function(value){
710
+ $.attr(this, attrName, value);
711
+ },
712
+ get: function(){
713
+ var value = $.attr(this, attrName);
714
+ return (value != null) ? value : "";
1640
715
  }
1641
- return ret;
1642
- },
1643
- get: function(){
1644
- var elem = this;
1645
- return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
1646
716
  }
1647
717
  };
1648
- });
1649
- desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1650
- });
1651
-
1652
- })();
718
+ }
1653
719
 
1654
- (function(){
1655
- var doc = document;
1656
- if( 'value' in document.createElement('output') ){return;}
1657
-
1658
- webshims.defineNodeNameProperty('output', 'value', {
1659
- prop: {
1660
- set: function(value){
1661
- var setVal = $.data(this, 'outputShim');
1662
- if(!setVal){
1663
- setVal = outputCreate(this);
1664
- }
1665
- setVal(value);
1666
- },
1667
- get: function(){
1668
- return webshims.contentAttr(this, 'value') || $(this).text() || '';
1669
- }
1670
- }
1671
- });
1672
-
1673
-
1674
- webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
1675
- if(type == 'removeAttr'){return;}
1676
- var setVal = $.data(this, 'outputShim');
1677
- if(setVal){
1678
- setVal(value);
1679
- }
1680
- });
1681
-
1682
- var outputCreate = function(elem){
1683
- if(elem.getAttribute('aria-live')){return;}
1684
- elem = $(elem);
1685
- var value = (elem.text() || '').trim();
1686
- var id = elem.prop('id');
1687
- var htmlFor = elem.attr('for');
1688
- var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
1689
- var form = shim[0].form || doc;
1690
- var setValue = function(val){
1691
- shim[0].value = val;
1692
- val = shim[0].value;
1693
- elem.text(val);
1694
- webshims.contentAttr(elem[0], 'value', val);
1695
- };
1696
-
1697
- elem[0].defaultValue = value;
1698
- webshims.contentAttr(elem[0], 'value', value);
1699
-
1700
- elem.attr({'aria-live': 'polite'});
1701
- if(id){
1702
- shim.attr('id', id);
1703
- elem.attr('aria-labelledby', elem.jProp('labels').map(function(){
1704
- return webshims.getID(this);
1705
- }).get().join(' '));
1706
- }
1707
- if(htmlFor){
1708
- id = webshims.getID(elem);
1709
- htmlFor.split(' ').forEach(function(control){
1710
- control = document.getElementById(control);
1711
- if(control){
1712
- control.setAttribute('aria-controls', id);
1713
- }
1714
- });
1715
- }
1716
- elem.data('outputShim', setValue );
1717
- shim.data('outputShim', setValue );
1718
- return setValue;
1719
- };
1720
-
1721
- webshims.addReady(function(context, contextElem){
1722
- $('output', context).add(contextElem.filter('output')).each(function(){
1723
- outputCreate(this);
1724
- });
1725
- });
1726
-
1727
- /*
1728
- * Implements input event in all browsers
1729
- */
1730
- (function(){
1731
- var noInputTriggerEvts = {updateInput: 1, input: 1},
1732
- noInputTypes = {
1733
- radio: 1,
1734
- checkbox: 1,
1735
- submit: 1,
1736
- button: 1,
1737
- image: 1,
1738
- reset: 1,
1739
- file: 1
1740
-
1741
- //pro forma
1742
- ,color: 1
1743
- //,range: 1
1744
- },
1745
- observe = function(input){
1746
- var timer,
1747
- lastVal = input.prop('value'),
1748
- trigger = function(e){
1749
- //input === null
1750
- if(!input){return;}
1751
- var newVal = input.prop('value');
1752
- if(newVal !== lastVal){
1753
- lastVal = newVal;
1754
- if(!e || !noInputTriggerEvts[e.type]){
1755
- webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1756
- }
1757
- }
1758
- },
1759
- extraTimer,
1760
- extraTest = function(){
1761
- clearTimeout(extraTimer);
1762
- extraTimer = setTimeout(trigger, 9);
1763
- },
1764
- unbind = function(){
1765
- input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
1766
- clearInterval(timer);
1767
- setTimeout(function(){
1768
- trigger();
1769
- input = null;
1770
- }, 1);
1771
-
1772
- }
1773
- ;
1774
-
1775
- clearInterval(timer);
1776
- timer = setInterval(trigger, 200);
1777
- extraTest();
1778
- input.on({
1779
- 'keyup keypress keydown paste cut': extraTest,
1780
- focusout: unbind,
1781
- 'input updateInput change': trigger
1782
- });
1783
- }
1784
- ;
1785
-
1786
- $(doc)
1787
- .on('focusin', function(e){
1788
- if( e.target && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] && !(webshims.data(e.target, 'implemented') || {}).inputwidgets){
1789
- observe($(e.target));
1790
- }
1791
- })
1792
- ;
1793
- })();
1794
- })();
720
+
721
+ if(!formSubmitterDescriptors[attrName]){
722
+ formSubmitterDescriptors[attrName] = {};
723
+ }
724
+ formSubmitterDescriptors[attrName].attr = {
725
+ set: function(value){
726
+ formSubmitterDescriptors[attrName].attr._supset.call(this, value);
727
+ $(this).unbind(eventName).on(eventName, changeSubmitter);
728
+ },
729
+ get: function(){
730
+ return formSubmitterDescriptors[attrName].attr._supget.call(this);
731
+ }
732
+ };
733
+ formSubmitterDescriptors[attrName].initAttr = true;
734
+ formSubmitterDescriptors[attrName].removeAttr = {
735
+ value: function(){
736
+ $(this).unbind(eventName);
737
+ formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
738
+ }
739
+ };
740
+ });
741
+
742
+ webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
1795
743
 
1796
744
  }); //webshims.ready end
1797
- }//end formvalidation