var Validator = Class.create({
   type: "all",

   initialize: function(){},

   doValidate: function(value){
       return "";
   },//end doValidate(value)

   validate: function(input, handler){
       errorMsg = this.doValidate(input.value);
       if((errorMsg.length > 0) && (handler != null)){
           handler.error(input);
       }
       return (errorMsg.length == 0);
   }//end validate(value)

});

var ErrorHandler = Class.create({
   type: "default",

   initialize: function(){},
   
   valid: function(input, target){},

   error: function(input){}
});

var FormValidator = Class.create({
    validators: null,

    handlers: null,

    initialize: function() {
        this.validators = new Array();
        this.handlers = new Array();

        for(var i=0; i<arguments.length; i++){
            if(arguments[i].constructor.superclass == Validator){
                this.validators[arguments[i].type] = arguments[i];
            }else if(arguments[i].constructor.superclass == ErrorHandler){
                this.handlers[arguments[i].type] = arguments[i];
            }
        }//end for(i)
    },//end initialize(..)
    
    validateForm: function(form, target){
        var result = true;

        for(var i=0; i<form.length; i++){
            var input = form[i];

            var handler = this.handlers["default"];
            if(this.handlers[input.getAttribute("error")] != null){
                handler = this.handlers[error];
            }

            if(handler != null){
                handler.valid(input, target)
            }

            $w(input.getAttribute("valid")).each(function(type){
                var valid = this.validate(type, input, handler);
                if(!valid){
                    result = false;
                }
            },this);//end each()
        }//end for(i)

        return result;
    },//end validateForm(form)

    validate: function(type, input, handler){
        var result = true;
        if(this.validators[type] != null){
            result = this.validators[type].validate(input, handler);
        }
        return result;
    }//end validate(type,input)
});

/***** VALIDATORS *****/
var RequiredValidator = Class.create(Validator, {
   type: "required",

   doValidate: function(value){
       if(value.strip().length > 0){
           return "";
       }else{
           return "Required field!";
       }
   }//end doValidate(value)
});

var PhoneValidator = Class.create(Validator, {
    type: "phone",

    doValidate: function(value){
        var phonePattern = /^\(?[2-9]\d{2}\)?\s?[-\.]?\d{3}[-\.]?\d{4}$/;
        if((value.strip().length == 0) || (phonePattern.test(value.strip()))){
            return "";
        }else{
            return "Invalid phone number!";
        }
    }//end doValidate(value)
});

var EmailValidator = Class.create(Validator, {
   type: "email",

   doValidate: function(value){
       var emailPattern = /^[0-9\w]+@\w+\.\w+$/;
       if((value.strip().length == 0) || (emailPattern.test(value.strip()))){
           return "";
       }else{
           return "Invalid email address!";
       }
   }//end doValidate(value)
});
