--- uc_coupon.module.orig	2009-07-23 07:49:24.000000000 -0400
+++ uc_coupon.module	2010-06-02 16:02:03.182167484 -0400
@@ -920,7 +920,9 @@ function uc_coupon_validate($code) {
   $result->code = $code;
   $result->cid = $coupon->cid;
   $result->title = t('Coupon: @code', array('@code' => $code));
-
+  $result->type = $coupon->type;
+  $result->value = $coupon->value;
+  $result->name = $coupon->name;
   if ($coupon->type == 'percentage') {
     $result->amount = $applicable_total * $coupon->value / 100;
   }
@@ -963,20 +965,29 @@ function uc_cart_pane_coupon($form_state
   return $form;
 }
 
-function uc_cart_pane_coupon_submit($form, &$form_state) {
-  if ($form_state['values']['code']) {
-    $code = strtoupper(check_plain($form_state['values']['code']));
-    $coupon = uc_coupon_validate($code);
-    if (!$coupon->valid) {
-      unset($_SESSION['uc_coupon']);
-      drupal_set_message($coupon->message, 'error');
-    }
-    else {
-      $_SESSION['uc_coupon'] = $code;
-      drupal_set_message(t('A coupon discount of !amount will be deducted from your order total at checkout.', array('!amount' => uc_currency_format($coupon->amount))));
-    }
-  }
-}
+/**
+ * Submit handler for uc_cart_pane_coupon.
+ */
+ function uc_cart_pane_coupon_submit($form, &$form_state) {
+   if ($form_state['values']['code']) {
+     $code = strtoupper(check_plain($form_state['values']['code']));
+     $coupon = uc_coupon_validate($code);
+     if (!$coupon->valid) {
+       unset($_SESSION['uc_coupon']);
+       $_SESSION['uc_coupon'] = 0;
+       drupal_set_message($coupon->message, 'error');
+     }
+     else {
+       $_SESSION['uc_coupon'] = $code;
+       $_SESSION['uc_coupon_valid'] = $coupon->amount;
+       $_SESSION['uc_coupon_value'] = $coupon->value;
+       $_SESSION['uc_coupon_type'] = $coupon->type;
+       $coupon->message = t('The coupon "%name" has been applied to your order', array('%name' => $coupon->name));
+       drupal_set_message($coupon->message);
+     }
+   }
+ }
+
 
 /**
  * Implementation of hook_order().
@@ -1083,7 +1094,7 @@ function uc_checkout_pane_coupon($op, &$
 function uc_coupon_checkout_apply() {
   $coupon = uc_coupon_validate($_POST['code']);
   if ($coupon->valid) {
-    $coupon->message = t('The coupon has been applied to your order.');
+    $coupon->message = t('The coupon "%name" has been applied to your order.', array('%name' => $coupon->name));
   }
 
   drupal_set_header("Content-Type: text/javascript; charset=utf-8");
@@ -1250,3 +1261,27 @@ function _uc_coupon_paypal_check() {
     drupal_set_message(t('To use coupons with PayPal you must select "Submit the whole order as a single line item". Click <a href="!url">here</a> to change this setting.', array('!url' => url('admin/store/settings/payment/edit/methods'))));
   }
 }
+
+/**
+ * Implementation of hook_uc_cart_alter().
+ * When cart-based discounts are used, alter the cart prices.
+ */
+function uc_coupon_uc_cart_alter(&$items) {
+  if (isset($_SESSION['uc_coupon_valid']) && $_SESSION['uc_coupon_valid']) {
+    if (count($items)) {
+      foreach ($items as $key => $item) {
+        if (!isset($item->altered)) {
+          switch($_SESSION['uc_coupon_type']) {
+            case 'percentage':
+              $items[$key]->price = $items[$key]->price * ((100 - $_SESSION['uc_coupon_value']) / 100);
+              break;
+            case 'price':
+              $items[$key]->price = $item->price - ($_SESSION['uc_coupon_value'] / count($items));
+              break;
+          }
+          $items[$key]->altered = TRUE;
+        }
+      }
+    }
+  }
+}
