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

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