var Validate=new Class({getOptions:function(){return{validateOnBlur:true,errorClass:"error",errorMsgClass:"errorMessage",dateFormat:"dd/MM/yy",showErrorsInline:true,label:"Please wait..."}},initialize:function(B,A){this.setOptions(this.getOptions(),A);this.options.onFail=A.onFail||$empty;this.options.onSuccess=A.onSuccess||false;this.form=$(B);this.elements=this.form.getElements(".required");this.list=[];this.elements.each(function(D,C){if(this.options.validateOnBlur){D.addEvent("blur",this.validate.bind(this,D))}}.bind(this));this.form.addEvent("submit",function(E){var C=new Event(E);var D=true;this.elements.each(function(G,F){if(!this.validate(G)){C.stop();D=false;this.list.include(G)}else{this.list.erase(G)}}.bind(this));if(D){if(this.options.onSuccess){C.stop();this.options.onSuccess(this.form)}else{this.form.getElement("input[type=submit]").setProperty("value",this.options.label)}}else{this.options.onFail(this.getList())}}.bind(this))},getList:function(){var A=new Element("ul");this.list.each(function(D,C){if(D.title!=""){var B=new Element("li").injectInside(A);new Element("label").setProperty("for",D.id).appendText(D.title).injectInside(B)}});return A},validate:function(C){var E=true;this.clearMsg(C);switch(C.type){case"text":case"password":case"textarea":case"select-one":if(C.value!=""){if(C.hasClass("email")){var F=/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/;if(C.value.toUpperCase().match(F)){E=true}else{E=false;this.setMsg(C,"Enter a valid email address")}}if(C.hasClass("number")){var G=/[-+]?[0-9]*\.?[0-9]+/;if(C.value.match(G)){E=true}else{E=false;this.setMsg(C,"Enter a valid number")}}if(C.hasClass("postcode")){var D=/^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/;if(C.value.match(D)){E=true}else{E=false;this.setMsg(C,"Enter a valid postcode")}}if(C.hasClass("date")){var H=Date.parseExact(C.value,this.options.dateFormat);if(H!=null){E=true}else{E=false;this.setMsg(C,"Enter a valid date in the format: "+this.options.dateFormat.toLowerCase())}}}else{E=false;this.setMsg(C)}break;case"checkbox":if(!C.checked){E=false;this.setMsg(C)}else{E=true}break;case"radio":var A=$A(this.form[C.name]);var B=false;A.each(function(J,I){if(J.checked){B=true}});if(!B){E=false;this.setMsg(A.getLast(),"Select an option")}else{E=true;this.clearMsg(A.getLast())}break}return E},setMsg:function(A,B){if(B==undefined){B=A.title}if(this.options.showErrorsInline){if(A.error==undefined){A.error=new Element("span").addClass(this.options.errorMsgClass).appendText(B).injectAfter(A)}else{A.error.appendText(B)}A.addClass(this.options.errorClass)}},clearMsg:function(A){A.removeClass(this.options.errorClass);if(A.error!=undefined){A.error.destroy();A.error=undefined}}});Validate.implement(new Options);Validate.implement(new Events);