=== modified file 'payment/uc_credit/uc_credit.module'
--- payment/uc_credit/uc_credit.module	2008-06-02 18:54:09 +0000
+++ payment/uc_credit/uc_credit.module	2008-06-06 22:18:30 +0000
@@ -343,8 +343,11 @@
         'cc_type' => check_plain($_POST['cc_type']),
         'cc_owner' => check_plain($_POST['cc_owner']),
         'cc_number' => check_plain($_POST['cc_number']),
+        'cc_start_month' => check_plain($_POST['cc_start_month']),
+        'cc_start_year' => check_plain($_POST['cc_start_year']),
         'cc_exp_month' => check_plain($_POST['cc_exp_month']),
         'cc_exp_year' => check_plain($_POST['cc_exp_year']),
+        'cc_issue' => check_plain($_POST['cc_issue']),
         'cc_cvv' => check_plain($_POST['cc_cvv']),
         'cc_bank' => check_plain($_POST['cc_bank']),
       );
@@ -395,6 +398,14 @@
           $return = FALSE;
         }
       }
+      
+      // Validate the start date (if entered).
+      if (variable_get('uc_credit_start_enabled', FALSE) &&
+            (!empty($cc_data['cc_start_month']) || !empty($cc_data['cc_start_year']))
+            && !_valid_card_start($cc_data['cc_start_month'], $cc_data['cc_start_year'])) {
+        drupal_set_message(t('The start date you entered is invalid.'), 'error');
+        $return = FALSE;
+      }
 
       // Validate the card expiration date.
       if (!_valid_card_expiration($cc_data['cc_exp_month'], $cc_data['cc_exp_year'])) {
@@ -402,6 +413,13 @@
         $return = FALSE;
       }
 
+      // Validate the issue number (if entered).
+      // N.B. With issue numbers, '01' is different to '1', but is_numeric() is still appropriate.
+      if (variable_get('uc_credit_issue_enabled', FALSE) && !_valid_card_issue($cc_data['cc_issue'])) {
+        drupal_set_message(t('The issue number you entered is invalid.'), 'error');
+        $return = FALSE;
+      }
+
       // Validate the CVV number if enabled.
       if (variable_get('uc_credit_cvv_enabled', TRUE) && !_valid_cvv($cc_data['cc_cvv'])) {
         drupal_set_message(t('You have entered an invalid CVV number.'), 'error');
@@ -440,7 +458,13 @@
         $review[] = array('title' => t('Card Owner'), 'data' => check_plain($arg1->payment_details['cc_owner']));
       }
       $review[] = array('title' => t('Card Number'), 'data' => uc_credit_display_number($arg1->payment_details['cc_number']));
+      if (variable_get('uc_credit_start_enabled', TRUE)) {
+      $review[] = array('title' => t('Start Date'), 'data' => $arg1->payment_details['cc_start_month'] .'/'. $arg1->payment_details['cc_start_year']);  
+      }
       $review[] = array('title' => t('Expiration'), 'data' => $arg1->payment_details['cc_exp_month'] .'/'. $arg1->payment_details['cc_exp_year']);
+      if (variable_get('uc_credit_issue_enabled', TRUE)) {
+        $review[] = array('title' => t('Issue Number'), 'data' => user_access('view cc numbers') ? $arg1->payment_details['cc_issue'] : str_repeat('-', strlen($arg1->payment_details['cc_issue'])));
+      }
       if (variable_get('uc_credit_cvv_enabled', TRUE)) {
         $review[] = array('title' => t('CVV'), 'data' => user_access('view cc numbers') ? $arg1->payment_details['cc_cvv'] : str_repeat('-', strlen($arg1->payment_details['cc_cvv'])));
       }
