User:Sajt/Script to rip game logs from nhl.com

This is a work in progress.

<?php

$this_team = 'dal';
$preseason = FALSE;

$minilegend = TRUE;

$teams = array
(
// 'num' :  used in POST fields
// 'city' : team's "first name" (matches up with text in the nhl.com pages)
// 'wiki' : name of the wiki article for the team
// 'hbg' :  header background colour (the one-time heading)
// 'htx' :  header text colour
// 'mbg' :  month background colour (the per-month heading)
// 'mtx' :  month text colour
	'ana' => array('num' => 1,  'city' => "Anaheim",      'wiki' => "Anaheim Ducks",                'hbg' => "#000000", 'htx' => "#F47937", 'mbg' => "#000000", 'mtx' => "#F47937"),
	'atl' => array('num' => 2,  'city' => "Atlanta",      'wiki' => "Atlanta Thrashers"),
	'bos' => array('num' => 3,  'city' => "Boston",       'wiki' => "Boston Bruins"),
	'buf' => array('num' => 4,  'city' => "Buffalo",      'wiki' => "Buffalo Sabres",               'hbg' => "#002D62", 'htx' => "#FDBB30", 'mbg' => "#FDBB30", 'mtx' => "#FFFFFF"),
	'cal' => array('num' => 5,  'city' => "Calgary",      'wiki' => "Calgary Flames"),
	'car' => array('num' => 6,  'city' => "Carolina",     'wiki' => "Carolina Hurricanes"),
	'chi' => array('num' => 7,  'city' => "Chicago",      'wiki' => "Chicago Blackhawks",           'hbg' => "#BF2F38", 'htx' => "#231F20", 'mbg' => "#231F20", 'mtx' => "#FFFFFF"),
	'col' => array('num' => 8,  'city' => "Colorado",     'wiki' => "Colorado Avalanche"),
	'cbj' => array('num' => 9,  'city' => "Columbus",     'wiki' => "Columbus Blue Jackets"),
	'dal' => array('num' => 10, 'city' => "Dallas",       'wiki' => "Dallas Stars",                 'hbg' => "#000000", 'htx' => "#D5A10E", 'mbg' => "#D5A10E", 'mtx' => "#FFFFFF"),
	'det' => array('num' => 11, 'city' => "Detroit",      'wiki' => "Detroit Red Wings"),
	'edm' => array('num' => 12, 'city' => "Edmonton",     'wiki' => "Edmonton Oilers"),
	'flo' => array('num' => 13, 'city' => "Florida",      'wiki' => "Florida Panthers"),
	'lak' => array('num' => 14, 'city' => "Los Angeles",  'wiki' => "Los Angeles Kings",            'hbg' => "#231F20", 'htx' => "#C0C0C0", 'mbg' => "#393997", 'mtx' => "#FFFFFF"),
	'min' => array('num' => 15, 'city' => "Minnesota",    'wiki' => "Minnesota Wild",               'hbg' => "#166D5F", 'htx' => "#EEE1C5", 'mbg' => "#EEE1C5", 'mtx' => "#000000"),
	'mtl' => array('num' => 16, 'city' => "Montreal",     'wiki' => "Montreal Canadiens"),
	'nsh' => array('num' => 17, 'city' => "Nashville",    'wiki' => "Nashville Predators",          'hbg' => "#FDBB30", 'htx' => "#002D62", 'mbg' => "#002D62", 'mtx' => "#FFFFFF"),
	'njd' => array('num' => 18, 'city' => "New Jersey",   'wiki' => "New Jersey Devils"),
	'nyi' => array('num' => 19, 'city' => "NY Islanders", 'wiki' => "New York Islanders"),
	'nyr' => array('num' => 20, 'city' => "NY Rangers",   'wiki' => "New York Rangers"),
	'ott' => array('num' => 21, 'city' => "Ottawa",       'wiki' => "Ottawa Senators"),
	'phi' => array('num' => 22, 'city' => "Philadelphia", 'wiki' => "Philadelphia Flyers"),
	'phx' => array('num' => 23, 'city' => "Phoenix",      'wiki' => "Phoenix Coyotes",              'hbg' => "#900028", 'htx' => "#EEE1C5", 'mbg' => "#EEE1C5", 'mtx' => "#900028"),
	'pit' => array('num' => 24, 'city' => "Pittsburgh",   'wiki' => "Pittsburgh Penguins"),
	'sjs' => array('num' => 25, 'city' => "San Jose",     'wiki' => "San Jose Sharks"),
	'stl' => array('num' => 26, 'city' => "St Louis",     'wiki' => "St. Louis Blues (ice hockey)", 'hbg' => "#092c57", 'htx' => "#ffc322", 'mbg' => "#ffc322", 'mtx' => "#092c57"),
	'tbl' => array('num' => 27, 'city' => "Tampa Bay",    'wiki' => "Tampa Bay Lightning"),
	'tor' => array('num' => 28, 'city' => "Toronto",      'wiki' => "Toronto Maple Leafs"),
	'van' => array('num' => 29, 'city' => "Vancouver",    'wiki' => "Vancouver Canucks",            'hbg' => "#003e7e", 'htx' => "#c9c0bb", 'mbg' => "#003e7e", 'mtx' => "#c9c0bb"),
	'wsh' => array('num' => 30, 'city' => "Washington",   'wiki' => "Washington Capitals")
);

