/*
 * JavaScriptにより、テーブルの行を操作する。
 * 挿入・削除・追加をサポートする。
 *
 * Copyright (C) 2004 Y System Create Corporation. All Rights Reserved.
 * $Id: rowupdate.js,v 1.2 2004/10/30 06:22:23 bison Exp $
 */

/*
 * コンストラクタ
 * このクラスは、内部でTableEventControllerクラスのメソッドを呼ぶが、
 * 継承のまねごとはしない。
 * JavaScriptでは、本当の意味でのクラス継承はできないので、
 * 継承を前提とした設計は、必ず破綻します。
 * その分、ソースは煩雑となるが、元々大規模なシステムを構成できるだけの
 * 言語仕様を持っていないので、これはしょうがない。
 * JavaScript2.0では、このあたりが大幅に改善されるので、期待大ですが、
 * 殆ど、Javaと変わらないソースに、なってしまいそうです。
 */
function TableRowController() {}
/*
 * イニシャライザ
 * 唯一のHTMLドキュメントとのインターフェイス
 * このメソッドを通して、HTMLドキュメント内のエレメントに対し、
 * イベントハンドラを設定する。
 * このメソッドは、bodyエレメントの、onloadイベントで実行するよう
 * 設定されなければならない。
 */
TableRowController.evhOnloadInit = function (tableId) {

  TableEventController.evhOnloadInit(tableId);
  var inpt = document.getElementById(tableId + controllerId);
  inpt.onfocus    = TableRowController.evhControllerOnfocus;
  inpt.onkeydown  = TableRowController.evhOnkeydown;
  inpt.onkeypress = TableRowController.evhOnkeypress;

  document.getElementById(tableId + "_insertButton").onclick =
    TableRowController.evhInsertButton;
  document.getElementById(tableId + "_deleteButton").onclick =
    TableRowController.evhDeleteButton;
  document.getElementById(tableId + "_appendButton").onclick =
    TableRowController.evhAppendButton;
}


/*
 * イベントコントロールにフォーカスがあった時の、イベントハンドラ
 */
TableRowController.evhControllerOnfocus = function (ev) {

  var trueEvent = JsUtil.getTrueEvent(ev);
  var controller = TableEventController.searchInstance(trueEvent);
  TableRowController.markSelectRow(controller);

  TableEventController.evhControllerOnfocus(ev);
}


/*
 * キー押下時のイベントハンドラ。
 * 必要なイベント以外は、TableEventControllerのevhOnkeypressに渡す。
 */
TableRowController.evhOnkeypress = function (ev) {

  var evt = MyEvent.createEvent(ev);
  var trueEvent = JsUtil.getTrueEvent(ev);
  var controller = TableEventController.searchInstance(trueEvent);

  switch (evt.data) {

    case 0x69 : // 'i' 挿入処理

      TableEventController.insertRow(controller, 0, false);
      break;

    case 0x64 : // 'd' 削除処理

      TableEventController.deleteRow(controller, false);
      break;

    case 0x61 : // 'a' 追加処理

      TableEventController.insertRow(controller, -1, false);
      break;

    default :
      return TableEventController.evhOnkeypress(ev);
  }
  TableRowController.markSelectRow(controller);
}

/*
 * 行の挿入
 * 選択行は挿入した行に移る。
 * rowIndexに、-1を指定すると、テーブルの最後に行を追加する。
 */
