--- event-20060919.module 2006-09-21 03:06:00.000000000 -0700 +++ event.module 2006-09-21 03:06:47.000000000 -0700 @@ -1080,7 +1080,7 @@ $node = $data[$year][$month]['nodes'][$nid->nid]; if (event_taxonomy_filter($node, $terms) && in_array($node->type, $event_types['all'])) { $node->event_current_date = $day_start; - $node->event_state = $nid->event_state; +// $node->event_state = $nid->event_state; $nodes[] = $node; } } @@ -1317,6 +1317,11 @@ function _event_date($format, $timestamp, $offset = null) { global $user; + if (0==$timestamp) { + return; + } + + if (isset($offset)) { $timestamp += $offset; } @@ -1421,18 +1426,34 @@ // populate drop down values... // ...months $months = array(1 => t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')); + + if ('end'==$prefix) { + $months = array_merge( array( 0 => ''), $months ); + } + // ...hours if (variable_get('event_ampm', '0')) { $hour_format = t('g'); - $hours = drupal_map_assoc(range(1, 12)); + for ($i = 1; $i <= 12; $i++) $hours[$i] = $i; + $am_pms = array('am' => t('am'), 'pm' => t('pm')); + if ('end'==$prefix) { + $am_pms = array_merge( array(''=>''), $am_pms); + } + $am_pms = array('am' => t('am'), 'pm' => t('pm')); } else { $hour_format = t('H'); - $hours = drupal_map_assoc(range(0, 23)); + for ($i = 0; $i <= 23; $i++) $hours[$i] = $i; + } + if ('end'==$prefix) { + $hours = array_merge( array('' => ''), $hours ); } // ...minutes (with leading 0s) for ($i = 0; $i <= 59; $i++) $minutes[$i] = $i < 10 ? "0$i" : $i; + if ('end'==$prefix) { + $minutes = array_merge( array('' => ''), $minutes ); + } // This is a GMT timestamp, so the _event_date() wrapper to display local times. $form[$prefix .'_day'] = array( @@ -1442,40 +1463,40 @@ '#maxlength' => 2, '#size' => 2, '#description' => t('day'), - '#required' => TRUE); + '#required' => ('end'==$prefix ? FALSE : TRUE) ); $form[$prefix .'_month'] = array( '#type' => 'select', '#default_value' => _event_date('m', $timestamp, $offset), '#options' => $months, '#description' => t('month'), - '#required' => TRUE); + '#required' => ('end'==$prefix ? FALSE : TRUE) ); $form[$prefix .'_year'] = array( '#type' => 'textfield', '#default_value' => _event_date('Y', $timestamp, $offset), '#maxlength' => 4, '#size' => 4, '#description' => t('year'), - '#required' => TRUE); + '#required' => ('end'==$prefix ? FALSE : TRUE) ); $form[$prefix .'_hour'] = array( '#prefix' => '
', '#type' => 'select', '#default_value' => _event_date($hour_format, $timestamp, $offset), '#options' => $hours, - '#required' => TRUE, + '#required' => ('end'==$prefix ? FALSE : TRUE), '#description' => t('hour')); $form[$prefix .'_minute'] = array( '#prefix' => ':', '#type' => 'select', '#default_value' => _event_date('i', $timestamp, $offset), '#options' => $minutes, - '#required' => TRUE, + '#required' => ('end'==$prefix ? FALSE : TRUE), '#description' => t('minutes')); if (isset($am_pms)) { $form[$prefix .'_ampm'] = array( '#type' => 'radios', '#default_value' => _event_date('a', $timestamp, $offset), '#options' => $am_pms, - '#required' => TRUE); + '#required' => ('end'==$prefix ? FALSE : TRUE)); } $form[$prefix .'_close'] = array( '#type' => 'markup', @@ -1512,14 +1533,72 @@ // If we have all the parameters, re-calculate $node->event_$date . if (isset($node->{$prefix . 'year'}) && isset($node->{$prefix . 'month'}) && isset($node->{$prefix . 'day'}) && isset($node->{$prefix . 'hour'}) && isset($node->{$prefix . 'minute'})) { + + // check for expected values + $unset = array(); + settype($node->{$prefix . 'year'}, integer); + if (1970> $node->{$prefix . 'year'}) { + $unset[]='year'; + } + settype($node->{$prefix . 'month'}, integer); + if (1> $node->{$prefix . 'month'} || 12< $node->{$prefix . 'month'}) { + $unset[]='month'; + } + settype($node->{$prefix . 'day'}, integer); + if (1> $node->{$prefix . 'day'} || 31< $node->{$prefix . 'day'}) { + $unset[]='day'; + } + if ('' == (string) $node->{$prefix . 'hour'}) { + $node->{$prefix .'hour'} = -1; // 'end' unset value + } + settype($node->{$prefix . 'hour'}, integer); + $hour = $node->{$prefix . 'hour'}; + +// if 12 hr clock set convert to 24 hr + if (variable_get('event_ampm', '0')) { - if (($node->{$prefix . 'ampm'} == 'pm') && ($hour != 12)) { - $hour += 12; + + settype($node->{$prefix . 'ampm'}, string); + if ($node->{$prefix . 'ampm'} != 'am' && $node->{$prefix . 'ampm'} != 'pm') { + $unset[]='am/pm'; + } + else { + if (($node->{$prefix . 'ampm'} == 'pm') && ($hour != 12)) { + $hour += 12; + } + elseif (($node->{$prefix . 'ampm'} == 'am') && ($hour == 12)) { + $hour -= 12; + } } - elseif (($node->{$prefix . 'ampm'} == 'am') && ($hour == 12)) { - $hour -= 12; } + if (0> $hour || 23< $hour) { + $unset[]='hour'; + } + if ('' == (string) $node->{$prefix . 'minute'}) { + $node->{$prefix .'minute'} = -1; // 'end' unset value + } + settype($node->{$prefix . 'minute'}, integer); + if (0> $node->{$prefix . 'minute'} || 59< $node->{$prefix . 'minute'}) { + $unset[]='minute'; + } + // if all unset and 'end' then it is 'optional' and set as the same as 'start' + if ( ( (variable_get('event_ampm', '0') && 6==count($unset)) || + (!variable_get('event_ampm', '0') && 5==count($unset)) ) && + ('end' == $date) ) { + $node->event_end = $node->event_start; // this requires fn called in order: start, end + return; + } + // otherwise if unset variables form error + if (0timezone, gmmktime($hour, $node->{$prefix . 'minute'}, 0, $node->{$prefix . 'month'}, $node->{$prefix . 'day'}, $node->{$prefix . 'year'})); @@ -1854,17 +1933,21 @@ '#type' => 'fieldset', '#title' => t('Start'), '#description' => t('Start date.'), - '#weight' => -15 + '#weight' => -15, + '#prefix' => '
', + '#suffix' => '
' ); $form['event_start']['date'] = event_form_date($node->event_start ? $node->event_start : _event_user_time(), 'start', $node->start_offset); $form['event_end'] = array( '#type' => 'fieldset', '#title' => t('End'), - '#description' => t('End date.'), - '#weight' => -14 + '#description' => t('End date. (optional)'), + '#weight' => -14, + '#prefix' => '
', + '#suffix' => '
' ); - $form['event_end']['date'] = event_form_date(($node->event_end ? $node->event_end : _event_user_time()), 'end', $node->end_offset); + $form['event_end']['date'] = event_form_date($node->event_end==$node->event_start ? 0 : $node->event_end, 'end', $node->end_offset); } @@ -1909,11 +1992,16 @@ // and event_end set, 'validate' for the previewing and 'submit' for // update/insert. case 'submit': - event_validate_form_date($node, 'start'); - event_validate_form_date($node, 'end'); - if ($node->event_end < $node->event_start) { + // validation now needs to be in the order: start, end + event_validate_form_date($node, 'start'); + event_validate_form_date($node, 'end'); + if (0==$node->event_end-$node->end_offset) { $node->event_end = $node->event_start; } + if ($node->event_end < $node->event_start) { + form_set_error('', t('End time is earlier than start.')); + } + switch (variable_get('event_timezone_display', 'event')) { case 'event' : $node->start_offset = event_get_offset($node->timezone, $node->event_start);