//@include lib_Class.js

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

/**
 * Tool to execute registered functions.
 *
 *
 * @author ELO Digital Office GmbH
 *
 * @elojc
 *
 */
sol.define("sol.dev.jc.ExecuteRf", {
  singleton: true,

  /**
   * @private
   * @property {de.elo.client.scripting.dialog.GridDialog} dialog
   */

  /**
   * @private
   * @property {de.elo.client.scripting.dialog.TextField} rfName
   */

  /**
   * @private
   * @property {de.elo.client.scripting.dialog.TextArea} rfParams
   */

  /**
   * Excecuted from button event
   */
  execute: function () {
    var me = this,
        rfName, rfParams, result;

    rfName = archive.getUserOption("EloJ.S.Script.sol.dev.jc.ExecuteRf.rfName", "");
    rfParams = archive.getUserOption("EloJ.S.Script.sol.dev.jc.ExecuteRf.rfParams", "");

    if (me.showDlg(rfName, rfParams)) {
      archive.setUserOption("EloJ.S.Script.sol.dev.jc.ExecuteRf.rfName", me.rfName.text);
      archive.setUserOption("EloJ.S.Script.sol.dev.jc.ExecuteRf.rfParams", me.rfParams.text);

      result = sol.common.IxUtils.execute(me.rfName.text, me.getParamsAsObject());
      if (result) {
        //resultStr = JSON.stringify(result, null, 2);
        //resultStr = resultStr.replace(/(?:\r\n|\r|\n)/g, '<br/>');
        //workspace.showInfoBox(me.getText("sol.dev.jc.ExecuteRf.resultTitle"), resultStr);
        me.showResponseDlg(result);
      }
    }
  },

  /**
   * @private
   * @param {String} rfName
   * @param {String} rfParams
   * @return {Object}
   */
  showDlg: function (rfName, rfParams) {
    var me = this,
        panel;

    me.dialog = workspace.createGridDialog(me.getText("sol.dev.jc.ExecuteRf.dialogTitle"), 10, 12);
    me.dialog.dialogId = "sol.dev.jc.ExecuteRf.dialog";

    panel = me.dialog.gridPanel;

    panel.addLabel(1, 2, 3, me.getText("sol.dev.jc.ExecuteRf.labelName"));
    panel.addLabel(1, 4, 3, me.getText("sol.dev.jc.ExecuteRf.labelParam"));
    me.rfName = panel.addTextField(4, 2, 7);
    me.rfParams = panel.addTextArea(4, 4, 7, 8);

    panel.setGrowing(null, [4]);

    me.rfName.text = rfName;
    me.rfParams.text = rfParams;

    me.rfName.addChangeEvent("solDevJcExecuteInputChanged");
    me.rfParams.addChangeEvent("solDevJcExecuteInputChanged");

    me.checkInput();

    return me.dialog.show();
  },

  /**
   * @private
   * @param {Object} response
   */
  showResponseDlg: function (response) {
    var me = this,
        dlg = workspace.createGridDialog(me.getText("sol.dev.jc.ExecuteRf.resultTitle"), 10, 12),
        responseStr = JSON.stringify(response, null, 2),
        textarea;

    dlg.dialogId = "sol.dev.jc.ExecuteRf.response";
    dlg.gridPanel.setGrowing([1], [1]);
    textarea = dlg.gridPanel.addTextArea(1, 1, 10, 12);
    textarea.text = responseStr;
    textarea.setEditable(false);

    dlg.show();
  },

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

  /**
   * @private
   * @return {Object}
   */
  getParamsAsObject: function () {
    var me = this;

    if (!me.rfParams.text || (me.rfParams.text.trim().length() <= 0)) {
      return {};
    }

    try {
      return JSON.parse(String(me.rfParams.text));
    } catch (ex) {

    }
    return null;
  },

  /**
   * @private
   */
  checkInput: function () {
    var me = this,
        validName = me.checkRfName(),
        validParams = me.checkRfParams();

    if (validName && validParams) {
      me.dialog.setStatusNormal("");
    } else if (!validName) {
      me.dialog.setStatusRed(me.getText("sol.dev.jc.ExecuteRf.notEmptyName"));
    } else if (!validParams) {
      me.dialog.setStatusRed(me.getText("sol.dev.jc.ExecuteRf.notValidParams"));
    }
  },

  /**
   * @private
   * @return {Boolean}
   */
  checkRfName: function () {
    var me = this;
    return (me.rfName.text && (me.rfName.text.trim().length() > 0));
  },

  /**
   * @private
   * @return {Boolean}
   */
  checkRfParams: function () {
    var me = this,
        obj = me.getParamsAsObject();

    return !!obj;
  }

});

/**
 * @private
 * @member sol.dev.jc.ExecuteRf
 */
function solDevJcExecuteInputChanged() {
  sol.dev.jc.ExecuteRf.checkInput();
}