function daysInMonth(year, monthIndex) {
	var monthLengths = new Array(12);
		monthLengths[0] = 31;
		monthLengths[1] = (year%4==0) ? 29 : 28;
		monthLengths[2] = 31;
		monthLengths[3] = 30;
		monthLengths[4] = 31;
		monthLengths[5] = 30;
		monthLengths[6] = 31;
		monthLengths[7] = 31;
		monthLengths[8] = 30;
		monthLengths[9] = 31;
		monthLengths[10] = 30;
		monthLengths[11] = 31;
	
	return monthLengths[monthIndex];
}

function monthAsString(monthIndex) {
	var monthNames = new Array(12);
		monthNames[0] = "January";
		monthNames[1] = "February";
		monthNames[2] = "March";
		monthNames[3] = "April";
		monthNames[4] = "May";
		monthNames[5] = "June";
		monthNames[6] = "July";
		monthNames[7] = "August";
		monthNames[8] = "September";
		monthNames[9] = "October";
		monthNames[10] = "November";
		monthNames[11] = "December";
	
	return monthNames[monthIndex];
}

function dayAsString(dayIndex) {
	var dayNames = new Array(7);
		dayNames[0] = "Sunday";
		dayNames[1] = "Monday";
		dayNames[2] = "Tuesday";
		dayNames[3] = "Wednesday";
		dayNames[4] = "Thursday";
		dayNames[5] = "Friday";
		dayNames[6] = "Saturday";
		
	return dayNames[dayIndex];
}

