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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -0
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +24 -0
  6. data/README.md +451 -0
  7. data/Rakefile +1 -0
  8. data/app/assets/javascripts/brazil.dev.js +115 -0
  9. data/app/assets/javascripts/brazil.js +9 -0
  10. data/app/assets/javascripts/date.dev.js +81 -0
  11. data/app/assets/javascripts/date.js +9 -0
  12. data/app/assets/javascripts/file.dev.js +413 -0
  13. data/app/assets/javascripts/file.js +9 -0
  14. data/app/assets/javascripts/html5.dev.js +168 -0
  15. data/app/assets/javascripts/html5.js +9 -0
  16. data/app/assets/javascripts/jquery.form-validator.min.js +9 -0
  17. data/app/assets/javascripts/jsconf.dev.js +55 -0
  18. data/app/assets/javascripts/jsconf.js +9 -0
  19. data/app/assets/javascripts/lang/cz.dev.js +65 -0
  20. data/app/assets/javascripts/lang/cz.js +9 -0
  21. data/app/assets/javascripts/lang/de.dev.js +65 -0
  22. data/app/assets/javascripts/lang/de.js +9 -0
  23. data/app/assets/javascripts/lang/es.dev.js +62 -0
  24. data/app/assets/javascripts/lang/es.js +9 -0
  25. data/app/assets/javascripts/lang/fr.dev.js +62 -0
  26. data/app/assets/javascripts/lang/fr.js +9 -0
  27. data/app/assets/javascripts/lang/it.dev.js +62 -0
  28. data/app/assets/javascripts/lang/it.js +9 -0
  29. data/app/assets/javascripts/lang/pl.dev.js +65 -0
  30. data/app/assets/javascripts/lang/pl.js +9 -0
  31. data/app/assets/javascripts/lang/pt.dev.js +65 -0
  32. data/app/assets/javascripts/lang/pt.js +9 -0
  33. data/app/assets/javascripts/lang/ro.dev.js +65 -0
  34. data/app/assets/javascripts/lang/ro.js +9 -0
  35. data/app/assets/javascripts/lang/ru.dev.js +66 -0
  36. data/app/assets/javascripts/lang/ru.js +9 -0
  37. data/app/assets/javascripts/lang/sv.dev.js +63 -0
  38. data/app/assets/javascripts/lang/sv.js +9 -0
  39. data/app/assets/javascripts/location.dev.js +78 -0
  40. data/app/assets/javascripts/location.js +9 -0
  41. data/app/assets/javascripts/sanitize.dev.js +154 -0
  42. data/app/assets/javascripts/sanitize.js +9 -0
  43. data/app/assets/javascripts/security.dev.js +523 -0
  44. data/app/assets/javascripts/security.js +9 -0
  45. data/app/assets/javascripts/src/core-validators.js +343 -0
  46. data/app/assets/javascripts/src/dialogs.js +123 -0
  47. data/app/assets/javascripts/src/jquery-plugins.js +452 -0
  48. data/app/assets/javascripts/src/module-loader.js +150 -0
  49. data/app/assets/javascripts/src/setup.js +168 -0
  50. data/app/assets/javascripts/src/utils.js +840 -0
  51. data/app/assets/javascripts/sweden.dev.js +213 -0
  52. data/app/assets/javascripts/sweden.js +9 -0
  53. data/app/assets/javascripts/theme-default.css +108 -0
  54. data/app/assets/javascripts/theme-default.min.css +1 -0
  55. data/app/assets/javascripts/toggleDisabled.dev.js +67 -0
  56. data/app/assets/javascripts/toggleDisabled.js +9 -0
  57. data/app/assets/javascripts/uk.dev.js +85 -0
  58. data/app/assets/javascripts/uk.js +9 -0
  59. data/dqs-jquery-form-validator.gemspec +27 -0
  60. data/lib/dqs-jquery-form-validator-rails.rb +1 -0
  61. data/lib/dqs/jquery/form/validator/rails.rb +13 -0
  62. data/lib/dqs/jquery/form/validator/rails/engine.rb +12 -0
  63. data/lib/dqs/jquery/form/validator/rails/version.rb +11 -0
  64. metadata +64 -2
@@ -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);