dqs-jquery-form-validator-rails 2.2.163 → 2.2.164

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -0
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +24 -0
  6. data/README.md +451 -0
  7. data/Rakefile +1 -0
  8. data/app/assets/javascripts/brazil.dev.js +115 -0
  9. data/app/assets/javascripts/brazil.js +9 -0
  10. data/app/assets/javascripts/date.dev.js +81 -0
  11. data/app/assets/javascripts/date.js +9 -0
  12. data/app/assets/javascripts/file.dev.js +413 -0
  13. data/app/assets/javascripts/file.js +9 -0
  14. data/app/assets/javascripts/html5.dev.js +168 -0
  15. data/app/assets/javascripts/html5.js +9 -0
  16. data/app/assets/javascripts/jquery.form-validator.min.js +9 -0
  17. data/app/assets/javascripts/jsconf.dev.js +55 -0
  18. data/app/assets/javascripts/jsconf.js +9 -0
  19. data/app/assets/javascripts/lang/cz.dev.js +65 -0
  20. data/app/assets/javascripts/lang/cz.js +9 -0
  21. data/app/assets/javascripts/lang/de.dev.js +65 -0
  22. data/app/assets/javascripts/lang/de.js +9 -0
  23. data/app/assets/javascripts/lang/es.dev.js +62 -0
  24. data/app/assets/javascripts/lang/es.js +9 -0
  25. data/app/assets/javascripts/lang/fr.dev.js +62 -0
  26. data/app/assets/javascripts/lang/fr.js +9 -0
  27. data/app/assets/javascripts/lang/it.dev.js +62 -0
  28. data/app/assets/javascripts/lang/it.js +9 -0
  29. data/app/assets/javascripts/lang/pl.dev.js +65 -0
  30. data/app/assets/javascripts/lang/pl.js +9 -0
  31. data/app/assets/javascripts/lang/pt.dev.js +65 -0
  32. data/app/assets/javascripts/lang/pt.js +9 -0
  33. data/app/assets/javascripts/lang/ro.dev.js +65 -0
  34. data/app/assets/javascripts/lang/ro.js +9 -0
  35. data/app/assets/javascripts/lang/ru.dev.js +66 -0
  36. data/app/assets/javascripts/lang/ru.js +9 -0
  37. data/app/assets/javascripts/lang/sv.dev.js +63 -0
  38. data/app/assets/javascripts/lang/sv.js +9 -0
  39. data/app/assets/javascripts/location.dev.js +78 -0
  40. data/app/assets/javascripts/location.js +9 -0
  41. data/app/assets/javascripts/sanitize.dev.js +154 -0
  42. data/app/assets/javascripts/sanitize.js +9 -0
  43. data/app/assets/javascripts/security.dev.js +523 -0
  44. data/app/assets/javascripts/security.js +9 -0
  45. data/app/assets/javascripts/src/core-validators.js +343 -0
  46. data/app/assets/javascripts/src/dialogs.js +123 -0
  47. data/app/assets/javascripts/src/jquery-plugins.js +452 -0
  48. data/app/assets/javascripts/src/module-loader.js +150 -0
  49. data/app/assets/javascripts/src/setup.js +168 -0
  50. data/app/assets/javascripts/src/utils.js +840 -0
  51. data/app/assets/javascripts/sweden.dev.js +213 -0
  52. data/app/assets/javascripts/sweden.js +9 -0
  53. data/app/assets/javascripts/theme-default.css +108 -0
  54. data/app/assets/javascripts/theme-default.min.css +1 -0
  55. data/app/assets/javascripts/toggleDisabled.dev.js +67 -0
  56. data/app/assets/javascripts/toggleDisabled.js +9 -0
  57. data/app/assets/javascripts/uk.dev.js +85 -0
  58. data/app/assets/javascripts/uk.js +9 -0
  59. data/dqs-jquery-form-validator.gemspec +27 -0
  60. data/lib/dqs-jquery-form-validator-rails.rb +1 -0
  61. data/lib/dqs/jquery/form/validator/rails.rb +13 -0
  62. data/lib/dqs/jquery/form/validator/rails/engine.rb +12 -0
  63. data/lib/dqs/jquery/form/validator/rails/version.rb +11 -0
  64. metadata +64 -2
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,115 @@
1
+ /**
2
+ * jQuery Form Validator Module: Brazil
3
+ * ------------------------------------------
4
+ * Created by Eduardo Cuducos <http://cuducos.me/>
5
+ *
6
+ * This form validation module adds validators typically used on
7
+ * websites in the Brazil. This module adds the following validators:
8
+ * - cpf
9
+ * - cep
10
+ * - brphone
11
+ *
12
+ * @website http://formvalidator.net/#brazil-validators
13
+ * @license MIT
14
+ * @version 2.2.163
15
+ */
16
+
17
+ $.formUtils.addValidator({
18
+ name : 'cpf',
19
+ validatorFunction : function(string) {
20
+
21
+ // Based on this post from DevMedia:
22
+ // http://www.devmedia.com.br/validar-cpf-com-javascript/23916
23
+
24
+ // clean up the input (digits only) and set some support vars
25
+ var cpf = string.replace(/\D/g,'');
26
+ var sum1 = 0;
27
+ var sum2 = 0;
28
+ var remainder1 = 0;
29
+ var remainder2 = 0;
30
+
31
+ // skip special cases
32
+ if (cpf.length !== 11 || cpf === '00000000000') {
33
+ return false;
34
+ }
35
+
36
+ // check 1st verification digit
37
+ for (i = 1; i<= 9; i++) {
38
+ sum1 += parseInt(cpf.substring(i - 1, i)) * (11 - i);
39
+ }
40
+ remainder1 = (sum1 * 10) % 11;
41
+ if (remainder1 >= 10) {
42
+ remainder1 = 0;
43
+ }
44
+ if (remainder1 !== parseInt(cpf.substring(9, 10))) {
45
+ return false;
46
+ }
47
+
48
+ // check 2nd verification digit
49
+ for (i = 1; i <= 10; i++) {
50
+ sum2 += parseInt(cpf.substring(i - 1, i)) * (12 - i);
51
+ }
52
+ remainder2 = (sum2 * 10) % 11;
53
+ if (remainder2 >= 10) {
54
+ remainder2 = 0;
55
+ }
56
+ if (remainder2 !== parseInt(cpf.substring(10, 11))) {
57
+ return false;
58
+ }
59
+
60
+ return true;
61
+
62
+ },
63
+ errorMessage : '',
64
+ errorMessageKey: 'badBrazilCPFAnswer'
65
+
66
+ });
67
+
68
+ $.formUtils.addValidator({
69
+ name : 'brphone',
70
+ validatorFunction : function(string) {
71
+
72
+ // validates telefones such as (having X as numbers):
73
+ // (XX) XXXX-XXXX
74
+ // (XX) XXXXX-XXXX
75
+ // XX XXXXXXXX
76
+ // XX XXXXXXXXX
77
+ // XXXXXXXXXX
78
+ // XXXXXXXXXXX
79
+ // +XX XX XXXXX-XXXX
80
+ // +X XX XXXX-XXXX
81
+ // And so on…
82
+
83
+ if (string.match(/^(\+[\d]{1,3}[\s]{0,1}){0,1}(\(){0,1}(\d){2}(\)){0,1}(\s){0,1}(\d){4,5}([-. ]){0,1}(\d){4}$/g)) {
84
+ return true;
85
+ }
86
+
87
+ return false;
88
+
89
+ },
90
+ errorMessage : '',
91
+ errorMessageKey: 'badBrazilTelephoneAnswer'
92
+
93
+ });
94
+
95
+ $.formUtils.addValidator({
96
+ name : 'cep',
97
+ validatorFunction : function(string) {
98
+
99
+ // validates CEP such as (having X as numbers):
100
+ // XXXXX-XXX
101
+ // XXXXX.XXX
102
+ // XXXXX XXX
103
+ // XXXXXXXX
104
+
105
+ if (string.match(/^(\d){5}([-. ]){0,1}(\d){3}$/g)) {
106
+ return true;
107
+ }
108
+
109
+ return false;
110
+
111
+ },
112
+ errorMessage : '',
113
+ errorMessageKey: 'badBrazilCEPAnswer'
114
+
115
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * JQUERY-FORM-VALIDATOR
3
+ *
4
+ * @version 2.2.163
5
+ * @website http://formvalidator.net/
6
+ * @author Victor Jonsson, http://victorjonsson.se
7
+ * @license MIT
8
+ */
9
+ $.formUtils.addValidator({name:"cpf",validatorFunction:function(a){var b=a.replace(/\D/g,""),c=0,d=0,e=0,f=0;if(11!==b.length||"00000000000"===b)return!1;for(i=1;i<=9;i++)c+=parseInt(b.substring(i-1,i))*(11-i);if(e=10*c%11,e>=10&&(e=0),e!==parseInt(b.substring(9,10)))return!1;for(i=1;i<=10;i++)d+=parseInt(b.substring(i-1,i))*(12-i);return f=10*d%11,f>=10&&(f=0),f!==parseInt(b.substring(10,11))?!1:!0},errorMessage:"",errorMessageKey:"badBrazilCPFAnswer"}),$.formUtils.addValidator({name:"brphone",validatorFunction:function(a){return a.match(/^(\+[\d]{1,3}[\s]{0,1}){0,1}(\(){0,1}(\d){2}(\)){0,1}(\s){0,1}(\d){4,5}([-. ]){0,1}(\d){4}$/g)?!0:!1},errorMessage:"",errorMessageKey:"badBrazilTelephoneAnswer"}),$.formUtils.addValidator({name:"cep",validatorFunction:function(a){return a.match(/^(\d){5}([-. ]){0,1}(\d){3}$/g)?!0:!1},errorMessage:"",errorMessageKey:"badBrazilCEPAnswer"});
@@ -0,0 +1,81 @@
1
+ /**
2
+ * jQuery Form Validator Module: Date
3
+ * ------------------------------------------
4
+ * Created by Victor Jonsson <http://www.victorjonsson.se>
5
+ * Documentation and issue tracking on Github <https://github.com/victorjonsson/jQuery-Form-Validator/>
6
+ *
7
+ * The following validators will be added by this module:
8
+ * - Time (HH:mmm)
9
+ * - Birth date
10
+ *
11
+ * @website http://formvalidator.net/#location-validators
12
+ * @license MIT
13
+ * @version 2.2.163
14
+ */
15
+ (function($) {
16
+
17
+ /*
18
+ * Validate time hh:mm
19
+ */
20
+ $.formUtils.addValidator({
21
+ name : 'time',
22
+ validatorFunction : function(time) {
23
+ if (time.match(/^(\d{2}):(\d{2})$/) === null) {
24
+ return false;
25
+ } else {
26
+ var hours = parseInt(time.split(':')[0],10);
27
+ var minutes = parseInt(time.split(':')[1],10);
28
+ if( hours > 23 || minutes > 59 ) {
29
+ return false;
30
+ }
31
+ }
32
+ return true;
33
+ },
34
+ errorMessage : '',
35
+ errorMessageKey: 'badTime'
36
+ });
37
+
38
+ /*
39
+ * Is this a valid birth date
40
+ */
41
+ $.formUtils.addValidator({
42
+ name : 'birthdate',
43
+ validatorFunction : function(val, $el, conf) {
44
+ var dateFormat = 'yyyy-mm-dd';
45
+ if($el.valAttr('format')) {
46
+ dateFormat = $el.valAttr('format');
47
+ }
48
+ else if(typeof conf.dateFormat !== 'undefined') {
49
+ dateFormat = conf.dateFormat;
50
+ }
51
+
52
+ var inputDate = $.formUtils.parseDate(val, dateFormat);
53
+ if (!inputDate) {
54
+ return false;
55
+ }
56
+
57
+ var d = new Date();
58
+ var currentYear = d.getFullYear();
59
+ var year = inputDate[0];
60
+ var month = inputDate[1];
61
+ var day = inputDate[2];
62
+
63
+ if (year === currentYear) {
64
+ var currentMonth = d.getMonth() + 1;
65
+ if (month === currentMonth) {
66
+ var currentDay = d.getDate();
67
+ return day <= currentDay;
68
+ }
69
+ else {
70
+ return month < currentMonth;
71
+ }
72
+ }
73
+ else {
74
+ return year < currentYear && year > (currentYear - 124); // we can not live for ever yet...
75
+ }
76
+ },
77
+ errorMessage : '',
78
+ errorMessageKey: 'badDate'
79
+ });
80
+
81
+ })(jQuery);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * JQUERY-FORM-VALIDATOR
3
+ *
4
+ * @version 2.2.163
5
+ * @website http://formvalidator.net/
6
+ * @author Victor Jonsson, http://victorjonsson.se
7
+ * @license MIT
8
+ */
9
+ !function(a){a.formUtils.addValidator({name:"time",validatorFunction:function(a){if(null===a.match(/^(\d{2}):(\d{2})$/))return!1;var b=parseInt(a.split(":")[0],10),c=parseInt(a.split(":")[1],10);return b>23||c>59?!1:!0},errorMessage:"",errorMessageKey:"badTime"}),a.formUtils.addValidator({name:"birthdate",validatorFunction:function(b,c,d){var e="yyyy-mm-dd";c.valAttr("format")?e=c.valAttr("format"):"undefined"!=typeof d.dateFormat&&(e=d.dateFormat);var f=a.formUtils.parseDate(b,e);if(!f)return!1;var g=new Date,h=g.getFullYear(),i=f[0],j=f[1],k=f[2];if(i===h){var l=g.getMonth()+1;if(j===l){var m=g.getDate();return m>=k}return l>j}return h>i&&i>h-124},errorMessage:"",errorMessageKey:"badDate"})}(jQuery);
@@ -0,0 +1,413 @@
1
+ /**
2
+ * jQuery Form Validator Module: File
3
+ * ------------------------------------------
4
+ * Created by Victor Jonsson <http://www.victorjonsson.se>
5
+ *
6
+ * The following validators will be added by this module:
7
+ * - mime type
8
+ * - file size
9
+ * - file extension
10
+ *
11
+ * @website http://formvalidator.net/#file-validators
12
+ * @license MIT
13
+ * @version 2.2.163
14
+ */
15
+ (function($, window) {
16
+
17
+ 'use strict';
18
+
19
+ var SUPPORTS_FILE_READER = typeof window.FileReader !== 'undefined',
20
+
21
+ /**
22
+ * @return {Array}
23
+ */
24
+ _getTypes = function($input) {
25
+ var allowedTypes = $.split( ($input.valAttr('allowing') || '').toLowerCase() );
26
+ if ($.inArray('jpg', allowedTypes) > -1 && $.inArray('jpeg', allowedTypes) === -1) {
27
+ allowedTypes.push('jpeg');
28
+ }
29
+ else if ($.inArray('jpeg', allowedTypes) > -1 && $.inArray('jpg', allowedTypes) === -1) {
30
+ allowedTypes.push('jpg');
31
+ }
32
+ return allowedTypes;
33
+ },
34
+
35
+ /**
36
+ * @param {Object} obj
37
+ * @param {String} key
38
+ * @param {String} insert
39
+ * @param {Object} lang
40
+ */
41
+ _generateErrorMsg = function(obj, key, insert, lang) {
42
+ var msg = lang[key] || '';
43
+ obj.errorMessageKey = ''; // only use message attached to this object
44
+ obj.errorMessage = msg.replace('\%s', insert);
45
+ },
46
+
47
+ /**
48
+ * @param {String} msg
49
+ */
50
+ _log = function(msg) {
51
+ if( window.console && window.console.log ) {
52
+ window.console.log(msg);
53
+ }
54
+ },
55
+
56
+ /**
57
+ * @param {String} imgPath
58
+ * @param {Function} successCallback
59
+ * @param {Function} errCallback
60
+ * @private
61
+ */
62
+ _loadImage = function(imgPath, successCallback, errCallback) {
63
+ var reader = new FileReader(),
64
+ image = new Image();
65
+
66
+ reader.readAsDataURL(imgPath);
67
+
68
+ reader.onload = function(fileObj) {
69
+
70
+ image.onload = function() {
71
+ $(window).trigger('imageValidation', [this]);
72
+ successCallback(this);
73
+ };
74
+
75
+ image.onerror= function() {
76
+ errCallback();
77
+ };
78
+
79
+ image.src = fileObj.target.result;
80
+
81
+ };
82
+ };
83
+
84
+ /*
85
+ * Validate mime type (falls back on validate_extension in older browsers)
86
+ */
87
+ $.formUtils.addValidator({
88
+ name : 'mime',
89
+ validatorFunction : function(str, $input, conf, language) {
90
+
91
+ if( SUPPORTS_FILE_READER ) {
92
+ var valid = true,
93
+ files = $input.get(0).files || [],
94
+ mime = '',
95
+ allowedTypes = _getTypes($input);
96
+
97
+ if( files.length ) {
98
+ $.each(files, function(i, file) {
99
+ valid = false;
100
+ mime = file.type || '';
101
+ $.each(allowedTypes, function(j, type) {
102
+ valid = mime.indexOf(type) > -1;
103
+ if( valid ) {
104
+ return false;
105
+ }
106
+ });
107
+ return valid;
108
+ });
109
+
110
+ if( !valid ) {
111
+ _log('Trying to upload a file with mime type '+mime+' which is not allowed');
112
+ _generateErrorMsg(this, 'wrongFileType', allowedTypes.join(', '), language);
113
+ }
114
+ }
115
+
116
+ return valid;
117
+
118
+ } else {
119
+ _log('FileReader not supported by browser, will check file extension');
120
+ return $.formUtils.validators.validate_extension.validatorFunction(str, $input, conf, language);
121
+ }
122
+ },
123
+ errorMessage : '',
124
+ errorMessageKey: 'wrongFileType'
125
+ });
126
+
127
+ /**
128
+ * Validate file extension
129
+ */
130
+ $.formUtils.addValidator({
131
+ name : 'extension',
132
+ validatorFunction : function(value, $input, conf, language) {
133
+ var valid = true,
134
+ _this = this,
135
+ allowedTypes = _getTypes($input);
136
+
137
+ $.each($input.get(0).files || [value], function(i, file) {
138
+ var val = typeof file === 'string' ? file : (file.value || file.fileName || file.name),
139
+ ext = val.substr( val.lastIndexOf('.')+1 );
140
+
141
+ if( $.inArray(ext.toLowerCase(), allowedTypes) === -1 ) {
142
+ valid = false;
143
+ _generateErrorMsg(_this, 'wrongFileType', allowedTypes.join(', '), language);
144
+ return false;
145
+ }
146
+ });
147
+
148
+ return valid;
149
+ },
150
+ errorMessage : '',
151
+ errorMessageKey: 'wrongFileType'
152
+ });
153
+
154
+ /**
155
+ * Validate file size
156
+ */
157
+ $.formUtils.addValidator({
158
+ name : 'size',
159
+ validatorFunction : function(val, $input, conf, language) {
160
+ var maxSize = $input.valAttr('max-size');
161
+ if( !maxSize ) {
162
+ _log('Input "'+$input.attr('name')+'" is missing data-validation-max-size attribute');
163
+ return true;
164
+ } else if( !SUPPORTS_FILE_READER ) {
165
+ return true; // no fallback available
166
+ }
167
+
168
+ var maxBytes = $.formUtils.convertSizeNameToBytes(maxSize),
169
+ valid = true;
170
+
171
+ $.each($input.get(0).files || [], function(i, file) {
172
+ valid = file.size <= maxBytes;
173
+ return valid;
174
+ });
175
+
176
+ if( !valid ) {
177
+ _generateErrorMsg(this, 'wrongFileSize', maxSize, language);
178
+ }
179
+ return valid;
180
+ },
181
+ errorMessage : '',
182
+ errorMessageKey: 'wrongFileSize'
183
+ });
184
+
185
+ /**
186
+ * Make this function accessible via formUtils for unit tests
187
+ * @param {String} sizeName
188
+ * @return {Number}
189
+ */
190
+ $.formUtils.convertSizeNameToBytes = function(sizeName) {
191
+ sizeName = sizeName.toUpperCase();
192
+ if( sizeName.substr(sizeName.length-1, 1) === 'M' ) {
193
+ return parseInt(sizeName.substr(0, sizeName.length-1), 10) * 1024 * 1024;
194
+ } else if( sizeName.substr(sizeName.length-2, 2) === 'MB' ) {
195
+ return parseInt(sizeName.substr(0, sizeName.length-2), 10) * 1024 * 1024;
196
+ } else if( sizeName.substr(sizeName.length-2, 2) === 'KB' ) {
197
+ return parseInt(sizeName.substr(0, sizeName.length-2), 10) * 1024;
198
+ } else if( sizeName.substr(sizeName.length-1, 1) === 'B' ) {
199
+ return parseInt(sizeName.substr(0, sizeName.length-1), 10);
200
+ } else {
201
+ return parseInt(sizeName, 10);
202
+ }
203
+ };
204
+
205
+ var disableFormSubmit = function() {
206
+ return false;
207
+ };
208
+
209
+ /**
210
+ * Attach dimension check onto formUtils only for unit testing purpose
211
+ * @param {HTMLImageElement} img
212
+ * @param {String} dimDeclaration
213
+ * @param {Boolean|String} Returns error message if image was invalid, false otherwise
214
+ */
215
+ $.formUtils.checkImageDimension = function(img, dimDeclaration, language) {
216
+ var error = false,
217
+ restrictedDim = {width:0, height:0},
218
+ getDimRestriction = function(dimDeclaration) {
219
+ dimDeclaration = dimDeclaration.replace('min', '').replace('max', '');
220
+ var chunks = dimDeclaration.split('x');
221
+ restrictedDim.width = chunks[0];
222
+ restrictedDim.height = chunks[1] ? chunks[1] : chunks[0];
223
+ },
224
+ minDeclaration = false,
225
+ maxDeclaration = false,
226
+ declarationParts = dimDeclaration.split('-');
227
+
228
+ if( declarationParts.length === 1 ) {
229
+ if( declarationParts[0].indexOf('min') === 0 ) {
230
+ minDeclaration = declarationParts[0];
231
+ } else {
232
+ maxDeclaration = declarationParts[0];
233
+ }
234
+ } else {
235
+ minDeclaration = declarationParts[0];
236
+ maxDeclaration = declarationParts[1];
237
+ }
238
+
239
+ if( minDeclaration ) {
240
+ // check min
241
+ getDimRestriction(minDeclaration);
242
+ if( img.width < restrictedDim.width || img.height < restrictedDim.height ) {
243
+ error = language.imageTooSmall + ' ('+language.min+' '+restrictedDim.width+'x'+restrictedDim.height+'px)';
244
+ }
245
+ }
246
+
247
+ if( !error && maxDeclaration ) {
248
+ // Check max
249
+ getDimRestriction(maxDeclaration);
250
+ if( img.width > restrictedDim.width || img.height > restrictedDim.height ) {
251
+ if( img.width > restrictedDim.width ) {
252
+ error = language.imageTooWide +' '+restrictedDim.width+'px';
253
+ } else {
254
+ error = language.imageTooTall +' '+restrictedDim.height+'px';
255
+ }
256
+ error += ' ('+language.max+' '+restrictedDim.width+'x'+restrictedDim.height+'px)';
257
+ }
258
+ }
259
+
260
+ return error;
261
+ };
262
+
263
+ /**
264
+ * Attach ratio validation onto formUtils only for unit testing purpose
265
+ * @param {HTMLImageElement} img
266
+ * @param {String} dimDeclaration
267
+ * @param {Boolean|String} Returns error message if image was invalid, false otherwise
268
+ */
269
+ $.formUtils.checkImageRatio = function(img, ratioDeclaration, language) {
270
+ var ratio = img.width / img.height,
271
+ calculateRatio = function(declaration) {
272
+ var dims = declaration.replace('max', '').replace('min', '').split(':');
273
+ return dims[0] / dims[1];
274
+ },
275
+ declarationParts = ratioDeclaration.split('-'),
276
+ isWithin = function(val, min, max) {
277
+ return val >= min && val <= max;
278
+ };
279
+
280
+ if ( declarationParts.length === 1 ) {
281
+ if ( ratio !== calculateRatio(declarationParts[0]) ) {
282
+ return language.imageRatioNotAccepted;
283
+ }
284
+ }
285
+ else if( declarationParts.length === 2 && !isWithin(ratio, calculateRatio(declarationParts[0]), calculateRatio(declarationParts[1])) ) {
286
+ return language.imageRatioNotAccepted;
287
+ }
288
+ return false;
289
+ };
290
+
291
+ /**
292
+ * Validate image dimension
293
+ */
294
+ $.formUtils.addValidator({
295
+ name : 'dimension',
296
+ validatorFunction : function(val, $input, conf, language, $form) {
297
+ var hasCorrectDim = false;
298
+ if( SUPPORTS_FILE_READER ) {
299
+ var file = $input.get(0).files || [];
300
+ hasCorrectDim = true;
301
+
302
+ if( $input.attr('data-validation').indexOf('mime') === -1) {
303
+ alert('You should validate file type being jpg, gif or png on input '+$input[0].name);
304
+ return false;
305
+ }
306
+ else if( file.length > 1 ) {
307
+ alert('Validating image dimensions does not support inputs allowing multiple files');
308
+ return false;
309
+ } else if( file.length === 0) {
310
+ return true;
311
+ }
312
+
313
+ if( $input.valAttr('has-valid-dim') ) {
314
+ return true;
315
+ }
316
+ else if( $input.valAttr('has-not-valid-dim') ) {
317
+ this.errorMessage = language.wrongFileDim + ' ' + $input.valAttr('has-not-valid-dim');
318
+ return false;
319
+ }
320
+ else if($.formUtils.eventType === 'keyup') {
321
+ return null;
322
+ }
323
+
324
+ var wasFormSubmit = false;
325
+
326
+ if( $.formUtils.isValidatingEntireForm ) {
327
+ wasFormSubmit = true;
328
+ $.formUtils.haltValidation = true;
329
+ $form
330
+ .bind('submit', disableFormSubmit)
331
+ .addClass('on-blur');
332
+ }
333
+
334
+ _loadImage(file[0], function(img) {
335
+ var error = false;
336
+
337
+ if ( $input.valAttr('dimension') ) {
338
+ error = $.formUtils.checkImageDimension(img, $input.valAttr('dimension'), language);
339
+ }
340
+
341
+ if ( !error && $input.valAttr('ratio') ) {
342
+ error = $.formUtils.checkImageRatio(img, $input.valAttr('ratio'), language);
343
+ }
344
+
345
+ // Set validation result flag on input
346
+ if( error ) {
347
+ $input.valAttr('has-not-valid-dim', error);
348
+ }
349
+ else {
350
+ $input.valAttr('has-valid-dim', 'true');
351
+ }
352
+
353
+ // Remove validation flag when input changed
354
+ if( !$input.valAttr('has-keyup-event') ) {
355
+ $input
356
+ .valAttr('has-keyup-event', '1')
357
+ .bind('keyup change', function(evt) {
358
+ if( evt.keyCode !== 9 && evt.keyCode !== 16 ) {
359
+ $(this)
360
+ .valAttr('has-not-valid-dim', false)
361
+ .valAttr('has-valid-dim', false);
362
+ }
363
+ });
364
+ }
365
+
366
+ if( wasFormSubmit ) {
367
+ $.formUtils.haltValidation = false;
368
+ $form
369
+ .removeClass('on-blur')
370
+ .get(0).onsubmit = function() {};
371
+
372
+ $form.unbind('submit', disableFormSubmit);
373
+ $form.trigger('submit'); // fire submit once more
374
+
375
+ } else {
376
+ $input.trigger('blur'); // triggers the validation once more
377
+ }
378
+
379
+ }, function(err) {
380
+ throw err;
381
+ });
382
+
383
+ return true;
384
+ }
385
+
386
+ return hasCorrectDim;
387
+ },
388
+ errorMessage : '',
389
+ errorMessageKey: '' // error message created dynamically
390
+ // errorMessageKey: 'wrongFileDim'
391
+ });
392
+
393
+ /*
394
+ * This event listener will remove error messages for file
395
+ * inputs when file changes
396
+ */
397
+ $(window).one('validatorsLoaded formValidationSetup', function(evt, $form) {
398
+ var $inputs;
399
+ if( $form ) {
400
+ $inputs = $form.find('input[type="file"]');
401
+ } else {
402
+ $inputs = $('input[type="file"]');
403
+ }
404
+
405
+ $inputs.filter('*[data-validation]').bind('change', function() {
406
+ $(this)
407
+ .removeClass('error')
408
+ .parent()
409
+ .find('.form-error').remove();
410
+ });
411
+ });
412
+
413
+ })(jQuery, window);