//============================================================================//
// All Rights Reserved,Copyright (C) FUJITSU LIMITED 2001
// システム名　　：スポーツ情報ネットワーク構築事業
// プログラム名　：JavaScript共通関数 
// 作成日　　　　：2001/11/27 V01/L01 CLIMB T.Hosoi
// 修正履歴　　　：
//============================================================================//
// 定数定義
var DIAG_ALERT		= "0";	//エラー
var DIAG_CONFIRM	= "1";	//確認
var DIAG_PROMPT		= "2";	//入力

var calendarwin;

//----------------------------------------------------------------------------//
// 関数名：数値チェック
// 概　要：引数から編集記号を取り除き数値チェックを行う
// 引　数：数値(val)
// 戻り値：boolean
//----------------------------------------------------------------------------//
function numCheck(val){
	var wk = strDelete(val.toString());
	if (wk=="") return false;
	if(isNaN(wk)){
		return false;
	}else{
		return true;
	}
}

//----------------------------------------------------------------------------//
// 関数名：数値桁数チェック（少数桁対応）
// 概　要：引数から編集記号を取り除き桁チェックを行う
// 引　数：数値(val)
// 　　　：整数桁(keta)
// 　　　：少数桁(decimal)
// 戻り値：boolean
//----------------------------------------------------------------------------//
function numKetaCheck(val,keta,decimal){
	var wk = strDelete(val.toString());
	if (!numCheck(wk)) {
		return false;
	}

	var sCut = wk.split(".");
	if (decimal <= 0 && wk.indexOf(".",0) > 0){
		return false;
	}

	if (sCut[0] < 0){
		keta = ++keta;
	}

	switch (sCut.length){
	case 1:		//整数部のみ
		if (sCut[0].length > keta){
			return false;
		}
		break;
	case 2:		//小数部あり 
		if ((sCut[0].length > keta) || (sCut[1].length > decimal)){
			return false;
		}
		break;
	default:
		return false;
		break;
	}

	return true;
}

//------------------------------------------------------------------//
// 関数名：文字数チェック
// 概　要：入力可能範囲の桁か調べる 
// 引　数：文字列(val)
// 　　　：入力可能桁数(keta)
// 戻り値：boolean
//------------------------------------------------------------------//
function strKetaCheck(val,keta){
	if(val.length > keta){
		return false;
	}else{
		return true;
	}
}

//------------------------------------------------------------------//
// 関数名：半角チェック
// 概　要：半角文字か調べる 
// 引　数：文字列(str)
// 戻り値：boolean
//------------------------------------------------------------------//
function hankakuCheck(str){
	chk_flg = true;
	for (i=0;i<str.length;i++){
		b  = str.substring(i,i+1);
		xb = escape(b);
		if(xb.length!=1){
			if(xb.length==3){
				xb2 = xb.substring(1,3);
				if(xb2>="80"){
					chk_flg=false;
					break;
				}
			}else{
				chk_flg=false;
				break;
			}
		}
	}
	return chk_flg;
}

//------------------------------------------------------------------//
// 関数名：全角チェック
// 概　要：全角文字か調べる 
// 引　数：文字列(str)
// 戻り値：boolean
//------------------------------------------------------------------//
function zenkakuCheck(str){
	chk_flg = true;
	for (i=0;i<=str.length-1;i++){
		b  = str.substring(i,i+1);
		xb = escape(b);
		if(xb.length==3){
			//nn4.06以上、ie4.X以上の対応
			if ( (navigator.appName.charAt(0)=="N") &&
				(navigator.appVersion.substring(0,4)>="4.06") ) {
				xb2 = xb.substring(1,3);
				if((("80"<=xb2)&(xb2<"A1"))|("DF" < xb2)){
					chk_flg = true;
				}else{
					chk_flg=false;
					break;
				}
			} else {
				//nn４．06以下の対応
				xb2 = xb.substring(1,3);
				if((("80"<=xb2)&(xb2<"A1"))|("DF" < xb2)){
					i++;
				}else{
					chk_flg=false;
					break;
				}
			}
		}else{
			if(xb.length==6){
				f_code = xb.substring(0,2);
				//ユニコードによる判定(ie4.x)
				if (f_code == "%u") {
					xb2=xb.substring(2,6);
					if((xb2<"FF61")|("FF9F" < xb2)){
						chk_flg = true;
					}else{
						chk_flg=false;
						break;
					}
				}else{
					//アスキーコードによる判定(nn4.05以上）
					xb2 = xb.substring(1,3);
					if((("80"<=xb2)&(xb2<"A1"))|("DF" < xb2)){
						chk_flg = true;
					}else{
						chk_flg=false;
						break;
					}
				}
			}else{
				if(xb.length == 4){
					xb2=xb.substring(1,3);
					//アスキーコードによる判定(nn4.05以上）全角数字等の対応
					if((("80"<=xb2)&(xb2<"A1"))|("DF" < xb2)){
						chk_flg = true;
					}else{
						chk_flg=false;
						break;
					}
				}else{
					if(xb.length!=1){
						window.alert("全角チェックロジックエラー");
						chk_flg=false;
						break;
					}
					chk_flg=false;
					break;
				}
			}
		}
	}
	return chk_flg;
}

