<?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;
		$link = $bug->link;
		$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><a href="<?php echo $link; ?>"><?= $ref ?></a></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);
	}
?>
