<?php
/**
 * Copyright (c) 2014, 2016, 2018 Eclipse Foundation.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Christopher Guindon (Eclipse Foundation) - Initial implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/controller.compare.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/controller.downloads.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/downloads/eclipseInstaller.php");

  $App = New App();
  $EclipseInstaller = new EclipseInstaller('oxygen/R2');

  // @todo: We should probably move these functions to Theme().
  $App->Promotion = TRUE;
  $App->PageRSS = "/downloads/rss.php";
  $App->PageRSSTitle = "Eclipse Releases";
  $App->AddExtraJSFooter('<script type="text/javascript" src="/downloads/assets/public/javascript/downloads.min.js"></script>');
  $App->Promotion = FALSE;

  # CONFIGURATION
  $page = 'download';

  $Downloads = new Downloads($App);
  $Downloads->setReleaseTitle('Eclipse Oxygen.3a (4.7.3a)  Release');
  $Downloads->setPrefixPackage('release');
  $Downloads->setRelease('photon');
  //$Downloads->setFriendsEarlyAccess(TRUE);

  $Theme = $App->getThemeClass();

  // @todo: There seems to be a bug with the Breadcrumbs.
  // The download links does not get added automatically if $pageTitle
  // is not set.
  $pageTitle = 'Eclipse IDE Downloads';

  //$Theme->setBreadcrumb($Breadcrumb);
  //$Theme->setNav($Nav);
  //$Theme->setMenu($Menu);
  $Theme->setPageAuthor('Eclipse Foundation');
  $Theme->setPageKeywords('eclipse, download, downloads, mirror, project, plug-ins, plugins, java, ide, swt, refactoring, free java ide, tools, platform, open source, development environment, development, ide');
  $Theme->setPageTitle($pageTitle);

    // Custom theme variables
  $variables = array();
  $variables['main_container_classes'] = 'container-full';
  // CFA Link - Big orange button in header
  $variables['btn_cfa'] = array(
    'hide' => TRUE, // Optional - Hide the CFA button.
  );
  $App->setThemeVariables($variables);

  require_once($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/view.tpl.php");

  $Theme->setHtml($html);
  $Theme->removeAttributes('breadcrumbs', 'breadcrumbs-default-margin');
  $Theme->setExtraHeaders('<link href="/downloads/assets/public/stylesheets/packages.min.css" media="screen" rel="stylesheet" type="text/css"/>');
  $Theme->generatePage();
