var currentMonth = (new Date()).getMonth();
var currentYear = (new Date()).getFullYear();

var monthArray = ["January", "February", "March", "April", "May", "June",
			"July", "August", "September", "October", "November", "December"];

var dayArray = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

var numDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var repeatingFixedWeek = [];
var repeatingLastDay = [];
var fixedDateCircle = [];

var fixedDateEvent = [];

var variableHoliday = [];
var fixedHoliday = [];
var holidayFixedWeek = [];


function getMonthStr(m) {
	return monthArray[m];
}

function getHeadingStr() {
	return getMonthStr(currentMonth) + " " + currentYear.toString();
}

function getPreviousButtonStr() {
	return getMonthStr((currentMonth+11) % 12);
}

function getNextButtonStr() {
	return getMonthStr((currentMonth+1) % 12);
}

function writeHeading() {
	document.write(getHeadingStr());
}

function previousMonth() {
	currentMonth--;
	if (currentMonth < 0) {
		currentMonth = 11;
		currentYear--;
	}
	refreshCalendar();
}


function nextMonth() {
	currentMonth++;
	if (currentMonth > 11) {
		currentMonth = 0;
		currentYear++;
	}
	refreshCalendar();
}

function refreshCalendar() {
	document.getElementById("monthHeading").innerHTML = getHeadingStr();
	document.getElementById("prevButton").innerHTML = getPreviousButtonStr();
	document.getElementById("nextButton").innerHTML = getNextButtonStr();
	updateCalendar();
}

function writePreviousButton() {
	document.write(getPreviousButtonStr());
}

function writeNextButton() {
	document.write(getNextButtonStr());
}

function isLeapYear(dt) {
	var year = dt.getFullYear();
	if (Math.floor(year / 100) == (year / 100))
		return false;
	if (Math.floor(year / 4) == (year / 4))
		return true;
	return false;
}

function getRepeatingLastDay(dt) {
	var entries = [];
	
	var dow = dt.getDay();
	var date = dt.getDate();

	var daysInMonth = numDays[dt.getMonth()];
	if (isLeapYear(dt) && (dt.getMonth()==1))
		daysInMonth = 29;
	
	
	if ((date + 7) > daysInMonth) {
		for (var i=0; i<repeatingLastDay.length; i++) {
			var rld = repeatingLastDay[i];
			if (rld.dayNum == dow) 
				entries.push({label:rld.label, href:rld.href});
		}
	}
	
	return entries;
}

function getRepeatingFixedWeek(dt) {
	var entries = [];
	
	var dow = dt.getDay();
	var date = dt.getDate()-1;
	var occurence = Math.floor(date / 7) + 1;
	for (var i=0; i<repeatingFixedWeek.length; i++) {
		var rfw = repeatingFixedWeek[i];
		if ((rfw.dayNum == dow) && (rfw.dayOccurence == occurence)) 
			entries.push({label:rfw.label, href:rfw.href});
	}
	return entries;
}


function getFixedDateCircle(dt) {
	var entries = [];
	
	var date = dt.getDate();
	var month = dt.getMonth() + 1;
	var year = dt.getFullYear();
	
	for (var i=0; i<fixedDateCircle.length; i++) {
		var fd = fixedDateCircle[i];
		if ((fd.date == date) && (fd.month == month) && (fd.year == year))
			entries.push({label:fd.label, href:fd.href});
	}
	return entries;
}


function getFixedDateEvent(dt) {
	var entries = [];
	
	var date = dt.getDate();
	var month = dt.getMonth() + 1;
	var year = dt.getFullYear();
	
	for (var i=0; i<fixedDateEvent.length; i++) {
		var fd = fixedDateEvent[i];
		if ((fd.date == date) && (fd.month == month) && (fd.year == year))
			entries.push({label:fd.label, href:fd.href});
	}
	return entries;
}


function getEntries(dt) {
	var entries = [];

	var fd = getFixedDateEvent(dt);
	for (var i=0; i<fd.length; i++)
		entries.push(fd[i]);
	
	var rfw = getRepeatingFixedWeek(dt);
	for (var i=0; i<rfw.length; i++)
		entries.push(rfw[i]);
	
	var rld = getRepeatingLastDay(dt);
	for (var i=0; i<rld.length; i++)
		entries.push(rld[i]);
	
	var fd = getFixedDateCircle(dt);
	for (var i=0; i<fd.length; i++)
		entries.push(fd[i]);
	
	return entries;
}