if (!isset($teams[$this_team]))
	die("bad team");

// sigh
$goalies = array
(
	'ANDERSON, CRAIG' => array('Anderson', 'Craig Anderson (ice hockey)'),
	'AULD, ALEX' => array('Auld', 'Alex Auld'),
	'BACKSTROM, NIKLAS' => array('Backstrom', 'Nicklas Bäckström'),
	'BIRON, MARTIN' => array('Biron', 'Martin Biron'),
	'BISHOP, BEN' => array('Bishop', 'Ben Bishop'),
	'BOUCHER, BRIAN' => array('Boucher', 'Brian Boucher'),
	'BRODEUR, MARTIN' => array('Brodeur', 'Martin Brodeur'),
	'BRYZGALOV, ILJA' => array('Bryzgalov', 'Ilya Bryzgalov'),
	'BUDAJ, PETER' => array('Budaj', 'Peter Budaj'),
	'CLIMIE, MATT' => array('Climie', 'Matt Climie'),
	'CONKLIN, TY' => array('Conklin', 'Ty Conklin'),
	'CRAWFORD, COREY' => array('Crawford', 'Corey Crawford'),
	'DIPIETRO, RICK' => array('DiPietro', 'Rick DiPietro'),
	'DROUIN-DESLAURIERS, JEFF' => array('Deslauriers', 'Jeff Drouin-Deslauriers'),
	'DUBIELEWICZ, WADE' => array('Dubielewicz', 'Wade Dubielewicz'),
	'ELLIOTT, BRIAN' => array('Elliott', 'Brian Elliott'),
	'ELLIS, DAN' => array('Ellis', 'Dan Ellis'),
	'ENROTH, JHONAS' => array('Enroth', 'Jhonas Enroth'),
	'ERSBERG, ERIK' => array('Ersberg', 'Erik Ersberg'),
	'FERNANDEZ, MANNY' => array('Fernandez', 'Manny Fernandez (ice hockey)'),
	'FLEURY, MARC-ANDRE' => array('Fleury', 'Marc-André Fleury'),
	'GARON, MATHIEU' => array('Garon', 'Mathieu Garon'),
	'GERBER, MARTIN' => array('Gerber', 'Martin Gerber'),
	'GIGUERE, JEAN-SEBASTIEN' => array('Giguere', 'Jean-Sébastien Giguère'),
	'HALAK, JAROSLAV' => array('Halak', 'Jaroslav Halák'),
	'HARDING, JOSH' => array('Harding', 'Josh Harding'),
	'HEDBERG, JOHAN' => array('Hedberg', 'Johan Hedberg'),
	'HILLER, JONAS' => array('Hiller', 'Jonas Hiller'),
	'HUET, CRISTOBAL' => array('Huet', 'Cristobal Huet'),
	'JOHNSON, BRENT' => array('Johnson', 'Brent Johnson'),
	'JOSEPH, CURTIS' => array('Joseph', 'Curtis Joseph'),
	'KHABIBULIN, NIKOLAI' => array('Khabibulin', 'Nikolai Khabibulin'),
	'KIPRUSOFF, MIIKKA' => array('Kiprusoff', 'Miikka Kiprusoff'),
	'KOLZIG, OLAF' => array('Kolzig', 'Olaf Kölzig'),
	'LABARBERA, JASON' => array('LaBarbera', 'Jason LaBarbera'),
	'LALIME, PATRICK' => array('Lalime', 'Patrick Lalime'),
	'LECLAIRE, PASCAL' => array('Leclaire', 'Pascal Leclaire'),
	'LEGACE, MANNY' => array('Legace', 'Manny Legacé'),
	'LEHTONEN, KARI' => array('Lehtonen', 'Kari Lehtonen'),
	'LEIGHTON, MICHAEL' => array('Leighton', 'Michael Leighton'),
	'LUNDQVIST, HENRIK' => array('Lundqvist', 'Henrik Lundqvist'),
	'LENEVEU, DAVID' => array('LeNeveu', 'David LeNeveu'),
	'LUONGO, ROBERTO' => array('Luongo', 'Roberto Luongo'),
	'MACDONALD, JOEY' => array('MacDonald', 'Joey MacDonald'),
	'MACINTYRE, DREW' => array('MacIntyre', 'Drew MacIntyre'),
	'MANNINO, PETER' => array('Mannino', 'Peter Mannino'),
	'MASON, CHRIS' => array('Mason', 'Chris Mason'),
	'MASON, STEVE' => array('Mason', 'Steve Mason (ice hockey)'),
	'MCKENNA, MIKE' => array('McKenna', 'Mike McKenna (ice hockey)'),
	'MILLER, RYAN' => array('Miller', 'Ryan Miller (ice hockey)'),
	'MONTOYA, AL' => array('Montoya', 'Al Montoya'),
	'NABOKOV, EVGENI' => array('Nabokov', 'Evgeni Nabokov'),
	'NIEMI, ANTTI' => array('Niemi', 'Antti Niemi (ice hockey)'),
	'NIITTYMAKI, ANTERO' => array('Niittymaki', 'Antero Niittymäki'),
	'NORRENA, FREDRIK' => array('Norrena', 'Fredrik Norrena'),
	'OSGOOD, CHRIS' => array('Osgood', 'Chris Osgood'),
	'PAVELEC, ONDREJ' => array('Pavelec', 'Ondrej Pavelec'), // note- the 'r' in Ondrej is actually supposed to have a caron on it
	'PRICE, CAREY' => array('Price', 'Carey Price'),
	'QUICK, JONATHAN' => array('Quick', 'Jonathan Quick'),
	'RAYCROFT, ANDREW' => array('Raycroft', 'Andrew Raycroft'),
	'RINNE, PEKKA' => array('Rinne', 'Pekka Rinne'),
	'ROLOSON, DWAYNE' => array('Roloson', 'Dwayne Roloson'),
	'SABOURIN, DANY' => array('Sabourin', 'Dany Sabourin'),
	'SANFORD, CURTIS' => array('Sanford', 'Curtis Sanford'),
	'SCHNEIDER, CORY' => array('Schneider', 'Cory Schneider'),
	'SMITH, MIKE' => array('Smith', 'Mike Smith (ice hockey b. 1982)'),
	'STEPHAN, TOBIAS' => array('Stephan', 'Tobias Stephan'),
	'TAYLOR, DANIEL' => array('Taylor', 'Daniel Taylor (ice hockey)'),
	'TELLQVIST, MIKAEL' => array('Tellqvist', 'Mikael Tellqvist'),
	'THEODORE, JOSE' => array('Theodore', 'José Théodore'),
	'THOMAS, TIM' => array('Thomas', 'Tim Thomas (ice hockey)'),
	'TORDJMAN, JOSH' => array('Tordjman', 'Josh Tordjman'),
	'TOSKALA, VESA' => array('Toskala', 'Vesa Toskala'),
	'TURCO, MARTY' => array('Turco', 'Marty Turco'),
	'VALIQUETTE, STEPHEN' => array('Valiquette', 'Stephen Valiquette'),
	'VOKOUN, TOMAS' => array('Vokoun', 'Tomáš Vokoun'),
	'WARD, CAM' => array('Ward', 'Cam Ward')
);

