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

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

# Begin: page-specific settings.  Change these.
$pageTitle = "Link donation with your Eclipse account";
$pageKeywords = "friends of eclipse, donation, contribution";
$pageAuthor = "Christopher Guindon";

// Custom logic
$hide_form = FALSE;
if (!$PaymentGateway->Donation->link_donation()){
  $PaymentGateway->set_client_message('This is not a valid transaction.', 'danger');
  $hide_form = TRUE;
}
else{
  $stage = $PaymentGateway->Donation->update_donation();
  if ($stage == 'updated') {
    $PaymentGateway->set_client_message('Your donation was succesfully updated. Please check your e-mail for addionnal information.', 'success');
    $hide_form = TRUE;
  }
  elseif ($stage == 'invalid_eclipse_id') {
    $PaymentGateway->set_client_message('Unable to find an eclipse account from your e-mail address.', 'danger');
  }
  elseif ($stage == 'link_already_done') {
    $PaymentGateway->set_client_message('Your donation is already linked to an eclipse account.', 'danger');
    $hide_form = TRUE;
  }
}

// Place your html content in a file called content/en_pagename.php
ob_start();
include("content/en_" . $App->getScriptName());
$html = ob_get_clean();

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

# Generate the web page
$App->generatePage(NULL, $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
