﻿var popupCal = new Calendar();
var popupCalContainer;
var fieldToPopulate;
var calFrame; 

PopupCalendar.prototype.getStartDate = getStartDate;
PopupCalendar.prototype.getEndDate = getEndDate;

function PopupCalendar(){
	this.Calendar = new Calendar();
	this.Target = "";
}

function InitializeCalendar(){
	popupCalContainer = document.createElement("div");
	popupCalContainer.className = "PopupCalendar";
	document.body.appendChild(popupCalContainer);
	calFrame = document.createElement("iframe");
	calFrame.className = "popupCalFrame";
	document.body.appendChild(calFrame);
}

function showCalendar(e){
	var source;

	if(e != null){
		if(e.srcElement){
			source = e.srcElement;
		}
		else if(e.target){
			source = e.target;
		}
		if(source.id == "nextMonth"){
			popupCal.Date.addMonths(1);
		}
		else if(source.id == "previousMonth"){
			popupCal.Date.addMonths(-1);
		}
		else if(source.id == "popupCalMonth"){
			popupCal.Date.setMonth(source.value);
		}
		else if(source.id == "popupCalYear"){
			popupCal.Date.setFullYear(source.value);
		}
		else{
			popupCal.Date = new Date();
		}
		HideCalendar();
		popupCalContainer.appendChild(buildCalendar());
	}
	else{
	    if(GetDate(fieldToPopulate.value) != "Invalid Date"){
	        popupCal.Date = new Date(fieldToPopulate.value);
	    }
	    else{
		    popupCal.Date = new Date();
		}
		HideCalendar();
		popupCalContainer.appendChild(buildCalendar());
	}
}

function changeYear(e){
	if(e.srcElement){
		if(e.srcElement.value.length == 4){
			showCalendar(e);
		}
	}
	else if(e.target){
		if(e.target.value.length == 4){
			showCalendar(e);
		}
	}
}

function buildCalendar(){
	var calContainer = document.createElement("table");
	var calBody = document.createElement("tbody");
	var navRow = document.createElement("tr");
	var navCell = document.createElement("td");
	var calRow = document.createElement("tr");
	var calCell = document.createElement("td");
	
	calContainer.setAttribute("cellSpacing", "0");
	calContainer.setAttribute("cellPadding", "0");
	calContainer.setAttribute("width", "100%");
	
	navCell.setAttribute("colspan", "7");
	navCell.appendChild(buildNavigation());
	navRow.appendChild(navCell);
	
	calCell.appendChild(buildCalendarBody());
	calRow.appendChild(calCell);
	calBody.appendChild(navRow);
	calBody.appendChild(calRow);
	
	calContainer.appendChild(calBody);
	
	return calContainer;
}

