/* author	: eric thul
 * date		: 2006.05.08
 * title	: display.js
 * version	: 1.0
 *
 * includes methods for displaying the xml
 * of the webcalendar and loads the data
 * via xmlhttprequest
 *
 * note that this file calls functions from
 * minical.js
 */

/* --------------------------------------------------------
 * BEGIN - general functions
 * -------------------------------------------------------- */
function tw_genonclick(xml,eid,target,vtarget,view,yearmon,day,back)
{
	var html = '';
	var year = yearmon.year;
	var month = yearmon.month;
	var day = day;
	html += 'tw_init('
		+xml+',\''+eid+'\',\''+target+'\',\''+vtarget+'\',\''
		+view+'\','+year+','+month+','+day+',\''+(back?back:'')+'\''
	+')';
	return html;
}

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

function d_general_abbrmon_rev(mon)
{
	var months = {
		'Jan':0,'Feb':1,'Mar':2,'Apr':3,
		'May':4,'Jun':5,'Jul':6,'Aug':7,
		'Sep':8,'Oct':9,'Nov':10,'Dec':11
	}
	return months[mon];
}

function d_general_weeknames(day)
{
	var days = [
		'Sunday','Monday','Tuesday','Wednesday',
		'Thursday','Friday','Saturday'
	];
	return days[day];
}

function d_general_sortmil(a,b)
{
	if (parseInt(a.sortby) < parseInt(b.sortby))
		return -1;
	else if (parseInt(a.sortby) > parseInt(b.sortby))
		return 1;
	else
		return 0;
}

function d_general_fdate(date)
{
	var day = date.day
	var month = d_general_monname(date.month);
	var year = date.year;
	if (day < 10)
		day = '0'+day;
	return day+'-'+month.substring(0,3)+'-'+year;
}

function d_general_parsedate(datestr)
{
	var re = /(\d{1,2})\-([a-zA-Z]+)\-(\d\d\d\d)/;
	var date = re.exec(datestr);
	if (date && date.length == 4)
		return new Date(date[3],d_general_abbrmon_rev(date[2]),date[1]);
}

function d_general_indatespan(cal,date)
{
	var date_begin = d_general_parsedate(cal.datebegin);
	var date_end = d_general_parsedate(cal.dateend);
	var date_today = d_general_parsedate(date);
	if (date_begin <= date_today && date_today <= date_end)
	{
		if (d_general_validrepeat(cal.repeat,date_begin.getDay(),date_today))
			return 1;
	}
	return 0;
}

function d_general_validrepeat(repeat,weeklyday,date)
{
	if (repeat == 'Daily')
	{
		return 1;
	}
	else if (repeat == 'Mon.-Fri.')
	{
		if (date.getDay() > 0 && date.getDay() < 6)
			return 1;
	}
	else if (repeat == 'Weekly')
	{
		if (date.getDay() == weeklyday)
			return 1;
	}
	return 0;
}

/* from: http://www.irt.org/script/1142.htm */
function d_general_daysadd(date,days)
{
    return new Date(date.getTime()+days*24*60*60*1000);
}

function d_general_mil(hour,min,ampm)
{
	var milhour = '';
	if (hour == 12 && ampm.toUpperCase() == "AM")
		milhour = 0;
	//else if (hour != 12 && ampm.toUpperCase() == "PM")
	//	milhour = parseInt(hour)+12;
	else if (hour != 12 && ampm.toUpperCase() == "PM")
	{
		//pareInt returns 0 for 08 and 09 because of octals 
		if(hour.charAt(0) == '0')
			hour = hour.substring(1, hour.length);
		
		milhour = parseInt(hour)+12;
	}
	else
		milhour = hour;
	return ''+milhour+min;	
}

function d_general_xmltohash(xml,keylist)
{
	var xmltable = {};
	for (var i=0; i < keylist.length; i++)
	{
		var node = xml.getElementsByTagName(keylist[i]);
		if (node[0] && node[0].firstChild)
			xmltable[keylist[i]] = node[0].firstChild.nodeValue;
		else
			xmltable[keylist[i]] = '';
	}
	return xmltable;
}

function d_general_cdata(caldata,guid)
{
	var keys = new Array(
		'datebegin','dateend','timebegin','timeend',
		'contactname','contactphone','contactemail',
		'location','sponsor','repeat'
	);
	var xml = '';
	if (window.ActiveXObject)
	{
		xml = new ActiveXObject("Microsoft.XMLDOM") 
		xml.async="false"; 
		xml.loadXML(caldata); 
	}
	else
		xml = (new DOMParser()).parseFromString(caldata, "text/xml");
	var cdata = d_general_xmltohash(xml,keys);
	// set the id of the alert
	cdata.id = guid;
	// set the value to sort by
	var re = /(\d+):(\d+) (AM|PM)/i;
	var matches = re.exec(cdata.timebegin);
	if (matches && matches.length == 4)
		cdata.sorttime = d_general_mil(matches[1],matches[2],matches[3]);
	return cdata;
}

