<?php

#*****************************************************************************
#
# candidate.php
#
# Author: 		Karl Matthias
# Date:			2005-11-07
#
# Description: This file defines the Article class which is used to define,
# and render as html, articles.
#
#****************************************************************************
require_once("candidate_xml.php");

$candidates_root = getcwd() . '/';

function & get_candidate($id, $year="") {
	if (!$year) $year = date("Y"); // if no year has been provided, use the current one.
	$file_name = $GLOBALS['candidates_root'] . $year . '/' . $id . '.xml';
	
	$candidate = get_candidate_from_file($file_name, $year);
	
	return $candidate;
}

function & get_all_candidates($year = "") {
	if (!$year) $year = date("Y"); // if no year has been provided, use the current one.
	$candidates = array();
	$root = $GLOBALS['candidates_root'] . $year . '/';
	if (@$dh = opendir($root)) {
		while (($file = readdir($dh)) !== false) {
			if (ends_with($file, ".xml")) {
				$file = $root.$file;
				$candidate = get_candidate_from_file($file, $year);
				if ($candidate->name)
					array_push($candidates, $candidate);
			}
		}
		closedir($dh);
	}
	
	// Randomize the order of the candidates.
	shuffle($candidates);
//	usort($candidates, 'sort_candidates_cmp');
	return $candidates;
}

/*
 * Sort candidates by last name in ascending order (a-z).
 * Note that this only sorts by last name since we do not currently
 * need to be any smarter (i.e. we don't need to sort first by 
 * last name and then by first name). Also note that this algorithm
 * assumes that the last word in the name of a candidate is their
 * last name. We don't currently handle compound last names because
 * we don't need to.
 */
function sort_candidates_cmp($a, $b) {
	$a_names = explode(' ', trim($a->name));
	$b_names = explode(' ', trim($b->name));
	
	$a_last_name = end($a_names);
	$b_last_name = end($b_names);
	
	return strcmp($a_last_name, $b_last_name);
}

function & get_candidate_from_file($file_name, $year) {
  if (!file_exists($file_name)) {
    return FALSE;
  }
	$candidate = get_candidate_from_xml($file_name);
	
	$image = trim($candidate->image);
	if ($image) {
		$image = "$year/$image";
		$candidate->image = $image;
	}
	
	return $candidate;
}

function & get_candidates_short_summary_as_html($year = "") {
	if (!$year) $year = date("Y"); // if no year has been provided, use the current one.
	$candidates = get_all_candidates($year);
	$html = "<ul>";
	foreach ($candidates as $candidate) {
		$html .= "<li>";
		$html .= "<a href=\"candidate.php?year=$year&id=$candidate->id\">$candidate->name</a>";
		$html .= "</li>";
	}
	$html .= "</ul>";
	return $html;
}

function ends_with($source, $pattern) {
	$end = substr($source, strlen($source) - strlen($pattern));
	return strcmp($end, $pattern) == 0;
}

class Candidate {
	var $id;
	var $type;
	var $name;
	var $email;
	var $phone;
	var $affiliation;
	var $eclipse_affiliation;
	var $contact;
	var $image;
	var $vision;
	var $bio;
	var $location;

	// Render this category in html format.
	function to_html(& $html) {
		$html .= "<h3><a href=\"$this->id\">$this->name</a></h3>";
		$html .= "<p>$this->type</p>";
	}
}
?>