﻿var isIE = (navigator.appName.indexOf("Microsoft") > -1);
var dateSelect;
var selectedTime;
var selectedDate;
var selectedMonth;
var selectedYear;


function genSchedule(id)
{
	var table = d.getElementById(id);
	var monthArray = new Array('一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月');
	var lastMonth = monthArray.length - 1;
	var today = new Date();
	var todayDate = today.getDate();
	var todayDay = today.getDay();
	var todayMonth = today.getMonth();
	var todayYear = today.getFullYear();
	var thisMonth;
	var thisYear;
	var eventArray = new Array();
	var eventMonthArray = new Array();
	var curIndex = 0;
	var self = this;
	
	
	this.init = function()
	{
		var xml = new loadXML('xml/calendar.xml?version='+Math.random());
		xml.action = function(x)
		{
			var xml = x.responseXML;
			
			//Get Today Time
			/*var today = xml.getElementsByTagName('today');
			todayDate = today[0].attributes.getNamedItem('day').value.toString();
			todayMonth = Number(today[0].attributes.getNamedItem('month').value.toString()) - 1;
			todayYear = today[0].attributes.getNamedItem('year').value.toString();
			today = new Date(todayYear, todayMonth, todayDate);
			todayDay = today.getDay();*/
			//alert(todayDay + '  :  ' + todayDate + '  :  ' + todayMonth + '  :  ' + todayYear);
			
			var date = xml.getElementsByTagName('date');
			for (var i=0; i<date.length; i++)
			{	
				eventArray[i] = new Object();
				eventArray[i] = getChildNodes(date[i].childNodes);
				
				eventArray[i].startDate = Number(date[i].attributes.getNamedItem('startDate').value.toString());
				eventArray[i].endDate = Number(date[i].attributes.getNamedItem('endDate').value.toString());
				eventArray[i].month = Number(date[i].attributes.getNamedItem('month').value.toString()) - 1;
				eventArray[i].year = date[i].attributes.getNamedItem('year').value.toString();
			}
			
			self.genCalendar(today);
		}
	}
	
	this.genCalendar = function(thisDate)
	{
		if (!thisDate)	thisDate = today;
		var date = thisDate.getDate();
		var day = thisDate.getDay();
		var month = thisDate.getMonth();
		var year = thisDate.getFullYear();
		
		if (month == todayMonth && year == todayYear)
		{
			date = todayDate;
			day = todayDay;
		}
		
		//Gen Left Details
		this.genDateDetails(date, day, month, year);
		
		// Find out when this month starts and ends.
		var thisMonthDate = new Date(year, month, 1);
		var nextMonthDate = new Date((month == lastMonth)?(year+1):year, (month == lastMonth)?0:(month+1), 1);
		var startDay = thisMonthDate.getDay();
		var endDay = Math.round((nextMonthDate.getTime() - thisMonthDate.getTime()) / (1000*60*60*24));
		
		
		var col = 7;
		var totalCell = 6*col;
		var num = 1;
		var str;
		
		//Remove Rows
		while (table.rows.length > 1)	table.deleteRow((table.rows.length-1));
		eventMonthArray = new Array();
		
		for (var i=0; i<totalCell; i++)
		{
			if (i%col == 0)	var row = table.insertRow(-1);
			var cell = row.insertCell(-1);
			
			if (i >= startDay && i < (endDay + startDay))
			{	
				//Check Events Date
				for (var j=0; j<eventArray.length; j++)
				{
					if (!(eventArray[j].month == month && eventArray[j].year == year))	continue;
					if (!(num >= eventArray[j].startDate && num <= eventArray[j].endDate))	continue;
					if (!eventArray[j].name)	continue;
					
					//Highlight Events
					//str = '<div id="day_'+num+'" class="eventDetails">'+eventArray[j].name+'</div><a href="'+eventArray[j].link+'" target="'+eventArray[j].target+'">'+num+'</a>';
					
					cell.className = 'highlight';
					cell.startDate = eventArray[j].startDate;
					cell.endDate = eventArray[j].endDate;
					cell.onclick = function()	{self.showEventDetails(this.num);};
					
					if (num == eventArray[j].startDate)
					{
						eventMonthArray.push(eventArray[j]);
						str = eventMonthArray.length - 1;
					}
					cell.num = str;
					
					break;
				}
				
				if (i%col == 0)	cell.className += ' sunday';
				
				//Highlight Today
				if (date == num && month == todayMonth && year == todayYear)
				{
					cell.className += ' today';
				}
				
				cell.innerHTML = num;
				//cell.id = 'date_' + num;
				
				num ++;
			}
			else
			{
				cell.innerHTML = "&nbsp;";
			}
		}
		
		this.setEventDetails();
	}
	
	this.genDateDetails = function(date, day, month, year)
	{
		var monthDiv = d.getElementById('monthDiv');
		var monthPrev = d.getElementById('monthPrev');
		var monthNext = d.getElementById('monthNext');
		monthPrev.onclick = function()	{self.changeMonth(-1);};
		monthNext.onclick = function()	{self.changeMonth(1);};
		monthDiv.innerHTML = monthArray[month];
		
		var yearDiv = d.getElementById('yearDiv');
		var yearPrev = d.getElementById('yearPrev');
		var yearNext = d.getElementById('yearNext');
		yearPrev.onclick = function()	{self.changeYear(-1);};
		yearNext.onclick = function()	{self.changeYear(1);};
		yearDiv.innerHTML = year;
		
		thisMonth = month;
		thisYear = year;
	}
	
	this.setEventDetails = function()
	{
		var calNews = d.getElementById('calNews');
		var h4 = calNews.getElementsByTagName('h4')[0];
		var p = calNews.getElementsByTagName('p')[0];
		var scrollTop = d.getElementById('scrollTop');
		var scrollBtm = d.getElementById('scrollBtm');
		
		if (eventMonthArray.length == 0)
		{
			h4.innerHTML = '&nbsp;';
			p.innerHTML = '&nbsp;';
			calNews.style.display = 'none';
			return;
		}
		else if (eventMonthArray.length == 1)
		{
			scrollTop.style.display = 'none';
			scrollBtm.style.display = 'none';
		}
		else
		{
			scrollTop.style.display = '';
			scrollBtm.style.display = '';
		}
		calNews.style.display = '';
		
		scrollBtm.onclick = function()
		{
			curIndex ++;
			if (curIndex >= eventMonthArray.length)	curIndex = 0;
			self.showEventDetails(curIndex);
		};
		
		scrollTop.onclick = function()
		{
			curIndex --;
			if (curIndex < 0)	curIndex = eventMonthArray.length - 1;
			self.showEventDetails(curIndex);
		};
		
		var id = 0;
		for (var i=0; i<eventMonthArray.length; i++)
		{
			id = i;
			if (eventMonthArray[i].startDate > todayDate)	break;
		}
		this.showEventDetails(id);
	}
	
	this.showEventDetails = function(id)
	{
		var calNews = d.getElementById('calNews');
		var h4 = calNews.getElementsByTagName('h4')[0];
		var p = calNews.getElementsByTagName('p')[0];
		
		var str = addZero(eventMonthArray[id].startDate) + '/' + addZero(eventMonthArray[id].month+1) + '/' + eventMonthArray[id].year;
		if (eventMonthArray[id].startDate != eventMonthArray[id].endDate)	str += ' - ' + addZero(eventMonthArray[id].endDate) + '/' + addZero(eventMonthArray[id].month+1) + '/' + eventMonthArray[id].year;
		
		h4.innerHTML = str;
		p.innerHTML = '<a href="' + eventMonthArray[id].link + '" target="' + eventMonthArray[id].target + '">' + eventMonthArray[id].name + '</a>';
		
		curIndex = id;
	}

	this.changeMonth = function(index)
	{
		thisMonth += index;
		
		if (thisMonth > lastMonth)
		{
			thisMonth = 0;
			thisYear += 1;
		}
		else if (thisMonth < 0)
		{
			thisMonth = lastMonth;
			thisYear -= 1;
		}
		
		this.genCalendar(new Date(thisYear, thisMonth, 1));
	}

	this.changeYear = function(index)
	{
		thisYear += index;
		
		this.genCalendar(new Date(thisYear, thisMonth, 1));
	}
	
	this.init();
}
	