//----------------------------------------------------------------------------//
// 関数名：年月日チェック
// 概　要：引数の年月日をもとに実在日チェックを行う
// 引　数：年(y)
// 　　　：月(m)
// 　　　：日(d)
// 戻り値：boolean
//----------------------------------------------------------------------------//
function ymdCheck(y,m,d){

	if((y == 0)||(m == 0)||(d == 0)){
		return false;
	}
	if((y == '')||(m == '')||(d == '')){
		return false;
	}
	if((isNaN(y))||(isNaN(m))||(isNaN(d))){
		return false;
	}
	if((y - Math.floor(y) != 0)||(m - Math.floor(m) != 0)||(d - Math.floor(d) != 0)){
		return false;
	}
	if((y < 0)||(m < 0)||(d < 0)){
		return false;
	}
	//月のチェック
	if(m > 12){
		return false;
	}
	//日のチェック
	if(d > 31){
		return false;
	}
	//２月 
	if(m == 2){
		if(y % 4 == 0){
			if((y % 100) == 0 && (y % 400 != 0)){
				if(d > 28){
					return false;
				}
			}else{
				if(d > 29){
					return false;
				}
			}
		}else if(d > 28){
			return false;
		}
	}
	if(m == 4 || m == 6 || m == 9 || m == 11){
		if(d == 31){
			return false;
		}
	}
	return true;
}

//------------------------------------------------------------------//
// 関数名：郵便番号チェック
// 概　要：郵便番号のフォーマットチェック
// 引　数：文字列(val)
// 戻り値：boolean
//-----------------------------------------------------------------//
function yubinCheck(val){
	if (val.length != 8){
		return false;
	}
	if (val.charAt(3) != "-"){
		return false;
	}
	var spl = new Array();
	spl = val.split("-",2);

	if (numCheck(spl[0])) {
		if (numCheck(spl[1])) {
			return true;
		}
	}
	return false;
}

//----------------------------------------------------------------------------//
// 関数名：編集文字除去 
// 概　要：引数の値からプラス(+)、カンマ(,)、円(\)を除去する 
// 引　数：値(val)
// 戻り値：
// 　　　　正常		：編集文字除去後の値
// 　　　　エラー	：false
//----------------------------------------------------------------------------//
function strDelete(val){
	if (val == ""){
		return false;
	}
	var delStrings = new Array('+',',','\\');
	var wk = val.toString();

	for ( var i =0 ; i < delStrings.length ; i++)
		wk = wk.split(delStrings[i]).join('');

	return wk;
}

//----------------------------------------------------------------------------//
// 関数名：サブウインドウオープン 
// 概　要：指定された引数でサブウインドウを開く
// 引　数：URL		URL
// 　　　：winName	ウインドウタイトル 
// 　　　：x		ウインドウ横位置
// 　　　：y		ウインドウ縦位置
// 　　　：w		ウインドウ幅
// 　　　：h		ウインドウ高さ
// 　　　：s		スクロールバー
// 戻り値：			なし
//----------------------------------------------------------------------------//
function winOpen(URL,winName,x,y,w,h,s){
	var para =""
	+" left="        +x
	+",screenX="     +x
	+",top="         +y
	+",screenY="     +y
	+",toolbar="     +0
	+",location="    +0
	+",directories=" +0
	+",status="      +0
	+",menubar="     +0
	+",scrollbars="  +s
	+",resizable="   +1
	+",innerWidth="  +w
	+",innerHeight=" +h
	+",width="       +w
	+",height="      +h;

	calendarwin=window.open(URL,winName,para);

}

