var selectedDate;
var currentMonth;
var currentYear;
function showCalendar(dateFieldID)
{
	selectedDate = null;
	currentMonth = null;
	currentYear = null;
	
	var startDate;
	
	field = document.getElementById(dateFieldID);
	var ds = field.value;
	if (ds != "")
	{
		var format = GetCurrentDateFormat();
		var parts = ds.split(" ");
		if (parts.length > 1 || parts[0].indexOf(":") < 0)
		{
			var dateParts = parts[0].split("/");
			switch (format)
			{
				case "mdy":
					selectedDate = new Date(dateParts[2], dateParts[0] - 1, dateParts[1]);
					break;
				case "dmy":
					selectedDate = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]);
					break;
				case "ymd":
					selectedDate = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);
					break;

			}
			// selectedDate will be NaN if the user entered either only a time (i.e. "3:25pm") or an invalid value.
			if (isNaN(selectedDate))
			{
				selectedDate = new Date();
			}
		}
		else
		{
			selectedDate = new Date();
		}
		startDate = selectedDate;
	}
	else
	{
		startDate = new Date();
	}
	
	var this_month = (startDate.getMonth());
	var this_year = startDate.getFullYear();
	today = startDate.getDate();
	create_cal(this_year,this_month);
	// select the right items
	var month = document.getElementById("month");
	for(var i=0;i<month.options.length;i++)
	{
		if(month.options[i].value == this_month)
		{
			month.selectedIndex = i;
		}
	}
	// add years 
	var year = document.getElementById("year");
	// edm 05/20/2005 - DT 14767 - If there are already years loaded, clear them out first.
	for (var i = year.options.length - 1; i >= 0;--i)
	{
		year.options.remove(i);
	}
	// edm 05/20/2005 - DT 14766 - Always start in 1800 and go 25 years into the future.
	var first_year = 1800; //this_year - 75;
	for(var i=(new Date()).getFullYear() + 25;i>=first_year;i--)
	{
		var o = document.createElement("option");
		o.value = i;
		o.innerHTML = i;
		year.appendChild(o);
		if(i==this_year)
		{	
			o.selected = true;
		}
	}
	
	showControl(dateFieldID, "calendar");
}
function closeCalendar()
{
	closeControl();
	ignoreDocumentClick = false;
}
function selectDate(day, month, year)
{
    var selectedDate = new Date(year, month - 1, day, 0, 0, 0);
    select(GetFormattedDate(selectedDate.getVarDate()));
}
function select(value)
{
	field.value = value;
	field.focus();
	
	closeControl();
}
function selectToday()
{
    var today = new Date();
    today.setHours(0);
    today.setMinutes(0);
    today.setSeconds(0);
    select(GetFormattedDate(today.getVarDate()));
}
function selectRunDate()
{
	select("@date")
}
function selectNone()
{
	select("");
}
function change_cal()
{
	var year = document.getElementById("year");
	year = year.options[year.selectedIndex].value;
	var month = document.getElementById("month");
	month = month.options[month.selectedIndex].value;
	create_cal(year,month);

	// EDM 5/26/2005 - DT 14757 - Prevent the click from accidentally dismissing the calendar.
	ignoreDocumentClick = true;
}
function getNiceDate(month, date, year)
{
	var nice_month = month;
	var nice_day = date;
	return nice_month+"/"+nice_day+"/"+year;
}
function create_cal(year,month)
{
	currentMonth = parseInt(month)+1;
	currentYear = year;

	// delete current contents of cal
	var t = document.getElementById("calendarBody");
	while(t.firstChild!=null)
	{
		t.removeChild(t.firstChild);
	}
	var dim = days_in_months(year)[month];
	var i,d,tr,td;
	d = new Date(year,month,1);
	tr = document.createElement("TR");
	
	// fill first week with blank cells if needed
	for(i=0;i<d.getDay();i++)
	{
		td = document.createElement("TD");
		td.innerHTML = "&nbsp;";
		td.className = "noday";
	
		tr.appendChild(td);
	}
	// body of the month
	for(i = 1; i <= dim; i++ )
	{
		td = document.createElement("TD");
		td.className = "day";
		
		var nicedate = getNiceDate(currentMonth, i, year);
		td.onclick = dayCellClick; //"select('" + nicedate + "');";
		td.onmouseover = cellMouseOver;
		td.onmouseout = cellMouseOut;
		//var a = document.createElement("A");
		//a.href="javascript:select('"+ nicedate +"')";
		//a.className="day";

		var title = nicedate;
		if (month == 2 && i == 22)
		{
			title = "Happy Birthday!";
		}

		var today = new Date();
		if (today.getFullYear() == year && today.getMonth() == month && today.getDate() == i)
		{
			td.className="today";
		}
		if (selectedDate)
		{
			if (selectedDate.getFullYear() == year && selectedDate.getMonth() == month && selectedDate.getDate() == i)
			{
				title += " (selected)";
				td.className = " selected";
			}
		}
		
		td.title = title;
		td.innerHTML = i;
		
		//td.appendChild(a);
		tr.appendChild(td);
		d = new Date(year,month,i);
		
		if(d.getDay() == 6)
		{
			t.appendChild(tr);
			tr = document.createElement("TR");
		}
	}
	// fill the last week with blank cells if needed
	for(var i = d.getDay();i<6;i++)
	{
		td = document.createElement("TD");
		td.innerHTML = "&nbsp;";
		td.className = "noday";
		tr.appendChild(td);
		t.appendChild(tr);
		
	}	
	
}
function dayCellClick()
{
	var dayCell = window.event.srcElement;
	selectDate(dayCell.innerText, currentMonth, currentYear);
}
function first_day(month,year)
{
	var d = new Date(year,month,1)
	return d.getDay();
}

