Index: feedapi_mapper_date.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedapi_mapper/mappers/Attic/feedapi_mapper_date.inc,v
retrieving revision 1.1.2.3.2.2
diff -u -r1.1.2.3.2.2 feedapi_mapper_date.inc
--- feedapi_mapper_date.inc	10 Feb 2009 20:32:43 -0000	1.1.2.3.2.2
+++ feedapi_mapper_date.inc	20 Feb 2009 19:00:58 -0000
@@ -57,13 +57,14 @@
  */
 function feedapi_mapper_date_datetime(&$node, $field, $feed_element, $sub_field) {
   $field_name = $field['field_name'];
-  
+  $timezone = date_default_timezone_name();
+  $to_tz = date_get_timezone($field['tz_handling'], $timezone);
+    
   // Pull offset information out of datetime and reset date to
   // the known value, UTC. The offset is not useful here.
   preg_match('/(([\+\-])(\d{2})?:?(\d{2})?)/', $feed_element, $matches);
   if (!empty($matches)) {
     $datetime = trim(str_replace($matches[1], '', $feed_element));
-    $timezone = 'UTC';
     $date = date_create($datetime, timezone_open('UTC'));
     $direction = $matches[2];
     $hours = $matches[3];
@@ -76,27 +77,60 @@
       date_modify($date, $direction . trim($hours) .' hours');
       date_modify($date, $direction . trim($minutes) .' minutes');       
     }
+    // Reset it to the appropriate local timezone.
+    date_timezone_set($date, timezone_open($to_tz));
   }
   else {
     // A date without a timezone or a non-ISO date, assume local timezone.
-    $timezone = date_default_timezone_name();
-    $date = date_create($feed_element, timezone_open($timezone));
+    $date = date_create($feed_element, timezone_open($to_tz));
   }
 
   $date = new date_constructor();
   $date->construct($field);
   $date->set_value('timezone', $timezone);
-  $date->set_value('start_datetime', $feed_element);
-  //$date->set_value('end_datetime', $feed_element);
+  $date->set_value($sub_field, $feed_element);
+  if ($sub_field == 'end_datetime') {
+    $date->set_value('start_datetime', $feed_element);
+  }
   $date->build();
-  $node->$field_name = array($date->value);
-  return $node;
+  
+  if (!isset($node->{$field_name})) {
+    $node->$field_name = array($date->value);
+  }
+  else {
+    if ($sub_field == 'start_datetime') {
+      $node->{$field_name}[0]['date'] = $date->value['date'];
+      $node->{$field_name}[0]['value'] = $date->value['value'];
+    }
+    elseif ($sub_field == 'end_datetime') {
+      $node->{$field_name}[0]['date2'] = $date->value['date2'];
+      $node->{$field_name}[0]['value2'] = $date->value['value2'];
+    }
+  }
 }
 
 /**
  * Create a date from an iCal feed array.
  */
 function feedapi_mapper_date_ical($node, $field, $feed_element) {
+  // There are lots of available elements in the feed, so do some checking.
+  
+  // If the feed element contains the top-level VEVENT, 
+  // pick out the part we need, the DATE array.
+  if (array_key_exists('DATE', $feed_element)) {
+    $feed_element = $feed_element['DATE'];
+  }
+  // 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;
+  }
+  elseif (empty($feed_element['DTSTART']['datetime'])) {
+    return;
+  }
+  
   $field_name = $field['field_name'];
   
   $timezone = $feed_element['DTSTART']['tz'];
@@ -105,36 +139,53 @@
   $date = new date_constructor();
   $date->construct($field);
   $date->set_value('timezone', $timezone);
-  $date->set_value('start_datetime', $feed_element['DTSTART']['datetime']);
-  $date->set_value('end_datetime', $feed_element['DTEND']['datetime']);
-  $date->set_value('all_day', $feed_element['all_day']);
+  if (strlen($feed_element['DTSTART']['datetime'] < 11)) {
+    $date->set_value('start_date', $feed_element['DTSTART']['datetime']);
+  }
+  else {
+    $date->set_value('start_datetime', $feed_element['DTSTART']['datetime']);
+  }
+  if (!empty($feed_element['DTEND']) && !empty($feed_element['DTEND']['datetime'])) {
+    if (strlen($feed_element['DTEND']['datetime'] < 11)) {
+      $date->set_value('end_date', $feed_element['DTEND']['datetime']);
+    }
+    else {
+      $date->set_value('end_datetime', $feed_element['DTEND']['datetime']);
+    }
+  }
+  $date->set_value('all_day', $feed_element['DTSTART']['all_day']);
   $date->build();
   $node->$field_name = array($date->value);
