/*
* TASCalendar.js
* Copyright 2005 The Astrophysics Spectator
* Written by Dr. Jerome James Brainerd
*/

var calendar = new Object();
calendar.yearlist = new Object();
calendar.currentyear = 0;
calendar.currentmonth = 0;
calendar.earliestyear = 0;
calendar.earliestmonth = 0;
calendar.displayyear = 0;
calendar.displaymonth = 0;
calendar.directory = null;
calendar.maximumitems = 0;

calendar.fontsize = 10;
calendar.lineheight = 12;
calendar.paragraphmargin = 3;
calendar.headingfont = 12;
calendar.titlefont = 12;

calendar.displaybox;
calendar.title;
calendar.forward;
calendar.backward;
calendar.datestring;
calendar.itemlist;
calendar.index;
calendar.lastontop = false;

calendar.bottomtagbox = null;

calendar.monthlabel = [ "January", "February", "March", "April",
		"May", "June", "July", "August", "September", "October",
		"November", "December" ];

calendar.monthlist = new Object();

calendar.itemlist = new Array();

function Year()
{
	this.month = new Array( 12 );
	return;
}

function Month()
{
	this.day = new Array();
}

function getMonthLabel( month, year )
{
	return calendar.monthlabel[month] + " " + year;
}

function CalendarItem( year, month, day, title, url )
{
	this.year = year;
	this.month = month;
	this.day = day;
	this.title = title;
	this.url = url;
	return;
}

function getDateString( month, day )
{
	return calendar.monthlabel[month] + " " + day;
}

function calendarItemSort( first, second )
{
	if ( first.day == second.day )
		return 0;
	if ( first.day < second.day )
		return -1;
	return 1;
}

function orderCalendarItems( first, second )
{
	if ( first.year < second.year )
		return -1;
	if ( first.year > second.year )
		return 1;
	if ( first.month < second.month )
		return -1;
	if ( first.month > second.month )
		return 1;
	if ( first.day < second.day )
		return -1;
	if ( first.day > second.day )
		return 1;
	return 0;
}

function drawCalendar( calendarbox )
{
	calendar.backward = document.createElement( "button" );
	calendar.backward.setAttribute( "type", "button" );
	calendar.backward.style.width = "18pt";
	calendar.backward.tabIndex = taselement.calendarboxindex++;
	calendar.backward.appendChild( document.createTextNode( "<" ) );

	calendar.forward = document.createElement( "button" );
	calendar.forward.setAttribute( "type", "button" );
	calendar.forward.style.width = "18pt";
	calendar.forward.tabIndex = taselement.calendarboxindex++;
	calendar.forward.appendChild( document.createTextNode( ">" ) );

	if ( calendar.backward.addEventListener != null ) {
		calendar.backward.addEventListener(
				"click", changeMonthBackward, false );
		calendar.forward.addEventListener(
				"click", changeMonthForward, false );
	}
	else if ( calendar.backward.attachEvent ) {
		calendar.backward.attachEvent(
				"onclick", changeMonthBackward );
		calendar.forward.attachEvent(
				"onclick", changeMonthForward );
	}

	var buttontable = document.createElement( "table" );
//	buttontable.style.background = "navy";
//	buttontable.style.color = "white";
//	buttontable.style.width = "100%";
//	buttontable.style.border = "solid";
//	buttontable.style.borderWidth = "1px";
//	buttontable.style.borderColor = "black";

	var row = buttontable.insertRow( 0 );
	var leftelement = row.insertCell( 0 );
	calendar.datestring = row.insertCell( 1 );
	var rightelement = row.insertCell( 2 );

	leftelement.appendChild( calendar.backward );
	rightelement.appendChild( calendar.forward );

	calendar.datestring.style.textAlign = "center";
	calendar.datestring.style.width = "100%";
	calendar.datestring.style.fontSize
			= calendar.headingfont.toString() + "pt";
	calendar.datestring.style.lineHeight
			= calendar.lineheight.toString() + "pt";

	if ( calendar.title != null ) {
		var titleline = document.createElement( "h2" );
		titleline.style.fontSize = calendar.titlefont.toString() + "pt";
		titleline.style.textAlign = "center";
		titleline.appendChild( document.createTextNode( calendar.title ) );
		calendar.displaybox.appendChild( titleline );
	}

	calendar.displaybox.appendChild( buttontable );
	calendar.itemlist = document.createElement( "div" );
	calendar.displaybox.appendChild( calendar.itemlist );
//	calendar.itemlist.style.border = "solid";
//	calendar.itemlist.style.borderWidth = "1px";
//	calendar.itemlist.style.borderColor = "black";
//	calendar.itemlist.style.textAlign = "left";

	calendar.itemlist.style.fontSize = calendar.fontsize.toString() + "pt";
	var height = ( 2*calendar.lineheight + calendar.paragraphmargin )
			*calendar.maximumitems + calendar.paragraphmargin;
	calendar.itemlist.style.height = height.toString() + "pt";
	return;
}

