var CHRS_SPACE = ' 　\t\n';
var CHRS_ALPHA_UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var CHRS_ALPHA_LOWER = 'abcdefghijklmnopqrstuvwxyz';
var CHRS_NUMBER = '0123456789';
var CHRS_NUMBER_SIGN = '+-';

function mb_trim(str) {
	return mb_ltrim(mb_rtrim(str));
}

function mb_rtrim(str) {
	for (i = str.length - 1;i >= 0;i --) {
		ch = str.substring(i, i + 1);
		if (CHRS_SPACE.indexOf(ch,0) < 0)
			break;
	}
	return str.substring(0, i + 1);
}

function mb_ltrim(str) {
	for (i = 0;i < str.length;i ++) {
		ch = str.substring(i, i + 1);
		if (CHRS_SPACE.indexOf(ch,0) < 0)
			break;
	}
	return str.substring(i, str.length);
}

hiragana_words = "あいうえおかきくけこさしすせそたちづてとなにぬねのはひふへほまみむめもやゆよらりるれろわんを"
		+ "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょっゎゐゑび";

katakana_words = "アイウエオカキクケコサシスセソタチヅテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワンヲ"
		+ "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォャュョッヮヰヱヴヵヶ";

han_words = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
		+ "0123456789!\"#\$%&'()*+,./:;<=>?\@[\\]^_`{|}~-";

zen_words = "ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ"
		+ "ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ"
		+ "０１２３４５６７８９"
		+ "！”＃＄％＆’（）＊＋，．／：；＜＝＞？＠[￥]＾＿‘｛｜｝〜−";

function han2zen(str) {
	return replace_char_a2b(str,han_words,zen_words);
}
function zen2han(str) {
	return replace_char_a2b(str,zen_words,han_words);
}
function replace_char_a2b(str,lista,listb) {
	result = '';
	for (i = 0;i < str.length;i ++) {
		ch = str.substring(i, i + 1);
		idx = lista.indexOf(ch,0);
		if (idx >= 0)
			ch = listb.substring(idx, idx + 1);
		result += ch;
	}
	return result;
}

function is_only_chars(str,chr) {
	for (i = 0;i < str.length;i ++) {
		ch = str.substring(i, i + 1);
		if (chr.indexOf(ch,0) < 0)
			return false;
	}
	return true;
}

function is_telno(str) {
	return (str.length > 8 && str.match(/^[\(0-9]+[\-\(\)0-9]{1,8}[0-9\)]+$/i));
}

function is_mailaddr(str) {
	return (str.match(/^[\-\$0-9a-zA-Z\_\#\.]+\@[\-0-9a-zA-Z\.]+\.[a-zA-Z]{2,4}$/i));
//	return (str.match(/^\w.*\@\w+.*\.\w{2,3}$/i)); // 携帯・日本語ドメイン対応
}

function is_url(str) {
	return (str.match(/^http:\/\/[0-9a-zA-Z\_\-]+\.[0-9a-zA-Z\-\_\.]+(|[\/\#\?]+.*)$/i));
}

function is_numeric(str) {
	return str ? (str.match(/^[\-]*[0-9]+$/i)) : false;
//	return str ? (str.match(/^[\-]*[0-9]{1}[0-9\,]*[0-9]*$/i)) : false;
}

function is_print_able() {
	if (navigator.userAgent.match(/msie (\d)/i))
		v = (eval(RegExp.$1) >= 5) ? 1 : 0;
	else if (self.innerWidth)
		v = (eval(navigator.appVersion.charAt(0)) >= 4) ? 1 : 0;
	else v = 0;
	// print() が使えるブラウザなら印刷を実行
	return (v ? true :false);
}

function byte_length(str) {
	var i, cnt = 0;
	if (str == null) return 0;
	for (i = 0;i < str.length;i ++) {
		if (escape(str.charAt(i)).length >= 4)
			cnt ++;
		cnt++;
	}
	return cnt;
}

// フォームコントロールインデックス番号取得
function get_element_idx(form, name, value) {
	for (i = 0;i < form.elements.length;i ++) {
		if ((!name || form.elements[i].name == name) &&
			(!value || form.elements[i].value == value) ) {
			return i;
		}
	}
	return -1;
}

function select_value(cmb) {
	return cmb.options[cmb.selectedIndex].value;
}

function is_ctrl_checked(radio) {
	var i;
	if (radio.length < 2)
		return radio.checked;
	for (i = 0;i < radio.length;i ++)
		if (radio[i].checked) return true;
	return false;
}

// うるう年確認
function is_leap_year(y) {
	return ( ( ((y % 4) == 0) && ((y % 100) != 0) ) || ((y % 400) == 0) ) ? true : false;
}

// 日付値の妥当性チェック
function check_date(yyyy, mm, dd) {
	// 月末尾
	var month_end = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var y, m, d;

	if (!is_numeric(yyyy))
		return false;

	y = parseInt(yyyy);
	m = parseInt(mm);
	d = parseInt(dd);
	y = (y < 100) ? (1900 + y) : y;	// ４桁の西暦に変換

	if (m < 1 || 12 < m)
		return false;

	if (is_leap_year(y))	// うるう年の場合
		month_end[1] = 29;  	// 2月が29日まで

	if (d < 1 || month_end[m - 1] < d)
		return false;

	return true;
}
