jquery-form-validator-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +17 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +51 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/date.js +1 -0
- data/app/assets/javascripts/file.js +1 -0
- data/app/assets/javascripts/html5.js +1 -0
- data/app/assets/javascripts/jquery.form-validator.js +1681 -0
- data/app/assets/javascripts/location.js +1 -0
- data/app/assets/javascripts/security.dev.js +442 -0
- data/app/assets/javascripts/security.js +1 -0
- data/app/assets/javascripts/sweden.dev.js +210 -0
- data/app/assets/javascripts/sweden.js +1 -0
- data/app/assets/javascripts/uk.dev.js +85 -0
- data/app/assets/javascripts/uk.js +1 -0
- data/jquery-form-validator.gemspec +28 -0
- data/lib/jquery-form-validator-rails.rb +1 -0
- data/lib/jquery/form/validator/rails.rb +11 -0
- data/lib/jquery/form/validator/rails/engine.rb +10 -0
- data/lib/jquery/form/validator/rails/version.rb +9 -0
- metadata +119 -0
@@ -0,0 +1 @@
|
|
1
|
+
(function($){$.formUtils.addValidator({name:"country",validatorFunction:function(str){return $.inArray(str.toLowerCase(),this.countries)>-1},countries:["afghanistan","albania","algeria","american samoa","andorra","angola","anguilla","antarctica","antigua and barbuda","arctic ocean","argentina","armenia","aruba","ashmore and cartier islands","atlantic ocean","australia","austria","azerbaijan","bahamas","bahrain","baltic sea","baker island","bangladesh","barbados","bassas da india","belarus","belgium","belize","benin","bermuda","bhutan","bolivia","borneo","bosnia and herzegovina","botswana","bouvet island","brazil","british virgin islands","brunei","bulgaria","burkina faso","burundi","cambodia","cameroon","canada","cape verde","cayman islands","central african republic","chad","chile","china","christmas island","clipperton island","cocos islands","colombia","comoros","cook islands","coral sea islands","costa rica","croatia","cuba","cyprus","czech republic","democratic republic of the congo","denmark","djibouti","dominica","dominican republic","east timor","ecuador","egypt","el salvador","equatorial guinea","eritrea","estonia","ethiopia","europa island","falkland islands","faroe islands","fiji","finland","france","french guiana","french polynesia","french southern and antarctic lands","gabon","gambia","gaza strip","georgia","germany","ghana","gibraltar","glorioso islands","greece","greenland","grenada","guadeloupe","guam","guatemala","guernsey","guinea","guinea-bissau","guyana","haiti","heard island and mcdonald islands","honduras","hong kong","howland island","hungary","iceland","india","indian ocean","indonesia","iran","iraq","ireland","isle of man","israel","italy","jamaica","jan mayen","japan","jarvis island","jersey","johnston atoll","jordan","juan de nova island","kazakhstan","kenya","kerguelen archipelago","kingman reef","kiribati","kosovo","kuwait","kyrgyzstan","laos","latvia","lebanon","lesotho","liberia","libya","liechtenstein","lithuania","luxembourg","macau","macedonia","madagascar","malawi","malaysia","maldives","mali","malta","marshall islands","martinique","mauritania","mauritius","mayotte","mediterranean sea","mexico","micronesia","midway islands","moldova","monaco","mongolia","montenegro","montserrat","morocco","mozambique","myanmar","namibia","nauru","navassa island","nepal","netherlands","netherlands antilles","new caledonia","new zealand","nicaragua","niger","nigeria","niue","norfolk island","north korea","north sea","northern mariana islands","norway","oman","pacific ocean","pakistan","palau","palmyra atoll","panama","papua new guinea","paracel islands","paraguay","peru","philippines","pitcairn islands","poland","portugal","puerto rico","qatar","republic of the congo","reunion","romania","ross sea","russia","rwanda","saint helena","saint kitts and nevis","saint lucia","saint pierre and miquelon","saint vincent and the grenadines","samoa","san marino","sao tome and principe","saudi arabia","senegal","serbia","seychelles","sierra leone","singapore","slovakia","slovenia","solomon islands","somalia","south africa","south georgia and the south sandwich islands","south korea","southern ocean","spain","spratly islands","sri lanka","sudan","suriname","svalbard","swaziland","sweden","switzerland","syria","taiwan","tajikistan","tanzania","tasman sea","thailand","togo","tokelau","tonga","trinidad and tobago","tromelin island","tunisia","turkey","turkmenistan","turks and caicos islands","tuvalu","uganda","ukraine","united arab emirates","united kingdom","uruguay","usa","uzbekistan","vanuatu","venezuela","viet nam","virgin islands","wake island","wallis and futuna","west bank","western sahara","yemen","zambia","zimbabwe"],errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"federatestate",validatorFunction:function(str){return $.inArray(str.toLowerCase(),this.states)>-1},states:["alabama","alaska","arizona","arkansas","california","colorado","connecticut","delaware","florida","georgia","hawaii","idaho","illinois","indiana","iowa","kansas","kentucky","louisiana","maine","maryland","district of columbia","massachusetts","michigan","minnesota","mississippi","missouri","montana","nebraska","nevada","new hampshire","new jersey","new mexico","new york","north carolina","north dakota","ohio","oklahoma","oregon","pennsylvania","rhode island","south carolina","south dakota","tennessee","texas","utah","vermont","virginia","washington","west virginia","wisconsin","wyoming"],errorMessage:"",errorMessageKey:"badCustomVal"});$.formUtils.addValidator({name:"longlat",validatorFunction:function(str){var regexp=/^[+-]?\d+\.\d+, ?[+-]?\d+\.\d+$/;return regexp.test(str)},errorMessage:"",errorMessageKey:"badCustomVal"});var _makeSortedList=function(listItems){var newList=[];$.each(listItems,function(i,v){newList.push(v.substr(0,1).toUpperCase()+v.substr(1,v.length))});newList.sort();return newList};$.fn.suggestCountry=function(settings){var country=_makeSortedList($.formUtils.validators.validate_country.countries);return $.formUtils.suggest(this,country,settings)};$.fn.suggestState=function(settings){var states=_makeSortedList($.formUtils.validators.validate_federatestate.states);return $.formUtils.suggest(this,states,settings)}})(jQuery);
|
@@ -0,0 +1,442 @@
|
|
1
|
+
/**
|
2
|
+
* jQuery Form Validator Module: Security
|
3
|
+
* ------------------------------------------
|
4
|
+
* Created by Victor Jonsson <http://victorjonsson.se>
|
5
|
+
*
|
6
|
+
* This module adds validators typically used in registration forms.
|
7
|
+
* This module adds the following validators:
|
8
|
+
* - spamcheck
|
9
|
+
* - confirmation
|
10
|
+
* - strength
|
11
|
+
* - backend
|
12
|
+
* - credit card
|
13
|
+
* - cvv
|
14
|
+
*
|
15
|
+
* @website http://formvalidator.net/#security-validators
|
16
|
+
* @version 2.1.66
|
17
|
+
*/
|
18
|
+
(function($, window) {
|
19
|
+
|
20
|
+
'use strict';
|
21
|
+
|
22
|
+
/*
|
23
|
+
* Simple spam check
|
24
|
+
*/
|
25
|
+
$.formUtils.addValidator({
|
26
|
+
name : 'spamcheck',
|
27
|
+
validatorFunction : function(val, $el, config) {
|
28
|
+
var attr = $el.valAttr('captcha');
|
29
|
+
return attr === val;
|
30
|
+
},
|
31
|
+
errorMessage : '',
|
32
|
+
errorMessageKey: 'badSecurityAnswer'
|
33
|
+
});
|
34
|
+
|
35
|
+
|
36
|
+
/*
|
37
|
+
* Validate confirmation
|
38
|
+
*/
|
39
|
+
$.formUtils.addValidator({
|
40
|
+
name : 'confirmation',
|
41
|
+
validatorFunction : function(value, $el, config, language, $form) {
|
42
|
+
var conf = '',
|
43
|
+
confInputName = $el.valAttr('confirm') || ($el.attr('name') + '_confirmation'),
|
44
|
+
confInput = $form.find('input[name="' +confInputName+ '"]').eq(0);
|
45
|
+
|
46
|
+
if (confInput) {
|
47
|
+
conf = confInput.val();
|
48
|
+
} else {
|
49
|
+
console.warn('Could not find an input with name "'+confInputName+'"');
|
50
|
+
}
|
51
|
+
|
52
|
+
return value === conf;
|
53
|
+
},
|
54
|
+
errorMessage : '',
|
55
|
+
errorMessageKey: 'notConfirmed'
|
56
|
+
});
|
57
|
+
|
58
|
+
/*
|
59
|
+
* Credit card
|
60
|
+
*/
|
61
|
+
$.formUtils.addValidator({
|
62
|
+
name : 'creditcard',
|
63
|
+
validatorFunction : function(value, $el, config, language, $form) {
|
64
|
+
var cards = {
|
65
|
+
'amex' : [15,15],
|
66
|
+
'diners_club' : [14,14],
|
67
|
+
'cjb' : [16,16],
|
68
|
+
'laser' : [16,19],
|
69
|
+
'visa' : [16,16],
|
70
|
+
'mastercard' : [16,16],
|
71
|
+
'maestro' : [12,19],
|
72
|
+
'discover' : [16,16]
|
73
|
+
},
|
74
|
+
allowing = $.split( $el.valAttr('allowing') || '' );
|
75
|
+
|
76
|
+
|
77
|
+
// Correct length
|
78
|
+
if( allowing.length > 0 ) {
|
79
|
+
var hasValidLength = false;
|
80
|
+
$.each(allowing, function(i, cardName) {
|
81
|
+
if( cardName in cards) {
|
82
|
+
if( value.length >= cards[cardName][0] && value.length <= cards[cardName][1]) {
|
83
|
+
hasValidLength = true;
|
84
|
+
return false;
|
85
|
+
}
|
86
|
+
} else {
|
87
|
+
console.warn('Use of unknown credit card "'+cardName+'"');
|
88
|
+
}
|
89
|
+
});
|
90
|
+
|
91
|
+
if( !hasValidLength )
|
92
|
+
return false;
|
93
|
+
}
|
94
|
+
|
95
|
+
// only numbers
|
96
|
+
if( value.replace(new RegExp('[0-9]', 'g'), '') !== '' ) {
|
97
|
+
return false
|
98
|
+
}
|
99
|
+
|
100
|
+
// http://en.wikipedia.org/wiki/Luhn_algorithm
|
101
|
+
// http://www.brainjar.com/js/validation/default2.asp
|
102
|
+
var checkSum = 0;
|
103
|
+
$.each(value.split('').reverse(), function(i, digit) {
|
104
|
+
digit = parseInt(digit, 10);
|
105
|
+
if( i%2 === 0 ) {
|
106
|
+
checkSum += digit;
|
107
|
+
} else {
|
108
|
+
digit *= 2;
|
109
|
+
if (digit < 10) {
|
110
|
+
checkSum += digit;
|
111
|
+
} else {
|
112
|
+
checkSum += digit - 9;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
});
|
116
|
+
return checkSum % 10 === 0;
|
117
|
+
},
|
118
|
+
errorMessage : '',
|
119
|
+
errorMessageKey: 'badCreditCard'
|
120
|
+
});
|
121
|
+
|
122
|
+
|
123
|
+
/*
|
124
|
+
* Credit card number
|
125
|
+
*/
|
126
|
+
$.formUtils.addValidator({
|
127
|
+
name : 'cvv',
|
128
|
+
validatorFunction : function(val) {
|
129
|
+
return val.replace(/[0-9]/g, '') === '' && (val + '').length == 3;
|
130
|
+
},
|
131
|
+
errorMessage : '',
|
132
|
+
errorMessageKey: 'badCVV'
|
133
|
+
});
|
134
|
+
|
135
|
+
/*
|
136
|
+
* Validate password strength
|
137
|
+
*/
|
138
|
+
$.formUtils.addValidator({
|
139
|
+
name : 'strength',
|
140
|
+
validatorFunction : function(val, $el, conf) {
|
141
|
+
var requiredStrength = $el.valAttr('strength')
|
142
|
+
if(requiredStrength && requiredStrength > 3)
|
143
|
+
requiredStrength = 3;
|
144
|
+
|
145
|
+
return $.formUtils.validators.validate_strength.calculatePasswordStrength(val) >= requiredStrength;
|
146
|
+
},
|
147
|
+
errorMessage : '',
|
148
|
+
errorMessageKey: 'badStrength',
|
149
|
+
|
150
|
+
/**
|
151
|
+
* Code more or less borrowed from jQuery plugin "Password Strength Meter"
|
152
|
+
* written by Darren Mason (djmason9@gmail.com), myPocket technologies (www.mypocket-technologies.com)
|
153
|
+
* @param {String} password
|
154
|
+
* @return {Number}
|
155
|
+
*/
|
156
|
+
calculatePasswordStrength : function(password) {
|
157
|
+
|
158
|
+
if (password.length < 4) {
|
159
|
+
return 0;
|
160
|
+
}
|
161
|
+
|
162
|
+
var score = 0;
|
163
|
+
|
164
|
+
var checkRepetition = function (pLen, str) {
|
165
|
+
var res = "";
|
166
|
+
for (var i = 0; i < str.length; i++) {
|
167
|
+
var repeated = true;
|
168
|
+
|
169
|
+
for (var j = 0; j < pLen && (j + i + pLen) < str.length; j++) {
|
170
|
+
repeated = repeated && (str.charAt(j + i) == str.charAt(j + i + pLen));
|
171
|
+
}
|
172
|
+
if (j < pLen) {
|
173
|
+
repeated = false;
|
174
|
+
}
|
175
|
+
if (repeated) {
|
176
|
+
i += pLen - 1;
|
177
|
+
repeated = false;
|
178
|
+
}
|
179
|
+
else {
|
180
|
+
res += str.charAt(i);
|
181
|
+
}
|
182
|
+
}
|
183
|
+
return res;
|
184
|
+
};
|
185
|
+
|
186
|
+
//password length
|
187
|
+
score += password.length * 4;
|
188
|
+
score += ( checkRepetition(1, password).length - password.length ) * 1;
|
189
|
+
score += ( checkRepetition(2, password).length - password.length ) * 1;
|
190
|
+
score += ( checkRepetition(3, password).length - password.length ) * 1;
|
191
|
+
score += ( checkRepetition(4, password).length - password.length ) * 1;
|
192
|
+
|
193
|
+
//password has 3 numbers
|
194
|
+
if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) {
|
195
|
+
score += 5;
|
196
|
+
}
|
197
|
+
|
198
|
+
//password has 2 symbols
|
199
|
+
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) {
|
200
|
+
score += 5;
|
201
|
+
}
|
202
|
+
|
203
|
+
//password has Upper and Lower chars
|
204
|
+
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {
|
205
|
+
score += 10;
|
206
|
+
}
|
207
|
+
|
208
|
+
//password has number and chars
|
209
|
+
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) {
|
210
|
+
score += 15;
|
211
|
+
}
|
212
|
+
//
|
213
|
+
//password has number and symbol
|
214
|
+
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)) {
|
215
|
+
score += 15;
|
216
|
+
}
|
217
|
+
|
218
|
+
//password has char and symbol
|
219
|
+
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)) {
|
220
|
+
score += 15;
|
221
|
+
}
|
222
|
+
|
223
|
+
//password is just a numbers or chars
|
224
|
+
if (password.match(/^\w+$/) || password.match(/^\d+$/)) {
|
225
|
+
score -= 10;
|
226
|
+
}
|
227
|
+
|
228
|
+
//verifying 0 < score < 100
|
229
|
+
if (score < 0) {
|
230
|
+
score = 0;
|
231
|
+
}
|
232
|
+
if (score > 100) {
|
233
|
+
score = 100;
|
234
|
+
}
|
235
|
+
|
236
|
+
if (score < 20) {
|
237
|
+
return 0;
|
238
|
+
}
|
239
|
+
else if (score < 40) {
|
240
|
+
return 1;
|
241
|
+
}
|
242
|
+
else if(score <= 60) {
|
243
|
+
return 2;
|
244
|
+
}
|
245
|
+
else {
|
246
|
+
return 3;
|
247
|
+
}
|
248
|
+
},
|
249
|
+
|
250
|
+
strengthDisplay : function($el, options) {
|
251
|
+
var config = {
|
252
|
+
fontSize: '12pt',
|
253
|
+
padding: '4px',
|
254
|
+
bad : 'Very bad',
|
255
|
+
weak : 'Weak',
|
256
|
+
good : 'Good',
|
257
|
+
strong : 'Strong'
|
258
|
+
};
|
259
|
+
|
260
|
+
if (options) {
|
261
|
+
$.extend(config, options);
|
262
|
+
}
|
263
|
+
|
264
|
+
$el.bind('keyup', function() {
|
265
|
+
var val = $(this).val();
|
266
|
+
var $parent = typeof config.parent == 'undefined' ? $(this).parent() : $(config.parent);
|
267
|
+
var $displayContainer = $parent.find('.strength-meter');
|
268
|
+
if($displayContainer.length == 0) {
|
269
|
+
$displayContainer = $('<span></span>');
|
270
|
+
$displayContainer
|
271
|
+
.addClass('strength-meter')
|
272
|
+
.appendTo($parent);
|
273
|
+
}
|
274
|
+
|
275
|
+
if( !val ) {
|
276
|
+
$displayContainer.hide();
|
277
|
+
} else {
|
278
|
+
$displayContainer.show();
|
279
|
+
}
|
280
|
+
|
281
|
+
var strength = $.formUtils.validators.validate_strength.calculatePasswordStrength(val);
|
282
|
+
var css = {
|
283
|
+
background: 'pink',
|
284
|
+
color : '#FF0000',
|
285
|
+
fontWeight : 'bold',
|
286
|
+
border : 'red solid 1px',
|
287
|
+
borderWidth : '0px 0px 4px',
|
288
|
+
display : 'inline-block',
|
289
|
+
fontSize : config.fontSize,
|
290
|
+
padding : config.padding
|
291
|
+
};
|
292
|
+
|
293
|
+
var text = config.bad;
|
294
|
+
|
295
|
+
if(strength == 1) {
|
296
|
+
text = config.weak;
|
297
|
+
}
|
298
|
+
else if(strength == 2) {
|
299
|
+
css.background = 'lightyellow';
|
300
|
+
css.borderColor = 'yellow';
|
301
|
+
css.color = 'goldenrod';
|
302
|
+
text = config.good;
|
303
|
+
}
|
304
|
+
else if(strength >= 3) {
|
305
|
+
css.background = 'lightgreen';
|
306
|
+
css.borderColor = 'darkgreen';
|
307
|
+
css.color = 'darkgreen';
|
308
|
+
text = config.strong;
|
309
|
+
}
|
310
|
+
|
311
|
+
|
312
|
+
$displayContainer
|
313
|
+
.css(css)
|
314
|
+
.text(text);
|
315
|
+
});
|
316
|
+
}
|
317
|
+
});
|
318
|
+
|
319
|
+
var requestServer = function(serverURL, $element, val, conf, callback) {
|
320
|
+
$.ajax({
|
321
|
+
url : serverURL,
|
322
|
+
type : 'POST',
|
323
|
+
cache : false,
|
324
|
+
data : $element.attr('name')+'='+val,
|
325
|
+
dataType : 'json',
|
326
|
+
error : function(error) {
|
327
|
+
alert('Server validation failed due to: '+error.statusText);
|
328
|
+
if( window.JSON && window.JSON.stringify ) {
|
329
|
+
alert(window.JSON.stringify(error));
|
330
|
+
}
|
331
|
+
},
|
332
|
+
success : function(response) {
|
333
|
+
if(response.valid) {
|
334
|
+
$element.valAttr('backend-valid', 'true');
|
335
|
+
}
|
336
|
+
else {
|
337
|
+
$element.valAttr('backend-invalid', 'true');
|
338
|
+
if(response.message)
|
339
|
+
$element.attr(conf.validationErrorMsgAttribute, response.message);
|
340
|
+
else
|
341
|
+
$element.removeAttr(conf.validationErrorMsgAttribute);
|
342
|
+
}
|
343
|
+
|
344
|
+
if( !$element.valAttr('has-keyup-event') ) {
|
345
|
+
$element
|
346
|
+
.valAttr('has-keyup-event', '1')
|
347
|
+
.bind('keyup', function(evt) {
|
348
|
+
if( evt.keyCode != 9 && evt.keyCode != 16 ) {
|
349
|
+
$(this)
|
350
|
+
.valAttr('backend-valid', false)
|
351
|
+
.valAttr('backend-invalid', false)
|
352
|
+
.removeAttr(conf.validationErrorMsgAttribute);
|
353
|
+
}
|
354
|
+
});
|
355
|
+
}
|
356
|
+
|
357
|
+
callback();
|
358
|
+
}
|
359
|
+
});
|
360
|
+
},
|
361
|
+
disableFormSubmit = function() {
|
362
|
+
return false;
|
363
|
+
};
|
364
|
+
|
365
|
+
/*
|
366
|
+
* Server validation
|
367
|
+
* Flow (form submission):
|
368
|
+
* 1) Check if the value already has been validated on the server. If so, display the validation
|
369
|
+
* result and continue the validation process, otherwise continue to step 2
|
370
|
+
* 2) Return false as if the value is invalid and set $.formUtils.haltValidation to true
|
371
|
+
* 3) Disable form submission on the form being validated
|
372
|
+
* 4) Request the server with value and input name and add class 'validating-server-side' to the form
|
373
|
+
* 5) When the server responds an attribute will be added to the element
|
374
|
+
* telling the validator that the input has a valid/invalid value and enable form submission
|
375
|
+
* 6) Run form submission again (back to step 1)
|
376
|
+
*/
|
377
|
+
$.formUtils.addValidator({
|
378
|
+
name : 'server',
|
379
|
+
validatorFunction : function(val, $el, conf, lang, $form) {
|
380
|
+
|
381
|
+
var backendValid = $el.valAttr('backend-valid'),
|
382
|
+
backendInvalid = $el.valAttr('backend-invalid'),
|
383
|
+
serverURL = document.location.href;
|
384
|
+
|
385
|
+
if($el.valAttr('url')) {
|
386
|
+
serverURL = $el.valAttr('url');
|
387
|
+
} else if('serverURL' in conf) {
|
388
|
+
serverURL = conf.backendUrl;
|
389
|
+
}
|
390
|
+
|
391
|
+
if(backendValid)
|
392
|
+
return true;
|
393
|
+
else if(backendInvalid)
|
394
|
+
return false;
|
395
|
+
|
396
|
+
if($.formUtils.isValidatingEntireForm) {
|
397
|
+
$form
|
398
|
+
.bind('submit', disableFormSubmit)
|
399
|
+
.addClass('validating-server-side')
|
400
|
+
.addClass('on-blur');
|
401
|
+
|
402
|
+
$el.addClass('validating-server-side');
|
403
|
+
|
404
|
+
requestServer(serverURL, $el, val, conf, function() {
|
405
|
+
$form
|
406
|
+
.removeClass('validating-server-side')
|
407
|
+
.removeClass('on-blur')
|
408
|
+
.get(0).onsubmit = function() {};
|
409
|
+
|
410
|
+
$form.unbind('submit', disableFormSubmit);
|
411
|
+
$el.removeClass('validating-server-side');
|
412
|
+
|
413
|
+
// fire submission again!
|
414
|
+
$form.trigger('submit');
|
415
|
+
});
|
416
|
+
|
417
|
+
$.formUtils.haltValidation = true;
|
418
|
+
return false;
|
419
|
+
|
420
|
+
} else {
|
421
|
+
// validaiton on blur
|
422
|
+
$form.addClass('validating-server-side');
|
423
|
+
$el.addClass('validating-server-side');
|
424
|
+
requestServer(serverURL, $el, val, conf, function() {
|
425
|
+
$form.removeClass('validating-server-side');
|
426
|
+
$el.removeClass('validating-server-side');
|
427
|
+
$el.trigger('blur');
|
428
|
+
});
|
429
|
+
return true;
|
430
|
+
}
|
431
|
+
},
|
432
|
+
errorMessage : '',
|
433
|
+
errorMessageKey: 'badBackend',
|
434
|
+
validateOnKeyUp : false
|
435
|
+
});
|
436
|
+
|
437
|
+
$.fn.displayPasswordStrength = function(conf) {
|
438
|
+
new $.formUtils.validators.validate_strength.strengthDisplay(this, conf);
|
439
|
+
return this;
|
440
|
+
};
|
441
|
+
|
442
|
+
})(jQuery, window);
|
@@ -0,0 +1 @@
|
|
1
|
+
(function($,window){"use strict";$.formUtils.addValidator({name:"spamcheck",validatorFunction:function(val,$el,config){var attr=$el.valAttr("captcha");return attr===val},errorMessage:"",errorMessageKey:"badSecurityAnswer"});$.formUtils.addValidator({name:"confirmation",validatorFunction:function(value,$el,config,language,$form){var conf="",confInputName=$el.valAttr("confirm")||$el.attr("name")+"_confirmation",confInput=$form.find('input[name="'+confInputName+'"]').eq(0);if(confInput){conf=confInput.val()}else{console.warn('Could not find an input with name "'+confInputName+'"')}return value===conf},errorMessage:"",errorMessageKey:"notConfirmed"});$.formUtils.addValidator({name:"creditcard",validatorFunction:function(value,$el,config,language,$form){var cards={amex:[15,15],diners_club:[14,14],cjb:[16,16],laser:[16,19],visa:[16,16],mastercard:[16,16],maestro:[12,19],discover:[16,16]},allowing=$.split($el.valAttr("allowing")||"");if(allowing.length>0){var hasValidLength=false;$.each(allowing,function(i,cardName){if(cardName in cards){if(value.length>=cards[cardName][0]&&value.length<=cards[cardName][1]){hasValidLength=true;return false}}else{console.warn('Use of unknown credit card "'+cardName+'"')}});if(!hasValidLength)return false}if(value.replace(new RegExp("[0-9]","g"),"")!==""){return false}var checkSum=0;$.each(value.split("").reverse(),function(i,digit){digit=parseInt(digit,10);if(i%2===0){checkSum+=digit}else{digit*=2;if(digit<10){checkSum+=digit}else{checkSum+=digit-9}}});return checkSum%10===0},errorMessage:"",errorMessageKey:"badCreditCard"});$.formUtils.addValidator({name:"cvv",validatorFunction:function(val){return val.replace(/[0-9]/g,"")===""&&(val+"").length==3},errorMessage:"",errorMessageKey:"badCVV"});$.formUtils.addValidator({name:"strength",validatorFunction:function(val,$el,conf){var requiredStrength=$el.valAttr("strength");if(requiredStrength&&requiredStrength>3)requiredStrength=3;return $.formUtils.validators.validate_strength.calculatePasswordStrength(val)>=requiredStrength},errorMessage:"",errorMessageKey:"badStrength",calculatePasswordStrength:function(password){if(password.length<4){return 0}var score=0;var checkRepetition=function(pLen,str){var res="";for(var i=0;i<str.length;i++){var repeated=true;for(var j=0;j<pLen&&j+i+pLen<str.length;j++){repeated=repeated&&str.charAt(j+i)==str.charAt(j+i+pLen)}if(j<pLen){repeated=false}if(repeated){i+=pLen-1;repeated=false}else{res+=str.charAt(i)}}return res};score+=password.length*4;score+=(checkRepetition(1,password).length-password.length)*1;score+=(checkRepetition(2,password).length-password.length)*1;score+=(checkRepetition(3,password).length-password.length)*1;score+=(checkRepetition(4,password).length-password.length)*1;if(password.match(/(.*[0-9].*[0-9].*[0-9])/)){score+=5}if(password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)){score+=5}if(password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){score+=10}if(password.match(/([a-zA-Z])/)&&password.match(/([0-9])/)){score+=15}if(password.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&password.match(/([0-9])/)){score+=15}if(password.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&password.match(/([a-zA-Z])/)){score+=15}if(password.match(/^\w+$/)||password.match(/^\d+$/)){score-=10}if(score<0){score=0}if(score>100){score=100}if(score<20){return 0}else if(score<40){return 1}else if(score<=60){return 2}else{return 3}},strengthDisplay:function($el,options){var config={fontSize:"12pt",padding:"4px",bad:"Very bad",weak:"Weak",good:"Good",strong:"Strong"};if(options){$.extend(config,options)}$el.bind("keyup",function(){var val=$(this).val();var $parent=typeof config.parent=="undefined"?$(this).parent():$(config.parent);var $displayContainer=$parent.find(".strength-meter");if($displayContainer.length==0){$displayContainer=$("<span></span>");$displayContainer.addClass("strength-meter").appendTo($parent)}if(!val){$displayContainer.hide()}else{$displayContainer.show()}var strength=$.formUtils.validators.validate_strength.calculatePasswordStrength(val);var css={background:"pink",color:"#FF0000",fontWeight:"bold",border:"red solid 1px",borderWidth:"0px 0px 4px",display:"inline-block",fontSize:config.fontSize,padding:config.padding};var text=config.bad;if(strength==1){text=config.weak}else if(strength==2){css.background="lightyellow";css.borderColor="yellow";css.color="goldenrod";text=config.good}else if(strength>=3){css.background="lightgreen";css.borderColor="darkgreen";css.color="darkgreen";text=config.strong}$displayContainer.css(css).text(text)})}});var requestServer=function(serverURL,$element,val,conf,callback){$.ajax({url:serverURL,type:"POST",cache:false,data:$element.attr("name")+"="+val,dataType:"json",error:function(error){alert("Server validation failed due to: "+error.statusText);if(window.JSON&&window.JSON.stringify){alert(window.JSON.stringify(error))}},success:function(response){if(response.valid){$element.valAttr("backend-valid","true")}else{$element.valAttr("backend-invalid","true");if(response.message)$element.attr(conf.validationErrorMsgAttribute,response.message);else $element.removeAttr(conf.validationErrorMsgAttribute)}if(!$element.valAttr("has-keyup-event")){$element.valAttr("has-keyup-event","1").bind("keyup",function(evt){if(evt.keyCode!=9&&evt.keyCode!=16){$(this).valAttr("backend-valid",false).valAttr("backend-invalid",false).removeAttr(conf.validationErrorMsgAttribute)}})}callback()}})},disableFormSubmit=function(){return false};$.formUtils.addValidator({name:"server",validatorFunction:function(val,$el,conf,lang,$form){var backendValid=$el.valAttr("backend-valid"),backendInvalid=$el.valAttr("backend-invalid"),serverURL=document.location.href;if($el.valAttr("url")){serverURL=$el.valAttr("url")}else if("serverURL"in conf){serverURL=conf.backendUrl}if(backendValid)return true;else if(backendInvalid)return false;if($.formUtils.isValidatingEntireForm){$form.bind("submit",disableFormSubmit).addClass("validating-server-side").addClass("on-blur");$el.addClass("validating-server-side");requestServer(serverURL,$el,val,conf,function(){$form.removeClass("validating-server-side").removeClass("on-blur").get(0).onsubmit=function(){};$form.unbind("submit",disableFormSubmit);$el.removeClass("validating-server-side");$form.trigger("submit")});$.formUtils.haltValidation=true;return false}else{$form.addClass("validating-server-side");$el.addClass("validating-server-side");requestServer(serverURL,$el,val,conf,function(){$form.removeClass("validating-server-side");$el.removeClass("validating-server-side");$el.trigger("blur")});return true}},errorMessage:"",errorMessageKey:"badBackend",validateOnKeyUp:false});$.fn.displayPasswordStrength=function(conf){new $.formUtils.validators.validate_strength.strengthDisplay(this,conf);return this}})(jQuery,window);
|
@@ -0,0 +1,210 @@
|
|
1
|
+
/**
|
2
|
+
* jQuery Form Validator Module: Security
|
3
|
+
* ------------------------------------------
|
4
|
+
* Created by Victor Jonsson <http://www.victorjonsson.se>
|
5
|
+
*
|
6
|
+
* This form validation module adds validators typically used on swedish
|
7
|
+
* websites. This module adds the following validators:
|
8
|
+
* - validate_swesec (Social security number)
|
9
|
+
* - validate_swemobile
|
10
|
+
* - validate_validate_municipality
|
11
|
+
* - validate_county
|
12
|
+
* - validate_swephone
|
13
|
+
*
|
14
|
+
* @website http://formvalidator.net/#swedish-validators
|
15
|
+
* @license Dual licensed under the MIT or GPL Version 2 licenses
|
16
|
+
* @version 2.1.66
|
17
|
+
*/
|
18
|
+
(function($, window) {
|
19
|
+
|
20
|
+
/*
|
21
|
+
* Validate swedish social security number yyyymmddXXXX
|
22
|
+
*/
|
23
|
+
$.formUtils.addValidator({
|
24
|
+
name : 'swesec',
|
25
|
+
validatorFunction : function(securityNumber, $input) {
|
26
|
+
|
27
|
+
var year, month, day, ssnParts;
|
28
|
+
|
29
|
+
if( $input.valAttr('use-hyphen') ) {
|
30
|
+
ssnParts = securityNumber.split('-');
|
31
|
+
if( ssnParts.length != 2 ) {
|
32
|
+
return false;
|
33
|
+
}
|
34
|
+
securityNumber = ssnParts.join('');
|
35
|
+
}
|
36
|
+
|
37
|
+
if (!securityNumber.match(/^(\d{4})(\d{2})(\d{2})(\d{4})$/)) {
|
38
|
+
return false;
|
39
|
+
}
|
40
|
+
|
41
|
+
year = RegExp.$1;
|
42
|
+
month = $.formUtils.parseDateInt(RegExp.$2);
|
43
|
+
day = $.formUtils.parseDateInt(RegExp.$3);
|
44
|
+
|
45
|
+
window.ssnGender = ( parseInt( (RegExp.$4).substring(2,3) ) % 2 ) === 0 ? 'female':'male';
|
46
|
+
|
47
|
+
var months = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
|
48
|
+
if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {
|
49
|
+
months[1] = 29;
|
50
|
+
}
|
51
|
+
if (month < 1 || month > 12 || day < 1 || day > months[month - 1]) {
|
52
|
+
return false;
|
53
|
+
}
|
54
|
+
|
55
|
+
securityNumber = securityNumber.substring(2, securityNumber.length);
|
56
|
+
var check = '';
|
57
|
+
for (var i = 0; i < securityNumber.length; i++) {
|
58
|
+
check += ((((i + 1) % 2) + 1)* securityNumber.substring(i, i + 1));
|
59
|
+
}
|
60
|
+
var checksum = 0;
|
61
|
+
for (i = 0; i < check.length; i++) {
|
62
|
+
checksum += parseInt(check.substring(i, i + 1),10);
|
63
|
+
}
|
64
|
+
|
65
|
+
return checksum % 10 === 0;
|
66
|
+
},
|
67
|
+
errorMessage : '',
|
68
|
+
errorMessageKey: 'badSecurityNumber'
|
69
|
+
});
|
70
|
+
|
71
|
+
$.formUtils.addValidator({
|
72
|
+
name : 'swecounty',
|
73
|
+
validatorFunction : function(str) {
|
74
|
+
str = str.toLowerCase();
|
75
|
+
if($.inArray(str, this.counties) == -1) {
|
76
|
+
if(str.substr(-3).toLocaleLowerCase() != 'län') {
|
77
|
+
return $.inArray(str + 's län', this.counties) > -1;
|
78
|
+
}
|
79
|
+
|
80
|
+
return false;
|
81
|
+
}
|
82
|
+
else
|
83
|
+
return true;
|
84
|
+
},
|
85
|
+
errorMessage: '',
|
86
|
+
errorMessageKey: 'badCustomVal',
|
87
|
+
counties : ['stockholms län',
|
88
|
+
'uppsala län',
|
89
|
+
'södermanlands län',
|
90
|
+
'östergötlands län',
|
91
|
+
'jönköpings län',
|
92
|
+
'kronobergs län',
|
93
|
+
'kalmar län',
|
94
|
+
'gotlands län',
|
95
|
+
'blekinge län',
|
96
|
+
'skåne län',
|
97
|
+
'hallands län',
|
98
|
+
'västra götalands län',
|
99
|
+
'värmlands län',
|
100
|
+
'örebro län',
|
101
|
+
'västmanlands län',
|
102
|
+
'dalarnas län',
|
103
|
+
'gävleborgs län',
|
104
|
+
'västernorrlands län',
|
105
|
+
'jämtlands län',
|
106
|
+
'västerbottens län',
|
107
|
+
'norrbottens län']
|
108
|
+
});
|
109
|
+
|
110
|
+
$.formUtils.addValidator({
|
111
|
+
name : 'swemunicipality',
|
112
|
+
validatorFunction : function(str) {
|
113
|
+
str = str.toLowerCase();
|
114
|
+
if($.inArray(str, this.municipalities) == -1) {
|
115
|
+
|
116
|
+
// First check (dont return)
|
117
|
+
if(str.substr(-8) == 's kommun') {
|
118
|
+
if($.inArray( str.substr(0, str.length-8), this.municipalities ) > -1)
|
119
|
+
return true;
|
120
|
+
}
|
121
|
+
|
122
|
+
// Second check
|
123
|
+
if(str.substr(-7) == ' kommun') {
|
124
|
+
return $.inArray( str.substr(0, str.length-7), this.municipalities ) > -1;
|
125
|
+
}
|
126
|
+
|
127
|
+
return false;
|
128
|
+
}
|
129
|
+
else
|
130
|
+
return true;
|
131
|
+
},
|
132
|
+
errorMessage : '',
|
133
|
+
errorMessageKey: 'badCustomVal',
|
134
|
+
municipalities : ['ale','alingsås','alvesta','aneby','arboga','arjeplog','arvidsjaur','arvika','askersund','avesta','bengtsfors','berg','bjurholm','bjuv','boden','bollebygd','bollnäs','borgholm','borlänge','borås','botkyrka','boxholm','bromölla','bräcke','burlöv','båstad','dals-ed','danderyd','degerfors','dorotea','eda','ekerö','eksjö','emmaboda','enköpings','eskilstuna','eslövs','essunga','fagersta','falkenberg','falköping','falu','filipstad','finspång','flen','forshaga','färgelanda','gagnef','gislaved','gnesta','gnosjö','gotland','grum','grästorp','gullspång','gällivare','gävle','göteborg','götene','habo','hagfor','hallsberg','hallstahammar','halmstad','hammarö','haninge','haparanda','heby','hedemora','helsingborg','herrljunga','hjo','hofor','huddinge','hudiksvall','hultsfred','hylte','håbo','hällefor','härjedalen','härnösand','härryda','hässleholm','höganäs','högsby','hörby','höör','jokkmokk','järfälla','jönköping','kalix','kalmar','karlsborg','karlshamn','karlskoga','karlskrona','karlstad','katrineholm','kil','kinda','kiruna','klippan','knivsta','kramfors','kristianstad','kristinehamn','krokoms','kumla','kungsbacka','kungsör','kungälv','kävlinge','köping','laholm','landskrona','laxå','lekeberg','leksand','lerum','lessebo','lidingö','lidköping','lilla edets','lindesbergs','linköpings','ljungby','ljusdals','ljusnarsbergs','lomma','ludvika','luleå','lunds','lycksele','lysekil','malmö','malung-sälen','malå','mariestad','marks','markaryd','mellerud','mjölby','mora','motala','mullsjö','munkedal','munkfors','mölndal','mönsterås','mörbylånga','nacka','nora','norberg','nordanstig','nordmaling','norrköping','norrtälje','norsjö','nybro','nykvarn','nyköping','nynäshamn','nässjö','ockelbo','olofström','orsa','orust','osby','oskarshamn','ovanåker','oxelösund','pajala','partille','perstorp','piteå','ragunda','robertsfors','ronneby','rättvik','sala','salem','sandviken','sigtuna','simrishamn','sjöbo','skara','skellefteå','skinnskatteberg','skurup','skövde','smedjebacken','sollefteå','sollentuna','solna','sorsele','sotenäs','staffanstorp','stenungsund','stockholm','storfors','storuman','strängnäs','strömstad','strömsund','sundbyberg','sundsvall','sunne','surahammar','svalöv','svedala','svenljunga','säffle','säter','sävsjö','söderhamns','söderköping','södertälje','sölvesborg','tanum','tibro','tidaholm','tierp','timrå','tingsryd','tjörn','tomelilla','torsby','torså','tranemo','tranå','trelleborg','trollhättan','trosa','tyresö','täby','töreboda','uddevalla','ulricehamns','umeå','upplands väsby','upplands-bro','uppsala','uppvidinge','vadstena','vaggeryd','valdemarsvik','vallentuna','vansbro','vara','varberg','vaxholm','vellinge','vetlanda','vilhelmina','vimmerby','vindeln','vingåker','vårgårda','vänersborg','vännäs','värmdö','värnamo','västervik','västerås','växjö','ydre','ystad','åmål','ånge','åre','årjäng','åsele','åstorp','åtvidaberg','älmhult','älvdalen','älvkarleby','älvsbyn','ängelholm','öckerö','ödeshög','örebro','örkelljunga','örnsköldsvik','östersund','österåker','östhammar','östra göinge','överkalix','övertorneå']
|
135
|
+
});
|
136
|
+
|
137
|
+
|
138
|
+
/*
|
139
|
+
* Validate phone number, at least 7 digits only one hyphen and plus allowed
|
140
|
+
*/
|
141
|
+
$.formUtils.addValidator({
|
142
|
+
name : 'swephone',
|
143
|
+
validatorFunction : function(tele) {
|
144
|
+
var numPlus = tele.match(/\+/g);
|
145
|
+
var numHifen = tele.match(/-/g);
|
146
|
+
|
147
|
+
if ((numPlus !== null && numPlus.length > 1) || (numHifen !== null && numHifen.length > 1)) {
|
148
|
+
return false;
|
149
|
+
}
|
150
|
+
if (numPlus !== null && tele.indexOf('+') !== 0) {
|
151
|
+
return false;
|
152
|
+
}
|
153
|
+
|
154
|
+
tele = tele.replace(/([-|\+])/g, '');
|
155
|
+
return tele.length > 8 && tele.match(/[^0-9]/g) === null;
|
156
|
+
},
|
157
|
+
errorMessage : '',
|
158
|
+
errorMessageKey: 'badTelephone'
|
159
|
+
});
|
160
|
+
|
161
|
+
|
162
|
+
/*
|
163
|
+
* Validate that string is a swedish telephone number
|
164
|
+
*/
|
165
|
+
$.formUtils.addValidator({
|
166
|
+
name : 'swemobile',
|
167
|
+
validatorFunction : function(number) {
|
168
|
+
if (!$.formUtils.validators.validate_swephone.validatorFunction(number)) {
|
169
|
+
return false;
|
170
|
+
}
|
171
|
+
|
172
|
+
number = number.replace(/[^0-9]/g, '');
|
173
|
+
var begin = number.substring(0, 3);
|
174
|
+
|
175
|
+
if (number.length != 10 && begin !== '467') {
|
176
|
+
return false;
|
177
|
+
} else if (number.length != 11 && begin === '467') {
|
178
|
+
return false;
|
179
|
+
}
|
180
|
+
return (/07[0-9{1}]/).test(begin) || begin === '467';
|
181
|
+
},
|
182
|
+
errorMessage : '',
|
183
|
+
errorMessageKey: 'badTelephone'
|
184
|
+
});
|
185
|
+
|
186
|
+
/**
|
187
|
+
* @private
|
188
|
+
* @param {Array} listItems
|
189
|
+
* @return {Array}
|
190
|
+
*/
|
191
|
+
var _makeSortedList = function(listItems) {
|
192
|
+
var newList = [];
|
193
|
+
$.each(listItems, function(i, v) {
|
194
|
+
newList.push(v.substr(0,1).toUpperCase() + v.substr(1, v.length));
|
195
|
+
});
|
196
|
+
newList.sort();
|
197
|
+
return newList;
|
198
|
+
};
|
199
|
+
|
200
|
+
$.fn.suggestSwedishCounty = function(settings) {
|
201
|
+
var counties = _makeSortedList($.formUtils.validators.validate_swecounty.counties);
|
202
|
+
return $.formUtils.suggest(this, counties, settings);
|
203
|
+
};
|
204
|
+
|
205
|
+
$.fn.suggestSwedishMunicipality = function(settings) {
|
206
|
+
var municipalities = _makeSortedList($.formUtils.validators.validate_swemunicipality.municipalities);
|
207
|
+
return $.formUtils.suggest(this, municipalities, settings);
|
208
|
+
};
|
209
|
+
|
210
|
+
})(jQuery, window);
|