<?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
*******************************************************************************/
  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/RC2');
  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) RC2 Packages');
  $Downloads->setPrefixPackage('developer');
  $Downloads->setRelease('neon');
  //$Downloads->setFriendsEarlyAccess(TRUE);

  $release = array();
  $release['dev'] = array('caption' => 'Neon RC2', '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/downloads.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);