function getHoliday(dt) {
	
	for (var i=0; i<fixedHoliday.length; i++) {
		var h = fixedHoliday[i];
		if ((h.month == dt.getMonth()+1) && (h.date == dt.getDate()))
			return h;
	}


	for (var i=0; i<variableHoliday.length; i++) {
		var h = variableHoliday[i];
		if ((h.year == dt.getFullYear()) && (h.month == dt.getMonth()+1) && (h.date == dt.getDate()))
			return h;
	}

	var dow = dt.getDay();
	var date = dt.getDate()-1;
	var month = dt.getMonth() + 1;

	var occurence = Math.floor(date / 7) + 1;
	for (var i=0; i<holidayFixedWeek.length; i++) {
		var hfw = holidayFixedWeek[i];
		if ((hfw.dayNum == dow) && (hfw.dayOccurence == occurence) && (hfw.month == month)) 
			//alert(hfw.name);
			return hfw;
		
	}
		
	return null;
}

function updateCalendar() {
	for (w=0; w<=5; w++) {
		idStr = "week" + w.toString();
		document.getElementById(idStr).style.cssText="height:50px;"

		for (d=0; d<=6; d++) {
			var idStr = "week" + w.toString() + "day" + d.toString();
			document.getElementById(idStr).innerHTML = "";
			document.getElementById(idStr).className = "dupanz_td_empty";


		}
	}

	var today = new Date();
	var dt = new Date();
	
	dt.setYear(currentYear);
	dt.setMonth(currentMonth);
	dt.setDate(1);

	var w = 0;
	var lastW = 0;
	var tContinue = true;

	while (tContinue) {
		var doy = dt.getDay();
		idStr = "week" + w.toString() + "day" + doy.toString();

		var cellStr = "<span style='font-size:16;'><strong>" + dt.getDate().toString() + "</strong></span>";

		var h = getHoliday(dt);
		if (h != null) {
			cellStr += " " + h.name;
			}
		cellStr += "<br>"


		var entries = getEntries(dt);
		for (var i=0; i<entries.length; i++)
			if (entries[i].href == null)
				cellStr += "<div style='font-size:12;background-color:#ff80ff;margin:5px;padding:5px;border:1px solid black;'>" + entries[i].label + "</div>";
			else if (entries[i].href.indexOf("regular") >= 0) 
				cellStr += "<div style='font-size:12;background-color:#ffff80;margin:5px;padding:5px;border:1px solid black;'><a href='" + entries[i].href + "'>" + entries[i].label + "</a></div>";
			else cellStr += "<div style='font-size:12;background-color:#ff80ff;margin:5px;padding:5px;border:1px solid black;'><a href='" + entries[i].href + "'>" + entries[i].label + "</a></div>";

		if (entries.length == 0)
			cellStr += "<p>&nbsp;</p>";
		
		if ((dt.getDate() == today.getDate()) && (dt.getMonth() == today.getMonth()) && (dt.getFullYear() == today.getFullYear())) 
			document.getElementById(idStr).style.cssText = "background-color:#ff4080;";
		//else if ((doy == 0) || (doy == 6))
		//	document.getElementById(idStr).style.cssText = "background-color:#e0e0e0;";
		else
			document.getElementById(idStr).style.cssText = "";
		
		document.getElementById(idStr).className = "dupanz_td_calendar";
		document.getElementById(idStr).innerHTML = cellStr;
		lastW = w;

		var milli = dt.getTime();
		milli += 24 * 60 * 60 * 1000;
		dt.setTime(milli);
		tContinue = (dt.getMonth() == currentMonth);
		if (dt.getDay() == 0)
			w++;
	}

	for (q=(lastW+1); q<6; q++) {
		idStr = "week"+q;
		document.getElementById(idStr).style.height=0;
	}
}

function addRepeatingFixedWeek(label, href, dayOccurence, dayNum) {
	var entry = {label:label, href:href, dayNum:dayNum, dayOccurence:dayOccurence};
	repeatingFixedWeek.push(entry);
}

