/* Javascript by Daniel Cohen Gindi (c) danielgindi@gmail.com 054-5655765 */
/* Copyright: Daniel Cohen Gindi, and WeBuildIt */
/* Version: 2009-06-01 */

function formValidator() { }

formValidator.prototype = {
    summaryHeader: '',
    summaryObj: null,
    _validators: null,
    colorFailure: null,
    emailValidationRegex: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z0-9]{1,}$/i,
    emailValidationOrEmptyRegex: /^([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z0-9]{1,})*$/i,
    SUMMARY_DIV_LIST: 0,
    SUMMARY_DIV_ASTERISK: 1,
    SUMMARY_ALERT: 2,
    SUMMARY_NONE: 3,
    summaryMethod: 0,
    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 ajax.$(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 = '';
        var s_pre = '', s_suf = '', s_mpre = '', s_msuf = '';
        this.ensureValidators();
        if (this.summaryMethod == this.SUMMARY_DIV_LIST) {
            s_pre = '<li>'; s_suf = '</li>';
            s_mpre = '<ul>'; s_msuf = '</ul>';
        } else if (this.summaryMethod == this.SUMMARY_DIV_ASTERISK) {
            s_pre = '*&nbsp;'; s_suf = '<br />';
            s_mpre = ''; s_msuf = '';
        } else if (this.summaryMethod == this.SUMMARY_ALERT) {
            s_pre = '\n'; s_suf = '';
            s_mpre = ''; s_msuf = '';
        }
        if ((typeof this.summaryObj) == 'string') this.summaryObj = ajax.$(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.summaryMethod != this.SUMMARY_NONE &&
                        this._validators[i].message && this._validators[i].message.length > 0)
                        message += s_pre + this._validators[i].message + s_suf;
                }
            }
            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.summaryMethod != this.SUMMARY_NONE &&
                        this._validators[i].message && this._validators[i].message.length > 0)
                        message += s_pre + this._validators[i].message + s_suf;
                } else if (this._validators[i].obj &&
                    this._validators[i].obj.selectedIndex == undefined && 
                    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.summaryMethod != this.SUMMARY_NONE &&
	                        this._validators[i].message && this._validators[i].message.length > 0)
                            message += s_pre + this._validators[i].message + s_suf;
                    }
                }
            }
            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.summaryMethod != this.SUMMARY_NONE &&
                        this._validators[i].message && this._validators[i].message.length > 0)
                        message += s_pre + this._validators[i].message + s_suf;
                }
            }
        }
        if (!bIsValid) {
            var header = this.summaryHeader;
            if (this.summaryMethod != this.SUMMARY_NONE) {
                if (header.length > 0) {
                    if (this.summaryMethod == this.SUMMARY_ALERT) header += '\n\n';
                    else if (this.summaryMethod == this.SUMMARY_DIV_LIST) header += '<br />';
                    else if (this.summaryMethod == this.SUMMARY_DIV_ASTERISK) header += '<br />';
                }

                message = message.replace(new RegExp('(^[\n]+)|([\n]+$)', 'g'), '');
                message = header + s_mpre + message + s_msuf;
                if (this.summaryMethod == this.SUMMARY_DIV_LIST || this.summaryMethod == this.SUMMARY_DIV_ASTERISK) {
                    this.summaryObj.innerHTML = message;
                    if ((typeof this.colorFailure) == 'string') this.summaryObj.style.color = this.colorFailure;
                } else if (this.summaryMethod == this.SUMMARY_ALERT) {
                    alert(message);
                }
            }
            return false;
        }
        return true;
    }
};

