function parseSmartNumber(
    in_data_val,
    max_value,
    def_value,
    auto_val,
    mul_val
  ) {
    if (typeof in_data_val === 'undefined') {
      return typeof def_value === 'number' ? def_value : 0
    } // Endif.

    if (in_data_val === '') {
      in_data_val = 0
    } // Endif.

    var unitPos
    if (typeof in_data_val === 'string') {
      unitPos = in_data_val.search(/(inch|in)$/i)
      if (unitPos >= 0) {
        return parseInt(in_data_val.slice(0, unitPos), 10) * 914400
      } // Endif.

      unitPos = in_data_val.search(/cm$/i)
      if (unitPos >= 0) {
        return parseInt(in_data_val.slice(0, unitPos), 10) * 360000
      } // Endif.

      unitPos = in_data_val.search(/mm$/i)
      if (unitPos >= 0) {
        return parseInt(in_data_val.slice(0, unitPos), 10) * 36000
      } // Endif.

      unitPos = in_data_val.search(/emu{0,1}$/i)
      if (unitPos >= 0) {
        return parseInt(in_data_val.slice(0, unitPos), 10)
      } // Endif.

      unitPos = in_data_val.search(/(point|pt)$/i)
      if (unitPos >= 0) {
        return parseInt(in_data_val.slice(0, unitPos), 10) * 12700
      } // Endif.

      unitPos = in_data_val.search(/(pica|pc)$/i)
      if (unitPos >= 0) {
        return parseInt(in_data_val.slice(0, unitPos), 10) * 12700 * 12
      } // Endif.
    } // Endif.

    if (typeof in_data_val === 'string' && !isNaN(in_data_val)) {
      in_data_val = parseInt(in_data_val, 10)
    } // Endif.

    var realNum = Math.round(mul_val ? in_data_val * mul_val : in_data_val)

    var realVal
    var realMax

    if (typeof in_data_val === 'string') {
      if (in_data_val.indexOf('%') !== -1) {
        realMax = typeof max_value === 'number' ? max_value : 0
        if (realMax <= 0) {
          return 0
        } // Endif.

        realVal = parseInt(in_data_val, 10)
        return Math.round((realMax / 100) * realVal)
      } // Endif.

      if (in_data_val.indexOf('#') !== -1) {
        realVal = parseInt(in_data_val, 10)
        return realMax
      } // Endif.

      var realAuto = typeof auto_val === 'number' ? auto_val : 0

      if (in_data_val === '*') {
        return realAuto
      } // Endif.

      if (in_data_val === 'c') {
        return Math.round(realAuto / 2)
      } // Endif.
    } // Endif.

    if (typeof in_data_val === 'number') {
      return realNum
    } // Endif.

    return typeof def_value === 'number' ? def_value : 0
  }
???.

@param {object} in_data_val Input value as passed by the user.
@param {number} max_value Maximum value allowed.
@param {number} def_value Default value.
@param {number} auto_val ???.
@param {number} mul_val If you didn't provide a unit then we'll multiplay the given value with this value.
@return ???.