<?php
/**
 * Mini-calendar generation class
 * Uses Date_Calc class from PEAR
 * 
 * @version  0.4.0
 * @author   Paul Bissex <pb@e-scribe.com>
 * @license  MIT
 *
 * USAGE:
 *   $cal = new MiniCalendar();
 *   print $cal->html();    
 *
 * See below for user-tweakable settings
 *
 * TODO: refactor so hardcoded colors become user parameters
 */
 
// Relies on what may be an obsolete version of PEAR Date::Calc
require_once "Date/Calc.php";

class 
MiniCalendar
    
{
    var 
$weekstart DATE_CALC_BEGIN_WEEKDAY;  // 0 = Sunday; 1 = Monday
    
var $valign "top";
    
    var 
$_day_number_style "color: #444444"// day numbers
    
var $_today_style "font-weight: bold; color: #000000";
    var 
$_calendar_style;  // overall CSS styling for calendar
    
    
var $weekday_background "";
    var 
$month_name;
    
    var 
$_year;
    var 
$_month;
        
    
    
/**
     * Constructor -- minimal
     */
    
function MiniCalendar($year=''$month='')
        {
        
$this->_year $year;
        
$this->_month $month;
        }
        

    
/**
     * Return HTML for mini-calendar
     */
    
function html()
        {
        
$this->_build();
        
$html '';
        
$html .=  "<table><tr><td bgcolor='#CCCCCC'>&nbsp;";
        
$html .=  ucwords ($this->month_name);
        
$html .=  "</td></tr><tr><td bgcolor='#ffffff'>";
        
$html .=  "<table cellspacing='2' cellpadding='2' border='0' bgcolor='#FFFFFF'>";
        foreach (
$this->_weeks as $_week)
            {
            
$html .=  "<tr valign='top'>";
            foreach (
$_week as $_date)
                {
                list (
$_y$_m$_d) = sscanf ($_date"%4s%2s%2d");
                
$_cell_bg $this->weekday_background;
                
$_n Date_Calc::getWeekdayAbbrname ($_d$_m$_y);
                
$_cell_bg "#eeeeee";
                if (
$_n == "Sat" || $_n == "Sun")
                    {
                    
$_cell_bg "#cccccc";
                    }
                
$_current_day_style $this->_day_number_style;
                if (
$this->is_today ($_date))
                    {
                    
$_current_day_style $this->_today_style;  
                    }
                
$html .=  "<td style='$this->_calendar_style' bgcolor='$_cell_bg' align='right'>";
                if (
$_m == $this->_month
                    {
                    
$html .=  "<span style='$_current_day_style'>$_d</span>";
                    }
                else  
                    {
                    
$html .=  "&nbsp;";
                    }
                
$html .=  "</td>";
                }
            
$html .=  "</tr>\n";
            }
        
$html .=  "</table></td></tr></table>";
        return 
$html;
        }            
            
    
    
/**
     * Build data structures    
     */
    
function _build()
        {
        if (!(
$this->_month) || !($this->_year))
            {
            
$d getdate();
            
$this->_month $d['mon'];
            
$this->_year $d['year'];
            }
        
$this->month_name strtolower (Date_Calc::getMonthFullname ($this->_month));
        
$this->monthlen Date_Calc::daysInMonth ($this->_month$this->_year);
        
$this->monthstart Date_Calc::dayOfWeek (1$this->_month$this->_year) - $this->weekstart;
        
// Build array of days
        
$this->_weeks Date_Calc::getCalendarMonth($this->_month$this->_year);
        
// Calculate month and year of previous and next months
        // These calculations are not currently used, but would be useful in adding navigation
        
$this->yearprev Date_Calc::beginOfPrevMonth (1$this->_month$this->_year"%Y");
        
$this->monthprev Date_Calc::beginOfPrevMonth (1$this->_month$this->_year"%m");
        
$this->yearnext Date_Calc::beginOfNextMonth (1$this->_month$this->_year"%Y");
        
$this->monthnext Date_Calc::beginOfNextMonth (1$this->_month$this->_year"%m");
        }
        
        
    
/**
     * Determine whether a given YYYYMMDD date is today    
     */
    
function is_today ($yyyymmdd)
        {
        return (
Date_Calc::dateNow() == $yyyymmdd);
        }
    }    
?>