// -----------------------------------------------------------------
// ********************jrecin共通用********************
// -----------------------------------------------------------------

/* ==========================================================================
 *
 * 画面制御用
 *
 * ======================================================================= */

//----------------------------------------
//二重押し防止フラグ
//----------------------------------------
var submitValue = true;
function send(){
  if (!submitValue) return false;
  submitValue = false;
  return true;
}


//----------------------------------------
//F5を無効化する。
//----------------------------------------
window.document.onkeydown = function(){
  if (event.keyCode == 116){
    event.keyCode = null;
    return false;
  }
  if(event.button >= 2){
    event.keyCode = null;
    return false;
  }
}


//----------------------------------------
//右クリックを無効化する。
//----------------------------------------
//window.document.oncontextmenu = function(){
//  return false;
//}


/* ==========================================================================
 * Trim
 *
 * parametar: strWork 評価文字列
 * return   : strWork Trimされた評価文字列
 * overview :
 * 評価文字列をTrimする。
 *
 * ======================================================================= */
function Trim(strWork)
{
  return RTrim(LTrim(strWork));
}

/* ==========================================================================
 * RTrim
 *
 * parametar: strWork 評価文字列
 * return   : strWork RTrimされた評価文字列
 * overview :
 * 評価文字列をRTrimする。
 *
 * ======================================================================= */
function RTrim(strWork)
{
  var count = 0;
  while (count < strWork.length)
  {
    if (strWork.charAt(strWork.length - (count +1)) == ' ' ) {
      count++;
    } else {
      break;
    }
  }
  return strWork.substring(0, strWork.length - (count));
}
/* ==========================================================================
 * LTrim
 *
 * parametar: strWork 評価文字列
 * return   : strWork LTrimされた評価文字列
 * overview :
 * 評価文字列をLTrimする。
 *
 * ======================================================================= */
function LTrim(strWork)
{
  var count = 0;
  while (count < strWork.length)
  {
    if (strWork.charAt(count) == ' ' ) {
      count++;
    } else {
      break;
    }
  }
  return strWork.substring(count, strWork.length);
}

/* ==========================================================================
 *
 * 文字種チェック
 *
 * ======================================================================= */

/* ==========================================================================
 * checkLength
 *
 * parametar: str 評価文字列
 * parametar: minLength 最短文字列長
 * parametar: maxLength 最長文字列長
 * return   : true strがminLenth以上maxLength以下の文字数
 * return   : false strがminLenth以上maxLength以下の文字数でない
 *
 * overview :
 * 入力文字列長チェック用。
 * strの文字数が、「minLenth」以上「maxLength」以下であるかチェックする。
 * 文字数単位の判定であって、バイト数単位の判定ではない。
 *
 * ======================================================================= */
function checkLength( str, minLength, maxLength ) {
  var cnt = str.length;
  if( minLength <= cnt && cnt <= maxLength ) {
    return true;
  } else {
    return false;
  }
}

/* ==========================================================================
 * checkLengthCompulsoryInput
 *
 * parametar: str 評価文字列
 * parametar: maxLength 最長文字列長
 * return   : true strが「１文字」以上「maxLength」以下の文字数
 * return   : false strが「１文字」以上「maxLength」以下の文字数でない
 *
 * overview :
 * 必須入力項目の入力文字列長チェック用。
 * strの文字数が、「１文字」以上「maxLength」以下であるかチェックする。
 * 文字数単位の判定であって、バイト数単位の判定ではない。
 *
 * ======================================================================= */
function checkLengthCompulsoryInput( str, maxLength ){
    return checkLength( str, 1, maxLength );
}

/* ==========================================================================
 * checkLengthOptionalInput
 *
 * parametar: str 評価文字列
 * parametar: maxLength 最長文字列長
 * return   : true strが「maxLength」以下の文字数
 * return   : false strが「maxLength」以下の文字数でない
 *
 * overview :
 * 任意入力項目の入力文字列長チェック用。
 * strの文字数が、「maxLength」以下であるかチェックする。
 * 文字数単位の判定であって、バイト数単位の判定ではない。
 *
 * ======================================================================= */
