Index: includes/tables.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/tablemanager/includes/tables.inc,v
retrieving revision 1.1.2.4
diff -u -p -r1.1.2.4 tables.inc
--- includes/tables.inc	10 Feb 2010 07:08:44 -0000	1.1.2.4
+++ includes/tables.inc	16 Feb 2010 10:05:00 -0000
@@ -1,5 +1,5 @@
 <?php
-// $Id: tables.inc,v 1.1.2.4 2010/02/10 07:08:44 pobster Exp $
+// $Id: tables.inc,v 1.1.2.5 2010/02/15 00:15:00 pobster Exp $
 
 /**
  * Main multipart form function.
@@ -301,7 +301,10 @@ function tablemanager_table_edit($form_s
   drupal_add_css(drupal_get_path('module', 'tablemanager') .'/misc/tablemanager_admin.css');
   if (isset($form_state['storage']) && element_children($form_state['storage']['column'])) {
     foreach (element_children($form_state['storage']['column']) as $storage) {
-      $headers[] = $form_state['storage']['column'][$storage];
+      if(array_key_exists("data",$form_state['storage']['column'][$storage])) // skip the "Add" row
+      {
+        $headers[] = $form_state['storage']['column'][$storage];
+      }
     }
   }
   elseif (isset($form_state['storage'])) {
@@ -311,11 +314,22 @@ function tablemanager_table_edit($form_s
     // this is the first time this form has been called so build it from scratch
     $table = db_fetch_object(db_query('SELECT * FROM {tablemanager} WHERE tid = %d', $tid));
     $headers = unserialize($table->header);
+    foreach ($headers as $key => $data)
+    {
+      $headers[$key]['originalorder'] = $key;
+      if(isset($data['choices'])) { $headers[$key]['options']['selectionbox']['choices']=$data['choices']; }
+      if(isset($data['high'])) { $headers[$key]['options']['barchart']['low']=$data['low']; }
+      if(isset($data['low'])) { $headers[$key]['options']['barchart']['high']=$data['high']; }
+    }
   }
   $form['tid'] = array(
     '#type' => 'hidden',
     '#value' => $tid,
   );
+  $form['orderchanged'] = array(
+    '#type' => 'hidden',
+    '#value' => isset($header['orderchanged']) ? $header['orderchanged'] : FALSE,
+  );
   $form['name'] = array(
     '#type' => 'textfield',
     '#title' => t('Table Name'),
@@ -334,22 +348,82 @@ function tablemanager_table_edit($form_s
   );
   // set some variables for building the rows
   $form['column']['#tree'] = TRUE;
-  unset($sort);
-  $direction = 'asc'; // set 'asc' for default direction for sorting
+  $lastposition = 0;
+  if (isset($form_state['clicked_button']['#post']['default']))
+  {
+    $sort = $form_state['clicked_button']['#post']['default'];
+    if ($sort > count($headers)) {
+      $sort = -1;
+    }
+    $direction = $form_state['values']['order'];
+  } else {
+    $sort = -1;
+    $direction = 'asc'; // set 'asc' for default direction for sorting
+  }
+  $maxweight = max(2 * count($headers), 10); // more room for sorting if we have lots of columns
   // build rows
   foreach ($headers as $position => $header) {
-    if (preg_match("/^(asc|desc)/i", $header['sort'], $match)) {
+    if ($sort == -1 && preg_match("/^(asc|desc)/i", $header['sort'], $match)) {
       $sort = $position; // there's a match for default sort column, so set $sort to show which column it's on
       $direction = $match[0]; // direction is set so change the default to reflect this
     }
-    $form['column'][$position]['weight'] = array('#type' => 'weight', '#value' => $position);
+    if (array_key_exists('originalorder',$header)) {
+      $form['column'][$position]['originalorder'] = array('#type' => 'hidden', '#value' => $header['originalorder']);
+    }
+    $form['column'][$position]['weight'] = array('#type' => 'weight', '#delta' => $maxweight, '#default_value' => isset($header['weight']) ? $header['weight'] : $position);
     $form['column'][$position]['data'] = array('#type' => 'textfield', '#default_value' => $header['data'], '#size' => 60, '#maxlength' => 255);
-    $form['column'][$position]['type'] = array('#type' => 'select', '#options' => tablemanager_fetch_types(FALSE), '#default_value' => $header['type'], '#attributes' => array('DISABLED' => 'TRUE'));
+    $form['column'][$position]['type'] = array('#type' => 'select', '#options' => tablemanager_fetch_types(FALSE), '#default_value' => $header['type']);
     $form['column'][$position]['required'] = array('#type' => 'checkbox', '#return_value' => TRUE, '#default_value' => isset($header['required']) ? $header['required'] : FALSE);
     $form['column'][$position]['field'] = array('#type' => 'checkbox', '#return_value' => TRUE, '#default_value' => isset($header['field']) ? $header['field'] : FALSE);
-    $form[$position]['default'] = array('#type' => 'radio', '#return_value' => $position, '#value' => $position === $sort ? "$position" : FALSE);
+    $form[$position]['default'] = array('#type' => 'radio', '#return_value' => $position, '#value' => ($position == $sort) ? "$position" : "");
     $form['column'][$position]['delete'] = array('#type' => 'submit', '#name' => "delete_$position", '#value' => t('Delete'));
+    $form['column'][$position]['options'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('additional options'),
+      '#description' => t('some extra options depending on the data type you choose'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+    $form['column'][$position]['options']['barchart'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Bar Chart Options'),
+      '#description' => t('Please note that you only have to fill this out if you select \'Bar Chart\' as your data type'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+    $form['column'][$position]['options']['barchart']['low'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Enter lowest value enterable for bar charts'),
+      '#size' => 4,
+      '#maxlength' => 4,
+      '#default_value' => isset($header['options']['barchart']['low']) ? $header['options']['barchart']['low'] : '0',
+      '#required' => TRUE,
+    );
+    $form['column'][$position]['options']['barchart']['high'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Enter highest value enterable for bar charts'),
+      '#size' => 4,
+      '#maxlength' => 4,
+      '#default_value' => isset($header['options']['barchart']['high']) ? $header['options']['barchart']['high'] : '500',
+      '#required' => TRUE,
+    );
+    $form['column'][$position]['options']['selectionbox'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Selection Box Choices'),
+      '#description' => t('Please note that you only have to fill this out if you select \'Selection\' as your data type'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+    $form['column'][$position]['options']['selectionbox']['choices'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Enter your selections below, with each choice separated by a newline'),
+      '#default_value' => isset($header['options']['selectionbox']['choices']) ? $header['options']['selectionbox']['choices'] : '',
+      '#cols' => 30,
+      '#rows' => 8,
+    );
+    $lastposition = $position + 1;
   }
+  $form['column'][$lastposition]['delete'] = array('#type' => 'submit', '#name' => "add_$lastposition", '#value' => t('Add'));
   $form['order'] = array(
     '#type' => 'select',
     '#title' => t('Which order to sort for default?'),
@@ -357,11 +431,11 @@ function tablemanager_table_edit($form_s
     '#description' => t('In which order the default column to be sorted will be in.'),
     '#default_value' => $direction,
   );
-  $form['default'] = array(
+  $form[$lastposition]['default'] = array(
     '#type' => 'radio',
-    '#title' => t('No default column for sorting'),
-    '#return_value' => "NULL",
-    '#value' => is_null($sort) ? TRUE : FALSE, // sort wasn't set so reflect that here
+    '#title' => t('No sorting'),
+    '#return_value' => -1,
+    '#value' => ($sort == -1) ? -1 : "", // sort wasn't set so reflect that here
   );
   $form['#attributes'] = array('class' => 'confirmation');
   $form['description'] = array('#value' => t('Changes are not permanent until after you click save.'));
@@ -373,37 +447,90 @@ function tablemanager_table_edit($form_s
   return $form;
 } // tablemanager_table_edit
 
+function tablemanager_table_edit_submit_usort($a, $b)
+{
+    if ($a['weight'] == $b['weight']) {
+        return 0;
+    }
+    return ($a['weight'] < $b['weight']) ? -1 : 1;
+} // tablemanager_table_edit_submit_usort
+
 function tablemanager_table_edit_submit($form, &$form_state) {
   $form_state['storage'] = $form_state['values'];
-  // organise default sort radio button
-//  if ($form_state['clicked_button']['#post']['default'] >= 0) {
-//    print_r($form_state['clicked_button']['#post']);
-//  }
   if (preg_match("/^delete_(\d+)$/i", $form_state['clicked_button']['#name'], $match)) {
     unset($form_state['storage']['column'][$match[1]]);
+    $form_state['orderchanged'] = true;
     // check to see if all columns are to be deleted
     if (count(element_children($form_state['storage']['column'])) == 0) {
       // redirect to table delete
-      drupal_goto('admin/content/tablemanager/table_delete/table-'. $form_state['values']['tid']);
+      drupal_goto('admin/content/tablemanager/table_delete/table-' . $form_state['values']['tid']);
     }
   }
+  if (preg_match("/^add_(\d+)$/i", $form_state['clicked_button']['#name'], $match)) {
+    $form_state['storage']['column'][$match[1]]['data'] = "";
+    $form_state['orderchanged'] = true;
+  }
   if ($form_state['clicked_button']['#name'] == 'op') {
     $post = $form_state['clicked_button']['#post'];
+    $tid = $post['tid'];
     $name = $post['name'];
     $desc = $post['desc'];
     $header = $post['column'];
     foreach ($header as $key => $data) {
-      if ($header[$key]['field']) {
-        $header[$key]['field'] = $key + 1;
-      }
       if ($post['default'] == $key) {
         $header[$key]['sort'] = $post['order'];
       }
+      switch($data['type'])
+      {
+        case 7: // Selection Box
+        	$header[$key]['choices'] = $data['options']['selectionbox']['choices'];
+		break;
+        case 6: // Bar Chart
+        	$header[$key]['low'] = $data['options']['barchart']['low'];
+        	$header[$key]['high'] = $data['options']['barchart']['high'];
+		break;
+      }
+      // clean unused stuff
+      unset($header[$key]['options']);
+    }
+    usort($header,"tablemanager_table_edit_submit_usort");
+    $orderchanged = $form_state['orderchanged'];
+    if (! $orderchanged) {
+      foreach ($header as $key => $data)
+      {
+        if ($header[$key]['originalorder'] != $key) { 
+          $orderchanged = true;
+        }
+      }
+    }
+    if ($orderchanged) { // fix tabledata to new order and add or delete the new or removed columns
+      $results = db_query("SELECT * FROM {tablemanager_data} WHERE `tid` = %d", $tid);
+      while ($object = db_fetch_object($results)) {
+        $oldrowdata = unserialize($object->data);
+        $newrowdata = array();
+        foreach($header as $key => $data)
+        {
+          if (array_key_exists('originalorder',$data)) {
+            $newrowdata[] = $oldrowdata[$data['originalorder']];
+          } else {
+            $newrowdata[] = "";
+          }
+        }
+        db_query("UPDATE {tablemanager_data} SET data='%s' WHERE id = %d AND tid = %d", serialize($newrowdata), $object->id, $tid);
+      }
+    }
+    foreach($header as $key => $data)
+    {
+      if ($header[$key]['field']) {
+        $header[$key]['field'] = $key + 1;
+      }
+      // clean more unused stuff
+      unset($header[$key]['weight']);
+      unset($header[$key]['originalorder']);
     }
-    $tid = $post['tid'];
     db_query("UPDATE {tablemanager} SET name='%s', description='%s', header='%s' WHERE tid = %d", $name, $desc, serialize($header), $tid);
     // redirect to table edit to show updates
-    drupal_goto('admin/content/tablemanager/table_edit/table-'. $form_state['values']['tid']);
+    drupal_goto('admin/content/tablemanager/table_edit/table-' . $form_state['values']['tid']);
   }
 } // tablemanager_table_edit_submit
 
@@ -413,11 +540,11 @@ function theme_tablemanager_table_edit($
   $output = drupal_render($form['name']);
   $output .= drupal_render($form['desc']);
   $output .= drupal_render($form['order']);
-  $output .= drupal_render($form['default']);
   foreach (element_children($form['column']) as $position) {
     unset($cols);
+    $options=drupal_render($form['column'][$position]['options']);
     $form['column'][$position]['weight']['#attributes']['class'] = 'header-weight';
-    $cols[] = drupal_render($form['column'][$position]['data']);
+    $cols[] = drupal_render($form['column'][$position]['data']).$options;
     $cols[] = drupal_render($form['column'][$position]['type']);
     $cols[] = drupal_render($form['column'][$position]['required']);
     $cols[] = drupal_render($form['column'][$position]['field']);
