<?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'], @gethostbyaddr($_SERVER['REMOTE_ADDR']));
$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->PageRSS = "/downloads/rss.php";
$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->generatePage();