function buildNavigation(){
	var navTable = document.createElement("table");
	var navBody = document.createElement("tbody");
	var row = document.createElement("tr");
	var leftNavCell = document.createElement("td");
	var rightNavCell = document.createElement("td");
	var monthCell = document.createElement("td");
	var leftNavText = document.createTextNode("<<");
	var rightNavText = document.createTextNode(">>");
	var monthText = document.createTextNode(popupCal.getMonthName() + " " + popupCal.Date.getFullYear());
	var leftNav = document.createElement("a");
	var rightNav = document.createElement("a");
	var ddlMonth = document.createElement("select");
	var month;
	var txtYear = document.createElement("input");
	var titleRow = document.createElement("tr");
	var closeCell = document.createElement("td");
	var closeLink = document.createElement("a");
	
	setupEvent(ddlMonth, "change", showCalendar, false);
	setupEvent(txtYear, "keyup", changeYear, false);

	ddlMonth.options.length = popupCal.Months.length;
	
	for(x = 0; x < popupCal.Months.length; x++){
		ddlMonth.options[x].value = x;
		ddlMonth.options[x].text = popupCal.Months[x];
		if(x == popupCal.Date.getMonth()){
			ddlMonth.options[x].selected = true;
		}
	}
	
	txtYear.style.width = "35px";
	txtYear.setAttribute("maxLength", "4");
	txtYear.value = popupCal.Date.getFullYear();
	
	navTable.setAttribute("cellSpacing", "0");
	navTable.className = "Navigation";
	
	setupEvent(leftNav, "click", showCalendar, false);
	setupEvent(rightNav, "click", showCalendar, false);
		
	leftNav.setAttribute("id", "previousMonth");
	rightNav.setAttribute("id", "nextMonth");
	leftNavCell.className = "LeftNavigation";
	rightNavCell.className = "RightNavigation";
	monthCell.className = "Title";
	
	leftNav.appendChild(leftNavText);
	rightNav.appendChild(rightNavText);
	
	setupEvent(closeLink, "click", HideCalendar, false);
	closeLink.appendChild(document.createTextNode("X"));
	closeCell.setAttribute("colSpan", "3");
	closeCell.className = "WindowState";
	closeCell.appendChild(closeLink);
	titleRow.appendChild(closeCell);
	
	ddlMonth.id = "popupCalMonth";
	txtYear.id = "popupCalYear";
	
	leftNavCell.appendChild(leftNav);
	monthCell.appendChild(ddlMonth);
	monthCell.appendChild(txtYear);
	rightNavCell.appendChild(rightNav);
	
	row.appendChild(leftNavCell);
	row.appendChild(monthCell);
	row.appendChild(rightNavCell);
	navBody.appendChild(titleRow);
	navBody.appendChild(row);
	navTable.appendChild(navBody);
	
	return navTable;
}

function buildDaysHeader(){
	var row = document.createElement("tr");
	var cell;
	var day;
	
	for(x = 0; x < 7; x++){
		cell = document.createElement("td");
		cell.className = "DayOfWeek";
		day = document.createTextNode(popupCal.WeekDays[x].substring(0,2));
		cell.appendChild(day);
		row.appendChild(cell);
	}
	
	return row;
}

function buildCalendarBody(){
	var calTable = document.createElement("table");
	var calBody = document.createElement("tbody");
	var workingDate = getStartDate();
	var weekRow = document.createElement("tr");
	var weekDayCell;
	var dayText;
	var dayLink;
	var holidays = getHolidays(popupCal.Date.getFullYear());
	
	calTable.className = "Calendar";
	
	calBody.appendChild(buildDaysHeader());
	
	while(workingDate.getTime() <= getEndDate().getTime()){
		dayText = document.createTextNode(workingDate.getDate());
		weekDayCell = document.createElement("td");
		weekDayCell.style.cursor = "pointer";
		if(workingDate.getTime() == popupCal.getToday().getTime()){
			weekDayCell.className = "Today";
		}
		else if(workingDate.getMonth() < popupCal.Date.getMonth() || workingDate.getFullYear() < popupCal.Date.getFullYear()){
			weekDayCell.className = "PreviousMonth";
		}
		else if(workingDate.getMonth() > popupCal.Date.getMonth() || workingDate.getFullYear() > popupCal.Date.getFullYear()){
			weekDayCell.className = "NextMonth";
		}
		else if(holidays[workingDate.getTime()] != null){
			weekDayCell.className = "Holiday";
		}
		else{
			weekDayCell.className = "CurrentMonth";
		}
		
		if(holidays[workingDate.getTime()] != null){
			weekDayCell.setAttribute("title", holidays[workingDate.getTime()]);
		}
		
		setupEvent(weekDayCell, "click", selectDate, true);
		
		weekDayCell.appendChild(dayText);
		weekRow.appendChild(weekDayCell);
		
		if(workingDate.getDay() == 6){
			calBody.appendChild(weekRow);
			weekRow = document.createElement("tr");
		}
		workingDate = workingDate.addDays(1);
	}
	
	calBody.appendChild(weekRow);
	calTable.appendChild(calBody);
	
	return calTable;
}