-        
+  
   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'] . (!empty($feed_element['EXDATE']) ? "/n". $feed_element['EXDATE'] : "");
+    $rrule = $feed_element['RRULE']['DATA'] . (!empty($feed_element['EXDATE']) ? "/n". $feed_element['EXDATE'] : "");
     $form_values = date_ical_parse_rrule($field, $rrule);
           
     // Set an maximum value for repeating dates.
     // One year, 5 repeats for now, could be adjusted or made configurable later.
     $max = date_now();
-    $max_repeats = 5;
-      
+    $max_repeats = 10;
     date_modify($max, '+1 year');
     $until = date_format($max, 'Y-m-d H:i:s');
-    if (empty($form_values['UNTIL']) || $until < $form_values['UNTIL']['datetime']) {
+    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');
     }
-    $form_values['COUNT'] = $max_repeats;
           
     // Reconstruct the RRULE with our changes and build the repeats.
     $rrule = date_api_ical_build_rrule($form_values);
-    $node_field = $node->$field_name[0];
+    $node_field = $node->{$field_name}[0];
     $values = date_repeat_build_dates($rrule, $form_values, $field, $node_field);
     $node->$field_name = $values;
 
@@ -210,8 +261,13 @@
         if (!empty($value) && strtolower($value) != 'false' && $value !== FALSE) {
           $this->start_time = '00:00:00';
           $this->end_time = '00:00:00';
-          $this->start_datetime = $this->start_date .' '. $this->start_time;
-          $this->end_datetime = $this->end_date .' '. $this->end_time;
+          if (!empty($this->start_date)) {
+            $this->start_datetime = $this->start_date .' '. $this->start_time;
+          }
+          if (!empty($this->end_date)) {
+            $this->end_datetime = $this->end_date .' '. $this->end_time;
+          }
+          $this->all_day = TRUE;
         }
         break;
       case 'start_date':
@@ -232,9 +288,13 @@
         break;
       case 'start_datetime':
         $this->start_datetime = $value;
+        $this->start_date = NULL;
+        $this->start_time = NULL;
         break;
       case 'end_datetime':
         $this->end_datetime = $value;
+        $this->end_date = NULL;
+        $this->end_time = NULL;
         break;  
   
     }
@@ -250,18 +310,22 @@
    */
   function build() {
     $this->set_timezone();
-    if (empty($this->start_datetime)) {
-      $this->start_datetime = $this->start_date .' '. $this->start_time;
+    if (empty($this->start_datetime) && !empty($this->start_date)) {
+      $this->start_datetime = trim($this->start_date .' '. $this->start_time);
     }
-    if (empty($this->end_date)) {
+    if (empty($this->end_date) && empty($this->end_datetime)) {
       $this->end_date = $this->start_date;
     }
-    if (empty($this->end_time)) {
+    if (empty($this->end_time) && empty($this->end_datetime)) {
       $this->end_time = $this->start_time;
     }
-    if (empty($this->end_datetime)) {
-      $this->end_datetime = $this->end_date .' '. $this->end_time;
+    if (empty($this->end_datetime) && (!empty($this->end_date) || !empty($this->end_time))) {
+      $this->end_datetime = trim($this->end_date .' '. $this->end_time);
+    }
+    elseif (empty($this->end_datetime)) {
+      $this->end_datetime = $this->start_datetime;
     }
+    
     // We don't know exactly what format the provided date used,
     // so use the native date_create() where available, which does a
     // pretty good job of interpreting non-standard date values. Where the 
@@ -278,6 +342,7 @@
       $this->value['date'] = date_create($this->start_datetime, timezone_open($this->to_tz));
       $this->value['date2'] = date_create($this->end_datetime, timezone_open($this->to_tz));      
     }
+    
     $this->value['offset'] = date_offset_get($this->value['date']);
     $this->value['offset2'] = date_offset_get($this->value['date2']);
     date_timezone_set($this->value['date'], timezone_open($this->db_tz));
@@ -285,6 +350,5 @@
     $this->value['value'] = date_format($this->value['date'], $this->format);
     $this->value['value2'] = date_format($this->value['date2'], $this->format);
     $this->value['timezone'] = $this->to_tz;
-    dsm($this->value);
   }
 }
\ No newline at end of file

