<?php  
/*******************************************************************************
 * Copyright (c) 2008, 2011 Eclipse Foundation 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:
 *    Bjorn Freeman-Benson (Eclipse Foundation) - initial API and implementation
 *    Wayne Beaton (Eclipse Foundation) - Bug 344064, 232607, 313218, 316769, 
 *      343596, 244065, 344169, 327594
 *******************************************************************************/
//ini_set("memory_limit","128M");

$serverRoot = dirname(__FILE__) . '/..';
require_once("$serverRoot/eclipse.org-common/system/app.class.php");
require_once("$serverRoot/eclipse.org-common/system/nav.class.php");
require_once("$serverRoot/eclipse.org-common/system/menu.class.php");
$App = new App();
$Nav = new Nav();
$Menu = new Menu();
include($App->getProjectCommon()); 

require_once("$serverRoot/projects/classes/Project.class.php");
require_once("$serverRoot/projects/classes/Committer.class.php");
require_once("$serverRoot/projects/classes/common.php");
require_once("$serverRoot/projects/classes/debug.php");

/**
 * Iterate through the list of project ids provided and 
 * keep only those ids that map to actual existing projects.
 */
function getProjectIdsFromRequest() {
	if (!$params = split(',', getRawProjectIdsFromRequest())) return null;
	$ids = array();
	foreach($params as $id) {
		if (isValidProjectId($id)) $ids[] = $id;
	}
	return $ids;
}

/**
 * The ids of the projects that we're going to work with can
 * be specified in either the 'id' or 'projectid' parameters.
 * Regardless of which parameter is used, we expect a
 * comma-separated list of project ids.
 */
function getRawProjectIdsFromRequest() {
	if (isset($_REQUEST['id'])) return $_REQUEST['id'];
	if (isset($_REQUEST['projectid'])) return $_REQUEST['projectid'];
	return array();
}

/*
 * If the either the 'id' or 'projectid' parameter is not provided, or contains
 * invalid data,  redirect to the selector page.
 */
$projectids = getProjectIdsFromRequest();
if (!$projectids) {
	header('Location: /projects/ip_log_selector.php');
	exit();
}

/* error_reporting(E_ALL); */

/* 221934 - this page to remain on eclipse.org */
header("Cache-control: no-cache");
header("Content-Type: text/html; charset=ISO-8859-15");
require_once("common/shared_functions.php");
$theme          = '';
$pageTitle 		= "IP Log for ";
$pageKeywords   = '';
$pageAuthor     = '';

# Initiate session
$Session = $App->useSession("optional");
$Friend	 = $Session->getFriend();

$Nav->setLinkList(array()); // empty Nav

if( $Session->getBugzillaID() == 0 ) {
	$Nav->addCustomNav("login",	"http://dev.eclipse.org/site_login/", "", 1);
} else {
	$Nav->addCustomNav("welcome<br>" . $Friend->getFirstName() . ' ' . $Friend->getLastName(),
		"http://dev.eclipse.org/site_login/", "", 1);
}

$pageTitle .= $projectids[0];

require_once("common/ip_log_common.php");

$fresult = get_ip_log_data_structures( $projectids );
$errors = $fresult[0];
$activecqs = $fresult[1];
$unusedcqs = $fresult[2];
$pendingcqs = $fresult[3];
$prereqcqs = $fresult[4];
$committers_at_least_once = $fresult[5];
$committers_never = $fresult[6];
$committers_excluded = $fresult[7];
// $contributors = $fresult[8];
// $contributors_excluded = $fresult[9];

/*
 * Determine if an edit form should be shown:
 * only one project is selected
 * and person is logged in
 * and person is a committer on that project
 */
check_if_show_edit_form( $projectids, $Session, $Friend, true,
	$show_edit_form, $reason_no_edit_form, $logged_in_email_address );
