﻿var Validators = {};

var Validator = function(data, constraints, errorhandler){
    this.data = data;
    this.constraints = constraints;

    this.Validate = function(){
        errorhandler.Error('');

        var data = this.data();

        for (var i = 0; i < this.constraints.length; ++i){
            var c = this.constraints[i];
            if (!c.Check) c.Check = this[c.type].apply(c);
            if (!c.Check(data)) return false;
        }

        return true;
    }

    this.ValidateLength = function(){
        if (!this.error) this.error = 'Length must be between ' + min + ' and ' + max;
        min = (this.min) ? this.min : 0;
        max = (this.max) ? this.max : 65536;

        return function(data){
            var input = data.Trim();

            if (input.length < min || input.length > max){
                errorhandler.Error(this.error);
                return false;
            } else return true;
        }
    }

    this.ValidateRequired = function(){
        if (!this.error) this.error = 'Required.';

        return function(data){
            if (!data || (data.Trim && !data.Trim())){
                errorhandler.Error(this.error);
                return false;
            } else return true;
        }
    }

    this.ValidateRange = function(){
        if (!this.error) this.error = 'Value must be between ' + min + ' and ' + max;
        min = (this.min) ? this.min : Number.MIN_VALUE;
        max = (this.max) ? this.max : Number.MAX_VALUE;

        return function(data){
            var input = data * 1;

            if (data < min || data > max){
                errorhandler.Error(this.error);
                return false;
            } else return true;
        }
    }
}