function d_general_parse_uri(uri)
{
	var uristr = uri+'';
	var uriar = uristr.split('?');
	var uriobj = {};
	if (uriar.length == 2)
	{
		var pairs = uriar[1].split('&');
		for (var i=0; i < pairs.length; i++)
		{
			var keyval = pairs[i].split('=');
			uriobj[keyval[0]] = keyval[1];
		}
	}
	return uriobj;
}

/* --------------------------------------------------------
 * END - general functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGIN - day parsing functions
 * -------------------------------------------------------- */

function d_day_getlink(date,img)
{
	var html = '';
	var ipath = 'https://jedi.tcnj.edu/webteam/webcal/img/';
	var onclick = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','day',
		{year:date.year,month:date.month},date.day
	);
	html = '<a href="#" onclick="'+onclick+'">'
		+ '<img src="'+ipath+img+'_day.gif" alt="'+img+'month"'
		+ ' width="16" height="16" align="absmiddle" />'
		+ '</a>';
	return html;
}
function d_portal_day_getlink(date,img)
{
	var html = '';
	var ipath = 'https://jedi.tcnj.edu/webteam/webcal/img/';
	var onclick = tw_genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','day',
		{year:date.year,month:date.month},date.day
	);
	html = '<a href="#" onclick="'+onclick+'">'
		+ '<img src="'+ipath+img+'_day.gif" alt="'+img+'month"'
		+ ' width="16" height="16" align="absmiddle" />'
		+ '</a>';
	return html;
}

function d_day_captionpn(year,month,day)
{
	var date = {year: '',month: '',day: ''};
	// get total days in month
	var totaldays = getmonthdays(year,month);
	if (day > totaldays) //next month
	{
		tmpdate = getpndate(year,month+1);
		date.year = tmpdate.year;
		date.month = tmpdate.month;
		date.day = 1;
	}
	else if (day < 1) //prev month
	{
		tmpdate = getpndate(year,month-1);
		date.year = tmpdate.year;
		date.month = tmpdate.month;
		date.day = getmonthdays(date.year,date.month);
	}
	else
	{
		date.year = year;
		date.month = month;
		date.day = day;
	}
	return date;
}


function d_day_caption(date,week)
{
	var odate = new Date(date.year,date.month,date.day);
	var html = '';
	var prev_link = d_day_getlink(
		d_day_captionpn(date.year,date.month,date.day-1),'previous'
	);	
	var next_link = d_day_getlink(
		d_day_captionpn(date.year,date.month,date.day+1),'next'
	);	
	html += d_general_weeknames(odate.getDay())+', '
		+d_general_monname(odate.getMonth())+' '+date.day;
	if (week)
		return '<caption>'+html+'</caption>';
	else
		return '<caption>'+prev_link+'&nbsp;'+html+'&nbsp;'+next_link+'</caption>';
}

function d_portal_day_caption(date,week)
{
	var odate = new Date(date.year,date.month,date.day);
	var html = '';
	var prev_link = d_portal_day_getlink(
		d_day_captionpn(date.year,date.month,date.day-1),'previous'
	);	
	var next_link = d_portal_day_getlink(
		d_day_captionpn(date.year,date.month,date.day+1),'next'
	);	
	html += d_general_weeknames(odate.getDay())+', '
		+d_general_monname(odate.getMonth())+' '+date.day;
	if (week)
		return '<h3>'+html+'</h3>';
	else
		return '<h3>'+prev_link+'&nbsp;'+html+'&nbsp;'+next_link+'</h3>';
}

function d_this_day_caption(date,week)
{
	var odate = new Date(date.year,date.month,date.day);
	var html = '';
	var prev_link = d_portal_day_getlink(
		d_day_captionpn(date.year,date.month,date.day-1),'previous'
	);	
	var next_link = d_portal_day_getlink(
		d_day_captionpn(date.year,date.month,date.day+1),'next'
	);	
	html += d_general_weeknames(odate.getDay())+', '
		+d_general_monname(odate.getMonth())+' '+date.day;
	if (week)
		return '<h2>'+html+'</h2>';
	else
		return '<h2>'+prev_link+'&nbsp;'+html+'&nbsp;'+next_link+'</h2>';
}

function d_day_head()
{
	var html = '';
	html += '<tr>'
		+ '<th width="70px" scope="col">Time</th>'
        + '<th scope="col">Title</th>'
        + '<th width="100px" scope="col">Location</th>'
        + '</tr>';
	return html;
}

function d_day_row(title,calendar_data,date,week,descr)
{
	var html = '';
	var onclick = genonclick(
		GLOBAL_WEBCALID,calendar_data.id,'calendar','view','event',
		{year:date.year,month:date.month},date.day,week ? 'week' : 'day'
	);
	html += '<tr>'
		+ '<td>'+calendar_data.timebegin+'</td>'
		+ '<td><a href="#" onclick="'+onclick+'">'+title+'</a><br /><p>'+descr+'</p></td>'
		+ '<td>'+calendar_data.location+'</td>';
	return html;
}

