//森川カレンダー不要につきコメントアウト
//common.setDatepickerInfoも同様にコメントアウト済み

//「？」動作追加
//「？」押下で、前の要素がdatepickerを持っていたら、下矢印を押したときにイベントを発火
$(document).on('click',".cmdDatepicker", function(e) {
  let $me = $(e.target);

  console.log($me);

  let prevElement = $me.prev();

  console.log(prevElement);

  if(prevElement.hasClass("datepicker")) {
    //console.log("hasDatepicker");
    var downEvt = $.Event('keydown');
    downEvt.keyCode = 40;    // 下矢印入力時のキーコード
    prevElement.trigger(downEvt);
  }
});


//カレンダーから日付を選択した際に入力して成型後に発行しているトリガーを発行させたい。
//カレンダーを閉じたイベントを拾い、変更しているかどうかをdata-backupで確認。変更していたらdata-backupを更新し発火
$(document).on('hide',".datepicker", function(e) {
  //console.log("hide");
  let mlen = $(this).attr("maxlength");
  let me = common.getValue($(this));
  if(me.length == mlen) {
    if (!common.isChange($(this))) {
      return true;
    } else {
      common.changeVal($(this));
      $(this).trigger("afterChangeDatePicker");
    }
  }

/*  
  //エンターを押したときのイベントを発火し、次のelementにフォーカスを当てる。
  var evt = $.Event('keydown');
  evt.keyCode = 13;   
  $(this).trigger(evt);
*/
});
$(".datepicker-dropdown").click(function(e) {
  console.log("clilck_calendar");
});

// 時間指定
$(".time99 .timepicker").attr("placeholder", "HH:MM");
$(".time .timepicker").attr("placeholder", "HH:MM");

// 日付指定
$(".date .datepicker").attr("placeholder", "YYYY/MM/DD");
$(".date .datepicker").data("initDate", "1");
$(".date .datepicker").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);
  }
});
$(".date .datepicker").data("initDate", "");

// 日付指定
$(".dateYYMMDD .datepicker").attr("placeholder", "YY/MM/DD");
$(".dateYYMMDD .datepicker").data("initDate", "1");
$(".dateYYMMDD .datepicker").datepicker({
  maxViewMode: 2,
  todayBtn: "linked",
  format: "yy/mm/dd",
  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);
  }
});
$(".dateYYMMDD .datepicker").data("initDate", "");

// 月日指定
$(".dateMMDD .datepicker").attr("placeholder", "MM/DD");
$(".dateMMDD .datepicker").data("initDate", "1");
$(".dateMMDD .datepicker").datepicker({
  maxViewMode: 2,
  todayBtn: "linked",
  format: "mm/dd",
  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);
  }
});
$(".dateMMDD .datepicker").data("initDate", "");


// 月度指定
$(".dateMM .datepicker").attr("placeholder", "YY/MM");
$(".dateMM .datepicker").data("initDate", "1");
$(".dateMM .datepicker").datepicker({
  startViewMode: 1,
  maxViewMode: 1,
  minViewMode: 1,
  format: "yy/mm",
  todayBtn: "linked",
  language: "ja",
  forceParse: false,
  autoclose: true,
  todayHighlight: true,
  showOnFocus: false
}).on("show", function (e) {
  if ($(this).val() != "") {
    var fullDate = dateUtil.transDateStrMM($(this).val());
    $(this).datepicker('setDate', fullDate);
  }
}).on("hide", function (e) {
  $(this).blur();
});
$(".dateMM .datepicker").data("initDate", "");

// 月度指定
$(".dateMM2 .datepicker").attr("placeholder", "YYYY/MM");
$(".dateMM2 .datepicker").data("initDate", "1");
$(".dateMM2 .datepicker").datepicker({
  startViewMode: 1,
  maxViewMode: 1,
  minViewMode: 1,
  format: "yyyy/mm",
  todayBtn: "linked",
  language: "ja",
  forceParse: false,
  autoclose: true,
  todayHighlight: true,
  showOnFocus: false
}).on("show", function (e) {
  if ($(this).val() != "") {
    var fullDate = "20" + dateUtil.transDateStrMM($(this).val());
    $(this).datepicker('setDate', fullDate);
  }
}).on("hide", function (e) {
  $(this).blur();
});
$(".dateMM2 .datepicker").data("initDate", "");

