=== modified file 'modules/webform_report/webform_report.install'
--- modules/webform_report/webform_report.install	2008-01-23 18:31:47 +0000
+++ modules/webform_report/webform_report.install	2008-01-25 02:44:27 +0000
@@ -12,6 +12,10 @@
         wnid int(10) unsigned NOT NULL default '0',
         cid int(10) unsigned NOT NULL default '0',
         kcid int(10) unsigned NOT NULL default '0',
+        reported int(10) unsigned NOT NULL default '0',
+        email_report int(1) unsigned NOT NULL default '0',
+        email_time int(10) unsigned NOT NULL default '0',
+        email_address varchar(120) default '',
         description text default NULL,
         sort int(2) NOT NULL default '4',
         PRIMARY KEY  (nid,cid)
@@ -25,8 +29,12 @@
         wnid integer NOT NULL default '0',
         cid integer NOT NULL default '0',
         kcid integer NOT NULL default '0',
+        reported integer NOT NULL default '0',
+        email_report integer NOT NULL default '0',
+        email_time integer NOT NULL default '0',
+        email_address text,
         description text,
-        sort smallint NOT NULL default '4',
+        sort smallint NOT NULL default '4', 
         PRIMARY KEY  (nid,cid)
         )"
       );
@@ -43,4 +51,10 @@
   else {
     drupal_set_message(t('The installation of webform report module was unsuccessful.'), 'error');
   }
+}
+
+
+function webform_report_uninstall() {
+  db_query('DROP TABLE {webform_report}');
+  variable_del('webform_report_version');
 }
\ No newline at end of file

=== modified file 'modules/webform_report/webform_report.module'
--- modules/webform_report/webform_report.module	2008-01-23 18:31:47 +0000
+++ modules/webform_report/webform_report.module	2008-01-25 05:50:09 +0000
@@ -102,7 +102,7 @@
 function webform_report_load($node) {
   $webform_report = NULL;
   if(!isset($_POST['wnid'])) {
-    $result = db_query("SELECT r.nid, r.wnid, r.cid, c.name, r.kcid, r.description, r.sort FROM {webform_report} r, {webform_component} c WHERE (r.cid = c.cid AND r.nid = '$node->nid') ORDER BY c.weight");
+    $result = db_query("SELECT r.nid, r.wnid, r.cid, r.email_report, r.email_time, r.email_address, c.name, r.kcid, r.description, r.sort FROM {webform_report} r LEFT OUTER JOIN {webform_component} c ON r.wnid = c.nid AND r.cid = c.cid WHERE r.nid = '$node->nid' ORDER BY c.weight");
     
     if (db_num_rows($result) > 0) {
       while ($row = db_fetch_object($result)) {
@@ -117,10 +117,20 @@
         }
         if (!isset($webform_report->description)) {
           $webform_report->description = $row->description;
+        }
+        if (!isset($webform_report->email_report)) {
+          $webform_report->email_report = $row->email_report;
+        }
+        if (!isset($webform_report->email_time)) {
+          $webform_report->email_time = $row->email_time;
+        }
+        if (!isset($webform_report->email_address)) {
+          $webform_report->email_address = $row->email_address;
         }
         $webform_report->components[] = $row->cid;
       }
-    }
+    }
+
     else {
       webform_report_prepare($node);
     }
@@ -129,7 +139,10 @@
     $webform_report->wnid = $_POST['wnid'];
     $webform_report->kcid = $_POST['kcid'];
     $webform_report->sort_order = $_POST['sort_order'];
-    $webform_report->description = $_POST['description'];
+    $webform_report->description = $_POST['description'];
+    $webform_report->email_report = $_POST['email_report'];
+    $webform_report->email_time = $_POST['email_time'];
+    $webform_report->email_address = $_POST['email_address'];
     $webform_report->components = $_POST['components'];
   }
 
