function control_gotfocus(ctl, fmt)
{
    var dte = GetDateTime(ctl.value);
    if(dte != null)
    {
        ctl.value=formatDateTime(dte, fmt);
    }
    ctl.select();
}
function control_lostfocus(ctl, fmt)
{
    var str = dt_rtrim(ctl.value);

    if(str == "")
    {
        ctl.value = "";
        return;
    }

    var dte = GetDateTime(ctl.value);
    if(dte == null)
    {
        alert('Invalid date.  Please re-enter.');
        ctl.focus();
        return;
    }

    ctl.value=formatDateTime(dte, fmt);
}

function dt_rtrim(s)
{
	var n;
	for(n=s.length; n>0; n--)
	{
		if(s[n] != " ")
			return s.substr(0,n);
	}
	return s;
}

function getTwoDigitNumber(n)
{
	var x = "0" + String(n);
	return x.substr(x.length - 2,2)
}

function getFourDigitNumber(n)
{
	var x = "0000" + String(n);
	return x.substr(x.length - 4,4)
}

function formatDateTime(dte, fmt)
{
    var h;

    fmt = fmt.replace('MM',getTwoDigitNumber(dte.getMonth()+1));
    fmt = fmt.replace('M',dte.getMonth()+1);
    fmt = fmt.replace('dd',getTwoDigitNumber(dte.getDate()));
    fmt = fmt.replace('d',dte.getDate());
    fmt = fmt.replace('yyyy',getFourDigitNumber(dte.getFullYear()));
    fmt = fmt.replace('y',dte.getFullYear());

    h = dte.getHours() % 12;
    if(h == 0) h = 12;
    if((fmt.indexOf("t")>=0) || (fmt.indexOf("T")>=0))
        fmt = fmt.replace('hh',getTwoDigitNumber( h ));
    else
        fmt = fmt.replace('hh',getTwoDigitNumber(dte.getHours()));
    fmt = fmt.replace('h',dte.getHours());
    fmt = fmt.replace('mm',getTwoDigitNumber(dte.getMinutes()));
    fmt = fmt.replace('m',dte.getMinutes());
    fmt = fmt.replace('ss',getTwoDigitNumber(dte.getSeconds()));
    fmt = fmt.replace('s',dte.getSeconds());

    if(dte.getHours()>=12)
    {
        fmt = fmt.replace('tt',"PM");
        fmt = fmt.replace('t',"P");
    }
    else
    {
        fmt = fmt.replace('tt',"AM");
        fmt = fmt.replace('t',"A");
    }
    return fmt;
}

function GetDateTime(text)
{
	var d,t,s,i;

	s = String(text);
	// if the entered value contains a space
	// then it must be entered date<space>time
	i = s.indexOf(" ");
	if(i>0)
	{
		d = s.substr(0, i);
		t = dt_rtrim(s.substr(i+1, s.length - i - 1));
		d = GetDate(d);
		if(t.length > 0) d = GetTime(t,d);
	}
	else	// otherwise it is only a date
	{
		if(s.length > 0)
		{
		    d = GetDate(s);
		}
	}
	return d;
}

function AddDays(date, days)
{
	var month,day,year,hour,minute,second, dayOffset, monthIndex;
	var maxdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	month = date.getMonth();
	day = date.getDate();
	year = date.getYear();

	if((year % 400 == 0) || (((year % 4) == 0) && ((year % 100) != 0)))
		maxdays[1] = 29;

	monthIndex = month;
	dayOffset = day + days;

    // If we're subtracting days, then go backward through the months.
    //   Use the increment value to put the proper value against the increment.
    if(dayOffset < 0) 
    {
        // First pass through the loop needs to go to previous month since we are already taking in
        //   to consideration the days left in the current month.
        while(dayOffset <= 0)
        {
            monthIndex--;
            if(monthIndex < 0)
            {
                monthIndex = 11;
                year--;
            }
    	    dayOffset = dayOffset + maxdays[monthIndex];
        }
    }
    else
    {   
	    while(dayOffset > maxdays[monthIndex])
	    {
	        dayOffset = dayOffset - maxdays[monthIndex];
    	    
	        monthIndex++;            
            if(monthIndex > 11) //fyi - zero based month
	        {
	            monthIndex = 0;
	            year++;
	        }
	    }
	
    }
		
	day = dayOffset;
	month = monthIndex;
	
    return new Date(year, month, day);	
}
function GetDate(s)
{
	var month,day,year,hour,minute,second;
	var maxdays = new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
	
	if(s.indexOf("/")>0)
	{
		s = s.split("/");
		if(s.length == 3)
		{
			month = Number(s[0]);
			day = Number(s[1]);
			year = Number(s[2]);
		}
		else
            return null;
	}
	else
	{
		if((s.length == 6) || (s.length == 8))
		{
			month = s.substr(0,2);
			day = s.substr(2,2);
			year = s.substr(4,4);
		}
		else
    		return null;
	}
	
	month = Number(month);
	day = Number(day);
	year = Number(year);
	
	if((year % 400 == 0) || (((year % 4) == 0) && ((year % 100) != 0)))
		maxdays[2] = 29;

	if((month < 1) || (month > 12))
	    return null;

	if((day < 1) || (day > maxdays[month]))
	    return null;

	if(year < 50)
		year += 2000;
	else
		if(year < 100)
			year += 1900;
	return new Date(year, month - 1, day);
}

function GetTime(s,d)
{
	var hour,minute=0,second=0;
	var is_afternoon = false;
	s = s.toLowerCase();
	if(s.indexOf("p")>0)
	    is_afternoon = true;
    s = s.replace("a","");
    s = s.replace("m","");
    s = s.replace("p","");
    s = s.replace(" ","");
	
	
	if(s.indexOf(":")>0)
	{
		s = s.split(":");
		if(s.length == 3)
		{
			hour = Number(s[0]);
			minute = Number(s[1]);
			second = Number(s[2]);
		}
		else
		{
			if(s.length == 2)
			{
				hour = Number(s[0]);
				minute = Number(s[1]);
			}
			else
			{
				if(s.length == 1)
					hour = Number(s[0]);
				else
				    return null;
			}
		}
	}
	else
	{
		if(s.length >= 6)
		{
			hour = s.substr(0,2);
			minute = s.substr(2,2);
			second = s.substr(4,2);
		}
		else
		{
			if(s.length >= 4)
			{
				hour = s.substr(0,2);
				minute = s.substr(2,2);
			}
			else
			{
				if(s.length >= 2)
					hour = s.substr(0,2);
				else
				    return null;
			}
		}
	}
	
	hour = Number(hour);
	minute = Number(minute);
	second = Number(second);
	
	if((is_afternoon) && (hour < 12))
	    hour += 12;
	    
	if((hour < 0) || (hour > 23) || (minute < 0) || (minute > 59) || (second < 0) || (second > 59))
	    return null;

	return new Date(d.getYear(), d.getMonth(), d.getDate(), hour, minute, second);
}

