<?php
/* 
 * phpMyVisites : website statistics and audience measurements
 * Copyright (C) 2002 - 2006
 * http://www.phpmyvisites.net/ 
 * phpMyVisites is free software (license GNU/GPL)
 * Authors : phpMyVisites team
*/

// $Id: Date.class.php 29 2006-08-18 07:35:21Z matthieu_ $


/**
 * Class generic used for all date in the format YYYY-MM-DD
 */
class Date {
	
	/**
	 * @var array 
	 */
	var $info;
		
	/**
	 * Constructor 
	 * 
	 * @param string $s_date
	 */
	function Date($s_date)
	{
		$s_date = $this->getValidDate($s_date);
		$this->loadInfo($s_date);		
	}	
	
	function getValidDate($s_date)
	{
		if( strlen($s_date) === 10
			&& ($e = explode('-', $s_date)) 
			&& sizeof($e) === 3
			&& strlen($e[0]) === 4
			&& is_numeric($e[0])
			&& strlen($e[1]) === 2
			&& is_numeric($e[1])
			&& strlen($e[2]) === 2
			&& is_numeric($e[2])
		)
		{
			return $s_date;
		}
		else
		{
			return getDateFromTimestamp(time());
		}
	} 
	
	function loadInfo($s_date)
	{
		$this->date = $s_date;
		$this->info = $this->getInfo();
	}
	/**
	 * returns date info array
	 * 
	 * @access private
	 * @return array
	 */
	function getInfo()
	{
		$d = explode('-', $this->date);
		$timestamp = mktime(23,59,59, $d[1], $d[2], $d[0]);
		$week = date("W", $timestamp);
		$weekDayNumber = date("w", $timestamp);
		return array('year'=>$d[0], 'month'=>$d[1], 'day'=>$d[2], 'timestamp'=>$timestamp, 'week'=>$week,
				'weekDayNumber'=>$weekDayNumber);
	}

	function setTimestamp($ts)
	{
		$this->loadInfo(getDateFromTimestamp($ts));
	}
	
	function setDate($s_date)
	{
		$this->loadInfo($s_date);
	}
	
	function getWeekDayNumber()
	{
		return $this->info['weekDayNumber'];
	}
	
	/**
	 * returns date YYYY-MM-DD
	 * 
	 * @return string 
	 */
	function get()
	{
		return $this->info['year']."-".$this->info['month']."-".$this->info['day'];
	}	
	
	/**
	 * returns timestamp
	 * 
	 * @return string 
	 */
	function getTimestamp()
	{
		return $this->info['timestamp'];
	}

	/**
	 * returns day
	 * 
	 * @return string
	 */
	function getDay()
	{
		return $this->info['day'];
	}	
	
	/**
	 * returns month
	 * 
	 * @return string
	 */
	function getMonth()
	{
		return $this->info['month'];
	}
	
	/**
	 * returns year
	 * 
	 * @return string
	 */
	function getYear()
	{
		return $this->info['year'];
	}
	
	/**
	 * returns ISO-8601 week number of year, weeks starting on Monday
	 * 
	 * @return string
	 */
	function getWeek()
	{
		return $this->info['week'];
	}
	
	/**
	 * returns true if the period of the object calling this method is finished
	 * 
	 * @param int $period
	 * 
	 * @return bool
	 */
	function isPeriodFinished($period)
	{
		if($period === DB_ARCHIVES_PERIOD_DAY)
		{
			return $this->isDayFinished();
		}
		else if($period === DB_ARCHIVES_PERIOD_MONTH)
		{
			return $this->isMonthFinished();
		}
		else
		{
			print("Period asked in isPeriodFinished UNKNOWN<br>");
			return true;
		}
	}
	
	/**
	 * returns true if day of period is older than today
	 * 
	 * @access private
	 * @return bool
	 */
	function isDayFinished()
	{
		if($this->getTimestamp() < time())
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	* returns true if month of period is older than current month
	* 
	* @access private
	* @return bool
	*/
	function isMonthFinished()
	{
		if($this->getYear() == date("Y") && $this->getMonth() >= date("m"))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	 /**
	 * Adds x days to date  
	 * Works with daylight saving time
	 */
	 function addDays($nbDaysToAdd)
	 {
	   $this->setTimestamp(mktime(23, 59, 59, $this->info['month'] , $this->info['day'] + $nbDaysToAdd, $this->info['year']));
	 }
}
?>