home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / Calendar / Table / Helper.php
Encoding:
PHP Script  |  2008-07-02  |  7.7 KB  |  280 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. //
  4. // +----------------------------------------------------------------------+
  5. // | PHP Version 4                                                        |
  6. // +----------------------------------------------------------------------+
  7. // | Copyright (c) 1997-2002 The PHP Group                                |
  8. // +----------------------------------------------------------------------+
  9. // | This source file is subject to version 2.02 of the PHP license,      |
  10. // | that is bundled with this package in the file LICENSE, and is        |
  11. // | available at through the world-wide-web at                           |
  12. // | http://www.php.net/license/3_0.txt.                                  |
  13. // | If you did not receive a copy of the PHP license and are unable to   |
  14. // | obtain it through the world-wide-web, please send a note to          |
  15. // | license@php.net so we can mail you a copy immediately.               |
  16. // +----------------------------------------------------------------------+
  17. // | Authors: Harry Fuecks <hfuecks@phppatterns.com>                      |
  18. // +----------------------------------------------------------------------+
  19. //
  20. // $Id: Helper.php,v 1.5 2005/10/22 09:51:53 quipo Exp $
  21. //
  22. /**
  23.  * @package Calendar
  24.  * @version $Id: Helper.php,v 1.5 2005/10/22 09:51:53 quipo Exp $
  25.  */
  26.  
  27. /**
  28.  * Used by Calendar_Month_Weekdays, Calendar_Month_Weeks and Calendar_Week to
  29.  * help with building the calendar in tabular form
  30.  * @package Calendar
  31.  * @access protected
  32.  */
  33. class Calendar_Table_Helper
  34. {
  35.     /**
  36.      * Instance of the Calendar object being helped.
  37.      * @var object
  38.      * @access private
  39.      */
  40.     var $calendar;
  41.  
  42.     /**
  43.      * Instance of the Calendar_Engine
  44.      * @var object
  45.      * @access private
  46.      */
  47.     var $cE;
  48.  
  49.     /**
  50.      * First day of the week
  51.      * @access private
  52.      * @var string
  53.      */
  54.     var $firstDay;
  55.  
  56.     /**
  57.      * The seven days of the week named
  58.      * @access private
  59.      * @var array
  60.      */
  61.     var $weekDays;
  62.  
  63.     /**
  64.      * Days of the week ordered with $firstDay at the beginning
  65.      * @access private
  66.      * @var array
  67.      */
  68.     var $daysOfWeek = array();
  69.  
  70.     /**
  71.      * Days of the month built from days of the week
  72.      * @access private
  73.      * @var array
  74.      */
  75.     var $daysOfMonth = array();
  76.  
  77.     /**
  78.      * Number of weeks in month
  79.      * @var int
  80.      * @access private
  81.      */
  82.     var $numWeeks = null;
  83.  
  84.     /**
  85.      * Number of emtpy days before real days begin in month
  86.      * @var int
  87.      * @access private
  88.      */
  89.     var $emptyBefore = 0;
  90.  
  91.     /**
  92.      * Constructs Calendar_Table_Helper
  93.      * @param object Calendar_Month_Weekdays, Calendar_Month_Weeks, Calendar_Week
  94.      * @param int (optional) first day of the week e.g. 1 for Monday
  95.      * @access protected
  96.      */
  97.     function Calendar_Table_Helper(& $calendar, $firstDay=null)
  98.     {
  99.         $this->calendar = & $calendar;
  100.         $this->cE = & $calendar->getEngine();
  101.         if (is_null($firstDay)) {
  102.             $firstDay = $this->cE->getFirstDayOfWeek(
  103.                 $this->calendar->thisYear(),
  104.                 $this->calendar->thisMonth(),
  105.                 $this->calendar->thisDay()
  106.             );
  107.         }
  108.         $this->firstDay = $firstDay;
  109.         $this->setFirstDay();
  110.         $this->setDaysOfMonth();
  111.     }
  112.  
  113.     /**
  114.      * Constructs $this->daysOfWeek based on $this->firstDay
  115.      * @return void
  116.      * @access private
  117.      */
  118.     function setFirstDay()
  119.     {
  120.         $weekDays = $this->cE->getWeekDays(
  121.             $this->calendar->thisYear(),
  122.             $this->calendar->thisMonth(),
  123.             $this->calendar->thisDay()
  124.         );
  125.         $endDays  = array();
  126.         $tmpDays  = array();
  127.         $begin = false;
  128.         foreach ($weekDays as $day) {
  129.             if ($begin) {
  130.                 $endDays[] = $day;
  131.             } else if ($day === $this->firstDay) {
  132.                 $begin = true;
  133.                 $endDays[] = $day;
  134.             } else {
  135.                 $tmpDays[] = $day;
  136.             }
  137.         }
  138.         $this->daysOfWeek = array_merge($endDays, $tmpDays);
  139.     }
  140.  
  141.     /**
  142.      * Constructs $this->daysOfMonth
  143.      * @return void
  144.      * @access private
  145.      */
  146.     function setDaysOfMonth()
  147.     {
  148.         $this->daysOfMonth = $this->daysOfWeek;
  149.         $daysInMonth = $this->cE->getDaysInMonth(
  150.             $this->calendar->thisYear(), $this->calendar->thisMonth());
  151.         $firstDayInMonth = $this->cE->getFirstDayInMonth(
  152.             $this->calendar->thisYear(), $this->calendar->thisMonth());
  153.         $this->emptyBefore=0;
  154.         foreach ($this->daysOfMonth as $dayOfWeek) {
  155.             if ($firstDayInMonth == $dayOfWeek) {
  156.                 break;
  157.             }
  158.             $this->emptyBefore++;
  159.         }
  160.         $this->numWeeks = ceil(
  161.             ($daysInMonth + $this->emptyBefore)
  162.                 /
  163.             $this->cE->getDaysInWeek(
  164.                 $this->calendar->thisYear(),
  165.                 $this->calendar->thisMonth(),
  166.                 $this->calendar->thisDay()
  167.             )
  168.         );
  169.         for ($i=1; $i < $this->numWeeks; $i++) {
  170.             $this->daysOfMonth =
  171.                 array_merge($this->daysOfMonth, $this->daysOfWeek);
  172.         }
  173.     }
  174.  
  175.     /**
  176.      * Returns the first day of the month
  177.      * @see Calendar_Engine_Interface::getFirstDayOfWeek()
  178.      * @return int
  179.      * @access protected
  180.      */
  181.     function getFirstDay()
  182.     {
  183.         return $this->firstDay;
  184.     }
  185.  
  186.     /**
  187.      * Returns the order array of days in a week
  188.      * @return int
  189.      * @access protected
  190.      */
  191.     function getDaysOfWeek()
  192.     {
  193.         return $this->daysOfWeek;
  194.     }
  195.  
  196.     /**
  197.      * Returns the number of tabular weeks in a month
  198.      * @return int
  199.      * @access protected
  200.      */
  201.     function getNumWeeks()
  202.     {
  203.         return $this->numWeeks;
  204.     }
  205.  
  206.     /**
  207.      * Returns the number of real days + empty days
  208.      * @return int
  209.      * @access protected
  210.      */
  211.     function getNumTableDaysInMonth()
  212.     {
  213.         return count($this->daysOfMonth);
  214.     }
  215.  
  216.     /**
  217.      * Returns the number of empty days before the real days begin
  218.      * @return int
  219.      * @access protected
  220.      */
  221.     function getEmptyDaysBefore()
  222.     {
  223.         return $this->emptyBefore;
  224.     }
  225.  
  226.     /**
  227.      * Returns the index of the last real day in the month
  228.      * @todo Potential performance optimization with static
  229.      * @return int
  230.      * @access protected
  231.      */
  232.     function getEmptyDaysAfter()
  233.     {
  234.         // Causes bug when displaying more than one month
  235. //        static $index;
  236. //        if (!isset($index)) {
  237.             $index = $this->getEmptyDaysBefore() + $this->cE->getDaysInMonth(
  238.                 $this->calendar->thisYear(), $this->calendar->thisMonth());
  239. //        }
  240.         return $index;
  241.     }
  242.  
  243.     /**
  244.      * Returns the index of the last real day in the month, relative to the
  245.      * beginning of the tabular week it is part of
  246.      * @return int
  247.      * @access protected
  248.      */
  249.     function getEmptyDaysAfterOffset()
  250.     {
  251.         $eAfter = $this->getEmptyDaysAfter();
  252.         return $eAfter - (
  253.             $this->cE->getDaysInWeek(
  254.                 $this->calendar->thisYear(),
  255.                 $this->calendar->thisMonth(),
  256.                 $this->calendar->thisDay()
  257.             ) * ($this->numWeeks-1) );
  258.     }
  259.  
  260.     /**
  261.      * Returns the timestamp of the first day of the current week
  262.      */
  263.     function getWeekStart($y, $m, $d, $firstDay=1)
  264.     {
  265.         $dow = $this->cE->getDayOfWeek($y, $m, $d);
  266.         if ($dow > $firstDay) {
  267.             $d -= ($dow - $firstDay);
  268.         }
  269.         if ($dow < $firstDay) {
  270.             $d -= (
  271.                 $this->cE->getDaysInWeek(
  272.                     $this->calendar->thisYear(),
  273.                     $this->calendar->thisMonth(),
  274.                     $this->calendar->thisDay()
  275.                 ) - $firstDay + $dow);
  276.         }
  277.         return $this->cE->dateToStamp($y, $m, $d);
  278.     }
  279. }
  280. ?>