var calendar = null;
var calendarSpan = null;
var currentDate = null;
var selectedDate = null;
var MonthNames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var DayNames = new Array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

var calendarWidth = 200;
var calendarHeight = 200;

var currentDay;
var currentMonth;
var currentYear;
var isDropDownCalendar = true;

var calendarIsNullable;
var calendarMinDate = null;
var calendarMaxDate = null;

function ShowCalendar(id)
{
	calendar = document.getElementById('calendar');

	if(calendarSpan != null && calendarSpan.style.display == '')
	{
		if(id != calendarSpan.id)
		{
			HideCalendar();
			DisplayCalendar(id);			
		}
		else
		{
			HideCalendar();
		}
	}
	else
	{
		DisplayCalendar(id);			
	}
}

function DisplayCalendar(id)
{
	calendarSpan = document.getElementById(id);
	calendarMonth = document.getElementById(id+'_month');
	calendarDay = document.getElementById(id+'_day');
	calendarYear = document.getElementById(id+'_year');
	currentValue = document.getElementById(id+'_year');
	isDropDownCalendar = calendarMonth != null;

	calendarIsNullable = calendarSpan.getAttribute("nullable") == 'true';
	if (isDropDownCalendar)
	{
		calendarMinDate = ParseDate(calendarSpan.getAttribute("mindate"),new Date(calendarYear.options[1].value,0,1));
		calendarMaxDate = ParseDate(calendarSpan.getAttribute("maxdate"),new Date(calendarYear.options[calendarYear.options.length-1].value,11,31));
	}
	else
	{
		calendarMinDate = ParseDate(calendarSpan.getAttribute("mindate"),new Date(parseInt(calendarSpan.getAttribute("minyear")),0,1));
		calendarMaxDate = ParseDate(calendarSpan.getAttribute("maxdate"),new Date(parseInt(calendarSpan.getAttribute("maxyear")),11,31));
	}

	currentDate = GetCurrentDate(id);
	if (typeof(currentDate) == 'undefined')
	{
		currentDate = new Date();
		if (currentDate < calendarMinDate)
		{
			currentDate = calendarMinDate;
		}
		else if (currentDate > calendarMaxDate)
		{
			currentDate = calendarMaxDate;
		}
		var linkedControl = document.getElementById(calendarSpan.getAttribute('rangefrom'));
		if(linkedControl != null)
		{
			var linkedDate = GetCurrentDate(linkedControl.id);
			var minrange = calendarSpan.getAttribute('minrange');
			if(minrange == null)
			{
				minrange = 0;
			}
			else
			{
				minrange = parseInt(minrange);
			}
			if(typeof(linkedDate) != 'undefined')
			{
				linkedDate.setDate(linkedDate.getDate() + minrange);
				if(linkedDate > currentDate)
				{
					currentDate = linkedDate;
				}
			}
		}
		linkedControl = document.getElementById(calendarSpan.getAttribute('rangeTo'));
		if(linkedControl != null)
		{
			var linkedDate = GetCurrentDate(linkedControl.id);
			var minrange = calendarSpan.getAttribute('minrange');
			if(minrange == null)
			{
				minrange = 0;
			}
			else
			{
				minrange = parseInt(minrange);
			}

			if(typeof(linkedDate) != 'undefined')
			{
				linkedDate.setDate(linkedDate.getDate() - minrange);
				if(currentDate > linkedDate)
				{
					currentDate = linkedDate;
				}
			}
		}
	}
	selectedDate = currentDate;
	currentDay = currentDate.getDate();
	currentMonth = currentDate.getMonth();
	currentYear = currentDate.getFullYear();

	FillCalendar(calendarSpan);
	DrawCalendar(calendarSpan);
}

function DrawCalendar(span)
{
	calendar.style.left = GetX(span);
	calendar.style.top = GetY(span);
	calendar.style.display = '';
	calendar.style.position='absolute';
	calendar.style.width = calendarWidth;
	calendar.style.height = (calendarIsNullable ? 20 : 0) + calendarHeight;

	HideAlienControls("IFRAME", calendar, 'noOverlap'); 
	HideAlienControls("SELECT", calendar, 'noOverlap'); 
	HideAlienControls("OBJECT", calendar, 'noOverlap');
}

