$("form").attr("autocomplete", "off");
/* 共通設定
@@@================================================================*/
var common = {
  copyFrom: null,

  /* 通信関連
  @@@================================================================*/
  /* ------------------------------
   *  container内にあるdataを配列にいれて返す(update時のsendデータと同様)
   ------------------------------ */
  getContainerInputData: function ($container) {

    //////////////////////// header格納 /////////////////////////
	  var header = $container.find("form.header");
	  var headerList = header.find('input,select[name],textarea').filter(function (e) {
	    if ($(this).attr("type") == "radio") {
	      if ($(this).prop("checked")) {
	        return true;
	      } else {
	        return false;
	      }
	    } else if ($(this).attr("type") == "checkbox") {
	      if ($(this).prop("checked")) {
	        return true;
	      } else {
	        return false;
	      }
	    } else {
	      return true;
	    }
	  });
	  var headerData = encodeJson(headerList);

    //////////////////////// footer格納追加 /////////////////////////
	  var footer = $container.find(".footer");
	  var footerList = footer.find('input,select[name],textarea').filter(function (e) {
	    if ($(this).attr("type") == "radio") {
	      if ($(this).prop("checked")) {
	        return true;
	      } else {
	        return false;
	      }
	    } else if ($(this).attr("type") == "checkbox") {
	      if ($(this).prop("checked")) {
	        return true;
	      } else {
	        return false;
	      }
	    } else {
	      return true;
	    }
	  });
	  var footerData = encodeJson(footerList);

    //////////////////////// detail格納箇所 /////////////////////////
	  var form = $container.find("form.body");
	  var forms = form.find(".detail");

	  var formData = [];
	  for (var i = 0; i < forms.length; i++) {
	    var formList = $(forms[i]).find('input,select[name],textarea').filter(function (e) {
	      if ($(this).attr("type") == "radio") {
	        if ($(this).prop("checked")) {
	          return true;
	        } else {
	          return false;
	        }
	      } else if ($(this).attr("type") == "checkbox") {
	        if ($(this).prop("checked")) {
	          return true;
	        } else {
	          return false;
	        }
	      } else {
	        return true;
	      }
	    });
	    formData.push(encodeJson(formList));
	  }

    //////////////////////// sendData作成 /////////////////////////
	  var sendData = {};
	  sendData["header"] = headerData;
	  sendData["footer"] = footerData;
	  sendData["data"] = formData;

    return sendData;
  },

  /* ------------------------------
   *  引数のタグ内にあるdataを配列にいれて返す
   ------------------------------ */
  getInputData: function ($me) {
    var f = $me.find('input,select[name],textarea').filter(function (e) {
      if ($(this).attr("type") == "radio") {
        if ($(this).prop("checked")) {
          return true;
        } else {
          return false;
        }
      } else if ($(this).attr("type") == "checkbox") {
        if ($(this).prop("checked")) {
          return true;
        } else {
          return false;
        }
      } else {
        return true;
      }
    });
    return f;
  },
  /* ------------------------------
   *  画面遷移を伴うform送信
   ------------------------------ */
  postForm: function (url, data, type) {
    var $form = $('<form/>', { 'action': url, 'method': 'post' });
    if (type) {
      data.push({ name: "action", value: type });
    }
    for (idx in data) {
      var d = data[idx];
      if (d && d.hasOwnProperty("name")) {
        $form.append($('<input/>', { 'type': 'hidden', 'name': d["name"], 'value': d["value"] }));
      } else {
        $form.append($('<input/>', { 'type': 'hidden', 'name': idx, 'value': d }));
      }
    }
    $form.appendTo(document.body);
    $form.submit();
  },
  /* ------------------------------
   *  ajaxでFormを送信
   *  url:
   *  data: json data
   *  fsuccess: 成功時処理
   *  ferror:   失敗時処理
   *  type:     アクションタイプ
   ------------------------------ */
  postData: function (url, data, fsuccess, ferror, type) {
    var me = this;
    if (type) {
      data["ACTION"] = type;
    }
    me.dispLoading();
    hideToolTip();
    $.ajax({
      url: url,
      type: 'POST',
      dataType: 'json',
      contentType: 'application/json',
      data: JSON.stringify(data),
      //timeout: 12000,
    })
      .done(function (response) {
        var status = response.status;
        var data = response.data;
        var options = response;
        delete options.status;
        delete options.data;

        if (status == "OK") {
          if (typeof (fsuccess) == "function") {
            fsuccess(data, options);
          } else {
            alert("正常終了しました。");
          }

        } else {
          if (typeof (ferror) == "function") {
            ferror(data, options);
          } else {
            alert("エラーがあります。");
          }
        }
      })
      .fail(function () {
        alert("通信エラーです。");
      })
      .always(function () {
        me.removeLoading()
      });

  },


  /* ------------------------------
   *  フォームを設定する。
   ------------------------------ */
  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("change");
      } 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);
    });

  },

  focusValidComp: function (form) {
    if (form == null || form == undefined) {
      form = $("#main .contents form").filter(function (idx, el) {
        if ($(el).find(".noevent").length > 0) {
          return false;
        }
        return el;
      }).first();
    }
    var o = $(form).find('input:enabled:not([readonly]):visible:not([tabindex=-1]), select:enabled')
      .not(".noevent *:not(.close, .noEventException)").first();
    if (o != null && o.length > 0) {
      document.getElementById(common.getId(o)).focus();
      $(o).focus();
    }
  },

  /* 数値関連
  @@@==============================================================*/
  /* ------------------------------
   *  ,を付与する
   ------------------------------ */
  addFigure: function (val, fixed, nocomma) {
    if (!fixed) {
      fixed = 0;
    }
    if (!nocomma) {
      nocomma = 0;
    }
    if(stringUtil.isEmpty(val)) {
      return "";
    }

    var w_val = String(val);

    fixed = parseInt(fixed);
    var c = parseFloat(w_val);
    if (!c && c != 0) {
      return w_val;
    }
    var v = this.delFigure(w_val);
    if (fixed > 0) {
      BN = BigNumber.clone({ DECIMAL_PLACES: 2 })
      v = new BN(v).toString();
    }
    v = parseFloat(v).toFixed(fixed);
//    return v.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');

    var s = String(v).split('.');
    var ret = ""
    if (nocomma == 0) { //桁区切り
      ret = String(s[0]).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
    } else {  //桁区切りなし
      ret = String(s[0])
    }
    if (s.length > 1) {
        ret += '.' + s[1];
    }
    return ret;
  },
  /* ------------------------------
   *  指定ミリ秒まつ
   ------------------------------ */
	sleep:function(waitMsec) {
	  var startMsec = new Date();

	  // 指定ミリ秒間だけループさせる（CPUは常にビジー状態）
	  while (new Date() - startMsec < waitMsec);
	},

  /* ------------------------------
   *  ,を削除する
   ------------------------------ */
  delFigure: function (val) {
    if (val == null || val == 0) {
      return val;
    }
    var w_val = String(val);
    var val1;
    var val2;
    if (w_val.match(/\./)) {  //少数以下あり
      var s = String(val).split('.');
      val1 = String(s[0]);
      val1 = val1.replace(/,/g, '');
      val2 = String(s[1]);
      val1 = val1 + "." + val2;
//      val = val.replace(/0$/g, '');
//      val = val.replace(/.0$/g, '');
    } else {
      val1 = w_val.replace(/,/g, '');
    }
//    return w_val.replace(/,/g, '');
    return val1;
  },
  /* ------------------------------
   *  %を付与する
   ------------------------------ */
  addPercent: function (val, fixed) {
    var c = parseFloat(val);
    if (!c && c != 0) {
      return val;
    }
    var v = this.delPercent(val);
    return this.addFigure(v) + "%";
  },
  /* ------------------------------
   *  %を削除する
   ------------------------------ */
  delPercent: function (val) {
    if (val == null) {
      return val;
    }
    if (val.match(/\%/)) {
      val = val.replace(/\%/g, '');
    }
    return this.delFigure(val);
  },

  /* ------------------------------
   *  999を数値化してaugendを加算して999形式に変換する
   *  io     : strvlin: VLIN(999形式)
   *           augend: 加算値
   *  return : VLIN(999形式)
   ------------------------------ */
  vlinAdd: function (strVlin, augend) {
    var l = parseInt(strVlin, 10);
    var a = l + parseInt(augend, 10);
    return ("000" + a).slice(-3);
  },

  /* ウィンドウ関連
  @@@==============================================================*/
  /* ------------------------------
   *  明細の高さを自動計算する
   ------------------------------ */
  setDetailHeight: function (detail, rowHeight, initial, isTimer) {
    var rowHeightOrg = rowHeight;
    var initialOrg = initial;
    var contents = $(detail).closest(".contents");

    var inInitial = initial;
    if (!initial) {
      var hn = this.getDetailHeightForClass(contents, "navbar");
      var hh = this.getDetailHeightForClass(contents, "header");
      var hc = this.getDetailHeightForClass(contents, "command");
      var hdh = this.getDetailHeightForClass(contents, "detailHeader");
      var hdf = this.getDetailHeightForClass(contents, "detailFooter");
      var hf = this.getDetailHeightForClass(contents, "footer");
      initial = hn + hh + hc + hdh + hdf + hf
        + 80  // ステータスバー調整
        //+ 10;   // スクロールバー調整
      //        + 20;   // Function調整
    }
    if (!rowHeight) {
      rowHeight = $(contents).find(".detail").height() + 1;
    }

    var h = window.innerHeight ? window.innerHeight : $(window).height();
    var h1 = h - initial;
    h = h1;
    //var h2 = $(contents).find(".detail").length * rowHeight;
    $(contents).find(".detailArea").height(h);

      var me = this;
    var timer = false;
    $(window).resize(function () {
      if (timer !== false) {
        clearTimeout(timer);
      }
      timer = setTimeout(function () {
        me.setDetailHeight(detail, rowHeightOrg, initialOrg, true);
      }, 200);
    });

    if (!isTimer) {
      $(contents).find(".detailArea").show("fast", function (e) {
        setTimeout(function () {
          $(document).trigger("drowHieght");
        }, 200);
      });
    }

  },
  /* ------------------------------
   * 明細の高さを取得する
   ------------------------------ */
  getDetailHeightForClass: function (findForm, className) {
    var height = 0;
    $(findForm).find("." + className).each(function () {
      height += $(this).outerHeight() || 0;
    });

    return height;
  },

  /* ------------------------------
   * JavascriptからJavascriptを呼ぶ場合に使用する
   * io     : uil:パス
   ------------------------------ */
  loadScript: function (url) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
  },

  /* ------------------------------
   * Loading イメージ表示関数
   * 引数： msg 画面に表示する文言
   ------------------------------ */
  dispLoading: function (msg) {
    // 引数なし（メッセージなし）を許容
    if (msg == undefined) {
      msg = "";
    }
    // 画面表示メッセージ
    var dispMsg = "<div class='loadingMsg'>" + msg + "</div>";
    // ローディング画像が表示されていない場合のみ出力
    if ($("#loading").length == 0) {
      $("body").append("<div id='loading'>" + dispMsg + "</div>");
    }
  },
  dispLoading2Cnt: 0,
  dispLoading2: function (msg) {
    console.log('dispLoading2', this.dispLoading2Cnt);
    // 引数なし（メッセージなし）を許容
    if (msg == undefined) {
      msg = "";
    }
    // 画面表示メッセージ
    var dispMsg = "<div class='loadingMsg'>" + msg + "</div>";
    // ローディング画像が表示されていない場合のみ出力
    if ($("#loading2").length == 0) {
      console.log('start loading', new Date());
      $("body").append("<div id='loading2'>" + dispMsg + "</div>");
    } else {
      this.dispLoading2Cnt++;
    }
  },


  /* ------------------------------
   * Loading イメージ削除関数
   ------------------------------ */
  removeLoading: function () {
    $("#loading").remove();
  },
  removeLoading2: function () {
    console.log('removeLoading2', this.dispLoading2Cnt);
    if (this.dispLoading2Cnt > 0) {
      this.dispLoading2Cnt--;
    } else {
      console.log('end loading', new Date());
      $("#loading2").remove();
    }
  },

  /* ------------------------------
   * Loading イメージ削除関数
   ------------------------------ */
  initialPopup: function (header, detail) {
    var form = $("#" + header).closest("form");
    $(form).find("input[type=text]").each(function (v) {
      $(this).val("");
      common.changeVal($(this));
    });

    var el = document.getElementById(detail);
    var n = el.cloneNode(false);
    el.parentNode.replaceChild(n, el);
  },


  /* 入力関連
  @@@==============================================================*/
  /* ------------------------------
   * 値変更時の共通処理
   ------------------------------ */
  changeVal: function (obj) {
    // バックアップを設定
    $(obj).attr("data-backup", $(obj).val());
  },

  /* ------------------------------
   * 値変更の確認
   ------------------------------ */
  isChange: function (obj, key) {
    //var func = common.getCaller();

    var v1 = $(obj).val();
    var v2 = $(obj).attr("data-backup");

    if (stringUtil.isValid(v2)) { //バックアップアリの場合 20.07.28 この行追加したけどOK？？？
      if (stringUtil.nvl(v1) == stringUtil.nvl(v2)) {
        return false;
      }
    }

    return true;
  },

  /* ------------------------------
   * ユニークなIDを取得する
   * （ない場合は設定する)
   ------------------------------ */
  getId: function (obj) {
    var id = $(obj).attr("id");
    if (id == null) {
      var i = this.getUniqueStr();
      $(obj).attr("id", i);
      return i;
    }
    return id;
  },
  /* ------------------------------
   * ユニークなIDを取得する
   ------------------------------ */
  getUniqueStr: function (myStrong) {
    var strong = 1000;
    if (myStrong) strong = myStrong;
    return new Date().getTime().toString(16) + Math.floor(strong * Math.random()).toString(16)
  },

  /* ------------------------------
   *  エラーを追加する
   ------------------------------ */
  addError: function (target, msg, code, isNoAlert, wfocus=true) {
    $(target).addClass("error");
    var setMsg = stringUtil.nvl(msg);
    if (!stringUtil.isEmpty(code)) {
      setMsg = "[" + code + "]" + setMsg;
    }
    $(target).attr("error-msg", setMsg);
    // $(target).val(""); ＠クリアしない
    common.changeVal($(target));
    if(wfocus) {
      $(target).focus();
    }
    if (!!!isNoAlert) {
      alert(setMsg);
    }
  },
  /* ------------------------------
   *  エラーをクリアする
   ------------------------------ */
  clearError: function (target) {
    $(target).removeClass("error");

    $(target).attr("error-msg", null);
    $(target).attr("data-toggle", null);
    $(target).attr("data-placement", null);
    $(target).attr("data-original-title", "");
  },
  /* ------------------------------
   *  エラーをクリアする
   ------------------------------ */
  clearAllError: function () {
    $(".error").each(function (index) {
      common.clearError($(this));
    });
  },
  /* ------------------------------
   *  フォーム以下のエラーをクリアする
   ------------------------------ */
  clearFormError: function (target) {
    $(target).find(".error").each(function (index) {
      common.clearError($(this));
    });
  },
  /* ------------------------------
   *  要素がが有効であるかどうか
   ------------------------------ */
  isValid: function (obj) {
    if ($(obj).attr("readOnly") == "readonly") {
      return false;
    }
    if ($(obj).attr("disabled") == "disabled") {
      return false;
    }
    return true;
  },

  getApiUrl: function () {
    return $("#API_URL").val();
  },