/*MOREMORE temporarily given Bjorn write access to all IP logs
if( $Friend->getFriendID() == 66 ) {
	$show_edit_form = 1;
	$logged_in_email_address = 'bjorn.freeman-benson@eclipse.org';
}
MOREMORE*/
$generate_final = 0;
if( isset($_GET['generatefinal']) && $_GET['generatefinal'] ) {
	$show_edit_form = 0;
	$generate_final = 1;
	$reason_no_edit_form = '';
}
ob_start();
/*=================================================
 *      S A V E   A N D   U P D A T E   D B
 */
if( $show_edit_form && isset($_POST['submit']) ) {
	$removes = array();
	$inserts = array();
	/*----------- COMMITTERS --------------*/
	$all = array_merge(
		array_keys($committers_at_least_once),
		array_keys($committers_never),
		array_keys($committers_excluded) );
	$removes[] = "ItemType = 'COMMITTR' AND Action = 'COMENT' AND ProjectID = '" . $projectids[0] . "'";
	foreach( $all as $key ) {
		if( isset($_POST['CM_' . $key . '_REMOVE']) ) {
			$removes[] = "ItemType = 'COMMITTR' AND ItemID = '$key' AND ProjectID = '" . $projectids[0] . "'";
			$inserts[] = "'COMMITTR', '$key', 'REMOVE', NULL, NULL, '" . $projectids[0] . "'";
		} else if( isset($_POST['CM_' . $key . '_ACTIVE']) ) {
			$removes[] = "ItemType = 'COMMITTR' AND ItemID = '$key' AND ProjectID = '" . $projectids[0] . "'";
			$inserts[] = "'COMMITTR', '$key', 'ACTIVE', NULL, NULL, '" . $projectids[0] . "'";
		} else if( isset($_POST['CM_' . $key . '_DELIST']) ) {
			$removes[] = "ItemType = 'COMMITTR' AND ItemID = '$key' AND ProjectID = '" . $projectids[0] . "'";
		} else if( isset($_POST['CM_' . $key . '_COMENT']) ) {
			if( $_POST['CM_' . $key . '_COMENT'] ) {
				$inserts[] = "'COMMITTR', '$key', 'COMENT', NULL, '" .
					addslashes($_POST['CM_' . $key . '_COMENT'])
					. "', '" . $projectids[0] . "'";
			}
		}
	}
// 	/*----------- CONTRIBUTIONS --------------*/
// 	foreach( $contributors as $email => $each ) {
// 		$x = strtr( $email, '.@', '__' );
// 		if( isset($_POST['CN_' . $x . '_RMPERS']) ) {
// 			/* removing a person removes all their contributions */
// 			foreach( $each['bugs'] as $bug ) {
// 				$inserts[] = "'CONTRIB', '" . $bug['attach_id'] . "', 'RM" . $bug['type'] . "', NULL, NULL, '" . $projectids[0] . "'";
// 			}
// 		} else {
// 			foreach( $each['bugs'] as $bug ) {
// 				if( isset($_POST['CN_' . $bug['attach_id'] . '_' . $bug['type'] . '_RM']) ) {
// 					$inserts[] = "'CONTRIB', '" . $bug['attach_id'] . "', 'RM" . $bug['type'] . "', NULL, NULL, '" . $projectids[0] . "'";
// 				}
// 			}
// 		}
// 	}
// 	foreach( $contributors_excluded as $email => $each ) {
// 		foreach( $each['bugs'] as $bug ) {
// 			if( isset($_POST['CN_' . $bug['attach_id'] . '_' . $bug['type'] . '_DL']) ) {
// 				$removes[] = "ItemType = 'CONTRIB' 
// 						  AND ItemID = '" . $bug['attach_id'] . "' 
// 						  AND Action = 'RM" . $bug['type'] . "'
// 						  AND ProjectID = '" . $projectids[0] . "'";
// 			}
// 		}
// 	}
	/*----------- S Q L  --------------*/
	if( count($removes) > 0 ) {
		$sql = "DELETE FROM `IPLogCorrections` WHERE ("
			. implode( ")
                                  OR (", $removes )
			. ")";
		/* echo "<pre>$sql</pre>"; */
		$App->foundation_sql( $sql );
	}
	if( count($inserts) > 0 ) {
		$sql = "INSERT INTO `IPLogCorrections` ( ItemType, ItemID, Action, Value, Comment, ProjectID )
			VALUES (" . implode( "),
			       (", $inserts ) . ")";
		/* echo "<pre>$sql</pre>"; */
		$App->foundation_sql( $sql );
	}
	//	header( "Location: http://www.eclipse.org/projects/ip_log_alt.php?projectid=" . implode(',',$projectids) );
	//	exit();
	$fresult = get_ip_log_data_structures( $projectids );
	$errors = $fresult[0];
	$activecqs = $fresult[1];
	$unusedcqs = $fresult[2];
	$pendingcqs = $fresult[3];
	$prereqcqs = $fresult[4];
	$committers_at_least_once = $fresult[5];
	$committers_never = $fresult[6];
	$committers_excluded = $fresult[7];
// 	$contributors = $fresult[8];
// 	$contributors_excluded = $fresult[9];
}

/*=================================================
 *            H E A D E R
 */
?>

<form method="POST">

<div id="maincontent">
<div id="midcolumn">
<h1><?= $generate_final ? '' : 'Tentative ' ?>IP Log for <?php
$x = array_merge( $projectids, array() );
if( count($x) > 1 ) {
	$y = array_pop($x);
	$z = array_pop($x);
	$x[] = "$z and $y";
}
echo implode( ', ', $x )
?></h1>
<?php if( !$generate_final ) { ?>
<div style="color: gray">
This tentative IP Log is generated dynamically from automatically collected project information.
This information has not been vetted for accuracy by the Eclipse Foundation and may not represent
the true state of the IP of this project(s). Please refer to the official approved IP Log(s) associated with
the official release(s) of this project(s) for more information.
</div>
<?php
}
if ($show_edit_form && count($errors) > 0) {
	$App->AddExtraHtmlHeader("<style>.errorBox {margin:5px;padding:5px;border-style:solid;border-color:red}</style>");
	
	echo "<div class=\"errorBox\">";
	foreach( $errors as $errormsg ) {
		echo "<li>$errormsg</li>";
	}
	echo "</div>";
}

/*=================================================
 *            C Q S
 */
function html_for_keywords( $row ) {
	return ($row['keyword_modified'] ? 'modified ' : '') .
		($row['keyword_unmodified'] ? 'unmodified ' : '') .
		($row['keyword_source'] ? 'source ' : '') .
		($row['keyword_binary'] ? 'binary ' : '') .
		($row['keyword_sourceandbinary'] ? 'source&nbsp;&amp;&nbsp;binary' : '');
}

function html_for_type($row) {
	switch( $row['bug_severity'] ) {
		case 'exempt_prereq':return "exempt pre-req"; 
		case 'workswith': return "works with"; 
		default: return "pre-req"; 
	}
}

function html_for_status($row) {
	if( $row['keyword_obsolete'] )
		return "obsolete: was used in the past but is not longer used";
	if( $row['keyword_unused'] )
		return "unused: not currently in use, but may be used in a future release";
	if( $row['keyword_withdrawn'] )
		return "withdrawn: never used and never will be used";
	return "&nbsp;";
}
?>

<h2>Licenses</h2>
<?php
if( $show_edit_form ) {
	?><div style="margin-bottom: 10px">
	Send email to 
	<a href="mailto:emo-ip-team@eclipse.org">the Eclipse Legal team</a> to request changes
	to the licenses.
	</div>
	<?php
}
?>
<?php 
$licenses = gather_project_licenses($projectids);

if (!$licenses) {
?>
	<p>This project has no licenses associated with it.<p>
<?php 
} else {
?>
	<ul>
	<?php 
	foreach ($licenses as $license) {
	?>
		<li><?= $license ?></li>
	<?php	
	}
	?>
	</ul>
<?php 
}
?>

<h2>Third-Party Code</h2>
<?php
if( $show_edit_form ) {
	?><div style="margin-bottom: 10px">
	Corrections to the third-party code tables are made by adding or removing keywords
	to the CQs themselves. See <a href="http://wiki.eclipse.org/Development_Resources/Automatic_IP_Log#Third-Party_Code">the 
	how to instructions</a> for more information
	about which keywords correspond to which tables. Send email to 
	<a href="mailto:emo-ip-team@eclipse.org">the Eclipse Legal team</a> to request changes
	to the keywords.
	</div>
	<?php
}
?>

<?php 
	// Bug 360718 Clean this code up as I go. Mixing PHP tags is just too hard to look at.
	/**
	 * Dump HTML representing the provided CQs.
	 * @internal
	 * @param array $cqs
	 * @param string $title title of the fourth column
	 * @param string $callback function that provides a value for the fourth column.
	 */
	function dumpCQs($cqs, $title, $callback) {
		$column1width = '5%';
		$column2width = '55%';
		$column3width = '20%';
		$column4width = '20%';
		echo "<table border=\"1\" cellpadding=\"3\" cellspacing=\"0\" width=\"100%\">\n";
		echo "<tr>";
		echo "<th bordercolor=\"#7A79A7\" bgcolor=\"#7A79A7\">CQ</th>";
		echo "<th bordercolor=\"#7A79A7\" bgcolor=\"#7A79A7\">Third-Party Code</th>";
		echo "<th bordercolor=\"#7A79A7\" bgcolor=\"#7A79A7\">License</th>";
		echo "<th bordercolor=\"#7A79A7\" bgcolor=\"#7A79A7\">$title</th>";
		echo "</tr>\n";
		foreach( $cqs as $row ) {
			$bugId = $row['bug_id'];
			$description = $row['short_desc'];
			$license = $row['cf_license'];
			$value = $callback($row);
			echo "<tr>";
			echo "<td align=\"right\" width=\"$column1width\"><a href=\"https://dev.eclipse.org/ipzilla/show_bug.cgi?id=$bugId\">$bugId</a></td>";
			echo "<td width=\"$column2width\">$description</td>";
			echo "<td width=\"$column3width\">$license</td>";
			echo "<td width=\"$column4width\">$value</td>";
			echo "</tr>\n";
		}
		echo "</table>\n";
	}	
	
	echo "<h3>Pre-Req Dependencies</h3>\n";
	if( count($activecqs) > 0 ) {
		dumpCQs($activecqs, "Use", 'html_for_keywords');
	} else {
		echo "<p><em>No Pre-Req dependencies.</em></p>\n";
	}

	echo "<h3>Exempt Pre-Req and Works With Dependencies</h3>\n";
	if( count($prereqcqs) > 0 ) {
		dumpCQs($prereqcqs, "Type", 'html_for_type');
	} else {
		echo "<p><em>No Exempt Pre-Req or Works With dependencies</em></p>\n";
	}
	
	if( count($unusedcqs) > 0 ) {
		echo "<h3>Unused Approved Contributions</h3>\n";
		dumpCQs($unusedcqs, "Status", 'html_for_status');
	}

	if( count($pendingcqs) > 0 ) {
		echo "<h3>Pending Contribution Questionnaires</h3>\n";
		dumpCQs($pendingcqs, 'Use', 'html_for_keywords');
	}

/*=================================================
 *            C O M M I T T E R S
 */
function output_committer_table_start( $title, $explanation, $warning = null ) {
global $show_edit_form;
if( $show_edit_form && $explanation ) {
	?><div style="margin-bottom: 10px"><?php echo $explanation ?></div>
	<?php
}
?>

<?php 
	if ($show_edit_form && $warning) {
?>
	<div style="float:right;width:150px;border-style:dashed;border-width:thin;border-color:red;padding:5px">
		<?= $warning ?>
	</div>
<?php 
	}
?>

<table border="1" cellpadding="3" cellspacing="0">
<tr><th colspan="<?= $show_edit_form ? 4 : 3 ?>" bordercolor="#7A79A7" bgcolor="#7A79A7"><?= $title ?></th></tr>
<tr><th bordercolor="#7A79A7" bgcolor="#7A79A7">Name</th>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Organization</th>
<?php if( $show_edit_form ) { ?>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Correction</th>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Comment</th>
<?php } else { ?>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">&nbsp;</th>
<?php } ?>
</tr>
<?php
}

?><h2>Committers</h2>
<?php output_committer_table_start( "Past and Present Active",
		"This table lists everyone who is, or ever has been, a committer.
		The only reasons to remove someone from this list are (i) if they never
		were a committer, (ii) it is a bogus listing such as 'root', or (iii) all
		the code that person wrote is now obsolete and no longer being shipped.
		This list must include everyone who committed any code or other files are
		being distributed in the current release." ); ?>
<?php
foreach( $committers_at_least_once as $key => $row ) {
	?><tr>
	<td><?= $row['FName'] . ' ' . $row['LName'] ?></td>
	<td><?= $row['Name1']  . ' ' . $row['Name2'] ?></td>
	<?php if( $show_edit_form ) { ?>
	<td><input type="checkbox" name="CM_<?= $key ?>_REMOVE" value="R"> exclude</td>
	<td><input type="text" name="CM_<?= $key ?>_COMENT" value="<?= $row['Comment'] ?>"></td>
	<?php } else { ?>
	<td><?= $row['Comment'] ?></td>
	<?php } ?>
	</tr>
	<?php
}
if( count($committers_at_least_once) == 0 ) {
	?><tr><td colspan="2" align="center" style="color: red; font-weight: bold"><em>(Error: no committers)</em></td></tr>
<?php } ?>
</table>
<p>
<?php if( count($committers_never) > 0 ) {
	output_committer_table_start( "Never Active",
		"This table lists committers who do not appear to have committed any code or
		files to the project. This is a 'best-guess' table based on the commits explorer
		data. If someone listed here actually has committed code, please correct the
		table by making them active.", "Consider using the <a href=\"http://portal.eclipse.org\">portal</a>
		to remove <b>Never Active</b> committers." );
	foreach( $committers_never as $key => $row ) {
		?><tr>
		<td><?= $row['FName'] . ' ' . $row['LName'] ?></td>
		<td><?= $row['Name1']  . ' ' . $row['Name2'] ?></td>
		<?php if( $show_edit_form ) { ?>
		<td><input type="checkbox" name="CM_<?= $key ?>_ACTIVE" value="A"> make active<br>
		    <input type="checkbox" name="CM_<?= $key ?>_REMOVE" value="R"> exclude</td>
		<td><input type="text" name="CM_<?= $key ?>_COMENT" value="<?= $row['Comment'] ?>"></td>
		<?php } else { ?>
		<td><?= $row['Comment'] ?></td>
		<?php } ?>
		</tr>
		<?php
	}
	?>
	</table>
	<p>
	<?php
}
if( $show_edit_form && count($committers_excluded) > 0 ) {
	output_committer_table_start( "Corrections (Excluded)",
		"This table lists all the corrections. This table is not
		included in the final frozen ip log." );
	foreach( $committers_excluded as $key => $row ) {
		?><tr>
		<td><?= $row['FName'] . ' ' . $row['LName'] ?></td>
		<td><?= $row['Name1']  . ' ' . $row['Name2'] ?></td>
		<?php if( $show_edit_form ) { ?>
		<td><input type="checkbox" name="CM_<?= $key ?>_DELIST" value="D"> incorrectly excluded</td>
		<td><input type="text" name="CM_<?= $key ?>_COMENT" value="<?= $row['Comment'] ?>"></td>
		<?php } else { ?>
		<td><?= $row['Comment'] ?></td>
		<?php } ?>
		</tr>
		<?php
	}
	?>
	</table>
	<p>
	<?php
}

/*=================================================
 *            C O N T R I B U T O R S
 */
?><h2>Contributors and Their Contributions</h2>
<?php
if( $show_edit_form ) {
	?><div style="margin-bottom: 10px">
	This table lists, by contributor and then by bug #, all the non-committer contributions.
	This section is probably the weakest of the automated data gathering because there are 
	so many bugs and so many different ways that people have noted contributions over time.<p>
	To note a contribution:
	<ul>
	<li>Include the contribution as a patch on a bug and add the "iplog+" flag to that attachment.
	<li>Include the contribution as a comment on a bug and add the "iplog+" flag to the bug. (Note that this
	    will add all the commenters of the bug as contributors and then you'll have to 'exclude' all those
		who did not contribute. Better to use patch attachments if possible.)
	</ul>
	<p>
	Note that this table includes all contributions that are being distributed in the code.
	The reasons to correct/remove entries from this table are:<ul>
	<li>The algorithm incorrectly classified something as a contribution when it really wasn't
			a contribution.
	<li>The contribution isn't/wasn't used at all. Note that if just one line of a file is used,
			then the contribution is considered as having been used. If possible, mark the
			attachment as obsolete in bugzilla; otherwise, use the corrections to make the change.
	</ul>
	Please note that if person X was a contributor and later became a committer, he or she will
	be listed both above in the committer table (for his/her work as a committer) 
	and here in the contributor table (for his/her work prior to becoming a committer).
	</div>
	<?php
}
?>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Ref</th>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Size</th>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Description</th>
<?php /* if( $show_edit_form ) { ?>
<th bordercolor="#7A79A7" bgcolor="#7A79A7">Correction</th>
<?php } */?>
</tr>
<?php
// TODO this needs to be pulled out as we refactor.
require_once dirname(__FILE__) . '/classes/IPLog.class.php';
$projects = array();
foreach($projectids as $id) {
	$projects[] = get_project_from_pmi($id);
}
$log = new IPLog($projects);
$contributors = $log->getContributions();

foreach( $contributors as $email => $each ) {
	$name = preg_replace( "/\s+/", "&nbsp;", $each->name);
	if( strlen(trim($name)) == 0 ) {
		$name = $email;
	} else {
		$name .= " (" . substr( strstr( $email, '@' ), 1 ) . ")";
	}
	?><tr><td colspan="3" style="background-color: #DDDDDD"><?= $name ?></td>
	<? /*if( $show_edit_form ) { ?>
		<td style="background-color: #DDDDDD"><input type="checkbox" name="CN_<?= 
		strtr( $email, '.@', '__' )
	 	?>_RMPERS" value="1">&nbsp;exclude&nbsp;all</td>
	<? } */?>
	</tr>
	<?php
	foreach( $each->contributions as $bug ) {
		$ref = $bug->ref;
		if ($link = $bug->link) $ref = "<a href=\"$link\">$ref</a>";
		$description = htmlentities($bug->comments);
		$description = preg_replace("/\n/", '<br/>', $description);
		$description = preg_replace('/(bug:?\s*#?(\d+))/i', '<a href="https://bugs.eclipse.org/$2">Bug $2</a>', $description);
		?><tr>
		<td><?php echo $ref; ?></td>
		<td><?= $bug->size; ?></td>
		<td><?php echo $description; ?></td>
		<? /* if( $show_edit_form ) { ?>
			<td><input type="checkbox" name="CN_<?= $bug['attach_id'] ?>_<?= $bug['type'] ?>_RM" value="1"> exclude</td>
		<? } */ ?>
		</tr>
	<?php
	}
}
if( count($contributors) == 0 ) {
	?><tr><td colspan="3" align="center""><em>(no contributors)</em></td></tr>
<?php } ?>
</table>
<?php
if( $show_edit_form && count($contributors_excluded) > 0 ) {
	?><p>
	<div style="margin-bottom: 10px">
	This table lists all the corrections. This table is not
		included in the final frozen ip log.</div>
	<table border="1" cellpadding="3" cellspacing="0">
	<tr>
	<th bordercolor="#7A79A7" bgcolor="#7A79A7" colspan="4">Corrections (Excluded)</th>
	</tr>
	<tr>
	<th bordercolor="#7A79A7" bgcolor="#7A79A7">Bug</th>
	<th bordercolor="#7A79A7" bgcolor="#7A79A7">Size</th>
	<th bordercolor="#7A79A7" bgcolor="#7A79A7">Description</th>
	<th bordercolor="#7A79A7" bgcolor="#7A79A7">Correction</th>
	</tr>
	<?php
	foreach( $contributors_excluded as $email => $each ) {
		$name = preg_replace( "/\s+/", "&nbsp;", $each['realname'] );
		if( strlen(trim($name)) == 0 ) {
			$name = $email;
		} else {
			$name .= " (" . substr( strstr( $email, '@' ), 1 ) . ")";
		}
		?><tr><td colspan="4" style="background-color: #DDDDDD"><?= htmlentities($name) ?></td></tr>
		<?php
		foreach( $each['bugs'] as $bug ) {
			?><tr>
			<td><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=<?= $bug['bug_id'] ?>"><?= $bug['bug_id'] ?></a></td>
			<td><?= pretty_size($bug['size']) ?></td>
			<td><?= $bug['bug_desc'] ?><br><?= $bug['attach_desc'] ?></td>
			<td><input type="checkbox" name="CN_<?= $bug['attach_id'] ?>_<?= $bug['type'] ?>_DL" value="1">incorrectly excluded</td>
			</tr>
		<?php
		}
	}
	?></table>
	<?php
}

/*=================================================
 *            R E P O S I T O R I E S
 */
if ($repositories = $log->getSourceRepositories()) {
?>
<h2>Repositories</h2>
<p>The information contained in this log was generated by using commit information from the following repositories:</p>
<?php

	foreach($repositories as $repository) {
		$path = $repository->getPath();
		if ($link = $repository->getLink()) $path = "<a href=\"$link\">$path</a>";
		echo "<div style='padding-left: 2em'>$path</div>\n";
	}
}

/*=================================================
 *            F O O T E R
 */
?>
<p>
</div><!-- midcolumn -->
</div><!-- maincontent -->
<?php if( !$generate_final ) { ?>
<div style="clear: both; margin-left: -150px;" id="actionfooter">
<table width="100%" align="center" valign="top" >
<tr><td valign="top" width="22%" style="border-right: thin solid gray; padding-right: 5px">
<p>Adjust the set of projects included in this IP Log.</p>
<p><input type="button" name="submitlog" 
		value="Adjust"
		onclick="document.location='ip_log_selector.php?projectid=<?= implode( ',', $projectids ) ?>'"
		></p>
</td>
<td valign="top" width="22%" style="border-right: thin solid gray; padding-right: 5px; padding-left: 5px">
<?php
if( !$show_edit_form ) {
	echo "<p>$reason_no_edit_form</p>";
} else {
	echo "<p>Save changes and return to this page for further review.</p>";
	echo "<p><input type=\"submit\" name=\"submit\" value=\"Make These Corrections\"></p>";
}
?>
</td>
<td valign="top" width="22%" style="border-right: thin solid gray; padding-right: 5px; padding-left: 5px">
<?php
if (getLoggedInCommitter() && getLoggedInCommitter()->canSubmitIPLogForAllProjects($projectids)) {
	$ids = implode(',', $projectids);
	echo "<p>After verifying (and correcting) this IP Log, submit the log to Eclipse Legal for approval.</p>";
	echo "<p><input type=\"button\" name=\"submitlog\" value=\"Submit The Log\"
		onclick=\"document.location='ip_log_submit_to_legal.php?projectid=$ids'\"></p>";
	echo "<p>Note: You should submit your log at least three weeks in advance of your review date or be at risk of postponing the review.</p>";
} else if (getLoggedInCommitter()) {
	echo "<p>You are not a committer on all of the projects in this log. You can submit an IP Log for review by Eclipse Legal only if you are a committer on all the projects in the log.</p>";
} else {
	echo "&nbsp;";
} 
?>
</td>
<td valign="top" width="22%" style="padding-left: 5px">
<p><a href="http://wiki.eclipse.org/Development_Resources/Automatic_IP_Log"
>Help &amp; Documentation</a>: Learn how this IP log is generated
       and how to correct errors.</p>
</td>
</tr></table></div><!-- actionfooter -->
</form>

<?php 
}
echo get_trace_html();
?>
<?php
	# Paste your HTML content between the EOHTML markers!
	$html = ob_get_contents();
	ob_end_clean();

	if ($generate_final) {
		// If we're generating the final log, omit the decoration.
		echo $html;
	} else {
		# Generate the web page
		$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
	}
?>
