--- inventory.module.orig	2007-02-28 21:02:13.000000000 +0100
+++ inventory.module	2008-09-23 21:54:02.000000000 +0200
@@ -21,28 +21,33 @@
       $form['inventory_items_const'] = array(
         '#type'          => 'textarea',
         '#title'         => t('Allowed inventory item list'),
-        '#description'   => t('The possible values this field can contain. Enter one value per line.'),
+        '#description'   => t('The possible values this field can contain. Enter one value per line. Must follow the format KEY|DESC.'),
         '#default_value' => $field['inventory_items_const'],
       );
-      $form['advanced_options'] = array(
-        '#type' => 'fieldset',
-        '#title' => t('Php code'),
-        '#collapsible' => TRUE,
-        '#collapsed' => empty($field['inventory_items_php']),
-      );
-      $form['advanced_options']['inventory_items_php'] = array(
+      $form['inventory_items_php'] = array(
+        '#title'         => t('PHP Code'),
         '#type'          => 'textarea',
-        '#title'         => t('Code'),
         '#description'   => t('Advanced Usage Only: PHP code that returns a keyed array of allowed inventory items. Should not include &lt;?php ?&gt; delimiters. If this field is filled out, the array returned by this code will override the allowed values list above.'),
         '#default_value' => $field['inventory_items_php'],
       );
-      $form['inventory_item_min'] = array(
+      $form['inventory_items_query'] = array(
+        '#type'          => 'textarea',
+        '#title'         => t('SQL Query'),
+        '#description'   => t('Advanced Usage Only: SQL query that returns a list of 2 field rows, the first being used as key and the second as the item name. If this field is filled out, this code will override the lists above.'),
+        '#default_value' => $field['inventory_items_query'],
+      );
+      $form['inventory_range'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Range Options'),
+        '#collapsible' => FALSE,
+      );
+      $form['inventory_range']['inventory_item_min'] = array(
         '#type'          => 'textfield',
         '#title'         => t('Minimum number of an item'),
         '#description'   => t('Please enter a non-negative integer'),
         '#default_value' => empty($field['inventory_items_min']) ? 0 : $field['inventory_items_min'],
       );
-      $form['inventory_item_max'] = array(
+      $form['inventory_range']['inventory_item_max'] = array(
         '#type'          => 'textfield',
         '#title'         => t('Maximum number of an item'),
         '#description'   => t('Please enter a positive integer that is not lower than the minimum number.'),
@@ -50,15 +55,16 @@
       );
       return $form;
     case 'save':
-      return array('inventory_items_const', 'inventory_items_php', 'inventory_item_min', 'inventory_item_max');
+      return array('inventory_items_const', 'inventory_items_php', 'inventory_item_min', 'inventory_item_max','inventory_items_query');
     case 'validate':
-      if (empty($field['inventory_items_const']) && empty($form['inventory_items_php'])) {
-        form_set_error('inventory_items_const', t('You have to provide a list of available values either by typing the items in manually or giving a PHP code that will return them.'));
+      $n = (empty($field['inventory_items_const'])?0:1) + (empty($field['inventory_items_php'])?0:1) + (empty($field['inventory_items_query'])?0:1);
+      if( ($n == 0) || ($n > 1) ) {
+	      form_set_error('inventory_items_const',t('You have to provide a list of available values either by typing the items in manually, giving an SQL query, or PHP code that will return them.'));
       }
-      elseif (empty($field['inventory_items_const'])) {
+      if (!empty($field['inventory_items_php'])) {
         $array = drupal_eval($field['inventory_items_php']);
         if (!is_array($array) || empty($array)) {
-          form_set_error('inventory_items_const', t('The PHP snippet you have provided is not returning an array or the array itself is empty.'));
+          form_set_error('inventory_items_php', t('The PHP snippet you have provided is not returning an array or the array itself is empty.'));
         }
       }
       if (!is_numeric($field['inventory_item_max']) || intval($field['inventory_item_max']) != $field['inventory_item_max'] || $field['inventory_item_max'] < 1) {
@@ -83,23 +89,34 @@
 function inventory_field($op, &$node, $field, &$node_field, $teaser, $page) {
   switch ($op) {
     case 'view':
-      $fieldset = _inventory_get_fields($field);
-      $rs = db_query("SELECT name, count FROM {inventory_items} WHERE vid = %d AND fieldset = '%s' ORDER BY name ASC", $node->vid, $field['field_name']);
-      while ($row = db_fetch_object($rs)) {
-        if (in_array($row->name, $fieldset)) {
-          $node_field[] = array($row->name => $row->count);
+      $context = $teaser ? 'teaser' : 'full';
+      $formatter = isset($field['display_settings'][$context]['format']) ?
+	      $field['display_settings'][$context]['format'] : 'default';
+      $rs = db_query("SELECT itemkey, count FROM {inventory_items} "
+	     ."WHERE vid = %d AND fieldset = '%s' ORDER BY itemkey ASC", $node->vid, $field['field_name']);
+      //TODO: are items allways filled? check if array is passed, or else fill it up like this:
+      if(empty($node_field)) {
+        while ($row = db_fetch_object($rs)) {
+          $node_field[$row->itemkey] = $row->count;
         }
       }
+      $captions = _inventory_get_fields($field);
       foreach ($node_field as $delta => $item) {
-        $node_field[$delta]['view'] = content_format($field, $item, 'default', $node);
+	      //UGLY, UGLY, UGLY
+	      $node_field[$delta] = array (
+                      $delta => $item,
+		      'view' => content_format($field, array($captions[$delta],$item), $formatter, $node)
+	      );
       }
       return theme('field', $node, $field, $node_field, $teaser, $page);
     case 'insert': case 'update':
       // deleting because if the fields are determined by the PHP snippet and the snippet is
       // now giving a different fieldset than before, the deprecated fields must get ridden of
-      db_query("DELETE FROM {inventory_items} WHERE vid = %d AND fieldset = '%s'", $node->vid, $field['field_name']);
-      foreach ($node_field as $item => $count) {
-        db_query("INSERT INTO {inventory_items} (nid, vid, fieldset, name, count) VALUES(%d, %d, '%s', '%s', %d)", $node->nid, $node->vid, $field['field_name'], $item, $count);
+      db_query("DELETE FROM {inventory_items} WHERE vid = %d AND fieldset = '%s'",
+        $node->vid, $field['field_name']);
+      foreach ($node_field as $itemkey => $count) {
+        db_query("INSERT INTO {inventory_items} (nid, vid, fieldset, itemkey, count) VALUES "
+          ."(%d, %d, '%s', '%s', %d)", $node->nid, $node->vid, $field['field_name'], $itemkey, $count);
       }
       break;
     case 'delete':
@@ -117,6 +134,10 @@
       'label' => t('Default'),
       'field types' => array('inventory_field'),
     ),
+    'skipempty' => array(
+      'label' => t('Skip Empty Fields'),
+      'field types' => array('inventory_field'),
+    ),
   );
   return $formatters;
 }
@@ -128,6 +149,7 @@
   // switch formatter in case we implement multiple formatters.
   switch ($formatter) {
     case 'default':  return theme('inventory_formatter_default', $item);
+    case 'skipempty':  return theme('inventory_formatter_skipempty', $item);
   }
 }
 
@@ -137,8 +159,17 @@
 function theme_inventory_formatter_default($item) {
   $output = '';
   if (is_array($item)) {
-    $keys = array_keys($item);
-    $output .= $keys[0] .": ". ($item[$keys[0]] == 0 ? t('None') : $item[$keys[0]]);
+    $output .= $item[0] .": ". ($item[1] == 0 ? t('None') : $item[1]);
+  }
+  return $output;
+}
+
+function theme_inventory_formatter_skipempty($item) {
+  $output = '';
+  if (is_array($item)) {
+    if( $item[1] != 0 ) {
+      $output .= $item[0].": ".$item[1];
+    }
   }
   return $output;
 }
@@ -148,8 +179,12 @@
 */
 function inventory_widget_info() {
   return array(
-    'inventory_manual' => array(
-      'label' => t('Manual Input'),
+    'inventory_select' => array(
+      'label' => t('Select List'),
+      'field types' => array('inventory_field'),
+    ),
+    'inventory_textfield' => array(
+      'label' => t('Text Field'),
       'field types' => array('inventory_field'),
     ),
   );
@@ -163,14 +198,18 @@
   switch ($op) {
     case 'prepare form values':
       $fieldset = _inventory_get_fields($field);
-      $rs = db_query("SELECT name, count FROM {inventory_items} WHERE vid = %d AND fieldset = '%s' ORDER BY name ASC", $node->vid, $field['field_name']);
+      $rs = db_query("SELECT itemkey, count FROM {inventory_items} WHERE vid = %d AND fieldset = '%s' ORDER BY itemkey ASC", $node->vid, $field['field_name']);
       while ($row = db_fetch_object($rs)) {
-        if (in_array($row->name, $fieldset)) {
-          $node_field[$row->name] = $row->count;
+        if (isset($fieldset[$row->itemkey])) {
+          $node_field[$row->itemkey] = $row->count;
         }
       }
       break;
     case 'form':
+      // I dunno why this was on the old code, at all
+      if (!($fields = _inventory_get_fields($field))) {
+        return array();
+      }
       $form = array();
       $form[$fieldname] = array(
         '#type'        => 'fieldset',
@@ -180,28 +219,39 @@
         '#collapsed'   => FALSE,
         '#tree'        => TRUE,
       );
-      $options = range($field['inventory_item_min'], $field['inventory_item_max']);
-      if (empty($options[0])) {
-        $options[0] = t('None');
-      }
-
-      if ($fields = _inventory_get_fields($field)) {
-        foreach ($fields as $item) {
-          $form[$fieldname][$item] = array(
-            '#type'          => 'select',
-            '#title'         => $item,
-            '#options'       => $options,
-            '#default_value' => $node_field[$item],
-          );
-        }
-        return $form;
+      switch($field['widget']['type']) {
+        case 'inventory_textfield':
+          foreach (array_keys($fields) as $itemkey) {
+            $form[$fieldname][$itemkey] = array(
+              '#type'          => 'textfield',
+              '#title'         => $fields[$itemkey],
+              '#size'          => 6,
+              '#maxlength'     => 6,
+              '#default_value' => $node_field[$itemkey],
+            );
+          };
+          break;
+	case 'inventory_nr_select':
+          $options = range($field['inventory_item_min'], $field['inventory_item_max']);
+          if (empty($options[0])) {
+            $options[0] = t('None');
+          }
+          foreach (array_keys($fields) as $itemkey) {
+            $form[$fieldname][$itemkey] = array(
+              '#type'          => 'select',
+              '#title'         => $fields[$itemkey],
+              '#options'       => $options,
+              '#default_value' => $node_field[$itemkey],
+            );
+          };
+          break;
       }
-      return array();
+      return $form;
   }
 }
 
 /**
- * Collects the available fields and returns it in an array
+ * Collects the available fields and returns them in an array
  */
 function _inventory_get_fields($field) {
   static $field_set;
@@ -211,19 +261,42 @@
   }
 
   $field_set[$field['field_name']] = array();
-  if (!empty($field['inventory_items_php'])) {
+  if (!empty($field['inventory_items_query'])) {
+    $result = db_query($field['inventory_items_query']);
+    while($row=db_fetch_array($result)) {
+      $keys = array_keys($row);
+      if(count($row)<2) { break; } // That could be more friendly, really.
+      $field_set[$field['field_name']][$row[$keys[0]]] = $row[$keys[1]];
+    }
+  } elseif (!empty($field['inventory_items_php'])) { // Items from PHP Code
     $result = eval($field['inventory_items_php']);
     if (is_array($result)) {
       $field_set[$field['field_name']] = $result;
     }
-  }
-  if (empty($field_set[$field['field_name']])) {
+  } elseif (empty($field_set[$field['field_name']])) { // Items from plain textarea
     $list = explode("\n", $field['inventory_items_const']);
     $list = array_map('trim', $list);
     $list = array_filter($list, 'strlen');
     foreach ($list as $item) {
-      $field_set[$field['field_name']][] = $item;
+      $ii = explode("|",$item,2);
+      if(count($ii)==2) {
+        $field_set[$field['field_name']][$ii[0]] = $ii[1];
+      }
     }
   }
   return $field_set[$field['field_name']];
 }
+
+
+  // Items from content type
+/* Just an idea to ease some use cases
+  if (empty($field_set[$field['field_name']])) {
+    $result = db_query("select A.nid as confnid, B.title as element,A.title as configuracio from node as A, content_type_configuracioelementdefoc as CEF, node as B WHERE A.type='configuracioelementdefoc' AND A.nid=CEF.nid AND B.nid=CEF.field_elementdefoc_nid;");
+    $piro = array();
+    while($row = db_fetch_object($result)) {
+      $piro[$row->confnid] = $row->element." -> ".$row->configuracio;
+    }
+  }
+  return $field_set[$field['field_name']];
+}
+*/