function checkLengthOptionalInput( str, maxLength ){
    return checkLength( str, 0, maxLength );
}

/* ==========================================================================
 * isNumeric
 *
 * parametar: str 評価文字列
 * return   : true strが「半角数字(改行なし)」の文字列
 * return   : false strが「半角数字(改行なし)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角数字(改行なし)
 * strの文字列が「半角数字(改行なし)」であるかチェックする。
 *
 * ======================================================================= */
function isNumeric( str ){
  var num = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( codeNo < 0x30 || 0x39 < codeNo ) {
      num = false;
      break;
    }
  }
  return num;
}

/* ==========================================================================
 * isAlphamericChar
 *
 * parametar: str 評価文字列
 * return   : true strが「半角英数字(改行なし)」の文字列
 * return   : false strが「半角英数字(改行なし)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角英数字(改行なし)
 * strの文字列が「半角英数字(改行なし)」であるかチェックする。
 *
 * ======================================================================= */
function isAlphamericChar( str ){
  var alphameric = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x30 ) || 
        ( 0x39 < codeNo && codeNo < 0x41 ) || 
        ( 0x5A < codeNo && codeNo < 0x61 ) || 
        ( 0x7A < codeNo ) ) {
      alphameric = false;
      break;
    }
  }
  return alphameric;
}

/* ==========================================================================
 * isSpaceAndAlphamericChar
 *
 * parametar: str 評価文字列
 * return   : true strが「半角英数字+スペース(改行なし)」の文字列
 * return   : false strが「半角英数字+スペース(改行なし)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角英数字+スペース(改行なし)
 * strの文字列が「半角英数字+スペース(改行なし)」であるかチェックする。
 *
 * ======================================================================= */
function isSpaceAndAlphamericChar( str ){
  var spaceAndAlphamericChar = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x20 ) || 
        ( 0x20 < codeNo && codeNo < 0x30 ) || 
        ( 0x39 < codeNo && codeNo < 0x41 ) || 
        ( 0x5A < codeNo && codeNo < 0x61 ) || 
        ( 0x7A < codeNo ) ) {
      spaceAndAlphamericChar = false;
      break;
    }
  }
  return spaceAndAlphamericChar;
}

/* ==========================================================================
 * isHalfWidthChar
 *
 * parametar: str 評価文字列
 * parametar: bln true:(改行文字あり)
 * parametar: bln false:(改行文字なし)
 * return   : true strが「半角英数字+記号(改行については引数に従う)」の文字列
 * return   : false strが「半角英数字+記号(改行については引数に従う)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角英数字+記号(改行については引数に従う)
 * strの文字列が「半角英数字+記号(改行については引数に従う)」であるかチェックする。
 *
 * ======================================================================= */
function isHalfWidthChar( str, bln ){
  if( bln == true ) {
    return isHalfWidthCharWithCRLF( str );
  } else {
    return isHalfWidthCharWithoutCRLF( str );
  }
}

/* ==========================================================================
 * isHalfWidthCharWithoutCRLF
 *
 * parametar: str 評価文字列
 * return   : true strが「半角英数字+記号(改行文字なし)」の文字列
 * return   : false strが「半角英数字+記号(改行文字なし)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角英数字+記号(改行文字なし)
 * strの文字列が「半角英数字+記号(改行文字なし)」であるかチェックする。
 *
 * ======================================================================= */
function isHalfWidthCharWithoutCRLF( str ) {
  var halfWidthCharWithoutCRLF = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x20 ) || ( 0x7E < codeNo ) ) {
      halfWidthCharWithoutCRLF = false;
      break;
    }
  }
  return halfWidthCharWithoutCRLF;
}

