﻿var months = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
							   
var fullMonths = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
							   
var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		
function CalculatedHoliday(month, dayOfWeek, weekCount, isLast)	{
			this.Month = month;
			this.DayOfWeek = dayOfWeek;
			this.WeekCount = weekCount;
			if (isLast)
				this.IsLast = isLast;
			}
		
		function StandardHoliday(month, date)
		{
			this.Month = month;
			this.Date = date;
		}
		
var holidays = new Array('1/2/2007', '1/16/2007', '2/20/2007', '5/28/2007', '7/4/2007', '9/3/2007', '10/8/2007', '11/22/2007', '12/24/2007', '12/25/2007');
var standardHolidays = new Array();//(new StandardHoliday(11, 25), new StandardHoliday(0, 1), new StandardHoliday(6, 4));
var calcHolidays = new Array();//(new CalculatedHoliday(8, 1, 1), new CalculatedHoliday(10, 4, 4), new CalculatedHoliday(4, 1, 4, true));
		
var calendars = new Array('HallmarkCalendar');
var inputFields = new Array('requested_date');
       function ShowCalendar(srcField, calendarID)
        {
			CalendarBlur(srcField, calendarID);
        
			var calendar = document.getElementById(calendarID);
			calendar.style.left = srcField.parentNode.offsetLeft + "px";
			calendar.style.visibility = 'visible';
			// HACK: for ie layer/drop down list bug
			var requestedTime = document.getElementById('requested_time');
			requestedTime.style.visibility = 'hidden';
        }
        
        function CalendarBlur(srcField, calendarID)
        {
			var parsedDate = Date.parse(srcField.value);
			var yearFromNow = new Date();
			yearFromNow.setFullYear(yearFromNow.getFullYear() + 1);
			yearFromNow.setDate(1);
			yearFromNow.setHours(0, 0, 0, 0);
			var now = new Date();
			//change the date for TODAY
			now.setDate(now.getDate() + 3);
			now.setHours(0, 0, 0, 0);
			while (IsWeekend(now) || IsHoliday(now))
			{
				now.setDate(now.getDate() + 1);
			}
			
			var pd = new Date(parsedDate);
			
			if (isNaN(parsedDate)) // Date in incorrect format
			{
				SetCurrentDate(now, srcField.id);
				CreateDays(now, calendarID, true, srcField.id);
				CreateMonths(calendarID, now.getMonth(), srcField.id);
			}
			else if (parsedDate >= yearFromNow.valueOf() || parsedDate < now) // Date more than 365 days in future or in the past
			{
				SetCurrentDate(now, srcField.id);
				CreateDays(now, calendarID, true, srcField.id);
				CreateMonths(calendarID, now.getMonth(), srcField.id);
			}
			else if (IsWeekend(pd) || IsHoliday(pd))
			{
				SetCurrentDate(now, srcField.id);
				CreateDays(now, calendarID, true, srcField.id);
				CreateMonths(calendarID, now.getMonth(), srcField.id);
			}
			else
			{
				var selectedDate = new Date(parsedDate);
				SetCurrentDate(selectedDate, srcField.id);
				CreateDays(selectedDate, calendarID, true, srcField.id);
				CreateMonths(calendarID, selectedDate.getMonth(), srcField.id);
			}
        }
        
        function CalendarKeyUp(event, srcField, calendarID)
        {
			var key = event.keyCode ? event.keyCode : event.which;
		
			if (key == 13 || key == 27) // enter or esc
			{
				CalendarBlur(srcField, calendarID);
			}
        }
        
        function HideCalendar(calId)
        {
			document.getElementById(calId).style.visibility = 'hidden';
			
			// HACK: for ie layer/drop down list bug
			var requestedTime = document.getElementById('requested_time');
			requestedTime.style.visibility = 'visible';
        }
        
        function InitialiseCalendars()
        {
			for (var i = 0; i < calendars.length; ++i)
				InitialiseCalendar(calendars[i], inputFields[i]);
        }
        
        function InitialiseCalendar(calendarID, inputField)
        {
			var now = new Date();
			now.setDate(now.getDate() + 0);// previously 14
			
			while (IsWeekend(now) || IsHoliday(now))
			{
				now.setDate(now.getDate() + 1);
			}
        
			SetCurrentDate(now, inputField);
			CreateMonths(calendarID, now.getMonth(), inputField);
			CreateDays(now, calendarID, true, inputField);
        }
        
        function SelectDay(year, month, day, calendarID, inputField)
        {
			var dateField = document.getElementById(inputField);
			dateField.value = (month + 1) + "/" + day + "/" + year;
			
			HideCalendar(calendarID);
        }
        
        function IsWeekend(date)
        {
			return date.getDay() == 0 || date.getDay() == 6;
        }
        
        function IsHoliday(date)
        {
			var isHol = false;
			
			for (var i = 0; i < holidays.length; ++i)
			{
				var holiday = new Date(holidays[i]);
				
				if (!isNaN(holiday))
				{
					if (date.getFullYear() == holiday.getFullYear() &&
						date.getMonth() == holiday.getMonth() &&
						date.getDate() == holiday.getDate())
					{
						isHol = true;
						break;
					}
				}
			}
			
			return isHol || IsStandardHoliday(date) || IsCalculatedHoliday(date);
        }
        
        function IsStandardHoliday(date)
        {
			var isHol = false;
			
			for (var i = 0; i < standardHolidays.length; ++i)
			{
				if (date.getMonth() == standardHolidays[i].Month &&
					date.getDate() == standardHolidays[i].Date)
				{
					isHol = true;
					break;
				}
			}
			
			return isHol;
        }
        
        function IsCalculatedHoliday(date)
        {
			var isHoliday = false;
			
			for (var i = 0; i < calcHolidays.length; ++i)
			{
				if (date.getMonth() == calcHolidays[i].Month && date.getDay() == calcHolidays[i].DayOfWeek)
				{
					if (calcHolidays[i].IsLast)
					{
						if (date.getDate() >= (daysInMonth[calcHolidays[i].Month] - 6))
						{
							isHoliday = true;
							break;
						}
					}
					else
					{
						var dateCount = new Date(date.getFullYear(), calcHolidays[i].Month, 1);
						var weeks = 0;
						
						for (var j = 1; j <= date.getDate(); ++j)
						{
							dateCount.setDate(j);
						
							if (dateCount.getDay() == calcHolidays[i].DayOfWeek)
							{
								++weeks;
							}
						}
						
						if (weeks == calcHolidays[i].WeekCount)
						{
							isHoliday = true;
							break;
						}
					}
				}
			}
			
			return isHoliday;
        }
        
        function CreateDays(currentDate, calendarID, selectDay, inputField)
        {
        	var month = currentDate.getMonth();
        	var days = daysInMonth[month];
        	var year = currentDate.getFullYear();
        	
        	document.getElementById(calendarID + 'CurrentMonthYear').innerHTML = fullMonths[month] + " " + year;
        	
        	// check for leap year
        	if (months[month] == 'Feb' && year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
        		++days;
        		
        	var date = new Date(currentDate.getFullYear(), month, 1);
        	var dayOfWeek = date.getDay();
        	
        	var weekIndex = 0;
        	var week;
        	
        	for (var i = 0; i < 6; ++i)
        	{
        		week = document.getElementById(calendarID + 'Week' + i);
        		
        		for (var j = 0; j < 7; ++j)
        		{
        			week.cells[j].innerHTML = "&nbsp;";
        			week.cells[j].className = 'EmptyDay';
        		}
        	}

        	week = document.getElementById(calendarID + 'Week0');
        	var now = new Date();
        	now.setDate(now.getDate() + 1);//14
        	now.setHours(0, 0, 0, 0);
        	var nowValue = now.valueOf();
        	
        	for (var i = 1; i <= days; ++i)
        	{
        		var iDate = new Date(year, month, i);
        		//**************************Here to change the offset days
        		if (iDate.valueOf() <= (nowValue) || IsWeekend(iDate) || IsHoliday(iDate) ||  (iDate.valueOf()) <= (nowValue+2))
        		{
        			week.cells[dayOfWeek].innerHTML = i + "";
        			week.cells[dayOfWeek].className = 'PastDay';
        		}
        		else if (selectDay && i == currentDate.getDate())
        		{
        			week.cells[dayOfWeek].innerHTML = i + "";
        			week.cells[dayOfWeek].className = 'SelectedDay';
        		}
        		else
        		{
        			week.cells[dayOfWeek].innerHTML = "<a class=\"CalendarDay\" href=\"javascript: SelectDay(" + year + ", " + month + "," + i + ", '" + calendarID + "', '" + inputField + "');\">" + i + "</a>";
        			week.cells[dayOfWeek].className = 'CalendarDay';
        		}
        		
        		if (dayOfWeek == 6)
        		{
        			dayOfWeek = 0;
        			++weekIndex;
        			week = document.getElementById(calendarID + 'Week' + weekIndex);
        		}
        		else
        		{
        			++dayOfWeek;
        		}
        	}
        }
        
        function ChangeMonth(year, month, day, calendarID, inputField)
        {
			CreateDays(new Date(year, month, day), calendarID, false, inputField);
			CreateMonths(calendarID, month, inputField);
        }
        
        function CreateMonths(calendarID, selectedMonth, inputField)
        {
			var currentDate = new Date();
			var month = currentDate.getMonth();
			var year = currentDate.getFullYear();
			
			for (var i = 0; i < 12; ++i)
			{
				var className = month == selectedMonth ? "SelectedMonth" : "CalendarMonths";
			
				var monthCell = document.getElementById(calendarID + 'Month' + i);
				monthCell.className = className;
				monthCell.innerHTML = month == selectedMonth ? months[month] :
				                      "<a class=\"" + className + "\" href=\"javascript: ChangeMonth(" + year + ", " + month + ", 1, '" + calendarID + "', '" + inputField + "');\">" + months[month] + "</a>";
				
				++month;
				if (month > 11)
				{
					month = 0;
					++year;
				}
			}
        }
        
        function SetCurrentDate(currentDate, inputField)
        {
			var dateField = document.getElementById(inputField);
			
			dateField.value = (currentDate.getMonth() + 1) + "/" + (currentDate.getDate()+3) + "/" + currentDate.getFullYear();
        }

