var LiveValidation=function(b,a){this.initialize(b,a)};LiveValidation.VERSION="1.4 standalone";LiveValidation.TEXTAREA=1;LiveValidation.TEXT=2;LiveValidation.PASSWORD=3;LiveValidation.CHECKBOX=4;LiveValidation.SELECT=5;LiveValidation.FILE=6;LiveValidation.massValidate=function(){return true};
LiveValidation.prototype={validClass:"LV_valid",warnClass:"LV_warn",invalidClass:"LV_invalid",messageClass:"LV_validation_message",validFieldClass:"LV_valid_field",warnFieldClass:"LV_warn_field",invalidFieldClass:"LV_invalid_field",initialize:function(b,a){var c=this;if(!b)throw Error("LiveValidation::initialize - No element reference or element id has been provided!");this.element=b.nodeName?b:document.getElementById(b);if(!this.element)throw Error("LiveValidation::initialize - No element with reference or id of '"+
b+"' exists!");this.validations=[];this.elementType=this.getElementType();this.form=this.element.form;var d=a||{};this.validMessage=d.validMessage||"";var e=d.insertAfterWhatNode||this.element;this.insertAfterWhatNode=e.nodeType?e:document.getElementById(e);this.onValid=d.onValid||function(){this.insertMessage(this.createMessageSpan());this.addFieldClass()};this.onInvalid=d.onInvalid||function(){this.insertMessage(this.createMessageSpan());this.addFieldClass()};this.onlyOnBlur=d.onlyOnBlur||false;
this.wait=d.wait||0;this.onlyOnSubmit=d.onlyOnSubmit||false;if(this.form){this.formObj=LiveValidationForm.getInstance(this.form);this.formObj.addField(this)}this.oldOnFocus=this.element.onfocus||function(){};this.oldOnBlur=this.element.onblur||function(){};this.oldOnClick=this.element.onclick||function(){};this.oldOnChange=this.element.onchange||function(){};this.oldOnKeyup=this.element.onkeyup||function(){};this.element.onfocus=function(f){c.doOnFocus(f);return c.oldOnFocus.call(this,f)};if(!this.onlyOnSubmit)switch(this.elementType){case LiveValidation.CHECKBOX:this.element.onclick=
function(f){c.validate();return c.oldOnClick.call(this,f)};case LiveValidation.SELECT:case LiveValidation.FILE:this.element.onchange=function(f){c.validate();return c.oldOnChange.call(this,f)};break;default:if(!this.onlyOnBlur)this.element.onkeyup=function(f){c.deferValidation();return c.oldOnKeyup.call(this,f)};this.element.onblur=function(f){c.doOnBlur(f);return c.oldOnBlur.call(this,f)}}},destroy:function(){if(this.formObj){this.formObj.removeField(this);this.formObj.destroy()}this.element.onfocus=
this.oldOnFocus;if(!this.onlyOnSubmit)switch(this.elementType){case LiveValidation.CHECKBOX:this.element.onclick=this.oldOnClick;case LiveValidation.SELECT:case LiveValidation.FILE:this.element.onchange=this.oldOnChange;break;default:if(!this.onlyOnBlur)this.element.onkeyup=this.oldOnKeyup;this.element.onblur=this.oldOnBlur}this.validations=[];this.removeMessageAndFieldClass()},add:function(b,a){this.validations.push({type:b,params:a||{}});return this},remove:function(b,a){for(var c=false,d=0,e=this.validations.length;d<
e;d++)if(this.validations[d].type==b)if(this.validations[d].params==a){c=true;break}c&&this.validations.splice(d,1);return this},deferValidation:function(){this.wait>=300&&this.removeMessageAndFieldClass();var b=this;this.timeout&&clearTimeout(b.timeout);this.timeout=setTimeout(function(){b.validate()},b.wait)},doOnBlur:function(b){this.focused=false;this.validate(b)},doOnFocus:function(){this.focused=true;this.removeMessageAndFieldClass()},getElementType:function(){switch(true){case this.element.nodeName.toUpperCase()==
"TEXTAREA":return LiveValidation.TEXTAREA;case this.element.nodeName.toUpperCase()=="INPUT"&&this.element.type.toUpperCase()=="TEXT":return LiveValidation.TEXT;case this.element.nodeName.toUpperCase()=="INPUT"&&this.element.type.toUpperCase()=="PASSWORD":return LiveValidation.PASSWORD;case this.element.nodeName.toUpperCase()=="INPUT"&&this.element.type.toUpperCase()=="CHECKBOX":return LiveValidation.CHECKBOX;case this.element.nodeName.toUpperCase()=="INPUT"&&this.element.type.toUpperCase()=="FILE":return LiveValidation.FILE;
case this.element.nodeName.toUpperCase()=="SELECT":return LiveValidation.SELECT;case this.element.nodeName.toUpperCase()=="INPUT":if(this.element.type=="radio input")throw Error("LiveValidation::getElementType - Cannot use LiveValidation on an "+this.element.type+" input!");return false;default:if(this.element.type=="radio input")throw Error("LiveValidation::getElementType - Element must be an input, select, or textarea!");return false}},doValidations:function(){for(var b=this.validMessage,a=0,c=
this.validationStatus=0,d=this.validations.length;c<d;++c){a=this.validations[c];switch(a.type){case Validate.Presence:case Validate.Confirmation:case Validate.Acceptance:this.displayMessageWhenEmpty=true;a=this.validateElement(a.type,a.params);break;default:a=this.validateElement(a.type,a.params)}if(a<0)b=this.message;this.validationStatus=!a?0:this.validationStatus<0?this.validationStatus:a;if(!this.validationStatus)return this.validationStatus}this.message=b;return this.validationStatus},validateElement:function(b,
a){var c=this.elementType==LiveValidation.SELECT?this.element.options[this.element.selectedIndex].value:this.element.value;c=c.replace(/^\s+|\s+$/g,"");if(b==Validate.Acceptance){if(this.elementType!=LiveValidation.CHECKBOX)throw Error("LiveValidation::validateElement - Element to validate acceptance must be a checkbox!");c=this.element.checked}var d=1;try{b(c,a)}catch(e){if(e instanceof Validate.Error){if(c!==""||c===""&&this.displayMessageWhenEmpty){this.validationStatus=0;this.message=e.message;
d=0}}else if(e instanceof Validate.Warning){if(c!==""||c===""&&this.displayMessageWhenEmpty){this.validationStatus=-1;this.message=e.message;d=-1}}else throw e;}finally{this.element.value=c;return d}},validate:function(){if(this.element.disabled)return true;else if(this.doValidations()){this.onValid();return true}else{this.onInvalid();return false}},enable:function(){this.element.disabled=false;return this},disable:function(){this.element.disabled=true;this.removeMessageAndFieldClass();return this},
createMessageSpan:function(){if(this.message==null||String(this.message).length==0)return null;var b=document.createElement("span"),a=document.createTextNode(this.message);b.appendChild(a);return b},insertMessage:function(b){this.removeMessage();if(b!=null)if(this.displayMessageWhenEmpty&&(this.elementType==LiveValidation.CHECKBOX||this.element.value=="")||this.element.value!=""){b.className+=" "+this.messageClass+" "+(!this.validationStatus?this.invalidClass:this.validationStatus>0?this.validClass:
this.warnClass);if(this.insertAfterWhatNode.nextSibling)this.insertAfterWhatNode.parentNode.insertBefore(b,this.insertAfterWhatNode.nextSibling);else try{this.insertAfterWhatNode.parentNode.appendChild(b)}catch(a){}}},addFieldClass:function(){this.removeFieldClass();if(this.validationStatus)if(this.validationStatus>0){if(this.displayMessageWhenEmpty||this.element.value!="")if(this.element.className.indexOf(this.validFieldClass)==-1)this.element.className+=" "+this.validFieldClass}else{if(this.element.className.indexOf(this.invalidFieldClass)==
-1)this.element.className+=" "+this.warnFieldClass}else if(this.element.className.indexOf(this.invalidFieldClass)==-1)this.element.className+=" "+this.invalidFieldClass},removeMessage:function(){for(var b,a=this.insertAfterWhatNode;a.nextSibling;){if(a.nextSibling.nodeType===1){b=a.nextSibling;break}a=a.nextSibling}b&&b.className.indexOf(this.messageClass)!=-1&&this.insertAfterWhatNode.parentNode.removeChild(b)},removeFieldClass:function(){if(this.element.className.indexOf(this.invalidFieldClass)!=
-1)this.element.className=this.element.className.split(this.invalidFieldClass).join("");if(this.element.className.indexOf(this.validFieldClass)!=-1)this.element.className=this.element.className.split(this.validFieldClass).join(" ")},removeMessageAndFieldClass:function(){this.removeMessage();this.removeFieldClass()}};var LiveValidationForm=function(b){this.initialize(b)};LiveValidationForm.instances={};
LiveValidationForm.getInstance=function(b){var a=Math.random()*Math.random();if(!b.id)b.id="formId_"+a.toString().replace(/\./,"")+(new Date).valueOf();LiveValidationForm.instances[b.id]||(LiveValidationForm.instances[b.id]=new LiveValidationForm(b));return LiveValidationForm.instances[b.id]};
LiveValidationForm.prototype={initialize:function(b){this.name=b.id;this.element=b;this.fields=[];this.oldOnSubmit=this.element.onsubmit||function(){};var a=this;this.element.onsubmit=function(c){LiveValidation.massValidate(a.fields)&&a.oldOnSubmit.call(this,c||window.event);return true}},addField:function(b){this.fields.push(b)},removeField:function(b){for(var a=[],c=0,d=this.fields.length;c<d;c++)this.fields[c]!==b&&a.push(this.fields[c]);this.fields=a},destroy:function(b){if(this.fields.length!=
0&&!b)return false;this.element.onsubmit=this.oldOnSubmit;LiveValidationForm.instances[this.name]=null;return true}};
var Validate={Presence:function(b,a){a=a||{};var c=a.failureMessage||"Can't be empty!";if(b===""||b===null||b===undefined)Validate.fail(c);return true},Numericality:function(b,a){var c=b;b=Number(b);a=a||{};var d=a.minimum||a.minimum==0?a.minimum:null,e=a.maximum||a.maximum==0?a.maximum:null,f=a.is||a.is==0?a.is:null,h=a.notANumberMessage||"Must be a number!",g=a.notAnIntegerMessage||"Must be an integer!",k=a.wrongNumberMessage||"Must be "+f+"!",i=a.tooLowMessage||"Must not be less than "+d+"!",j=
a.tooHighMessage||"Must not be more than "+e+"!";isFinite(b)||Validate.fail(h);if(a.onlyInteger&&(/\.0+$|\.$/.test(String(c))||b!=parseInt(b)))Validate.fail(g);switch(true){case f!==null:b!=Number(f)&&Validate.fail(k);break;case d!==null&&e!==null:Validate.Numericality(b,{tooLowMessage:i,minimum:d});Validate.Numericality(b,{tooHighMessage:j,maximum:e});break;case d!==null:b<Number(d)&&Validate.fail(i);break;case e!==null:b>Number(e)&&Validate.fail(j)}return true},Format:function(b,a){b=String(b);
a=a||{};var c=a.failureMessage||"Not valid!",d=a.pattern||/./,e=a.negate||false;!e&&!d.test(b)&&Validate.fail(c);e&&d.test(b)&&Validate.fail(c);return true},Email:function(b,a){a=a||{};Validate.Format(b,{failureMessage:a.failureMessage||"Must be a valid email address!",pattern:/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i});return true},Length:function(b,a){b=String(b);a=a||{};var c=a.minimum||a.minimum==0?a.minimum:null,d=a.maximum||a.maximum==0?a.maximum:null,e=a.is||a.is==0?a.is:null,f=a.wrongLengthMessage||
"Must be "+e+" characters long!",h=a.tooShortMessage||"Must not be less than "+c+" characters long!",g=a.tooLongMessage||"Must not be more than "+d+" characters long!";switch(true){case e!==null:b.length!=Number(e)&&Validate.fail(f);break;case c!==null&&d!==null:Validate.Length(b,{tooShortMessage:h,minimum:c});Validate.Length(b,{tooLongMessage:g,maximum:d});break;case c!==null:b.length<Number(c)&&Validate.fail(h);break;case d!==null:b.length>Number(d)&&Validate.fail(g);break;default:throw Error("Validate::Length - Length(s) to validate against must be provided!");
}return true},Inclusion:function(b,a){a=a||{};var c=a.failureMessage||"Please enter a valid state.",d=a.caseSensitive===false?false:true;if(a.allowNull&&b==null)return true;!a.allowNull&&b==null&&Validate.fail(c);var e=a.within||[];if(!d){d=[];for(var f=0,h=e.length;f<h;++f){var g=e[f];if(typeof g=="string")g=g.toLowerCase();d.push(g)}e=d;if(typeof b=="string")b=b.toLowerCase()}d=false;f=0;for(h=e.length;f<h;++f){if(e[f]==b)d=true;if(a.partialMatch)if(b.indexOf(e[f])!=-1)d=true}if(!a.negate&&!d||
a.negate&&d)Validate.fail(c);return true},Exclusion:function(b,a){a=a||{};a.failureMessage=a.failureMessage||"Must not be included in the list!";a.negate=true;Validate.Inclusion(b,a);return true},Confirmation:function(b,a){if(!a.match)throw Error("Validate::Confirmation - Error validating confirmation: Id of element to match must be provided!");a=a||{};var c=a.failureMessage||"Does not match!",d=a.match.nodeName?a.match:document.getElementById(a.match);if(!d)throw Error("Validate::Confirmation - There is no reference with name of, or element with id of '"+
a.match+"'!");b!=d.value&&Validate.fail(c);return true},Acceptance:function(b,a){a=a||{};var c=a.failureMessage||"Must be accepted!";b||Validate.fail(c);return true},Custom:function(b,a){a=a||{};var c=a.failureMessage||"Not valid!";(a.against||function(){return true})(b,a.args||{})||Validate.fail(c);return true},now:function(b,a,c){if(!b)throw Error("Validate::now - Validation function must be provided!");var d=true;try{b(a,c||{})}catch(e){if(e instanceof Validate.Error)d=false;else throw e;}finally{return d}},
fail:function(b){throw new Validate.Error(b);},Error:function(b){this.message=b;this.name="ValidationError"}};