function find_team($city)
{
	global $teams;
	foreach ($teams as $key => $team)
		if (strtolower($team['city']) == strtolower($city))
			return $key;
	die("find_team failed ($city)");
}

$ch = curl_init();

if ($preseason)
{
	$fields = array();
	$fields['formids'] = 'PropertySelection,PropertySelection_0,PropertySelection_1,PropertySelection_2';
	$fields['component'] = '$SimpleForm';
	$fields['page'] = 'schedulebyseason';
	$fields['service'] = 'direct';
	$fields['submitmode'] = '';
	$fields['submitname'] = '';
	$fields['PropertySelection'] = '0'; // 2008-2009 season
	$fields['PropertySelection_0'] = '0'; // pre-season
	$fields['PropertySelection_1'] = $teams[$this_team]['num']; // team number
	$fields['PropertySelection_2'] = 0; // all networks

	curl_setopt($ch, CURLOPT_URL, "http://www.nhl.com/ice/app");
	curl_setopt($ch, CURLOPT_POST, TRUE);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
}
else
{
	curl_setopt($ch, CURLOPT_URL, "http://www.nhl.com/ice/schedulebyseason.htm?team=$this_team");
}

curl_setopt($ch, CURLOPT_FAILONERROR, TRUE); // fail silently if http code returned is >= 400
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // allow redirects ("Location: " in header)
curl_setopt($ch, CURLOPT_HEADER, FALSE); // don't include header in output
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // return value of curl_exec instead of printing to stdout

