/*******************************************************************************

	JavaScript1.2以上対応 日付入力関数

	・テスト環境	Windowsマシン	IE5.5, 6.0 
									OPERA6.5、7.0
									Netscape7.0

	自由に改変、転記、複写等して頂いて構いません。
	ホームページにて無料のユーザー登録を実施しておりますので、登録にご協力お願いします。
	ただし作者は著作権を放棄したわけではありませんので取り扱いにご注意ください。
	また、作者はこのプログラムを使用することによって発生したいかなる損害も一切責任を負いません。
	このコメント欄は、よほどの問題でもない限り削除しないで下さい。

													Copyright(c) 2002-2003 ZAKOP.

								URL:http://www.yo.rim.or.jp/~zako-chn/index.html

*********************************************************************************/
/*
カレンダー入力窓表示ボタンを含んだHTMLを描画します。

ARG1 ... DB受け渡し用の8桁の日付を格納するHIDDENフィールドの名称(yyyymmddの形でセットされる)
ARG2 ... 年選択コンボのオブジェクト名
ARG3 ... 月選択コンボのオブジェクト名
ARG4 ... 日選択コンボのオブジェクト名
ARG5 ... 年:値がない場合は、null、"0000"、"0"のいずれかをセット
ARG6 ... 月
ARG7 ... 日
ARG8 ... 並び順:0..昇順 1..降順:省略した場合は昇順

備考
*/
function gfncCalInputSet(nm, nmyy, nmmh, nmdy, fyr, mh, dt, sort) {
	if ((fyr == null ) || (fyr == "0") || (fyr == "0000")) {
		var now = new Date();
		var yr  = now.getYear();
		var mh  = now.getMonth() + 1;
		var dt  = now.getDate();
		var fyr = (yr < 1900) ? 1900 + yr : yr;
	}

	//HIDDEN領域に日付を格納
	var ev = nm + ".value = ('000' + " + nmyy + ".value).slice(-4,7)"
	ev +=               " + ('0' + " + nmmh + ".value).slice(-2,3)"
	ev +=               " + ('0' + " + nmdy + ".value).slice(-2,3);"

	//パラメタが省略されている場合は昇順
	if (typeof(sort) == 'undefined') sort = 0;

	if ( sort == 0 ) {
		//昇順でコンボ出力
		document.write('<SELECT size="1" name="' + nmyy + '" onchange="' + "" + ev + '">');
		for(var i = 1970;i <= 2050; i++) {
			document.write('<OPTION VALUE="' + i + '"');
			if (i == fyr) document.write(' selected');
			document.write('>' + i);
		}
		document.write('</SELECT>');

		document.write('<SELECT size="1" name="' + nmmh + '" onchange="' + "" + ev + '">');
		for(var i = 1;i <= 12; i++) {
			document.write('<OPTION VALUE="' + i + '"');
			if (i == mh) document.write(' selected');
			document.write('>' + i);
		}
		document.write('</SELECT>');

		document.write('<SELECT size="1" name="' + nmdy + '" onchange="' + "" + ev + '">');
		for(var i = 1;i <= 31; i++)  {
			document.write('<OPTION VALUE="' + i + '"');
			if (i == dt) document.write(' selected');
			document.write('>' + i);
		}
		document.write('</SELECT>');
	} else {
		//降順でコンボ出力
		document.write('<SELECT size="1" name="' + nmyy + '" onchange="' + "" + ev + '">');
		for(var i = 2050;i >= 1970; i--) {
			document.write('<OPTION VALUE="' + i + '"');
			if (i == fyr) document.write(' selected');
			document.write('>' + i);
		}
		document.write('</SELECT>');

		document.write('<SELECT size="1" name="' + nmmh + '" onchange="' + "" + ev + '">');
		for(var i = 12;i >= 1; i--) {
			document.write('<OPTION VALUE="' + i + '"');
			if (i == mh) document.write(' selected');
			document.write('>' + i);
		}
		document.write('</SELECT>');

		document.write('<SELECT size="1" name="' + nmdy + '" onchange="' + "" + ev + '">');
		for(var i = 31;i >= 1; i--)  {
			document.write('<OPTION VALUE="' + i + '"');
			if (i == dt) document.write(' selected');
			document.write('>' + i);
		}
		document.write('</SELECT>');
	}

	//HIDDEN領域に初期値をセット
	var strTemp = ("000" + fyr).slice(-4,7) + ("0" + mh).slice(-2,3) + ("0" + dt).slice(-2,3);
	document.write('<INPUT type="hidden" name="' + nm + '" value="' + strTemp + '">');

	//カレンダーを表示するボタンを出力
	document.write('<INPUT type="button" value="選択" onClick="gfncCal(\'' + nm + '\',\'' + nmyy + '\',\'' + nmmh + '\',\'' + nmdy + '\','
					+ nmyy + '.options[' + nmyy + '.selectedIndex].value,'
					+ nmmh + '.options[' + nmmh + '.selectedIndex].value,'
					+ nmdy + '.options[' + nmdy + '.selectedIndex].value);">');
}

