ticketsearch.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:44k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. // +-------------------------------------------------------------+
  3. // | DeskPRO v [2.0.1 Production]
  4. // | Copyright (C) 2001 - 2004 Headstart Solutions Limited
  5. // | Supplied by WTN-WDYL
  6. // | Nullified by WTN-WDYL
  7. // | Distribution via WebForum, ForumRU and associated file dumps
  8. // +-------------------------------------------------------------+
  9. // | DESKPRO IS NOT FREE SOFTWARE
  10. // +-------------------------------------------------------------+
  11. // | License ID : Full Enterprise License =) ...
  12. // | License Owner : WTN-WDYL Team
  13. // +-------------------------------------------------------------+
  14. // | $RCSfile: ticketsearch.php,v $
  15. // | $Date: 2004/02/13 01:58:34 $
  16. // | $Revision: 1.112 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Ticket search forms and engine.
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL ^ E_NOTICE);
  22. /*
  23. nodisplay field:
  24. 1 : Spam
  25. 2 : User must validate themselves
  26. 3 : Tech must validate users
  27. */
  28. include "./../global.php";
  29. if (!$_REQUEST['Jump']) {
  30. tech_nav('Tickets', 'Ticket Search');
  31. }
  32. ################################# GLOBAL SECTIONS ##################################### 
  33. ////////////////////////// SORT OUT INFORMATION //////////////////////////
  34. if ($_REQUEST[variables]) {
  35. $_REQUEST = array_merge(unserialize($_REQUEST[variables]), $_REQUEST);
  36. }
  37. // searchtype
  38. if (!$_REQUEST['searchtype']) {
  39. $_REQUEST['searchtype'] = "simple";
  40. }
  41. ################################# SORT OUT FOOTER_SEARCH ##################################### 
  42. if ($user['cats_user']) {
  43. if (@in_array(-3, $_REQUEST['category'])) {
  44. $_REQUEST['category'] = split(',', $user['cats_user']);
  45. }
  46. }
  47. ################################# SORT OUT FOOTER_SELECT ##################################### 
  48. if (is_array($_REQUEST['unassigned_category'])) {
  49. $_REQUEST['category'] = $_REQUEST['unassigned_category'];
  50. $_REQUEST['tech'] = -1;
  51. $footer_select = true;
  52. }
  53. if (is_array($_REQUEST['other_category'])) {
  54. $_REQUEST['category'] = $_REQUEST['other_category'];
  55. $_REQUEST['tech'] = 'assigned';
  56. $footer_select = true;
  57. }
  58. if (is_array($_REQUEST['your_category'])) {
  59. $_REQUEST['category'] = $_REQUEST['your_category'];
  60. $_REQUEST['tech'] = $user[id];
  61. $footer_select = true;
  62. }
  63. if (is_array($_REQUEST['unassigned_priority'])) {
  64. $_REQUEST['priority'] = $_REQUEST['unassigned_priority'];
  65. $_REQUEST['tech'] = -1;
  66. $footer_select = true;
  67. }
  68. if (is_array($_REQUEST['other_priority'])) {
  69. $_REQUEST['priority'] = $_REQUEST['other_priority'];
  70. $footer_select = true;
  71. $_REQUEST['tech'] = 'assigned';
  72. }
  73. if (is_array($_REQUEST['your_priority'])) {
  74. $_REQUEST['priority'] = $_REQUEST['your_priority'];
  75. $footer_select = true;
  76. $_REQUEST['tech'] = $user[id];
  77. }
  78. if (is_array($_REQUEST['other_tech'])) {
  79. $_REQUEST['tech'] = $_REQUEST['other_tech'];
  80. $footer_select = true;
  81. $_REQUEST['tech'] = 'assigned';
  82. }
  83. if ($footer_select) {
  84. $_REQUEST['do'] = 'search';
  85. $_REQUEST['awaiting_tech'] = 1;
  86. $_REQUEST['unresolved'] = 1;
  87. }
  88. ////////////////////////// SAVED SEARCH/RESULT ///////////////////////////
  89. if ($_REQUEST['save_search_op']) {
  90. $save_items = array('greater', 'lessthan', 'user_owner', 'subject', 'subjectoption',
  91. 'message', 'messageoption', 'messageowner', 'tech',
  92. 'ddate_started_start', 'mdate_started_start', 'ydate_started_start',
  93. 'ddate_started_end', 'mdate_started_end', 'ydate_started_end',
  94. 'ddate_resolved_start', 'mdate_resolved_start', 'ydate_resolved_start',
  95. 'ddate_resolved_end', 'mdate_resolved_end', 'ydate_resolved_end',
  96. 'ddate_activity_start', 'mdate_activity_start', 'ydate_activity_start',
  97. 'ddate_activity_end', 'mdate_activity_end', 'ydate_activity_end',
  98. 'resolved', 'unresolved', 'awaiting_tech', 'awaiting_user', 'category', 'priority',
  99. 'nodisplay');
  100. foreach ($save_items AS $key => $val) {
  101. $data[$val] = $_REQUEST[$val];
  102. }
  103. }
  104. if ($_REQUEST['save_search_op'] == 'Save') {
  105. if ($_REQUEST['saved_search']) {
  106. $data['custom_fields'] = serialize($_REQUEST['custom_fields']);
  107. $data = mysql_escape_string(serialize($data));
  108. $db->query("UPDATE tech_ticket_search 
  109. set data = '$data' WHERE id = '$_REQUEST[saved_search]'
  110. AND techid = '$user[id]'");
  111. $message = "Search criteria updated.";
  112. } else {
  113. $message = "You must select a valid search to update. [Changes not saved]";
  114. $_REQUEST['do'] = '';
  115. $_REQUEST['searchtype'] = 'advanced';
  116. }
  117. if ($_REQUEST['save_search_op'] == 'Save As') {
  118. if ($_REQUEST['save_search_name']) {
  119. $data['custom_fields'] = serialize($_REQUEST['custom_fields']);
  120. $data = mysql_escape_string(serialize($data));
  121. $db->query("INSERT INTO tech_ticket_search (techid, save_name, save_type, data)
  122. VALUES ('$user[id]', '$_REQUEST[save_search_name]', 'search', '$data')");
  123. $message = "Search criteria saved as $_REQUEST[save_search_name].";
  124. } else {
  125. $message = "You must enter a name to assign to this search. [Search not saved]";
  126. $_REQUEST['do'] = '';
  127. $_REQUEST['searchtype'] = 'advanced';
  128. }
  129. if ($_REQUEST['save_search_op'] == 'Edit') {
  130. if ($_REQUEST['saved_search']) {
  131. $db->query("SELECT data FROM tech_ticket_search WHERE id = '$_REQUEST[saved_search]' AND techid = '$user[id]'");
  132. $data = $db->row_array();
  133. $data = unserialize($data[data]);
  134. $_REQUEST['custom_fields'] = unserialize($data['custom_fields']);
  135. $_REQUEST['do'] = '';
  136. $_REQUEST['searchtype'] = 'advanced';
  137. foreach ($save_items AS $key => $val) {
  138. $_REQUEST[$val] = $data[$val];
  139. }
  140. } else {
  141. $message = "You must specify a valid search to edit.";
  142. $_REQUEST['do'] = '';
  143. $_REQUEST['searchtype'] = 'advanced';
  144. }
  145. if ($_REQUEST['save_search_op'] == 'Delete') {
  146. if ($_REQUEST[saved_search]) {
  147. $db->query("DELETE FROM tech_ticket_search WHERE id = '$_REQUEST[saved_search]' AND techid = '$user[id]'");
  148. $_REQUEST['do'] = '';
  149. $_REQUEST['searchtype'] = 'advanced';
  150. $message = "Search deleted.";
  151. } else {
  152. $message = "You must specify a valid search to delete.";
  153. $_REQUEST['do'] = '';
  154. $_REQUEST['searchtype'] = 'advanced';
  155. }
  156. if ($_REQUEST['save_search_op'] == 'Run') {
  157. if ($_REQUEST['saved_search']) {
  158. $db->query("SELECT data FROM tech_ticket_search WHERE id = '$_REQUEST[saved_search]' AND techid = '$user[id]'");
  159. $data = $db->row_array();
  160. $data = unserialize($data[data]);
  161. foreach ($save_items AS $key => $val) {
  162. $_REQUEST[$val] = $data[$val];
  163. }
  164. $_REQUEST['custom_fields'] = unserialize($data['custom_fields']);
  165. $_REQUEST['do'] = 'search';
  166. $_REQUEST['searchtype'] = 'advanced';
  167. } else {
  168. $_REQUEST['do'] = '';
  169. $_REQUEST['searchtype'] = 'advanced';
  170. $message = "You must specify a valid search to run.";
  171. }
  172. }
  173. // Handle requests from tech/home/ticket_select.php
  174. if ($_REQUEST['do'] == 'listown') {
  175. $_REQUEST['tech'] = $user['id'];
  176. $_REQUEST['do'] = 'search';
  177. $_REQUEST['unresolved'] = 1;
  178. $_REQUEST['resolved'] = 0;
  179. $_REQUEST['awaiting_tech'] = 1;
  180. $_REQUEST['awaiting_user'] = 0;
  181. } elseif ($_REQUEST['do'] == 'listnew') {
  182. $_REQUEST['tech'] = '-1';
  183. $_REQUEST['do'] = 'search';
  184. $_REQUEST['unresolved'] = 1;
  185. $_REQUEST['resolved'] = 0;
  186. $_REQUEST['awaiting_tech'] = 1;
  187. $_REQUEST['awaiting_user'] = 0;
  188. } elseif ($_REQUEST['do'] == 'listothers') {
  189. $_REQUEST['tech'] = 'assigned';
  190. $_REQUEST['do'] = 'search';
  191. $_REQUEST['unresolved'] = 1;
  192. $_REQUEST['resolved'] = 0;
  193. $_REQUEST['awaiting_tech'] = 1;
  194. $_REQUEST['awaiting_user'] = 0;
  195. }
  196. ////////////////////////// GET TECH/CATEGORY/PRIORITY INFORMATION //////////////////////////
  197. // if edit ticket
  198. $cat_array[-2] = 'Any';
  199. $cat_array[-1] = 'None';
  200. $db->query("SELECT * FROM ticket_cat ORDER BY cat_order");
  201. while ($cat = $db->row_array()) {
  202. $cat_array[$cat[id]] = $cat[name];
  203. // for select menus
  204. $html .= "new Array(true,"category|Change Category","$cat[id]|$cat[name]"),n";
  205. }
  206. // if edit + assign to tech
  207. $tech_array[-2] = 'Any';
  208. $tech_array[-1] = 'Unassigned';
  209. $db->query("SELECT * FROM tech ORDER BY username");
  210. while ($tech = $db->row_array()) {
  211. $tech_array[$tech[id]] = $tech[username];
  212. $html .= "new Array(true,"tech|Assign to tech","$tech[id]|$tech[username]"),";
  213. }
  214. // if edit ticket
  215. $pri_array[-2] = 'Any';
  216. $pri_array[-1] = 'None';
  217. $db->query("SELECT * FROM ticket_pri ORDER BY pri_order");
  218. while ($pri = $db->row_array()) {
  219. $pri_array[$pri[id]] = $pri[name];
  220. $html .= "new Array(true,"priority|Change Priority","$pri[id]|$pri[name]"),n";
  221. }
  222. ###################################### BASIC TICKET SEARCH FORM ################################# 
  223. if ($message) {
  224. alert($message);
  225. }
  226. if ($_REQUEST['searchtype'] == "simple" AND !$_REQUEST['Jump']) {
  227. $help1 = table_thelp('<B>Is Resolved</B>', 'Tickets - Searching', 'Is Resolved');
  228. $help2 = table_thelp('<B>Awaiting Tech</B>', 'Tickets - Searching', 'Awaiting Tech');
  229. $help3 = table_thelp('<B>Categories</B>', 'Tickets - Searching', 'Categories');
  230. $help4 = table_thelp('<B>Priorities</B>', 'Tickets - Searching', 'Priorities');
  231. $help5 = table_thelp('<B>Tech Owner</B>', 'Tickets - Searching', 'Tech Owner Resolved');
  232. $help6 = table_thelp('<B>User Owner</B>', 'Tickets - Searching', 'User Owner');
  233. $help7 = table_thelp('<B>Match Subject</B>', 'Tickets - Searching', 'Match Subject');
  234. $help8 = table_thelp('<B>Match Message</B>', 'Tickets - Searching', 'Match Message');
  235. $table[] = array($help1, $help2, $help3, $help4, $help5, $help6);
  236. $table[] = array(
  237. '<table border="0"><tr><td>Resolved</td><td>' . form_checkbox_single('resolved', 1, $_REQUEST['resolved']) . '</td></tr><tr><td>Unresolved</td><td>' . form_checkbox_single('unresolved', 1, $_REQUEST['unresolved']) . "</td></tr></table>",
  238. '<table border="0"><tr><td>Awaiting Tech</td><td>' . form_checkbox_single('awaiting_tech', 1, $_REQUEST['awaiting_tech']) . '</td></tr><tr><td>Awaiting User</td><td>' . form_checkbox_single('awaiting_user', 1, $_REQUEST['awaiting_user']) . "</td></tr></table>",
  239. form_select('category', $cat_array, '', $_REQUEST['category'], '', '', 5),
  240. form_select('priority', $pri_array, '', $_REQUEST['priority'], '', '', 5),
  241. form_select('tech', $tech_array, '', $_REQUEST['tech'], '', '', 5),
  242. '&nbsp;username or email<br />' . form_input('user_owner', $_REQUEST['user_owner'], 15) . " <a onClick="openWindow('./../users/quickfind.php?name=searchform.user_owner', 450, 600, 'userfind')">".html_image('tech/pribut040.gif')."</a>"
  243. );
  244. $table[] = array(
  245. "<table border="0"><tr><td>$help7</td><td>" .  
  246. form_input('subject', $_REQUEST['subject'], 30) . 
  247. '&nbsp;&nbsp;' . 
  248. form_select('subjectoption', array('OR', 'AND', 'PHRASE'), NULL, $_REQUEST['subjectoption'], 1) . 
  249. "&nbsp;&nbsp;(use % for wildcard)</td></tr><tr><td>$help8</td><td>" .  
  250. form_input('message', $_REQUEST['message'], 30) . 
  251. '&nbsp;&nbsp;' . 
  252. form_select('messageoption', array('OR', 'AND', 'PHRASE'), NULL, $_REQUEST['messageoption'], 1) . 
  253. '&nbsp;&nbsp;' . 
  254. form_select('messageowner', array('EITHER', 'TECH', 'USER'), NULL, $_REQUEST['messageowner'], 1) . 
  255. '&nbsp;&nbsp;(use % for wildcard)</td></tr></table>'
  256. );
  257. table_header('Search for Tickets', 'ticketsearch.php', array('do' => 'search'), '', 'searchform');
  258. table_content('', $table);
  259. table_footer('Search');
  260. unset($columns, $table);
  261. }
  262. ####################################### ADVANCED TICKET SEARCH FORM #################################### 
  263. if ($_REQUEST['searchtype'] == "advanced" AND !$_REQUEST['Jump']) {
  264. $table[] = table_midheader('Ticket Properties');
  265. // resolved
  266. $bit = 'Resolved ' . form_checkbox_single('resolved', 1, $_REQUEST['resolved']) . ' Unresolved ' . form_checkbox_single('unresolved', 1, $_REQUEST['unresolved']);
  267. $table[] = array(table_thelp('<B>Is Resolved</B>', 'Tickets - Searching', 'Is Resolved'), $bit);
  268. // awaiting whom
  269. $bit = 'Awaiting Tech ' . form_checkbox_single('awaiting_tech', 1, $_REQUEST['awaiting_tech']) . ' Awaiting User ' . form_checkbox_single('awaiting_user', 1, $_REQUEST['awaiting_user']);
  270. $table[] = array(table_thelp('<b>Awaiting Tech Response<b>', 'Tickets - Searching', 'Awaiting Tech'), $bit);
  271. // Spam or not?
  272. $bit = 'Spam' . form_checkbox_single('nodisplay', 1, $_REQUEST['nodisplay']);
  273. $table[] = array(table_thelp('<b>Hidden Tickets<b>', 'Tickets - Searches', 'Hidden Tickets'), $bit);
  274. // id range
  275. $bit = form_input('greater', $_REQUEST['greater'], 3) . " < <b>ID</b> > " . form_input('lessthan', $_REQUEST['lessthan'], 3);
  276. $table[] = array(table_thelp('<b>Ticket ID Range</b>', 'Tickets - Searches', 'Ticket ID Range'), $bit);
  277. // cats/pri/techowner
  278. $table[] = array(table_thelp('<b>Categories</b>', 'Tickets - Searches', 'Categories'), form_select('category', $cat_array, '', $_REQUEST['category'], '', '', 3));
  279. $table[] = array(table_thelp('<b>Priorities</b>', 'Tickets - Searches', 'Priorities'), form_select('priority', $pri_array, '', $_REQUEST['priority'], '', '', 3));
  280. $table[] = array(table_thelp('<b>Tech Owner</b>', 'Tickets - Searches', 'Tech Owner'), form_select('tech', $tech_array, '', $_REQUEST['tech'], '', '', 3));
  281. // user owner
  282. $bit = form_input('user_owner', $_REQUEST['user_owner'], 30) . " <a onClick="openWindow('./../users/quickfind.php?name=searchform.user_owner', 450, 600, 'userfind')">".html_image('tech/bul084.gif')."</a>";
  283. $table[] = array(table_thelp('<b>Username or E-mail</b>', 'Tickets - Searches', 'User Owner'), $bit);
  284. $table[] = table_midheader('Search Words');
  285. // subject
  286. $bit = form_input('subject', $_REQUEST['subject'], 30) . ' ' . form_select('subjectoption', array('AND', 'OR', 'PHRASE'), '', $_REQUEST['subjectoption'], 1);
  287. $table[] = array(table_thelp('<b>Match Subject</b>', 'Tickets - Searches', 'Match Subject'), $bit);
  288. // message
  289. $bit =  form_input('message', $_REQUEST['message'], 30) . ' ' . form_select('messageoption', array('AND', 'OR', 'PHRASE'), '', $_REQUEST['messageoption'], 1) . ' ' . form_select('messageowner', array('EITHER', 'TECH', 'USER'), '', $_REQUEST['messageowner'], 1);
  290. $table[] = array(table_thelp('<b>Match Message</b>', 'Tickets - Searches', 'Match Message'), $bit);
  291. $table[] = table_midheader('Dates');
  292. // started
  293. if ($_REQUEST['ydate_started_start']) {
  294. $date = @strtotime("$_REQUEST[ydate_started_start]-$_REQUEST[mdate_started_start]-$_REQUEST[ddate_started_start]");
  295. } else {
  296. $date = NULL;
  297. }
  298. if ($_REQUEST['ydate_started_end']) {
  299. $date2 = @strtotime("$_REQUEST[ydate_started_end]-$_REQUEST[mdate_started_end]-$_REQUEST[ddate_started_end]");
  300. } else {
  301. $date2 = NULL;
  302. }
  303. $bit =  'From ' . form_date('date_started_start', '', $date, '', 1) . 
  304. "<a onClick="datePop('searchform','date_started_start')">".html_image('tech/bul102.gif')."</a>&nbsp;&nbsp;To " . form_date('date_started_end', '', $date2, '', 1) .
  305. "<a onClick="datePop('searchform', 'date_started_end')">".html_image('tech/bul102.gif')."</a>";
  306. $table[] = array(table_thelp('<b>Date Started</b>', 'Tickets - Searches', 'Date Started'), $bit);
  307. unset($date, $date2);
  308. // resolved
  309. if ($_REQUEST['ydate_resolved_start']) {
  310. $date = @strtotime("$_REQUEST[ydate_resolved_start]-$_REQUEST[mdate_resolved_start]-$_REQUEST[ddate_resolved_start]");
  311. } else {
  312. $date = NULL;
  313. }
  314. if ($_REQUEST['ydate_resolved_end']) {
  315. $date2 = @strtotime("$_REQUEST[ydate_resolved_end]-$_REQUEST[mdate_resolved_end]-$_REQUEST[ddate_resolved_end]");
  316. } else {
  317. $date2 = NULL;
  318. }
  319. $bit =  'From ' . form_date('date_resolved_start', '', $date, '', 1) . 
  320. "<a onClick="datePop('searchform', 'date_resolved_start')">".html_image('tech/bul102.gif')."</a>&nbsp;&nbsp;To " . form_date('date_resolved_end', '', $date2, '', 1) .
  321. "<a onClick="datePop('searchform', 'date_resolved_end')">".html_image('tech/bul102.gif')."</a>";
  322. $table[] = array(table_thelp('<b>Date Resolved</b>', 'Tickets - Searches', 'Date Resolved'), $bit);
  323. unset($date, $date2);
  324. // last activity
  325. $date = @strtotime("$_REQUEST[ydate_activity_start]-$_REQUEST[mdate_activity_start]-$_REQUEST[ddate_activity_start]");
  326. $date2 = @strtotime("$_REQUEST[ydate_activity_end]-$_REQUEST[mdate_activity_end]-$_REQUEST[ddate_activity_end]");
  327. if ($_REQUEST['ydate_resolved_start']) {
  328. $date = @strtotime("$_REQUEST[ydate_resolved_start]-$_REQUEST[mdate_resolved_start]-$_REQUEST[ddate_resolved_start]");
  329. } else {
  330. $date = NULL;
  331. }
  332. if ($_REQUEST['ydate_resolved_end']) {
  333. $date2 = @strtotime("$_REQUEST[ydate_resolved_end]-$_REQUEST[mdate_resolved_end]-$_REQUEST[ddate_resolved_end]");
  334. } else {
  335. $date2 = NULL;
  336. }
  337. $bit =  'From ' . form_date('date_activity_start', '', $date, '', 1) . 
  338. "<a onClick="datePop('searchform', 'date_activity_start')">".html_image('tech/bul102.gif')."</a>&nbsp;&nbsp;To " . form_date('date_activity_end', '', $date2, '', 1) .
  339. "<a onClick="datePop('searchform', 'date_activity_end')">".html_image('tech/bul102.gif')."</a>";
  340. $table[] = array(table_thelp('<b>Date of Last Activity</b>', 'Tickets - Searches', 'Date of Last Activity'), $bit);
  341. unset($date, $date2);
  342. $db->query("SELECT * FROM ticket_def WHERE tech_viewable");
  343. if ($db->num_rows()) {
  344. $table[] = table_midheader('Custom Ticket Fields');
  345. }
  346. while ($ticket_data = $db->row_array()) {
  347. $bit = field_def($ticket_data, 'redo', $_REQUEST['custom_fields'][$ticket_data['name']], $_REQUEST['custom_fields']["extra" . $ticket_data['name']], '', 'custom_fields', 1, $_REQUEST['custom_fields'][$ticket_data['name'].'_match'], $_REQUEST['custom_fields'][$ticket_data['name'].'_not']);
  348. $name = unserialize($ticket_data[display_name]);
  349. $name = $name[$settings[default_language]];
  350. $ticket_fields_array[$ticket_data[id]] = array(
  351. 'display_name' => $name,
  352. 'name' => $ticket_data[name]
  353. );
  354. $table[] = array("<b>$name</b>", $bit);
  355. }
  356. $table[] = table_midheader('Named Searches and Results');
  357. $db->query("SELECT id, save_name, save_type FROM tech_ticket_search WHERE techid = '$user[id]' ORDER BY save_type, save_name");
  358. $saved_searches = array();
  359. $saved_results  = array();
  360. while ($saves = $db->row_array()) {
  361. if ($saves[save_type] == 'search') {
  362. $saved_searches[$saves[id]] = $saves[save_name];
  363. }
  364. }
  365. if ($_REQUEST['saved_search']) {
  366. $saved_selected = $_REQUEST['saved_search'];
  367. } else {
  368. $saved_selected = NULL;
  369. }
  370. $saved_searches = iff(count($saved_searches) > 0, form_select('saved_search', $saved_searches, '', $saved_selected), '(None&nbsp;saved)&nbsp;&nbsp;') .
  371. form_radio_single('save_search_op', 'No Action', 1) . "No Action " .
  372. form_radio_single('save_search_op', 'Run') . "Run " .
  373. form_radio_single('save_search_op', 'Edit') . "Edit " .
  374. form_radio_single('save_search_op', 'Delete') . "Delete " .
  375. form_radio_single('save_search_op', 'Save') . "Update " .
  376. form_radio_single('save_search_op', 'Save As') . "Save as New: " .
  377. form_input('save_search_name');
  378. $table[] = array(table_thelp('<B>Saved Searches</B>', 'Tickets - Searches', 'Saved Searches'), $saved_searches);
  379. table_header('Search for Tickets', 'ticketsearch.php', array('do' => 'search', 'searchtype' => 'advanced'), '', 'searchform');
  380. table_content($columns, $table);
  381. table_footer('Search');
  382. unset($columns, $table);
  383. // hide search form if searching
  384. if ($_REQUEST['do'] == "search") {
  385. echo "<SCRIPT>oc('Search for Tickets');oc('Search for Tickets2');</SCRIPT>";
  386. }
  387. }
  388. echo "</form></form>";
  389. ############################################# RESULTS ############################################# 
  390. if ($_REQUEST['do'] == "search") {
  391. /*******************************************************
  392. PART 1: BUILDING WHERE PART OF QUERY
  393. *******************************************************/
  394. ////////////////////////// LIMIT BASED ON REPLIES //////////////////////////
  395. if ($_REQUEST['message']) {
  396. // message is a phrase
  397. if ($_REQUEST['messageoption'] == 'PHRASE') {
  398. $where .= " message LIKE '%" . addslashes($_REQUEST['message']) . "%'";
  399. // message is AND or OR
  400. } else {
  401. give_default($_REQUEST['messageoption'], 'OR');
  402. $words = explode(" ", $_REQUEST['message']);
  403. for ($i=0; $i < count($words); $i++) {
  404. if ($i == "0") {
  405. $where .= " message LIKE '%" . addslashes($words[$i]) . "%' ";
  406. } else {
  407. $where .= " $_REQUEST[messageoption] message LIKE '%" . addslashes($words[$i]) . "%' ";
  408. }
  409. }
  410. }
  411. if ($_REQUEST['messageowner'] == "TECH") {
  412. $where .= " AND techid";
  413. } elseif ($_REQUEST['messageowner'] == "USER") {
  414. $where .= " AND userid";
  415. }
  416. $db->query("SELECT ticketid FROM ticket_message WHERE $where");
  417. if ($db->num_rows() < 1) {
  418. // make query fail
  419. $reply_search = " AND 0 ";
  420. } else {
  421. while ($reply = $db->row_array()) {
  422. $reply_search[] = $reply['ticketid'];
  423. }
  424. $reply_search = ' AND ticket.id IN ' . array2sql($reply_search);
  425. }
  426. }
  427. unset($where);
  428. ////////////////////////// START QUERY //////////////////////////
  429. $select = "
  430. SELECT ticket.*,
  431. ticket_cat.name AS catname,
  432. ticket_pri.name AS priname,
  433. user.id AS usrid, user.username AS username,
  434. tech.username AS techname,tech.id AS tech,
  435. COUNT(ticket_attachments.id) AS attachments
  436. FROM ticket
  437. LEFT JOIN ticket_cat ON (ticket_cat.id = ticket.category)
  438. LEFT JOIN ticket_pri ON (ticket_pri.id = ticket.priority)
  439. LEFT JOIN user ON (user.id = ticket.userid)
  440. LEFT JOIN tech ON (tech.id = ticket.tech)
  441. LEFT JOIN ticket_attachments ON (ticket_attachments.ticketid = ticket.id)
  442. WHERE 
  443. ";
  444. if ($_REQUEST['nodisplay']) {
  445. $select .= " nodisplay";
  446. $disp = " AND nodisplay = 1";
  447. } else {
  448. $select .= " !nodisplay";
  449. $disp = " AND !nodisplay";
  450. }
  451. ////////////////////////// RESTRICTED CATEGORIES //////////////////////////
  452. $select .= iff($user[cats_admin], " AND category NOT IN ($user[cats_admin]) ");
  453. ////////////////////////// CATEGORY / PRIORITY / TECH OWNER //////////////////////////
  454. // category
  455. if (is_array($_REQUEST['category'])) {
  456. // need to remove -1, array search unreliable
  457. foreach($_REQUEST['category'] AS $key => $var) {
  458. if ($var == '-1') {
  459. unset($_REQUEST['category'][$key]);
  460. $_REQUEST['category'][] = '0';
  461. }
  462. if ($var == '-2') {
  463. $_REQUEST['category'] = array();
  464. }
  465. }
  466. if (count($_REQUEST['category'])) {
  467. $dosql = array2sql($_REQUEST['category']);
  468. $where .= " AND category IN $dosql";
  469. }
  470. } elseif ($_REQUEST['category']) {
  471. $where .= " AND category = $_REQUEST[category]";
  472. }
  473. // priority
  474. if (is_array($_REQUEST['priority'])) {
  475. // need to remove -1, array search unreliable
  476. foreach($_REQUEST['priority'] AS $key => $var) {
  477. if ($var == '-1') {
  478. unset($_REQUEST['priority'][$key]);
  479. $_REQUEST['priority'][] = '0';
  480. }
  481. if ($var == '-2') {
  482. $_REQUEST['priority'] = array();
  483. }
  484. }
  485. if (count($_REQUEST['priority'])) {
  486. $dosql = array2sql($_REQUEST['priority']);
  487. $where .= " AND priority IN $dosql";
  488. }
  489. } elseif ($_REQUEST['priority']) {
  490. $where .= " AND priority = '" . mysql_escape_string($_REQUEST[priority]) . "'";
  491. }
  492. // tech owner (array)
  493. if (is_array($_REQUEST['tech'])) {
  494. // need to remove -1, array search unreliable
  495. foreach($_REQUEST['tech'] AS $key => $var) {
  496. if ($var == '-1') {
  497. $where .= " AND !tech";
  498. $breaking++;
  499. break;
  500. }
  501. if ($var == '-2') {
  502. $breaking++;
  503. break;
  504. }
  505. }
  506. if (!$breaking) {
  507. if ($user['p_tech_view']) {
  508. $dosql = array2sql($_REQUEST['tech']);
  509. $where .= " AND tech IN $dosql";
  510. } else {
  511. $where .= " AND tech = '$user[id]'";
  512. }
  513. }
  514. } elseif ($_REQUEST['tech'] == 'assigned' AND $user['p_tech_view']) { // List *others'* tickets
  515. $where .= " AND tech != $user[id] AND tech";
  516. } elseif ($_REQUEST['tech']) {
  517. if ($_REQUEST['tech'] == '-1') {
  518. $where .= " AND !tech";
  519. $_REQUEST['tech'] = '0';
  520. } else {
  521. $where .= " AND tech = '" . mysql_escape_string($_REQUEST[tech]) . "'";
  522. }
  523. }
  524. ////////////////////////// SPECIFY CERTAIN TICKET FIELDS //////////////////////////
  525. // on these we don't want anything if both match
  526. // open / closed status
  527. if ($_REQUEST['unresolved'] == "1" AND !$_REQUEST['resolved']) {
  528. $where .= " AND is_open = 1";
  529. $form .= form_hidden('unresolved', 1);
  530. } elseif ($_REQUEST['resolved'] == "1" AND !$_REQUEST['unresolved']) {
  531. $where .= " AND is_open = 0";
  532. $form .= form_hidden('resolved', 1);
  533. }
  534. // ticket locked
  535. if ($_REQUEST['is_locked']) {
  536. $where .= " AND is_locked = '1'";
  537. }
  538. // awaiting tech/user
  539. if ($_REQUEST['awaiting_tech'] == "1" AND !$_REQUEST['awaiting_user']) {
  540. $where .= " AND awaiting_tech = 1";
  541. } elseif ($_REQUEST['awaiting_user'] == "1" AND !$_REQUEST['awaiting_tech']) {
  542. $where .= " AND awaiting_tech = 0";
  543. }
  544. // ticketid range
  545. if (isset($_REQUEST['lowid'])) {
  546. $where .= " AND id >= $_REQUEST[lowid]";
  547. }
  548. if (isset($_REQUEST['highid'])) {
  549. $where .= " AND id <= $_REQUEST[highid]";
  550. }
  551. // user id
  552. if ($_REQUEST['user_owner']) {
  553. $userdata = $db->query_return("SELECT id FROM user WHERE username = '" . mysql_escape_string($_REQUEST['user_owner']) . "'");
  554. if (!$db->num_rows()) {
  555. $userdata = $db->query_return("SELECT id FROM user WHERE email = '" . mysql_escape_string($_REQUEST['user_owner']) . "'");
  556. }
  557. if (is_array($userdata)) {
  558. $where .= " AND ticket.userid = $userdata[id]";
  559. }
  560. }
  561. // subject
  562. if ($_REQUEST['subject']) {
  563. if ($_REQUEST['subjectoption'] == 'PHRASE') {
  564. $where .= " AND subject LIKE '%" . mysql_escape_string($_REQUEST['subject']) . "%'";
  565. } else {
  566. if (!($_REQUEST['subjectoption'] == 'AND' OR $_REQUEST['subjectoption'] == 'OR')) {
  567. $_REQUEST['subjectoption'] = 'OR';
  568. }
  569. $words = explode(" ", $_REQUEST['subject']);
  570. $where .= ' AND (';
  571. for ($i=0; $i < count($words); $i++) {
  572. if ($i == "0") {
  573. $where .= " subject LIKE '%$words[$i]%' ";
  574. } else {
  575. $where .= " $_REQUEST[subjectoption] subject LIKE '%$words[$i]%' ";
  576. }
  577. }
  578. $where .= ') ';
  579. }
  580. }
  581. ////////////////////////// TIME CALCULATIONS //////////////////////////
  582. if ($_REQUEST['ydate_started_start']) {
  583. $date1 = mktime (0, 0, 0, $_REQUEST['mdate_started_start'], $_REQUEST['ddate_started_start'], $_REQUEST['ydate_started_start']);
  584. $where .= " AND date_opened >= '$date1'";
  585. }
  586. if ($_REQUEST['ydate_started_end']) {
  587. $date2 = strtotime("$_REQUEST[ydate_started_end]-$_REQUEST[mdate_started_end]-$_REQUEST[ddate_started_end] +23 hours 59 minutes 59 seconds");
  588. $where .= " AND date_opened < '$date2'";
  589. }
  590. if ($_REQUEST['ydate_resolved_start']) {
  591. $date3 = mktime (0, 0, 0, $_REQUEST['mdate_resolved_start'], $_REQUEST['ddate_resolved_start'], $_REQUEST['ydate_resolved_start']);
  592. $where .= " AND ((date_closed >= '$date1') OR !date_closed)";
  593. }
  594. if ($_REQUEST['ydate_resolved_end']) {
  595. $date4 = strtotime("$_REQUEST[ydate_resolved_end]-$_REQUEST[mdate_resolved_end]-$_REQUEST[ddate_resolved_end] +23 hours 59 minutes 59 seconds");
  596. $where .= " AND ((date_closed < '$date2') OR !date_closed)";
  597. }
  598. if ($_REQUEST['ydate_activity_start']) {
  599. $date5 = strtotime("$_REQUEST[ydate_activity_start]-$_REQUEST[mdate_activity_start]-$_REQUEST[ddate_activity_start]");
  600. $where .= " AND ((date_lastreply_tech >= '$date1' OR date_lastreply >= '$date1') OR !date_lastreply)";
  601. }
  602. if ($_REQUEST['ydate_activity_end']) {
  603. $date6 = mktime (0, 0, 0, $_REQUEST['mdate_activity_end'], $_REQUEST['ddate_activity_end'], $_REQUEST['ydate_activity_end']);
  604. $where .= " AND ((date_lastreply_tech < '$date2' OR date_lastreply < '$date1') OR !date_lastreply)";
  605. }
  606. ////////////////////////// CUSTOM TICKET FIELDS //////////////////////////
  607. $db->query('SELECT * FROM ticket_def WHERE tech_viewable ORDER BY displayorder');
  608. while ($result = $db->row_array()) {
  609. $tfields[$result['name']] = $result;
  610. $tname = unserialize($result[display_name]);
  611. $tname = $tname[$settings[default_language]];
  612. $ticket_fields[$result['name']] = array('display_name' => $tname, 'name' => $result['name']);
  613. }
  614. if (is_array($_REQUEST[custom_fields])) {
  615. foreach ($_REQUEST[custom_fields] AS $tkey => $tvar) {
  616. if (in_array($tkey, array_keys($ticket_fields))) {
  617. $tmp = field_search($tfields[$tkey], 
  618. $_REQUEST[custom_fields][$tkey],
  619. $_REQUEST[custom_fields]["extra$tkey"],
  620. 'ticket',
  621. $_REQUEST[custom_fields][$tkey."_match"],
  622. $_REQUEST[custom_fields][$tkey."_not"]
  623. );
  624. if (trim($tmp)) {
  625. $where .= " AND $tmp";
  626. }
  627. }
  628. }
  629. }
  630. /*******************************************************
  631. PART 2: LIMIT BY TICKETS
  632. *******************************************************/
  633. if ($settings[ticket_number]) {
  634. $perpage = $settings[ticket_number];
  635. } else {
  636. $perpage = 20;
  637. }
  638. if ($_REQUEST['page']) {
  639. $page = $_REQUEST['page'];
  640. } else {
  641. $page = 1;
  642. }
  643. $start = $perpage * $page;
  644. $start = $start - $perpage;
  645. $limit = " LIMIT $start, $perpage";
  646. /*******************************************************
  647. PART 3: ORDERING
  648. *******************************************************/
  649. $where .= $disp;
  650. $where .= " GROUP by ticket.id";
  651. $where .= " ORDER by id ASC";
  652. /*******************************************************
  653. PART 4: COLUMN DISPLAY
  654. *******************************************************/
  655. $fields = unserialize($user[fielddisplay]);
  656. // need to display to tech who has not configured
  657. if (!is_array($fields)) {
  658. $fields = array(
  659. 'default' => array('category', 'priority', 'email', 'techowner', 'timetech', 'timestart'),
  660. 'admin' => array(),
  661. 'custom' => array(),
  662. 'other' => array('actions')
  663. );
  664. }
  665. ////////////////////////// DISPLAY HEADERS //////////////////////////
  666. if (in_array('awaitingtu', $fields['default'])) {
  667. $columns[] = 'Awaiting';
  668. }
  669. if (in_array('openclosed', $fields['default'])) {
  670. $columns[] = 'Open/Closed';
  671. }
  672. if (in_array('priority', $fields['default'])) {
  673. $columns[] = 'Priority';
  674. }
  675. if (in_array('category', $fields['default'])) {
  676. $columns[] = 'Category';
  677. }
  678. if (in_array('email', $fields['default'])) {
  679. $columns[] = 'User';
  680. }
  681. if (in_array('techowner', $fields['default'])) {
  682. $columns[] = 'Tech';
  683. }
  684. if (in_array('timestart', $fields['default'])) {
  685. $columns[] = 'Since Opening';
  686. }
  687. if (in_array('timetech', $fields['default'])) {
  688. $columns[] = 'Since Reply';
  689. }
  690. if (is_array($fields['other'])) {
  691. if (!in_array('actions', $fields['other'])) {
  692. $noact = 1;
  693. }
  694. }
  695. foreach ($fields['custom'] AS $key => $var) {
  696. if (is_array($ticket_fields['custom'.$var])) {
  697. $columns[] = $ticket_fields['custom'.$var]['display_name'];
  698. $showfield[] = $ticket_fields['custom'.$var]['name'];
  699. $ticket_custom[$ticket_data[name]] = field_display($ticket_fields['custom'.$var], $ticket[$ticket_data[name]]);
  700. }
  701. }
  702. // display headers for admin custom fields
  703. $sql = array2sql($fields['admin']);
  704. if ($sql) {
  705. $db->query("SELECT * FROM ticket_fielddisplay WHERE id IN $sql");
  706. while ($fielddisplay = $db->row_array()) {
  707. $columns[] = $fielddisplay[name];
  708. $admincols[] = $fielddisplay[code];
  709. }
  710. }
  711. /*******************************************************
  712. PART 5: RUN QUERYS
  713. *******************************************************/
  714. // results search
  715. $query = "
  716. SELECT id 
  717. FROM ticket 
  718. WHERE id = id
  719. $reply_search
  720. $where
  721. ";
  722. $db->query($query);
  723. $total = $db->num_rows();
  724. while ($result = $db->row_array()) {
  725. if (!$first) {
  726. $first = $result['id'];
  727. }
  728. // we only want to save 500 tickets here
  729. if ($y < 500) {
  730. $linkcode .= $result[id] . ",";
  731. $y++;
  732. }
  733. }
  734. if ($y) {
  735. $db->query("INSERT INTO search SET 
  736. query = '" . mysql_escape_string($query) . "',
  737. results = '".mysql_escape_string($linkcode)."',
  738. time = '".mktime()."',
  739. techid = '$user[id]',
  740. total = '$total'
  741. ");
  742. $searchid = $db->last_id();
  743. }
  744. if ($_REQUEST['Jump'] AND $y) {
  745. if ($_REQUEST['ticketid']) {
  746. $first = $_REQUEST['ticketid'];
  747. }
  748. echo "<SCRIPT LANGUAGE="JavaScript">top.center.location.href="load_results.php?id=$first&searchid=$searchid&num=0";</SCRIPT>n";
  749. echo "<a href="load_results.php?id=$first&searchid=$searchid&num=0">Click here to proceed to the ticket list if you aren't automatically directed.</a>";
  750. exit;
  751. }
  752. /*******************************************************
  753. PART 5.5: SOME PROCESSING IF THERE IS A RESULT
  754. *******************************************************/
  755. if ($y) { // we have results
  756. if (!$_REQUEST['sortby']) {
  757. $_REQUEST['sortby'] = 'category';
  758. }
  759. // build quick reply
  760. $db->query("SELECT quickreply.id, quickreply.name, quickreply_cat.name AS catname FROM quickreply
  761. LEFT JOIN quickreply_cat ON (quickreply_cat.id = quickreply.category)
  762. WHERE quickreply.techid = '$user[id]' OR quickreply_cat.global
  763. ORDER BY $_REQUEST[sortby]
  764. ");
  765. while ($result = $db->row_array()) {
  766. if (!$result[catname]) {
  767. $result[catname] = addslashes_js($result[catname]);
  768. $html .= "new Array(true,'quickreply|Pick Message','0|UNCATEGORIZED'),n";
  769. }
  770. if ($result[catname] != $lastcatname) {
  771. $result[catname] = addslashes_js($result[catname]);
  772. $html .= "new Array(true,'quickreply|Pick Message','0|CATEGORY: $result[catname]'),n";
  773. }
  774. $result[name] = addslashes_js($result[name]);
  775. $html .= "new Array(true,'quickreply|Pick Message','$result[id]|- $result[name]'),n";
  776. $lastcatname = $result[catname];
  777. }
  778. // build javascript for drop down menus
  779. echo get_javascript('dropdown.js');
  780. ?>
  781. <SCRIPT language=JavaScript type=text/javascript>
  782. var Arr = new Array(
  783. new Array("form","OPT","SO"),
  784. <?php echo $html; ?>
  785. new Array(true,"close|Close Ticket","1|Email User"),
  786. new Array(true,"close|Close Ticket","2|Do not email user"),
  787. new Array(true,"awaiting_tech|Set as awaiting a tech response",""),
  788. new Array(true,"awaiting_user|Set as awaiting a user response",""),
  789. new Array(true,"open|Open Ticket",""),
  790. new Array(true,"selectone|Select One",""),
  791. new Array(false,"delete|Delete",""),
  792. new Array(false,"nuke|Nuke",""),
  793. new Array(false,"spam|Spam",""),
  794. new Array(false,"nospam|Not Spam","")
  795. );
  796. </SCRIPT>
  797. <?
  798. }
  799. /*******************************************************
  800. PART 6: LOOP THROUGH TICKETS (1. COLUMNS)
  801. *******************************************************/
  802. $user_fields = $db->query_return("
  803. SELECT * FROM user_def WHERE tech_viewable ORDER by displayorder DESC
  804. ");
  805. if (is_array($user_fields)) {
  806. foreach ($user_fields AS $val) {
  807. $val['disp_name'] = unserialize($val[display_name]);
  808. }
  809. }
  810. $db->query($select . $reply_search . $where . $limit);
  811. $this_total = $db->num_rows();
  812. $i=0;
  813. while ($ticket = $db->row_array()) {
  814. $ticket_array[$i] = $ticket[id];
  815. // awaiting tech / user
  816. if (in_array('awaitingtu', $fields['default'])) {
  817. if ($ticket[awaiting_tech] == 1) {
  818. $table[$i][] = "<b>Tech</b>";
  819. } else {
  820. $table[$i][] = "User</b>";
  821. }
  822. }
  823. // open / closed
  824. if (in_array('openclosed', $fields['default'])) {
  825. if ($ticket[is_open] == 1) {
  826. $table[$i][] = "<b>Open</b>";
  827. } else {
  828. $table[$i][] = "Closed";
  829. }
  830. }
  831. // priority
  832. if (in_array('priority', $fields['default'])) {
  833. if ($ticket[priname] == "") {
  834. $table[$i][] = "<i>none</i>";
  835. } else {
  836. $table[$i][] = $ticket[priname];
  837. }
  838. }
  839. // category
  840. if (in_array('category', $fields['default'])) {
  841. if ($ticket[catname] == "") {
  842. $table[$i][] = "<i>none</i>";
  843. } else {
  844. $table[$i][] = $ticket[catname];
  845. }
  846. }
  847. if (in_array('email', $fields['default'])) {
  848. $table[$i][] = "<a href="../users/view.php?id=$ticket[userid]&do=view">$ticket[username]</a>";
  849. }
  850. if (in_array('techowner', $fields['default'])) {
  851. if ($ticket[techname] != "") {
  852. $table[$i][] = $ticket[techname];
  853. } else {
  854. $table[$i][] = "<i>Unassigned</i>";
  855. }
  856. }
  857. $ticket[since_started] = mktime() - $ticket[date_opened];
  858. $ticket[date_opened] = our_date($ticket[date_opened]);
  859. if (in_array('timestart', $fields['default'])) {
  860. $table[$i][] = display_time($ticket[since_started]) . ' ' . html_image('bul042.gif', "Opened: $ticket[date_opened]");
  861. }
  862. if (in_array('timetech', $fields['default'])) {
  863. if ($ticket[date_lastreply] != "0") {
  864. if (!$ticket[date_awaiting_toggled]) {
  865. $ticket[date_awaiting_toggled] = $ticket[date_lastreply];
  866. }
  867. $ticket[since_reply] = mktime() - $ticket[date_awaiting_toggled];
  868. $ticket[date_lastreply] = "Last replied: " . our_date($ticket[date_lastreply], 'Full');
  869. $table[$i][] = display_time($ticket[since_reply]) . html_image('bul042.gif', $ticket['date_lastreply']);
  870. } else {
  871. $table[$i][] = "No replies";
  872. }
  873. }
  874. $num = $start + $i;
  875. // show custom fields selected to view
  876. if (is_array($showfield)) {
  877. foreach ($showfield AS $key => $var) {
  878. $table[$i][] = field_display($tfields[$var], $ticket[$var], 1);
  879. }
  880. }
  881. // parse admin options
  882. if (is_array($admincols)) {
  883. foreach ($admincols AS $key => $var) {
  884. eval("$table[$i][] = "" . addslashes($var) . "";");
  885. }
  886. }
  887. /*******************************************************
  888. PART 7: LOOP THROUGH TICKETS (2.ICONS, SUBJECT AND ACTIONS)
  889. *******************************************************/
  890. /******
  891. * ICONS
  892. ******/
  893. // awaiting reply
  894. if ($ticket['awaiting_tech'] == "1") {
  895. $icons = html_image('tech/bul095.gif', 'Awaiting tech reply');
  896. } else {
  897. $icons = html_image('tech/bul096.gif', 'Awaiting user reply');
  898. }
  899. $icons .= '&nbsp;';
  900. // locked
  901. if ($ticket[is_open] == "0") {
  902. $icons .= html_image('tech/bul097.gif', 'Closed');
  903. }
  904. // attachments
  905. if ($ticket[attachments] > "0") {
  906. $icons .= '&nbsp;';
  907. if ($ticket[attachments] == "1") {
  908. $icons .= html_image('tech/bul099.gif', "$ticket[attachments] attachment");
  909. } else {
  910. $icons .= html_image('tech/bul099.gif', "$ticket[attachments] attachments");
  911. }
  912. }
  913. if ($ticket['nodisplay'] == 1) {
  914. $icons .= '[spam]';
  915. }
  916. if (!$ticket['subject']) {
  917. $ticket['subject'] = 'No subject';
  918. }
  919. /******
  920. * SUBJECT
  921. ******/
  922. $subject_icons = "<table width="100%"><tr valign="top"><td width="45">$icons</td><td valign="top"><b>ID:</b> <a href="load_results.php?id=$ticket[id]&searchid=$searchid&num=$num">$ticket[id]</a> <b>REF:</b> <a href="load_results.php?id=$ticket[id]&searchid=$searchid&num=$num">$ticket[ref]</a>  <b>Subject:</b> <a href="load_results.php?id=$ticket[id]&searchid=$searchid&num=$num">$ticket[subject]</a></td><td align="right">";
  923. unset($icons);
  924. /******
  925. * TICKET OPTIONS
  926. ******/
  927. // create ticket dos
  928. $extra[$i] .= "<table><tr valign="top"><td>
  929. <select onchange="update(this,Arr,$ticket[id])" size="1" name="OPT$ticket[id]">n
  930. <option value="selectone" selected>===== Select one =====</option>n";
  931. // delete ticket
  932. if (p_ticket('delete')) {
  933. $extra[$i] .= "<option value="delete">Delete ticket</option>n";
  934. }
  935. if (p_ticket('delete') AND ($user['p_delete_users'] OR $user['admin'])) {
  936. $extra[$i] .= "<option value="nuke">Delete Ticket, Delete User, and Ban E-mail</option>n";
  937. }
  938. // assign ticket to another tech
  939. if (p_ticket('edit')) {
  940. $extra[$i] .= "<option value="tech">Assign to tech</option>n";
  941. $has_option = 1;
  942. }
  943. // mark ticket completed
  944. if (p_ticket('close') AND $ticket[is_open] == '1') {
  945. $extra[$i] .= "<option value="close">Close Ticket</option>n";
  946. $has_option = 1;
  947. }
  948. // mark ticket as in progress
  949. if (p_ticket('close') AND $ticket[is_open] == '0') {
  950. $extra[$i] .= "<option value="open">Open Ticket</option>n";
  951. $has_option = 1;
  952. }
  953. // mark ticket awaiting a user response
  954. if (p_ticket('edit') AND $ticket['awaiting_tech'] == '1') {
  955. $extra[$i] .= "<option value="awaiting_user">Set as awaiting a user response</option>n";
  956. $has_option = 1;
  957. }
  958. // mark ticket awaiting a tech response
  959. if (p_ticket('edit') AND $ticket['awaiting_tech'] == '0') {
  960. $extra[$i] .= "<option value="awaiting_tech">Set as awaiting a tech response</option>n";
  961. $has_option = 1;
  962. }
  963. // quick replies
  964. if (p_ticket('edit')) {
  965. $extra[$i] .= "<option value="quickreply">Reply with quick reply</option>n";
  966. $has_option = 1;
  967. }
  968. // edit priority / category
  969. if (p_ticket('edit')) {
  970. $extra[$i] .= "<option value="priority">Change priority</option><option value="category">Change category</option>n";
  971. $has_option = 1;
  972. }
  973. if (p_ticket('edit') AND $ticket['nodisplay']) {
  974. $extra[$i] .= "<option value="nospam">Remove "Spam" flag from this ticket</option>n";
  975. $has_option = 1;
  976. }
  977. if (p_ticket('edit') AND !$ticket['nodisplay']) {
  978. $extra[$i] .= "<option value="spam">Set "Spam" flag for this ticket</option>n";
  979. $has_option = 1;
  980. }
  981. if ($has_option) {
  982. $extra[$i] .= "</select></td><td>
  983. <div id="Layer$ticket[id]" style="visibility: hidden">
  984. <select onchange="update(this,Arr,$ticket[id]);" size="1" name="SO$ticket[id]">
  985. <option selected>Sub OPT</option>
  986. </select>
  987. </div></td><td>" . thelp('Tickets - Searching', 'Search Results') . "</td>
  988. </tr></table></td></tr></table>";
  989. unset($has_option);
  990. } else {
  991. $extra[$i] = '</td></tr></table>';
  992. }
  993. if ($noact) {
  994. $extra[$i] = $subject_icons . '</td></tr></table>';
  995. } else {
  996. $extra[$i] = $subject_icons . $extra[$i];
  997. }
  998. $i++;
  999. }
  1000. /*******************************************************
  1001. PART 8: LOOP THROUGH TICKETS (3. 1st MESSAGE)
  1002. *******************************************************/
  1003. $i = 0;
  1004. $db->query("SELECT id, message, ticketid 
  1005. FROM ticket_message 
  1006. WHERE ticketid IN " . array2sql($ticket_array, '0') . "
  1007. GROUP BY ticketid
  1008. ORDER BY date DESC
  1009. ");
  1010. while ($result = $db->row_array()) {
  1011. $message_log[$result[ticketid]] = "
  1012. <table width="100%" class="table_midheader"><tr><td><b>Last Message:</b>&nbsp;&nbsp;" . trimstring(htmlspecialchars_uni($result[message]), 400, 1) . "</td></tr></table>";
  1013. }
  1014. if (is_array($ticket_array)) {
  1015. foreach ($ticket_array AS $key => $var) {
  1016. $extra2[$i] = iff($message_log[$var], $message_log[$var], ' ');
  1017. $i++;
  1018. }
  1019. }
  1020. /*******************************************************
  1021. PART 9: DISPLAY PAGE
  1022. *******************************************************/
  1023. if (is_array($table)) {
  1024. if ($total < $perpage) {
  1025. if ($total == 1) {
  1026. $message = "The following ticket matched your search criteria";
  1027. } else {
  1028. $message = "The following $total tickets matched your search criteria";
  1029. }
  1030. } else {
  1031. $pages = ceil($total / $perpage);
  1032. if ($page == 1) {
  1033. $t_start = 1;
  1034. } else {
  1035. $t_start = $perpage * ($page - 1) + 1;
  1036. }
  1037. $t_end = ($perpage * ($page -1)) + $this_total;
  1038. $message = "$total tickets matched your search criteria. Showing page $page of $pages / Showing tickets $t_start to $t_end";
  1039. }
  1040. table_header("$message [ <a href=./../settings/ticketdisplay.php?saved_search=$searchid>edit column display</a> ]", 'ticketactions.php', array('searchtype' => iff($_REQUEST['searchtype'], $_REQUEST['searchtype'], 'simple'), 'do' => 'process', 'variables' => serialize($_REQUEST)), '', 'form', '',  'onsubmit="return ValidateSelection()"');
  1041. table_content($columns, $table, $extra, '', '', $extra2);
  1042. table_footer('Process Tickets');
  1043. ////////////////////////// BUILD NEXT AND PREV LINKS //////////////////////////
  1044. $variables = serialize($_REQUEST);
  1045. echo "<form action="ticketsearch.php" method="post" name="frm">";
  1046. echo form_hidden('variables', $variables) . form_hidden('do', 'search');
  1047. echo pagenav($total, $perpage, $page, '', 'frm', 'select', 'page');
  1048. echo "<span id="hiddenbit"></span></form>";
  1049. ////////////////////////// BUILD KEY //////////////////////////
  1050. } else {
  1051. echo "<b><center>No tickets matched the specified criteria</center></b>";
  1052. }
  1053. }
  1054. tech_footer();
  1055. ?>