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

$App = new App();
$Nav = new Nav();
$Menu = new Menu();
$App->preventCaching();

// Begin: page-specific settings.  Change these.
$pageTitle = "Processing donation...";
$pageKeywords = "friends of eclipse, donation, contribution";
$pageAuthor = "Christopher Guindon";

$script_name = $App->getScriptName();
$domain = $App->getEclipseDomain();

$html = "";

$type = $App->getHTTPParameter('type');
switch ($type) {
  case 'newsletter':
    $pageTitle = 'Processing Eclipse Newsletter registration';
    $query = array();
    $query['EMAIL'] = filter_var($App->getHTTPParameter('email'), FILTER_SANITIZE_EMAIL);
    $query_string = http_build_query($query);
    $url = 'https://eclipsecon.us6.list-manage.com/subscribe/post?u=eaf9e1f06f194eadc66788a85&amp;id=46e57eacf1&' . $query_string;
    header('Location: ' . $url, TRUE, 302);
    break;

  case 'bitpay':
    $Payment = new BitPay();
    $Payment->set_posted_donation_values();
    break;

  default:
    $Payment = new PayPal();
    $Payment->set_posted_donation_values();
    header('Location: ' . $Payment->get_gateway_redirect(), TRUE, 302);
    break;
}

if (isset($Payment)) {
  $html = $Payment->get_process_html();
}

# 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/improve.min.css" media="screen" />');
$App->generatePage(NULL, $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
