var i, j, formchecker = { result:null, objects:[], object:null, nodeEl:null, errorMessage:"", foundError:false, fieldName:"", formValid:false, init:function(form, args){ args = args==undefined?{}:args; form.submit(function(){ formchecker.result = formchecker.test(this, args.scroll!=undefined?args.scroll:true); this.formValid = formchecker.result; if(args.onError!=undefined && !this.formValid){ args.onError(this); } if(args.onValid!=undefined && this.formValid){ this.formValid = args.onValid({target:this}); this.formValid = this.formValid==true||this.formValid==false?this.formValid:true; } return this.formValid; }); }, test:function(form, scroll){ var error; this.objects = $(form).find("input,select,textarea"); this.foundError = false; for(i=0; i0 && scroll){ errorItem = errorItem[0]; $("html,body").animate({scrollTop:$(errorItem.parentNode).find("input, textarea, select").offset().top - 10}); } } return this.foundError==false; }, filters:{ length:function(data, len){ return data.trim().length>=len; }, number:function(num){ return !isNaN(Number(num)) && num!=""; }, e_mail:function(addr){ return (/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/).test(addr); }, evalFunction:function(func, object){ return eval(func + "(object);") == true; }, checkFormat:function(name, list){ return list!="" && new RegExp("\\.("+list.replace(/\,/g, "|")+")$").test(name); } }, hideError:function(obj){ this.nodeEl = obj.parentNode.getElementsByClassName("error")[0]; if(this.nodeEl!=undefined){ this.nodeEl.parentNode.removeChild(this.nodeEl); } }, showError:function(obj, message){ this.nodeEl = Array.prototype.slice.call(obj.parentNode.getElementsByClassName("error")).filter(function(htEl){ return htEl.errObj==obj; }); this.nodeEl = this.nodeEl[0]; if(message==""){ this.nodeEl!=undefined?this.nodeEl.parentNode.removeChild(this.nodeEl):0; }else{ if(this.nodeEl==undefined){ this.nodeEl = document.createElement("div"); this.nodeEl.className = "error formchecker-error"; this.nodeEl.style.color = "#f00"; this.nodeEl.style.textAlign = "left"; this.nodeEl.style.marginTop = "5px"; this.nodeEl.errObj = obj; obj.parentNode.appendChild(this.nodeEl); } this.nodeEl.innerHTML = ''+message; } }, checkInput:function(element){ var errorMessage = ""; if(element.dataset.type!=undefined && element.disabled==false){ this.fieldName = "this"; if(element.dataset.label!=undefined){ this.fieldName = element.dataset.label; }else if(element.placeholder!=undefined && element.placeholder!=""){ this.fieldName = element.placeholder.toLowerCase(); }else if(element.name!=""){ this.fieldName = element.name.replace(/[^0-9A-Za-z]/gi, " "); } errorMessage = ""; if(element.dataset.type=="string"){ j = element.dataset.minlen!=undefined?element.dataset.minlen:1; if(this.filters.length(element.value, j)==false){ errorMessage = j<=1?"invalid "+this.fieldName+".":this.fieldName+" requires minimum "+j+" letters !"; this.foundError = true; } }else if(element.dataset.type=="number"){ if(element.dataset.allowed!=undefined && element.dataset.allowed!=""){ element.value = element.value.replace(new RegExp(element.dataset.allowed, "gi"), ""); } if(this.filters.number(element.value)==false){ errorMessage = "invalid " + this.fieldName + "."; }else{ var amtmin = element.dataset.min, amtmax = element.dataset.max, amterr=""; amterr = !isNaN(Number(element.dataset.min)) && Number(element.value)Number(element.dataset.max)?(amterr!=""?" and ":"")+"maximum "+element.dataset.max:""; errorMessage = (amterr!=""?this.fieldName+" should be ":"")+amterr; } }else if(element.dataset.type=="email") { if(this.filters.e_mail(element.value)==false){ errorMessage = "invalid " + this.fieldName + "."; } }else if(element.dataset.type=="check") { if(!element.checked){ errorMessage = "please check " + this.fieldName + "."; } }else if(element.dataset.type=="func" && element.dataset.func!=undefined) { if(this.filters.evalFunction(element.dataset.func, element)==false){ errorMessage = "invalid " + this.fieldName + "."; } }else if(element.dataset.type=="files" && element.dataset.extensions!=undefined) { if(this.filters.checkFormat(element.value, element.dataset.extensions)==false){ errorMessage = "invalid " + this.fieldName + "."; } } errorMessage = errorMessage!="" && element.dataset.errormsg!=undefined?element.dataset.errormsg:errorMessage; this.showError(element, errorMessage); } return errorMessage==""; } }; $.fn.formchecker = function(attrs){ attrs = attrs==undefined?{}:attrs; formchecker.init(this, attrs); return $(this); };