function JSForm(a,b){this.constructor=JSForm;this.constructor.name="JSForm";var c=$(a);if(c.length!==0){this.form=c;}else{throw new Error("[JSForm] '"+a+"' could not be found");}if(b){this.lang=(b.lang)?b.lang:"fr";this.breakOnError=(isDefined(b.breakOnError))?b.breakOnError:false;this.submitCallback=(b.submit)?b.submit:null;}var d=this;this.form.submit(function(){var e=d.submit();if(e!==undefined){return e;}});this.inputs=new Hash();this.errors=new Hash();}JSForm.prototype={registerInput:function(b,a,c,d){var e=this;$(this.form).find(b+":input").each(function(){var j=$(this).attr("name");if(e.inputs.hasKey(j)===false){e.inputs.add(j,new JSFormInput($(this)));}var h,g;if(typeOf(a)=="array"){var m=e.inputs.get(j);g=(isDefined(c))?c:e.breakOnError;for(var k=0,f=a.length;k<f;k++){h=(a[k][1])?a[k][1]:{lang:e.lang};m.addValidation(a[k][0],h,g);}}else{h=(c)?c:{lang:e.lang};g=(isDefined(d))?d:e.breakOnError;e.inputs.get(j).addValidation(a,h,g);}});},validate:function(){var a=true;this.inputs.forEach(function(b,c){if(c.validate()===false){a=false;}});return a;},submit:function(){this.errors.empty();var c=this.validate();if(this.submitCallback!=null){try{var a=this.submitCallback.call(this,c);if(a!==undefined){return a;}}catch(b){alert("[JSForm submitHandler] "+b);return false;}}if(c===false){return false;}},getErrors:function(){var a=this;this.inputs.forEach(function(b,c){a.errors.add(b,c.errors);});return this.errors.getClean();},getErrorsForName:function(a){var b=this.getErrors();return b[a];}};function JSFormInput(a){var b=$(a);if(b.length!=0){this.input=b;}else{throw new Error("[JSFormInput] '"+a+"' could not be found;");}this.validations={regexp:[],func:[]};this.errors=[];return this;}JSFormInput.prototype={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.regexp.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.func.push([JSFormValidationFunctions.get(a.fn),a.args,c]);}else{this.validations.func.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.regexp.push([a,c]);}else{if(typeOf(a)=="function"){this.validations.func.push([a,c]);}}}}this.breakOnError=b;},getValue:function(){return $(this.input).val();},validate:function(){this.errors.empty();var g=this.getValue();var b=this.validations.regexp;var c=this.validations.func;if(g==""){for(var f=0,a=b.length;f<a;f++){if(b[f][0]=="required"){this.errors.push(b[f].getLast());return false;}}return true;}else{for(var f=0,a=b.length;f<a;f++){if(b[f][0]!="required"){if(b[f][0].test(g)===false){this.errors.push(b[f].getLast());if(this.breakOnError){return false;}}}}var e;for(f=0,a=c.length;f<a;f++){e=false;if(typeOf(c[f][1])=="array"){var d=c[f][1].clone();d.splice(0,0,g);e=c[f][0].apply(this,d);}else{e=c[f][0].call(this,g);}if(e===false){this.errors.push(c[f].getLast());if(this.breakOnError){return false;}}}return(this.errors.length==0);}}};var JSFormValidationRegExp=new Hash({required:"required",number:/^[0-9\.\,\ ]+$/,email:/^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$/,url:/[changeMe]/,phone:/^([0-9]{1})?[\-\.\ ]?[0-9]{3}[\-\.\ ]?[0-9]{3}[\-\.\ ]?[0-9]{4}$/,zip:/^[A-Za-z][0-9][A-Za-z](\ )?[0-9][A-Za-z][0-9]$/,usZip:/^[0-9]{5}$/,date:/^[0-9]{4}(\ \-\.\/)[0-9]{2}(\ \-\.\/)[0-9]{2}$/});var JSFormValidationFunctions=new Hash({isBetween:function(c,b,a){if(c>=b&&c<=a){return true;}return false;}});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){$(a).not("input[type=submit], input[type=button]").blur(function(){if($(this).val()==""){$(this).val(this.defaultValue);}});$(a).not("input[type=submit], input[type=button]").focus(function(){if($(this).val()==this.defaultValue){$(this).val("");}});}};
