<?php
/*
       444444444  
      4::::::::4  
     4:::::::::4  
    4::::44::::4  
   4::::4 4::::4   Four Island
  4::::4  4::::4  
 4::::4   4::::4   Written and maintained by Starla Insigna
4::::444444::::444
4::::::::::::::::4  includes/specialdates.php
4444444444:::::444
          4::::4   Please do not use, reproduce or steal the
          4::::4   contents of this file without explicit
          4::::4   permission from Hatkirby.
        44::::::44
        4::::::::4
        4444444444
*/

if (!defined('S_INCLUDE_FILE')) {define('S_INCLUDE_FILE',1);}

require('headerproc.php');

/* REMEMBER!
Months: Jan=1-Dec=12
Dates: 1=1-...=...
Days: Mon=1-Sun=7 */

$specialdates = array();

$j=0;
for ($j=0;$j<(365+sd_isLeapYear());$j++)
{
	$specialdates[$j] = '';
}

sd_solar_annual('New Years Day',1,1); //BG Pic; DateFinder
sd_lunar_annual('Martin Luther King Day',1,1,3); //BG Pic; DateFinder
sd_solar_annual('Groundhog Day',2,2); //BG Pic; DateFinder
sd_lunar_annual('Presidents Day',2,1,3); //DateFinder
sd_solar_annual('Valentines Day',2,14); //BG Pic; DateFinder
sd_solar_multiannual('Leap Day',2,29,4,2004); //DateFinder
sd_solar_annual('St Patricks Day',3,17); //DateFinder
sd_solar_annual('Tri\'s CIEday',4,22); //DateFinder
sd_solar_annual('Silence Day',4,25); //DateFinder
sd_solar_annual('WCA Day',5,5); //DateFinder
sd_lunar_annual('Mothers Day',5,7,2); //BG Pic; DateFinder; Header Pic
sd_lunar_annual('Memorial Day',5,1,4); //BG Pic; DateFinder; Header Pic
sd_easter(); //BG Pic; DateFinder
sd_solar_annual('Flag Day',6,14); //BG Pic; DateFinder
sd_solar_annual('Hatkirbys B-Day',6,17); //BG Pic; DateFinder; Header Pic
sd_lunar_annual('Fathers Day',6,7,3); //BG Pic; DateFinder
sd_solar_annual('CTNH',6,17); //Header Pic; DateFinder
sd_solar_annual('Independance Day',7,4); //BG Pic; DateFinder
sd_lunar_annual('SysAdminDay',7,5,4); //DateFinder
sd_lunar_annual('Labor Day',9,1,1); //Yet to be implemented
sd_solar_annual('Four Island A',9,22); //BG Pic; DateFinder; Header Pic
sd_lunar_annual('Columbus Day',10,1,2); //BG Pic; DateFinder
sd_solar_annual('Halloween',10,31); //BG Pic; DateFinder
sd_solar_annual('Veterans Day',11,11); //BG Pic; DateFinder
sd_lunar_annual('Thanksgiving',11,4,4); //DateFinder
sd_kirbyWeek(); //BG Pic; DateFinder
sd_solar_annual('Christmas Eve',12,24); //BG Pic; DateFinder
sd_solar_annual('Christmas Day',12,25); //BG Pic; DateFinder
sd_solar_annual('New Years Eve',12,31); //BG Pic; DateFinder

function sd_solar_annual($id,$month,$date)
{
	$did = sd_getMonthStart($month-1);
	$did += ($date-1);
	sd_addDateIn($id,$did);
}

function sd_solar_monthly($id,$date)
{
	$i=0;
	for ($i=0;$i<12;$i++)
	{
		sd_solar_annual($id,$i+1,$date);
	}
}

function sd_lunar_annual($id,$month,$dotw,$wn)
{
	$did = sd_getMonthStart($month-1);
	$ys = sd_clearDate();
	$ys+=(60*60*24*$did);
	if (sd_date('N',$ys)>$dotw)
	{
		$ys+=(((7-sd_date('N',$ys))+$dotw)*60*60*24);
	} else {
		$ys+=(($dotw-sd_date('N',$ys))*60*60*24);
	}
	$ys+=(($wn-1)*60*60*24*7);
	$did = sd_getMonthStart(sd_date('m',$ys)-1);
	$did += (sd_date('j',$ys)-1);
	sd_addDateIn($id,$did);
}

