<?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: 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/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('oxygen/M3');
  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 Oxygen (4.7) M3 Packages');
  $Downloads->setPrefixPackage('developer');
  $Downloads->setRelease('oxygen');
  //$Downloads->setFriendsEarlyAccess(TRUE);

  $release = array();
  $release['dev'] = array('caption' => 'Oxygen M3', 'url' => 'oxygen');
  $release['alt'] = array('caption' => 'Neon 2.RC3', 'url' => 'neon');

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

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