/*-------------------------------------
  行削除時にdeleteユニークキーを覚えておく
--------------------------------------*/
var forDeleteData = [];

/* 共通設定
@@@================================================================*/
var commonLine = {
  copyFrom: null,
  copyFromDiv: null,
  deleteIseq: null,

  /* 行操作
  @@@==============================================================*/
  /* ------------------------------
   *  明細を挿入する
   ------------------------------ */
  insertDetail: function (base, up) {
    // ０件表示の場合は、非表示なのでそれを有効化する
    if ($(base).is(':hidden')) {
      $(base).show();
      return $(base);
    }
    var el = $(base).clone()[0];
    var vlin = $(base).find(".vlin").val();
    var w_chkLineDel = $(el).find(".chkLineDel");

    $(base).removeClass("selectRow");
    $(el).attr("id", null);
    $(el).find("*[id!='']").each(function(index, element) {
      $(element).removeAttr('id');
    });

    // 明細行の初期化
//  radio,checkboxの時にvalを削除してしまうので変更
//  $(el).find(".item, input:not([type=radio]):not([type=checkbox])").each(function (index, element) {
    $(el).find(".item:not([type=radio]):not([type=checkbox]), input:not([type=radio]):not([type=checkbox])").each(function (index, element) {
      common.setValue($(element), "");
      $(element).attr("id", null);
      common.clearError($(element));
      common.changeVal($(element));
    });
//  $(el).find(".item, input[type=radio][type=checkbox]").each(function (index, element) {
    $(el).find(".item[type=radio],.item[type=checkbox], input[type=radio],input[type=checkbox]").each(function (index, element) {
      $(element).attr("id", null);
      common.clearError($(element));
      common.changeVal($(element));
    });
    var p = $(base).parent()[0];

    if (typeof up === "undefined") {
      $(base).after(el);
    } else if (up == "up") {
      $(base).before(el);
    } else {
      $(base).after(el);
    }
    $(p).show();

    $('[data-toggle="tooltip"]').tooltip({ html: true, container: 'body' });

    commonLine.resettingVlin($("#detail"));

    //削除チェックボックスがONだった時はOFFに
    if (w_chkLineDel.prop("checked")) {
      w_chkLineDel.prop("checked", false);
    }

    $(el).find("input,select").each(function (e) {
      var item = $(this);
      //複製元行がkeyItem項目を使用不可にしている場合は初期化
      if (item.hasClass('keyItem')) {
        if ((item.attr("readOnly") == "readonly")) {
          item.attr("readOnly", false);
        }
        if ((item.attr("disabled") == "disabled")) {
          item.attr("disabled", false);
        }
      }
      //セレクトボックスの時は、値を初期化
      if (item.prop("tagName") == "SELECT") {
        item.val(common.getFirstSelectVal(item));
      }
    });

    $(el).trigger("insertLine");

    return el;
  },
  /* ------------------------------
   *  コピー
   ------------------------------ */
  copyDetail: function (base) {
    // コピーの元を保存する
    var o = {};
    var cpyObj = $(base).find("input[name]:not(.notCopy)");
    for (idx = 0; idx < cpyObj.length; idx++) {
      var name = cpyObj[idx].name;
      o[name] = cpyObj[idx].value;
    }

    var o2 = {};
    var cpyObjDiv = $(base).find("div.item");
    for (idx = 0; idx < cpyObjDiv.length; idx++) {
      var name = $(cpyObjDiv[idx]).attr("class");
      o2[name] = common.getValue($(cpyObjDiv[idx]));
    }

    commonLine.copyFrom = o;
    commonLine.copyFromDiv = o2;

    $(base).trigger("copyLine");
  },
  /* ------------------------------
   *  １行下に貼り付け
   ------------------------------ */
  pasteDetail: function (base) {
    var me = $(this);

    if (commonLine.copyFrom == null) {
      return false;
    }

    var ins = commonLine.insertDetail(base);
    console.log('ins', ins);
    var enableObj = $(ins).find(".rowinfo").find(":enabled");
    if (enableObj.length == 0) {
      $(ins).focus();
    } else {
      enableObj.focus();
    }
    // 入力項目
    $(ins).find("input[name]").each(function (e) {
      var v = commonLine.copyFrom[$(this).attr("name")];
      $(this).val(v);
    });
    commonLine.copyFrom = null;

    // 表示項目 コピー
    var pstObjDiv = $(ins).find("div.item");
    console.log('@@@', commonLine.copyFromDiv);
    for (idx = 0; idx < pstObjDiv.length; idx++) {
      var v = commonLine.copyFromDiv[$(this).attr("class")];

      common.setValue($(this), v);
    }
    commonLine.copyFromDiv = null;

    $(ins).trigger("pasteLine");

    return ins;
  },
  /* ------------------------------
   *  明細を削除する
   *  行削除は使用しない
   ------------------------------ */
  /*
     deleteDetail: function (target) {
      var $da = $(target).closest(".detailArea");
      var $first = $da.find(".detail:first");
      if ($da.find(".detail").length > 1) {
        // TODO 削除用のIDを持っておく？？
        if (commonLine.deleteIseq == null) {
          commonLine.deleteIseq = new Array();
        }
        var delIseq = $(target).find(".iseq");
        if (delIseq.length == 1) {
          commonLine.deleteIseq.push(delIseq.val());
        }
        $(target).remove();
        commonLine.resettingVlin($("#detail"));
      }
      $first.trigger("deleteLine");
    },
  */
  /* ------------------------------
   *  チェック変更時に新規行を行削除
   ------------------------------ */
  chkDeleteDetail: function (target) {
    var $da = $(target).closest(".detailArea,.detailArea2");
    var $first = $da.find(".detail:first");
    var $rowinfo = $(target).closest(".rowinfo");
    var details = $da.find(".detail");
    var idx = details.index(target);
    // 削除用のID取得(hasClass(.forDeleteData))
    var $d = $(target).find(".forDeleteData");
    var $kizon = "no";
    if ($d.length != 0) {//forDeleteDataのついた項目がある時
      $d.each(function (e) {
        if ($(this).val() != "") {//値の入っている項目が一つでもあれば既存行
          $kizon = "yes";
          return true;
        }
      });
      if ($kizon == "yes") {//既存行なら配列に追加
        forDeleteData.push(encodeJson($d));
      }
    }
    //既存行は消さない
    if ($kizon == "no") {
      //複数行ある時
      if (details.length > 1) {
        $(target).remove();
        commonLine.resettingVlin($("#detail"));
      } else {  //一行の時
        $(target).find("input:not(.noclear)").val("");
        $(target).find("div.clear").text("");
        //行データ削除後にチェックも消す。
        if ($(target).find(".chkLineDel").prop("checked")) {
          $(target).find(".chkLineDel").prop("checked", false)
        }
      }
    }

    //カーソル制御
    if ($kizon == "no") {
      //$first.trigger("deleteLine");
      if (idx == 0) {
        idx = 0;

        //森川で追加 最後の行を消したとき、ポップアップ用のボタンの"?"をセットする
        //(何もしないとボタンの中身が消えたままになる)
        var firstrow = $(details[0]);
        firstrow.find(".popbtn").each(function (index) {
          common.setValue($(this),"?");
        });

      } else {
        idx = idx - 1;
      }
      $(details[idx]).trigger("deleteLine");
      //    $(details[idx]).focus();
      $($(details[idx]).find("input:not([readonly]),select:not([disabled])")[0]).focus();
      $(details[idx]).find(".chkLineDel").trigger("afterDelLine");
    } else {
      $(target.find("input:not([readonly]),select:not([disabled])")[0]).focus();
      $(target).find(".chkLineDel").trigger("afterDelLine");
    }
  },

  /* ------------------------------
   *  行番号を振り直す
   ------------------------------ */
  resettingVlin: function (detail) {
    var details = $(detail).find(".detail");
    for (var line = 0; line < details.length; line++) {
      var d = details[line];
      var j = line;
	    if($(d).find(".vlin").hasClass("length3")){
//      $(d).find(".vlin").val(common.vlinAdd(j + "", 1));
        common.setValue($(d).find(".vlin"),common.vlinAdd(j + "", 1));
			}else{
//      $(d).find(".vlin").val((common.vlinAdd(j + "", 1)).slice(-2));

//	      common.setValue($(d).find(".vlin"),common.vlinAdd(j + "", 1).slice(-2));
		  //先頭0埋めしない
		  var newviln = Number(common.vlinAdd(j + "", 1));
	      common.setValue($(d).find(".vlin"), newviln);
			}
    }
  },
  /* ------------------------------
   *  明細を初期化する。
   ------------------------------ */
  clearDetail: function (detail) {
    $(detail).find("input").each(function (i) {
      // 入力値をクリア
      $(this).not(".vlin").val("");
      // エラークリア
      common.clearError($(this));
    });;
  },
  /* ------------------------------
   *  明細を初期化する。
   ------------------------------ */
  clearDetailAll: function (detailTop) {
    // 1行目はクリアしつつ、他は削除
    $(detailTop).find(".detail").not(":first").remove();
    var firstDetail = $(detailTop).find(".detail:first");
    common.clearDetail(firstDetail);
  },

  /* ------------------------------
   *  フォームを設定する。
   ------------------------------ */
  setForm: function (detail, data, doEvent) {

    if (doEvent == undefined || doEvent == null) {
      doEvent = true;
    }

    Object.keys(data).forEach(function (key) {
      var c = "." + key;
      var t = $(detail).find(c);
      if (t.length == 0) {
        return;
      }
      t.val(data[key]);

      if (doEvent) {
        $(t).trigger("blur");
      } else {
        if ($(t).hasClass("number") || $(t).hasClass("currency")) {
          var s = stringUtil.toNumber($(t).val());
          $(t).val(common.addFigure(s, $(t).attr("fixed")));
        }
        if ($(t).hasClass("percent")) {
          var s = stringUtil.toNumber($(t).val());
          $(t).val(common.addPercent(s, $(t).attr("fixed")));
        }
      }

      common.changeVal(t);
    });

  },

  /* ------------------------------
   *  空（必須の項目が全て入っていない)の行を削除する
   ------------------------------ */
  delEmptyLine: function (details) {
    if (details == null || details == undefined) {
      return;
    }
    console.log('details', details);
    var debug = true;
    var len = details.length;
    for (var i = 0; i < len; i++) {
      var detail = details[i];
      console.log('detail', detail);

      var reqs = $(detail).find(".required");
      if (reqs.length == 0) {
        // 全て未入力なら
        var lists = $(detail).find("*[value!='']");
        if (lists.length == 0) {
          console.log('delete', lists);
          //commonLine.deleteDetail(detail);
        }
      } else {
        console.log('@2', reqs.length);
        var lists = $(detail).find(".required").filter(function (index) {
          return stringUtil.isValid($(this).val());
        });
        if (lists.length == 0) {
          commonLine.deleteDetail(detail);
        }
      }
    }
  },

}
