<?php
/**
 * Copyright (c) 2013, 2015, 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
 */

// Temporarily removing the dev build page
header('Location: eclipse-packages/index.php', FALSE, 302);

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

$App = new App();
$Theme = $App->getThemeClass();
$EclipseInstaller = new EclipseInstaller('oxygen/R2');

$pageTitle = "Eclipse Downloads";
$Theme->setPageTitle($pageTitle);
$Theme->setPageAuthor('Eclipse Foundation, Inc.');
$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');

$App->PageRSS = "/downloads/rss.php";
$App->PageRSSTitle = "Eclipse Releases";

// CONFIGURATION
$page = 'developer';
require_once ($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/controller.compare.php");
require_once ($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/controller.downloads.php");

$Downloads = new Downloads($App);
$Downloads->setReleaseTitle('Eclipse Photon (4.8) RC3 Packages');
$Downloads->setPrefixPackage('developer');
$Downloads->setRelease('photon');
// $Downloads->setFriendsEarlyAccess(TRUE);

$release = array();
$release['dev'] = array('caption' => 'Photon RC3','url' => 'release=photon');
// $release['alt'] = array('caption' => 'Oxygen 3.RC3', 'url' => 'release=oxygen');

  /*if (isset($_GET['release']) && $_GET['release'] == 'oxygen') {
    $Downloads->setPrefixPackage('developerAlt');
    $Downloads->setReleaseTitle("Eclipse Oxygen (4.7.1) 3.RC3 Packages");
    $Downloads->setRelease('oxygen');
    $EclipseInstaller = new EclipseInstaller('oxygen/R2');
  }*/

$App->Promotion = TRUE;
require_once ($_SERVER['DOCUMENT_ROOT'] . "/downloads/downloads/view.tpl.php");

// 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);

// Generate the web page
$App->AddExtraHtmlHeader('<link href="/downloads/assets/public/stylesheets/packages.min.css" media="screen" rel="stylesheet" type="text/css"/>');
$App->AddExtraJSFooter('<script type="text/javascript" src="/downloads/assets/public/javascript/downloads.min.js"></script>');
$Theme->removeAttributes('breadcrumbs', 'breadcrumbs-default-margin');
$Theme->setHtml($html);
$Theme->generatePage();
