// =================================================
// 関数名　：chk_pattern
// 関数概要：正規表現パターンの取得
// コメント：
// ------------------------------------------------
//	引数	：	$pNo	パターン
//	戻り値	：	パターン
/*
	// $pNo にパターンを羅列
	r : 半角英字
	R : 全角英字
	n : 半角数字
	N : 全角数字
	a : 半角英数
	A : 全角英数
	s : 半角スペース
	S : 全角スペース
	k : 半角カタカナ
	K : 全角カタカナ
	h : ひらがな
	H : ひらがな
	i : 半角記号
	I : 全角記号


	パターンについてはPHP関数
	mb_convert_kana をモデルに設計
*/
//==================================================
function chk_pattern(pNo)
{
	// パターン定義
	var chk_pattern = new Array();
	chk_pattern["r"] = "a-zA-Z";
	chk_pattern["R"] = "ａ-ｚ";
	chk_pattern["n"] = "0-9";
	chk_pattern["N"] = "０-９";
	chk_pattern["a"] = "a-zA-Z0-9";
	chk_pattern["A"] = "ａ-ｚＡ-Ｚ０-９";
	chk_pattern["s"] = " ";
	chk_pattern["S"] = "　";
	chk_pattern["k"] = "ｱ-ﾝｦﾞﾟｧｨｩｪｫｬｭｮｯｰ";
	chk_pattern["K"] = "ア-ンァィゥェォャュョッー";
	chk_pattern["h"] = "あ-んぁぃぅぇぉゃゅょっー";
	chk_pattern["H"] = "あ-んぁぃぅぇぉゃゅょっー";
	chk_pattern["i"] = "\\･!\"#$%&'()*+,-\.\/:;<=>?@\[\]\^_{|}~";
	chk_pattern["I"] = "￥･！”＃＄％＆’（）＊＋，－．／：；＜＝＞？＠［］＾＿｛｜｝￣";

	// リクエストパターンの作成 //////////////////////////////
	var pattern = "";
	for(var i=0; i<pNo.length; i++)
	{
		if(chk_pattern[pNo.substr(i, 1)]==undefined) continue;
		pattern += chk_pattern[pNo.substr(i, 1)];
	}
	//////////////////////////////////////////////////////////

	return pattern;
}


// =================================================
// 関数名　：chk_free
// 関数概要：patで指定されたパターンかどうか診断
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//				pat	パターン文字列
//	戻り値	：	true or false or null
//==================================================
function chk_free(str, pat)
{
	// 文字列が空かどうか
	if( str != "" && pat != "" ) 
	{
		// パターンの取り出し
		pats = chk_pattern(pat);
		if( pats == "" ) return null;
		
		var exp = new RegExp("^["+pats+"]+$");
		// 最初から最後まで指定された文字列のみかチェック
		if( exp.test(str) == true ) 
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
			return null;
	}

}


//===========================================================================
//	関数名　：chk_mail
//	関数概要：メールアドレスの形式が正しいかチェックする
// -------------------------------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：true or false or null
//===========================================================================
function chk_mail(str)
{
	if(str != "")
	{ 
		if(str.match(/[!#-9A-~]+@+[a-z0-9]+.+[!#-9A-~]/i))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
			return null;
	}
}

// =================================================
// 関数名　：chk_eisu
// 関数概要：文字列が a-zA-Z0-9であるかどうか
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：	true or false or null
//	備考	：	chk_free をオプション指定したエイリアス
//==================================================
function chk_eisu( str )
{
	return chk_free(str, "a");
}


// =================================================
// 関数名　：chk_ei
// 関数概要：文字列が a-zA-Zであるかどうか
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：	true or false or null
//	備考	：	chk_free をオプション指定したエイリアス
//==================================================
function chk_ei( str )
{
	return chk_free(str, "r");
}


// =================================================
// 関数名　：chk_su
// 関数概要：文字列が 0-9であるかどうか
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：	true or false or null
//	備考	：	chk_free をオプション指定したエイリアス
//==================================================
function chk_su( str )
{
	return chk_free(str, "n");
}


// =================================================
// 関数名　：chk_hiragana
// 関数概要：文字列が 0-9であるかどうか
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：	true or false or null
//	備考	：	chk_free をオプション指定したエイリアス
//==================================================
function chk_hiragana( str )
{
	return chk_free(str, "h");
}


// =================================================
// 関数名　：chk_zenkana
// 関数概要：文字列が 全角カナであるかどうか
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：	true or false or null
//	備考	：	chk_free をオプション指定したエイリアス
//==================================================
function chk_zenkana( str )
{
	return chk_free(str, "K");
}


// =================================================
// 関数名　：chk_hankana
// 関数概要：文字列が 半角カナであるかどうか
// コメント：
// ------------------------------------------------
//	引数	：	str	文字列
//	戻り値	：	true or false or null
//	備考	：	chk_free をオプション指定したエイリアス
//==================================================
function chk_hankana( str )
{
	return chk_free(str, "k");
}


// =================================================
// 関数名　：chk_length
// 関数概要：文字列が指定バイト数の範囲かどうか診断
// コメント：
// ------------------------------------------------
//	引数	：	str		文字列
//				第2引数以降	数値(範囲)
//	戻り値	：	true or false
//	備考	：	関数 chk_su() を使用	※
/*
	var str = "ABCあ";		// 6bytes
	chk_length(str);		// false
	chk_length(str, 6);	// true
	chk_length(str, 1, 10);// true
	chk_length(str, 7, 10);// false
	chk_length(str, 7);	// false
*/
//==================================================
function chk_length(str)
{
	var args	= chk_length.arguments;	// 引数を配列に格納
	
	var byte	= strlen(str);
	
	var max		= null;					// 最大値 初期はnull
	var min		= 0;					// 最小値 初期は0

	for(var i=1; i<args.length; i++)
	{
		// 数字のみ処理
		if( !chk_su(args[i]) ) continue;
	
		// 初回定義時は引数を強制代入
		if(i===1)
		{
			min = args[i];
		}
	
		max = Math.max(max, args[i]);
		min = Math.min(min, args[i]);
	}

//	alert( "min:"+min+" max:"+max+"/byte:"+byte);;
	// バイト数が範囲内であるかどうか
	if( byte <= max && byte >= min )
	{
		return true;
	}
	
		return false;

}


// =================================================
// 関数名　：strlen
// 関数概要：文字列のバイト数を返す
// コメント：
// ------------------------------------------------
//	引数	：	str		文字列
//	戻り値	：	数値
//	備考	：	PHP関数をモデル化 js専用
// =================================================
function strlen(str)
{
	var byte = 0;
	for(var i=0;i<str.length;i++)
	{
		(escape(str.charAt(i)).length< 4)	?	byte++	:	byte+=3;
	}
	
	return byte;
}


