/**
 * Calendar drawing
 *
 * @author: Quoc Duong (duongdq@gmail.com)
 * @company: Vietintelligences Jsc. (http://vietintelligences.com)
 * @created: 2008-10-13
 * @last-modified: 2008-10-14
 */

Cal.holidays_url = "";
Cal.components_url = "";

Cal.holidays = [];
Cal.ics_options = [];
Cal.waiting = false;
Cal.loaded = false;

/**
 * Draw month navigator calendar
 *
 * @params	int		month input
 * @params	int		year input
 * @return		string	html output month navigator
 */
Cal.monthCalHtmlNavi = function(month, year)
{
	if (typeof(month) == 'undefined') {
		month = Cal.date("m");
	}
	if (typeof(year) == 'undefined') {
		year = Cal.date("Y");
	}

	var prev_month = Cal.prevMonth(month, year);
	var next_month = Cal.nextMonth(month, year);

	var prev_year = Cal.prevYear(month, year);
	var next_year = Cal.nextYear(month, year);
	
	var dt_now = new Date(Cal.date("Y"), Cal.date("m")-1, 1);
	var dt_prev = new Date(prev_year, prev_month-1, 1);

	var html = "";
	
	html += "\n<div id=\"calMonth\" class=\"clearfix\">";
	html += "\n	<h2>"+year+"年<span>"+month+"</span></h2>";
	html += "\n	<table width=\"100\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"right\">";
	html += "\n		<tr>";
	html += "\n			<td class=\"calPre\" width=\"50\">";
	if (dt_prev.getTime() >= dt_now.getTime()) {
		html += "\n				<a href=\"javascript:Cal.displayMonthCal("+prev_month+","+prev_year+");\">"+prev_year+"年<span>"+prev_month+"</span></a>";
	} else {
		html += "\n				<img src=\"/img/spacer.gif\">";
	}
	html += "\n			</td>";
	html += "\n			<td class=\"calNext\" width=\"50\">";
	html += "\n				<a href=\"javascript:Cal.displayMonthCal("+next_month+","+next_year+");\">"+next_year+"年<span>"+next_month+"</span></a>";
	html += "\n			</td>";
	html += "\n		</tr>";
	html += "\n	</table>";
	html += "\n</div>";

	return html;
}

/**
 * Draw month calendar
 *
 * @params	array		holidays input
 * @params	int		month input
 * @params	int		year input
 * @params	bool	display only days of month or all
 *						false - only days of month
 *						true (default) - all days in matrix
 * @return		string	html month calendar
 */
Cal.monthCalHtml = function(holidays, month, year, bl_day)
{
	if (typeof(holidays) == 'undefined') {
		holidays = [];
	}
	if (typeof(month) == 'undefined') {
		month = Cal.date("m");
	}
	if (typeof(year) == 'undefined') {
		year = Cal.date("Y");
	}
	if (typeof(bl_day) == 'undefined') {
		bl_day = true;
	}
	
	var prev_month = Cal.prevMonth(month, year);
	var next_month = Cal.nextMonth(month, year);
	
	var prev_year = Cal.prevYear(month, year);
	var next_year = Cal.nextYear(month, year);
	
	var month_days = Cal.getMonthCal(month, year);

	var html = "";
	html += "\n<div id=\"calTable\">";
	html += "\n	<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
	html += "\n		<tr>";
	html += "\n			<th class=\"calSun\">日</th>";
	html += "\n			<th>月</th>";
	html += "\n			<th>火</th>";
	html += "\n			<th>水</th>";
	html += "\n			<th>木</th>";
	html += "\n			<th>金</th>";
	html += "\n			<th class=\"calSat\">土</th>";
	html += "\n		</tr>";

	for (var week = 0; week < month_days.length; week++) {
		var week_days = month_days[week];

		html += "\n		<tr>";
		for (var i = 0; i < week_days.length; i++) {
			var day = week_days[i];
			var text = day;
			var td_class = "";
			var id = year + "" + ((month < 10) ? ("0" + month) : month) + "" + ((day < 10) ? ("0" + day) : day);
			if (i == 0) {
				td_class = "calSun";
			}
			if (i == 6) {
				td_class = "calSat";
			}
			if (week == 0 && day > 7) {
				if (!bl_day) {
					text = "&nbsp;";
				}
				id = prev_year + "" + ((prev_month < 10) ? ("0" + prev_month) : prev_month) + "" + ((day < 10) ? ("0" + day) : day);
				td_class = (td_class == "") ? "calBl" : (td_class + " calBl");
			} else if(week == month_days.length-1 && day < 7) {
				if (!bl_day) {
					text = "&nbsp;";
				}
				id = next_year + "" + ((next_month < 10) ? ("0" + next_month) : next_month) + "" + ((day < 10) ? ("0" + day) : day);
				td_class = (td_class == "") ? "calBl" : (td_class + " calBl");
			} else if(typeof(holidays[id]) == 'object') {
				td_class = (td_class == "") ? "calSun" : (td_class + " calSun");
			}
			
			html += "\n			<td" + ((id != "") ? (" id=\"" + id + "\"") : "") + " valign=\"top\""+((td_class == "") ? "" : (" class=\"" + td_class + "\""))+">";
			html += "\n				<div class=\"calDay\">"+text+"</div>";
			html += "\n			</td>";
		}
		html += "\n		</tr>";
	}

	html += "\n	</table>";
	
	html = Cal.monthCalHtmlNavi(month, year) + html;

	return html;
}

