/**
  * Constructor
  *
  * @param Request $request
  * @return TicketsController
  */
 function __construct($request)
 {
     parent::__construct($request);
     if ($this->logged_user->getProjectPermission('ticket', $this->active_project) < PROJECT_PERMISSION_ACCESS) {
         $this->httpError(HTTP_ERR_FORBIDDEN);
     }
     // if
     $tickets_url = tickets_module_url($this->active_project);
     $archive_url = assemble_url('project_tickets_archive', array('project_id' => $this->active_project->getId()));
     $this->wireframe->addBreadCrumb(lang('Tickets'), $tickets_url);
     /*$_options = new NamedList();
       $_options->add('_category', array('url' => $tickets_url, 'text' => lang('Category')));
       $_options->add('_star', array('url' => $tickets_url, 'text' => lang('Star')));
       $_options->add('_priority', array('url' => $tickets_url, 'text' => lang('Priority')));
       $_options->add('_name', array('url' => $tickets_url, 'text' => lang('Name')));
       $_options->add('_owner', array('url' => $tickets_url, 'text' => lang('Owner')));
       $this->wireframe->addPageAction(lang('Sort by'), $tickets_url, $_options, null, '0');*/
     $add_ticket_url = false;
     if (Ticket::canAdd($this->logged_user, $this->active_project)) {
         $params = null;
         if ($this->active_category->isLoaded()) {
             $params = array('category_id' => $this->active_category->getId());
         }
         // if
         $add_ticket_url = tickets_module_add_ticket_url($this->active_project, $params);
         $this->wireframe->addPageAction(lang('New Ticket'), $add_ticket_url, null, '1');
         //$this->wireframe->addPageAction(lang('New Ticket'), $add_ticket_url);
     }
     // if
     $ticket_id = $this->request->getId('ticket_id');
     if ($ticket_id) {
         $this->active_ticket = Tickets::findByTicketId($this->active_project, $ticket_id);
     }
     // if
     if (instance_of($this->active_category, 'Category') && $this->active_category->isLoaded()) {
         $this->wireframe->addBreadCrumb($this->active_category->getName(), $this->active_category->getViewUrl());
     }
     // if
     if (instance_of($this->active_ticket, 'Ticket')) {
         if ($this->active_ticket->isCompleted()) {
             $this->wireframe->addBreadCrumb(lang('Archive'), $archive_url);
         }
         // if
         $this->wireframe->addBreadCrumb($this->active_ticket->getName(), $this->active_ticket->getViewUrl());
     } else {
         $this->active_ticket = new Ticket();
     }
     // if
     $this->smarty->assign(array('tickets_url' => $tickets_url, 'tickets_archive_url' => $archive_url, 'add_ticket_url' => $add_ticket_url, 'active_ticket' => $this->active_ticket, 'page_tab' => 'tickets', 'mass_edit_tickets_url' => assemble_url('project_tickets_mass_edit', array('project_id' => $this->active_project->getId()))));
 }
 function set_responsible_status()
 {
     $project_id = $this->request->getId('project_id');
     if ($project_id) {
         $project = Projects::findById($project_id);
     }
     $ticket_id = $this->request->getId('ticket_id');
     if ($ticket_id) {
         $ticket = Tickets::findByTicketId($project, $ticket_id);
     }
     $owner = Assignments::findOwnerByObject($ticket);
     $users = Assignments::findAssigneesByObject($ticket);
     $this->smarty->assign(array('project' => $project, 'ticket' => $ticket, 'users' => $users, 'owner' => $owner, 'ticket_url' => assemble_url('project_ticket', array('project_id' => $project_id, 'ticket_id' => $ticket_id))));
 }
 /**
  * Find project objects in commit message, make them links and
  * save the relations to database
  *
  * @param string $commit_message
  * @param string $commit_author
  * @param integer $revision
  * @param Repository $repository
  * @param Project $project
  * @return string
  */
 function analyze_message($commit_message, $commit_author, $revision, $repository, $project)
 {
     if (define('PURIFY_HTML') && PURIFY_HTML) {
         $commit_message = purify_html($commit_message);
         // Clean!
     }
     // if
     $pattern = '/((complete[d]*)[\\s]+)?(ticket|milestone|discussion|task)[s]*[\\s]+[#]*\\d+/i';
     if (preg_match_all($pattern, $commit_message, $matches)) {
         $i = 0;
         $search = array();
         $replace = array();
         $matches_unique = array_unique($matches['0']);
         foreach ($matches_unique as $key => $match) {
             $match_data = preg_split('/[\\s,]+/', $match, null, PREG_SPLIT_NO_EMPTY);
             // check if the object got completed by this commit
             $object_completed = false;
             if (strpos(strtolower($match_data['0']), 'complete') !== false) {
                 $object_completed = true;
                 unset($match_data['0']);
                 $match_data = array_values($match_data);
             }
             // if
             $object_class_name = $match_data['0'];
             $module_name = Inflector::pluralize($object_class_name);
             $object_id = trim($match_data['1'], '#');
             $search[$i] = $match;
             if (class_exists($module_name) && class_exists($object_class_name)) {
                 $object = null;
                 switch (strtolower($module_name)) {
                     case 'tickets':
                         $object = Tickets::findByTicketId($project, $object_id);
                         break;
                     case 'discussions':
                         $object = Discussions::findById($object_id);
                         break;
                     case 'milestones':
                         $object = Milestones::findById($object_id);
                         break;
                     case 'tasks':
                         $object = Tasks::findById($object_id);
                         break;
                 }
                 // switch
                 if (instance_of($object, $object_class_name)) {
                     $link_already_created = CommitProjectObjects::count("object_id = '" . $object->getId() . "' AND revision = '{$revision}'") > 0;
                     if (!$link_already_created) {
                         $comit_project_object = new CommitProjectObject();
                         $comit_project_object->setProjectId($object->getProjectId());
                         $comit_project_object->setObjectId($object->getId());
                         $comit_project_object->setObjectType(ucfirst($object_class_name));
                         $comit_project_object->setRepositoryId($repository->getId());
                         $comit_project_object->setRevision($revision);
                         db_begin_work();
                         $save = $comit_project_object->save();
                         if ($save && !is_error($save)) {
                             db_commit();
                         } else {
                             db_rollback();
                         }
                         // if save
                     }
                     // if
                     $replace[$i] = ($object_completed ? 'Completed ' : '') . '<a href="' . $object->getViewUrl() . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>';
                     // set the object as completed
                     if ($object_completed && !instance_of($object, 'Discussion')) {
                         $completed_by = $repository->getMappedUser($commit_author);
                         $object->complete($completed_by);
                     }
                     // if
                 } else {
                     $replace[$i] = ($object_completed ? 'Completed ' : '') . '<a href="#" class="project_object_missing" title="' . lang('Project object does not exist in this project') . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>';
                 }
                 // if instance_of
                 $i++;
             }
             // if module loaded
         }
         // foreach
         return str_ireplace($search, $replace, htmlspecialchars($commit_message));
         // linkify
     }
     // if preg_match
     return $commit_message;
 }
 /**
  * Add AC object links to commit messages
  *
  * @param string
  * @return string
  **/
 private function analyzeCommitMessage($commit_message)
 {
     $pattern = '/(ticket|milestone|discussion|task)[s]*[\\s]+[#]*(\\d+)/i';
     if (preg_match_all($pattern, $commit_message, $matches)) {
         $i = 0;
         $search = array();
         $replace = array();
         $matches_unique = array_unique($matches['0']);
         foreach ($matches_unique as $key => $match) {
             $match_data = preg_split('/[\\s,]+/', $match, null, PREG_SPLIT_NO_EMPTY);
             $object_class_name = $match_data['0'];
             $module_name = Inflector::pluralize($object_class_name);
             $object_id = trim($match_data['1'], '#');
             $search[$i] = $match;
             if (class_exists($module_name) && class_exists($object_class_name)) {
                 $object = null;
                 switch (strtolower($module_name)) {
                     case 'tickets':
                         $object = Tickets::findByTicketId($this->active_project, $object_id);
                         break;
                     case 'discussions':
                         $object = Discussions::findById($object_id);
                         break;
                     case 'milestones':
                         $object = Milestones::findById($object_id);
                         break;
                     case 'tasks':
                         $object = Tasks::findById($object_id);
                         break;
                 }
                 // switch
                 if (instance_of($object, $object_class_name)) {
                     $replace[$i] = '<a href="' . $object->getViewUrl() . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>';
                 } else {
                     $replace[$i] = '<a href="#" class="project_object_missing" title="' . lang('Project object does not exist in this project') . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>';
                 }
                 // if instance_of
                 $i++;
             }
             // if module loaded
         }
         // foreach
         return str_ireplace($search, $replace, htmlspecialchars($commit_message));
         // linkify
     }
     // if preg_match
     return $commit_message;
 }