function FormValidator(formNode) {
    this.errorMessage = "";
    this.formNode = formNode;
}
FormValidator.prototype = {
    addRule: function(fieldName, message, validatorType, args) {
        validatorType = validatorType.toLowerCase(validatorType);
        var element = this.formNode[fieldName];
        if (element != null) {
		 element.style.backgroundColor = '#fff';
         element.style.borderColor = '#e7e7e7';
            switch (validatorType) {
            case "required":
                this.required(element, message);
                break;
            case "rangelength":
                this.rangelength(element, message, args[0], args[1]);
                break;
            case "rangevalues":
                this.rangevalues(element, message, args[0], args[1]);
                break;
            case "numeric":
                this.numeric(element, message);
                break;
            case "positivenumber":
                this.positivenumber(element, message);
                break;
            case "integer":
                this.integer(element, message);
                break;
            case "positiveinteger":
                this.positiveinteger(element, message);
                break;
            case "lettersonly":
                this.lettersonly(element, message);
                break;
            case "zipcode":
                this.zipcode(element, message);
                break;
            case "email":
                this.email(element, message);
                break;
            case "ischecked":
                this.ischecked(element, message, args);
                break;
            case "compare":
                var elementPivot = this.formNode[args];
                if (elementPivot != null) this.compare(element, message, elementPivot);
                break;
            case "creditcard":
                this.creditcard(element, message);
                break;
            case "expression":
                this.expression(element, message, args);
                break;
            case "isnot":
            	this.isnot(element, message, args);
            	break;
            default:
            }
        }
	
    },
    markField: function(element, bg_color, border_color) {
		if (element.style) {
            element.style.backgroundColor = '#fff';
            element.style.borderColor = border_color;
        }
        if (element.length) {
            for (var i = 0, l = element.length; i < l; i++) {
                if (element[i].style) {
                    element[i].style.backgroundColor = bg_color;
                    element[i].style.borderColor = border_color;
                }
            }
        }
    },
    getValue: function(e) {
        var r = '';
        if (e.tagName == 'SELECT') {
            if (e.selectedIndex != -1) {
                r = e.options[e.selectedIndex].getAttribute('value');
                if ((typeof r == 'undefined') || (typeof r == 'object')) {
                    r = e.options[e.selectedIndex].text;
                }
            } else {
                r = '';
            }
        } else if (e.length != undefined) {
            for (i = 0; i < e.length; i++) {
                if (e[i].checked) {
                    r = e[i].value;
                    break;
                }
            }
        } else {
            r = e.value;
        }
        return r;
    },
    invalidField: function(element, message) {
        this.markField(element, "#F5EDB4", "#ed1e24");
        this.errorMessage = this.errorMessage + message + "\n";
    },
    required: function(element, message) {
        if (!/\S/.test(this.getValue(element))) {
            this.invalidField(element, message);
        }
		if(this.getValue(element)=='Full Name'){
			this.invalidField(element, message);
		}
			
    },
    rangelength: function(element, message, minLength, maxLength) {
        var val = this.getValue(element);
        if ((minLength != null && val.length < minLength) || (maxLength != null && val.length > maxLength)) {
            this.invalidField(element, message);
        }
    },
    rangevalues: function(element, message, minValue, maxValue) {
        var val = this.getValue(element);
        if ((minValue != null && val < minValue) || (maxValue != null && val > maxValue)) {
            this.invalidField(element, message);
        }
    },
    numeric: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^(\-?(\d+\.?\d+)|(-?\d+)){1}$/.test(val)) {
            this.invalidField(element, message);
        }
    },
    positivenumber: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^((\d+\.?\d+)|(\d+)){1}$/.test(val)) {
            this.invalidField(element, message);
        }
    },
    integer: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^-?\d+$/.test(val)) {
            this.invalidField(element, message);
        }
    },
    positiveinteger: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^\d+$/.test(val)) {
            this.invalidField(element, message);
        }
    },
    lettersonly: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^[a-zA-Z\s]+$/.test(val)) {
            this.invalidField(element, message);
        }
    },
    zipcode: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^\d{5}$/.test(val)) {
            this.invalidField(element, message);
        }
    },
    email: function(element, message) {
        var val = this.getValue(element);
        if (val.length > 0 && !/^\S+@\S+(\.\S+)*\.(\S{2,4})$/i.test(val) || /[\(\)\<\>\,\;\:\\\"\[\]]/.test(val)) {
            this.invalidField(element, message);
        }
    },
    ischecked: function(element, message, args) {
        var me = this;
        var operator = "or";
        function verifyGroup(element) {
            var i = 0;
            var flag = (operator == 'and') ? true: false;
            if (element.length) {
                while (i < element.length) {
                    if (operator == "and") {
                        flag = flag && element[i].checked;
                    } else {
                        flag = flag || element[i].checked;
                    }
                    i++;
                }
                if (!flag) {
                    for (var j = 0; j < element.length; j++) me.markField(element[j], "#F5EDB4", "#FF9933");
                    me.invalidField(element[0], message);
                }
            } else {
                if (element.checked == false) me.invalidField(element, message);
            }
        };
        if (args) {
            operator = (args[0].toLowerCase() == "all") ? "and": "or";
            if (args.length > 1) {
                var tmpArr = new Array();
                tmpArr = tmpArr.concat(element);
                for (var i = 1; i < args.length; i++) {
                    tmpArr = tmpArr.concat(me.formNode[args[i]]);
                }
                element = tmpArr;
            }
        }
        verifyGroup(element);
    },
    compare: function(element, message, elementPivot) {
        var val = this.getValue(element),
        valPivot = this.getValue(elementPivot);
        if (val != valPivot) {
            this.markField(elementPivot, "#F5EDB4", "#FF9933");
            this.invalidField(element, message);
        }
    },
    expression: function(element, message, regularExpression) {
        if (!regularExpression.test(this.getValue(element))) {
            this.invalidField(element, message);
        }
    },
    creditcard: function(element, message, regularExpression) {
        var s = this.getValue(element);
        s = s.replace(/\D/g, "");
        var nl = s.length,
        p = nl % 2,
        t = 0;
        for (i = 0; i < nl; i++) {
            var d = s.charAt(i);
            if (i % 2 == p) {
                d = d * 2;
                if (d > 9) {
                    d = d - 9;
                }
            }
            t = t + parseInt(d);
        }
        if (t % 10 != 0) {
            this.invalidField(element, message);
        }
    },
    validate: function() {
        if (this.errorMessage != "") {
            alert(this.errorMessage);
            return false;
        }
        return true;
    }
};