<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ru" xml:lang="ru">
<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">Индекс</h3>

<p><br>
</p>

<h4 align="center">Подождите, пока загружается страница индекса...</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="Среда Eclipse Process Framework уже показана с фреймами";
// <!--
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="Показать Eclipse Process Framework с фреймами";
// <!--
   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="Показать Eclipse Process Framework с фреймами" 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>
