
// public（実質）変数宣言
var objToday;
var objYear;
var objMonth;
var nowMonth;
var nextMonth;
var nowStartCount;
var nowDays;
var nowEndCount;
var arrHolyday;
var arrDateTags;
var nextYear;



// カレンダー生成実行関数
function createCalendar(targetXML, targetObject, createType, targetYear, targetMonth, flgLastBlankShow, flgUnitLastDay) {
	// 休日データ取得
	$.get(targetXML, function(data) {
		arrHolyday = new Array;
		$(data).find('Date').each(function(){arrHolyday.push($(this).text());});

		// カレンダー生成（１ヶ月分：対象を設定可）
		if (createType == 0) {
			objYear = targetYear;
			objMonth = targetMonth - 1;
			changeDateVar(flgLastBlankShow, flgUnitLastDay);
			createCalendarDate(flgLastBlankShow, flgUnitLastDay);
			targetObject.append(createCalendarTags());
		}

		// カレンダー生成（２ヶ月分）
		if (createType == 1) {
			setDateObject();
			for (var i=0; i<=1; i++) {
				objMonth += i;
				changeDateVar(flgLastBlankShow, flgUnitLastDay);
				createCalendarDate(flgLastBlankShow, flgUnitLastDay);
				targetObject.append(createCalendarTags());
			}
		}

		// カレンダー生成（１年分）
		if (createType == 2) {
			setDateObject();
			for (var i=0; i<=11; i++) {
				objMonth = i;
				changeDateVar(flgLastBlankShow, flgUnitLastDay);
				createCalendarDate(flgLastBlankShow, flgUnitLastDay);
				targetObject.append(createCalendarTags());
			}
		}
		
		// カレンダー生成（１年分：翌年分）
		if (createType == 3) {
			setDateObject();
			for (var i=0; i<=11; i++) {
				objYear = targetYear;
				objMonth = i;
				changeDateVar(flgLastBlankShow, flgUnitLastDay);
				createCalendarDate(flgLastBlankShow, flgUnitLastDay);
				targetObject.append(createCalendarTags());
			}
		}
	});
}



// 日付オブジェクトの設定
function setDateObject() {
	objToday = new Date();
	objYear = objToday.getYear();
	objMonth = objToday.getMonth();
	if (objYear < 1900) objYear += 1900;
}



// 年月の変更によって発生する値の変更関数
function changeDateVar(flgLastBlankShow, flgUnitLastDay) {
	nowMonth       = new Date(objYear, objMonth, 1);										// 今月
	nextMonth      = new Date(objYear, (objMonth + 1), 1);									// 翌月
	nowStartCount  = nowMonth.getDay();														// 今月の開始曜日（１週間のうちの何日目から開始かを取得）
	nowDays        = (nextMonth.getTime() - nowMonth.getTime()) / (24 * 60 * 60 * 1000);	// 今月の日数
	nowEndCount    = (7 - (nowStartCount  + nowDays) % 7) % 7;								// 今月の終了日から翌週までの日数

	// カレンダーを６週表示に保つための設定
	var dayCount = nowStartCount + nowDays + nowEndCount;
	if ((flgLastBlankShow == 1) && (dayCount <= 35)) nowEndCount += 7;

	var lastWeekday = nowStartCount + nowDays;
	var flgLastSunday = lastWeekday % 7;
	if ((flgLastBlankShow != 1) && (flgUnitLastDay == 1) && (flgLastSunday == 1)) nowEndCount -= 7;
}



// 最終的な日付の生成関数
function createCalendarDate(flgLastBlankShow, flgUnitLastDay) {
	var lastWeekday;
	var flgLastSunday;
	var flgUnit = 0;
	arrDateTags = new Array;

	if (flgUnitLastDay == 1) {
		// 日付をまとめる場合
		for (var i=1; i<=nowDays; i++) {
			// 日曜日かどうか判定
			lastWeekday = nowStartCount + nowDays;
			flgLastSunday = lastWeekday % 7;

			// まとめ対象日
			if ((flgLastSunday == 1) && (i == (nowDays - 7))) {
				if (($.inArray(objYear + "/" + (objMonth + 1) + "/" + i, arrHolyday) >= 0) && ($.inArray(objYear + "/" + (objMonth + 1) + "/" + (i + 7), arrHolyday) >= 0)) {
					arrDateTags.push('<li class="jc-holiday jc-unit">' + i + '/' + (i + 7) + '</li>');
					flgUnit = 1;
					nowDays -= 1;
					if (flgLastBlankShow == 1) nowEndCount += 1;
				} else if (($.inArray(objYear + "/" + (objMonth + 1) + "/" + i, arrHolyday) == -1) && ($.inArray(objYear + "/" + (objMonth + 1) + "/" + (i + 7), arrHolyday) == -1)) {
					arrDateTags.push('<li class="jc-unit">' + i + '/' + (i + 7) + '</li>');
					flgUnit = 1;
					nowDays -= 1;
					if (flgLastBlankShow == 1) nowEndCount += 1;
				} else {
					if ($.inArray(objYear + "/" + (objMonth + 1) + "/" + i, arrHolyday) >= 0) arrDateTags.push('<li class="jc-holiday">' + i + '</li>');
					else arrDateTags.push('<li>' + i + '</li>');
				}
			// まとめられ対象日
			} else if ((flgLastSunday == 1) && (i == nowDays) && (flgUnit == 0)) {
				if ($.inArray(objYear + "/" + (objMonth + 1) + "/" + i, arrHolyday) >= 0) arrDateTags.push('<li class="jc-holiday">' + i + '</li>');
				else arrDateTags.push('<li>' + i + '</li>');
				if (flgLastBlankShow == 0) nowEndCount += 7;
			// 普通の日
			} else {
				if ($.inArray(objYear + "/" + (objMonth + 1) + "/" + i, arrHolyday) >= 0) arrDateTags.push('<li class="jc-holiday">' + i + '</li>');
				else arrDateTags.push('<li>' + i + '</li>');
			}
		}
	} else {
		// 日付をまとめない場合
		for (var i=1; i<=nowDays; i++) {
			if ($.inArray(objYear + "/" + (objMonth + 1) + "/" + i, arrHolyday) >= 0) arrDateTags.push('<li class="jc-holiday">' + i + '</li>');
			else arrDateTags.push('<li>' + i + '</li>');
		}
	}
}



// カレンダータグ生成関数
function createCalendarTags() {
	var returnTags;
	var tagDay;

	// 生成
	returnTags = '<div id="jQuery-Calendar">';
	returnTags += '<p>' + objYear + '年' + (objMonth + 1) + '月</p>';
	returnTags += '<ul>';
	returnTags += '<li class="jc-head jc-sun">日</li>';
	returnTags += '<li class="jc-head">月</li>';
	returnTags += '<li class="jc-head">火</li>';
	returnTags += '<li class="jc-head">水</li>';
	returnTags += '<li class="jc-head">木</li>';
	returnTags += '<li class="jc-head">金</li>';
	returnTags += '<li class="jc-head jc-sat">土</li>';
	for (var i=1; i<=nowStartCount; i++) returnTags += '<li class="jc-none">･</li>';
	for (var i=0; i<=arrDateTags.length-1; i++) returnTags += arrDateTags[i];
	for (var i=1; i<=nowEndCount; i++) returnTags += '<li class="jc-none">･</li>';

	// リターン
	return returnTags;
}

