﻿
var _calendarData;
var _calendarWeekLength;
var _calendarDateToday;
var _calendarCurrentMonth;
var _calendarContainer;
var _calendarDetail;

var _IE = "microsoft internet explorer";
var _FIREFOX = "netscape";

function getsource()
{
	var e = document.getElementById("TextArea1");
	e.innerText = _calendarContainer.outerHTML;
}

function initializeCalendar(dataIslandId, containerId, weekLength)
{
	switch(weekLength)
	{
		case 5:
			_calendarWeekLength = 5;
			break;
		default:
			_calendarWeekLength = 7;
			break;
	}

	_calendarContainer = document.getElementById(containerId);
	_calendarDateToday = new Date()
	_calendarCurrentMonth = new Date((_calendarDateToday.getMonth()+1) + "/1/" + _calendarDateToday.getFullYear());
	initializeCalendarDataIsland(dataIslandId);	
	buildCalendar(_calendarCurrentMonth);
	//_calendarContainer.onmousemove = "CalendarMouseMove()";
	
}

function rebuildCalendar(newDate, weekDayLength)	
{
	if (newDate)
	{
		var d = new Date(newDate);
		_calendarCurrentMonth = d;
	}
	
	if (weekDayLength)
	{
		_calendarWeekLength = weekDayLength;
	}
	
	buildCalendar(_calendarCurrentMonth);
}

function buildCalendar(startDate)
{	
	var lastDay = calendarDaysInMonth(startDate);
	var firstDay = new Date(startDate.toDateString());
	firstDay.setDate(1);
	firstDay.setHours(0,0,0,0);
	
	var dayOfWeek = firstDay.getDay() + 1;
	var dayCounter = 0;
	
	var m = document.createElement("table");
	m.setAttributeNode(newCalendarProperty("border","0"));
	m.setAttributeNode(newCalendarProperty("cellpadding","0"));
	m.setAttributeNode(newCalendarProperty("cellspacing","0"));
	m.setAttributeNode(newCalendarProperty("class","calendarViewer"));
	m.setAttributeNode(newCalendarProperty("id","calendarTable"));
	
	
	m.appendChild(makeCalendarHeader(getCalendarMonthName(startDate)));
	m.appendChild(makeCalendarFooter());
	
	var calendarBody = document.createElement("tbody");
	m.appendChild(calendarBody);
	
	// loop through week rows based on how weeks are positioned in the month
	do 
	{
		var weekRow = document.createElement("tr");
		calendarBody.appendChild(weekRow);
		
		// loop through 7 days in a week
		for (var d = 1; d <= 7; d++)
		{
			// skip if viewing 5 days a week and its the first or seventh day
			if (((_calendarWeekLength == 5) && ((d > 1)&&(d < 7))) || (_calendarWeekLength == 7))
			{
				var dayCell = document.createElement("td");
				
				if ((_calendarDateToday.getMonth() == startDate.getMonth()) && (_calendarDateToday.getDate() == dayCounter))
				{
					dayCell.setAttributeNode(newCalendarProperty("class","calendarDayTodayCell"));
				}
				else
				{
					if (d ==1 || d==7)
					{
						dayCell.setAttributeNode(newCalendarProperty("class","calendarDayWeekendCell"));
					}
					else
					{
						dayCell.setAttributeNode(newCalendarProperty("class","calendarDayCell"));
					}
				}
				weekRow.appendChild(dayCell);
				
				// has month started yet?
				if (dayCounter == 0)
				{
					if (d == dayOfWeek)
					{
						dayCounter = 1;
						dayCell.appendChild(makeCalendarMonthDay(new Date(startDate.getFullYear(), startDate.getMonth(), dayCounter)));
						dayCounter ++;
					}
					else
					{
						// create an empty day
						dayCell.appendChild(makeCalendarMonthDay(null));
					}
				}
				else
				{
					// if its not past the last day of the month
					if (dayCounter <= lastDay)
					{
						dayCell.appendChild(makeCalendarMonthDay(new Date(startDate.getFullYear(), startDate.getMonth(), dayCounter)));
					}
					else
					{
						dayCell.appendChild(makeCalendarMonthDay(null));
					}
					dayCounter ++;
				}	
			}
			else
			{
				if (dayCounter == 0)
				{
					if (d == dayOfWeek)
					{
						dayCounter = 2;
					}
				}
				else
				{
					dayCounter ++;
				}
			}
		}
	} while (dayCounter < lastDay)
	
	while (_calendarContainer.childNodes.length >= 1)
    {
    	_calendarContainer.removeChild(_calendarContainer.firstChild);       
    }
	_calendarContainer.appendChild(m);
	
}