function drawMonth()
{
	while ( calendar.datestring.lastChild != null )
		calendar.datestring.removeChild( calendar.datestring.lastChild );
	calendar.datestring.appendChild( document.createTextNode(
			getMonthLabel( calendar.displaymonth, calendar.displayyear ) ) );

	var year = calendar.yearlist[calendar.displayyear.toString()];
	if ( year == null )
		return;
	var month = year.month[calendar.displaymonth];
	if ( month == null )
		return;

//	var dateelement;
//	var titleelement;
//	var item;
//	var ii;
//	for ( ii = 0; ii < month.day.length; ii++ ) {
	if ( calendar.lastontop ) {
		for ( ii = month.day.length - 1; ii >= 0; ii-- ) {
//		item = document.createElement( "p" );
//		item.style.marginLeft = "18pt";
//		item.style.textIndent = "-12pt";
//		item.style.marginRight = "6pt";
//		item.style.marginTop = calendar.paragraphmargin.toString() + "pt";
//		item.style.marginBottom
//				= calendar.paragraphmargin.toString() + "pt";
//		dateelement = document.createElement( "strong" );
//		dateelement.appendChild( document.createTextNode(
//				getDateString( calendar.displaymonth, month.day[ii].day )
//				+ ": " ) );
//		item.appendChild( dateelement );
//		if ( isCurrentPage( month.day[ii].url ) )
//			titleelement = document.createTextNode( month.day[ii].title );
//		else {
//			titleelement = document.createElement( "a" );
//			titleelement.tabIndex = taselement.calendarboxindex + ii;
//			titleelement.setAttribute( "href", month.day[ii].url );
//			titleelement.appendChild( document.createTextNode(
//					month.day[ii].title ) );
//		}
//		item.appendChild( titleelement );
//		calendar.itemlist.appendChild( item );
			addItemToMonth( ii, month );
		}
	}
	else {
		for ( ii = 0; ii < month.day.length; ii++ ) {
			addItemToMonth( ii, month );
		}
	}
	return;
}

function addItemToMonth( ii, month )
{
	var dateelement;
	var titleelement;
	var item;

	item = document.createElement( "p" );
	item.style.marginLeft = "18pt";
	item.style.textIndent = "-12pt";
	item.style.marginRight = "6pt";
	item.style.marginTop = calendar.paragraphmargin.toString() + "pt";
	item.style.marginBottom
			= calendar.paragraphmargin.toString() + "pt";
	dateelement = document.createElement( "strong" );
	dateelement.appendChild( document.createTextNode(
			getDateString( calendar.displaymonth, month.day[ii].day )
			+ ": " ) );
	item.appendChild( dateelement );
	if ( isCurrentPage( month.day[ii].url ) )
		titleelement = document.createTextNode( month.day[ii].title );
	else {
		titleelement = document.createElement( "a" );
		titleelement.tabIndex = taselement.calendarboxindex + ii;
		titleelement.setAttribute( "href", month.day[ii].url );
		titleelement.appendChild( document.createTextNode(
				month.day[ii].title ) );
		}
	item.appendChild( titleelement );
	calendar.itemlist.appendChild( item );
	return;
}


