<?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'

	#*****************************************************************************
	#
	#
	#****************************************************************************
	
	#
	# Begin: page-specific settings.  Change these. 
	$pageTitle 		= "Eclipse RT Project";
	$pageKeywords	= "equinox, osgi, framework, runtime";
	
	# 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 markers!	
ob_start();
?>		

	<div id="midcolumn">
		<h1><?= $pageTitle ?></h1>

			<p class=bar>Mission Statement</p>
<p>The Eclipse RT top-level project at Eclipse was created in 2008 (<a href="charter.php">charter</a>, 
<a href="proposals/rt/RT%20creation%20review.pdf">creation review</a>)  as a means of bringing 
together various runtime related efforts and 
technologies at Eclipse.  RT is designed to foster, promote and house runtime efforts in Eclipse .  
It is part of a larger <a href="http:/equinox-portal">Equinox Community</a> move to 
drive Equinox-base technology across a broad range of computing environments and problem domains. 
These efforts strive
 towards the common goal of providing a uniform component model across a wide variety of computing environments.  The 
 Equinox framework and OSGi form the basis of this infrastructure.  </p>
 
 <p>Eclipse RT projects target "clients" and "servers" across embedded devices, desktops, and enterprise systems, 
 and provide those intermediate software services which enable applications to be more easily and concisely 
 constructed across these environments.  This supports and extends the Equinox vision of a consistent 
 programming and component model where developers create application domain code that runs on a variety of platforms. </p>
 
 <p>By providing a consistent symmetric architecture, Eclipse RT technology enables developers to focus on the 
 business problem at hand and still have many system architecture options available at deployment time.
</p>

			<p class=bar>RT Projects</p>
			  	<p>The RT Project is top-level project of eclipse.org and is overseen 
	      by a <a href="team-leaders.php">Project Management Committee</a> (PMC) 
      	  and project leaders. Most of the real work however, is done in subprojects. The <a href="charter.html">RT Project Charter</a> 
      	  describes the organization of the project, roles and responsibilities of 
      	  the participants, and top level development process for the projects. 
			
<table BORDER=0 CELLSPACING=5 CELLPADDING=2 WIDTH="100%" >
  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/ecf">Eclipse Communication Framework (ECF)</a></b> 
    ECF is a framework for supporting the development of distributed Eclipse-based tools and applications. It can be used to 
    create other plugins, tools, or full <a href="http://www.eclipse.org/rcp">Eclipse RCP applications</a> that require 
    asynchronous point-to-point or publish-and-subscribe messaging.
    </td>
  </tr>

  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/eclipselink">EclipseLink</a></b> [insert short description here]
  </tr>

  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/equinox">Equinox</a></b>
    Equinox the OSGi framework implementation that is the base runtime for Eclipse.  It is based on OSGi. The Equinox project 
    includes the framework itself, many OSGi specified service implementations and additional function such as 
    the <a href="http://wiki.eclipse.org/Equinox_p2">p2 provisioning platform</a>, the extension registry, server side 
    infrastructure and security faciliities.</td>
  </tr>

  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/ercp">embedded Rich Client Platform (eRCP)</a></b> eRCP project extends the 
    Eclipse Rich Client Platform (RCP) to embedded devices. eRCP consists of a set of components which are subsets 
    of RCP components. It enables the same application model used on desktop machines to be used on devices.
  </tr>

  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/rap">Rich AJAX Platform (RAP)</a></b>The RAP project enables 
    developers to single source rich, Ajax-enabled Web applications and typical RCP deployments using the Eclipse development model of
    plug-ins with the well known Eclipse workbench extension points, JFace, and a widget toolkit with SWT 
    API (using  qooxdoo for the client-side presentation). 
  </tr>

  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/riena">Riena</a></b> [insert short description here]
  </tr>
  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/smila">SeMantic Information Logistics Architecture (SMILA)</a></b> SMILA is an extensible framework for building search solutions to access unstructured information in
