/*
Author:			Abhishek Verma
Date:			10th January 2006
Lisence:		GPL

TODO:
	. Highlight the current date
	. Highlight the selected dates for the current month
	. Previous/Next month to start working, either use submit to URL or just javascript call.
*/

// Define global variables
var month = new Array (	"January",
						"February",
						"March",
						"April",
						"May",
						"June",
						"July",
						"August",
						"September",
						"October",
						"November",
						"December"
						) ;

var daysInMonth = new Array	(	31, // January
								28, // February
								31, // March
								30, // April
								31, // May
								30, // June
								31, // July
								31, // August
								30, // September
								31, // October
								30, // November
								31	// December
							) ;
							
var weekDays = new Array	(	"S",
								"M",
								"T",
								"W",
								"T",
								"F",
								"S"
							) ;
							
var MAX_ROWS = 5 ; // 6 Rows from 0 - 5
var MAX_COLS = 6 ; // 7 Cols from 0 - 6						
var today = new Date() ;
var rendering = new Array(MAX_ROWS) ;

// making rendering a double-dimension array
for (i=0; i<=MAX_ROWS; i++) {
	rendering[i] = new Array(MAX_COLS) ;
}

function getDayOfMonth(date) {
	var days = daysInMonth[date.getMonth()] ;
	// Check if this is a leap year
	if (date.getMonth()==1) {
		var year = date.getFullYear();
		if (year % 4 == 0 && ( year % 100 !=0 || year % 400 ==0)) {
			days = 29 ;
		}
	}
    return days;
}

/*
Initialize the calendar
*/
function setCalendar (date) {
	var MONTH_DAYS = getDayOfMonth(date);
	var countRows = 0 ;
	
	for (var i = 1; i <= MONTH_DAYS; i++) {
		var tempDate = new Date (date.getFullYear(), date.getMonth(), i) ;
		
		if (tempDate.getDay() == 6) {
			rendering [countRows][tempDate.getDay()] = i ;
			countRows++ ;
		} else {
			rendering [countRows][tempDate.getDay()] = i ;
		}
	} // end of for loop
} // end of method setCalendar

/*
Display the calendar
*/
function renderCalendar (date) {
	setCalendar (date) ; 
	var htmlString = "";
	
	htmlString += "<table class='calendarContainer'>" ;
	
	// Get header if set true
	if (displayHead) {
		htmlString += getHeader(date) ;
	}
	
	htmlString += "<tr><td>" ;
	htmlString += "<table class='calendar'>" ;
	
	htmlString += "<tr>";
	for (var a=0; a<weekDays.length; a++) {
		htmlString += "<th>"+weekDays[a]+"</th>" ;
	}
	
	htmlString += "</tr>";
	
	// Generate HTML with the date.
	for (var x=0; x<=MAX_ROWS; x++) {
		htmlString += "<tr>\n" ;
		for (var y=0; y<=MAX_COLS; y++) {
			var data = rendering[x][y] ;
			var currentDate = new Date (date.getFullYear(), date.getMonth(), data) ;
			var style = "" ;
			
			if (data == null) {
				data = "&nbsp;" ;
				var urlData = relativeURL+"#" ;
			} else if (highlightToday && isToday(currentDate)) { // only if its today and want to highlight it.
				style = "class='today'" ;
				var urlData = relativeURL
								+"&y="+currentDate.getFullYear()
								+"&m="+currentDate.getMonth()
								+"&d="+currentDate.getDate() ;
			} else if (isSpecialDate(currentDate.getMonth(), data) && highlightSelected) { // only if special and want to highlight it.
				style = "class='blogEntry'" ;
				var urlData = relativeURL
								+"&y="+currentDate.getFullYear()
								+"&m="+currentDate.getMonth()
								+"&d="+currentDate.getDate() ;
			} else {
				var urlData = relativeURL
								+"&y="+currentDate.getFullYear()
								+"&m="+currentDate.getMonth()
								+"&d="+currentDate.getDate() ;
			}
			
			htmlString += "<td "+style+"><a href='"+urlData+"'>" + data + "</a></td>";
		}
		htmlString += "</tr>" ;
		
		if (x == 4) {
		if (rendering[5][0] == null) {
			break ;
		}
		}
	}
	htmlString += "</table>" ;
	
	htmlString += "</td></tr>" ;
	htmlString += "</table>" ;

	return htmlString ;
}

