You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1 lines
7.6 KiB

(function(e,t,n,i){e.fn.form=function(t,n){var a,r=e(this),o=e.extend(!0,{},e.fn.form.settings,n),s=e.extend({},e.fn.form.settings.defaults,t),l="."+o.namespace,c=("module-"+o.namespace,r.selector||""),u=(new Date).getTime(),d=[],f=arguments[0],m="string"==typeof f,p=[].slice.call(arguments,1);return r.each(function(){var t,n=e(this),g=e(this).find(o.selector.field),h=e(this).find(o.selector.group),v=e(this).find(o.selector.message),y=(e(this).find(o.selector.prompt),e(this).find(o.selector.submit)),b=[],x=this,w=n.data("module-"+o.namespace),C=o.namespace,z=o.metadata,k=o.className,P=o.errors;t={initialize:function(){t.verbose("Initializing form validation"),o.keyboardShortcuts&&g.on("keydown"+l,t.event.field.keydown),n.on("submit"+l,t.validate.form),g.on("change"+l,t.event.field.change),y.on("click"+l,t.submit)},destroy:function(){n.off(C)},refresh:function(){g=n.find(o.selector.field)},submit:function(){t.verbose("Submitting form",n),n.submit()},event:{field:{keydown:function(n){var a=e(this),r=n.which,s={enter:13,escape:27};return r==s.escape&&(t.verbose("Escape key pressed blurring field"),a.blur()),r==s.enter&&a.is(o.selector.input)?(t.debug("Enter key pressed, submitting form"),y.addClass(k.down),a.one("keyup"+l,t.event.field.keyup),n.preventDefault(),!1):i},keyup:function(){t.verbose("Doing keyboard shortcut form submit"),y.removeClass(k.down),t.submit()},change:function(){var n=e(this),i=n.closest(h);i.hasClass(k.error)?(t.debug("Revalidating field",n,t.get.validation(n)),t.validate.field(t.get.validation(n))):"change"==o.on&&t.validate.field(t.get.validation(n))}}},get:{field:function(n){return t.verbose("Finding field with identifier",n),g.filter("#"+n).size()>0?g.filter("#"+n):g.filter('[name="'+n+'"]').size()>0?g.filter('[name="'+n+'"]'):g.filter("[data-"+z.validate+'="'+n+'"]').size()>0?g.filter("[data-"+z.validate+'="'+n+'"]'):e("<input/>")},validation:function(n){var i;return e.each(s,function(e,a){t.get.field(a.identifier).get(0)==n.get(0)&&(i=a)}),i||!1}},has:{field:function(e){return t.verbose("Checking for existence of a field with identifier",e),g.filter("#"+e).size()>0?!0:g.filter('[name="'+e+'"]').size()>0?!0:g.filter("[data-"+z.validate+'="'+e+'"]').size()>0?!0:!1}},add:{prompt:function(e,n){var i=t.get.field(e.identifier),a=i.closest(h),r=a.find(o.selector.prompt),s=0!==r.size();t.verbose("Adding inline validation prompt"),a.addClass(k.error),o.inlineError&&(s||(r=o.templates.prompt(n),r.appendTo(a).hide()),r.html(n[0]),r.is(":not(:visible)")&&r.fadeIn(o.animateSpeed))},errors:function(e){t.debug("Adding form error messages",e),v.html(o.templates.error(e))}},remove:{prompt:function(e){var n=t.get.field(e.identifier),i=n.closest(h),a=h.find(a);i.removeClass(k.error),o.inlineError&&a.hide()}},validate:{form:function(i){var a=!0;b=[],e.each(s,function(e,n){t.validate.field(n)||(a=!1)}),a?(n.removeClass(k.error).addClass(k.success),e.proxy(o.onSuccess,this)(i)):(n.addClass(k.error),o.inlineError||t.add.errors(b),e.proxy(o.onFailure,this)(b))},field:function(n){var a=t.get.field(n.identifier),r=!0,s=[];return n.rules!==i&&e.each(n.rules,function(e,i){t.has.field(n.identifier)&&!t.validate.rule(n,i)&&(t.debug("Field is invalid",n.identifier,i.type),s.push(i.prompt),r=!1)}),r?(t.remove.prompt(n,s),e.proxy(o.onValid,a)(),!0):(b=b.concat(s),t.add.prompt(n,s),e.proxy(o.onInvalid,a)(s),!1)},rule:function(a,r){var s,l,c=t.get.field(a.identifier),u=r.type,d=c.val(),f=/\[(.*?)\]/i,m=f.exec(u),p=!0;return m!==i&&null!=m?(s=m[1],l=u.replace(m[0],""),p=e.proxy(o.rules[l],n)(d,s)):p="checked"==u?c.filter(":checked").size()>0:o.rules[u](d),p}},setting:function(t,n){return n===i?o[t]:(e.isPlainObject(t)?e.extend(!0,o,t):o[t]=n,i)},internal:function(n,a){return a===i?t[n]:(e.isPlainObject(n)?e.extend(!0,t,n):t[n]=a,i)},debug:function(){o.debug&&(o.performance?t.performance.log(arguments):t.debug=Function.prototype.bind.call(console.info,console,o.moduleName+":"))},verbose:function(){o.verbose&&o.debug&&(o.performance?t.performance.log(arguments):t.verbose=Function.prototype.bind.call(console.info,console,o.moduleName+":"))},error:function(){t.error=Function.prototype.bind.call(console.log,console,o.moduleName+":")},performance:{log:function(e){var n,i,a;o.performance&&(n=(new Date).getTime(),a=u||n,i=n-a,u=n,d.push({Element:x,Name:e[0],Arguments:e[1]||"None","Execution Time":i}),clearTimeout(t.performance.timer),t.performance.timer=setTimeout(t.performance.display,100))},display:function(){var t=o.moduleName,n=(o.moduleName+": "+c+"("+r.size()+" elements)",0);c&&(t+=" Performance ("+c+")"),(console.group!==i||console.table!==i)&&d.length>0&&(console.groupCollapsed(t),console.table?(e.each(d,function(e,t){n+=t["Execution Time"]}),console.table(d)):e.each(d,function(e,t){n+=t["Execution Time"]}),console.log("Total Execution Time:",n+"ms"),console.groupEnd(),d=[],u=!1)}},invoke:function(n,a,r){var o,s;return a=a||p,r=x||r,"string"==typeof n&&w!==i&&(n=n.split("."),o=n.length-1,e.each(n,function(n,a){return e.isPlainObject(w[a])&&n!=o?(w=w[a],!0):w[a]!==i?(s=w[a],!0):(t.error(P.method),!1)})),e.isFunction(s)?(t.verbose("Executing invoked function",s),s.apply(r,a)):s||!1}},m?(w===i&&t.initialize(),a=t.invoke(f)):(w!==i&&t.destroy(),t.initialize())}),a?a:this},e.fn.form.settings={moduleName:"Form",debug:!0,verbose:!0,performance:!0,namespace:"validate",keyboardShortcuts:!0,on:"change",animateSpeed:150,inlineError:!1,onValid:function(){},onInvalid:function(){},onSuccess:function(){return!0},onFailure:function(){return!1},metadata:{validate:"validate"},selector:{message:".error.message",field:"input, textarea, select",group:".field",input:"input",prompt:".prompt",submit:".submit"},className:{error:"error",success:"success",down:"down",label:"ui label prompt"},errors:{method:"The method you called is not defined."},defaults:{firstName:{identifier:"first-name",rules:[{type:"empty",prompt:"Please enter your first name"}]},lastName:{identifier:"last-name",rules:[{type:"empty",prompt:"Please enter your last name"}]},username:{identifier:"username",rules:[{type:"empty",prompt:"Please enter a username"}]},email:{identifier:"email",rules:[{type:"empty",prompt:"Please enter your email"},{type:"email",prompt:"Please enter a valid email"}]},password:{identifier:"password",rules:[{type:"empty",prompt:"Please enter a password"},{type:"length[6]",prompt:"Your password must be at least 6 characters"}]},passwordConfirm:{identifier:"password-confirm",rules:[{type:"empty",prompt:"Please confirm your password"},{identifier:"password-confirm",type:"match[password]",prompt:"Please verify password matches"}]},terms:{identifier:"terms",rules:[{type:"checked",prompt:"You must agree to the terms and conditions"}]}},templates:{error:function(t){var n='<ul class="list">';return e.each(t,function(e,t){n+="<li>"+t+"</li>"}),n+="</ul>",e(n)},prompt:function(t){return e("<div/>").addClass("ui red pointing prompt label").html(t[0])}},rules:{empty:function(e){return!(e===i||""===e)},email:function(e){var t=RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");return t.test(e)},length:function(e,t){return e!==i?e.length>=t:!1},not:function(e,t){return e!=t},is:function(e,t){return e==t},maxLength:function(e,t){return e!==i?t>=e.length:!1},match:function(t,n){var a,r=e(this);return r.find("#"+n).size()>0?a=r.find("#"+n).val():r.find("[name="+n+"]").size()>0?a=r.find("[name="+n+"]").val():r.find('[data-validate="'+n+'"]').size()>0&&(a=r.find('[data-validate="'+n+'"]').val()),a!==i?""+t==""+a:!1},url:function(e){var t=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return t.test(e)}}}})(jQuery,window,document);