| $ctags = $prj->getTagIdsByStatus('closed');␊ | 
| if (count($otags) == 0) $otags[] = 0;␊ | 
| if (count($ctags) == 0) $ctags[] = 0;␊ | 
| ␊ | 
| ␊ | 
| // Get the id list of issue in the user watch list (for all projects !)␊ | 
| $db =& Pluf::db();␊ | 
| $sql_results = $db->select('SELECT idf_issue_id as id FROM '.Pluf::f('db_table_prefix', '').'idf_issue_pluf_user_assoc WHERE pluf_user_id='.$request->user->id);␊ | 
| $issue_ids = array(0);␊ | 
| foreach ($sql_results as $id) {␊ | 
| $issue_ids[] = $id['id'];␊ | 
| } ␊ | 
| }␊ | 
| $issue_ids = implode (',', $issue_ids);␊ | 
| ␊ | 
| ␊ | 
| // Count open and close issues␊ | 
| $sql = new Pluf_SQL('project=%s AND id IN ('.$issue_ids.') AND status IN ('.implode(', ', $otags).')', array($prj->id));␊ | 
| $nb_open = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));␊ | 
| $sql = new Pluf_SQL('project=%s AND id IN ('.$issue_ids.') AND status IN ('.implode(', ', $ctags).')', array($prj->id));␊ | 
| $nb_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));␊ | 
| ␊ | 
| ␊ | 
| // Generate a filter for the paginator␊ | 
| switch ($match[2]) {␊ | 
| case 'closed':␊ | 
| $title = sprintf(__('Watch List: Closed Issues for %s'), (string) $prj);␊ | 
| $summary = __('This table shows the closed issues in your watch list for %s project.', (string) $prj);␊ | 
| $f_sql = new Pluf_SQL('project=%s AND id IN ('.$issue_ids.') AND status IN ('.implode(', ', $ctags).')', array($prj->id));   ␊ | 
| break; ␊ | 
| $f_sql = new Pluf_SQL('project=%s AND id IN ('.$issue_ids.') AND status IN ('.implode(', ', $ctags).')', array($prj->id));␊ | 
| break;␊ | 
| case 'open':␊ | 
| default:␊ | 
| $title = sprintf(__('Watch List: Open Issues for %s'), (string) $prj);␊ | 
| $summary = __('This table shows the open issues in your watch list for %s project.', (string) $prj);␊ | 
| $f_sql = new Pluf_SQL('project=%s AND id IN ('.$issue_ids.') AND status IN ('.implode(', ', $otags).')', array($prj->id));␊ | 
| break;  ␊ | 
| break;␊ | 
| }␊ | 
| ␊ | 
| ␊ | 
| // Paginator to paginate the issues␊ | 
| $pag = new Pluf_Paginator(new IDF_Issue());␊ | 
| $pag->class = 'recent-issues';␊ | 
|  | 
| }␊ | 
| foreach (IDF_Views::getProjects($request->user) as $project) {␊ | 
| $ctags = array_merge($ctags, $project->getTagIdsByStatus('closed'));␊ | 
| }       ␊ | 
| }␊ | 
| if (count($otags) == 0) $otags[] = 0;␊ | 
| if (count($ctags) == 0) $ctags[] = 0;␊ | 
| ␊ | 
| ␊ | 
| // Get the id list of issue in the user watch list (for all projects !)␊ | 
| $db =& Pluf::db();␊ | 
| $sql_results = $db->select('SELECT idf_issue_id as id FROM '.Pluf::f('db_table_prefix', '').'idf_issue_pluf_user_assoc WHERE pluf_user_id='.$request->user->id);␊ | 
| $issue_ids = array(0);␊ | 
| foreach ($sql_results as $id) {␊ | 
| $issue_ids[] = $id['id'];␊ | 
| } ␊ | 
| }␊ | 
| $issue_ids = implode (',', $issue_ids);␊ | 
| ␊ | 
| // Count open and close issues␊ | 
|  | 
| case 'closed':␊ | 
| $title = sprintf(__('Watch List: Closed Issues'));␊ | 
| $summary = __('This table shows the closed issues in your watch list.');␊ | 
| $f_sql = new Pluf_SQL('id IN ('.$issue_ids.') AND status IN ('.implode(', ', $ctags).')', array());   ␊ | 
| break; ␊ | 
| $f_sql = new Pluf_SQL('id IN ('.$issue_ids.') AND status IN ('.implode(', ', $ctags).')', array());␊ | 
| break;␊ | 
| case 'open':␊ | 
| default:␊ | 
| $title = sprintf(__('Watch List: Open Issues'));␊ | 
| $summary = __('This table shows the open issues in your watch list.');␊ | 
| $f_sql = new Pluf_SQL('id IN ('.$issue_ids.') AND status IN ('.implode(', ', $otags).')', array());␊ | 
| break;  ␊ | 
| break;␊ | 
| }␊ | 
| ␊ | 
| ␊ | 
| // Paginator to paginate the issues␊ | 
| $pag = new Pluf_Paginator(new IDF_Issue());␊ | 
| $pag->class = 'recent-issues';␊ | 
|  | 
| $next_issue = Pluf::factory('IDF_Issue')->getList(array('filter' => $sql_next->gen(),␊ | 
| 'order' => 'id ASC',␊ | 
| 'nb' => 1␊ | 
| ));                                 ␊ | 
| ));␊ | 
| $previous_issue_id = (isset($previous_issue[0])) ? $previous_issue[0]->id : 0;␊ | 
| $next_issue_id = (isset($next_issue[0])) ? $next_issue[0]->id : 0;␊ | 
| ␊ | 
|  | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Renders a JSON string containing completed issue information␊ | 
| * based on the queried / partial string␊ | 
| */␊ | 
| public $autoCompleteIssueList_precond = array('IDF_Precondition::accessIssues');␊ | 
| public function autoCompleteIssueList($request, $match)␊ | 
| {␊ | 
| $prj = $request->project;␊ | 
| ␊ | 
| // Autocomplete from jQuery UI works with JSON, this old one still␊ | 
| // expects a parsable string; since we'd need to bump jQuery beyond␊ | 
| // 1.2.6 for this to use as well, we're trying to cope with the old format.␊ | 
| // see http://www.learningjquery.com/2010/06/autocomplete-migration-guide␊ | 
| ␊ | 
| $arr = array(␊ | 
| 'Fo|o' => 110,␊ | 
| 'Bar' => 111,␊ | 
| 'Baz' => 112,␊ | 
| );␊ | 
| ␊ | 
| $out = '';␊ | 
| foreach ($arr as $key => $val)␊ | 
| {␊ | 
| $out .= str_replace('|', '|', $key).'|'.$val."\n";␊ | 
| }␊ | 
| ␊ | 
| return new Pluf_HTTP_Response($out);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Star/Unstar an issue.␊ | 
| */␊ | 
| public $star_precond = array('IDF_Precondition::accessIssues',␊ | 
|  | 
| }␊ | 
| $auto['auto_owner'] = substr($auto['auto_owner'], 0, -2);␊ | 
| unset($auto['_auto_owner']);␊ | 
| // Get issue relations␊ | 
| $r = $project->getRelationsFromConfig();␊ | 
| $auto['auto_relation_types'] = '';␊ | 
| foreach ($r as $rt) {␊ | 
| $esc = Pluf_esc($rt);␊ | 
| $auto['auto_relation_types'] .= sprintf('{ name: "%s", to: "%s" }, ',␊ | 
| $esc, $esc);␊ | 
| }␊ | 
| $auto['auto_relation_types'] = substr($auto['auto_relation_types'], 0, -2);␊ | 
| return $auto;␊ | 
| }␊ | 
| }␊ |