<?php
/**
 * Copyright (c) 2014, 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 API and implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 */

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

$App = new App();
$App->PageRSS = "//feeds.feedburner.com/eclipse/fnews";
$App->PageRSSTitle = "Eclipse Foundation News";
$Theme = $App->getThemeClass();

// Begin: page-specific settings.  Change these.
$pageTitle = "The Platform for Open Innovation and Collaboration";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("eclipse, project, plug-ins, plugins, java, ide, swt, refactoring, free java ide, tools, platform, open source, development environment, development, ide");
$Theme->setPageAuthor("Eclipse Foundation, Inc.");
$Theme->setTitle("Enabling Open Innovation &amp; Collaboration");

ob_start();
?>
<div class="jumbotron featured-jumbotron">
  <div class="container margin-bottom-30">
    <div class="row">
      <div class="col-md-20 col-md-offset-2 col-sm-18 col-sm-offset-3">
        <h1>The Platform for Open<br> Innovation and Collaboration</h1>
        <div class="row">
          <div class="col-md-6 col-xs-12">
            <a href="/membership" class="jumbotron-icon"><i data-feather="users" stroke-width="1"></i></a>
            <a href="/membership" class="btn btn-warning">Members</a>
          </div>
          <div class="col-md-6 col-xs-12">
            <a href="/org/workinggroups" class="jumbotron-icon"><i data-feather="share-2" stroke-width="1"></i></a>
            <a href="/org/workinggroups" class="btn btn-warning">Working Groups</a>
          </div>
          <div class="col-md-6 col-xs-12">
            <a href="/projects" class="jumbotron-icon"><i data-feather="compass" stroke-width="1"></i></a>
            <a href="/projects" class="btn btn-warning">Discover Projects</a>
          </div>
          <div class="col-md-6 col-xs-12">
            <a href="/org/value" class="jumbotron-icon"><i data-feather="briefcase" stroke-width="1"></i></a>
            <a href="/org/value" class="btn btn-warning">Business Value</a>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<?php
$extra_header_html = ob_get_clean();
$Theme->setExtraHeaderHtml($extra_header_html);
$Theme->setExtraHeaderHtml('<link rel="stylesheet" type="text/css" href="/home/featured-story.css" media="screen" />');

// 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->setThemeVariables(array('hide_breadcrumbs' => TRUE, 'main_container_classes' => 'container-full'));
$Theme->setAttributes('header-wrapper', 'header-default-bg-img featured-jumbotron-bottom-shape');
$Theme->preventCaching();
$Theme->generatePage();