function d_portal_day_row(title,calendar_data,date,week,descr)
{
	var html = '';
	var onclick = tw_genonclick(
		GLOBAL_WEBCALID,calendar_data.id,'calendar','view','event',
		{year:date.year,month:date.month},date.day,week ? 'week' : 'day'
	);
	html += '<tr>'
		//+ '<td>'+calendar_data.timebegin+'</td>'
		+ '<p>'+calendar_data.timebegin+' - <a href="#" onclick="'+onclick+'">'+title+'</a></p>'
		//+ '<td width="20%">'+calendar_data.location+'</td>';
	return html;
}

/* --------------------------------------------------------
 * END - day parsing functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGIN - week parsing functions
 * -------------------------------------------------------- */

function d_week_pnlinks(date)
{
	var html = '';
	var prevmy = new Date(date.year,date.month,date.day-7);
	var nextmy = new Date(date.year,date.month,date.day+7);
	var ponclick = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','this_week',
		{year:yeartest(prevmy.getYear()),month:prevmy.getMonth()},
		prevmy.getDate()
	);
	var nonclick = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','this_week',
		{year:yeartest(nextmy.getYear()),month:nextmy.getMonth()},
		nextmy.getDate()
	);
	html += '<p><a href="#" onclick="'+ponclick+'">&laquo; '
		+'Previous Week</a> || ';
	html += '<a href="#" onclick="'+nonclick+'">'
		+' Next Week'
		+' &raquo;</a></p>';
	return html;
}

function d_this_week_pnlinks(date)
{
	var html = '';
	var prevmy = new Date(date.year,date.month,date.day-7);
	var nextmy = new Date(date.year,date.month,date.day+7);
	var ponclick = tw_genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','this_week',
		{year:yeartest(prevmy.getYear()),month:prevmy.getMonth()},
		prevmy.getDate()
	);
	var nonclick = tw_genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','this_week',
		{year:yeartest(nextmy.getYear()),month:nextmy.getMonth()},
		nextmy.getDate()
	);
	html += '<p><a href="#" onclick="'+ponclick+'">&laquo; '
		+'Previous Week</a> || ';
	html += '<a href="#" onclick="'+nonclick+'">'
		+' Next Week'
		+' &raquo;</a></p>';
	return html;
}
/* --------------------------------------------------------
 * END - week parsing functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGIN - event parsing functions
 * -------------------------------------------------------- */

function d_event_genhtml_cal(cal,date)
{
	var html = '';
	var re = /(\d+)\-([a-zA-Z]+)\-(\d\d\d\d)/;
	var odate = new Date(date.year,date.month,date.day);
	/* this is so that when an event spans multiple
	 * days, the date shown for the event will be
	 * today's date, not the start date of the
	 * event */
	var begindatestr = cal.datebegin != cal.dateend ? 
		odate.getDate()+'-'+
		d_general_monname(odate.getMonth()).substring(0,3)+'-'+
		yeartest(odate.getYear())
	 : cal.datebegin;
	var matches = re.exec(begindatestr);
	var endtimestr = cal.timeend != '12:01 AM' ?
		' from '+cal.timebegin+' to '+cal.timeend : ' at '+cal.timebegin;
	html += '<ul>';
	if (matches.length == 4)
	{
		html += '<li><strong>Date &amp; Time:</strong> '
			+ d_general_weeknames(odate.getDay())+', '+matches[2]+' '
			+ matches[1]+endtimestr+'</li>';
	}
	else
	{	
		/* this might need fixing, not sure when this code
		 * is reached. but the begindatestr might need
		 * to be used */
		html += '<li><strong>Date &amp; Time:</strong> '+cal.datebegin
			+ endtimestr+'</li>';
	}
	html += '<li><strong>Location:</strong> '+cal.location+'</li>';
	html += '<li><strong>Contact:</strong> <a href="mailto:'+cal.contactemail
		+'">'+cal.contactemail+'</a>'+(cal.contactphone?'; '+cal.contactphone:'')+'</li>';
	html += '<li><strong>Sponsor(s):</strong> '+cal.sponsor+'</li>';
	html += '</ul>';
	return html;
}

