﻿/**
 * 入力可能文字列チェック
 */

// コード定義
var TABCode = String.fromCharCode(9);	// タブコード
var LFCode = String.fromCharCode(10);	// 改行コード(LF)
var CRCode = String.fromCharCode(13);	// 改行コード(CR)

// 言語タイプ定義
var EN = "EN";
var JP = "JP";
var RU = "RU";

// 入力可能文字列定義
var E_HAN_S = 'abcdefghijklmnopqrstuvwxyz';
var E_HAN_L = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var E_ZEN_S = 'ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ';
var E_ZEN_L = 'ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ';
var J_HAN_DAKU = 'ﾞﾟ';
var J_HAN_KATA = 'ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｯｬｭｮ';
var J_ZEN_DAKU = '゛゜';
var J_ZEN_HIRA   = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん';
var J_ZEN_HIRA_D = 'がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ';
var J_ZEN_KATA   = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ';
var J_ZEN_KATA_D = 'ヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ';
var R_S = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
var R_L = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
var NUM_HAN = '0123456789';
var NUM_ZEN = '０１２３４５６７８９';

var E_HAN_MARK = "";								// 英語ページ入力可能マーク
var J_HAN_MARK = '"%=~^|`@+;*:?/_!#${},-()[].';		// 日本語ページ入力可能マーク(半角、J_ZEN_MARKと対)
var J_ZEN_MARK = '”％＝￣＾｜｀＠＋；＊：？／＿'
				   + '！＃＄｛｝，－（）［］．';		// 日本語ページ入力可能マーク(全角、J_HAN_MARKと対)
var R_HAN_MARK = "";								// ロシア語ページ入力可能マーク

var COMPANY_MARK=".,";   // 追加入力許可記号：会社名用
var ADDRESS_MARK="-.";   // 追加入力許可記号：会社名用
var ZIP_MARK="-";        // 追加入力許可記号：郵便番号用
var MAIL_MARK  = '@.-_'; // 追加入力許可記号：メールアドレス用
var PHONE_MARK = '-+#';  // 追加入力許可記号：電話番号（ＦＡＸ）用

var EN_HAN = E_HAN_S + E_HAN_L;              // 半角英字  （半角英大文字＋半角英小文字）
var EN_ZEN = E_ZEN_S + E_ZEN_L;              // 全角英字  （全角英大文字＋全角英小文字）
var JP_HAN_KATA = J_HAN_DAKU + J_HAN_KATA;   // 半角カナ  （半角濁音＋半角カナ文字）
var JP_ZEN_KATA = J_ZEN_KATA + J_ZEN_KATA_D; // 全角カナ  （全角濁音＋全角カナ文字）
var JP_ZEN_HIRA = J_ZEN_HIRA + J_ZEN_HIRA_D; // 全角かな  （全角濁音＋全角かな文字）
var RU_CYRL = R_S + R_L;                     // キリル文字（キリル小文字＋キリル大文字）

var EN_MARK_ALL = "";
var JP_MARK_ALL = J_ZEN_MARK+'￥ー＆＞＜．’';
var RU_MARK_ALL = "";

var PHONE_HAN = NUM_HAN + PHONE_MARK;
var MAIL_HAN  = EN_HAN  + NUM_HAN + MAIL_MARK;



//-----------------------------------------------------
// オブジェクト
// 言語別にメッセージを定義
// 添え字(全言語タイプ共通)：
//     0   - 文字数オーバーエラー
//     1   - 入力文字エラー
//-----------------------------------------------------
function msgList(){

     // 要素１：括弧始め
     // 要素２：括弧終わり
     // 要素３：「エラーとなった項目 =」
     // 要素４、５：入力可能文字数超過メッセージ
     // 　　要素４：「入力可能文字数を超えています」
     // 　　要素５：「入力可能文字数 : 」
     // 要素６～８：入力不正時エラーメッセージ
     // 　　要素６：「入力に誤りがあります。内容を確認してください。」
     // 　　要素７：「エラーとなった文字 = [ 」
     // 　　要素８：「 ]」

	this.enMsg = new Array(   " << "
							, " >> "
							, "An error occurred in the following item(s)."
							, "The number of maximum inputable characters has been exceeded. "
							, "The number of maximum inputable characters : " 
							, "An error has been found in the input data. Please confirm the content."
							, "An error has been found in the following letters. = [ "
							, " ]"
						  );

	this.jpMsg = new Array(   " << "
							, " >> "
							, "エラーとなった項目 : "
							, "入力可能文字数を超えています。"
							, "入力可能文字数 : "
							, "入力に誤りがあります。内容を確認してください。"
							, "エラーとなった文字 = [ "
							, " ]"
						  );

	this.ruMsg = new Array(   " << "
							, " >> "
							, "Была  найдена ошибка  в следующем пункте."
							, "Количество возможных для записи  знаков превышено."
							, "Количество возможных для записи  знаков : "
							, "Ошибка при записи. Проверте  правильность  написания."
							, "Ошибка при записи данного знака = [ "
							, " ] "
						  );

}


