var Validator=Class.create();Validator.prototype={initialize:function(a,b,c,d){"function"==typeof c?(this.options=$H(d),this._test=c):(this.options=$H(c),this._test=function(){return!0});this.error=b||"Validation failed.";this.className=a},test:function(a,b){return this._test(a,b)&&this.options.all(function(c){return Validator.methods[c.key]?Validator.methods[c.key](a,b,c.value):!0})}};
Validator.methods={pattern:function(a,b,c){return Validation.get("IsEmpty").test(a)||c.test(a)},minLength:function(a,b,c){return a.length>=c},maxLength:function(a,b,c){return a.length<=c},min:function(a,b,c){return a>=parseFloat(c)},max:function(a,b,c){return a<=parseFloat(c)},notOneOf:function(a,b,c){return $A(c).all(function(b){return a!=b})},oneOf:function(a,b,c){return $A(c).any(function(b){return a==b})},is:function(a,b,c){return a==c},isNot:function(a,b,c){return a!=c},equalToField:function(a,
b,c){return a==$F(c)},notEqualToField:function(a,b,c){return a!=$F(c)},include:function(a,b,c){return $A(c).all(function(c){return Validation.get(c).test(a,b)})}};var Validation=Class.create();Validation.defaultOptions={onSubmit:!0,stopOnFirst:!1,immediate:!1,focusOnError:!0,useTitles:!1,addClassNameToContainer:!1,containerClassName:".input-box",onFormValidate:function(){},onElementValidate:function(){}};
Validation.prototype={initialize:function(a,b){if(this.form=$(a))this.options=Object.extend({onSubmit:Validation.defaultOptions.onSubmit,stopOnFirst:Validation.defaultOptions.stopOnFirst,immediate:Validation.defaultOptions.immediate,focusOnError:Validation.defaultOptions.focusOnError,useTitles:Validation.defaultOptions.useTitles,onFormValidate:Validation.defaultOptions.onFormValidate,onElementValidate:Validation.defaultOptions.onElementValidate},b||{}),this.options.onSubmit&&Event.observe(this.form,
"submit",this.onSubmit.bind(this),!1),this.options.immediate&&Form.getElements(this.form).each(function(a){"select"==a.tagName.toLowerCase()&&Event.observe(a,"blur",this.onChange.bindAsEventListener(this));"radio"==a.type.toLowerCase()||"checkbox"==a.type.toLowerCase()?Event.observe(a,"click",this.onChange.bindAsEventListener(this)):Event.observe(a,"change",this.onChange.bindAsEventListener(this))},this)},onChange:function(a){Validation.isOnChange=!0;Validation.validate(Event.element(a),{useTitle:this.options.useTitles,
onElementValidate:this.options.onElementValidate});Validation.isOnChange=!1},onSubmit:function(a){this.validate()||Event.stop(a)},validate:function(){var a=!1,b=this.options.useTitles,c=this.options.onElementValidate;try{a=this.options.stopOnFirst?Form.getElements(this.form).all(function(a){return a.hasClassName("local-validation")&&!this.isElementInForm(a,this.form)?!0:Validation.validate(a,{useTitle:b,onElementValidate:c})},this):Form.getElements(this.form).collect(function(a){return a.hasClassName("local-validation")&&
!this.isElementInForm(a,this.form)?!0:Validation.validate(a,{useTitle:b,onElementValidate:c})},this).all()}catch(d){}if(!a&&this.options.focusOnError)try{Form.getElements(this.form).findAll(function(a){return $(a).hasClassName("validation-failed")}).first().focus()}catch(e){}this.options.onFormValidate(a,this.form);return a},reset:function(){Form.getElements(this.form).each(Validation.reset)},isElementInForm:function(a,b){return a.up("form")==b?!0:!1}};
Object.extend(Validation,{validate:function(a,b){b=Object.extend({useTitle:!1,onElementValidate:function(){}},b||{});a=$(a);return result=$w(a.className).all(function(c){c=Validation.test(c,a,b.useTitle);b.onElementValidate(c,a);return c})},insertAdvice:function(a,b){var c=$(a).up(".field-row");if(c)Element.insert(c,{after:b});else if(a.up("td.value"))a.up("td.value").insert({bottom:b});else if(a.advaiceContainer&&$(a.advaiceContainer))$(a.advaiceContainer).update(b);else switch(a.type.toLowerCase()){case "checkbox":case "radio":(c=
a.parentNode)?Element.insert(c,{bottom:b}):Element.insert(a,{after:b});break;default:Element.insert(a,{after:b})}},showAdvice:function(a,b,c){a.advices?a.advices.each(function(b){this.hideAdvice(a,b.value)}.bind(this)):a.advices=new Hash;a.advices.set(c,b);"undefined"==typeof Effect?b.style.display="block":b._adviceAbsolutize?(Position.absolutize(b),b.show(),b.setStyle({top:b._adviceTop,left:b._adviceLeft,width:b._adviceWidth,"z-index":1E3}),b.addClassName("advice-absolute")):new Effect.Appear(b,
{duration:1})},hideAdvice:function(a,b){null!=b&&b.hide()},updateCallback:function(a,b){"undefined"!=typeof a.callbackFunction&&eval(a.callbackFunction+"('"+a.id+"','"+b+"')")},ajaxError:function(a,b){var c=Validation.getAdvice("validate-ajax",a);null==c&&(c=this.createAdvice("validate-ajax",a,!1,b));this.showAdvice(a,c,"validate-ajax");this.updateCallback(a,"failed");a.addClassName("validation-failed");a.addClassName("validate-ajax");if(Validation.defaultOptions.addClassNameToContainer&&""!=Validation.defaultOptions.containerClassName&&
(c=a.up(Validation.defaultOptions.containerClassName))&&this.allowContainerClassName(a))c.removeClassName("validation-passed"),c.addClassName("validation-error")},allowContainerClassName:function(a){return"radio"==a.type||"checkbox"==a.type?a.hasClassName("change-container-classname"):!0},test:function(a,b,c){var d=Validation.get(a),e="__advice"+a.camelize();try{if(Validation.isVisible(b)&&!d.test($F(b),b)){var g=Validation.getAdvice(a,b);null==g&&(g=this.createAdvice(a,b,c));this.showAdvice(b,g,
a);this.updateCallback(b,"failed");b[e]=1;b.advaiceContainer||(b.removeClassName("validation-passed"),b.addClassName("validation-failed"));if(Validation.defaultOptions.addClassNameToContainer&&""!=Validation.defaultOptions.containerClassName){var f=b.up(Validation.defaultOptions.containerClassName);f&&this.allowContainerClassName(b)&&(f.removeClassName("validation-passed"),f.addClassName("validation-error"))}return!1}g=Validation.getAdvice(a,b);this.hideAdvice(b,g);this.updateCallback(b,"passed");
b[e]="";b.removeClassName("validation-failed");b.addClassName("validation-passed");if(Validation.defaultOptions.addClassNameToContainer&&""!=Validation.defaultOptions.containerClassName&&(f=b.up(Validation.defaultOptions.containerClassName))&&!f.down(".validation-failed")&&this.allowContainerClassName(b))!Validation.get("IsEmpty").test(b.value)||!this.isVisible(b)?f.addClassName("validation-passed"):f.removeClassName("validation-passed"),f.removeClassName("validation-error");return!0}catch(h){throw h;
}},isVisible:function(a){for(;"BODY"!=a.tagName;){if(!$(a).visible())return!1;a=a.parentNode}return!0},getAdvice:function(a,b){return $("advice-"+a+"-"+Validation.getElmID(b))||$("advice-"+Validation.getElmID(b))},createAdvice:function(a,b,c,d){var e=Validation.get(a),c=c?b&&b.title?b.title:e.error:e.error;d&&(c=d);try{Translator&&(c=Translator.translate(c))}catch(g){}advice='<div class="validation-advice" id="advice-'+a+"-"+Validation.getElmID(b)+'" style="display:none">'+c+"</div>";Validation.insertAdvice(b,
advice);advice=Validation.getAdvice(a,b);if($(b).hasClassName("absolute-advice"))a=$(b).getDimensions(),b=Position.cumulativeOffset(b),advice._adviceTop=b[1]+a.height+"px",advice._adviceLeft=b[0]+"px",advice._adviceWidth=a.width+"px",advice._adviceAbsolutize=!0;return advice},getElmID:function(a){return a.id?a.id:a.name},reset:function(a){a=$(a);$w(a.className).each(function(b){var c="__advice"+b.camelize();a[c]&&((b=Validation.getAdvice(b,a))&&b.hide(),a[c]="");a.removeClassName("validation-failed");
a.removeClassName("validation-passed");if(Validation.defaultOptions.addClassNameToContainer&&""!=Validation.defaultOptions.containerClassName&&(c=a.up(Validation.defaultOptions.containerClassName)))c.removeClassName("validation-passed"),c.removeClassName("validation-error")})},add:function(a,b,c,d){var e={};e[a]=new Validator(a,b,c,d);Object.extend(Validation.methods,e)},addAllThese:function(a){var b={};$A(a).each(function(a){b[a[0]]=new Validator(a[0],a[1],a[2],3<a.length?a[3]:{})});Object.extend(Validation.methods,
b)},get:function(a){return Validation.methods[a]?Validation.methods[a]:Validation.methods._LikeNoIDIEverSaw_},methods:{_LikeNoIDIEverSaw_:new Validator("_LikeNoIDIEverSaw_","",{})}});Validation.add("IsEmpty","",function(a){return""==a||null==a||0==a.length||/^\s+$/.test(a)});
Validation.addAllThese([["validate-select","Please select an option.",function(a){return"none"!=a&&null!=a&&0!=a.length}],["required-entry","This is a required field.",function(a){return!Validation.get("IsEmpty").test(a)}],["validate-number","Please enter a valid number in this field.",function(a){return Validation.get("IsEmpty").test(a)||!isNaN(parseNumber(a))&&!/^\s+$/.test(parseNumber(a))}],["validate-digits","Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.",
function(a){return Validation.get("IsEmpty").test(a)||!/[^\d]/.test(a)}],["validate-alpha","Please use letters only (a-z or A-Z) in this field.",function(a){return Validation.get("IsEmpty").test(a)||/^[a-zA-Z]+$/.test(a)}],["validate-code","Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.",function(a){return Validation.get("IsEmpty").test(a)||/^[a-z]+[a-z0-9_]+$/.test(a)}],["validate-alphanum","Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.",
function(a){return Validation.get("IsEmpty").test(a)||/^[a-zA-Z0-9]+$/.test(a)}],["validate-street","Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.",function(a){return Validation.get("IsEmpty").test(a)||/^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(a)}],["validate-phoneStrict","Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.",function(a){return Validation.get("IsEmpty").test(a)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(a)}],
["validate-phoneLax","Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.",function(a){return Validation.get("IsEmpty").test(a)||/^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(a)}],["validate-fax","Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.",function(a){return Validation.get("IsEmpty").test(a)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(a)}],["validate-date","Please enter a valid date.",function(a){var b=new Date(a);
return Validation.get("IsEmpty").test(a)||!isNaN(b)}],["validate-email","Please enter a valid email address. For example johndoe@domain.com.",function(a){return Validation.get("IsEmpty").test(a)||/^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i.test(a)}],
["validate-emailSender","Please use only visible characters and spaces.",function(a){return Validation.get("IsEmpty").test(a)||/^[\S ]+$/.test(a)}],["validate-password","Please enter 6 or more characters. Leading or trailing spaces will be ignored.",function(a){a=a.strip();return!(0<a.length&&6>a.length)}],["validate-admin-password","Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.",function(a){var b=a.strip();return 0==b.length?!0:!/[a-z]/i.test(a)||
!/[0-9]/.test(a)?!1:!(7>b.length)}],["validate-cpassword","Please make sure your passwords match.",function(){var a=$("confirmation")?$("confirmation"):$$(".validate-cpassword")[0],b=!1;$("password")&&(b=$("password"));for(var c=$$(".validate-password"),d=0;d<c.size();d++){var e=c[d];e.up("form").id==a.up("form").id&&(b=e)}$$(".validate-admin-password").size()&&(b=$$(".validate-admin-password")[0]);return b.value==a.value}],["validate-url","Please enter a valid URL. http:// is required",function(a){return Validation.get("IsEmpty").test(a)||
/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(a)}],["validate-clean-url","Please enter a valid URL. For example http://www.example.com or www.example.com",function(a){return Validation.get("IsEmpty").test(a)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(a)||/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(a)}],
["validate-identifier",'Please enter a valid URL Key. For example "example-page", "example-page.html" or "anotherlevel/example-page"',function(a){return Validation.get("IsEmpty").test(a)||/^[A-Z0-9][A-Z0-9_\/-]+(\.[A-Z0-9_-]+)*$/i.test(a)}],["validate-xml-identifier","Please enter a valid XML-identifier. For example something_1, block5, id-4",function(a){return Validation.get("IsEmpty").test(a)||/^[A-Z][A-Z0-9_\/-]*$/i.test(a)}],["validate-ssn","Please enter a valid social security number. For example 123-45-6789.",
function(a){return Validation.get("IsEmpty").test(a)||/^\d{3}-?\d{2}-?\d{4}$/.test(a)}],["validate-zip","Please enter a valid zip code. For example 90602 or 90602-1234.",function(a){return Validation.get("IsEmpty").test(a)||/(^\d{5}$)|(^\d{5}-\d{4}$)/.test(a)}],["validate-zip-international","Please enter a valid zip code.",function(){return!0}],["validate-date-au","Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.",function(a){if(Validation.get("IsEmpty").test(a))return!0;
var b=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!b.test(a))return!1;a=new Date(a.replace(b,"$2/$1/$3"));return parseInt(RegExp.$2,10)==1+a.getMonth()&&parseInt(RegExp.$1,10)==a.getDate()&&parseInt(RegExp.$3,10)==a.getFullYear()}],["validate-currency-dollar","Please enter a valid $ amount. For example $100.00.",function(a){return Validation.get("IsEmpty").test(a)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(a)}],["validate-one-required",
"Please select one of the above options.",function(a,b){var c=b.parentNode.getElementsByTagName("INPUT");return $A(c).any(function(a){return $F(a)})}],["validate-one-required-by-name","Please select one of the options.",function(a,b){for(var c=$$('input[name="'+b.name.replace(/([\\"])/g,"\\$1")+'"]'),d=1,e=0;e<c.length;e++){if(("checkbox"==c[e].type||"radio"==c[e].type)&&!0==c[e].checked)d=0;Validation.isOnChange&&("checkbox"==c[e].type||"radio"==c[e].type)&&Validation.reset(c[e])}return 0==d?!0:
!1}],["validate-not-negative-number","Please enter a valid number in this field.",function(a){a=parseNumber(a);return!isNaN(a)&&0<=a}],["validate-state","Please select State/Province.",function(a){return 0!=a||""==a}],["validate-new-password","Please enter 6 or more characters. Leading or trailing spaces will be ignored.",function(a){return!Validation.get("validate-password").test(a)?!1:Validation.get("IsEmpty").test(a)&&""!=a?!1:!0}],["validate-greater-than-zero","Please enter a number greater than 0 in this field.",
function(a){return a.length?0<parseFloat(a):!0}],["validate-zero-or-greater","Please enter a number 0 or greater in this field.",function(a){return a.length?0<=parseFloat(a):!0}],["validate-cc-number","Please enter a valid credit card number.",function(a,b){var c=$(b.id.substr(0,b.id.indexOf("_cc_number"))+"_cc_type");return c&&"undefined"!=typeof Validation.creditCartTypes.get(c.value)&&!1==Validation.creditCartTypes.get(c.value)[2]?!Validation.get("IsEmpty").test(a)&&Validation.get("validate-digits").test(a)?
!0:!1:validateCreditCard(a)}],["validate-cc-type","Credit card number doesn't match credit card type",function(a,b){b.value=removeDelimiters(b.value);var a=removeDelimiters(a),c=$(b.id.substr(0,b.id.indexOf("_cc_number"))+"_cc_type");if(!c)return!0;var d=c.value;if("undefined"==typeof Validation.creditCartTypes.get(d))return!1;if(!1==Validation.creditCartTypes.get(d)[0])return!0;var e="";Validation.creditCartTypes.each(function(b){if(b.value[0]&&a.match(b.value[0]))throw e=b.key,$break;});if(e!=d)return!1;
c.hasClassName("validation-failed")&&Validation.isOnChange&&Validation.validate(c);return!0}],["validate-cc-type-select","Card type doesn't match credit card number",function(a,b){var c=$(b.id.substr(0,b.id.indexOf("_cc_type"))+"_cc_number");if(Validation.isOnChange&&Validation.get("IsEmpty").test(c.value))return!0;Validation.get("validate-cc-type").test(c.value,c)&&Validation.validate(c);return Validation.get("validate-cc-type").test(c.value,c)}],["validate-cc-exp","Incorrect credit card expiration date",
function(a,b){var c=$(b.id.substr(0,b.id.indexOf("_expiration"))+"_expiration_yr").value,d=new Date,e=d.getMonth()+1,d=d.getFullYear();return a<e&&c==d?!1:!0}],["validate-cc-cvn","Please enter a valid credit card verification number.",function(a,b){var c=$(b.id.substr(0,b.id.indexOf("_cc_cid"))+"_cc_type");if(!c)return!0;c=c.value;if("undefined"==typeof Validation.creditCartTypes.get(c))return!1;c=Validation.creditCartTypes.get(c)[1];return a.match(c)?!0:!1}],["validate-ajax","",function(){return!0}],
["validate-data","Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.",function(a){return""!=a&&a?/^[A-Za-z]+[A-Za-z0-9_]+$/.test(a):!0}],["validate-css-length","Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%",function(a){return""!=a&&a?/^[0-9\.]+(px|pt|em|ex|%)?$/.test(a)&&!/\..*\./.test(a)&&!/\.$/.test(a):!0}],["validate-length","Maximum length exceeded.",function(a,b){var c=RegExp(/^maximum-length-[0-9]+$/),
d=!0;$w(b.className).each(function(b){b.match(c)&&d&&(b=b.split("-")[2],d=a.length<=b)});return d}],["validate-percents","Please enter a number lower than 100",{max:100}]]);function removeDelimiters(a){a=a.replace(/\s/g,"");return a=a.replace(/\-/g,"")}function parseNumber(a){if("string"!=typeof a)return parseFloat(a);var b=a.indexOf("."),c=a.indexOf(",");-1!=b&&-1!=c?a=c>b?a.replace(".","").replace(",","."):a.replace(",",""):-1!=c&&(a=a.replace(",","."));return parseFloat(a)}
Validation.creditCartTypes=$H({SS:[RegExp("^((6759[0-9]{12})|(5018|5020|5038|6304|6759|6761|6763[0-9]{12,19})|(49[013][1356][0-9]{12})|(6333[0-9]{12})|(6334[0-4]d{11})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$"),/^([0-9]{3}|[0-9]{4})?$/,!0],SO:[/^(6334[5-9]([0-9]{11}|[0-9]{13,14}))|(6767([0-9]{12}|[0-9]{14,15}))$/,/^([0-9]{3}|[0-9]{4})?$/,!0],SM:[RegExp("(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))"),
/^([0-9]{3}|[0-9]{4})?$/,!0],VI:[/^4[0-9]{12}([0-9]{3})?$/,/^[0-9]{3}$/,!0],MC:[/^5[1-5][0-9]{14}$/,/^[0-9]{3}$/,!0],AE:[/^3[47][0-9]{13}$/,/^[0-9]{4}$/,!0],DI:[/^6011[0-9]{12}$/,/^[0-9]{3}$/,!0],JCB:[/^(3[0-9]{15}|(2131|1800)[0-9]{11})$/,/^[0-9]{4}$/,!0],OT:[!1,/^([0-9]{3}|[0-9]{4})?$/,!1]});