function d_event_genhtml_foot(date,back)
{
	var html = '';
	var view = '';
	var odate = '';
	var returndate = '';
	if (back == 'month')
	{
		view = 'month';
		odate = new Date(date.year,date.month,1);
		returndate = d_general_monname(odate.getMonth());
	}
	else if (back == 'week')
	{
		var tmpdate = {};
		var monthdays;
		view = 'week';
		odate = new Date(date.year,date.month,date.day);
		if (date.day-odate.getDay() < 1)
		{
			tmpdate = getpndate(yeartest(odate.getYear()),odate.getMonth()-1);
			monthdays = getmonthdays(yeartest(tmpdate.year),tmpdate.month);
			tmpdate.day = monthdays + (date.day-odate.getDay());
		}
		else
		{
			tmpdate.year = yeartest(odate.getYear());
			tmpdate.month = odate.getMonth();
			tmpdate.day = date.day - odate.getDay();
		}
		returndate = 'the Week of '
			+ d_general_monname(tmpdate.month)+' '+tmpdate.day;

		date.year = tmpdate.year;
		date.month = tmpdate.month;
		date.day = tmpdate.day;
	}
	else
	{
		view = 'day';
		odate = new Date(date.year,date.month,date.day);
		returndate = d_general_weeknames(odate.getDay())
			+ ', '+d_general_monname(odate.getMonth())+' '+date.day;
	}
	var onclick = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view',view,{year:date.year,month:date.month},date.day
	);
	html += '<p><a href="http://www.tcnj.edu/~it/web/rss/">'
		+ ' <img src="http://www.tcnj.edu/~it/web/webalerts/media/subscribe_rss.gif"'
		+ ' alt="xml icon" align="absmiddle" border="0" height="15" width="81" />'
		+ ' </a></p>';
	html += '<hr />';
	html += '<img src="https://jedi.tcnj.edu/webteam/webcal/img/previous_day.gif"'
		+ ' alt="previous" width="16" height="16" align="absmiddle" />'
		+ ' <a href="#" onclick="'+onclick+'">'
		+ ' <strong>Return to Events for '+returndate+'</strong></a>';
	return html;
}

function d_event_genhtml(title,descr,cal,date,guid,back)
{
	var html = '';
	html += '<h2>'+title+'</h2>';
	html += '<p>'+descr+'</p>'
	// specific event information
	html += d_event_genhtml_cal(cal,date,guid);
	// event footer
	//html += d_event_genhtml_foot(date,back);
	return html;
}

function d_this_event_genhtml(title,descr,cal,date,guid,back)
{
	var html = '';
	html += '<h3>'+title+'</h3>';
	html += '<p>'+descr+'</p>';
	// specific event information
	html += d_event_genhtml_cal(cal,date,guid);
	// event footer
	//html += d_event_genhtml_foot(date,back);
	return html;
}

/* --------------------------------------------------------
 * END - event parsing functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGIN - month parsing functions
 * -------------------------------------------------------- */

/* relies on minical.js */
function d_month_calcdays(date)
{
	var days = {current:'',previous:'',next:'',first:''};
	var cal = new Date(date.year,date.month,date.day);
	var monthdays = getmonthdays(yeartest(cal.getYear()),cal.getMonth());
	// day of week for next and previous month
	var nextdays = 6-new Date(yeartest(cal.getYear()),cal.getMonth(),monthdays).getDay();
	var prevdays = new Date(yeartest(cal.getYear()),cal.getMonth(),1).getDay();
	var monthprev = '';
	if (cal.getMonth() == 0)
		monthprev = getmonthdays(yeartest(cal.getYear())-1,11);
	else
		monthprev = getmonthdays(yeartest(cal.getYear()),cal.getMonth()-1);
	// fill the hash
	days.current = monthdays;
	days.previous = monthprev;
	days.next = nextdays;
	days.first = prevdays;
	return days;
}

function d_month_pevents_pn(date)
{
	// previous
	if (date.month < 0)
		return {year:date.year-1,month:11};
	else if (date.month > 11)
		return {year:date.year+1,month:0};
	else
		return {year:date.year,month:date.month};
}

function d_month_pevents_format(title,cal,date)
{
	var html = '';
	var onclick = genonclick(
		GLOBAL_WEBCALID,cal.id,'calendar','view','event',
		{year:date.year,month:date.month},'1','month'
	);
	html += '<p><a href="#" onclick="'+onclick+'">'+title+'</a></p>';
	return html;
}

function d_month_pevents_match(matches,date,cal,title,currar,prevar,nextar)
{
	// get month numbers and years
	var currmy = {year:date.year,month:date.month};
	var prevmy = d_month_pevents_pn(
		{year:date.year,month:date.month-1,day:date.day}
	);
	var nextmy = d_month_pevents_pn(
		{year:date.year,month:date.month+1,day:date.day}
	);
	var item_mon = matches[1];
	var item_year = matches[2];
	var item_day = '';
	if (matches[0].charAt(0) == '0')
		item_day = parseInt(matches[0].charAt(1));
	else
		item_day = parseInt(matches[0]);
	// cases for prev,curr,next months
	if (
		(item_mon == currmy.month && item_year == currmy.year)
	)
	{
		if (typeof(currar[item_day-1]) == "undefined")
			currar[item_day-1] = '';
		currar[item_day-1] += d_month_pevents_format(title,cal,date);	
	}
	else if (item_mon == prevmy.month && item_year == prevmy.year)
	{
		if (typeof(prevar[item_day-1]) == "undefined")
			prevar[item_day-1] = '';
		prevar[item_day-1] += d_month_pevents_format(title,cal,date);	
	}
	else if (item_day <= nextar.length 
		&& item_mon == nextmy.month 
		&& item_year == nextmy.year
	)
	{
		if (typeof(nextar[item_day-1]) == "undefined")
			nextar[item_day-1] = '';
		nextar[item_day-1] += d_month_pevents_format(title,cal,date);	
	}
}

