/*******************************************************************************

	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

*********************************************************************************/
// 変数の設定
var monthDay = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var weekHead = new Array('日','月','火','水','木','金','土');

var today=new Date();
var thisYear = today.getYear();
if (thisYear < 1900) { thisYear = thisYear + 1900; }
var thisMonth = today.getMonth();
var thisDay = today.getDate();

var cal_head = "bgcolor = '#fdffbf'";		//ヘッダの色
var cal_back = "bgcolor = '#ffffff'";		//背景の色
var cal_sun	 = "bgcolor = '#fdbdbf'";		//土曜日の色
var cal_sat	 = "bgcolor = '#afcef3'";		//日曜日の色
var cal_today= "bgcolor = '#558855'";		//本日の色

function Cal(name, own, obj) {
	this.name = name;
	this.own = own;
	this.obj = obj;
	this.crntYear = 0;
	this.crntMonth = 0;
	this.crntDay = 0;
	this.crntMonthDay = 0;
	this.crntStartDay = 0;
	this.head = '';
	this.foot = '';
	return(this);
}

Cal.prototype.disp = function (yyyy, mm, dd) {
	this.setCrnt(yyyy, mm, dd);
	this.writeCal();
}

Cal.prototype.dispPrev = function () {
	this.setCrntPrev();
	this.writeCal();
}

Cal.prototype.dispNext = function () {
	this.setCrntNext();
	this.writeCal();
}

Cal.prototype.writeCal = function () {
	var d = this.obj.document;
	var str;
	var i, w;
	var lnk;

	// HTMLヘッダの表示
	if (this.head) {
		d.open();
		d.writeln(this.head);
	}

	// カレンダタイトルの表示
	str = '';
	str += '<table border="0" cellpadding="5" cellspacing="1" ' + cal_back + '><tr>';
	str += '<th ' + cal_head + '>';
	str += '<a href="javascript:';
	str += this.own + '.' + this.name + '.dispPrev();">←</a>';
	str += '</th>';
	str += '<th colspan="5" ' + cal_head + '>';
	str += this.crntYear + '年' + (this.crntMonth + 1) + '月';
	str += '</th>';
	str += '<th ' + cal_head + '>';
	str += '<a href="javascript:';
	str += this.own + '.' + this.name + '.dispNext();">→</a>';
	str += '</th>';

	// 曜日タイトルの表示
	str += '</tr><tr>';
	str += '<th ' + cal_sun + '>' + weekHead[0] + '</th>';
	for (i=1; i<6; i++) {
		str += '<th ' + cal_back + '>' + weekHead[i] + '</th>';
	}
	str += '<th ' + cal_sat + '>' + weekHead[6] + '</th>';

	// カレンダの表示
	str += '</tr><tr>';

	// 月初の空白表示
	for (i = 0; i < this.startDay; i++) {
		str += '<td ' + cal_back + '>　</td>';
	}

	// 1ヶ月の表示
	for (i = 1, w = this.startDay; i <= this.crntMonthDay; i++, w++) {
		// 週単位の改行
		if (w > 6) {
			w = 0;
			str += '</tr></tr>';
		}

		//日付のリンク生成
		lnk = '<a href="javascript:fncSetDate(' + this.crntYear + ',' + (this.crntMonth + 1) + ',' + i + ')">' + i + '</a>';

		//選択されている日なら太字
		if ((this.crntMonth == thisMonth) && (this.crntYear == thisYear) && (i == this.crntDay)) lnk = '<b>' + lnk + '</b>';

		// 今日の色分け表示
		if ((i == thisDay)
				&& (this.crntMonth == thisMonth)
				&& (this.crntYear == thisYear)) {
			str += '<td ' + cal_today + '>' + lnk + '</td>\n';

		} else {
			// 曜日による色分け表示
			if (w == 0) {
				str += '<td ' + cal_sun + '>' + lnk + '</td>\n';
			} else if (w == 6) {
				str += '<td ' + cal_sat + '>' + lnk + '</td>\n';
			} else {
				str += '<td ' + cal_back + '>' + lnk + '</td>\n';
			}
		}
	}

	// 月末の空白表示
	for (; w < 7; w++) {
		str += '<td ' + cal_back + '>　</td>';
	}

	str += '</tr></table>';

	// カレンダの表示
	d.writeln(str);

	//閉じるボタンの表示
	//d.writeln('<br><center><input type="button" value="閉じる" onclick="window.close();"></center>');
	d.writeln('<br><div align="right"><a href="javascript:window.close();">閉じる</a></div>');

	// HTMLフッタの表示
	if (this.foot) {
		d.writeln(this.foot);
		d.close();
	}
}

Cal.prototype.setHead = function (str) {
	this.head = str;
}

Cal.prototype.setFoot = function (str) {
	this.foot = str;
}

Cal.prototype.setCrnt = function (yyyy, mm, dd) {
//alert(this.crntYear+'/'+(this.crntMonth+1) + ', ' + yyyy+'/'+mm);

	// 年変換（1901-2099）
	if ((typeof(yyyy) == 'undefined') || (yyyy < 1901) || (yyyy > 2099)) {
		this.crntYear = thisYear;
	} else {
		this.crntYear = yyyy;
	}

	// 月変換（0-11）
	if ((typeof(mm) == 'undefined') || (mm < 1) || (mm > 12)) {
		this.crntMonth = thisMonth;
	} else {
		this.crntMonth = mm - 1;
	}
	// うるう年変換（1901年から2099年まで対応）
	if ((this.crntMonth == 1) && (this.crntYear % 4 == 0)) {
		this.crntMonthDay = 29;
	} else {
		this.crntMonthDay = monthDay[this.crntMonth];
	}

	// 日変換（1-31:this.crntMonthDay）
	if ((typeof(dd) == 'undefined') || (dd < 1) || (dd > this.crntMonthDay)) {
		this.crntDay = thisDay;
	} else {
		this.crntDay = dd;
	}

	// 開始曜日の設定
	var d1 = new Date(this.crntYear + '/' + (this.crntMonth + 1) + '/01');
	this.startDay = d1.getDay();
}

Cal.prototype.setCrntPrev = function () {
	// 前月のカレンダ表示
	var yyyy = this.crntYear;
	var mm = this.crntMonth;
	var dd = this.crntDay;

	if (mm < 1) {
		yyyy--;
		mm = 12;
	}

	this.setCrnt(yyyy, mm, dd);
}

Cal.prototype.setCrntNext = function () {
	// 翌月のカレンダ表示
	var yyyy = this.crntYear;
	var mm = this.crntMonth + 2;
	var dd = this.crntDay;

	if (mm > 12) {
		yyyy++;
		mm = 1;
	}

	this.setCrnt(yyyy, mm, dd);
}