$contents = curl_exec($ch);

curl_close($ch);

function get_field($pattern, $contents, &$pos, $crash_on_fail = TRUE)
{
	if (!preg_match($pattern, $contents, $matches, PREG_OFFSET_CAPTURE, $pos))
		return FALSE;
	$pos = $matches[0][1] + strlen($matches[0][0]);
	return $matches[1][0];
}

function get_games($contents)
{
	$games = array();
	$pos = 0;

	for (;;)
	{
		$game = array();

		$game['date'] = get_field("/<div class=\"skedDataRow date\">(.*?)<\/div>/", $contents, $pos);

		if ($game['date'] === FALSE)
			return $games;

		$game['away'] = get_field("/<div style=\"[^\"]+\"><a href=\"http:\/\/.*?\.com\">(.*?)</", $contents, $pos);
		$game['home'] = get_field("/<div style=\"[^\"]+\"><a href=\"http:\/\/.*?\.com\">(.*?)</", $contents, $pos);

		$result = get_field("/<div class=\"skedDataRow network\">(.*?)<\/div>/s", $contents, $pos);

		if (preg_match("/FINAL <span[^\>]*?>[A-Z]{3} \(([0-9]+?)\)<\/span> \- <span[^\>]*?>[A-Z]{3} \(([0-9]+?)\)<\/span>/", $result, $matches))
		{
			$game['final'] = TRUE;
			$game['awayscore'] = $matches[1];
			$game['homescore'] = $matches[2];

			if (strpos($result, " SO") !== FALSE)
				$game['overtime'] = "SO";
			else if (strpos($result, " OT") !== FALSE)
				$game['overtime'] = "OT";
			else
				$game['overtime'] = FALSE;
		}
		else
		{
			$game['final'] = FALSE;
		}

	// get recap... which might be missing (in some preseason games)
	// note that if the recap is missing, we have no game id and can't look up the scoresheet for goalies and attendance
	// so if you know those, fill them in by hand from some other source
		if ($game['final'])
		{
			$old_pos = $pos;

			$alerts_pos = strpos($contents, 'ALERTS', $pos); // this is supposed to be after the recap

			$game['id'] = get_field("/<a href=\"\/ice\/recap.htm\?id=([0-9]+?)\">/", $contents, $pos);

			if ($pos > $alerts_pos)
			{
			// no recap... rewind
				$pos = $old_pos;
				$game['id'] = FALSE;
			}
		}
		else
			$game['id'] = FALSE;

	// date is in "Sun Mar 29, 2009" format... chop it to "Mar 29, 2009"
		$game['date'] = substr($game['date'], strpos($game['date'], ' ') + strlen(' '));
	// now parse it
		date_default_timezone_set("America/Toronto"); // well, nhl.com runs on crappy eastern time
		$game['date'] = strtotime($game['date']);
		//die($game['date'] . " to " . $date . " is " . strftime('%B %d, %Y', $date));

	// filled in later
		$game['number'] = -1;
		$game['decision'] = '?';
		$game['attendance'] = '?';
		$game['result'] = -1;
		$game['record'] = -1;
		$game['pts'] = -1;

		$games[] = $game;
	}
}

