//Like the JavaScript date class, but with some additional methods
function DateTime( year, month, day, hour, minute, second )
{
	var _arguments = arguments;	
	var _dateTime;	

	initialize();
	
	//Expose public methods
	this.setDateTime = setDateTime;
	this.getDateTime = getDateTime;
	this.format = format;
	this.addYear = addYear;
	this.addMonth = addMonth;
	this.addDay = addDay;
	this.addHour = addHour;
	this.addMinute = addMinute;
	this.addSecond = addSecond;
	this.moveNextWeekday = moveNextWeekday;
	this.movePreviousWeekday = movePreviousWeekday;
	this.getYear = getYear;
	this.getMonth = getMonth;
	this.getDay = getDay;
	this.getHour = getHour;
	this.getMinute = getMinute;
	this.getSecond = getSecond;
	this.setYear = setYear;
	this.setMonth = setMonth;
	this.setDay = setDay;
	this.setHour = setHour;
	this.setMinute = setMinute;
	this.setSecond = setSecond;
	this.getDaysInMonth = getDaysInMonth;
	
	function initialize()
	{
		switch( _arguments.length )
		{
			case 0:
				_dateTime = new Date();
				break;
			case 1:
				_dateTime = new Date( _arguments[0] );
				break;
			case 2:
				_dateTime = new Date( _arguments[0], _arguments[1] );
				break;
			case 3:
				_dateTime = new Date( _arguments[0], _arguments[1], _arguments[2] );
				break;
			case 4:
				_dateTime = new Date( _arguments[0], _arguments[1], _arguments[2], _arguments[3] );
				break;
			case 5:
				_dateTime = new Date( _arguments[0], _arguments[1], _arguments[2], _arguments[3], _arguments[4] );
				break;
			default:
				_dateTime = new Date( _arguments[0], _arguments[1], _arguments[2], _arguments[3], _arguments[4], _arguments[5] );
				break;
		}
	}

	function getDateTime()
	{
		return new Date( _dateTime );
	}
	
	function setDateTime( value )
	{
		_dateTime = new Date(value);
	}
	
	function format( format )
	{
		var ret = format;
		if( ret == 'T' ){ ret = 'hh:mm:ss' } 
		if( ret == 't' ){ ret = 'hh:mm' }  
		if( ret == 'D' ){ ret = 'dddd, dd MMMM yyyy' } 
		if( ret == 'd' ){ ret = 'dd/MM/yyyy' }
		if( ret == 'F' ){ ret = 'dddd, dd MMMM yyyy hh:mm:ss' }
		if( ret == 'f' ){ ret = 'dddd, dd MMMM yyyy hh:mm' }
		if( ret == 'G' ){ ret = 'dd/MM/yyyy hh:mm:ss' }
		if( ret == 'g' ){ ret = 'dd/MM/yyyy hh:mm' }
		
		var months = new Array( 'Januar', 'Februar', 'Marz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' );
		var days = new Array( ' Sonntag', ' Montag', ' Dienstag', ' Mittwoch', ' Donnerstag', ' Freitag', ' Samstag' );
		var yyyy = new String(_dateTime.getFullYear());
		var yy = yyyy.substr(2,2);
		var M = new String(_dateTime.getMonth() + 1);
		var MMMM = months[M - 1];
		var MMM = MMMM.substr(0,3);
		var weekDayNumber = _dateTime.getDay();
		var dddd = days[weekDayNumber];
		var ddd = dddd.substr(0,3);
		var d = new String(_dateTime.getDate());
		var h = new String(_dateTime.getHours());
		var m = new String(_dateTime.getMinutes());
		var s = new String(_dateTime.getSeconds());
		
		//this is necessary to prevent March turning into 3arch
		ret = ret.replace( 'MMMM', 'AAAA' );
		ret = ret.replace( 'MMM', 'AAA' );
		ret = ret.replace( 'dddd', 'BBBB' );
		ret = ret.replace( 'ddd', 'BBB' );
		
		var ampm = '';
		if( ret.search( /ampm/gi ) != -1 )
		{
			if( _dateTime.getHours() < 12 )	{ampm = 'am' } else {ampm = 'pm'}
			if( _dateTime.getHours() > 12 ){ h = new String(_dateTime.getHours() - 12) };
			//The case of AMPM is important for future replacements
			ret = ret.replace( /ampm/gi, 'AMPM' );
		}
	
		//Do time first because mmm and mmmm can produce replacable strings
		//Regex replace /gi = global + case-insensitive
		ret = ret.replace( 'hh', pad(h,2) );
		ret = ret.replace( 'h', h );
		ret = ret.replace( 'mm', pad(m,2) );
		ret = ret.replace( 'm', m );
		ret = ret.replace( 'ss', pad(s,2) );
		ret = ret.replace( 's', s );
		ret = ret.replace( 'yyyy', yyyy );
		ret = ret.replace( 'yy', yy );
		ret = ret.replace( 'dd', pad(d,2) );
		ret = ret.replace( 'd', d );
		ret = ret.replace( 'MM', pad(M,2) );
		ret = ret.replace( 'M', M );
		ret = ret.replace( 'BBBB', dddd );
		ret = ret.replace( 'BBB', dddd.substr(0,3));
		ret = ret.replace( 'AAAA', MMMM );
		ret = ret.replace( 'AAA', MMM );
		ret = ret.replace( 'AMPM', ampm );
		return ret;
	}
	
	function addYear( number )
	{
		_dateTime.setFullYear( _dateTime.getFullYear() + number );
		return this;
	}
	
	function addMonth( number )
	{
		_dateTime.setMonth( _dateTime.getMonth() + number );
		return this;
	}
	
	function addDay( number )
	{
		_dateTime.setDate( _dateTime.getDate() + number );
		return this;
	}
	
	function addHour( number )
	{
		_dateTime.setHours( _dateTime.getHours() + number );
		return this;
	}
	
	function addMinute( number )
	{
		_dateTime.setMinutes( _dateTime.getMinutes() + number );
		return this;
	}
	
	function addSecond( number )
	{
		_dateTime.setSeconds( _dateTime.getSeconds() + number );
		return this;
	}
	
	function setYear( value )
	{
		_dateTime.setFullYear( value );
	}
	
	function setMonth( value )
	{
		_dateTime.setMonth( value );
	}
	
	function setDay( value )
	{
		_dateTime.setDate( value );
	}
	
	function setHour( value )
	{
		_dateTime.setHours( value );
	}
	
	function setMinute( value )
	{
		_dateTime.setMinutes( value );
	}
	
	function setSecond( value )
	{
		_dateTime.setSeconds( value );
	}
	
	function getYear()
	{
		return _dateTime.getFullYear();
	}
	
	function getMonth()
	{
		return _dateTime.getMonth();
	}
	
	function getDay()
	{
		return _dateTime.getDate();
	}
	
	function getHour()
	{
		return _dateTime.getHours();
	}
	
	function getMinute()
	{
		return _dateTime.getMinutes();
	}
	
	function getSecond()
	{
		return _dateTime.getSeconds();
	}
	
	function getDaysInMonth()
	{
		var _temp = new Date( _dateTime );
		_temp.setDate( 1 );
		_temp.setMonth( _temp.getMonth() + 1 );
		_temp.setDate( _temp.getDate() - 1 );
		return _temp.getDate();
	}
	
	function moveNextWeekday( weekday) 
	{
		if( weekday < 0 || weekday > 6 )
		{
			throw( 'Invalid weekday' );
		}
		while( _dateTime.getDay() != weekday )
		{
			addDay( 1 );
		}
		return this;
	}
	
	function movePreviousWeekday( weekday ) 
	{
		if( weekday < 0 || weekday > 6 )
		{
			throw( 'Invalid weekday' );
		} 
		while( _dateTime.getDay() != weekday )
		{
			addDay( -1 );
		}
		return this;
	}
	
	
	function pad( value, length )
	{ 
		var ret = new String( value );
		while( ret.length < length )
		{
			ret = '0' + ret;
		}
		return ret;
	} 
}