function selectDate(e){
	var dayCell;
	var selectedDate = new Date(popupCal.Date.getFullYear(), popupCal.Date.getMonth(), 1);
	
	if(e.srcElement){
		dayCell = e.srcElement;
	}
	else if(e.target){
		dayCell = e.target;
	}
	if(dayCell.className == "PreviousMonth"){
		selectedDate.addMonths(-1);
		selectedDate.setDate(dayCell.firstChild.nodeValue);
	}
	else if(dayCell.className == "NextMonth"){
		selectedDate.addMonths(1);
		selectedDate.setDate(dayCell.firstChild.nodeValue);
	}
	else{
		selectedDate.setDate(dayCell.firstChild.nodeValue);
	}

	fieldToPopulate.value = DateFormat(selectedDate.toDateString(), "mm/dd/yyyy");
	HideCalendar();	
}

function getStartDate(DayOfWeek){
	var month = popupCal.Date.getMonth();
	var year = popupCal.Date.getFullYear();
	var day = 1;
	var workingDate;
	
	if(DayOfWeek == null){
		DayOfWeek = 0;
	}
	
	workingDate = new Date(year, month, day);
	
	workingDate = workingDate.addDays(-workingDate.getDay() + DayOfWeek);
	workingDate.setHours(0,0,0,0);
	
	return workingDate;
}

function getEndDate(DayOfWeek){
	var month = popupCal.Date.getMonth();
	var year = popupCal.Date.getFullYear();
	var day = popupCal.Date.getDaysInMonth();
	var workingDate = new Date(year, month, day);
	
	if(DayOfWeek == null){
		DayOfWeek = 6;
	}
	
	workingDate = workingDate.addDays(DayOfWeek - workingDate.getDay());
	workingDate.setHours(23, 59, 59, 999);

	return workingDate;
}

function DisplayCalendar(source, field){
	var positionElement = source;
	var leftPosition = parseInt(0);
	var topPosition = parseInt(0);
	var winW;
	var winH;

	if(field != null){
		fieldToPopulate = document.getElementById(field);
	}

	if(popupCalContainer == null){
		InitializeCalendar();
	}

	while(positionElement.offsetParent){
		leftPosition += positionElement.offsetLeft;
		topPosition += positionElement.offsetTop;
		positionElement = positionElement.offsetParent;
	}
	
	if(window.innerWidth && window.innerHeight){
		winW = window.innerWidth;
		winH = window.innerHeight;
	}
	else if(document.body.offsetWidth && document.body.offsetHeight){
		winW = document.body.offsetWidth;
		winH = document.body.offsetHeight;
	}
	else{
		winW = 10000;
		winH = 10000;
	}
			
	showCalendar();

	if(leftPosition + popupCalContainer.offsetWidth > winW){
		leftPosition = leftPosition - popupCalContainer.offsetWidth;
	}
	if(topPosition + popupCalContainer.offsetHeight + source.offsetHeight > winH){
		topPosition = topPosition - popupCalContainer.offsetHeight - source.offsetHeight;
	}
	
	popupCalContainer.style.left = leftPosition + "px";
	popupCalContainer.style.top = (topPosition + source.offsetHeight) + "px";
	calFrame.style.left = leftPosition + "px";
	calFrame.style.top = (topPosition + source.offsetHeight) + "px";
	calFrame.style.height = (popupCalContainer.offsetHeight) + "px";
	calFrame.style.width = (popupCalContainer.offsetWidth) +  "px";
	calFrame.style.display = "block";
}
function HideCalendar(){
	if(popupCalContainer != null){
	    while(popupCalContainer.childNodes.length > 0){
	        popupCalContainer.removeChild(popupCalContainer.childNodes[0]);
	    }
	}
	if(calFrame != null){
	    calFrame.style.display = "none";
	}
}
function setupEvent(element, eventName, functionRef, bubble){
	if(document.addEventListener){
		element.addEventListener(eventName, functionRef, bubble);
	}
	else if(document.attachEvent){
		element.attachEvent("on" + eventName, functionRef);
	}
}