<?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/eclipse-packages"<?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();