function sd_getMonthStart($month)
{
	if ($month==0)
	{
		return 0;
	} else {
		$c = sd_daysInMonth($month-1)+sd_getMonthStart($month-1);

		return ($c);
	}
}

function sd_daysInMonth($month)
{
	switch ($month)
	{
		case 0: return 31;
		case 1: return (28+sd_isLeapYear());
		case 2: return 31;
		case 3: return 30;
		case 4: return 31;
		case 5: return 30;
		case 6: return 31;
		case 7: return 31;
		case 8: return 30;
		case 9: return 31;
		case 10: return 30;
		case 11: return 31;
		default: throw new Exception('Invalid month ID');
	}
}

function sd_isLeapYear()
{
	return sd_date('L');
}

function sd_isSpecialDay($id)
{
	global $specialdates;
	$did = sd_getMonthStart(sd_date('n')-1);
	$did += (sd_date('j')-1);
	if ($specialdates[$did] == $id)
	{
		return 1;
	} else {
		return 0;
	}
}

function sd_ifNoSpecialDay()
{
	global $specialdates;
	$did = sd_getMonthStart(sd_date('n')-1);
	$did += (sd_date('j')-1);
	if ($specialdates[$did] == '')
	{
		return 1;
	} else {
		return 0;
	}
}

function sd_kirbyWeek()
{
	$did = sd_getMonthStart(11);
	$ys = sd_clearDate();
	$ys+=(60*60*24*24);
	$ys+=(60*60*24*$did);
	$tWD=sd_date('N',$ys);
	if ($tWD==7) {$tWD=0;}
	$ys-=($tWD*60*60*24);
	$ys-=(60*60*24*7);
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys));
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys)+1);
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys)+2);
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys)+3);
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys)+4);
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys)+5);
	sd_solar_annual('Kirby Week',12,sd_date('j',$ys)+6);
}

function sd_easter()
{
	$nYear = sd_date('Y');
	$nCent = $nYear/100;
	$nRemain19 = $nYear%19;
	$n1 = ($nCent-15)/2+202-11*$nRemain19;
	if ($nCent>20)
	{
		if ($nCent>26) {$n1--;}
		if ($nCent>38) {$n1--;}
		if ($nCent==21 || $nCent==24 || $nCent==25 || $nCent==33 || $nCent==36 || $nCent==37) {$n1--;}
	}
	$n1%=30;
	if ($n1==29 || ($n1 && $nRemain19>10)) {$n1--;}
	$ys = sd_clearDate();
	if ($n1>10)
	{
		$ys+=(60*60*24*sd_getMonthStart(3));
		$ys+=(60*60*24*($n1-10-1));
	} else {
		$ys+=(60*60*24*sd_getMonthStart(2));
		$ys+=(60*60*24*($n1+21-1));
	}
	$nWD = sd_date('N',$ys);
	if ($nWD==7) {$nWD=0;}
	$ys+=(60*60*24*(7-$nWD));
	sd_solar_annual('Easter',sd_date('m',$ys),sd_date('j',$ys));
	$ys-=(60*60*24*47);
	sd_solar_annual('Mardi Gras',sd_date('m',$ys),sd_date('j',$ys));
	$ys+=(60*60*24);
	sd_solar_annual('Ash Wednesday',sd_date('m',$ys),sd_date('j',$ys));
	$ys+=(60*60*24*39);
	sd_solar_annual('Palm Sunday',sd_date('m',$ys),sd_date('j',$ys));
	$ys+=(60*60*24*5);
	sd_solar_annual('Good Friday',sd_date('m',$ys),sd_date('j',$ys));
}

function sd_findDay($id)
{
	global $specialdates;
	$i=0;
	for ($i=0;$i<(365+sd_isLeapYear());$i++)
	{
		if ($specialdates[$i] == $id)
		{
			return $i;
		}
	}
	throw new Exception('Specified holiday does not exist');
}

function sd_findNextDay()
{
	global $specialdates;
	$did = sd_getMonthStart(sd_date('n')-1);
	$did += (sd_date('j')-1);
	$i=0;
	for ($i=$did;$i<(365+sd_isLeapYear());$i++)
	{
		if ($specialdates[$i] != '')
		{
			return $i;
		}
	}
	throw new Exception('No more holidays this year');
}

function sd_getCurrentDay()
{
	global $specialdates;
	$did = sd_getMonthStart(sd_date('n')-1);
	$did += (sd_date('j')-1);
	return $specialdates[$did];
}

