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