| // | Lorenzo Alberton | // +----------------------------------------------------------------------+ // // $Id: Week.php,v 1.7 2005/10/22 10:26:49 quipo Exp $ // /** * @package Calendar * @version $Id: Week.php,v 1.7 2005/10/22 10:26:49 quipo Exp $ */ /** * Allows Calendar include path to be redefined * @ignore */ if (!defined('CALENDAR_ROOT')) { define('CALENDAR_ROOT', 'Calendar'.DIRECTORY_SEPARATOR); } /** * Load Calendar base class */ require_once CALENDAR_ROOT.'Calendar.php'; /** * Represents a Week and builds Days in tabular format
* * require_once 'Calendar'.DIRECTORY_SEPARATOR.'Week.php'; * $Week = & new Calendar_Week(2003, 10, 1); Oct 2003, 1st tabular week * echo ''; * while ($Day = & $Week->fetch()) { * if ($Day->isEmpty()) { * echo ' '; * } else { * echo ''.$Day->thisDay().''; * } * } * echo ''; * * @package Calendar * @access public */ class Calendar_Week extends Calendar { /** * Instance of Calendar_Table_Helper * @var Calendar_Table_Helper * @access private */ var $tableHelper; /** * Stores the timestamp of the first day of this week * @access private * @var object */ var $thisWeek; /** * Stores the timestamp of first day of previous week * @access private * @var object */ var $prevWeek; /** * Stores the timestamp of first day of next week * @access private * @var object */ var $nextWeek; /** * Used by build() to set empty days * @access private * @var boolean */ var $firstWeek = false; /** * Used by build() to set empty days * @access private * @var boolean */ var $lastWeek = false; /** * First day of the week (0=sunday, 1=monday...) * @access private * @var boolean */ var $firstDay = 1; /** * Constructs Week * @param int year e.g. 2003 * @param int month e.g. 5 * @param int a day of the desired week * @param int (optional) first day of week (e.g. 0 for Sunday, 2 for Tuesday etc.) * @access public */ function Calendar_Week($y, $m, $d, $firstDay=null) { require_once CALENDAR_ROOT.'Table/Helper.php'; Calendar::Calendar($y, $m, $d); $this->firstDay = $this->defineFirstDayOfWeek($firstDay); $this->tableHelper = new Calendar_Table_Helper($this, $this->firstDay); $this->thisWeek = $this->tableHelper->getWeekStart($y, $m, $d, $this->firstDay); $this->prevWeek = $this->tableHelper->getWeekStart($y, $m, $d - $this->cE->getDaysInWeek( $this->thisYear(), $this->thisMonth(), $this->thisDay()), $this->firstDay); $this->nextWeek = $this->tableHelper->getWeekStart($y, $m, $d + $this->cE->getDaysInWeek( $this->thisYear(), $this->thisMonth(), $this->thisDay()), $this->firstDay); } /** * Defines the calendar by a timestamp (Unix or ISO-8601), replacing values * passed to the constructor * @param int|string Unix or ISO-8601 timestamp * @return void * @access public */ function setTimestamp($ts) { parent::setTimestamp($ts); $this->thisWeek = $this->tableHelper->getWeekStart( $this->year, $this->month, $this->day, $this->firstDay ); $this->prevWeek = $this->tableHelper->getWeekStart( $this->year, $this->month, $this->day - $this->cE->getDaysInWeek( $this->thisYear(), $this->thisMonth(), $this->thisDay()), $this->firstDay ); $this->nextWeek = $this->tableHelper->getWeekStart( $this->year, $this->month, $this->day + $this->cE->getDaysInWeek( $this->thisYear(), $this->thisMonth(), $this->thisDay()), $this->firstDay ); } /** * Builds Calendar_Day objects for this Week * @param array (optional) Calendar_Day objects representing selected dates * @return boolean * @access public */ function build($sDates = array()) { require_once CALENDAR_ROOT.'Day.php'; $year = $this->cE->stampToYear($this->thisWeek); $month = $this->cE->stampToMonth($this->thisWeek); $day = $this->cE->stampToDay($this->thisWeek); $end = $this->cE->getDaysInWeek( $this->thisYear(), $this->thisMonth(), $this->thisDay() ); for ($i=1; $i <= $end; $i++) { $stamp = $this->cE->dateToStamp($year, $month, $day++); $this->children[$i] = new Calendar_Day( $this->cE->stampToYear($stamp), $this->cE->stampToMonth($stamp), $this->cE->stampToDay($stamp)); } //set empty days (@see Calendar_Month_Weeks::build()) if ($this->firstWeek) { $eBefore = $this->tableHelper->getEmptyDaysBefore(); for ($i=1; $i <= $eBefore; $i++) { $this->children[$i]->setEmpty(); } } if ($this->lastWeek) { $eAfter = $this->tableHelper->getEmptyDaysAfterOffset(); for ($i = $eAfter+1; $i <= $end; $i++) { $this->children[$i]->setEmpty(); } } if (count($sDates) > 0) { $this->setSelection($sDates); } return true; } /** * @param boolean * @return void * @access private */ function setFirst($state=true) { $this->firstWeek = $state; } /** * @param boolean * @return void * @access private */ function setLast($state=true) { $this->lastWeek = $state; } /** * Called from build() * @param array * @return void * @access private */ function setSelection($sDates) { foreach ($sDates as $sDate) { foreach ($this->children as $key => $child) { if ($child->thisDay() == $sDate->thisDay() && $child->thisMonth() == $sDate->thisMonth() && $child->thisYear() == $sDate->thisYear() ) { $this->children[$key] = $sDate; $this->children[$key]->setSelected(); } } } reset($this->children); } /** * Gets the value of the previous week, according to the requested format * * @param string $format ['timestamp' | 'n_in_month' | 'n_in_year' | 'array'] * @return mixed * @access public */ function prevWeek($format = 'n_in_month') { switch (strtolower($format)) { case 'int': case 'n_in_month': return ($this->firstWeek) ? null : $this->thisWeek('n_in_month') -1; break; case 'n_in_year': return $this->cE->getWeekNInYear( $this->cE->stampToYear($this->prevWeek), $this->cE->stampToMonth($this->prevWeek), $this->cE->stampToDay($this->prevWeek)); break; case 'array': return $this->toArray($this->prevWeek); break; case 'object': require_once CALENDAR_ROOT.'Factory.php'; return Calendar_Factory::createByTimestamp('Week', $this->prevWeek); break; case 'timestamp': default: return $this->prevWeek; break; } } /** * Gets the value of the current week, according to the requested format * * @param string $format ['timestamp' | 'n_in_month' | 'n_in_year' | 'array'] * @return mixed * @access public */ function thisWeek($format = 'n_in_month') { switch (strtolower($format)) { case 'int': case 'n_in_month': if ($this->firstWeek) { return 1; } if ($this->lastWeek) { return $this->cE->getWeeksInMonth( $this->thisYear(), $this->thisMonth(), $this->firstDay); } return $this->cE->getWeekNInMonth( $this->thisYear(), $this->thisMonth(), $this->thisDay(), $this->firstDay); break; case 'n_in_year': return $this->cE->getWeekNInYear( $this->cE->stampToYear($this->thisWeek), $this->cE->stampToMonth($this->thisWeek), $this->cE->stampToDay($this->thisWeek)); break; case 'array': return $this->toArray($this->thisWeek); break; case 'object': require_once CALENDAR_ROOT.'Factory.php'; return Calendar_Factory::createByTimestamp('Week', $this->thisWeek); break; case 'timestamp': default: return $this->thisWeek; break; } } /** * Gets the value of the following week, according to the requested format * * @param string $format ['timestamp' | 'n_in_month' | 'n_in_year' | 'array'] * @return mixed * @access public */ function nextWeek($format = 'n_in_month') { switch (strtolower($format)) { case 'int': case 'n_in_month': return ($this->lastWeek) ? null : $this->thisWeek('n_in_month') +1; break; case 'n_in_year': return $this->cE->getWeekNInYear( $this->cE->stampToYear($this->nextWeek), $this->cE->stampToMonth($this->nextWeek), $this->cE->stampToDay($this->nextWeek)); break; case 'array': return $this->toArray($this->nextWeek); break; case 'object': require_once CALENDAR_ROOT.'Factory.php'; return Calendar_Factory::createByTimestamp('Week', $this->nextWeek); break; case 'timestamp': default: return $this->nextWeek; break; } } /** * Returns the instance of Calendar_Table_Helper. * Called from Calendar_Validator::isValidWeek * @return Calendar_Table_Helper * @access protected */ function & getHelper() { return $this->tableHelper; } /** * Makes sure theres a value for $this->day * @return void * @access private */ function findFirstDay() { if (!count($this->children) > 0) { $this->build(); foreach ($this->children as $Day) { if (!$Day->isEmpty()) { $this->day = $Day->thisDay(); break; } } } } } ?>