/* ==========================================================================
 * isHalfWidthCharWithCRLF
 *
 * parametar: str 評価文字列
 * return   : true strが「半角英数字+記号(改行文字あり)」の文字列
 * return   : false strが「半角英数字+記号(改行文字あり)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角英数字+記号(改行文字あり)
 * strの文字列が「半角英数字+記号(改行文字あり)」であるかチェックする。
 *
 * ======================================================================= */
function isHalfWidthCharWithCRLF( str ) {
  var halfWidthCharWithCRLF = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x20 ) || ( 0x7E < codeNo ) ) {
      if( ( codeNo == 0x0D ) || ( codeNo == 0x0A ) ) {
      } else {
        halfWidthCharWithCRLF = false;
        break;
      }
    }
  }
  return halfWidthCharWithCRLF;
}

/* ==========================================================================
 * isFullWidthChar
 *
 * parametar: str 評価文字列
 * parametar: bln true:(改行文字あり)
 * parametar: bln false:(改行文字なし)
 * return   : true strが「全角文字(改行については引数に従う)」の文字列
 * return   : false strが「全角文字(改行については引数に従う)」の文字列でない
 *
 * overview :
 * 文字種チェック：全角文字(改行については引数に従う)
 * strの文字列が「全角文字(改行については引数に従う)」であるかチェックする。
 *
 * ======================================================================= */
function isFullWidthChar( str, bln ){
  if( bln == true ) {
    return isFullWidthCharWithCRLF( str );
  } else {
    return isFullWidthCharWithoutCRLF( str );
  }
}

/* ==========================================================================
 * isFullWidthCharWithoutCRLF
 *
 * parametar: str 評価文字列
 * return   : true strが「全角文字((改行文字なし)」の文字列
 * return   : false strが「全角文字((改行文字なし)」の文字列でない
 *
 * overview :
 * 文字種チェック：全角文字((改行文字なし)
 * strの文字列が「全角文字((改行文字なし)」であるかチェックする。
 *
 * ======================================================================= */
function isFullWidthCharWithoutCRLF( str ) {
  var fullWidthCharWithoutCRLF = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x20 ) || ( codeNo == 0xFEFF ) || ( codeNo == 0xFFFE ) ) {
      fullWidthCharWithoutCRLF = false;
      break;
    }
  }
  return fullWidthCharWithoutCRLF;
}

/* ==========================================================================
 * isFullWidthCharWithCRLF
 *
 * parametar: str 評価文字列
 * return   : true strが「全角文字(改行文字あり)」の文字列
 * return   : false strが「全角文字(改行文字あり)」の文字列でない
 *
 * overview :
 * 文字種チェック：全角文字(改行文字あり)
 * strの文字列が「全角文字(改行文字あり)」であるかチェックする。
 *
 * ======================================================================= */
function isFullWidthCharWithCRLF( str ) {
  var fullWidthCharWithCRLF = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x20 ) || ( codeNo == 0xFEFF ) || ( codeNo == 0xFFFE ) ) {
      if( ( codeNo == 0x0D ) || ( codeNo == 0x0A ) ) {
      } else {
        fullWidthCharWithCRLF = false;
        break;
      }
    }
  }
  return fullWidthCharWithCRLF;
}


/* ==========================================================================
 * isHalfWidthCharWithoutSpace
 *
 * parametar: str 評価文字列
 * return   : true strが「半角英数字+記号(スペースなし・改行文字なし)」の文字列
 * return   : false strが「半角英数字+記号(スペースなし・改行文字なし)」の文字列でない
 *
 * overview :
 * 文字種チェック：半角英数字+記号(スペースなし・改行文字なし)
 * strの文字列が「半角英数字+記号(スペースなし・改行文字なし)」であるかチェックする。
 *
 * ======================================================================= */
function isHalfWidthCharWithoutSpace( str ) {
  var halfWidthCharWithoutSpace = true;
  var n = str.length;
  for (i=0; i<=n-1; i++) {
    var codeNo = str.charCodeAt(i);
    if( ( codeNo < 0x21 ) || ( 0x7E < codeNo ) ) {
      halfWidthCharWithoutSpace = false;
      break;
    }
  }
  return halfWidthCharWithoutSpace;
}