function makeCalendarHeader(text)
{
	var colspan = 7;
	if (_calendarWeekLength == 5) colspan = 5;
	
	var th = document.createElement("thead");
	var tr = document.createElement("tr");
	
	var td1 = document.createElement("td");
	var lastMonth = new Date((_calendarCurrentMonth.getMonth()) + "/1/" + _calendarCurrentMonth.getFullYear());
	var currentMonth = new Date((_calendarDateToday.getMonth()) + "/1/" + _calendarDateToday.getFullYear());
	
	//alert(lastMonth + "-" + currentMonth);
	if (lastMonth > currentMonth)
	{
		var a1 = document.createElement("button");
		a1.setAttributeNode(newCalendarProperty("onClick", "rebuildCalendar('" + lastMonth + "', " + _calendarWeekLength + ");"));
		setCalendarElementValue(a1, "<<");
		setCalendarElementHtml(td1, a1);
	}
	else
	{
		setCalendarElementValue(td1, " ");
	}
	tr.appendChild(td1);
	
	var td2 = document.createElement("td");
	td2.setAttributeNode(newCalendarProperty("colspan", colspan-2));
	var h1 = document.createElement("h1");
	setCalendarElementValue(h1, text);
	td2.appendChild(h1);
	tr.appendChild(td2);
	
	
	var td3 = document.createElement("td");
	var a2 = document.createElement("button");
	var nextMonth = (_calendarCurrentMonth.getMonth()+2) + "/1/" + _calendarCurrentMonth.getFullYear();
	a2.setAttributeNode(newCalendarProperty("onClick", "rebuildCalendar('" + nextMonth + "', " + _calendarWeekLength + ");"));
	setCalendarElementValue(a2, ">>");
	setCalendarElementHtml(td3, a2);
	tr.appendChild(td3);	
	
	th.appendChild(tr);
	th.appendChild(makeCalendarDayHeader());
	return th;
}

function makeCalendarDayHeader()
{
	var h = document.createElement("tr");
	
	// need to aray this 
	if (_calendarWeekLength == 7) h.appendChild(makeCalendarHeaderDay("Sunday"));
	h.appendChild(makeCalendarHeaderDay("Monday"));
	h.appendChild(makeCalendarHeaderDay("Tuesday"));
	h.appendChild(makeCalendarHeaderDay("Wednesday"));
	h.appendChild(makeCalendarHeaderDay("Thursday"));
	h.appendChild(makeCalendarHeaderDay("Friday"));
	if (_calendarWeekLength == 7) h.appendChild(makeCalendarHeaderDay("Saturday"));
	
	return h;
}

function makeCalendarFooter()
{
	var colspan;
	var weekLengthOption;
	switch (_calendarWeekLength) 
	{
		case 7:
			colspan = 7;
			weekLengthOption = 5;
			break;
		default:
			colspan = 5;
			weekLengthOption = 7;
			break;
	}
	
	var tf = document.createElement("tfoot");
	var tr = document.createElement("tr");
	var td = document.createElement("td");
	td.setAttributeNode(newCalendarProperty("colspan",colspan));
	
	var a = document.createElement("a");
	a.setAttributeNode(newCalendarProperty("onClick", "rebuildCalendar(null, " + weekLengthOption + ");"));

	//a.onClick = "rebuildCalendar(null, " + weekLengthOption + ");";
	setCalendarElementValue(a, "Show me a " + weekLengthOption + " day week");
	
	
	setCalendarElementHtml(td, a);
	//td.appendChild(a);
	tr.appendChild(td);
	tf.appendChild(tr);

	
	
	return tf;
}

function makeCalendarHeaderDay(dayName)
{
	var d = document.createElement("td");
	setCalendarElementValue(d, dayName);
	return d;
}

function makeCalendarWeek()
{

}

