<?php 
/*******************************************************************************
 * Copyright (c) 2011, 2012 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();
$Nav = new Nav();
$Menu = new Menu();

include($App->getProjectCommon());
//include( '_commonLeftNav.php' );

$pageTitle 		= "Eclipse Project Status";
$pageAuthor		= "Wayne Beaton";
$pageKeywords	= "eclipse,scm,vcs,dvcs,git,cvs,svn";

require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/Project.class.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/SimultaneousReleaseInfo.class.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/images.inc';
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/common.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/debug.php';

//mustBeCommitter();

function isValidKey($key) {	
	return in_array($key, getValidSortKeys());
}

function getValidSortKeys() {
	$keys = array('top', 'id', 'phase', 'git', 'cvs', 'svn', 'liveliness', 'committers', 'organizations');
	return array_merge($keys, getSimultaneousReleaseNames());
}

function getSortKeys() {
	global $_sortKeys;
	if (!$_sortKeys) {
		$keys = preg_split('/,/',isset($_GET['sort']) ? $_GET['sort'] : 'top,id');
		$_sortKeys = array();
		foreach($keys as $key) {
			if (isValidKey($key) && !in_array($key, $_sortKeys))
				$_sortKeys[] = $key;
		}
	}
	return $_sortKeys;
}

function filter($info) {
	foreach($_GET as $key=>$value) {
		if (isset($info[$key])) {
			if ($info[$key] != $value) return true;
		}
	}
	return false;
}

function getProjectStatus() {
	$projects = array();

	foreach(getActiveProjects() as $project) {
		$info = array(
			'id' => $project->getId(),
			'name' => $project->getName(),
			'top' => $project->getTopLevelProject()->getId(),
			'topName' => $project->getTopLevelProject()->getName(),
			'phase' => $project->isInIncubationPhase() ? 'incubating' : 'regular',
			'git' => in_array('git', $project->getSourceRepositoryTypes()),
			'svn' => in_array('svn', $project->getSourceRepositoryTypes()),
			'cvs' => in_array('cvs', $project->getSourceRepositoryTypes()),
			'liveliness' => $project->getLiveliness(),
			'committers' => $project->getActiveCommittersCount(),
			'organizations' => $project->getActiveOrganizationsCount()
		);
		
		foreach(getSimultaneousReleaseNames() as $name) {
			$info[$name] = in_array($name, $project->getSimultaneousReleaseNames()) ? 1 : 0;
		}
		
		if (!filter($info)) $projects[] = $info;
	}
	
	return $projects;
}

function getSortParameter($main) {
	$parameters = array($main);
	foreach(getSortKeys() as $key)
		if (!in_array($key, $parameters)) 
			$parameters[] = $key;
	return implode(',', $parameters);
}

function getHttpParameters($sort=null, $top=null) {
	$parameters = array();
	foreach($_GET as $key=>$value) $parameters[$key] = $value;
	if ($sort) $parameters['sort'] = getSortParameter($sort);
	if ($top) $parameters['top'] = $top;
	
	$out = ''; $separator = '';
	foreach($parameters as $key => $value) {
		$out = "$out$separator$key=$value";
		$separator = '&';
	}
	return $out;
}

function dumpStatus($projects) {
	global $images;
	
	echo "<table>";
	
	echo "<tr style=\"height: 5em;vertical-align:bottom\">";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('top') . "\">Top&nbsp;Level</a></div></th>";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('id') . "\">Name</a></div></th>";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('phase') . "\">Phase</a></div></th>";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('git') . "\">Git</a></div></th>";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('svn') . "\">SVN</a></div></th>";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('cvs') . "\">CVS</a></div></th>";
	echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('liveliness') . "\">Liveliness</a></div></th>";
	echo "<th><div style=\"width:3em;line-height:90%;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('committers') . "\">Active<br/>Committers</a></div></th>";
	echo "<th><div style=\"width:3em;line-height:90%;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?" . getHttpParameters('organizations') . "\">Active<br/>Organizations</a></div></th>";
	
	$simultaneousReleaseNames = array_reverse(getSimultaneousReleaseNames());
	foreach($simultaneousReleaseNames as $name) {
		$link = getHttpParameters($name);
		$name = ucfirst($name);
		echo "<th><div style=\"width:2em;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-90deg);\"><a href=\"?$link\">$name</a></div></th>";
	}
	
	echo "</tr>";
	
	usort($projects, 'sort_projects');
	
	$colour = true;
	foreach($projects as $project) {
		$top = $project['top'];
		$topName = $project['topName'];
		$name = $project['name'];
		$id = $project['id'];
		$phase = $project['phase'] == 'incubating' ? "<img src=\"$images->incubation_conforming_small\"/>" : '&nbsp;';
		$git = $project['git'] ? "<img src=\"$images->check\"/>" : '&nbsp;';
		$svn = $project['svn'] ? "<img src=\"$images->check\"/>" : '&nbsp;';
		$cvs = $project['cvs'] ? "<img src=\"$images->check\"/>" : '&nbsp;';
		$liveliness = getLivelinessIcon($project['liveliness']);
		$committers = $project['committers'];
		$organizations = $project['organizations'];
				
		$style = $colour ? ' style="background-color:#E2E2E2"' : '';
		$colour = !$colour;
		
		echo "<tr$style>";
		echo "<td>$topName</td>";
		echo "<td><a href=\"/projects/project.php?id=$id\">$name</a></td>";
		echo "<td>$phase</td>";
		echo "<td>$git</td>";
		echo "<td>$svn</td>";
		echo "<td>$cvs</td>";
		echo "<td><img src=\"$liveliness\"/></td>";
		echo "<td>$committers</td>";
		echo "<td>$organizations</td>";
		
		foreach($simultaneousReleaseNames as $name) {
			$in = $project[$name] ? "<img src=\"$images->check\"/>" : '&nbsp;';
			echo "<td>$in</td>";
		}
			
		echo "</tr>";
		
	}
	echo "</table>";
}

function sort_projects($projectA, $projectB) {
	foreach(getSortKeys() as $key) {
		$a = $projectA[$key];
		$b = $projectB[$key];
		
		// Make sure that empty values end up on the bottom.
		if (!$a && !$b) return 0;
		if (!$a) return 1;
		if (!$b) return -1;
		
		if ($key == 'organizations' || $key == 'committers') {
			if ($a == $b) continue;
			return $a < $b ? 1 : -1;
		} 
		
		$cmp = strcasecmp($a, $b);
		if ($cmp !== 0) return $cmp;
	}
	return 0;
}

function getGitStatus($git) {
	switch($git) {
		case PROJECT_REPO_ALL_GIT: return 'All Git';
		case PROJECT_REPO_SOME_GIT: return 'Some Git';
		case PROJECT_REPO_NO_GIT: return 'No Git';
		default: return 'No repositories';
	}
	
}

function getLivelinessIcon($liveliness) {
	global $images;
	switch($liveliness) {
		case PROJECT_LIVELINESS_ACTIVE: return $images->active_small;
		case PROJECT_LIVELINESS_STALE: return $images->stale_small;
		case PROJECT_LIVELINESS_DEAD: return $images->dead_small;
	}
}

if (isset($_GET['json'])) {	
	header("Content-type: application/json");
	echo json_encode(getProjectStatus());
	exit;
}

ob_start();
?>
<div id="maincontent">
<div id="midcolumn">
<h1><?php echo $pageTitle; ?></h1>
<?php dumpStatus(getProjectStatus()); ?>
</div>
</div>
<div id="rightcolumn">
<div class="sideitem">
<h6>Filter by Top Level</h6>

<ul>
<?php
	foreach(getTopLevelProjects() as $project) {
		$id = $project->getId();
		$name = $project->getName();
		$link = "?" . getHttpParameters(null, $id);
		echo "<li><a href=\"$link\">$name</a></li>";
	}
?>

</ul>

</div>
<div class="sideitem">
<h6>Legend</h6>
<ul>
<li style="list-style-image: url('<?php echo $images->active_small; ?>')">Activity in the last three months</li>
<li style="list-style-image: url('<?php echo $images->stale_small; ?>')">Activity in the last six months</li>
<li style="list-style-image: url('<?php echo $images->dead_small; ?>')">No activity for more than six months</li>
</ul>
<p>Note that subprojects are included in the determination of liveliness. A project is as lively as the most lively of its subprojects.</p>
</div>
</div>
<?php
	$html = ob_get_contents();
	ob_end_clean();
	$App->generatePage('solstice', $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>