'select',
'#title' => t('Repeats', array(), array('context' => 'Date repeat')),
'#default_value' => !empty($rrule['FREQ']) ? $rrule['FREQ'] : 'WEEKLY',
'#options' => date_repeat_freq_options(),
'#prefix' => '
',
'#suffix' => '
',
);
$element['daily'] = array(
'#type' => 'container',
'#tree' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'DAILY'),
),
),
);
$element['weekly'] = array(
'#type' => 'container',
'#tree' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'WEEKLY'),
),
),
);
$element['monthly'] = array(
'#type' => 'container',
'#tree' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'MONTHLY'),
),
),
);
$element['yearly'] = array(
'#type' => 'container',
'#tree' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'YEARLY'),
),
),
);
list($prefix, $suffix) = explode('@interval', t('Every @interval days', array(), array('context' => 'Date repeat')));
$daily_interval = array(
'#type' => 'textfield',
'#title' => t('Repeats', array(), array('context' => 'Date repeat')),
'#title_display' => 'invisible',
'#default_value' => (!empty($rrule['INTERVAL']) ? $rrule['INTERVAL'] : 1),
'#element_validate' => array('element_validate_integer_positive'),
'#attributes' => array('placeholder' => array('#')),
'#size' => 3,
'#maxlength' => 3,
'#prefix' => '',
'#suffix' => t('days') . '
',
'#field_prefix' => $prefix,
'#field_suffix' => $suffix,
);
list($prefix, $suffix) = explode('@interval', t('Every @interval weeks', array(), array('context' => 'Date repeat')));
$element['weekly']['INTERVAL'] = array(
'#type' => 'textfield',
'#title' => t('Repeats', array(), array('context' => 'Date repeat')),
'#default_value' => (!empty($rrule['INTERVAL']) ? $rrule['INTERVAL'] : 1),
'#element_validate' => array('element_validate_integer_positive'),
'#attributes' => array('placeholder' => array('#')),
'#size' => 3,
'#maxlength' => 3,
'#prefix' => '',
'#suffix' => '
',
'#field_prefix' => $prefix,
'#field_suffix' => $suffix,
);
list($prefix, $suffix) = explode('@interval', t('Every @interval months', array(), array('context' => 'Date repeat')));
$element['monthly']['INTERVAL'] = array(
'#access' => FALSE,
'#type' => 'textfield',
'#title' => t('Repeats', array(), array('context' => 'Date repeat')),
'#default_value' => (!empty($rrule['INTERVAL']) ? $rrule['INTERVAL'] : 1),
'#element_validate' => array('element_validate_integer_positive'),
'#attributes' => array('placeholder' => array('#')),
'#size' => 3,
'#maxlength' => 3,
'#prefix' => '',
'#suffix' => '
',
'#field_prefix' => $prefix,
'#field_suffix' => $suffix,
);
list($prefix, $suffix) = explode('@interval', t('Every @interval years', array(), array('context' => 'Date repeat')));
$element['yearly']['INTERVAL'] = array(
'#type' => 'textfield',
'#title' => t('Repeats', array(), array('context' => 'Date repeat')),
'#default_value' => (!empty($rrule['INTERVAL']) ? $rrule['INTERVAL'] : 1),
'#element_validate' => array('element_validate_integer_positive'),
'#attributes' => array('placeholder' => array('#')),
'#size' => 3,
'#maxlength' => 3,
'#prefix' => '',
'#suffix' => '
',
'#field_prefix' => $prefix,
'#field_suffix' => $suffix,
);
$options = date_repeat_dow_day_options_abbr(TRUE);
$options = date_repeat_dow_day_options_ordered($options);
$element['weekly']['BYDAY'] = array(
'#type' => 'checkboxes',
'#title' => t('Repeat on', array(), array('context' => 'Date repeat')),
'#default_value' => !empty($rrule['BYDAY']) && $rrule['FREQ'] === 'WEEKLY' ? $rrule['BYDAY'] : array(),
'#options' => $options,
'#attributes' => array('class' => array('container-inline byday')),
'#multiple' => TRUE,
'#prefix' => '',
'#suffix' => '
',
);
$daily_radios_default = 'INTERVAL';
if (isset($rrule['FREQ']) && $rrule['FREQ'] === 'DAILY' && !empty($rrule['BYDAY'])) {
switch (count($rrule['BYDAY'])) {
case 2:
$daily_radios_default = 'every_tu_th';
break;
case 3:
$daily_radios_default = 'every_mo_we_fr';
break;
case 5:
$daily_radios_default = 'every_weekday';
break;
}
}
$daily_every_weekday = array(
'#type' => 'item',
'#markup' => '' . t('Every weekday', array(), array('context' => 'Date repeat')) . '
',
);
$daily_mo_we_fr = array(
'#type' => 'item',
'#markup' => '' . t('Every Mon, Wed, Fri', array(), array('context' => 'Date repeat')) . '
',
);
$daily_tu_th = array(
'#type' => 'item',
'#markup' => '' . t('Every Tue, Thu', array(), array('context' => 'Date repeat')) . '
',
);
$element['daily']['byday_radios'] = array(
'#type' => 'date_repeat_form_element_radios',
'#tree' => TRUE,
'#title' => t('Repeats every', array(), array('context' => 'Date repeat')),
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'DAILY'),
),
),
'#default_value' => $daily_radios_default,
'#options' => array(
'INTERVAL' => t('interval'),
'every_weekday' => t('every weekday'),
'every_mo_we_fr' => t('monday wednesday friday'),
'every_tu_th' => t('tuesday thursday'),
),
'INTERVAL_child' => $daily_interval,
'every_weekday_child' => $daily_every_weekday,
'mo_we_fr_child' => $daily_mo_we_fr,
'tu_th_child' => $daily_tu_th,
'#div_classes' => array(
'container-inline interval',
'container-inline weekday',
'container-inline mo-we-fr',
'container-inline tu-th',
),
);
$monthly_day_month_default = 'BYMONTHDAY_BYMONTH';
if (isset($rrule['FREQ']) && $rrule['FREQ'] === 'MONTHLY' && !empty($rrule['BYDAY'])) {
$monthly_day_month_default = 'BYDAY_BYMONTH';
}
$monthly_on_day_bymonthday_of_bymonth = array(
'#type' => 'container',
'#tree' => TRUE,
);
list($bymonthday_title, $bymonthday_suffix) = explode('@bymonthday', t('On day @bymonthday of', array(), array('context' => 'Date repeat')));
$monthly_on_day_bymonthday_of_bymonth['BYMONTHDAY'] = array(
'#type' => 'select',
'#title' => $bymonthday_title,
'#default_value' => !empty($rrule['BYMONTHDAY']) && $rrule['FREQ'] === 'MONTHLY' ? $rrule['BYMONTHDAY'] : '',
'#options' => drupal_map_assoc(range(1, 31)) + drupal_map_assoc(range(-1, -31)),
'#multiple' => FALSE,
'#prefix' => '',
'#suffix' => '
',
'#field_suffix' => $bymonthday_suffix,
);
$monthly_on_day_bymonthday_of_bymonth['BYMONTH'] = array(
'#type' => 'checkboxes',
'#title' => t('Bymonth', array(), array('context' => 'Date repeat')),
'#title_display' => 'invisible',
'#default_value' => !empty($rrule['BYMONTH']) && $rrule['FREQ'] === 'MONTHLY' && $monthly_day_month_default === 'BYMONTHDAY_BYMONTH' ? $rrule['BYMONTH'] : array(),
'#options' => date_month_names_abbr(TRUE),
'#attributes' => array('class' => array('container-inline')),
'#multiple' => TRUE,
'#prefix' => '',
'#suffix' => '
',
);
$monthly_on_the_byday_of_bymonth = array(
'#type' => 'container',
'#tree' => TRUE,
);
$monthly_byday_count = '';
$monthly_byday_day = '';
if (isset($rrule['BYDAY']) && !empty($rrule['BYDAY']) && $rrule['FREQ'] === 'MONTHLY') {
$monthly_byday_count = substr($rrule['BYDAY'][0], 0, -2);
$monthly_byday_day = substr($rrule['BYDAY'][0], -2);;
}
list($byday_count_title, $byday_day_title) = explode('@byday', t('On the @byday of', array(), array('context' => 'Date repeat')));
$monthly_on_the_byday_of_bymonth['BYDAY_COUNT'] = array(
'#type' => 'select',
'#title' => $byday_count_title,
'#default_value' => !empty($monthly_byday_count) ? $monthly_byday_count : '',
'#options' => date_order_translated(),
'#multiple' => FALSE,
'#prefix' => '',
'#suffix' => '
',
);
$monthly_on_the_byday_of_bymonth['BYDAY_DAY'] = array(
'#type' => 'select',
'#title' => $byday_day_title,
'#title_display' => 'after',
'#default_value' => !empty($monthly_byday_day) ? $monthly_byday_day : '',
'#options' => date_repeat_dow_day_options(TRUE),
'#multiple' => FALSE,
'#prefix' => '',
'#suffix' => '
',
);
$monthly_on_the_byday_of_bymonth['BYMONTH'] = array(
'#type' => 'checkboxes',
'#title' => t('Bymonth', array(), array('context' => 'Date repeat')),
'#title_display' => 'invisible',
'#default_value' => !empty($rrule['BYMONTH']) && $rrule['FREQ'] === 'MONTHLY' && $monthly_day_month_default === 'BYDAY_BYMONTH' ? $rrule['BYMONTH'] : array(),
'#options' => date_month_names_abbr(TRUE),
'#attributes' => array('class' => array('container-inline')),
'#multiple' => TRUE,
'#prefix' => '',
'#suffix' => '
',
);
$element['monthly']['day_month'] = array(
'#type' => 'date_repeat_form_element_radios',
'#tree' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'MONTHLY'),
),
),
'#attributes' => array('class' => array('date-repeat-radios clearfix')),
'#default_value' => $monthly_day_month_default,
'#options' => array(
'BYMONTHDAY_BYMONTH' => t('On day ... of ...'),
'BYDAY_BYMONTH' => t('On the ... of ...'),
),
'BYMONTHDAY_BYMONTH_child' => $monthly_on_day_bymonthday_of_bymonth,
'BYDAY_BYMONTH_child' => $monthly_on_the_byday_of_bymonth,
'#div_classes' => array(
'date-repeat-radios-item date-clear clearfix bymonthday-bymonth',
'date-repeat-radios-item date-clear clearfix byday-bymonth',
),
);
$yearly_day_month_default = 'BYMONTHDAY_BYMONTH';
if (isset($rrule['FREQ']) && $rrule['FREQ'] === 'YEARLY' && !empty($rrule['BYDAY'])) {
$yearly_day_month_default = 'BYDAY_BYMONTH';
}
$yearly_on_day_bymonthday_of_bymonth = array(
'#type' => 'container',
'#tree' => TRUE,
);
list($bymonthday_title, $bymonthday_suffix) = explode('@bymonthday', t('On day @bymonthday of', array(), array('context' => 'Date repeat')));
$yearly_on_day_bymonthday_of_bymonth['BYMONTHDAY'] = array(
'#type' => 'select',
'#title' => $bymonthday_title,
'#default_value' => !empty($rrule['BYMONTHDAY']) && $rrule['FREQ'] === 'YEARLY' ? $rrule['BYMONTHDAY'] : '',
'#options' => drupal_map_assoc(range(1, 31)) + drupal_map_assoc(range(-1, -31)),
'#multiple' => FALSE,
'#prefix' => '',
'#suffix' => '
',
'#field_suffix' => $bymonthday_suffix,
);
$yearly_on_day_bymonthday_of_bymonth['BYMONTH'] = array(
'#type' => 'checkboxes',
'#title' => t('Bymonth', array(), array('context' => 'Date repeat')),
'#title_display' => 'invisible',
'#default_value' => !empty($rrule['BYMONTH']) && $rrule['FREQ'] === 'YEARLY' && $yearly_day_month_default === 'BYMONTHDAY_BYMONTH' ? $rrule['BYMONTH'] : array(),
'#options' => date_month_names_abbr(TRUE),
'#attributes' => array('class' => array('container-inline')),
'#multiple' => TRUE,
'#prefix' => '',
'#suffix' => '
',
);
$yearly_on_the_byday_of_bymonth = array(
'#type' => 'container',
'#tree' => TRUE,
);
$yearly_byday_count = '';
$yearly_byday_day = '';
if (isset($rrule['BYDAY']) && !empty($rrule['BYDAY']) && $rrule['FREQ'] === 'YEARLY') {
$yearly_byday_count = substr($rrule['BYDAY'][0], 0, -2);
$yearly_byday_day = substr($rrule['BYDAY'][0], -2);;
}
list($byday_count_title, $byday_day_title) = explode('@byday', t('On the @byday of', array(), array('context' => 'Date repeat')));
$yearly_on_the_byday_of_bymonth['BYDAY_COUNT'] = array(
'#type' => 'select',
'#title' => $byday_count_title,
'#default_value' => !empty($yearly_byday_count) ? $yearly_byday_count : '',
'#options' => date_order_translated(),
'#multiple' => FALSE,
'#prefix' => '',
'#suffix' => '
',
);
$yearly_on_the_byday_of_bymonth['BYDAY_DAY'] = array(
'#type' => 'select',
'#title' => $byday_day_title,
'#title_display' => 'after',
'#default_value' => !empty($yearly_byday_day) ? $yearly_byday_day : '',
'#options' => date_repeat_dow_day_options(TRUE),
'#multiple' => FALSE,
'#prefix' => '',
'#suffix' => '
',
);
$yearly_on_the_byday_of_bymonth['BYMONTH'] = array(
'#type' => 'checkboxes',
'#title' => t('Bymonth', array(), array('context' => 'Date repeat')),
'#title_display' => 'invisible',
'#default_value' => !empty($rrule['BYMONTH']) && $rrule['FREQ'] === 'YEARLY' && $yearly_day_month_default === 'BYDAY_BYMONTH' ? $rrule['BYMONTH'] : array(),
'#options' => date_month_names_abbr(TRUE),
'#attributes' => array('class' => array('container-inline')),
'#multiple' => TRUE,
'#prefix' => '',
'#suffix' => '
',
);
$element['yearly']['day_month'] = array(
'#type' => 'date_repeat_form_element_radios',
'#tree' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'YEARLY'),
),
),
'#attributes' => array('class' => array('date-repeat-radios clearfix')),
'#default_value' => $yearly_day_month_default,
'#options' => array(
'BYMONTHDAY_BYMONTH' => t('On day ... of ...'),
'BYDAY_BYMONTH' => t('On the ... of ...'),
),
'BYMONTHDAY_BYMONTH_child' => $yearly_on_day_bymonthday_of_bymonth,
'BYDAY_BYMONTH_child' => $yearly_on_the_byday_of_bymonth,
'#div_classes' => array(
'date-repeat-radios-item date-clear clearfix bymonthday-bymonth',
'date-repeat-radios-item date-clear clearfix byday-bymonth',
),
);
list($prefix, $suffix) = explode('@count', t('After @count occurrences', array(), array('context' => 'Date repeat')));
$count_form_element = array(
'#type' => 'textfield',
'#title' => t('Count', array(), array('context' => 'Date repeat')),
'#default_value' => $count,
'#element_validate' => array('element_validate_integer_positive'),
'#attributes' => array('placeholder' => array('#')),
'#prefix' => $prefix,
'#suffix' => $suffix,
'#size' => 10,
'#maxlength' => 10,
);
$until_form_element = array(
'#type' => 'container',
'#tree' => TRUE,
'#prefix' => '' . t('On', array(), array('context' => 'Date repeat')) . '
',
'datetime' => array(
'#type' => $element['#date_repeat_widget'],
'#title' => t('Until', array(), array('context' => 'Date repeat')),
'#title_display' => 'invisible',
'#default_value' => $until,
'#date_format' => !empty($element['#date_format']) ?
date_limit_format($element['#date_format'], array('year', 'month', 'day')) : 'Y-m-d',
'#date_timezone' => $timezone,
'#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',
'#date_flexible' => 0,
),
'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')),
),
);
$range_of_repeat_default = 'COUNT';
if (!empty($until)) {
$range_of_repeat_default = 'UNTIL';
}
$element['range_of_repeat'] = array(
'#type' => 'date_repeat_form_element_radios',
'#tree' => TRUE,
'#title' => t('Stop repeating', array(), array('context' => 'Date repeat')),
'#title_display' => 'before',
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'invisible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'NONE'),
),
),
'#default_value' => $range_of_repeat_default,
'#options' => array(
'COUNT' => t('Count'),
'UNTIL' => t('Until'),
),
'count_child' => $count_form_element,
'until_child' => $until_form_element,
'#div_classes' => array(
'container-inline count',
"until widget-{$element['#date_repeat_widget']} label-{$element['#date_label_position']}",
),
);
$parents = $element['#array_parents'];
$instance = implode('-', $parents);
// Make sure this will work right either in the normal
// form or in an ajax callback from the 'Add more' button.
if (empty($form_state['num_exceptions'][$instance])) {
$form_state['num_exceptions'][$instance] = count($exceptions);
}
if ($form_state['num_exceptions'][$instance] == 0) {
$collapsed = TRUE;
}
else {
$collapsed = FALSE;
}
$element['show_exceptions'] = array(
'#type' => 'checkbox',
'#title' => t('Exclude dates', array(), array('context' => 'Date repeat')),
'#states' => array(
'invisible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'NONE'),
),
),
'#default_value' => empty($form_state['num_exceptions'][$instance]) ? 0 : 1,
);
$element['exceptions'] = array(
'#type' => 'container',
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[show_exceptions]\"]" => array('checked' => TRUE),
),
),
);
for ($i = 0; $i < max($form_state['num_exceptions'][$instance], 1); $i++) {
$except = '';
if (!empty($exceptions[$i]['datetime'])) {
$ex_date = new DateObject($exceptions[$i]['datetime'], $exceptions[$i]['tz']);
date_timezone_set($ex_date, timezone_open($timezone));
$except = date_format($ex_date, DATE_FORMAT_DATETIME);
}
$date_format = 'Y-m-d';
if (!empty($element['#date_format'])) {
$grans = array('year', 'month', 'day');
$date_format = date_limit_format($element['#date_format'], $grans);
}
$element['exceptions']['EXDATE'][$i] = array(
'#tree' => TRUE,
'datetime' => array(
'#name' => 'exceptions|' . $instance,
'#type' => $element['#date_repeat_widget'],
'#default_value' => $except,
'#date_timezone' => !empty($element['#date_timezone']) ?
$element['#date_timezone'] : date_default_timezone(),
'#date_format' => $date_format,
'#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',
'#date_flexible' => 0,
),
'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')),
),
);
}
// Collect additions in the same way as exceptions - implements RDATE.
if (empty($form_state['num_additions'][$instance])) {
$form_state['num_additions'][$instance] = count($additions);
}
if ($form_state['num_additions'][$instance] == 0) {
$collapsed = TRUE;
}
else {
$collapsed = FALSE;
}
$element['show_additions'] = array(
'#type' => 'checkbox',
'#title' => t('Include dates', array(), array('context' => 'Date repeat')),
'#states' => array(
'invisible' => array(
":input[name=\"{$element['#name']}[FREQ]\"]" => array('value' => 'NONE'),
),
),
'#default_value' => empty($form_state['num_additions'][$instance]) ? 0 : 1,
);
$element['additions'] = array(
'#type' => 'container',
'#prefix' => '',
'#suffix' => '
',
'#states' => array(
'visible' => array(
":input[name=\"{$element['#name']}[show_additions]\"]" => array('checked' => TRUE),
),
),
);
for ($i = 0; $i < max($form_state['num_additions'][$instance], 1); $i++) {
$r_date = '';
if (!empty($additions[$i]['datetime'])) {
$rdate = new DateObject($additions[$i]['datetime'], $additions[$i]['tz']);
date_timezone_set($rdate, timezone_open($timezone));
$r_date = date_format($rdate, DATE_FORMAT_DATETIME);
}
$date_format = 'Y-m-d';
if (!empty($element['#date_format'])) {
$grans = array('year', 'month', 'day');
$date_format = date_limit_format($element['#date_format'], $grans);
}
$element['additions']['RDATE'][$i] = array(
'#tree' => TRUE,
'datetime' => array(
'#type' => $element['#date_repeat_widget'],
'#name' => 'additions|' . $instance,
'#default_value' => $r_date,
'#date_timezone' => !empty($element['#date_timezone']) ?
$element['#date_timezone'] : date_default_timezone(),
'#date_format' => $date_format,
'#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',
'#date_flexible' => 0,
),
'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')),
),
);
}
$element['exceptions']['exceptions_add'] = array(
'#type' => 'submit',
'#name' => 'exceptions_add|' . $instance,
'#value' => t('Add exception'),
'#submit' => array('date_repeat_add_exception'),
'#limit_validation_errors' => array(),
'#ajax' => array(
'callback' => 'date_repeat_add_exception_callback',
'wrapper' => 'date-repeat-exceptions-' . $instance,
),
);
$element['additions']['additions_add'] = array(
'#type' => 'submit',
'#name' => 'additions_add|' . $instance,
'#value' => t('Add addition'),
'#submit' => array('date_repeat_add_addition'),
'#limit_validation_errors' => array(),
'#ajax' => array(
'callback' => 'date_repeat_add_addition_callback',
'wrapper' => 'date-repeat-additions-' . $instance,
),
);
$element['#date_repeat_collapsed'] = !empty($rrule['INTERVAL']) || !empty($rrule['FREQ']) ? 0 : (!empty($element['#date_repeat_collapsed']) ? $element['#date_repeat_collapsed'] : 0);
return $element;
}
/**
* Add callback to date repeat.
*/
function date_repeat_add_exception_callback($form, &$form_state) {
$parents = $form_state['triggering_element']['#array_parents'];
$button_key = array_pop($parents);
$element = drupal_array_get_nested_value($form, $parents);
return $element;
}
/**
* Add addition callback to date repeat.
*/
function date_repeat_add_addition_callback($form, &$form_state) {
$parents = $form_state['triggering_element']['#array_parents'];
$button_key = array_pop($parents);
$element = drupal_array_get_nested_value($form, $parents);
return $element;
}
/**
* Add exception to date repeat.
*/
function date_repeat_add_exception($form, &$form_state) {
$parents = $form_state['triggering_element']['#array_parents'];
$instance = implode('-', array_slice($parents, 0, count($parents) - 2));
$form_state['num_exceptions'][$instance]++;
$form_state['rebuild'] = TRUE;
}
/**
* Add addition to date repeat.
*/
function date_repeat_add_addition($form, &$form_state) {
$parents = $form_state['triggering_element']['#array_parents'];
$instance = implode('-', array_slice($parents, 0, count($parents) - 2));
$form_state['num_additions'][$instance]++;
$form_state['rebuild'] = TRUE;
}
/**
* Regroup values back into a consistant array, no matter what state it is in.
*/
function date_repeat_merge($form_values, $element) {
if (empty($form_values) || !is_array($form_values)) {
return $form_values;
}
if (array_key_exists('exceptions', $form_values) || array_key_exists('additions', $form_values)) {
if (!array_key_exists('exceptions', $form_values)) {
$form_values['exceptions'] = array();
}
if (!array_key_exists('additions', $form_values)) {
$form_values['additions'] = array();
}
$form_values = array_merge($form_values, (array) $form_values['exceptions'], (array) $form_values['additions']);
unset($form_values['exceptions']);
unset($form_values['additions']);
}
if (array_key_exists('FREQ', $form_values)) {
switch ($form_values['FREQ']) {
case 'DAILY':
if (array_key_exists('daily', $form_values)) {
switch ($form_values['daily']['byday_radios']) {
case 'INTERVAL':
$form_values['INTERVAL'] = $form_values['daily']['INTERVAL_child'];
break;
case 'every_weekday':
$form_values['BYDAY'] = array('MO', 'TU', 'WE', 'TH', 'FR');
break;
case 'every_mo_we_fr':
$form_values['BYDAY'] = array('MO', 'WE', 'FR');
break;
case 'every_tu_th':
$form_values['BYDAY'] = array('TU', 'TH');
break;
}
}
break;
case 'WEEKLY':
if (array_key_exists('weekly', $form_values)) {
$form_values = array_merge($form_values, (array) $form_values['weekly']);
if (array_key_exists('BYDAY', $form_values)) {
$form_values['BYDAY'] = date_repeat_transform_checkbox_values_to_select_values($form_values['BYDAY']);
}
}
break;
case 'MONTHLY':
if (array_key_exists('monthly', $form_values)) {
switch ($form_values['monthly']['day_month']) {
case 'BYMONTHDAY_BYMONTH':
$form_values['monthly'] = array_merge($form_values['monthly'], (array) $form_values['monthly']['BYMONTHDAY_BYMONTH_child']);
break;
case 'BYDAY_BYMONTH':
$form_values['monthly']['BYDAY_BYMONTH_child']['BYDAY'] = $form_values['monthly']['BYDAY_BYMONTH_child']['BYDAY_COUNT'] . $form_values['monthly']['BYDAY_BYMONTH_child']['BYDAY_DAY'];
$form_values['monthly'] = array_merge($form_values['monthly'], (array) $form_values['monthly']['BYDAY_BYMONTH_child']);
break;
}
unset($form_values['monthly']['BYDAY_BYMONTH_child']);
unset($form_values['monthly']['BYMONTHDAY_BYMONTH_child']);
$form_values = array_merge($form_values, (array) $form_values['monthly']);
if (array_key_exists('BYMONTH', $form_values)) {
$form_values['BYMONTH'] = date_repeat_transform_checkbox_values_to_select_values($form_values['BYMONTH']);
}
if (array_key_exists('BYMONTHDAY', $form_values) && !is_array($form_values['BYMONTHDAY'])) {
$form_values['BYMONTHDAY'] = (array) $form_values['BYMONTHDAY'];
}
if (array_key_exists('BYDAY', $form_values) && !is_array($form_values['BYDAY'])) {
$form_values['BYDAY'] = (array) $form_values['BYDAY'];
}
}
break;
case 'YEARLY':
if (array_key_exists('yearly', $form_values)) {
switch ($form_values['yearly']['day_month']) {
case 'BYMONTHDAY_BYMONTH':
$form_values['yearly'] = array_merge($form_values['yearly'], (array) $form_values['yearly']['BYMONTHDAY_BYMONTH_child']);
break;
case 'BYDAY_BYMONTH':
$form_values['yearly']['BYDAY_BYMONTH_child']['BYDAY'] = $form_values['yearly']['BYDAY_BYMONTH_child']['BYDAY_COUNT'] . $form_values['yearly']['BYDAY_BYMONTH_child']['BYDAY_DAY'];
$form_values['yearly'] = array_merge($form_values['yearly'], (array) $form_values['yearly']['BYDAY_BYMONTH_child']);
break;
}
unset($form_values['yearly']['BYDAY_BYMONTH_child']);
unset($form_values['yearly']['BYMONTHDAY_BYMONTH_child']);
$form_values = array_merge($form_values, (array) $form_values['yearly']);
if (array_key_exists('BYMONTH', $form_values)) {
$form_values['BYMONTH'] = date_repeat_transform_checkbox_values_to_select_values($form_values['BYMONTH']);
}
if (array_key_exists('BYMONTHDAY', $form_values) && !is_array($form_values['BYMONTHDAY'])) {
$form_values['BYMONTHDAY'] = (array) $form_values['BYMONTHDAY'];
}
if (array_key_exists('BYDAY', $form_values) && !is_array($form_values['BYDAY'])) {
$form_values['BYDAY'] = (array) $form_values['BYDAY'];
}
}
break;
default:
break;
}
}
unset($form_values['daily']);
unset($form_values['weekly']);
unset($form_values['monthly']);
unset($form_values['yearly']);
if (array_key_exists('range_of_repeat', $form_values)) {
switch ($form_values['range_of_repeat']) {
case 'COUNT':
$form_values['COUNT'] = $form_values['count_child'];
break;
case 'UNTIL':
$form_values['UNTIL'] = $form_values['until_child'];
break;
}
}
unset($form_values['count_child']);
unset($form_values['until_child']);
if (array_key_exists('BYDAY', $form_values) && is_array($form_values['BYDAY'])) {
unset($form_values['BYDAY']['']);
}
if (array_key_exists('BYMONTH', $form_values) && is_array($form_values['BYMONTH'])) {
unset($form_values['BYMONTH']['']);
}
if (array_key_exists('BYMONTHDAY', $form_values) && is_array($form_values['BYMONTHDAY'])) {
unset($form_values['BYMONTHDAY']['']);
}
if (array_key_exists('UNTIL', $form_values) && is_array($form_values['UNTIL']['datetime'])) {
$function = $element['#date_repeat_widget'] . '_input_date';
$until_element = $element;
$until_element['#date_format'] = !empty($element['#date_format']) ?
date_limit_format($element['#date_format'], array('year', 'month', 'day')) : 'Y-m-d';
$date = $function($until_element, $form_values['UNTIL']['datetime']);
$form_values['UNTIL']['datetime'] = is_object($date) ? $date->format(DATE_FORMAT_DATETIME) : '';
}
if (array_key_exists('show_exceptions', $form_values) && $form_values['show_exceptions'] === 0) {
unset($form_values['EXDATE']);
}
if (array_key_exists('EXDATE', $form_values) && is_array($form_values['EXDATE'])) {
$function = $element['#date_repeat_widget'] . '_input_date';
$exdate_element = $element;
$date_format = 'Y-m-d';
if (!empty($element['#date_format'])) {
$grans = array('year', 'month', 'day');
$date_format = date_limit_format($element['#date_format'], $grans);
}
foreach ($form_values['EXDATE'] as $delta => $value) {
if (is_array($value['datetime'])) {
$exdate_element['#date_format'] = $date_format;
$date = $function($exdate_element, $form_values['EXDATE'][$delta]['datetime']);
$form_values['EXDATE'][$delta]['datetime'] = is_object($date) ? $date->format(DATE_FORMAT_DATETIME) : '';
}
}
}
if (array_key_exists('show_additions', $form_values) && $form_values['show_additions'] === 0) {
unset($form_values['RDATE']);
}
if (array_key_exists('RDATE', $form_values) && is_array($form_values['RDATE'])) {
$function = $element['#date_repeat_widget'] . '_input_date';
$rdate_element = $element;
$date_format = 'Y-m-d';
if (!empty($element['#date_format'])) {
$grans = array('year', 'month', 'day');
$date_format = date_limit_format($element['#date_format'], $grans);
}
foreach ($form_values['RDATE'] as $delta => $value) {
if (is_array($value['datetime'])) {
$rdate_element['#date_format'] = $date_format;
$date = $function($rdate_element, $form_values['RDATE'][$delta]['datetime']);
$form_values['RDATE'][$delta]['datetime'] = is_object($date) ? $date->format(DATE_FORMAT_DATETIME) : '';
}
}
}
return $form_values;
}
/**
* Build a RRULE out of the form values.
*/
function date_repeat_rrule_validate($element, &$form_state) {
if (date_hidden_element($element)) {
return;
}
$parents = $element['#parents'];
array_pop($parents);
$field_values = drupal_array_get_nested_value($form_state['values'], $parents);
if ($field_values['show_repeat_settings'] === 0 || $field_values['rrule']['FREQ'] === 'NONE') {
form_set_value($element, NULL, $form_state);
return;
}
// Clean the buttons off of the form. Needed to avoid errors when
// the date is used on a user object, which then passes the form
// through form_state_values_clean().
foreach ($form_state['buttons'] as $delta => $item) {
if (!empty($item['#ajax']['callback']) && in_array($item['#ajax']['callback'], array('date_repeat_add_exception_callback', 'date_repeat_add_addition_callback'))) {
unset($form_state['buttons'][$delta]);
}
}
module_load_include('inc', 'date_api', 'date_api_ical');
$item = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
$item = date_repeat_merge($item, $element);
$rrule = date_api_ical_build_rrule($item);
form_set_value($element, $rrule, $form_state);
}
/**
* Theme the exception list as a table so the buttons line up.
*/
function theme_date_repeat_current_exceptions($vars) {
$rows = $vars['rows'];
$rows_info = array();
foreach ($rows as $key => $value) {
if (substr($key, 0, 1) != '#') {
$rows_info[] = array(drupal_render($value['action']), drupal_render($value['display']));
}
}
return theme('table', array(
'header' => array(t('Delete'), t('Current exceptions')),
'rows' => $rows_info)
);
}
/**
* Theme the exception list as a table so the buttons line up.
*/
function theme_date_repeat_current_additions($rows = array()) {
$rows_info = array();
foreach ($rows as $key => $value) {
if (substr($key, 0, 1) != '#') {
$rows_info[] = array(drupal_render($value['action']), drupal_render($value['display']));
}
}
return theme('table', array(
'header' => array(t('Delete'), t('Current additions')),
'rows' => $rows_info)
);
}
/**
* Wrapper fieldset for repeat rule.
*/
function theme_date_repeat_rrule($vars) {
$element = $vars['element'];
$id = drupal_html_id('repeat-settings-fieldset');
$parents = $element['#parents'];
$selector = $parents[0];
for ($i = 1; $i < count($parents) - 1; $i++) {
$selector .= '[' . $parents[$i] . ']';
}
$selector .= '[show_repeat_settings]';
$fieldset = array(
'#type' => 'item',
'#title' => t('Repeat settings'),
'#title_display' => 'invisible',
'#markup' => $element['#children'],
'#states' => array(
'invisible' => array(
":input[name=\"{$selector}\"]" => array('checked' => FALSE),
),
),
'#id' => $id,
);
return drupal_render($fieldset);
}
/**
* Filter non zero values.
*/
function date_repeat_filter_non_zero_value($value) {
return $value !== 0;
}
/**
* Helper function for transforming the return value of checkbox(es) element.
*
* Can be used for transforming the returned value of checkbox(es) element
* to the format of returned value of multiple select element.
*/
function date_repeat_transform_checkbox_values_to_select_values($values) {
return array_filter($values, 'date_repeat_filter_non_zero_value');
}