var msgSet = false;
//----------------------------------------------------------------------------//
// 関数名：メッセージ出力
// 概　要：引数のメッセージIDに該当するメッセージをアラートする 
// 引　数：メッセージID(id)
// 　　　：ダイアログ種別(dialog)
// 戻り値：alert		：なし
// 　　　：confirm		：confirmの戻り値(true,false)
// 　　　：prompt		：promptの戻り値（入力文字）
// 　　　：エラー		：なし
//----------------------------------------------------------------------------//
function alertMsg(id,dialog){

	if (!msgSet) {
		comMakeMsg();
		msgSet = true;
	}

	for (var i=1; i<msgNum+1; i++) {
		if (msgArray[i][0] == id) {
			switch (dialog) {
			case "0":
				alert(msgArray[i][1]);
				return;
			case "1":
				return confirm(msgArray[i][1]);
			case "2":
				return prompt(msgArray[i][1],"");
			default:
				return;
			}
		}
	}
	alert("該当するメッセージがありません ");
}

//----------------------------------------------------------------------------//
// 関数名：フィールドクリア
// 概　要：指定フィールドをクリアする 
// 引　数：対象フィールドname
// 戻り値：なし
//----------------------------------------------------------------------------//
function clearField(str){

	document.mainForm.elements[str].value="";

}

//----------------------------------------------------------------------------//
// 関数名：空白削除 
// 概　要：文字列の前後から空白を削除する 
// 引　数：対象文字列(value)
// 戻り値：空白を削除した文字列 
//----------------------------------------------------------------------------//
function trim(value) {
var str=value;

	while (str.charAt(0)==" ") {
		str=str.substring(1,str.length);
	}
	while (str.charAt(str.length-1)==" ") {
		str=str.substring(0,str.length-2);
	}

	return str;

}


//----------------------------------------------------------------------------//
// 関数名：ゼロ埋め 
// 概　要：対象数値に指定桁のZEROを埋め込む 
// 引　数：対象数値(value)
// 　　　：ゼロ埋め後の桁数 
// ※注意　数値が指定桁より大きい場合は数値をそのまま返す
// 戻り値：ゼロ埋めした数値
//----------------------------------------------------------------------------//
function fillZero(value, keta) {
var rtn="";
val = new String(value);

	if (val.length>=keta) return value;

	for (var i=0; i<keta; i++) {
		if (i<val.length) {
			rtn += "0";
		} else {
			rtn += val.substring(val.length-i, val.length-i+1);
		}
	}

	return rtn;

}

//----------------------------------------------------------------------------//
// 関数名：施設情報ポップアップ表示
// 概　要：施設情報のポップアップを表示します。
// 引　数：施設ID取得オブジェクト
// 　　　：施設名取得オブジェクト
//----------------------------------------------------------------------------//
function popFacility(code_obj, name_obj){

	var w = 550;
	var h = 300;
	var x = 100;
	var y = 20;

	if (document.all) {
		x  = screen.width/2-w/2;
		y  = screen.height/2-h/2;
	} else if (document.layers) {
		x += window.screenX;
		y += window.screenY;
	}

	s=1;
	var cd  = 'self.opener.document.' + code_obj.form.name + '.' + code_obj.name + '.value';
	var nm  = 'self.opener.document.' + name_obj.form.name + '.' + name_obj.name + '.value';
	var url = CONTEXT_ADMIN+'/servlet/FacilityList?set_code=' + cd + '&set_name=' + nm + '&PROC_ID=' + PROC_POPUP;
	winOpen(url, 'facility', x, y, w, h, s);
}

//----------------------------------------------------------------------------//
// 関数名：郵便番号ポップアップ表示
// 概　要：郵便番号のポップアップを表示します。
// 引　数：郵便番号取得オブジェクト
// 　　　：都道府県取得オブジェクト
// 　　　：市区町村取得オブジェクト
// 　　　：町名番地取得オブジェクト
//----------------------------------------------------------------------------//
function popPostalCd(postalCode, objPref, objCity, objTown){

	var w = 550;
	var h = 300;
	var x = 100;
	var y = 20;

	if (document.all) {
		x  = screen.width/2-w/2;
		y  = screen.height/2-h/2;
	} else if (document.layers) {
		x += window.screenX;
		y += window.screenY;
	}

	s=1;
	var postalCd  = postalCode.value;
	var cd    = 'self.opener.document.mainForm.' + postalCode.name + '.value';
	var pref  = 'self.opener.document.mainForm.' + objPref.name + '.value';
	var city  = 'self.opener.document.mainForm.' + objCity.name + '.value';
	var town  = 'self.opener.document.mainForm.' + objTown.name + '.value';
	var url = CONTEXT_ADMIN+'/servlet/SearchAddress?postal_cd=' + postalCd + '&set_code=' + cd + '&set_pref=' + pref + '&set_city=' + city + '&set_town=' + town;
	winOpen(url, 'postalCd', x, y, w, h, s);
}

