var monthnames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
	daynames = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
	
function timeControl( name, val, useids, withblank )
{
	var d = new Date( val ),
		i;

	d.setSeconds( d.getSeconds() + 29 );

	var h = d.getHours(),
		m = d.getMinutes(),
		ampm = "am";

	if ( h >= 12 ) ampm = "pm";
	if ( h > 12 ) h-= 12;

	var s = "<select class=\"timecontrol\" " + (useids ? "id=\"" + name + "h\" " : "") + "name=\"" + name + "h\">" +
				(withblank ? "<option/>" : "");
	for ( i = 0 ; i <= 12 ; i++ )
		s += "<option" + (h == i ? " selected=\"selected\"" : "") + ">" + i + "</option>";
	s+= "</select>" +
			"<select class=\"timecontrol\" " + (useids ? "id=\"" + name + "m\" " : "") + "name=\"" + name + "m\">" +
			(withblank ? "<option/>" : "");
	for ( i = 0 ; i < 10 ; i += 5 )
		s += "<option" + (m == i ? " selected=\"selected\"" : "") + ">0" + i + "</option>";
	for ( i = 10 ; i < 59 ; i += 5 )
		s += "<option" + (m == i ? " selected=\"selected\"" : "") + ">" + i + "</option>";
	s += "</select>" +
		"<select class=\"timecontrol\" " + (useids ? "id=\"" + name + "a\" " : "") + "name=\"" + name + "a\">" +
			"<option value=\"0\"" + (ampm == "am" ? " selected=\"true\"" : "") + ">am</option>" +
			"<option value=\"1\"" + (ampm == "pm" ? " selected=\"true\"" : "") + ">pm</option>" +
		"</select>";

	return s;
}

function timeControlRead( parent, name )
{
	if ( parent == null )
		parent = $( "body" );

	var h = parseInt( parent.find( "select[name=" + name + "h]" ).val() ),
		m = parseInt( parent.find( "select[name=" + name + "m]" ).val() ),
		a = parseInt( parent.find( "select[name=" + name + "a]" ).val() ),
		d = new Date();

	if ( isNaN( h ) ) h = 0;
	if ( isNaN( m ) ) m = 0;

	if ( h == 12 )
	    h = 0;

	d.setHours( a > 0 ? h + 12 : h );
	d.setMinutes( m );
		
	return d;
}

