<?php
/*******************************************************************************
 * Copyright (c) 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:
 *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/

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();
$Menu 	= new Menu();
$Nav = new Nav();
include($App->getProjectCommon());
//include( '_commonLeftNav.php' );

require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/ProjectSummary.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
trace_file_info(__FILE__);

$projectId = $App->getHTTPParameter('id');
$project = getProject($projectId);

if (!$project) {
	header('Location: http://www.eclipse.org/projects/listofprojects.php');
	exit();
}
$summary = new ProjectSummary($project);

$App->AddExtraHtmlHeader("<style>
p {margin-bottom:5px;}
</style>");

$pageTitle = $project->getName();
$pageAuthor = "Wayne Beaton";
$pageKeywords = "project, summary, eclipse, $pageTitle";

$App->Promotion = TRUE;

$incubation = $summary->getIncubationSideItem(); 
$committers = $summary->getCommittersSideItem();

$description = $project->getDescription();
$logoUrl = $project->getLogoUrl();
if ($logoUrl) {
	$description = "<img align=\"right\" width=\"100\" src=\"$logoUrl\"/>$description";
}

$Nav->setLinkList( array() ); 
$Nav->addNavSeparator($project->getName(), "/projects/project.php?id=$projectId");
if ($url = $project->getProjectUrl()) 
	$Nav->addCustomNav("Website", normalizeRelativeUrl($url), "", 1);
if ($url = $project->getWikiUrl()) 
	$Nav->addCustomNav("Wiki", normalizeHttpUrl($url), "", 1);
if ($url = $project->getGettingStartedUrl()) // Bug 360543
	$Nav->addCustomNav("Getting Started", normalizeHttpUrl($url), "", 1);
if ($url = $project->getDocumentationUrl()) 
	$Nav->addCustomNav("Documentation", normalizeHttpUrl($url), "", 1);
if ($url = $project->getPlanUrl()) 
	$Nav->addCustomNav("Plan", "/projects/project-plan.php?projectid=$projectId", "", 1);
if ($url = $project->getBugzillaUrl()) 
	$Nav->addCustomNav("Issues (Bugzilla)", normalizeHttpUrl($url), "", 1);
// if ($url = $project->getUpdateSiteUrl()) 
// 	$Nav->addCustomNav("Repository/Updates", normalizeHttpUrl($url), "", 1);
if ($url = $project->getDownloadsUrl()) 
	$Nav->addCustomNav("Downloads", normalizeHttpUrl($url), "", 1);
$Nav->addNavSeparator("Committer Tools", null);
$Nav->addCustomNav("IP Log Generator", "/projects/ip_log.php?projectid=$projectId");

function addProjectsToNav($project, &$Nav) {
	if (!$project) {
		addProjectsSection("Top Level Projects", '/projects/listofprojects.php', getTopLevelProjects(), $Nav);
		return;
	}
	
	$children = $project->getChildren();
	if ($children) {	
		addProjectsSection($project->getName(), '?id=' . $project->getId(), $children, $Nav);
	}
	
	addProjectsToNav($project->getParent(), &$Nav);
}

function addProjectsSection($title, $link, $projects, $Nav) {
	$Nav->addNavSeparator($title, $link);
	foreach($projects as $child) {
		$Nav->addCustomNav($child->getName(), '?id=' . $child->getId(), 2, null);
	}
}

addProjectsToNav($project, $Nav);

// $children = $project->getSiblings();
// $count = count($children);
// $index = array_search($project, $children);

// $top = renderProject($project->getTopLevelProject());
// $previous = renderProject($children[($count + $index - 1) % $count]);
// $next = renderProject($children[($index + 1) % $count]);

// function renderProject ($project) {
// 	$id = $project->getId();
// 	$name = $project->getName();
	
// 	return "<a href=\"?id=$id\">$name</a>";
// }
// $navbar = "<table border=\"1\" width=\"100%\"><tr><td>$previous</td><td style=\"text-align:center\">$top</td><td style=\"text-align:right\">$next</td></tr></table>";

ob_start();
?>
	<div id="midcolumn">
		<h1><?= $pageTitle ?></h1>
		
		<p><?php //echo $navbar ?></p>
		<p><?php echo $description; ?></p>
		
		<?php 
			echo $summary->getCommitsActivityHomeItem();
			echo $summary->getCommitterCommitsActivityHomeItem();
			echo $summary->getCompanyCommitsActivityHomeItem();
			echo $summary->getSourceRepositoriesHomeItem();
			echo $summary->getUpdateSiteHomeItem();
			echo $summary->getReleasesHomeItem();
			echo $summary->getReviewsHomeItem();
			echo $summary->getCommunicationHomeItem();
		?>
		
	</div>

	<!-- remove the entire <div> tag to omit the right column!  -->
	<div id="rightcolumn">
		<?php echo $incubation; ?>
		<?php echo $committers; ?>
	</div>
<?php
	$html = ob_get_contents();
	ob_end_clean();

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