function d_month_pevents(xml,date,currar,prevar,nextar)
{
	// query items from the xml
	var items = xml.getElementsByTagName('item');
	var re_xml = /^<\?xml version="1\.0"\?>/;
	var datebegin = '';
	var dateend = '';
	// filter events
	for (var i=0; i < items.length; i++)
	{
		var cdatanode = '';
		var weeklyday = '';
		var guid = 
		  items[i].getElementsByTagName('guid')[0].firstChild.nodeValue;
		var title = 
		  items[i].getElementsByTagName('title')[0].firstChild.nodeValue;
		var descr_node = items[i].getElementsByTagName('description');

		if (descr_node && descr_node.length)
		{
			cdatanode = 
			  descr_node[0].childNodes[descr_node[0].childNodes.length-1];
		}
			
		/* this would be idea, but of course IE
		 * does not support 'CDATASection' 
		 *   if (cdatanode instanceof CDATASection) */
		if (cdatanode && re_xml.test(cdatanode.nodeValue))
		{
			var calendar_data = d_general_cdata(
				cdatanode.nodeValue,guid
			);
			var count = 0;
			datebegin = d_general_parsedate(calendar_data.datebegin);
			dateend = d_general_parsedate(calendar_data.dateend);
			// store this for a weekly repeat
			weeklyday = datebegin.getDay();
			// an event can span more than one day
			// so add it to each day in the month view
			// where the day is in the span
			while (datebegin <= dateend && count < 60) 
			{
				// this count is here so that if say an
				// event spans a year, the while loop
				// wont loop for 365 days. it will stop
				// after 60, since we only see one month
				// and a little in the next/prev month
				// at a time
				count++;
				if (!d_general_validrepeat(
						calendar_data.repeat,weeklyday,datebegin
				))
				{
					datebegin = d_general_daysadd(datebegin,1);
					continue;
				}

				var eventdate = new Array(
					datebegin.getDate()+'',datebegin.getMonth(),
					yeartest(datebegin.getYear())
				);
				d_month_pevents_match(
					eventdate,date,calendar_data,title,
					currar,prevar,nextar
				);
				datebegin = d_general_daysadd(datebegin,1);
			}
		}
	}
}

function d_month_headlinks(date)
{
	var html = '';
	var prevmy = d_month_pevents_pn({year:date.year,month:date.month-1,day:date.day});
	var nextmy = d_month_pevents_pn({year:date.year,month:date.month+1,day:date.day});
	var ponclick = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','month',
		{year:prevmy.year,month:prevmy.month},date.day
	);
	var nonclick = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','month',
		{year:nextmy.year,month:nextmy.month},date.day
	);
	html += '<tr>';
	html += '<td width="150"><h3><a href="#" onclick="'+ponclick+'">&laquo; '
		+d_general_monname(prevmy.month)+' '+prevmy.year+'</a></h3></td>';
	html += '<th><h2>'+d_general_monname(date.month)+' '+date.year+'</h2></th>';
	html += '<td width="150"><h3 align="right"><a href="#" onclick="'+nonclick+'">'
		+d_general_monname(nextmy.month)+' '+nextmy.year
		+' &raquo;</a></h3></td>';
	html += '</tr>';
	return html;
}

function d_month_header()
{
	var html = '';
	var weeknames = [
		'Sunday','Monday','Tuesday','Wednesday',
		'Thursday','Friday','Saturday'
	];
	html += '<tr>';
	for (var i=0; i < weeknames.length; i++)
		html += '<th width="14%">'+weeknames[i]+'</th>';
	html += '</tr>';
	return html;
}

function d_month_days(date,curr,prev,next,first)
{
	var html = '';
	var pndate = '';
	var row = '';
	var events = '';
	var cal = new Date(date.year,date.month,date.day);
	// loop through the calendar days
	for (
		var i=0,j=0,k=0,c=first-1;
		i < (curr.length+first+next.length);
		i++
	)
	{
		var day = '';
		// finished filling a row
		if (i && i%7==0)
		{
			html += '<tr valign="top">'+row+'</tr>';
			row = '';
		}
		// cases for previous, current, and next month
		if (i < first)
		{
			pndate = getpndate(yeartest(cal.getYear()),cal.getMonth()-1);
			day = prev.length-c;
			events = prev[day-1] ? prev[day-1] : '';
			c--;
		}
		else if (i >= first && i < (curr.length+first))
		{
			pndate = getpndate(yeartest(cal.getYear()),cal.getMonth());
			day = j+1;
			events = curr[day-1] ? curr[day-1] : '';
			j++;
		}
		else
		{
			pndate = getpndate(yeartest(cal.getYear()),cal.getMonth()+1);
			day = k+1;
			events = next[day-1] ? next[day-1] : '';
			k++;
		}
		row += '<td><h3>'+day+events+'</h3></td>';
	}
	// add the last row
	html += '<tr valign="top">'+row+'</tr>';
	return html;
}