function makeCalendarMonthDay(date)
{
	var dayDiv = document.createElement("div");
	
	if (date)
	{
		date.setHours(0,0,0,0);
		
		var midnight = new Date(date);
		midnight.setHours(23,59,00,00);
		
		dayDiv.setAttributeNode(newCalendarProperty("class","calendarDay"));
		
		var dayHeader = document.createElement("div");
		dayHeader.setAttributeNode(newCalendarProperty("class","calendarDayHeader"));
		setCalendarElementValue(dayHeader, date.getDate());
		dayDiv.appendChild(dayHeader);

		// loop through available events in the calendar
		for (var i = 0 ; i < _calendarData.length ; i++) 
		{
			var e = _calendarData[i];
			var start = new Date(getCalendarElementValue(e, "start"));
			var stop = new Date(getCalendarElementValue(e, "stop"));
			
			//if (((start <= date) && (stop >= midnight)) || ((start >= date) && (stop <= midnight)) )
			if (((start <= midnight) && (stop >= date)))
			{
				var eventId = e.getAttribute("eventID");
				var title = getCalendarElementValue(e, "longTitle");
				var shortTitle = getCalendarElementValue(e, "shortTitle");
				
				var location = getCalendarElementValue(e, "location");
				var eventType = getCalendarElementValue(e, "eventType");
				var allDayEvent = getCalendarElementValue(e, "allDayEvent");
					
				var outerEventDiv = document.createElement("div");
				outerEventDiv.className = "calendarDayOuterEvent";
				var eventDiv = document.createElement("div");
				eventDiv.id = "event" + eventId;
				
				eventDiv.className = "calendarDayEvent"; //eventType_" + eventType.replace(" ", "_");
				setCalendarElementValue(eventDiv, shortTitle);
				
				var message = "<h5>" + title + "</h5><div>" + formatCalendarTimeRange(start, stop, allDayEvent) + "</div><div>" + eventType + "</div>";
				
				if ((location ) && (location.length > 0)) {message = message.concat("<div>" + location + "</div>");}
				
				eventDiv.setAttributeNode(newCalendarProperty("onclick", "ChangeURL('Pages/CalendarDetail.aspx?eventid=" + eventId + "');"));
				eventDiv.setAttributeNode(newCalendarProperty("onmouseover", "ShowCalendarDetail('" + message + "');"));
				eventDiv.setAttributeNode(newCalendarProperty("onmouseout", "HideCalendarDetail()"));
								
				setCalendarElementHtml(outerEventDiv, eventDiv);
				dayDiv.appendChild(outerEventDiv);

			}
			else if (start > date)
			{
				// break out if event starts after current date
				break;
			}
		}
	}
	else
	{
		dayDiv.setAttributeNode(newCalendarProperty("class","calendarDayEmpty"));
		setCalendarElementValue(dayDiv, " ");
	}
	
	return dayDiv
}

function ChangeURL(url)	
{
	window.location = url;
}


function ShowCalendarDetail(message)
{
	HideCalendarDetail()
	
	var e = window.event;
	var s = window.event.srcElement;
	
	_calendarDetail = document.createElement("div");
	var innerDetail = document.createElement("div");
	
	_calendarDetail.setAttributeNode(newCalendarProperty("id", "calendarEventDetail"));;
	innerDetail.innerHTML = message;// + "<br>" + event.clientY + "-" + event.offsetY + "-" + event.fromElement.scrollHeight;// + "\n" + event.offsetY + "-" + event.y;
	setCalendarElementHtml(_calendarDetail, innerDetail);
	
	document.body.appendChild(_calendarDetail);
	
	//_calendarDetail.style.top = (e.clientY) + (e.fromElement.offsetHeight - e.offsetY)+ "px";
	//_calendarDetail.style.top = ((event.clientY - event.offsetY) + event.fromElement.scrollHeight) + "px";
	//_calendarDetail.style.left = (event.clientX - event.offsetX) + "px";	
	_calendarDetail.style.top = (event.clientY + 5) + "px";
	_calendarDetail.style.left = (event.clientX +  - event.offsetX) + "px";	
}

var _calendarDetailAlpha = 0;
function CalendarDetailFade(d)
{
	var speed = 10;
	var endalpha = 95;
	
	var a = _calendarDetailAlpha;
	if((a != endalpha && d == 1) || (a != 0 && d == -1)){
		var i = speed;
		if(endalpha - a < speed && d == 1)
		{
			i = endalpha - a;
		}
		else if(_calendarDetailAlpha < speed && d == -1)
		{
			i = a;
		}
		_calendarDetailAlpha = a + (i * d);
		_calendarDetail.style.opacity = _calendarDetailAlpha * .01;
		_calendarDetail.style.filter = 'alpha(opacity=' + _calendarDetailAlpha + ')';
	}
	else
	{
		//clearInterval(_calendarDetailTimer);
		if(d == -1)
		{
			_calendarDetail.style.display = 'none';
		}
	}
}

function HideCalendarDetail()
{
	if (_calendarDetail)
	{
		CalendarDetailFade(1);
		document.body.removeChild(_calendarDetail);
		_calendarDetail = null;
	}
}

