webshims-rails 0.4.5 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +253 -253
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +1 -1
  6. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +1 -1
  7. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +1 -1
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +1 -1
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +1 -1
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +1 -1
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +1 -1
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -1
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +1 -1
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -1
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +1 -1
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +1 -1
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +1 -1
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +1 -1
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +1 -1
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +1 -1
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +1 -1
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +1 -1
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +1 -1
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +1 -1
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +1 -1
  26. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +1 -1
  27. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +1 -1
  28. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  29. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  30. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +1 -1
  31. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +1 -1
  32. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -1
  33. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  34. data/vendor/assets/javascripts/webshims/polyfiller.js +1188 -1188
  35. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +82 -82
  36. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1752 -1752
  37. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3310 -3311
  38. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1631 -1631
  39. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1695 -1696
  40. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1098 -1098
  41. data/vendor/assets/javascripts/webshims/shims/combos/14.js +477 -477
  42. data/vendor/assets/javascripts/webshims/shims/combos/15.js +317 -317
  43. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2177 -2154
  44. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2354 -2319
  45. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1322 -1322
  46. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2262 -2238
  47. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2376 -2340
  48. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1557 -1558
  49. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1745 -1733
  50. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2360 -2361
  51. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2342 -2331
  52. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2859 -2836
  53. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1547 -1548
  54. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2178 -2155
  55. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3311 -3312
  56. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3058 -3022
  57. data/vendor/assets/javascripts/webshims/shims/combos/4.js +807 -771
  58. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1063 -1027
  59. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1745 -1709
  60. data/vendor/assets/javascripts/webshims/shims/combos/6.js +384 -384
  61. data/vendor/assets/javascripts/webshims/shims/combos/7.js +640 -640
  62. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1546 -1547
  63. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2507 -2508
  64. data/vendor/assets/javascripts/webshims/shims/details.js +148 -148
  65. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +949 -949
  66. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  67. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  68. data/vendor/assets/javascripts/webshims/shims/form-core.js +630 -606
  69. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -681
  70. data/vendor/assets/javascripts/webshims/shims/form-message.js +176 -164
  71. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  72. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  73. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1568 -1568
  74. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  75. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  76. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  77. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  78. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  79. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  80. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  81. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  82. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  83. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  84. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  85. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  86. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  87. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  88. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  89. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  90. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  91. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  92. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +596 -597
  93. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +891 -891
  94. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  95. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +960 -960
  96. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  97. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +697 -697
  98. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  99. metadata +2 -4
  100. data/vendor/assets/javascripts/webshims/minified/shims/range-ui.js +0 -1
  101. data/vendor/assets/javascripts/webshims/shims/range-ui.js +0 -66
@@ -1,6 +1,6 @@
1
1
  module Webshims
2
2
  module Rails
3
- VERSION = "0.4.5"
4
- WEBSHIMS_VERSION = "1.9.4"
3
+ VERSION = "0.4.6"
4
+ WEBSHIMS_VERSION = "1.9.5"
5
5
  end
6
6
  end
