var jpForm=new Class({Implements:[Options,Events],form:null,fields:[],errorMessageContainer:null,submitInfoMessageContainer:null,options:{autoClear:false,valuesToConsiderNull:[],errorMessageContainerTag:"p",errorMessageContainerId:"jpFrmMessage",errorMessage:"Please fill in all the required fields.",submitInfoMessageContainerId:"jpFrmSendingMessage",submittingMessage:"Submitting...",sentMessage:"Thank you, your enquiry has been sent.",sendErrorMessage:"Sorry, an error occured. Please try again later.",autoScrollOnError:false,inlineErrorMsg:true,ajax:false,loadingClass:"loading",sentClass:"sent",autoFocus:true,resetToNull:false,relations:[]},initialize:function(c,a){this.form=$(c);if(!this.form){return}this.setOptions(a);if(this.form.hasClass("jpFrmNoInlineErrorMsg")){this.options.inlineErrorMsg=false}this.errorMessageContainer=$(this.options.errorMessageContainerId);this.form.getElements("input, textarea, select").each(function(d){this.fields.push(new jpField(d,this.options))},this);if(this.options.autoFocus&&!this.options.autoClear&&this.fields.length){var b=0;do{if(this.fields[b].type!="hidden"){this.fields[b].element.focus();break}}while(++b<this.fields.length)}if(this.options.ajax){new Element("input",{type:"hidden",name:"ajax",value:"1"}).injectInside(this.form)}this.form.addEvent("submit",function(d){this.fireEvent("submit",d)}.bindWithEvent(this));this.addEvent("submit",function(d){this.submit(d)}.bindWithEvent(this));if(this.options.resetToNull){this.form.getElements("input[type=reset]").each(function(d){d.addEvent("click",function(e){e.stop();this.reset()}.bindWithEvent(this))},this)}this.options.relations.each(function(d){this.addRelation(d)},this)},submit:function(a){var c=true;for(var b=0;b<this.fields.length;b++){c*=this.fields[b].check()}if(c){if(this.errorMessageContainer){this.errorMessageContainer.dispose();this.errorMessageContainer=null}for(var b=0;b<this.fields.length;b++){this.fields[b].clearNullFields()}if(this.options.ajax){a.stop();this.form.addClass(this.options.loadingClass);this.form.set("send",{url:this.form.get("action"),onComplete:function(){this.form.removeClass(this.options.loadingClass);this.form.addClass(this.options.sentClass)}.bind(this),onSuccess:function(e){if(e=="success"){this.submitInfoMessageContainer.set("html",this.options.sentMessage)}else{this.submitInfoMessageContainer.set("html",this.options.sendErrorMessage)}}.bind(this),onFailure:function(){this.submitInfoMessageContainer.set("html",this.options.sendErrorMessage)}.bind(this)});this.form.send();this.submitInfoMessageContainer=new Element(this.options.errorMessageContainerTag,{id:this.options.submitInfoMessageContainerId,html:this.options.submittingMessage});this.submitInfoMessageContainer.injectTop(this.form)}this.fireEvent("sent")}else{new Event(a).stop();if(this.options.inlineErrorMsg){if(!this.errorMessageContainer){this.errorMessageContainer=new Element(this.options.errorMessageContainerTag,{id:this.options.errorMessageContainerId});this.errorMessageContainer.injectTop(this.form)}this.errorMessageContainer.set("html",this.options.errorMessage);if(this.options.autoScrollOnError){new Fx.Scroll(window,{wheelStops:false,duration:100}).toElement(this.form)}}else{alert(this.options.errorMessage)}for(var d=0;d<this.fields.length;d++){if(this.fields[d].hasError){this.fields[d].element.focus();break}}}},addRelation:function(f){var c=this.getField(f.masterField);if(c){switch(f.type){case"incremental-show":var e=$$("."+f.slaveFieldsClass);var b=[];for(var d=0;d<e.length;d++){b.push(this.getField(e[d]))}var a=typeof f.slavesContainer!="undefined"?f.slavesContainer:null;c.addIncrementalShowRelation(b,a);break}}},getField:function(b){b=$(b);for(var a=0;a<this.fields.length;a++){if(this.fields[a].element==b){return this.fields[a]}}return null},reset:function(){this.fields.each(function(a){a.reset()},this)}});var jpField=new Class({Implements:[Options,Events],element:null,label:null,errorMessageContainer:null,errorMessages:[],cleared:false,initialValue:"",type:null,hasError:false,hasFocus:false,labelTimer:null,slaves:[],slavesContainer:null,options:{autoClear:true,valuesToConsiderNull:[],requiredClass:"jpFrmRequired",errorClass:"jpFrmError",emailClass:"jpFrmEmail",dateClass:"jpFrmDate",numericClass:"jpFrmNumeric",labelDelay:2000},initialize:function(c,b){this.element=$(c);if(!this.element){return}this.setOptions(b);this.initialValue=this.element.value;var a=this.element.get("tag");if(a=="input"){this.type=this.element.getAttribute("type")||"text"}else{this.type=a}this.element.addEvent("blur",function(){this.hasFocus=false;if(this.hasError){this.check()}this.hideLabel();if(this.options.autoClear){this.setToDefault()}}.bind(this));this.label=new jpLabel(null,this);if(this.options.autoClear&&(this.type=="text"||this.type=="password"||this.type=="textarea")){this.element.addEvent("focus",function(){this.hasFocus=true;this.showLabel();this.clearDefault()}.bind(this));this.element.addEvent("mouseenter",function(){this.showLabel()}.bindWithEvent(this));this.element.addEvent("mouseleave",function(){this.hideLabel()}.bindWithEvent(this))}},showLabel:function(){if(this.label){$clear(this.labelTimer);this.label.show()}},hideLabel:function(a){if(this.label){if((!this.hasFocus&&!this.hasError)||a){$clear(this.labelTimer);this.label.hide()}}},getValue:function(a){var c=this.element.value;if(!a){var b=0;while(b<this.options.valuesToConsiderNull.length){if(c==this.options.valuesToConsiderNull[b]){c="";break}b++}}return c},clearNullFields:function(){if(this.type!="select"||!this.element.multiple){this.element.value=this.getValue()}},isRequired:function(){return this.element.hasClass(this.options.requiredClass)},check:function(){var a=true;this.errorMessages=[];if(this.isRequired()&&!this.get("disabled")){switch(this.type){case"text":case"password":case"textarea":case"file":case"select":var b=this.getValue();a=b!==""&&b!==null;if(a){if(this.element.hasClass(this.options.emailClass)){a=b.match(/.+\@.+\..+/)?true:false}if(this.element.hasClass(this.options.numericClass)){a=b.match(/\d+/)?true:false}if(this.element.hasClass(this.options.dateClass)){if(!b.match(/\d{1,2}\/\d{1,2}\/\d{4}/)){a=false;this.addErrorMessage("Date must be in the form dd/mm/yyyy")}}}break;case"checkbox":a=this.element.checked;break}}if(!a){this.setError()}else{this.removeError()}return a},setError:function(){this.fireEvent("error");this.hasError=true;this.element.addClass(this.options.errorClass);if(this.label){this.label.setError();this.label.show()}if(this.errorMessages.length){if(!this.errorMessageContainer){this.errorMessageContainer=new Element("p",{"class":"jpFrmFieldError"}).injectBefore(this.element.getParent())}this.errorMessageContainer.empty();this.errorMessageContainer.set("text",this.errorMessages.join("\n"))}},removeError:function(){this.fireEvent("removeError");this.hasError=false;this.element.removeClass(this.options.errorClass);if(this.label){this.label.removeError();this.label.hide()}},addErrorMessage:function(a){this.errorMessages.push(a)},clearDefault:function(){if(this.element&&!this.cleared){this.element.value=""}this.cleared=true},setToDefault:function(){if(this.getValue(true)==""){this.element.value=this.initialValue;this.cleared=false}},get:function(a){if(a=="value"){return this.getValue()}return this.element.get(a)},hide:function(){this.element.getParent().addClass("hidden")},show:function(){this.element.getParent().removeClass("hidden")},addIncrementalShowRelation:function(a,b){this.slaves=a;this.slavesContainer=typeof b!="undefined"?$(b):null;this.updateIncrementalShowRelation(true);this.element.addEvent("change",function(){this.updateIncrementalShowRelation()}.bindWithEvent(this))},updateIncrementalShowRelation:function(c){var a=this.getValue();if(this.slavesContainer){if(a==0){this.slavesContainer.addClass("hidden")}else{this.slavesContainer.removeClass("hidden")}}for(var b=0;b<this.slaves.length;b++){if(b>=a){this.slaves[b].hide();this.slaves[b].element.set("disabled",true)}else{this.slaves[b].show();this.slaves[b].element.set("disabled",false);if(b==0&&(typeof c=="undefined"||!c)){this.slaves[b].element.focus()}}}},reset:function(){switch(this.type){case"textbox":case"textarea":this.element.set("value","");break;case"checkbox":case"radio":this.element.checked=false;break;case"select":this.element.getElements("option").each(function(a){a.selected=false});break}}});var jpLabel=new Class({Implements:[Options,Events],element:null,hovering:false,options:{autohide:true,activeClass:"jpFrmActive",errorClass:"jpFrmError",hideOnHover:true},initialize:function(b,a){if(b){this.element=$(b)}if(!this.element&&a){a=typeof a=="object"?a:$(a);if(a){this.element=$$("label[for="+a.get("id")+"]")}}if(!this.element){return}this.element.addEvent("mouseenter",function(){this.onHover()}.bind(this));this.element.addEvent("mouseleave",function(){this.onHoverEnd()}.bind(this))},show:function(){if(this.options.autohide){this.fireEvent("show");this.element.addClass(this.options.activeClass);this.timerId=null}},hide:function(){if(this.options.autohide){this.fireEvent("hide");this.element.removeClass(this.options.activeClass)}},onHover:function(){this.hovering=true},onHoverEnd:function(){this.hovering=false},setError:function(){this.fireEvent("error");this.element.addClass(this.options.errorClass)},removeError:function(){this.fireEvent("removeError");this.element.removeClass(this.options.errorClass)}});
