code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:Feiertage -> feiertage.php
md5:14d294bb676bbc6818f55639bace6c69
sha1:fc04627fa7d44b017f59b5999f10faa4fcfc1c2e
Download-Link:Download
  1. <?php
  2. /**
  3. * @description: Skript, welches Feiertage ermittelt.
  4. * @author: Jörg Reinholz, fastix WebDesign & Consult, Kassel - http://www.fastix.org/
  5. * @version: 0.8.0 (BETA)
  6. * @needed php >= 5.2.1 optimal: 64bit
  7. **/
  8.  
  9.  
  10. class feiertage
  11. {
  12.     private $iniFile = 'deutscheFeiertage.ini';
  13.     private $jahr = false;
  14.     private $advent4;
  15.     private $feiertage = array();
  16.     protected $cacheFile;
  17.     protected $cacheFileName;
  18.     protected $code;
  19.     protected $arrShowOnlyTypes = false;
  20.     protected $monthNames = array();
  21.     protected $wdNames = array();
  22.  
  23.     protected $wdValues = array();
  24.  
  25.     public function __construct( $jahr = false ) {
  26.         $this -> setJahr( $jahr );
  27.         $this -> wdNames['0'] = $wdNames['7'] = 'Sonntag';
  28.         $this -> wdNames[1] = 'Montag';
  29.         $this -> wdNames[2] = 'Dienstag';
  30.         $this -> wdNames[3] = 'Mittwoch';
  31.         $this -> wdNames[4] = 'Donnerstag';
  32.         $this -> wdNames[5] = 'Freitag';
  33.         $this -> wdNames[6] = 'Sonnabend';
  34.  
  35.         $this -> monthNames[0] = 'Januar';
  36.         $this -> monthNames[1] = 'Februar';
  37.         $this -> monthNames[2] = 'März';
  38.         $this -> monthNames[3] = 'April';
  39.         $this -> monthNames[4] = 'Mai';
  40.         $this -> monthNames[5] = 'Juni';
  41.         $this -> monthNames[6] = 'Juli';
  42.         $this -> monthNames[7] = 'August';
  43.         $this -> monthNames[8] = 'September';
  44.         $this -> monthNames[9] = 'Oktober';
  45.         $this -> monthNames[10] = 'November';
  46.         $this -> monthNames[11] = 'Dezember';
  47.     }
  48.  
  49.     public function easterDate( $y ) {
  50.         return ( mktime(0, 0, 0, 3, 21 + easter_days( $y ), $y ) );
  51.     }
  52.  
  53.     public function wdnameToValue( $str ) {
  54.         $wdValues['mo'] = 1;
  55.         $wdValues['mon'] = 1;
  56.         $wdValues['monday'] = 1;
  57.         $wdValues['montag'] = 1;
  58.  
  59.         $wdValues['di'] = 2;
  60.         $wdValues['tue'] = 2;
  61.         $wdValues['tuesday'] = 2;
  62.         $wdValues['mittwoch'] = 2;
  63.  
  64.         $wdValues['mi'] = 3;
  65.         $wdValues['wed'] = 3;
  66.         $wdValues['wednesday'] = 3;
  67.         $wdValues['mittwoch'] = 3;
  68.  
  69.         $wdValues['do'] = 4;
  70.         $wdValues['thu'] = 4;
  71.         $wdValues['thursday'] = 4;
  72.         $wdValues['donnerstag'] = 4;
  73.  
  74.         $wdValues['fr'] = 5;
  75.         $wdValues['fre'] = 5;
  76.         $wdValues['freeday'] = 5;
  77.         $wdValues['freitag'] = 5;
  78.  
  79.         $wdValues['sa'] = 6;
  80.         $wdValues['sat'] = 6;
  81.         $wdValues['Saturday'] = 6;
  82.         $wdValues['Samstag'] = 6;
  83.         $wdValues['Sonnabend'] = 6;
  84.  
  85.         $wdValues['so'] = 7;
  86.         $wdValues['son'] = 7;
  87.         $wdValues['sonday'] = 7;
  88.         $wdValues['sonntag'] = 7;
  89.  
  90.         $s = strtolower( trim( $str ) );
  91.         if ( isset( $wdValues[$s] ) ) {
  92.             return $wdValues[$s];
  93.         } else {
  94.             return $str;
  95.         }
  96.     }
  97.  
  98.  
  99.     public function setJahr( $jahr = false ) {
  100.  
  101.         if ( false === $jahr) { $jahr = date( 'Y' ); }
  102.  
  103.         if ( $jahr !== $this -> jahr ) {
  104.                 $this -> jahr = $jahr;
  105.         }
  106.         $this -> cacheFileName = $this -> iniFile . '.php';
  107.         $this -> cacheFile = __DIR__ . '/cache/' . $this -> jahr . '-' . $this -> iniFile . '.json';
  108.  
  109.         $iniFileDate = filemtime( $this -> iniFile );
  110.         if ( is_file( $this -> cacheFile ) ) {
  111.             $cacheFileDate = filemtime( $this -> cacheFile );
  112.         }
  113.  
  114.         if ( ! isset( $cacheFileDate ) or $cacheFileDate < $iniFileDate ) {
  115.  
  116.             try {
  117.                 if ( ! mktime(1, 1, 1, 12, 31, $jahr ) ) {
  118.                     throw new Exception('Das übergebene Jahr ' . $jahr . ' ist auf 32-Bit-Systemen ungültig. Gültig sind Jahre zwischen 1970 und 2037.');
  119.                 }
  120.             } catch ( Exception $e ) {
  121.                 echo 'Fatal: ',  $e->getMessage(), ' Datei: ' , $e->getFile(), ' Zeile: ', $e->getLine(), "\n";
  122.                 exit;
  123.             }
  124.  
  125.  
  126.             if ( ! isset($ini) ) {
  127.                 $ini = parse_ini_file( $this -> iniFile, true );
  128.             }
  129.  
  130.             $fromAdvent4 = $ini['fromAdvent4'];
  131.             $dLastAdvent = 24 - date( 'w', mktime( 0, 0, 0, 12, 24, $jahr ) );
  132.             $mLastAdvent = 12;
  133.  
  134.             for ( $i = 0; $i < count( $fromAdvent4['name'] ); $i++ ) {
  135.                 $offset = $fromAdvent4 ['offset'][$i];
  136.                 $dto = mktime ( 0, 0, 0, $mLastAdvent, ( $dLastAdvent + $offset ), $this -> jahr );
  137.                 list( $m, $d ) = explode( '-', date( 'n-j', $dto ) );
  138.                 $d = date( 'j', $dto );
  139.                 $notBefore = intval( $fromAdvent4['notBefore'][$i] );
  140.                 if ( $notBefore == 0 ) { $notBefore = -99999999; }
  141.                 $notAfter = intval( $fromAdvent4['notAfter'][$i] );
  142.                 if ( $notAfter == 0 ) { $notAfter = 99999999; }
  143.                 if ( $notBefore <= $jahr && $notAfter >= $jahr ) {
  144.                     $name =   $fromAdvent4['name'][$i];
  145.                     if ( isset( $fromAdvent4['codes'][$i] ) ) {
  146.                         $codes = preg_replace('/[^A-Za-z0-9_]+/' , ',' ,$fromAdvent4['codes'][$i]);
  147.                         $arCodes = explode( ',', $codes ) ;
  148.                     }
  149.                     $this -> addFeiertag (intval($m), intval($d), $name, $arCodes);
  150.                 }
  151.             }
  152.  
  153.             $fromEaster = $ini['fromEaster'];
  154.             $dtoEasterSonnday =  $this -> easterDate( $this -> jahr);
  155.             $mEasterSonnday = date('n', $dtoEasterSonnday);
  156.             $dEasterSonnday = date('j', $dtoEasterSonnday);
  157.  
  158.             for ( $i = 0; $i < count($fromEaster['name']); $i++ ) {
  159.                 $notBefore = intval( $fromEaster['notBefore'][$i] );
  160.                 if ( $notBefore == 0 ) { $notBefore = -99999999; }
  161.                 $notAfter = intval( $fromEaster['notAfter'][$i] );
  162.                 if ( $notAfter == 0 ) { $notAfter = 99999999; }
  163.                 if ( $notBefore <= $jahr && $notAfter >= $jahr ) {
  164.                     $name =   $fromEaster['name'][$i];
  165.                     $offset = $fromEaster['offset'][$i];
  166.                     $dto = mktime ( 0, 0, 0, $mEasterSonnday, ($dEasterSonnday + $offset), $this -> jahr );
  167.                                         list( $m, $d ) = explode( '-', date( 'n-j', $dto ) );
  168.                     $arCodes = array();
  169.                     if (  isset( $fromEaster['codes'][$i] ) ) {
  170.                         $codes = preg_replace('/[^A-Za-z0-9_]+/' , ',' ,$fromEaster['codes'][$i]);
  171.                         $arCodes = explode( ',', $codes ) ;
  172.                     }
  173.                     $this -> addFeiertag (intval($m), intval($d), $name, $arCodes);
  174.                 }
  175.             }
  176.  
  177.             $fixDays = $ini['fix'];
  178.             for ( $i = 0; $i < count($fixDays['name']); $i++ ) {
  179.                 $m    = intval( $fixDays['m'][$i] );
  180.                 $d    = intval( $fixDays['d'][$i] );
  181.                 $notBefore = intval( $fixDays['notBefore'][$i] );
  182.                 if ( $notBefore == 0 ) { $notBefore = -99999999; }
  183.                 $notAfter = intval( $fixDays['notAfter'][$i] );
  184.                 if ( $notAfter == 0 ) { $notAfter = 99999999; }
  185.                 if ( $notBefore <= $jahr && $notAfter >= $jahr ) {
  186.                     $name = $fixDays['name'][$i];
  187.                     $arCodes=array();
  188.                     if ( isset( $fixDays['codes'][$i] ) ) {
  189.                         $codes = preg_replace('/[^A-Za-z0-9_]+/' , ',' ,$fixDays['codes'][$i]);
  190.                         $arCodes = explode( ',', $codes ) ;
  191.                     }
  192.                     $this -> addFeiertag (intval($m), intval($d), $name, $arCodes);
  193.                 }
  194.             }
  195.  
  196.             $MO_WT_WO = $ini['MO_WT_WO'];
  197.             for ( $i = 0; $i < count( $MO_WT_WO['name'] ); $i++ ) {
  198.                 $notBefore = intval( $MO_WT_WO['notBefore'][$i] );
  199.                 if ( $notBefore == 0 ) { $notBefore = -99999999; }
  200.                 $notAfter = intval( $MO_WT_WO['notAfter'][$i] );
  201.                 if ( $notAfter == 0 ) { $notAfter = 99999999; }
  202.                 if ( $notBefore <= $jahr && $notAfter >= $jahr ) {
  203.                     $ar = explode( ',', $MO_WT_WO['crontab'][$i] );
  204.                     if (3==count($ar)) {
  205.                         list( $m, $wt, $wo ) = $ar;
  206.                         $dayOffset=0;
  207.                     } elseif ( 4 == count( $ar ) ) {
  208.                         list($m, $wt, $wo, $dayOffset) = $ar;
  209.                     }
  210.                     unset ($ar);
  211.                     if ( 'string' == gettype($wo) ) { $wo = strtoupper( trim($wo) ); }
  212.                     if ( 'F' == $wo or 'FIRST' == $wo ) {
  213.                         $wo = 1;
  214.                     }
  215.                     $wt = $this -> wdnameToValue($wt);
  216.                     if ( 0 == intval($wt) ) { $wt = 7; }
  217.                     $wt = 7 - $wt;
  218.                     if ('L' == $wo or 'LAST' == $wo) {
  219.                         $daysOfMonth  = date( 't', mktime(0,0,0, $m, 1, $jahr) );
  220.                         $wdOffset = date( 'w', mktime(0,0,0, $m, $daysOfMonth, $jahr) );
  221.                         $dto = mktime( 0,0,0, $m, $daysOfMonth - $wdOffset + $dayOffset, $jahr );
  222.                         list( $m, $d ) = explode( '-', date('n-j', $dto ) );
  223.                     } else {
  224.                         $wdOffset = date('w', mktime(0,0,0, $m, $wt, $jahr));
  225.                         $datum = mktime(0,0,0, $m, ( - $offset + ($wo * 7)),$jahr );
  226.                         $dto   = mktime(0,0,0, $m, ( $wo * 7  - $wdOffset )  + $dayOffset, $jahr);
  227.                                                 list( $m, $d ) = explode( '-', date( 'n-j', $dto ) );
  228.                     }
  229.                     $name = $MO_WT_WO['name'][$i];
  230.                     $arCodes=array();
  231.                     if ( isset( $MO_WT_WO['codes'][$i] ) ) {
  232.                         $codes = preg_replace('/[^A-Za-z0-9_]+/' , ',' ,$MO_WT_WO['codes'][$i]);
  233.                         $arCodes = explode( ',', $codes ) ;
  234.                     }
  235.                     $this -> addFeiertag ( intval($m), intval($d), $name, $arCodes );
  236.                 }
  237.             }
  238.             $Anniversaries = $ini['Anniversaries'];
  239.             $leer=array();
  240.             for ( $i = 0; $i < count($Anniversaries['y'] ); $i++ ) {
  241.                                 $n = $jahr - $Anniversaries['y'][$i];
  242.                                 if (  $n == 0 ) {
  243.                                         $name = str_replace( '%d. ', '', $Anniversaries['s'][$i] );
  244.                                         $this -> addFeiertag ( intval($Anniversaries['m'][$i] ), intval( $Anniversaries['d'][$i] ), $name, $leer );
  245.                                 } elseif (  $n > 0 ) {
  246.                                         $name = sprintf( $Anniversaries['s'][$i], $n, $Anniversaries['y'][$i], $Anniversaries['m'][$i], $Anniversaries['d'][$i] );
  247.                                         $this -> addFeiertag ( intval( $Anniversaries['m'][$i] ), intval( $Anniversaries['d'][$i] ), $name, $leer );
  248.                                 }
  249.             }
  250.  
  251.  
  252.             $periodics = $ini['OtherPeriods'];
  253.             $leer = array();
  254.             for ( $i = 0; $i < count($periodics['name']); $i++ ) {
  255.                 $flag = true;
  256.                 $startDate   = mktime( 0,0,0, $periodics['FirstDay'][$i], $periodics['FirstMounth'][$i], $periodics['FirstYear'][$i] );
  257.                 if ( $periodics['FirstYear'][$i] == $jahr) {
  258.                     $this -> addFeiertag( date('m', $startDate ), date( 'j', $startDate ), $periodics['name'][$i], $leer );
  259.                 }
  260.                 if ( $periodics['FirstYear'][$i] <= $jahr ) {
  261.                     while ( $flag ) {
  262.                         $startDate = mktime(0,0,0, date( 'm', $startDate ) + $periodics['PeriodMounths'][$i], date( 'j', $startDate ) + $periodics['PeriodDays'][$i], date( 'Y', $startDate ) );
  263.                         if ( date('Y', $startDate) == $jahr) {
  264.                             $this -> addFeiertag ( date('m', $startDate ), date( 'j', $startDate ), $periodics['name'][$i], $leer );
  265.                         } elseif ( date('Y', $startDate ) > $jahr ) {
  266.                             $flag = false;
  267.                         }
  268.                     }
  269.                 }
  270.             }
  271.             $this -> codes = $ini['codes'];
  272.                         $export=[];
  273.             $export['feiertage']= $this -> feiertage;
  274.             $export['codes']     = $this -> codes;
  275.             file_put_contents( $this -> cacheFile , json_encode( $export ) );
  276.             unset( $export );
  277.             return true;
  278.         } else {
  279.             $this -> jahr = $jahr;
  280.             $import = json_decode( file_get_contents( $this -> cacheFile ), true );
  281.             $this -> feiertage = $import['feiertage'];
  282.             $this -> codes     = $import['codes'];
  283.             unset( $import );
  284.             return true;
  285.         }
  286.     }
  287.  
  288.     public function getJahr() {
  289.         return $this -> jahr;
  290.     }
  291.  
  292.     public function getDescriptionPerMD ( $m, $d ) {
  293.         $aRet = array();
  294.         $m    = intval( $m );
  295.         $d    = intval( $d );
  296.         try {
  297.             if ( ! checkdate( $m , $d , $this -> jahr ) ) {
  298.                 throw new Exception( 'Das übergebene Datum ' . $d . '.' . $m . '.' . $this -> jahr . ' ist ungültig.' );
  299.                 return false;
  300.  
  301.             }
  302.         } catch ( Exception $e ) {
  303.             echo 'Notiz: ',  $e->getMessage(), ' Datei: ' , $e->getFile(), ' Zeile: ', $e->getLine(), "\n";
  304.         }
  305.         $arReturns = array();
  306.         if ( isset( $this -> feiertage[$m][$d] ) ) {
  307.             if ( false == $this -> arrShowOnlyTypes ) {
  308.                 foreach( $this -> feiertage[$m][$d] as $found) {
  309.                     $aRet = array();
  310.                     $aRet['name'] = $found['name'];
  311.                     $aRet['codes'] = $found['codes'];
  312.                     $arReturns[] = $aRet;
  313.                 }
  314.             } else {
  315.                 foreach( $this -> feiertage[$m][$d] as $found) {
  316.                 #print_r($found);
  317.                    foreach ( $this -> arrShowOnlyTypes as $mustHave ) {
  318.                         #echo ' $mustHave: ', $mustHave, "\n";
  319.                        if ( $found['codes'] && in_array( $mustHave, $found['codes'] ) ) {
  320.                             $aRet = array();
  321.                             $aRet['name']  = $found['name'];
  322.                             $aRet['codes'] = $found['codes'];
  323.                             $arReturns[] = $aRet;
  324.                             break;
  325.                         }
  326.                     }
  327.                 }
  328.             }
  329.         }
  330.         if ( count ( $arReturns ) ) {
  331.             return $arReturns;
  332.         }
  333.     }
  334.  
  335.     public function setArrShowOnlyTypes ( $var ) {
  336.         $this -> arrShowOnlyTypes = array();
  337.         if (  'array' != gettype($var) ) {
  338.             $var = preg_replace( '/[^A-Za-z0-9_]+/' , ',' , $var );
  339.             $var = explode( ',', $var );
  340.         }
  341.         $arr2 = array();
  342.         foreach ($var as $s ) {
  343.             if ( '*' == $s ) {
  344.                 $this -> arrShowOnlyTypes = false;
  345.                 return true;
  346.             } else {
  347.                 if ('' != $s) {
  348.                     $arr2[] = strtoupper( trim( $s ) );
  349.                 }
  350.             }
  351.         }
  352.         if ( count( $arr2 ) ) {
  353.             $this -> arrShowOnlyTypes = $arr2;
  354.         } else {
  355.             $this -> arrShowOnlyTypes = false;
  356.         }
  357.     }
  358.  
  359.     public function getArrShowOnlyTypes () {
  360.         return $this -> arrShowOnlyTypes;
  361.     }
  362.  
  363.     private function addFeiertag ( $m, $d, $name, $arCodes ) {
  364.                 if (
  365.                         29 == $d &&
  366.                         2  == $m &&
  367.                         0 == date( 'L', mktime( 0, 0, 0, 2, 1, $this->jahr ) )
  368.                 )   {
  369.                                 $d=1; $m=3;
  370.                 }
  371.  
  372.         $arCodes2 = array();
  373.         foreach ($arCodes as $s) {
  374.             $s = trim($s);
  375.             if ($s) {
  376.                 $arCodes2[]=$s;
  377.             }
  378.         }
  379.         $ar['codes']= $arCodes2;
  380.         $ar['name'] = $name;
  381.         $this -> feiertage[ intval( $m )][intval( $d )][] = $ar;
  382.         return true;
  383.     }
  384.  
  385.     public function getDescriptionPerDTO ( $dto ) {
  386.                 list( $m, $d, $y ) = explode( '-',  date( 'n-j-Y', $dto ) );
  387.         return $this -> getDescriptionPerMD ( $m, $d, $y );
  388.     }
  389.  
  390.     public function isFeiertagPerDTO ( $dto, $mustHave ) {
  391.                 list( $d, $m, $y ) = explode( '-', date('j-n-Y', $dto) );
  392.         try {
  393.             if ( ! checkdate( $m , $d , $this -> jahr ) ) {
  394.                 throw new Exception( 'Das übergebene Datum ' . $d . '.' . $m . '.' . $this -> jahr . ' ist ungültig.' );
  395.                 return false;
  396.             }
  397.         } catch ( Exception $e ) {
  398.             echo 'Notiz: ',  $e->getMessage(), ' Datei: ' , $e->getFile(), ' Zeile: ', $e->getLine(), "\n";
  399.         }
  400.  
  401.         return $this -> isFeiertagPerMD( $mustHave, $m, $d, $y );
  402.     }
  403.  
  404.     public function isFeiertagPerMD($m, $d, $y=false ) {
  405.  
  406.         $m = intval($m);
  407.         $d = intval($d);
  408.  
  409.         if ( $y !== false ) {
  410.             $y = intval($y);
  411.             if ( $y != $this -> jahr )  {
  412.                 $this -> setJahr( intval( $y ) );
  413.             }
  414.         }
  415.  
  416.         if ( isset( $this -> feiertage[$m][$d] ) ) {
  417.             if ( false == $this -> arrShowOnlyTypes ) {
  418.                 foreach ( $this -> feiertage[$m][$d] as $found ) {
  419.                     return $found['name'];
  420.                 }
  421.             } else {
  422.                 foreach ( $this -> feiertage[$m][$d] as $found ) {
  423.                     foreach ( $this -> arrShowOnlyTypes as $mustHave ) {
  424.                         if ( $found['codes'] && in_array( $mustHave, $found['codes'] )  ) {
  425.                             return  $found['name'];
  426.                         }
  427.                     }
  428.                 }
  429.             }
  430.         }
  431.         return false;
  432.     }
  433.  
  434.     public function getWdName ($wd) {
  435.         if ( isset($this -> wdNames[$wd]) ) {
  436.             return $this -> wdNames[$wd];
  437.         } else {
  438.             error_log(__FILE__ . 'function: getWdName('.$wd.') - ungültiger Parameter');
  439.         }
  440.     }
  441.  
  442.     public function getMonthName ($d, $start=1) {
  443.         $ds = $d - $start;
  444.         if ( isset($this -> monthNames[$ds]) ) {
  445.             return $this -> monthNames[$ds];
  446.         } else {
  447.             error_log(__FILE__ . 'function: getMonthName('.$d.','.$start.') - ungültiger Parameter' );
  448.         }
  449.     }
  450.  
  451.     public function countKalendarItems () {
  452.         $c=0;
  453.         foreach ($this -> feiertage as $day) {
  454.             foreach ($day as $ereignisse) {
  455.                 foreach($ereignisse as $ereignis) {
  456.                     if (! count( $ereignis['codes'] ) ) {
  457.                         $c++;
  458.                     } else {
  459.                         $c = $c + count($ereignis['codes']);
  460.                     }
  461.                 }
  462.             }
  463.         }
  464.         return $c;
  465.     }
  466.  
  467. }
  468.  
  469. // constants definition for hhvm
  470.  
  471. $arr = [
  472.                 'CAL_EASTER_DEFAULT',
  473.                 'CAL_EASTER_ROMAN',
  474.                 'CAL_EASTER_ALWAYS_GREGORIAN',
  475.                 'CAL_EASTER_ALWAYS_JULIAN'
  476. ];
  477.  
  478. for ( $i=0; $i < count( $arr ); $i++ ) {
  479.         if( ! defined( $arr[$i] ) ) {  
  480.                 define( $arr[$i], $i );
  481.         }
  482. }
  483.  
  484.  
  485. if ( ! function_exists( 'easter_days' ) ) {
  486.  
  487.     /**
  488.     *    code by rabbit-aaron, https://github.com/rabbit-aaron
  489.     *    based on code by Simon Kershaw, <webmaster@ely.anglican.org>
  490.     *    License: https://github.com/rabbit-aaron/hhvm-php-easter/blob/master/LICENSE
  491.     **/
  492.  
  493.     function easter_days( $year = NULL, $method = CAL_EASTER_DEFAULT )  {
  494.  
  495.         /**
  496.             gibt den offset (in Tagen) zum 21.3. zurück.
  497.         **/
  498.  
  499.         if( $year == NULL ) {
  500.             $year = intval( date( 'Y' ) );
  501.         }
  502.         $golden = ( $year % 19 ) + 1;
  503.         if ( ( $year <= 1582 && $method != CAL_EASTER_ALWAYS_GREGORIAN ) ||
  504.             ( $year >= 1583 && $year <= 1752 && $method != CAL_EASTER_ROMAN && $method != CAL_EASTER_ALWAYS_GREGORIAN ) ||
  505.             $method == CAL_EASTER_ALWAYS_JULIAN ) {
  506.  
  507.             $dom = ( $year + (int)($year/4) + 5) % 7;
  508.             if ( $dom < 0 ) {
  509.                 $dom += 7;
  510.             }
  511.             $pfm = ( 3 - ( 11 * $golden ) - 7 ) % 30;
  512.             if ($pfm < 0) {
  513.                 $pfm += 30;
  514.             }
  515.         } else {
  516.             $dom = ( $year + (int)( $year / 4 ) - (int)( $year / 100 ) + (int)( $year / 400 ) ) % 7;
  517.             if ( $dom < 0 ) {
  518.                 $dom += 7;
  519.             }
  520.             $solar = (int)( ( $year - 1600 ) / 100 ) - (int)( ( $year - 1600 ) / 400) ;
  521.             $lunar = (int)( ( ( (int)( ($year - 1400 ) / 100 ) ) * 8 ) / 25 );
  522.             $pfm = ( 3 - ( 11 * $golden ) + $solar - $lunar ) % 30;
  523.             if ( $pfm < 0 ) {
  524.                 $pfm += 30;
  525.             }
  526.         }
  527.         if ( ( $pfm == 29 ) || ( $pfm == 28 && $golden > 11 ) ) {
  528.             $pfm--;
  529.         }
  530.         $tmp = ( 4 - $pfm - $dom ) % 7;
  531.         if ( $tmp < 0 ) {
  532.             $tmp += 7;
  533.         }
  534.         $easter = $pfm + $tmp + 1;               /* Easter as the number of days after 21st March */
  535.         return $easter;
  536.     }
  537. }