@@ -148,6 +161,15 @@
   }
   if (!isset($node->kcid)) { 
     $node->sort_order = $_POST['sort_order'];
+  }
+  if (!isset($node->email_report)) { 
+    $node->email_report = $_POST['email_report'];
+  }
+  if (!isset($node->email_time)) { 
+    $node->email_time = $_POST['email_time'];
+  }
+  if (!isset($node->email_address)) { 
+    $node->email_address = $_POST['email_address'];
   }
   if (!isset($node->description)) {
     $node->description = $_POST['description'];
@@ -160,7 +182,7 @@
 /**
  * Implementation of hook_view
  */
-function webform_report_view($node, $teaser = 0, $page = 0) {
+function webform_report_view($node, $teaser = 0, $page = 0, $iDate = 0) {
   if (arg(0) == "comment" || $teaser) {
     // Do not render the form for comments or on teasers
     return;
@@ -169,7 +191,7 @@
   webform_report_prepare($node); // load form data to the node object
   
   $output = "<p>" . $node->description . "</p>";
-  $output .= _webform_report_get_body_content(_webform_report_get_data($node->kcid, $node->components), $node);
+  $output .= _webform_report_get_body_content(_webform_report_get_data($node, $node->kcid, $node->components, $iDate), $node);
   $node->content['body'] = array('#value' => check_markup($node->body, $node->format, FALSE));
   $node->content['webform_report'] = array('#value' => $output, '#weight' => 10);
   return $node;
@@ -211,7 +233,7 @@
   webform_report_prepare($node);
   foreach ($node->components as $cid) {
     if($cid != 0) {
-      db_query("INSERT INTO {webform_report} (nid, wnid, cid, kcid, description, sort) VALUES ('$node->nid', '$node->wnid', '$cid', '$node->kcid', '".addslashes($node->description)."', '$node->sort_order')");
+      db_query("INSERT INTO {webform_report} (nid, wnid, cid, kcid, email_report, email_time, email_address, description, sort) VALUES ('$node->nid', '$node->wnid', '$cid', '$node->kcid', '$node->email_report', '$node->email_time', '$node->email_address', '".addslashes($node->description)."', '$node->sort_order')");
     } 
   }
   if ($log) {
@@ -291,7 +313,37 @@
   );
   unset($webform_node, $default, $options);
 
-  if (isset($node->wnid) && $node->wnid != 0) {
+  if (isset($node->wnid) && $node->wnid != 0) {
+    
+      $form['webform_report']['email_report'] = array(
+        '#type' => 'checkbox',
+        '#title' => t("Send Email Reports"),
+        '#description' => t('Send Reports via Email'),
+        '#options' => array('1' => 'Yes'),
+        '#default_value' => $node->email_report,
+        '#attributes' => array('onchange' => 'this.form.submit()'),
+        '#weight' => 1,
+      );
+      if (isset($node->email_report) && $node->email_report != 0) {
+          $form['webform_report']['email_address'] = array(
+            '#type' => 'textfield',
+            '#title' => t("Send Email To"),
+            '#description' => t('Email address to send reports'),
+            '#default_value' => $node->email_address,
+            '#weight' => 2,
+          );
+          
+          // thank you aggregator module.
+          $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
+          $form['webform_report']['email_time'] = array(
+            '#type' => 'select',
+            '#title' => t('Report Interval'),
+            '#options' => $period,
+            '#default_value' => $node->email_time,
+            '#description' => t('The refresh interval indicating how often you want recieve emails from this report.  This will only send if there are new submissions.'),
+            '#weight' => 3,
+          );
+      }
     if (isset($node->kcid)) {
       $default = $node->kcid;
     }
@@ -305,7 +357,7 @@
       '#default_value' => $default,
       '#options' => $options,
       '#attributes' => array('onchange' => 'this.form.submit()'),
-      '#weight' => 1,
+      '#weight' => 4,
     );
     unset($default, $options);
 
@@ -315,7 +367,7 @@
       '#title' => t("Sort order"),
       '#options' => $options,
       '#default_value' => $node->sort_order,
-      '#weight' => 2,
+      '#weight' => 5,
     );
   }
 
@@ -327,7 +379,7 @@
       '#description' => t('Select all of the components to include in this report and click Preview to display the results'),
       '#options' => $options,
       '#default_value' => $node->components,
-      '#weight' => 2,
+      '#weight' => 6,
     );
   }
 
@@ -335,7 +387,7 @@
     $form['webform_report']['next'] = array(
       '#type' => 'button',
       '#value' => t(' Next > '),
-      '#weight' => 4,
+      '#weight' => 7,
       '#attributes' => array('onclick' => 'this.form.submit()'),      
     );
   }
