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

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

  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");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/downloads/eclipseInstaller.php");

  $App = new App();
  $Nav = new Nav();
  $Menu = new Menu();
  $EclipseInstaller = new EclipseInstaller('neon/RC3a');
  include("_projectCommon.php");

  # Begin: page-specific settings.  Change these.
  $pageTitle     = "Eclipse Downloads";
  $pageKeywords  = "eclipse,download,downloads,mirror,project,plug-ins,plugins,java,ide,swt,refactoring,free java ide,tools,platform,open source,development environment,development,ide";
  $pageAuthor    = "Eclipse Foundation, Inc.";

  $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 Neon (4.6) RC3a Packages');
  $Downloads->setPrefixPackage('developer');
  $Downloads->setRelease('neon');
  //$Downloads->setFriendsEarlyAccess(TRUE);

  $release = array();
  $release['dev'] = array('caption' => 'Neon RC3a', 'url' => 'neon');
  //$release['alt'] = array('caption' => 'Mars.2 RC3', 'url' => 'mars');

  if (isset($_GET['release']) && $_GET['release'] == 'mars') {
    $Downloads->setPrefixPackage('developerAlt');
    $Downloads->setReleaseTitle("Eclipse Mars.2 (4.5.2) RC3 Packages");
    $Downloads->setRelease('mars');
    //$EclipseInstaller = new EclipseInstaller('mars/RC3');
  }

  $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>');
  $App->generatePage("solstice", $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
