<?php
/*=======================================================================
 *
 * calendar.inc.php
 *
 * Autor: Carsten Annacker
 *
 =======================================================================*/

/*
 * Quellen:
 * - Algorithmen zur Datumsberechnung
 *   http://home.nordwest.net/hgm/kalender/kal-6.htm
 * - Claus Toenderings Calendar-FAQ
 *   http://www.tondering.dk/claus/calendar.html
 * - Anregungen aus
 *   http://homepages.muenchen.org/bm612973/kalender.html,
 *   http://www.jandankert.de/service/sonstiges/kalender.html)
 *
 */

function weekDayName($wDay)
{
  $weekDayArr = array("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
  return $weekDayArr[$wDay];
}

function weekDayNameMapping($dayName, $mode = "0") {
  $retDayName = "";
  if ($mode == "1") :
     if ($dayName == "Monday") : $retDayName = "Montag"; endif;
     if ($dayName == "Tuesday") : $retDayName = "Dienstag"; endif;
     if ($dayName == "Wednesday") : $retDayName = "Mittwoch"; endif;
     if ($dayName == "Thursday") : $retDayName = "Donnerstag"; endif;
     if ($dayName == "Friday") : $retDayName = "Freitag"; endif;
     if ($dayName == "Saturday") : $retDayName = "Sonnabend"; endif;
     if ($dayName == "Sunday") : $retDayName = "Sonntag"; endif;
  else :
     if ($dayName == "Monday") : $retDayName = weekDayName(0); endif;
     if ($dayName == "Tuesday") : $retDayName = weekDayName(1); endif;
     if ($dayName == "Wednesday") : $retDayName = weekDayName(2); endif;
     if ($dayName == "Thursday") : $retDayName = weekDayName(3); endif;
     if ($dayName == "Friday") : $retDayName = weekDayName(4); endif;
     if ($dayName == "Saturday") : $retDayName = weekDayName(5); endif;
     if ($dayName == "Sunday") : $retDayName = weekDayName(6); endif;
  endif;
  return $retDayName;
}

function monthName($month)
{
  $monthNameArr = array (
    "Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli",
    "August", "September", "Oktober", "November", "Dezember");
  return $monthNameArr[--$month];
}

function leapYear ($year)
{
  return (($year & 3) == 0) && ((($year % 100) != 0) || (($year % 400) == 0));
}

function daysPerMonth($year, $month)
{
  $dpmArr = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  $result = $dpmArr[--$month];

  if ($month == 1) if (leapYear ($year)) $result++;
  return $result;
}

function addDays($year, $month, $day, $days)
{
  if ($days >= 0)
  {
    $day += $days;
    while ($day > daysPerMonth($year, $month))
      $day -= daysPerMonth($year, $month++);
  } else {
    $day += $days;
    while ($day <= 0)
      $day += daysPerMonth($year, $month--);
  }

  return(array($month, $day));
}

function addMonths($year, $month, $months)
{
  if ($months >= 0)
  {
    $month += $months;
    while ($month > 12)
    {
      $month -= 12;
      $year++;
    }  
  } else {
    $month += $months;
    while ($month <= 0)
    {
      $month += 12;
      $year--;
    }  
  }

  return(array($year, $month));
}

function easterSunday($year) {
  $K = floor($year / 100);
  $h = floor((3 * $K + 3) / 4);
  $M = 15 + $h - floor((8 * $K + 13) / 25);
  $S = 2 - $h;
  $A = $year % 19;
  $B = floor($year/4);
  $D = (19* $A + $M) % 30;
  $R = floor($D / 29) + (floor($D / 28) - floor($D / 29)) * floor($A / 11);
  $OG = 21 + $D - $R;
  $SZ = 7 - (($year + $B + $S) % 7);
  $OE = 7 - (($OG - $SZ) % 7);

  return (addDays($year, 3, 1, ($OG + $OE) - 1));
}

/*
 * Bundesweite gesetzliche Feiertage:
 * - Neujahr (1. Januar)
 * - Karfreitag (erster Freitag vor Ostern)
 * - Ostermontag (Ostersonntag ist der erste Sonntag nach dem ersten Vollmond nach der
 *   Frühlings-Tagundnachtgleiche (Vernal Equinox).
 * - Maifeiertag, Tag der Arbeit (1. Mai)
 * - Christi Himmelfahrt (sechster Donnerstag nach Ostern)
 * - Pfingstmontag (siebter Montag nach Ostermontag)
 * - Tag der deutschen Einheit (3. Oktober)
 * - 1. Weihnachtstag (25. Dezember)
 * - 2. Weihnachtstag (26. Dezember)
 * 
 * Gesetzliche Feiertage nur in einigen Bundesländern:
 * - Heilige Drei Könige (6. Januar; Baden-Württemberg, Bayern und Sachsen-Anhalt) 
 * - Fronleichnam (zweiter Donnerstag nach Pfingsten; Baden-Württemberg, Bayern, Hessen,
 *   Nordrhein-Westfalen, Rheinland-Pfalz, im Saarland und in einigen Gemeinden in
 *   Sachsen und Thüringen) 
 * - Mariä Himmelfahrt (15. August; Bayern, in Gemeinden mit überwiegend katholischer
 *   Bevölkerung und im Saarland) 
 * - Reformationstag (31. Oktober; Brandenburg, Mecklenburg-Vorpommern, Sachsen,
 *   Sachsen-Anhalt, Thüringen) 
 * - Allerheiligen (1. November; Baden-Württemberg, Bayern, Nordrhein-Westfalen,
 *   Rheinland Pfalz, Saarland) 
 * - Buß- und Bettag (zweiter Mittwoch vor dem ersten Advent; Sachsen) 
 *
 * Quelle: http://www.kalenderlexikon.de/Kalender/FeierGesetz.htm
 *
 */

function feiertag($year, $month, $day)
{
  if ($month == 1 && $day == 1) return('Neujahr');
//  if ($month == 1 && $day == 6) return(' Heilige Drei K&ouml;nige');
  if ($month == 5 && $day == 1) return('Maifeiertag');
  if ($month == 8 && $day == 15) return(' Mari&auml; Himmelfahrt');
  if ($year > 1989 && $month == 10 && $day == 3) return('Tag der deutschen Einheit');
//  if ($month == 10 && $day == 31) return(' Reformationstag');
//  if ($month == 11 && $day == 1) return(' Allerheiligen');
  if ($month == 12 && $day == 25) return('1. Weihnachtstag');
  if ($month == 12 && $day == 26) return('2. Weihnachtstag');
//  if ($month == 11)
//  {
//    $fourthAdvent = 24 - date ("w", mktime(0, 0, 0, 12, 24, $year));    
//    if (day == (fourthAdvent - 2)) return( ' Bu&szlig;- und Bettag');
//  }
  if ($month == 3 || $month == 4 || $month == 5 || $month == 6)
  {
    $easter = easterSunday($year);
    if ($month == $easter[0] && $day == $easter[1]) return('Ostersonntag');
    $tempDate = addDays($year, $easter[0], $easter[1], -2);
    if ($month == $tempDate[0] && $day == $tempDate[1]) return('Karfreitag');
    $tempDate = addDays($year, $easter[0], $easter[1], 1);
    if ($month == $tempDate[0] && $day == $tempDate[1]) return('Ostermontag');
    $tempDate = addDays($year, $easter[0], $easter[1], 39);
    if ($month == $tempDate[0] && $day == $tempDate[1]) return('Himmelfahrt');
    $tempDate = addDays($year, $easter[0], $easter[1], 50);
    if ($month == $tempDate[0] && $day == $tempDate[1]) return('Pfingstmontag');
    $tempDate = addDays($year, $easter[0], $easter[1], 60);
    if ($month == $tempDate[0] && $day == $tempDate[1]) return(' Fronleichnam');
  }
//  if (date ("w", mktime(0, 0, 0, $month, $day, $year)) == 6)
//    return ('Samstag');
  if (date ("w", mktime(0, 0, 0, $month, $day, $year)) == 0)
    return ('Sonntag');
  return('');
}


function addDaysComplete($year, $month, $day, $days)
{
  if ($days >= 0)
  {
    $day += $days;
    while ($day > daysPerMonth($year, $month))
    {
      $day -= daysPerMonth($year, $month++);
      if ($month == 13)
      {
        $month = 1;
        $year++;
      }
    }      
  } else {
    $day += $days;
    while ($day <= 0)
    {
      $day += daysPerMonth($year, $month--);
      if ($month == 0)
      {
        $month = 12;
        $year--;
      }
    }
  }

  return(array($year, $month, $day));
}


function getMonthAnchorLinks() {
   $ret = "";
   $ret .= "<a href=\"#1\">Jan.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#2\">Feb.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#3\">M&auml;r.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#4\">Apr.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#5\">Mai&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#6\">Jun&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#7\">Jul.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#8\">Aug.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#9\">Sep.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#10\">Okt.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#11\">Nov.&nbsp;&nbsp;</a>";
   $ret .= "<a href=\"#12\">Dez.&nbsp;&nbsp;</a>";
   return $ret;
}

//include_once("../include/dbglobal.inc.php");
//$dateArr = array(2004, 1, 0);
//do {
//  $dateArr = addDaysComplete($dateArr[0], $dateArr[1], $dateArr[2], 1);
//  $dayName = feiertag($dateArr[0], $dateArr[1], $dateArr[2]);
//  if ($dayName != "" && substr($dayName, 0, 1) != " ") {
//    insertStmt("publicholiday", array("ph_year", $dateArr[0], "ph_month", $dateArr[1], "ph_day", $dateArr[2], "ph_name", $dayName));
//  }
//} while ($dateArr[0] <= 2012);

?>
