function VDateOrNull( c )
{
	var d = c.value;

	if ( d == '' )
		return true;
		
	if ( isNaN( Date.parse( d ) ) )
	{
		alert( 'Please enter dates in the form "month/Day/Year", for example, "10/24/00".' );
		c.focus();
		return false;
	}
	
	return true;
}

function VDate( c )
{
	var d = c.value;

	if ( d == '' || isNaN( Date.parse( d ) ) )
	{
		alert( 'Please enter dates in the form "month/Day/Year", for example, "10/24/00".' );
		c.focus();
		return false;
	}
	
	return true;
}

function DateString( e, showTime, format )
{
	if ( e == null )
		return null;

	var Pad2 = new Function( 't', "t = '' + t; while ( t.length < 2 ) t = '0' + t; return t;" );
	if ( typeof( e ) == 'undefined' ) 
		e = new Date();
		
	if ( typeof( e ) == 'string' )
	{
		// remove Time Zone designation
		var toreplace = [ /[PCE][SD]T/gi ];
		for ( var i = 0 ; i < toreplace.length ; i++ )
			e = e.replace( toreplace[ i ], '' );
				
		//alert( e );
	}
	
	var d = new Date( e );
	
	if ( typeof( showTime ) != 'boolean' )
		showTime = false;

	if ( typeof( format ) == 'undefined' )
		format = 'short';
		
	var day = '';
	switch ( format )
	{
		case 'time':
			break;
		
		case 'realshort':
		{
			day = MonthName( d.getMonth(), false ) + ' ' + d.getDate();
			break;
		}
		
		case 'short':
		{
			day = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
			break;
		}
		
		case 'medium':
		{
			day = MonthName( d.getMonth() ) + ' ' + d.getDate() + ', ' + d.getFullYear();
			break;
		}
		
		case 'full':
		{
			var months = MonthNames( true );
			var dayname = '' + d.getDate();
			var day = months[ d.getMonth() ];
			
			if ( dayname == '1' || dayname == '21' || dayname == '31' )
				dayname = dayname + 'st';
			else if ( dayname == '2' || dayname == '22' )
				dayname = dayname + 'nd';
			else if ( dayname == '3' || dayname == '23' )
				dayname = dayname + 'rd';
			else
				dayname = dayname + 'th';
			
			day += ' ' + dayname + ', ' + d.getFullYear();
			break;
		}
		
		case 'long':
		{
			var weekdayname = (new Array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 
											'Thursday', 'Friday', 'Saturday' ))[ d.getDay() ];
			return weekdayname + ', ' + DateString( d, showTime, 'full' );
		}

		case 'database':
		{
			return d.getFullYear() + '-' + Pad2( (d.getMonth() + 1) ) + '-' + Pad2( d.getDate() )
				+ ' ' + Pad2( d.getHours() ) + ':' + Pad2( d.getMinutes() ) + ':' + Pad2( d.getSeconds() );
		}
	}
	
	if ( showTime )
	{
		var hours = d.getHours();
		var when = 'am';
		if ( hours > 11 )
			when = 'pm';
		if ( hours > 12 )
			hours -= 12;
			
		if ( hours == 0 )
			hours = 12, when = 'pm';
		var time = hours + ':' + Pad2( d.getMinutes() ) + when;
			
		return ( day == '' ? '' : day + ' ' ) + time;
	}	
	
	return day;
}

function MonthNames( full )
{
	if ( full )
		return new Array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' );
	else
		return new Array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' );
}

function MonthName( m, full )
{
	var monthNames = MonthNames( typeof( full ) == 'boolean' && full )
	return monthNames[ m ];
}

function DOMDateControl( name, val, withnulls )
{
	if ( typeof( withnulls ) != 'boolean' )
		withnulls = false;
		
	var d = new Date( val );
	var day = d.getDate();
	var month = d.getMonth();
	var year = d.getFullYear();
	
	var s = new StringStream();
	
	s.Write( '<select id=' + name + 'date name=' + name + 'date class=iv>' 
			+ (withnulls ? '<option></option>' : '' ) );
	for ( var i = 1 ; i <= 31 ; i++ )
		s.Write( '<option ' + (val != null && day == i ? 'selected ':'') 
							+ 'value=' + i + '>' + i + '</option>' );
	s.Write( '</select>' );
	
	var m = MonthNames( true );
	s.Write( '<select id=' + name + 'month name=' + name + 'month class=iv>'
			+ (withnulls ? '<option></option>'  : '') );
	for ( var i = 0 ; i < 12 ; i++ )
		s.Write( '<option ' + (val != null && month == i ? 'selected ':'')
							+ 'value=' + i + '>' + m[ i ] + '</option>' );
	s.Write( '</select>' );
	
	s.Write( '<select name=' + name + 'year id=' + name + 'year class=iv>'
		+ (withnulls ? '<option></option>' : '') );
	for ( var y = 1999 ; y < 2020 ; y++ )
		s.Write( '<option value=' + y
			+ (year == y ? ' selected' : '')
			+ '>' + y + '</option>' );
	s.Write( '</select>' );
	
	return s.String();
}

function DOMDateControlRead( id )
{
	var eday = GetElement( id + 'date' ).value;
	var emonth = GetElement( id + 'month' ).value;
	var eyear = GetElement( id + 'year' ).value;
	
	if ( eday == '' && emonth == '' && eyear == '' )
		return null;
		
	emonth = parseInt( emonth );
	
	if ( eday == '' )
		eday = 1;
	if ( isNaN( emonth ) )
		emonth = 0;
	if ( eyear == '' )
		eyear = (new Date()).getFullYear();
		
	return (emonth + 1) + '/' + eday + '/' + eyear;
}

function DOMTimeControl( name, val, withnulls )
{
	var d = (val ? new Date( val ) : new Date());
	d.setSeconds( d.getSeconds() + 29 );
	var h = d.getHours();
	var m = d.getMinutes();
	m = m - (m % 5);
	var ampm = 'am';
	if ( h > 12 )
		h -= 12, ampm = 'pm';

	var s = new StringStream();
	
	s.Write( '<select name=' + name + 'h id=' + name + 'h class=iv>'
			+ (withnulls ? '<option/>' : '') );
	for ( var i = 0 ; i <= 12 ; i++ )
		s.Write( '<option value=' + i + (h == i ? ' selected':'') + '>' + i + '</option>' );
	s.Write( '</select><select name=' + name + 'm id=' + name + 'm class=iv>'
				+ (withnulls ? '<option/>' : '') );
	for ( var i = 0 ; i < 10 ; i += 5 )
		s.Write( '<option value=' + i + (m == i ? ' selected':'') + '>0' + i + '</option>' );
	for ( var i = 10 ; i < 59 ; i += 5 )
		s.Write( '<option value=' + i + (m == i ? ' selected':'') + '>' + i + '</option>' );
	s.Write( '</select><select name=' + name + 'ampm id=' + name + 'ampm class=iv>'
		+ '<option value=0' + (ampm=='am'?' selected':'') + '>am</option>'
		+ '<option value=1' + (ampm=='pm'?' selected':'') + '>pm</option>'
		+ '</select>' );
		
	return s.String();
}

function DOMReadTimeControl( name )
{
	var h = GetElement( name + 'h' ).value;
	var m = GetElement( name + 'm' ).value;
	var a = GetElement( name + 'ampm' ).value;
		
	if ( h == '' )
		return null;
		
	h = parseInt( h );
	m = parseInt( m );
		
	if ( a > 0 )
		h += 12;
		
	var d = new Date();
	d.setHours( h );
	d.setMinutes( m );
		
	return d;
}

