Thursday, 4 June 2015

PHP: Create Calendar


<?php

function isLeapYear($year){
    // 1 januari 1900 is monday, use century-check only when 1 januari 1900 is monday;
    if(($year % 100 == 0) and ($year % 400 != 0)) return(0);
    if($year % 4 == 0) return(1);
    return(0);
}

function getWeekDay($year, $month, $day){
    $dcm = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    // 1 januari 1900 is sunday;
    $gwdYear = 1899;
    $gwdMonth = 12;
    $gwdDay = 31;
    // 1 januari 1900 is monday;
    $gwdYear = 1899;
    $gwdMonth = 12;
    $gwdDay = 30;

    $diffDays = 0;
    $diffDays = $diffDays + $day;
    for($m = (($year * 12) + $month) - 1; $m > (($gwdYear * 12) + $gwdMonth); $m--)    {
        $y = (($m - 1) / 12);
        $i = ($m % 12) + 12;
        if(isLeapYear($y) == 1)         {
            $dcm[1] = 29; $dcm[13] = 29;
        }else{
            $dcm[1] = 28; $dcm[13] = 28;
        }
        $diffDays = $diffDays + $dcm[$i-1];
    }
    $diffDays = $diffDays + ($dcm[$gwdMonth - 1] - $gwdDay);
    $weekDay = ($diffDays % 7) - 2;
    if($weekDay < 0) $weekDay = $weekDay + 7;
    return($weekDay + 1);
}

function getDateNumber($year, $month, $day){
    $diffDays = 0;
    for($y = 0; $y < $year; $y++)    {
        $diffDays = $diffDays + 365;
        if(isLeapYear($y) == 1) $diffDays = $diffDays + 1;
    }
    for($m = 1; $m < $month; $m++)    {
        if($m == 1 or $m == 3 or $m == 5 or $m == 7 or $m == 8 or $m == 10 or $m == 12)    {
            $diffDays = $diffDays + 31;
        }else{
            $diffDays = $diffDays + 30;
        }
        if(isLeapYear($year) == 1 and $m == 2) $diffDays = $diffDays - 1;
        if(isLeapYear($year) == 0 and $m == 2) $diffDays = $diffDays - 2;
    }
    $diffDays = $diffDays + $day;
    return($diffDays);
}

function CalculateIsoWeekday($year, $month, $day){

// This function converts the weekday-numbers from the
// standard function to an offset acc. to the ISO version
// monday -> 0, ... , sunday -> 6
$n = getWeekday($year, $month, $day);
    return($n - 1);
}

function getWeekNumber($year, $month, $day){
    // The year value is preset with that of the input date
    $YearInQuestion = $year;
    
    // Calculate offset to monday from the input date
    $InputDateOffset = CalculateIsoWeekday($year, $month, $day);
    
    // Calculate offsets for the first/last day of the year
    $January1Offset = CalculateIsoWeekday($YearInQuestion, 1, 1);
    $December31Offset = CalculateIsoWeekday($YearInQuestion, 12, 31);
    
    // If the input date is before the 4th of January and the year starts with
    // a friday, saturday or sunday, the week belongs to the previous year
    // if the entered date is not a monday or tuesday
    if($month == 1 and $day < 4 and $January1Offset > 3 and $InputDateOffset > 1)    {
        $YearInQuestion = $YearInQuestion - 1;
    }
    // If the input date is after the 28th of December and the year ends with
    // a monday, tuesday or wednesday, then the week belongs to the following year
    // if the entered date is not a saturday or sunday
    if ($month == 12 and $day > 28 and $December31Offset < 3 and $InputDateOffset < 5)    {
        $YearInQuestion = $YearInQuestion + 1;
    }
    // The 4th of January defines week #1
    $January4 = getDatenumber($YearInQuestion, 1, 4);
    
    // Offset to the monday of week #1
    $FirstMondayOfYear = getDatenumber($YearInQuestion, 1, 4 - CalculateIsoWeekday($YearInQuestion, 1, 4));
    
    // The time range between the monday of week #1 and the monday
    // of the week in question is divided by 7, plus 1 for the first week
    $weeknum = (getDateNumber($year, $month, $day) - $InputDateOffset - $FirstMondayOfYear ) / 7 + 1;
    return($weeknum);    
}

function phpdate($year, $month, $day, $format){
    if($format == "mmmm")    {
        if($month == 1) return("january");
        if($month == 2) return("february");
        if($month == 3) return("march");
        if($month == 4) return("april");
        if($month == 5) return("may");
        if($month == 6) return("june");
        if($month == 7) return("july");
        if($month == 8) return("august");
        if($month == 9) return("september");
        if($month == 10) return("october");
        if($month == 11) return("november");
        if($month == 12) return("december");
    }
    if($format == "yyyy")    {
        return($year);
    }
}

