<?php
/**
 * Example how to create an own driver-class for Date_Holidays
 *
 * To test this class, you have to copy it into the drivers-directory.
 *
 * The classname has to be something like Date_Holidays_Driver_*.
 * Otherwise it won't be compatible to be used within PEAR's strict directory 
 * structure.
 *
 * PHP Version 4
 *
 * @category Date
 * @package  Date_Holidays
 * @author   Carsten Lucke <luckec@tool-garage.de>
 * @license  http://www.php.net/license/3_01.txt PHP License 3.0.1
 * @link     http://pear.php.net/package/Date_Holidays
 */ 
class Date_Holidays_Driver_Example extends Date_Holidays_Driver
{
    /**
     * Constructor
     *
     * Use the Date_Holidays::factory() method to construct an object of a 
     * certain driver
     *
     * @access   protected
     */
    function Date_Holidays_Driver_Example()
    {
    }
    
    /**
     * Build the internal arrays that contain data about the calculated holidays
     *
     * @access   protected
     * @return   boolean true on success, otherwise a PEAR_ErrorStack object
     * @throws   object PEAR_ErrorStack
     */
    function _buildHolidays()
    {
        /**
         * If your driver is extending another driver-class and is not a direct 
         * descendant of the Date_Holidays_Driver base-class you will want to 
         * build this classes' holidays before you start with your turn.
         *
         * So just call the _buildHolidays() method of that class.
         */
        parent::_buildHolidays();

        /**
         * There are two methods to add a holiday. One for adding holidays in 
         * general and on that can be used to add static holidays (every year 
         * the same day).
         *
         * You always have to give the added holiday an unique internal name 
         * within your driver.
         * This should describe the holiday as good as possible.
         *
         * Of course you need a date and a title (the default title should 
         * always be in English)
         *
         * You can add as many translations as you want for your driver's 
         * holidays. 
         * Although the default title is in English you should add another one 
         * with the correct locale setting.
         */

        /*
         * General method to add a holiday
         */

        // a static holiday
        $this->_addHoliday('jesusCircumcision', 
                           $this->_year . '-01-01', 
                           'Circumcision of Jesus');
        
        // a calculated holiday
        // if you are using helper methods to calculate movable holidays is 
        // your own decision
        $fooDate = $this->_calcFirstMondayInJanuary();
        $this->_addHoliday('firstMondayInJan', 
                           $fooDate, 
                           'First monday in January');
        
        /*
         * Special method for adding static holidays:
         */
        $static = array('newYearsDay' => array('date'  => '01-01',
                                               'title' => 'New Year\'s Day'),
                        'valentinesDay'   => array('date' => '02-14',
                                              'title' => 'Valentine\'s Day'));
        $this->_addStaticHolidays($static);
        if (Date_Holidays::errorsOccurred()) {
            return Date_Holidays::getErrorStack();
        }
        return true;
    }
    
    /**
     * A helper method
     *
     * @access   private
     * @return   object Date date of first monday in actual years january
     */
    function _calcFirstMondayInJanuary()
    {
        $date = new Date($this->_year . '-01-01');
        while ($date->getDayOfWeek() != 1) {
            $date = $date->getNextDay();
        }
        return $date;
    }
}
?>