function addRepeatingLastDay(label, href, dayNum) {
	var entry = {label:label, href:href, dayNum:dayNum};
	repeatingLastDay.push(entry);
}

function addFixedDateCircle(label, href, date, month, year) {
	var entry = {label:label, href:href, year:year, month:month, date:date};
	fixedDateCircle.push(entry);
}

function addFixedDateEvent(label, href, date, month, year) {
	var entry = {label:label, href:href, year:year, month:month, date:date};
	fixedDateEvent.push(entry);
}

function addFixedHoliday(name, date, month) {
	var entry = {name:name, date:date, month:month};
	fixedHoliday.push(entry);
}

function addVariableHoliday(name, date, month, year) {
	var entry = {name:name, date:date, month:month, year:year};
	variableHoliday.push(entry);
}

function addHolidayFixedWeek(name, dayOccurence, dayNum, month) {
	var entry = {name:name, dayNum:dayNum, dayOccurence:dayOccurence, month:month};
	holidayFixedWeek.push(entry);
}


// Auckland
addRepeatingFixedWeek("Auckland (St Barnabas)", "regular_circles.htm#stb", 1, 1); // 1st Monday
addRepeatingFixedWeek("Auckland (St Barnabas)", "regular_circles.htm#stb", 3, 1); // 3rd Monday
addRepeatingFixedWeek("Auckland (St Barnabas: Zikr)", "regular_circles.htm#stb", 5, 1); // 5th Monday (when there is one)

// Albany
addFixedDateCircle("Auckland (Albany)", "regular_circles.htm#kawhai", 19, 6, 2010);


// Browns Bay
addRepeatingFixedWeek("Auckland (Browns Bay)", "regular_circles.htm#browns_bay", 2, 3); // 2nd Wednesday

//addRepeatingLastDay("Auckland (Birkenhead)", "regular_circles.htm#birkenhead", 3); // Last Wednesday		SUSPENDED

// Flat Bush
addRepeatingFixedWeek("Auckland (Flat Bush)",   "regular_circles.htm#flatb", 2, 1); // 2nd Monday

// Mercy
addRepeatingFixedWeek("Auckland (Mercy Centre)",   "regular_circles.htm#mercy", 1, 2); // 1st Tuesday

// Sharda
addRepeatingFixedWeek("Tuakau (Sharda)",   "regular_circles.htm#sharda", 1, 0); // 1st Sunday

// Coromandel
//addRepeatingFixedWeek("Coromandel (The Pyramid)",   "regular_circles.htm#pyramid", 1, 4); // 1st Thursday      SUSPENDED
//addRepeatingFixedWeek("Coromandel (The Pyramid)",   "regular_circles.htm#pyramid", 3, 4); // 3rd Thursday

addRepeatingFixedWeek("Thames",   "regular_circles.htm#thames", 1, 3); // 1st Wednesday

// Bay of Plenty
addRepeatingFixedWeek("Tauranga",   "regular_circles.htm#frontiersmen", 2, 1); // 2nd Monday
addRepeatingFixedWeek("Ohope",   "regular_circles.htm#ohope", 2, 3); // 2nd Wednesday

// Hawkes Bay
addFixedDateCircle("Napier", "regular_circles.htm#clive", 12, 3, 2010);
addFixedDateCircle("Napier", "regular_circles.htm#clive", 17, 4, 2010);

// Central
addRepeatingFixedWeek("Taupo (Tauhara)",   "regular_circles.htm#tauhara", 1, 1); // 1st Monday

// Lower NI
addRepeatingFixedWeek("Otaki",   "regular_circles.htm#otaki", 4, 0); // 4th Sunday
addRepeatingFixedWeek("Wellington",   "regular_circles.htm#loaves", 2, 5); // 2nd Friday

// Christchurch
addRepeatingFixedWeek("Christchurch", "regular_circles.htm#christchurch", 1, 1); // Mondays
addRepeatingFixedWeek("Christchurch", "regular_circles.htm#christchurch", 2, 1); // 
addRepeatingFixedWeek("Christchurch", "regular_circles.htm#christchurch", 3, 1); // 
addRepeatingFixedWeek("Christchurch", "regular_circles.htm#christchurch", 4, 1); //
addRepeatingFixedWeek("Christchurch", "regular_circles.htm#christchurch", 5, 1); //


