<?php
/**
 * Copyright (c) 2015, 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:
 *   Eric Poirier (Eclipse Foundation) - Initial implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 */
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");

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

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

$pageTitle = "Mars Eclipse";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("eclipse Mars, release, simultaneous, release train, mars");
$Theme->setPageAuthor("Eric Poirier");

// Custom theme variables
$variables = array();
$variables['main_container_classes'] = 'container-full footer-offset breadcrumbs-offset padding-top';
$App->setThemeVariables($variables);

ob_start();
include ("content/en_" . $App->getScriptName());
$html = ob_get_clean();

$App->AddExtraHtmlHeader('<link href="//fonts.googleapis.com/css?family=Raleway:100,300,500,400,700" rel="stylesheet" type="text/css">');
$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/mars/assets/public/stylesheets/styles.min.css" media="screen" />');
$App->AddExtraJSFooter('<script type="text/javascript" src="/mars/assets/public/javascript/scripts.min.js"></script>');
$Theme->setHtml($html);
$Theme->generatePage();