function CalendarMouseMove(e)
{
	//if (!e) var e = window.event;
	alert(e.pageY);
	if ((_calendarDetail != null) && (e != null))
	{
		
		//var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY;
		//var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX;
		var u = e.pageY;
		var l = e.pageX;
	
		_calendarDetail.style.top = (u - 3) + 'px';
		_calendarDetail.style.left = (l + 3) + 'px';	
	}
}

function initializeCalendarDataIsland(dataIslandID)
{
	
	var d = document.getElementById(dataIslandID);
	var e = d.getElementsByTagName("event");
	_calendarData = e;
}

function newCalendarProperty(name, value)
{
	var a = document.createAttribute(name);
	a.nodeValue = value;
	return a;
}

function calendarDaysInMonth(d) 
{
	var now = d.getDate();
	var year = d.getFullYear();
	var month = d.getMonth();
	var months = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

	// check for leap year
	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) months[1] = "29";
	var days = months[month];
	
	return days;
} 

function getCalendarMonthName(date) 
{
	// why yes, these are hard coded values
	var m = ['January','February','March','April','May','June','July','August','September','October','November','December'];
	return m[date.getMonth()];
} 

function getCalendarDayName(date) 
{
	// why yes, these are hard coded values
	var d = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
	return d[date.getDay()];
}

function formatCalendarTimeRange(startDate, endDate, allDayEvent)
{
	var r;
	if (allDayEvent == "Yes")
	{
		r = "All Day Event";
	}
	else
	{
		r = formatCalendarTime(startDate) + " to " + formatCalendarTime(endDate);
	}
	return r;
}

function GetCalendarDate(d)
{
	return d.getDate() + d.getMonth() + d.getFullYear();
}


function formatCalendarTime(d)
{
	var date = new Date(d);
	var r = "";
	var h = date.getHours();
	var m = date.getMinutes();
	if (h == 0)
	{
		r = "Morning";
	}
	else if (h == 23)
	{
		r = "Evening";
	}

	else
	{
		
		var ampm = "am";
		var mm;
		if (m.length == 1)
		{
			mm = "0" + "0";
		}
		else if (m == 0)
		{
			mm = "00";
		}
		else
		{
			mm = m + "";
		}
		
		if (h >= 12)
		{
			if (h > 12)
			{
				h = h - 12;
			}
			ampm = "pm";
		}
		
		r = h + ":" + mm + " " + ampm;
	}
	
	return r
}

function setCalendarElementValue(element, elementValue)
{
	var browser = calendarBrowserType();
	switch (browser.toLowerCase())
	{
		case _IE:
			element.innerText = elementValue;
			break;
		case _FIREFOX:
			element.textContent = elementValue;
			break;
		default:
			element.innerText = elementValue;
			break;
	}
}

function setCalendarElementHtml(outerElement, innerElement)
{
	var browser = calendarBrowserType();
	switch (browser.toLowerCase())
	{
		case _IE:
			outerElement.innerHTML = innerElement.outerHTML;
			break;
		case _FIREFOX:
			outerElement.appendChild(innerElement);
			break;
		default:
			outerElement.innerHTML = innerElement.outerHTML;
			break;
	}
}


function getCalendarElementValue(parent, elementKey)
{
	var browser = calendarBrowserType();
	var returnValue = "";
	switch (browser.toLowerCase())
	{
		case _IE:
			returnValue = parent.getElementsByTagName(elementKey)[0].nextSibling.nodeValue;
			break;
		case _FIREFOX:
			returnValue = parent.getElementsByTagName(elementKey)[0].firstChild.nodeValue;
			break;
		default:
			returnValue = parent.getElementsByTagName(elementKey)[0].nextSibling.nodeValue;
			break;
	}
	return returnValue;
}

function getCalendarElementProperty(parent, propertyKey)
{
	var browser = calendarBrowserType();
	var returnValue = "";
	switch (browser.toLowerCase())
	{
		case _IE:
			returnValue = parent.getElementsByTagName(elementKey)[0].nextSibling.nodeValue;
			break;
		case _FIREFOX:
			returnValue = parent.getElementsByTagName(elementKey)[0].firstChild.nodeValue;
			break;
		default:
			returnValue = parent.getElementsByTagName(elementKey)[0].nextSibling.nodeValue;
			break;
	}
	return returnValue;
}

function calendarBrowserType()
{
	var browser = navigator.appName;
	return browser;
}