jquery-form-validator-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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);