<?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:
 *    Denis Roy (Eclipse Foundation) - Initial implementation
 *    Christopher Guindon (Eclipse Foundation)
 *
 * 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/membership/membership.class.php");

$App = new App();
$Theme = $App->getThemeClass();
$Membership = New Membership();

// Begin: page-specific settings.  Change these.
$pageTitle = "Explore Our Members";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("Eclipse membership, eclipse members, Become an Eclipse member, Membership FAQ");
$Theme->setPageAuthor("Christopher Guindon");

$hide_membership = TRUE;
$hide_faqs = TRUE;
$hide_tips = TRUE;
$show_corporate_sponsors_block = TRUE;
$members = $Membership->fetchProfile();

ob_start();
?>
<div class="jumbotron featured-jumbotron margin-bottom-0">
  <div class="container">
    <div class="row">
      <div class="col-md-22 col-md-offset-1 col-sm-20 col-sm-offset-2">
        <h1><?php print $pageTitle; ?></h1>
        <p>Meet the Eclipse Foundation members and learn more about the products and services they provide.</p>
        <ul class="hidden-xs list-inline margin-top-30">
          <li><a class="btn btn-primary" href="https://accounts.eclipse.org/contact/membership">Become a Member</a></li>
          <li><a class="btn btn-primary" href="/org/workinggroups/explore.php">Explore Working Groups</a></li>
        </ul>
        <ul class="visible-xs list-inline margin-top-30">
          <li class="col-xs-20 col-xs-offset-2"><a class="btn btn-primary btn-wide" href="#">Become a Member</a></li>
          <li class="col-xs-20 col-xs-offset-2"><a class="btn btn-primary btn-wide" href="/org/workinggroups/explore.php">Explore Working groups</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);

// remove breadcrumb margin bottom
$Theme->removeAttributes('breadcrumbs', 'breadcrumbs-default-margin');
$Theme->setAttributes('header-wrapper', 'header-default-bg-img');
$Theme->setAttributes('main', 'background-white');
// Generate the web page
$Theme->generatePage();