//-----------------------------------------------------
// オブジェクト
// 処理に必要な情報を格納する
// param:
//     inLangType  - 言語タイプ(英、日、露)
//     inObj       - フィールドオブジェクト
//     inFieldNm   - 欄名
//     inChkStr    - 欄に対するチェックを行う文字
//     inMaxLength - 最大文字数
//-----------------------------------------------------
function dataObj( inLangType, inObj, inFieldNm, inChkStr, inMaxLength ){

	this.langType = inLangType;
	this.objInfo  = inObj;
	this.fieldNm  = inFieldNm;
	this.baseVal  = inObj.value;
	this.chgVal   = "";
	this.chkStr   = inChkStr;
	this.maxLen   = inMaxLength;
}


//-----------------------------------------------------
// 入力文字列チェック
// param:
//     dataObj - 入力欄のオブジェクト
//     flg     - dataObj.chkStrが可能/不可能どっちをチェックするか判断
//       true  ： - 入力可能文字をチェックする場合
//       false ： - 入力不可能文字をチェックする場合
// return :
//     true    - 入力チェック文字無し
//     false   - 入力チェック文字有り
//-----------------------------------------------------
function isCharaCheck( dataObj, flg ){
    return isCharaCheck_withTrimFlg( dataObj, flg, true );
}

function isCharaCheck_withTrimFlg( dataObj, flg, blnTrim ){

    var sLang = dataObj.langType;
	var check = "";
	if( flg ){
		check = "OK"; // 入力チェック文字無し ( True  -> "OK" ) 
	} else {
		check = "NG"; // 入力チェック文字有り ( False -> "NG" ) 
	}

	var i;
	var t = "";
	if( dataObj.chgVal != "" && dataObj.chgVal.length > 0 ){
		t = dataObj.chgVal;
	} else {
		t = dataObj.objInfo.value;
	}
	var chkStr = dataObj.chkStr;

	// 入力文字列から改行コード、空白文字、タブコードを削除
	t = delNewline( t );
	t = delTabCode( t );
// ------------ 07.02.20 Edit ELTEX-Kimizuka ----
//	t = allTrimmed( t );
	if ( blnTrim == true ) { 
		t = allTrimmed( t );
	}
// ------------ 07.02.20 Edit ELTEX-Kimizuka ----

	if( t != null && t != "" ){
		for( i = 0; i < t.length; i++ ){
			var chr = t.substring( i, i+1 );

			if( chkStr.indexOf( chr ) < 0 ){
				// 入力可能文字チェック時、chkStr設定文字以外が含まれていた場合エラーメッセージ表示
				if( check == "OK" ){
					// サイトの言語タイプによりメッセージを変える
					alert( getMessage( sLang, 5 ) + '\n'
					     + '---------------------------------' + '\n'
					     + getMessage( sLang, 2 ) + '\n'
					     + getMessage( sLang, 0 ) + dataObj.fieldNm + getMessage( sLang, 1 ) + '\n'
					     + getMessage( sLang, 6 ) + chr + getMessage( sLang, 7 ) );
					return false;
				}
			} else {
				// 入力不可能文字チェック時、chkStr設定文字が含まれていた場合エラーメッセージ表示
				if( check == "NG" ){
					// サイトの言語タイプによりメッセージを変える
					alert( getMessage( sLang, 5 ) + '\n'
					     + '---------------------------------' + '\n'
					     + getMessage( sLang, 2 ) + '\n'
					     + getMessage( sLang, 0 ) + dataObj.fieldNm + getMessage( sLang, 1 ) + '\n'
					     + getMessage( sLang, 6 ) + chr + getMessage( sLang, 7 ) );
					return false;
				}
			}

		}
	}
	return true;
}


