<?php
/**
 * Copyright (c) 2019 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"));
$App = new App();
include ($App->getProjectCommon());

$pageTitle = 'Eclipse IDE 2021-12';
$Theme->setPageKeywords("eclipse 2021-12, release, simultaneous, release train, 2021-12");
$Theme->setPageTitle($pageTitle);

ob_start();
?>
<div class="jumbotron featured-jumbotron margin-bottom-0">
  <div class="container">
    <div class="row">
      <div class="col-md-12">
        <h1 class="jumbotron-title">Eclipse IDE</h1>
        <h2 class="h3 fw-600">The Leading Open Platform for Professional Developers</h2>
      </div>
    </div>
    <?php if(time() >= strtotime("8 december 2021 10:00")): ?>
      <div class="jumbotron-links">
        <ul class="list-inline text-center">
          <li><a class="btn btn-primary" href="/downloads/packages/installer">Download 2021-12</a></li>
          <li><a class="btn btn-primary" href="/downloads/packages">Other Packages</a></li>
          <li><a class="btn btn-primary" href="/donate">Donate</a></li>
        </ul>
        <?php else: ?>
          <p>December 8, 2021</p>
        <?php endif; ?>
      </div>
  </div>
</div>
<?php
$extra_header_html = ob_get_clean();
$Theme->setExtraHeaderHtml($extra_header_html);

ob_start();
?>
<div class="container featured-connected">
  <h2>Stay Connected with Eclipse Projects</h2>
  <p>Stay up-to-date with the Eclipse IDE by following us on social media!</p>
  <div class="row">
    <div class="col-md-24">
      <ul class="list-inline featured-social-links margin-bottom-30">
        <li>
          <a href="https://twitter.com/EclipseJavaIDE">
            <i class="fa fa-twitter"><span class="sr-only">Twitter</span></i>
          </a>
        </li>
        <li>
          <a href="https://www.instagram.com/eclipsejavaide/">
            <i class="fa fa-instagram"><span class="sr-only">Instagram</span></i>
          </a>
        </li>
        <li>
          <a href="https://www.facebook.com/eclipse.org/">
            <i class="fa fa-facebook"><span class="sr-only">Facebook</span></i>
          </a>
        </li>
        <li>
          <a href="https://www.youtube.com/playlist?list=PLy7t4z5SYNaSNjL60ofpwVhfA7mOF3Pgk">
            <i class="fa fa-youtube"><span class="sr-only">Youtube</span></i>
          </a>
        </li>
      </ul>
    </div>
  </div>
</div>
<?php
$footer_content_prefix = ob_get_clean();
$Theme->setFooterContentPrefix($footer_content_prefix);

// Place your html content in a file called content/en_pagename.php
ob_start();
include ("content/en_index.html");
$html = ob_get_clean();

$Theme->setHtml($html);

$variables = array();
//$variables['btn_cfa']['hide'] = TRUE;
$variables['btn_cfa']['text'] = '<i class="fa fa-star"></i> Donate';
$variables['btn_cfa']['href'] = 'https://www.eclipse.org/donate?campaign=landingpage_2021-12&scope=donatebutton';
$variables['btn_cfa']['class'] = 'btn btn-huge btn-info';
$Theme->setThemeVariables($variables);

$Theme->setExtraHeaders('<link href="/eclipseide/2021-12/style.css?v=1" media="screen" rel="stylesheet" type="text/css"/>');
$Theme->setAttributes('header-wrapper', 'header-eclipseide');
$Theme->setThemeVariables(array('hide_breadcrumbs' => TRUE, 'main_container_classes' => 'container-full'));

$Theme->generatePage();