--- donation.module.orig	2009-07-18 23:58:21.000000000 +0200
+++ donation.module	2009-09-25 15:01:14.423828100 +0200
@@ -34,6 +34,12 @@ define ('DONATION_PAGE_TITLE',          
 define ('DONATION_DEFAULT_PAGE_TITLE',    t('Donate'));
 define ('DONATION_DEFAULT_EMAIL',         t('webmaster@localhost'));
 define ('DONATION_UPDATE_DONATIONS_THERMOMETER', 'donation_update_donations_thermometer');
+define ('DONATION_CONTENT_TYPE',          'donations_content_type');
+define ('DONATION_CONTENT_TYPE_DEFAULT',  'donation_target');
+define ('DONATION_TARGET_TEXT',          'donations_content_type_text');
+define ('DONATION_TARGET_DEFAULT_TEXT',  'Please choose the project you want to support');
+define ('DONATION_GENERIC_TEXT',          'donations_generic_text');
+define ('DONATION_GENERIC_DEFAULT_TEXT',  'Make a generic donation');
 
 /**
  * Implementation of hook_perm().
@@ -115,6 +121,13 @@ function donation_menu() {
       'type' => MENU_CALLBACK,
       'access callback' => TRUE,
     );
+    $items['donate/%'] = array(
+      'title' => variable_get(DONATION_PAGE_TITLE, DONATION_DEFAULT_PAGE_TITLE),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('donation_form_build', 1),
+      'type' => MENU_CALLBACK,
+      'access callback' => TRUE,
+    );
     $items['hiddendonations'] = array(
       'title' => 'Donations',
       'page callback' => 'donation_public_page',
@@ -491,16 +504,23 @@ function donation_admin() {
   print theme('page', $output);
 }
 
-function donation_public_page() {
+function donation_get_list($nid = NULL) {
+  $html = '';
+  
   $rows = array();
   $header = array(
     array('data' => t('Name'),   'field' => 'name'),
     array('data' => t('Amount'), 'field' => 'amount'),
     array('data' => t('Date'),   'field' => 'timestamp', 'sort' => 'desc'),
     );
-
-  $sql = 'SELECT d.* FROM {donations} d WHERE d.status = %d'. tablesort_sql($header);
-  $result = pager_query($sql, DONATION_PAGER, 0, NULL, DONATION_PUBLIC);
+	
+  if (!$nid) {
+	  $sql = 'SELECT d.* FROM {donations} d WHERE d.status = %d'. tablesort_sql($header);
+	  $result = pager_query($sql, DONATION_PAGER, 0, NULL, DONATION_PUBLIC);
+  } else {
+	  $sql = 'SELECT d.* FROM {donations} d WHERE d.status = %d AND d.nid = %d'. tablesort_sql($header);
+	  $result = pager_query($sql, DONATION_PAGER, 0, NULL, DONATION_PUBLIC, $nid);
+  }
 
   while ($donation = db_fetch_object($result)) {
     if ($donation->uid) {
@@ -516,10 +536,17 @@ function donation_public_page() {
       simple_paypal_format_amount($donation->amount, $donation->currency),
       t('%time ago', array('%time' => format_interval(time() - $donation->timestamp, 1)))); 
   }
+  
+  $html .= theme('table', $header, $rows);
+  $html .= theme('pager', NULL, DONATION_PAGER, 0);
+  
+  return $html;
+}
 
+function donation_public_page() {
   $output = variable_get(DONATION_DONORS_TEXT, DONATION_DONORS_DEFAULT_TEXT);
   $output .= theme('table', $header, $rows);
-  $output .= theme('pager', NULL, DONATION_PAGER, 0);
+  $output .= donation_get_list();
   print theme('page', $output);
 }
 
@@ -531,32 +558,57 @@ function donation_ipn() {
   // Verify that the request came from Paypal, and not from some intrusion
   if (!simple_paypal_ipn_verify($_POST)) {
     // curl verification failed
+	watchdog('donation', 'curl verification failed');
     return;
   }
 
-  if ($_POST['business'] != variable_get(DONATION_EMAIL, DONATION_DEFAULT_EMAIL)) {
+  $receiver = $_POST['business'];
+  if ($receiver == '') {
+    $receiver = $_POST['receiver_email'];
+  }
+  
+  if ($receiver != variable_get(DONATION_EMAIL, DONATION_DEFAULT_EMAIL)) {
     // Payment is not for the email address configured
-    return;
+    watchdog('donation', 'Donation was not considered: Payment is not for the email address configured');
+	return;
   }
 
   // Format the fields
-  $name = check_plain($_POST['first_name'] .' '. $_POST['last_name'] . ($_POST['payer_business_name'] ? ' ('. $_POST['payer_business_name'] .')' : ''));
+  $name        = check_plain($_POST['first_name'] .' '. $_POST['last_name'] . ($_POST['payer_business_name'] ? ' ('. $_POST['payer_business_name'] .')' : ''));
   $amount      = check_plain((float)$_POST['mc_gross'] - (float)$_POST['mc_fee']);
+  $fee         = check_plain($_POST['mc_fee']);
   $timestamp   = check_plain(strtotime($_POST['payment_date']));
   $payer_email = check_plain($_POST['payer_email']);
   $currency    = check_plain($_POST['mc_currency']);
   $uid         = check_plain($_POST['custom']);
   $uid         = $uid ? $uid : donation_resolve_uid($mail);
+  $memo        = check_plain($_POST['item_name']);
+  $nid         = 0;
+  
+  $pattern = '/\[PROJECT:(.*)\]/';
+  preg_match($pattern, $memo, $matches);
+  if (count($matches) > 0) {
+    $memo = trim(str_replace($matches[0], '', $zeichenkette));
+    $nid = $matches[1];
+  }
+  
   // Record the donation in the database
-  db_query("INSERT INTO {donations} (timestamp, uid, name, mail, amount, currency, status) VALUES
-    (%d, %d, '%s', '%s', '%s', '%s', %d)", 
+  db_query("INSERT INTO {donations} (timestamp, uid, name, mail, amount, fee, currency, status, donor_memo, nid) VALUES
+    (%d, %d, '%s', '%s', '%s', '%s', '%s', %d, '%s', '%d')", 
     $timestamp,
     $uid,
     $name,
     $payer_email,
     $amount,
+	$fee,
     $currency,
-    variable_get(DONATION_STATE, DONATION_PUBLIC));
+    variable_get(DONATION_STATE, DONATION_PUBLIC),
+	$memo,
+	$nid);
+  $did = db_last_insert_id('donations', 'did');
+  $res = db_query('SELECT * FROM {donations} WHERE did=%d', $did);
+  $donation = db_fetch_object($res);
+  
   donation_update_donation_thermometer_amount();
   watchdog('donation', 'Donation from @name (@mail) amount of @amount @currency.', array(
     '@name'     => $name,
@@ -564,6 +616,8 @@ function donation_ipn() {
     '@amount'   => $amount,
     '@currency' => $currency,
     ));
+	
+  module_invoke_all('donation_received', $donation);
 }
 
 /**
@@ -573,12 +627,34 @@ function donation_form() {
   return drupal_get_form('donation_form_build');
 }
 
-function donation_form_build() {
+function donation_form_build($form_data, $nid = null) {
   global $user;
+  
+  $memo_text = variable_get(DONATION_MEMO_TEXT, DONATION_MEMO_DEFAULT_TEXT);
+  $donation_message = t(variable_get(DONATION_DONATE_MESSAGE, DONATION_DONATE_MESSAGE_DEFAULT_TEXT));
+  if ($nid != null) {
+    $res = db_query('SELECT nid, title FROM {node} WHERE type=\'%s\' AND nid=%d', variable_get(DONATION_CONTENT_TYPE, DONATION_CONTENT_TYPE_DEFAULT), $nid);
+    if ($node = db_fetch_object($res)) {
+	  $memo_text .= ' [PROJECT:' . $node->nid . ']';
+	  $donation_message .= '<br /><br /><strong>' . t('Target') . ':</strong> ' . $node->title;
+	} else {
+	  
+	  $nid = null;
+	}
+  }
+  
+  if ($nid==null) {
+	$memo = variable_get(DONATION_MEMO_TEXT, DONATION_MEMO_DEFAULT_TEXT);
+    $targets = array($memo => variable_get(DONATION_GENERIC_TEXT, DONATION_GENERIC_DEFAULT_TEXT));
+    $res = db_query('SELECT nid, title FROM {node} WHERE type=\'%s\'', variable_get(DONATION_CONTENT_TYPE, DONATION_CONTENT_TYPE_DEFAULT));
+    while ($node = db_fetch_object($res)) {
+      $targets[$memo . ' [PROJECT:' . $node->nid . ']'] = $node->title;
+    }
+  }
 
   $form['#action'] = simple_paypal_get_url();
   $form['pre'] = array(
-    '#value' => variable_get(DONATION_DONATE_MESSAGE, DONATION_DONATE_MESSAGE_DEFAULT_TEXT));
+    '#value' => $donation_message);
   $form['business'] = array(
     '#type' => 'hidden',
     '#name' => 'business',
@@ -587,10 +663,21 @@ function donation_form_build() {
     '#type' => 'hidden',
     '#value' => '_xclick',
     '#name' => 'cmd');
-  $form['item_name'] = array(
-    '#type' => 'hidden',
-    '#value' => variable_get(DONATION_MEMO_TEXT, DONATION_MEMO_DEFAULT_TEXT),
-    '#name' => 'item_name');
+  
+  if ((count($targets) > 1) && ($nid == null)){
+	  $form['item_name'] = array(
+		'#type' => 'select',
+		'#name' => 'item_name',
+		'#options' => $targets,
+		'#description' => t(variable_get(DONATION_TARGET_TEXT, DONATION_TARGET_DEFAULT_TEXT))
+		);
+  } else {
+	  $form['item_name'] = array(
+		'#type' => 'hidden',
+		'#value' => $memo_text,
+		'#name' => 'item_name'
+		);
+  }
   $form['no_shipping'] = array(
     '#type' => 'hidden',
     '#value' => 1,
@@ -604,16 +691,17 @@ function donation_form_build() {
     '#title' => t('Currency'),
     '#options' => simple_paypal_get_currencies(),
     '#name' => 'currency_code',
-    '#description' => variable_get(DONATION_CURRENCY_TEXT, DONATION_CURRENCY_DEFAULT_TEXT),
+    '#description' => t(variable_get(DONATION_CURRENCY_TEXT, DONATION_CURRENCY_DEFAULT_TEXT)),
   );
   $form['amount'] = array(
     '#type' => 'textfield',
     '#title' => t('Amount'),
-    '#description' => variable_get(DONATION_AMOUNT_TEXT, DONATION_AMOUNT_DEFAULT_TEXT),
+    '#description' => t(variable_get(DONATION_AMOUNT_TEXT, DONATION_AMOUNT_DEFAULT_TEXT)),
     '#size' => 40,
     '#required' => TRUE,
     '#maxlength' => 255,
     '#name' => 'amount',
+	'#value' => '10.00',
   );
   $form['notify_url'] = array(
     '#type' => 'hidden',
@@ -627,7 +715,7 @@ function donation_form_build() {
   );
   $form['submit'] = array(
     '#type' => 'submit', 
-    '#value' => variable_get(DONATION_SUBMIT_TEXT, DONATION_SUBMIT_DEFAULT_TEXT),
+    '#value' => t(variable_get(DONATION_SUBMIT_TEXT, DONATION_SUBMIT_DEFAULT_TEXT)),
     '#name' => 'submit',
   );
 
