<?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.html#tutorials">Tutorials</a></li>
				<li><a href="community/communityresources.html#articles">Articles</a></li>
				<li><a href="community/community.html">Upcoming Presentations</a></li>
				<li><a href="#">Screenshots</a></li>
				<li><a href="faq/main.html">FAQ</a></li>
				<li><a href="/newsgroups/main.html#wtp">Newsgroup</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);
?>