Cal.putComponentIntoMonthCal = function(components) 
{
	if (!Cal.waiting) {				
		for (var dtstr in components) {
			if (typeof(dtstr) == 'string') {								
				if (dtstr.match(/^(19\d\d|20\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])/)) {
					var dtCel = $(dtstr);
					if (dtCel !== null) {
						var html = new Array();
						var dtComponents = components[dtstr];
						for (var i = 0; i < dtComponents.length; i++) {
							var component = dtComponents[i];
							var category = component.getXCategories();
							if (typeof(category['X-STYLE']) != 'undefined') {
								//html.push("<li class=\""+category['X-STYLE']+"\"><a href=\"javascript:void(0)\">"+component.getHtmlValue("SUMMARY")+"</a></li>");
								html.push("<li class=\""+category['X-STYLE']+"\">"+component.getHtmlValue("SUMMARY")+"</li>");
							} else {
								//html.push("<a href=\"javascript:void(0)\">"+component.getHtmlValue("SUMMARY")+"</a>");
								//html.push(component.getHtmlValue("SUMMARY"));
								html.push(component.getHtmlValue("SUMMARY")+"<br />");
							}
						}
						if (html.length > 0) {
							dtCel.innerHTML += "<div class=\"calEvent\"><ul>" + html.join("") + "</ul></div>";
						}
					}
					
				}
			}
		}
	}
}

/**
 * display month calendar
 *
 * @params	int		month input
 * @params	int		year input
 */
Cal.displayMonthCal = function(month, year) {

	// check waiting
	if (!Cal.waiting) {
		
		// set waiting
		Cal.waiting = true;
		
		if (typeof(month) == 'undefined') {
			month = Cal.getMonthDefault();
		}
		if (typeof(year) == 'undefined') {
			year = Cal.getYearDefault();
		}

		// load holidays
		var holidays = [];
		if (Cal.holidays.length > 0) {
			holidays = Cal.selectComponentsByMonth(Cal.holidays, month, year);
		}

		// draw html month calendar
		$("monthCal").innerHTML = Cal.monthCalHtml(holidays, month, year);
		
		// set calendar has been loaded
		Cal.loaded = true;
		
		// check to doesn't show events on past times.		
		var dt_now = new Date(Cal.date("Y"), Cal.date("m")-1, 1);
		var dt_cur = new Date(year, month-1, 1);

		if (dt_cur.getTime() >= dt_now.getTime() && Cal.components_url != "") {
			
			// load month components
			Cal.retrieveComponents(Cal.components_url, function(components){
		
				// reset waiting
				Cal.waiting = false;

				// update event if there are some events
				if (components.length > 0) {
					var events = Cal.selectComponentsByMonth(components, month, year, true, true);
					
					if (events.length > 0) {
						Cal.putComponentIntoMonthCal(events);
					}
				}
			});
		} else {
			// reset waiting
			Cal.waiting = false;
		}
	}
}

/**
 * get month default that was given by query string (from "?" to end on url location)
 * ex ?month=10&y=1985 // return 10
 *
 * @return		int	month, default is current month now
 */
Cal.getMonthDefault = function()
{
	var query_str = window.location.search;
	var match = query_str.match(/(?:\?|\&)month\=(0[1-9]|1[012]|[1-9])(?:\&|$)/);
	if (match != null) {
		if (match[1].substr(0,1) == "0") {
			match[1] = match[1].substr(1);
		}
		var month = parseInt(match[1]);
		if (month >= 1 && month <=12) {
			return month;
		}
	}
	//return Cal.date("m");
	//return parseInt(Cal.date("m"));
	// Add on 20090807
	// Octal is base 8, so only the digits 0-7 are valid. Hence,"08" and "09" are not valid octal numbers and the function returns zero
	// To avoid this, add the 10 (decimal - base 10) to second argument
	return parseInt(Cal.date("m"), 10);
}

/**
 * get year default that was given by query string (from "?" to end on url location)
 * ex ?month=10&y=1985 // return 1985
 *
 * @return		int	year, default is current year now
 */
Cal.getYearDefault = function()
{
	var query_str = window.location.search;
	var match = query_str.match(/(?:\?|\&)year\=(19|20[\d]{2})(?:\&|$)/);

	if (match != null) {
		var year = parseInt(match[1]);
		if (year > 1582 && year <= 9999) {
			return year;
		}
	}
	return Cal.date("Y");
}

