<?php
/*******************************************************************************
 * Copyright (c) 2014, 2016 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
 *    Eric Poirier (Eclipse Foundation)
 *******************************************************************************/

  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");

  $App = New App();

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

  $Theme = $App->getThemeClass($theme);

  $App->setThemeVariables(array('hide_breadcrumbs' => TRUE));

  // @todo: There seems to be a bug with the Breadcrumbs.
  // The download links does not get added automatically if $pageTitle
  // is not set.
  $pageTitle = 'Eclipse Neon';

  //$Theme->setBreadcrumb($Breadcrumb);
  //$Theme->setNav($Nav);
  //$Theme->setMenu($Menu);
  $Theme->setPageAuthor('Eclipse Foundation');
  $Theme->setPageKeywords("eclipse neon, release, simultaneous, release train, neon");
  $Theme->setPageTitle($pageTitle);

    // Custom theme variables
  $variables = array();
  $variables['main_container_classes'] = 'container-full breadcrumbs-offset footer-offset';
  // CFA Link - Big orange button in header

  $App->setThemeVariables($variables);

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

  $Theme->setExtraHeaders("<link href='https://fonts.googleapis.com/css?family=Lato:400,700,300' rel='stylesheet' type='text/css'>");
  $Theme->setExtraHeaders('<link href="/neon/assets/public/stylesheets/neon.min.css" media="screen" rel="stylesheet" type="text/css"/>');
  $Theme->generatePage();
