<?php
/*******************************************************************************
 * Copyright (c) 2017 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://eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation) - Initial implementation
 *******************************************************************************/

  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";

  #redirect the user if he already saw the oxygen landing page
  $uri = explode("/", $_SERVER['REQUEST_URI']);
  if (strtolower($uri[1]) != 'oxygen') {
    if (!isset($_COOKIE['eclipse_oxygen'])){
      setcookie('eclipse_oxygen', 'eclipse_oxygen', time()+3600*24*365, "/", "eclipse.org");
    }
    else {
      header('Location: /home/index.php', TRUE, 302);
      exit();
    }
  }

    // 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($theme);

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