<?php  																														require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	$App 	= new App();	$Nav	= new Nav();	$Menu 	= new Menu();		include($App->getProjectCommon());    # All on the same line to unclutter the user's desktop'
/* 221934 - this page to remain on eclipse.org */
$pageTitle 		= "Eclipse Committers Alumni";
$pageKeywords   = '';
$pageAuthor     = '';

include( '_commonLeftNav.php' );

ob_start();
?>
<div id="maincontent">
<div id="midcolumn">

<h1>Eclipse Committers Alumni</h1>
<p>
When Committers who have contributed to Eclipse 
become inactive and thus no longer Committers<sup>1</sup>, we want to make sure that we acknowledge their
 contributions to our (collective) success. We choose to make that acknowledgement 
 here on the list of our <em>Committer Alumni</em>. 
<p>
Our thanks to each of these people and their
 contributions to the long term success
of all of Eclipse.
<p>
<span style="color: #D4A017">*</span>The list of former Committers who made especially significant contributors can be found at <a href="committers-emeritus.php">Committers Emeritus</a>.
<p>
<?php if( isset($_GET['sort']) && $_GET['sort'] == 'project' ) { ?>
List is sorted by project (click on project to expand to list of names). <a href="?sort=name">Click here to re-sort</a> by name.
<?php } else { ?>
List is sorted by name. <a href="?sort=project">Click here to re-sort</a> by project.
<?php } ?>
</td>
<ul>
<?php
include "/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php";
$_dbc = new DBConnectionFoundation();
$_dbh = $_dbc->connect();
$sql = "SELECT DISTINCT PersonID AS PID FROM PeopleProjects
		WHERE Relation = 'CE'
		  AND InactiveDate IS NULL
		  ";
$result = mysql_query($sql,$_dbh);
$emeritus = array();
while( $row = mysql_fetch_assoc($result) ) {
	$emeritus[$row['PID']] = 1;
}
$sql = "SELECT People.PersonID as PID, FName, LName, ProjectID FROM People, PeopleProjects
		WHERE People.PersonID = PeopleProjects.PersonID
		  AND PeopleProjects.Relation = 'CM'
		  AND PeopleProjects.InactiveDate IS NOT NULL
		  AND People.PersonID NOT IN (SELECT PersonID FROM PeopleProjects
		  		WHERE Relation = 'CM'
		  		  AND InactiveDate IS NULL)
		  ORDER BY LName, FName
		  ";
$result = mysql_query($sql,$_dbh);
$people = array();
while( $row = mysql_fetch_assoc($result) ) {
	$people[] = $row;
}
function sortbyproject( $a, $b ) {
	if( $a['ProjectID'] > $b['ProjectID'] ) return 1;
	if( $a['ProjectID'] < $b['ProjectID'] ) return -1;
	if( $a['LName'] > $b['LName'] ) return 1;
	if( $a['LName'] < $b['LName'] ) return -1;
	if( $a['FName'] > $b['FName'] ) return 1;
	if( $a['FName'] < $b['FName'] ) return -1;
	return 0;
}
?>
<script>
function toggleshow(id) {
	var obj = document.getElementById(id);
	if( obj.style.display == 'block' ) {
		obj.style.display = 'none';
	} else {
		obj.style.display = 'block';
	}
}
</script>
<?php
if( isset($_GET['sort']) && $_GET['sort'] == 'project' ) {
	/* sorted by project */
	usort( $people, 'sortbyproject' );
	$showing = -1;
	foreach( $people as $row ) {
		if( $showing != $row['ProjectID'] ) {
			if( $showing != -1 ) {
				?></ul></li>
				<?php
			}
			?><li><a onclick="toggleshow('<?= $row['ProjectID'] ?>')" 
			style="font-weight: normal"><?= $row['ProjectID'] ?></a><ul 
				id="<?= $row['ProjectID'] ?>" style="display: none"><?php
			$showing = $row['ProjectID'];
		}
		?><li><b><?= $row['FName'] ?> <?= $row['LName'] ?></b><?=
			isset($emeritus[$row['PID']]) ? '<span style="color: #D4A017">*</span>' : ''
		?></li><?php
	}
	?></ul></li>
	<?php
} else {
	/* sorted by name with (projects) */
	$showing = -1;
	foreach( $people as $row ) {
		if( $showing == $row['PID'] ) {
			?>, <?= $row['ProjectID'] ?><?php
		} else {
			if( $showing == -1 ) {
				//first row, nothing to close
			} else {
				?>)</li><?php
			}
			?><li><b><?= $row['FName'] ?> <?= $row['LName'] ?></b><?=
				isset($emeritus[$row['PID']]) ? '<span style="color: #D4A017">*</span>' : ''
			?> (<?= $row['ProjectID'] ?><?php
			$showing = $row['PID'];
		}
	}
	if( $showing != -1 ) {
		?>)</li></ul>
		<?php
	}
}
?>
<p>
<hr>
<div style="font-size: 80%"><sup>1</sup>
Being a Committer is a privilege that is earned by 
contributing actively, and showing discipline and good judgment. It is a responsibility 
that is not given, nor be treated, lightly. At the same
time, we acknowledge that active participation in Eclipse Projects
is not a lifetime commitment, and thus Committers may/will become
inactive for a variety of reasons.
</div>
</div><!-- midcolumn -->
</div><!-- maincontent -->
<?php
	# Paste your HTML content between the EOHTML markers!
	$html = ob_get_contents();
	ob_end_clean();

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
