webshims-rails 0.4.7 → 1.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +15 -0
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +1 -1
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +1 -1
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +197 -166
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1711 -1609
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +2575 -2253
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +2452 -1476
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1405 -1159
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1316 -963
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1862 -179
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +4327 -287
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +3887 -586
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2911 -2159
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +3425 -1730
  16. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2854 -1203
  17. data/vendor/assets/javascripts/webshims/shims/combos/2.js +3351 -2130
  18. data/vendor/assets/javascripts/webshims/shims/combos/20.js +2426 -581
  19. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1915 -1574
  20. data/vendor/assets/javascripts/webshims/shims/combos/22.js +864 -2275
  21. data/vendor/assets/javascripts/webshims/shims/combos/23.js +609 -1811
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +1655 -2736
  23. data/vendor/assets/javascripts/webshims/shims/combos/4.js +1037 -603
  24. data/vendor/assets/javascripts/webshims/shims/combos/5.js +3100 -773
  25. data/vendor/assets/javascripts/webshims/shims/combos/6.js +3631 -840
  26. data/vendor/assets/javascripts/webshims/shims/combos/7.js +3596 -1354
  27. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1731 -188
  28. data/vendor/assets/javascripts/webshims/shims/combos/9.js +3243 -1431
  29. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +107 -18
  30. data/vendor/assets/javascripts/webshims/shims/es5.js +1 -0
  31. data/vendor/assets/javascripts/webshims/shims/form-core.js +553 -464
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +160 -154
  33. data/vendor/assets/javascripts/webshims/shims/form-message.js +73 -49
  34. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +18 -1
  35. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +161 -36
  36. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2130 -813
  37. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +206 -58
  38. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ar.js → formcfg-ar.js} +30 -0
  39. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ch-ZN.js → formcfg-ch-ZN.js} +31 -0
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-de.txt → formcfg-de.txt} +50 -11
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-el.js → formcfg-el.js} +31 -0
  42. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-en.txt → formcfg-en.txt} +44 -11
  43. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-es.js → formcfg-es.js} +31 -0
  44. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-fr.js → formcfg-fr.js} +31 -0
  45. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-he.js → formcfg-he.js} +31 -0
  46. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hi.js → formcfg-hi.js} +31 -0
  47. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hu.js → formcfg-hu.js} +31 -0
  48. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-it.js → formcfg-it.js} +31 -0
  49. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ja.js → formcfg-ja.js} +31 -0
  50. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-nl.js → formcfg-nl.js} +31 -0
  51. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-pt-PT.js → formcfg-pt-PT.js} +31 -0
  52. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ru.js → formcfg-ru.js} +31 -0
  53. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-sv.js → formcfg-sv.js} +32 -0
  54. data/vendor/assets/javascripts/webshims/shims/json-storage.js +16 -10
  55. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +155 -122
  56. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +76 -41
  57. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +8 -16
  58. data/vendor/assets/javascripts/webshims/shims/range-ui.js +388 -0
  59. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +12 -0
  60. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1186 -0
  62. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +868 -548
  63. data/vendor/assets/javascripts/webshims/shims/styles/vertical-range.png +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/swfmini.js +497 -0
  66. data/vendor/assets/javascripts/webshims/shims/track-ui.js +3 -0
  67. data/vendor/assets/javascripts/webshims/shims/track.js +29 -29
  68. metadata +26 -125
  69. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +0 -1
  70. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +0 -1
  71. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +0 -1
  72. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +0 -1
  73. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +0 -1
  74. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +0 -1
  75. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  76. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -73
  77. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -49
  78. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +0 -1
  79. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +0 -1
  82. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -73
  83. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -49
  84. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +0 -1
  85. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +0 -1
  86. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +0 -1
  87. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +0 -1
  88. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +0 -1
  89. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +0 -1
  90. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +0 -1
  91. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +0 -1
  92. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +0 -1
  93. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +0 -1
  94. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +0 -1
  95. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +0 -1
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +0 -1
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +0 -1
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +0 -1
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +0 -1
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +0 -1
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +0 -1
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +0 -1
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +0 -1
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +0 -1
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +0 -1
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +0 -1
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +0 -1
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +0 -1
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +0 -1
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +0 -1
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +0 -1
  112. data/vendor/assets/javascripts/webshims/minified/shims/details.js +0 -1
  113. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +0 -1
  114. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +0 -1
  115. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +0 -1
  116. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +0 -1
  117. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +0 -1
  118. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +0 -1
  119. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +0 -1
  120. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +0 -1
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +0 -1
  122. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +0 -1
  123. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +0 -1
  124. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +0 -1
  125. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +0 -1
  126. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +0 -33
  127. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +0 -1
  128. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +0 -34
  129. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +0 -1
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +0 -1
  131. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +0 -1
  132. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +0 -1
  133. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +0 -1
  134. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +0 -1
  135. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +0 -1
  136. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +0 -1
  137. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +0 -1
  138. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +0 -1
  139. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +0 -1
  140. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +0 -1
  141. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -1
  142. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  143. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -87
  144. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +0 -1
  145. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +0 -1
  146. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +0 -1
  147. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +0 -1
  148. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +0 -1
  149. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  150. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  151. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  152. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +0 -1
  153. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  154. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  155. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  156. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +0 -1
  157. data/vendor/assets/javascripts/webshims/minified/shims/track.js +0 -1
  158. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  159. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  160. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2872
  161. data/vendor/assets/javascripts/webshims/shims/combos/25.js +0 -2376
  162. data/vendor/assets/javascripts/webshims/shims/combos/26.js +0 -3009
  163. data/vendor/assets/javascripts/webshims/shims/combos/27.js +0 -4150
  164. data/vendor/assets/javascripts/webshims/shims/combos/59.js +0 -1747
  165. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -1
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -87
  168. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +0 -972
@@ -1,650 +1,1062 @@
1
- //additional tests for partial implementation of forms features
2
- (function($){
1
+ //DOM-Extension helper
2
+ jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
3
3
  "use strict";
4
- var isWebkit = /webkit/i.test(navigator.userAgent);
5
- var Modernizr = window.Modernizr;
6
- var webshims = $.webshims;
7
- var bugs = webshims.bugs;
8
- var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
9
- var testRequiredFind = function(){
10
- if(form[0].querySelector){
11
- try {
12
- bugs.findRequired = !(form[0].querySelector('select:required'));
13
- } catch(er){
14
- bugs.findRequired = false;
15
- }
16
- }
17
- };
18
- var inputElem = $('input', form).eq(0);
19
- var onDomextend = function(fn){
20
- webshims.loader.loadList(['dom-extend']);
21
- webshims.ready('dom-extend', fn);
22
- };
23
-
24
- bugs.findRequired = false;
25
- bugs.validationMessage = false;
26
4
 
27
- webshims.capturingEventPrevented = function(e){
28
- if(!e._isPolyfilled){
29
- var isDefaultPrevented = e.isDefaultPrevented;
30
- var preventDefault = e.preventDefault;
31
- e.preventDefault = function(){
32
- clearTimeout($.data(e.target, e.type + 'DefaultPrevented'));
33
- $.data(e.target, e.type + 'DefaultPrevented', setTimeout(function(){
34
- $.removeData(e.target, e.type + 'DefaultPrevented');
35
- }, 30));
36
- return preventDefault.apply(this, arguments);
37
- };
38
- e.isDefaultPrevented = function(){
39
- return !!(isDefaultPrevented.apply(this, arguments) || $.data(e.target, e.type + 'DefaultPrevented') || false);
40
- };
41
- e._isPolyfilled = true;
42
- }
43
- };
5
+ webshims.assumeARIA = Modernizr.localstorage || Modernizr.video || Modernizr.boxsizing;
44
6
 
45
- if(!Modernizr.formvalidation || bugs.bustedValidity){
46
- testRequiredFind();
47
- } else {
48
- //create delegatable events
49
- webshims.capturingEvents(['input']);
50
- webshims.capturingEvents(['invalid'], true);
51
-
52
- if(window.opera || window.testGoodWithFix){
53
-
54
- form.appendTo('head');
55
-
56
- testRequiredFind();
57
- bugs.validationMessage = !(inputElem.prop('validationMessage'));
58
-
59
- webshims.reTest(['form-native-extend', 'form-message']);
60
-
61
- form.remove();
62
-
63
- $(function(){
64
- onDomextend(function(){
65
-
66
- //Opera shows native validation bubbles in case of input.checkValidity()
67
- // Opera 11.6/12 hasn't fixed this issue right, it's buggy
68
- var preventDefault = function(e){
69
- e.preventDefault();
70
- };
71
-
72
- ['form', 'input', 'textarea', 'select'].forEach(function(name){
73
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
74
- prop: {
75
- value: function(){
76
- if (!webshims.fromSubmit) {
77
- $(this).on('invalid.checkvalidity', preventDefault);
78
- }
79
-
80
- webshims.fromCheckValidity = true;
81
- var ret = desc.prop._supvalue.apply(this, arguments);
82
- if (!webshims.fromSubmit) {
83
- $(this).unbind('invalid.checkvalidity', preventDefault);
84
- }
85
- webshims.fromCheckValidity = false;
86
- return ret;
87
- }
88
- }
89
- });
90
- });
91
-
92
- });
93
- });
94
- }
95
-
96
- if(isWebkit && !webshims.bugs.bustedValidity){
97
- (function(){
98
- var elems = /^(?:textarea|input)$/i;
99
- var form = false;
100
-
101
- document.addEventListener('contextmenu', function(e){
102
- if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
103
- setTimeout(function(){
104
- form = false;
105
- }, 1);
106
- }
107
- }, false);
108
-
109
- $(window).on('invalid', function(e){
110
- if(e.originalEvent && form && form == e.target.form){
111
- e.wrongWebkitInvalid = true;
112
- e.stopImmediatePropagation();
113
- }
114
- });
115
-
116
- })();
117
- }
7
+ if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
8
+ webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
118
9
  }
