docs: function validateFieldValue(fieldId, inputValue, valueIndex, sectionIndex, cb) {
        if ("function" === typeof valueIndex) {
          cb = valueIndex;
          valueIndex = 0;
          sectionIndex = 0;
        }
  
        if (_.isFunction(sectionIndex)) {
          cb = sectionIndex;
          sectionIndex = 0;
        }
  
        init();
  
        var fieldDefinition = fieldMap[fieldId];
  
        var required = false;
        if (fieldDefinition.repeating &&
            fieldDefinition.fieldOptions &&
            fieldDefinition.fieldOptions.definition &&
            fieldDefinition.fieldOptions.definition.minRepeat) {
          required = (valueIndex < fieldDefinition.fieldOptions.definition.minRepeat);
        } else {
          required = fieldDefinition.required;
        }
  
        var validation = (fieldDefinition.fieldOptions && fieldDefinition.fieldOptions.validation) ? fieldDefinition.fieldOptions.validation : undefined;
  
        if (validation && false === validation.validateImmediately) {
          var ret = {
            validation: {valid: true}
          };
  
          assignValidationResponse(fieldId, sectionIndex, ret.validation, {
            "valid": true
          });
  
          return cb(undefined, ret);
        }
  
        var requiredFieldEntry = requiredFieldMap[fieldDefinition._id] || {valueRequired: required};
  
        if (fieldEmpty(inputValue)) {
          if (required && requiredFieldEntry.valueRequired) {
            return formatResponse("No value specified for required input", cb);
          } else {
            return formatResponse(undefined, cb); // optional field not supplied is valid
          }
        }
  
        // not empty need to validate
        getClientValidatorFunction(fieldDefinition.type, function(err, validator) {
          if (err) {
            return cb(err);
          }
  
          validator(inputValue, fieldDefinition, undefined, function(err) {
            var message;
            if (err) {
              if (err.message) {
                message = err.message;
              } else {
                message = "Unknown error message";
              }
            }
            formatResponse(message, cb);
          });
        });
  
        function formatResponse(msg, cb) {
          var messages = {
            errorMessages: []
          };
          if (msg) {
            messages.errorMessages.push(msg);
          }
          return createValidatorResponse(fieldId, messages, sectionIndex, function(err, res) {
            if (err) {
              return cb(err);
            }
            var ret = {
              validation: {}
            };
  
            assignValidationResponse(fieldId, sectionIndex, ret.validation, res);
  
            return cb(undefined, ret);
          });
        }
      }