/**
* @fileOverview Classes, functions validate data.
* 
* @author Whl Member 
*/

Object.extend(Whl, {
    /**
    * Validate the control on forms, validate all controls that has the attribute 'valid'
    * @memberOf Whl
    * @param {Array} fields Format [['id'], {'validator1': 'message', 'validator2': 'message}]
    * @param {String} frmId
    * @returns {Boolean}
    */
    validate: function(fields, frmId, errMsgControlId, bValidateAll) {
        var firstControl = null;
        var isValid = true;
        frmId = frmId || 'form';
        if (frmId != 'form') frmId = '#' + frmId;
        for (var i = 0, len = fields.length; i < len; i++) {
            var field = fields[i], valid = true;
            var control = $(frmId + ' #' + field[0]), message = null;
            if (!control.isExist() || control.get(0).disabled) continue;
            else {
                //If Function, execute function: Custom validate function
                if (Object.isFunction(field[1])) {
                    valid = field[1]();
                    message = field[2];
                } else {
                    //Use jquery plugin function
                    for (var validator in field[1]) {
                        //Check required fields
                        var opt = null;
                        if (Object.isArray(field[1][validator])) {
                            //opt[0]: Message, opt[1]: Compare Id
                            opt = field[1][validator];
                            message = opt[0];
                        } else {
                            message = field[1][validator];
                        }
                        if (validator == 'blank') {
                            valid = control.isBlank();
                        } else if (validator == 'check') {
                            valid = control.isChecked();
                        } else if (validator == 'email') {
                            valid = control.isEmail();
                        } else if (validator == 'url') {
                            valid = control.isUrl();
                        } else if (validator == 'domain') {
                            valid = control.isDomain();
                        } else if (validator == 'pNumber') {
                            valid = control.isPositiveNumber();
                        } else if (validator == 'gtLength' && opt[1]) {
                            valid = control.gtLength(opt[1]);
                        } else if (validator == 'gtDate' && opt[1]) {
                            valid = control.gtDate(frmId + ' #' + opt[1]);
                        } else if (validator == 'gteqDate' && opt[1]) {
                            valid = control.gtDate(frmId + ' #' + opt[1], true);
                        } else if (validator == 'ltDate' && opt[1]) {
                            valid = control.ltDate(frmId + ' #' + opt[1]);
                        } else if (validator == 'lteqDate' && opt[1]) {
                            valid = control.ltDate(frmId + ' #' + opt[1], true);
                        } else if (validator == 'ltDate2' && opt[1]) {
                            valid = control.ltDate2(opt[1]);
                        } else if (validator == 'eqString' && opt[1]) {
                            valid = control.eqString(frmId + ' #' + opt[1]);
                        } else if (validator == 'gtNumber' && opt[1]) {
                            var compareValue = Object.isNumber(opt[1]) ? opt[1] : $(frmId + ' #' + opt[1]).val();
                            valid = control.gtNumber(compareValue);
                        } else if (validator == 'gteqNumber' && opt[1]) {
                            var compareValue = Object.isNumber(opt[1]) ? opt[1] : $(frmId + ' #' + opt[1]).val();
                            valid = control.gtNumber(compareValue, true);
                        } else if (validator == 'steqNumber' && opt[1]) {
                            var compareValue = Object.isNumber(opt[1]) ? opt[1] : $(frmId + ' #' + opt[1]).val();
                            valid = control.stNumber(compareValue, true);
                        } else if (validator == 'stNumber' && opt[1]) {
                            var compareValue = Object.isNumber(opt[1]) ? opt[1] : $(frmId + ' #' + opt[1]).val();
                            valid = control.stNumber(compareValue);
                        }
                        if (!valid) {
                            if (firstControl == null) {
                                firstControl = control;
                            }
                            break;
                        }
                    }
                }
                //Add error message
                var errMsgControl = errMsgControlId ? $('#' + errMsgControlId) : $(frmId + ' #' + control.attr('id') + 'Invalid');
                if (!valid) {
                    errMsgControl.html(message);
                    errMsgControl.removeClass('error-hide').addClass('error');
                    if (firstControl == null) {
                        firstControl = control;
                    }
                    isValid = valid;
                    if (bValidateAll != null && !bValidateAll) {
                        firstControl.focus();
                        return (false);
                    }
                } else {
                    errMsgControl.html('');
                    errMsgControl.removeClass('error').addClass('error-hide');
                }
            }
        }
        //Focus to the first invalid control
        if (!isValid && firstControl != null) {
            firstControl.focus();
            return false;
        }
        return true;
    }
});