119
10
 
11
+ if(!$.parseHTML){
12
+ webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
13
+ }
120
14
 
121
-
122
- jQuery.webshims.register('form-core', function($, webshims, window, document, undefined, options){
123
- "use strict";
124
-
15
+ //shortcus
16
+ var modules = webshims.modules;
17
+ var listReg = /\s*,\s*/;
18
+
19
+ //proxying attribute
20
+ var olds = {};
21
+ var havePolyfill = {};
22
+ var extendedProps = {};
23
+ var extendQ = {};
24
+ var modifyProps = {};
125
25
 
126
- var checkTypes = {checkbox: 1, radio: 1};
127
- var emptyJ = $([]);
128
- var bugs = webshims.bugs;
129
- var groupTypes = {radio: 1};
130
- var getGroupElements = function(elem){
131
- elem = $(elem);
132
- var name;
133
- var form;
134
- var ret = emptyJ;
135
- if(groupTypes[elem[0].type]){
136
- form = elem.prop('form');
137
- name = elem[0].name;
138
- if(!name){
139
- ret = elem;
140
- } else if(form){
141
- ret = $(form[name]);
142
- } else {
143
- ret = $(document.getElementsByName(name)).filter(function(){
144
- return !$.prop(this, 'form');
145
- });
146
- }
147
- ret = ret.filter('[type="radio"]');
148
- }
149
- return ret;
26
+ var oldVal = $.fn.val;
27
+ var singleVal = function(elem, name, val, pass, _argless){
28
+ return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
150
29
  };
151
30
 
152
- var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
153
- var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
154
- if(key && message[key]){
155
- message = message[key];
31
+
32
+ $.fn.val = function(val){
33
+ var elem = this[0];
34
+ if(arguments.length && val == null){
35
+ val = '';
156
36
  }
157
- if(typeof message == 'object'){
158
- validity = validity || $.prop(elem, 'validity') || {valid: 1};
159
- if(!validity.valid){
160
- $.each(validity, function(name, prop){
161
- if(prop && name != 'valid' && message[name]){
162
- message = message[name];
163
- return false;
164
- }
165
- });
166
- }
37
+ if(!arguments.length){
38
+ if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
39
+ return $.prop(elem, 'value', val, 'val', true);
167
40
  }
168
-
169
- if(typeof message == 'object'){
170
- message = message.defaultMessage;
41
+ if($.isArray(val)){
42
+ return oldVal.apply(this, arguments);
171
43
  }
172
- return message || '';
173
- };
174
-
175
- /*
176
- * Selectors for all browsers
177
- */
178
- var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
179
- var hasInvalid = function(elem){
180
- var ret = false;
181
- $($.prop(elem, 'elements')).each(function(){
182
- ret = $(this).is(':invalid');
183
- if(ret){
184
- return false;
44
+ var isFunction = $.isFunction(val);
45
+ return this.each(function(i){
46
+ elem = this;
47
+ if(elem.nodeType === 1){
48
+ if(isFunction){
49
+ var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
50
+ if(genVal == null){
51
+ genVal = '';
52
+ }
53
+ $.prop(elem, 'value', genVal, 'val') ;
54
+ } else {
55
+ $.prop(elem, 'value', val, 'val');
56
+ }
185
57
  }
186
58
  });
187
- return ret;
188
59
  };
189
- $.extend($.expr[":"], {
190
- "valid-element": function(elem){
191
- return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
192
- },
193
- "invalid-element": function(elem){
194
- return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
195
- },
196
- "required-element": function(elem){
197
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
198
- },
199
- "user-error": function(elem){
200
- return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
201
- },
202
- "optional-element": function(elem){
203
- return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
204
- },
205
- "in-range": function(elem){
206
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
207
- return false;
60
+ $.fn.onTrigger = function(evt, fn){
61
+ return this.on(evt, fn).each(fn);
62
+ };
63
+
64
+ var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
65
+ var elementData = function(elem, key, val){
66
+ elem = elem.jquery ? elem[0] : elem;
67
+ if(!elem){return val || {};}
68
+ var data = $.data(elem, dataID);
69
+ if(val !== undefined){
70
+ if(!data){
71
+ data = $.data(elem, dataID, {});
208
72
  }
209
- var val = $.prop(elem, 'validity');
210
- return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
211
- },
212
- "out-of-range": function(elem){
213
- if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
214
- return false;
73
+ if(key){
74
+ data[key] = val;
215
75
  }
216
- var val = $.prop(elem, 'validity');
217
- return !!(val && (val.rangeOverflow || val.rangeUnderflow));
218
76
  }
219
77
 
220
- });
221
-
222
- ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
223
- $.expr[":"][name] = $.expr.filters[name+"-element"];
224
- });
225
-
226
-
227
- $.expr[":"].focus = function( elem ) {
228
- try {
229
- var doc = elem.ownerDocument;
230
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
231
- } catch(e){}
232
- return false;
78
+ return key ? data && data[key] : data;
233
79
  };
80
+
81
+
82
+ [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
83
+ $.fn[data.name] = function(){
84
+ var elems = [];
85
+ this.each(function(){
86
+ var shadowData = elementData(this, 'shadowData');
87
+ var elem = shadowData && shadowData[data.prop] || this;
88
+ if($.inArray(elem, elems) == -1){
89
+ elems.push(elem);
90
+ }
91
+ });
92
+ return this.pushStack(elems);
93
+ };
94
+ });
234
95
 
235
- if(Modernizr.formvalidation && isWebkit && !webshims.bugs.bustedValidity){
96
+ if($.Tween.propHooks._default && $.css){
236
97
  (function(){
237
- var retriggerRadioValidity = function(){
238
- var validity;
239
- if((validity = this.validity) && !validity.customError){
240
- this.setCustomValidity('');
98
+ var isjQ8 = false;
99
+ try {
100
+ isjQ8 = $.css($('<b style="width: 10px" />')[0], 'width', '') == '10px';
101
+ } catch(er){
102
+ webshims.error(er);
103
+ }
104
+ var css = isjQ8 ?
105
+ function(elem, prop){
106
+ return $.css( elem, prop, false, "" );
107
+ } :
108
+ function(elem, prop){
109
+ return $.css( elem, prop, "" );
241
110
  }
242
- };
243
-
244
- webshims.addReady(function(context, insertedElement){
245
- if(context !== document){
246
- $('input[type="radio"]:invalid', context)
247
- .add(insertedElement.filter('input[type="radio"]:invalid'))
248
- .each(retriggerRadioValidity)
249
- ;
111
+ ;
112
+
113
+ $.extend($.Tween.propHooks._default, {
114
+ get: function( tween ) {
115
+ var result;
116
+
117
+ if ( (tween.elem[ tween.prop ] != null || havePolyfill[ tween.prop ]) &&
118
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
119
+ return havePolyfill[ tween.prop ] ? $.prop(tween.elem, tween.prop) : tween.elem[ tween.prop ];
120
+ }
121
+
122
+ // passing an empty string as a 3rd parameter to .css will automatically
123
+ // attempt a parseFloat and fallback to a string if the parse fails
124
+ // so, simple values such as "10px" are parsed to Float.
125
+ // complex values such as "rotate(1rad)" are returned as is.
126
+ result = css( tween.elem, tween.prop );
127
+ // Empty strings, null, undefined and "auto" are converted to 0.
128
+ return !result || result === "auto" ? 0 : result;
129
+ },
130
+ set: function( tween ) {
131
+ // use step hook for back compat - use cssHook if its there - use .style if its
132
+ // available and use plain properties where available
133
+ if ( jQuery.fx.step[ tween.prop ] ) {
134
+ jQuery.fx.step[ tween.prop ]( tween );
135
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
136
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
137
+ } else if( !havePolyfill[ tween.prop ] ) {
138
+ tween.elem[ tween.prop ] = tween.now;
139
+ } else {
140
+ $.prop(tween.elem, tween.prop, tween.now);
141
+ }
250
142
  }
251
143
  });
252
144
  })();
253
145
  }
254
146
 
255
- var customEvents = $.event.customEvent || {};
256
- var isValid = function(elem){
257
- return ($.prop(elem, 'validity') || {valid: 1}).valid;
258
- };
259
147
 
260
- if (bugs.bustedValidity || bugs.findRequired) {
261
- (function(){
262
- var find = $.find;
263
- var matchesSelector = $.find.matchesSelector;
148
+ ['removeAttr', 'prop', 'attr'].forEach(function(type){
149
+ olds[type] = $[type];
150
+ $[type] = function(elem, name, value, pass, _argless){
151
+ var isVal = (pass == 'val');
152
+ var oldMethod = !isVal ? olds[type] : singleVal;
153
+ if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
154
+ return oldMethod(elem, name, value, pass, _argless);
155
+ }
264
156
 
265
- var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
266
- var regFn = function(sel){
267
- return sel + '-element';
268
- };
157
+ var nodeName = (elem.nodeName || '').toLowerCase();
158
+ var desc = extendedProps[nodeName];
159
+ var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
160
+ var propMethod;
161
+ var oldValMethod;
162
+ var ret;
269
163
 
270
- $.find = (function(){
271
- var slice = Array.prototype.slice;
272
- var fn = function(sel){
273
- var ar = arguments;
274
- ar = slice.call(ar, 1, ar.length);
275
- ar.unshift(sel.replace(regExp, regFn));
276
- return find.apply(this, ar);
277
- };
278
- for (var i in find) {
279
- if(find.hasOwnProperty(i)){
280
- fn[i] = find[i];
164
+
165
+ if(!desc){
166
+ desc = extendedProps['*'];
167
+ }
168
+ if(desc){
169
+ desc = desc[name];
170
+ }
171
+
172
+ if(desc){
173
+ propMethod = desc[curType];
174
+ }
175
+
176
+ if(propMethod){
177
+ if(name == 'value'){
178
+ oldValMethod = propMethod.isVal;
179
+ propMethod.isVal = isVal;
180
+ }
181
+ if(curType === 'removeAttr'){
182
+ return propMethod.value.call(elem);
183
+ } else if(value === undefined){
184
+ return (propMethod.get) ?
185
+ propMethod.get.call(elem) :
186
+ propMethod.value
187
+ ;
188
+ } else if(propMethod.set) {
189
+ if(type == 'attr' && value === true){
190
+ value = name;
281
191
  }
192
+
193
+ ret = propMethod.set.call(elem, value);
282
194
  }
283
- return fn;
284
- })();
285
- if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
286
- $.find.matchesSelector = function(node, expr){
287
- expr = expr.replace(regExp, regFn);
288
- return matchesSelector.call(this, node, expr);
289
- };
195
+ if(name == 'value'){
196
+ propMethod.isVal = oldValMethod;
197
+ }
198
+ } else {
199
+ ret = oldMethod(elem, name, value, pass, _argless);
290
200
  }
291
-
292
- })();
293
- }
294
-
295
- //ToDo needs testing
296
- var oldAttr = $.prop;
297
- var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
298
- $.prop = function(elem, name, val){
299
- var ret = oldAttr.apply(this, arguments);
300
- if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
301
- if(isValid(elem)){
302
- $(elem).getShadowElement().removeClass(invalidClasses);
303
- if(name == 'checked' && val) {
304
- getGroupElements(elem).not(elem).removeClass(invalidClasses).removeAttr('aria-invalid');
201
+ if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
202
+
203
+ var boolValue;
204
+ if(curType == 'removeAttr'){
205
+ boolValue = false;
206
+ } else if(curType == 'prop'){
207
+ boolValue = !!(value);
208
+ } else {
209
+ boolValue = true;
305
210
  }
211
+
212
+ modifyProps[nodeName][name].forEach(function(fn){
213
+ if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
214
+ fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
215
+ }
216
+ });
306
217
  }
307
- }
308
- return ret;
309
- };
310
-
311
- var returnValidityCause = function(validity, elem){
312
- var ret;
313
- $.each(validity, function(name, value){
314
- if(value){
315
- ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
316
- return false;
218
+ return ret;
219
+ };
220
+
221
+ extendQ[type] = function(nodeName, prop, desc){
222
+
223
+ if(!extendedProps[nodeName]){
224
+ extendedProps[nodeName] = {};
225
+ }
226
+ if(!extendedProps[nodeName][prop]){
227
+ extendedProps[nodeName][prop] = {};
228
+ }
229
+ var oldDesc = extendedProps[nodeName][prop][type];
230
+ var getSup = function(propType, descriptor, oDesc){
231
+ if(descriptor && descriptor[propType]){
232
+ return descriptor[propType];
233
+ }
234
+ if(oDesc && oDesc[propType]){
235
+ return oDesc[propType];
236
+ }
237
+ if(type == 'prop' && prop == 'value'){
238
+ return function(value){
239
+ var elem = this;
240
+ return (desc.isVal) ?
241
+ singleVal(elem, prop, value, false, (arguments.length === 0)) :
242
+ olds[type](elem, prop, value)
243
+ ;
244
+ };
245
+ }
246
+ if(type == 'prop' && propType == 'value' && desc.value.apply){
247
+ return function(value){
248
+ var sup = olds[type](this, prop);
249
+ if(sup && sup.apply){
250
+ sup = sup.apply(this, arguments);
251
+ }
252
+ return sup;
253
+ };
254
+ }
255
+ return function(value){
256
+ return olds[type](this, prop, value);
257
+ };
258
+ };
259
+ extendedProps[nodeName][prop][type] = desc;
260
+ if(desc.value === undefined){
261
+ if(!desc.set){
262
+ desc.set = desc.writeable ?
263
+ getSup('set', desc, oldDesc) :
264
+ (webshims.cfg.useStrict && prop == 'prop') ?
265
+ function(){throw(prop +' is readonly on '+ nodeName);} :
266
+ function(){webshims.info(prop +' is readonly on '+ nodeName);}
267
+ ;
268
+ }
269
+ if(!desc.get){
270
+ desc.get = getSup('get', desc, oldDesc);
271
+ }
272
+
317
273
  }
318
- });
319
- return ret;
320
- };
321
-
322
- var isInGroup = function(name){
323
- var ret;
324
- try {
325
- ret = document.activeElement.name === name;
326
- } catch(e){}
327
- return ret;
328
- };
329
- /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-success instead */
330
- var invalidClass = 'user-error';
331
- var invalidClasses = 'user-error form-ui-invalid';
332
- var validClass = 'user-success';
333
- var validClasses = 'user-success form-ui-valid';
334
- var switchValidityClass = function(e){
335
- var elem, timer;
336
- if(!e.target){return;}
337
- elem = $(e.target).getNativeElement()[0];
338
- if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
339
- timer = $.data(elem, 'webshimsswitchvalidityclass');
340
- var switchClass = function(){
341
- if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
342
- var validity = $.prop(elem, 'validity');
343
- var shadowElem = $(elem).getShadowElement();
344
- var addClass, removeClass, trigger, generaltrigger, validityCause;
345
274
 
346
- $(elem).trigger('refreshCustomValidityRules');
347
- if(validity.valid){
348
- if(!shadowElem.hasClass(validClass)){
349
- addClass = validClasses;
350
- removeClass = invalidClasses;
351
- generaltrigger = 'changedvaliditystate';
352
- trigger = 'changedvalid';
353
- if(checkTypes[elem.type] && elem.checked){
354
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
355
- }
356
- $.removeData(elem, 'webshimsinvalidcause');
275
+ ['value', 'get', 'set'].forEach(function(descProp){
276
+ if(desc[descProp]){
277
+ desc['_sup'+descProp] = getSup(descProp, oldDesc);
357
278
  }
279
+ });
280
+ };
281
+
282
+ });
283
+
284
+ var extendNativeValue = (function(){
285
+ var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
286
+ var has = Object.prototype.hasOwnProperty;
287
+ //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
288
+ var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
289
+ return function(nodeName, prop, desc){
290
+ var elem , elemProto;
291
+ if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
292
+ var sup = elem[prop];
293
+ desc._supvalue = function(){
294
+ if(sup && sup.apply){
295
+ return sup.apply(this, arguments);
296
+ }
297
+ return sup;
298
+ };
299
+ elemProto[prop] = desc.value;
358
300
  } else {
359
- validityCause = returnValidityCause(validity, elem);
360
- if($.data(elem, 'webshimsinvalidcause') != validityCause){
361
- $.data(elem, 'webshimsinvalidcause', validityCause);
362
- generaltrigger = 'changedvaliditystate';
363
- }
364
- if(!shadowElem.hasClass(invalidClass)){
365
- addClass = invalidClasses;
366
- removeClass = validClasses;
367
- if (checkTypes[elem.type] && !elem.checked) {
368
- getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
301
+ desc._supvalue = function(){
302
+ var data = elementData(this, 'propValue');
303
+ if(data && data[prop] && data[prop].apply){
304
+ return data[prop].apply(this, arguments);
369
305
  }
370
- trigger = 'changedinvalid';
306
+ return data && data[prop];
307
+ };
308
+ initProp.extendValue(nodeName, prop, desc.value);
309
+ }
310
+ desc.value._supvalue = desc._supvalue;
311
+ };
312
+ })();
313
+
314
+ var initProp = (function(){
315
+
316
+ var initProps = {};
317
+
318
+ webshims.addReady(function(context, contextElem){
319
+ var nodeNameCache = {};
320
+ var getElementsByName = function(name){
321
+ if(!nodeNameCache[name]){
322
+ nodeNameCache[name] = $(context.getElementsByTagName(name));
323
+ if(contextElem[0] && $.nodeName(contextElem[0], name)){
324
+ nodeNameCache[name] = nodeNameCache[name].add(contextElem);
325
+ }
326
+ }
327
+ };
328
+
329
+
330
+ $.each(initProps, function(name, fns){
331
+ getElementsByName(name);
332
+ if(!fns || !fns.forEach){
333
+ webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
334
+ return;
371
335
  }
336
+ fns.forEach(function(fn){
337
+ nodeNameCache[name].each(fn);
338
+ });
339
+ });
340
+ nodeNameCache = null;
341
+ });
342
+
343
+ var tempCache;
344
+ var emptyQ = $([]);
345
+ var createNodeNameInit = function(nodeName, fn){
346
+ if(!initProps[nodeName]){
347
+ initProps[nodeName] = [fn];
348
+ } else {
349
+ initProps[nodeName].push(fn);
372
350
  }
373
- if(addClass){
374
- shadowElem.addClass(addClass).removeClass(removeClass);
375
- //jQuery 1.6.1 IE9 bug (doubble trigger bug)
376
- setTimeout(function(){
377
- $(elem).trigger(trigger);
378
- }, 0);
351
+ if($.isDOMReady){
352
+ (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
379
353
  }
380
- if(generaltrigger){
381
- setTimeout(function(){
382
- $(elem).trigger(generaltrigger);
383
- }, 0);
354
+ };
355
+
356
+ var elementExtends = {};
357
+ return {
358
+ createTmpCache: function(nodeName){
359
+ if($.isDOMReady){
360
+ tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
361
+ }
362
+ return tempCache || emptyQ;
363
+ },
364
+ flushTmpCache: function(){
365
+ tempCache = null;
366
+ },
367
+ content: function(nodeName, prop){
368
+ createNodeNameInit(nodeName, function(){
369
+ var val = $.attr(this, prop);
370
+ if(val != null){
371
+ $.attr(this, prop, val);
372
+ }
373
+ });
374
+ },
375
+ createElement: function(nodeName, fn){
376
+ createNodeNameInit(nodeName, fn);
377
+ },
378
+ extendValue: function(nodeName, prop, value){
379
+ createNodeNameInit(nodeName, function(){
380
+ $(this).each(function(){
381
+ var data = elementData(this, 'propValue', {});
382
+ data[prop] = this[prop];
383
+ this[prop] = value;
384
+ });
385
+ });
384
386
  }
385
- $.removeData(e.target, 'webshimsswitchvalidityclass');
386
387
  };
388
+ })();
387
389
 
388
- if(timer){
389
- clearTimeout(timer);
390
+ var createPropDefault = function(descs, removeType){
391
+ if(descs.defaultValue === undefined){
392
+ descs.defaultValue = '';
390
393
  }
391
- if(e.type == 'refreshvalidityui'){
392
- switchClass();
393
- } else {
394
- $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
394
+ if(!descs.removeAttr){
395
+ descs.removeAttr = {
396
+ value: function(){
397
+ descs[removeType || 'prop'].set.call(this, descs.defaultValue);
398
+ descs.removeAttr._supvalue.call(this);
399
+ }
400
+ };
401
+ }
402
+ if(!descs.attr){
403
+ descs.attr = {};
395
404
  }
396
405
  };
397
406
 
398
- $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
399
- customEvents.changedvaliditystate = true;
400
- customEvents.refreshCustomValidityRules = true;
401
- customEvents.changedvalid = true;
402
- customEvents.changedinvalid = true;
403
- customEvents.refreshvalidityui = true;
404
-
405
-
406
- webshims.triggerInlineForm = function(elem, event){
407
- $(elem).trigger(event);
408
- };
409
-
410
- webshims.modules["form-core"].getGroupElements = getGroupElements;
411
-
412
-
413
- var setRoot = function(){
414
- webshims.scrollRoot = (isWebkit || document.compatMode == 'BackCompat') ?
415
- $(document.body) :
416
- $(document.documentElement)
417
- ;
418
- };
419
- setRoot();
420
- webshims.ready('DOM', setRoot);
421
-
422
- webshims.getRelOffset = function(posElem, relElem){
423
- posElem = $(posElem);
424
- var offset = $(relElem).offset();
425
- var bodyOffset;
426
- $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
427
- bodyOffset = posElem.offset();
428
- });
429
- offset.top -= bodyOffset.top;
430
- offset.left -= bodyOffset.left;
431
- return offset;
432
- };
433
-
434
- /* some extra validation UI */
435
- webshims.validityAlert = (function(){
436
- var alertElem = 'span';
437
- var errorBubble;
438
- var hideTimer = false;
439
- var focusTimer = false;
440
- var resizeTimer = false;
441
- var boundHide;
442
-
443
- var api = {
444
- hideDelay: 5000,
445
-
446
- showFor: function(elem, message, noFocusElem, noBubble){
447
- api._create();
407
+ $.extend(webshims, {
408
+
409
+ getID: (function(){
410
+ var ID = new Date().getTime();
411
+ return function(elem){
448
412
  elem = $(elem);
449
- var visual = $(elem).getShadowElement();
450
- var offset = api.getOffsetFromBody(visual);
451
- api.clear();
452
- if(noBubble){
453
- this.hide();
413
+ var id = elem.prop('id');
414
+ if(!id){
415
+ ID++;
416
+ id = 'ID-'+ ID;
417
+ elem.eq(0).prop('id', id);
418
+ }
419
+ return id;
420
+ };
421
+ })(),
422
+ implement: function(elem, type){
423
+ var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
424
+ if(data[type]){
425
+ webshims.info(type +' already implemented for element #'+elem.id);
426
+ return false;
427
+ }
428
+ data[type] = true;
429
+ return true;
430
+ },
431
+ extendUNDEFProp: function(obj, props){
432
+ $.each(props, function(name, prop){
433
+ if( !(name in obj) ){
434
+ obj[name] = prop;
435
+ }
436
+ });
437
+ },
438
+ //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
439
+ createPropDefault: createPropDefault,
440
+ data: elementData,
441
+ moveToFirstEvent: function(elem, eventType, bindType){
442
+ var events = ($._data(elem, 'events') || {})[eventType];
443
+ var fn;
444
+
445
+ if(events && events.length > 1){
446
+ fn = events.pop();
447
+ if(!bindType){
448
+ bindType = 'bind';
449
+ }
450
+ if(bindType == 'bind' && events.delegateCount){
451
+ events.splice( events.delegateCount, 0, fn);
454
452
  } else {
453
+ events.unshift( fn );
454
+ }
455
+
456
+
457
+ }
458
+ elem = null;
459
+ },
460
+ addShadowDom: (function(){
461
+ var resizeTimer;
462
+ var lastHeight;
463
+ var lastWidth;
464
+
465
+ var docObserve = {
466
+ init: false,
467
+ runs: 0,
468
+ test: function(){
469
+ var height = docObserve.getHeight();
470
+ var width = docObserve.getWidth();
455
471
 
456
- this.getMessage(elem, message);
457
- this.position(visual, offset);
458
-
459
- this.show();
460
- if(this.hideDelay){
461
- hideTimer = setTimeout(boundHide, this.hideDelay);
472
+ if(height != docObserve.height || width != docObserve.width){
473
+ docObserve.height = height;
474
+ docObserve.width = width;
475
+ docObserve.handler({type: 'docresize'});
476
+ docObserve.runs++;
477
+ if(docObserve.runs < 9){
478
+ setTimeout(docObserve.test, 90);
479
+ }
480
+ } else {
481
+ docObserve.runs = 0;
462
482
  }
463
- $(window)
464
- .on('resize.validityalert reposoverlay.validityalert', function(){
465
- clearTimeout(resizeTimer);
466
- resizeTimer = setTimeout(function(){
467
- api.position(visual);
468
- }, 9);
469
- })
470
- ;
483
+ },
484
+ handler: function(e){
485
+ clearTimeout(resizeTimer);
486
+ resizeTimer = setTimeout(function(){
487
+ if(e.type == 'resize'){
488
+ var width = $(window).width();
489
+ var height = $(window).width();
490
+ if(height == lastHeight && width == lastWidth){
491
+ return;
492
+ }
493
+ lastHeight = height;
494
+ lastWidth = width;
495
+
496
+ docObserve.height = docObserve.getHeight();
497
+ docObserve.width = docObserve.getWidth();
498
+
499
+ }
500
+ $(document).triggerHandler('updateshadowdom');
501
+ }, (e.type == 'resize') ? 50 : 9);
502
+ },
503
+ _create: function(){
504
+ $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){
505
+ var body = document.body;
506
+ var doc = document.documentElement;
507
+ docObserve[type] = function(){
508
+ return Math.max(
509
+ body[ "scroll" + name ], doc[ "scroll" + name ],
510
+ body[ "offset" + name ], doc[ "offset" + name ],
511
+ doc[ "client" + name ]
512
+ );
513
+ };
514
+ });
515
+ },
516
+ start: function(){
517
+ if(!this.init && document.body){
518
+ this.init = true;
519
+ this._create();
520
+ this.height = docObserve.getHeight();
521
+ this.width = docObserve.getWidth();
522
+ setInterval(this.test, 600);
523
+ $(this.test);
524
+ webshims.ready('WINDOWLOAD', this.test);
525
+ $(window).bind('resize', this.handler);
526
+ (function(){
527
+ var oldAnimate = $.fn.animate;
528
+ var animationTimer;
529
+
530
+ $.fn.animate = function(){
531
+ clearTimeout(animationTimer);
532
+ animationTimer = setTimeout(function(){
533
+ docObserve.test();
534
+ }, 99);
535
+
536
+ return oldAnimate.apply(this, arguments);
537
+ };
538
+ })();
539
+ }
540
+ }
541
+ };
542
+
543
+
544
+ webshims.docObserve = function(){
545
+ webshims.ready('DOM', function(){
546
+ docObserve.start();
547
+ });
548
+ };
549
+ return function(nativeElem, shadowElem, opts){
550
+ opts = opts || {};
551
+ if(nativeElem.jquery){
552
+ nativeElem = nativeElem[0];
553
+ }
554
+ if(shadowElem.jquery){
555
+ shadowElem = shadowElem[0];
556
+ }
557
+ var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
558
+ var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
559
+ var shadowFocusElementData = {};
560
+ if(!opts.shadowFocusElement){
561
+ opts.shadowFocusElement = shadowElem;
562
+ } else if(opts.shadowFocusElement){
563
+ if(opts.shadowFocusElement.jquery){
564
+ opts.shadowFocusElement = opts.shadowFocusElement[0];
565
+ }
566
+ shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
471
567
  }
472
568
 
473
- if(!noFocusElem){
474
- this.setFocus(visual, offset);
569
+ nativeData.hasShadow = shadowElem;
570
+ shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
571
+ shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
572
+ nativeElement: nativeElem,
573
+ shadowElement: shadowElem,
574
+ shadowFocusElement: opts.shadowFocusElement
575
+ };
576
+ if(opts.shadowChilds){
577
+ opts.shadowChilds.each(function(){
578
+ elementData(this, 'shadowData', shadowData.shadowData);
579
+ });
475
580
  }
476
- },
477
- getOffsetFromBody: function(elem){
478
- return webshims.getRelOffset(errorBubble, elem);
479
- },
480
- setFocus: function(visual, offset){
481
- var focusElem = $(visual).getShadowFocusElement();
482
- var scrollTop = webshims.scrollRoot.scrollTop();
483
- var elemTop = ((offset || focusElem.offset()).top) - 30;
484
- var smooth;
485
581
 
486
- if(webshims.getID && alertElem == 'label'){
487
- errorBubble.attr('for', webshims.getID(focusElem));
582
+ if(opts.data){
583
+ shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
488
584
  }
585
+ opts = null;
586
+ webshims.docObserve();
587
+ };
588
+ })(),
589
+ propTypes: {
590
+ standard: function(descs, name){
591
+ createPropDefault(descs);
592
+ if(descs.prop){return;}
593
+ descs.prop = {
594
+ set: function(val){
595
+ descs.attr.set.call(this, ''+val);
596
+ },
597
+ get: function(){
598
+ return descs.attr.get.call(this) || descs.defaultValue;
599
+ }
600
+ };
601
+
602
+ },
603
+ "boolean": function(descs, name){
489
604
 
490
- if(scrollTop > elemTop){
491
- webshims.scrollRoot.animate(
492
- {scrollTop: elemTop - 5},
493
- {
494
- queue: false,
495
- duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
605
+ createPropDefault(descs);
606
+ if(descs.prop){return;}
607
+ descs.prop = {
608
+ set: function(val){
609
+ if(val){
610
+ descs.attr.set.call(this, "");
611
+ } else {
612
+ descs.removeAttr.value.call(this);
496
613
  }
497
- );
498
- smooth = true;
499
- }
500
- try {
501
- focusElem[0].focus();
502
- } catch(e){}
503
- if(smooth){
504
- webshims.scrollRoot.scrollTop(scrollTop);
505
- setTimeout(function(){
506
- webshims.scrollRoot.scrollTop(scrollTop);
507
- }, 0);
508
- }
509
- setTimeout(function(){
510
- $(document).on('focusout.validityalert', boundHide);
511
- }, 10);
512
- $(window).triggerHandler('reposoverlay');
614
+ },
615
+ get: function(){
616
+ return descs.attr.get.call(this) != null;
617
+ }
618
+ };
513
619
  },
514
- getMessage: function(elem, message){
515
- if (!message) {
516
- message = getContentValidationMessage(elem[0]) || elem.prop('customValidationMessage') || elem.prop('validationMessage');
620
+ "src": (function(){
621
+ var anchor = document.createElement('a');
622
+ anchor.style.display = "none";
623
+ return function(descs, name){
624
+
625
+ createPropDefault(descs);
626
+ if(descs.prop){return;}
627
+ descs.prop = {
628
+ set: function(val){
629
+ descs.attr.set.call(this, val);
630
+ },
631
+ get: function(){
632
+ var href = this.getAttribute(name);
633
+ var ret;
634
+ if(href == null){return '';}
635
+
636
+ anchor.setAttribute('href', href+'' );
637
+
638
+ if(!$.support.hrefNormalized){
639
+ try {
640
+ $(anchor).insertAfter(this);
641
+ ret = anchor.getAttribute('href', 4);
642
+ } catch(er){
643
+ ret = anchor.getAttribute('href', 4);
644
+ }
645
+ $(anchor).detach();
646
+ }
647
+ return ret || anchor.href;
648
+ }
649
+ };
650
+ };
651
+ })(),
652
+ enumarated: function(descs, name){
653
+
654
+ createPropDefault(descs);
655
+ if(descs.prop){return;}
656
+ descs.prop = {
657
+ set: function(val){
658
+ descs.attr.set.call(this, val);
659
+ },
660
+ get: function(){
661
+ var val = (descs.attr.get.call(this) || '').toLowerCase();
662
+ if(!val || descs.limitedTo.indexOf(val) == -1){
663
+ val = descs.defaultValue;
664
+ }
665
+ return val;
666
+ }
667
+ };
668
+ }
669
+
670
+ // ,unsignedLong: $.noop
671
+ // ,"doubble": $.noop
672
+ // ,"long": $.noop
673
+ // ,tokenlist: $.noop
674
+ // ,settableTokenlist: $.noop
675
+ },
676
+ reflectProperties: function(nodeNames, props){
677
+ if(typeof props == 'string'){
678
+ props = props.split(listReg);
679
+ }
680
+ props.forEach(function(prop){
681
+ webshims.defineNodeNamesProperty(nodeNames, prop, {
682
+ prop: {
683
+ set: function(val){
684
+ $.attr(this, prop, val);
685
+ },
686
+ get: function(){
687
+ return $.attr(this, prop) || '';
688
+ }
689
+ }
690
+ });
691
+ });
692
+ },
693
+ defineNodeNameProperty: function(nodeName, prop, descs){
694
+ havePolyfill[prop] = true;
695
+
696
+ if(descs.reflect){
697
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
698
+ }
699
+
700
+ ['prop', 'attr', 'removeAttr'].forEach(function(type){
701
+ var desc = descs[type];
702
+ if(desc){
703
+ if(type === 'prop'){
704
+ desc = $.extend({writeable: true}, desc);
705
+ } else {
706
+ desc = $.extend({}, desc, {writeable: true});
707
+ }
708
+
709
+ extendQ[type](nodeName, prop, desc);
710
+ if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
711
+ extendNativeValue(nodeName, prop, desc);
712
+ }
713
+ descs[type] = desc;
517
714
  }
518
- if (message) {
519
- $('span.va-box', errorBubble).text(message);
715
+ });
716
+ if(descs.initAttr){
717
+ initProp.content(nodeName, prop);
718
+ }
719
+ return descs;
720
+ },
721
+
722
+ defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
723
+ var olddesc;
724
+ for(var prop in descs){
725
+ if(!_noTmpCache && descs[prop].initAttr){
726
+ initProp.createTmpCache(name);
520
727
  }
521
- else {
522
- this.hide();
728
+ if(propType){
729
+ if(descs[prop][propType]){
730
+ //webshims.log('override: '+ name +'['+prop +'] for '+ propType);
731
+ } else {
732
+ descs[prop][propType] = {};
733
+ ['value', 'set', 'get'].forEach(function(copyProp){
734
+ if(copyProp in descs[prop]){
735
+ descs[prop][propType][copyProp] = descs[prop][copyProp];
736
+ delete descs[prop][copyProp];
737
+ }
738
+ });
739
+ }
523
740
  }
524
- },
525
- position: function(elem, offset){
526
- offset = offset ? $.extend({}, offset) : api.getOffsetFromBody(elem);
527
- offset.top += elem.outerHeight();
528
- errorBubble.css(offset);
529
- },
530
- show: function(){
531
- if(errorBubble.css('display') === 'none'){
532
- errorBubble.css({opacity: 0}).show();
741
+ descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
742
+ }
743
+ if(!_noTmpCache){
744
+ initProp.flushTmpCache();
745
+ }
746
+ return descs;
747
+ },
748
+
749
+ createElement: function(nodeName, create, descs){
750
+ var ret;
751
+ if($.isFunction(create)){
752
+ create = {
753
+ after: create
754
+ };
755
+ }
756
+ initProp.createTmpCache(nodeName);
757
+ if(create.before){
758
+ initProp.createElement(nodeName, create.before);
759
+ }
760
+ if(descs){
761
+ ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
762
+ }
763
+ if(create.after){
764
+ initProp.createElement(nodeName, create.after);
765
+ }
766
+ initProp.flushTmpCache();
767
+ return ret;
768
+ },
769
+ onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
770
+ if(typeof nodeNames == 'string'){
771
+ nodeNames = nodeNames.split(listReg);
772
+ }
773
+ if($.isFunction(desc)){
774
+ desc = {set: desc};
775
+ }
776
+
777
+ nodeNames.forEach(function(name){
778
+ if(!modifyProps[name]){
779
+ modifyProps[name] = {};
533
780
  }
534
- errorBubble.addClass('va-visible').fadeTo(400, 1);
535
- },
536
- hide: function(){
537
- errorBubble.removeClass('va-visible').fadeOut();
538
- },
539
- clear: function(){
540
- clearTimeout(focusTimer);
541
- clearTimeout(hideTimer);
542
- $(document).unbind('.validityalert');
543
- $(window).unbind('.validityalert');
544
- errorBubble.stop().removeAttr('for');
545
- },
546
- _create: function(){
547
- if(errorBubble){return;}
548
- errorBubble = api.errorBubble = $('<'+alertElem+' class="validity-alert-wrapper" role="alert"><span class="validity-alert"><span class="va-arrow"><span class="va-arrow-box"></span></span><span class="va-box"></span></span></'+alertElem+'>').css({position: 'absolute', display: 'none'});
549
- webshims.ready('DOM', function(){
550
- errorBubble.appendTo('body');
551
- if($.fn.bgIframe){
552
- errorBubble.bgIframe();
781
+ if(typeof props == 'string'){
782
+ props = props.split(listReg);
783
+ }
784
+ if(desc.initAttr){
785
+ initProp.createTmpCache(name);
786
+ }
787
+ props.forEach(function(prop){
788
+ if(!modifyProps[name][prop]){
789
+ modifyProps[name][prop] = [];
790
+ havePolyfill[prop] = true;
791
+ }
792
+ if(desc.set){
793
+ if(only){
794
+ desc.set.only = only;
795
+ }
796
+ modifyProps[name][prop].push(desc.set);
797
+ }
798
+
799
+ if(desc.initAttr){
800
+ initProp.content(name, prop);
553
801
  }
554
802
  });
803
+ initProp.flushTmpCache();
804
+
805
+ });
806
+ },
807
+ defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
808
+ if(!descs){
809
+ descs = {};
555
810
  }
556
- };
557
-
558
-
559
- boundHide = $.proxy(api, 'hide');
560
-
561
- return api;
562
- })();
563
-
564
-
565
- /* extension, but also used to fix native implementation workaround/bugfixes */
566
- (function(){
567
- var firstEvent,
568
- invalids = [],
569
- stopSubmitTimer,
570
- form
571
- ;
572
-
573
- $(document).on('invalid', function(e){
574
- if(e.wrongWebkitInvalid){return;}
575
- var jElm = $(e.target);
576
- var shadowElem = jElm.getShadowElement();
577
- if(!shadowElem.hasClass(invalidClass)){
578
- shadowElem.addClass(invalidClasses).removeClass(validClasses);
579
- setTimeout(function(){
580
- $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
581
- }, 0);
811
+ if($.isFunction(descs)){
812
+ descs.set = descs;
813
+ }
814
+ webshims.defineNodeNamesProperty(elementNames, prop, {
815
+ attr: {
816
+ set: function(val){
817
+ this.setAttribute(prop, val);
818
+ if(descs.set){
819
+ descs.set.call(this, true);
820
+ }
821
+ },
822
+ get: function(){
823
+ var ret = this.getAttribute(prop);
824
+ return (ret == null) ? undefined : prop;
825
+ }
826
+ },
827
+ removeAttr: {
828
+ value: function(){
829
+ this.removeAttribute(prop);
830
+ if(descs.set){
831
+ descs.set.call(this, false);
832
+ }
833
+ }
834
+ },
835
+ reflect: true,
836
+ propType: 'boolean',
837
+ initAttr: descs.initAttr || false
838
+ });
839
+ },
840
+ contentAttr: function(elem, name, val){
841
+ if(!elem.nodeName){return;}
842
+ var attr;
843
+ if(val === undefined){
844
+ attr = (elem.attributes[name] || {});
845
+ val = attr.specified ? attr.value : null;
846
+ return (val == null) ? undefined : val;
582
847
  }
583
848
 
584
- if(!firstEvent){
585
- //trigger firstinvalid
586
- firstEvent = $.Event('firstinvalid');
587
- firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
588
- var firstSystemInvalid = $.Event('firstinvalidsystem');
589
- $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
590
- jElm.trigger(firstEvent);
849
+ if(typeof val == 'boolean'){
850
+ if(!val){
851
+ elem.removeAttribute(name);
852
+ } else {
853
+ elem.setAttribute(name, name);
854
+ }
855
+ } else {
856
+ elem.setAttribute(name, val);
591
857
  }
592
-
593
- //if firstinvalid was prevented all invalids will be also prevented
594
- if( firstEvent && firstEvent.isDefaultPrevented() ){
595
- e.preventDefault();
596
- }
597
- invalids.push(e.target);
598
- e.extraData = 'fix';
599
- clearTimeout(stopSubmitTimer);
600
- stopSubmitTimer = setTimeout(function(){
601
- var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
602
- //reset firstinvalid
603
- firstEvent = false;
604
- invalids = [];
605
- $(e.target).trigger(lastEvent, lastEvent);
606
- }, 9);
607
- jElm = null;
608
- shadowElem = null;
609
- });
610
- })();
858
+ },
859
+
860
+ // set current Lang:
861
+ // - webshims.activeLang(lang:string);
862
+ // get current lang
863
+ // - webshims.activeLang();
864
+ // get current lang
865
+ // webshims.activeLang({
866
+ // register: moduleName:string,
867
+ // callback: callback:function
868
+ // });
869
+ // get/set including removeLang
870
+ // - webshims.activeLang({
871
+ // module: moduleName:string,
872
+ // callback: callback:function,
873
+ // langObj: languageObj:array/object
874
+ // });
875
+ activeLang: (function(){
876
+ var callbacks = [];
877
+ var registeredCallbacks = {};
878
+ var currentLang;
879
+ var shortLang;
880
+ var notLocal = /:\/\/|^\.*\//;
881
+ var loadRemoteLang = function(data, lang, options){
882
+ var langSrc;
883
+ if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
884
+ data.loading = true;
885
+ langSrc = options.langSrc;
886
+ if(!notLocal.test(langSrc)){
887
+ langSrc = webshims.cfg.basePath+langSrc;
888
+ }
889
+ webshims.loader.loadScript(langSrc+lang+'.js', function(){
890
+ if(data.langObj[lang]){
891
+ data.loading = false;
892
+ callLang(data, true);
893
+ } else {
894
+ $(function(){
895
+ if(data.langObj[lang]){
896
+ callLang(data, true);
897
+ }
898
+ data.loading = false;
899
+ });
900
+ }
901
+ });
902
+ return true;
903
+ }
904
+ return false;
905
+ };
906
+ var callRegister = function(module){
907
+ if(registeredCallbacks[module]){
908
+ registeredCallbacks[module].forEach(function(data){
909
+ data.callback(currentLang, shortLang, '');
910
+ });
911
+ }
912
+ };
913
+ var callLang = function(data, _noLoop){
914
+ if(data.activeLang != currentLang && data.activeLang !== shortLang){
915
+ var options = modules[data.module].options;
916
+ if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
917
+ data.activeLang = currentLang;
918
+ data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
919
+ callRegister(data.module);
920
+ } else if( !_noLoop &&
921
+ !loadRemoteLang(data, currentLang, options) &&
922
+ !loadRemoteLang(data, shortLang, options) &&
923
+ data.langObj[''] && data.activeLang !== '' ) {
924
+ data.activeLang = '';
925
+ data.callback(data.langObj[''], currentLang);
926
+ callRegister(data.module);
927
+ }
928
+ }
929
+ };
930
+
931
+
932
+ var activeLang = function(lang){
933
+
934
+ if(typeof lang == 'string' && lang !== currentLang){
935
+ currentLang = lang;
936
+ shortLang = currentLang.split('-')[0];
937
+ if(currentLang == shortLang){
938
+ shortLang = false;
939
+ }
940
+ $.each(callbacks, function(i, data){
941
+ callLang(data);
942
+ });
943
+ } else if(typeof lang == 'object'){
944
+
945
+ if(lang.register){
946
+ if(!registeredCallbacks[lang.register]){
947
+ registeredCallbacks[lang.register] = [];
948
+ }
949
+ registeredCallbacks[lang.register].push(lang);
950
+ lang.callback(currentLang, shortLang, '');
951
+ } else {
952
+ if(!lang.activeLang){
953
+ lang.activeLang = '';
954
+ }
955
+ callbacks.push(lang);
956
+ callLang(lang);
957
+ }
958
+ }
959
+ return currentLang;
960
+ };
961
+
962
+ return activeLang;
963
+ })()
964
+ });
611
965
 
612
- $.fn.getErrorMessage = function(){
613
- var message = '';
614
- var elem = this[0];
615
- if(elem){
616
- message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
966
+ $.each({
967
+ defineNodeNamesProperty: 'defineNodeNameProperty',
968
+ defineNodeNamesProperties: 'defineNodeNameProperties',
969
+ createElements: 'createElement'
970
+ }, function(name, baseMethod){
971
+ webshims[name] = function(names, a, b, c){
972
+ if(typeof names == 'string'){
973
+ names = names.split(listReg);
974
+ }
975
+ var retDesc = {};
976
+ names.forEach(function(nodeName){
977
+ retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
978
+ });
979
+ return retDesc;
980
+ };
981
+ });
982
+
983
+ webshims.isReady('webshimLocalization', true);
984
+ });
985
+ //html5a11y
986
+ (function($, document){
987
+ if(!$.webshims.assumeARIA || ('content' in document.createElement('template'))){return;}
988
+
989
+ $(function(){
990
+ var main = $('main').attr({role: 'main'});
991
+ if(main.length > 1){
992
+ webshims.error('only one main element allowed in document');
993
+ } else if(main.is('article *, section *')) {
994
+ webshims.error('main not allowed inside of article/section elements');
995
+ }
996
+ });
997
+
998
+ if(('hidden' in document.createElement('a'))){
999
+ return;
1000
+ }
1001
+
1002
+ var elemMappings = {
1003
+ article: "article",
1004
+ aside: "complementary",
1005
+ section: "region",
1006
+ nav: "navigation",
1007
+ address: "contentinfo"
1008
+ };
1009
+ var addRole = function(elem, role){
1010
+ var hasRole = elem.getAttribute('role');
1011
+ if (!hasRole) {
1012
+ elem.setAttribute('role', role);
617
1013
  }
618
- return message;
619
1014
  };
620
1015
 
621
- if(options.replaceValidationUI){
622
- webshims.ready('DOM forms', function(){
623
- $(document).on('firstinvalid', function(e){
624
- if(!e.isInvalidUIPrevented()){
625
- e.preventDefault();
626
- $.webshims.validityAlert.showFor( e.target );
627
- }
628
- });
1016
+
1017
+ $.webshims.addReady(function(context, contextElem){
1018
+ $.each(elemMappings, function(name, role){
1019
+ var elems = $(name, context).add(contextElem.filter(name));
1020
+ for (var i = 0, len = elems.length; i < len; i++) {
1021
+ addRole(elems[i], role);
1022
+ }
629
1023
  });
630
- }
631
- });
1024
+ if (context === document) {
1025
+ var header = document.getElementsByTagName('header')[0];
1026
+ var footers = document.getElementsByTagName('footer');
1027
+ var footerLen = footers.length;
1028
+
1029
+ if (header && !$(header).closest('section, article')[0]) {
1030
+ addRole(header, 'banner');
1031
+ }
1032
+ if (!footerLen) {
1033
+ return;
1034
+ }
1035
+ var footer = footers[footerLen - 1];
1036
+ if (!$(footer).closest('section, article')[0]) {
1037
+ addRole(footer, 'contentinfo');
1038
+ }
1039
+ }
1040
+ });
1041
+
1042
+ })(jQuery, document);
632
1043
 
633
- })(jQuery);
634
1044
  jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
635
1045
  "use strict";
636
1046
  var validityMessages = webshims.validityMessages;
637
1047
 
638
1048
  var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
639
1049
 
640
- validityMessages['en'] = $.extend(true, {
1050
+ validityMessages.en = $.extend(true, {
641
1051
  typeMismatch: {
1052
+ defaultMessage: 'Please enter a valid value.',
642
1053
  email: 'Please enter an email address.',
643
1054
  url: 'Please enter a URL.',
644
1055
  number: 'Please enter a number.',
645
1056
  date: 'Please enter a date.',
646
1057
  time: 'Please enter a time.',
647
1058
  range: 'Invalid input.',
1059
+ month: 'Please enter a valid value.',
648
1060
  "datetime-local": 'Please enter a datetime.'
649
1061
  },
650
1062
  rangeUnderflow: {
@@ -655,43 +1067,42 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
655
1067
  },
656
1068
  stepMismatch: 'Invalid input.',
657
1069
  tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
658
-
659
1070
  patternMismatch: 'Invalid input. {%title}',
660
1071
  valueMissing: {
661
1072
  defaultMessage: 'Please fill out this field.',
662
1073
  checkbox: 'Please check this box if you want to proceed.'
663
1074
  }
664
- }, (validityMessages['en'] || validityMessages['en-US'] || {}));
665
-
666
-
667
- ['select', 'radio'].forEach(function(type){
668
- if(typeof validityMessages['en'].valueMissing == 'object'){
669
- validityMessages['en'].valueMissing[type] = 'Please select an option.';
670
- }
671
- });
1075
+ }, (validityMessages.en || validityMessages['en-US'] || {}));
672
1076
 
673
- ['date', 'time', 'datetime-local'].forEach(function(type){
674
- if(typeof validityMessages['en'].rangeUnderflow == 'object'){
1077
+ if(typeof validityMessages['en'].valueMissing == 'object'){
1078
+ ['select', 'radio'].forEach(function(type){
1079
+ validityMessages.en.valueMissing[type] = 'Please select an option.';
1080
+ });
1081
+ }
1082
+ if(typeof validityMessages.en.rangeUnderflow == 'object'){
1083
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
675
1084
  validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
676
- }
677
- });
678
- ['date', 'time', 'datetime-local'].forEach(function(type){
679
- if(typeof validityMessages['en'].rangeOverflow == 'object'){
1085
+ });
1086
+ }
1087
+ if(typeof validityMessages.en.rangeOverflow == 'object'){
1088
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
680
1089
  validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
681
- }
682
- });
1090
+ });
1091
+ }
683
1092
 
684
- validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en'];
1093
+ validityMessages['en-US'] = validityMessages['en-US'] || validityMessages.en;
685
1094
  validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
686
1095
 
687
- validityMessages['de'] = $.extend(true, {
1096
+ validityMessages.de = $.extend(true, {
688
1097
  typeMismatch: {
689
- email: '{%value} ist keine zulässige E-Mail-Adresse',
690
- url: '{%value} ist keine zulässige Webadresse',
691
- number: '{%value} ist keine Nummer!',
692
- date: '{%value} ist kein Datum',
693
- time: '{%value} ist keine Uhrzeit',
694
- range: '{%value} ist keine Nummer!',
1098
+ defaultMessage: '{%value} ist in diesem Feld nicht zulässig.',
1099
+ email: '{%value} ist keine gültige E-Mail-Adresse.',
1100
+ url: '{%value} ist kein(e) gültige(r) Webadresse/Pfad.',
1101
+ number: '{%value} ist keine Nummer.',
1102
+ date: '{%value} ist kein Datum.',
1103
+ time: '{%value} ist keine Uhrzeit.',
1104
+ month: '{%value} ist in diesem Feld nicht zulässig.',
1105
+ range: '{%value} ist keine Nummer.',
695
1106
  "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
696
1107
  },
697
1108
  rangeUnderflow: {
@@ -702,51 +1113,73 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
702
1113
  },
703
1114
  stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
704
1115
  tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
705
- patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}',
1116
+ patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format. {%title}',
706
1117
  valueMissing: {
707
- defaultMessage: 'Bitte geben Sie einen Wert ein',
708
- checkbox: 'Bitte aktivieren Sie das Kästchen'
1118
+ defaultMessage: 'Bitte geben Sie einen Wert ein.',
1119
+ checkbox: 'Bitte aktivieren Sie das Kästchen.'
709
1120
  }
710
- }, (validityMessages['de'] || {}));
711
-
712
- ['select', 'radio'].forEach(function(type){
713
- if(typeof validityMessages['de'].valueMissing == 'object'){
714
- validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus';
715
- }
716
- });
1121
+ }, (validityMessages.de || {}));
717
1122
 
718
- ['date', 'time', 'datetime-local'].forEach(function(type){
719
- if(typeof validityMessages['de'].rangeUnderflow == 'object'){
1123
+ if(typeof validityMessages.de.valueMissing == 'object'){
1124
+ ['select', 'radio'].forEach(function(type){
1125
+ validityMessages.de.valueMissing[type] = 'Bitte wählen Sie eine Option aus.';
1126
+ });
1127
+ }
1128
+ if(typeof validityMessages.de.rangeUnderflow == 'object'){
1129
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
720
1130
  validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
721
- }
722
- });
723
- ['date', 'time', 'datetime-local'].forEach(function(type){
724
- if(typeof validityMessages['de'].rangeOverflow == 'object'){
1131
+ });
1132
+ }
1133
+ if(typeof validityMessages.de.rangeOverflow == 'object'){
1134
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
725
1135
  validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
726
- }
727
- });
1136
+ });
1137
+ }
728
1138
 
729
1139
  var currentValidationMessage = validityMessages[''];
730
-
731
-
732
- webshims.createValidationMessage = function(elem, name){
733
- var message = currentValidationMessage[name];
1140
+ var getMessageFromObj = function(message, elem){
734
1141
  if(message && typeof message !== 'string'){
735
1142
  message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
736
1143
  }
1144
+ return message || '';
1145
+ };
1146
+ var valueVals = {
1147
+ value: 1,
1148
+ min: 1,
1149
+ max: 1
1150
+ };
1151
+
1152
+ webshims.createValidationMessage = function(elem, name){
1153
+ var spinner;
1154
+ var message = getMessageFromObj(currentValidationMessage[name], elem);
1155
+
1156
+ if(!message){
1157
+ message = getMessageFromObj(validityMessages[''][name], elem) || 'invalid value';
1158
+ webshims.info('could not find errormessage for: '+ name +' / '+ $.prop(elem, 'type') +'. in language: '+$.webshims.activeLang());
1159
+ }
737
1160
  if(message){
738
1161
  ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
739
1162
  if(message.indexOf('{%'+attr) === -1){return;}
740
- var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || '';
1163
+ var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.prop(elem, attr)) || '';
741
1164
  if(name == 'patternMismatch' && attr == 'title' && !val){
742
1165
  webshims.error('no title for patternMismatch provided. Always add a title attribute.');
743
1166
  }
1167
+ if(valueVals[attr]){
1168
+ if(!spinner){
1169
+ spinner = $(elem).getShadowElement().data('wsspinner');
1170
+ }
1171
+ if(spinner && spinner.formatValue){
1172
+ val = spinner.formatValue(val, false);
1173
+ }
1174
+ }
744
1175
  message = message.replace('{%'+ attr +'}', val);
745
1176
  if('value' == attr){
746
1177
  message = message.replace('{%valueLen}', val.length);
747
1178
  }
1179
+
748
1180
  });
749
1181
  }
1182
+
750
1183
  return message || '';
751
1184
  };
752
1185
 
@@ -759,6 +1192,7 @@ jQuery.webshims.register('form-message', function($, webshims, window, document,
759
1192
  langObj: validityMessages,
760
1193
  module: 'form-core',
761
1194
  callback: function(langObj){
1195
+
762
1196
  currentValidationMessage = langObj;
763
1197
  }
764
1198
  });