function isCurrentPage( filename )
{
	if ( filename == window.location.pathname )
		return true;
	return false;
}

function clearMonth()
{
	while ( calendar.itemlist.lastChild != null )
		calendar.itemlist.removeChild( calendar.itemlist.lastChild );
	return;
}

function changeMonthBackward( evt )
{
	if ( calendar.earliestyear == calendar.displayyear
			&& calendar.earliestmonth == calendar.displaymonth )
		return;
	if ( calendar.currentyear == calendar.displayyear
			&& calendar.currentmonth == calendar.displaymonth )
		calendar.forward.removeAttribute( "disabled" );
	calendar.displaymonth--;
	if ( calendar.displaymonth < 0 ) {
		calendar.displaymonth = 11;
		calendar.displayyear--;
	}
	if ( calendar.earliestyear == calendar.displayyear
			&& calendar.earliestmonth == calendar.displaymonth ) {
		calendar.backward.setAttribute( "disabled", null );
	}
	clearMonth();
	drawMonth();
	return;
}

function changeMonthForward( evt )
{
	if ( calendar.currentyear == calendar.displayyear
			&& calendar.currentmonth == calendar.displaymonth )
		return;
	if ( calendar.earliestyear == calendar.displayyear
			&& calendar.earliestmonth == calendar.displaymonth )
		calendar.backward.removeAttribute( "disabled" );
	calendar.displaymonth++;
	if ( calendar.displaymonth > 11 ) {
		calendar.displaymonth = 0;
		calendar.displayyear++;
	}
	if ( calendar.currentyear == calendar.displayyear
			&& calendar.currentmonth == calendar.displaymonth )
		calendar.forward.setAttribute( "disabled", null );

	clearMonth();
	drawMonth();
	return;
}

