<html>
<head>
	<title>Helios Summary Matrix</title>
</head>
<?php  
require('/home/data/httpd/eclipse-php-classes/system/dbconnection_portal_ro.class.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('SimultaneousReleaseFunctions.php');

class ReleaseData {
	var $projects = array();	
	
	function &getProjectReleaseData($id) {
		return $projects[$id];
	}
}

class ProjectReleaseData {
	var $id;
	var $data = array();
	
	function getStatus($key) {
		return $data[$key];
	}
}

function getReleaseData() {
	global $App;
	
	$query = "select 
				distinct ProjectID 
			  from 
			  	ProjectInfo, 
			  	ProjectInfoValues 
			  where 
			  	MainKey = 'simultaneousrelease' 
			  and 
			  	Subkey = 'helios' 
			  and 
			  	Value = 1 
			  and 
			  	ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
			  order by ProjectID
			  	";
	$results = $App->eclipse_sql($query);
	
	$releaseData = new ReleaseData();
	while($row = mysql_fetch_assoc($results)){
		$id = $row['ProjectID'];
		$projectReleaseData =  new ProjectReleaseData();
		$projectReleaseData->id = $id;
		$releaseData->projects[$id] = $projectReleaseData;
	}
	
	$dbhc = new DBConnectionPortalRO(); 
	$dbh = $dbhc->connect();
	
	$query = "select projectid, track_key, track_value, exception, therelease from simultaneous_release_tracker";
	$results = mysql_query($query,$dbh);	
	while ($row = mysql_fetch_assoc($results)) {
		$id = $row['projectid'];
		$key = $row['track_key'];
		$releaseData->projects[$id]->data[$key] = $row;
	}
	
//	Array
//(
//    [projectid] => modeling.emf.transaction
//    [track_key] => unit_tests
//    [track_value] => on
//    [exception] => 
//    [therelease] => 
//)

	return $releaseData;
}

$releaseData = getReleaseData();
$all_fields = get_fields();

print_r($all_fields);

ob_start();
?>
<!-- include empty lef nav col for now -->

<div id="maincontent">
	<div id="midcolumn">
		<div style='float: left; margin-left: 50px; margin-right: 50px;'>
			<a href="http://eclipse.org/helios/planning/SimultaneousRleaseOverview.php">Back to Project List</a>
			<br>
			<?php
				if(isset($_GET['showallprojects'])){
					?><a href="?">Top Level Overview Grid</a><?php
				}else{
					?><a href="?showallprojects=true">All Projects Overview Grid</a><?php
				}
			?>
		</div>
		<div>
			<h1><?= $pageTitle ?></h1>
			<h2>Simultaneous Release Compliance Grid</h2>
			<p style='width: 60%; margin-left: 50px;'> 
			This page is to summarize progress towards the yearly <a target="_blank" href="http://wiki.eclipse.org/Helios/Simultaneous_Release_Plan">Simultaneous Release</a> as the data has been provided by the projects, at the <a target="_blank" href="https://dev.eclipse.org/portal/myfoundation/portal/portal.php">Eclipse Foundations Portal Tracking Tool</a>. For details on the requirements see <a target="_blank" href="http://www.eclipse.org/helios/planning/EclipseSimultaneousRelease.php">requirements for the Simultaneous Release</a>.
			<br>
			If questions please see <a target="_blank" href="http://wiki.eclipse.org/Helios/Simultaneous_Release_Tracker_FAQ">Simultaneous Release Tracker FAQ</a> or ask the question on <a href="mailto:cross-project-issues-dev@eclipse.org">cross-project dev list</a>. 
			</p>
		</div>		
		
		<table BORDER=2>
		<tr>
			<td>&nbsp;</td>
			<?php
			/*
			 * show the projects along the top
			 */
			foreach($releaseData->projects as $id => $project) {
				$pretty_id = str_replace(".","<br>",$id);
				echo "<td ALIGN=\"center\">";
				echo "<a href=\"http://eclipse.org/helios/planning/SimultaneousReleaseOverview.php?action=project&projectid=$id\">$pretty_id</a>";
			}
			
			foreach($all_fields as $fieldlabel => $fields) {
		    	if(empty($fields['fields'])) continue;
				echo "<tr>";
				echo "<td ALIGN=\"center\">". str_replace("-"," ",$fields['name']) . "</td>";
				
				foreach($releaseData->projects as $project) {
					$status = $project->getStatus($fields['fields'][0]['key']);
					echo "<td>" . $status . "</td>";
				}
				echo "</tr>";
			}
		
			/*
			 * Due to some restrictions on database access, this script cannot connect to
			 * the Foundation database to get the IP Log and Release Documentation information.
			 * Instead, we have to connect via Ajax call from the browser and do a little
			 * JavaScript magic. At this point, we just insert a row into the table to
			 * act as a placeholder for this information. The script at the bottom of this
			 * file takes care of population.
			 */
			echo "<tr><td align=\"centre\">IP Log</td>";
			foreach($releaseData as $id => $project) {
				echo "<td align=\"center\"><div id=\"$id-iplog\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
			}
			echo "</tr>";
			
			echo "<tr><td align=\"centre\">Release Docuware</td>";
			foreach($releaseData as $id => $projectid) {
				echo "<td align=\"center\"><div id=\"$id-docuware\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
			}
			echo "</tr>";
			
		?>
		</table>
		
<?php include('SimultaneousReleaseKey.php');?>
		
	</div>
</div>
<?php
$html = ob_get_contents();
ob_end_clean();

print $html;

?>

	<script src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo.js"></script> 
	<script src="http://yui.yahooapis.com/2.8.0r4/build/event/event.js"></script>
	<script src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection.js"></script>
	<script>
		function successHandler(o){		 
			var root = o.responseXML.documentElement;
			var reviews = root.getElementsByTagName('review');
			var index = 0;
			for(index=0;index<reviews.length;index++) {
				var review = reviews[index];
				var name = review.getAttribute("name");
				var id = review.getAttribute("projectid");
				var iplog = review.getAttribute("iplog");
				var iplog_date = review.getAttribute("iplog-date");
				var docuware = review.getAttribute("docuware");
				var docuware_date = review.getAttribute("docuware-date");

				var iplog_div = document.getElementById(id + '-iplog');
				if (iplog_div) {
					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
					if (!iplog) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
					if (!iplog_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";

					iplog_div.innerHTML = status;
				}
				
				var docuware_div = document.getElementById(id + '-docuware');
				if (docuware_div) {
					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
					if (!docuware) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
					if (!docuware_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";

					docuware_div.innerHTML = status;
				}
			}		 
		}
		YAHOO.util.Connect.asyncRequest('GET', 'http://<?= $_SERVER['SERVER_NAME'] ?>/projects/xml/review_status.php?name=Helios', { success:successHandler });
	</script>

</html>