@@ -381,9 +433,48 @@
       $component_name .= "...";
     }
     $components[$row->cid] = t($component_name);
-  }
+  }
+  
+  // Add our Date Submitted faux component. 999999999 is completely arbitrarty - should probably be defined globally
+  $components[999999999] = t('Date Submitted');
   
   return $components;
+}
+
+function webform_cron() {
+    // check if we have any reports whose interval are up
+    $report_result = db_query('SELECT nid, wnid, email_time, email_address, reported FROM {webform_report} WHERE email_report = 1 AND reported + email_time > %d GROUP BY nid', time());
+    while ($report = db_fetch_array($report_result)) {
+        // check if we have new data to report
+        $result = db_query('SELECT COUNT(*) as submission_count FROM {webform_submissions} WHERE nid = %d AND submitted >= %d', $report['wnid'], $report['reported']);
+        $rCount = mysql_fetch_array($result);
+        
+        if ($rCount['submission_count'] > 0) {
+            $node = node_load($report['nid']);            
+            $node = webform_report_load($node);
+            $node = webform_report_view($node, 0, 0, $report['reported']);
+            
+            // load node info for our subject line
+            $node_info = node_load($report['wnid']);
+            
+            $sTo  = $report['email_address'];
+            $sSubject = 'Data Report: ' . $node_info->title;
+            
+            // either say it's since the last report, or if it wasn't previouslt reported, since the form was generated
+            $sDateFrom = $report['reported'] > 0 ? format_date($report['reported']) : 'the form was created';
+            $sMessage = 'New Data since ' . $sDateFrom . "\n\n";
+            $sMessage .= $node->content['webform_report']['#value'];
+            
+            // html email
+            $headers = array();
+            $headers['Content-Type'] = " text/html; charset=utf-8";
+            
+            if (drupal_mail('', $sTo, $sSubject, $sMessage, NULL, $headers)) {
+                db_query('UPDATE {webform_report} SET reported = %d WHERE nid = %d AND wnid = %d', time(), $report['nid'], $report['wnid']);
+                watchdog('webform_report', t($sSubject . ' sent to ' . $sTo), WATCHDOG_NOTICE);
+            }
+        }
+    }
 }
 
 
@@ -394,7 +485,8 @@
  * @param components is an array of fields to include in the report
  * @return a database query result set
  */
-function _webform_report_get_data($kcid, $components) {
+function _webform_report_get_data(&$node, $kcid, $components, $iDate = 0) {
+  $iDate = is_numeric($iDate) ? $iDate : 0;
   $result = NULL;
   if (is_array($components) and count($components) > 0) {  
     // build a subquery for the specified components
@@ -407,9 +499,34 @@
       }
       $count++;
     }
-    $query .= "'";
-
-    $result = db_query("SELECT c.name, c.cid, d.sid, d.data FROM {webform_submitted_data} d, {webform_component} c, {webform_submissions} s WHERE d.cid = c.cid AND d.sid = s.sid AND (" . $query . ") ORDER BY d.sid, c.cid, c.name, d.data");
+    $query .= "'";
+    
+    // If Date Submitted faux component is chosen by user, add to query field -  999999999 is completely arbitrarty - should probably be defined globally
+    $iDateFieldID = 999999999;
+    $sSubmitted   = '';
+    if (in_array($iDateFieldID, $components)) {
+        $sSubmitted = 's.submitted, ';
+    }
+
+    // updated joins as I was getting strange multi-field output in every row.
+    $result = db_query("SELECT
+                            c.name,
+                            " . $sSubmitted . "
+                            c.cid,
+                            d.sid,
+                            d.data
+                        FROM {webform_submissions} s
+                        LEFT OUTER JOIN {webform_submitted_data} d ON s.sid = d.sid AND s.nid = d.nid          
+                        LEFT JOIN {webform_component} c ON d.cid = c.cid AND s.nid = c.nid                       
+                        WHERE s.nid=" . $node->wnid . "
+                        AND  s.submitted >= " . $iDate . "
+                        AND  (" . $query . ")
+                        ORDER BY
+                            d.sid,
+                            c.cid,
+                            c.name,
+                            d.data");
+    
   }
   return $result;  
 }