function generateCalendar(relPath, startYear, startMonth, startDay, range, highlightedDays, selectedDays, theURL, doFunction) {
	//Initialise arguments
	var todaysDate = new Date();
	
	if (!relPath) {relPath=""}
	
	//if (!startYear || startYear.length!=4) {startYear = '2004'}
	
	if (!startMonth || startMonth<1 || startMonth>12) {startMonth = (todaysDate.getMonth()+1)}
	
	if (!startDay || startDay<1 || startDay>daysInMonth(startYear, (startMonth-1))) {startDay = 1}
	
	if (!range || range<1) {range = daysInMonth(startYear, (startMonth-1)) - startDay + 1}
	
	if (!highlightedDays) {highlightedDays = ""}

	if (!selectedDays) {selectedDays = ""}
	
	if (!theURL) {theURL = document.location}
	//(theURL.indexOf("?")!=-1) ? theURL += "&" : theURL += "?";
	
	if (!doFunction) {doFunction = false;}
	
	//Initialise variables
	var theDate = new Date(startYear, (startMonth-1), startDay);
	var blanks = theDate.getDay()%7;
	var total = blanks+(startDay+range);
	var remainder = (7-((blanks+range)%7))%7
	var thisMonthLength = daysInMonth(startYear, (startMonth-1));
	var nextMonthLength = daysInMonth(startYear, (startMonth%11));
	var counter = startDay;
	var nextMonth = false;
	var nextNextMonth = false;
	var yearArg = startYear;
	var monthArg = startMonth;
//	var imageWidth = 30;
//	var imageHeight = 25;
//	var imageHSPACE = 1;
//	var imageVSPACE = 1;
	var columnWidth = 22
	var columnHeight = 17
//	var calendarImage = new Array();
//	var calendarImageHi = new Array();
	var columnHeadings = new Array(7);
		columnHeadings[0] = "S";
		columnHeadings[1] = "M";
		columnHeadings[2] = "T";
		columnHeadings[3] = "W";
		columnHeadings[4] = "T";
		columnHeadings[5] = "F";
		columnHeadings[6] = "S";

	// Display column headings
	document.write("<TABLE WIDTH=200 CELLSPACING=2 CELLPADDING=0 BORDER=0 BGCOLOR=#E8E1E1 HEIGHT=120>");
	/*document.write("<TR VALIGN=TOP>");
	for (var h=0; h<7; h++) {
		document.write("<TD WIDTH="+(columnWidth)+" ALIGN=CENTER CLASS=\"calendarHeading\">");
		document.write(columnHeadings[h]);
		document.write("</TD>");
	}
	document.write("</TR>");
	*/
	// Fill in blank spaces to make start date appear in the right day column
	document.write("<TR VALIGN=TOP>")
	for (var i=0; i<blanks; i++) {
		document.write("<TD ALIGN=CENTER BGCOLOR=#F3F0F0>");
		document.write("<IMG SRC=\""+relPath+"/dot_clear.gif\" WIDTH="+columnWidth+" HEIGHT="+columnHeight+" BORDER=0>");
		document.write("</TD>");
	}

	// Display start date plus the following n days (n=range)
	for (var j=(startDay); j<(total-blanks); j++) {
		// If row is filled up, go to next row
		if (((j-startDay+blanks)%7)==0) {
			document.write("</TR>");
			document.write("<TR VALIGN=TOP>");
		}
		
		// If end of the month is reached, reset counter to 1. If date is 31 January in a non-leap year, this process needs to happen twice
		if (counter>thisMonthLength) {
			counter=1;
			nextMonth = true;
			monthArg = monthArg + 1;
			if (monthArg>11) {
				monthArg = monthArg%12;
				yearArg++
			}
		}
		
		if (counter>nextMonthLength && nextMonth==true) {
			counter=1;
			nextNextMonth = true;
			monthArg = monthArg + 1;
			if (monthArg>11) {
				monthArg = monthArg%12;
				yearArg++
			}
		}
		//calendarImage[counter] = new String(relPath + "/new_calendar_"+counter+".gif");
		//calendarImageHi[counter] = new String(relPath + "/new_calendar_"+counter+"_hi.gif");
	
		// Display image corresponding to the date
		//theImage = (listFind(highlightedDays, counter)) ? calendarImageHi[counter] : calendarImage[counter];
		/*if (listFind(highlightedDays, counter)){
			theClass = "calendarHighLight"
		}
		else 
		if (listFind(selectedDays, counter)){
			theClass = "calendarWhite"
		}
		else {
			theClass = "calendarDay"
		}*/
		theClass = "calendarDay"
		if (listFind(selectedDays, counter)){
			bgColour = " BGCOLOR=#F3F0F0"
		}
		else {
			bgColour = " BGCOLOR=#FFFFFF"
		}
		//bgColour = (listFind(selectedDays, counter)) ? " BGCOLOR=#333333" : "";
		document.write("<TD ALIGN=CENTER"+bgColour+" WIDTH="+columnWidth+">");
		if (doFunction) {
			document.write("<A HREF=\"javascript: void insertDate('"+counter+"/"+monthArg+"/"+yearArg+"')\" LABEL=\""+counter+" " +monthAsString(monthArg-1)+", "+yearArg+"\" CLASS=\""+theClass+"\">");
		}
		else if (listFind(highlightedDays, counter)) {
			document.write("<A HREF=\""+setURLVar(theURL, "startDate", escape('{ts \''+yearArg+'-'+monthArg+'-'+counter+' 00:00:00\'}'))+"\" LABEL=\""+counter+" " +monthAsString(monthArg-1)+", "+yearArg+"\"CLASS=\""+theClass+"\">");
			
		}
		/*else if (listFind(highlightedDays, counter)) {
			document.write("<A HREF=\"javascript:document.events.startdate.value="+yearArg+"-"+monthArg+"-"+counter+";" LABEL=\""+counter+" " +monthAsString(monthArg-1)+", "+yearArg+"\"CLASS=\""+theClass+"\">");
			
		}		
		*/
		document.write(counter);
		if (doFunction) {
			document.write("</A>");
		}
		else if (listFind(highlightedDays, counter)) {
			document.write("</A>");
		}		
		document.write("</TD>");
		counter++
	}
	
	// Fill in blank spaces to complete grid
	for (var l=0; l<remainder; l++) {
		document.write("<TD ALIGN=CENTER BGCOLOR=#F3F0F0>");
		document.write("<IMG SRC=\""+relPath+"/dot_clear.gif\" WIDTH="+columnWidth+" HEIGHT="+columnHeight+" BORDER=0>");
		document.write("</TD>");
	}
	document.write("</TR>");
	document.write("</TABLE>");
	document.close();
}

function arrayFind(array, element) {
	var elementInArray = false;
	for (var i=0; i<array.length; i++) {
		if (array[i]==element) {elementInArray = true}
	}
	
	return elementInArray;
}

function listFind(list, element, separator) {
	if (!separator) {separator = ","}
	
	var listArray = list.split(separator);
	
	return arrayFind(listArray, element)
}


function setURLVar(URL, Variable, Value) {
	URL = URL.toString();

	if (URL.indexOf(Variable)==-1) {
		returnURL = URL + ((URL.indexOf("?")==-1) ? "?" : "&") + Variable + "=" + Value;
	}
	else {
		if (URL.indexOf("&")==-1) {
			returnURL = URL.split("?")[0] + "?" + Variable + "=" + Value;
		}
		else {
			returnURL = URL.split("?")[0] + "?";
			URLVarArray = URL.split("?")[1].split("&");
			
			for (var i=0; i<URLVarArray.length; i++) {
			 returnURL += ((URLVarArray[i].split("=")[0]==Variable) ? (Variable + "=" + Value) : URLVarArray[i]);
			returnURL += (i==(URLVarArray.length-1)) ? "" : "&";
			}
		}
	}
	return returnURL;
}
