webshims-rails 0.3 → 0.4

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