JavaScriptでカレンダー

ググればいくらでもサンプルは転がってるんだけど、なんとなく作ってみた。
ただ、document.writeでゴリゴリやってるのを結構見掛けるんで、折角なんでDOMで。
つっても、イヌでもわかるJavaScript講座月間カレンダーに挑戦ってのをDOMに焼き直しただけ…(汗

ソース

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>JavaScript Calendar</title>
<style type="text/css">
table#myCalendar {
	border-collapse: collapse;
	font: normal 0.6em Verdana;
}
table#myCalendar caption {
	text-align: center;
}
table#myCalendar td {
	width: 2.8em;
	line-height: 1.6em;
	text-align: center;
	border: solid 1px #a9a9a9;
}
table#myCalendar td.tod {
	color: #fff;
	background-color: #5279E7;
}
</style>
<script type="text/javascript">

function $e(argTagName) { return document.createElement(argTagName); }
function $t(argStr) { return document.createTextNode(argStr); }

function makeCalendar() {

	var wdText_E = [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ];
	var wdText_J = [ '日', '月', '火', '水', '木', '金', '土' ];
	var monthEnd = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

	var now = new Date();
	var thisYear  = now.getFullYear();
	var thisMonth = now.getMonth();
	var today     = now.getDate();
	now.setDate(1)
	var firstWD   = now.getDay();
	
	var cls = /*@cc_on!@*/false ? 'className': 'class';

	monthEnd[1] = (((thisYear % 4 == 0) && (thisYear % 100 != 0)) || (thisYear % 400 == 0)) ? 29: 28;

	var calRows = Math.ceil((monthEnd[thisMonth] + firstWD) / 7);
	var cells   = new Array(calRows * 7);
	for (var i = 0; i < monthEnd[thisMonth]; i++) {
		cells[i + firstWD] = i + 1;
	}

	var elmTR; var elmTD; var txt;
	
	var elmTable = $e('TABLE'); var elmCap = $e('CAPTION');
	var elmTbody = $e('TBODY');
	
	txt = $t('' + thisYear + '.' + (thisMonth + 1));
	elmCap.appendChild(txt);
	elmTable.appendChild(elmCap);
	
	elmTR = $e('TR');
	for (var i = 0; i < 7; i++) {
		elmTD = $e('TD'); txt = $t(wdText_E[i]);
		elmTD.appendChild(txt); elmTR.appendChild(elmTD);
	}
	elmTbody.appendChild(elmTR);

	for (var i = 0; i < cells.length; i++) {
		if (i % 7 == 0) elmTR = $e('TR');
		elmTD = $e('TD');
		if (cells[i]) {
			txt = $t(cells[i]); elmTD.appendChild(txt);
		}
		if (cells[i] == today) elmTD.setAttribute(cls, 'tod');
		elmTR.appendChild(elmTD);
		if (i % 7 == 6) elmTbody.appendChild(elmTR);
	}
	elmTable.appendChild(elmTbody);
	elmTable.setAttribute('id', 'myCalendar');
	document.getElementById('calbox').appendChild(elmTable);

}
</script>
</head>
<body onload="makeCalendar();">
<div id="calbox">
</div>
</body>
</html>

思った事

色んな人のソースを見るってのはやっぱりいいですね。
あーこういう風にやる方がスッキリしてていいな、こういうやり方もあるんだな
ってそれだけで勉強になる。
予め、先に週数分×7の配列作ってその中に日付を格納する…って方法、
自分では思いつかなかったし。

動かすと

こんな感じになります。