$games = get_games($contents);

// sort games by date because the nhl schedule page puts the upcoming games at the top
usort($games, create_function('$a,$b', 'return ($a[\'date\'] < $b[\'date\']) ? -1 : 1;'));

// determine whether each game is home or away, and calculate the team record at each game
$number = 1;
$record = array(0, 0, 0);
foreach ($games as &$game)
{
	$game['number'] = $number++;

	$teamabbr = find_team($game['home']);
	$game['homeaway'] = ($teamabbr == $this_team) ? 'home' : 'away';

	if (!$game['final'])
		continue;

	if (($game['homeaway'] == 'home' && $game['homescore'] > $game['awayscore']) || ($game['homeaway'] == 'away' && $game['awayscore'] > $game['homescore']))
		$game['result'] = 2;
	else if ($game['overtime'])
		$game['result'] = 1;
	else
		$game['result'] = 0;

	if ($game['result'] == 2) $record[0]++;
	if ($game['result'] == 1) $record[2]++;
	if ($game['result'] == 0) $record[1]++;

	$game['record'] = $record[0] . '–' . $record[1] . '–' . $record[2];
	$game['pts'] = $record[0] * 2 + $record[2];
}
unset($game);

// now... download the game summaries of every game so we can get the attendance and goalie names...

$goalie_error = FALSE;

foreach ($games as &$game)
{
	if (!$game['final'])
		continue;

	$thing = substr($game['id'], 4);
	$url = "http://www.nhl.com/scores/htmlreports/20082009/GS$thing.HTM";

	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_FAILONERROR, TRUE); // fail silently if http code returned is >= 400
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // allow redirects ("Location: " in header)
	curl_setopt($ch, CURLOPT_HEADER, FALSE); // don't include header in output
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // return value of curl_exec instead of printing to stdout

	$contents = curl_exec($ch);

	curl_close($ch);

// some nhl.com game summary pages are glitched (e.g. http://www.nhl.com/scores/htmlreports/20082009/GS021077.HTM)
// they are blank, so we have to check for them instead of crapping out

	if (preg_match("/Attendance  ([0-9,]+)/", $contents, $matches) || preg_match("/Ass\.\/Att\. ([0-9,]+)/", $contents, $matches))
		$game['attendance'] = $matches[1];

	$lookfor = ($game['result'] == 2) ? 'W' : '(OT|L)';
	if (preg_match("/<td class=\"bborder \+ rborder\">(.+?) \($lookfor\) <\/td>/", $contents, $matches))
	{
		$game['decision'] = $matches[1];

		if (!isset($goalies[$game['decision']]))
		{
			echo "unknown goalie \"{$game['decision']}\"\n";
			$goalie_error = TRUE;
		}
	}
}
unset($game);