@@ -422,7 +539,6 @@
  * @return a string of text or a themed table
  */
 function _webform_report_get_body_content($data, $node) {
-
   if (db_num_rows($data) > 0) {
     $fields = array(); // webform field names
     $values = array(); // webform field values
@@ -430,9 +546,22 @@
     
     // create an array where the key is the webform field name
     $count = 0;
-    $base_style = "padding: 0px 10px 0px 0px; vertical-align: top;";
-
-    while ($row = db_fetch_object($data)) {
+    $base_style = "padding: 0px 10px 0px 0px; vertical-align: top;";
+    
+    // add date field -  999999999 is completely arbitrary - should probably be defined globally
+    $iDateFieldID = 999999999;
+    
+    while ($row = db_fetch_object($data)) {
+      // check if submitted data is in the row, and if so, add the appropriate field and data
+      if (isset($row->submitted)) {
+        if (!isset($fields[$iDateFieldID])) {
+          $fields[$iDateFieldID] = array('data' => 'Date Submitted', 'field' => $iDateFieldID, 'sort' => '');
+        }
+        if ($row->sid != $last_sid) {
+          $values[$row->sid][$iDateFieldID] = $row->submitted;
+        }
+      }
+      
       if (!isset($fields[$row->cid])) {
         $fields[$row->cid] = array('data' => $row->name, 'field' => $row->cid, 'sort' => $_GET['sort']);
       }
@@ -456,7 +585,8 @@
       elseif ($node->kcid == $row->cid) { // no table sort link has been clicked yet
         $_GET['order'] = $row->name; // make the sort arrow marker appear in the table column header
       }
-
+
+      $last_sid = $row->sid;
       $last_cid = $row->cid;
       $last_value = $row->data;
     }
@@ -470,7 +600,12 @@
       $tmpField = $fields[key($fields)];
       $fields[key($fields)] = $fields[$node->kcid];
       $fields[$node->kcid] = $tmpField;
-      unset($tmpField);
+      unset($tmpField);
+      
+      // we're moving the date field - update datefield id for formatting
+      if (key($fields) == $iDateFieldID) {
+          $iDateFieldID = $node->kcid;
+      }
 
       // put the values of the key column first
       foreach ($values as $key => $value) {
@@ -481,8 +616,8 @@
       unset($tmpValue);
 
       $node->kcid = key($fields); // make the new column the key column
-    }
-
+    }
+        
     // get an a array of columns for sorting
     $column = array();
     foreach ($fields as $key1 => $field) {
@@ -518,7 +653,14 @@
     }
 
     // sort the columns and their contents according to specified criteria
-    array_multisort($column[$node->kcid], (int)$node->sort_order, $values);        
+    array_multisort($column[$node->kcid], (int)$node->sort_order, $values);
+  
+    // reformat dates now after we've handled the sorting
+    foreach($values as $iKey => $value) {
+        if (array_key_exists($iDateFieldID, $value)) {
+            $values[$iKey][$iDateFieldID] = format_date($value[$iDateFieldID]);
+        }
+    }
 
     $output = theme_table($fields, $values);
   }

