var LiveValidation=Class.create();Object.extend(LiveValidation,{VERSION:"1.3 prototype",TEXTAREA:1,TEXT:2,PASSWORD:3,CHECKBOX:4,SELECT:5,FILE:6,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,a){if(!c){throw new Error("LiveValidation::initialize - No element reference or element id has been provided!")}this.element=$(c);if(!this.element){throw new Error("LiveValidation::initialize - No element with reference or id of '"+c+"' exists!")}this.elementType=this.getElementType();this.validations=[];this.form=this.element.form;this.options=Object.extend({validMessage:"Thankyou!",onValid:function(){this.insertMessage(this.createMessageSpan());this.addFieldClass()},onInvalid:function(){this.insertMessage(this.createMessageSpan());this.addFieldClass()},insertAfterWhatNode:this.element,onlyOnBlur:false,wait:0,onlyOnSubmit:false},a||{});var b=this.options.insertAfterWhatNode||this.element;this.options.insertAfterWhatNode=$(b);Object.extend(this,this.options);if(this.form){this.formObj=LiveValidationForm.getInstance(this.form);this.formObj.addField(this)}this.boundFocus=this.doOnFocus.bindAsEventListener(this);Event.observe(this.element,"focus",this.boundFocus);if(!this.onlyOnSubmit){switch(this.elementType){case LiveValidation.CHECKBOX:this.boundClick=this.validate.bindAsEventListener(this);Event.observe(this.element,"click",this.boundClick);case LiveValidation.SELECT:case LiveValidation.FILE:this.boundChange=this.validate.bindAsEventListener(this);Event.observe(this.element,"change",this.boundChange);break;default:if(!this.onlyOnBlur){this.boundKeyup=this.deferValidation.bindAsEventListener(this);Event.observe(this.element,"keyup",this.boundKeyup)}this.boundBlur=this.validate.bindAsEventListener(this);Event.observe(this.element,"blur",this.boundBlur)}}},destroy:function(){if(this.formObj){this.formObj.removeField(this);this.formObj.destroy()}Event.stopObserving(this.element,"focus",this.boundFocus);if(!this.onlyOnSubmit){switch(this.elementType){case LiveValidation.CHECKBOX:Event.stopObserving(this.element,"click",this.boundClick);case LiveValidation.SELECT:case LiveValidation.FILE:Event.stopObserving(this.element,"change",this.boundChange);break;default:if(!this.onlyOnBlur){Event.stopObserving(this.element,"keyup",this.boundKeyup)}Event.stopObserving(this.element,"blur",this.boundBlur)}}this.validations=[];this.removeMessageAndFieldClass()},add:function(a,b){this.validations.push({type:a,params:b||{}});return this},remove:function(a,b){this.validations=this.validations.reject(function(c){return(c.type==a&&c.params==b)});return this},deferValidation:function(a){if(this.wait>=300){this.removeMessageAndFieldClass()}if(this.timeout){clearTimeout(this.timeout)}this.timeout=setTimeout(this.validate.bind(this),this.wait)},doOnBlur:function(){this.focused=false;this.validate()},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"):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();var a=this.validationFailed?this.invalidClass:this.validClass;if((this.displayMessageWhenEmpty&&(this.elementType==LiveValidation.CHECKBOX||this.element.value==""))||this.element.value!=""){$(b).addClassName(this.messageClass+(" "+a));if(nxtSibling=this.insertAfterWhatNode.nextSibling){this.insertAfterWhatNode.parentNode.insertBefore(b,nxtSibling)}else{this.insertAfterWhatNode.parentNode.appendChild(b)}}},addFieldClass:function(){this.removeFieldClass();if(!this.validationFailed){if(this.displayMessageWhenEmpty||this.element.value!=""){if(!this.element.hasClassName(this.validFieldClass)){this.element.addClassName(this.validFieldClass)}}}else{if(!this.element.hasClassName(this.invalidFieldClass)){this.element.addClassName(this.invalidFieldClass)}}},removeMessage:function(){if(nxtEl=this.insertAfterWhatNode.next("."+this.messageClass)){nxtEl.remove()}},removeFieldClass:function(){this.element.removeClassName(this.invalidFieldClass);this.element.removeClassName(this.validFieldClass)},removeMessageAndFieldClass:function(){this.removeMessage();this.removeFieldClass()}};var LiveValidationForm=Class.create();Object.extend(LiveValidationForm,{instances:{},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(a){this.element=$(a);this.fields=[];this.oldOnSubmit=this.element.onsubmit||function(){};this.element.onsubmit=function(b){var c=(LiveValidation.massValidate(this.fields))?this.oldOnSubmit.call(this.element,b)!==false:false;if(!c){Event.stop(b)}}.bindAsEventListener(this)},addField:function(a){this.fields.push(a)},removeField:function(a){this.fields=this.fields.without(a)},destroy:function(a){if(this.fields.length!=0&&!a){return false}this.element.onsubmit=this.oldOnSubmit;LiveValidationForm.instances[this.element.id]=null;return true}};var Validate={Presence:function(a,c){var b=Object.extend({failureMessage:"Can't be empty!"},c||{});if(a===""||a===null||a===undefined){Validate.fail(b.failureMessage)}return true},Numericality:function(d,c){var a=d;var d=Number(d);var c=c||{};var b={notANumberMessage:c.notANumberMessage||"Must be a number!",notAnIntegerMessage:c.notAnIntegerMessage||"Must be an integer!",wrongNumberMessage:c.wrongNumberMessage||"Must be "+c.is+"!",tooLowMessage:c.tooLowMessage||"Must not be less than "+c.minimum+"!",tooHighMessage:c.tooHighMessage||"Must not be more than "+c.maximum+"!",is:((c.is)||(c.is==0))?c.is:null,minimum:((c.minimum)||(c.minimum==0))?c.minimum:null,maximum:((c.maximum)||(c.maximum==0))?c.maximum:null,onlyInteger:c.onlyInteger||false};if(!isFinite(d)){Validate.fail(b.notANumberMessage)}if(b.onlyInteger&&((/\.0+$|\.$/.test(String(a)))||(d!=parseInt(d)))){Validate.fail(b.notAnIntegerMessage)}switch(true){case (b.is!==null):if(d!=Number(b.is)){Validate.fail(b.wrongNumberMessage)}break;case (b.minimum!==null&&b.maximum!==null):Validate.Numericality(d,{tooLowMessage:b.tooLowMessage,minimum:b.minimum});Validate.Numericality(d,{tooHighMessage:b.tooHighMessage,maximum:b.maximum});break;case (b.minimum!==null):if(d<Number(b.minimum)){Validate.fail(b.tooLowMessage)}break;case (b.maximum!==null):if(d>Number(b.maximum)){Validate.fail(b.tooHighMessage)}break}return true},Format:function(a,c){var a=String(a);var b=Object.extend({failureMessage:"Not valid!",pattern:/./,negate:false},c||{});if(!b.negate&&!b.pattern.test(a)){Validate.fail(b.failureMessage)}if(b.negate&&b.pattern.test(a)){Validate.fail(b.failureMessage)}return true},Email:function(a,c){var b=Object.extend({failureMessage:"Must be a valid email address!"},c||{});Validate.Format(a,{failureMessage:b.failureMessage,pattern:/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i});return true},Length:function(a,c){var a=String(a);var c=c||{};var b={wrongLengthMessage:c.wrongLengthMessage||"Must be "+c.is+" characters long!",tooShortMessage:c.tooShortMessage||"Must not be less than "+c.minimum+" characters long!",tooLongMessage:c.tooLongMessage||"Must not be more than "+c.maximum+" characters long!",is:((c.is)||(c.is==0))?c.is:null,minimum:((c.minimum)||(c.minimum==0))?c.minimum:null,maximum:((c.maximum)||(c.maximum==0))?c.maximum:null};switch(true){case (b.is!==null):if(a.length!=Number(b.is)){Validate.fail(b.wrongLengthMessage)}break;case (b.minimum!==null&&b.maximum!==null):Validate.Length(a,{tooShortMessage:b.tooShortMessage,minimum:b.minimum});Validate.Length(a,{tooLongMessage:b.tooLongMessage,maximum:b.maximum});break;case (b.minimum!==null):if(a.length<Number(b.minimum)){Validate.fail(b.tooShortMessage)}break;case (b.maximum!==null):if(a.length>Number(b.maximum)){Validate.fail(b.tooLongMessage)}break;default:throw new Error("Validate::Length - Length(s) to validate against must be provided!")}return true},Inclusion:function(d,c){var b=Object.extend({failureMessage:"Must be included in the list!",within:[],allowNull:false,partialMatch:false,caseSensitive:true,negate:false},c||{});if(b.allowNull&&d==null){return true}if(!b.allowNull&&d==null){Validate.fail(b.failureMessage)}if(!b.caseSensitive){var a=[];b.within.each(function(f){if(typeof f=="string"){f=f.toLowerCase()}a.push(f)});b.within=a;if(typeof d=="string"){d=d.toLowerCase()}}var e=(b.within.indexOf(d)==-1)?false:true;if(b.partialMatch){e=false;b.within.each(function(f){if(d.indexOf(f)!=-1){e=true}})}if((!b.negate&&!e)||(b.negate&&e)){Validate.fail(b.failureMessage)}return true},Exclusion:function(a,c){var b=Object.extend({failureMessage:"Must not be included in the list!",within:[],allowNull:false,partialMatch:false,caseSensitive:true},c||{});b.negate=true;Validate.Inclusion(a,b);return true},Confirmation:function(a,c){if(!c.match){throw new Error("Validate::Confirmation - Error validating confirmation: Id of element to match must be provided!")}var b=Object.extend({failureMessage:"Does not match!",match:null},c||{});b.match=$(c.match);if(!b.match){throw new Error("Validate::Confirmation - There is no reference with name of, or element with id of '"+b.match+"'!")}if(a!=b.match.value){Validate.fail(b.failureMessage)}return true},Acceptance:function(a,c){var b=Object.extend({failureMessage:"Must be accepted!"},c||{});if(!a){Validate.fail(b.failureMessage)}return true},Custom:function(a,c){var b=Object.extend({against:function(){return true},args:{},failureMessage:"Not valid!"},c||{});if(!b.against(a,b.args)){Validate.fail(b.failureMessage)}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}},Error:function(a){this.message=a;this.name="ValidationError"},fail:function(a){throw new Validate.Error(a)}};