// Events
addFixedDateEvent("Wali and Arienne (Raumati South)", "dance_events.htm#wali", 6, 3, 2010);
addFixedDateEvent("Wali and Arienne (Tuakau)", "dance_events.htm#wali", 13, 3, 2010);
addFixedDateEvent("Wali and Arienne (Auckland)", "dance_events.htm#wali", 20, 3, 2010);

addFixedDateEvent("Spirit and Nature (Kapiti)", "dance_events.htm#spirit", 23, 4, 2010);
addFixedDateEvent("Spirit and Nature (Kapiti)", "dance_events.htm#spirit", 24, 4, 2010);
addFixedDateEvent("Spirit and Nature (Kapiti)", "dance_events.htm#spirit", 25, 4, 2010);

addFixedDateEvent("DUPANZ Visioning (Tongariro)", "dance_events.htm#visioning", 14, 5, 2010);
addFixedDateEvent("DUPANZ Visioning (Tongariro)", "dance_events.htm#visioning", 15, 5, 2010);
addFixedDateEvent("DUPANZ Visioning (Tongariro)", "dance_events.htm#visioning", 16, 5, 2010);

addFixedDateEvent("Allaudin (Auckland)", "dance_events.htm#allaudin_ecstatic", 12, 6, 2010);

addFixedDateEvent("Allaudin (Tauhara)", "dance_events.htm#allaudin_tauhara", 14, 6, 2010);

addFixedDateEvent("Allaudin (Tuakau)", "dance_events.htm#allaudin_tuning", 17, 6, 2010);
addFixedDateEvent("Allaudin (Tuakau)", "dance_events.htm#allaudin_tuning", 18, 6, 2010);
addFixedDateEvent("Allaudin (Tuakau)", "dance_events.htm#allaudin_tuning", 19, 6, 2010);
addFixedDateEvent("Allaudin (Tuakau)", "dance_events.htm#allaudin_tuning", 20, 6, 2010);

addFixedDateEvent("Tihei Mauriora (Tuakau)", "dance_events.htm#tihei", 23, 7, 2010);
addFixedDateEvent("Tihei Mauriora (Tuakau)", "dance_events.htm#tihei", 24, 7, 2010);
addFixedDateEvent("Tihei Mauriora (Tuakau)", "dance_events.htm#tihei", 25, 7, 2010);
addFixedDateEvent("Tihei Mauriora (Tuakau)", "dance_events.htm#tihei", 26, 7, 2010);


addFixedDateEvent("Spring Revival (Coromandel)", "dance_events.htm#revival", 17, 9, 2010);
addFixedDateEvent("Spring Revival (Coromandel)", "dance_events.htm#revival", 18, 9, 2010);
addFixedDateEvent("Spring Revival (Coromandel)", "dance_events.htm#revival", 19, 9, 2010);


addFixedDateEvent("Dance to Quan Am (Tuakau)", "dance_events.htm#quan", 1, 10, 2010);
addFixedDateEvent("Dance to Quan Am (Tuakau)", "dance_events.htm#quan", 2, 10, 2010);


addFixedDateEvent("Devotional Heart (Te&nbsp;Moata)", "dance_events.htm#devotional", 12, 11, 2010);
addFixedDateEvent("Devotional Heart (Te&nbsp;Moata)", "dance_events.htm#devotional", 13, 11, 2010);
addFixedDateEvent("Devotional Heart (Te&nbsp;Moata)", "dance_events.htm#devotional", 14, 11, 2010);


addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 7, 1, 2011);
addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 8, 1, 2011);
addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 9, 1, 2011);
addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 10, 1, 2011);
addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 11, 1, 2011);
addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 12, 1, 2011);
addFixedDateEvent("Dance Camp Aotearoa", "dance_events.htm#dca_2011", 13, 1, 2011);


addFixedDateEvent("From Russia with Love", "dance_events.htm#russia", 14, 1, 2011);
addFixedDateEvent("From Russia with Love", "dance_events.htm#russia", 15, 1, 2011);
addFixedDateEvent("From Russia with Love", "dance_events.htm#russia", 16, 1, 2011);


addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 21, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 22, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 23, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 24, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 25, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 26, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 27, 1, 2011);
addFixedDateEvent("DUPANZ Annual retreat", "dance_events.htm#garden", 28, 1, 2011);



