<?php

/*******************************************************************************
 * Copyright (c) 2016 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eric Poirier (Eclipse Foundation) - Initial implementation
 *******************************************************************************/


require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App = new App();
$Theme = $App->getThemeClass();
$Nav = new Nav();
$Menu = new Menu();
$script_name = $App->getScriptName();
include ($App->getProjectCommon());

$pageTitle = "Eclipse Newsletter Archives";
$pageKeywords = "eclipse, newsletter, archives, 2013, 2014, 2015, 2016, 2017, 2018";
$pageAuthor = "Roxanne Joncas";

// Display the newsletter Search
$displayNewsletterSearch = TRUE;

// Custom theme variables
$variables = array();
$variables['main_container_classes'] = '';
$App->setThemeVariables($variables);

$Theme->setPageAuthor($pageAuthor);
$Theme->setPageKeywords($pageKeywords);
$Theme->setPageTitle($pageTitle);

// Paste your HTML content between the EOHTML markers!

ob_start();
include("_includes/_index-css.php");
include("_includes/_subpage_header.php");
print '<div class="container padding-top-20"><div class="row"><div class="col-sm-16"><div class="article-body">';
include ("content/en_" . $script_name);
print '</div></div>';
include("_includes/_subpage_sidebar.php");
print '</div></div>';

$html = ob_get_clean();

$Theme->setHtml($html);

if (isset($original_url)) {
  $Theme->setExtraHeaders('<link rel="canonical" href="' . $original_url . '" />');
}
$Theme->setExtraHeaders('<link rel="stylesheet" type="text/css" href="/community/eclipse_newsletter/assets/articles-v2.css" media="screen" />');
$Theme->removeAttributes('breadcrumbs', 'breadcrumbs-default-margin');
$Theme->setDisplayFooterPrefix(FALSE);
$Theme->generatePage();