/* utf-8 ◎◇ */

/* ブラウザ判定 */
var c_fOP = window.opera;
var c_fN6 = document.getElementById;
var c_fIE = document.all;
var c_fN4 = document.layers;

/* 数字(郵便番号および電話番号用)  */
var c_strSBDigit = '0123456789000112233456789';
var c_strMBDigit = '０１２３４５６７８９○〇零一壱二弐三参四五六七八九';
var c_strSBDigitHyphen = '0123456789000112233456789--';
var c_strMBDigitHyphen = '０１２３４５６７８９○〇零一壱二弐三参四五六七八九－ー';
var c_strSBDigitBracketHyphen = '()0123456789000112233456789--';
var c_strMBDigitBracketHyphen = '（）０１２３４５６７８９○〇零一壱二弐三参四五六七八九－ー';

/* 半角カナ, 全角カナ */
var c_strSBKata = '｡｢｣､･ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ';
var c_strMBKata = '。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜';

/* 半角文字(ニックネーム用)(その他)  */
var c_strSBString = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
var c_strMBString = '！”＃＄％＆’（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［￥］＾＿‘ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝～';

/* ひらがな, カタカナ(変換可文字) (フリガナ用)  */
var c_strHira = 'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゝゞ';
var c_strKata = 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヽヾ';
var c_strNor = 'ーヵヶヷヸヹヺ';


/** イベントハンドラを登録
 * 
 * 
 */
function	EventHanderAdd( elem, type, fnc )
{
	if ( c_fIE ) {
		elem.attachEvent( 'on'.concat( type ), fnc );
	}
	else if ( c_fN6 ) {
		elem.addEventListener( type, fnc, false );
	}
	return true;
}


/** イベント発生時のターゲットエレメントを取得
 * 
 * 
 */
function	eventTarget( evt )
{
	var evt = ( ( evt ) ? evt : ( window.event ) ? window.event : null );
	var obj = ( ( evt.target ) ? evt.target : ( event.srcElement ) ? event.srcElement : null );
	if ( ! obj ) {
		return undefined;
	}
	return obj;
}

/** 半角文字を全角に(変換できなければそのまま返す)
 * 
 * 
 */
function	SBString2MBString( c )
{
	if ( 0 <= c_strMBString.indexOf( c ) ) {
		return c;
	}
	var idx = c_strSBString.indexOf( c );
	if ( 0 <= idx ) {
		return c_strMBString.substr( idx, 1 );
	}
	return c;
}

function	str_SBString2MBString( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = SBString2MBString( src.substr( idx, 1 ) );
		dst = dst.concat( c );
	}
	return dst;
}

/** 半角カナを全角カナに(変換できなければそのまま返す)
 * 
 * 
 */
function	SBKana2MBKana( c )
{
	if ( 0 <= c_strMBKata.indexOf( c ) ) {
		return c;
	}
	var idx = c_strSBKata.indexOf( c );
	if ( 0 <= idx ) {
		return c_strMBKata.substr( idx, 1 );
	}
	return c;
}

function	str_SBKana2MBKana( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = SBKana2MBKana( src.substr( idx, 1 ) );
		dst = dst.concat( c );
	}
	return dst;
}

/** 全角数字を半角数字に変換
 * 
 * 
 */
function	MBDigit2SBDigit( c )
{
	if ( 0 <= c_strSBDigit.indexOf( c ) ) {
		return c;
	}
	var idx = c_strMBDigit.indexOf( c );
	if ( 0 <= idx ) {
		return c_strSBDigit.substr( idx, 1 );
	}
	return null;
}

function	str_MBDigit2SBDigit( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = MBDigit2SBDigit( src.substr( idx, 1 ) );
		if ( null === c ) {
			return null;
		}
		dst = dst.concat( c );
	}
	return dst;
}

/** 全角数字を半角数字に変換(ハイフン対応)
 * 
 * 
 */
function	MBDigit2SBDigit_Hyphen( c )
{
	if ( 0 <= c_strSBDigitHyphen.indexOf( c ) ) {
		return c;
	}
	var idx = c_strMBDigitHyphen.indexOf( c );
	if ( 0 <= idx ) {
		return c_strSBDigitHyphen.substr( idx, 1 );
	}
	return null;
}

function	str_MBDigit2SBDigit_Hyphen( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = MBDigit2SBDigit_Hyphen( src.substr( idx, 1 ) );
		if ( null === c ) {
			return null;
		}
		dst = dst.concat( c );
	}
	return dst;
}