function sd_solar_multiannual($id,$month,$date,$years,$sy)
{
	global $specialdates;
	$cy = sd_date('Y');
	$cy -= $sy;
	if ($cy==0 || $cy%$years==0)
	{
		$did = sd_getMonthStart($month-1);
		$did += ($date-1);
		$specialdates[$did] = $id;
	}
}

function sd_solar_once($id,$month,$date,$year)
{
	if ($year == sd_date('Y'))
	{
		sd_solar_annual($id,$month,$date);
	}
}

function sd_getDay($id)
{
	global $specialdates;
	return $specialdates[$id];
}

function sd_lunar_monthly($id,$dotw,$wn)
{
	$i=1;
	for ($i=1;$i<13;$i++) {
		sd_lunar_annual($id,$i,$dotw,$wn);
	}
}

function sd_date($format,$timestamp = 0)
{
	if ($timestamp == 0) {$timestamp = time();}
	return date($format,$timestamp);
}

function sd_clearDate()
{
	$ys = strtotime('January 1 ' . date('Y'));
	return $ys;
}

function sd_addDateIn($id,$dateid)
{
	global $specialdates;
	$specialdates[$dateid] = $id;
}

function sd_dateFinder()
{
	if (sd_ifNoSpecialDay())
	{
		$did = sd_getMonthStart(date('n')-1);
		$did += (date('j')-1);
		$did = sd_findNextDay() - $did;
		return ($did . ' more days until the next holiday!');
	} else {
		switch (sd_getCurrentDay())
		{
			case 'New Years Day': return 'Happy new years!';
			case 'Martin Luther King Day': return 'Happy Martin Luther King Day!';
			case 'Groundhog Day': return 'It\'s groundhog day? Will he see his shadow?';
			case 'Presidents Day': return 'Happy President\'s Day!';
			case 'Valentines Day': return 'Happy Valentines Day! Will you be mine?';
			case 'St Patricks Day': return 'Happy St. Patrick\'s Day! If you\'re not wearing green, I\'ll pinch you!';
			case 'Mothers Day': return 'Happy Mothers Day!';
			case 'Memorial Day': return 'Remember...';
			case 'Easter': return 'Happy Easter! Where are those eggs?';
			case 'Mardi Gras': return 'Happy Mardi Gras! Time to get fat!';
			case 'Ash Wednesday': return 'Happy Ash Wednesday! Did you get your ashes?';
			case 'Palm Sunday': return 'Happy Palm Sunday!';
			case 'Holy Thursday': return 'Happy Holy Thursday!';
			case 'Hatkirbys B-Day': return 'Happy Birthday to me! Happy Birthday to me! Happy Birthday dear Hatkirby! Happy Birthday to me!';
			case 'Flag Day': return 'Happy Flag Day!';
			case 'Fathers Day': return 'Happy Fathers Day!';
			case 'Independance Day': return 'Happy 4th of July!';
			case 'Labor Day': return 'Happy Labor Day!';
			case 'Four Island A': return ('Happy birthday Four Island! Four Island is ' . (date('Y')-2007) . ' years old!');
			case 'Columbus Day': return 'Happy Columbus Day!';
			case 'Halloween': return 'Happy Halloween!';
			case 'Veterans Day': return 'Only 2 minutes of silence. Remember... remember...';
			case 'Thanksgiving': return 'Happy Thanksgiving! Gobble gobble gobble gobble!';
			case 'Kirby Week': return 'It\'s Kirby Week! Not only is it a time of celebreation and fun on Four Island, it\'s only a week before Christmas!';
			case 'Christmas Eve': return '"1 Day Left" says Fourie!';
			case 'Christmas Day': return 'Merry Christmas! Time for presents!';
			case 'New Years Eve': return '5... 4... 3... 2...';
			case 'SysAdminDay': return '<A HREF="http://www.sysadminday.com">If you can read this, thank your <I><B>sysadmin</B></I></A>';
			case 'WCA Day': return '<A HREF="http://wca2001.keenspace.com">Webcomic Appreciation Day!</A> Stare in wonder at all of your favorite webcomics! Like Pillowcase, for instance!';
			case 'Leap Day': return 'What day is it? LEAP DAY? This only happens once every four years! LET\'S LEAP IN JOY!';
			case 'Tris CIEday': return 'This is the day that shei came.';
			case 'Silence Day': return 'Support LGBT people by keeping the silence until 5 PM.';
			case 'CTNH': return '<A HREF="/fuhsdiufgsadiufgaisfioas.php">It never happened.</A>';
		}
	}
}

?>