Index: uc_attribute.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ubercart/uc_attribute/Attic/uc_attribute.admin.inc,v
retrieving revision 1.1.2.24
diff -u -p -r1.1.2.24 uc_attribute.admin.inc
--- uc_attribute.admin.inc	20 Oct 2009 20:58:06 -0000	1.1.2.24
+++ uc_attribute.admin.inc	30 Nov 2009 07:23:49 -0000
@@ -84,11 +84,11 @@ function uc_attribute_form($form_state, 
     '#default_value' => empty($attribute->label) ? $attribute->name : $attribute->label,
   );
   $form['description'] = array(
-    '#type' => 'textfield',
+    '#type' => 'textarea',
+    '#rows' => '3',
     '#title' => t('Help text'),
     '#description' => t('<b>Optional.</b> Enter the help text that will display beneath the attribute on product add to cart forms.'),
     '#default_value' => $attribute->description,
-    '#maxlength' => 255,
   );
   $form['required'] = array(
     '#type' => 'checkbox',
@@ -950,7 +950,6 @@ function theme_uc_product_attributes($el
     }
     $option_rows[$key] = t('@attribute: @option', array('@attribute' => $element[$key]['#attribute_name'], '@option' => $optionstr));
   }
-
   if (!empty($option_rows)) {
     return theme('item_list', array_values($option_rows), NULL, 'ul', array('class' => 'product-description'));
   }
Index: uc_attribute.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ubercart/uc_attribute/uc_attribute.module,v
retrieving revision 1.12.2.36
diff -u -p -r1.12.2.36 uc_attribute.module
--- uc_attribute.module	20 Oct 2009 20:58:06 -0000	1.12.2.36
+++ uc_attribute.module	30 Nov 2009 07:23:49 -0000
@@ -410,7 +410,7 @@ function uc_attribute_uc_product_models(
  */
 function uc_attribute_add_to_cart_data($form_values) {
   if (isset($form_values['attributes'])) {
-    return array('attributes' => $form_values['attributes']);
+    return array('attributes' => preg_replace('/\r\n/',"\n",$form_values['attributes']));
   }
   else {
     return array('attributes' => array());
@@ -649,7 +649,7 @@ function _uc_cart_product_get_options($i
         $attribute = $node->attributes[$aid];
         $name = _uc_attribute_get_name($attribute);
         // Only discrete options can affect the price of an item.
-        if ($attribute->display && count($attribute->options)) {
+        if (in_array($attribute->display, array(1, 2, 3)) && count($attribute->options)) {
           // There may be many selected options, or just one.
           foreach ((array)$selected as $oid) {
             if ($oid > 0) {
@@ -660,7 +660,7 @@ function _uc_cart_product_get_options($i
           }
         }
         else {
-          // Handle textfield attributes.
+          // Handle textfield and textarea attributes.
           $options[$index] = array(
             'attribute' => $name,
             'aid' => $aid,
@@ -751,7 +751,7 @@ function _uc_attribute_alter_form($produ
       $options[$option->oid] .= $display_price;
     }
 
-    if (count($attribute->options) && $attribute->display > 0) {
+    if (count($attribute->options) && in_array($attribute->display, array(1, 2, 3))) {
       if ($attribute->required) {
         if ($attribute->display == 1) {
           $options = array('' => t('Please select')) + $options;
@@ -779,7 +779,7 @@ function _uc_attribute_alter_form($produ
     }
     else {
       $form_attributes[$attribute->aid] = array(
-        '#type' => 'textfield',
+        '#type' => $attribute->display == 0 ? 'textfield' : 'textarea',
         '#description' => check_markup($attribute->description),
         '#default_value' => $attribute->required == FALSE ? $attribute->options[$attribute->default_option]->name : '',
         '#required' => $attribute->required,
@@ -802,6 +802,7 @@ function _uc_attribute_alter_form($produ
 function _uc_attribute_display_types() {
   return array(
     0 => t('Text field'),
+    4 => t('Text area (multiple rows)'),
     1 => t('Select box'),
     2 => t('Radio buttons'),
     3 => t('Checkboxes'),
@@ -817,7 +818,7 @@ function _uc_attribute_display_types() {
  *   Array of attribute ids that have price affecting options.
  */
 function uc_attribute_priced_attributes($nid) {
-  $attributes = db_query("SELECT DISTINCT (pa.aid) FROM {uc_product_attributes} AS pa INNER JOIN {uc_attribute_options} AS ao ON ao.aid = pa.aid INNER JOIN {uc_product_options} AS po ON (po.oid = ao.oid AND po.nid = pa.nid) WHERE pa.nid = %d AND po.price <> 0 AND pa.display <> 0", $nid);
+  $attributes = db_query("SELECT DISTINCT (pa.aid) FROM {uc_product_attributes} AS pa INNER JOIN {uc_attribute_options} AS ao ON ao.aid = pa.aid INNER JOIN {uc_product_options} AS po ON (po.oid = ao.oid AND po.nid = pa.nid) WHERE pa.nid = %d AND po.price <> 0 AND pa.display IN (1,2,3)", $nid);
   $aids = array();
   while ($attribute = db_fetch_array($attributes)) {
     $aids[] = $attribute['aid'];
