<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en" xml:lang="en">

<head>
<meta HTTP-EQUIV="refresh" CONTENT="1; url=contents.htm">
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body bgcolor="#FFFFFF" text="#000000" link="#004080" vlink="#666666" alink="#0000FF">


<table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td valign="top">






<h3 align="center">Index</h3>

<p><br>
</p>

<h4 align="center">Please wait while index page is loading...</h4>
<pre msnavigation> </pre></td><td valign="top" width="24">


      <p> <small><small>Copyright&nbsp;
        &copy; 2005, 2006 IBM Corporation and others</small></small></p>

</td><td valign="top" width="24"></td><td valign="top" width="1%">
<p>
<a href="../index.htm"></a>
</p>

<script language="JavaScript">
var already_using_frames_MSG="The Eclipse Process Framework is already displayed using frames";
// <!--
function loadTop()
{
  if(parent.frames.length!=0 && parent.frames[1].name=="ory_toc")
  {
     alert(already_using_frames_MSG);
  }
  else
  {
    var expires = new Date();
    expires.setTime (expires.getTime() + (1000 * 20));
    document.cookie = "rup_ory_doc=" + escape (document.URL) +
    "; expires=" + expires.toUTCString() +  "; path=/";

    var new_ory_doc_loc = null;

    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href;
         break;
       }
    }

    if(new_ory_doc_loc!=null)
    {
	if( self.name == "ory_doc" )
	{
		window.close();
		window.open( new_ory_doc_loc );
	}
	else
	{
	       	top.location = new_ory_doc_loc;
	}
    }
   }
}
// -->
</script>
<script language="JavaScript">
// <!--
  function getImageUrl(image)
  {
    var new_ory_doc_loc=null;
    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href.substring(0,document.links[i].href.lastIndexOf("/"));
         new_ory_doc_loc = new_ory_doc_loc + "" + image;
         return new_ory_doc_loc;
       }
    }
    return null;
  }
// -->
</script>
<script language="JavaScript">
// <!--
MSFPhover =
(((navigator.appName == "Netscape") &&
  (parseInt(navigator.appVersion) >= 3 )) ||
  ((navigator.appName == "Microsoft Internet Explorer") &&
  (parseInt(navigator.appVersion) >= 4 )));

  function MSFPpreload(img)
  {
     var a=new Image();
     a.src=img;
     return a;
  }
// -->
</script>
<script language="JavaScript">
// <!--
    if(MSFPhover)
    {
        RupGray=MSFPpreload(getImageUrl('/images/display_views.gif'));
        RupBlue=MSFPpreload(getImageUrl('/images/display_views_a.gif'));
    }
// -->
</script>

<script language="JavaScript">
   var displayFramesMsg="Display Eclipse Process Framework using frames";
// <!--
   function mouseOver()
   {
   		if(MSFPhover) 
   			document['Home'].src=RupBlue.src; 
   		self.status=displayFramesMsg; 
   		return true;
   }
// -->
</script>

<script language="JavaScript">
var clearStatusMsg=" ";
// <!--
function mouseOut()
{
if(MSFPhover) 
document['Home'].src=RupGray.src; 
self.status=clearStatusMsg;
return true;
}
// -->
</script>

<a href="JavaScript:loadTop();" onmouseover="JavaScript:mouseOver();" onmouseout="JavaScript:mouseOut();">

<p>
<img src="../images/rup1.gif" border="0" alt="Display Eclipse Process Framework using frames" name="Home" width="20" height="110"></p></a>
</td></tr></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
<p align="right"><small><small>Eclipse Process Framework&nbsp;&nbsp;</small></small>
</td></tr></table>


</body>
</html>
