/*
 * Inline Form Validation Engine 2.2.4, jQuery plugin
 *
 * Copyright(c) 2010, Cedric Dugas
 * http://www.position-absolute.com
 *
 * 2.0 Rewrite by Olivier Refalo
 * http://www.crionics.com
 *
 * Form validation engine allowing custom regex rules to be added.
 * Licensed under the MIT License
 */

;(function(g){var f={init:function(a){if(!this.data("jqv")||this.data("jqv")==null)f._saveOptions(this,a),g(".formError").live("click",function(){g(this).fadeOut(150,function(){g(this).remove()})});return this},attach:function(a){a=a?f._saveOptions(this,a):this.data("jqv");this.find("[data-validation-engine*=validate]");if(!a.binded)a.bindMethod=="bind"?(this.find("[class*=validate]").not("[type=checkbox]").not("[type=radio]").not(".datepicker").bind(a.validationEventTrigger,f._onFieldEvent),this.find("[class*=validate][type=checkbox],[class*=validate][type=radio]").bind("click",
f._onFieldEvent),this.find("[class*=validate][class*=datepicker]").bind(a.validationEventTrigger,{delay:300},f._onFieldEvent),this.bind("submit",f._onSubmitEvent)):a.bindMethod=="live"&&(this.find("[class*=validate]").not("[type=checkbox]").not(".datepicker").live(a.validationEventTrigger,f._onFieldEvent),this.find("[class*=validate][type=checkbox]").live("click",f._onFieldEvent),this.find("[class*=validate][class*=datepicker]").live(a.validationEventTrigger,{delay:300},f._onFieldEvent),this.live("submit",
f._onSubmitEvent)),a.binded=true,a.autoPositionUpdate&&g(window).bind("resize",{noAnimation:true,formElem:this},f.updatePromptsPosition);return this},detach:function(){var a=this.data("jqv");a.binded&&(this.find("[class*=validate]").not("[type=checkbox]").unbind(a.validationEventTrigger,f._onFieldEvent),this.find("[class*=validate][type=checkbox],[class*=validate][type=radio]").unbind("click",f._onFieldEvent),this.unbind("submit",f.onAjaxFormComplete),this.find("[class*=validate]").not("[type=checkbox]").die(a.validationEventTrigger,
f._onFieldEvent),this.find("[class*=validate][type=checkbox]").die("click",f._onFieldEvent),this.die("submit",f.onAjaxFormComplete),this.removeData("jqv"),a.autoPositionUpdate&&g(window).unbind("resize",f.updatePromptsPosition));return this},validate:function(){return f._validateFields(this)},validateField:function(a){var b=g(this).data("jqv"),a=f._validateField(g(a),b);if(b.onSuccess&&b.InvalidFields.length==0)b.onSuccess();else if(b.onFailure&&b.InvalidFields.length>0)b.onFailure();return a},validateform:function(){return f._onSubmitEvent.call(this)},
updatePromptsPosition:function(a){if(a&&this==window)var b=a.data.formElem,c=a.data.noAnimation;else b=g(this.closest("form"));var d=b.data("jqv");b.find("[class*=validate]").not(":hidden").not(":disabled").each(function(){var a=g(this),b=f._getPrompt(a),m=g(b).find(".formErrorContent").html();b&&f._updatePrompt(a,g(b),m,void 0,false,d,c)});return this},showPrompt:function(a,b,c,d){var e=this.closest("form").data("jqv");e||(e=f._saveOptions(this,e));if(c)e.promptPosition=c;e.showArrow=d==true;f._showPrompt(this,
a,b,false,e);return this},hidePrompt:function(){var a="."+f._getClassName(g(this).attr("id"))+"formError";g(a).fadeTo("fast",0.3,function(){g(this).remove()});return this},hide:function(){var a;a=g(this).is("form")?"parentForm"+g(this).attr("id"):g(this).attr("id")+"formError";g("."+a).fadeTo("fast",0.3,function(){g(this).remove()});return this},hideAll:function(){g(".formError").fadeTo("fast",0.3,function(){g(this).remove()});return this},_onFieldEvent:function(a){var b=g(this),c=b.closest("form").data("jqv");
window.setTimeout(function(){f._validateField(b,c);if(c.InvalidFields.length==0&&c.onSuccess)c.onSuccess();else if(c.InvalidFields.length>0&&c.onFailure)c.onFailure()},a.data?a.data.delay:0)},_onSubmitEvent:function(){var a=g(this),b=a.data("jqv"),c=f._validateFields(a,true);if(c&&b.ajaxFormValidation)return f._validateFormWithAjax(a,b),false;return b.onValidationComplete?(b.onValidationComplete(a,c),false):c},_checkAjaxStatus:function(a){var b=true;g.each(a.ajaxValidCache,function(a,d){if(!d)return b=
false});return b},_validateFields:function(a,b){var c=a.data("jqv"),d=false;a.trigger("jqv.form.validating");var e=null;a.find("[class*=validate]").not(":hidden").not(":disabled").each(function(){var a=g(this);d|=f._validateField(a,c,b);a.focus();if(c.doNotShowAllErrosOnSubmit)return false;d&&e==null&&(e=a)});a.trigger("jqv.form.result",[d]);if(d){if(c.scroll){var h=e.offset().top,m=e.offset().left,j=c.promptPosition;typeof j=="string"&&j.indexOf(":")!=-1&&(j=j.substring(0,j.indexOf(":")));if(j!=
"bottomRight"&&j!="bottomLeft")h=f._getPrompt(e).offset().top;g("html:not(:animated),body:not(:animated)").animate({scrollTop:h,scrollLeft:m},1100,function(){c.focusFirstField&&e.focus()});c.isOverflown&&(j=g(c.overflownDIV),m=j.scrollTop(),j=-parseInt(j.offset().top),h+=m+j-5,g(c.overflownDIV+":not(:animated)").animate({scrollTop:h},1100))}else c.focusFirstField&&e.focus();return false}return true},_validateFormWithAjax:function(a,b){var c=a.serialize(),d=b.ajaxFormValidationURL?b.ajaxFormValidationURL:
a.attr("action");g.ajax({type:"GET",url:d,cache:false,dataType:"json",data:c,form:a,methods:f,options:b,beforeSend:function(){return b.onBeforeAjaxFormValidation(a,b)},error:function(a,b){f._ajaxError(a,b)},success:function(c){if(c!==true){for(var d=false,m=0;m<c.length;m++){var j=c[m],k=g(g("#"+j[0])[0]);if(k.length==1){var i=j[2];if(j[1]==true)if(i==""||!i)f._closePrompt(k);else{if(b.allrules[i])(j=b.allrules[i].alertTextOk)&&(i=j);f._showPrompt(k,i,"pass",false,b,true)}else{d|=1;if(b.allrules[i])(j=
b.allrules[i].alertText)&&(i=j);f._showPrompt(k,i,"",false,b,true)}}}b.onAjaxFormComplete(!d,a,c,b)}else b.onAjaxFormComplete(true,a,"",b)}})},_validateField:function(a,b,c){a.attr("id")||g.error("jQueryValidate: an ID attribute is required for this field: "+a.attr("name")+" class:"+a.attr("class"));var d=/validate\[(.*)\]/.exec(a.attr("class"));if(!d)return false;var e=d[1].split(/\[|,|\]/),d=false,h=a.attr("name"),m="",j=false;b.isError=false;b.showArrow=true;for(var k=g(a.closest("form")),i=0;i<
e.length;i++){e[i]=e[i].replace(" ","");var l=void 0;switch(e[i]){case "required":j=true;l=f._required(a,e,i,b);break;case "custom":l=f._customRegex(a,e,i,b);break;case "groupRequired":var n="[class*="+e[i+1]+"]",o=k.find(n).eq(0);if(o[0]!=a[0]){f._validateField(o,b,c);b.showArrow=true;continue}(l=f._groupRequired(a,e,i,b))&&(j=true);b.showArrow=false;break;case "ajax":c||(f._ajax(a,e,i,b),d=true);break;case "minSize":l=f._minSize(a,e,i,b);break;case "maxSize":l=f._maxSize(a,e,i,b);break;case "min":l=
f._min(a,e,i,b);break;case "max":l=f._max(a,e,i,b);break;case "past":l=f._past(a,e,i,b);break;case "future":l=f._future(a,e,i,b);break;case "dateRange":n="[class*="+e[i+1]+"]";o=k.find(n).eq(0);n=k.find(n).eq(1);if(o[0].value||n[0].value)l=f._dateRange(o,n,e,i,b);l&&(j=true);b.showArrow=false;break;case "dateTimeRange":n="[class*="+e[i+1]+"]";o=k.find(n).eq(0);n=k.find(n).eq(1);if(o[0].value||n[0].value)l=f._dateTimeRange(o,n,e,i,b);l&&(j=true);b.showArrow=false;break;case "maxCheckbox":l=f._maxCheckbox(k,
a,e,i,b);a=g(k.find("input[name='"+h+"']"));break;case "minCheckbox":l=f._minCheckbox(k,a,e,i,b);a=g(k.find("input[name='"+h+"']"));break;case "equals":l=f._equals(a,e,i,b);break;case "funcCall":l=f._funcCall(a,e,i,b)}if(l!==void 0)m+=l+"<br/>",b.isError=true}if(!j&&a.val()=="")b.isError=false;c=a.prop("type");if((c=="radio"||c=="checkbox")&&k.find("input[name='"+h+"']").size()>1)a=g(k.find("input[name='"+h+"'][type!=hidden]:first")),b.showArrow=false;if(c=="text"&&k.find("input[name='"+h+"']").size()>
1)a=g(k.find("input[name='"+h+"'][type!=hidden]:first")),b.showArrow=false;b.isError?f._showPrompt(a,m,"",false,b):d||f._closePrompt(a);d||a.trigger("jqv.field.result",[a,b.isError,m]);c=g.inArray(a[0],b.InvalidFields);c==-1?b.isError&&b.InvalidFields.push(a[0]):b.isError||b.InvalidFields.splice(c,1);return b.isError},_required:function(a,b,c,d){switch(a.prop("type")){default:if(!a.val())return d.allrules[b[c]].alertText;break;case "radio":case "checkbox":var e=a.closest("form"),a=a.attr("name");
if(e.find("input[name='"+a+"']:checked").size()==0)return e.find("input[name='"+a+"']").size()==1?d.allrules[b[c]].alertTextCheckboxe:d.allrules[b[c]].alertTextCheckboxMultiple;break;case "select-one":if(!a.val())return d.allrules[b[c]].alertText;break;case "select-multiple":if(!a.find("option:selected").val())return d.allrules[b[c]].alertText}},_groupRequired:function(a,b,c,d){var e="[class*="+b[c+1]+"]",h=false;a.closest("form").find(e).each(function(){if(!f._required(g(this),b,c,d))return h=true,
false});if(!h)return d.allrules[b[c]].alertText},_customRegex:function(a,b,c,d){b=b[c+1];if(c=d.allrules[b])if(c=c.regex){if(!RegExp(c).test(a.val()))return d.allrules[b].alertText}else alert("jqv:custom regex not found "+b);else alert("jqv:custom rule not found "+b)},_funcCall:function(a,b,c,d){var e=b[c+1],e=window[e]||d.customFunctions[e];if(typeof e=="function")return e(a,b,c,d)},_equals:function(a,b,c,d){b=b[c+1];if(a.val()!=g("#"+b).val())return d.allrules.equals.alertText},_maxSize:function(a,
b,c,d){b=b[c+1];if(a.val().length>b)return a=d.allrules.maxSize,a.alertText+b+a.alertText2},_minSize:function(a,b,c,d){b=b[c+1];if(a.val().length<b)return a=d.allrules.minSize,a.alertText+b+a.alertText2},_min:function(a,b,c,d){b=parseFloat(b[c+1]);if(parseFloat(a.val())<b)return a=d.allrules.min,a.alertText2?a.alertText+b+a.alertText2:a.alertText+b},_max:function(a,b,c,d){b=parseFloat(b[c+1]);if(parseFloat(a.val())>b)return a=d.allrules.max,a.alertText2?a.alertText+b+a.alertText2:a.alertText+b},_past:function(a,
b,c,d){b=b[c+1];b=b.toLowerCase()=="now"?new Date:f._parseDate(b);if(f._parseDate(a.val())<b)return a=d.allrules.past,a.alertText2?a.alertText+f._dateToString(b)+a.alertText2:a.alertText+f._dateToString(b)},_future:function(a,b,c,d){b=b[c+1];b=b.toLowerCase()=="now"?new Date:f._parseDate(b);if(f._parseDate(a.val())>b)return a=d.allrules.future,a.alertText2?a.alertText+f._dateToString(b)+a.alertText2:a.alertText+f._dateToString(b)},_isDate:function(a){return RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/).test(a)?
true:false},_isDateTime:function(a){return RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/).test(a)?true:
false},_dateCompare:function(a,b){return new Date(a.toString())<new Date(b.toString())},_dateRange:function(a,b,c,d,e){if(!a[0].value&&b[0].value||a[0].value&&!b[0].value)return e.allrules[c[d]].alertText+e.allrules[c[d]].alertText2;if(!f._isDate(a[0].value)||!f._isDate(b[0].value))return e.allrules[c[d]].alertText+e.allrules[c[d]].alertText2;if(!f._dateCompare(a[0].value,b[0].value))return e.allrules[c[d]].alertText+e.allrules[c[d]].alertText2},_dateTimeRange:function(a,b,c,d,e){if(!a[0].value&&
b[0].value||a[0].value&&!b[0].value)return e.allrules[c[d]].alertText+e.allrules[c[d]].alertText2;if(!f._isDateTime(a[0].value)||!f._isDateTime(b[0].value))return e.allrules[c[d]].alertText+e.allrules[c[d]].alertText2;if(!f._dateCompare(a[0].value,b[0].value))return e.allrules[c[d]].alertText+e.allrules[c[d]].alertText2},_maxCheckbox:function(a,b,c,d,e){c=c[d+1];b=b.attr("name");if(a.find("input[name='"+b+"']:checked").size()>c)return e.showArrow=false,e.allrules.maxCheckbox.alertText2?e.allrules.maxCheckbox.alertText+
" "+c+" "+e.allrules.maxCheckbox.alertText2:e.allrules.maxCheckbox.alertText},_minCheckbox:function(a,b,c,d,e){c=c[d+1];b=b.attr("name");if(a.find("input[name='"+b+"']:checked").size()<c)return e.showArrow=false,e.allrules.minCheckbox.alertText+" "+c+" "+e.allrules.minCheckbox.alertText2},_ajax:function(a,b,c,d){var e=d.allrules[b[c+1]],b=e.extraData,c=e.extraDataDynamic;b||(b="");if(c){for(var h=[],m=String(c).split(","),c=0;c<m.length;c++){var j=m[c];if(g(j).length){var k=a.closest("form").find(j).val(),
j=j.replace("#","")+"="+escape(k);h.push(j)}}c=h.join("&")}else c="";d.isError||g.ajax({type:"GET",url:e.url,cache:false,dataType:"json",data:"fieldId="+a.attr("id")+"&fieldValue="+a.val()+"&extraData="+b+"&"+c,field:a,rule:e,methods:f,options:d,beforeSend:function(){var b=e.alertTextLoad;b&&f._showPrompt(a,b,"load",true,d)},error:function(a,b){f._ajaxError(a,b)},success:function(a){var b=a[0],c=g(g("#"+b)[0]);if(c.length==1){var h=a[2];if(a[1]){d.ajaxValidCache[b]!==void 0&&(d.ajaxValidCache[b]=
true);if(h){if(d.allrules[h])(a=d.allrules[h].alertTextOk)&&(h=a)}else h=e.alertTextOk;h?f._showPrompt(c,h,"pass",true,d):f._closePrompt(c)}else{d.ajaxValidCache[b]=false;d.isError=true;if(h){if(d.allrules[h])(a=d.allrules[h].alertText)&&(h=a)}else h=e.alertText;f._showPrompt(c,h,"",true,d)}}c.trigger("jqv.field.result",[c,!d.isError,h])}})},_ajaxError:function(a,b){a.status==0&&b==null?alert("The page is not served from a server! ajax call failed"):typeof console!="undefined"&&console.log("Ajax error: "+
a.status+" "+b)},_dateToString:function(a){return a.getFullYear()+"-"+(a.getMonth()+1)+"-"+a.getDate()},_parseDate:function(a){var b=a.split("-");b==a&&(b=a.split("/"));return new Date(b[0],b[1]-1,b[2])},_showPrompt:function(a,b,c,d,e,g){var m=f._getPrompt(a);g&&(m=false);m?f._updatePrompt(a,m,b,c,d,e):f._buildPrompt(a,b,c,d,e)},_buildPrompt:function(a,b,c,d,e){var h=g("<div>");h.addClass(f._getClassName(a.attr("id"))+"formError");a.is(":input")&&h.addClass("parentForm"+f._getClassName(a.parents("form").attr("id")));
h.addClass("formError");switch(c){case "pass":h.addClass("greenPopup");break;case "load":h.addClass("blackPopup");break;default:e.InvalidCount++}d&&h.addClass("ajaxed");g("<div>").addClass("formErrorContent").html(b).appendTo(h);if(e.showArrow)switch(b=g("<div>").addClass("formErrorArrow"),c=a.data("promptPosition")||e.promptPosition,typeof c=="string"&&c.indexOf(":")!=-1&&(c=c.substring(0,c.indexOf(":"))),c){case "bottomLeft":case "bottomRight":h.find(".formErrorContent").before(b);b.addClass("formErrorArrowBottom").html('<div class="line1"><\!-- --\></div><div class="line2"><\!-- --\></div><div class="line3"><\!-- --\></div><div class="line4"><\!-- --\></div><div class="line5"><\!-- --\></div><div class="line6"><\!-- --\></div><div class="line7"><\!-- --\></div><div class="line8"><\!-- --\></div><div class="line9"><\!-- --\></div><div class="line10"><\!-- --\></div>');
break;case "topLeft":case "topRight":b.html('<div class="line10"><\!-- --\></div><div class="line9"><\!-- --\></div><div class="line8"><\!-- --\></div><div class="line7"><\!-- --\></div><div class="line6"><\!-- --\></div><div class="line5"><\!-- --\></div><div class="line4"><\!-- --\></div><div class="line3"><\!-- --\></div><div class="line2"><\!-- --\></div><div class="line1"><\!-- --\></div>'),h.append(b)}e.isOverflown?a.before(h):g("body").append(h);e=f._calculatePosition(a,h,e);h.css({top:e.callerTopPosition,
left:e.callerleftPosition,marginTop:e.marginTopSize,opacity:0}).data("callerField",a);return h.animate({opacity:0.87})},_updatePrompt:function(a,b,c,d,e,g,m){b&&(typeof d!=="undefined"&&(d=="pass"?b.addClass("greenPopup"):b.removeClass("greenPopup"),d=="load"?b.addClass("blackPopup"):b.removeClass("blackPopup")),e?b.addClass("ajaxed"):b.removeClass("ajaxed"),b.find(".formErrorContent").html(c),a=f._calculatePosition(a,b,g),css={top:a.callerTopPosition,left:a.callerleftPosition,marginTop:a.marginTopSize},
m?b.css(css):b.animate(css))},_closePrompt:function(a){var b=f._getPrompt(a);b&&b.fadeTo("fast",0,function(){b.remove()})},closePrompt:function(a){return f._closePrompt(a)},_getPrompt:function(a){a=f._getClassName(a.attr("id"))+"formError";if(a=g("."+f._escapeExpression(a))[0])return g(a)},_escapeExpression:function(a){return a.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g,"\\$1")},_calculatePosition:function(a,b,c){var d,e,f=a.width(),g=b.height(),j=c.isOverflown;j?(b=d=0,e=-g):(d=a.offset(),b=
d.top,d=d.left,e=0);var c=a.data("promptPosition")||c.promptPosition,k="",i="",l=i=0;typeof c=="string"&&c.indexOf(":")!=-1&&(k=c.substring(c.indexOf(":")+1),c=c.substring(0,c.indexOf(":")),k.indexOf(",")!=-1&&(i=k.substring(k.indexOf(",")+1),k=k.substring(0,k.indexOf(",")),l=parseInt(i),isNaN(l)&&(l=0)),i=parseInt(k),isNaN(k));switch(c){default:case "topRight":j?d+=f-30:(d+=f-30,b+=-g-2);break;case "topLeft":b+=-g-10;break;case "centerRight":d+=f+13;break;case "bottomLeft":b=b+a.height()+15;break;
case "bottomRight":d+=f-30,b+=a.height()+5}d+=i;b+=l;return{callerTopPosition:b+"px",callerleftPosition:d+"px",marginTopSize:e+"px"}},_saveOptions:function(a,b){if(g.validationEngineLanguage)var c=g.validationEngineLanguage.allRules;else g.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");g.validationEngine.defaults.allrules=c;c=g.extend(true,{},g.validationEngine.defaults,b);a.data("jqv",c);return c},_getClassName:function(a){if(a)return a.replace(":",
"_").replace(".","_")}};g.fn.validationEngine=function(a){var b=g(this);if(!b[0])return false;if(typeof a=="string"&&a.charAt(0)!="_"&&f[a])return a!="showPrompt"&&a!="hidePrompt"&&a!="hide"&&a!="hideAll"&&f.init.apply(b),f[a].apply(b,Array.prototype.slice.call(arguments,1));else if(typeof a=="object"||!a)return f.init.apply(b,arguments),f.attach.apply(b);else g.error("Method "+a+" does not exist in jQuery.validationEngine")};g.validationEngine={defaults:{validationEventTrigger:"blur",scroll:true,
focusFirstField:true,promptPosition:"topRight",bindMethod:"bind",inlineAjax:false,ajaxFormValidation:false,ajaxFormValidationURL:false,onAjaxFormComplete:g.noop,onBeforeAjaxFormValidation:g.noop,onValidationComplete:false,isOverflown:false,overflownDIV:"",doNotShowAllErrosOnSubmit:false,binded:false,showArrow:true,isError:false,ajaxValidCache:{},autoPositionUpdate:false,InvalidFields:[],onSuccess:false,onFailure:false}}})(jQuery);
