/** * this methode calculate the next date */ static function calculate_recurrence($recurrence_row) { // get the recurrence information $recurrence_number = $recurrence_row['recurrence_number']; $recurrence_type = $recurrence_row['recurrence_type']; $day_time = 86400; // 60s * 60min * 24h $week_time = $day_time * 7; $date_array = JemHelper::generate_date($recurrence_row['dates'], $recurrence_row['enddates']); switch($recurrence_type) { case "1": // +1 hour for the Summer to Winter clock change $start_day = mktime(1, 0, 0, $date_array["month"], $date_array["day"], $date_array["year"]); $start_day = $start_day + ($recurrence_number * $day_time); break; case "2": // +1 hour for the Summer to Winter clock change $start_day = mktime(1, 0, 0, $date_array["month"], $date_array["day"], $date_array["year"]); $start_day = $start_day + ($recurrence_number * $week_time); break; case "3": // month recurrence /* * warning here, we have to make sure the date exists: * 31 of october + 1 month = 31 of november, which doesn't exists => skip the date! */ $start_day = mktime(1,0,0,($date_array["month"] + $recurrence_number),$date_array["day"],$date_array["year"]); $i = 1; while (date('d', $start_day) != $date_array["day"] && $i < 20) { // not the same day of the month... try next date ! $i++; $start_day = mktime(1,0,0,($date_array["month"] + $recurrence_number*$i),$date_array["day"],$date_array["year"]); } break; case "4": // weekday // the selected weekdays $selected = JemHelper::convert2CharsDaysToInt(explode(',', $recurrence_row['recurrence_byday']), 0); $days_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'); $litterals = array('first', 'second', 'third', 'fourth'); if (count($selected) == 0) { // this shouldn't happen, but if it does, to prevent problem use the current weekday for the repetition. JError::raiseWarning(500, JText::_('COM_JEM_WRONG_EVENTRECURRENCE_WEEKDAY')); $current_weekday = (int) $date_array["weekday"]; $selected = array($current_weekday); } $start_day = null; foreach ($selected as $s) { $next = null; switch ($recurrence_number) { case 6: // before last 'x' of the month $next = strtotime("previous ".$days_names[$s].' - 1 week ', mktime(1,0,0,$date_array["month"]+1 ,1,$date_array["year"])); $nextmonth = strtotime("previous ".$days_names[$s].' - 1 week ', mktime(1,0,0,$date_array["month"]+2 ,1,$date_array["year"])); break; case 5: // last 'x' of the month $next = strtotime("previous ".$days_names[$s], mktime(1,0,0,$date_array["month"]+1 ,1,$date_array["year"])); $nextmonth = strtotime("previous ".$days_names[$s], mktime(1,0,0,$date_array["month"]+2 ,1,$date_array["year"])); break; case 4: // xth 'x' of the month case 3: case 2: case 1: default: $next = strtotime($litterals[$recurrence_number-1]." ".$days_names[$s].' of this month', mktime(1,0,0,$date_array["month"] ,1,$date_array["year"])); $nextmonth = strtotime($litterals[$recurrence_number-1]." ".$days_names[$s].' of this month', mktime(1,0,0,$date_array["month"]+1 ,1,$date_array["year"])); break; } // is the next / nextm day eligible for next date ? if ($next && $next > strtotime($recurrence_row['dates'])) // after current date ! { if (!$start_day || $start_day > $next) { // comes before the current 'start_date' $start_day = $next; } } if ($nextmonth && (!$start_day || $start_day > $nextmonth)) { $start_day = $nextmonth; } } break; } if (!$start_day) { return false; } $recurrence_row['dates'] = date("Y-m-d", $start_day); if ($recurrence_row['enddates']) { $recurrence_row['enddates'] = date("Y-m-d", $start_day + $date_array["day_diff"]); } if ($start_day < $date_array["unixtime"]) { JError::raiseError(500, JText::_('COM_JEM_RECURRENCE_DATE_GENERATION_ERROR')); } return $recurrence_row; }