// -------------------------------------------------------------------------------------------------
// 関数名：_CheckString( intReturnMsg, objName[, strKind[, strTitle[, intRequisite[, intLength]]]])
// 概要  ：入力欄を検査し、警告を出す。
// 作成者：yamamoto@sansui.co.jp ( オリジナル：Ramat氏 )
// 作成日: 2005/10/26
// -------------------------------------------------------------------------------------------------
function _CheckString( intReturnMsg, objName, strKind, strTitle, intRequisite, intLength ){
	//変数宣言
	var str2PGMsg = '(システムエラー)';
	var intArgLen = arguments.length; //引数の個数
	var strMsg = '';                  //メッセージ
	var ix = 0;                       //指標用
	var intByteCount = 0;             //バイト数計算用
	var intByteLenNow = 1;            //今の文字の大きさ
	var intByteLenBefore = 1;         //前の文字の大きさ
	var intOverLetterCount = 0;       //超過文字数計算用

	//項目名が指定されていれば、その項目の値と長さを取得する。
	if( !!objName ){
		strValue = objName.value.replace( /[ 　]+$/, '' );
		objName.value = strValue;
		intValLength = strValue.length;
	}else{
		if( intArgLen == 0 ){
			strMsg = '引数がありません' + str2PGMsg;
		}else{
			strMsg = '存在しない項目名が指定されました' + str2PGMsg;
		}
		objName      = '';
		strValue     = '';
		intValLength = 0;
	}

	//項目名以外の各引数が指定されていないときの既定値設定処理
	if( !strKind )      strKind      = 'alnum';
	if( !strTitle )     strTitle     = '';
	if( !intRequisite ) intRequisite = 0;
	if( !intLength )    intLength    = 0;

	//引数個数によって処理を分ける
	switch( arguments.length ){
		case 0:break;

		//指定されたバイト数を超過したときにエラーとする。ただしメッセージは文字数単位
		case 6:{
			for( ix=0; ix < intValLength; ix++ ){
				//全角文字なら２バイト、半角文字なら１バイトと計算
				if( escape( strValue.charAt( ix ) ).length >= 4){
					intByteLenNow = 2;
				}else{
					intByteLenNow = 1;
				}
				intByteCount += intByteLenNow;
				//指定されたバイト数を超過したら文字数カウント
				if( intByteCount > intLength ) intOverLetterCount++;
			}
			if(( intOverLetterCount > 0 ) && ( strMsg == '' )){
				strMsg = intOverLetterCount + '文字減らして下さい';
				break;
			}
		}

		case 5:{
			//必須判定の指定値を検査する
			switch( intRequisite ){
				case 0:break;
				default:{
					if(( intValLength < intRequisite ) &&( strMsg == '' )){
						if( intRequisite == 1 ) strMsg = '必ず入力して下さい';
						if( intRequisite > 1 )  strMsg = '必ず' + intRequisite + '文字以上入力して下さい';
						break;
					}
					break;
				}
			}
			if( strMsg != '' ) break;
		}

		case 4:
		case 3:
		case 2:
		{
			switch( strKind ){
				//posix 表記
				case 'alnum':{
					if((intValLength > 0) && (strValue.match(/^\w+$/) == null) && (strMsg == ''))
						strMsg = '英数字で入力して下さい(スペース不可)';
					break;
				}
				case 'alpha':{
					if((intValLength > 0) && (strValue.match(/^[A-Za-z]+$/) == null) && (strMsg == ''))
						strMsg = '英字で入力して下さい(スペース不可)';
					break;
				}
				case 'digit':{
					if((intValLength > 0) && (strValue.match(/^\-?[0-9\.]+$/) == null) && (strMsg == ''))
						strMsg = '半角数字で入力して下さい(スペース不可)';
					break;
				}
				case 'money':{
					if((intValLength > 0) && (strValue.match(/^[0-9\,]+$/) == null) && (strMsg == ''))
						strMsg = '半角数字と半角カンマで入力して下さい(スペース不可)';
					break;
				}
				case 'tel':{
					if((intValLength > 0) && (strValue.match(/^[0-9\-]+$/) == null) && (strMsg == ''))
						strMsg = '半角数字で入力して下さい(スペース不可)';
					break;
				}
				case 'lower':{
					if((intValLength > 0) && (strValue.match(/^[a-z]+$/) == null) && (strMsg == ''))
						strMsg = '英小文字で入力して下さい(スペース不可)';
					break;
				}
				case 'ascii'://非posin表記
				case 'print'://posix表記
				{
					if((intValLength > 0) && (strValue.match(/^[ -~]+$/) == null) && (strMsg == ''))
						strMsg = 'ASCII文字で入力して下さい';
					break;
				}
				case 'upper':{
					if((intValLength > 0) && (strValue.match(/^[A-Z]+$/) == null) && (strMsg == ''))
						strMsg = '英大文字で入力して下さい(スペース不可)';
					break;
				}
				//posix 表記以外
				case 'all':break;
				case 'sbcs':{
					if((intValLength > 0) && (strValue.match(/^[ -~｡-ﾟ]+$/) == null) && (strMsg == ''))
						strMsg = '半角文字で入力して下さい';
					break;
				}
				case 'kana':{
					if((intValLength > 0) && (strValue.match(/^[ ｡-ﾟ]+$/) == null) && (strMsg == ''))
						strMsg = '半角カナで入力して下さい';
					break;
				}
				case 'kanaupper':{
					if((intValLength > 0) && (strValue.match(/^[ ｡-ｦｰ-ﾟ]+$/) == null) && (strMsg == ''))
						strMsg = '半角カナ大文字で入力して下さい';
					break;
				}
				case 'dbcs':{
					if((strValue.match(/[ -~｡-ﾟ]/) != null) && (strMsg == ''))
						strMsg = '全角文字で入力して下さい';
					break;
				}
				case 'dbcskana':{
					if((intValLength > 0) && (strValue.match(/^[　ーァ-ヶ]+$/) == null) && (strMsg == ''))
						strMsg = '全角カナで入力して下さい';
					break;
				}
				case 'dbcshira':{
					if((intValLength > 0) && (strValue.match(/^[　ーぁ-ん]+$/) == null) && (strMsg == ''))
						strMsg = '全角かなで入力して下さい';
					break;
				}
				case 'email':{
					if((intValLength > 0) && (strValue.match(/^.+\@.+\..+$/) == null) && (strMsg == ''))
						strMsg = '正しくありません';
					break;
				}
				case 'url_address':{
					if((intValLength > 0) && (strValue.match(/^(http|https):\/\/.+\..+[\/.+\..+]?$/) == null) && (strMsg == ''))
						strMsg = '正しくありません';
					break;
				}
				case 'kakaku':{
					if((intValLength > 0) && (strValue.match(/^[\,\.0-9]+$/) == null) && (strMsg == ''))
						strMsg = '半角数字で入力して下さい(スペース不可)';
					break;
				}
				case 'zip':{
					if((intValLength > 0) && (strValue.match(/^\d{3}-\d{4}$|^\d{3}-\d{2}$|^\d{3}$/) == null) && (strMsg == ''))
						strMsg = '半角数字で入力して下さい(スペース不可)';
					break;
				}
				default :{
					if(strMsg == '') strMsg ='種類の指定 "'+strKind+'" が間違っています。\n' + str2PGMsg;
					break;
				}
			}
			break;
		}
		default :{
			if(strMsg == '') strMsg = '引数を減らして下さい' + str2PGMsg;
			break;
		}
	}

	//もしメッセージがあれば警告表示する。タイトルが指定されていればタイトルも表示する。
		if(strMsg != ''){
			if( strTitle != '' ) strMsg=strTitle+' は '+strMsg;
			if( intReturnMsg == 1 ){
				return strMsg + '\n';
			}else{
				alert( strMsg );
				if( objName != '' ){
					objName.focus();
					objName.select();
				}
				return false;
			}
		}else{
			if( intReturnMsg == 1 ){
				return '';
			}else{
				return true;
			}
		}
}