/*
  直接書くようにする
  getPdfUrl: function () {
    return $("#PDF_URL").val();
  },

  getReportUrl: function () {
    //return $("#REP_URL").val();
    return $("#REPORT_URL").val();
  },
*/

  /* ------------------------------
   * StackTrace APIを利用して呼び出し元を取得する
   *
   * @param {Number} stackIndex 取得するstacktraceのindex, デフォルトは1
   * @return {Object} { file: 'ファイル名’, line: '行番号', func: '関数名（設定されている場合)' }
   ------------------------------ */
  getCaller: function (stackIndex) {
    var callerInfo = {};
    var saveLimit = Error.stackTraceLimit;
    var savePrepare = Error.prepareStackTrace;

    stackIndex = (stackIndex - 0) || 1;

    Error.stackTraceLimit = stackIndex + 1;
    Error.captureStackTrace(this, this.getCaller);

    Error.prepareStackTrace = function (me, stack) {
      var caller = stack[stackIndex];
      callerInfo.file = caller.getFileName();
      callerInfo.line = caller.getLineNumber();
      var func = caller.getFunctionName();
      if (func) {
        callerInfo.func = func;
      }
    };
    this.stack;
    Error.stackTraceLimit = saveLimit;
    Error.prepareStackTrace = savePrepare;
    return callerInfo;
  },

  /* ------------------------------
   *  CSVファイルを取得する。
   ------------------------------ */
  /* ------------------------------
   *  ajaxでFormを送信
   *  url:
   *  data: json data
   *  fsuccess: 成功時処理
   *  ferror:   失敗時処理
   *  type:     アクションタイプ
   ------------------------------ */
  getCsvData: function (url, conditionData, fileName) {

    var me = this;
    me.dispLoading();
    $.ajax({
      url: url,
      type: 'POST',
      dataType: 'text',
      data: conditionData,
      //timeout: 12000,
      beforeSend: function (xhr) {
        xhr.overrideMimeType('text/plain; charset=Shift_JIS');
      },
    })
      .done(function (response) {
        if (stringUtil.isEmpty(response)) {
          alert('該当データがありません。');
        } else {
          common.getCsvFile(fileName, response);
        }
      })
      .fail(function (error) {
        alert("通信エラーです。");
      })
      .always(function () {
        me.removeLoading()
      });
  },
  getCsvFile: function (fileName, content) {
    var unicode_array = common.str_to_unicode_array(content);
    // SJISコードポイントの配列に変換
    var sjis_code_array = Encoding.convert(
      unicode_array, // ※文字列を直接渡すのではない点に注意
      'SJIS',  // to
      'UNICODE' // from
    );
    // 文字コード配列をTypedArrayに変換する
    var uint8_array = new Uint8Array(sjis_code_array);
    // 指定されたデータを保持するBlobを作成する
    var blob = new Blob([uint8_array], { type: 'text/csv' });

    var url = window.URL || window.webkitURL;
    var blobURL = url.createObjectURL(blob);
    var a = document.createElement('a');
    a.download = fileName;
    a.href = blobURL;
    a.click();
  },
  // 文字列から，Unicodeコードポイントの配列を作る
  str_to_unicode_array: function (str) {
    var arr = [];
    for (var i = 0; i < str.length; i++) {
      arr.push(str.charCodeAt(i));
    }
    return arr;
  },

  urlB64ToUint8Array: function (base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding)
      .replace(/\-/g, '+')
      .replace(/_/g, '/');

    const rawData = window.atob(base64);
    const outputArray = new Uint8Array(rawData.length);

    for (let i = 0; i < rawData.length; ++i) {
      outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
  },

  getFirstSelectVal: function (item) {
    var first = item.find("option:first-child").val();

    return first;
  },

  /* ------------------------------
   *  ファイルを取得する。
   *  url:
   *  data: json data
   *  fsuccess: 成功時処理
   *  ferror:   失敗時処理
   *  type:     アクションタイプ
   ------------------------------ */
  getFileData: function (url, conditionData, fileName) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    //xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.responseType = 'blob';
    xhr.onload = function (e) {
      if (this.status == 200) {
        var blob = this.response;
        if (blob.size == 0) {
          alert("ファイルがありません");
          $(".getFileDataOpen").trigger("failedGetFileDataOpen");
          return;
        }

        if (window.navigator.msSaveBlob) {
          window.navigator.msSaveBlob(new Blob([blob]), fileName);
          return;
        }

        console.log('@===blob=', blob);
        //aタグの生成
        var a = document.createElement("a");
        //レスポンスからkBlobオブジェクト＆URLの生成
        var blobUrl = window.URL.createObjectURL(new Blob([blob], {
          type: "application/octet-stream"
       }));
        //上で生成したaタグをアペンド
        document.body.appendChild(a);
        a.style = "display: none";
        //BlobオブジェクトURLをセット
        console.log('a', blobUrl);
        a.href = blobUrl;
        //ダウンロードさせるファイル名の生成
        a.download = fileName;
        //クリックイベント発火
        a.click();
        $(".getFileDataOpen").trigger("afterGetFileDataOpen");  //ダウンロード後イベント用
      } else {
        alert("error");
      }
    };
    var sendData = conditionData;
    xhr.send(sendData);
  },

  /* ------------------------------
   *  ファイルを取得する。
   *  url:
   *  data: json data
   *  fsuccess: 成功時処理
   *  ferror:   失敗時処理
   *  type:     ファイルのタイプ
   ------------------------------ */
  getFileDataOpen: function (url, conditionData, fileName, type=pdf) {
    var data = JSON.parse(conditionData);
    var uniqKey = data.fileName;

    if( type == "pdf" ) {
      var sendData = {};
      sendData["fromName"] = uniqKey;
      sendData["toName"]   = uniqKey + ".pdf";
      common.postData(
          common.getApiUrl() + "rename.php"
        , sendData
        , function(data) {
          var pdf = uniqKey + ".pdf";
          var url = "../../Servlet/PDFTemp/" + pdf;
          var subWin = window.open(url);
          $(".getFileDataOpen").trigger("afterGetFileDataOpen");
        }
        , function(data) {
          alert("ファイルがありません");
        }
      );
    } else {
      var xhr = new XMLHttpRequest();
      xhr.open('POST', url, true);
      //xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xhr.responseType = 'blob';
      xhr.onload = function (e) {
        if (this.status == 200) {
          var blob = this.response;
          if (blob.size == 0) {
            alert("ファイルがありません");
  		      $(".getFileDataOpen").trigger("failedGetFileDataOpen");
            return;
          }

          if (window.navigator.msSaveBlob) {
            window.navigator.msSaveBlob(new Blob([blob]), fileName);
            return;
          }

          console.log('@===blob=', blob);

          //レスポンスからkBlobオブジェクト＆URLの生成
          var blobUrl = window.URL.createObjectURL(new Blob([blob], {type: 'application/'+type }));
  	      window.open(blobUrl);

          //var dllink = document.getElementById("dllink");
          //dllink.href = blobUrl;
          //dllink.setAttribute("download","a.pdf");
          //dllink.setAttribute("target","_blank");
          //dllink.click();

  	      $(".getFileDataOpen").trigger("afterGetFileDataOpen");
        } else {
          alert("error");
        }
      };
      var sendData = conditionData;
      xhr.send(sendData);
    }
  },

  /* ------------------------------
   *  ファイルを取得する。
   *  url:
   *  data: json data
   *  fsuccess: 成功時処理
   *  ferror:   失敗時処理
   *  type:     ファイルのタイプ
   ------------------------------ */
  getFileDataOpen2: function (url, conditionData, fileName, type=pdf) {
    var data = JSON.parse(conditionData);
    var uniqKey = data.fileName;

    if( type == "pdf" ) {
      var sendData = {};
      sendData["fromName"] = uniqKey;
      sendData["toName"]   = uniqKey + ".pdf";
      common.postData(
          common.getApiUrl() + "rename.php"
        , sendData
        , function(data) {
          var pdf = uniqKey + ".pdf";
          var url = "../../Servlet/PDFTemp/" + pdf;
          var subWin = window.open(url);
          $(".getFileDataOpen").trigger("afterGetFileDataOpen");
        }
        , function(data) {
          alert("ファイルがありません");
        }
      );
    } else {
      var xhr = new XMLHttpRequest();
      xhr.open('POST', url, true);
      //xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xhr.responseType = 'blob';
      xhr.onload = function (e) {
        if (this.status == 200) {
          var blob = this.response;
          if (blob.size == 0) {
            alert("ファイルがありません");
  		      $(".getFileDataOpen").trigger("failedGetFileDataOpen");
            return;
          }

          if (window.navigator.msSaveBlob) {
            window.navigator.msSaveBlob(new Blob([blob]), fileName);
            return;
          }
          console.log('@===blob=', blob);

          var blobUrl = window.URL.createObjectURL(new Blob([blob], {type: 'application/'+type }));
  	      window.open(blobUrl);

          //var dllink = document.getElementById("dllink");
          //dllink.href = blobUrl;
          //dllink.setAttribute("download","a.pdf");
          //dllink.setAttribute("target","_blank");
          //dllink.click();

  	      $(".getFileDataOpen").trigger("afterGetFileDataOpen");
        } else {
          alert("error");
        }
      };
      var sendData = conditionData;
      xhr.send(sendData);
    }
  },


  /**
   * 入力値の整数部小数部のチェック
   * @param {*} comp
   */
  checkLength: function (comp) {
    var errMsg = "";

    var maxlength = $(comp).attr("maxlength");
    if (!maxlength) {
      return false;
    }
    var fixed = $(comp).attr("fixed");
    if (!fixed) {
      fixed = 0;
      ajast = 0;
    } else {
      ajast = 1;
    }

    var intLen = parseInt(maxlength) - parseInt(fixed) - ajast;

    var v = common.delFigure($(comp).val());
    var split = v.split(".");
    var intVal = split[0];
    if (intVal.length > intLen) {
      errMsg = "整数部" + intLen + "桁";
    }
    if (split.length > 1) {
      var fixVal = split[1];
      if (fixVal.length > parseInt(fixed)) {
        errMsg = errMsg + " 小数部" + fixed + "桁";
      }
    }

    if (stringUtil.isValid(errMsg)) {
      errMsg = errMsg + "以下で入力してください。";
      //$(comp).trigger('formatError', errMsg);
      common.addError($(comp), errMsg, null, true);
      return true;
    }
    return false;
  },

  /**
   * 入力値の整数部小数部のチェック(マイナスを考慮する)
   * @param {*} comp
   */
   checkMinusLength: function (comp) {
    var errMsg = "";

    var maxlength = $(comp).attr("maxlength");
    if (!maxlength) {
      return false;
    }
    var fixed = $(comp).attr("fixed");
    if (!fixed) {
      fixed = 0;
      ajast = 0;
    } else {
      ajast = 1;
    }

    //マイナス分1桁余分に取っているので、整数部最大長を1桁へらす
    var intLen = parseInt(maxlength) - parseInt(fixed) - ajast -1;

    var v = common.delFigure($(comp).val());
    var split = v.split(".");
    var intVal = split[0];

    //先頭が'-'(マイナス)なら、除去
    if(intVal[0]=='-') {
      //intVal = intVal.replace('-','');
      intVal = intVal.slice(1);
    }

    if (intVal.length > intLen) {
      errMsg = "整数部" + intLen + "桁";
    }
    if (split.length > 1) {
      var fixVal = split[1];
      if (fixVal.length > parseInt(fixed)) {
        errMsg = errMsg + " 小数部" + fixed + "桁";
      }
    }

    if (stringUtil.isValid(errMsg)) {
      errMsg = errMsg + "以下で入力してください。";
      //$(comp).trigger('formatError', errMsg);
      common.addError($(comp), errMsg, null, true);
      return true;
    }
    return false;
  },

  /**
   * 入力するコンポーネントがvalなのか、textなのか判断
   * @param {*} comp
   */
  isTextElement: function (comp) {
    if ($(comp).prop("tagName") == "DIV" || $(comp).prop("tagName") == "LABEL") {
      return true;
    } else {
      return false;
    }
  },
  /**
   * 入力するコンポーネントがcheckboxなのか判断
   * @param {*} comp
   */
   isCheckboxElement: function (comp) {
    if ($(comp).prop("type") == "checkbox") {
      return true;
    } else {
      return false;
    }
  },
  /**
   * 入力するコンポーネントがradioなのか判断
   * @param {*} comp
   */
   isRadioElement: function (comp) {
    if ($(comp).prop("type") == "radio") {
      return true;
    } else {
      return false;
    }
  },
  /**
   * コンポーネントに値を設定する
   * @param {*} comp
   */
   setValue: function (comp, value) {
    if (common.isTextElement(comp)) {
      $(comp).text(value);
    } else if(common.isCheckboxElement(comp)){
      if($(comp).val() == value) {
        $(comp).prop("checked",true);
      } else {
        $(comp).prop("checked",false);
      }
    } else if(common.isRadioElement(comp)) {
      $(comp).each(function (index) {
        if($(this).val() == value) {
          $(this).prop("checked",true);
        }
      });
    } else {
      $(comp).val(value);
    }
  },
  getValue: function (comp) {
/* delFigureも追加 22.05.30 by M.Sasaki */
    let val = '';
    if (common.isTextElement(comp)) {
      val = $(comp).text();
    } else if(common.isCheckboxElement(comp)) {
      if($(comp).prop("checked")) {
        val = $(comp).val();
      } else {
        val = "";
      }
    } else if(common.isRadioElement(comp)) {
      $(comp).each(function (index) {
        if($(this).prop("checked")) {
          val = $(this).val();
          return false;
        }
      });
    } else {
      val = $(comp).val();
    }

    if ($(comp).hasClass("number")) {
      return this.delFigure(val);
    } else {
      return val;
    }
  },

  /**
   * classの有無を確認して、add or removeする
   * @param {*} comp
   * @param {string} classNm
   */
  addClassWhenNone: function (comp, classNm) {
    if (!$(comp).hasClass(classNm)) {
      $(comp).addClass(classNm);
    }
  },
  removeClassWhenThere: function (comp, classNm) {
    if ($(comp).hasClass(classNm)) {
      $(comp).removeClass(classNm);
    }
  },

  /*
  * コンボボックスのreadonly制御
  * pmode : true=readonly, false=not readonly
  */
  setComboboxReadonly: function(el, pmode) {
    if (pmode) {  //readOnly
      el.attr('readonly', true);
      el.css("pointer-events","none");
      el.attr("tabindex", -1);
    } else {  //not radonly
      el.attr('readonly', false);
      el.css("pointer-events","auto");
      el.removeAttr('tabindex');
    }
  },

  /*
  * カレンダーイベントセット
  * 多明細で行追加時に呼ぶ
  * 森川ではplaceholderだけ設定して、カレンダーは表示しない
  */
  setDatepickerInfo: function(el) {
    el.attr("placeholder", "YYYY/MM/DD");
    el.data("initDate", "1");
    el.datepicker({
      maxViewMode: 2,
      todayBtn: "linked",
      language: "ja",
      forceParse: false,
      autoclose: true,
      todayHighlight: true,
      showOnFocus: false
    }).on("show", function (e) {
      if ($(this).val() != "") {
        var fullDate = dateUtil.transDateStr($(this).val());
        $(this).datepicker('setDate', fullDate);
      }
    });
    el.data("initDate", "");
  },

  /*
  * カレンダーイベントセット(yyyy/mm)
  * 多明細で行追加時に呼ぶ
  * 森川ではplaceholderだけ設定して、カレンダーは表示しない
  */
  setDatepickerInfoMM2: function(el) {
    el.attr("placeholder", "YYYY/MM");
    el.data("initDate", "1");
    el.datepicker({
      maxViewMode: 2,
      todayBtn: "linked",
      language: "ja",
      forceParse: false,
      autoclose: true,
      todayHighlight: true,
      showOnFocus: false
    }).on("show", function (e) {
      if ($(this).val() != "") {
        var fullDate = dateUtil.transDateStr($(this).val());
        $(this).datepicker('setDate', fullDate);
      }
    });
    el.data("initDate", "");
  },

  //配列の項目名と同じitemに値をセットする
  //データ１行分
  //meisai:配列名, detail：セットする行
  dspDetailData: function(meisai, detail){
    Object.keys(meisai).forEach( function(value) {
//      console.log( value + '：' + this[value] );
      common.setValue(detail.find("."+value), this[value]);
      if(detail.find("."+value).hasClass("number")) {  //カンマや小数点用

        //先頭"."の時の動作が不正なので、先頭が"."の時は"0"を付与する bySE2464
        let val = common.getValue(detail.find("."+value));
        if(val.slice(0,1) == '.') {
          val = '0' + val;
          common.setValue(detail.find("."+value),val);
        }

        detail.find("."+value).trigger("blur");
      }
    }, meisai);
  },

  /*引数内にあるinput,divのデータのクリア
  チェックボックス・ラジオボタンはチェックを外す　ただし"default-chk"クラスを持っていたらチェック
  コンボボックスは先頭要素を選択状態にする*/
  clearInputData: function(me){
    $(me).find(".clear").each(function (v) {
      if (common.isTextElement($(this))) {
        common.setValue($(this),"");
      } else if(common.isCheckboxElement($(this))){
        $(this).prop("checked",false);
        if($(this).hasClass("default-chk")) {
          $(this).prop("checked",true);
        }
      } else if(common.isRadioElement($(this))) {
        $(this).prop("checked",false);
        if($(this).hasClass("default-chk")) {
          $(this).prop("checked",true);
        }
      } else if($(this).is("select")){
        common.setValue($(this),common.getFirstSelectVal($(this)));
      } else {
        common.setValue($(this),"");
      }
    });
  }
}
