<?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/R2');
  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 Photon (4.8) M6 Packages');
  $Downloads->setPrefixPackage('developer');
  $Downloads->setRelease('photon');
  //$Downloads->setFriendsEarlyAccess(TRUE);

  $release = array();
  $release['dev'] = array('caption' => 'Photon M6', 'url' => 'photon');
  //$release['alt'] = array('caption' => 'Oxygen 3.RC3', 'url' => '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>');
  $App->generatePage("solstice", $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
