<?php
/*******************************************************************************
 * Copyright (c) 2010 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.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();

// Not sure who we're protecting this from.
//mustBeCommitter();

include($App->getProjectCommon());

require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Proposal.class.php");

$proposals = get_proposals();

ob_start();

$pageKeywords = "";
$pageTitle = "Proposals";
$pageAuthor = "Wayne Beaton";
?>

<div id="midcolumn">
<div class="homeitem">
<h1><?= $pageTitle ?></h1>

<p>The Eclipse Project Handbook contains information about our process for
<a href="https://www.eclipse.org/projects/handbook/#starting">proposing
a new open source project</a> at the Eclipse Foundation.</p>
<p>
	<a class="btn btn-primary" href="https://projects.eclipse.org/create/project-proposal"><i class="fa fa-plus" aria-hidden="true"></i> New Proposal</a>
</p>
<?php

	usort($proposals, function($proposal1, $proposal2) {
		if ($proposal1->getDate() == $proposal2->getDate()) return 0;
		return $proposal1->getDate() > $proposal2->getDate() ? -1 : 1;
	});

	function dumpProposals($title, $proposals, $when) {
		$foundOne = false;
		foreach($proposals as $proposal) {
			if (call_user_func($when, $proposal)) {
				if (!$foundOne) {
					echo "<h2>{$title}</h2>";
					echo "<ul>";
					$foundOne = true;
				}
				echo "<li>{$proposal->asHtml()}</li>";
			}
		}
		if ($foundOne) {
			echo "</ul>";
		}
	}

	dumpProposals("Active", $proposals, function (Proposal $proposal) {return $proposal->isActive();});
	dumpProposals("Complete", $proposals, function (Proposal $proposal) {return $proposal->isSuccessful();});
	dumpProposals("Withdrawn", $proposals, function (Proposal $proposal) {return $proposal->isWithdrawn();});

?>
</div>
</div>

<?php
$html = ob_get_contents();
ob_end_clean();
$App->generatePage(null, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>