@@ -1,253 +1,253 @@
1
- (function($, window, document, undefined){
2
- "use strict";
3
- if(!$.webshims){
4
- var langs = navigator.browserLanguage || navigator.language || $('html').attr('lang') || '';
5
- $.webshims = {
6
- addReady: function(fn){$(function(){fn(document, $([]));});},
7
- ready: function(n, fn){fn();},
8
- activeLang: function(){return langs;}
9
- };
10
- }
11
- var webshims = $.webshims;
12
- var customValidityRules = {};
13
- var formReady = false;
14
- var blockCustom;
15
- var initTest;
16
- var onEventTest = function(e){
17
- webshims.refreshCustomValidityRules(e.target);
18
- };
19
-
20
-
21
- webshims.customErrorMessages = {};
22
- webshims.addCustomValidityRule = function(name, test, defaultMessage){
23
- customValidityRules[name] = test;
24
- if(!webshims.customErrorMessages[name]){
25
- webshims.customErrorMessages[name] = [];
26
- webshims.customErrorMessages[name][''] = defaultMessage || name;
27
- }
28
- if($.isReady && formReady){
29
- $('input, select, textarea').each(function(){
30
- testValidityRules(this);
31
- });
32
- }
33
- };
34
- webshims.refreshCustomValidityRules = function(elem){
35
- if(!elem.form || (!initTest && !$.prop(elem, 'willValidate')) ){return;}
36
- blockCustom = true;
37
- var customMismatchedRule = $.data(elem, 'customMismatchedRule');
38
- var validity = $.prop(elem, 'validity') || {};
39
- var message = '';
40
- if(customMismatchedRule || !validity.customError){
41
- var val = $(elem).val();
42
- $.each(customValidityRules, function(name, test){
43
- message = test(elem, val) || '';
44
- customMismatchedRule = name;
45
- if(message){
46
-
47
- if(typeof message != 'string'){
48
- message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || webshims.customErrorMessages[name][webshims.activeLang()] || webshims.customErrorMessages[name][''];
49
- }
50
-
51
- if(typeof message == 'object'){
52
- message = message[name] || message.customError || message.defaultMessage;
53
- }
54
- return false;
55
- }
56
- });
57
-
58
- if(message){
59
- $.data(elem, 'customMismatchedRule', customMismatchedRule);
60
- }
61
- $(elem).setCustomValidity(message);
62
- }
63
- blockCustom = false;
64
- };
65
- var testValidityRules = webshims.refreshCustomValidityRules;
66
-
67
- webshims.ready('forms', function(){
68
- formReady = true;
69
-
70
- var oldCustomValidity = $.fn.setCustomValidity || function(message){
71
- return this.each(function(){
72
- if(this.setCustomValidity){
73
- this.setCustomValidity(message);
74
- }
75
- });
76
- };
77
-
78
-
79
- $.fn.setCustomValidity = function(message){
80
- if(!blockCustom){
81
- this.data('customMismatchedRule', '');
82
- }
83
- return oldCustomValidity.apply(this, arguments);
84
- };
85
-
86
-
87
- $(document).bind('change', onEventTest);
88
-
89
- webshims.addReady(function(context, selfElement){
90
- initTest = true;
91
- $('input, select, textarea', context).add(selfElement.filter('input, select, textarea')).each(function(){
92
- testValidityRules(this);
93
- });
94
- initTest = false;
95
- });
96
- $(document).bind('refreshCustomValidityRules', onEventTest);
97
-
98
- });
99
-
100
- })(jQuery, window, document);
101
-
102
- /*
103
- * adds support for HTML5 constraint validation
104
- * - partial pattern: <input data-partial-pattern="RegExp" />
105
- * - creditcard-validation: <input class="creditcard-input" />
106
- * - several dependent-validation patterns (examples):
107
- * - <input type="email" id="mail" /> <input data-dependent-validation='mail' />
108
- * - <input type="date" id="start" data-dependent-validation='{"from": "end", "prop": "max"}' /> <input type="date" id="end" data-dependent-validation='{"from": "start", "prop": "min"}' />
109
- * - <input type="checkbox" id="check" /> <input data-dependent-validation='checkbox' />
110
- */
111
- (function($, window, document, undefined){
112
- "use strict";
113
- var addCustomValidityRule = $.webshims.addCustomValidityRule;
114
- addCustomValidityRule('partialPattern', function(elem, val){
115
- if(!val || !elem.getAttribute('data-partial-pattern')){return;}
116
- var pattern = $(elem).data('partial-pattern');
117
- if(!pattern){return;}
118
- return !(new RegExp('(' + pattern + ')', 'i').test(val));
119
- }, 'This format is not allowed here.');
120
-
121
- addCustomValidityRule('tooShort', function(elem, val){
122
- if(!val || !elem.getAttribute('data-minlength')){return;}
123
- return $(elem).data('minlength') > val.length;
124
- }, 'Entered value is too short.');
125
-
126
- var groupTimer = {};
127
- addCustomValidityRule('group-required', function(elem, val){
128
- var name = elem.name;
129
- if(!name || elem.type !== 'checkbox' || !$(elem).hasClass('group-required')){return;}
130
- var checkboxes = $( (elem.form && elem.form[name]) || document.getElementsByName(name));
131
- var isValid = checkboxes.filter(':checked');
132
- if(groupTimer[name]){
133
- clearTimeout(groupTimer[name]);
134
- }
135
- groupTimer[name] = setTimeout(function(){
136
- checkboxes
137
- .unbind('click.groupRequired')
138
- .bind('click.groupRequired', function(){
139
- checkboxes.filter('.group-required').each(function(){
140
- $.webshims.refreshCustomValidityRules(this);
141
- });
142
- })
143
- ;
144
- }, 9);
145
-
146
- return !(isValid[0]);
147
- }, 'Please check one of these checkboxes.');
148
-
149
- // based on https://sites.google.com/site/abapexamples/javascript/luhn-validation
150
- addCustomValidityRule('creditcard', function(elem, value){
151
- if(!value || !$(elem).hasClass('creditcard-input')){return;}
152
- value = value.replace(/\-/g, "");
153
- //if it's not numeric return true >- for invalid
154
- if(value != value * 1){return true;}
155
- var len = value.length;
156
- var sum = 0;
157
- var mul = 1;
158
- var ca;
159
-
160
- while (len--) {
161
- ca = parseInt(value.charAt(len),10) * mul;
162
- sum += ca - (ca>9)*9;// sum += ca - (-(ca>9))|9
163
- // 1 <--> 2 toggle.
164
- mul ^= 3; // (mul = 3 - mul);
165
- }
166
- return !((sum%10 === 0) && (sum > 0));
167
- }, 'Please enter a valid credit card number');
168
-
169
- var dependentDefaults = {
170
- //"from": "IDREF || UniqueNAMEREF", //required property: element
171
- "prop": "value", //default: value||disabled (last if "from-prop" is checked)
172
- "from-prop": "value", //default: value||checked (last if element checkbox or radio)
173
- "toggle": false
174
- };
175
-
176
- var getGroupElements = function(elem) {
177
- return $(elem.form[elem.name]).filter('[type="radio"]');
178
- };
179
- $.webshims.ready('form-core', function(){
180
- if($.webshims.modules){
181
- getGroupElements = $.webshims.modules["form-core"].getGroupElements || getGroupElements;
182
- }
183
- });
184
-
185
- addCustomValidityRule('dependent', function(elem, val){
186
-
187
- if( !elem.getAttribute('data-dependent-validation') ){return;}
188
-
189
- var data = $(elem).data('dependentValidation');
190
- var specialVal;
191
- if(!data){return;}
192
- var depFn = function(e){
193
- var val = $.prop(data.masterElement, data["from-prop"]);
194
- if(specialVal){
195
- val = $.inArray(val, specialVal) !== -1;
196
- }
197
- if(data.toggle){
198
- val = !val;
199
- }
200
- $.prop( elem, data.prop, val);
201
- };
202
-
203
- if(!data._init || !data.masterElement){
204
-
205
- if(typeof data == 'string'){
206
- data = {"from": data};
207
- }
208
-
209
-
210
- data.masterElement = document.getElementById(data["from"]) || (document.getElementsByName(data["from"] || [])[0]);
211
-
212
- if (!data.masterElement || !data.masterElement.form) {return;}
213
-
214
- if(/radio|checkbox/i.test(data.masterElement.type)){
215
- if(!data["from-prop"]){
216
- data["from-prop"] = 'checked';
217
- }
218
- if(!data.prop && data["from-prop"] == 'checked'){
219
- data.prop = 'disabled';
220
- }
221
- } else if(!data["from-prop"]){
222
- data["from-prop"] = 'value';
223
- }
224
-
225
- if(data["from-prop"].indexOf('value:') === 0){
226
- specialVal = data["from-prop"].replace('value:', '').split('||');
227
- data["from-prop"] = 'value';
228
-
229
- }
230
-
231
- data = $.data(elem, 'dependentValidation', $.extend({_init: true}, dependentDefaults, data));
232
-
233
- if(data.prop !== "value" || specialVal){
234
- $(data.masterElement.type === 'radio' && getGroupElements(data.masterElement) || data.masterElement).bind('change', depFn);
235
- } else {
236
- $(data.masterElement).bind('change', function(){
237
- $.webshims.refreshCustomValidityRules(elem);
238
- if($(elem).is('.user-error, .user-success')){
239
- $(elem).trigger('refreshvalidityui');
240
- }
241
- });
242
- }
243
- }
244
-
245
- if(data.prop == "value" && !specialVal){
246
- return ($.prop(data.masterElement, 'value') != val);
247
- } else {
248
- depFn();
249
- return '';
250
- }
251
-
252
- }, 'The value of this field does not repeat the value of the other field');
253
- })(jQuery, window, document);
1
+ (function($, window, document, undefined){
2
+ "use strict";
3
+ if(!$.webshims){
4
+ var langs = navigator.browserLanguage || navigator.language || $('html').attr('lang') || '';
5
+ $.webshims = {
6
+ addReady: function(fn){$(function(){fn(document, $([]));});},
7
+ ready: function(n, fn){fn();},
8
+ activeLang: function(){return langs;}
9
+ };
10
+ }
11
+ var webshims = $.webshims;
12
+ var customValidityRules = {};
13
+ var formReady = false;
14
+ var blockCustom;
15
+ var initTest;
16
+ var onEventTest = function(e){
17
+ webshims.refreshCustomValidityRules(e.target);
18
+ };
19
+
20
+
21
+ webshims.customErrorMessages = {};
22
+ webshims.addCustomValidityRule = function(name, test, defaultMessage){
23
+ customValidityRules[name] = test;
24
+ if(!webshims.customErrorMessages[name]){
25
+ webshims.customErrorMessages[name] = [];
26
+ webshims.customErrorMessages[name][''] = defaultMessage || name;
27
+ }
28
+ if($.isReady && formReady){
29
+ $('input, select, textarea').each(function(){
30
+ testValidityRules(this);
31
+ });
32
+ }
33
+ };
34
+ webshims.refreshCustomValidityRules = function(elem){
35
+ if(!elem.form || (!initTest && !$.prop(elem, 'willValidate')) ){return;}
36
+ blockCustom = true;
37
+ var customMismatchedRule = $.data(elem, 'customMismatchedRule');
38
+ var validity = $.prop(elem, 'validity') || {};
39
+ var message = '';
40
+ if(customMismatchedRule || !validity.customError){
41
+ var val = $(elem).val();
42
+ $.each(customValidityRules, function(name, test){
43
+ message = test(elem, val) || '';
44
+ customMismatchedRule = name;
45
+ if(message){
46
+
47
+ if(typeof message != 'string'){
48
+ message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || webshims.customErrorMessages[name][webshims.activeLang()] || webshims.customErrorMessages[name][''];
49
+ }
50
+
51
+ if(typeof message == 'object'){
52
+ message = message[name] || message.customError || message.defaultMessage;
53
+ }
54
+ return false;
55
+ }
56
+ });
57
+
58
+ if(message){
59
+ $.data(elem, 'customMismatchedRule', customMismatchedRule);
60
+ }
61
+ $(elem).setCustomValidity(message);
62
+ }
63
+ blockCustom = false;
64
+ };
65
+ var testValidityRules = webshims.refreshCustomValidityRules;
66
+
67
+ webshims.ready('forms', function(){
68
+ formReady = true;
69
+
70
+ var oldCustomValidity = $.fn.setCustomValidity || function(message){
71
+ return this.each(function(){
72
+ if(this.setCustomValidity){
73
+ this.setCustomValidity(message);
74
+ }
75
+ });
76
+ };
77
+
78
+
79
+ $.fn.setCustomValidity = function(message){
80
+ if(!blockCustom){
81
+ this.data('customMismatchedRule', '');
82
+ }
83
+ return oldCustomValidity.apply(this, arguments);
84
+ };
85
+
86
+
87
+ $(document).bind('change', onEventTest);
88
+
89
+ webshims.addReady(function(context, selfElement){
90
+ initTest = true;
91
+ $('input, select, textarea', context).add(selfElement.filter('input, select, textarea')).each(function(){
92
+ testValidityRules(this);
93
+ });
94
+ initTest = false;
95
+ });
96
+ $(document).bind('refreshCustomValidityRules', onEventTest);
97
+
98
+ });
99
+
100
+ })(jQuery, window, document);
101
+
102
+ /*
103
+ * adds support for HTML5 constraint validation
104
+ * - partial pattern: <input data-partial-pattern="RegExp" />
105
+ * - creditcard-validation: <input class="creditcard-input" />
106
+ * - several dependent-validation patterns (examples):
107
+ * - <input type="email" id="mail" /> <input data-dependent-validation='mail' />
108
+ * - <input type="date" id="start" data-dependent-validation='{"from": "end", "prop": "max"}' /> <input type="date" id="end" data-dependent-validation='{"from": "start", "prop": "min"}' />
109
+ * - <input type="checkbox" id="check" /> <input data-dependent-validation='checkbox' />
110
+ */
111
+ (function($, window, document, undefined){
112
+ "use strict";
113
+ var addCustomValidityRule = $.webshims.addCustomValidityRule;
114
+ addCustomValidityRule('partialPattern', function(elem, val){
115
+ if(!val || !elem.getAttribute('data-partial-pattern')){return;}
116
+ var pattern = $(elem).data('partial-pattern');
117
+ if(!pattern){return;}
118
+ return !(new RegExp('(' + pattern + ')', 'i').test(val));
119
+ }, 'This format is not allowed here.');
120
+
121
+ addCustomValidityRule('tooShort', function(elem, val){
122
+ if(!val || !elem.getAttribute('data-minlength')){return;}
123
+ return $(elem).data('minlength') > val.length;
124
+ }, 'Entered value is too short.');
125
+
126
+ var groupTimer = {};
127
+ addCustomValidityRule('group-required', function(elem, val){
128
+ var name = elem.name;
129
+ if(!name || elem.type !== 'checkbox' || !$(elem).hasClass('group-required')){return;}
130
+ var checkboxes = $( (elem.form && elem.form[name]) || document.getElementsByName(name));
131
+ var isValid = checkboxes.filter(':checked');
132
+ if(groupTimer[name]){
133
+ clearTimeout(groupTimer[name]);
134
+ }
135
+ groupTimer[name] = setTimeout(function(){
136
+ checkboxes
137
+ .unbind('click.groupRequired')
138
+ .bind('click.groupRequired', function(){
139
+ checkboxes.filter('.group-required').each(function(){
140
+ $.webshims.refreshCustomValidityRules(this);
141
+ });
142
+ })
143
+ ;
144
+ }, 9);
145
+
146
+ return !(isValid[0]);
147
+ }, 'Please check one of these checkboxes.');
148
+
149
+ // based on https://sites.google.com/site/abapexamples/javascript/luhn-validation
150
+ addCustomValidityRule('creditcard', function(elem, value){
151
+ if(!value || !$(elem).hasClass('creditcard-input')){return;}
152
+ value = value.replace(/\-/g, "");
153
+ //if it's not numeric return true >- for invalid
154
+ if(value != value * 1){return true;}
155
+ var len = value.length;
156
+ var sum = 0;
157
+ var mul = 1;
158
+ var ca;
159
+
160
+ while (len--) {
161
+ ca = parseInt(value.charAt(len),10) * mul;
162
+ sum += ca - (ca>9)*9;// sum += ca - (-(ca>9))|9
163
+ // 1 <--> 2 toggle.
164
+ mul ^= 3; // (mul = 3 - mul);
165
+ }
166
+ return !((sum%10 === 0) && (sum > 0));
167
+ }, 'Please enter a valid credit card number');
168
+
169
+ var dependentDefaults = {
170
+ //"from": "IDREF || UniqueNAMEREF", //required property: element
171
+ "prop": "value", //default: value||disabled (last if "from-prop" is checked)
172
+ "from-prop": "value", //default: value||checked (last if element checkbox or radio)
173
+ "toggle": false
174
+ };
175
+
176
+ var getGroupElements = function(elem) {
177
+ return $(elem.form[elem.name]).filter('[type="radio"]');
178
+ };
179
+ $.webshims.ready('form-core', function(){
180
+ if($.webshims.modules){
181
+ getGroupElements = $.webshims.modules["form-core"].getGroupElements || getGroupElements;
182
+ }
183
+ });
184
+
185
+ addCustomValidityRule('dependent', function(elem, val){
186
+
187
+ if( !elem.getAttribute('data-dependent-validation') ){return;}
188
+
189
+ var data = $(elem).data('dependentValidation');
190
+ var specialVal;
191
+ if(!data){return;}
192
+ var depFn = function(e){
193
+ var val = $.prop(data.masterElement, data["from-prop"]);
194
+ if(specialVal){
195
+ val = $.inArray(val, specialVal) !== -1;
196
+ }
197
+ if(data.toggle){
198
+ val = !val;
199
+ }
200
+ $.prop( elem, data.prop, val);
201
+ };
202
+
203
+ if(!data._init || !data.masterElement){
204
+
205
+ if(typeof data == 'string'){
206
+ data = {"from": data};
207
+ }
208
+
209
+
210
+ data.masterElement = document.getElementById(data["from"]) || (document.getElementsByName(data["from"] || [])[0]);
211
+
212
+ if (!data.masterElement || !data.masterElement.form) {return;}
213
+
214
+ if(/radio|checkbox/i.test(data.masterElement.type)){
215
+ if(!data["from-prop"]){
216
+ data["from-prop"] = 'checked';
217
+ }
218
+ if(!data.prop && data["from-prop"] == 'checked'){
219
+ data.prop = 'disabled';
220
+ }
221
+ } else if(!data["from-prop"]){
222
+ data["from-prop"] = 'value';
223
+ }
224
+
225
+ if(data["from-prop"].indexOf('value:') === 0){
226
+ specialVal = data["from-prop"].replace('value:', '').split('||');
227
+ data["from-prop"] = 'value';
228
+
229
+ }
230
+
231
+ data = $.data(elem, 'dependentValidation', $.extend({_init: true}, dependentDefaults, data));
232
+
233
+ if(data.prop !== "value" || specialVal){
234
+ $(data.masterElement.type === 'radio' && getGroupElements(data.masterElement) || data.masterElement).bind('change', depFn);
235
+ } else {
236
+ $(data.masterElement).bind('change', function(){
237
+ $.webshims.refreshCustomValidityRules(elem);
238
+ if($(elem).is('.user-error, .user-success')){
239
+ $(elem).trigger('refreshvalidityui');
240
+ }
241
+ });
242
+ }
243
+ }
244
+
245
+ if(data.prop == "value" && !specialVal){
246
+ return ($.prop(data.masterElement, 'value') != val);
247
+ } else {
248
+ depFn();
249
+ return '';
250
+ }
251
+
252
+ }, 'The value of this field does not repeat the value of the other field');
253
+ })(jQuery, window, document);