<?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'

$pageTitle 		= "Technology Project";
$pageKeywords	= "technology";
$pageAuthor		= "Bjorn Freeman-Benson Nov 20/05";

ob_start();
?>		
    <div id="maincontent">
	<div id="midcolumn">
        <h1><?= $pageTitle ?></h1>
        
        <h2>The Technology Projects</h2>
        
        <ul class="midlist">
<?php
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/projects/projectList.class.php");
	$ProjectList = new ProjectList();
	$ProjectList->selectProjectList("", "", "", "technology", "", "");
	for($i = 0; $i < $ProjectList->getCount(); $i++) {
		$Project = $ProjectList->getItemAt($i);
		$projectName = $Project->getName();
		if( $Project->getProjectID() == "foundation-internal" ) {
			continue;
		}
		if( strpos( $projectName, "[archived]")
		 || strpos( $projectName, "[closed]" ) ) {
			continue;
		}
		$url = $Project->getUrlIndex();
		if( substr($url,-1,1) != "/" )
			$url .= "/";
		$url .= "project-page-paragraph.html";
		?><li><font size=+1><?= $projectName ?></font> <br/><?= $Project->getProjectId() ?> <br/>"<?= $Project->getUrlIndex() ?>" <br/><?php
		#
		# First look in the project's home directory
		#
		$localfile = str_replace("http://www.eclipse.org/", $_SERVER['DOCUMENT_ROOT'] . "/", $url);
		$localfile = str_replace("http://eclipse.org/", $_SERVER['DOCUMENT_ROOT'] . "/", $localfile);
		#
		# Second if the project does not have the file, then use our temporary version
		#   eventually all the projects should have their own files and these
		#   temporary versions can be deleted
		#
		if( !file_exists($localfile) ) {
		?> (not found in project home) <?php
			$localfile = str_replace("http://www.eclipse.org/", $_SERVER['DOCUMENT_ROOT'] . "/projects/temporary/", $url);
			$localfile = str_replace("http://eclipse.org/", $_SERVER['DOCUMENT_ROOT'] . "/projects/temporary/", $localfile);
		}
		#
		# Third if there just isn't a file anywhere, then show only the project name.
		#
	    if (!file_exists($localfile)){
	   		?> (not found in temporary) <?php
	    } else {
	    	?> (found) <?php
			$file = fopen($localfile,"r");
			while(!feof($file)){
				$buffer = fgets($file);
				?><?= $buffer ?><?php
			}
			fclose($file);
			?></li><?php
	    }
	}
?>
            
        </ul>

</div>
      </div>
       <div id="rightcolumn">

 <div class="sideitem">
   <h6>Dashboard</h6>
   <div align="center">
   <?= $projectInfo->dashboard_liveness() ?> <?= $projectInfo->dashboard_bugs_lights() ?>
   <?= $projectInfo->dashboard_news_lights() ?>
   </div>
 </div>
 </div>
<?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);
?>