function parseMasterFile( xmlfile )
{
	var bottomindex = finish();
	var element = xmlfile.getElementsByTagName( "title" );
	if ( element != null )
		calendar.title = element[0].firstChild.data;
	element = xmlfile.getElementsByTagName( "earliestyear" );
	if ( element != null )
		calendar.earliestyear = parseInt( element[0].firstChild.data );
	element = xmlfile.getElementsByTagName( "earliestmonth" );
	if ( element != null )
		calendar.earliestmonth
				= calendar.monthlist[element[0].firstChild.data];

	if ( calendar.earliestyear > calendar.currentyear ) {
		calendar.earliestyear = calendar.currentyear;
		calendar.earliestmonth = calendar.currentmonth;
	}
	else if ( calendar.earliestyear == calendar.currentyear
			&& calendar.earliestmonth > calendar.currentmonth )
		calendar.earliestmonth = calendar.currentmonth;

	var year;
	var yearvalue;
	var monthelement;
	var monthname;
	var monthindex;
	var month;
	var dayitem;
	var dayelement;
	var day;
	var titleelement;
	var title;
	var urlelement;
	var url;
	var monthitem;
	var ii;
	var jj;
	var kk;
	var itemlist = new Array();
	var currentitem = null;
	var newitem;

	element = xmlfile.getElementsByTagName( "yearitem" );
	for ( ii = 0; ii < element.length; ii++ ) {
		year = element[ii].getElementsByTagName( "year" );
		if ( year.length > 0 ) {
			year = year[0].firstChild.data;
			yearvalue = parseInt( year );
			if ( yearvalue != null && yearvalue >= calendar.earliestyear
					&& yearvalue <= calendar.currentyear ) {
				calendar.yearlist[year] = new Year();
				monthitem = element[ii].getElementsByTagName( "monthitem" );
				for ( jj = 0; jj < monthitem.length; jj++ ) {
					monthelement
							= monthitem[jj].getElementsByTagName( "month" );
					if ( monthelement.length > 0 ) {
						monthname = monthelement[0].firstChild.data;
						monthindex = calendar.monthlist[monthname];
						if ( monthindex != null ) {
							month = new Month();
							calendar.yearlist[year].month[monthindex] = month;
							dayitem = monthitem[jj].getElementsByTagName(
									"dayitem" );
							for ( kk = 0; kk < dayitem.length; kk++ ) {
								dayelement = dayitem[kk].getElementsByTagName(
										"day" );
								titleelement
										= dayitem[kk].getElementsByTagName(
											"title" );
								urlelement = dayitem[kk].getElementsByTagName(
									"url" );
								if ( dayelement.length > 0
										&& titleelement.length > 0
										&& urlelement.length > 0 ) {
									day = dayelement[0].firstChild.data;
									title = titleelement[0].firstChild.data;
									url = urlelement[0].firstChild.data;

									url = joinFilePath( calendar.directory,
											url, true );


									newitem = new CalendarItem(
											yearvalue, monthindex,
											parseInt( day ), title, url );
									if ( isCurrentPage( url ) ) {
										calendar.displayyear = yearvalue;
										calendar.displaymonth = monthindex;
										currentitem = newitem;
									}
//									else
										itemlist.push( newitem );
									month.day.push( newitem );
								}
							}
							if ( month.day.length > calendar.maximumitems )
								calendar.maximumitems = month.day.length;
							month.day.sort( calendarItemSort );
						}
					}
				}
			}
		}
	}
	if ( calendar.displayyear < calendar.earliestyear ) {
		calendar.displayyear = calendar.earliestyear;
		calendar.displaymonth = calendar.earliestmonth;
	}
	else if ( calendar.displayyear == calendar.earliestyear
			&& calendar.displaymonth < calendar.earliestmonth )
		calendar.displaymonth = calendar.earliestmonth;
	else if ( calendar.displayyear > calendar.currentyear ) {
		calendar.displayyear = calendar.currentyear;
		calendar.displaymonth = calendar.currentmonth;
	}
	else if ( calendar.displayyear == calendar.currentyear
			&& calendar.displaymonth > calendar.currentmonth )
		calendar.displaymonth = calendar.currentmonth;

	drawCalendar();
	if ( calendar.displayyear == calendar.currentyear
			&& calendar.displaymonth == calendar.currentmonth )
	calendar.forward.setAttribute( "disabled", null );
	if ( calendar.displayyear == calendar.earliestyear
			&& calendar.displaymonth == calendar.earliestmonth )
	calendar.backward.setAttribute( "disabled", null );
	drawMonth( calendar.displaymonth, calendar.displayyear );

	if ( currentitem == null )
		return;
	var previous = null;
	var next = null;

	itemlist.sort( orderCalendarItems );
	for ( ii = 0; ii < itemlist.length && previous == null && next == null; ii++ ) {
		if ( currentitem == itemlist[ii] ) {
			if ( ii > 0 )
				previous = itemlist[ii-1];
			ii++;
			if ( ii < itemlist.length )
				next = itemlist[ii];
			
		}
	}


//	for ( ii = 0; ii < itemlist.length; ii++ ) {
//		jj = orderCalendarItems( currentitem, itemlist[ii] );
//		if ( jj == 1 ) {
//			if ( previous == null
//					|| orderCalendarItems( itemlist[ii], previous )
//						== 1 )
//				previous = itemlist[ii];
//		}
//		else if ( jj == -1 ) {
//			if ( next == null
//					|| orderCalendarItems( itemlist[ii], next )
//						== -1 )
//				next = itemlist[ii];
//		}
//	}


	if ( calendar.bottomtagbox != null ) {
		if ( previous != null )
			addBottomTag( calendar.bottomtagbox, previous,
								"Previous", bottomindex++ );
		if ( next != null )
			addBottomTag( calendar.bottomtagbox, next, "Next", bottomindex );
	}
	return;
}

