/*********************************************************************************************/
/* BlakeMedia Library
/* "Validator" plugin
/*
/* DESC:    	Validates a form.
/* AUTHOR:		Jared Williams (BlakeMedia)
/* VERSION:		1.21
/* CREATED: 	01 December 2014
/* MODIFIED:	01 December 2014
/*
/* (c) Copyright 2002-2014 BlakeMedia & MediaIQ Group PLC
/*********************************************************************************************/
var validator=function(e){function t(){n(),Ft&&a()}function n(){"form"in e&&(G=e.form),"select"in e&&(ot=e.select),"checkon"in e&&(Y=e.checkon),"disable"in e&&(ft=e.disable),"event"in e&&(q=e.event),"showerrors"in e&&(M=e.showerrors),"showhints"in e&&(j=e.showhints),"validdefault"in e&&(V=e.validdefault),"stopinvalid"in e&&(H=e.stopinvalid),"inputs"in e&&(ct=e.inputs),"buttons"in e&&(dt=e.buttons),"onsubmit"in e&&(X=e.onsubmit),"oninputvalid"in e&&(K=e.oninputvalid),"oninputinvalid"in e&&(Q=e.oninputinvalid),"onupdate"in e&&(et=e.onupdate),"onformvalid"in e&&(tt=e.onformvalid),"onforminvalid"in e&&(nt=e.onforminvalid),"custom"in e&&(J=e.custom),"errors"in e&&(W=e.errors),"hints"in e&&(_CustomHints=e.hints),"valid"in e&&(at=e.valid),"invalid"in e&&(rt=e.invalid),"disabled"in e&&(it=e.disabled),"error"in e&&(ut=e.error),"hint"in e&&(st=e.hint),"autoload"in e&&(Ft=e.autoload)}function a(){P=$(),S=$(),Z=$(),i(),c();var e=" (no event specified)";q&&(e=' (event "'+q+'")'),bm.log("Form ready for validating "+e,LOG_NOTICE,z)}function r(){var e="";G?(z.form=$("FORM[name="+G+"]"),e="named "+G):(z.form=$(ot),e="using selector "+ot),z.form.length?(z.form.length>1&&(z.form=$(z.form.get(0))),P=z.form.find(ct),B=z.form.find(dt),P.length?bm.logConsole("Found "+P.length+" inputs in form "+e,LOG_NOTICE,z):bm.logConsole("No inputs in form "+e+"!",LOG_ERROR_FATAL,z)):bm.logConsole("Form "+e+" does not exist!",LOG_ERROR_FATAL,z)}function i(){r(),z.form.submit(function(){z.submit()}),P.each(function(){input=$(this),input.bind(Y,o),input.bind("focus",u),input.bind("blur",s)})}function u(){var e=$(this),t=(e.get(0).tagName.toLowerCase(),e.attr("name")),n=e.attr("data-hint"),a=null;if(!n){rules=l(e);for(var r=0;r<rules.length;r++)n||(n=w(rules[r].type,rules[r].subtype))}if(j&&n){if("radio"==e.attr("type")){var i=$("BODY").find('INPUT[type="radio"][name="'+Elem.attr("name")+'"]'),u=i.last();e=u;var s=u.next("LABEL");s.length&&(e=s)}if("checkbox"==e.attr("type")){var s=Elem.next("LABEL");s.length&&(e=s)}a=z.form.find("."+st+'[data-for="'+t+'"]'),a||(a=$('<div class="'+st+'" data-for="'+t+'"></div>'),a.insertAfter(e)),a.text(n).addClass("on")}}function s(){var e=$(this),t=e.attr("name"),n=z.form.find("."+st+'[data-for="'+t+'"]');n.length&&n.removeClass("on")}function o(){var e=$(this),t=(e.get(0).tagName.toLowerCase(),e.attr("name"),e.val()),n=e.attr("type"),a="",r=e.attr("checked"),i=e.attr("data-validate"),u=!1,s="";if("checkbox"==n&&(r||(r=""),t=r),i){i=l(e);for(var o=0,c=i.length;c>o;o++){n=i[o].type,a=i[o].subtype;{e.attr("data-valid")}if(f(t,n,a)?u=!0:(s=e.attr("data-error"),s||(s=k(n,a)),s||(s=""),u=!1),!u&&H)break}}else V&&(u=!0);u?z.validInput(e):z.invalidInput(e,s)}function c(){z.form.submit(function(e){return e.preventDefault(),!1})}function d(){var e=[],t="";e=Y.split(" "),P.each(function(){for(var n=0,a=e.length;a>n;n++)return t=e[n],void $(this).trigger(t)})}function l(e){var t="",n=[],a=[],r="",i="";if(t=e.attr("data-validate")){t=t.split(" ");for(var u=0;u<t.length;u++)a=t[u].split("-"),r=a[0],i=a[1],n[n.length]={type:r,subtype:i}}return n}function f(e,t,n){var a=!1;if(e){if(t){if(a=I(e,t,n),a===!0||a===!1)return a;switch(t){case"required":return F(e);case"alpha":return v(e);case"num":case"numeric":return h(e);case"int":case"integer":return p(e);case"float":case"decimal":return g(e);case"alphanum":case"alphanumeric":return m(e);case"min":return b(e,n);case"max":return y(e,n);case"email":return C(e);case"url":return D(e);case"phone":return E(e,n);case"currency":return O(e,n);case"checkbox":case"checked":case"tickbox":case"ticked":case"radio":case"selected":return L(e);case"file":case"files":case"upload":return A(e);case"select":case"dropdown":return R(e)}}}else if("required"!=t)return!0;return!1}function F(e){return e.length>0?!0:!1}function m(e){return/^[0-9a-zA-Z\s]+$/.test(e)}function v(e){return/^[a-zA-Z]*$/.test(e)}function h(e){return p(e)||g(e)?!0:!1}function p(e){return/^\d+$/.test(e)}function g(e){return/^-?[0-9]*[.][0-9]+$/.test(e)}function b(e,t){return parseInt(e)>=t?!0:!1}function y(e,t){return parseInt(e)<=t?!0:!1}function C(e){return/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function D(e){return/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(e)}function E(e,t){switch(t&&t.toLowerCase(),t){case"au":default:return/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/.test(e)}return!1}function O(e,t){switch(t){case"us":case"au":case"usd":case"aud":default:return/^[1-9]\d*(((,\d{3}){1})?(\.\d{0,2})?)$/.test(e)}return!1}function L(e){return"checked"==e?!0:!1}function R(e){return""!=e?!0:!1}function A(e){return""!=e?!0:!1}function I(e,t){if(J[t]){var n=J[t];if("object"==typeof n&&"validator"in n)return n.validator(e);if("function"==typeof n)return n(e);bm.logConsole('Invalid custom validation function "'+t+'"!',LOG_ERROR,z)}return null}function k(e,t){var n="";if(n=_(e,t))return n;switch(e){case"alpha":return"Field only accepts letters";case"num":case"numeric":return"Field only accepts numbers";case"float":case"decimal":return"Field only accepts floats";case"int":case"integer":return"Field only accepts integers";case"alphanum":case"alphanumeric":return"Field only accepts letters and numbers";case"email":return"Field only accepts an email address";case"url":return"Field only accepts a valid URL";case"phone":return"Field only accepts a valid phone number";case"currency":return"Field only accepts a valid currency";case"postcode":return"Field only accepts a valid postcode";case"date":return"Field only accepts a valid date";case"day":return"Field only accepts a valid day";case"month":return"Field only accepts a valid month";case"year":return"Field only accepts a valid year";case"checkbox":case"checked":case"tickbox":case"ticked":return"An option must be checked";case"radio":case"selected":return"An option must be selected";case"file":case"files":case"upload":return"You must select a file";case"select":case"dropdown":return"You must select an option";case"required":return"Field is required"}return"Field is invalid"}function _(e){var t,n;if(e){for(n in W)if(n==e)return W[n];for(n in J)if(n==e&&(t=J[n],"object"==typeof t&&"error"in t))return t.error}else bm.logConsole("Invalid custom invalid message type!",LOG_ERROR,z);return""}function x(e,t){var n,a;if(n=e.attr("name"),a=e.attr("type"),rt&&(e.removeClass(at),e.addClass(rt)),M&&t){var r='<div class="'+ut+'" data-for="'+n+'">'+t+"</div>";if("radio"==a){var i=$("BODY").find('INPUT[type="radio"][name="'+n+'"]'),u=i.last();e=u,rt&&(i.removeClass(at),i.addClass(rt));var s=u.next("LABEL");s.length&&(e=s)}if("checkbox"==a){var s=e.next("LABEL");s.length&&(e=s)}var o=z.form.find("."+ut+'[data-for="'+n+'"]');o.length?o.text(t):e.after(r)}Q(e,t)}function U(e){var t=e.attr("name");if(at&&(e.removeClass(rt),e.addClass(at)),"radio"==e.attr("type")){var n=$("BODY").find('INPUT[type="radio"][name="'+t+'"]'),a=n.last();e=a,at&&(n.removeClass(rt),n.addClass(at));var r=a.next("LABEL");r.length&&(e=r)}if("checkbox"==e.attr("type")){var r=e.next("LABEL");r.length&&(e=r)}M&&z.form.find("."+ut+'[data-for="'+t+'"]').remove(),K(e)}function w(e){switch(e){case"alpha":return"Use letters (eg. abcDEf)";case"num":case"numeric":return"Use numbers (eg. 14923)";case"float":case"decimal":return"Use numbers with a decimal (eg. 27.2)";case"int":case"integer":return"Use integers (eg. 80)";case"alphanum":case"alphanumeric":return"Use letters and numbers (eg. port80)";case"email":return"Use a valid email address (eg. foo@bar.com)";case"url":return"Use a valid website URL (eg. http://www.google.com)";case"phone":return"Use a valid phone number (eg. (02) 8773 1929)";case"currency":return"Use a valid money value (eg. $23.12)";case"postcode":return"Use a postcode (eg. 6000)";case"date":return"Use a date (eg. 24-12-1980)";case"day":return"Use a day (eg. 24)";case"month":return"Use a month (eg. 12)";case"year":return"Use a year (eg. 1980)";case"checkbox":case"checked":case"tickbox":case"ticked":return"Check or uncheck an option";case"radio":case"selected":return"Select one of the options";case"file":case"files":case"upload":return"Select a file";case"select":case"dropdown":return"Select an option from the list"}return""}function N(){tt()}function T(){nt()}var z=this;this.instantiated=!1,this.form={length:0};var G="",B=null,Y="change blur",q="processForm",P={},S={},Z={},j=!0,M=!0,V=!0,H=!0,J={},W={},X=function(){},K=function(){},Q=function(){},et=function(){},tt=function(){},nt=function(){},at="valid",rt="invalid",it="disabled",ut="error",st="hint",ot="FORM",ct="INPUT, TEXTAREA, SELECT",dt="BUTTON",lt=!1,ft=!0,Ft=!0;this.about=function(){return{name:"Validator",shortname:"validator",description:"Validates a form.",version:"1.21",library:"2.2",author:"Jared Williams (BlakeMedia)",datecreated:"01 Dec 2014",datemodified:"01 Dec 2014"}},this.setEventName=function(e){q=e},this.getEventName=function(){return q},this.getInput=function(e){var t;return"object"==typeof e?t=e:"string"==typeof e&&(t=P.filter('[name="'+e+'"]'),t.length||(t=P.filter(e))),t.length?t:(bm.log("Failed to get input: not found!",LOG_ERROR,z),$({}))},this.getInputs=function(){return P},this.validInput=function(e){return e=z.getInput(e),S=S.add(e),Z=Z.not(e),input.attr("data-valid","true"),U(e),!0},this.invalidInput=function(e,t){return e=z.getInput(e),S=S.not(e),Z=Z.add(e),input.attr("data-valid","false"),x(e,t),!0},this.resetInput=function(e){return e=z.getInput(e),S=S.add(e),Z=Z.not(e),input.attr("data-valid",""),!0},this.validateForm=function(){d();var e=S.length,t=Z.length;return 0==t?(bm.logConsole("Form valid ("+e+" valid, "+t+" invalid)",LOG_NOTICE,z),N(),!0):(bm.logConsole("Form invalid ("+t+" invalid, "+e+" valid)",LOG_NOTICE,z),T(),!1)},this.validate=function(){return z.validateForm()},this.disable=function(){P.add(B).each(function(){$(this).attr("disabled",!0),$(this).addClass(it),$(this).trigger("disable")}),bm.log("Form inputs disabled",LOG_NOTICE,z)},this.enable=function(){P.add(B).each(function(){$(this).attr("disabled",!1),$(this).removeClass(it)}),bm.log("Form inputs enabled",LOG_NOTICE,z)},this.getInvalidInputs=function(e){return e&&z.validate(),Z},this.getValidInputs=function(e){return e&&z.validate(),S},this.submit=function(){lt=bm.validator.validate(),lt&&(q&&bm.fireEvent(q,G),ft&&z.disable()),X(lt)},this.reassign=function(){bm.logConsole("Re-assigning input events...",LOG_NOTICE,z),i()},this.getCustomRules=function(){return J},this.addCustomRule=function(e,t,n){if(e){if("string"==typeof t){var a=t;t=function(e){return a.test(e)}}if("function"==typeof t)return J[e]=t,W[e]=n,!0;bm.logConsole('Invalid custom validator for "'+e+'"!',LOG_ERROR,z)}else bm.logConsole("Need a name for a custom rule!",LOG_ERROR,z)},this.removeCustomRule=function(e){return e?(delete J[e],!0):void bm.logConsole("Need a name for a custom rule!",LOG_ERROR,z)},t()};