!function(a,b,c,d){a.fn.form=function(b,c){var e,f=a(this),g=a.extend(!0,{},a.fn.form.settings,c),h=a.extend({},a.fn.form.settings.defaults,b),i=g.namespace,j=g.metadata,k=g.selector,l=g.className,m=g.error,n="."+i,o="module-"+i,p=f.selector||"",q=(new Date).getTime(),r=[],s=arguments[0],t="string"==typeof s,u=[].slice.call(arguments,1);return f.each(function(){var b,c=a(this),f=a(this).find(k.field),i=a(this).find(k.group),v=a(this).find(k.message),w=(a(this).find(k.prompt),a(this).find(k.submit)),x=[],y=this,z=c.data(o);b={initialize:function(){b.verbose("Initializing form validation",c,h,g),g.keyboardShortcuts&&f.on("keydown"+n,b.event.field.keydown),c.on("submit"+n,b.validate.form),f.on("blur"+n,b.event.field.change),w.on("click"+n,b.submit),b.instantiate()},instantiate:function(){b.verbose("Storing instance of module",b),z=b,c.data(o,b)},destroy:function(){b.verbose("Destroying previous module",z),c.off(n).removeData(o)},refresh:function(){b.verbose("Refreshing selector cache"),f=c.find(k.field)},submit:function(){b.verbose("Submitting form",c),c.submit()},event:{field:{keydown:function(c){var d=a(this),e=c.which,f={enter:13,escape:27};return e==f.escape&&(b.verbose("Escape key pressed blurring field"),d.blur()),e==f.enter&&d.is(k.input)?(b.debug("Enter key pressed, submitting form"),w.addClass(l.down),d.one("keyup"+n,b.event.field.keyup),c.preventDefault(),!1):void 0},keyup:function(){b.verbose("Doing keyboard shortcut form submit"),w.removeClass(l.down),b.submit()},change:function(){var c=a(this),d=c.closest(i);d.hasClass(l.error)?(b.debug("Revalidating field",c,b.get.validation(c)),b.validate.field(b.get.validation(c))):"change"==g.on&&b.validate.field(b.get.validation(c))}}},get:{field:function(c){return b.verbose("Finding field with identifier",c),f.filter("#"+c).size()>0?f.filter("#"+c):f.filter('[name="'+c+'"]').size()>0?f.filter('[name="'+c+'"]'):f.filter("[data-"+j.validate+'="'+c+'"]').size()>0?f.filter("[data-"+j.validate+'="'+c+'"]'):a("")},validation:function(c){var d;return a.each(h,function(a,e){b.get.field(e.identifier).get(0)==c.get(0)&&(d=e)}),d||!1}},has:{field:function(a){return b.verbose("Checking for existence of a field with identifier",a),f.filter("#"+a).size()>0?!0:f.filter('[name="'+a+'"]').size()>0?!0:f.filter("[data-"+j.validate+'="'+a+'"]').size()>0?!0:!1}},add:{prompt:function(a,c){var d=b.get.field(a.identifier),e=d.closest(i),f=e.find(k.prompt),h=0!==f.size();b.verbose("Adding inline validation prompt"),e.addClass(l.error),g.inlineError&&(h||(f=g.templates.prompt(c),f.appendTo(e).hide()),f.html(c[0]),f.is(":not(:visible)")&&f.fadeIn(g.animateSpeed))},errors:function(a){b.debug("Adding form error messages",a),v.html(g.templates.error(a))}},remove:{prompt:function(a){var c=b.get.field(a.identifier),d=c.closest(i),e=d.find(k.prompt);d.removeClass(l.error),g.inlineError&&e.hide()}},validate:{form:function(d){var e=!0;return x=[],a.each(h,function(a,c){b.validate.field(c)||(e=!1)}),e?(b.debug("Form has no validation errors, submitting"),c.removeClass(l.error).addClass(l.success),a.proxy(g.onSuccess,this)(d),void 0):(b.debug("Form has errors"),c.addClass(l.error),g.inlineError||b.add.errors(x),a.proxy(g.onFailure,this)(x))},field:function(c){var e=b.get.field(c.identifier),f=!0,h=[];return c.rules!==d&&a.each(c.rules,function(a,d){b.has.field(c.identifier)&&!b.validate.rule(c,d)&&(b.debug("Field is invalid",c.identifier,d.type),h.push(d.prompt),f=!1)}),f?(b.remove.prompt(c,h),a.proxy(g.onValid,e)(),!0):(x=x.concat(h),b.add.prompt(c,h),a.proxy(g.onInvalid,e)(h),!1)},rule:function(e,f){var h,i,j=b.get.field(e.identifier),k=f.type,l=j.val(),m=/\[(.*?)\]/i,n=m.exec(k),o=!0;return n!==d&&null!==n?(h=n[1],i=k.replace(n[0],""),o=a.proxy(g.rules[i],c)(l,h)):o="checked"==k?j.filter(":checked").size()>0:g.rules[k](l),o}},setting:function(c,e){return b.debug("Changing setting",c,e),e===d?g[c]:(a.isPlainObject(c)?a.extend(!0,g,c):g[c]=e,void 0)},internal:function(c,e){return b.debug("Changing internal",c,e),e===d?b[c]:(a.isPlainObject(c)?a.extend(!0,b,c):b[c]=e,void 0)},debug:function(){g.debug&&(g.performance?b.performance.log(arguments):(b.debug=Function.prototype.bind.call(console.info,console,g.moduleName+":"),b.debug.apply(console,arguments)))},verbose:function(){g.verbose&&g.debug&&(g.performance?b.performance.log(arguments):(b.verbose=Function.prototype.bind.call(console.info,console,g.moduleName+":"),b.verbose.apply(console,arguments)))},error:function(){b.error=Function.prototype.bind.call(console.error,console,g.moduleName+":"),b.error.apply(console,arguments)},performance:{log:function(a){var c,d,e;g.performance&&(c=(new Date).getTime(),e=q||c,d=c-e,q=c,r.push({Element:y,Name:a[0],Arguments:[].slice.call(a,1)||"","Execution Time":d})),clearTimeout(b.performance.timer),b.performance.timer=setTimeout(b.performance.display,100)},display:function(){var c=g.moduleName+":",e=0;q=!1,clearTimeout(b.performance.timer),a.each(r,function(a,b){e+=b["Execution Time"]}),c+=" "+e+"ms",p&&(c+=" '"+p+"'"),(console.group!==d||console.table!==d)&&r.length>0&&(console.groupCollapsed(c),console.table?console.table(r):a.each(r,function(a,b){console.log(b.Name+": "+b["Execution Time"]+"ms")}),console.groupEnd()),r=[]}},invoke:function(c,e,f){var g,h;return e=e||u,f=y||f,"string"==typeof c&&z!==d&&(c=c.split(/[\. ]/),g=c.length-1,a.each(c,function(c,e){return a.isPlainObject(z[e])&&c!=g?(z=z[e],!0):z[e]!==d?(h=z[e],!0):(b.error(m.method),!1)})),a.isFunction(h)?h.apply(f,e):h||!1}},t?(z===d&&b.initialize(),e=b.invoke(s)):(z!==d&&b.destroy(),b.initialize())}),e?e:this},a.fn.form.settings={moduleName:"Form",debug:!0,verbose:!0,performance:!0,namespace:"form",keyboardShortcuts:!0,on:"submit",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"},error:{method:"The method you called is not defined."},templates:{error:function(b){var c='",a(c)},prompt:function(b){return a("
").addClass("ui red pointing prompt label").html(b[0])}},rules:{empty:function(a){return!(a===d||""===a)},email:function(a){var b=new 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 b.test(a)},length:function(a,b){return a!==d?a.length>=b:!1},not:function(a,b){return a!=b},is:function(a,b){return a==b},maxLength:function(a,b){return a!==d?a.length<=b:!1},match:function(b,c){var e,f=a(this);return f.find("#"+c).size()>0?e=f.find("#"+c).val():f.find("[name="+c+"]").size()>0?e=f.find("[name="+c+"]").val():f.find('[data-validate="'+c+'"]').size()>0&&(e=f.find('[data-validate="'+c+'"]').val()),e!==d?b.toString()==e.toString():!1},url:function(a){var b=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return b.test(a)}}}}(jQuery,window,document);