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.
- checksums.yaml +4 -4
- data/.gitignore +21 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +451 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/brazil.dev.js +115 -0
- data/app/assets/javascripts/brazil.js +9 -0
- data/app/assets/javascripts/date.dev.js +81 -0
- data/app/assets/javascripts/date.js +9 -0
- data/app/assets/javascripts/file.dev.js +413 -0
- data/app/assets/javascripts/file.js +9 -0
- data/app/assets/javascripts/html5.dev.js +168 -0
- data/app/assets/javascripts/html5.js +9 -0
- data/app/assets/javascripts/jquery.form-validator.min.js +9 -0
- data/app/assets/javascripts/jsconf.dev.js +55 -0
- data/app/assets/javascripts/jsconf.js +9 -0
- data/app/assets/javascripts/lang/cz.dev.js +65 -0
- data/app/assets/javascripts/lang/cz.js +9 -0
- data/app/assets/javascripts/lang/de.dev.js +65 -0
- data/app/assets/javascripts/lang/de.js +9 -0
- data/app/assets/javascripts/lang/es.dev.js +62 -0
- data/app/assets/javascripts/lang/es.js +9 -0
- data/app/assets/javascripts/lang/fr.dev.js +62 -0
- data/app/assets/javascripts/lang/fr.js +9 -0
- data/app/assets/javascripts/lang/it.dev.js +62 -0
- data/app/assets/javascripts/lang/it.js +9 -0
- data/app/assets/javascripts/lang/pl.dev.js +65 -0
- data/app/assets/javascripts/lang/pl.js +9 -0
- data/app/assets/javascripts/lang/pt.dev.js +65 -0
- data/app/assets/javascripts/lang/pt.js +9 -0
- data/app/assets/javascripts/lang/ro.dev.js +65 -0
- data/app/assets/javascripts/lang/ro.js +9 -0
- data/app/assets/javascripts/lang/ru.dev.js +66 -0
- data/app/assets/javascripts/lang/ru.js +9 -0
- data/app/assets/javascripts/lang/sv.dev.js +63 -0
- data/app/assets/javascripts/lang/sv.js +9 -0
- data/app/assets/javascripts/location.dev.js +78 -0
- data/app/assets/javascripts/location.js +9 -0
- data/app/assets/javascripts/sanitize.dev.js +154 -0
- data/app/assets/javascripts/sanitize.js +9 -0
- data/app/assets/javascripts/security.dev.js +523 -0
- data/app/assets/javascripts/security.js +9 -0
- data/app/assets/javascripts/src/core-validators.js +343 -0
- data/app/assets/javascripts/src/dialogs.js +123 -0
- data/app/assets/javascripts/src/jquery-plugins.js +452 -0
- data/app/assets/javascripts/src/module-loader.js +150 -0
- data/app/assets/javascripts/src/setup.js +168 -0
- data/app/assets/javascripts/src/utils.js +840 -0
- data/app/assets/javascripts/sweden.dev.js +213 -0
- data/app/assets/javascripts/sweden.js +9 -0
- data/app/assets/javascripts/theme-default.css +108 -0
- data/app/assets/javascripts/theme-default.min.css +1 -0
- data/app/assets/javascripts/toggleDisabled.dev.js +67 -0
- data/app/assets/javascripts/toggleDisabled.js +9 -0
- data/app/assets/javascripts/uk.dev.js +85 -0
- data/app/assets/javascripts/uk.js +9 -0
- data/dqs-jquery-form-validator.gemspec +27 -0
- data/lib/dqs-jquery-form-validator-rails.rb +1 -0
- data/lib/dqs/jquery/form/validator/rails.rb +13 -0
- data/lib/dqs/jquery/form/validator/rails/engine.rb +12 -0
- data/lib/dqs/jquery/form/validator/rails/version.rb +11 -0
- metadata +64 -2
@@ -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,b){"use strict";a.formUtils.addValidator({name:"spamcheck",validatorFunction:function(a,b){var c=b.valAttr("captcha");return c===a},errorMessage:"",errorMessageKey:"badSecurityAnswer"}),a.formUtils.addValidator({name:"confirmation",validatorFunction:function(a,b,c,d,e){var f="",g=b.valAttr("confirm")||b.attr("name")+"_confirmation",h=e.find('[name="'+g+'"]').eq(0);if(h){if(f=h.val(),c.validateOnBlur&&!h[0].hasValidationCallback){h[0].hasValidationCallback=!0;var i=function(){b.validate()};h.on("keyup",i),e.one("formValidationSetup",function(){h[0].hasValidationCallback=!1,h.off("keyup",i)})}}else alert('Could not find an input with name "'+g+'"');return a===f},errorMessage:"",errorMessageKey:"notConfirmed"});var c={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]},d=!1,e=!1;a.formUtils.addValidator({name:"creditcard",validatorFunction:function(f,g){var h=a.split(g.valAttr("allowing")||"");if(e=a.inArray("amex",h)>-1,d=e&&1===h.length,h.length>0){var i=!1;if(a.each(h,function(a,d){if(d in c){if(f.length>=c[d][0]&&f.length<=c[d][1])return i=!0,!1}else b.console&&console.warn('Use of unknown credit card "'+d+'"')}),!i)return!1}if(""!==f.replace(new RegExp("[0-9]","g"),""))return!1;var j=0;return a.each(f.split("").reverse(),function(a,b){b=parseInt(b,10),a%2===0?j+=b:(b*=2,j+=10>b?b:b-9)}),j%10===0},errorMessage:"",errorMessageKey:"badCreditCard"}),a.formUtils.addValidator({name:"cvv",validatorFunction:function(a){return""===a.replace(/[0-9]/g,"")?(a+="",d?4===a.length:e?3===a.length||4===a.length:3===a.length):!1},errorMessage:"",errorMessageKey:"badCVV"}),a.formUtils.addValidator({name:"strength",validatorFunction:function(b,c){var d=c.valAttr("strength")||2;return d&&d>3&&(d=3),a.formUtils.validators.validate_strength.calculatePasswordStrength(b)>=d},errorMessage:"",errorMessageKey:"badStrength",calculatePasswordStrength:function(a){if(a.length<4)return 0;var b=0,c=function(a,b){for(var c="",d=0;d<b.length;d++){for(var e=!0,f=0;a>f&&f+d+a<b.length;f++)e=e&&b.charAt(f+d)===b.charAt(f+d+a);a>f&&(e=!1),e?(d+=a-1,e=!1):c+=b.charAt(d)}return c};return b+=4*a.length,b+=1*(c(1,a).length-a.length),b+=1*(c(2,a).length-a.length),b+=1*(c(3,a).length-a.length),b+=1*(c(4,a).length-a.length),a.match(/(.*[0-9].*[0-9].*[0-9])/)&&(b+=5),a.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)&&(b+=5),a.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)&&(b+=10),a.match(/([a-zA-Z])/)&&a.match(/([0-9])/)&&(b+=15),a.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&a.match(/([0-9])/)&&(b+=15),a.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&a.match(/([a-zA-Z])/)&&(b+=15),(a.match(/^\w+$/)||a.match(/^\d+$/))&&(b-=10),0>b&&(b=0),b>100&&(b=100),20>b?0:40>b?1:60>=b?2:3},strengthDisplay:function(b,c){var d={fontSize:"12pt",padding:"4px",bad:"Very bad",weak:"Weak",good:"Good",strong:"Strong"};c&&a.extend(d,c),b.bind("keyup",function(){var b=a(this).val(),c="undefined"==typeof d.parent?a(this).parent():a(d.parent),e=c.find(".strength-meter"),f=a.formUtils.validators.validate_strength.calculatePasswordStrength(b),g={background:"pink",color:"#FF0000",fontWeight:"bold",border:"red solid 1px",borderWidth:"0px 0px 4px",display:"inline-block",fontSize:d.fontSize,padding:d.padding},h=d.bad;0===e.length&&(e=a("<span></span>"),e.addClass("strength-meter").appendTo(c)),b?e.show():e.hide(),1===f?h=d.weak:2===f?(g.background="lightyellow",g.borderColor="yellow",g.color="goldenrod",h=d.good):f>=3&&(g.background="lightgreen",g.borderColor="darkgreen",g.color="darkgreen",h=d.strong),e.css(g).text(h)})}});var f=function(b,c,d,e,f){var g=c.valAttr("req-params")||c.data("validation-req-params")||{},h=function(b,d){b.valid?c.valAttr("backend-valid","true"):(c.valAttr("backend-invalid","true"),b.message&&c.attr(e.validationErrorMsgAttribute,b.message)),c.valAttr("has-keyup-event")||c.valAttr("has-keyup-event","1").bind("keyup change",function(b){9!==b.keyCode&&16!==b.keyCode&&a(this).valAttr("backend-valid",!1).valAttr("backend-invalid",!1)}),d()};g||(g={}),"string"==typeof g&&(g=a.parseJSON(g)),g[c.valAttr("param-name")||c.attr("name")]=d,a.ajax({url:b,type:"POST",cache:!1,data:g,dataType:"json",error:function(a){return h({valid:!1,message:"Connection failed with status: "+a.statusText},f),!1},success:function(a){h(a,f)}})},g=function(){return!1};a.formUtils.addValidator({name:"server",validatorFunction:function(b,c,d,e,h){var i=c.valAttr("backend-valid"),j=c.valAttr("backend-invalid"),k=document.location.href;return c.valAttr("url")?k=c.valAttr("url"):"serverURL"in d&&(k=d.backendUrl),i?!0:j?!1:"keyup"!==a.formUtils.eventType||a.formUtils.isValidatingEntireForm?a.formUtils.isValidatingEntireForm?(h.bind("submit",g).addClass("validating-server-side").addClass("on-blur"),c.addClass("validating-server-side"),a.formUtils.haltValidation=!0,f(k,c,b,d,function(){h.removeClass("validating-server-side").removeClass("on-blur").get(0).onsubmit=function(){},h.unbind("submit",g),c.removeClass("validating-server-side"),c.valAttr("value-length",b.length),a.formUtils.haltValidation=!1,h.trigger("submit")}),null):(h.addClass("validating-server-side"),c.addClass("validating-server-side"),f(k,c,b,d,function(){h.removeClass("validating-server-side"),c.removeClass("validating-server-side"),c.trigger("blur")}),null):null},errorMessage:"",errorMessageKey:"badBackend",validateOnKeyUp:!1}),a.formUtils.addValidator({name:"letternumeric",validatorFunction:function(b,c,d,e){var f="^([a-zA-Z0-9ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",g="]+)$",h=c.valAttr("allowing"),i="";if(h){i=f+h+g;var j=h.replace(/\\/g,"");j.indexOf(" ")>-1&&(j=j.replace(" ",""),j+=e.andSpaces||a.formUtils.LANG.andSpaces),this.errorMessage=e.badAlphaNumeric+e.badAlphaNumericExtra+j}else i=f+g,this.errorMessage=e.badAlphaNumeric;return new RegExp(i).test(b)},errorMessage:"",errorMessageKey:"requiredFields"}),a.fn.displayPasswordStrength=function(b){return new a.formUtils.validators.validate_strength.strengthDisplay(this,b),this}}(jQuery,window);
|
@@ -0,0 +1,343 @@
|
|
1
|
+
/**
|
2
|
+
* File declaring all default validators.
|
3
|
+
*/
|
4
|
+
(function($) {
|
5
|
+
|
6
|
+
/*
|
7
|
+
* Validate email
|
8
|
+
*/
|
9
|
+
$.formUtils.addValidator({
|
10
|
+
name: 'email',
|
11
|
+
validatorFunction: function (email) {
|
12
|
+
|
13
|
+
var emailParts = email.toLowerCase().split('@'),
|
14
|
+
localPart = emailParts[0],
|
15
|
+
domain = emailParts[1];
|
16
|
+
|
17
|
+
if (localPart && domain) {
|
18
|
+
|
19
|
+
if( localPart.indexOf('"') === 0 ) {
|
20
|
+
var len = localPart.length;
|
21
|
+
localPart = localPart.replace(/\"/g, '');
|
22
|
+
if( localPart.length !== (len-2) ) {
|
23
|
+
return false; // It was not allowed to have more than two apostrophes
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
return $.formUtils.validators.validate_domain.validatorFunction(emailParts[1]) &&
|
28
|
+
localPart.indexOf('.') !== 0 &&
|
29
|
+
localPart.substring(localPart.length-1, localPart.length) !== '.' &&
|
30
|
+
localPart.indexOf('..') === -1 &&
|
31
|
+
!(/[^\w\+\.\-\#\-\_\~\!\$\&\'\(\)\*\+\,\;\=\:]/.test(localPart));
|
32
|
+
}
|
33
|
+
|
34
|
+
return false;
|
35
|
+
},
|
36
|
+
errorMessage: '',
|
37
|
+
errorMessageKey: 'badEmail'
|
38
|
+
});
|
39
|
+
|
40
|
+
/*
|
41
|
+
* Validate domain name
|
42
|
+
*/
|
43
|
+
$.formUtils.addValidator({
|
44
|
+
name: 'domain',
|
45
|
+
validatorFunction: function (val) {
|
46
|
+
return val.length > 0 &&
|
47
|
+
val.length <= 253 && // Including sub domains
|
48
|
+
!(/[^a-zA-Z0-9]/.test(val.slice(-2))) && !(/[^a-zA-Z0-9]/.test(val.substr(0, 1))) && !(/[^a-zA-Z0-9\.\-]/.test(val)) &&
|
49
|
+
val.split('..').length === 1 &&
|
50
|
+
val.split('.').length > 1;
|
51
|
+
},
|
52
|
+
errorMessage: '',
|
53
|
+
errorMessageKey: 'badDomain'
|
54
|
+
});
|
55
|
+
|
56
|
+
/*
|
57
|
+
* Validate required
|
58
|
+
*/
|
59
|
+
$.formUtils.addValidator({
|
60
|
+
name: 'required',
|
61
|
+
validatorFunction: function (val, $el, config, language, $form) {
|
62
|
+
switch ($el.attr('type')) {
|
63
|
+
case 'checkbox':
|
64
|
+
return $el.is(':checked');
|
65
|
+
case 'radio':
|
66
|
+
return $form.find('input[name="' + $el.attr('name') + '"]').filter(':checked').length > 0;
|
67
|
+
default:
|
68
|
+
return $.trim(val) !== '';
|
69
|
+
}
|
70
|
+
},
|
71
|
+
errorMessage: '',
|
72
|
+
errorMessageKey: function(config) {
|
73
|
+
if (config.errorMessagePosition === 'top' || config.errorMessagePosition === 'custom') {
|
74
|
+
return 'requiredFields';
|
75
|
+
}
|
76
|
+
else {
|
77
|
+
return 'requiredField';
|
78
|
+
}
|
79
|
+
}
|
80
|
+
});
|
81
|
+
|
82
|
+
/*
|
83
|
+
* Validate length range
|
84
|
+
*/
|
85
|
+
$.formUtils.addValidator({
|
86
|
+
name: 'length',
|
87
|
+
validatorFunction: function (val, $el, conf, lang) {
|
88
|
+
var lengthAllowed = $el.valAttr('length'),
|
89
|
+
type = $el.attr('type');
|
90
|
+
|
91
|
+
if (lengthAllowed === undefined) {
|
92
|
+
alert('Please add attribute "data-validation-length" to ' + $el[0].nodeName + ' named ' + $el.attr('name'));
|
93
|
+
return true;
|
94
|
+
}
|
95
|
+
|
96
|
+
// check if length is above min, below max or within range.
|
97
|
+
var len = type === 'file' && $el.get(0).files !== undefined ? $el.get(0).files.length : val.length,
|
98
|
+
lengthCheckResults = $.formUtils.numericRangeCheck(len, lengthAllowed),
|
99
|
+
checkResult;
|
100
|
+
|
101
|
+
switch (lengthCheckResults[0]) { // outside of allowed range
|
102
|
+
case 'out':
|
103
|
+
this.errorMessage = lang.lengthBadStart + lengthAllowed + lang.lengthBadEnd;
|
104
|
+
checkResult = false;
|
105
|
+
break;
|
106
|
+
// too short
|
107
|
+
case 'min':
|
108
|
+
this.errorMessage = lang.lengthTooShortStart + lengthCheckResults[1] + lang.lengthBadEnd;
|
109
|
+
checkResult = false;
|
110
|
+
break;
|
111
|
+
// too long
|
112
|
+
case 'max':
|
113
|
+
this.errorMessage = lang.lengthTooLongStart + lengthCheckResults[1] + lang.lengthBadEnd;
|
114
|
+
checkResult = false;
|
115
|
+
break;
|
116
|
+
// ok
|
117
|
+
default:
|
118
|
+
checkResult = true;
|
119
|
+
}
|
120
|
+
|
121
|
+
return checkResult;
|
122
|
+
},
|
123
|
+
errorMessage: '',
|
124
|
+
errorMessageKey: ''
|
125
|
+
});
|
126
|
+
|
127
|
+
/*
|
128
|
+
* Validate url
|
129
|
+
*/
|
130
|
+
$.formUtils.addValidator({
|
131
|
+
name: 'url',
|
132
|
+
validatorFunction: function (url) {
|
133
|
+
// written by Scott Gonzalez: http://projects.scottsplayground.com/iri/
|
134
|
+
// - Victor Jonsson added support for arrays in the url ?arg[]=sdfsdf
|
135
|
+
// - General improvements made by Stéphane Moureau <https://github.com/TraderStf>
|
136
|
+
|
137
|
+
var urlFilter = /^(https?|ftp):\/\/((((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|\[|\]|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
|
138
|
+
if (urlFilter.test(url)) {
|
139
|
+
var domain = url.split('://')[1],
|
140
|
+
domainSlashPos = domain.indexOf('/');
|
141
|
+
|
142
|
+
if (domainSlashPos > -1) {
|
143
|
+
domain = domain.substr(0, domainSlashPos);
|
144
|
+
}
|
145
|
+
|
146
|
+
return $.formUtils.validators.validate_domain.validatorFunction(domain); // todo: add support for IP-addresses
|
147
|
+
}
|
148
|
+
return false;
|
149
|
+
},
|
150
|
+
errorMessage: '',
|
151
|
+
errorMessageKey: 'badUrl'
|
152
|
+
});
|
153
|
+
|
154
|
+
/*
|
155
|
+
* Validate number (floating or integer)
|
156
|
+
*/
|
157
|
+
$.formUtils.addValidator({
|
158
|
+
name: 'number',
|
159
|
+
validatorFunction: function (val, $el, conf) {
|
160
|
+
if (val !== '') {
|
161
|
+
var allowing = $el.valAttr('allowing') || '',
|
162
|
+
decimalSeparator = $el.valAttr('decimal-separator') || conf.decimalSeparator,
|
163
|
+
allowsRange = false,
|
164
|
+
begin, end,
|
165
|
+
steps = $el.valAttr('step') || '',
|
166
|
+
allowsSteps = false;
|
167
|
+
|
168
|
+
var sanitize = $el.attr('data-sanitize') || '';
|
169
|
+
var isFormattedWithNumeral = sanitize.split(/\s/).find(function (name) {
|
170
|
+
return (name === 'numberFormat');
|
171
|
+
});
|
172
|
+
if (isFormattedWithNumeral) {
|
173
|
+
if (!window.numeral) {
|
174
|
+
throw new ReferenceError('The data-sanitize value numberFormat cannot be used without the numeral' +
|
175
|
+
' library. Please see Data Validation in http://www.formvalidator.net for more information.');
|
176
|
+
}
|
177
|
+
//Unformat input first, then convert back to String
|
178
|
+
val = String(numeral().unformat(val));
|
179
|
+
}
|
180
|
+
|
181
|
+
if (allowing.indexOf('number') === -1) {
|
182
|
+
allowing += ',number';
|
183
|
+
}
|
184
|
+
|
185
|
+
if (allowing.indexOf('negative') === -1 && val.indexOf('-') === 0) {
|
186
|
+
return false;
|
187
|
+
}
|
188
|
+
|
189
|
+
if (allowing.indexOf('range') > -1) {
|
190
|
+
begin = parseFloat(allowing.substring(allowing.indexOf('[') + 1, allowing.indexOf(';')));
|
191
|
+
end = parseFloat(allowing.substring(allowing.indexOf(';') + 1, allowing.indexOf(']')));
|
192
|
+
allowsRange = true;
|
193
|
+
}
|
194
|
+
|
195
|
+
if (steps !== '') {
|
196
|
+
allowsSteps = true;
|
197
|
+
}
|
198
|
+
|
199
|
+
if (decimalSeparator === ',') {
|
200
|
+
if (val.indexOf('.') > -1) {
|
201
|
+
return false;
|
202
|
+
}
|
203
|
+
// Fix for checking range with floats using ,
|
204
|
+
val = val.replace(',', '.');
|
205
|
+
}
|
206
|
+
if (val.replace(/[0-9-]/g, '') === '' && (!allowsRange || (val >= begin && val <= end)) && (!allowsSteps || (val % steps === 0))) {
|
207
|
+
return true;
|
208
|
+
}
|
209
|
+
|
210
|
+
if (allowing.indexOf('float') > -1 && val.match(new RegExp('^([0-9-]+)\\.([0-9]+)$')) !== null && (!allowsRange || (val >= begin && val <= end)) && (!allowsSteps || (val % steps === 0))) {
|
211
|
+
return true;
|
212
|
+
}
|
213
|
+
}
|
214
|
+
return false;
|
215
|
+
},
|
216
|
+
errorMessage: '',
|
217
|
+
errorMessageKey: 'badInt'
|
218
|
+
});
|
219
|
+
|
220
|
+
/*
|
221
|
+
* Validate alpha numeric
|
222
|
+
*/
|
223
|
+
$.formUtils.addValidator({
|
224
|
+
name: 'alphanumeric',
|
225
|
+
validatorFunction: function (val, $el, conf, language) {
|
226
|
+
var patternStart = '^([a-zA-Z0-9',
|
227
|
+
patternEnd = ']+)$',
|
228
|
+
additionalChars = $el.valAttr('allowing'),
|
229
|
+
pattern = '';
|
230
|
+
|
231
|
+
if (additionalChars) {
|
232
|
+
pattern = patternStart + additionalChars + patternEnd;
|
233
|
+
var extra = additionalChars.replace(/\\/g, '');
|
234
|
+
if (extra.indexOf(' ') > -1) {
|
235
|
+
extra = extra.replace(' ', '');
|
236
|
+
extra += language.andSpaces || $.formUtils.LANG.andSpaces;
|
237
|
+
}
|
238
|
+
this.errorMessage = language.badAlphaNumeric + language.badAlphaNumericExtra + extra;
|
239
|
+
} else {
|
240
|
+
pattern = patternStart + patternEnd;
|
241
|
+
this.errorMessage = language.badAlphaNumeric;
|
242
|
+
}
|
243
|
+
|
244
|
+
return new RegExp(pattern).test(val);
|
245
|
+
},
|
246
|
+
errorMessage: '',
|
247
|
+
errorMessageKey: ''
|
248
|
+
});
|
249
|
+
|
250
|
+
/*
|
251
|
+
* Validate against regexp
|
252
|
+
*/
|
253
|
+
$.formUtils.addValidator({
|
254
|
+
name: 'custom',
|
255
|
+
validatorFunction: function (val, $el) {
|
256
|
+
var regexp = new RegExp($el.valAttr('regexp'));
|
257
|
+
return regexp.test(val);
|
258
|
+
},
|
259
|
+
errorMessage: '',
|
260
|
+
errorMessageKey: 'badCustomVal'
|
261
|
+
});
|
262
|
+
|
263
|
+
/*
|
264
|
+
* Validate date
|
265
|
+
*/
|
266
|
+
$.formUtils.addValidator({
|
267
|
+
name: 'date',
|
268
|
+
validatorFunction: function (date, $el, conf) {
|
269
|
+
var dateFormat = $el.valAttr('format') || conf.dateFormat || 'yyyy-mm-dd',
|
270
|
+
addMissingLeadingZeros = $el.valAttr('require-leading-zero') === 'false';
|
271
|
+
return $.formUtils.parseDate(date, dateFormat, addMissingLeadingZeros) !== false;
|
272
|
+
},
|
273
|
+
errorMessage: '',
|
274
|
+
errorMessageKey: 'badDate'
|
275
|
+
});
|
276
|
+
|
277
|
+
|
278
|
+
/*
|
279
|
+
* Validate group of checkboxes, validate qty required is checked
|
280
|
+
* written by Steve Wasiura : http://stevewasiura.waztech.com
|
281
|
+
* element attrs
|
282
|
+
* data-validation="checkbox_group"
|
283
|
+
* data-validation-qty="1-2" // min 1 max 2
|
284
|
+
* data-validation-error-msg="chose min 1, max of 2 checkboxes"
|
285
|
+
*/
|
286
|
+
$.formUtils.addValidator({
|
287
|
+
name: 'checkbox_group',
|
288
|
+
validatorFunction: function (val, $el, conf, lang, $form) {
|
289
|
+
// preset return var
|
290
|
+
var isValid = true,
|
291
|
+
// get name of element. since it is a checkbox group, all checkboxes will have same name
|
292
|
+
elname = $el.attr('name'),
|
293
|
+
// get checkboxes and count the checked ones
|
294
|
+
$checkBoxes = $('input[type=checkbox][name^="' + elname + '"]', $form),
|
295
|
+
checkedCount = $checkBoxes.filter(':checked').length,
|
296
|
+
// get el attr that specs qty required / allowed
|
297
|
+
qtyAllowed = $el.valAttr('qty');
|
298
|
+
|
299
|
+
if (qtyAllowed === undefined) {
|
300
|
+
var elementType = $el.get(0).nodeName;
|
301
|
+
alert('Attribute "data-validation-qty" is missing from ' + elementType + ' named ' + $el.attr('name'));
|
302
|
+
}
|
303
|
+
|
304
|
+
// call Utility function to check if count is above min, below max, within range etc.
|
305
|
+
var qtyCheckResults = $.formUtils.numericRangeCheck(checkedCount, qtyAllowed);
|
306
|
+
|
307
|
+
// results will be array, [0]=result str, [1]=qty int
|
308
|
+
switch (qtyCheckResults[0]) {
|
309
|
+
// outside allowed range
|
310
|
+
case 'out':
|
311
|
+
this.errorMessage = lang.groupCheckedRangeStart + qtyAllowed + lang.groupCheckedEnd;
|
312
|
+
isValid = false;
|
313
|
+
break;
|
314
|
+
// below min qty
|
315
|
+
case 'min':
|
316
|
+
this.errorMessage = lang.groupCheckedTooFewStart + qtyCheckResults[1] + lang.groupCheckedEnd;
|
317
|
+
isValid = false;
|
318
|
+
break;
|
319
|
+
// above max qty
|
320
|
+
case 'max':
|
321
|
+
this.errorMessage = lang.groupCheckedTooManyStart + qtyCheckResults[1] + lang.groupCheckedEnd;
|
322
|
+
isValid = false;
|
323
|
+
break;
|
324
|
+
// ok
|
325
|
+
default:
|
326
|
+
isValid = true;
|
327
|
+
}
|
328
|
+
|
329
|
+
if( !isValid ) {
|
330
|
+
var _triggerOnBlur = function() {
|
331
|
+
$checkBoxes.unbind('click', _triggerOnBlur);
|
332
|
+
$checkBoxes.filter('*[data-validation]').validateInputOnBlur(lang, conf, false, 'blur');
|
333
|
+
};
|
334
|
+
$checkBoxes.bind('click', _triggerOnBlur);
|
335
|
+
}
|
336
|
+
|
337
|
+
return isValid;
|
338
|
+
}
|
339
|
+
// errorMessage : '', // set above in switch statement
|
340
|
+
// errorMessageKey: '' // not used
|
341
|
+
});
|
342
|
+
|
343
|
+
})(jQuery);
|
@@ -0,0 +1,123 @@
|
|
1
|
+
/**
|
2
|
+
* Utility methods used for displaying error messages (attached to $.formUtils)
|
3
|
+
*/
|
4
|
+
(function ($) {
|
5
|
+
|
6
|
+
'use strict';
|
7
|
+
|
8
|
+
var errorDialogs = {
|
9
|
+
|
10
|
+
getParentContainer: function ($elem) {
|
11
|
+
if ($elem.valAttr('error-msg-container')) {
|
12
|
+
return $($elem.valAttr('error-msg-container'));
|
13
|
+
} else {
|
14
|
+
var $parent = $elem.parent();
|
15
|
+
if (!$parent.hasClass('form-group') && !$parent.closest('form').hasClass('form-horizontal')) {
|
16
|
+
var $formGroup = $parent.closest('.form-group');
|
17
|
+
if ($formGroup.length) {
|
18
|
+
return $formGroup.eq(0);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
return $parent;
|
22
|
+
}
|
23
|
+
},
|
24
|
+
applyErrorStyling: function ($elem, conf) {
|
25
|
+
$elem
|
26
|
+
.addClass(conf.errorElementClass)
|
27
|
+
.removeClass('valid');
|
28
|
+
|
29
|
+
this.getParentContainer($elem)
|
30
|
+
.addClass(conf.inputParentClassOnError)
|
31
|
+
.removeClass(conf.inputParentClassOnSuccess);
|
32
|
+
|
33
|
+
if (conf.borderColorOnError !== '') {
|
34
|
+
$elem.css('border-color', conf.borderColorOnError);
|
35
|
+
}
|
36
|
+
},
|
37
|
+
removeErrorStyling: function ($elem, conf) {
|
38
|
+
$elem.each(function () {
|
39
|
+
var $this = $(this);
|
40
|
+
|
41
|
+
errorDialogs.setInlineErrorMessage($this, '', conf, conf.errorMessagePosition);
|
42
|
+
|
43
|
+
$this
|
44
|
+
.removeClass('valid')
|
45
|
+
.removeClass(conf.errorElementClass)
|
46
|
+
.css('border-color', '');
|
47
|
+
|
48
|
+
errorDialogs.getParentContainer($this)
|
49
|
+
.removeClass(conf.inputParentClassOnError)
|
50
|
+
.removeClass(conf.inputParentClassOnSuccess)
|
51
|
+
.find('.' + conf.errorMessageClass) // remove inline span holding error message
|
52
|
+
.remove();
|
53
|
+
});
|
54
|
+
},
|
55
|
+
setInlineErrorMessage: function ($input, errorMsg, conf, $messageContainer) {
|
56
|
+
var custom = document.getElementById($input.attr('name') + '_err_msg'),
|
57
|
+
setErrorMessage = function ($elem) {
|
58
|
+
$.formUtils.$win.trigger('validationErrorDisplay', [$input, $elem]);
|
59
|
+
$elem.html(errorMsg);
|
60
|
+
},
|
61
|
+
$message;
|
62
|
+
|
63
|
+
if (custom) {
|
64
|
+
$.formUtils.warn('Using deprecated element reference ' + custom.id);
|
65
|
+
$messageContainer = $(custom);
|
66
|
+
} else if (typeof $messageContainer === 'function') {
|
67
|
+
$messageContainer = $messageContainer($input, errorMsg, conf);
|
68
|
+
}
|
69
|
+
|
70
|
+
if (typeof $messageContainer === 'object') {
|
71
|
+
var $found = false;
|
72
|
+
$messageContainer.find('.' + conf.errorMessageClass).each(function () {
|
73
|
+
if (this.inputReferer === $input[0]) {
|
74
|
+
$found = $(this);
|
75
|
+
return false;
|
76
|
+
}
|
77
|
+
});
|
78
|
+
if ($found) {
|
79
|
+
if (!errorMsg) {
|
80
|
+
$found.remove();
|
81
|
+
} else {
|
82
|
+
setErrorMessage($found);
|
83
|
+
}
|
84
|
+
} else if(errorMsg !== '') {
|
85
|
+
$message = $('<div class="' + conf.errorMessageClass + ' alert"></div>');
|
86
|
+
setErrorMessage($message);
|
87
|
+
$message[0].inputReferer = $input[0];
|
88
|
+
$messageContainer.prepend($message);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
else {
|
92
|
+
var $parent = this.getParentContainer($input);
|
93
|
+
$message = $parent.find('.' + conf.errorMessageClass + '.help-block');
|
94
|
+
|
95
|
+
if ($message.length === 0) {
|
96
|
+
$message = $('<span></span>').addClass('help-block').addClass(conf.errorMessageClass);
|
97
|
+
$message.appendTo($parent);
|
98
|
+
}
|
99
|
+
|
100
|
+
setErrorMessage($message);
|
101
|
+
}
|
102
|
+
},
|
103
|
+
setTemplateMessage: function ($form, title, errorMessages, conf) {
|
104
|
+
var messages = conf.errorMessageTemplate.messages.replace(/\{errorTitle\}/g, title),
|
105
|
+
fields = [],
|
106
|
+
container;
|
107
|
+
|
108
|
+
$.each(errorMessages, function (i, msg) {
|
109
|
+
fields.push(conf.errorMessageTemplate.field.replace(/\{msg\}/g, msg));
|
110
|
+
});
|
111
|
+
|
112
|
+
messages = messages.replace(/\{fields\}/g, fields.join(''));
|
113
|
+
container = conf.errorMessageTemplate.container.replace(/\{errorMessageClass\}/g, conf.errorMessageClass);
|
114
|
+
container = container.replace(/\{messages\}/g, messages);
|
115
|
+
$form.children().eq(0).before(container);
|
116
|
+
}
|
117
|
+
};
|
118
|
+
|
119
|
+
$.formUtils = $.extend($.formUtils || {}, {
|
120
|
+
errorDialogs: errorDialogs
|
121
|
+
});
|
122
|
+
|
123
|
+
})(jQuery);
|