Index: components/vocabulary.inc
===================================================================
RCS file: components/vocabulary.inc
diff -N components/vocabulary.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ components/vocabulary.inc	23 Sep 2007 20:21:58 -0000
@@ -0,0 +1,375 @@
+<?php
+// $Id$
+/** 
+ * function webform_edit_vocabulary
+ * Create a set of form items to be displayed on the form for editing this component.
+ * Use care naming the form items, as this correlates directly to the database schema.
+ * The component "Name" and "Description" fields are added to every component type and
+ * are not necessary to specify here (although they may be overridden if desired).
+ * @returns An array of form items to be displayed on the edit component page
+ **/
+function _webform_edit_vocabulary($currfield) {
+  $edit_fields = array();
+  
+  $result = db_query(db_rewrite_sql("SELECT vid, name FROM {vocabulary}"));
+  while ($v = db_fetch_object($result)) {
+    $vocabularies[$v->vid] = $v->name;
+  }
+  $edit_fields['extra']['vocabulary'] = array(
+    '#type' => 'select',
+    '#title' => t("Vocabulary"),
+    '#options' => $vocabularies,
+    '#default_value' => $currfield['extra']['vocabulary'],
+    '#description' => t('The terms of this vocabulary can be selected by the user'),
+    '#weight' => -2,
+    '#required' => TRUE,
+  );
+  $edit_fields['extra']['multiple'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("Multiple"),
+    '#return_value' => 'Y',
+    '#default_value' => ($currfield['extra']['multiple']=='Y'?TRUE:FALSE),
+    '#description' => t('Check this option if the user should be allowed to choose multiple values.'),
+  );
+  $edit_fields['extra']['aslist'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("Listbox"),
+    '#return_value' => 'Y',
+    '#default_value' => ($currfield['extra']['aslist']=='Y'?TRUE:FALSE),
+    '#description' => t('Check this option if you want the select component to be of listbox type instead of radiobuttons or checkboxes.'),
+  );
+  return $edit_fields;
+}
+
+/** 
+ * function webform_render_vocabulary
+ * Build a form item array containing all the properties of this component
+ * @param $component An array of information describing the component, directly correlating to the webform_component database schema
+ * @returns An array of a form item to be displayed on the client-side webform
+ **/
+function _webform_render_vocabulary($component) {
+  $form_item = array(
+    '#title'         => htmlspecialchars($component['name'], ENT_QUOTES),
+    '#required'      => $component['mandatory'],
+    '#weight'        => $component['weight'],
+    '#description'   => _webform_filtervalues($component['extra']['description']),
+    '#prefix'        => '<div class="webform-component-'. $component['type'] .'" id="webform-component-'. $component['form_key'] .'">',
+    '#suffix'        => '</div>',
+  );
+  
+  if ($component['extra']['aslist'] == 'Y' && $component['extra']['multiple'] != 'Y') {
+    $options = array('' => t('select...'));
+  }
+  else {
+    $options = array();
+  }
+
+  // Extract terms from user-selected vocabulary
+  $tree = taxonomy_get_tree($component['extra']['vocabulary']);
+  if ($tree && count($tree) > 0) {
+    foreach ($tree as $term) {
+      $options[$term->name] = str_repeat('-', $term->depth). $term->name;
+    }
+  }
+  $default_value = current($options);  // first element of the array is the default value
+  
+  // Set the component options
+  $form_item['#options'] = $options;
+  
+  // Set the default value
+  if ($default_value) {
+    // Convert default value to a list if necessary
+    if ($component['extra']['multiple'] == 'Y') {
+      if (strpos($default_value, ',')) {
+        $varray = explode(',', $default_value);
+        foreach ($varray as $key => $v) {
+          if (array_key_exists(_webform_safe_name($v), $options)) {
+            $form_item['#default_value'][] = _webform_safe_name($v);
+          }
+          else {
+            $form_item['#default_value'][] = $v;
+          }
+        }
+      }
+      else {
+        if (array_key_exists(_webform_safe_name($default_value), $options)) {
+          $form_item['#default_value'] = _webform_safe_name($default_value);
+        }
+        else {
+          $form_item['#default_value'] = $default_value;
+        }
+      }
+    }
+    else {
+      if (array_key_exists(_webform_safe_name($default_value), $options)) {
+        $form_item['#default_value'] = _webform_safe_name($default_value);
+      }
+      else {
+        $form_item['#default_value'] = $default_value;
+      }
+    }
+  }
+  
+  if ($component['extra']['aslist'] == 'Y') {
+    // Set display as a select list:
+    $form_item['#type'] = 'select';
+    if ($component['extra']['multiple'] == 'Y') {
+      $form_item['#multiple'] = TRUE;
+    }
+  }
+  else {
+    if ($component['extra']['multiple'] == 'Y') {
+      // Set display as a checkbox set
+      $form_item['#type'] = 'checkboxes';
+      
+    }
+    else {
+      // Set display as a radio set
+      $form_item['#type'] = 'radios';
+    }
+  }
+  return $form_item;
+}
+
+
+/** 
+ * function _webform_submission_display_vocabulary
+ * Display the result of a textfield submission. The output of this function will be displayed under the "results" tab then "submissions"
+ * @param $data An array of information containing the submission result, directly correlating to the webform_submitted_data database schema
+ * @param $component An array of information describing the component, directly correlating to the webform_component database schema
+ * @returns Textual output formatted for human reading.
+ **/
+function _webform_submission_display_vocabulary($data, $component) {
+  $form_item = _webform_render_vocabulary($component);
+  if ($component['extra']['multiple'] == 'Y') {
+    // Set the value as an array
+    foreach ((array)$data['value'] as $key => $value) {
+      if (array_key_exists(_webform_safe_name($value), $form_item['#options'])) {
+        $form_item['#default_value'][] = _webform_safe_name($value);
+      }
+      else {
+        $form_item['#default_value'][] = $value;
+      }
+    }
+  }
+  else {
+    // Set the value as a single string
+    foreach ((array)$data['value'] as $value) {
+      if ($value !== '0') {
+        if (array_key_exists(_webform_safe_name($value), $form_item['#options'])) {
+          $form_item['#default_value'] = _webform_safe_name($value);
+        }
+        else {
+          $form_item['#default_value'] = $value;
+        }
+        break;
+      }
+    }
+  }
+  $form_item['#attributes'] = array("disabled" => "disabled");
+  return $form_item;
+}
+
+
+/** 
+ * function webform_submit_vocabulary
+ * Translates the submitted 'safe' form values back into their un-edited original form
+ * @param $data The POST data associated with the component
+ * @param $component An array of information describing the component, directly correlating to the webform_component database schema
+ * @returns Nothing
+ **/
+function _webform_submit_vocabulary(&$data, $component) {
+  $value = _webform_filtervalues($component['value']);
+  $tree = taxonomy_get_tree($component['extra']['vocabulary']);
+  if ($tree && count($tree) > 0) {
+    foreach ($tree as $term) {
+      $options[$term->name] = str_repeat('-', $term->depth). $term->name;
+    }
+  }
+
+  if (is_array($data)) {
+    foreach ($data as $key => $value) {
+      if ($value) {
+        $data[$key] = $options[$key];
+      }
+    }
+  }
+  elseif (!empty($data)) {
+    $data = $options[$data];
+  }
+}
+
+/**
+ * theme_webform_mail_vocabulary
+ * Format the output of emailed data for this component
+ *
+ * @param mixed $data A string or array of the submitted data
+ * @param array $component An array of information describing the component, directly correlating to the webform_component database schema
+ * @returns string Textual output to be included in the email
+ */
+function theme_webform_mail_vocabulary($data, $component) {
+  // Extract terms from user-selected vocabulary
+  $tree = taxonomy_get_tree($component['extra']['vocabulary']);
+  if ($tree && count($tree) > 0) {
+    foreach ($tree as $term) {
+      $options[$term->name] = str_repeat('-', $term->depth). $term->name;
+    }
+  }
+  $options = array();
+  
+  // Generate the output
+  if ($component['extra']['multiple']) {
+    $output = $component['name'] .":\n";
+    foreach ($data as $value) {
+      if ($value) {
+        if ($options[$value]) {
+          $output .= "    • ". $options[$value] ."\n";
+        }
+        else {
+          $output .= "    • ". $options[_webform_safe_name($value)] ."\n";
+        }
+      }
+    }
+  }
+  else {
+    $output = $component['name'] .": ". $data ."\n";
+  }
+  return $output;
+}
+
+/** 
+ * function _webform_help_vocabulary
+ * Module specific instance of hook_help
+ **/
+function _webform_help_vocabulary($section) {
+  switch ($section) {
+    case 'admin/settings/webform#vocabulary_description':
+      $output = t("Allows creation of checkboxes, radio buttons, or select menus with taxonomy terms.");
+      break;
+  }
+  return $output;
+}
+
+/** 
+ * function _webform_analysis_view_vocabulary
+ * Calculate and returns statistics about results for this component from all submission to this webform. The output of this function will be displayed under the "results" tab then "analysis"
+ * @param $component An array of information describing the component, directly correlating to the webform_component database schema
+ * @returns An array of data rows, each containing a statistic for this component's submissions.
+ **/
+function _webform_analysis_rows_vocabulary($component) {
+  $component['extra'] = unserialize($component['extra']);
+  // Extract terms from user-selected vocabulary
+  $tree = taxonomy_get_tree($component['extra']['vocabulary']);
+  if ($tree && count($tree) > 0) {
+    foreach ($tree as $term) {
+      $options[$term->name] = str_repeat('-', $term->depth). $term->name;
+    }
+  }
+  $options = array();
+  
+  $query = 'SELECT data, count(data) as datacount '.
+    ' FROM {webform_submitted_data} '.
+    ' WHERE nid = %d '.
+    ' AND cid = %d '.
+    " AND data != '0' AND data != '' ".
+    ' GROUP BY data ';
+  $result = db_query($query, $component['nid'], $component['cid']);
+  $rows = array();
+  while ($data = db_fetch_array($result)) {
+    if ($options[$data['data']]) {
+      $display_option = $options[$data['data']];
+    }
+    else {
+      $display_option = $data['data'];
+    }
+    $rows[] = array($display_option, $data['datacount']);
+  }
+  return $rows;
+}
+
+/** 
+ * function _webform_table_data_vocabulary
+ * Return the result of this component's submission for display in a table. The output of this function will be displayed under the "results" tab then "table"
+ * @param $data An array of information containing the submission result, directly correlating to the webform_submitted_data database schema
+ * @returns Textual output formatted for human reading.
+ **/
+function _webform_table_data_vocabulary($data) {
+  // Set the value as a single string
+  if (is_array($data['value'])) {
+    foreach ($data['value'] as $value) {
+      if ($value !== '0') {
+        $output .= check_plain($value) ."<br />";
+      }
+    }
+  }
+  else {
+    $output = check_plain(empty($data['value']['0']) ? "" : $data['value']['0']);
+  }
+  return $output;
+}
+
+
+/** 
+ * function _webform_csv_headers_vocabulary
+ * Return the header information for this component to be displayed in a comma seperated value file. The output of this function will be displayed under the "results" tab then "download"
+ * @param $component An array of information describing the component, directly correlating to the webform_component database schema
+ * @returns An array of data to be displayed in the first three rows of a CSV file, not including either prefixed or trailing commas
+ **/
+function _webform_csv_headers_vocabulary($component) {
+  $header = array();
+  $header[0] = '';
+  
+  if ($component['extra']['multiple']) {
+    $header[1] = $component['name'];
+    $tree = taxonomy_get_tree($component['extra']['vocabulary']);
+    if ($tree && count($tree) > 0) {
+      foreach ($tree as $term) {
+        $items[] = $term->name;
+      }
+    }
+    foreach ($items as $item) {
+      $header[2] .= "\,". $item;
+    }
+    // Remove the preceding extra comma
+    $header[2] = substr($header[2], 2);
+  }
+  else {
+    $header[2] = $component['name'];
+  }
+  return $header;
+}
+
+/** 
+ * function _webform_csv_data_vocabulary
+ * Return the result of a textfield submission. The output of this function will be displayed under the "results" tab then "submissions"
+ * @param $data An array of information containing the submission result, directly correlating to the webform_submitted_data database schema
+ * @returns Textual output formatted for CSV, not including either prefixed or trailing commas
+ **/
+function _webform_csv_data_vocabulary($data, $component) {
+  $value = _webform_filtervalues($component['value']);
+  $options = array();
+  // Extract terms from user-selected vocabulary
+  $tree = taxonomy_get_tree($component['extra']['vocabulary']);
+  if ($tree && count($tree) > 0) {
+    foreach ($tree as $term) {
+      $options[$term->name] = $term->name;
+    }
+  }
+  
+  if ($component['extra']['multiple']) {
+    foreach ($options as $key => $item) {
+      if (in_array($key, (array)$data['value']) === true) {
+        $output .= '\,Yes';
+      }
+      else {
+        $output .= '\,No';
+      }
+    }
+    // Remove the preceding extra comma
+   $output = substr($output, 2);
+  }
+  else {
+    $output = $data['value'][0];
+  }
+  return $output;
+}