if ($goalie_error)
	die;

// put the games into months and calculate the per-month records
$this_month_name = strftime('%B');

$months = array();
foreach ($games as $game)
{
	$month_name = strftime('%B', $game['date']);
	if ($preseason)
		$month_name = 'preseason'; // lump preseason games into one 'month'
	if (!isset($months[$month_name]))
	{
		$months[$month_name] = array();
		$months[$month_name]['games'] = array();
		$months[$month_name]['overall_record'] = array(0, 0, 0);
		$months[$month_name]['home_record'] = array(0, 0, 0);
		$months[$month_name]['away_record'] = array(0, 0, 0);
	}
	$months[$month_name]['games'][] = $game;

	if ($game['result'] == 2) $months[$month_name]['overall_record'][0]++;
	if ($game['result'] == 1) $months[$month_name]['overall_record'][2]++;
	if ($game['result'] == 0) $months[$month_name]['overall_record'][1]++;

	if ($game['homeaway'] == 'home')
	{
		if ($game['result'] == 2) $months[$month_name]['home_record'][0]++;
		if ($game['result'] == 1) $months[$month_name]['home_record'][2]++;
		if ($game['result'] == 0) $months[$month_name]['home_record'][1]++;
	}
	else
	{
		if ($game['result'] == 2) $months[$month_name]['away_record'][0]++;
		if ($game['result'] == 1) $months[$month_name]['away_record'][2]++;
		if ($game['result'] == 0) $months[$month_name]['away_record'][1]++;
	}
}
unset($games); // won't be needing THIS anymore...

$wincolour = "#ccffcc";
$losecolour = "#ffcccc";
$otlcolour = "#ffffff";

$t = $teams[$this_team];
$header_background = $t['hbg'];
$header_text = $t['htx'];
$month_background = $t['mbg'];
$month_text = $t['mtx'];

if (!$preseason && !$minilegend)
{
	echo "* Green background indicates win (2 points).\n";
	echo "* Red background indicates regulation loss (0 points).\n";
	echo "* White background indicates overtime/shootout loss (1 point).\n";
	echo "\n";
}

$goalie_links = array(); // only the first appearance of each goalie is a link

