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

<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">Indeks</h3>

<p><br>
</p>

<h4 align="center">Trwa ładowanie strony indeksu. Proszę czekać...</h4>
<pre msnavigation> </pre></td><td valign="top" width="24">


      <p> <small><small>Copyright&nbsp;
        &copy; 2005, 2006 IBM Corporation i inni</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="Środowisko procesu Eclipse jest już wyświetlane za pomocą ramek";
// <!--
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="Wyświetl środowisko procesu Eclipse za pomocą ramek";
// <!--
   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="Wyświetl środowisko procesu Eclipse za pomocą ramek" 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>Środowisko procesu Eclipse&nbsp;&nbsp;</small></small>
</td></tr></table>


</body>
</html>