/* ==========================================================================
 * checkMailAddress
 *
 * parametar: str 評価文字列
 * return   : true strが「メールアドレス形式」の文字列
 * return   : false strが「メールアドレス形式」の文字列でない
 *
 * overview :
 * 文字種チェック：メールアドレス形式
 * strの文字列が「メールアドレス形式」であるかチェックする。
 *
 * ======================================================================= */
function checkMailAddress( str ) {
  var mailAddress = true;
  if( ( isHalfWidthCharWithoutSpace( str ) == false ) || 
//      ( str.match(/.+@.+\..+/) == null ) ) {
      ( str.match(/^[^,\s]+@[^,\s]+\.[^,\s]+$/) == null ) ) {
    mailAddress = false;
  }
  return mailAddress;
}

/* ==========================================================================
 * checkDateFormat
 *
 * parametar: strYear  評価文字列(年部分)
 * parametar: strMonth 評価文字列(月部分－１桁、２桁どちらの入力も許可)
 * parametar: strDay   評価文字列(日部分－１桁、２桁どちらの入力も許可)
 * return   : true    評価文字列が正しい(存在する)日付
 *          : false   評価文字列が不正な(存在しない)日付
 * overview :
 * 評価文字列(strYear, strMonth, strDay)を組み合わせた日付が
 * 正しい日付フォーマットであるかチェックする。
 *
 * ======================================================================= */
function checkDateFormat( strYear, strMonth, strDay ) {

  // 日付の形式チェック
  strDate = strYear + "/" + strMonth + "/" + strDay;
  if ( !(strDate.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2})$/)) ) {
    return false;
  }

  // 年月日のいずれかが１未満ならエラー。
  // 月が１２の範囲でなければエラー。
  if ( (strYear < 1) || (strMonth < 1) ||
       (strDay < 1) || (12 < strMonth) )
  {
    return false;
  }

  // 各月毎のチェック
  // 1,3,5,7,8,10,12月の日(DD)チェック
  // - 31より大きければエラー
  if (((strMonth ==  1) || (strMonth ==  3) ||
       (strMonth ==  5) || (strMonth ==  7) ||
       (strMonth ==  8) || (strMonth == 10) ||
       (strMonth == 12) ) && (31 < strDay))
  {
    return false;
  }

  // 4,6,9,11月の日(DD)チェック
  // - 30より大きければエラー
  if (((strMonth ==  4) || (strMonth ==  6) ||
       (strMonth ==  9) || (strMonth == 11) ) &&
     (30 < strDay))
  {
    return false;
  }

  // 2月の日(DD)チェック
  // - 閏年：29以上ならエラー
  // - 通常：28以上ならエラー
  if (strMonth == 2) {
    // 閏年科のチェック
    if ( ((strYear % 4 == 0) && (strYear % 100 != 0)) ||
         (strYear % 400 == 0) )
    {
      if (29 < strDay) {
        return false;
      }
    } else {
      if (28 < strDay) {
        return false;
      }
    }
  }
  return true;
}

/* ==========================================================================
 * checkDateRelation
 *
 * parametar: befYear  評価文字列(開始年)
 * parametar: befMonth 評価文字列(開始月部分－１桁、２桁どちらの入力も許可)
 * parametar: befDay   評価文字列(開始日部分－１桁、２桁どちらの入力も許可)
 * parametar: aftYear  評価文字列(終了年)
 * parametar: aftMonth 評価文字列(終了月部分－１桁、２桁どちらの入力も許可)
 * parametar: aftDay   評価文字列(終了日部分－１桁、２桁どちらの入力も許可)
 * return   : true aftDayの方が新しい日付
 *          : false aftDayの方が過去の日付
 * overview :
 * (befYear/befMonth/befDay)と(aftYear/aftMonth/aftDay)を比較し、
 * (aftYear/aftMonth/aftDay)の方が新しい日付であるかチェックする。
 * 日付形式のチェックは行わないため、比較対象とする文字列はcheckDateFormatで事前にチェックしておく事が前提です。
 *
 * ======================================================================= */
