
		var DayInMilliseconds = 24 * 60 * 60 * 1000;
		var TodaysDate = new Date();
		var SelectedDate = TodaysDate;
		var OriginalDate = TodaysDate;
		var ColumnDayMapping = Array( 1, 2, 3, 4, 5, 6, 0 ); // 0-Monday ... 6-Sunday
		var previousYear = SelectedDate.getFullYear();
		/*
		 * Show the calendar for the given month
		 */
		 function ShowCalendar(pYear, pMonth, pMonthDay)
		 {
		 	// Valid entries only
		 	pYear  = parseInt( pYear );  pYear = (isNaN( pYear ) || pYear < 1599 || pYear > 2999) ? TodaysDate.getFullYear() : pYear;
		 	pMonth = parseInt( pMonth ); pMonth = isNaN( pMonth ) ? (TodaysDate.getMonth() + 1) : pMonth;
		 	pMonthDay = parseInt( pMonthDay ); pMonthDay = isNaN( pMonthDay ) ? TodaysDate.getDate() : pMonthDay;

			previousYear = pYear;

		 	SelectedDate = new Date();
			SelectedDate.setFullYear( pYear, pMonth - 1, pMonthDay );
			document.frmDateSelection.theDate.value = formatDate( SelectedDate );

		 	// Get first and last days of the month
		 	var FirstDayOfMonth = new Date(), FirstDayOfNextMonth = new Date(), LastDayOfMonth = new Date();
		 	FirstDayOfMonth.setFullYear( pYear, pMonth - 1, 1 );

		 	if(pMonth < 12) FirstDayOfNextMonth.setFullYear( pYear, pMonth, 1 );
		 	else FirstDayOfNextMonth.setFullYear( pYear + 1, 0, 1 );

		 	LastDayOfMonth.setTime( FirstDayOfNextMonth.getTime() - DayInMilliseconds );

		 	// Loop over TD's and set their values accordingly
		 	var dayNo = 0;
		 	for( var r = 0; r < 6; r++ )
		 	{
		 		for(var c = 0; c < 7; c++)
		 		{
		 			var td = document.getElementById("GridTD_" + r + "_" + c);
		 			// Clean up the td
		 			td.innerHTML = "&nbsp;";
					
					td.className = "";
		 			// If not started counting, check for start
		 			if( dayNo == 0 )
		 				if ( FirstDayOfMonth.getDay() == ColumnDayMapping[c] )
		 					dayNo = 1;

		 			if( dayNo > 0 && dayNo <= LastDayOfMonth.getDate() )
		 			{
		 				td.innerHTML = "<a href='javascript:void(0);' onclick='javascript:ShowCalendar("+pYear+","+pMonth+","+dayNo+")'>"+ dayNo + "</a>";

		 				if( (TodaysDate.getFullYear() == pYear) && (TodaysDate.getMonth() == pMonth - 1) && (TodaysDate.getDate() == dayNo) )
		 				{
							td.className = td.className + ' DPCurrentDate';
		 				}

		 				if( pMonthDay == dayNo )
		 				{
							td.className = td.className + ' DPSelected';
		 				}
		 						 				
		 				dayNo++;
		 			}
		 		}
		 	}
		 }

		/*
		 * Returned Date format
		 */
		 function formatDate( dateObject )
		 {
		 	var pMonth = dateObject.getMonth() + 1;
		 	var pMonthDay = dateObject.getDate();
		 	var pYear = dateObject.getFullYear();

		 	// Show day, month and year readings
		 	var disp_Month = (pMonth < 10) ? "0" + pMonth : pMonth;
		 	var disp_Day = (pMonthDay  < 10) ? "0" + pMonthDay  : pMonthDay;
		 	document.frmDateSelection.month.selectedIndex = pMonth - 1;
		 	document.frmDateSelection.year.value = pYear;
		 	return pYear + '-' + disp_Month + '-' + disp_Day;
		 }

		/*
		 * Month changed
		 */
		 function MonthOrYearChanged()
		 {
			ShowCalendar( document.frmDateSelection.year.value, document.frmDateSelection.month.selectedIndex + 1, 1 );
		 }

		// +1/-1 Year change
		function YearChanged( howMuch )
		{
			document.frmDateSelection.year.value = parseInt( document.frmDateSelection.year.value ) + parseInt( howMuch );
			MonthOrYearChanged();
		}

		// Parse a date string and return the object
		function getDateObject( dateString )
		{
			var arr = Array();
			var valid = false;
			var day = -1, month = -1, year = -1;

			// dd/mm/yyyy format
			if( dateString.indexOf("/") > 0 )
			{
				valid = true;
				arr   = dateString.split("/");
				day = parseInt(arr[0],10);
				if(arr.length > 0) month = parseInt(arr[1],10);
				if(arr.length > 1) year  = parseInt(arr[2],10);
			}
			// yyyy-mm-dd
			else if( dateString.indexOf("-") > 0 )
			{
				valid = true;
				arr   = dateString.split("-");
				day = parseInt(arr[2],10);
				if(arr.length > 0) month = parseInt(arr[1],10);
				if(arr.length > 1) year  = parseInt(arr[0],10);
			}

			if(! valid ) return TodaysDate;

			var theDate = new Date();

			theDate.setFullYear( year, month - 1, day );
			
			return theDate;
		}

		/*
		 * Initialize
		 */
		function Initialize( fromDateObj )
		{
			previousYear = SelectedDate.getFullYear();
			
			if( ! fromDateObj )
			{
				var validSelected = false;
				try
				{
					if(window.opener != null)
						SelectedDate = opener.GetDateSelectorDate();
					if( typeof(SelectedDate) == "object" )
					{
						validSelected = true;
					}
					else
					{
						SelectedDate = getDateObject( SelectedDate );
						validSelected = true;
					}
				}
				catch( ex )
				{
					validSelected = false;
				}
				if( ! validSelected ) SelectedDate = TodaysDate;
				
				OriginalDate = SelectedDate;
			}
			else
			{
				SelectedDate = fromDateObj;
			}
			
			document.frmDateSelection.year.focus();
			
			ShowCalendar( SelectedDate.getFullYear(), SelectedDate.getMonth() + 1, SelectedDate.getDate() );
						
		}

		function returnDateString()
		{
			try
			{
				if(window.opener != null)
					opener.SetDateSelectorDate( document.frmDateSelection.theDate.value );
			}
			catch( ex )
			{
				alert("Wrong use of returnDateString() function\n" + ex.toString());
			}
			window.close();
		}
		

		var dateField = false;
		function setDate( p_dateField )	{
			dateField = p_dateField;
			var w = window.open(BaseUrl().concat("/standard/inc/calendar/default.asp"), "Calendar", "width=300,height=220,resizable=no,scrollbars=no,menu=no,location=no,status=no");
			w.focus();
		}
		function GetDateSelectorDate() { return dateField.value; }
		function SetDateSelectorDate( dateString ) { dateField.value = dateString; }