function addBottomTag( box, item, tag, tabindex )
{
	var paragraph = document.createElement( "p" );
	var anchor = document.createElement( "a" );
	anchor.tabIndex = tabindex;
	anchor.setAttribute( "href", item.url );
	anchor.appendChild( document.createTextNode(
				tag
				+ ": "
				+ item.title
				+ "  ("
				+ getDateString( item.month, item.day )
				+ ", "
				+ item.year
				+ ")"
				 ) );

	paragraph.appendChild( anchor );
	box.appendChild( paragraph );
	return;
}

function joinFileToDirectory( dir, file )
{
	var filelist = file.split( "/" );
	if ( filelist.length == 0 )
		return dir;
	if ( filelist.length == 1 )
		return dir + file;
	var filedir = filelist[0];
	var ii;
	for ( ii = 1; ii < filelist.length - 1; ii++ )
		filedir += "/" + filelist[ii];
	return joinDirectoryStrings( dir, filedir )
			+ filelist[filelist.length-1];
}

function joinDirectoryStrings( absdir, appenddir )
{
	var absdirlist = absdir.split( "/" );
	absdirlist.pop();
	var appenddirlist = appenddir.split( "/" );
	var ii;
	for ( ii = 0; ii < appenddirlist.length - 1; ii++ ) {
		if ( appenddirlist[ii] == ".." ) {
			if ( absdirlist.length == 1 )
				return "/";
			absdirlist.pop();
		}
		else if ( appenddirlist[ii] != "." )
			absdirlist.push( appenddirlist[ii] );
	}
	var newdir = "/";
	for ( ii = 1; ii < absdirlist.length; ii++ )
		newdir = newdir + absdirlist[ii] + "/";
	return newdir;
}

function joinFilePath( directory, file, keepfile )
{
	var splitfile = file.split( "/" );
	var newfile;
	if ( splitfile[0] == "" )
		newfile = new Array();
	else {
		newfile = directory.split( "/" );
		newfile.pop();
	}

	var ii;
	for ( ii = 0; ii < splitfile.length - 1; ii++ ) {
		if ( splitfile[ii] == ".." )
			newfile.pop();
		else if ( splitfile[ii] != "." )
			newfile[newfile.length] = splitfile[ii];
	}

	var newname = "/";
	if ( newfile[0] == "" )
		ii = 1;
	else
		ii = 0;

	for ( ; ii < newfile.length; ii++ )
		newname = newname + newfile[ii] + "/";

	if ( keepfile
			&& splitfile[splitfile.length-1] != ""
			&& splitfile[splitfile.length-1] != "." )
		newname = newname + splitfile[splitfile.length-1];

	return newname;
}

function setCalendarBox( masterfile, displaybox, bottombox, index, lastontop, displayyear )
{
	if ( masterfile == null || displaybox == null )
		return;

	calendar.bottomtagbox = bottombox;
	calendar.displaybox = displaybox;
	calendar.index = index;
	calendar.lastontop = lastontop

	var ii;
	for ( ii = 0; ii < calendar.monthlabel.length; ii++ )
		calendar.monthlist[calendar.monthlabel[ii]] = ii;

	calendar.directory = joinFilePath( window.location.pathname,
			masterfile, false );

	var date = new Date();
	calendar.currentmonth = date.getMonth();
	calendar.currentyear = date.getFullYear();

	if ( displayyear == null ) {
		calendar.displayyear = calendar.currentyear;
		calendar.displaymonth = calendar.currentmonth;
	}
	else {
		calendar.displayyear = displayyear;
		calendar.displaymonth = 11;
	}

	readXMLFile( masterfile, parseMasterFile );
	return;
}