function checkDateRelation( befYear,befMonth, befDay, aftYear, aftMonth, aftDay ) {
  //Beforeの年月日を取得
  befMonth      = "00" + befMonth;
  befDay        = "00" + befDay;

  befMonth      = befMonth.substring(befMonth.length -2);
  befDay        = befDay.substring(befDay.length -2);

  strBeforeDate = befYear + befMonth + befDay;

  //Afterの年月日を取得
  aftMonth      = "00" + aftMonth;
  aftDay        = "00" + aftDay;

  aftMonth      = aftMonth.substring(aftMonth.length -2);
  aftDay        = aftDay.substring(aftDay.length -2);

  strAfterDate = aftYear + aftMonth + aftDay;

  //期間チェック
  if(strBeforeDate <= strAfterDate){
    return true;
  }else{
    return false;
  }
}

/* ==========================================================================
 * checkFileName
 *
 * parametar: str                  評価文字列(フルパス)
 * parametar: notIncludeExpression 評価文字列(使用不可文字の正規表現)
 * parametar: extExpression        評価文字列(使用可能拡張子の正規表現)
 * return   : true  使用不可拡張子、使用不可文字が使用されていない
 *          : false 使用不可拡張子が使用されている
 * overview :
 * 評価文字列を「extExpression」と「charExpression」でマッチングさせ、
 * 使用不可文字が使用されているかチェックします。
 *
 * ======================================================================= */
function checkFileName( str, notIncludeExpression, ExtExpression ) {
  if( str.lastIndexOf("\\") >= str.lastIndexOf("/") ) {
    str = str.substr( str.lastIndexOf("\\") +1 );
  } else {
    str = str.substr( str.lastIndexOf("/") +1 );
  }
  if ( (str.match(notIncludeExpression) != null) || (str.match(new RegExp(ExtExpression, "i")) == null) ) {
    return false;
  }
  return true;
}

/* ==========================================================================
 *
 * 画面警告表示用
 *
 * ======================================================================= */

/* ==========================================================================
 * alertCompulsoryInput
 * parametar: str               項目名
 *
 * overview :必須入力項目が未入力だった場合の警告メッセージを表示します。
 * ======================================================================= */
function alertCompulsoryInput( str ) {
  alert( "Please enter " + str +  "." );
}

/* ==========================================================================
 * alertCompulsorySelect
 * parametar: str               項目名
 *
 * overview :必須選択項目が未選択だった場合の警告メッセージを表示します。
 * ======================================================================= */
function alertCompulsorySelect( str ) {
  alert( "Please select " + str + "." );
}

/* ==========================================================================
 * alertShortInput
 * parametar: str1               項目名
 * parametar: str2               最低入力文字数
 *
 * overview :入力項目が最低入力文字数を超えていない場合の警告メッセージを表示します。
 * ======================================================================= */
function alertShortInput( str1, str2 ) {
  alert( str1 + "has not the required number of characters. Please enter it with " + str2 + " or more characters.");
}

/* ==========================================================================
 * alertJustInput
 * parametar: str1               項目名
 * parametar: str2               入力許可文字数
 *
 * overview :入力項目が入力許可文字数と同一文字数でない場合の警告メッセージを表示します。
 * ======================================================================= */
function alertJustInput( str1, str2) {
  alert( "Please enter " + str1 + " with " + str2 + " characters.");
}

/* ==========================================================================
 * alertLongInput
 * parametar: str1               項目名
 * parametar: str2               入力許可文字数
 *
 * overview :入力項目が入力許可文字数を超えている場合の警告メッセージを表示します。
 * ======================================================================= */
function alertLongInput( str1, str2 ) {
  alert( str1 + " exceeds the limit of characters allowed. Please enter with " + str2 + " or less characters.");
}

