<?php
# Set the theme for your project's web pages.
# See the Committer Tools "How Do I" for list of themes
# https://dev.eclipse.org/committers/
# Largely copied from the RAP team

ini_set('display_errors', 1); ini_set('error_reporting', E_ALL);

require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php");
$rtProjects = get_project('rt')->getChildren();
// $rtProjects = array("rt.ecf", "rt.eclipselink", "rt.equinox", "rt.ercp", "rt.gemini", "rt.jetty", "rt.rap", "rt.riena", "rt.smila", "rt.virgo");

#	$Nav->setLinkList( array() );
	$Nav->addCustomNav("Wiki", "http://wiki.eclipse.org/RT", "_self", 1);
	$Nav->addCustomNav("Team", "/rt/team-leaders.php", "_self", 1);
	$Nav->addCustomNav("Mailing Lists", "http://www.eclipse.org/mail/", "_self", 1);
	
	$Nav->addNavSeparator("Projects", "index.php");
	populateProjectNav($rtProjects, $Nav);
	
	$Nav->addNavSeparator("Other Runtime Technology", "/eclipsert/participate.php");
	$Nav->addCustomNav("RCP", "/home/categories/rcp.php", "_self", 1);
	$Nav->addCustomNav("EMF", "/emf", "_self", 1);

	$Menu->setMenuItemList( array() );
	$Menu->addMenuItem( "Home", "/RT", "_self" );
	$Menu->addMenuItem( "Get Started", "/eclipsert/gettingstarted.php", "_self" );
	$Menu->addMenuItem( "Resources", "/eclipsert/resources.php", "_self" );
	$Menu->addMenuItem( "Wiki", "http://wiki.eclipse.org/RT", "_self" );

	$App->AddExtraHtmlHeader( '<link rel="stylesheet" type="text/css" href="/rt/rap-layout-fixes.css"/>' );
	$App->AddExtraHtmlHeader( '<!--[if lt IE 8]><link rel="stylesheet" type="text/css" href="/rt/rap-layout-fixes-ie.css"/><![endif]-->' );
	$App->AddExtraHtmlHeader( '<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>' );
	$App->AddExtraHtmlHeader( '<link rel="shortcut icon" href="/rt/images/favicon.ico" />');

//  $App->Promotion = TRUE; # set true to enable current eclipse.org site-wide promo


  function createRapNavigation() {
    $html = <<<EOHTML
<div id="rap-small-header">
  <a href="/rt/"><div id="rap-small-logo"></div></a>
</div>
<script type="text/javascript">
  // logo
  var logo = $( '#logo:first-child' );
  var newLogo = '<div id="logo"><a href="http://www.eclipse.org">' 
                + logo.html() + '</a></div>';
  logo.replaceWith( newLogo );
</script>


EOHTML;
    
    return $html;
  }

  function generateRapPage( $App, $Menu, $Nav, $author, $keywords, $title, $html )
  {
    $theme = "Nova";
    $pageHtml = createRapNavigation() . $html;
    $App->generatePage( $theme, $Menu, $Nav, $author, $keywords, $title, $pageHtml );
  }

  function xslt( $xmlFile, $xslFile ) {
    $xslDoc = new DOMDocument();
    $xslDoc->load( $xslFile );
    $xmlDoc = new DOMDocument();
    $xmlDoc->load( $xmlFile );
    $proc = new XSLTProcessor();
    $proc->importStylesheet( $xslDoc );
    return $proc->transformToXML( $xmlDoc );
  }

function populateProjectNav($projects, $navBar) {
	if (! $navBar)
		return;
	foreach ($projects as $project) {
		$projectName = $project->getShortName($project);
		$projectURL = $project->getProjectURL();
		$navBar->addCustomNav($projectName, $projectURL, "_self", 1);
	}
}
?>