/** 全角数字を半角数字に変換(ハイフンおよび括弧対応)
 * 
 * 
 */
function	MBDigit2SBDigit_BracketHyphen( c )
{
	if ( 0 <= c_strSBDigitBracketHyphen.indexOf( c ) ) {
		return c;
	}
	var idx = c_strMBDigitBracketHyphen.indexOf( c );
	if ( 0 <= idx ) {
		return c_strSBDigitBracketHyphen.substr( idx, 1 );
	}
	return null;
}

function	str_MBDigit2SBDigit_BracketHyphen( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = MBDigit2SBDigit_BracketHyphen( src.substr( idx, 1 ) );
		if ( null === c ) {
			return null;
		}
		dst = dst.concat( c );
	}
	return dst;
}

/** 全角文字を半角に(変換できなければそのまま返す)
 * 
 * 
 */
function	MBString2SBString( c )
{
	if ( 0 <= c_strSBString.indexOf( c ) ) {
		return c;
	}
	var idx = c_strMBString.indexOf( c );
	if ( 0 <= idx ) {
		return c_strSBString.substr( idx, 1 );
	}
	return c;
}

function	str_MBString2SBString( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = MBString2SBString( src.substr( idx, 1 ) );
		if ( null === c ) {
			return null;
		}
		dst = dst.concat( c );
	}
	return dst;
}

/** ひらがな文字をカタカナ文字に変換
 * 
 * 
 */
function	Hira2Kana( c )
{
	if ( 0 < ' 　\t'.indexOf( c ) ) {
		return ' ';
	}
	if ( ' ' == c || 0 <= c_strKata.indexOf( c ) || 0 <= c_strNor.indexOf( c ) ) {
		return c;
	}
	var idx = c_strHira.indexOf( c );
	if ( 0 <= idx ) {
		return c_strKata.substr( idx, 1 );
	}
	return null;
}

function	str_Hira2Kana( src )
{
	var dst = '';
	for ( var idx = 0 ; idx < src.length ; idx++ ) {
		var c = Hira2Kana( src.substr( idx, 1 ) );
		if ( null === c ) {
			return null;
		}
		dst = dst.concat( c );
	}
	return dst;
}

/** エラーがあった入力項目名を保存/保存解除
 * 
 * 
 */
var g_elemErrorInput = null;
function	ErrorInput( elemTarget, flag )
{
	var strErr = elemTarget.name;
	var strInput = g_elemErrorInput.value;
	var arrayName = strInput.split( ' ' );
	var arrayNew = new Array(  );
	for ( var idx = 0 ; idx < arrayName.length ; idx++ ) {
		if ( '' == arrayName[ idx ] ) {
			continue ;
		}
		if ( ! flag && arrayName[ idx ] == strErr ) {
			continue ;
		}
		else if ( flag && arrayName[ idx ] == strErr ) {
			flag = 0;
		}
		arrayNew.push( arrayName[ idx ] );
	}
	if ( flag ) {
		arrayNew.push( strErr );
	}
	g_elemErrorInput.value = arrayNew.join( ' ' );
	return ;
}

/** 入力項目全部の文字種変換
 * 
 * 行頭および末尾の空白は除去
 * 一つまたは連続した複数個の全角空白及び半角空白は、一つの半角空白に
 * 
 */
function	onTextChange( elemTarget )
{
	var str = elemTarget.value;
	str = str.replace( /[ 　\t]+/g, ' ' );
	str = str.replace( /^ /, '' );
	str = str.replace( / $/, '' );
	str = str_SBKana2MBKana( str );
	elemTarget.value = str;
	return ;
}

function	callback_onTextChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Text: elemTarget is null' );
	}
	onTextChange( elemTarget );
	return ;
}

/** ログインIDの文字種変換及び検査
 * 
 * 全角を半角に変換
 * 空白を除去
 * 半角英数字と「-.@_」のみ
 * 
 */
function	onLoginIdChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str.replace( /\s/g, '' );
	str = str_MBString2SBString( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	if ( '' != str ) {
		if ( str.match( /[^\d\w\-.@_]/ ) ) {
			ErrorInput( elemTarget, 1 );
			return ;
		}
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onLoginIdChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'LoginId: elemTarget is null' );
	}
	onLoginIdChange( elemTarget );
	return ;
}

/** パスワードの文字種変換及び検査
 * 
 * 全角を半角に変換の文字種変換及び検査
 * 空白を除去
 * 半角数字のみ
 * 
 */
