//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2008)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: date.inl
//      Краткое описание: date representation
//

namespace ker
{
	inline Date::Date()
	{
		setDate(1, 1);
	};

	inline Date::Date(const unsigned char month, const unsigned char day)
	{
		setDate(month, day);
	};

	inline Date::Date(const unsigned short day_number)
	{
		setDayNumber(day_number);
	};

	inline Date::Date(const Date& date)
	{
		month = date.getMonth();
		day_of_month = date.getDay();
		day_number = date.getDayNumber();
	};

	inline Date::~Date()
	{

	};

	inline Date& Date::operator =(const Date& date)
	{
		month = date.getMonth();
		day_of_month = date.getDay();
		day_number = date.getDayNumber();
		return *this;
	};

	inline bool Date::operator <(const Date& date) const
	{
		return day_number < date.getDayNumber();
	};

	inline void Date::_calculateDayNumber()
	{
		if(month > 12)
			return;
		day_number = day_from_year_start[month-1] + day_of_month;
	};

	inline void Date::setDay(const unsigned char new_day)
	{
		setDate(month, new_day);
	};

	inline void Date::setMonth(const unsigned char new_month)
	{
		setDate(new_month, day_of_month);
	};

	inline void Date::setDate(const unsigned char new_month, const unsigned char new_day)
	{
		month = new_month;
		day_of_month = new_day;
		_calculateDayNumber();
	};

	inline void Date::setDayNumber(const unsigned short new_day_number)
	{
		day_number = new_day_number;
		for(unsigned int i = 0; i < 12; ++i)
		{
			if(day_from_year_start[i] + day_in_month[i] > new_day_number)
			{
				month = i + 1;
				day_of_month = new_day_number - day_from_year_start[i];
				return;
			};
		};
		// если дошли до сюда, то у нас неверный номер дня
		day_number = 1;
		month = 1;
		day_of_month = 1;
	};

	inline const unsigned char Date::getDay() const
	{
		return day_of_month;
	};

	inline const unsigned char Date::getMonth() const
	{
		return month;
	};

	inline const unsigned short Date::getDayNumber() const
	{
		return day_number;
	};

	inline std::ostream& operator<<(std::ostream& os, const Date& date)
	{
		os << date.getMonth() << "." << date.getDay();
	};
};