/* --------------------------------------------------------
 * END - month parsing functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGIN - view select parsing functions
 * -------------------------------------------------------- */

function d_selectview_day(date,monthoc)
{
	var html = '';
	var doweek = new Date(date.year,date.month,date.day).getDay();
	var odate = new Date(
		date.year,date.month,parseInt(date.day)-parseInt(doweek)
	);
	var weekoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','week',
		{year:yeartest(odate.getYear()),month:odate.getMonth()},odate.getDate()
	);
	html += '<strong>Day</strong> | <a href="#" onclick="'+weekoc+'">Week</a> | '
		+ '<a href="#" onclick="'+monthoc+'">Month</a>';
	return html;
}

function d_portal_selectview_daylink(date,todayoc)
{
	var html = '';
	/*var dayoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','day',
		{year:date.year,month:date.month},date.day
	);*/
	html += '<span style="float:right;text-align:right;"><a href="#" onclick="'+todayoc+'">Back</a></span>';
	return html;
}


function d_selectview_week(date,todayoc,monthoc)
{
	var html = '';
	/*var dayoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','day',
		{year:date.year,month:date.month},date.day
	);*/
	html += '<a href="#" onclick="'+todayoc+'">Day</a> | <strong>Week</strong> | '
		+ '<a href="#" onclick="'+monthoc+'">Month</a>';
	return html;
}

function d_selectview_month(today,todayoc)
{
	var html = '';
	var odate = new Date(
		yeartest(today.getYear()),today.getMonth(),
		parseInt(today.getDate())-parseInt(today.getDay())
	);
	var beginweekoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','week',
		{year:yeartest(odate.getYear()),month:odate.getMonth()},
		odate.getDate()
	);
	html += '<a href="#" onclick="'+todayoc+'">Day</a> | '
		+ '<a href="#" onclick="'+beginweekoc+'">Week</a> | '
		+ '<strong>Month</strong>';
	return html;
}

function d_selectview_event(today,todayoc,monthoc,date)
{
	var html = '';
	var beginweekoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','week',
		{year:yeartest(today.getYear()),month:today.getMonth()},
		parseInt(today.getDate())-parseInt(today.getDay())
	);
	/*
	var beginweekoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','week',
		{year:date.year,month:date.month},date.day
	);*/
	html += '<a href="#" onclick="'+todayoc+'">Day</a> | '
		+ '<a href="#" onclick="'+beginweekoc+'">Week</a> | '
		+ '<a href="#" onclick="'+monthoc+'">Month</a>';
	return html;
}

/* --------------------------------------------------------
 * END - view select parsing functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGINMAIN - main parsing functions
 * -------------------------------------------------------- */

function d_event_parse(xml,date,eid,back)
{
	// query items from the xml
	var items = xml.getElementsByTagName('item');
	var html = '';
	for (var i=0; i < items.length; i++)
	{
		guid = items[i].getElementsByTagName('guid')[0].firstChild.nodeValue;
		if (guid == eid)
		{
			var title = 
			  items[i].getElementsByTagName('title')[0].firstChild.nodeValue;
			var descr_node = items[i].getElementsByTagName('description');
			var descr = '';
			var cdata = '';

			if (descr_node && descr_node.length)
			{
				if (descr_node[0].childNodes.length == 2)
				{
					descr = descr_node[0].childNodes[0].nodeValue;
					cdata = descr_node[0].childNodes[1].nodeValue;
				}
				else
					cdata = descr_node[0].childNodes[0].nodeValue;
			}

			if (cdata)
			{
				calendar_data = d_general_cdata(cdata,guid);
				html = d_event_genhtml(title,descr,calendar_data,date,guid,back);
			}
		}
	}
	return html;
}
function d_portal_event_parse(xml,date,eid,back)
{
	// query items from the xml
	var today = new Date();
	var items = xml.getElementsByTagName('item');
	var html = '';
	var todayoc = tw_genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','day',
		{year:yeartest(today.getYear()),month:today.getMonth()},
		today.getDate()
	);

	html = d_portal_selectview_daylink(date, todayoc);
	for (var i=0; i < items.length; i++)
	{
		guid = items[i].getElementsByTagName('guid')[0].firstChild.nodeValue;
		if (guid == eid)
		{
			var title = 
			  items[i].getElementsByTagName('title')[0].firstChild.nodeValue;
			var descr_node = items[i].getElementsByTagName('description');
			var descr = '';
			var cdata = '';

			if (descr_node && descr_node.length)
			{
				if (descr_node[0].childNodes.length == 2)
				{
					descr = descr_node[0].childNodes[0].nodeValue;
					cdata = descr_node[0].childNodes[1].nodeValue;
				}
				else
					cdata = descr_node[0].childNodes[0].nodeValue;
			}

			if (cdata)
			{
				calendar_data = d_general_cdata(cdata,guid);
				html += d_event_genhtml(title,descr,calendar_data,date,guid,back);
			}
		}
	}
	return html;
}

