/*
 * カレンダー生成
 *
 */

function createCalender(id,c,y,m){
	
	//年の繰越
	y = m>=13?++y:y;
	m = m>=13?m-12:m;
	
	//カレンダーのid/classをセット
	var
		cldr		= '',
		idName		= id,
		className	= c,	
		month 		= m,
		year 		= y,
		day 		= new Date(),
		ed			= 0.242194 * (y - 1980) - Math.floor((y - 1980)/4),
		numdays		= [31,28,31,30,31,30,31,31,30,31,30,31],
		sunday,
		holiday,
		thisday,
		eigyo;
	
	if(m == day.getMonth()+1){
		thisday = day.getDate(); 	//今日の日付 - 背景色を変更するため
		day.setDate(1);       		//今月最初の日にセット
	}else{
		thisday = 0;
		day = new Date(y,m-1);
	}
		
	// うるう年
	if((year%4 == 0) && (year%100 != 0) || (year%400 == 0)) numdays[1] = 29;
	
	// 固定祝日・休日・営業の定義
	// 休みにしたい日を配列に加える
	holiday =
		[
		/*  1月 */ [1,2], 
		/*  2月 */ [11],
		/*  3月 */ [], 
		/*  4月 */ [29], 
		/*  5月 */ [3,4,5], 
		/*  6月 */ [], 
		/*  7月 */ [], 
		/*  8月 */ [], 
		/*  9月 */ [], 
		/* 10月 */ [], 
		/* 11月 */ [3,23], 
		/* 12月 */ [23,29,30,31]
	   ];
	// 営業にしたい日を配列に加える
	eigyo =
		[
		/*  1月 */ [], 
		/*  2月 */ [],
		/*  3月 */ [], 
		/*  4月 */ [25], 
		/*  5月 */ [2], 
		/*  6月 */ [], 
		/*  7月 */ [], 
		/*  8月 */ [], 
		/*  9月 */ [], 
		/* 10月 */ [], 
		/* 11月 */ [], 
		/* 12月 */ []
	   ];
		
	holiday = holiday[month-1]
	eigyo = eigyo[month-1]	
	
	// 変動制祝日の自動生成	
	// 必要のない場合はコメントアウト
	switch(month){
		case 1:
			//成人の日
			holiday.push(14-(day.getDay()+5)%7);
		break;
		case 3:
			//春分の日
			holiday.push(Math.floor(20.8431 + ed));
		break;
		case 7:
			//海の日
			holiday.push(21-(day.getDay()+5)%7);
		break;
		case 9:
			//敬老の日
			holiday.push(21-(day.getDay()+5)%7);
			//秋分の日
			holiday.push(Math.floor(23.2488 + ed));
		break;
		case 10:
			//体育の日
			holiday.push(14-(day.getDay()+5)%7);
		break;
	}
	
	// カレンダー本体
	cldr += "<table id='"+idName+"' class='"+className+"'>";
	cldr += "<tr><th colspan='7' class='title'>"+month+"月の営業日</td></tr>";
	cldr += "<tr><td class='sunday week'>日</td><td class='weekday week'>月</td><td class='weekday week'>火</td><td class='weekday week'>水</td><td class='weekday week'>木</td><td class='weekday week'>金</td><td class='saturday week'>土</td></tr>";
	
	// 日付の書き込み
	for(sunday = 1-day.getDay(); sunday <= 31; sunday +=7){
		cldr += "<tr>";
		for(i = sunday; i < sunday + 7; i++){
			if((i > 0) && (i <= numdays[month-1])){
				
				var dayclass;
				
				day.setDate(i);
				today = day.getDay();
				
				//今日の判定
				if(thisday == i) cldr += "<td class='thisday'>";    
				else cldr += "<td class='day'>";
				
				//土日の判定
				switch(today){
					case 0:dayclass = "sunday";break;
					case 6:dayclass = "saturday";break;
					default:dayclass = "normal";break;
				}
				
				//祝日の判定
				j = 0;
				while(holiday[j]){
					if((i==holiday[j])||(today == 1 && i-1==holiday[j])){
						dayclass = "holiday";
						j=holiday[j].length;
					}
					j++;
				}
				//営業日の判定
				j = 0;
				while(eigyo[j]){
					if(i==eigyo[j]){
						dayclass = "normal";
						j=eigyo[j].length;
					}
					j++;
				}
				
				cldr += "<span class='"+dayclass+"'>"+ i +"</span></td>";
				
			}else{
				//空セル
				cldr += "<td class='notthismonth'>&nbsp;</td>";
			}
		}
		cldr += "</tr>";
	}
	cldr += "</table>";
	return cldr;
}

//実行
//カレンダー書き出し createCalender(id,class,year,month)
var day = new Date();
var y = day.getFullYear(), m = day.getMonth() + 1;
//当月
document.write(createCalender('c1','calender',y,m));
//翌月
document.write(createCalender('c2','calender',y,++m)); 
//jQueryで挿入なら
//$("#cal").html(createCalender('c2','calender',y,++m));
