/**
 * @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;
     }
});