function d_day_parse(xml,date,week)
{
	// query items from the xml
	var items = xml.getElementsByTagName('item');
	var datestr = d_general_fdate(date);
	var events = new Array();
	var html = "";
	// filter events
	for (var i=0,j=0; i < items.length; i++)
	{
		var xmltable = d_general_xmltohash(items[i],['guid','title']);
		var descr_node = items[i].getElementsByTagName('description');
		var descr = '';
		var cdata = '';

		if (descr_node && descr_node.length)
		{
			if (descr_node[0].childNodes.length == 2)
			{
				descr = descr_node[0].childNodes[0].nodeValue;
				cdata = descr_node[0].childNodes[1].nodeValue;
			}
			else
				cdata = descr_node[0].childNodes[0].nodeValue;
		}
			
		if (cdata)
		{
			var calendar_data = d_general_cdata(cdata,xmltable.guid);
			// display the event if the datestr is 
			// in the span of the event
			if (d_general_indatespan(calendar_data,datestr))
			{
				events[j++] = {
					
					html: d_day_row(xmltable.title,calendar_data,date,week, descr),
					sortby: calendar_data.sorttime
				};
			}
		}
	}
	// sort the array by the military time
	events.sort(d_general_sortmil);
	// generate html	
	html += '<table  border="0" cellspacing="0" cellpadding="0" '
		+'width="75%" class="matrix1">';
	html += d_day_caption(date,week);
	html += d_day_head();
	for (var i=0; i < events.length; i++)
		html += events[i].html;
	html += '</table>';
	return html;
}

function d_portal_day_parse(xml,date,week)
{
	// query items from the xml
	var items = xml.getElementsByTagName('item');
	var datestr = d_general_fdate(date);
	var events = new Array();
	var html = "";
	// filter events
	for (var i=0,j=0; i < items.length; i++)
	{
		var xmltable = d_general_xmltohash(items[i],['guid','title']);
		var descr_node = items[i].getElementsByTagName('description');
		var descr = '';
		var cdata = '';

		if (descr_node && descr_node.length)
		{
			if (descr_node[0].childNodes.length == 2)
			{
				descr = descr_node[0].childNodes[0].nodeValue;
				cdata = descr_node[0].childNodes[1].nodeValue;
			}
			else
				cdata = descr_node[0].childNodes[0].nodeValue;
		}
			
		if (cdata)
		{
			var calendar_data = d_general_cdata(cdata,xmltable.guid);
			// display the event if the datestr is 
			// in the span of the event
			if (d_general_indatespan(calendar_data,datestr))
			{
				events[j++] = {
					
					html: d_portal_day_row(xmltable.title,calendar_data,date,week, descr),
					sortby: calendar_data.sorttime
				};
			}
		}
	}
	// sort the array by the military time
	events.sort(d_general_sortmil);
	// generate html	
	//html += '<table  border="0" cellspacing="0" cellpadding="0" '
	//	+'width="75%" class="matrix1">';
	html += d_portal_day_caption(date,week);
	//html += d_day_head();
	for (var i=0; i < events.length; i++)
		html += events[i].html;
	//html += '</table>';
	html += '<p><a href="http://www.tcnj.edu/~science/calendar.html" target="_blank">Calendar</a></p>';
	return html;
}

function d_this_day_parse(xml,date,week)
{
	// query items from the xml
	var items = xml.getElementsByTagName('item');
	var datestr = d_general_fdate(date);
	var events = new Array();
	var html = "";
	// filter events
	for (var i=0,j=0; i < items.length; i++)
	{
		var xmltable = d_general_xmltohash(items[i],['guid','title']);
		var descr_node = items[i].getElementsByTagName('description');
		var descr = '';
		var cdata = '';

		if (descr_node && descr_node.length)
		{
			if (descr_node[0].childNodes.length == 2)
			{
				descr = descr_node[0].childNodes[0].nodeValue;
				cdata = descr_node[0].childNodes[1].nodeValue;
			}
			else
				cdata = descr_node[0].childNodes[0].nodeValue;
		}
			
		if (cdata)
		{
			var calendar_data = d_general_cdata(cdata,xmltable.guid);
			// display the event if the datestr is 
			// in the span of the event
			if (d_general_indatespan(calendar_data,datestr))
			{
				events[j++] = {
					
					html: d_this_event_genhtml(xmltable.title,descr,calendar_data,date,xmltable.guid,'week'),
			//		html: d_day_row(xmltable.title,calendar_data,date,week, descr),
					sortby: calendar_data.sorttime
				};
			}
		}
	}
	// sort the array by the military time
	events.sort(d_general_sortmil);
	// generate html	
	//html += '<table  border="0" cellspacing="0" cellpadding="0" '
		+'width="75%" class="matrix1">';
	html += d_this_day_caption(date,week);
	//html += d_day_head();
	for (var i=0; i < events.length; i++)
		html += events[i].html;
	//html += '</table>';
	html += '<p></p><p></p>';
	return html;
}

