<?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
 *    Donald Smith (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");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/breadcrumbs.class.php");
require_once("../projects/classes/Project.class.php");

$App = new App();
$Theme = $App->getThemeClass();
$Membership = New Membership();
$Breadcrumb = new Breadcrumb();

// Begin: page-specific settings.  Change these.
$pageTitle  = "Eclipse Membership";
$Theme->setPageKeywords("Eclipse Membership profile page");
$Theme->setPageAuthor("Christopher Guindon");

$id = NULL;
if (isset($_GET['member_id'])) {
  $id = $_GET['member_id'];
}

$include_file = $App->getScriptName();
$profile = array();

if ($Membership->setId($id)) {
  $profile = $Membership->fetchProfile();
}

if (empty($profile)) {
  $include_file = "showMemberInvalid.php";
  $profile['name'] = 'INVALID MEMBER ID';
}
else {
  $pageTitle .= " > " . $profile['name'];
}
$Theme->setPageTitle($pageTitle);

// Place your html content in a file called content/en_pagename.php
ob_start();
include("content/en_" . $include_file);
$html = ob_get_clean();
$Theme->setHtml($html);

// remove last crumb since it represents this _projectCommon page.
$Breadcrumb->removeCrumb($Breadcrumb->getCrumbCount() -1);
$Breadcrumb->addCrumb("Eclipse Membership", "/membership/exploreMembership.php", "_self");
$Breadcrumb->addCrumb($profile['name'], NULL, NULL);

// Generate the web page
$Theme->setBreadcrumb($Breadcrumb);
$Theme->generatePage();