<?php
/**
 * Copyright (c) 2020 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 API and 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();

// Begin: page-specific settings.  Change these.
$pageTitle = "Enabling Global Collaboration on Open Source Innovation";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("eclipse, europe");
$Theme->setPageAuthor("Eclipse Foundation, Inc.");
$Theme->setTitle("Expanding the Global Level Playing Field for Open Collaboration");

ob_start();
?>
<div class="jumbotron featured-jumbotron">
  <div class="container margin-bottom-10">
    <div class="row">
      <div class="col-md-24 col-md-offset-0 col-sm-18 col-sm-offset-3">
        <h1 style="margin-bottom:25px;font-size:32px;"><?php print $pageTitle; ?></h1>
        <div class="row">
          <div class="col-md-12 col-md-offset-6"><p style="margin-bottom:20px; font-size:21px;">The Eclipse Foundation Transitions to Europe as Part
of Continued Global Expansion.</p></div>
        </div>


        <ul class="list-inline margin-top-30">
          <li><a class="btn btn-primary" href="https://newsroom.eclipse.org/news/announcements/open-source-software-leader-eclipse-foundation-announces-transition-europe-part">Read the Announcement</a></li>
          <li><a class="btn btn-primary" href="https://accounts.eclipse.org/contact/membership/aisbl">Become a Member</a></li>
        </ul>
      </div>
    </div>
  </div>
</div>
<?php
$extra_header_html = ob_get_clean();
$Theme->setExtraHeaderHtml($extra_header_html);

// 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="/europe/styles.css?v=1" media="screen" rel="stylesheet" type="text/css"/>');
$Theme->setThemeVariables(array('main_container_classes' => 'container-full'));
$Theme->setAttributes('header-wrapper', 'header-europe-bg-img');
$Theme->preventCaching();
$Theme->generatePage();