<?php
/*******************************************************************************
 * Copyright (c) 2013 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/

//if name of the file requested is the same as the current file, the script will exit directly.
if(basename(__FILE__) == basename($_SERVER['PHP_SELF'])){exit();}
ob_start();
$active = ' class="active"';
$active_icon = '<i class="fa fa-angle-double-right orange fa-fw"></i> ';
?>

<div class="toolbar-menu breadcrumbs-offset">
    <div class="container">
      <div class="row">
        <div class="col-md-24">
          <ol class="breadcrumb">
            <li><?php if($page == 'download') print $active_icon; ?><a href="/downloads/index.php"<?php if($page == 'download') print $active; ?>>Packages</a></li>
            <li><?php if($page == 'developer') print $active_icon; ?><a href="/downloads/index-developer.php"<?php if($page == 'developer') print $active; ?>>Developer Builds</a></li>
            <!-- <li><?php if($page == 'installer') print $active_icon; ?><a href="/downloads/installer.php"<?php if($page == 'installer') print $active; ?>>Eclipse Installer</a></li>-->
          </ol>
        </div>
      </div>
    </div>
</div>
<div class="download-container">
  <div class="container">
    <div id="page-<?php print $page?>" class="<?php if (isset($page) && ($page != 'compare')) { print 'col-md-18'; }else{ print 'col-md-24';};?>">
          <?php
            if (isset($page) && $page == 'projects') {
              require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/views/view.projects.php");
            }
            else if(isset($page) && $page == 'compare') {
              require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/views/view.compare.php");
            }
            else if(isset($page) && $page == 'mac_gatekeeper') {
              require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/views/view.mac_gatekeeper.php");
            }
            else if(isset($page) && $page == 'installer_instructions') {
              require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/views/view.installer_instructions.php");
            }
            else if(isset($page) && $page == 'installer' && class_exists('EclipseInstaller')) {
              print $EclipseInstaller->output();
              print '<p class="text-center"><a class="btn btn-primary" href="/downloads/installer-instructions.php">6 Steps to Install Eclipse</a></p>';
            }
            else{
              require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/views/view.downloads.php");
            }
        ?>
    </div>
    <div class="col-md-6">
    <?php
      if (isset($page) && ($page != 'compare')) {
        require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/views/view.sidebar.php");
      }
    ?>
    </div>
  </div>
  <section class="footer-offset">
    <div class="container text-center padding-top hidden-xs padding-bottom">
      <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
      <!-- 468x60, created 5/26/08 -->
      <ins class="adsbygoogle"
        style="display:inline-block;width:468px;height:60px"
        data-ad-client="ca-pub-6797025590085056"
        data-ad-slot="4661560739"></ins>
      <script>
        (adsbygoogle = window.adsbygoogle || []).push({});
      </script>
    </div>
  </section>
</div>

<?php
  $html = ob_get_clean();