//-----------------------------------------------------
// 文字の最大数を超えていないかチェック
// param  ：
//     val     - 対象の文字列
//     dataObj - 対象のオブジェクト
// return :
//     true    - 最大数以下、もしくはチェック無し
//               (最大数が 0 の場合はチェックしない)
//     false   - 最大数を超えている
//-----------------------------------------------------
function checkMaxLength( dataObj ){

	var val = "";
	if( dataObj.chgVal != "" && dataObj.chgVal.length > 0 ){
		val = dataObj.chgVal;
	} else {
		val = dataObj.objInfo.value;
	}
	var valByte = getStrByte( val );
	var fieldMaxLen = dataObj.maxLen;

	if( fieldMaxLen > 0 ){
		if( valByte > fieldMaxLen ){

			// サイトの言語タイプによりメッセージを変える

			alert( getMessage( dataObj.langType, 3 ) + '\n'
				 + '---------------------------------' + '\n'
				 + getMessage( dataObj.langType, 2 ) + '\n'
				 + getMessage( dataObj.langType, 0 ) + dataObj.fieldNm  + getMessage( dataObj.langType, 1 ) + '\n'
				 + getMessage( dataObj.langType, 4 ) + fieldMaxLen ) ;
			return false;
		}
	}
	return true;

}


//-----------------------------------------
// 半角 -> 全角 変換
// param  ：
//     baseText   - 変換前の文字列
//     chgTextHan - 変換対象文字列(半角)
//     chgTextZen - 変換対象文字列(全角)
// return ：
//     str        - 変換後の文字列
//-----------------------------------------
function hankakuToZenkaku( baseText, chgTextHan, chgTextZen ){

	// 引数のいずれかに空白があった場合、baseTextを変換せずにreturn
	if( baseText == "" || chgTextHan == "" || chgTextZen == "" ){
		return baseText;
	}

	var str = "";
	for( i = 0; i < baseText.length; i++ ){

		var c = baseText.charAt(i);
		var n = chgTextHan.indexOf( c, 0 );
		if (n >= 0) c = chgTextZen.charAt( n );
		str += c;
	}

	return str;

}


//-----------------------------------------
// オブジェクトのvalue値を差し替える。
// param  ：
//     objs    - 対象のオブジェクトの配列
//     type    - 差し替え文字列を判定
//                1 ： objs.baseVal
//                2 ： objs.chgVal
// return ：
//     retObjs - value値差し替え処理後のオブジェクトの配列
//-----------------------------------------
function getTransObjs( objs, type ){

	var retObjs = objs;

	var j;
	for( j = 0; j < retObjs.length; j++ ){
		switch( type ){
			case 1:
				if( retObjs[j].baseVal != "" ){
					retObjs[j].objInfo.value = retObjs[j].baseVal;
				}
				break;
			case 2:
				if( retObjs[j].chgVal != "" ){
					retObjs[j].objInfo.value = retObjs[j].chgVal;
				}
				break;
			default:
		}
	}

	return retObjs;
}


//-----------------------------------------
// セキュリティ等の問題で一括変換できない記号を半角から全角に変換
// param  ：
//     str      - 文字列
//     chgStr   - 変換対象文字をつなげた文字列(半角)
// return ：
//     transStr - 変換後の文字列
//-----------------------------------------
function chgMark( str, chgStr ){

	// 引数が空白だった場合、変換せずにreturn
	if( str == "" ){
		return str;
	}

	var transStr = str;

	// '\'→'￥'(chgStrに含まれていなくても変換)
	transStr = hankakuToZenkaku( transStr, '\\', '￥' );

	// '&'→'＆'
	if( chgStr.indexOf( '&', 0 ) > 0 ){
		transStr = hankakuToZenkaku( transStr, '&', '＆' );
	}

	// '<'→'＜'
	if( chgStr.indexOf( '<', 0 ) > 0 ){
		transStr = hankakuToZenkaku( transStr, '<', '＜' );
	}

	// '>'→'＞'
	if( chgStr.indexOf( '>', 0 ) > 0 ){
		transStr = hankakuToZenkaku( transStr, '>', '＞' );
	}

	// '.'→'．'
	if( chgStr.indexOf( '.', 0 ) > 0 ){
		transStr = hankakuToZenkaku( transStr, '.', '．' );
	}

	return transStr;
}


