//***************************************************************************
//
// □モジュール名
//  カレンダ関連JavaScriptファイル
//
// □更新情報
//	日付		更新者	更新情報
//	2001.06.20	熊谷	新規作成
//	2001.09.11	熊谷	closeCalender()追加
//	2006.01.26	熊谷	FireFoxで月の切り替えが出来ない問題Fix
//	2007.02.22	熊谷	年切替機能追加
//	2007.10.17	熊谷	テンプレートファイルをphpからHTMLに変更
//
// □備考
//	"<script type="text/javascript" src="<パス>calender.js"></script>"で使用
//
//***************************************************************************

// カレンダーウィンドウ変数
var cal_window;
var conf_cal_dialog_path = "../js/";

/**
 カレンダー生成
 文字列データ取得

@param	_obj	カレンダー結果格納場所
@param	_year	年(未指定時:今年)
@param	_month	月(未指定時:今月)
@param	_id		前/次月クリック時に表示するタグID

*/
function getCalender(_obj, _year, _month, _id){
	var strBuf;
	var today = new Date();

	if(!_year || _year <= 0 || _year === '' || isNaN(_year)){
		_year = today.getFullYear();
	}
	else
		_year = new Number(_year);

	if(_month==undefined || _month==='' || isNaN(_month)){
		_month = today.getMonth();
	}
	else
		_month = new Number(_month)-1;

	/* 年と月の調整 */
	if(_month < 0){
		_month = 12 + _month;
		_year--;
	}
	else if(_month > 11){
		_month = _month - 12;
		_year++;
	}

	var now_day = 1;		/*現在作画している日*/ 
	var tmpDay = new Date(_year,_month, now_day); /* 今月の初めの日時を取得*/ 
	var now_wday = tmpDay.getDay(); /*今月一日の曜日*/ 
	strBuf = '<table border=\"2\" class=\"CalenderJsTable\"><thead><tr>';
	strBuf += '<th class="Caption"><a title="去年" href="javascript:dispCalenderLayer(\''+_obj+'\','+(_year-1)+','+(_month+1)+',\''+_id+'\')">《</a><\/th>';
	strBuf += '<th class="Caption"><a title="先月" href="javascript:dispCalenderLayer(\''+_obj+'\','+_year+','+_month+',\''+_id+'\')">〈</a><\/th>';
	strBuf += '<th class="Caption" colspan ="3">'+_year+'年'+(_month+1)+'月<\/th>';
	strBuf += '<th class="Caption"><a title="翌月" href="javascript:dispCalenderLayer(\''+_obj+'\','+_year+','+(_month+2)+',\''+_id+'\')">〉</a><\/th>';
	strBuf += '<th class="Caption"><a title="来年" href="javascript:dispCalenderLayer(\''+_obj+'\','+(_year+1)+','+(_month+1)+',\''+_id+'\')">》</a><\/th>';
	strBuf += '<\/tr><tr>';

	var aWeek = new Array("日","月","火","水","木","金","土");
	for (var i in aWeek) {
		strBuf += '<td class="Week" width="15%">'+aWeek[i]+'<\/td>';
	}
	strBuf += '<\/tr><\/thead>\n';


	/* 日にちの作画スタート */
	strBuf += '<tbody>';
	if(0 < now_wday){
		strBuf += '<tr>';
		for(var i = 0; i < now_wday; i++){   /* 一日の曜日まで作画位置をずらす */ 
			strBuf += '<td class="DaySpace">　<\/td>';
		}
	}

	var aMaxMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	// 2月うるう年補正
	if((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0){
		aMaxMonth[1] = 29;
	}

	while(now_day <= aMaxMonth[_month]){  /* 年月日の有効性のチェック */ 
		if((now_wday % 7)==0){ /* 現在、土曜日なので改行 */ 
			strBuf += '<tr>';
		}

		var strNowDay = '<a href="javascript:setFormDate('+_year+','+(_month+1)+','+now_day+',\''+_obj+'\')">'+now_day+'</\a>';
		if((now_day == today.getDate())&&(_month == today.getMonth())&&(_year == today.getFullYear())){
			/*今日は黄色で作画する。*/ 
			strBuf += '<td class="Day Today">'+strNowDay+'<\/td>';
		}
		/* 日曜日の場合は赤で作画する*/
		else if(now_wday == 0){
			strBuf += '<td class="Day Sunday">'+strNowDay+'<\/td>';
		}
		/*土曜日は青で作画する。*/
		else if(now_wday == 6){ 
			strBuf += '<td class="Day Saturday">'+strNowDay+'<\/td>';
		}
		/* その他は黒 */
		else{
			strBuf += '<td class="Day">'+strNowDay+'<\/td>';
		}
		now_day++;
		now_wday++;
		if((now_wday % 7)==0){ /* 現在、土曜日なので改行 */ 
			now_wday = 0;
			strBuf += '<\/tr>\n';
		}
	}

	var strTmp = "";
	/* 日にちの作画の終了 */ 
	if(0 < now_wday){
		while(now_wday <= 6){ /* カレンダーが埋まるまで位置をずらす */ 
			strBuf += '<td class="DaySpace">　<\/td>';
			now_wday++;
		}
		strBuf += '<\/tr>';
	}
	strBuf += '<\/tbody>';
	strBuf += '<tfoot>';
	strBuf += '<tr align = center><td  colspan =\"7\"><a href="javascript:dispCalenderLayer(\''+_obj+'\','+today.getFullYear()+','+(today.getMonth()+1)+',\''+_id+'\')">今月<\/a><\/td><\/tr>';
	strBuf += '<\/tfoot>';
	strBuf += '<\/table>';

	/* テーブルの作画の終了 */ 
	return strBuf;
}


/**
 レイヤーにカレンダー表示

@param	_obj	カレンダー結果格納場所
@param	_year	年(未指定時:今年)
@param	_month	月(未指定時:今月)
@@param	_id		表示するタグID
*/
function dispCalenderLayer(_obj, _year, _month, _id){
	if(!_id)
		_id = "spanCal";

	var strTmp = getCalender(_obj, _year, _month, _id);

	// IE用
	if (document.all) {
		var p=document.all(_id);
		p.innerHTML=strTmp;
	}
	// FireFox/ネスケ6用
	else if(document.getElementById){
		var p=document.getElementById(_id);
		p.innerHTML=strTmp;
	}
	// ネスケ用
	else if (document.layers) {
		var p=document.layers[_id];
		p.document.open();
		p.document.write(_id);
		p.document.close();
	}
}

/**
* 指定のオブジェクトを検索する
*
* @param	n	オブジェクト名
* @param	d		ドキュメント(省略時はカレントドキュメント)
*
* @return	検索オブジェクト
*/
function MM_findObj_cal(n, d) { //v4.01
	var p,i,x;
	if(!d)
		d=document;
		
	if((p=n.indexOf("?"))>0&&parent.frames.length)
	{
		d=parent.frames[n.substring(p+1)].document;
		n=n.substring(0,p);
	}

	if(!(x=d[n])&&d.all)
		x=d.all[n];
		
	for (i=0;!x&&i<d.forms.length;i++)
		x=d.forms[i][n];

	for(i=0;!x&&d.layers&&i<d.layers.length;i++)
		x=MM_findObj_cal(n,d.layers[i].document);

	if(!x && d.getElementById)
		x=d.getElementById(n);

	return x;
}

//**************************
// フォームに日付設定
//**************************
function setFormDate(_year, _month, _day, _obj){
    var oDoc = window.opener.document;
    MM_findObj_cal(_obj+'_Y', oDoc).value = _year;
    MM_findObj_cal(_obj+'_M', oDoc).value = _month;
    MM_findObj_cal(_obj+'_D', oDoc).value = _day;
    window.close();
/*
	var i = 0;
    var oForm = window.opener.document.forms[0];

	// 入力項目設定
	// 年検索
	for(i = 0; oForm.elements[i].name != (_obj+'_Y') && i < oForm.length; i++);
	oForm.elements[i].value = _year;
	oForm.elements[2].value = oForm.elements[_day].name;

	// 月検索
	for(i = 0; oForm.elements[i].name != (_obj+'_M') && i < oForm.length; i++);
	oForm.elements[i].value = _month;

	// 日検索
	for(i = 0; oForm.elements[i].name != (_obj+'_D') && i < oForm.length; i++);
	oForm.elements[i].value = _day;
*/
}

//******************************************************
// 機能：整数値チェック
// Ｉ／Ｏ：入力テキスト（Ｉ）
// 戻り値：false:NG true:OK
//******************************************************
function checkNum(inpText) {
	var str = inpText;
	for(var i=0; i<str.length; i++) {
		if (str.charAt(i) < "0" || str.charAt(i) > "9") {
            return false;
		}
	}
	return true;
}

/**
* カレンダー表示
* 日付フォーム情報からカレンダ生成
*
* @param	_obj	カレンダーのフォーム名
*/
function openCalender(_obj){
	var i = 0;
	var year;
	var month;
    var strCal;
    var err_flg = false;
	errors = '入力に誤りがあります。\n';
	// 入力項目設定
	// 年検索

	year = MM_findObj_cal(_obj+'_Y').value;

	// 月検索
	month = MM_findObj_cal(_obj+'_M').value;

	if(year != ''){
		//==========================
		// 数値チェック
		//==========================
		ret = checkNum(year);
		if(!ret){
			errors+='- 年は整数値を入力してください.\n';
			err_flg = true;
		}
		else{
			//==========================
			// 年範囲チェック
			//==========================
			if(year < 1900 || 9999 < year){
				errors+='- 年は1900 ～ 9999の数字を入力してください.\n';
				err_flg = true;
			}
		}
	}

	if(month != ''){
		//==========================
		// 数値チェック
		//==========================
		ret = checkNum(month);
		if(!ret){
			errors+='- 月は整数値を入力してください.\n';
			err_flg = true;
		}
		else{
			//==========================
			// 月範囲チェック
			//==========================
			if(month < 1 || 12 < month){
				errors+='- 月は1から12の数字を入力してください.\n';
				err_flg = true;
			}
		}
	}
	if(err_flg){
		alert(errors);
		return false;
	}

	// 既にカレンダーを開いていれば、閉じる
//	closeCalender();

	cal_window=window.open(
		((conf_cal_dialog_path)?conf_cal_dialog_path:'./')+'calender.html?OBJ='+_obj+'&YEAR='+year+'&MONTH='+month,'CALENDER','width=170,height=200');
//	alert("window open");
/*
	// カレンダーウィンドウ確立
	cal_window.onload = function(){
		alert("window load");

		// カレンダー描画
		cal_window.dispCal(_obj, year, month);

		// 呼び出しウィンドウが閉じるとき
		cal_window.onunload = window.onunload;
		window.onunload = function(){
			// カレンダーも閉じる
			closeCalender();
			// 呼び出しウィンドウでonunload定義があるとき呼び出す
			if(typeof(cal_window.onunload) == 'function')
				cal_window.onunload();
			return true;
		}

		// フォーカス確定
		cal_window.focus();
	}
*/
	return cal_window;
}

/**
* カレンダーを閉じる
**/
function closeCalender(){
	if(cal_window){
		cal_window.close();
		cal_window = undefined;
	}
}

/**
* 日付フォームをコピー
*
* @param	_src_date	コピー元日付フォーム
* @param	_dst_date	コピー先日付フォーム
**/
function copyDate(_src_date, _dst_date) {
	var year	 = MM_findObj_cal(_src_date+'_Y').value;
	var month	 = MM_findObj_cal(_src_date+'_M').value;
	var day		 = MM_findObj_cal(_src_date+'_D').value;

	MM_findObj_cal(_dst_date+'_Y').value = year;
	MM_findObj_cal(_dst_date+'_M').value = month;
	MM_findObj_cal(_dst_date+'_D').value = day;
}

/**
* 日付フォームに本日を追加
*
* @param	_src_date	日付フォーム
**/
function setToday(_src_date) {
	var date = new Date();

	setCalNum(_src_date+'_Y', date.getFullYear());
	setCalNum(_src_date+'_M', date.getMonth()+1);
	setCalNum(_src_date+'_D', date.getDate());
}

/**
* 日付フォームに現在の日時を追加
*
* @param	_src_date	日付フォーム
**/
function setNowTimestamp(_src_date) {
	var date = new Date();

	setCalNum(_src_date+'_Y', date.getFullYear());
	setCalNum(_src_date+'_M', date.getMonth()+1);
	setCalNum(_src_date+'_D', date.getDate());
	setCalNum(_src_date+'_H', date.getHours());
	setCalNum(_src_date+'_MI', date.getMinutes());
	setCalNum(_src_date+'_S', date.getSeconds());
}

/**
* 日付フォームに現在の時間を追加
*
* @param	_src_date	日付フォーム
**/
function setNowTime(_src_date) {
	var date = new Date();

	setCalNum(_src_date+'_H', date.getHours());
	setCalNum(_src_date+'_MI', date.getMinutes());
	setCalNum(_src_date+'_S', date.getSeconds());
}

/**
 * 対象のフィールドに値を設定する
 */
function setCalNum( fieldName, value )
{
	sObj = MM_findObj_cal(fieldName);
	if( sObj != null )
		sObj.value = value;
}
/**
* 日付の内容を前日に変換
*
* @param	_src_date	日付フォーム
**/
function setPrevious(_src_date) {
	yObj = MM_findObj_cal(_src_date+'_Y');
	mObj = MM_findObj_cal(_src_date+'_M');
	dObj = MM_findObj_cal(_src_date+'_D');

	var date = new Date();
	if( yObj.value == '' )
		yObj.value = date.getFullYear();
	if( mObj.value == '' )
		mObj.value = date.getMonth()+1;
	if( dObj.value == '' )
		dObj.value = date.getDate();

	date = new Date(yObj.value, mObj.value - 1, dObj.value - 1);

	yObj.value = date.getFullYear();
	mObj.value = date.getMonth()+1;
	dObj.value = date.getDate();
}

/**
* 日付の内容を前日に変換
*
* @param	_src_date	日付フォーム
**/
function setYesterday(_src_date) {
	yObj = MM_findObj_cal(_src_date+'_Y');
	mObj = MM_findObj_cal(_src_date+'_M');
	dObj = MM_findObj_cal(_src_date+'_D');
	
	var date = new Date();
	if( yObj.value == '' )
		yObj.value = date.getFullYear();
	if( mObj.value == '' )
		mObj.value = date.getMonth()+1;
	if( dObj.value == '' )
		dObj.value = date.getDate();

	date = new Date(yObj.value, mObj.value - 1, (Number)(dObj.value) + 1);

	yObj.value = date.getFullYear();
	mObj.value = date.getMonth()+1;
	dObj.value = date.getDate();
}

/**
* 日付情報をクリアー
*
* @param	_src_date	日付フォーム
**/
function clearDate(_src_date) {
	yObj = MM_findObj_cal(_src_date+'_Y');
	mObj = MM_findObj_cal(_src_date+'_M');
	dObj = MM_findObj_cal(_src_date+'_D');

	yObj.value = "";
	mObj.value = "";
	dObj.value = "";
}

/**
* 時刻情報をクリアー
*
* @param	_src_date	日付フォーム
**/
function clearTime(_src_date) {
	hObj = MM_findObj_cal(_src_date+'_H');
	miObj = MM_findObj_cal(_src_date+'_MI');
	sObj = MM_findObj_cal(_src_date+'_S');

	var date = new Date(yObj.value, mObj.value - 1, sObj.value + 1);

	hObj.value = "";
	miObj.value = "";
	sObj.value = "";
}

/**
* 日付情報をクリアー
*
* @param	_src_date	日付フォーム
**/
function clearTimestamp(_src_date) {
	clearDate(_src_date);
	clearTime(_src_date);
}

