    /**
     * Controller for the invoice web form
     *
     * @author MW, ELO Digital Office GmbH
     * @version 1.0
     *
     * @elowf
     * @requires sol.contract.forms.Contract
     */
    sol.define("sol.contract.forms.Controller", {

      /**
       * Event function which is called when an input value has been changed.
       * @param {input} source Changed HTML element.
       */
      inputChanged: function (source) {
        var me = this;

        if (!source) {
          ELO.Configuration.ShowScriptErrors = true;
          ELO.Configuration.PrintAllTabs = true;
          me.contract = sol.create("sol.contract.forms.Contract");
          sol.common.forms.Utils.callRegisteredFunction("RF_sol_common_service_GetMergedConfig", {
            compose: "/contract/Configuration/contract.config"
          }, function (result) {
            me.contract.config = result.config;
            sol.common.forms.Utils.registerResetNewLineFunction("WF_MAP_USER", true);
            sol.common.forms.Utils.disableRowsByIndicatorField("WF_MAP_USER_MANDATORY", function (rowIndex) {
              return !!$val("WF_MAP_USER" + rowIndex) && !!$val("WF_MAP_USER_MANDATORY" + rowIndex);
            });
            me.inputChangedOrFormLoaded(source);
          });
        } else {
          me.inputChangedOrFormLoaded(source);
        }
      },

      /**
       * @private
       * @param {input} source Changed HTML element.
       */
      inputChangedOrFormLoaded: function (source) {
        var me = this, toggleField;

        if ($val("IX_MAP_DEBUG")) {
          if (!source) {
            sol.common.forms.Utils.removeBodyClass("permanent_active");
            sol.common.forms.Utils.removeBodyClass("fixedterm_active");
            sol.contract.forms.Utils.setReadOnly("IX_MAP_NEXT_POSSIBLE_CONTRACT_END", false);
          }
          return;
        }

        me.userListChanged();

        if (sol.contract.forms.Utils.fieldExists("IX_MAP_DURATION_TYPE")) {
          me.contract.setDurationTypeFields(source);
        }

        if (sol.contract.forms.Utils.fieldExists("IX_GRP_CONTRACT_START")) {
          me.contract.calcContract(source);
        }
        if (sol.contract.forms.Utils.fieldExists("IX_GRP_CONTRACT_CASHFLOW_SUM")) {
          me.contract.calcPaymentPlan(source);
          me.contract.calcAmounts(source);
        }
        if (sol.contract.forms.Utils.isField(source, "IX_MAP_CONTRACT_CASHFLOW_TO")) {
          sol.contract.forms.Utils.calcDateByDuration("IX_MAP_CONTRACT_CASHFLOW_DATE", source.name);
        }

        if (me.contract.config.fixedTerm && me.contract.config.fixedTerm.regular && me.contract.config.fixedTerm.regular.withTerminationPoint) {
          sol.common.forms.Utils.removeFieldClass("IX_MAP_TERMINATION_POINT", "fixedregular_disable");
          sol.common.forms.Utils.removeFieldClass("LBL_TERMINATION_POINT", "fixedregular_disable");
        }

        me.contract.togglePaymentDataFields(source);
      },

      /**
       * @private
       */
      userListChanged: function () {
        if ($var("WF_MAP_USER_ID1")) {
          sol.common.forms.Utils.applyUserImages("WF_MAP_USER", "WF_MAP_USER_ID");
        }
      },

      /**
       * Event function which is called when the user has pressed the save button.
       * @return {Boolean} Should the values be saved?
       */
      saveClicked: function () {
        var me = this;

        me.validationData = { allowEmptyNames: true };

        return true;
      },

      /**
       * Event function which is called when the user has pressed a forward button.
       * @param {String} id
       * @return {Boolean}
       */
      nextClicked: function (id) {
        return true;
      },

      addLineIds: {
        payment: 1
      },

      /**
       * Event function which is called when the user has pressed a button to remove a table line.
       * @param {String} addLineId
       * @param {String} groupIndex
       * @return {Boolean}
       */
      removeLineClicked: function (addLineId, groupIndex) {
        var me = this;

        if (addLineId == me.addLineIds.payment) {
          $update("IX_MAP_CONTRACT_CASHFLOW_SINGLE" + groupIndex, "");
          $update("IX_MAP_CONTRACT_CASHFLOW_AMOUNT" + groupIndex, "");
          me.contract.calcPaymentPlan();
        }

        return true;
      },

      onDynListItemSelected: function (dynListItem) {
        sol.common.forms.Utils.callInputChangedForDynKwlChanges(dynListItem);
      },

      validateName: function () {
        var me = this,
            result;

        if (me.validationData && me.validationData.allowEmptyNames) {
          return "";
        }

        result = me.contract.validateName();
        return result;
      },

      /**
       * Registers an update job using the global update registry.
       */
      registerUpdate: function () {
        sol.common.forms.Utils.registerUpdate();
      }
    });