the enterprise. Besides providing essential infrastructure components and services, SMILA also delivers
ready-to-use add-on components, like connectors to most relevant data sources. Using the framework as their
basis will enable developers to concentrate on the creation of higher value solutions, like semantic driven
applications etc.
  </tr>

  <tr>
    <td width="2%" align=RIGHT valign=TOP><img src="http://eclipse.org/images/Adarrow.gif" width="16" height="16" border="0"></td>
    <td width="98%"><b><a href="/swordfish">Swordfish</a></b> [insert short description here]
  </tr>

  </table>
  
		  <p class=bar>Getting Started and Getting Involved</p>
			<p>Looking to find out more about RT and runtime technology at eclipse.org? The easiest way is to try it out. See the general 
			<a href="http://www.eclipse.org/equinox-portal/getstarted.php">Equinox Technology Getting
				Started Guide</a> for how tutorials and webinars on how to work with the runtime technology at eclipse.org.</p>
				<p>
			<p>If you want to get involved, find out more, ask questions, report bugs, get (or contribute
				:-) code, check out the <a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.rt">RT newsgroup</a>
				 or the newsgroups and mailing lists for the various RT projects. 
				</p>

		  <p class=bar>Calendars</p>

	<table border="0" >
		<tr>
			<td>
				<iframe src="http://www.google.com/calendar/embed?showTabs=0&amp;showCalendars=0&amp;mode=AGENDA&amp;height=300&amp;wkst=1&amp;bgcolor=%23ffffff&amp;src=fhqvmfmj74mveaq07gi6n1npqg%40group.calendar.google.com&amp;color=%2329527A&amp;ctz=America%2FToronto" style=" border-width:0 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
			</td>
	 		<td>
				<a href="#" onmouseover="showPopup(event, 300, 300, 'equinox');">Equinox Calendar</a>
				<br>
		  		<a href="#" onmouseover="showPopup(event, 300, 300, 'architecture');">Eclipse Architecture Council</a>
				<br>
 		 		<a href="#" onmouseover="showPopup(event, 300, 300, 'e4');">e4</a>
  			</td>
		</tr>
	</table>

	<div id="popupcontent"></div>
	<div id="equinox" class=hidden>
		<iframe onmouseout="hidePopup();" src="http://www.google.com/calendar/embed?showTabs=0&amp;showCalendars=0&amp;mode=AGENDA&amp;height=300&amp;wkst=1&amp;bgcolor=%23FFFFFF&amp;src=08i9q5g17o9il95b4pbc5n4f4g%40group.calendar.google.com&amp;color=%235229A3&amp;ctz=America%2FToronto" style=" border-width:0 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
	</div>
	<div id="architecture" class=hidden>
		<iframe onmouseout="hidePopup();" src="http://www.google.com/calendar/embed?showTabs=0&amp;showCalendars=0&amp;mode=AGENDA&amp;height=300&amp;wkst=1&amp;bgcolor=%23FFFFFF&amp;src=g30r6idsq3rsufe2j3t6k0l0g4%40group.calendar.google.com&amp;color=%2328754E&amp;ctz=America%2FToronto" style=" border-width:0 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
	</div>
	<div id="e4" class=hidden>
		<iframe onmouseout="hidePopup();" src="http://www.google.com/calendar/embed?showTabs=0&amp;showCalendars=0&amp;mode=AGENDA&amp;height=300&amp;wkst=1&amp;bgcolor=%23FFFFFF&amp;src=ctri5teoag0n87t2qu9bla8u3g%40group.calendar.google.com&amp;color=%230D7813&amp;ctz=America%2FToronto" style=" border-width:0 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
	</div>

	<div id="popupcontent"></div>
	<div id="mycal" class=hidden>
		<iframe onmouseout="hidePopup();" src="http://www.google.com/calendar/embed?showTitle=0&amp;showNav=0&amp;showDate=0&amp;showTabs=0&amp;showCalendars=0&amp;mode=AGENDA&amp;height=300&amp;wkst=1&amp;bgcolor=%23ffffff&amp;src=fhqvmfmj74mveaq07gi6n1npqg%40group.calendar.google.com&amp;color=%2329527A&amp;ctz=America%2FToronto" style=" border-width:0 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
	</div>
	<div id="yourcal" class=hidden>
		<iframe onmouseout="hidePopup();" src="http://www.google.com/calendar/embed?showTitle=0&amp;showNav=0&amp;showDate=0&amp;showTabs=0&amp;showCalendars=0&amp;mode=AGENDA&amp;height=300&amp;wkst=1&amp;bgcolor=%23ffffff&amp;src=fhqvmfmj74mveaq07gi6n1npqg%40group.calendar.google.com&amp;color=%2329527A&amp;ctz=America%2FToronto" style=" border-width:0 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
	</div>


			<p>&nbsp;</p>

	</div>

<script language="javascript" type="text/javascript">
<!--
function showPopup(e, w, h, content){
	var popUp = document.getElementById("popupcontent");
	element = getElementFor(e);
	popUp.style.left = findPosX(element);
	popUp.style.top = findPosY(element);
	popUp.style.width = w + "px";
	popUp.style.height = h + "px";
	var innerContent = document.getElementById(content);
	popUp.innerHTML = innerContent.innerHTML;
	popUp.style.visibility = "visible";
}

function hidePopup(){
	var popUp = document.getElementById("popupcontent");
	popUp.innerHTML = "";
	popUp.style.visibility = "hidden";
}

function getElementFor(e) {
	if (!e)
		var e = window.event;
	if (e.target)
		result = e.target;
	else if (e.srcElement)
		result = e.srcElement;
	if (result.nodeType == 3) // defeat Safari bug
	result = result.parentNode;
	return result;
}

function findPosX(obj) {
	var curleft = 0;
	if(obj.offsetParent)
		while(1) {
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	else if(obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	if(obj.offsetParent)
		while(1) {
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
	else if(obj.y)
		curtop += obj.y;
	return curtop;
}
// -->
</script>


<?php
	include $_SERVER['DOCUMENT_ROOT'] . "/rt/global-links.html";
	if (file_exists("dir-links.html")) {include "dir-links.html";}
?>

<?php
	$html = ob_get_contents();
	ob_end_clean();

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
