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

	#*****************************************************************************
	#
	# template.php
	#
	# Author: 		Denis Roy
	# Date:			2005-06-16
	#
	# Description: Type your page comments here - these are not sent to the browser
	#
	#
	#****************************************************************************
	
	#
	# Begin: page-specific settings.  Change these. 
	$pageTitle 		= "Web Tools Platform (WTP) Project";
	$pageKeywords	= "Type, page, keywords, here";
	$pageAuthor		= "Type your name here";
	
	$root = $_SERVER['DOCUMENT_ROOT'];
	// Import the functions that render news.
	// require_once ($root . '/webtools/news.php');
	// Import common WTP functions.
	require_once ($root . '/webtools/common.php');
	require_once ($root . '/community/news/scripts/news.php');
	
	
	function getWTPNews($rssfile, $count) 
	{
		$rss = get_news($rssfile);
//		if($rss->channel == "")
//		{
//		  return "empty";
//		}
//		return $rss;
		foreach ($rss->channel as $channel) 
		{
			$html .= "<h6>";
		
			// Add the RSS image on the right
			$html .= "<a href=\"/home/$rssfile\"><img src=\"/images/rss.gif\" align=\"right\" alt=\"More...\" /></a>";
		
			// Add the title of the channel 
			$html .= "WTP News";	
			// If we're displaying short format, provide a link to
			// show news in long format.
			$html .= "&nbsp;<a href=\"/webtools/news.html\"><img src=\"/images/more.gif\" title=\"More...\" alt=\"More...\" /></a>";

			$html .= "</h6>";
		
//		$description = $channel->description;
//		if (strlen($description) > 0) {
//			$html .= $description;
//			}
			$html .= "<ul class=\"midlist\">";

			foreach ($channel->item as $item) 
			{
				if ($count == 0) break;
				$html .= "<li>";
				$date = date("d&#8209;m&#8209;Y", $item->pubDate);
				$html .= "<a href=\"$item->link\" target=\"_blank\">$item->title</a> posted&nbsp;$date<br />";
				$html .= $item->description;
				$html .= "</li>";
				$count--;
				if(count != 0)
				{
					$html .= "<br />";
				}
			}

			$html .= "</ul>";
		}
		return $html;
	}
	
	// Generate the HTML content for the news based on the rss files
	// that appear in the root directory.
	$wtpnews = getWTPNews($root . "/webtools/wtpnews.rss", 5);//xml_to_html("news", "news-rss20", "long", "5");
	// Get the project descriptions
	$wtpoverview = read_file('project-info/description.html');
	$wstoverview = read_file('project-info/wst-description.html');
	$jstoverview = read_file('project-info/jst-description.html');
	$jsfoverview = read_file('project-info/jsf-description.html');
	# Add page-specific Nav bars here
	# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
	# $Nav->addNavSeparator("My Page Links", 	"downloads.php");
	# $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
	# $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);

	# End: page-specific settings
	#
		
	# Paste your HTML content between the EOHTML markers!	
	$html = <<<EOHTML

<div id="maincontent">
	<div id="midcolumn">
		<h1>$pageTitle</h1>
		<p>
			$wtpoverview
			<br /> <a href="about.html">more about wtp &raquo;</a>
 		</p>
		
		<div class="homeitem3col">
			<h3>Subprojects</h3>
			<ul>
				<li>
					<b>Web Standard Tools (WST)</b>&nbsp;<a href="wst/"><img src="/images/more.gif" title="More..." alt="More..." /></a>
					<br />
					$wstoverview
					<br /> <a href="wst/">more about wst &raquo;</a>
    			</li>
    			<li>
    				<b>J2EE Standard Tools (JST)</b>&nbsp;<a href="jst/"><img src="/images/more.gif" title="More..." alt="More..." /></a>
					<br />
					$jstoverview
					<br /> <a href="jst/">more about jst &raquo;</a>
    			</li>
    			<li>
					<b>JavaServer Faces Tools (JSF) - incubating</b>&nbsp;<a href="jsf/"><img src="/images/more.gif" title="More..." alt="More..." /></a>
					<br />
					$jsfoverview
					<br /> <a href="jsf/">more about jsf &raquo;</a>
    			</li>
    		</ul>
		</div>
		<p></p>
		<p></p>
	</div>
	<div id="rightcolumn">
		<div class="sideitem">
			<h6>Discover WTP</h6>
			<ul>
				<li><a href="http://download.eclipse.org/webtools/downloads/">Download</a></li>
				<li><a href="community/communityresources.php">Resources</a></li>
				<li><a href="http://wiki.eclipse.org/WTP_FAQ">FAQ</a></li>
				<li><a href="/newsgroups/main.html">Newsgroups</a></li>
			</ul>
		</div>
		<div class="sideitem">
			$wtpnews
		</div>
		<div align="center">
		<a href="http://www.eclipsecon.org/" target="blank"><img src="http://www.eclipsecon.org/2006/images/banner132x38.gif" alt="EclipseCON" /></a>
		</div>
	</div>
</div>


EOHTML;


	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
