/* author	: eric thul
 * title	: minical
 * date		: 2006.05.08
 * version	: 1.0
 *
 * javascript mini calendar to
 * select the day/week/month
 */

// --------------------------------------

// ie returns 2006, mozilla returns 106
// from new Date().getYear()
function yeartest(year)
{
	if (navigator.appName == "Microsoft Internet Explorer")
		return year;
	else
		return year+1900;
}

function monthname(id)
{
	var months = [ 
		'January','February','March',
		'April','May','June',
		'July','August','September',
		'October','November','December'
	];
	return months[id];
}

function genonclick(xml,eid,target,vtarget,view,yearmon,day,back)
{
	var html = '';
	var year = yearmon.year;
	var month = yearmon.month;
	var day = day;
	html += 'init('
		+xml+',\''+eid+'\',\''+target+'\',\''+vtarget+'\',\''
		+view+'\','+year+','+month+','+day+',\''+(back?back:'')+'\''
	+')';
	return html;
}

function weekdayheads()
{
	var heads = ['S','M','T','W','T','F','S'];
	html = '';
	for (var i=0; i < heads.length; i++)
		html += '<td>'+heads[i]+'</td>';
	return '<tr>'+html+'</tr>';
}

function highlightrow(cal,view,pndate,day)
{
	var row = '';
	if (view == "day")
	{
		if (day == cal.getDate() 
			&& cal.getMonth() == pndate.month 
			&& yeartest(cal.getYear()) == pndate.year
		)
		{
			row = '<td style="background: #a67a00;">'
				+ '<a style="color:#fff;" href="#" onclick="'+onclick+'">'+day
				+ '</a></td>';
		}
		else
			row = '<td><a href="#" onclick="'+onclick+'">'+day+'</a></td>';
	}
	else if (view == "week")
	{
		var monthdays = getmonthdays(yeartest(cal.getYear()),cal.getMonth());
		var nextmy = getpndate(yeartest(cal.getYear()),cal.getMonth()+1);
		var daysnextmon = -1;
		// number of days from next month in week
		if (cal.getDate()+6 > monthdays && pndate.month > cal.getMonth())
			daysnextmon = monthdays-day;
		// highlight check
		if (
			( 
			  day >= cal.getDate()
			  && day <= cal.getDate()+6
			  && cal.getMonth() == pndate.month 
			  && yeartest(cal.getYear()) == pndate.year
			) ||
			(
			  day <= daysnextmon
			  && pndate.month == nextmy.month
			  && pndate.year == nextmy.year 
			)
		)
		{
			row = '<td style="background: #a67a00;">'
				+ '<a style="color:#fff;" href="#" onclick="'+onclick+'">'+day
				+ '</a></td>';
		}
		else
			row = '<td><a href="#" onclick="'+onclick+'">'+day+'</a></td>';
		}
	else
		row = '<td><a href="#" onclick="'+onclick+'">'+day+'</a></td>';
	return row;
}

function calendarcells(cal,monthdays,monthprev,prevdays,nextdays,view)
{
	var html = '';
	var row = '';
	for (var i=0,j=0,k=0,c=prevdays-1; i < (monthdays+prevdays+nextdays); i++)
	{
		// finished filling a row
		if (i && i%7==0)
		{
			html += '<tr>'+row+'</tr>';
			row = '';
		}
		// cases for previous, current, and next month
		if (i < prevdays)
		{
			pndate = getpndate(yeartest(cal.getYear()),cal.getMonth()-1);
			day = monthprev-c;
			c--;
		}
		else if (i >= prevdays && i < (monthdays+prevdays))
		{
			pndate = getpndate(yeartest(cal.getYear()),cal.getMonth());
			day = j+1;
			j++;
		}
		else
		{
			pndate = getpndate(yeartest(cal.getYear()),cal.getMonth()+1);
			day = k+1;
			k++;
		}
		onclick = genonclick(GLOBAL_WEBCALID,0,'calendar','view','day',pndate,day);
		row += highlightrow(cal,view,pndate,day);
	}
	// add the last row
	html += '<tr>'+row+'</tr>';
	return html;
}

// from:
//  http://www.irt.org/script/533.htm
function getmonthdays(year,month)
{
	return 32-(new Date(year,month,32)).getDate();
}

function getpndate(year,month)
{
	var date = { month: '', year: '' };
	if (month < 0)
	{
		date.month = 11;
		date.year = year-1;
	}
	else if (month > 11)
	{
		date.month = 0;
		date.year = year+1;
	}
	else
	{
		date.month = month;
		date.year = year;
	}
	return date;
}

function getmonthlink(date,img)
{
	var html = '';
	var ipath = 'https://jedi.tcnj.edu/webteam/webcal/img/';
	html = '<a href="#" onclick="load_cal('
		+ '\'minical\','+date.year+','+date.month+',1,1'
		+ ');">'
		+ '<div align="center"><strong>'
		+ '<img src="'+ipath+img+'_month.gif" alt="'+img+'month"'
		+ ' width="16" height="16" />'
		+ '</strong></div>'
		+ '</a>';
	return html;
}

function load_head(cal)
{
	var html = '';
	var month = cal.getMonth();
	var year = yeartest(cal.getYear());
	var link_prev = getmonthlink(getpndate(year,month-1),'previous');
	var link_next = getmonthlink(getpndate(year,month+1),'next');
	html += '<tr>';
	html += '<td>'+link_prev+'</td>';
	html += '<td colspan="5"><div align="center">'
		+ monthname(month)+' '+year
		+'</div></td>';
	html += '<td>'+link_next+'</td>';
	html += '</tr>';
	return html;
}

function load_days(cal,view)
{
	var html = '';
	var monthdays = getmonthdays(yeartest(cal.getYear()),cal.getMonth());
	var prevdays = new Date(yeartest(cal.getYear()),cal.getMonth(),1).getDay();
	var nextdays = 6-new Date(yeartest(cal.getYear()),cal.getMonth(),monthdays).getDay();
	var monthprev = '';
	if (cal.getMonth() == 0)
		monthprev = getmonthdays(yeartest(cal.getYear())-1,11);
	else
		monthprev = getmonthdays(yeartest(cal.getYear()),cal.getMonth()-1);
	// build cells for the calendar
	html += weekdayheads();
	html += calendarcells(cal,monthdays,monthprev,prevdays,nextdays,view);
	return html;
}

// --------------------------------------

function load_cal(target,year,month,day,view)
{
	var cal = '';
	var html = '';
	var tag = document.getElementById(target);
	// either load the cal for today
	// or a user-specified cal
	if (typeof(year) == "undefined" 
		|| typeof(month) == "undefined" 
		|| typeof(day) == "undefined"
	)
	{
		cal = new Date();
	}
	else
	{
		cal = new Date();
		cal.setFullYear(year,month,day);
	}
	// generate view based on date
	html += '<table border="0" cellpadding="0" cellspacing="0" class="calendar">';
	html += load_head(cal);
	html += load_days(cal,view);
	html += '</table>';
	tag.innerHTML = html;
}