function getCalendar() {
    if($_GET["year"] == "") $year = date("Y"); else $year = $_GET["year"];
    if($_GET["month"] == "") $month = date("n"); else $month = $_GET["month"];
    if($_GET["day"] == "") $day = date("d"); else $day = $_GET["day"];
    $dow = array("mon", "tue", "wed", "thu", "fri", "sat", "sun");
    if(isLeapYear($year) == 1)    {
        $dom = array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    }else{
        $dom = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    }
    $calendar = "<center><table style='background : ThreedFace; border-style : outset; font-family : Verdana; font-size : 10pt;border-width : 2px;' >";
    $calendar .= "<tr>";
    $calendar .= "<th bgcolor=#000080 colspan='8'>";
    $calendar .= "<font color=white>C A L E N D A R</font>";
    $calendar .= "</th>";
    $calendar .= "</tr>";
    $calendar .= "<tr>";
    $calendar .= "<th><center>";
    $m = $month;
    $y = $year - 1;
    if($year != 1900) $calendar .= "<a style='text-decoration : none; color : #808080;' href='?year=" . $y . "&month=" . $m . "&day=" . 1 . "' ><font face=webdings>7</font></a>";
    if($month == 1) {
        $m = 12;
        $y = $year - 1;
    }else{
        $m = $month - 1;
        $y = $year;
    }
    if(!($year == 1900 and $month == 1)) $calendar .= "<a style='text-decoration : none; color : #808080;' href='?year=" . $y . "&month=" . $m . "&day=" . 1 . "' ><font face=webdings>3</font></a>";
    $calendar .= "</th>";
    $calendar .= "<th nowrap colspan='6'><center>";
    $calendar .= phpdate($year, $month, $day, "mmmm", $lang) . " " . phpdate($year, $month, $day, "yyyy", $lang);
    $calendar .= "</th>";
    $calendar .= "<th><center>";
    if($month == 12){
        $m = 1;
        $y = $year + 1;
    }else{
        $m = $month + 1;
        $y = $year;
    }
    $calendar .= "<a style='text-decoration : none; color : #808080;' href='?year=" . $y . "&month=" . $m . "&day=" . 1 . "' ><font face=webdings>4</font></a>";
    $m = $month;
    $y = $year + 1;
    $calendar .= "<a style='text-decoration : none; color : #808080;' href='?year=" . $y . "&month=" . $m . "&day=" . 1 . "' ><font face=webdings>8</font></a>";
    $calendar .= "</th>";
    $calendar .= "</tr>";
    $dayno = 2 - getWeekDay($year, $month, 1);
    $daymin = 1;
    $daymax = $dom[$month - 1];
    if($month == 1) {$daymaxl = 12;} else {$daymaxl = $month - 1;}
    for($row = 1; $row <= 7; $row++)    {
        for($col = 1; $col <= 8; $col++)        {
            $calendar .= "<td style='border-color : black; border-width : 2px;' ><center>";
            // print weekday headers
            if($row == 1 and $col != 1) {
                $calendar .= "<font color=#000080>";
                $calendar .= $dow[$col-1-1];
                $calendar .= "</font>";
            }
            // print weeknumbers
            if($row != 1 and $col == 1)    {    
                $calendar .= "<font color=#008000>";
                if($dayno < $daymin){
                    $y = $year;
                    if($month == 1) $m = 12;
                    if($month != 1) $m = $month - 1;
                    if($month == 1) $y = $year - 1;
                    $d = ($dom[$daymaxl - 1]) + $dayno;
                    $calendar .= sprintf("%02d",getWeekNumber($y, $m, $d));
                }else{
                    if($dayno > $daymax){
                        $y = $year;
                        if($month == 12) $m = 1;
                        if($month != 12) $m = $month + 1;
                        if($month == 12) $y = $year + 1;
                        $d = $dayno - $daymax;
                        $calendar .= sprintf("%02d",getWeekNumber($y, $m, $d));
                    }else{
                        $calendar .= sprintf("%02d",getWeekNumber($year, $month, $dayno));
                    }
                }
                $calendar .= "</font>";
            }
            // print day numbers
            if($row > 1 and $col != 1){
                if($dayno < $daymin){
                    $calendar .= "<font color=#808080>";
                    $calendar .= ($dom[$daymaxl - 1]) + $dayno;
                    $calendar .= "</font>";
                }else{
                    if($dayno > $daymax){
                        $calendar .= "<font color=#808080>";
                        $calendar .= $dayno - $daymax;
                        $calendar .= "</font>";
                    }else{
                        $calendar .= $dayno;
                    }
                }
                $dayno = $dayno + 1;
            }
            $calendar .= "</td>";
        }
        $calendar .= "</tr><tr>";
    }
    $calendar .= "</tr>";
    $calendar .= "</table>";
    return($calendar);
}

?>
<html>
<title>getCalendar()</title>
<body bgcolor=#D0D0D0>
<?php echo(getCalendar()); ?>
</body>

</html>

0 comments:

Post a Comment