/**
  * Group objects by milestone
  * 
  * This function will group any group of object by milestone
  *
  * @param array $objects
  * @param integer $min_state
  * @param integer $min_visibility
  * @return array
  */
 function groupByMilestone($objects, $min_state = STATE_VISIBLE, $min_visibility = VISIBILITY_NORMAL)
 {
     $result = array();
     if (is_foreachable($objects)) {
         $milestone_ids = objects_array_extract($objects, 'getMilestoneId');
         if (is_foreachable($milestone_ids)) {
             $milestones = Milestones::findByIds($milestone_ids, $min_state, $min_visibility);
             if (is_foreachable($milestones)) {
                 foreach ($milestones as $milestone) {
                     $result[$milestone->getId()] = array('milestone' => $milestone, 'objects' => array());
                 }
                 // foreach
             }
             // if
         }
         // if
         // For unknown milestone objects
         $result[0] = array('milestone' => null, 'objects' => array());
         foreach ($objects as $object) {
             if (isset($result[$object->getMilestoneId()])) {
                 $result[$object->getMilestoneId()]['objects'][] = $object;
             } else {
                 $result[0]['objects'][] = $object;
             }
             // if
         }
         // foreach
     }
     // if
     return $result;
 }
 function mass_update()
 {
     if ($this->request->isSubmitted()) {
         $action = $this->request->post('with_selected');
         if (trim($action) == '') {
             flash_error('Please select what you want to do with selected milestones');
             $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
         }
         // if
         $milestone_ids = $this->request->post('milestones');
         $milestones = Milestones::findByIds($milestone_ids, STATE_VISIBLE, $this->logged_user->getVisibility());
         $updated = 0;
         if (is_foreachable($milestones)) {
             // Complete selected milestones
             if ($action == 'complete') {
                 $message = lang(':count milestones completed');
                 //BOF:mod 20110617
                 //BOF:mod 20120917 (reversed by shawn)
                 /*
                 //EOF:mod 20120917
                             		$warning = '';
                             		foreach($milestones as $milestone) {
                 			if($milestone->isOpen() && $milestone->canChangeCompleteStatus($this->logged_user)) {
                               				$responsible_assignee = $milestone->getResponsibleAssignee();
                               				$created_by_id = $milestone->getCreatedById();
                               				$project_leader = $this->active_project->getLeaderId();
                               				if ( (!is_null($responsible_assignee) && $responsible_assignee->getId()==$this->logged_user->getId()) 
                 						|| $created_by_id==$this->logged_user->getId() 
                 						|| $project_leader==$this->logged_user->getId() 
                 						|| $this->logged_user->isAdministrator() ){
                 					$warning .= '';
                 				} else {
                 					$warning .= '"' . $milestone->getName() . '", ';
                 				}
                 			}
                 		}
                 		if (!empty($warning)){
                                                         $temp = new User(!empty($created_by_id) ? $created_by_id : $project_leader);
                                                         $warning = 'Project ' . substr($warning, 0, -2) . ' cannot be closed at this time. Please send message to ' . $temp->getName() . ' to close this ticket.';
                                                         unset($temp);
                 		          		flash_error($warning, null, true);
                 		          		$this->redirectToReferer($this->smarty->get_template_vars('milestones_url'));
                 		} else {
                 //BOF:mod 20120917 (reversed by shawn)
                 */
                 //EOF:mod 20120917
                 //EOF:mod 20110617
                 foreach ($milestones as $milestone) {
                     if ($milestone->isOpen() && $milestone->canChangeCompleteStatus($this->logged_user)) {
                         $complete = $milestone->complete($this->logged_user);
                         if ($complete && !is_error($complete)) {
                             $updated++;
                         }
                         // if
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 //BOF:mod 20110617
                 //BOF:mod 20120917 (reversed by shawn)
                 /*
                 //EOF:mod 20120917
                 		}
                 //BOF:mod 20120917 (reversed by shawn)
                 */
                 //EOF:mod 20120917
                 //EOF:mod 20110617
                 // Open selected milestones
             } elseif ($action == 'open') {
                 $message = lang(':count milestones opened');
                 foreach ($milestones as $milestone) {
                     if ($milestone->isCompleted() && $milestone->canChangeCompleteStatus($this->logged_user)) {
                         $open = $milestone->open($this->logged_user);
                         if ($open && !is_error($open)) {
                             $updated++;
                         }
                         // if
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 // Mark object as starred
             } elseif ($action == 'star') {
                 $message = lang(':count milestones starred');
                 foreach ($milestones as $milestone) {
                     $star = $milestone->star($this->logged_user);
                     if ($star && !is_error($star)) {
                         $updated++;
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 // Unstar objects
             } elseif ($action == 'unstar') {
                 $message = lang(':count milestones unstarred');
                 foreach ($milestones as $milestone) {
                     $unstar = $milestone->unstar($this->logged_user);
                     if ($unstar && !is_error($unstar)) {
                         $updated++;
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 // Move selected objects to Trash
             } elseif ($action == 'trash') {
                 $message = lang(':count milestones moved to Trash');
                 foreach ($milestones as $milestone) {
                     if ($milestone->canDelete($this->logged_user)) {
                         $delete = $milestone->moveToTrash();
                         if ($delete && !is_error($delete)) {
                             $updated++;
                         }
                         // if
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 // Set a selected priority
             } elseif (str_starts_with($action, 'set_priority')) {
                 $priority = (int) substr($action, 13);
                 $message = lang(':count milestones updated');
                 foreach ($milestones as $milestone) {
                     if ($milestone->canEdit($this->logged_user)) {
                         $milestone->setPriority($priority);
                         $save = $milestone->save();
                         if ($save && !is_error($save)) {
                             $updated++;
                         }
                         // if
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 // Set visibility
             } elseif (str_starts_with($action, 'set_visibility')) {
                 $visibility = (int) substr($action, 15);
                 $message = lang(':count milestones updated');
                 foreach ($milestones as $milestone) {
                     if ($milestone->canEdit($this->logged_user)) {
                         $milestone->setVisibility($visibility);
                         $save = $milestone->save();
                         if ($save && !is_error($save)) {
                             $updated++;
                         }
                         // if
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
                 // Move selected milestones to selected category
             } elseif (str_starts_with($action, 'move_to_category')) {
                 if ($action == 'move_to_category') {
                     $category_id = null;
                 } else {
                     $category_id = (int) substr($action, 17);
                 }
                 // if
                 //$category = $category_id ? Categories::findById($category_id) : null;
                 $message = lang(':count milestones updated');
                 foreach ($milestones as $milestone) {
                     if ($milestone->canEdit($this->logged_user)) {
                         $milestone->setCategoryId($category_id);
                         $save = $milestone->save();
                         if ($save && !is_error($save)) {
                             $updated++;
                         }
                         // if
                     }
                     // if
                 }
                 // foreach
                 $this->redirectToReferer($this->smarty->get_template_vars('milestoness_url'));
             } else {
                 $this->httpError(HTTP_ERR_BAD_REQUEST);
             }
             // if
         } else {
             flash_error('Please select milestones that you would like to update');
             $this->redirectToReferer($this->smarty->get_template_vars('milestones_url'));
         }
         // if
     } else {
         $this->httpError(HTTP_ERR_BAD_REQUEST);
     }
 }