// (すべての変数に格納する値は0オリジンとする) 
function myFormatNumber(x) { // 引数の例としては 95839285734.3245
	var s = "" + x; // 確実に文字列型に変換する。例では "95839285734.3245"
	var p = s.indexOf("."); // 小数点の位置を0オリジンで求める。例では 11
	if (p < 0) { // 小数点が見つからなかった時
		p = s.length; // 仮想的な小数点の位置とする
	}
	var r = s.substring(p, s.length); // 小数点の桁と小数点より右側の文字列。例では ".3245"
	for (var i = 0; i < p; i++) { // (10 ^ i) の位について
		var c = s.substring(p - 1 - i, p - 1 - i + 1); // (10 ^ i) の位のひとつの桁の数字。例では "4", "3", "7", "5", "8", "2", "9", "3", "8", "5", "9" の順になる。
		if (c < "0" || c > "9") { // 数字以外のもの(符合など)が見つかった
			r = s.substring(0, p - i) + r; // 残りを全部付加する
			break;
		}
		if (i > 0 && i % 3 == 0) { // 3 桁ごと、ただし初回は除く
			r = "," + r; // カンマを付加する
		}
		r = c + r; // 数字を一桁追加する。
	}
	return r; // 例では "95,839,285,734.3245"
}

function myCommaOutNumber(x){
	tmp = x.replace( /\,/g, "" );
	return tmp;
}

