(function(A){A.ketchup={defaults:{attribute:"data-validate",validateIndicator:"validate",eventIndicator:"on",validateEvents:"blur",validateElements:["input","textarea","select"],createErrorContainer:null,showErrorContainer:null,hideErrorContainer:null,addErrorMessages:null},dataNames:{validationString:"ketchup-validation-string",validations:"ketchup-validations",events:"ketchup-events",elements:"ketchup-validation-elements",container:"ketchup-container"},validations:{},helpers:{},validation:function(){var B,D,C=arguments[1];if(typeof C=="function"){D=C}else{B=C;D=arguments[2]}this.validations[arguments[0]]={message:B,func:D,init:arguments[3]||function(F,E){}};return this},message:function(B,C){this.addMessage(B,C);return this},messages:function(B){for(name in B){this.addMessage(name,B[name])}return this},addMessage:function(B,C){if(this.validations[B]){this.validations[B].message=C}},helper:function(B,C){this.helpers[B]=C;return this},init:function(D,E,F){this.options=E;var C=this,B=this.initFunctions().initFields(D,F);B.each(function(){var G=A(this);C.bindValidationEvent(D,G).callInitFunctions(D,G)});D.data(this.dataNames.elements,B);this.bindFormSubmit(D)},initFunctions:function(){var D=this.options,B=["createErrorContainer","showErrorContainer","hideErrorContainer","addErrorMessages"];for(f=0;f<B.length;f++){var C=B[f];if(!D[C]){D[C]=this[C]}}return this},initFields:function(C,E){var D=this,F=this.dataNames,B=A(!E?this.fieldsFromForm(C):this.fieldsFromObject(C,E));B.each(function(){var G=A(this),H=D.extractValidations(G.data(F.validationString),D.options.validateIndicator);G.data(F.validations,H)});return B},callInitFunctions:function(C,B){var D=B.data(this.dataNames.validations);for(i=0;i<D.length;i++){D[i].init.apply(this.helpers,[C,B])}},fieldsFromForm:function(E){var F=this,H=this.options,G=this.dataNames,C=H.validateElements,B=[];C=typeof C=="string"?[C]:C;for(i=0;i<C.length;i++){var D=E.find(C[i]+"["+H.attribute+"*="+H.validateIndicator+"]");D.each(function(){var I=A(this),K=I.attr(H.attribute),J=F.extractEvents(K,H.eventIndicator);I.data(G.validationString,K).data(G.events,J?J:H.validateEvents)});B.push(D.get())}return this.normalizeArray(B)},fieldsFromObject:function(B,C){var D=this.options,I=this.dataNames,F=[];for(s in C){var H,E;if(typeof C[s]=="string"){H=C[s];E=D.validateEvents}else{H=C[s][0];E=C[s][1]}var G=B.find(s);H=this.mergeValidationString(G,H);E=this.mergeEventsString(G,E);G.data(I.validationString,D.validateIndicator+"("+H+")").data(I.events,E);F.push(G.get())}return this.normalizeArray(F)},mergeEventsString:function(C,E){var F=C.data(this.dataNames.events),B="";if(F){var D=F.split(" ");for(i=0;i<D.length;i++){if(E.indexOf(D[i])==-1){B+=" "+D[i]}}}return A.trim(E+B)},mergeValidationString:function(H,C){var E=this.options,I=H.data(this.dataNames.validationString),G=function(J){var K=J.name;if(J.arguments.length){K=K+"("+J.arguments.join(",")+")"}return K},D=function(J,K){for(i=0;i<J.length;i++){if(J[i].name==K.name){return true}}};if(I){var F=this.extractValidations(E.validateIndicator+"("+C+")",E.validateIndicator),B=this.extractValidations(I,E.validateIndicator);C="";for(o=0;o<B.length;o++){C+=G(B[o])+","}for(n=0;n<F.length;n++){if(!D(B,F[n])){C+=G(F[n])+","}}}return C},bindFormSubmit:function(B){var C=this,D=this.options;B.submit(function(){return C.allFieldsValid(B,true)})},allFieldsValid:function(C,B){var D=this,E=true;C.data(this.dataNames.elements).each(function(){var F=A(this);if(D.validateElement(F,C)!=true){if(B==true){D.triggerValidationEvents(F)}E=false}});C.trigger("formIs"+(E?"Valid":"Invalid"),[C]);return E},bindValidationEvent:function(D,B){var E=this,G=this.options,F=this.dataNames,C=B.data(F.events).split(" ");for(i=0;i<C.length;i++){B.bind("ketchup."+C[i],function(){var I=E.validateElement(B,D),H=B.data(F.container);if(I!=true){if(!H){H=G.createErrorContainer(D,B);B.data(F.container,H)}G.addErrorMessages(D,B,H,I);G.showErrorContainer(D,B,H)}else{G.hideErrorContainer(D,B,H)}});this.bindValidationEventBridge(B,C[i])}return this},bindValidationEventBridge:function(B,C){B.bind(C,function(){B.trigger("ketchup."+C)})},validateElement:function(C,D){var E=[],F=C.data(this.dataNames.validations),B=[D,C,C.val()];for(i=0;i<F.length;i++){if(!F[i].func.apply(this.helpers,B.concat(F[i].arguments))){E.push(F[i].message)}}D.trigger("fieldIs"+(E.length?"Invalid":"Valid"),[D,C]);return E.length?E:true},elementIsValid:function(B){var D=this.dataNames;if(B.data(D.validations)){var C=B.parentsUntil("form").last().parent();return(this.validateElement(B,C)==true?true:false)}else{if(B.data(D.elements)){return this.allFieldsValid(B)}}return null},triggerValidationEvents:function(B){var C=B.data(this.dataNames.events).split(" ");for(var D=0;D<C.length;D++){B.trigger("ketchup."+C[D])}},extractValidations:function(E,G){var K=E.substr(E.indexOf(G)+G.length+1),H="",C=[],F=0,N=[];K=K.split("");for(var B=0;B<K.length;B++){switch(K[B]){case"(":H+="(";F++;break;case")":if(F){H+=")";F--}else{C.push(A.trim(H))}break;case",":if(F){H+=","}else{C.push(A.trim(H));H=""}break;default:H+=K[B];break}}for(v=0;v<C.length;v++){var I=C[v].indexOf("("),L=C[v],M=[];if(I!=-1){L=A.trim(C[v].substr(0,I));M=A.map(C[v].substr(L.length).split(","),function(O){return A.trim(O.replace("(","").replace(")",""))})}var J=this.validations[L];if(J&&J.message){var D=J.message;for(a=1;a<=M.length;a++){D=D.replace("{arg"+a+"}",M[a-1])}N.push({name:L,arguments:M,func:J.func,message:D,init:J.init})}}return N},extractEvents:function(D,B){var E=false,C=D.indexOf(B+"(");if(C!=-1){E=D.substr(C+B.length+1).split(")")[0]}return E},normalizeArray:function(C){var B=[];for(i=0;i<C.length;i++){for(e=0;e<C[i].length;e++){if(C[i][e]){B.push(C[i][e])}}}return B},createErrorContainer:function(D,C){if(typeof D=="function"){this.defaults.createErrorContainer=D;return this}else{var B=C.offset();return A("<div/>",{html:"<ul></ul><span></span>","class":"ketchup-error",css:{top:B.top,left:B.left+C.outerWidth()-20}}).appendTo("body")}},showErrorContainer:function(D,C,B){if(typeof D=="function"){this.defaults.showErrorContainer=D;return this}else{if(B!=null){B.show().animate({top:C.offset().top-B.height(),opacity:1},"fast")}}},hideErrorContainer:function(D,C,B){if(typeof D=="function"){this.defaults.hideErrorContainer=D;return this}else{if(B!=null){B.animate({top:C.offset().top,opacity:0},"fast",function(){B.hide()})}}},addErrorMessages:function(E,C,B,F){if(typeof E=="function"){this.defaults.addErrorMessages=E;return this}else{var D=B.children("ul");D.html("");for(i=0;i<F.length;i++){A("<li/>",{text:F[i]}).appendTo(D)}}}};A.fn.ketchup=function(D,C){var B=A(this);if(typeof D=="string"){switch(D){case"validate":A.ketchup.triggerValidationEvents(B);break;case"isValid":return A.ketchup.elementIsValid(B);break}}else{this.each(function(){A.ketchup.init(B,A.extend({},A.ketchup.defaults,D),C)})}return this}})(jQuery);
