August 24, 2023
by Matt Raines

Looking back to 2003

« 2002 | 2003 | 2004 | 2005 »

Brighton Lib Dem conference in 2003

2003 was a year of remarkable growth for Prater Raines. We built bespoke website developments for the New Politics Network, the campaign for Votes at 16, the Parliamentary Candidates Association, and events website The Full Effect. But it was the runaway progress of our Liberal Democrat website platform that most proved the business would be lasting and successful.

Our Foci system launched to the first eight Liberal Democrat clients at the beginning of the year. Although we initially hosted each site on its own virtual server, economies of scale very quickly meant we moved to dedicated server hosting with 1&1 Internet (now IONOS). I don’t think we were ever very happy with the service but it survived through at least one hectic general election until we were able to afford our own equipment in 2006.

Sarah Teather MP's website in 2023The September by-election in Brent East was a real test for our nascent system and its resilience and a focus of Brighton conference. Sarah Teather contested the seat in an environment of widespread anger over the war in Iraq and romped home in the largest swing from Labour to Liberal since Bermondsey in 1983.

Prater Raines corporate website in 2003

Tim started something of a tradition for celebrating milestone birthdays at Lib Dem Conferences. Torquay took the brunt of the partying this time and he reported considerable interest in our new product including some then prominent MEPs. The service was priced so keenly we measured our success by the number of Big Mac meals it would buy each of us per month and by the end of the year we could have eaten McDonald’s several times a day.

I hated Outlook with a passion and continued to read my email with text-based browser PINE for way longer than anyone I knew considered rational, so it was a source of rather too much pride when the first of my feature suggestions made it into the program, and from this year the taskbar icon changed colour depending on the mailserver connection status.

Tools of the trade

Location, location, location

The year in tech

Sample code

<?
/* According to Jakob Nielsen, "Even small holiday decorations can increase joy
 * of use and make websites feel more current and more connected to users' lives
 * and physical environment. The key is to commemorate without detracting from
 * your users' main reasons for visiting the site." */

include_once("shared/date_getEaster.php");

function addDays($date, $days) {
	return mktime(0, 0, 0, date("m", $date), date("d", $date) + $days, date("Y", $date));
}

define ("SUNDAY", 0); define ("MONDAY", 1); define ("TUESDAY", 2); define ("WEDNESDAY", 3);
define ("THURSDAY", 4); define ("FRIDAY", 5); define ("SATURDAY", 6);
function specificWeekdayFollowing($weekday, $date) {
	return addDays($date, (7 + $weekday - date("w", $date)) % 7);
}

$easter = date_getEaster();
$jewish = explode("/", jdtojewish(unixtojd(time())));
$chineseNewYear = array(
	2000 => mktime(0, 0, 0, 2, 5, 2000),
	2001 => mktime(0, 0, 0, 1, 24, 2001),
	2002 => mktime(0, 0, 0, 2, 12, 2002),
	2003 => mktime(0, 0, 0, 2, 1, 2003),
	2004 => mktime(0, 0, 0, 1, 22, 2004),
	2005 => mktime(0, 0, 0, 2, 9, 2005),
	2006 => mktime(0, 0, 0, 1, 29, 2006),
	2007 => mktime(0, 0, 0, 2, 18, 2007),
	2008 => mktime(0, 0, 0, 2, 7, 2008),
	2009 => mktime(0, 0, 0, 1, 26, 2009),
	2010 => mktime(0, 0, 0, 2, 14, 2010),
	2011 => mktime(0, 0, 0, 2, 3, 2011),
	2012 => mktime(0, 0, 0, 1, 23, 2012),
	2013 => mktime(0, 0, 0, 2, 10, 2013),
	2014 => mktime(0, 0, 0, 1, 31, 2014),
	2015 => mktime(0, 0, 0, 2, 19, 2015),
	2016 => mktime(0, 0, 0, 2, 8, 2016),
	2017 => mktime(0, 0, 0, 1, 28, 2017));

$holidays = array(
	"newyear" => array(
		"name"      => "New Year's Day",
		"message"   => "Happy New Year!",
		"start"     => mktime(0, 0, 0, 1, 1, date("Y") + (date("m") == 1 ? 0 : 1)),
		"end"       => mktime(0, 0, 0, 1, 1, date("Y") + (date("m") == 1 ? 0 : 1))),
	"easter" => array(
		"name"      => "Easter (Good Friday to Easter Monday)",
		"message"   => "Happy Easter!",
		"style"     => "easter",
		"start"     => addDays($easter, -2),
		"end"       => addDays($easter, 1)),
	"remembrance" => array(
		"name"      => "Remembrance Day and Remembrance Sunday",
		"message"   => "In Remembrance",
		"style"     => "remembrance",
		"start"     => date("w", mktime(0, 0, 0, 11, 11, date("Y"))) < 4
                       ? specificWeekdayFollowing(0, mktime(0, 0, 0, 11, 7, date("Y")))
                       : mktime(0, 0, 0, 11, 11, date("Y")),
		"end"       => date("w", mktime(0, 0, 0, 11, 11, date("Y"))) < 4
                       ? mktime(0, 0, 0, 11, 11, date("Y"))
                       : specificWeekdayFollowing(0, mktime(0, 0, 0, 11, 11, date("Y")))),
	"chinesenewyear" => array(
		"name"      => "Chinese (Lunar) New Year",
		"message"   => "Happy Chinese New Year!",
		"style"     => "chinesenewyear",
		"start"     => $chineseNewYear[date("Y")],
		"end"       => addDays($chineseNewYear[date("Y")], 2)),
	"roshhashanah" => array(
		"name"      => "Rosh Hashunah (Jewish New Year) and the Days of Awe",
		"message"   => "L'shanah tovah tikatev v'taihatem!",
		"style"     => "jewish",
		"start"     => jdtounix(jewishtojd(1, 1, $jewish[2] + ($jewish[1] == 1 ? 0 : 1))),
		"end"       => jdtounix(jewishtojd(1, 9, $jewish[2] + ($jewish[1] == 1 ? 0 : 1)))),
	"eidalfittr" => array(
		"name"      => "Eid Al-Fittr",
		"message"   => "Eid Mubarak!",
		"style"     => "eid",
		"start"     => mktime(0, 0, 0, 11, 25, 2003),
		"end"       => mktime(0, 0, 0, 11, 25, 2003)),
	"mayelections" => array(
		"name"      => "Local Elections (First Thursday in May)",
		"message"   => "Election Day: Polls open 8am to 9pm",
		"style"     => "election",
		"start"     => specificWeekdayFollowing(THURSDAY, mktime(0, 0, 0, 5, 1, date("Y"))),
		"end"       => specificWeekdayFollowing(THURSDAY, mktime(0, 0, 0, 5, 1, date("Y"))),
		"notannual" => true),
	"byelection" => array(
		"name"      => "Brent East By-election (18 September 2003)",
		"message"   => "Brent East: Polls open 7am to 10pm",
		"style"     => "election",
		"start"     => mktime(0, 0, 0, 9, 18, 2003),
		"end"       => mktime(0, 0, 0, 9, 18, 2003),
		"notannual" => true)
...
);

function getUpcomingHolidays($days) {
	global $holidays;
	$upcoming = array();
	reset ($holidays);
	while (list($key, $value) = each($holidays)) {
		if (addDays($value["start"], -$days) <= time() && addDays($value["end"], 1) > time()) {
			array_push($upcoming, $key);
		}
	}
	return $upcoming;
}

?>