/*
カレンダー（和暦）HTMLを描画します。

ARG1 ... DB受け渡し用の8桁の日付を格納するHIDDENフィールドの名称
ARG2 ... 年選択コンボのオブジェクト名
ARG3 ... 月選択コンボのオブジェクト名
ARG4 ... 日選択コンボのオブジェクト名
ARG5 ... 年:値がない場合は、null、"0000"、"0"のいずれかをセット
ARG6 ... 月
ARG7 ... 日

備考
*/
function gfncCalInputSetW(nm, nmyy, nmmh, nmdy, fyr, mh, dt) {
	if ((fyr == null ) || (fyr == "0") || (fyr == "0000")) {
		var now = new Date();
		var yr  = now.getYear();
		var mh  = now.getMonth() + 1;
		var dt  = now.getDate();
		var fyr = (yr < 1900) ? 1900 + yr : yr;
	}

	var ev = nm + ".value = ('000' + gfncWarekiToSeireki(" + nmyy + "w.value, " + nmyy + ".value)).slice(-4,7)"
	ev +=               " + ('0' + " + nmmh + ".value).slice(-2,3)"
	ev +=               " + ('0' + " + nmdy + ".value).slice(-2,3);"
	//ev += "alert(" + nm + ".value)"

	//西暦を和暦に変換
	var w_offset;
	var nengo;
	nengo = gfncSeirekiToWareki(fyr, 0);
	w_offset = gfncSeirekiToWareki(fyr, 1);

	//和暦
	document.write('<SELECT size="1" name="' + nmyy + 'w" onchange="' + "" + ev + '">');
	for(var i = 0;i <= 3; i++) {
		document.write('<OPTION VALUE="' + i + '"');
		if (nengo == i) document.write(' selected');
		document.write('>' + '明治大正昭和平成'.substr(i*2,2) + '</OPTION>');
	}
	document.write('</SELECT>');

	//コンボ出力
	document.write('<SELECT size="1" name="' + nmyy + '" onchange="' + "" + ev + '">');
	for(var i = 1;i <= 64; i++) {
		document.write('<OPTION VALUE="' + i + '"');
		if (i == fyr) document.write(' selected');
		if (i == w_offset) document.write(' selected');
		document.write('>' + i);
	}
	document.write('</SELECT>');

	document.write('<SELECT size="1" name="' + nmmh + '" onchange="' + "" + ev + '">');
	for(var i = 1;i <= 12; i++) {
		document.write('<OPTION VALUE="' + i + '"');
		if (i == mh) document.write(' selected');
		document.write('>' + i);
	}
	document.write('</SELECT>');

	document.write('<SELECT size="1" name="' + nmdy + '" onchange="' + "" + ev + '">');
	for(var i = 1;i <= 31; i++)  {
		document.write('<OPTION VALUE="' + i + '"');
		if (i == dt) document.write(' selected');
		document.write('>' + i);
	}
	document.write('</SELECT>');

	var strTemp = ("000" + fyr).slice(-4,7) + ("0" + mh).slice(-2,3) + ("0" + dt).slice(-2,3);
	document.write('<INPUT type="hidden" name="' + nm + '" value="' + strTemp + '">');
}

/* 
西暦を和暦に変換します。

戻り値:年号(0..明治 1..大正 2..昭和 3..平成)、または和暦年
ARG1 ... 西暦年
ARG2 ... フラグ 0..年号を返す 0以外..和暦年を返す
ARG3 ... 和暦年

備考 ... 主に内部で使用されますが、単体で使用することも可能です
*/
function gfncSeirekiToWareki(syear, flg) {
	var str;

	if( syear < 1912 ) {
		wyear = syear - 1867;
		nengo = 0;
		str = "明治";
	} else if( syear > 1911 && syear < 1926 ) {
		wyear = syear - 1911;
		nengo = 1;
		str = "大正";
	} else if( syear > 1925 && syear < 1989 ) {
		wyear = syear - 1925;
		nengo = 2;
		str = "昭和";
	} else if( syear > 1988 ) {
		wyear = syear - 1988;
		nengo = 3;
		str = "平成";
	}

	if( flg==0 ) {
		return nengo;
	} else {
		return wyear;
	}
}

/* 
和暦を西暦に変換します。

戻り値:変換された西暦年
ARG1 ... 年号(0..明治 1..大正 2..昭和 3..平成)
ARG2 ... 和暦年

備考 ... 主に内部で使用されますが、単体で使用することも可能です
*/
function gfncWarekiToSeireki(nengo, wyear) {
	var syear;

	if( nengo == 0 ) {
		syear = wyear * 1 + 1867;
	} else if( nengo == 1 ) {
		syear = wyear * 1 + 1911;
	} else if( nengo == 2 ) {
		syear = wyear * 1 + 1925;
	} else if( nengo == 3 ) {
		syear = wyear * 1 + 1988;
	} else {
		syear = 0;
	}
	return syear;
}

/*
カレンダーを別窓で表示します。
内部で使用するため直接ユーザーにアクセスされる関数ではありません。
そのため、引き数の詳細は非公開です。（コードを読めばすぐに分かりますが．．．）
*/
var objCal;

function gfncCal(nm, nmyy, nmmh, nmdy, fyr, mh, dt) {
	var head = '<html><head>\n'
	  + '<title>日付選択</title>\n'
	  + '<SCRIPT language="JavaScript">\n'
	  + 'function fncSetDate(yyyy,mm,dd) {\n'
	  + '	window.close();\n'
	  + '	opener.f.' + nmyy  + '.selectedIndex = yyyy-1970;\n'
	  + '	opener.f.' + nmmh  + '.selectedIndex = mm-1;\n'
	  + '	opener.f.' + nmdy  + '.selectedIndex = dd-1;\n'
	  + '	opener.f.' +  nm   + '.value = ("000" + yyyy).slice(-4,7) + ("0" + mm).slice(-2,3) + ("0" + dd).slice(-2,3);\n'
	  + '}\n'
	  + '</SCRIPT>\n'
	  + '</head><body>\n';
	var foot = '</body></html>';

	win = window.open('', 'calWin','width=220,height=280,resizable=yes,alwaysRaised=yes');
	objCal = new Cal('objCal', 'opener', win);
	objCal.setHead(head);
	objCal.setFoot(foot);
	objCal.disp(fyr, mh, dt);
}