function FillDays(id,month,year)
{
	var day = document.getElementById(id+'_day');
	var current = day.selectedIndex;
	day.options.length = 0;
//	if(document.getElementById(id).getAttribute("nullable") != null)
	{
		day.options.add(new Option('','-1'));
	}
	for(var i = 1; i <= GetDaysInMonth(month, year); i++)
	{
		var option = new Option(i,i);
		day.options.add(option);
	}
	if(current >= 0)
	{
		current = current > day.options.length-1 ? day.options.length-1 : current;
		day.selectedIndex = current;
	}
}

function HideCalendar()
{
	if(calendar != null)
	{
		calendar.style.display = 'none';
		ShowAlienControls(calendar);
	}
	//calendar = null;
	calendarSpan = null;
}

function ClearCalendar()
{
	if (calendarMonth != null)
	{
		calendarMonth.selectedIndex = 0;
		calendarDay.selectedIndex = 0;
		calendarYear.selectedIndex = 0;
		FillDays(calendarSpan.id,0,0);
	}
	else
	{
		document.getElementById(calendarSpan.id+'_value').value = '';
	}
	HideCalendar();
}

function FillCalendar()
{
	var s = '<table id="toptable" cellspacing="0" bgcolor="#CCCC99" cellpadding="3" style="width:100%;height:100%;border:solid 1px black" >';
	s += DrawCalendarHeading();
	s += DrawCalendarDays();
	if(calendarIsNullable)
	{
		s += '<tr bgcolor="#CCCC99" valign="top"><td colspan="5" align="center" style="font-family:Verdana,Tahoma,Arial; font-size:11px;"><a href="#" class="calendar_normal" onclick="javascript:ClearCalendar(this);">Clear date</a></td></tr>';
	}
	//end of top level table
	s += '</table>';

	calendar.innerHTML = s;
}

function DrawCalendarHeading(target)
{
	//heading with month and year
	var s = '<tr bgcolor="#CCCC99" valign="top"><td>';
	s += '<a href="javascript:DecCalendarMonth()" style="color: #000000; font-family: Verdana,Arial; font-size: 12px; text-decoration: none;" id="calendarPreviousLink" title="Previous month">&lt;&lt;</a>';
	//month drowdown
	s += '</td><td><select noOverlap id="selectMonth" tabindex="-1" onmousewheel="return false;" style="width:100px;font-family:Verdana,Tahoma,Arial;font-size:11px;" onchange="javascript:ChangeCalendarMonth(this);">';
	for(var i = 0; i < MonthNames.length; i++)
	{
		s += '<option value="' + i + '"';
		if (i == currentMonth)
		{
			s+= ' selected';
		}
		s += '>' + MonthNames[i] + '</option>';
	}
	s += '</select></td>';
	//years
	s += '<td align="right">';
	s += '<select noOverlap id="selectYear" tabindex="-1" onmousewheel="return false;" style="width:80px;font-family:Verdana,Tahoma,Arial;font-size:11px;" onchange="javascript:ChangeCalendarYear(this);">';
	if (calendarYear != null)
	{
		for(var i = 0; i < calendarYear.options.length; i++)
		{
			if(calendarYear.options[i].value >= 0)
			{
				s += '<option value="' + calendarYear.options[i].value + '"';
				if(calendarYear.options[i].value == currentYear)
				{
					s+= ' selected';
				}
				s += '>' + calendarYear.options[i].value + '</option>';
			}
		}
	}
	else
	{
		var minYear = parseInt(calendarSpan.getAttribute("minyear"));
		var maxYear = parseInt(calendarSpan.getAttribute("maxyear"));
		if (calendarMinDate.getFullYear() > minYear)
		{
			minYear = calendarMinDate.getFullYear();
		}
		if (maxYear > calendarMaxDate.getFullYear())
		{
			maxYear = calendarMaxDate.getFullYear();
		}
		if (currentDate.getFullYear() < minYear)
		{
			minYear = currentDate.getFullYear();
		}
		if (currentDate.getFullYear() > maxYear)
		{
			maxYear = currentDate.getFullYear();
		}
		for(var y = minYear; y <= maxYear; y++)
		{
			s += '<option value="' + y + '"';
			if(y == currentYear)
			{
				s+= ' selected';
			}
			s += '>' + y + '</option>';
		}
	}
	s += '</td><td><a href="javascript:AddCalendarMonth();" style="color: #000000; font-family: Verdana,Arial; font-size: 12px; text-decoration: none;" id="calendarNextLink" title="Next month">&gt;&gt;</a>';
	s += '</td><td valign="absmiddle"><a href="javascript:HideCalendar(calendar);" style="color: #000000; font-family: Verdana,Arial; font-size: 12px; text-decoration: none;" title="Close">X</a>';
	//end of heading
	s += '</td></tr>';
	
	return s;
}

