<?php

// *****************************************************************************
//
// news.php
//
// Author: Wayne Beaton
// Date: 2005-11-07
//
// Description: Use the get_news($newsfile) function in this file to generate
// the html
// equivalent of the provided RSS file.
//
// ****************************************************************************
require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/xml_sax_parsing.php");

/*
 * This function answers an instance of Article containing the
 * information represented in $file_name. $file_name is assumed to
 * be a file name with a complete path to an XML file conforming
 * to the about.xml structure. $root is the directory that contains
 * the actual content of the article (generally this is the same
 * as the path for $file_name).
 */
function &get_candidate_from_xml($file_name) {
  $handler = new CandidateFileHandler();
  parse_xml_file($file_name, $handler);
  $candidate = $handler->candidate;

  $candidate->location = $file_name;

  $email = trim($candidate->email);
  if ($email) {
    $email = str_replace("@", " at ", $email);
    $candidate->email = $email;
  }

  return $candidate;
}

/*
 * This class is used by the SAX parser to start parsing
 * a Candidate file.
 */
class CandidateFileHandler extends XmlFileHandler {
  var $candidate;

  /*
   * This method returns the root handler for a Candidate file
   * The root handler essentially represents the file itself
   * rather than any actual element in the file. The returned
   * element handler will deal with any elements that may occur
   * in the root of the XML file.
   */
  function get_root_element_handler() {
    $retVal = new CandidateRootHandler();
    return $retVal;
  }

  function end_root_element_handler(& $handler) {
    $this->candidate = $handler->candidate;
  }

}

/*
 * The CandidateRootHandler class takes care of the root element
 * in the file. This handler doesn't correspond to any particular
 * element that may occur in the XML file. It represents the file
 * itself and must deal with any elements that occur at the root
 * level in that file.
 */
class CandidateRootHandler extends XmlElementHandler {
  var $candidate;

  /*
   * This method handles the <boardmember>...</boardmember> element.
   */
  function &get_boardmember_handler($attributes) {
    $retVal = new CandidateHandler($attributes);
    return $retVal;
  }

  function end_boardmember_handler(& $handler) {
    $this->candidate = $handler->candidate;
  }

}

/*
 * The CandidateHandler takes care of the <boardmember> element. This
 * element is the root element in the file and is used to contain
 * all the categories.
 * <boardmember>
 * <type>...</type>
 * <name>...</name>
 * <title>...</title>
 * ...
 * </boardmember>
 */
class CandidateHandler extends XmlElementHandler {
  var $candidate;

  function CandidateHandler(&$attributes) {
    $this->candidate = new Candidate();
    $this->candidate->id = $attributes['ID'];
    $type = $attributes['TYPE'];
    if (strcasecmp($type, "committer") == 0) {
      $this->candidate->type = "committer";
    }
    else {
      $this->candidate->type = "addin";
    }
  }

  /*
   * This method handles the <name>...</name> element.
   */
  function &get_name_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "name");
    return $retVal;
  }

  /*
   * This method handles the <title>...</title> element.
   */
  function &get_title_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "title");
    return $retVal;
  }

  /*
   * This method handles the <email>...</email> element.
   */
  function &get_email_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "email");
    return $retVal;
  }

  /*
   * This method handles the <phone>...</phone> element.
   */
  function &get_phone_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "phone");
    return $retVal;

  }

  /*
   * This method handles the <contact>...</contact> element.
   */
  function &get_contact_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "contact");
    return $retVal;
  }

  /*
   * This method handles the <image>...</image> element.
   */
  function &get_image_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "image");
    return $retVal;
  }

  /*
   * This method handles the <vision>...</vision> element.
   */
  function &get_vision_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "vision");
    return $retVal;
  }

  /*
   * This method handles the <bio>...</bio> element.
   */
  function &get_bio_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "bio");
    return $retVal;
  }

  /*
   * This method handles the <affiliation>...</affiliation> element.
   */
  function &get_affiliation_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "affiliation");
    return $retVal;
  }

  /*
   * This method handles the <affiliation>...</affiliation> element.
   */
  function &get_eclipse_affiliation_handler(& $attributes) {
    $retVal = new SimplePropertyHandler($this->candidate, "eclipse_affiliation");
    return $retVal;
  }

}