/**
 * Represents a contract
 *
 * @author MW, ELO Digital Office GmbH
 * @version 1.0
 *
 * @elowf
 * @requires sol.contract.forms.Utils
 */
sol.define("sol.contract.forms.Contract", {

  initialize: function () {
    var me = this;
    me.utils = sol.contract.forms.Utils;

    me.utils.setLocalizedKwlField("IX_MAP_CONTRACT_MIN_TERM_UNIT", "y", { onlyIfEmpty: true });
    me.utils.setLocalizedKwlField("IX_MAP_CONTRACT_DURATION_UNIT", "y", { onlyIfEmpty: true });
    me.utils.setLocalizedKwlField("IX_MAP_NOTICE_PERIOD_UNIT", "M", { onlyIfEmpty: true });
    me.utils.setLocalizedKwlField("IX_MAP_REMINDER_PERIOD_UNIT", "w", { onlyIfEmpty: true });
    me.utils.setLocalizedKwlField("IX_MAP_EXTENSION_INTERVAL_UNIT", "y", { onlyIfEmpty: true });
    me.utils.setLocalizedKwlField("IX_MAP_TERMINATION_POINT", "d", { onlyIfEmpty: true });
  },

  /**
   * Shows or hides the fixed-term fields
   * @param {Object} source Changed input field
   */
  setDurationTypeFields: function (source) {
    var me = this;

    if (!source && !$val("IX_MAP_DURATION_TYPE")) {
      $update("IX_MAP_DURATION_TYPE", "sol.contract.form.fixedTerm");
    }

    if (!source && !$val("IX_MAP_TERMINABLE")) {
      $update("IX_MAP_TERMINABLE", "sol.contract.form.notTerminable");
    }

    if (!me.utils.isFieldChangedOrFormLoaded(source, ["IX_MAP_DURATION_TYPE", "IX_MAP_SPECIAL_TERMINATION_RIGHT"])) {
      return;
    }

    if ($val("IX_MAP_DURATION_TYPE") == "sol.contract.form.noTerm") {
      sol.common.forms.Utils.showTemplate($var("LBL_CONTRACT_DATE"));
      sol.common.forms.Utils.hideTemplate($var("LBL_CONTRACT_START"));
    } else {
      sol.common.forms.Utils.hideTemplate($var("LBL_CONTRACT_DATE"));
      sol.common.forms.Utils.showTemplate($var("LBL_CONTRACT_START"));
    }

    if ($val("IX_MAP_DURATION_TYPE") == "sol.contract.form.permanent") {
      $update("IX_MAP_CONTRACT_DURATION", "");
      $update("IX_MAP_EXTENSION_INTERVAL", "");
      $update("IX_MAP_EXTENSION_FLAG", "");
      sol.common.forms.Utils.removeBodyClass("fixedterm_active");
      sol.common.forms.Utils.removeBodyClass("fixedregular_active");
      sol.common.forms.Utils.addBodyClass("permanent_active");
    } else {
      sol.common.forms.Utils.removeBodyClass("permanent_active");
      sol.common.forms.Utils.addBodyClass("fixedterm_active");
      $update("IX_MAP_NEXT_POSSIBLE_CONTRACT_END", "");
      if ($val("IX_MAP_SPECIAL_TERMINATION_RIGHT") == "1") {
        sol.common.forms.Utils.removeBodyClass("fixedregular_active");
      } else {
        sol.common.forms.Utils.addBodyClass("fixedregular_active");
        $update("IX_MAP_NEXT_POSSIBLE_CONTRACT_END", "");
      }
    }
  },

  initPaymentDataFields: function() {
    if (sol.contract.forms.Utils.fieldExists("IX_GRP_CONTRACT_SUBJECTTOVAT") && $val("IX_GRP_CONTRACT_SUBJECTTOVAT") == "") {
      $update("IX_GRP_CONTRACT_SUBJECTTOVAT", "sol.contract.form.subjectToVat.Yes");
    }

    if (sol.contract.forms.Utils.fieldExists("IX_GRP_CONTRACT_PRETAXDEDUCTION") && $val("IX_GRP_CONTRACT_PRETAXDEDUCTION") == "") {
      $update("IX_GRP_CONTRACT_PRETAXDEDUCTION", "sol.contract.form.preTaxDeduction.Yes");
    }
  },

  togglePaymentDataFields: function (source) {
    var me = this;

    if (!sol.common.forms.Utils.checkSource(source)) {
      me.initPaymentDataFields();

      // each of these fields might be undefined, but togglePaymentDataField will still work
      me.togglePaymentDataField($var("IX_GRP_CONTRACT_SUBJECTTOVAT"));
      me.togglePaymentDataField($var("IX_GRP_CONTRACT_PRETAXDEDUCTION"))
    } else {
      me.togglePaymentDataField(source);
    }
  },

  togglePaymentDataField: function (source) {
    var me = this, checkValue, toggleField;

    if (sol.common.forms.Utils.checkSource(source)) {
      if (source.name == "IX_GRP_CONTRACT_SUBJECTTOVAT" && sol.contract.forms.Utils.fieldExists("IX_MAP_CONTRACT_EXEMPTIONSTANDARD")) {
        checkValue = "sol.contract.form.subjectToVat.No";
        toggleField = "IX_MAP_CONTRACT_EXEMPTIONSTANDARD";
      } else if (source.name == "IX_GRP_CONTRACT_PRETAXDEDUCTION" && sol.contract.forms.Utils.fieldExists("IX_MAP_CONTRACT_PROPORTIONALPERCENTAGE")) {
        checkValue = "sol.contract.form.preTaxDeduction.Quotal";
        toggleField = "IX_MAP_CONTRACT_PROPORTIONALPERCENTAGE";
      }

      if (checkValue) {
        value = $val(String(source.name));

        if (value == checkValue) {
          $show("LBL_" + toggleField);
          $show(toggleField);
        } else {
          $hide("LBL_" + toggleField);
          $hide(toggleField);
        }  
      }
    }
  },

  /**
   * Calculates contract data
   * @param {Object} source Changed input field
   *
   */
  calcContract: function (source) {
    var me = this,
        tplSord, updates, contractStart;

    if (!me.utils.isFieldChangedOrFormLoaded(source, ["IX_GRP_CONTRACT_STATUS", "IX_GRP_CONTRACT_START", "IX_GRP_CONTRACT_START_NOTERM", "IX_GRP_CONTRACT_END", "IX_MAP_CONTRACT_DURATION", "IX_MAP_NOTICE_PERIOD", "IX_MAP_TERMINATION_POINT", "IX_MAP_DURATION_TYPE",
      "IX_MAP_CONTRACT_MIN_TERM", "IX_MAP_REMINDER_PERIOD", "IX_MAP_REMINDER_PERIOD", "IX_MAP_SPECIAL_TERMINATION_RIGHT", "IX_MAP_EXTENSION_FLAG", "IX_MAP_EXTENSION_INTERVAL", "IX_MAP_EXTENSION_INTERVAL_UNIT"])) {
      return;
    }

    if (source && source.name) {
      if (source.name == "IX_GRP_CONTRACT_START_NOTERM") {
        contractStart = $val("IX_GRP_CONTRACT_START_NOTERM");
        $update("IX_GRP_CONTRACT_START", contractStart);
      }
    }

    tplSord = sol.common.forms.Utils.getTemplateSord();

    updates = {
      objKeys: {},
      mapKeys: {}
    };

    sol.contract.DurationUtils.calcContract(tplSord, updates);

    sol.common.forms.Utils.updateValues(updates);

    me.utils.setDstFieldWriteableIfEmpty("IX_MAP_CONTRACT_DURATION", "IX_GRP_CONTRACT_END");
    me.utils.setDstFieldWriteableIfEmpty("IX_MAP_NOTICE_PERIOD", "IX_GRP_NEXT_POSSIBLE_TERMINATION");
    me.utils.setDstFieldWriteableIfEmpty("IX_MAP_REMINDER_PERIOD", "IX_GRP_NEXT_REMINDER_DATE");
  },

  /**
   * Calculates the payment plan fields
   * @param {Object} source Changed input field
   */
  calcPaymentPlan: function (source) {
    var me = this,
        cashFlowSum;

    if (!me.utils.isFieldChangedOrFormLoaded(source, ["IX_GRP_CONTRACT_START", "IX_GRP_CONTRACT_END", "IX_MAP_NEXT_POSSIBLE_CONTRACT_END", "IX_MAP_CONTRACT_CASHFLOW_SINGLE", "IX_MAP_CONTRACT_CASHFLOW_DATE", "IX_MAP_CONTRACT_CASHFLOW_TO", "IX_MAP_CONTRACT_CASHFLOW_RECURRING_UNIT"])) {
      return;
    }
    me.utils.forEachRow("IX_MAP_CONTRACT_CASHFLOW_DESC", function (i) {
      var singleAmount, startDateIso, endDateIso, unit,
          rowTotal = "";

      singleAmount = sol.common.forms.Utils.toDecimal("IX_MAP_CONTRACT_CASHFLOW_SINGLE" + i);
      startDateIso = sol.common.forms.Utils.getIsoDate("IX_MAP_CONTRACT_CASHFLOW_DATE" + i) || sol.common.forms.Utils.getIsoDate("IX_GRP_CONTRACT_START");
      endDateIso = sol.common.forms.Utils.getIsoDate("IX_MAP_CONTRACT_CASHFLOW_TO" + i) || sol.common.forms.Utils.getIsoDate("IX_GRP_CONTRACT_END") || sol.common.forms.Utils.getIsoDate("IX_MAP_NEXT_POSSIBLE_CONTRACT_END") || sol.common.DateUtils.nowIso();
      unit = $val("IX_MAP_CONTRACT_CASHFLOW_RECURRING_UNIT" + i);
      if (!unit) {
        me.utils.setLocalizedKwlField("IX_MAP_CONTRACT_CASHFLOW_RECURRING_UNIT" + i, "O", { onlyIfEmpty: true });
        unit = "O";
      }
      rowTotal = sol.contract.DurationUtils.calcRowTotal(startDateIso, endDateIso, singleAmount, unit);
      sol.common.forms.Utils.updateDecimal("IX_MAP_CONTRACT_CASHFLOW_AMOUNT" + i, rowTotal);
    }, me);

    cashFlowSum = sol.common.forms.Utils.sumItems("IX_MAP_CONTRACT_CASHFLOW_AMOUNT");

    sol.common.forms.Utils.updateDecimal("IX_GRP_CONTRACT_CASHFLOW_SUM", cashFlowSum, { callInputChanged: true });
  },

  /**
   * Calculates the amounts
   * @param {Object} source Changed input field
   */
  calcAmounts: function (source) {
    var me = this;
    if (!me.utils.isFieldChangedOrFormLoaded(source, ["IX_GRP_CONTRACT_CASHFLOW_SUM", "IX_MAP_CONTRACT_FX_RATE"])) {
      return;
    }
    me.utils.calcLocalCurrencyAmount("IX_GRP_CONTRACT_CASHFLOW_SUM", "IX_MAP_CONTRACT_FX_RATE", {
      currencyCodeFieldName: "IX_GRP_CONTRACT_CURRENCY_CODE",
      baseCurrencyCodeFieldName: "IX_MAP_CONTRACT_BASE_CURRENCY_CODE",
      dependentElementNames: ["LBL_CONTRACT_CASHFLOW_SUM_LOCAL_CURR","IX_GRP_CONTRACT_CASHFLOW_SUM_LOCAL_CURR","IX_MAP_CONTRACT_FX_RATE", "LBL_CONTRACT_FX_RATE", "IX_MAP_CONTRACT_BASE_CURRENCY_CODE","LBL_CONTRACT_BASE_CURRENCY_CODE"],
      baseCurrencyCode: me.config.baseCurrencyCode
    });
  },

  /**
   * Validates wether the partner name or the last name is set
   * @return {String}
   */
  validateName: function () {
    var message;
    if (!$val("IX_GRP_PARTNER_NAME") && !$val("IX_GRP_CONTACT_LASTNAME")) {
      message = $val("IX_TRANS_PARTNERNAME_OR_LASTNAME");
      return message;
    }
  }
});