[2] | 1 | <?php |
---|
| 2 | /**************************************************************************\ |
---|
| 3 | * eGroupWare - holidaycalc_JP * |
---|
| 4 | * http://www.egroupware.org * |
---|
| 5 | * Based on Yoshihiro Kamimura <your@itheart.com> * |
---|
| 6 | * http://www.itheart.com * |
---|
| 7 | * -------------------------------------------- * |
---|
| 8 | * This program is free software; you can redistribute it and/or modify it * |
---|
| 9 | * under the terms of the GNU General Public License as published by the * |
---|
| 10 | * Free Software Foundation; either version 2 of the License, or (at your * |
---|
| 11 | * option) any later version. * |
---|
| 12 | \**************************************************************************/ |
---|
| 13 | |
---|
| 14 | |
---|
| 15 | class holidaycalc |
---|
| 16 | { |
---|
| 17 | function calculate_date($holiday, &$holidays, $year, &$i) |
---|
| 18 | { |
---|
| 19 | static $cached_month; |
---|
| 20 | static $cached_day; |
---|
| 21 | static $cached_observance_rule; |
---|
| 22 | |
---|
| 23 | if ($holiday['day'] == 0 && $holiday['dow'] != 0 && $holiday['occurence'] != 0) |
---|
| 24 | { |
---|
| 25 | $dow = $GLOBALS['phpgw']->datetime->day_of_week($year, $holiday['month'], 1); |
---|
| 26 | $dayshift = (($holiday['dow'] + 7) - $dow) % 7; |
---|
| 27 | $day = ($holiday['occurence'] - 1) * 7 + $dayshift + 1; |
---|
| 28 | |
---|
| 29 | // Happy monday law. |
---|
| 30 | if ($holiday['month'] == 1) |
---|
| 31 | { |
---|
| 32 | if ($year < 2000) |
---|
| 33 | { |
---|
| 34 | $day = 15; |
---|
| 35 | } |
---|
| 36 | } |
---|
| 37 | elseif ($holiday['month'] == 7) |
---|
| 38 | { |
---|
| 39 | if ($year < 2003) |
---|
| 40 | { |
---|
| 41 | $day = 20; |
---|
| 42 | } |
---|
| 43 | } |
---|
| 44 | elseif ($holiday['month'] == 9) |
---|
| 45 | { |
---|
| 46 | if ($year < 2003) |
---|
| 47 | { |
---|
| 48 | $day = 15; |
---|
| 49 | } |
---|
| 50 | } |
---|
| 51 | elseif ($holiday['month'] == 10) |
---|
| 52 | { |
---|
| 53 | if ($year < 2000) |
---|
| 54 | { |
---|
| 55 | $day = 10; |
---|
| 56 | } |
---|
| 57 | } |
---|
| 58 | } |
---|
| 59 | elseif ($holiday['day'] == 0 && $holiday['dow'] == 0 && $holiday['occurence'] == 0) |
---|
| 60 | { |
---|
| 61 | // For the next generation. |
---|
| 62 | // over 2151, please set $factor... |
---|
| 63 | if ($holiday['month'] == 3) |
---|
| 64 | { |
---|
| 65 | // for Vernal Equinox |
---|
| 66 | if ($year >= 1980 && $year <= 2099) |
---|
| 67 | { |
---|
| 68 | $factor = 20.8431; |
---|
| 69 | } |
---|
| 70 | elseif ($year >= 2100 && $year <= 2150) |
---|
| 71 | { |
---|
| 72 | $factor = 21.851; |
---|
| 73 | } |
---|
| 74 | } |
---|
| 75 | elseif ($holiday['month'] == 9) |
---|
| 76 | { |
---|
| 77 | // for Autumnal Equinox |
---|
| 78 | if ($year >= 1980 && $year <= 2099) |
---|
| 79 | { |
---|
| 80 | $factor = 23.2488; |
---|
| 81 | } |
---|
| 82 | elseif ($year >= 2100 && $year <= 2150) |
---|
| 83 | { |
---|
| 84 | $factor = 24.2488; |
---|
| 85 | } |
---|
| 86 | } |
---|
| 87 | |
---|
| 88 | $day = (int)($factor + 0.242194 * ($year - 1980) |
---|
| 89 | - (int)(($year - 1980) / 4)); |
---|
| 90 | } |
---|
| 91 | else |
---|
| 92 | { |
---|
| 93 | // normal holiday |
---|
| 94 | $day = $holiday['day']; |
---|
| 95 | } |
---|
| 96 | |
---|
| 97 | if ($year >= 1985 && $holiday['month'] == $cached_month && $day == $cached_day + 2 && $cached_observance_rule == True && $holiday['observance_rule'] == True) |
---|
| 98 | { |
---|
| 99 | $pdow = $GLOBALS['phpgw']->datetime->day_of_week($year,$holiday['month'],$day-1); |
---|
| 100 | if ($pdow != 0) |
---|
| 101 | { |
---|
| 102 | $addcnt = count($holidays) + 1; |
---|
| 103 | $holidays[$addcnt]['locale'] = $holiday['locale']; |
---|
| 104 | if ($pdow == 1) |
---|
| 105 | { |
---|
| 106 | $holidays[$addcnt]['name'] = lang('overlap holiday'); |
---|
| 107 | } |
---|
| 108 | else |
---|
| 109 | { |
---|
| 110 | $holidays[$addcnt]['name'] = lang('people holiday'); |
---|
| 111 | } |
---|
| 112 | $holidays[$addcnt]['day'] = $day - 1; |
---|
| 113 | $holidays[$addcnt]['month'] = $holiday['month']; |
---|
| 114 | $holidays[$addcnt]['occurence'] = 0; |
---|
| 115 | $holidays[$addcnt]['dow'] = 0; |
---|
| 116 | $holidays[$addcnt]['date'] = mktime(0,0,0,$holiday['month'],$day-1,$year); |
---|
| 117 | $holidays[$addcnt]['observance_rule'] = 0; |
---|
| 118 | } |
---|
| 119 | } |
---|
| 120 | |
---|
| 121 | $cached_month = $holiday['month']; |
---|
| 122 | $cached_day = $day; |
---|
| 123 | $cached_observance_rule = $holiday['observance_rule']; |
---|
| 124 | |
---|
| 125 | if ($year >= 1985 && $holiday['month'] == 5 && $day == 3) |
---|
| 126 | { |
---|
| 127 | ; |
---|
| 128 | } |
---|
| 129 | elseif ($holiday['observance_rule'] == True) |
---|
| 130 | { |
---|
| 131 | $dow = $GLOBALS['phpgw']->datetime->day_of_week($year,$holiday['month'],$day); |
---|
| 132 | // This now calulates Observed holidays and creates a new entry for them. |
---|
| 133 | if($dow == 0) |
---|
| 134 | { |
---|
| 135 | $addcnt = count($holidays) + 1; |
---|
| 136 | $holidays[$addcnt]['locale'] = $holiday['locale']; |
---|
| 137 | $holidays[$addcnt]['name'] = lang('overlap holiday'); |
---|
| 138 | $holidays[$addcnt]['day'] = $day + 1; |
---|
| 139 | $holidays[$addcnt]['month'] = $holiday['month']; |
---|
| 140 | $holidays[$addcnt]['occurence'] = $holiday['occurence']; |
---|
| 141 | $holidays[$addcnt]['dow'] = $holiday['dow']; |
---|
| 142 | $holidays[$addcnt]['date'] = mktime(0,0,0,$holiday['month'],$day+1,$year); |
---|
| 143 | $holidays[$addcnt]['observance_rule'] = 0; |
---|
| 144 | } |
---|
| 145 | } |
---|
| 146 | |
---|
| 147 | $date = mktime(0,0,0,$holiday['month'],$day,$year); |
---|
| 148 | |
---|
| 149 | return $date; |
---|
| 150 | } |
---|
| 151 | } |
---|
| 152 | ?> |
---|