function JSForm(b,d){this.$type="JSForm";var e=jQuery(b);if(e.length!==0){this.form=e;}else{throw new Error("[JSForm] '"+b+"' could not be found");}if(d){this.lang=(d.lang)?d.lang:"fr";var a=(d.breakOnError)?d.breakOnError:false;this.submitCallback=(d.submit)?d.submit:null;}var c=this;this.form.submit(function(){var f=c.submit();if(f!==undefined){return f;}});this.inputs=new Hash();this.errors=new Hash();}JSForm.implement({addValidation:function(){throw new Error("Method not available to parent class.");},getValue:function(){throw new Error("Method not available to parent class.");},registerInput:function(d,c,f,g,b){var e=this;var h;function a(o){var m,k;if(c instanceof Array){k=(f!=undefined)?f:e.breakOnError;for(var n=0,j=c.length;n<j;n++){m=(c[n][1])?c[n][1]:{lang:e.lang};h.addValidation(c[n][0],m,k);}}else{m=(f&&typeOf(f)=="string")?f:{lang:e.lang};k=(g!=undefined)?g:(typeOf(f)=="boolean")?f:e.breakOnError;h.addValidation(c,f,k);}}if(b!==undefined){this.inputs.add(b.name,new JSFormInput(jQuery(d)));h=this.inputs.get(b.name);a();}else{jQuery(this.form).find(d+":not(input[type^=submit],input[type^=button],input[type^=reset]):input").each(function(){h=e.addInput(jQuery(this));a();});}},registerGroup:function(b,c,a,d,e){this.registerInput(c,a,d,e,{name:b});},addInput:function(b){var a=b.attr("name");var c=b.attr("type");if(c=="radio"){if(validation=="required"){if(this.inputs.hasKey(a)===false){this.inputs.add(a,new JSFormRadioButton(b));}else{this.inputs.get(a).addInput(b);}}}else{if(this.inputs.hasKey(a)===false){this.inputs.add(a,new JSFormInput(b));}}return this.inputs.get(a);},getErrors:function(){var a=this;this.inputs.forEach(function(c,b){a.errors.add(b,c.getErrors());});return this.errors.getClean();},getErrorsForName:function(a){return this.inputs.get(a).errors;},getInput:function(a){return this.inputs.get(a);},validate:function(){var a=true;this.inputs.forEach(function(c,b){if(c.validate()===false){a=false;}});return a;},submit:function(){this.errors.empty();var c=this.validate();var d=this.getErrors();if(this.submitCallback!==""){try{var a=this.submitCallback.call(this,c,d);if(a!==undefined){return a;}}catch(b){alert("[JSForm submitHandler] "+b);return false;}}if(c===false){return false;}}});function JSFormInput(a){this.$type="JSFormInput";var b=jQuery(a);if(b.length>=1){this.input=b;}else{throw new Error("[JSFormInput] '"+a+"' could not be found;");}this.validations=[];this.errors=[];return this;}JSFormInput.implement({addValidation:function(a,c,b){if(typeOf(a)=="string"&&JSFormValidationRegExp.hasKey(a)){c=(typeOf(c)=="object"&&c.lang)?JSFormErrors.get(c.lang).get(a):c;this.validations.push([JSFormValidationRegExp.get(a),c]);}else{if(typeOf(a)=="object"){c=(typeOf(c)=="object"&&c.lang)?JSFormErrors.get(c.lang).get(a):c;if(JSFormValidationFunctions.hasKey(a.fn)){this.validations.push([JSFormValidationFunctions.get(a.fn),a.args,c]);}else{this.validations.push([a.fn,a.args,c]);}}else{if(isDefined(c)===false){throw new Error("[JSFormInput addValidation] custom validation requires specifying a custom error message");}if(typeOf(a)=="regexp"){this.validations.push([a,c]);}else{if(typeOf(a)=="function"){this.validations.push([a,c]);}}}}this.breakOnError=(b)?b:false;},getErrors:function(){return this.errors;},getValue:function(){if(jQuery(this.input).attr("type")=="checkbox"){return(jQuery(this.input).attr("checked")===true)?"checked":"";}var a="";jQuery(this.input).each(function(){a+=jQuery(this).val();});return a;},validate:function(){this.errors.empty();var e=this.getValue();var d=this.validations;var c;if(e===""){for(c=0,l=d.length;c<l;c++){if(d[c][0]=="required"){this.errors.push(d[c].getLast());return false;}}return true;}else{for(c=0,l=d.length;c<l;c++){if(d[c][0]=="required"){if(this.input.get(0).defaultValue==e){this.errors.push(d[c].getLast());return false;}}if(this.input.get(0).defaultValue!=e){if(typeOf(d[c][0])=="regexp"){if(d[c][0].test(e)===false){this.errors.push(d[c].getLast());if(this.breakOnError){return false;}}}else{if(typeOf(d[c][0])=="function"){var b;b=false;if(typeOf(d[c][1])=="array"){var a=d[c][1].clone();a.splice(0,0,e);b=d[c][0].apply(this,a);}else{b=d[c][0].call(this,e);}if(b===false){this.errors.push(d[c].getLast());if(this.breakOnError){return false;}}}}}}return(this.errors.length===0);}}});function JSFormRadioButton(a){this.$type="JSFormRadioButton";this.els=[jQuery(a)];this.validations={regexp:[]};this.errors=[];}JSFormRadioButton.prototype={addInput:function(a){this.els.push(jQuery(a));},addValidation:function(a,c,b){this.validations.regexp.push([a,c]);},getErrors:function(){return this.errors;},getValue:function(){return $(this.els[0]+":checked").val();},validate:function(){this.errors.empty();var a=this.getValue();if(a==undefined){this.errors.push(this.validations.regexp[0][1]);}return(this.errors.length===0);}};var JSFormValidationRegExp=new Hash({required:"required",email:/^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$/,url:/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/,phone:/^(([0-9]{1})*[- .(]*([0-9]{3})[- .)]*[0-9]{3}[- .]*[0-9]{4})+$/,zip:/^[ABCEGHJKLMNPRSTVXY][0-9][A-Z](\ )?[0-9][A-Z][0-9]$/i,usZip:/^[0-9]{5}(?:-[0-9]{4})?$/,date:/^(19|20)?[0-9]{2}[- \/\.](0?[1-9]|1[012])[- \/\.](0?[1-9]|[12][0-9]|3[01])$/,creditCard:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$/,alphaNumeric:/^[a-zA-Z0-9]+$/,alphaNumericWithSpaces:/^[a-zA-Z0-9\ ]+$/,letters:/^[a-zA-Z]+$/,digits:/^[0-9]+$/});var JSFormValidationFunctions=new Hash({isBetween:function(c,b,a){if(c>=b&&c<=a){return true;}return false;},isNotDefault:function(a){return(this.input.get(0).defaultValue!=a);}});var JSFormErrors=new Hash({fr:new Hash({required:"Ce champ ne peux être vide.",number:"Ce champ n'accepte que des caractères numériques.",email:"Veuillez entrer un courriel valide.",url:"Veuillez entrer un url valide.",phone:"Veuillez entrer un numéro de téléphone valide.",zip:"Veuillez entrer un code postal valide.",usZip:"Veuillez entrer un code postal valide.",date:"Veuillez entrer une date valide."}),en:new Hash({required:"This field cannot be empty.",number:"This field only accepts numeric caracters.",email:"Please enter a valid e-mail.",url:"Please enter a valid url.",phone:"Please enter a valid phone number.",zip:"Please enter a valid zip.",usZip:"Please enter a valid zip.",date:"Please enter a valid date."})});var UIForm={makeSmartInput:function(a){jQuery(a).not("input[type=submit], input[type=button]").blur(function(){if(jQuery(this).val()===""){jQuery(this).val(this.defaultValue);}});jQuery(a).not("input[type=submit], input[type=button]").focus(function(){if(jQuery(this).val()==this.defaultValue){jQuery(this).val("");}});}};