/* Javascript by Daniel Cohen Gindi (c) danielgindi@gmail.com 054-5655765 */
/* Version: 2009-03-19 */

function formValidator() { }

formValidator.prototype = {
    summaryHeader: '',
    summaryObj: null,
    _validators: null,
    colorFailure: null,
    emailValidationRegex: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z0-9]{1,}$/i,
    getElement: function(str) {
        var el=document.getElementsByName(str);
        if (el)
        {
        	if (el.length)
        	{
        		if (el.length==1) return el[0];
        		else if (el.length>1) return el;
        	}
        }
        return $find(str);
    },
    ensureValidatorObjects: function(validator) {
        if (validator == null) return;
        if ((typeof validator.obj) == 'string') validator.obj = this.getElement(validator.obj);
        if ((typeof validator.obj1) == 'string') validator.obj1 = this.getElement(validator.obj1);
        if ((typeof validator.obj2) == 'string') validator.obj2 = this.getElement(validator.obj2);
    },
    ensureValidators: function() {
        if (this._validators == null) this._validators = new Array();
    },
    addCompare: function(objId1, objId2, message) {
        var val = new Object();
        val.type = 'compare';
        val.obj1 = objId1;
        val.obj2 = objId2;
        val.message = message;
        this.ensureValidators();
        this._validators.push(val);
    },
    addRequired: function(objId, message) {
        var val = new Object();
        val.type = 'required';
        val.obj = objId;
        val.message = message;
        this.ensureValidators();
        this._validators.push(val);
    },
    addRegex: function(objId, expression, message) {
        var val = new Object();
        val.type = 'regex';
        val.obj = objId;
        val.expression = expression;
        val.message = message;
        this.ensureValidators();
        this._validators.push(val);
    },
    validate: function() {
        var bIsValid = true;
        var message = '';
        this.ensureValidators();
        if ((typeof this.summaryObj) == 'string') this.summaryObj = $find(this.summaryObj);
        for (var i = 0; i < this._validators.length; i++) {
            this.ensureValidatorObjects(this._validators[i]);
            if (this._validators[i].type == 'compare') {
                if (this._validators[i].obj1 && this._validators[i].obj2 &&
                    this._validators[i].obj1.value != this._validators[i].obj2.value) {
                    bIsValid = false;
                    if (this._validators[i].message && this._validators[i].message.length > 0)
                        message += '<li>' + this._validators[i].message + '</li>';
                }
            }
            else if (this._validators[i].type == 'required') {
                if (this._validators[i].obj &&
                    this._validators[i].obj.value!=undefined &&
                    this._validators[i].obj.value.length == 0) {
                    bIsValid = false;
                    if (this._validators[i].message && this._validators[i].message.length > 0)
                        message += '<li>' + this._validators[i].message + '</li>';
                } else if (this._validators[i].obj &&
                    this._validators[i].obj.length) {
                    var opt = -1;
										for (var ii=0; ii<this._validators[i].obj.length; ii++) {
											if (this._validators[i].obj[ii].checked) {opt = ii; break;}
										}
										if (opt == -1) {
	                    bIsValid = false;
	                    if (this._validators[i].message && this._validators[i].message.length > 0)
	                        message += '<li>' + this._validators[i].message + '</li>';
										}               	
                }
            } 
            else if (this._validators[i].type == 'regex') {
                if (this._validators[i].obj &&
                    this._validators[i].expression &&
                    this._validators[i].obj.value!=undefined && 
                    this._validators[i].obj.value.search(this._validators[i].expression) == -1) {
                    bIsValid = false;
                    if (this._validators[i].message && this._validators[i].message.length > 0)
                        message += '<li>' + this._validators[i].message + '</li>';
                }
            }
        }
        if (!bIsValid) {
            var header = this.summaryHeader;
            if (header.length > 0) header += '<br />';
            message = header + '<ul>' + message + '</ul>';
            this.summaryObj.innerHTML = message;
            if ((typeof this.colorFailure) == 'string') this.summaryObj.style.color = this.colorFailure;
            return false;
        }
        return true;
    }
};