function	onLoginPasswdChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str.replace( /\s/g, '' );
	str = str_MBDigit2SBDigit( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onLoginPasswdChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'LoginPasswd: elemTarget is null' );
	}
	onLoginPasswdChange( elemTarget );
	return ;
}

/** 氏名の文字種変換及び検査
 * 
 * 空白を除去
 * 
 */
function	onFullnameChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str.replace( /\s/g, '' );
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onFullnameChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Fullname: elemTarget is null' );
	}
	onFullnameChange( elemTarget );
	return ;
}

/** フリガナの文字種変換及び検査
 * 
 * 複数個の空白は、一つの半角空白に
 * 全角カタカナに
 * カタカナ以外はエラー
 * 
 */
function	onKanaChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str_Hira2Kana( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onKanaChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Kana: elemTarget is null' );
	}
	onKanaChange( elemTarget );
	return ;
}

/** 郵便番号の文字種変換及び検査
 * 
 * 全角を半角に変換
 * 数字7桁だったら「-」を付加する
 * 数字、ハイフン以外はエラー
 * 
 */
function	onZipChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str_MBDigit2SBDigit_Hyphen( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	str = str.replace( /^(\d{3})(\d{4})$/, '$1-$2' );
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onZipChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Zip: elemTarget is null' );
	}
	onZipChange( elemTarget );
	return ;
}

/** 電話番号の文字種変換及び検査
 * 
 * 全角を半角に変換
 * 数字、括弧、ハイフン以外はエラー
 * 
 */
function	onPhoneChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str_MBDigit2SBDigit_BracketHyphen( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onPhoneChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Phone: elemTarget is null' );
	}
	onPhoneChange( elemTarget );
	return ;
}

/** ニックネームの文字種変換及び検査
 * 
 * 半角を全角に変換
 * 空白を除去
 * 
 */
function	onNicknameChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str.replace( /\s/g, '' );
	str = str_SBString2MBString( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onNicknameChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Nickname: elemTarget is null' );
	}
	onNicknameChange( elemTarget );
	return ;
}

/** メールアドレスの文字種変換及び検査
 * 
 * 全角を半角に変換
 * 空白を除去
 * 「@」のチェック
 * 
 */
function	onMailtoChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str.replace( /\s/g, '' );
	str = str_MBString2SBString( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	if ( '' != str ) {
		if ( str.match( /^@/ ) || str.match( /@$/ ) || str.match( /@.*@/ ) || ! str.match( /@/ ) ) {
			ErrorInput( elemTarget, 1 );
			return ;
		}
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onMailtoChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'Mailto: elemTarget is null' );
	}
	onMailtoChange( elemTarget );
	return ;
}

/** アクセスIDの文字種変換及び検査
 * 
 * 全角を半角に変換の文字種変換及び検査
 * 空白を除去
 * 半角数字のみ
 * 
 */
function	onAccessIDChange( elemTarget )
{
	onTextChange( elemTarget );
	var str = elemTarget.value;
	str = str.replace( /\s/g, '' );
	str = str_MBDigit2SBDigit( str );
	if ( null === str ) {
		ErrorInput( elemTarget, 1 );
		return ;
	}
	elemTarget.value = str;
	ErrorInput( elemTarget, 0 );
	return ;
}

function	callback_onAccessIDChange( evt )
{
	evt = ( ( evt ) ? evt : event );
	var elemTarget = eventTarget( evt );
	if ( ! elemTarget ) {
		throw new Error( 'AccessID: elemTarget is null' );
	}
	onAccessIDChange( elemTarget );
	return ;
}

/* TODO:年齢表示 */

/* 末日を処理 */
function	MonthLastDay( year, month )
{
	mon++;
	if ( 12 < mon ) {
		mon = 1;
		year++;
	}
	dd = new Date( year, mon, 1 );
	var nMinSec = 24 * 60 * 60 * 1000;
	dd -= nMinSec;
	var nLastDay = dd.getDay
	return ( nLastDay );
}

/* ...お蔵入り */
function force_word_wrap( elem, style )
{
	var strWordWrap = '';
	var strSrc = elem.innerHTML.split( '' );
	for( var idx = 0 ; idx < strSrc.length ; idx++ ) {
		var c = strSrc[ idx ];
		strWordWrap += c.concat( "<span class='" ).concat( style ).concat( "'>&nbsp;</span>" );
	}
	elem.innerHTML = strWordWrap;
	return ;
}