/* ==========================================================================
 * alertValidInput
 * parametar: str1               項目名
 * parametar: str2               入力許可文字種(0:半角数字、1:半角英数字、2:半角英数字/記号、3:半角英数字/記号または全角文字)
 *
 * overview :不正な文字種が入力された場合の警告メッセージを表示します。
 * ======================================================================= */
function alertValidInput( str1, mode ) {
  var str2 ='';
  if( mode==0 ) {
    str2 = 'only single-byte integers.';
  } else if( mode==1 ) {
    str2 = 'only single-byte alpha-numeric characters.';
  } else if( mode==2 ) {
    str2 = 'only single-byte alpha-numeric characters and symbols.';
  } else {
    str2 = 'single-byte alpha-numeric characters and symbols or double-byte characters.';
  }
  alert( "An invalid character (" + str1 + ") has been found. Please enter "+ str2 );
}

/* ==========================================================================
 * alertValidMailAddress
 *
 * overview :不正なメールアドレスが入力された場合の警告メッセージを表示します。
 * ======================================================================= */
function alertValidMailAddress() {
  alert( "The e-mail address you have entered is incorrect. Please check your e-mail address and try again." );
}

/* ==========================================================================
 * alertDisagreementPassword
 *
 * overview :パスワードの入力と確認入力が違う場合の警告メッセージを表示します。
 * ======================================================================= */
function alertDisagreementPassword() {
  alert( "Password verification has failed. Please check your password and try again." );
}

/* ==========================================================================
 * alertValidDate
 *
 * overview :不正な日付が入力された場合の警告メッセージを表示します。
 * ======================================================================= */
function alertValidDate( str1 ) {
  alert( "The date " + str1 + " you have entered is incorrect. Please check the date and try again." );
}


/* ==========================================================================
 * alertValidDateRelation
 *
 * overview :前後関係を持つ日付で、開始日と終了日が逆転している場合のメッセージを表示します。。
 * ======================================================================= */
function alertValidDateRelation( str1 ) {
  alert( "The " + str1 + "'s starting and ending date have been entered inversely.\nPlease check and enter the dates correctly." );
}

/* ==========================================================================
 *
 * 入力支援向け
 *
 * ======================================================================= */
function disableOtherInput() {
	var selObj = arguments[0];
	if ( selObj.options[selObj.selectedIndex].value == '99999' ) {
		for(var i=1; i<arguments.length; i++){
			arguments[i].disabled = false;
			arguments[i].style.backgroundColor = "#ffffff";
			arguments[i].style.textDecoration = "none";
		}
	} else {
		for(var i=1; i<arguments.length; i++){
			arguments[i].disabled = true;
			arguments[i].style.backgroundColor = "#eeeeee";
			arguments[i].style.textDecoration = "line-through";
		}
	}
}

/* ==========================================================================
 *
 * ウィンドウ制御用
 *
 * ======================================================================= */
var winObj;
var timerID;
var winUrl2;
var winID2;
var winStat;
var bSync = false;
function openWin( winUrl, winID, width, height ) {
	if( bSync ) {
		return;
	}
	bSync = true;
	
	winUrl2 = winUrl;
	winID2 = winID;
	winStat = "width=" + width + ",height=" + height + ",scrollbars=yes,resizable=yes";
	winObj = window.open( '', winID, winStat );
	timerID = '';
	try {
		if( winObj.document.URL == 'about:blank' ) {
			window.open( winUrl2, winID2, winStat );
			bSync = false;
		} else {
			timerID = setInterval( "checkWin( winObj )", 10 );
		}
	} catch( exception ) {
		timerID = setInterval( "checkWin( winObj )", 10 );
	}
}
function checkWin( winObj ) {
	if ( winObj.closed == false ) {
		winObj.close();
	} else {
		window.open( winUrl2, winID2, winStat );
		clearInterval( timerID );
		bSync = false;
	}
}

