/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
* 
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* 
*/
var Validator=Class.create();Validator.prototype={initialize:function(a,b,c,d){if(typeof c=="function"){this.options=$H(d);this._test=c}else{this.options=$H(c);this._test=function(){return true}}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):true})}};
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(d){return a!=d})},oneOf:function(a,b,c){return $A(c).any(function(d){return a==d})},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(d){return Validation.get(d).test(a,b)})}};var Validation=Class.create();
Validation.prototype={initialize:function(a,b){this.options=Object.extend({onSubmit:true,stopOnFirst:false,immediate:false,focusOnError:true,useTitles:false,onFormValidate:function(){},onElementValidate:function(){}},b||{});this.form=$(a);this.options.onSubmit&&Event.observe(this.form,"submit",this.onSubmit.bind(this),false);if(this.options.immediate){var c=this.options.useTitles,d=this.options.onElementValidate;Form.getElements(this.form).each(function(f){Event.observe(f,"blur",function(e){Validation.validate(Event.element(e),
{useTitle:c,onElementValidate:d})})})}},onSubmit:function(a){this.validate()||Event.stop(a)},validate:function(){var a=false,b=this.options.useTitles,c=this.options.onElementValidate;a=this.options.stopOnFirst?Form.getElements(this.form).all(function(d){return Validation.validate(d,{useTitle:b,onElementValidate:c})}):Form.getElements(this.form).collect(function(d){return Validation.validate(d,{useTitle:b,onElementValidate:c})}).all();!a&&this.options.focusOnError&&Form.getElements(this.form).findAll(function(d){return $(d).hasClassName("validation-failed")}).first().focus();
this.options.onFormValidate(a,this.form);return a},reset:function(){Form.getElements(this.form).each(Validation.reset)}};
Object.extend(Validation,{validate:function(a,b){b=Object.extend({useTitle:false,onElementValidate:function(){}},b||{});a=$(a);return result=a.classNames().all(function(c){c=Validation.test(c,a,b.useTitle);b.onElementValidate(c,a);return c})},test:function(a,b,c){var d=Validation.get(a),f="__advice"+a.camelize();try{if(Validation.isVisible(b)&&!d.test($F(b),b)){if(!b[f]){var e=Validation.getAdvice(a,b);if(e==null){var h=c?b&&b.title?b.title:d.error:d.error;e='<div class="validation-advice" id="advice-'+
a+"-"+Validation.getElmID(b)+'" style="display:none">'+h+"</div>";switch(b.type.toLowerCase()){case "checkbox":case "radio":var g=b.parentNode;if(g)new Insertion.Bottom(g,e);else new Insertion.After(b,e);break;default:new Insertion.After(b,e)}e=Validation.getAdvice(a,b)}if(typeof Effect=="undefined")e.style.display="block";else e.show()}b[f]=true;b.removeClassName("validation-passed");b.addClassName("validation-failed");return false}else{e=Validation.getAdvice(a,b);e!=null&&e.hide();b[f]="";b.removeClassName("validation-failed");
b.addClassName("validation-passed");return true}}catch(i){throw i;}},isVisible:function(a){for(;a.tagName!="BODY";){if(!$(a).visible())return false;a=a.parentNode}return true},getAdvice:function(a,b){return $("advice-"+a+"-"+Validation.getElmID(b))||$("advice-"+Validation.getElmID(b))},getElmID:function(a){return a.id?a.id:a.name},reset:function(a){a=$(a);a.classNames().each(function(b){var c="__advice"+b.camelize();if(a[c]){Validation.getAdvice(b,a).hide();a[c]=""}a.removeClassName("validation-failed");
a.removeClassName("validation-passed")})},add:function(a,b,c,d){var f={};f[a]=new Validator(a,b,c,d);Object.extend(Validation.methods,f)},addAllThese:function(a){var b={};$A(a).each(function(c){b[c[0]]=new Validator(c[0],c[1],c[2],c.length>3?c[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.length==0});
Validation.addAllThese([["required","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(a)&&!/^\s+$/.test(a)}],["validate-digits","Please use numbers only in this field. (Avoid spaces)",function(a){return Validation.get("IsEmpty").test(a)||!/[^\d]/.test(a)}],["validate-alpha","Please use letters only (a-z) in this field.",
function(a){return Validation.get("IsEmpty").test(a)||/^[a-zA-Z]+$/.test(a)}],["validate-alphanum","Please use only letters (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)||!/\W/.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.",function(a){return Validation.get("IsEmpty").test(a)||
/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(a)}],["validate-url","Please enter a valid URL.",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-date-au","Please use this date format: yyyy-mm-dd. For example 2008-03-17 for the 17th of March, 2006.",function(a){if(Validation.get("IsEmpty").test(a))return true;var b=/^(\d{4})\-(\d{2})\-(\d{2})$/;if(!b.test(a))return false;a=new Date(a.replace(b,
"$1/$2/$3"));return parseInt(RegExp.$2,10)==1+a.getMonth()&&parseInt(RegExp.$1,10)==a.getFullYear()&&parseInt(RegExp.$3,10)==a.getDate()}],["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-selection","Please make a selection",function(a,b){return b.options?b.selectedIndex>0:
!Validation.get("IsEmpty").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(d){return $F(d)})}]]);
