    //@include lib_Class.js

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

    /**
     * Tool to help finding objects and documents by ID/GUID
     *
     * (taken from ELO standard GotoId script)
     *
     * @author ELO Digital Office GmbH
     * @version 1.1
     *
     * @elojc
     *
     */
    sol.define("sol.dev.jc.GotoId", {
      singleton: true,

      /**
       * Excecuted from button event
       */
      execute: function () {
        var me = this,
            mode = 1,
            lastId = archive.getUserOption("EloJ.S.Script.ELOGotoId.LastId", ""),
            result, isObjId, isDocId, isMD5, searchId, memoText, translate, intId, editInfo, sord;

        if ((lastId != "") && (lastId.charAt(0) == 42)) {
          mode = 2;
          lastId = lastId.substring(1);
        }

        mode = archive.getUserOption("EloJ.S.Script.ELOGotoId.Mode", 1);
        result = me.inputIdDlg(lastId, mode);
        if (!result) {
          return;
        }

        isObjId = result.isObjId;
        isDocId = result.isDocId;
        isMD5 = result.isMD5;
        searchId = result.searchId;

        memoText = searchId;
        if (!isObjId) {
          memoText = "*" + memoText;
        }
        archive.setUserOption("EloJ.S.Script.ELOGotoId.LastId", memoText);

        if (searchId) {
          if (isObjId) {
            try {
              archive.setUserOption("EloJ.S.Script.ELOGotoId.Mode", 1);
              translate = ixConnect.ix().checkoutSord(searchId, EditInfoC.mbSord, LockC.NO);
              isObjId = true;
              intId = translate.sord.id;
            } catch (e) {
              workspace.setFeedbackMessage(this.getText("sol.dev.GotoId.MsgNoGuid") + " " + searchId);
              log.info(e);
              return;
            }
          } else if (isMD5) {
            try {
              archive.setUserOption("EloJ.S.Script.ELOGotoId.Mode", 3);
              sord = ixConnect.ix().checkoutSord("MD5:" + searchId, SordC.mbOnlyId, LockC.NO);
              intId = sord.id;
            } catch (e) {
              workspace.setFeedbackMessage(this.getText("sol.dev.GotoId.MsgNoGuid") + " " + searchId);
              log.info(e);
              return;
            }
          } else if (isDocId) {
            try {
              archive.setUserOption("EloJ.S.Script.ELOGotoId.Mode", 2);
              editInfo = ixConnect.ix().checkoutDoc(null, intId, EditInfoC.mbSord, LockC.NO);
              intId = editInfo.sord.id;
            } catch (e) {
              workspace.setFeedbackMessage(this.getText("sol.dev.GotoId.MsgNoDoc") + " " + intId);
              return;
            }
          }
          if (!workspace.gotoId(parseInt(intId, 10))) {
            workspace.setFeedbackMessage(this.getText("sol.dev.GotoId.MsgNoEntry") + " " + intId);
          }
        }
      },

      /**
       * @private
       * @param {String} lastId
       * @param {Integer} mode
       * @return {Object}
       */
      inputIdDlg: function (lastId, mode) {
        var dialog = workspace.createGridDialog("GotoId", 10, 12),
            panel = dialog.gridPanel,
            txtObjid, txtDocId, txtMd5, ed, rb, item, sep, sord, label2, nextLine, doc, node, reminder, result;

        // haesslicher Work Around - die Textdateien duerfen keine = Zeichen enthalten.
        // Ab Version 8.05 wird alles besser...
        panel.addLabel(1, 1, 10, this.getText("sol.dev.GotoId.MsgInput") + "=" + this.getText("sol.dev.GotoId.MsgInput2"));

        ed = panel.addTextField(1, 3, 10);
        ed.text = lastId;

        rb = [];
        rb[1] = panel.addRadioButton(1, 5, 10, this.getText("sol.dev.GotoId.BtnObjId"), "", "ModeGroup");
        rb[2] = panel.addRadioButton(1, 6, 10, this.getText("sol.dev.GotoId.BtnDocId"), "", "ModeGroup");
        rb[3] = panel.addRadioButton(1, 7, 10, this.getText("sol.dev.GotoId.BtnMD5"), "", "ModeGroup");
        rb[mode].selected = true;

        if (workspace.activeView && workspace.activeView.firstSelected) {
          item = workspace.activeView.firstSelected;
          sep = new Packages.javax.swing.JSeparator();
          panel.addComponent(1, 8, 10, 1, sep);

          sord = item.sord;
          label2 = panel.addLabel(1, 9, 2, this.getText("sol.dev.GotoId.ActItem"));
          label2.bold = true;
          label2 = panel.addLabel(3, 9, 7, item.name);
          label2.bold = true;

          nextLine = 10;
          panel.addLabel(1, nextLine, 2, this.getText("sol.dev.GotoId.ObjectId"));
          txtObjid = panel.addTextField(3, nextLine, 7);
          txtObjid.text = sord.id + " : " + this.asELOName(sord.id) + " : " + sord.guid;
          nextLine++;

          doc = sord.docVersion;
          if (doc) {
            panel.addLabel(1, nextLine, 2, this.getText("sol.dev.GotoId.FileId"));
            txtDocId = panel.addTextField(3, nextLine, 7);
            txtDocId.text = doc.id + " : " + this.asELOName(doc.id) + "." + doc.ext + " : " + doc.guid;
            nextLine++;

            panel.addLabel(1, nextLine, 2, this.getText("sol.dev.GotoId.MD5"));
            txtMd5 = panel.addTextField(3, nextLine, 7);
            txtMd5.text = sord.id + " : " + this.asELOName(sord.id) + " : " + doc.md5;
            nextLine++;
          }

          if (item.task && item.task.wfNode) {
            node = item.task.wfNode;
            panel.addLabel(1, nextLine, 2, this.getText("sol.dev.GotoId.FlowId"));
            panel.addLabel(3, nextLine, 7, node.flowId + "." + node.nodeId);
            nextLine++;
          }

          if (item.task && item.task.reminder) {
            reminder = item.task.reminder;
            panel.addLabel(1, nextLine, 2, this.getText("sol.dev.GotoId.ReminderId"));
            panel.addLabel(3, nextLine, 7, reminder.id);
            nextLine++;
          }
        }

        if (!dialog.show()) {
          return undefined;
        }

        result = {
          isObjId: rb[1].selected,
          isDocId: rb[2].selected,
          isMD5: rb[3].selected,
          searchId: String(ed.text)
        };
        return result;
      },

      /**
        * @private
        * @param {String} id
        * @return {Boolean}
        */
      isGuid: function (id) {
        if (id.length != 38) {
          return false;
        }

        if ((id.substring(0, 1) != "(") || (id.substring(37) != ")")) {
          return false;
        }

        return true;
      },

      /**
       * @private
       * @param {Integer} number
       * @return {String}
       */
      asELOName: function (number) {
        var hexId = Number(number).toString(16);

        if (hexId.length < 8) {
          hexId = "00000000".substring(0, 8 - hexId.length) + hexId;
        }

        return hexId;
      },

      /**
       * @private
       * @param {String} key
       * @return {String}
       */
      getText: function (key) {
        return utils.getText("sol.dev.client", key);
      }

    });