function days_in_months(year)
{
	// is it a leap year??
	var _days_in_months = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	
	if(leap_year(year))
	{
		_days_in_months[1] = 29;
	}
	return _days_in_months;
}
function leap_year(year)
{
	if ((year/4)   != Math.floor(year/4))   return false;
    if ((year/100) != Math.floor(year/100)) return true;
    if ((year/400) != Math.floor(year/400)) return false;
    return true;

}
function move_month(where)
{
	var m = document.getElementById("month");
	var y = document.getElementById("year");
	if(m.selectedIndex == 0 && where < 0 )
	{
	
		if(y.selectedIndex==y.options.length-1)
			return;
		m.selectedIndex = 11;
		y.selectedIndex +=1;
		change_cal();
		return;
	}
	if(m.selectedIndex == 11 && where > 0 )
	{
		if(y.selectedIndex==0)
			return;
		m.selectedIndex = 0;
		y.selectedIndex -= 1;
		change_cal();
		return;
	}
	m.options[m.selectedIndex += where];
	
	change_cal();
}

var runDateButton = "";
if (showRunDateButton)
    runDateButton = "<input type=button value='Run' onclick='selectRunDate()' ID='Button4' NAME='Button4'>&nbsp;&nbsp;"
var controlHtml = "\r\n" +
"<div id='calendar' class='control' style='width:215'>\r\n" +
"	<table cellpadding=0 cellspacing=0 class='controlBody'>\r\n" +
"		<tr>\r\n" +
"			<td>\r\n" +
"				<table cellpadding=3 cellspacing=0>\r\n" +
"					<thead>\r\n" +
"						<tr>\r\n" +
"							<td class='menu' colspan=7 align=center>\r\n" +
"								<a href='javascript:move_month(-1)'><img src='" + gWebRoot + "/AsiCommon/Controls/Shared/Calendar/images/arrow_left.jpg' border=0></a>\r\n" +
"								<select id='month' class='month' onchange='change_cal()' NAME='month'>\r\n" +
"									<option value='0'>January</option>\r\n" +
"									<option value='1'>February</option>\r\n" +
"									<option value='2'>March</option>\r\n" +
"									<option value='3'>April</option>\r\n" +
"									<option value='4'>May</option>\r\n" +
"									<option value='5'>June</option>\r\n" +
"									<option value='6'>July</option>\r\n" +
"									<option value='7'>August</option>\r\n" +
"									<option value='8'>September</option>\r\n" +
"									<option value='9'>October</option>\r\n" +
"									<option value='10'>November</option>\r\n" +
"									<option value='11'>December</option>\r\n" +
"								</select>\r\n" +
"								&nbsp;\r\n" +
"								<select id='year' class='year' onchange='change_cal();' NAME='year'></select>\r\n" +
"								<a href='javascript:move_month(+1)'><img src='" + gWebRoot + "/AsiCommon/Controls/Shared/Calendar/images/arrow_right.jpg' border=0></a>\r\n" +
"							</td>\r\n" +
"						</tr>\r\n" +
"						<tr>\r\n" +
"							<th>Sun</th>\r\n" +
"							<th>Mon</th>\r\n" +
"							<th>Tue</th>\r\n" +
"							<th>Wed</th>\r\n" +
"							<th>Thu</th>\r\n" +
"							<th>Fri</th>\r\n" +
"							<th>Sat</th>\r\n" +
"						</tr>\r\n" +
"					</thead>\r\n" +
"					<tbody id='calendarBody' class='calendarBody'>\r\n" +
"					</tbody>\r\n" +
"				</table>\r\n" +			
"			</td>\r\n" +
"			<td class='title'>&nbsp;<img src='" + gWebRoot + "/AsiCommon/Controls/Shared/Calendar/images/astrix_orange.jpg' border=0>&nbsp;calendar</td>\r\n" +
"		</tr>\r\n" +
"		<tr>\r\n" +
"			<td colspan=2 align=center class='buttonsCell'><input type=button value='Today' onclick='selectToday()' ID='Button1' NAME='Button1'>&nbsp;&nbsp;" + runDateButton + "<input type='button' value='None' onclick='selectNone()' ID='Button2' NAME='Button2'>&nbsp;&nbsp;<input type='button' value='Close' onclick='closeCalendar()'></td>\r\n" +
"		</tr>\r\n" +
"	</table>\r\n" +
"</div><div id='debugDiv'></div>";
document.writeln(controlHtml);