function DrawCalendarDays()
{
	var s = '<tr valign="top"><td colspan="5"><table cellpadding="4" cellspacing="1" border="0" bgcolor="#888888" width="100%" height="100%" style="font-family:Verdana,Tahoma,Arial; font-size:11px; text-align:center; border-collapse: separate;">';
	s += '<tr bgcolor="#E0E0E0" valign="top">';
	for(var i = 0; i < DayNames.length; i++)
	{
		s += '<td>' + DayNames[i] + '</td>';
	}
	s += '</td></tr>';
	
	var firstDayOfMonth = new Date(currentYear,currentMonth,1);
	var shift = firstDayOfMonth.getDay();
	if(shift == 0) {shift = 7;}
	var drawDate = new Date(currentYear,currentMonth,2 - shift);
	var today = new Date();
	
	for(var row = 0; row < 6; row++)
	{
		s += '<tr valign="top" bgcolor="#F2F2F2">';
		for(var col = 0; col < 7; col++)
		{
			var date = drawDate.getDate();
			var aclass = (drawDate.getMonth() == currentMonth ? 'calendar_normal' : 'calendar_gray');
			var tdstyle = null;
			
			if(date == today.getDate() && drawDate.getMonth() == today.getMonth() && drawDate.getFullYear() == today.getFullYear())
			{
				tdstyle = 'border-left:red 1px solid; border-right:red 1px solid; border-top:red 1px solid; border-bottom:red 1px solid;';
			}
			s += '<td';
			if(date == selectedDate.getDate() && drawDate.getMonth() == selectedDate.getMonth() && drawDate.getFullYear() == selectedDate.getFullYear())
			{
				s += ' bgcolor="#AAAAAA"';
			}
			if(tdstyle != null)
			{
				s += ' style="' + tdstyle +'"';
			}
			if(drawDate >= calendarMinDate && drawDate <= calendarMaxDate)
			{
				var ref = 'onclick="SetCurrentDate(null,' + drawDate.getFullYear() + ',' + drawDate.getMonth() + ',' + date + ');return false;"';
				s += '><a href="#" ' + ref + ' class="' + aclass + '">' + date + '</a></td>';
			}
			else
			{
				s += '><font class="' + aclass + '">' + date + '</font></td>';
			}
			drawDate.setDate(date + 1);
		}
		s += '</tr>';
	}
	s += '</table></td></tr>';
	return s;
}

function SetCurrentDate(id,year,month,day)
{
	if(id != null)
	{
		var oValue = document.getElementById(id+'_value');
		if (oValue == null)
		{
			FillDays(id,month,year);
			document.getElementById(id+'_year').value = year;
			document.getElementById(id+'_month').value = month;
			document.getElementById(id+'_day').selectedIndex = day;
		}
		else
		{
			oValue.value = GetDisplayValue(new Date(year, month, day));
		}
		SetLinkedItems(id);
	}
	else
	{
		if (calendarMonth != null)
		{
			FillDays(calendarSpan.id,month,year);
			calendarYear.value = year;
			calendarMonth.value = month;
			calendarDay.selectedIndex = day; // opera must die
		}
		else
		{
			var oValue = document.getElementById(calendarSpan.id + '_value');
			oValue.value = GetDisplayValue(new Date(year, month, day));
		}
		SetLinkedItems(calendarSpan.id);
	}
	HideCalendar(calendar);
}

