$(function(){
	
	$("select[name=backnumber]").change(function(){
		document.location.href = $("select[name=backnumber]").val();
	});
	
	/*--------------------------------------------------
	*月別アーカイブリストXML取得
	--------------------------------------------------*/
	var eventDir = "/event/";
	var today = new Date();
	var year = today.getFullYear();
	var month = today.getMonth()+1;
	var monthlyArchives = {};
	var monthlyData = [];
	var loadedData = {};
	
	$.ajax({
		type:"GET",
		url:eventDir+"monthly_archives.xml",
		dataType:"xml",
		success:onAjaxLoad,
		error:onAjaxError
	});
	
	function onAjaxLoad( data, dataType ) {
		$("Archive",data).each(function(){
			var y = $(this).attr("year");
			var m = $(this).attr("month");
			monthlyArchives[y+""+m] = eventDir+"xml/"+y+""+m+".xml";
		});
		loadMonth();
	}
	
	function onAjaxError( XMLHttpRequest, textStatus, errorThrown ) {
		alert(errorThrown);
	}
	
	/*--------------------------------------------------
	* 月のXML取得
	--------------------------------------------------*/
	
	function loadMonth() {
		monthlyData = [];
		checkMonth();
		var m = month;
		if ( m < 10 ) m = "0"+month;
		
		/* 年月表示 */
		$("div.event-calendar div.fl-l").empty().append('<a href="#" id="PrevMonth"><img src="/images/common/icon/icon05.gif" alt="前月へ" width="12" height="12" /></a><strong>'+year+'.'+m+'</strong><a href="#" id="NextMonth"><img src="/images/common/icon/icon01.gif" alt="次月へ" width="12" height="12" /></a>');
		
		if ( monthlyArchives[year+""+m] && !loadedData[year+""+month] ) {
			/* HTML書き換え */
			$("div.event-calendar table").remove();
			$("div.event-calendar").append('<table><tr><td>データをロードしています</td></tr></table>');
			
			/* 月の切り替えのリンクを無効にしておく */
			$("a#PrevMonth").click(function(){ return false; });
			$("a#NextMonth").click(function(){ return false; });
			
			/* XMLロード */
			$.ajax({
				type:"GET",
				url:monthlyArchives[year+""+m],
				dataType:"xml",
				success:onMonthLoad,
				error:onAjaxError
			});
		} else {
			if ( loadedData[year+""+month] ) monthlyData = loadedData[year+""+month];
			resetCalendar();
		}
	}
	
	function onMonthLoad( data, dataType ) {
		var i,l,e;
		monthlyData = [];
		$("Entry",data).each(function(){
			var link = $(this).attr("link");
			var title = $(this).attr("title");
			var start = $(this).attr("start");
			var end = $(this).attr("end");
			monthlyData.push({ link:link, title:title, start:start, end:end });
			
			/* 月別アーカイブが存在しいない月のデータ */
			var m = end.substring(0,6);
			if ( m && !monthlyArchives[m] ) {
				if ( !loadedData[m] ) loadedData[m] = [];
				l = loadedData[m].length;
				e = false;
				for ( i=0; i<l; i++ ) {
					if ( loadedData[m][i].link == link ) {
						e = true;//同じリンク先のデータが既に存在する
						break;
					}
				}
				//存在しない場合は追加
				if ( !e ) loadedData[m].push( { link:link, title:title, start:start, end:end } );
			}
			
		});
		
		loadedData[year+""+month] = monthlyData;
		//
		resetCalendar();
	}
	
	/*--------------------------------------------------
	* 年月の整合性チェック 
	--------------------------------------------------*/
	function checkMonth() {
		month = parseInt(month);
		year = parseInt(year);
		
		if ( month < 1 ) {
			month = 12;
			year--;
		} else if ( month > 12 ) {
			month = 1;
			year++;
		}
		month += 0;
	}
	
	/*--------------------------------------------------
	* カレンダー作成
	--------------------------------------------------*/
	function createCalendar() {
		checkMonth();
		/* カレンダーHTML生成 */
		var d = new Date();
		d.setDate(1);
		d.setYear(year);
		d.setMonth(month-1);
		var dMax = 31;
		if ( month == 4 || month == 6 || month == 9 || month == 11 ) {
			dMax = 30;
		} else if ( month == 2 ) {
			if ( isLeapYear(year) ) dMax = 29;
			else dMax = 28;
		}
		
		/* 今日の日付 */
		var isThisMonth = ( today.getMonth()+1 == month && today.getFullYear() == year );
		var thisDay = today.getDate();
		
		
		var dw = d.getDay();
		var cellClass = "";
		var cal = '<table cellpadding="0" cellspacing="0" border="1"><tr>';
		var i,j,l,s,events,rcl;
		for ( i=1; i<=dMax; i++ ) {
			//イベントデータの存在確認
			events = "";
			l = monthlyData.length;
			for ( j=0; j<l; j++ ) {
				s = year + ( month<10 ? "0" : "" ) + month + ( i<10 ? "0" : "" ) + i;
				if ( monthlyData[j].start <= s ) {
					if ( ( monthlyData[j].end && monthlyData[j].end >= s ) || ( !monthlyData[j].end && monthlyData[j].start == s ) ) {
						events = events + '<li><a href="'+monthlyData[j].link+'">'+monthlyData[j].title+'</a></li>';
					}
				}
			}

			//カレンダーの１日
			if ( dw > 6 ) dw = 0;
			if ( dw == 0 ) cellClass = "sunday";
			else if ( dw == 6 ) cellClass = "saturday";
			else cellClass = "";
			if ( isThisMonth && i == thisDay ) cellClass = cellClass + ( cellClass ? " " : "" ) + "today";
			if ( events ) {
				if ( i < 10 ) rcl = "l";
				else if ( i > 20 ) rcl = "r";
				else rcl = "c";
				events = '<div class="calendar-hoverset-'+rcl+' calendar-hoverset"><div class="calender-bg"><div class="calender-body"><ul>'+events+'</ul></div></div></div>';
				cellClass = cellClass + ( cellClass ? " " : "" ) + " eventday";
				cal = cal+'<td id="CalendarDay'+i+'" class="'+cellClass+'"><a href="#" class="day">'+i+'</a>'+events+'</td>';
			} else {
				cal = cal+'<td id="CalendarDay'+i+'" class="'+cellClass+'"><span>'+i+'</span></td>';
			}
			dw++;
		}
		cal = cal+'</table>';
		
		/* HTML書き換え */
		$("div.event-calendar p.loading").remove();
		$("div.event-calendar table").remove();
		$("div.event-calendar").append(cal);
	}
	
	/*--------------------------------------------------
	* カレンダーをリセット
	--------------------------------------------------*/
	function resetCalendar() {
		
		createCalendar();
		
		/*  */
		$("a#PrevMonth").click(function(){
			month--;
			loadMonth();
			return false;
		});
		$("a#NextMonth").click(function(){
			month++;
			loadMonth();
			return false;
		});
		
		/* イベントのある日の設定 */
		clearCalendarPopupTimer();
		$("td.eventday div.calendar-hoverset").mouseover(clearCalendarPopupTimer);
		$("td.eventday div.calendar-hoverset").mouseout(setCalendarPopupTimer);
		$("td.eventday div.calendar-hoverset a").mouseover(clearCalendarPopupTimer);
		$("td.eventday div.calendar-hoverset a").mouseout(setCalendarPopupTimer);
		
		$("td.eventday>a").mouseover(function(){
			clearCalendarPopupTimer();
			$("td.eventday div.calendar-hoverset").hide();
			$("td.eventday a.selected").removeClass("selected");
			$(this).siblings("div.calendar-hoverset").show();
			$(this).addClass("selected");
		})
		.mouseout(setCalendarPopupTimer)
		.click(function(){ return false; });
	}
	
	/*--------------------------------------------------
	* 閏年チェック
	--------------------------------------------------*/
	function isLeapYear(y) {
		return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
	}
	
	/*--------------------------------------------------
	* マウスイベント設定
	--------------------------------------------------*/
	var calendarPopupTimer;
	
	
	function clearCalendarPopupTimer() {
		if ( calendarPopupTimer ) clearTimeout(calendarPopupTimer);
		calendarPopupTimer = null;
	}
	
	function setCalendarPopupTimer() {
		clearCalendarPopupTimer();
		calendarPopupTimer = setTimeout(hideCalendarPopup,500);
	}
	
	function hideCalendarPopup() {
		$("td.eventday a.selected").removeClass("selected");
		$("td.eventday div.calendar-hoverset").hide();
	}
});

