function llxValidator() {

    var rules = new Array();
    var errors = new Array();
    var Validator = this;
    this.errorElement = undefined;
    this.errorMsg = undefined;

    this.addError = function (element) {
        for (var i = 0; i < errors.length; i++) { if (errors[i] == element) return; }
        errors.push(element);
        Validator.validate();
    }
    this.removeError = function (element) {
        for (var i = 0; i < errors.length; i++) { if (errors[i] == element) errors = errors.splice(i, 1); }
        Validator.validate();
    }

    this.addRule = function (element, expression, okHandler, errorHandler) {
    	if (element == undefined) return;
    	var r = new rule();
    	r.element = element;
    	r.expression = expression;
    	r.okHandler = okHandler;
    	r.errorHandler = errorHandler;
    	r.element.onblur = r.validate;
    	rules.push(r);
    }

    this.validate = function () {
    for (var i = 0; i < rules.length; i++) { rules[i].validate(); }

    }

    function setErrorMessage() {
    if (Validator.errorElement == undefined) return;
    var v = 0;
    for (var i = 0; i < rules.length; i++) { if (rules[i].valid == 1) v++; }
    if (v > 0) { Validator.errorElement.innerHTML = Validator.errorMsg; } else { Validator.errorElement.innerHTML = ""; }

    }

    function rule() {
        this.element;
        this.expression;
        this.okHandler;
        this.errorHandler;
        this.valid = 0;
        var This = this;

        this.validate = function () {
        	var re = new RegExp(This.expression, 'ig');
        	var val = This.element.value.toString();
        	if (This.element.getAttribute("type") == "radio") {
        		if (This.element.checked == true) {This.okHandler(This.element); This.valid = 2; } else { This.errorHandler(This.element); This.valid = 1; }
        		setErrorMessage();
				return;
			}
			if (This.element.getAttribute("type") == "checkbox") {
				if (This.element.checked == true) { This.okHandler(This.element); This.valid = 2; } else { This.errorHandler(This.element); This.valid = 1; }
				setErrorMessage();
				return;
			}
        	if (val.match(re)) { This.okHandler(This.element); This.valid = 2; } else { This.errorHandler(This.element); This.valid = 1; }
        	setErrorMessage();
        }
    
     }

}
