<?php
/*******************************************************************************
 * Copyright (c) 2014 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:
 *  Christopher Guindon (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();
$Nav = new Nav();
$Menu = new Menu();
$Theme = $App->getThemeClass();

require_once($App->getProjectCommon());
$App->preventCaching();

# Begin: page-specific settings.Change these.
$pageTitle = "Eclipse Newsletter";
$pageKeywords= "eclipse, newsletter, eclipse ide, open source, monthly, developer, resource";
$pageAuthor= "Christopher Guindon";
$domain = $App->getEclipseDomain();

// TRUE  to show the sponsor
// FALSE to hide the sponsor
$displayNewsletterSponsor = FALSE;

$Theme->setPageAuthor($pageAuthor);
$Theme->setPageKeywords($pageKeywords);
$Theme->setPageTitle($pageTitle);
$Theme->setMetaDescription('The Eclipse Newsletter features technical articles revolving around a new theme every month. Subscribe to stay in the know!');

$thankyou = "";
if (isset($_GET['registration']) && $_GET['registration'] == 'complete') {
  setcookie("thankyou_page[eclipse_newsletter]", TRUE, time() + (3600 * 24 * 360 * 10), '/', $domain['cookie']);
  $thankyou = '<div class="alert alert-success" role="alert">Thank you for subscribing to the Eclipse Newsletter!</div>';
}

// Custom theme variables
$variables = array();
$variables['main_container_classes'] = 'container-full breadcrumbs-offset footer-offset eclipse-newsletter-container footer-offset';
// CFA Link - Big orange button in header
$App->setThemeVariables($variables);

// 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);

# Generate the web page
$Theme->removeAttributes('breadcrumbs', 'breadcrumbs-default-margin');
$Theme->setBreadcrumb($Breadcrumb);
$Theme->setDisplayFooterPrefix(FALSE);
$Theme->generatePage();