//------------------------------------------------------------------//
// 関数名：英数字チェック
// 概　要：入力文字が英数字かチェックする 
// 引　数：文字列(val)
// 戻り値：boolean
//------------------------------------------------------------------//
function isAlphaNumeric(val) {
var ch;
var rtn;
	for (var i=0; i<val.length; i++) {
		ch = escape(val.charAt(i));
		if (ch.length>1) return false;
		if (((ch >= "a")&&(ch <= "z")) ||
		    ((ch >= "A")&&(ch <= "Z")) ||
		    ((ch >= "0")&&(ch <= "9"))) {
			rtn=true;
		} else {
			rtn=false;
			break;
		}
	}
	return rtn;

}

//------------------------------------------------------------------//
// 関数名：メールアドレス形式チェック
// 概　要：メールアドレスの形式が正しいかチェックする 
// 引　数：文字列(val)
// 戻り値：boolean
//------------------------------------------------------------------//
function isEmailString(val) {
var ch;
var rtn;

	if (!val.match("[A-Za-z0-9]+@[A-Za-z0-9._-]+")) return false;

	for (var i=0; i<val.length; i++) {
		ch = escape(val.charAt(i));
		if ((ch != "%40")&&(ch.length>1)) return false;
		if (((ch >= "a")&&(ch <= "z"))     ||
		    ((ch >= "A")&&(ch <= "Z"))     ||
		    ((ch >= "0")&&(ch <= "9"))     ||
		    ((ch == "@") || (ch == "%40")) ||
		     (ch == ".") ||
		     (ch == "-") ||
		     (ch == "_")) {
			rtn=true;
		} else {
			rtn=false;
			break;
		}
	}
	return rtn;

}

//------------------------------------------------------------------//
// 関数名：タグチェック
// 概　要：入力文字にタグ文字が含まれているかチェックする 
// 引　数：文字列(val)
// 戻り値：boolean
//------------------------------------------------------------------//
function tagCheck(val) {
var ch;
var bh;
	ch = val.indexOf("<",0);
	bh = val.indexOf(">",0);
	if(ch != -1 || bh != -1){
		return false;
	}

	return true;

}

//------------------------------------------------------------------//
// 関数名：エスケープ文字チェック
// 概　要：入力文字にJAVA側でエスケープしている文字が含まれているかチェックする 
// 引　数：文字列(val)
// 戻り値：boolean
//------------------------------------------------------------------//
function escCheck(val) {
var ah;
var bh;
var ch;
	ah = val.indexOf("\"",0);
	bh = val.indexOf("'",0);
	ch = val.indexOf("\\",0);
	if(ah != -1 || bh != -1 || ch != -1){
		return false;
	}

	return true;

}

//------------------------------------------------------------------//
// 関数名：日付整合性チェック
// 概　要：開始日、終了日等で開始日が終了日以前である事をチェックする 
// 引　数：開始日(val),終了日(val)
// 戻り値：boolean
//         true:正常 false:異常（終了日の方が以前の日となっている）
//------------------------------------------------------------------//
function strEndDayCheck(startDay, endDay) {
	if(startDay.length != 10 || endDay.length != 10){
		// YYYY-MM-DDでは無い場合は空文字であったりする場合なのでこのチェックではtrueとして返す
		return true;
	}

	var startY = startDay.substring(0,4);
	var startM = startDay.substring(5,7);
	var startD = startDay.substring(8);
	var endY = endDay.substring(0,4);
	var endM = endDay.substring(5,7);
	var endD = endDay.substring(8);
	if(startY > endY){
		// 終了年の方が大きい場合
		return false;
	}else if(startY < endY){
		// 終了年の方が小さい場合は正常
		return true;
	}

	//同年だった場合月のチェック
	if(startM > endM){
		// 終了月の方が大きい場合
		return false;
	}else if(startM < endM){
		// 終了月の方が小さい場合
		return true;
	}

	//同年、同一月だった場合日のチェック
	if(startD >= endD){
		// 終了日の方が大きい場合
		return false;
	}
	return true;

}

