<?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 ();
$Nav = NULL;
$Menu = new Menu ();
include ($App->getProjectCommon ()); # All on the same line to unclutter the user's desktop'

  #*****************************************************************************
  #
  #
  #****************************************************************************
  
  #
  # Begin: page-specific settings.  Change these. 
  $pageTitle = "Orbit Resources";
$pageKeywords = "orbit, bundles, code library, osgi, framework, runtime, resources";

// 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>
  <div class="homeitem3col">
    <h3>Resources</h3>
    <table BORDER=0 CELLSPACING=5 CELLPADDING=2 WIDTH="100%">
      <tr>
        <td align=RIGHT valign=TOP><img
          src="http://eclipse.org/images/Adarrow.gif" width="16"
          height="16" border="0"></td>
        <td><a href="http://wiki.eclipse.org/index.php/Orbit"
          target="_top"><b>Wiki</b></a><br> The Orbit project Wiki.</td>
      </tr>
      <tr>
        <td align=RIGHT valign=TOP><img
          src="http://eclipse.org/images/Adarrow.gif" width="16"
          height="16" border="0"></td>
        <td><a href="news://news.eclipse.org/eclipse.tools.orbit"
          target="_top"><b>Newsgroup</b></a><br> Talk to the people
          using libraries in Orbit</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%"><a
          href="http://dev.eclipse.org/mailman/listinfo/orbit-dev"
          target="_top"><b>Mailing list </b></a><br> Talk to the people
          working on Orbit</td>
      </tr>
      <tr>
        <td align=RIGHT valign=TOP><img
          src="http://eclipse.org/images/Adarrow.gif" width="16"
          height="16" border="0"></td>
        <td><a
          href=https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=%0F%22uct=Orbit&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&keywords_type=allwords&keywords=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&cmdtype=doit(%22der=Reuse%2Bsame%2Bsort%2Bas%2Blast%2Btime&field0-0-0=noop&type0-0-0=noop&value0-0-0=
          target="_top"><b>Bugs/Issues</b></a><br> Discover the current
          bugs and issues in Orbit. Note that a large amount of the
          activity goes on in Bugzilla. Configure your Bugzilla account
          email preferences to watch the one of the Orbit inbox users
          (e.g., orbit.bundles-inbox@eclipse.org) to monitor bug
          activity.</td>
      </tr>
      <tr>
        <td align=RIGHT valign=TOP><img
          src="http://eclipse.org/images/Adarrow.gif" width="16"
          height="16" border="0"></td>
        <td><a
          href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.orbit/?cvsroot=Tools_Project"
          target="_top"><b>CVS</b></a><br> The Orbit code is hosted in
          the normal Tools project repository and is available via <a
          href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.orbit/?cvsroot=Tools_Project">web
            access</a> or direct CVS access. For direct access, use
          anonymous login to the CVS repo
          </p>
          <blockquote>
            <p>:pserver:anonymous@dev.eclipse.org/cvsroot/tools</p>
          </blockquote>
          <p>
            The Orbit work goes on in the org.eclipse.orbit in folders
            appropriate for the work being done. Please not that in
            general the code for a particular version of a library is
            held in a <b>branch</b> of the related project. This is done
            to accommodate multiple versions of the code library. You
            should ensure that you check out the correct branch for your
            needs.
          </p></td>
      </tr>
      <tr>
        <td align=RIGHT valign=TOP><img
          src="http://eclipse.org/images/Adarrow.gif" width="16"
          height="16" border="0"></td>
        <td><a href="http://eclipse.org/orbit/" target="_top"><b>Website</b></a><br>
          The Orbit website itself is hosted in a Git repository and
          mirrored on a conventional HTTP server every minute or so.
          This allows use of PHP, Flash, ... and enables versioning and
          diffing using Eclipse. The site is open for editing by all
          Orbit committers using:
          </p>
          <blockquote>
            <p>ssh://&lt;committer_id&gt;@git.eclipse.org/gitroot/www.eclipse.org/orbit.git</p>
          </blockquote>
          </p>
          <p>You can use Eclipse to check out the whole site and then
            edit and commit. Remember your changes will take a minute or
            so to be reflected in the real site.</p></td>
      </tr>
    </table>
  </div>
</div>

<?php
  include "global-links.html";
?>

<?php
  $html = ob_get_contents();
  ob_end_clean();

  # Generate the web page
  $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
