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

$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 Community 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 featured-jumbotron-anniversary">
  <div class="container margin-bottom-10">
    <div class="row">
      <div class="col-md-18 col-md-offset-3 col-sm-18 col-sm-offset-3">
        <h1 style="font-size:38px;">The Community for Open<br> Innovation and Collaboration</h1>
        <p style="margin-bottom:40px; font-size:21px;font-weight: 600;">The Eclipse Foundation provides our global community of individuals and organizations with a mature, scalable, and business-friendly environment for open source software collaboration and innovation.</p>
        <div class="row">
          <div class="col-md-6 col-xs-12">
            <a href="/projects/" class="btn btn-warning">Discover Projects</a>
          </div>
          <div class="col-md-6 col-xs-12">
            <a href="/org/workinggroups/" class="btn btn-warning">Working Groups</a>
          </div>
          <div class="col-md-6 col-xs-12">
            <a href="/membership/" class="btn btn-warning">Members</a>
          </div>
          <div class="col-md-6 col-xs-12">
            <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);
$App->AddExtraJSFooter('
<script>
$(function() {
  // Eclipse News and Announcements
  $("#news-list-community").eclipseFdnApi({
    type: "newsItems"
  });
  $("#news-list-announcements").eclipseFdnApi({
    type: "newsItems"
  });
});
</script>
');
$App->AddExtraJSFooter('<script src="/home/js/featured-projects-committer.js?v1.0"></script>');
$App->AddExtraJSFooter('<script src="/eclipse.org-common/themes/solstice/public/javascript/eclipsefdn.promotion.min.js?v1.0"></script>');
// 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-anniversary-bg-img header-default-bg-img featured-jumbotron-bottom-shape');
$Theme->setExtraHeaders('<link href="/home/css/styles.css?v=1" media="screen" rel="stylesheet" type="text/css"/>');
$Theme->preventCaching();
$Theme->generatePage();