/*
Get the header data
*/
function getHeader (date) {
	var htmlString = "";
	
	htmlString += "<tr><td><center><table><tr>" ;
	htmlString += "<td class='previousNext'>"+getForwardDate(date, false)+"</td>" ;
	htmlString += "<td class='yearMonth'>"+month[date.getMonth()]+" "+date.getFullYear()+"</td>" ;
	htmlString += "<td class='previousNext'>"+getForwardDate(date, true)+"</td>" ;
	htmlString += "</tr></table></center></td></tr>" ;
	
	return htmlString ;
}

/*
Get next date
*/
function getForwardDate (date, action) {
	var htmlString = "" ;
	var dt = date.getDate();

	date.setDate(1);	
	if (action==false) {
		var month = date.getMonth()-1 ;
		if (previousImage==null) {
			var text = "Previous" ;
		} else {
			var text = "<img src='"+previousImage+"' border='0'>" ;
		}
	} else {
		var month = date.getMonth()+1 ;
		if (nextImage==null) {
			var text = "Next" ;
		} else {
			var text = "<img src='"+nextImage+"' border='0'>" ;
		}
	}

	// rollback previous date	
	var newDate = new Date (date.getFullYear(), month, date.getDate()) ;
	date.setDate(dt);	
	
	htmlString += "<a href='"+relativeURL+"&y="+newDate.getFullYear()
					+"&m="+newDate.getMonth()+"&d=-1'>"+text+"</a>" ;
	
	return htmlString ;
}

/*
Find if the date is special date.
*/
function isSpecialDate (month, date) {
	for (var i=0; i<specialDates.length; i++) {
		var specialData = specialDates[i].split("-") ;
		var specialMonth = specialData[0] ;
		var specialDate = specialData[1] ;
		if (specialMonth == month && specialDate == date) {
			return true ;
		}
		
	}
	
	return false ;
}


/*
Return true if the date supplied is today's date.
*/
function isToday (date) {
	if (date.getFullYear() == today.getFullYear() 
			&& date.getMonth() == today.getMonth() 
			&& date.getDate() == today.getDate()) {
		return true ;
	}
	return false ;
}

/*
Just a normal call function from body tag.
*/
function showCalendar() {
	//document.getElementById("calendar").innerHTML = renderCalendar(today) ;
	document.write (renderCalendar(today)) ;
}

/*
Get relative URL.
*/
function getRelativeURL (calendarURL) {
	var queryString = window.location.search.substring(1) ;
	var pairedData = queryString.split("&") ;
	var returnData = window.location.pathname.substring(1)+"?" ;
	if (calendarURL != null) {
		returnData = calendarURL;
	}
	
	for (var i=0; i<pairedData.length; i++) {
		var keyValue = pairedData[i].split("=") ;
		
		if (keyValue[0]=="y") {
			;
		} else if (keyValue[0]=="m") {
			;
		} else if (keyValue[0]=="d") {
			;
		} else if (keyValue[0]=="rs") {
			;
		} else if (keyValue[0]=="rc") {
			;
		} else if (keyValue[0]=="catId") {
			;
		} else if (keyValue[0]=="type" && keyValue[1]=="category") {
			;
		} else if (keyValue[0]=="type") {
			// include type only when url doesn't contain type
			if (returnData.indexOf("type") == -1) {
				returnData += keyValue[0]+"="+keyValue[1]+"&" ;
			}
		} else {
			if (keyValue[0] != "" && keyValue[1] != "") {
				returnData += keyValue[0]+"="+keyValue[1]+"&" ;
			}
		}
	}
	return returnData ;
}
