importPackage(Packages.de.elo.ix.client);

//@include lib_Class.js

/**
 * Helper class for reading a users locale settings.
 *
 *     var locale = sol.create('sol.common.Locale', {
 *       ec: ec
 *     });
 *
 *     // read user profile opts and default values
 *     locale.read();
 *
 *     // access properties of the locale object
 *     var lang = locale.language;
 *
 * @author MW, ELO Digital Office GmbH
 * @version 1.0
 *
 * @eloall
 */
sol.define("sol.common.Locale", {

  requiredProperties: ["ec"],

  /**
   * @property {String} language
   * ISO language code of this user.
   *
   *     language = "de"
   */
  /**
   * @property {java.util.Locale} locale
   * Java locale object for this users language.
   */
  /**
   * @property {String} decimalFormatSymbols
   *
   */
  /**
   * @property {String} decimalSeparator
   */
  /**
   * @property {String} groupingSeparator
   */
  /**
   * @property {Object} profileOpts
   * Settings from this users profileOpts database.
   *
   * @property {Object} profileOpts.useDefaultDateFormat Is true if default date format should be used.
   * @property {Object} profileOpts.dateFormat Java Client date format entered by the user.
   * @property {Object} profileOpts.useDefaultSystemSeparator Is true if default separator format should be used.
   * @property {Object} profileOpts.decimalSeparator Separator setting from the Java Client that was entered by the user.
   * @property {Object} profileOpts.thousandSeparator Thousand Separator setting from the Java Client that was entered by the user.
   */

  /**
   * Reads and processes locale specific data from the elo profile opts database and java locale defaults.
   */
  read: function () {
    var me = this;
    me.logger.enter("read", arguments);

    me.language = me.ec.ci.language;
    me.locale = new java.util.Locale(me.language);
    me.decimalFormatSymbols = new java.text.DecimalFormatSymbols(me.locale);
    me.dateFormatSymbols = new java.text.DateFormatSymbols(me.locale);

    me.userProfile = sol.create("sol.common.UserProfile", { userId: me.ec.user.id });
    me.userProfile.read();

    me.profileOpts = {};
    me.profileOpts.useDefaultDateFormat = me.userProfile.getOption("EloJ.I.UseDefaultDateformat");
    me.profileOpts.dateFormat = me.userProfile.getOption("EloJ.S.DateFormat");

    if ((me.profileOpts.useDefaultDateFormat == "0") || !me.profileOpts.dateFormat) {
      me.dateFormat = me.getDefaultDateFormat();
    } else {
      me.dateFormat = me.normalizeDateFormat(me.profileOpts.dateFormat);
    }

    me.profileOpts.useDefaultSystemSeparator = me.userProfile.getOption("EloJ.I.UseDefaultSystemSeparator");
    me.profileOpts.decimalSeparator = me.userProfile.getOption("EloJ.S.DecimalSeparator");
    me.profileOpts.thousandSeparator = me.userProfile.getOption("EloJ.S.ThousandSeparator");

    if ((me.profileOpts.useDefaultSystemSeparator == "0") || !me.profileOpts.decimalSeparator) {
      me.decimalSeparator = me.getDefaultDecimalSeparator();
    } else {
      me.decimalSeparator = me.profileOpts.decimalSeparator;
    }

    if ((me.profileOpts.useDefaultSystemSeparator == "0") || !me.profileOpts.thousandSeparator) {
      me.groupingSeparator = me.getDefaultGroupingSeparator();
    } else {
      me.groupingSeparator = me.profileOpts.thousandSeparator;
    }
    me.logger.exit("read", { dateFormat: me.dateFormat, decimalSeparator: me.decimalSeparator, groupingSeparator: me.groupingSeparator });
  },

  /**
   * @private
   * reads the defaults date format from the java locale class.
   * @return {String} date result
   */
  getDefaultDateFormat: function () {
    var me = this;
    return String(java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM, me.locale).toPattern());
  },

  /**
   * @private
   * @param {Object} dateFormat Java Client date format entered by the user.
   * @return {String} date result
   */
  normalizeDateFormat: function (dateFormat) {
    dateFormat = String(dateFormat);
    dateFormat = dateFormat.replace(/y*/i, function (str) {
      if (str.length == 1) {
        return "yyyy";
      } else {
        return str;
      }
    });
    return dateFormat;
  },

  /**
   * Returns the default decimal separator
   * @return {String} default decimal separator
   */
  getDefaultDecimalSeparator: function () {
    var me = this;
    return me.javaCharToJsString(me.decimalFormatSymbols.decimalSeparator);
  },

  /**
   * Returns the default grouping separator
   * @return {String} default grouping separator
   */
  getDefaultGroupingSeparator: function () {
    var me = this;
    return me.javaCharToJsString(me.decimalFormatSymbols.groupingSeparator);
  },

  /**
   * @private
   * @param {Char} javaChar java character
   * @return {String} java character
   */
  javaCharToJsString: function (javaChar) {
    return String(java.lang.Character.toString(javaChar));
  },

  /**
   * Formats a decimal number
   * @param {String} decimal Decimal
   * @param {Object} params Parameters
   * @param {String} params.decimalSeparator Decimal separator
   * @param {String} params.groupingSeparator Grouping separator
   * @param {Number} params.minimumFractionDigits Minimum fraction digits
   * @param {Number} params.maximumFractionDigits Maximum fraction digits
   * @param {Boolean} params.groupingUsed Grouping used
   * @return {String} Formatted decimal
   */
  formatDecimal: function (decimal, params) {
    var me = this,
        decimalSeparator, groupingSeparator, decimalFormatSymbols, decimalFormat, decimalString, bigDecimal, formattedString;

    if (decimal == "") {
      return "";
    }

    decimalSeparator = (typeof params.decimalSeparator != "undefined") ? params.decimalSeparator : me.decimalSeparator;
    groupingSeparator = (typeof params.groupingSeparator != "undefined") ? params.groupingSeparator : me.groupingSeparator;

    params = params || {};
    params.groupingUsed = (params.groupingUsed == false) ? false : true;

    decimalFormat = new java.text.DecimalFormat();
    decimalFormatSymbols = new java.text.DecimalFormatSymbols();

    decimalFormatSymbols.decimalSeparator = new java.lang.Character(decimalSeparator);
    if (params.groupingUsed) {
      decimalFormat.groupingUsed = true;
      decimalFormatSymbols.groupingSeparator = new java.lang.Character(groupingSeparator);
    } else {
      decimalFormat.groupingUsed = false;
    }

    decimalFormat.decimalFormatSymbols = decimalFormatSymbols;
    if (typeof params.minimumFractionDigits != "undefined") {
      decimalFormat.minimumFractionDigits = java.lang.Integer(params.minimumFractionDigits);
    }
    if (typeof params.maximumFractionDigits != "undefined") {
      decimalFormat.maximumFractionDigits = java.lang.Integer(params.maximumFractionDigits);
    }

    decimalString = decimal + "";
    decimalString = decimalString.replace(",", ".");

    bigDecimal = new java.math.BigDecimal(decimalString);

    formattedString = decimalFormat.format(bigDecimal) + "";

    return formattedString;
  }
});