function reFormatDigit( obj ){
	if( !isNaN( obj.value ) ){
		obj.value = myFormatNumber( obj.value );
	}
}

function commaOut( obj ){
	obj.value = myCommaOutNumber( obj.value );
	obj.select();
}

function ValidDate( y, m, d, hissu, arg ) {
	var datePatY = /^(\d{4})$/;
	var datePatM = /^(\d{1,2})$/;
	var datePatD = /^(\d{1,2})$/;
	var DateArrayY = y.match( datePatY );
	var DateArrayM = m.match( datePatM );
	var DateArrayD = d.match( datePatD );

	if( hissu == 1 && ( DateArrayY == null || DateArrayM == null || DateArrayD == null ) ){
		alert( arg + 'は必ず入力してください。' );
		return false;
	}

	if( hissu == 0 && ( DateArrayY == null && DateArrayM == null && DateArrayD == null ) ) return true;

	if( !( DateArrayY == null && DateArrayM == null && DateArrayD == null ) ){
		if( DateArrayY == null || DateArrayM == null || DateArrayD == null ){
			alert( arg + 'に存在しない日付が入力されています。' );
			return false;
		}
	}

	wyear  = eval( y );
	wmonth = eval( m );
	wday   = eval( d );

	if( !mon_chk( wmonth ) ){
		alert( arg + 'に存在しない日付が入力されています。(月)' );
		return false;
	}

	dd = daymonth( wyear, wmonth );
	if( wday > dd ){
		alert( arg + 'に存在しない日付が入力されています。(日)' );
		return false;
	}
	return true;
}

/* 日付の範囲チェック */
function daymonth(year,month){
	day = new Array( 31,28,31,30,31,30,31,31,30,31,30,31 );
	if( month == 2 && leapyear( year ) ) return 29;
	return day[ month - 1 ];
}
/* うるう年のチェック */
function leapyear(year){
	return year%4==0 && (year%100!=0 || year%400==0);
}

/* 月の範囲チェック */
function mon_chk( month ){
	if( month >= 1 && month <= 12 ) return true;
	return false;
}

function ValidDate2( y, m, d, hissu, arg ) {
	var strMsg = '';
	var datePatY = /^(\d{4})$/;
	var datePatM = /^(\d{1,2})$/;
	var datePatD = /^(\d{1,2})$/;
	var DateArrayY = y.match( datePatY );
	var DateArrayM = m.match( datePatM );
	var DateArrayD = d.match( datePatD );
	
	if( hissu == 1 && ( DateArrayY == null || DateArrayM == null || DateArrayD == null ) ){
		strMsg = arg + 'は必ず入力してください。';
		return strMsg;
	}
	if( hissu == 0 && ( DateArrayY == null && DateArrayM == null && DateArrayD == null ) ) return true;

	if( !( DateArrayY == null && DateArrayM == null && DateArrayD == null ) ){
		if( DateArrayY == null || DateArrayM == null || DateArrayD == null ){
			strMsg = arg + 'に存在しない日付が入力されています\n';
			return strMsg;
		}
	}
	wyear  = eval( y );
	wmonth = eval( m );
	wday   = eval( d );

	if( !mon_chk( wmonth ) ){
		strMsg = arg + 'に存在しない日付が入力されています\n';
		return strMsg;
	}

	dd = daymonth( wyear, wmonth );
	if( wday > dd ){
		strMsg = arg + 'に存在しない日付が入力されています\n';
		return strMsg;
	}	
	
	return strMsg;
}
