/**
  * Method to update the start and end dates of tasks
  * associated with the milestone.
  *
  * @param     integer    $id       The milestone id
  * @param     string     $start    The milestone start date
  * @param     string     $end      The milestone end date
  *
  * @return    void
  */
 protected function updateTimeline($id, $start = null, $end = null)
 {
     jimport('projectfork.library');
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     $nd = $db->getNullDate();
     $has_start = !(empty($start) || $start == $nd);
     $has_end = !(empty($end) || $end == $nd);
     // Do nothing if no start and end date are set
     if (!$has_start && !$has_end) {
         return;
     }
     $this_const = array($start, $end);
     $prev_const = array($this->prev_start, $this->prev_end);
     // Get all tasks
     $query->select('id, start_date, end_date')->from('#__pf_tasks')->where('milestone_id = ' . (int) $id)->order('id ASC');
     $db->setQuery($query);
     $tasks = (array) $db->loadObjectList('id');
     // Process tasks
     foreach ($tasks as $i => $item) {
         $item_has_start = !(empty($item->start_date) || $item->start_date == $nd);
         $item_has_end = !(empty($item->end_date) || $item->end_date == $nd);
         // Skip if not start and end date are set
         if (!$item_has_start && !$item_has_end) {
             continue;
         }
         $span = array($item->start_date, $item->end_date);
         // Shift dates
         list($new_start, $new_end) = PFDate::shiftTimeline($span, $this_const, $prev_const);
         // Update the database
         $updates = array();
         if ($item_has_start && $item->start_date != $new_start) {
             $updates[] = 'start_date = ' . $db->quote($new_start);
             $milestones[$i]->start_date = $new_start;
         }
         if ($item_has_end && $item->end_date != $new_end) {
             $updates[] = 'end_date = ' . $db->quote($new_end);
             $milestones[$i]->end_date = $new_end;
         }
         if (count($updates)) {
             $query->clear()->update('#__pf_tasks')->set(implode(', ', $updates))->where('id = ' . (int) $item->id);
             $db->setQuery($query);
             $db->execute();
         }
     }
 }