<?php
/**
 * Copyright (c) 2015, 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/friends/donationList.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/payment.class.php");

$App = new App();
$Paypal = new Paypal();
$Theme = $App->getThemeClass();
$testmode = $Paypal->_get_debug_mode();
$DonationList = new DonationList();

$App->preventCaching();

// Validate with PDT
$Paypal->paypal_confirm_pdt();

// Show thank you message for bitpay donations.
$Paypal->get_gateway_bitpay_thank_you();

# Begin: page-specific settings.  Change these.
$pageTitle = "Together we can improve Eclipse";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("friends of eclipse, donation, contribution");
$Theme->setPageAuthor("Christopher Guindon");

$bestFriendsContributions = new FriendsContributionsList();
$bestFriendsContributions->selectFriendsContributionsList(0, 6, 'WHERE FC.amount >= 100 and F.is_anonymous = 0');
$bestFriends = $bestFriendsContributions->getList();
$donationlist_html = $DonationList->displayFriends($bestFriends, 'credit');

$friendsContributions = new FriendsContributionsList();
$friendsContributions->selectFriendsContributionsList(0, 40, 'WHERE FC.amount >= 35 and FC.amount <= 99.99 and F.is_anonymous = 0');
$friends = $friendsContributions->getList();
$donationlist_35_html = $DonationList->displayFriends($friends, 'four-columns');

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

# Generate the web page
$App->AddExtraJSFooter('<script type="text/javascript" src="assets/public/javascript/scripts.min.js"></script>');
$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="assets/public/stylesheets/credit.min.css" media="screen" />');

// Generate the web page
ob_start();
include ("content/en_" . $App->getScriptName());
$html = ob_get_clean();

$Theme->setHtml($html);
$Theme->removeAttributes('breadcrumbs', 'breadcrumbs-default-margin');
$Theme->generatePage();