function d_week_parse(xml,date)
{
	var html = '';
	var monthdays = getmonthdays(date.year,date.month);
	// generate data for a week
	for (var i=date.day; i < date.day+7; i++)
	{
		var j = i;
		var pndate = {year:date.year,month:date.month};
		if (i > monthdays)
		{
			j -= monthdays;
			pndate = getpndate(date.year,date.month+1);
		}
		html += d_day_parse(xml,{year:pndate.year,month:pndate.month,day:j},1);
	}
	html += d_week_pnlinks(date);
	return html;
}

function d_this_week_parse(xml,date)
{
	var html = '';
	var monthdays = getmonthdays(date.year,date.month);
	// generate data for a week
	for (var i=date.day; i < date.day+7; i++)
	{
		var j = i;
		var pndate = {year:date.year,month:date.month};
		if (i > monthdays)
		{
			j -= monthdays;
			pndate = getpndate(date.year,date.month+1);
		}
		html += d_this_day_parse(xml,{year:pndate.year,month:pndate.month,day:j},1);
	}
	html += d_this_week_pnlinks(date);
	return html;
}

function d_month_parse(xml,date)
{
	var html = '';
	// create arrays to hold the items
	//  with len = days to display for
	//  that month
	var days = d_month_calcdays(date);
	var currar = new Array(days.current);
	var prevar = new Array(days.previous);
	var nextar = new Array(days.next);
	// iterate through the xml and
	//  fill each array	with events
	d_month_pevents(xml,date,currar,prevar,nextar);
	// generate the top head links
	html += '<table width="100%">';
	html += d_month_headlinks(date);
	html += '</table>';
	// generate calendar header
	html += '<table width="100%" border="0" cellspacing="0" '+
		'cellpadding="0" class="matrix1">';
	html += d_month_header(date);
	html += d_month_days(date,currar,prevar,nextar,days.first);
	html += '</table>';
	return html;
}

function d_selectview(view,date)
{
	var html = '';
	var today = new Date();
	var todayoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','day',
		{year:yeartest(today.getYear()),month:today.getMonth()},
		today.getDate()
	);
	var monthoc = genonclick(
		GLOBAL_WEBCALID,0,'calendar','view','month',
		{year:date.year,month:date.month},1
	);
	html += '<div style="margin: 0; padding: .5em; color: #a67a00; font-size: .9em;">';
	if (view != 'event')
		html += 'View: ';

	if (view == "day")
		html += d_selectview_day(date,monthoc);
	else if (view == "week")
		html += d_selectview_week(date,todayoc,monthoc);
	else if (view == "month")
		html += d_selectview_month(today,todayoc);
	//else if (view == "event")
	//	html += d_selectview_event(today,todayoc,monthoc,date);
	html += '</div>';
	return html;
}

/* --------------------------------------------------------
 * ENDMAIN - main parsing functions
 * -------------------------------------------------------- */

/* --------------------------------------------------------
 * BEGININIT - xmlreq init function
 * initializes the request and fetches the data from the xml
 * file gid.xml and inserts html within the tag with 
 * id="target"
 * -------------------------------------------------------- */

function tw_init(gid,eid,target,vtarget,view,year,mon,day,back)
{
	var req = new Request;
	var date = { year: year, month: mon, day: day };
	var hdl = {
		onComplete: function(xml,q) {
			var tag = document.getElementById(target);
			var viewtag = document.getElementById(vtarget);
			var html = "";
			if (view == "event")
				html += d_portal_event_parse(xml,date,eid,back);
			else if (view == "day")
				html += d_portal_day_parse(xml,date);
			else if (view == "portal_day")
				html += d_portal_day_parse(xml,date);
			else if (view == "week")
				html += d_week_parse(xml,date);
			else if (view == "month")
				html += d_month_parse(xml,date);
			else if (view == "this_week")
				html += d_this_week_parse(xml,date);
			else
				alert("!!!error on view="+view);

			//viewtag.innerHTML = d_selectview(view,date);
			tag.innerHTML = html;
		}
	};
	// load the mini cal
	//load_cal('minical',date.year,date.month,date.day,view);
	// load the xml document
	//if (GLOBAL_BEAST)
	req.init('http://www.tcnj.edu/~dadt/webalerts/rss/webcal/'+gid+'.xml');
	//else
	//	req.init('/webalerts/rss/'+gid+'.xml');
	req.loadXMLDoc(hdl,'?gid='+gid+'&rand='+Math.random());
}

/* --------------------------------------------------------
 * ENDINIT - xmlreq init function
 * -------------------------------------------------------- */
