<?php
/**
 * Copyright (c) 2014, 2016, 2018 Eclipse Foundation.
 *
 * 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 implementation
 *   Eric Poirier (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/downloads/downloads.class.php");

$App = new App();
$Theme = $App->getThemeClass();
$Downloads = new Downloads();

// Adding a 100% counter for the downloads page
$impression = new CampaignImpression('DOWNLOADPAGE', $_SERVER['REQUEST_URI']);
$impression->recordImpression();

// This hide/show the banner ad from being displayed
$Downloads->hideBannerAd(FALSE);

// @todo: We should probably move these functions to Theme().
$App->Promotion = TRUE;
$App->PageRSSTitle = "Eclipse Releases";

$App->AddExtraJSFooter('<script type="text/javascript" src="/downloads/assets/public/javascript/downloads.min.js"></script>');

$App->setThemeVariables(array('hide_breadcrumbs' => TRUE));

$pageTitle = 'Eclipse Downloads';
$Theme->setPageAuthor('Eclipse Foundation');
$Theme->setPageKeywords('eclipse, download, downloads, mirror, project, plug-ins, plugins, java, ide, swt, refactoring, free java ide, tools, platform, open source, development environment, development, ide');
$Theme->setPageTitle($pageTitle);

$App->Promotion = FALSE;

// Custom theme variables
$variables = array();
$variables['main_container_classes'] = 'container-full breadcrumbs-offset footer-offset downloads-container';

// Optional - Hide the CFA button.
$variables['btn_cfa'] = array(
  'hide' => TRUE
);

$App->setThemeVariables($variables);

// Place your html content in a file called content/en_pagename.php
ob_start();
include ("content/en_index.php");
$html = ob_get_clean();

$Theme->setHtml($html);
$Theme->setExtraHeaders('<link href="/downloads/assets/public/stylesheets/downloads.min.css" media="screen" rel="stylesheet" type="text/css"/>');
$Theme->preventCaching();
$Theme->generatePage();