// 年度指定
$(".dateYYYY .datepicker").attr("placeholder", "YYYY");
$(".dateYYYY .datepicker").data("initDate", "1");
$(".dateYYYY .datepicker").datepicker({
  startViewMode: 2,
  maxViewMode: 2,
  minViewMode: 2,
  format: "yyyy",
  todayBtn: "linked",
  language: "ja",
  forceParse: false,
  autoclose: true,
  todayHighlight: true,
  showOnFocus: false
}).on("show", function (e) {
  if ($(this).val() != "") {
    var fullDate = dateUtil.transDateStrYYYY($(this).val());
    $(this).datepicker('setDate', fullDate);
  }
}).on("hide", function (e) {
  $(this).blur();
});
$(".dateYYYY .datepicker").data("initDate", "");

// 時刻要素のフォーカスアウト時の操作
$(document).on("change", ".timepicker", function (e) {
  if (!common.isChange($(this))) {
    return true;
  }

  if (stringUtil.isEmpty($(this).val())) {
    $(this).trigger("clearChangeTimePicker");
    return true;
  }
  common.clearError($(this));
  var t;
  var t1;

  if ($(this).attr("placeholder") == "HH:MM") {
    if ($(this).hasClass("time99")) {
  		t = timeUtil.transTimeStrHHMI99($(this).val());
    } else {
	    t = timeUtil.transTimeStrHHMI($(this).val());
    }
  } else {
    t = "";
  }
  $(this).val(t);

  if (t.indexOf("Inalid") != -1 || t.indexOf("Invalid") != -1) {
    common.addError($(this), "不正なフォーマットです");
    $(this).val("");
    return;
  }

  $(this).trigger("afterChangeTimePicker");

});

// 日付要素のフォーカスアウト時の操作
$(document).on("blur", ".datepicker", function (e) {
  if (!common.isChange($(this))) {
    return true;
  }

  if (stringUtil.isEmpty($(this).val())) {
    $(this).trigger("clearChangeDatePicker");
    return true;
  }
  common.clearError($(this));
  var t;
  var t1;
  if ($(this).attr("placeholder") == "YY/MM") {
    t = dateUtil.transDateStrMM($(this).val());
  } else if ($(this).attr("placeholder") == "YY/MM/DD") {
    t = dateUtil.transDateStrYYMMDD($(this).val());
  } else if ($(this).attr("placeholder") == "YYMM") {
    t = dateUtil.transDateStrMM($(this).val());
    var t1 = t.substr(0, 2);
    var t2 = t.substr(3, 5);
    t = t1 + t2;
  } else if ($(this).attr("placeholder") == "YYYY") {
    t = dateUtil.transDateStrYYYY($(this).val());
  } else if ($(this).attr("placeholder") == "YYYY/MM") {
    //    t = dateUtil.transDateStrYYYYMM( $(this).val() );
    t = "20" + dateUtil.transDateStrMM($(this).val());
  } else if ($(this).attr("placeholder") == "MM/DD") {
    t = dateUtil.transDateStrMMDD($(this).val());
  } else {
    t = dateUtil.transDateStr($(this).val());
  }
  $(this).val(t);

  if (t.indexOf("Inalid") != -1 || t.indexOf("Invalid") != -1) {
    common.addError($(this), "不正なフォーマットです");
    $(this).val("");
    return;
  }

  //$(this).datepicker('update', t);

  if ($(this).hasClass("3month")) {
    checkDate.checkBefore3Month($(this));
  }

  if ($(this).hasClass("checkSyukka")) {
    checkDate.checkSyukkaDay($(this));
  }
  if ($(this).hasClass("checkJyutyu")) {
    checkDate.checkJyutyu($(this));
  }
  if ($(this).hasClass("checkNouhin")) {
    checkDate.checkNouhin($(this));
  }

  common.changeVal($(this));

  $(this).trigger("afterChangeDatePicker");

});


