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