TableEventController.insertRow = function (controller, rowIndex, isButton) {

  var tbody = controller.targetTable.table.tBodies.item(0);
//  var row = tbody.rows.item(0).cloneNode(true);
  var row = tbody.rows.item(0);
  var cells = row.cells;

  /*
   * 一旦、選択表示を消す。
   */
  controller.selectRowColumn("", "", "");

  if (rowIndex != -1) {
    rowIndex = controller.row;
  }
  var rowElement = tbody.insertRow(rowIndex);

  for (var i = 0; i < cells.length; i ++) {

    var orgCell = cells.item(i);
    var insertCell = rowElement.insertCell(i);
    DomUtil.deepClone(insertCell, orgCell);
    insertCell.getElementsByTagName("input").item(0).value = "";

    var inputList = insertCell.getElementsByTagName("input");
    inputList.item(0).onblur = TableEventController.evhCellOnblur;
    inputList.item(0).onfocus = TableEventController.evhCellOnfocus;
    inputList.item(0).onkeypress = TableEventController.evhEnterClose;
  }

  controller.row = rowElement.sectionRowIndex;

  /*
   * ボタンクリックにより起動した場合は、選択行の背景色は変更しない。
   */
  if (! isButton) {

    controller.selectRowColumn("#fafafa", "#fafafa", "#afafaf");
  }
}


/*
 * 行の削除
 */
TableEventController.deleteRow = function (controller, isButton) {

  /*
   * 一行しかない場合は、削除しない。
   */
  if (1 == controller.targetTable.getBodiesRowCount()) {
    return;
  }

  var currentIndex = controller.row;

  /*
   * 一旦、選択表示を消す。
   */
  controller.selectRowColumn("", "", "");

  var tbody = controller.targetTable.table.tBodies.item(0);
  tbody.deleteRow(currentIndex);

  if (controller.row >= controller.targetTable.getBodiesRowCount()) {
    controller.row = controller.targetTable.getBodiesRowCount() - 1;
  }

  /*
   * ボタンクリックにより起動した場合は、選択行の背景色は変更しない。
   */
  if (! isButton) {

    controller.selectRowColumn("#fafafa", "#fafafa", "#afafaf");
  }
}


/*
 * キーダウンのイベントで、矢印キーの押下を判定する。
 */
TableRowController.evhOnkeydown = function (ev) {

  ev = JsUtil.getTrueEvent(ev);
  var controller = TableEventController.searchInstance(ev);
  var beforeRowIndex = controller.row;

  if (TableEventController.evhOnkeydown(ev)) {

    return true;
  }

  /*
   * 選択行が変わっていた場合のみ、処理を行う。
   * 現在選択中の行の先頭セルに、'>'をセットする。
   */
  var currentRowIndex = controller.row;

  if (currentRowIndex != beforeRowIndex) {

    TableRowController.markSelectRow(controller);
  }

  return false;
}


/*
 * 先頭セルの'>'を、現在選択行に表示する。
 */
TableRowController.markSelectRow = function (controller) {

  var targetTable = controller.targetTable;
  /*
   * 全ての行から、'>'の表示を消去する。
   * 現在選択中の行の場合のみ、'>'を表示する。
   */
  var rowCount = targetTable.getBodiesRowCount();
  for (var i = 0; i < rowCount; i ++) {

    var rowItem = targetTable.getBodiesRowAt(i);
    var topCell = rowItem.cells.item(0);

    if (controller.row == i) {

      topCell.getElementsByTagName("input").item(0).value = ">";
    }
    else {

      topCell.getElementsByTagName("input").item(0).value = "";
    }
  }
}


TableRowController.evhInsertButton = function (ev) {

  ev = JsUtil.getTrueEvent(ev);
  var controller = TableEventController.searchInstance(ev);

  TableEventController.insertRow(controller, 0, true);
  TableRowController.markSelectRow(controller);
  return false;
}


TableRowController.evhDeleteButton = function (ev) {

  ev = JsUtil.getTrueEvent(ev);
  var controller = TableEventController.searchInstance(ev);

  TableEventController.deleteRow(controller, true);
  TableRowController.markSelectRow(controller);
  return false;
}


TableRowController.evhAppendButton = function (ev) {

  ev = JsUtil.getTrueEvent(ev);
  var controller = TableEventController.searchInstance(ev);

  TableEventController.insertRow(controller, -1, true);
  TableRowController.markSelectRow(controller);
  return false;
}