function print_month($title, $month, $collapsed)
{
	global $teams;
	global $goalies;
	global $goalie_links;
	global $wincolour, $losecolour, $otlcolour;
	global $month_background, $month_text;
	global $preseason;

	if ($preseason)
	{
		if ($collapsed)
			echo "{| class=\"toccolours collapsible collapsed\" width=90% style=\"clear:both; margin:1.5em auto; text-align:center\"\n";
		else
			echo "{| class=\"toccolours collapsible\" width=90% style=\"clear:both; margin:1.5em auto; text-align:center\"\n";
	}
	else
	{
		if ($collapsed)
			echo "{| class=\"toccolours collapsible collapsed\" width=100%\n";
		else
			echo "{| class=\"toccolours collapsible\" width=100%\n";
	}

	$ov_rec = $month['overall_record'][0] . '–' . $month['overall_record'][1] . '–' . $month['overall_record'][2];
	$hm_rec = $month['home_record'][0] . '–' . $month['home_record'][1] . '–' . $month['home_record'][2];
	$aw_rec = $month['away_record'][0] . '–' . $month['away_record'][1] . '–' . $month['away_record'][2];

	echo "|-\n";
	echo "! colspan=11 style=\"background:$month_background; color:$month_text;\" | $title: $ov_rec (Home: $hm_rec ; Road: $aw_rec)\n";
	echo "|- align=\"center\" bgcolor=\"#dddddd\"\n";
	if ($preseason)
		echo "| '''#''' || '''Date''' || '''Visitor''' || '''Score''' || '''Home''' || '''OT''' || '''Decision''' || '''Attendance''' || '''Record''' || '''Recap'''\n";
	else
		echo "| '''#''' || '''Date''' || '''Visitor''' || '''Score''' || '''Home''' || '''OT''' || '''Decision''' || '''Attendance''' || '''Record''' || '''Pts''' || '''Recap'''\n";

	foreach ($month['games'] as $game)
	{
		$number = $game['number'];

		$date = strftime('%B ', $game['date']) . (int)strftime('%d', $game['date']); // get rid of leading zero on day

		$home_team = find_team($game['home']); $home_team = $teams[$home_team]; $home_city = ($home_team['city'] == 'St Louis') ? 'St. Louis' : $home_team['city'];
		$away_team = find_team($game['away']); $away_team = $teams[$away_team]; $away_city = ($away_team['city'] == 'St Louis') ? 'St. Louis' : $away_team['city'];

		$home = ($game['homeaway'] == 'home') ? $home_city : ('[[' . $home_team['wiki'] . "|$home_city]]");
		$away = ($game['homeaway'] == 'away') ? $away_city : ('[[' . $away_team['wiki'] . "|$away_city]]");

		if ($game['final'])
		{
			$goodguy_score = ($game['homeaway'] == 'away') ? $game['awayscore'] : $game['homescore'];
			$badguy_score = ($game['homeaway'] == 'away') ? $game['homescore'] : $game['awayscore'];

			if ($goodguy_score > $badguy_score)
				$bgcolour = $wincolour;
			else if ($game['overtime'])
				$bgcolour = $otlcolour;
			else
				$bgcolour = $losecolour;
			$bgcolour = " bgcolor=\"$bgcolour\"";

			$score = $game['awayscore'] . '–' . $game['homescore'];

			$ot = $game['overtime'] ? $game['overtime'] : '';

			if ($game['decision'] != '?')
			{
				if (in_array($game['decision'], $goalie_links))
					$decision = $goalies[$game['decision']][0];
				else
				{
					$decision = '[[' . $goalies[$game['decision']][1] . '|' . $goalies[$game['decision']][0] . ']]';
					$goalie_links[] = $game['decision'];
				}
			}
			else
				$decision = '?';

			$attendance = $game['attendance'];

			$record = $game['record'];
			$pts = $game['pts'];
			$recap = $game['id'] ? ('[http://www.nhl.com/ice/recap.htm?id=' . $game['id'] . ']') : '';
		}
		else
		{
			$bgcolour = '';

			$score = '';
			$ot = '';
			$decision = '';
			$attendance = '';
			$record = '';
			$pts = '';
			$recap = '';
		}

		echo "|- align=\"center\"$bgcolour\n";
		if ($preseason)
			echo "| $number || $date || $away || $score || $home || $ot || $decision || $attendance || $record || $recap\n";
		else
			echo "| $number || $date || $away || $score || $home || $ot || $decision || $attendance || $record || $pts || $recap\n";
	}

	echo "|}\n";
}

if ($preseason)
{
	print_month("2008 Pre-season Game Log", $months['preseason'], TRUE);
}
else
{
	echo "{| class=\"toccolours\" width=90% style=\"clear:both; margin:1.5em auto; text-align:center;\"\n";
	echo "|-\n";
	echo "! colspan=11 style=\"background:$header_background; color:$header_text;\" | 2008–09 Game Log\n";

	foreach ($months as $month_name => $month)
	{
		echo "|-\n";
		echo "| colspan=11 |\n";

		print_month($month_name, $month, $month_name != $this_month_name);
	}

	if ($minilegend)
	{
		echo "|-\n";
		echo "| colspan=11 align=\"center\"|\n";
		echo "'''''Legend''''':\n";
		echo "{{legend2|$wincolour|Win (2 points)|border=1px solid $wincolour}}\n";
		echo "{{legend2|$losecolour|Loss (0 points)|border=1px solid $losecolour}}\n";
		echo "{{legend2|$otlcolour|Overtime/shootout loss (1 point)|border=1px solid #AAAAAA}}\n";
	}

	echo "|}\n";
}

?>