webshims-rails 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
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