function SetLinkedItems(id)
{
	var linkedControl;
	var linkedDate;
	var thisDate;
	var fillEmptyLinkedItem;
	var thisControl = document.getElementById(id);
	
	if(thisControl != null)
	{

		linkedControl = document.getElementById(thisControl.getAttribute('rangeto'));
		if(linkedControl != null)
		{
			linkedDate = GetCurrentDate(linkedControl.id);
			thisDate = GetCurrentDate(thisControl.id);
			fillEmptyLinkedItem = thisControl.getAttribute('fillemptylinkeditem');

			if(typeof(thisDate) != 'undefined' && 
				(typeof(linkedDate) != 'undefined' || fillEmptyLinkedItem != null)
			)
			{
				var minrange = thisControl.getAttribute('minrange');
				if(minrange == null)
				{
					minrange = 0;
				}
				else
				{
					minrange = parseInt(minrange);
				}
				thisDate.setDate(thisDate.getDate() + minrange);

				if(linkedDate < thisDate || typeof(linkedDate) == 'undefined')
				{
					SetCurrentDate(linkedControl.id,thisDate.getFullYear(),thisDate.getMonth(),thisDate.getDate());
				}
			}
		}
		
		linkedControl = document.getElementById(thisControl.getAttribute('rangefrom'));
		if(linkedControl != null)
		{
			linkedDate = GetCurrentDate(linkedControl.id);
			thisDate = GetCurrentDate(thisControl.id);
			fillEmptyLinkedItem = thisControl.getAttribute('fillemptylinkeditem');

			if(typeof(thisDate) != 'undefined' && 
				(typeof(linkedDate) != 'undefined' || fillEmptyLinkedItem != null)
			)
			{
				var minrange = thisControl.getAttribute('minrange');
				if(minrange == null)
				{
					minrange = 0;
				}
				else
				{
					minrange = parseInt(minrange);
				}
				thisDate.setDate(thisDate.getDate() - minrange);

				if(linkedDate > thisDate || typeof(linkedDate) == 'undefined')
				{
					SetCurrentDate(linkedControl.id,thisDate.getFullYear(),thisDate.getMonth(),thisDate.getDate());
				}
			}
		}
		
	}
}

function ChangeCalendarYear(select)
{
	var year = select.options[select.selectedIndex].value;
	var d = new Date(year,0,1);
	var days = GetDaysInMonth(currentMonth,d.getFullYear());
	if(days < currentDay)
	{
		calendarCurrentDate = new Date(year,currentMonth,days);
	}
	else
	{
		calendarCurrentDate = new Date(year,currentMonth,currentDay);
	}
	currentYear = calendarCurrentDate.getFullYear();
	FillCalendar();
}

function ChangeCalendarMonth(select)
{
	var month = select.options[select.selectedIndex].value;
	var days = GetDaysInMonth(month,currentYear);
	if(days < currentDay)
	{
		calendarCurrentDate = new Date(currentYear,month,days);
	}
	else
	{
		calendarCurrentDate = new Date(currentYear,month,currentDay);
	}
	currentMonth = calendarCurrentDate.getMonth();
	currentDay = calendarCurrentDate.getDate();
	FillCalendar();
}

function AddCalendarMonth()
{
	var monthControl = document.getElementById('selectMonth');
	var yearControl = document.getElementById('selectYear');
	
	if(monthControl != null && yearControl != null)
	{
		if((monthControl.selectedIndex != monthControl.options.length - 1) || (yearControl.selectedIndex != yearControl.options.length - 1))
		{
			if(currentMonth < 11)
			{
				currentMonth += 1;
			}
			else
			{
				currentYear += 1;
				currentMonth = 0;
			}
			FillCalendar();
		}
	}
}

function DecCalendarMonth()
{
	var monthControl = document.getElementById('selectMonth');
	var yearControl = document.getElementById('selectYear');
	
	if(monthControl != null && yearControl != null)
	{
		if((monthControl.selectedIndex != 0) || (yearControl.selectedIndex != 0))
		{
			if(currentMonth > 0)
			{
				currentMonth -= 1;
			}
			else
			{
				currentYear -= 1;
				currentMonth = 11;
			}
			FillCalendar();
		}
	}
}

function ParseDate(value,defaultValue)
{
	if(value != null && value.length > 0)
	{
		var vals = value.split('.');
		if(vals != null && vals.length > 2)
		{
			var d = new Date(vals[2],vals[1]-1,vals[0]);
			return new Date(d.getFullYear(),d.getMonth(),d.getDate());
		}
	}
	return defaultValue;
}