function loadXML(url)
{
	var x;
	var self = this;
	
	this.action = function()	{};

	if (window.XMLHttpRequest) // Mozilla, Safari,...
	{
		x = new XMLHttpRequest();
		if (x.overrideMimeType)	x.overrideMimeType('text/xml');
	}
	else if (window.ActiveXObject) // IE
	{
		try
		{
			x = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				x = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)	{}
		}
	}
	
	if (x)
	{
		x.onreadystatechange = function()
		{
			if (x.readyState == 4 && x.status == 200)
			{
				self.action(x);
			}
		}
		x.open('GET', url, true);
		x.send(null);
	}
}

function getChildNodes(xml)
{
	var obj = new Object();
	
	for (var i=0; i<xml.length; i++)
	{
		if (!isIE)	if (xml[i].toString() == '[object Text]')	continue;
		var name = xml[i].nodeName.toString();
		var value = (xml[i].firstChild)	?	xml[i].firstChild.data.toString()	:	'';
		obj[name] = value;
	}
	
	return obj;
}

function getAttributes(xml)
{
	var obj = new Object();
	
	for (var i=0; i<xml.attributes.length; i++)
	{
		obj[xml.attributes[i].name.toString()] = xml.attributes[i].value.toString();
	}
	
	return obj;
}

function addZero(num)
{
	if (num < 10)	num = '0' + num;
	return	num;
}