@@ -476,11 +500,24 @@
         $output .= '<tr><td>'. t('Card Number:') .' </td><td>'. uc_credit_display_number($arg1->payment_details['cc_number']) .'</td></tr>';
 
         if (variable_get('uc_credit_debug', FALSE)) {
+          if (variable_get('uc_credit_start_enabled', FALSE)) {
+            $start = $arg1->payment_details['cc_start_month'] .'/'. $arg1->payment_details['cc_start_year'];
+            if (strlen($start) > 1) {
+              $output .= '<tr><td>'. t('Start Date:') .' </td><td>'. $start .'</td></tr>';
+            }
+          }
           $exp = $arg1->payment_details['cc_exp_month'] .'/'. $arg1->payment_details['cc_exp_year'];
           if (strlen($exp) > 1) {
             $output .= '<tr><td>'. t('Expiration:') .' </td><td>'. $exp .'</td></tr>';
           }
 
+          if (variable_get('uc_credit_issue_enabled', FALSE)) {
+            $issue = $arg1->payment_details['cc_issue'];
+            if (strlen($issue) > 0) {
+              $output .= '<tr><td>'. t('Issue Number:') .' </td><td>'. $issue .'</td></tr>';
+            }
+          }
+          
           if (variable_get('uc_credit_cvv_enabled', TRUE)) {
             $cvv = user_access('view cc numbers') ? $arg1->payment_details['cc_cvv'] : str_repeat('-', strlen($arg1->payment_details['cc_cvv']));
             if (strlen($cvv) > 0) {
@@ -643,6 +680,16 @@
         '#title' => t('Enable card owner text field on checkout form.'),
         '#default_value' => variable_get('uc_credit_owner_enabled', FALSE),
       );
+      $form['cc_fields']['uc_credit_start_enabled'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Enable card start date text field on checkout form.'),
+        '#default_value' => variable_get('uc_credit_start_enabled', FALSE),
+      );
+      $form['cc_fields']['uc_credit_issue_enabled'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Enable card issue number text field on checkout form.'),
+        '#default_value' => variable_get('uc_credit_issue_enabled', FALSE),
+      );
       $form['cc_fields']['uc_credit_bank_enabled'] = array(
         '#type' => 'checkbox',
         '#title' => t('Enable issuing bank text field on checkout form.'),
@@ -844,8 +891,39 @@
     '#maxlength' => 16,
   );
 
+  if (variable_get('uc_credit_start_enabled', FALSE)) {
+    $form['cc_start_month'] = uc_select_month(t('Start Month'), $order->payment_details['cc_start_month']);
+    $form['cc_start_year'] = uc_select_year(t('Start Year'), $order->payment_details['cc_start_year'], date('Y')-10, date('Y'));
+  }
+  
   $form['cc_exp_month'] = uc_select_month(t('Expiration Month'), $order->payment_details['cc_exp_month']);
   $form['cc_exp_year'] = uc_select_year(t('Expiration Year'), $order->payment_details['cc_exp_year']);
+  
+  if (variable_get('uc_credit_issue_enabled', FALSE)) {
+    // Setup the default Issue Number  on the credit card form.
+    if (!_valid_card_issue($order->payment_details['cc_issue'])) {
+      // Display the Issue Number as is if it does not validate so it can be corrected.
+      $default_card_issue = $order->payment_details['cc_issue'];
+    }
+    elseif (!empty($order->payment_details['cc_issue'])) {
+      if (user_access('view cc numbers')) {
+        // Display the full number to those with access.
+        $default_card_issue = $order->payment_details['cc_issue'];
+      }
+      else {
+        // Otherwise mask it with dashes.
+        $default_card_issue = str_repeat('-', strlen($order->payment_details['cc_issue']));
+      }
+    }
+    $form['cc_issue'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Issue Number'),
+      '#default_value' => $default_card_issue,
+      '#attributes' => array('autocomplete' => 'off'),
+      '#size' => 2,
+      '#maxlength' => 2,
+    );
+  }
 
   if (variable_get('uc_credit_cvv_enabled', TRUE)) {
     // Setup the default CVV  on the credit card form.
@@ -893,8 +971,11 @@
 function theme_uc_payment_method_credit_form($form) {
   // Comment out this function to just straight display the form.
   $form['cc_number']['#title'] = '';
+  $form['cc_start_month']['#title'] = '';
+  $form['cc_start_year']['#title'] = '';
   $form['cc_exp_month']['#title'] = '';
   $form['cc_exp_year']['#title'] = '';
+  $form['cc_issue']['#title'] = '';
 
   if (arg(1) == 'checkout') {
     $path = base_path() . drupal_get_path('module', 'uc_credit');
@@ -915,9 +996,18 @@
     }
     $output .= '<tr><td class="field-label">'. t('Card Number:') .'</td><td>'
              . drupal_render($form['cc_number']) .'</td></tr>';
+    if (variable_get('uc_credit_start_enabled', FALSE)) {
+      $output .= '<tr><td class="field-label">'. t('Start Date:') .'</td><td>'
+             . drupal_render($form['cc_start_month']) .' '
+             . drupal_render($form['cc_start_year']) .t(' (if present)').'</td></tr>';
+    }
     $output .= '<tr><td class="field-label">'. t('Expiration Date:') .'</td><td>'
              . drupal_render($form['cc_exp_month']) .' '
              . drupal_render($form['cc_exp_year']) .'</td></tr>';
+    if (variable_get('uc_credit_issue_enabled', FALSE)) {
+      $output .= '<tr><td class="field-label">'. t('Issue Number:') .'</td><td>'
+               . drupal_render($form['cc_issue']) .t(' (if present)').'</td></tr>';
+    }
     if (variable_get('uc_credit_cvv_enabled', TRUE)) {
       $form['cc_cvv']['#title'] = '';
       $output .= '<tr><td class="field-label">'. t('CVV:') .'</td><td>'. drupal_render($form['cc_cvv'])
@@ -1324,6 +1414,39 @@
 }
 
 /**
+ * Validates a start date on a card.
+ *
+ * @param $month
+ *   The 1 or 2-digit numeric representation of the month, i.e. 1, 6, 12.
+ * @param $year
+ *   The 4-digit numeric representation of the year, i.e. 2008.
+ * @return
+ *   TRUE for cards whose start date is in the past, FALSE otherwise.
+ */
+function _valid_card_start($month, $year) {
+  if ($year > date('Y')) {
+    return FALSE;
+  }
+  else if ($year == date('Y')) {
+    if ($month > date('n')) {
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
+// Validates an issue number on a card.
+// Returns true or false.
+function _valid_card_issue($issue) {
+  if (empty($issue) || (is_numeric($issue) && $issue>0)) {
+    return true;
+  }
+  return false;
+}
+
+
+/**
  * Returns either an array of options from a multi-line textarea or an array
  * condensed into a multi-line string depending on the type of $data.
  */