var dateUtil = {
  /**
  * func   : YYYY/MM/DD形式のデータをDateに変換する
  * io     : s:String
  * return : Date: 日付
  */
  getYYYYMMDDDate: function (s) {
    var year = s.substr(0, 4) - 0;
    var month = s.substr(5, 2) - 0;
    var day = s.substr(8, 2) - 0;

    // 月,日の妥当性チェック
    if (month < 1 || month > 12 || day < 1 || day > 31) {
      return false;
    }

    return new Date(year, month - 1, day);
  },

  /**
* func   : YYYY/MM/DD形式のデータをDateに変換する
* io     : s:String
* return : Date: 日付
*/
  getYYMMDDDate: function (s) {
    var year = s.substr(0, 2) - 0;
    var month = s.substr(3, 2) - 0;
    var day = s.substr(6, 2) - 0;

    // 月,日の妥当性チェック
    if (month < 1 || month > 12 || day < 1 || day > 31) {
      return false;
    }

    return new Date("20" + year, month - 1, day);
  },


  /**
  * func   : nヶ月前後の年月日を取得する
  * io     : d:Date add:ヶ月後
  * return : Date: 日付
  */
  getAddMonthDate: function (s, add) {
    var dateObject = this.getYYYYMMDDDate(s);;
    // 当日
    var day = dateObject.getDate(); // day of the month number

    // avoid date calculation errors
    dateObject.setHours(20);
    // nヶ月後の最終日を取得する
    dateObject.setMonth(dateObject.getMonth() + add + 1, 0);
    // 当日と最終日小さい方の日を設定
    dateObject.setDate(Math.min(day, dateObject.getDate()));

    return dateObject;
  },

  /**
  * func   : (date)をYYYY/MM/DD方に変換する
  * io     : d:Date
  * return : Date: 日付
  */
  getStrFormatYYYYMMDD: function (d) {
    var y = d.getFullYear();
    var m = d.getMonth() + 1;
    var d = d.getDate();

    if (m < 10) {
      m = '0' + m;
    }
    if (d < 10) {
      d = '0' + d;
    }

    return y + "/" + m + "/" + d;
  },

  /**
  * func   : (date)をYYYY/MM/DD方に変換する
  * io     : d:Date
  * return : Date: 日付
  */
  getStrFormatYYYY: function (d) {
    var y = d.getFullYear();

    return y.toString(10);
  },


  /**
  * func   : 本日の日付をYYYY/MM/DDで取得する
  * io     : d:Date
  * return : Date: 日付
  */
  getTodayStrFormatYYYYMMDD: function () {
    var now = new Date();
    return this.getStrFormatYYYYMMDD(now);
  },

  /**
  * func   : 本日の日付をYYYYで取得する
  * io     : d:Date
  * return : str 日付
  */
  getTodayStrFormatYYYY: function () {
    var now = new Date();
    return this.getStrFormatYYYY(now);
  },

  /**
  * func   : 日付(str)を(yyyy/mm/dd)に変換する
  *        : 入力フォーマット
  *        :   yyyy/mm/dd
  *        :   yy/mm/dd
  *        :   yyyymmdd
  *        :   yymmdd
  *        :   mmdd
  *        :   today => 本日
  * io     : d:Date
  * return : yyyy/mm/dd str errorの場合は"Invalid date"
  */
  transDateStr: function (s) {
    if (!s) {
      return "";
    }

    var today = this.getTodayStrFormatYYYY();

    if (s == "today") {
      return today
    }

    var inFrm = "YYYY/MM/DD";
    var len = s.length;
    if (len != 10
      && len != 9
      && len != 8
      && len != 7
      && len != 6
      && len != 5
      && len != 4
      && len != 3
      && len != 2
      && len != 1) {
      return "Invalid";
    }

    switch (len) {
      case 10:
        if( s.substr(0,1) == '0' ) {
          s = today.substr(0, 1) + s.substr(1);
        }
        break;
      case 9:// yyy/mm/dd
        s = today.substr(0,1) + s;
        break;
      case 8:// yy/mm/dd or yyyymmdd
        if (s.substr(3, 1) == "/") {
          inFrm = "YY/MM/DD";
        } else {
          if( s.substr(0,1) == '0' ) {
            s = today.substr(0, 1) + s.substr(1);
          }
          inFrm = "YYYYMMDD";
        }
        break;
      case 7: // yyymmdd yyyy/mm
        if (s.substr(4, 1) == "/") {
        } else {
          s = today.substr(0,1) + s;
          inFrm = "YYYYMMDD";
        }
        break;
      case 6:// yymmdd
        inFrm = "YYMMDD";
        break;
      case 5:// mm/dd
        inFrm = "MM/DD";
        break;
      case 4:// mmdd or m/dd
        if (s.substr(2.1) == "/") {
          inFrm = "MM/DD";
          s = '0' + s;
        } else {
          inFrm = "MMDD";
        }
        break;
      case 3:// mmdd
        inFrm = "MMDD";
        s = '0' + s;
        break;
      case 2:// dd
        inFrm = "DD";
        break;
      case 1:// dd
        inFrm = "DD";
        s = '0' + s;
        break;
    }

    return moment(s, inFrm).format("YYYY/MM/DD");
  },
  /**
  * func   : 日付(str)を(yyyy/mm)に変換する
  *        : 入力フォーマット
  *        :   yyyy/mm  7
  *        :   yyyymm   6
  *        :   yy/mm    5
  *        :   yymm     4
  *        :   yyyy/mm/dd 10
  *        :   yy/mm/dd   8
  *        :   yyyymmdd   8
  *        : x yymmdd     6
  *        :   yymm       4
  *        :   mmdd       4
  * io     : d:Date
  * return : yyyy/mm str errorの場合は"Invalid date"
  */
  transDateStrMM: function (s) {
    if (!s) {
      return "";
    }

    var today = this.getTodayStrFormatYYYY();

    var inFrm = "YYYY/MM/DD";
    var len = s.length;
    if (len != 10
      && len != 9
      && len != 8
      && len != 7
      && len != 6
      && len != 5
      && len != 4
      && len != 3
      && len != 2
      && len != 1) {
      return "Invalid";;
    }

    switch (len) {
      case 10:
        if( s.substr(0,1) == '0' ) {
          s = today.substr(0, 1) + s.substr(1);
        }
        break;
      case 9:// yyy/mm/dd
        s = today.substr(0,1) + s;
        break;
      case 8:// yy/mm/dd or yyyymmdd
        if (s.substr(3, 1) == "/") {
          inFrm = "YY/MM/DD";
        } else {
          if( s.substr(0,1) == '0' ) {
            s = today.substr(0, 1) + s.substr(1);
          }
          inFrm = "YYYYMMDD";
        }
        break;
      case 7: // yyymmdd
        if (s.substr(4, 1) == "/") {
        } else {
          s = today.substr(0,1) + s;
          inFrm = "YYYYMMDD";
        }
        break;
      case 6:// yymmdd
        inFrm = "YYYYMM";
        break;
      case 5:// mm/dd or ymmdd or yy/mm
        inFrm = "MM/DD";
        if (s.substr(2, 1) != "/") {
          s = today.substr(0,3) + s;
          inFrm = "YYYYMMDD";
        } else {
          s = today.substr(0,2) + s + "/01" ;
          inFrm = "YYYY/MM/DD";
        }
        break;
      case 4:// yymm
        inFrm = "YYMM";
        break;
      case 2:// mm
        inFrm = "MM";
        break;
      case 1:// mm
        inFrm = "MM";
        s = '0' + s;
        break;
    }

    return moment(s, inFrm).format("YY/MM");
  },
  /**
    * func   : 日付(str)を(yyyy/mm/dd)に変換する
    *        : 入力フォーマット
    *        :   yyyy/mm/dd
    *        :   yy/mm/dd
    *        :   yyyymmdd
    *        :   yymmdd
    *        :   mmdd
    *        :   today => 本日
    * io     : d:Date
    * return : yyyy/mm/dd str errorの場合は"Invalid date"
    */
  transDateStrYYMMDD: function (s) {
    if (!s) {
      return "";
    }

    var today = this.getTodayStrFormatYYYY();
    if (s == "today") {
      return today;
    }

    var inFrm = "YYYY/MM/DD";
    var len = s.length;
    if (len != 10
      && len != 9
      && len != 8
      && len != 7
      && len != 6
      && len != 5
      && len != 4
      && len != 3
      && len != 2
      && len != 1) {
      return "Invalid";
    }

    switch (len) {
      case 10:
        if( s.substr(0,1) == '0' ) {
          s = today.substr(0, 1) + s.substr(1);
        }
        break;
      case 9:// yyy/mm/dd
        s = today.substr(0,1) + s;
        break;
      case 8:// yy/mm/dd or yyyymmdd
        if (s.substr(3, 1) == "/") {
          inFrm = "YY/MM/DD";
        } else {
          if( s.substr(0,1) == '0' ) {
            s = today.substr(0, 1) + s.substr(1);
          }
          inFrm = "YYYYMMDD";
        }
        break;
      case 7: // yyymmdd
        if (s.substr(4, 1) == "/") {
        } else {
          s = today.substr(0,1) + s;
          inFrm = "YYYYMMDD";
        }
        break;
      case 6:// yymmdd
        inFrm = "YYMMDD";
        break;
      case 5:// mm/dd or ymmdd
        inFrm = "MM/DD";
        if (s.substr(3, 1) != "/") {
          s = today.substr(0,3) + s;
          inFrm = "YYYYMMDD";
        }
        break;
      case 4:// mmdd or m/dd
        if (s.substr(2.1) == "/") {
          inFrm = "MM/DD";
          s = '0' + s;
        } else {
          inFrm = "MMDD";
        }
        break;
      case 3:// mmdd
        inFrm = "MMDD";
        s = '0' + s;
        break;
      case 2:// dd
        inFrm = "DD";
        break;
      case 1:// dd
        inFrm = "DD";
        s = '0' + s;
        break;
    }

    return moment(s, inFrm).format("YY/MM/DD");
  },
  /**
    * func   : 日付(str)を(yyyy/mm/dd)に変換する
    *        : 入力フォーマット
    *        :   yyyy/mm/dd
    *        :   yy/mm/dd
    *        :   yyyymmdd
    *        :   yymmdd
    *        :   mmdd
    *        :   today => 本日
    * io     : d:Date
    * return : yyyy/mm/dd str errorの場合は"Invalid date"
    */
   transDateStrMMDD: function (s) {
    if (!s) {
      return "";
    }

    var today = this.getTodayStrFormatYYYY();
    if (s == "today") {
      return today;
    }

    var inFrm = "YYYY/MM/DD";
    var len = s.length;
    if (len != 10
      && len != 9
      && len != 8
      && len != 7
      && len != 6
      && len != 5
      && len != 4
      && len != 3
      && len != 2
      && len != 1) {
      return "Invalid";
    }

    switch (len) {
      case 10:
        if( s.substr(0,1) == '0' ) {
          s = today.substr(0, 1) + s.substr(1);
        }
        break;
      case 9:// yyy/mm/dd
        s = today.substr(0,1) + s;
        break;
      case 8:// yy/mm/dd or yyyymmdd
        if (s.substr(3, 1) == "/") {
          inFrm = "YY/MM/DD";
        } else {
          if( s.substr(0,1) == '0' ) {
            s = today.substr(0, 1) + s.substr(1);
          }
          inFrm = "YYYYMMDD";
        }
        break;
      case 7: // yyymmdd
        if (s.substr(4, 1) == "/") {
        } else {
          s = today.substr(0,1) + s;
          inFrm = "YYYYMMDD";
        }
        break;
      case 6:// yymmdd
        inFrm = "YYMMDD";
        break;
      case 5:// mm/dd or ymmdd
        inFrm = "MM/DD";
        if (s.substr(3, 1) != "/") {
          s = today.substr(0,3) + s;
          inFrm = "YYYYMMDD";
        }
        break;
      case 4:// mmdd or m/dd
        if (s.substr(2.1) == "/") {
          inFrm = "MM/DD";
          s = '0' + s;
        } else {
          inFrm = "MMDD";
        }
        break;
      case 3:// mmdd
        inFrm = "MMDD";
        s = '0' + s;
        break;
      case 2:// dd
        inFrm = "DD";
        break;
      case 1:// dd
        inFrm = "DD";
        s = '0' + s;
        break;
    }

    return moment(s, inFrm).format("MM/DD");
  },

  /**
    * func   : 日付(str)を(yyyy/mm/dd)に変換する
    *        : 入力フォーマット
    *        :   yyyy/mm/dd
    *        :   yy/mm/dd
    *        :   yyyymmdd
    *        :   yymmdd
    *        :   mmdd
    *        :   today => 本日
    * io     : d:Date
    * return : yyyy/mm/dd str errorの場合は"Invalid date"
    */
  transDateStrYYYY: function (s) {
    if (!s) {
      return "";
    }
    var today = this.getTodayStrFormatYYYY();
    if (s == "today") {
      return today;
    }

    var inFrm = "YYYY";
    var len = s.length;
    if (len != 4
      && len != 3
      && len != 2
      && len != 1) {
      return "Invalid";
    }

    switch (len) {
      case 4:// yyyy
        if( s.substr(0,1) == '0' ) {
          s = today.substr(0, 1) + s.substr(1);
        }
        inFrm = "YYYY";
        break;
      case 3:// yyy
        inFrm = "YYYY";
        s = today.substr(0, 1) + s;
        break;
      case 2:// yy
        inFrm = "YYYY";
        s = today.substr(0, 2) + s;
        break;
      case 1:// y
        inFrm = "YYYY";
        s = today.substr(0, 2) + "0" + s;
        break;
    }

    return moment(s, inFrm).format("YYYY");
  },

  /**
  * func   : 日付(str)を(yyyy/mm)に変換する
  *        : 入力フォーマット
  *        :   yyyy/mm/dd
  *        :   yy/mm/dd
  *        :   yyyymmdd
  *        :   yymmdd
  *        :   mmdd
  *        :   today => 本日
  * io     : d:Date
  * return : yyyy/mm/dd str errorの場合は"Invalid date"
  */
  transDateStrYYYYMM: function (s) {
    if (!s) {
      return "";
    }
    var today = this.getTodayStrFormatYYYY();
    if (s == "today") {
      return today;
    }

    var inFrm = "YYYY";
    var len = s.length;
    if (len != 7
      && len != 6
      && len != 5
      && len != 4
      && len != 2) {
      return "Invalid";
    }

    switch (len) {
      case 7:// yyyy/mm
        if( s.substr(0,1) == '0' ) {
          s = today.substr(0, 1) + s.substr(1);
        }
        inFrm = "YYYY/MM";
        break;
      case 6:// yyyymm or yyy/mm
        if (s.substr(4, 1) != "/") {
          s = today.substr(0, 1) + s.substr(1);
          inFrm = "YYYY/MM";
        } else {
          inFrm = "YYYYMM";
        }
        break;
      case 5:// yyymm yy/mm
        if (s.substr(2, 1) == "/") {
          s = today.substr(0, 2) + s.substr(1);
          inFrm = "YYYY/MM";
        } else {
          s = today.substr(0, 1) + s.substr(1);
          inFrm = "YYYYMM";
        }
        break;
      case 4:// yymm
        inFrm = "YYMM";
        break;
      case 2:// mm
        inFrm = "YYMM";
        s = today.substr(0, 2) + s;
        break;
    }

    return moment(s, inFrm).format("YYYY/MM");
  },

  getFirstDate: function (date) {
    return new Date(date.getFullYear(), date.getMonth(), 1);
  },
  getLastDate: function (date) {
    return new Date(date.getFullYear(), date.getMonth() + 1, 0);
  },

}

