<?php
/*******************************************************************************
 * Copyright (c) 2010 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
 *******************************************************************************/
// Push a static version of the page while we're having trouble
// getting consistent accessto the database.
if (!isset($_GET['goforit'])) {
	if (strtotime('now') < strtotime('2011-06-08')) {
		include 'projects201106031200.html';
		exit;
	}
}
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()); 

$pageTitle 		= "Projects Gateway";
$pageAuthor		= "";
$pageKeywords	= "Eclipse, projects, plugin, plugins, download, plan";

require_once(dirname(__FILE__) . '/classes/images.inc');
require_once(dirname(__FILE__) . '/classes/debug.php');

//include( '_commonLeftNav.php' );

function button($title, $text, $url, $image) {
	echo "<a href=\"$url\"><div class=\"cell\" style=\"background-image:url($image);\"><h3>$title</h3><p>$text</p></div></a>";
}

$App->AddExtraHtmlHeader("<link type=\"text/css\" rel=\"stylesheet\" href=\"/projects/buttons.css\">");
$App->AddExtraHtmlHeader("<meta property=\"og:image\" content=\"http://eclipse.org/eclipse.org-common/themes/Nova/images/eclipse.png\"/>");

ob_start();
?>
<div style="display:block;background-image:url(/default/images/backgroundMainEmpty.png);background-repeat:no-repeat">
	<div style="position:relative;height:193px">
		<div style="position:absolute;top:0;right:0;width:50%">
			<?php 
				button("All Projects", "See a list of all the projects hosted at Eclipse.", "listofprojects.php", $images->projects_huge);
				button("Start a new Project", "Words of advice; getting started.", "http://wiki.eclipse.org/Development_Resources/HOWTO/Starting_A_New_Project", $images->new_project_huge);
				button("Releases", "The annual simultaneous release.", "releases/releases.php", $images->release_huge);
				button("Emeritus", "The Committer Hall of Fame.", "committers-emeritus.php", $images->emeritus_huge);
			?>
		</div>
		<div style="position:absolute;top:0;left:1%;right:50%;width:45%">		
			<h3>Eclipse Projects</h3>
			<p>Eclipse projects now cover runtimes; static and dynamic languages; thick-client, thin-client, and server-side
			frameworks; modeling and business reporting; embedded and mobile; and, yes, we still have the best Java IDE.</p>
			<p>This page is designed to be a gateway into the projects for users, adopters, team members, and the
			merely curious.</p>
			<p><?php echo $App->getFacebookLikeButtonHTML(); ?> </p>
		</div>
	</div>
</div>
<div style="clear:both"></div>

<div style="display:block">
	<div style="position:relative">
		<div class="homeitem" style="float:left;margin:1%;width:30%">
			<?php include dirname(__FILE__) . '/web-parts/proposals.php'; ?>	
		</div>
		<div class="homeitem" style="float:left;margin:1%;width:30%">
			<?php include dirname(__FILE__) . '/web-parts/reviews.php'; ?>	
		</div>
		<div class="homeitem" style="float:left;margin:1%;width:30%">
			<?php include dirname(__FILE__) . '/web-parts/activity.php'; ?>	
		</div>
	</div>
</div>
<div style="clear:both"></div>

<div>
	<?php 
		button("Portal", "Manage your Eclipse Project's information.", "http://portal.eclipse.org", $images->portal_huge);
		button("Process", "The Eclipse Development Process.", "dev_process/development_process.php", $images->edp_huge);
		button("Development Resources", "Information and help for committers.", "http://wiki.eclipse.org/Development_Resources", $images->committers_huge);
		button("Project Tools", "Some handy and helpful tools for projects.", "/projects/tools", $images->tools_huge);
	?>
</div>

<?php
	# Paste your HTML content between the EOHTML markers!
	$html = ob_get_contents();
	ob_end_clean();
//	$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/default/style.css"/>');
	# Generate the web page
	$App->PageRSS = "/projects/reviews-rss.php";
	$App->generatePage('Nova', $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);

?>