<?php
/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

include "constants.php";
include "classes.php";
include "parse_dom.php";

$debug = $_GET[debug]; // are we in debug mode?

$file_names = array();
$handle = opendir(".");
while (false !== ($file = readdir($handle))) {
  if (is_file($file) && ereg("\.ip_log",$file)) {
    array_push($file_names, $file);
  }
}
closedir($handle);

debug("IP Files: ".count($file_names));

echo "<table BORDER=0 CELLSPACING=5 CELLPADDING=2 WIDTH=\"100%\" >\n";
foreach ($file_names as $file) {
  $file = trim($file);
  debug("Processing file: ".$file);
  $project_versions = parse($file);
  foreach ($project_versions as $project) {
    printProject($project);
  }
}
echo "</table>";

/*
 * Print out the given project as an element in the enclosing table.
 */
function printProject($project) {
  echo "<tr>\n";
  echo "<td width=\"2%\" align=RIGHT valign=TOP><img src=\"http://eclipse.org/images/Adarrow.gif\" width=\"16\" height=\"16\" border=\"0\"></td>\n";
  echo "<td width=\"98%\">";
  echo "<strong><a href=\"".$project->info->reference."\">".$project->info->name."</a> version ".$project->version." ";
  echo "<a href=\"http://dev.eclipse.org/viewcvs/index.cgi/".$project->info->location."/?root=Tools_Project&pathrev=".$project->info->tag."\" style=\"text-decoration: none\">(".$project->id.")</a>   ";
  $colour;
  switch ($project->status) {
    case STATUS_DONE :
      $colour=green;
      break;
    default :
      $colour=red;
      break;
  }
  echo " <font color=".$colour.">status:".$colour."</font></strong><br>";
  if (isSet($project->legal)) {
    foreach ($project->legal as $legal) {
      echo tab()."<strong>License:</strong> ";
      if (isSet($legal->package)) {
        echo "(".$legal->package.")";
      }
      echo " <a href=\"".$legal->license->reference."\">".$legal->license->name."</a>";
      echo " (<a href=\"https://dev.eclipse.org/ipzilla/show_bug.cgi?id=".$legal->ipzilla."\">IPZilla</a>)<br>\n";
    }
  }
  echo tab()."<strong>Contact:</strong> <a href=\"mailto:".$project->contact->email."\">".$project->contact->name."</a> (".$project->contact->company.")<br>\n";
  foreach ($project->notes as $note) {
    echo tab()."<strong>Note:</strong> ".$note."<p>\n";
  }
  echo "\n</td>\n";
  echo "</tr>\n";
}

/*
 * Helper method to return a bunch of spaces.
 */
function tab() {
  return "&nbsp;&nbsp;&nbsp;&nbsp;";
}

/*
 * Print out the given message if we are in debug mode.
 * You can get into debug mode by setting ?debug=true in the URL.
 */
function debug($str) {
  global $debug;
  if (isset($debug)) echo $str."<br>\n";
}

?>