UNPKG

salvation

Version:

A pure JS form validation plugin

24 lines (23 loc) 6.82 kB
/** * Salvation validation * A JavaScript Plugin. * * Validates forms. * * @version 1.2.1 * @author Ardalan Samimi */ (function(){HTMLFormElement.prototype.addSalvation=function(a,c){a=a||!1;!1!==a&&(a.element=!1);return new Salvation(a,c||!1,this)};var m={element:!1,dateFormat:"MM/DD/YYYY",datePlaceholder:!0,defaultLabel:"Invalid value",onValidation:function(a){},onInvalidation:function(a){}},p={required:/\S/,length:"^(.{X,Y}$)",numeric:/^(\d)+$/,alphanumeric:/^([\d|\w])+$/,email:/^(\w+)[\@](([A-z1-9\u00c5\u00e5\u00c4\u00e4\u00d6\u00f6]+){3,63}\.[A-z]{2,})$/},q={required:"This field can not be empty",length:"This field requires a given max/min length", numeric:"Only numeric values allowed",alphanumeric:"Only alphanumeric characters allowed",email:"Invalid e-mail",date:"Invalid date format",unknown:"Invalid value"};Salvation=function(a,c,b){return this instanceof Salvation?(this.settings=this.extend(m,a),this.patterns=this.extend(c,p),this.legends=q,this.stylings={error:"salvation-error",clear:"salvation-clear"},this.publicInterface=this.setPublicInterface(),this.invalidElements=[],this.currentValidationType=null,this.element=!1===this.settings.element? b:this.settings.element,a=this.getElementsByTagName(this.element,"input, select, textarea"),this.validate=this.getElementsByAttributeAsObject(a,"data-validate"),this.validate.length=this.extend(this.validate.length,this.getElementsByAttribute(a,"data-length")),this.element.addEventListener("submit",this.deadValidation.bind(this)),this.element.addEventListener("change",this.liveValidation.bind(this)),this.element.addEventListener("DOMNodeInserted",this.nodeInserted.bind(this)),this.publicInterface): new Salvation(a,c,b)};Salvation.prototype={setPublicInterface:function(){var a=new RegExp(/(\{\s\})|(\{\})/),c={};for(property in this.settings)if("function"==typeof this.settings[property]&&"function"==typeof this[property])if(a.test(this.settings[property]))c[property]=this[property];else{var b=this.createDefaultMethodName(property);c[property]=this.settings[property];c[b]=this[property]}c.stylings=this.stylings;return c},createDefaultMethodName:function(a){return/[A-Z]/.test(a.charAt(0))?"default"+ a:"default"+a.charAt(0).toUpperCase()+a.substring(1)},splitStringByComma:function(a){return a.replace(/\s/g,"").split(",")},extend:function(a,c){a=a||{};for(var b in c)c.hasOwnProperty(b)&&(a[b]=c[b]);return a},deadValidation:function(a){0<this.invalidElements.length&&a.preventDefault();for(var c in this.validate){var b=this.getElementsByPattern(this.validate[c],this.patterns[c],c);0<b.length&&(this.invalidElements=b,a.preventDefault(),this.publicInterface.onInvalidation(b,this.legends[c]))}},liveValidation:function(a){a= a.target;this.checkElementByPattern(a)?(-1<this.invalidElements.indexOf(a)&&this.invalidElements.splice(this.invalidElements.indexOf(a),1),this.publicInterface.onValidation([a])):(-1===this.invalidElements.indexOf(a)&&this.invalidElements.push(a),this.publicInterface.onInvalidation([a],this.legends[this.currentValidationType]||this.legends.unknown))},nodeInserted:function(a){if(a.relatedNode===this.element){var c=a.target.getAttribute("data-validate");if(null!==c)for(var c=this.splitStringByComma(c), b=0;b<c.length;b++){var d=c[b];void 0!==d&&null!==d&&this.validate[d].push(a.target)}a.target.hasAttribute("data-length")&&-1===this.validate.length.indexOf(a.target)&&this.validate.length.push(a.target)}},onInvalidation:function(a,c){a=a||[];for(var b=0;b<a.length;b++)!1===a[b].classList.contains(this.stylings.error)&&a[b].classList.add(this.stylings.error),c=a[b].getAttribute("data-label")||c,a[b].parentNode.setAttribute("data-hint",c),0===b&&a[b].focus()},onValidation:function(a){a=a||[];for(var c= 0;c<a.length;c++)a[c].classList.contains(this.stylings.error)&&(a[c].classList.remove(this.stylings.error),a[c].parentNode.removeAttribute("data-hint"))},getElementsByTagName:function(a,c){return-1===c.indexOf(",")?a.getElementsByTagName(c):a.querySelectorAll(c)},getElementsByAttribute:function(a,c,b){var d=[];b=b||null;for(i=0;i<a.length;i++)null!==b?a[i].getAttribute(c)===b&&d.push(a[i]):null!==a[i].getAttribute(c)&&d.push(a[i]);return d},getElementsByAttributes:function(a,c,b){var d=[];b=b||null; c=this.splitStringByComma(c);for(i=0;i<a.length;i++)for(x=0;x<c.length;x++)null===b?a[i].getAttribute(c[x])!==b&&-1===d.indexOf(a[i])&&d.push(a[i]):a[i].getAttribute(c[x])===b&&-1===d.indexOf(a[i])&&d.push(a[i]);return d},getElementsByAttributeAsObject:function(a,c){var b={};for(i=0;i<a.length;i++){var d=a[i].getAttribute(c);if(void 0!==d&&null!==d)for(var d=this.splitStringByComma(d),f=0;f<d.length;f++){var e=d[f];if(void 0!==e&&null!==e){if(void 0===b[e]||b[e].constructor!==Array)b[e]=[];b[e].push(a[i])}}}return b}, getElementsByValue:function(a,c){for(var b=[],d=0;d<a.length;d++)a[d].value===c&&b.push(a[d]);return b},getElementsByPattern:function(a,c,b){var d=[];if("length"===b)for(var f=0;f<a.length;f++){if(""!==a[f].value){b=a[f].getAttribute("data-length");var e=a[f].getAttribute("data-format");if("max"===e)if(/^([0-9]$)/.test(b))var g=new RegExp(c.replace("X,Y","0,"+b));else continue;else if("min"===e)if(/^([0-9]$)/.test(b))g=new RegExp(c.replace("X,Y",b+","));else continue;else if(/^([0-9]\,[0-9]$)/.test(b))g= new RegExp(c.replace("X,Y",b));else if(/^([0-9]\,$)/.test(b))g=new RegExp(c.replace("X,Y",b));else if(/^([0-9]$)/.test(b))g=new RegExp(c.replace("X,Y","0,"+b));else continue;!1===g.test(a[f].value)&&d.push(a[f])}}else if("date"===b)for(c=new RegExp(/([\W])/),f=0;f<a.length;f++){var n=a[f].value;if(!(1>n.length)&&(e=a[f].getAttribute("data-format"),null===e&&(e=this.settings.dateFormat),null!==(g=c.exec(e)))){for(var l=e.split(g[0]),m=n.split(g[0]),e=[],h="^(",k=0;k<l.length;k++)b=l[k][0].toUpperCase(), e[b]=m[k],b="Y"!==b?"1,"+l[k].length:l[k].length,h+="\\d{"+b+"}",l.length>k+1&&(h+="\\"+g[0]);h+=")$";!1===(new RegExp(h)).test(n)?d.push(a[f]):(2==e.Y.length&&(e.Y=(new Date).getFullYear().toString().substr(0,2)+e.Y),e.M=e.M.replace(/^0/,""),e.D=e.D.replace(/^0/,""),b=new Date(e.Y,e.M-1,e.D),b.getFullYear()+""+(b.getMonth()+1)+""+b.getDate()!==e.Y+""+e.M+""+e.D&&d.push(a[f]))}}else for(g=new RegExp(c),f=0;f<a.length;f++)!1===g.test(a[f].value)&&("required"===b||"required"!==b&&0<a[f].value.length)&& d.push(a[f]);return d},checkElementByPattern:function(a){var c=[a],b=a.getAttribute("data-validate")||null;invalidElement=[];if(null!==b)for(var b=this.splitStringByComma(b),d=0;d<b.length;d++)if(invalidElement=this.getElementsByPattern(c,this.patterns[b[d]],b[d]),0<invalidElement.length)return this.currentValidationType=b[d],!1;if(null===a.getAttribute("data-length")||null!==b&&-1!==b.indexOf("length"))return!0;b="length";invalidElement=this.getElementsByPattern(c,this.patterns[b],b);return 0<invalidElement.length? !1:!0}}})();