function GetDaysInMonth(month, year)
{
	if(month >= 0 && year > 0)
	{
		var ar = new Array(31, (year % 4 == 0) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		return ar[month];
	}
	else
	{
		return 31;
	}
}

function HideAlienControls(tagName, subMenu, attrName)
{ 
	var x = GetX(subMenu); 
	var y = GetY(subMenu); 
	var w = subMenu.offsetWidth;
 	var h = subMenu.offsetHeight; 
	var i; 
	for (i = 0; i < document.all.tags(tagName).length; ++i)
	{ 
		var obj = document.all.tags(tagName)[i]; 
		if (!obj || !obj.offsetParent)
		{
			continue; 
		}
		var ox = GetX (obj); 
		var oy = GetY (obj); 
		var ow = obj.offsetWidth; 
		var oh = obj.offsetHeight; 
		if (ox > (x + w) || (ox + ow) < x)
		{
			continue; 
		}
		if (oy > (y + h) || (oy + oh) < y)
		{
			continue; 
		}
		if(obj.style.visibility == "hidden")
		{
			continue; 
		}
		if(attrName && obj.getAttribute(attrName) != null)
		{
			continue;
		}
		if(!subMenu.cmOverlap)
		{
			subMenu.cmOverlap = new Array (); 
		}
		subMenu.cmOverlap[subMenu.cmOverlap.length] = obj; 
		obj.style.visibility = "hidden";
	}
}

function ShowAlienControls(subMenu)
{ 
	if (subMenu.cmOverlap)
	{ 
		var i; 
		for (i = 0; i < subMenu.cmOverlap.length; ++i)
		{
			subMenu.cmOverlap[i].style.visibility = "";
		}
	}
	subMenu.cmOverlap = null;
}
function GetX(obj)
{ 
	var x = 0; 
	do
	{ 
		x += obj.offsetLeft; 
		obj = obj.offsetParent;
	}
	while (obj); 
	return x;
}

function GetY(obj)
{ 
	var y = 0; 
	do
	{ 
		y += obj.offsetTop; 
		obj = obj.offsetParent;
	}
	while (obj); 
	return y;
}

function GetCurrentDate(id)
{
	if(id != null)
	{
		var oValue = document.getElementById(id+'_value');
		if (oValue == null)
		{
			if(document.getElementById(id+'_year').value > 0 && document.getElementById(id+'_month').value >= 0 && document.getElementById(id+'_day').value > 0)
			{
				return new Date(document.getElementById(id+'_year').value,document.getElementById(id+'_month').value,document.getElementById(id+'_day').value);
			}
		}
		else
		{
			var components = oValue.value.split(/\/|\.|-/);
			if (components.length == 3)
			{
				var m = ParseInteger(components[1]) - 1;
				if (0 <= m && m < 12)
				{
					var y = ParseInteger(components[2]);
					if (y < 100)
					{
						y += (y > 51 ? 1900 : 2000);
					}
					var d = ParseInteger(components[0]);
					if (0 < d && d <= GetDaysInMonth(m, y))
					{
						var date = new Date(y, m, d);
						minDate = ParseDate(document.getElementById(id).getAttribute("mindate"));
						maxDate = ParseDate(document.getElementById(id).getAttribute("maxdate"));
						if (date < minDate)
						{
							date = minDate;
						}
						if (date > maxDate)
						{
							date = maxDate;
						}
						return date;
					}
				}
			}
		}
	}
	else
	{
		if(calendarYear.value > 0 && calendarMonth.value > 0 && calendarDay.value > 0)
		{
			return new Date(calendarYear.value,calendarMonth.value,calendarDay.value);
		}
	}
}

function ParseInteger(i)
{
	return i.length > 0 && i.slice(0,1) == '0' ? parseInt(i.slice(1, i.length)) : parseInt(i);
}

function CheckDate(id,fillDays)
{
	minDate = ParseDate(document.getElementById(id).getAttribute("mindate"));
	maxDate = ParseDate(document.getElementById(id).getAttribute("maxdate"));
	currentDate = GetCurrentDate(id);

	if(typeof(currentDate) != 'undefined')
	{
		if(typeof(minDate) != 'undefined' && currentDate < minDate)
		{
			alert('Invalid date selected.\nMinimum date allowed is '+minDate.toLocaleDateString());
			SetCurrentDate(id,minDate.getFullYear(),minDate.getMonth(),minDate.getDate());
		}
		else if (typeof(maxDate) != 'undefined' && currentDate > maxDate)
		{
			alert('Invalid date selected.\nMaximum date allowed is '+maxDate.toLocaleDateString());
			SetCurrentDate(id,maxDate.getFullYear(),maxDate.getMonth(),maxDate.getDate());
		}
		SetLinkedItems(id);
	}
	if(fillDays)
	{
		FillDays(id,document.getElementById(id+'_month').value,document.getElementById(id+'_year').value);
	}
}

function GetDisplayValue(d)
{
	var month = d.getMonth() + 1;
	return (d.getDate() < 10 ? '0' + d.getDate() : d.getDate()) + '.' + (month < 10 ? '0' + month : month) + '.' + d.getFullYear();
}

document.write('<div id="calendar" style="display: none;"></div>');