Index: date_api_elements.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_api_elements.inc,v
retrieving revision 1.49.2.1.2.46
diff -u -p -r1.49.2.1.2.46 date_api_elements.inc
--- date_api_elements.inc	19 Mar 2009 20:51:09 -0000	1.49.2.1.2.46
+++ date_api_elements.inc	24 Mar 2009 17:14:17 -0000
@@ -239,7 +239,7 @@ function date_parts_element($element, $d
   $order = array_flip($granularity);
 
   $hours_format  = strpos(strtolower($element['#date_format']), 'a') ? 'g': 'G';
-  $month_function  = strpos($element['#date_format'], 'F') ? 'date_month_names' : 'date_month_names_abbr';
+  $month_function  = strpos($element['#date_format'], 'F') !== FALSE ? 'date_month_names' : 'date_month_names_abbr';
   $count = 0;
   $increment = min(intval($element['#date_increment']), 1);
   foreach ($granularity as $field) {
Index: date/date_admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date/date_admin.inc,v
retrieving revision 1.40.2.3.2.38
diff -u -p -r1.40.2.3.2.38 date_admin.inc
--- date/date_admin.inc	3 Mar 2009 15:16:54 -0000	1.40.2.3.2.38
+++ date/date_admin.inc	24 Mar 2009 17:14:18 -0000
@@ -245,7 +245,7 @@ function _date_field_settings($op, $fiel
 
     case 'save':
 
-      $options = array('granularity', 'timezone_db', 'tz_handling', 'todate', 'repeat', 'repeat_collapsed', 'default_format');
+      $options = array('granularity', 'timezone_db', 'tz_handling', 'todate', 'repeat', 'repeat_collapsed', 'default_format', 'repeat_preset_rule_enable', 'repeat_preset_rule', 'repeat_preset_rule_label', 'repeat_preset_rule_checkbox');
       return $options;
 
     case 'database columns':
@@ -395,6 +395,31 @@ function date_field_settings_form($field
       '#title' => t('Repeat display'),
       '#description' => t("Should the repeat options form start out expanded or collapsed? Set to 'Collapsed' to make those options less obtrusive."),
       );
+    $form['repeat_preset_rule_enable'] = array(
+      '#type' => 'checkbox',
+      '#default_value' => !empty($field['repeat_preset_rule_enable']) ? intval($field['repeat_preset_rule_enable']) : 0,
+      '#title' => t('Enable preset date repeat rule'),
+      '#description' => t("Select this to enable the preset repeat rule."),
+    );
+    $form['repeat_preset_rule'] = array(
+      '#type' => 'textfield',
+      '#default_value' => $field['repeat_preset_rule'],
+      '#title' => t('Preset date repeat rule'),
+      '#description' => t('Enter the date repeat rule to apply when the user checks the box.'),
+    );
+    $form['repeat_preset_rule_checkbox'] = array(
+      '#type' => 'checkbox',
+      '#default_value' => !empty($field['repeat_preset_rule_checkbox']) ? intval($field['repeat_preset_rule_checkbox']) : 0,
+      '#title' => t('Is preset repeat rule optional'),
+      '#description' => t("Select this to show the user a checkbox option to apply a single date repeat rule."),
+    );
+    $form['repeat_preset_rule_label'] = array(
+      '#type' => 'textfield',
+      '#default_value' => $field['repeat_preset_rule_label'],
+      '#title' => t('Optional preset rule checkbox label'),
+      '#description' => t('Enter the text to use as a label for the optional preset rule checkbox - e.g. is this an annual event?'),
+    );
+      
   }
 
   return $form;
@@ -491,6 +516,10 @@ function date_field_default_values($fiel
     'todate' => 'optional',
     'repeat' => in_array($widget_type, $repeat_widgets) ? 1 : 0,
     'repeat_collapsed' => 0, 
+    'repeat_preset_rule_enable' => 0,
+    'repeat_preset_rule_checkbox' => 1,
+    'repeat_preset_rule' => '',
+    'repeat_preset_rule_label' => '',
     'default_format' => 'medium',
     );
   $base_widget_values = array (
Index: date/date_elements.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date/date_elements.inc,v
retrieving revision 1.46.2.2.2.57
diff -u -p -r1.46.2.2.2.57 date_elements.inc
--- date/date_elements.inc	20 Mar 2009 00:28:33 -0000	1.46.2.2.2.57
+++ date/date_elements.inc	24 Mar 2009 17:14:19 -0000
@@ -277,7 +277,7 @@ function date_combo_process($element, $e
 
   $element[$from_field] = array(
     '#field'         => $field,
-    '#title'         => !$field['multiple'] ? t($field['widget']['label']) : '',
+    '#title'         => t($field['widget']['label']),
     '#weight'        => $field['widget']['weight'],
     '#required'      => ($field['required'] && $delta == 0) ? 1 : 0,
     '#default_value' => isset($element['#value'][$from_field]) ? $element['#value'][$from_field] : '',
Index: date/date_repeat.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date/date_repeat.inc,v
retrieving revision 1.22.2.1.2.22
diff -u -p -r1.22.2.1.2.22 date_repeat.inc
--- date/date_repeat.inc	21 Feb 2009 12:53:25 -0000	1.22.2.1.2.22
+++ date/date_repeat.inc	24 Mar 2009 17:14:19 -0000
@@ -43,6 +43,10 @@ function _date_repeat_widget(&$element, 
     '#prev_rrule' => isset($items[0]['rrule']) ? $items[0]['rrule'] : '',
     '#date_repeat_widget' => str_replace('_repeat', '', $field['widget']['type']),
     '#date_repeat_collapsed' => $field['repeat_collapsed'],
+    '#date_repeat_preset_rule_enable' => $field['repeat_preset_rule_enable'],
+    '#date_repeat_preset_rule_checkbox' => $field['repeat_preset_rule_checkbox'],
+    '#date_repeat_preset_rule' => $field['repeat_preset_rule'],
+    '#date_repeat_preset_rule_label' => $field['repeat_preset_rule_label'],
     );
 
   return $element;
@@ -59,27 +63,44 @@ function _date_repeat_widget_validate($e
   $fields = content_fields();
   $field = $fields[$field_name];
   $item = $form_values[$field_name];
-  $values = date_repeat_merge($element['#post'][$field_name]['rrule'], $element['rrule']);
+
+  // if preset rule enabled then use if checkbox is checked then use it's value to set the rrule
+  // otherwise parse form values to create rrule
+  if($element['rrule']['#date_repeat_preset_rule_enable']) {
+    if(!empty($element['#post'][$field_name]['rrule']) && !empty($form_values[$field_name]['value'])) {
+      // checked - set preset repeat rule
+      // $form_values[$field_name]['rrule'] = $element['#post'][$field_name]['rrule'];
+      // use stored value - not on form
+      $form_values[$field_name]['rrule'] = $element['rrule']['#date_repeat_preset_rule'];        
+    } else {
+      // not checked or no date selected - no repeat
+      $form_values[$field_name]['rrule'] = NULL;
+      form_set_value($element, array($form_values[$field_name]), $form_state);
+      return;      
+    }
+  } else {
+    $values = date_repeat_merge($element['#post'][$field_name]['rrule'], $element['rrule']);
   
-  // If no start date was set, clean up the form and return.
-  // If no repeats are set, clean up the form and return.
-  if (empty($form_values[$field_name]['value']) || $values['FREQ'] == 'NONE') {
-    $form_values[$field_name]['rrule'] = NULL;
-    form_set_value($element, array($form_values[$field_name]), $form_state);
-    return;
-  }
-
-  // Require the UNTIL date for now.
-  // The RRULE has already been created by this point, so go back
-  // to the posted values to see if this was filled out.
-  $error_field = implode('][', $element['#parents']) .'][rrule][UNTIL][datetime][date';
-  if (empty($values['UNTIL']['datetime'])) {
-    form_set_error($error_field, t('The UNTIL value is required for repeating dates.'));
-  }
-  if (form_get_errors()) {
-    return;
+    // If no start date was set, clean up the form and return.
+    // If no repeats are set, clean up the form and return.
+    if (empty($form_values[$field_name]['value']) || $values['FREQ'] == 'NONE') {
+      $form_values[$field_name]['rrule'] = NULL;
+      form_set_value($element, array($form_values[$field_name]), $form_state);
+      return;
+    }
+
+    // Require the UNTIL date for now.
+    // The RRULE has already been created by this point, so go back
+    // to the posted values to see if this was filled out.
+    $error_field = implode('][', $element['#parents']) .'][rrule][UNTIL][datetime][date';
+    if (empty($values['UNTIL']['datetime'])) {
+      form_set_error($error_field, t('The UNTIL value is required for repeating dates.'));
+    }
+    if (form_get_errors()) {
+      return;
+    }
   }
-
+  
   // If the rule, the start date, or the end date have changed, re-calculate
   // the repeating dates, wipe out the previous values, and populate the
   // field with the new values.
@@ -128,7 +149,19 @@ function date_repeat_build_dates($rrule 
     $rrule = date_api_ical_build_rrule($values);
   }
   elseif (empty($values)) {
-    $values = date_ical_parse($rrule);
+    if($field['repeat_preset_rule_enable']) {
+      
+      // split out different bits of rrule and parse - this code borrowed from date_ical_parse
+      preg_match('/([^;:]+)(?:;([^:]*))?:(.+)/', $rrule, $matches);
+      $rr_name = !empty($matches[1]) ? strtoupper(trim($matches[1])) : '';
+      $rr_field = !empty($matches[2]) ? $matches[2] : '';
+      $rr_data = !empty($matches[3]) ? $matches[3] : '';
+      
+      // use this method as date_ical_parse expects an ical file beginning with BEGIN:VCALENDAR
+      $values = date_ical_parse_rrule($rr_field, $rr_data);
+    } else {
+      $values = date_ical_parse($rrule);      
+    }
   }
     
   // By the time we get here, the start and end dates have been 
@@ -136,6 +169,7 @@ function date_repeat_build_dates($rrule 
   // things like '+1 Tuesday', so adjust back to localtime.
   $timezone = date_get_timezone($field['tz_handling'], $item['timezone']);
   $timezone_db = date_get_timezone_db($field['tz_handling']);
+  
   $start = date_make_date($item['value'], $timezone_db, $field['type'], $field['granularity']);
   if ($timezone != $timezone_db){
     date_timezone_set($start, timezone_open($timezone));
@@ -150,7 +184,7 @@ function date_repeat_build_dates($rrule 
 
   $duration = date_difference($start, $end);
   $start_datetime = date_format($start, DATE_FORMAT_DATETIME);
-    
+
   if (!empty($values['UNTIL']['datetime'])) {
     $end = date_ical_date($values['UNTIL'], $timezone);
   }
Index: date_repeat/date_repeat_form.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_repeat/date_repeat_form.inc,v
retrieving revision 1.15.4.13
diff -u -p -r1.15.4.13 date_repeat_form.inc
--- date_repeat/date_repeat_form.inc	16 Feb 2009 23:46:08 -0000	1.15.4.13
+++ date_repeat/date_repeat_form.inc	24 Mar 2009 17:14:20 -0000
@@ -47,141 +47,73 @@ function _date_repeat_rrule_process($ele
   else {
     $rrule = $element['#value'];
   }
-  // Empty the original string value of the RRULE so we can create
-  // an array of values for the form from the RRULE's contents.
-  $element['#value'] = '';
-
-  $parts = date_repeat_split_rrule($rrule);
-  $rrule = $parts[0];
-  $exceptions = $parts[1];
-  $timezone = !empty($element['#date_timezone']) ? $element['#date_timezone'] : date_default_timezone_name();
-  $merged_values = date_repeat_merge($rrule, $element);
   
-  $UNTIL = '';
-  if (!empty($merged_values['UNTIL']['datetime'])) {
-    $until_date = date_make_date($merged_values['UNTIL']['datetime'], $merged_values['UNTIL']['tz']);
-    date_timezone_set($until_date, timezone_open($timezone));
-    $UNTIL = date_format($until_date, DATE_FORMAT_DATETIME);
-  }
-  $parent_collapsed = !empty($rrule['INTERVAL']) || !empty($rrule['FREQ']) ? 0 : (!empty($element['#date_repeat_collapsed']) ? $element['#date_repeat_collapsed'] : 0);
-  $element['#type'] = 'fieldset';
-  $element['#title'] = t('Repeat');
-  $element['#description'] = theme('advanced_help_topic', 'date_api', 'date-repeat-form') . t('Choose a frequency and period to repeat this date. If nothing is selected, the date will not repeat.');
-  $element['#collapsible'] = TRUE;
-  $element['#collapsed'] = $parent_collapsed;
+  if($element['#date_repeat_preset_rule_enable']) {
+    // preset rule - set this element to be a single check box whose value is rrule
+    if($element['#date_repeat_preset_rule_checkbox']) {
+      $element['#type'] = 'checkbox';
+      $element['#title'] = t($element['#date_repeat_preset_rule_label']);
+      $element['#return_value'] = 1;      
+    } else {
+      $element['#type'] = 'hidden';
+      $element['#value'] = 1;      
+    }
+  } else {  
+    // Empty the original string value of the RRULE so we can create
+    // an array of values for the form from the RRULE's contents.
+    $element['#value'] = '';
+
+    $parts = date_repeat_split_rrule($rrule);
+    $rrule = $parts[0];
+    $exceptions = $parts[1];
+    $timezone = !empty($element['#date_timezone']) ? $element['#date_timezone'] : date_default_timezone_name();
+    $merged_values = date_repeat_merge($rrule, $element);
   
-  // Make sure we don't get floating parts where we don't want them.
-  $element['#prefix'] = '<div class="date-clear">';
-  $element['#suffix'] = '</div>';
+    $UNTIL = '';
+    if (!empty($merged_values['UNTIL']['datetime'])) {
+      $until_date = date_make_date($merged_values['UNTIL']['datetime'], $merged_values['UNTIL']['tz']);
+      date_timezone_set($until_date, timezone_open($timezone));
+      $UNTIL = date_format($until_date, DATE_FORMAT_DATETIME);
+    }
+    $parent_collapsed = !empty($rrule['INTERVAL']) || !empty($rrule['FREQ']) ? 0 : (!empty($element['#date_repeat_collapsed']) ? $element['#date_repeat_collapsed'] : 0);
+    $element['#type'] = 'fieldset';
+    $element['#title'] = t('Repeat');
+    $element['#description'] = theme('advanced_help_topic', 'date_api', 'date-repeat-form') . t('Choose a frequency and period to repeat this date. If nothing is selected, the date will not repeat.');
+    $element['#collapsible'] = TRUE;
+    $element['#collapsed'] = $parent_collapsed;
   
-  $element['INTERVAL'] = array(
-    '#type' => 'select',
-    //'#title' => t('Interval'),
-    '#default_value' => (!empty($rrule['INTERVAL']) ? $rrule['INTERVAL'] : 0),
-    '#options' => INTERVAL_options(),
-    '#prefix' => '<div class="date-repeat-input">',
-    '#suffix' => '</div>',
-  );
-
-  $element['FREQ'] = array(
-    '#type' => 'select',
-    //'#title' => t('Frequency'),
-    '#default_value' => !empty($rrule['FREQ']) ? $rrule['FREQ'] : 'NONE',
-    '#options' => FREQ_options(),
-    '#prefix' => '<div class="date-repeat-input">',
-    '#suffix' => '</div>',
-  );
-
-  $element['UNTIL'] = array(
-    '#tree' => TRUE,
-    '#prefix' => '<div class="date-clear">',
-    '#suffix' => '</div>',
-    'datetime' => array(
-      '#type' => $element['#date_repeat_widget'],
-      '#title' => t('Until'),
-      '#description' => t('Date to stop repeating this item.'),
-      '#default_value' => $UNTIL,
-      '#date_timezone' => $timezone,
-      '#date_format' => !empty($element['#date_format']) ? $element['#date_format'] : 'Y-m-d',
-      '#date_text_parts'  => !empty($element['#date_text_parts']) ? $element['#date_text_parts'] : array(),
-      '#date_year_range'  => !empty($element['#date_year_range']) ? $element['#date_year_range'] : '-3:+3',
-      '#date_label_position' => !empty($element['#date_label_position']) ? $element['#date_label_position'] : 'within',
-      ),
-    'tz' => array('#type' => 'hidden', '#value' => $element['#date_timezone']),
-    'all_day' => array('#type' => 'hidden', '#value' => 1),
-    'granularity' => array('#type' => 'hidden', '#value' => serialize(array('year', 'month', 'day'))),
-    );
+    // Make sure we don't get floating parts where we don't want them.
+    $element['#prefix'] = '<div class="date-clear">';
+    $element['#suffix'] = '</div>';
   
-  $collapsed = TRUE;
-  if (!empty($merged_values['BYDAY']) || !empty($merged_values['BYMONTH'])) {
-    $collapsed = FALSE;
-  }
-	// start the advanced fieldset
-  $element['advanced'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Advanced'),
-    '#collapsible' => TRUE,
-    '#collapsed' => $collapsed,
-    '#description' => t("If no advanced options are selected, the date will repeat on the day of week of the start date for weekly repeats, otherwise on the month and day of the start date. Use the options below to override that behavior to select specific months and days to repeat on. Use the 'Except' box to input dates that should be omitted from the results.") .' ',
-    '#prefix' => '<div class="date-clear">',
-    '#suffix' => '</div>',
+    $element['INTERVAL'] = array(
+      '#type' => 'select',
+      //'#title' => t('Interval'),
+      '#default_value' => (!empty($rrule['INTERVAL']) ? $rrule['INTERVAL'] : 0),
+      '#options' => INTERVAL_options(),
+      '#prefix' => '<div class="date-repeat-input">',
+      '#suffix' => '</div>',
     );
 
-  $element['advanced']['BYMONTH'] = array(
-    '#type' => 'select',
-    '#title' => date_t('Month', 'datetime'),
-    '#default_value' => !empty($rrule['BYMONTH']) ? $rrule['BYMONTH'] : '',
-    '#options' => array('' => t('-- Any')) + date_month_names(TRUE),
-    '#multiple' => TRUE,
-    '#size' => 10,
-    '#prefix' => '<div class="date-repeat-input">',
-    '#suffix' => '</div>',
-  );
-
-  $element['advanced']['BYMONTHDAY'] = array(
-    '#type' => 'select',
-    '#title' => t('Day of Month'),
-    '#default_value' => !empty($rrule['BYMONTHDAY']) ? $rrule['BYMONTHDAY'] : '',
-    '#options' => array('' => t('-- Any')) + drupal_map_assoc(range(1, 31)) + drupal_map_assoc(range(-1, -31)),
-    '#multiple' => TRUE,
-    '#size' => 10,
-    '#prefix' => '<div class="date-repeat-input">',
-    '#suffix' => '</div>',
-  );
-
-  $element['advanced']['BYDAY'] = array(
-    '#type' => 'select',
-    '#title' => t('Day of Week'),
-    '#default_value' => !empty($rrule['BYDAY']) ? $rrule['BYDAY'] : '',
-    '#options' => array('' => t('-- Any')) + date_repeat_dow_options(),
-    //'#attributes' => array('size' => '5'),
-    '#multiple' => TRUE,
-    '#size' => 10,
-    '#prefix' => '<div class="date-repeat-input">',
-    '#suffix' => '</div>',
-  );
-
-  $element['exceptions'] = array(
-    '#type' => 'fieldset',
-    '#collapsible' => TRUE,
-    '#collapsed' => empty($exceptions) ? TRUE : FALSE,
-    '#title' => t('Except'),
-    '#description' => t('Dates to omit from the list of repeating dates.'),
-    '#prefix' => '<div class="date-repeat">',
-    '#suffix' => '</div>',
+    $element['FREQ'] = array(
+      '#type' => 'select',
+      //'#title' => t('Frequency'),
+      '#default_value' => !empty($rrule['FREQ']) ? $rrule['FREQ'] : 'NONE',
+      '#options' => FREQ_options(),
+      '#prefix' => '<div class="date-repeat-input">',
+      '#suffix' => '</div>',
     );
-  $max = !empty($exceptions) ? sizeof($exceptions) : 0;
-  for ($i = 0; $i <= $max; $i++) {
-    $EXCEPT = '';
-    if (!empty($exceptions[$i]['datetime'])) {
-      $EXCEPT = $exceptions[$i]['datetime'];
-    }
-    $element['exceptions']['EXDATE'][$i] = array(
+
+    $element['UNTIL'] = array(
       '#tree' => TRUE,
+      '#prefix' => '<div class="date-clear">',
+      '#suffix' => '</div>',
       'datetime' => array(
         '#type' => $element['#date_repeat_widget'],
-        '#default_value' => $EXCEPT,
-        '#date_timezone' => !empty($element['#date_timezone']) ? $element['#date_timezone'] : date_default_timezone_name(),
+        '#title' => t('Until'),
+        '#description' => t('Date to stop repeating this item.'),
+        '#default_value' => $UNTIL,
+        '#date_timezone' => $timezone,
         '#date_format' => !empty($element['#date_format']) ? $element['#date_format'] : 'Y-m-d',
         '#date_text_parts'  => !empty($element['#date_text_parts']) ? $element['#date_text_parts'] : array(),
         '#date_year_range'  => !empty($element['#date_year_range']) ? $element['#date_year_range'] : '-3:+3',
@@ -191,6 +123,87 @@ function _date_repeat_rrule_process($ele
       'all_day' => array('#type' => 'hidden', '#value' => 1),
       'granularity' => array('#type' => 'hidden', '#value' => serialize(array('year', 'month', 'day'))),
       );
+  
+    $collapsed = TRUE;
+    if (!empty($merged_values['BYDAY']) || !empty($merged_values['BYMONTH'])) {
+      $collapsed = FALSE;
+    }
+  	// start the advanced fieldset
+    $element['advanced'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Advanced'),
+      '#collapsible' => TRUE,
+      '#collapsed' => $collapsed,
+      '#description' => t("If no advanced options are selected, the date will repeat on the day of week of the start date for weekly repeats, otherwise on the month and day of the start date. Use the options below to override that behavior to select specific months and days to repeat on. Use the 'Except' box to input dates that should be omitted from the results.") .' ',
+      '#prefix' => '<div class="date-clear">',
+      '#suffix' => '</div>',
+      );
+
+    $element['advanced']['BYMONTH'] = array(
+      '#type' => 'select',
+      '#title' => date_t('Month', 'datetime'),
+      '#default_value' => !empty($rrule['BYMONTH']) ? $rrule['BYMONTH'] : '',
+      '#options' => array('' => t('-- Any')) + date_month_names(TRUE),
+      '#multiple' => TRUE,
+      '#size' => 10,
+      '#prefix' => '<div class="date-repeat-input">',
+      '#suffix' => '</div>',
+    );
+
+    $element['advanced']['BYMONTHDAY'] = array(
+      '#type' => 'select',
+      '#title' => t('Day of Month'),
+      '#default_value' => !empty($rrule['BYMONTHDAY']) ? $rrule['BYMONTHDAY'] : '',
+      '#options' => array('' => t('-- Any')) + drupal_map_assoc(range(1, 31)) + drupal_map_assoc(range(-1, -31)),
+      '#multiple' => TRUE,
+      '#size' => 10,
+      '#prefix' => '<div class="date-repeat-input">',
+      '#suffix' => '</div>',
+    );
+
+    $element['advanced']['BYDAY'] = array(
+      '#type' => 'select',
+      '#title' => t('Day of Week'),
+      '#default_value' => !empty($rrule['BYDAY']) ? $rrule['BYDAY'] : '',
+      '#options' => array('' => t('-- Any')) + date_repeat_dow_options(),
+      //'#attributes' => array('size' => '5'),
+      '#multiple' => TRUE,
+      '#size' => 10,
+      '#prefix' => '<div class="date-repeat-input">',
+      '#suffix' => '</div>',
+    );
+
+    $element['exceptions'] = array(
+      '#type' => 'fieldset',
+      '#collapsible' => TRUE,
+      '#collapsed' => empty($exceptions) ? TRUE : FALSE,
+      '#title' => t('Except'),
+      '#description' => t('Dates to omit from the list of repeating dates.'),
+      '#prefix' => '<div class="date-repeat">',
+      '#suffix' => '</div>',
+      );
+    $max = !empty($exceptions) ? sizeof($exceptions) : 0;
+    for ($i = 0; $i <= $max; $i++) {
+      $EXCEPT = '';
+      if (!empty($exceptions[$i]['datetime'])) {
+        $EXCEPT = $exceptions[$i]['datetime'];
+      }
+      $element['exceptions']['EXDATE'][$i] = array(
+        '#tree' => TRUE,
+        'datetime' => array(
+          '#type' => $element['#date_repeat_widget'],
+          '#default_value' => $EXCEPT,
+          '#date_timezone' => !empty($element['#date_timezone']) ? $element['#date_timezone'] : date_default_timezone_name(),
+          '#date_format' => !empty($element['#date_format']) ? $element['#date_format'] : 'Y-m-d',
+          '#date_text_parts'  => !empty($element['#date_text_parts']) ? $element['#date_text_parts'] : array(),
+          '#date_year_range'  => !empty($element['#date_year_range']) ? $element['#date_year_range'] : '-3:+3',
+          '#date_label_position' => !empty($element['#date_label_position']) ? $element['#date_label_position'] : 'within',
+          ),
+        'tz' => array('#type' => 'hidden', '#value' => $element['#date_timezone']),
+        'all_day' => array('#type' => 'hidden', '#value' => 1),
+        'granularity' => array('#type' => 'hidden', '#value' => serialize(array('year', 'month', 'day'))),
+        );
+    }
   }
   return $element;
 }