try
{
	execScript("Function GetFormattedDate(datetime):If Hour(datetime) = 0 And Minute(datetime) = 0 And Second(datetime) = 0 Then GetFormattedDate=FormatDateTime(datetime,2) Else GetFormattedDate=FormatDateTime(datetime,0) End If:End Function","VBScript");
}
catch (e)
{
}
Date.prototype.convertPartialDate = function(partialDate)
{
  var partialDateTimeParts;
  
  partialDateTimeParts = partialDate.split(' ');
  
  this.setHours(0);
  this.setMinutes(0);
  this.setSeconds(0);
  this.setMilliseconds(0);
  if (partialDateTimeParts.length > 1)
  {
    // Set the time first
    // Check for an AM/PM designator attached to the time (no space)
    var time = partialDateTimeParts[1].toUpperCase();
    if (time.indexOf('PM') > -1 || time.indexOf('P.M.') > -1)
    {
      partialDateTimeParts[2] = "PM";
    }
    time = time.replace(/AM|PM|A\.M\.|P\.M\./gi, '');

		// Replace any unexpected punctuation in the time
		time = time.replace(/\./gi, ':');
    var partialTimeParts = time.split(':');
    if (partialTimeParts.length >= 1)
    {
      if (partialDateTimeParts.length > 2 && partialDateTimeParts[2].toUpperCase() == "PM")
      {
        this.setHours(partialTimeParts[0] % 12 + 12);
      }
      else
      {
        this.setHours(partialTimeParts[0] % 12);
      }
  
      if (partialTimeParts.length >= 2)
      {
        this.setMinutes(partialTimeParts[1]);
        if (partialTimeParts.length >= 3)
        {
          this.setSeconds(partialTimeParts[2]);
        }
      }
    }
  }
  
  // Replace any other punctuation with /
  partialDateTimeParts[0] = partialDateTimeParts[0].replace(/-/gi, '/');
  partialDateTimeParts[0] = partialDateTimeParts[0].replace(/\\/gi, '/');
  partialDateTimeParts[0] = partialDateTimeParts[0].replace(/\./gi, '/');
  partialDateTimeParts[0] = partialDateTimeParts[0].replace(/\|/gi, '/');
  partialDateTimeParts[0] = partialDateTimeParts[0].replace(/,/gi, '/');
  partialDateTimeParts[0] = partialDateTimeParts[0].replace(/\+/gi, '/');
  
  // Look to see if there are any separators
  var partialDateParts = partialDateTimeParts[0].split('/');
  
  // Check for the easy case
  if (partialDateParts.length == 1 && parseInt(partialDateParts[0], 10) < 32)
  {
    this.setDate(partialDateParts[0]);
    return;
  }
  
  // Either we have more parts, or there are no separators.
  // Either way get the date format.

  var format = GetCurrentDateFormat();
  
  // If there just weren't any separators, break it up according to format
  // Format will either be mmddyyyy, ddmmyyyy, or yyyymmdd
  if (partialDateParts.length == 1)
  {
    switch (format)
    {
      case "mdy":
      case "dmy":
				if (partialDateParts[0].length == 8)
				{
					partialDateParts = new Array(partialDateParts[0].substring(0, 2), 
																			 partialDateParts[0].substring(2, 4), 
																			 partialDateParts[0].substring(4, 8));
				}
				else if (partialDateParts[0].length == 6)
				{
					partialDateParts = new Array(partialDateParts[0].substring(0, 2), 
																			 partialDateParts[0].substring(2, 4), 
																			 partialDateParts[0].substring(4, 6));
				}
				else
				{
					partialDateParts = new Array(partialDateParts[0].substring(0, 2), 
																			 partialDateParts[0].substring(2, 4));
				}
        break;
      case "ymd":
      case "ydm":
				if (partialDateParts[0].length == 8)
				{
					partialDateParts = new Array(partialDateParts[0].substring(0, 4), 
																			 partialDateParts[0].substring(4, 6), 
																			 partialDateParts[0].substring(6, 8));
				}
				else if (partialDateParts[0].length == 6)
				{
					partialDateParts = new Array(partialDateParts[0].substring(0, 2), 
																			 partialDateParts[0].substring(2, 4), 
																			 partialDateParts[0].substring(4, 6));
				}
				else
				{
					partialDateParts = new Array(partialDateParts[0].substring(0, 2), 
																			 partialDateParts[0].substring(2, 4));
				}
        break;
    }
  }

  var day = 0;
  var month = -1;
  var year = -1;
  switch (format)
  {
    case "mdy":
      if (partialDateParts.length >= 2)
      {
        day = 1;
        month = 0;
        if (partialDateParts.length >= 3)
        {
          year = 2;
        }
      }
      break;
    case "dmy":
      if (partialDateParts.length >= 2)
      {
        day = 0;
        month = 1;
        if (partialDateParts.length >= 3)
        {
          year = 2;
        }
      }
      break;
    case "ymd":
      if (partialDateParts.length >= 3)
      {
        day = 2;
        month = 1;
        year = 0;
      }
      else if (partialDateParts.length >= 2)
      {
        day = 1;
        month = 0;
      }
      break;
    case "ydm":
      if (partialDateParts.length >= 3)
      {
        day = 1;
        month = 2;
        year = 0;
      }
      else if (partialDateParts.length >= 2)
      {
        day = 0;
        month = 1;
      }
      break;
  }

  //alert("format: " + format + "\r\npartialDate: " + partialDate + "\r\npartialDateParts: " + partialDateParts.join('|') + "\r\nday: " + day + "\r\nmonth: " + month + "\r\nyear: " + year);
  if (year > -1) 
  {
    var yearValue = parseInt(partialDateParts[year], 10);
		if (yearValue < 100)
		{
			// 2-digit year; use window of 1931 - 2030
			if (yearValue > 30)
			{
				yearValue += 1900;
			}
			else
			{
				yearValue += 2000;
			}
		}
		// EDM 6/29/2005 - DT - .Net DateTime accepts values between 1 and 9999 for year; SQLServer accepts values between 1753 and 9999.
		if (yearValue < 1753 || yearValue > 9999)
		{
			throw new object();
		}
    this.setFullYear(yearValue);
  }
  if (month > -1)
  {
		// EDM 6/29/2005 - DT 14931 - Set the day to 1 before setting the month, because if (for instance) today is the 31st, 
		// and the month we're setting has < 31 days in it, the current date will cause the month value to be wrong.
		this.setDate(1);
		this.setMonth(parseInt(partialDateParts[month], 10) - 1);
	}
  this.setDate(parseInt(partialDateParts[day], 10));
  
  // Verify that we got the expected values
  if ((year > -1 && yearValue != this.getFullYear()) ||
		  (month > -1 && parseInt(partialDateParts[month], 10) - 1 != this.getMonth()) ||
		  parseInt(partialDateParts[day], 10) != this.getDate())
  {
		throw new object();
  }
}
function GetCurrentDateFormat()
{
  var testDate = new Date(1999, 9, 8);
  var formattedDate;
  try
  {
	formattedDate = GetFormattedDate(testDate.getVarDate());
  }
  catch (e)
  {
	formattedDate = testDate.toLocaleDateString();
  }
  
  // Locate the date parts
  var ixYear = formattedDate.indexOf("99");	// will locate the year whether it's 2-year or 4-year
  var ixMonth = formattedDate.indexOf("10");
  var ixDay = formattedDate.indexOf("8");
  
  var testArray = new Array();
  testArray[ixYear] = 1999;
  testArray[ixMonth] = 10;
  testArray[ixDay] = 8;
  var format = "";
  for (var i = 0; i < testArray.length; i++)
  {
    switch (parseInt(testArray[i], 10))
    {
      case 1999:
        format += "y";
        break;
      case 10:
        format += "m";
        break;
      case 8:
        format += "d";
        break;
    }
  }
  
  return format;
}
function ConvertPartialDate(textbox)
{
	var date = new Date();
	var value = textbox.value;
	if (value.length == 0)
	{
		return;
	}
	if (value.substring(0,1) == "@")
		return;
	try
	{
		date.convertPartialDate(value);
  }
  catch (e)
  {
		alert(textbox.value + " is not a valid date.");
		return;
  }
  if (isNaN(date))
  {
    return;
  }
  try
  {
    textbox.value = GetFormattedDate(date.getVarDate());
  }
  catch (e)
  {
    textbox.value = date.toDateString();
  }
}