function DateControl( name, val, withnulls, noids, fromyear, toyear )
{
	function StringWriter()
	{
		var s = "";
		this.Write = function( n ) { s += n; }
		this.toString = function() { return s; }
	}

	if ( typeof( withnulls ) != "boolean" )
		withnulls = false;

	var d = new Date( val );
	var day = d.getDate();
	var month = d.getMonth() + 1;
	var year = d.getFullYear();
	
	var s = new StringWriter();
	
	s.Write( "<select " + (noids ? "" : "id=\"day" + name + "\"") + " name=\"day" + name + "\">" 
			+ (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;
	s.Write( "<select " + (noids ? "" : "id=\"month" + name + "\"") + " name=\"month" + name + "\">"
			+ (withnulls ? "<option></option>"  : "") );
	for ( i = 1 ; i <= 12 ; i++ )
		s.Write( "<option " + (val != null && month == i ? "selected ":"")
							+ "value=" + i + ">" + m[ i - 1 ] + "</option>" );
	s.Write( "</select>" );
	
	if ( fromyear == null )
	    fromyear = 1999;
	if ( toyear == null )
	    toyear = (new Date()).getFullYear() + 10;
	
	if ( val != undefined && fromyear > year )
	    fromyear = year;
	
	s.Write( "<select name=\"year" + name + "\"" + (noids ? "" : " id=\"year" + name + "\"") + ">"
		+ (withnulls ? "<option></option>" : "") );
	for ( var y = fromyear ; y <= toyear ; y++ )
		s.Write( "<option value=" + y
			+ (year == y ? " selected=\"true\"" : "")
			+ ">" + y + "</option>" );
	s.Write( "</select>" );
	
	return s.toString();
}

function DateControlRead( id, parent )
{
	var eday = $("#day" + id).val(),
		emonth = $("#month" + id).val(),
		eyear = $("#year" + id).val();
		
    if ( parent != null )
    {
        eday = parent.find( "select[name=day" + id + "]" ).val();
		emonth = parent.find( "select[name=month" + id + "]" ).val();
		eyear = parent.find( "select[name=year" + id + "]" ).val();
    }
	
	if ( eday == "" && emonth == "" && eyear == "" )
		return null;
		
	emonth = parseInt( emonth );
	
	if ( eday == "" )
		eday = 1;
	if ( isNaN( emonth ) )
		emonth = 1;
	if ( eyear == "" )
		eyear = (new Date()).getFullYear();
		
	return new Date( emonth + "/" + eday + "/" + eyear );
}

function TimeControl( name, val )
{
	var d = new Date( val );
	
	d.setSeconds( d.getSeconds() + 29 );
	
	var h = d.getHours(),
		m = d.getMinutes();
		
	var ampm = "am";
	
	if ( h >= 12 ) ampm = "pm";
	if ( h > 12 ) h-= 12;

	if ( val == undefined )
	{
		h = null;
		m = null;
		ampm = "am";
	}

	var s = "<select id=\"hour" + name + "\" name=\"hour" + name + "\"><option value=\"-1\"/>";
	for ( var i = 0 ; i <= 12 ; i++ )
		s += "<option" + (h == i ? " selected=\"selected\"" : "") + ">" + i + "</option>";
	s += "</select>" +
		"<select id=\"min" + name + "\" name=\"min" + name + "\"><option value=\"-1\"/>";
	for ( i = 0 ; i < 10 ; i += 5 )
		s += "<option" + (m == i ? " selected=\"selected\"" : "") + ">0" + i + "</option>";
	for ( i = 10 ; i < 59 ; i += 5 )
		s += "<option" + (m == i ? " selected=\"selected\"" : "") + ">" + i + "</option>";
	s += "</select>" +
		"<select id=\"am" + name + "\" name=\"am" + name + "\">" +
			"<option value=\"0\"" + (ampm == "am" ? " selected=\"selected\"" : "") + ">am</option>" +
			"<option value=\"1\"" + (ampm == "pm" ? " selected=\"selected\"" : "") + ">pm</option>" +
		"</select>";
		
	return s;
}

function TimeControlRead( name )
{
	var h = parseInt( $("#hour" + name).val() ),
		m = parseInt( $("#min" + name).val() ),
		a = $("#am" + name).val(),
		d = new Date();
		
    if ( h < 0 )
        return null;
		
	if ( h == 12 ) 
	    h = 0;
		
    d.setSeconds( 0 );
    d.setMilliseconds( 0 );
	d.setHours( a == 1 || a == "pm" || a == "PM" ? h + 12 : h );
	d.setMinutes( m );
		
	return d;
}

function DateTimeControl( name, val )
{
    return DateControl( name, val, true ) + " " + TimeControl( name, val );
}

function DateTimeControlRead( name )
{
    var date = DateControlRead( name ),
        time = TimeControlRead( name );
        
    if ( date != null && time != null )
    {
        date.setHours( time.getHours() )
        date.setMinutes( time.getMinutes() );
    }
    
    return date;
}

function isValidDate( d )
{
    if ( d == null || Object.prototype.toString.call( d ) != "[object Date]" )
        return false;

    return !isNaN(d.getTime());
}

function toDateString( d )
{
	if ( !isValidDate( d ) )
		return "";

	return (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
}

function toDateTimeString( d, forhuman ) // for ajax posts
{
	if ( !isValidDate( d ) )
		return "";

	if ( forhuman )
		return (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear() + " " + d.getHours() + ":" + (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes());

	return (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes();
}

