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

    //@include lib_Class.js
    //@include lib_sol.common.IxUtils.js
    //@include lib_sol.common.RepoUtils.js
    //@include lib_sol.common.WfUtils.js
    //@include lib_sol.common.Map.js
    //@include lib_sol.common.ix.ServiceBase.js

    var logger = sol.create("sol.Logger", { scope: "sol.common.ix.services.ActionCancelForm" });

    /**
     * Forwards a workflow to the next cancel node.
     *
     * This service is called by the clients if a user closes a workflow form dialog in order to cancel an action.
     *
     * Please note that cancel nodes should be defined by using a localization key `sol.common.wf.node.cancel`.
     *
     * @author MW, ELO Digital Office GmbH
     * @version 1.03.000
     *
     * @eloix
     * @requires  sol.common.IxUtils
     * @requires  sol.common.WfUtils
     * @requires  sol.common.ix.ServiceBase
     */
    sol.define("sol.common.ix.services.ActionCancelForm", {
      extend: "sol.common.ix.ServiceBase",

      wfMapSavedFlag: "FORM_SAVED",

      /**
       * @cfg {String} flowId (required)
       * Flow ID
       */

      /**
       * @cfg {String} nodeId (required)
       * Node ID
       */

      /**
       * @cfg {Array} cancelNodeNameTranslationKeys
       * Translation keys for the node name of cancel nodes
       */
      cancelNodeNameTranslationKeys: [
        "sol.common.wf.node.cancel",
        "sol.common.wf.node.abort",
        "sol.common.wf.node.abbort"
      ],

      /**
       * @cfg {Array} cancelIconNames
       * Icon names of cancel nodes
       */
      cancelIconNames: [
        "sol.common.Cancel",
        "sol.common.Abort",
        "sol.common.Abbort"
      ],

      initialize: function (config) {
        var me = this;

        me.$super("sol.common.ix.ServiceBase", "initialize", [config]);
      },

      /**
       * Forwards a workflow to the next cancel node
       * @return {Object}
       */
      process: function () {
        var me = this,
            result = false,
            saveClicked, workflow, succNode;

        saveClicked = me.determineAndResetSavedState();

        if (!saveClicked) {
          workflow = sol.common.WfUtils.getWorkflow(me.flowId);

          succNode = sol.common.WfUtils.getSuccessorNode(workflow, me.nodeId, {
            nameTranslationKeys: me.cancelNodeNameTranslationKeys,
            iconNames: me.cancelIconNames
          });

          if (succNode) {
            sol.common.WfUtils.forwardWorkflow(me.flowId, me.nodeId, [succNode.id]);
            result = true;
          }
        }

        return { result: result };
      },

      /**
       * @private
       * Determines, if the 'saved flag' (wf map field `FORM_SAVED`) is set to '1'.
       * If that's the case it returns `true` and resets the flag, else it returns `false` and leaves the entry untouched.
       * @return {Boolean}
       */
      determineAndResetSavedState: function () {
        var me = this,
            wfMap, savedFlag;

        wfMap = sol.create("sol.common.WfMap", {
          flowId: me.flowId,
          objId: me.nodeId
        });
        wfMap.read([me.wfMapSavedFlag]);

        savedFlag = (wfMap.getValue(me.wfMapSavedFlag) === "1");

        if (savedFlag === true) {
          wfMap.setValue(me.wfMapSavedFlag, null);
          wfMap.write();
        }

        return savedFlag;
      }
    });

    /**
     * @member sol.common.ix.services.ActionCancelForm
     * @method RF_sol_common_service_ActionCancelForm
     * @static
     * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
     */
    function RF_sol_common_service_ActionCancelForm(ec, args) {
      logger.enter("RF_sol_common_service_ActionCancelForm", args);
      var params,
          result = {},
          resultString, service;

      params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args);

      if (params.flowId && params.nodeId) {
        service = sol.create("sol.common.ix.services.ActionCancelForm", params);
        result = service.process();
      }

      logger.exit("RF_sol_common_service_ActionCancelForm", result);

      resultString = JSON.stringify(result);

      return resultString;
    }