Index: FeedsIcalDateParser.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/parser_ical/FeedsIcalDateParser.inc,v
retrieving revision 1.3
diff -u -r1.3 FeedsIcalDateParser.inc
--- FeedsIcalDateParser.inc	2 Jan 2010 11:48:41 -0000	1.3
+++ FeedsIcalDateParser.inc	13 Jan 2010 20:39:19 -0000
@@ -1,6 +1,89 @@
 <?php
 // $Id: FeedsIcalDateParser.inc,v 1.3 2010/01/02 11:48:41 ekes Exp $
 
+class FeedsIcalDateTimeField extends FeedsDateTimeField {
+  protected $repeat_vals = NULL;
+
+  /**
+  * Construct from an iCal VEVENT date array.
+  */
+  public function __construct($feed_element) {
+    // If the feed element contains only the DTSTART or DTEND sub-array,
+    // we don't know which one we have, not enough information to process.
+    // If it is any other part of the VEVENT array, or the date is empty
+    // we don't have any date information and there is nothing to do.
+    if (!array_key_exists('DTSTART', $feed_element)) {
+      return;
+    }
+    if (empty($feed_element['DTSTART']['datetime'])) {
+      return;
+    }
+    include_once(drupal_get_path('module', 'date_api') .'/date_api_ical.inc');
+
+    $timezone = $feed_element['DTSTART']['tz'];
+    if (!empty($timezone)) {
+      $timezone = new DateTimeZone($timezone);
+    }
+
+    $this->start = new FeedsDateTime($feed_element['DTSTART']['datetime'], $timezone);
+
+    if (!empty($feed_element['DTEND']) && !empty($feed_element['DTEND']['datetime'])) {
+      $this->end = new FeedsDateTime($feed_element['DTEND']['datetime'], $timezone);
+    }
+    if($feed_element['DTSTART']['all_day']){
+      // All day event; remove time granularity, set to = from
+      $this->start->removeGranularity('hour');
+      $this->start->removeGranularity('minute');
+      $this->start->removeGranularity('second');
+      $this->end = clone $this->start;
+    }
+    if (array_key_exists('RRULE', $feed_element) && !empty($feed_element['RRULE']) && module_exists('date_repeat')) {
+      include_once('./'. drupal_get_path('module', 'date_repeat') .'/date_repeat_calc.inc');
+      include_once('./'. drupal_get_path('module', 'date') .'/date_repeat.inc');
+      // Explode the RRULE into parts so we can analyze it.
+      $rrule = $feed_element['RRULE']['DATA'] . (!empty($feed_element['EXDATE']) ? "/n". $feed_element['EXDATE'] : "");
+      // In current API the first variable, $field, is unused--may change?
+      $form_values = date_ical_parse_rrule(NULL, $rrule);
+
+      // Make sure we don't end up with thousands of values with RRULES 
+      // that have no UNTIL or COUNT.
+      // TODO: could be adjusted or made configurable later.
+      $max = date_now();
+      $max_repeats = 52;
+      
+      // NOTE: This is not properly timezone converted; that's the least of its problems.
+      date_modify($max, '+5 years');
+      $until = date_format($max, 'Y-m-d H:i:s');
+      if (empty($form_values['COUNT']) && (empty($form_values['UNTIL']) || $until < $form_values['UNTIL']['datetime'])) {
+        $form_values['UNTIL'] = array('datetime' => $until, 'tz' => 'UTC');
+        $form_values['COUNT'] = $max_repeats;
+      }
+      elseif (empty($form_values['COUNT'])) {
+        $form_values['COUNT'] = $max_repeats;
+      }
+      elseif (empty($form_values['UNTIL'])) {
+        $form_values['UNTIL'] = array('datetime' => $until, 'tz' => 'UTC');
+      }
+      // Save these in the form_values format, which date can convert to an rrule with date_api_ical_build_rrule()
+      $this->repeat_vals = $form_values;
+    }
+  }
+  
+  /**
+   * Build a node's date CCK field from our object.
+   */
+  public function buildField($node, $field_name) {
+    parent::buildField($node, $field_name);
+    if (empty($this->repeat_vals)) {
+      return;
+    }
+    $field = content_fields($field_name);
+    $node_field = $node->{$field_name}[0];
+    $values = date_repeat_build_dates(NULL, $this->repeat_vals, $field, $node_field);
+    $node->$field_name = $values;
+  }
+}
+
 /**
  * Class definition for iCal date module Parser.
  *
Index: parser_ical.dateapi.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/parser_ical/parser_ical.dateapi.inc,v
retrieving revision 1.2
diff -u -r1.2 parser_ical.dateapi.inc
--- parser_ical.dateapi.inc	2 Jan 2010 11:48:41 -0000	1.2
+++ parser_ical.dateapi.inc	13 Jan 2010 20:39:19 -0000
@@ -44,25 +44,13 @@
       if (isset($event['DTSTAMP'])) {
         $date = date_ical_date($event['DTSTAMP']);
         if (date_is_valid($date, DATE_OBJECT)) {
-          $item->options->timestamp = date_format($date, 'U');
+          $item['timestamp'] = date_format($date, 'U');
         }
       }
 
       $item['guid'] = isset($event['UID']) ? $event['UID'] : ''; // intention
       $item['tags'] = isset($event['CATEGORIES']) ? explode(',', $event['CATEGORIES']) : array();
-
-      // Keep iCal timezone information in the feed item so we can create the right date value.
-      $date_info = array('DTSTART', 'DTEND', 'RDATE', 'EXDATE', 'DURATION', 'RRULE');
-      foreach ($date_info as $key) {
-        if (isset($event[$key])) {
-          $item['ical_date']['DATE'][$key] = $event[$key];
-          unset($event[$key]);
-        }
-      }
-      // catch-all ... could be better
-      foreach ($event as $key => $value) {
-        $item['ical_date'][$key] = $value;
-      }
+      $item['ical_date'] = new FeedsIcalDateTimeField($event);
       $parsed_source['items'][] = $item;
     }
   }
