<?php
/**
 * Copyright (c) 2017, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Christopher Guindon (Eclipse Foundation) - Initial implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

  require_once(realpath(dirname(__FILE__) . "/../eclipse.org-common/system/app.class.php"));
  require_once(realpath(dirname(__FILE__) . "/../eclipse.org-common/system/eclipseenv.class.php"));
  require_once(realpath(dirname(__FILE__) . "/../eclipse.org-common/classes/downloads/eclipseInstaller.php"));

  $App = new App();
  $EclipseEnv = new EclipseEnv();
  $eclipse_env = $EclipseEnv->getEclipseEnv();

  $EclipseInstaller = new EclipseInstaller('oxygen/R2');
  $EclipseInstaller->setInstallerLayout('layout_a');

  $links = array("links" => array("#"));
  if ($eclipse_env['shortname'] === "prod") {
    $links = $EclipseInstaller->getInstallerLinks('64bit');
  }

  $oxygen_content_json = dirname(__FILE__) . "/oxygen-content.json";

    // Custom theme variables
  $variables = array();
  $variables['hide_breadcrumbs'] = TRUE;
  $variables['main_container_classes'] = 'container-full breadcrumbs-offset footer-offset';
  $variables['btn_cfa']['text'] = "Donate";
  $variables['btn_cfa']['href'] = 'https://www.eclipse.org/donate/';
  $variables['btn_cfa']['class'] = 'btn btn-huge btn-oxygen-donate';
  $App->setThemeVariables($variables);

  $Theme = $App->getThemeClass();

  $pageTitle = 'Eclipse Oxygen';
  $Theme->setPageAuthor('Eclipse Foundation');
  $Theme->setPageKeywords("eclipse oxygen, release, simultaneous, release train, oxygen");
  $Theme->setPageTitle($pageTitle);

  // Place your html content in a file called content/en_pagename.php
  ob_start();
  include("content/en_" . $App->getScriptName());
  $html = ob_get_clean();

  $Theme->setHtml($html);
  $App->AddExtraJSFooter('<script type="text/javascript" src="/oxygen/public/javascript/oxygen.min.js"></script>');
  $Theme->setExtraHeaders('<link href="/oxygen/public/stylesheets/oxygen.min.css" media="screen" rel="stylesheet" type="text/css"/>');
  $Theme->generatePage();