addFixedDateEvent("Opua DUP", "dance_events.htm#opua", 31, 7, 2010);
addFixedDateEvent("Hamilton DUP", "dance_events.htm#hamilton", 15, 8, 2010);

addFixedDateEvent("Opua DUP", "dance_events.htm#opua_sep10", 25, 9, 2010);



// Leader traing 2010
addFixedDateEvent("Deepening Dance Aotearoa", null, 28, 5, 2010);
addFixedDateEvent("Deepening Dance Aotearoa", null, 29, 5, 2010);
addFixedDateEvent("Deepening Dance Aotearoa", null, 30, 5, 2010);

addFixedDateEvent("Deepening Dance Aotearoa", null, 3, 9, 2010);
addFixedDateEvent("Deepening Dance Aotearoa", null, 4, 9, 2010);
addFixedDateEvent("Deepening Dance Aotearoa", null, 5, 9, 2010);

addFixedDateEvent("Deepening Dance Aotearoa", null, 3, 12, 2010);
addFixedDateEvent("Deepening Dance Aotearoa", null, 4, 12, 2010);
addFixedDateEvent("Deepening Dance Aotearoa", null, 5, 12, 2010);

// Leader traing 2011
addFixedDateEvent("Deepening Dance Aotearoa", null, 25, 2, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 26, 2, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 27, 2, 2011);

addFixedDateEvent("Deepening Dance Aotearoa", null, 20, 5, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 21, 5, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 22, 5, 2011);

addFixedDateEvent("Deepening Dance Aotearoa", null, 2, 9, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 3, 9, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 4, 9, 2011);

addFixedDateEvent("Deepening Dance Aotearoa", null, 25, 11, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 26, 11, 2011);
addFixedDateEvent("Deepening Dance Aotearoa", null, 27, 11, 2011);




// Holidays - known dates
addFixedHoliday("Christmas Day", 25, 12);
addFixedHoliday("Boxing Day", 26, 12);
addFixedHoliday("New Year's Day", 1, 1);
addFixedHoliday("Day After New Year", 2, 1);
addFixedHoliday("Waitangi Day", 6, 2);
addFixedHoliday("ANZAC Day", 25, 4);
addFixedHoliday("Guy Fawke's Night", 5, 11);

addHolidayFixedWeek("Queen's Birthday", 1, 1, 6); // 1st Monday June
addHolidayFixedWeek("Labour Day", 4, 1, 10); // 4th Monday October

// Anniversary days
addFixedHoliday("Auckland /<br>&nbsp;Northland Anv.", 29, 1);
addFixedHoliday("Southland Anv.", 17, 1);
addFixedHoliday("Wellington Anv.", 22, 1);
addFixedHoliday("Nelson Anv.", 1, 2);
addFixedHoliday("Otago Anv.", 23, 3);
addFixedHoliday("Taranaki Anv.", 31, 3);
addFixedHoliday("South Canterbury Anv.", 25, 9);
addFixedHoliday("Hawkes Bay /<br>&nbsp;Malborough Anv.", 1, 11);
addFixedHoliday("Canterbury Anv.", 16, 11);
addFixedHoliday("Chathams Anv.", 30, 11);
addFixedHoliday("Westland Anv.", 1, 12);


// Holidays - variable dates
addVariableHoliday("Good Friday", 2, 4, 2010);
addVariableHoliday("Easter Sunday", 4, 4, 2010);
addVariableHoliday("Easter Monday", 5, 4, 2010);
	

// Solstices
addVariableHoliday("Autumn Equinox", 20, 3, 2010);
addVariableHoliday("Winter Solstice", 21, 6, 2010);
addVariableHoliday("Spring Equinox", 23, 9, 2010);
addVariableHoliday("Summer Solstice", 21, 12, 2010);

addVariableHoliday("Lammas/Lugnasad", 2, 2, 2010);
addVariableHoliday("Last Light / Samhain /<br>&nbsp;Halloween", 30, 4, 2010);
addVariableHoliday("Matariki", 14, 6,  2010);
addVariableHoliday("First Light / Imbolc", 2, 8,  2010);
addVariableHoliday("Beltane", 31, 10, 2010);