//-----------------------------------------
// 文字列のバイト数を計る
// param  ：
//     target - 文字列
// return ：
//     retval - 文字列のバイト数
//-----------------------------------------
function getStrByte(target){

	var buf,retval,chr;

	buf=escape(target);

	retval=0;
	for (i=0; i<buf.length; i++) {
		chr = buf.substring (i,i+1);
		if(chr == "%"){
			i += 5;
			retval += 2;
		} else {
			retval++;
		}
	}

	return retval;
}


//-----------------------------------------
// 言語タイプと種類に対応したメッセージを取得
// param  ：
//     lang - 言語タイプ
//     type - メッセージ種類
//            ( msgList()のフィールドの配列添え字に対応)
// return ：
//     msg  - 対応メッセージ
//-----------------------------------------
function getMessage( lang, type ){

	var msg = "";
	var msgObj = new msgList();
	var msgArray = new Array(0);

	if( lang == EN ) {
		msgArray = msgObj.enMsg; // 英語サイト
	} else if( lang == JP ) {
		msgArray = msgObj.jpMsg; // 日本語サイト
	} else if( lang == RU ) {
		msgArray = msgObj.ruMsg; //ロシア語サイト
	}

	if( msgArray.length != 0 && type < msgArray.length ) {
		msg = msgArray[ type ];
	} else {
		msg = "System Error!! => Can't Get Error Message!"
	}

	return msg;
}


//-----------------------------------------
// 改行コード削除
// param  ：
//     str - 文字列
// return ：
//     t   - 改行コード削除後の文字列
//-----------------------------------------
function delNewline( str ){

	var i;
	var t = str;

	var isNotCR = false;
	var isNotLF = false;

	while( true ){

		if( t.search( CRCode ) > -1 ) {
			t = t.replace( CRCode, "" );
		} else {
			isNotCR = true;
		}

		if( t.search( LFCode ) > -1) {
			t = t.replace( LFCode, "" );
		} else {
			isNotLF = true;
		}

		if( isNotCR && isNotLF ) {
			break;
		}
	}	// end loop

	return t;
}


//-----------------------------------------
// タブコード削除
// param  ：
//     str - 文字列
// return ：
//     t   - タブコード削除後の文字列
//-----------------------------------------
function delTabCode( str ) {

	var i;
	var t = str;

	while( true ){

		if( t.search( TABCode ) > -1 ) {
			t = t.replace( TABCode, "" );
		} else {
			break;
		}
	}	// end loop

	return t;
}


//-----------------------------------------
// before and after space delete
//-----------------------------------------
function trimmed(str) {

	if (str != null) {
		str = str.replace(/^\u3000+/, "");
		str = str.replace(/\u3000+$/, "");
		str = str.replace(/^\s+/, "");  // remove leading white spaces
		str = str.replace(/\s+$/, "");  // remove trailing while spaces
		return str;
	} else {
		return null;
	}
}


//-----------------------------------------
// all space delete
//-----------------------------------------
function allTrimmed( str ) {

	if (str != null) {
		str = str.replace(/\u3000/g,"");
		str = str.replace(/\s/g,"");
		return str;
	} else {
		return null;
	}

}


//-----------------------------------------------------
// 2007.02.22 ADD ELTEX-Kimizuka 
//-----------------------------------------------------
function checkDate(in_Year, in_Month, in_Day) {

	aryLastDay = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

	// 月が12を超える場合はエラー
	if ( in_Month> 12 ) { return false; }

	// 日が31を超える場合はエラー
	if ( in_Day  > 31 ) { return false; }

	if ( in_Year == "" && in_Month == "" && in_Day == "") {
		return true; // いずれも無いなら、未選択として妥当
	} else if ( in_Year == "" || in_Month == "" || in_Day == "") {
		return false; // いずれかがあり、空データがあるときは不正
	}

	//閏年なら２月の末日を２９日に変更
	if ( (in_Year % 4) == 0 && (  (in_Year % 100) != 0 || (in_Year % 400) == 0 ) ) {
		aryLastDay[2 - 1]= 29;
	}

	// 日が末日を超える場合はエラー
	if (aryLastDay[in_Month-1] < in_Day) { 
		return false; 
	}
	
	// 日付として妥当
	return true;
}