var timeUtil = {
  /**
  * func   : 時刻(str)を(hh:mi)に変換する
  *        : 入力フォーマット
  *        :   hh:mi  5
  *        :   hhmi   4
  * io     : d:Date
  * return : hh:mi str errorの場合は"Invalid date"
  */
  transTimeStrHHMI: function (s) {
    if (!s) {
      return "";
    }

    var len = s.length;
	if (len != 5 && len != 4) {
      return "Invalid";
    }

    switch (len) {
      case 5:// hh:mi
        if (s.substr(2, 1) == ":") {
	        hh = s.substr(0, 2);
	        mi = s.substr(3, 2);
		} else {
			return "Invalid";
		}
        break;
      case 4:// hhmi
        hh = s.substr(0, 2);
        mi = s.substr(2, 2);
        break;
    }

	if (Number(hh) < 0 || Number(hh) > 23) {
      return "Invalid";
    }
	if (Number(mi) < 0 || Number(mi) > 59) {
      return "Invalid";
    }

    return hh+":"+mi;
  },
  /**
  * func   : 時刻(str)を(hh:mi)に変換する
  *        : 入力フォーマット 99:59まで可能
  *        :   hh:mi  5
  *        :   hhmi   4
  * io     : d:Date
  * return : hh:mi str errorの場合は"Invalid date"
  */
  transTimeStrHHMI99: function (s) {
    if (!s) {
      return "";
    }

  var len = s.length;

	if (len != 5 && len != 4) {
      return "Invalid";
    }

    switch (len) {
      case 5:// hh:mi
        if (s.substr(2, 1) == ":") {
	        hh = s.substr(0, 2);
	        mi = s.substr(3, 2);
		} else {
			return "Invalid";
		}
        break;
      case 4:// hhmi
        hh = s.substr(0, 2);
        mi = s.substr(2, 2);
        break;
    }

	if (Number(hh) < 0 || Number(hh) > 99) {
      return "Invalid";
    }
	if (Number(mi) < 0 || Number(mi) > 59) {
      return "Invalid";
    }

    return hh+":"+mi;
  },
}
