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

电子政务应用

开发平台:

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: ticketview.php,v $
  15. // | $Date: 2004/02/10 01:34:31 $
  16. // | $Revision: 1.201 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Ticket details and history viewer.
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL ^ E_NOTICE);
  22. // start file
  23. require("./../global.php");
  24. // globalise variables
  25. $global = array (
  26. array('id') 
  27. );
  28. rg($global);
  29. if (!$id) {
  30. mistake("No ticket was specified");
  31. exit();
  32. }
  33. ############################### GET TICKET DATA ###############################
  34. $id = mysql_escape_string($id);
  35. $query = "
  36. SELECT 
  37. ticket.*,
  38. tech.username AS techusername,
  39. ticket_cat.name AS catname,
  40. tech.id AS techid,
  41. ticket_pri.name AS priname,
  42. user.id AS userid,
  43. user.email AS email
  44. FROM ticket
  45. LEFT JOIN ticket_cat ON (ticket.category = ticket_cat.id)
  46. LEFT JOIN ticket_pri ON (ticket.priority = ticket_pri.id)
  47. LEFT JOIN user ON (ticket.userid = user.id)
  48. LEFT JOIN tech ON (ticket.tech = tech.id)
  49. ";
  50. $ticket = $db->query_return($query . " WHERE ticket.id = '$id'");
  51. if (!$db->num_rows()) {
  52. $ticket = $db->query_return($query . " WHERE ticket.ref = '$id'");
  53. if (is_array($ticket)) {
  54. $id = $ticket['id'];
  55. }
  56. }
  57. if (!$db->num_rows()) { // Try checking in ticket_merge too
  58. $ticket = $db->query_return("SELECT * FROM ticket_merge WHERE old_id = '$id'");
  59. if (!$db->num_rows()) {
  60. $ticket = $db->query_return("SELECT * FROM ticket_merge WHERE old_ref = '$id'");
  61. }
  62. }
  63. if ($ticket['new_id']) {
  64. $ticket = $db->query_return($query . " WHERE ticket.id = '$ticket[new_id]'");
  65. $id = $ticket['id'];
  66. }
  67. ############################### PERMISSIONS ###############################
  68. if (!$db->num_rows()) {
  69. mistake("Ticket Not Found. Either an invalid ID or REF ('$id') was specified, or the ticket has been deleted");
  70. }
  71. tech_nav('Tickets', 'View Ticket');
  72. if ($_REQUEST['do'] == 'delnote' AND $_REQUEST['noteid']) {
  73. if (p_ticket('edit')) {
  74. $note = $db->query_return("SELECT * FROM ticket_notes WHERE id = '$_REQUEST[noteid]'");
  75. ticketlog($id, 'note_deleted', 0, 0, $note['note'], NULL, NULL);
  76. $db->query("DELETE FROM ticket_notes WHERE techid = '$user[id]' AND id = '$_REQUEST[noteid]'");
  77. }
  78. }
  79. // permission to view
  80. if (!p_ticket('view')) {
  81. nopermission('to view this ticket');
  82. }
  83. // locked?
  84. if (($ticket[is_locked]) && ($ticket[lock_id] != $user[id])) {
  85. $lock_html = '<table cellpadding="3" cellspacing="0"><tr><td>' . html_image('tech/bul074.gif') . "</td><td><b>THIS TICKED IS CURRENTLY LOCKED</b></td><td>" . html_image('tech/bul074.gif') . "</td></tr></table><br /> (since " . our_date($ticket[date_locked]);
  86. if (p_ticket('edit')) {
  87. $lock_html .= "<br /><a href="ticketactions.php?do=unlock&id=$id"><b>Remove lock status</b></a></center>";
  88. } else {
  89. $lock_html .= "<br />You cannot make changes to this ticket until the technician assigned to it has unlocked it.</center>";
  90. }
  91. echo table_border($lock_html);
  92. }
  93. ############################### CACHE SOME DATA ###############################
  94. $techname[0] = 'Unassigned';
  95. $priority[0] = '';
  96. $category[0] = '';
  97. // techs
  98. $db->query("SELECT id, username FROM tech");
  99. while ($tech = $db->row_array()) {
  100. $techname[$tech[id]] = $tech['username'];
  101. $techlist[$tech[id]] = $tech['username']; // This list doesn't include "Unassigned"
  102. }
  103. // categories
  104. $db->query("SELECT id, name FROM ticket_cat");
  105. while ($cat = $db->row_array()) {
  106. $category[$cat[id]] = $cat[name];
  107. }
  108. // priorities
  109. $db->query("SELECT id, name FROM ticket_pri");
  110. while ($pri = $db->row_array()) {
  111. $priority[$pri[id]] = $pri[name];
  112. }
  113. #################### TECHNICIANS SAVED TICKETS ##########################
  114. $db->query("SELECT ticketid FROM tech_ticket_save WHERE techid = '$user[id]'");
  115. while ($save = $db->row_array()) {
  116. $saved[] = $save[ticketid];
  117. }
  118. ############################### TICKET ACTIONS ###############################
  119. if (p_ticket('edit')) {
  120. // lock
  121. if ($ticket[is_locked] != '1') {
  122. $top_links[] = jprompt(
  123. 'This will lock the ticket, preventing other techs from changing or replying to it.',
  124. "ticketactions.php?do=lock&id=$id",
  125. "Lock Ticket"
  126. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Lock/Unlock Ticket');
  127. }
  128. if ($ticket[is_locked] == '1') {
  129. $top_links[] = jprompt(
  130. 'This will unlock the ticket, there may already be a tech working on this ticket',
  131. "ticketactions.php?do=unlock&id=$id",
  132. "Unlock Ticket"
  133. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Lock/Unlock Ticket');
  134. }
  135. // awaiting user
  136. if ($ticket[awaiting_tech] == "1" AND $ticket[is_open] == "1") {
  137. $top_links[] = jprompt(
  138. "This will mark the ticket Awaiting User Response.",
  139. "ticketactions.php?do=awaiting_user&id=$id",
  140. "Mark Awaiting User Response"
  141. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Awaiting Status');
  142. }
  143. // awaiting tech
  144. if ($ticket[awaiting_tech] == "0" AND $ticket[is_open] == "1") {
  145. $top_links[] = jprompt(
  146. "This will mark the ticket Awaiting Technician Response.",
  147. "ticketactions.php?do=awaiting_tech&id=$id",
  148. "Mark Awaiting Tech Response"
  149. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Awaiting Status');
  150. }
  151. // remove ownership
  152. if ($ticket[tech] == $user[id]) {
  153. $top_links[] = jprompt(
  154. "This will remove your ownership and mark the ticket Unassigned.",
  155. "ticketactions.php?do=remove_ownership&id=$id",
  156. 'Remove Your Ownership'
  157. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Ticket Ownership');
  158. // take ownership
  159. } elseif (p_ticket('edit')) {
  160. $top_links[] = "<a href="ticketactions.php?do=take_ownership&id=$id">Take Ticket Ownership</a>";
  161. }
  162. if ($ticket['nodisplay'] == 1) {
  163. $top_links[] = jprompt(
  164. 'This will mark the ticket as non-spam. It will appear in normal ticket lists.',
  165. "ticketactions.php?do=nospam&id=$id",
  166. 'Mark as Non-Spam'
  167. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Handling "Spam"');
  168. } else {
  169. $top_links[] = jprompt(
  170. 'This will mark the ticket as spam. It will not appear in normal ticket lists (but you can still search for it in Ticket Search).',
  171. "ticketactions.php?do=spam&id=$id",
  172. 'Mark as Spam'
  173. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Handling "Spam"');
  174. }
  175. }
  176. // delete
  177. if (p_ticket('delete')) {
  178. $top_links[] = jprompt(
  179. 'This will delete the ticket.',
  180. "ticketactions.php?do=delete&id=$id",
  181. "Delete Ticket"
  182. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Deleting a Ticket');
  183. }
  184. // close // reopen
  185. if (p_ticket('close')) {
  186. if ($ticket[is_open] == "1") {
  187. $top_links[] = jprompt_multi(
  188. 'This will close the ticket.',
  189. 'Select [OK] to send an e-mail notification to the user, or [CANCEL] to close the ticket without mailing notification.',
  190. "ticketactions.php?do=close&id=$id&email=1",
  191. "ticketactions.php?do=close&id=$id",
  192. "Close"
  193. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Closing a Ticket');
  194. } else {
  195. $top_links[] = jprompt_multi(
  196. 'This will re-open the ticket.',
  197. 'Select [OK] to send an e-mail notification to the user, or [CANCEL] to re-open the ticket without mailing notification.',
  198. "ticketactions.php?do=open&id=$id&email=1",
  199. "ticketactions.php?do=open&id=$id",
  200. "Re-open"
  201. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Re-opening a Ticket');
  202. }
  203. }
  204. if (@in_array($id, $saved)) {
  205. $top_links[] = "<A HREF="ticketactions.php?do=unstore&id=$id">Remove Ticket from Saved Tickets</A>" . ' ' . thelp('Tickets - Viewing and Responding', 'Saving Tickets');
  206. } else {
  207. $top_links[] = "<A HREF="ticketactions.php?do=store&id=$id">Add Ticket to Saved Tickets</A> (<A HREF="javascript:openWindow('popupactions.php?do=store&id=$id', '', '')">pick cat</A>)" . ' ' . thelp('Tickets - Viewing and Responding', 'Saving Tickets');
  208. }
  209. if ($user['p_delete_users']) {
  210. $top_links[] = jprompt('This will prevent tickets being submitted by ' .
  211. htmlspecialchars($ticket['email']). '!',
  212. "ticketactions.php?id=$id&do=banmail&email=".urlencode($ticket['email']), 
  213. 'Ban this e-mail address'
  214. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Handling "Spam"');
  215. $top_links[] = jprompt('This will delete this user, all tickets created by this user, and ban the e-mail address ' .
  216. htmlspecialchars($ticket['email']) . '!',
  217. "ticketactions.php?id=$id&do=nuke", 
  218. 'Ban user/delete user & tickets'
  219. ) . ' ' . thelp('Tickets - Viewing and Responding', 'Handling "Spam"');
  220. }
  221. foreach ($top_links AS $key => $var) {
  222. $top_links_html .= "<tr><td>" . html_image('tech/blue.gif', 4, 4) . "</td><td>$var</td></tr>";
  223. }
  224. $top_links = "<table cellpadding="2" cellspacing="0">$top_links_html</table>";
  225. ############################### TICKET STATUS ###############################
  226. $ticket_status = "<table>";
  227. // open / closed
  228. if ($ticket[is_open] == 1) {
  229. $message = 'Ticket is Open';
  230. } else {
  231. $message = 'Ticket is Closed';
  232. }
  233. $ticket_status .= "<tr><td>" . html_image('tech/bul070.gif') . '</td><td>' . table_thelp($message, 'Tickets - Viewing and Responding', 'Open/Closed') . '</td></tr>';
  234. // awaiting user/tech
  235. if ($ticket[awaiting_tech] == 1) {
  236. $message = 'Ticket is awaiting Tech';
  237. } else {
  238. $message = 'Ticket is awaiting User';
  239. }
  240. $ticket_status .= "<tr><td>" . html_image('tech/bul072.gif') . '</td><td>' . table_thelp($message, 'Tickets - Viewing and Responding', 'Awaiting Status') . '</td></tr>';
  241. // ticket locked
  242. if ($ticket[is_locked] == 1) {
  243. $ticket_status .= "<tr><td>" . html_image('tech/bul074.gif') . '</td><td>' . table_thelp('Ticket is Locked', 'Tickets - Viewing and Responding', 'Locked') . '</td></tr>';
  244. }
  245. // who is ticket owned by
  246. if ($ticket[tech] == $user[id]) {
  247. $message = 'Ticket is assigned to you';
  248. } elseif ($ticket[tech] == 0) {
  249. $message = "Ticket is unassigned";
  250. } else {
  251. $message = "Ticket is assigned to <a href="./../teamwork/techs.php">$ticket[techusername]</a>";
  252. }
  253. $ticket_status .= "<tr><td>" . html_image('tech/bul077.gif') . '</td><td>' . table_thelp($message, 'Tickets - Viewing and Responding', 'Ticket Ownership') . '</td></tr>';
  254. $ticket_status .= "</table>";
  255. ############################### TICKET FIELDS ###############################
  256. // Admin fields
  257. $fields = unserialize($user['fielddisplay']);
  258. $sql = array2sql($fields['admin']);
  259. if ($sql) {
  260. $db->query("SELECT * FROM ticket_fielddisplay WHERE id IN $sql");
  261. while ($fielddisplay = $db->row_array()) {
  262. $admincols[$fielddisplay['name']] = $fielddisplay['code'];
  263. }
  264. }
  265. // Calculate time-since-started and show it
  266. if ($ticket[is_open]) {
  267. $since_started = mktime() - $ticket[date_opened];
  268. } else {
  269. $since_started = $ticket[date_closed] - $ticket[date_opened];
  270. }
  271. $since_started = clean_time($since_started);
  272. // generic
  273. give_default($ticket['techusername'], '<i>Unassigned</i>');
  274. give_default($ticket['catname'], '<i>None</i>');
  275. give_default($ticket['priname'], '<i>None</i>');
  276. if ($ticket[is_open]) {
  277. $table_ticket_fields[] = array(table_thelp('<b>Time Since Opened</B>', 'Tickets - Viewing and Responding', 'Time Since Opened'), $since_started);
  278. if ((($ticket[date_lastreply] > $ticket[date_lastreply_tech]) OR !$ticket[date_lastreply_tech]) AND $ticket[awaiting_tech]) {
  279. if (!$ticket[date_awaiting_toggled]) {
  280. $tmp_time = mktime() - $ticket[date_opened];
  281. } else {
  282. $tmp_time = mktime() - $ticket[date_awaiting_toggled];
  283. }
  284. $table_ticket_fields[] = array(table_thelp('<b>Time Since User Response</b>', 'Tickets - Viewing and Responding', 'Time Since User Response'), clean_time($tmp_time));
  285. }
  286. } else {
  287. $table_ticket_fields[] = array(table_thelp('<b>Time to Close</B>', 'Tickets - Viewing and Responding', 'Time to Close'), $since_started);
  288. }
  289. $table_ticket_fields[] = array('<b>Ticket Subject</b>', $ticket['subject']);
  290. $table_ticket_fields[] = array('<b>Tech Owner</b>', $ticket['techusername']);
  291. $table_ticket_fields[] = array('<b>Category</b>', $ticket['catname']);
  292. $table_ticket_fields[] = array('<b>Priority</b>', $ticket['priname']);
  293. // custom fields
  294. $db->query("
  295. SELECT * 
  296. FROM ticket_def 
  297. WHERE tech_viewable
  298. ORDER by displayorder
  299. ");
  300. while ($ticket_data = $db->row_array()) {
  301. $ticket_data[display_name] = unserialize($ticket_data[display_name]);
  302. $ticket_data[display_name] = $ticket_data[display_name][$settings[default_language]];
  303. $ticket_data[description] = unserialize($ticket_data[description]);
  304. $ticket_data[description] = $ticket_data[description][$settings[default_language]];
  305. $ticket_custom[$ticket_data[name]] = field_display($ticket_data, $ticket[$ticket_data[name]], 1);
  306. // normal display
  307. if ($ticket[$ticket_data[name]]) {
  308. $table_ticket_fields[] = array("<B>$ticket_data[display_name]</B>", $ticket_custom[$ticket_data[name]]);
  309. }
  310. // edit display
  311. if ($ticket_data['tech_editable']) {
  312. $table_ticket_fields2[] = array("
  313. <b>$ticket_data[display_name]</b><br />$ticket_data[description]", 
  314. field_def(
  315. $ticket_data, 
  316. 'edit', 
  317. '', 
  318. '', 
  319. $ticket[$ticket_data[name]])
  320. );
  321. } else {
  322. $table_ticket_fields2[] = array("
  323. <b>$ticket_data[display_name]</b><br />$ticket_data[description]", 
  324. $ticket_custom[$ticket_data[name]]
  325. );
  326. }
  327. }
  328. ############################### EDIT FIELDS (displayed after a click) ###############################
  329. if (!(($ticket[tech] != $user[id]) && ($ticket[tech] != "0") && ($user[p_tech_edit] != "1"))) {
  330. $bit = form_input('subject', $ticket['subject']);
  331. $table_temp[] = array('<b>Subject</b>', $bit);
  332. $bit = form_select('category', $category, '', $ticket['category']);
  333. $table_temp[] = array("<b>Category</b>", $bit);
  334. $bit = form_select('priority', $priority, '', $ticket['priority']);
  335. $table_temp[] = array('<b>Priority</b>', $bit);
  336. $bit = form_select('tech', $techname, '', $ticket['techid']);
  337. if (!$ticket['awaiting_tech']) {
  338. $bit = "<table><tr><td>$bit</td><td>" . form_checkbox_single('awaiting_tech', 1, 1) . ' Mark ticket "Awaiting Tech Response"</td></tr></table>';
  339. }
  340. $table_temp[] = array('<b>Tech</b>', $bit);
  341. $table_ticket_fields2 = array_merge($table_temp, $table_ticket_fields2);
  342. }
  343. ############################### CALENDAR FUNCTIONS ###############################
  344. $table_calendar[0] .= "<table cellpadding="0" cellspacing="0"><tr>";
  345. $table_calendar[0] .= form_hidden('do', 'reminder');
  346. $table_calendar[0] .= form_hidden('id', $ticket[id]);
  347. $table_calendar[0] .= "<td><b>Remind</b> ";
  348. $table_calendar[0] .= form_select('tech', $techlist, NULL, $user['id']);
  349. $table_calendar[0] .=  "<select name="days">
  350. <option value="1">1</option>
  351. <option value="7">7</option>
  352. <option value="14">14</option>
  353. <option value="21">21</option>
  354. <option value="28">28</option>
  355. </select>";
  356. $table_calendar[0] .= " <b>days</b> <input type="submit" name="remind1" value="Remind">&nbsp;" . thelp('Tickets - Viewing and Responding', 'Remind After Interval');
  357. $table_calendar[0] .= "</td></tr>";
  358. $table_calendar[0] .= "</table>";
  359. $table_calendar[1] .= "<table cellpadding="0" cellspacing="0"><tr>";
  360. $table_calendar[1] .= "<td><b>Remind</b> ";
  361. $table_calendar[1] .= form_select('tech2', $techlist, NULL, $user['id']);
  362. $table_calendar[1] .=  form_date('date', '', '', '1');
  363. $table_calendar[1] .=  " <input type="submit" name="remind2" value="Remind">&nbsp;" . thelp('Tickets - Viewing and Responding', 'Remind On Date');
  364. $table_calendar[1] .= "</td></tr>";
  365. $table_calendar[1] .= "</table>";
  366. $watches = $db->query_return_array("SELECT * FROM tech_ticket_watch WHERE ticketid = '$id' AND techid = '$user[id]'");
  367. if (is_array($watches)) {
  368. $table_calendar[2] = table_midheader('Reminders');
  369. $table_calendar[3] .= "<TABLE><TR>
  370. <TD ALIGN="center"><B>Added</B></TD><TD>&nbsp;</TD>
  371. <TD ALIGN="center"><B>Due</B></TD><TD>&nbsp;</TD>
  372. <TD ALIGN="center"><B>Done?</B></TD></TR>";
  373. foreach ($watches AS $watch) {
  374. $watch['datetodo_exp'] = explode('-', $watch['datetodo']);
  375. $link = "<A HREF="ticketedit.php?do=remindertoggle&id=$id&watchid=$watch[id]">";
  376. $table_calendar[3] .= "<TR><TD>" . our_date($watch['created']) . "</TD><TD>&nbsp;</TD><TD>" 
  377. . our_date(strtotime($watch['datetodo'])) . "</TD><TD>&nbsp;</TD><TD>" .
  378. iff($watch['completed'], "$link Yes</A>", "$link No</A>") . "</TD></TR>";
  379. }
  380. $table_calendar[3] .= "</TABLE>";
  381. }
  382. ############################### PAYMENT FUNCTIONS ################################
  383. $table_payment[] .= "<input type="hidden" name="id" value="$id"><input type="hidden" name="do" value="charge">Charge this user: <input type="text" name="charge" size="5" value="0.00"> <input type="submit" name="charge1" value="Charge">&nbsp;" . thelp('Tickets - Viewing and Responding', 'Charge Amount');
  384. $table_payment[] .= "<input type="hidden" name="id" value="$id"><input type="hidden" name="userid" value="$ticket[userid]">Add time charge: <input type="text" name="hours" size="2">&nbsp;&nbsp;h <input type="text" name="minutes" size="2">&nbsp;&nbsp;m <input type="text" name="seconds" size="2">&nbsp;&nbsp;s <input type="submit" name="charge2" value="Charge">&nbsp;" . thelp('Tickets - Viewing and Responding', 'Charge Time');
  385. $table_payment[] .= "<input type="button" name="remind1" value="Start Timer" onClick="timer_Start(); return true">&nbsp;&nbsp;<input type="button" name="remind1" value="Stop Timer" onClick="timer_Stop();">&nbsp;&nbsp; <input type="button" name="remind1" value="Stop/Reset Timer" onClick="timer_Reset(); timer_Stop(); return true;">&nbsp;" . thelp('Tickets - Viewing and Responding', 'Timer');
  386. ############################### BILLING DETAILS ################################
  387. $db->query("SELECT user_bill.*, tech.username AS techname
  388. FROM user_bill 
  389. LEFT JOIN tech ON tech.id = user_bill.techid 
  390. WHERE ticketid = '$ticket[id]'
  391. ORDER BY stamp");
  392. $help = thelp('Tickets - Viewing and Responding', 'Billing Details and Actions');
  393. $table_billing_cols = array('Billing Tech', 'Time', 'Charge', "Paid $help", "Billable $help", 'Date', "Delete $help");
  394. while ($bill = $db->row_array()) {
  395. if ($bill['paid']) {
  396. $bill['paid'] = "<A HREF="ticketedit.php?do=updatebillingpaid&id=$id&billid=$bill[id]&paid=0">Y</A>";
  397. } else {
  398. $bill['paid'] = "<A HREF="ticketedit.php?do=updatebillingpaid&id=$id&billid=$bill[id]&paid=1">N</A>";
  399. }
  400. if ($bill['billable']) {
  401. $bill['billable'] = "<A HREF="ticketedit.php?do=updatebillingbillable&id=$id&billid=$bill[id]&billable=0">Y</A>";
  402. } else {
  403. $bill['billable'] = "<A HREF="ticketedit.php?do=updatebillingbillable&id=$id&billid=$bill[id]&billable=1">N</A>";
  404. }
  405. $table_billing[] = array(
  406. $bill['techname'],
  407. clean_time($bill['time']),
  408. number_format($bill['charge'], 2),
  409. $bill['paid'],
  410. $bill['billable'],
  411. our_date($bill['stamp']),
  412. "<A HREF="ticketedit.php?do=deletebilling&id=$id&billid=$bill[id]">Delete</A>"
  413. );
  414. }
  415. if (!count($table_billing)) {
  416. $table_billing[] = array('No billing events.');
  417. $billing = 0;
  418. } else {
  419. $billing = 1;
  420. }
  421. ############################### USER DATA ###############################
  422. $banned = unserialize(get_data('email_ban'));
  423. if (@in_array($ticket['email'], $banned)) { 
  424. $banned = '&nbsp;&nbsp;<I>Banned</I>';
  425. } else {
  426. $banned = '';
  427. }
  428. $ticket_user = $db->query_return("SELECT * FROM user WHERE id = '$ticket[userid]'");
  429. if (!$ticket_user['email']) {
  430. $ticket_user['email'] = '<I>None</I>';
  431. } else {
  432. $ticket_user['email'] = "<A HREF="mailto:$ticket_user[email]">$ticket_user[email]</A>";
  433. }
  434. $table_user[] = array("<b>Name:</b>", iff($ticket_user[name], $ticket_username['name'], 'n/a'));
  435. $table_user[] = array("<b>Username</b>", $ticket_user['username'] . " <A HREF="newticket.php?oldusername=$ticket_user[username]">(new ticket)</A>");
  436. $table_user[] = array("<b>Email</b>",  "$ticket_user[email] $banned");
  437. if ($ticket_user['autoresponds']) {
  438. $autoresp = "<A HREF="ticketactions.php?do=autoresp&id=$id&userid=$ticket_user[id]&val=0"><B>Yes</B></A>";
  439. } else {
  440. $autoresp = "<A HREF="ticketactions.php?do=autoresp&id=$id&userid=$ticket_user[id]&val=1">No</A>";
  441. }
  442. $table_user[] = array(table_thelp('<B>Autoresponds?</B>', 'Users', 'Edit: Has Autoresponder?'), $autoresp);
  443. $db->query("
  444. SELECT * FROM user_def WHERE tech_viewable ORDER by displayorder
  445. ");
  446. while ($user_data = $db->row_array()) {
  447. $user_data['display_name'] = unserialize($user_data[display_name]);
  448. $user_data['display_name'] = $user_data[display_name][$settings[default_language]];
  449. $table_user[] = array("<B>$user_data[display_name]</B>", field_display($user_data, $ticket_user[$user_data['name']]));
  450. }
  451. ############################### ADMIN FIELDS ###############################
  452. if (is_array($admincols)) {
  453. foreach($admincols AS $name => $val) {
  454. $val = addslashes($val);
  455. eval("$val = "$val";");
  456. $table_ticket_fields[] = array("<B>$name</B>", $val);
  457. }
  458. }
  459. ############################### USER TICKETS ###############################
  460. if ($_REQUEST['do'] == 'viewall') {
  461. $term = '';
  462. } else {
  463. $term = 'LIMIT 0,10';
  464. }
  465. $db->query("
  466. SELECT id,subject,is_open,awaiting_tech 
  467. FROM ticket 
  468. WHERE userid = '$ticket[userid]' 
  469. AND id != '$ticket[id]'
  470. ORDER BY is_open desc, awaiting_tech desc, date_lastreply $term
  471. ");
  472. while ($user_tickets = $db->row_array()) {
  473. if ($user_tickets[is_open]) {
  474. $isopen = "Open";
  475. } else {
  476. $isopen = "Closed";
  477. }
  478. $table_user_tickets[] = array(
  479. "<a href="ticketview.php?id=$user_tickets[id]">$user_tickets[subject]</a>", 
  480. $isopen,
  481. iff($user_tickets['awaiting_tech'], 'Tech', 'User'),
  482. jprompt("This will merge ticket #$user_tickets[id] into the ticket being viewed (#$ticket[id]).\n Note that any fields set for ticket #$user_tickets[id] will be lost if you proceed.", 
  483. "ticketactions.php?do=merge&fromticket=$user_tickets[id]&toticket=$ticket[id]", 
  484. 'Merge'
  485. )
  486. );
  487. }
  488. if ($_REQUEST['do'] == 'viewall') {
  489. $table_user_tickets_header = "Showing user's $count[total] other ticket(s)";
  490. $table_user_tickets_footer = redirect_button('Show only recent tickets', "./../tickets/ticketview.php?id=$ticket[id]");
  491. } else {
  492. // need to get total
  493. $count = $db->query_return("
  494. SELECT COUNT(*) AS total 
  495. FROM ticket 
  496. WHERE userid = '$ticket[userid]' 
  497. AND id != '$ticket[id]'
  498. ");
  499. if ($count[total] > 10) {
  500. $table_user_tickets_header = "Showing last 10 of $count[total] other tickets";
  501. $table_user_tickets_footer = redirect_button('Show all tickets', "./../tickets/ticketview.php?do=viewall&id=$ticket[id]");
  502. } else {
  503. $table_user_tickets_header = "Showing user's $count[total] other ticket(s)";
  504. $table_user_tickets_footer = '';
  505. }
  506. }
  507. ############################### ATTACHMENTS ###############################
  508. $db->query("SELECT filesize, id, filename FROM ticket_attachments WHERE ticketid = '$id'");
  509. if ($db->num_rows() > 0) {
  510. $is_attachment = 1;
  511. $cols = array(
  512. 'Name',
  513. 'Size',
  514. 'Uploaded By',
  515. 'Download',
  516. 'Delete'
  517. );
  518. while ($attachment = $db->row_array()) {
  519. $attachment['filesize'] = number_format($attachment[filesize] / 1024, 2);
  520. $table_attachments[] = array(
  521. $attachment['filename'],
  522. $attachment['filesize'] . " kb",
  523. "<a href="attachment.php?id=$attachment[id]">download</a>",
  524. jprompt(
  525. 'This will delete the attachment.',
  526. "attachment.php?do=delete&id=$attachment[id]",
  527. "Delete"
  528. )
  529. );
  530. }
  531. }
  532. ############################### MESSAGES ###############################
  533. function quotemessage($message) {
  534. $message = preg_replace("/(rn|n|r)/", "n> ", $message);
  535. $message = addslashes_js($message);
  536. $message = '\r\n> ' . $message;
  537. return $message;
  538. }
  539. $table_messages[0] = '';
  540. $table_message_count = 0;
  541. $total_messages = $db->query_return("SELECT count(*) AS total FROM ticket_message WHERE ticketid = '$id'");
  542. $total_messages = $total_messages['total'];
  543. if ($_REQUEST[messages] == 'all') {
  544. $table_message_start = 0;
  545. $limit = '';
  546. } else {
  547. $table_message_start = $total_messages - 10;
  548. if ($table_message_start < 0) {
  549. $table_message_start = 0;
  550. }
  551. $limit = "LIMIT $table_message_start,10";
  552. }
  553. $db->query("
  554. SELECT ticket_message.*, tech.username AS t_username, user.username AS u_username
  555. FROM ticket_message
  556. LEFT JOIN tech ON ticket_message.techid = tech.id
  557. LEFT JOIN user ON ticket_message.userid = user.id
  558. WHERE ticket_message.ticketid = '$id'
  559. ORDER by ticket_message.date
  560. $limit
  561. ");
  562. $timerjs = "
  563. <script language="JavaScript">
  564. var timerID = 0;
  565. var tStart  = null;
  566. function timer_UpdateTimer() {
  567.    if(timerID) {
  568.       clearTimeout(timerID);
  569.       timerID  = 0;
  570.    }
  571.    if(!tStart) {
  572.       tStart   = new Date();
  573.    }
  574.    var   tDate = new Date();
  575.    var   tDiff = (tDate.getTime() - tStart.getTime()) + 1000;
  576.    tDiff = tDiff / 1000;
  577.    var tHours = parseInt(tDiff / 3600);
  578.    tDiff = tDiff - (tHours * 3600);
  579.    var tMinutes = parseInt(tDiff / 60);
  580.    tDiff = tDiff - (tMinutes * 60);
  581.    var tSeconds = parseInt(tDiff);
  582.    
  583.    document.payment.hours.value = tHours;
  584.    document.payment.minutes.value = tMinutes;
  585.    document.payment.seconds.value = tSeconds;
  586.    timerID = setTimeout("timer_UpdateTimer()", 1000);
  587. }
  588. function validate() {
  589. if (document.dpreply.reply.value == '') {
  590. alert('Please enter a message.');
  591. return false;
  592. } else {
  593. return true;
  594. }
  595. }
  596. function timer_Start() {
  597.    tStart   = new Date();
  598.    document.payment.hours.value = "0";
  599.    document.payment.minutes.value = "0";
  600.    document.payment.seconds.value = "0";
  601.    timerID  = setTimeout("timer_UpdateTimer()", 1000);
  602. }
  603. function timer_Stop() {
  604.    if(timerID) {
  605.       clearTimeout(timerID);
  606.       timerID  = 0;
  607.    }
  608.    tStart = null;
  609. }
  610. function timer_Reset() {
  611.    tStart = null;
  612.    document.payment.hours.value = "0";
  613.    document.payment.minutes.value = "0";
  614.    document.payment.seconds.value = "0";
  615. }
  616. timer_Stop();
  617. </script>
  618. ";
  619. $js = "
  620. <SCRIPT LANGUAGE="JavaScript">
  621. function quote(id) {
  622. var data = new Array();
  623. ";
  624. $i = $table_message_start;
  625. while ($reply = $db->row_array()) {
  626. $reply['message'] = wordwrap(trim($reply['message']), 78, "n");
  627. $i++;
  628. $js .= "data[$reply[id]] = "" . quotemessage($reply[message]) . "";
  629. ";
  630. // just in case two messages on same second
  631. if (@in_array($reply[date], $time_array)) {
  632. $reply[date]++;
  633. }
  634. $time_array[] = $reply[date];
  635. $date = our_date($reply[date]);
  636. if ($reply['techid']) {
  637. $reply['username'] = $reply['t_username'];
  638. $by = "<b>$reply[username] (tech) </b>";
  639. } elseif ($reply['userid']) {
  640. $reply['username'] = $reply['u_username'];
  641. $by = "<b>$ticket[email] </b>";
  642. if ($reply['ipaddress']) {
  643. $by .= " [ip address = $reply[ipaddress]] ";
  644. } elseif ($reply['sourceid']) {
  645. $by .= " [sent by email] ";
  646. } else {
  647. $by .= " [entered by technician]";
  648. }
  649. } else {
  650. $by = "<b>System (DeskPRO)</b>";
  651. }
  652. $bit = "<table width="100%" cellpadding="0" cellspacing="0">";
  653. $bit .= "<tr><td><table width="100%" cellspacing="0" cellpadding="0"><a name="$i"/><tr><td><U><b>#$i</b> Message by $by on $date</U></td><td align="right">";
  654. $bit .= "<table cellpadding="2" cellspacing="0"><tr><td valign="middle">" . html_image('tech/bul087.gif') . "</td><td valign="middle"><a href="javascript:openWindow('popupactions.php?do=raw&id=$reply[id]', '', '')">View Raw</a></td>";
  655. // quote
  656. $bit .= "<td valign="middle">" . html_image('tech/bul106.gif') . "</td><td valign="middle"><a href="javascript:quote('$reply[id]')">Quote</a></td>";
  657. // edit
  658. $bit .= "<td valign="middle">" . html_image('tech/bul108.gif') . "</td><td valign="middle"><a href="javascript:openWindow('popupactions.php?do=editmessage&id=$reply[id]&num=$i', '', '')">Edit Message</a></td>";
  659. if ($reply[sourceid]) {
  660. $bit .= "<td valign="middle">" . html_image('tech/bul109.gif') . "</td><td valign="middle"><a href="JavaScript:openWindow('popupactions.php?do=view_source&id=$reply[id]', '', '')">View Email Source</a></td>";
  661. }
  662. $bit .= "</td></tr></table></td></tr></table></td></tr>";
  663. $bit .= "<tr><td colspan="2"><div name="reply_$reply[id]">" . dp_code($reply['message']) . "</div></td></tr></table>";
  664. $table_messages[$reply[date]] = $bit;
  665. $table_message_count++;
  666. }
  667. $table_message_start++;
  668. if ($_REQUEST[messages] == 'all') {
  669. if ($table_message_count) {
  670. $message_total = "($total_messages total)";
  671. } else {
  672. $message_total = "(no messages)";
  673. }
  674. $table_messages[0] = "<center>Showing all messages $message_total.
  675. <A HREF="ticketview.php?id=$id">Show Newest</A>.</center>";
  676. } else {
  677. if ($table_message_count) {
  678. if ((($table_message_count - 1) + $table_message_start) == 1) {
  679. $message_total = "(1 message total)";
  680. } else {
  681. $message_total = "(#$table_message_start to #$i; $total_messages messages total)";
  682. }
  683. } else {
  684. $message_total = "(no messages)";
  685. }
  686. if ($total_messages > 10) {
  687. $table_messages[0] = "<center>Showing up to the last 10 messages $message_total.
  688. <a href="ticketview.php?id=$id&messages=all">Show All</a>.";
  689. } else {
  690. $table_messages[0] = "<center>Showing $table_message_count message(s) $message_total.</center>";
  691. }
  692. }
  693. $js .= "
  694. top.center.document.dpreply.reply.value += data[id] + ' ';
  695. top.center.document.dpreply.reply.focus();
  696. }
  697. </script>
  698. ";
  699. echo $js;
  700. ############################### TICKET NOTES ###############################
  701. $db->query("
  702. SELECT ticket_notes.*, tech.username
  703. FROM ticket_notes
  704. LEFT JOIN tech ON ticket_notes.techid = tech.id
  705. WHERE ticket_notes.ticketid = '$id'
  706. ORDER BY id
  707. ");
  708. while ($result = $db->row_array()) {
  709. if (!$result['username']) {
  710. $result['username'] = 'system';
  711. }
  712. $table_notes[] = array(our_date($result['date']) . iff(($result['techid'] == $user['id']), 
  713. " <A HREF="ticketview.php?do=delnote&id=$id&noteid=$result[id]">Delete</A>"), $result['username']);
  714. $table_notes_message[] = $result[note];
  715. // in case message and note same second
  716. if (@in_array($result['date'], $time_array)) {
  717. $result['date']++;
  718. }
  719. $bit = "<U>Note by <B>$result[username]</B> (" . our_date($result['date']) . ")</U><BR>" . dp_code($result['note']);
  720. while (@in_array($result['date'], $time_array)) {
  721. $result['date']++;
  722. }
  723. $table_messages[$result['date']] = $bit;
  724. }
  725. ksort($table_messages);
  726. ############################### REPLY FORM ###############################
  727. ?>
  728. <script language="javascript">
  729. function isnote() {
  730. var yesno;
  731. if (document.dpreply.is_note.checked == true) {
  732. yesno = 1;
  733. }
  734. if (yesno == '1') {
  735. document.dpreply.emailuser.checked = false;
  736. document.dpreply.emailuser.disabled = true;
  737. document.dpreply.makefaq.checked = false;
  738. document.dpreply.makefaq.disabled = true;
  739. document.dpreply.close.checked = false;
  740. document.dpreply.close.disabled = true;
  741. document.dpreply.awaitinguser.checked = false;
  742. document.dpreply.awaitinguser.disabled = true;
  743. } else {
  744. document.dpreply.emailuser.disabled = false;
  745. document.dpreply.makefaq.disabled = false;
  746. document.dpreply.close.disabled = false;
  747. document.dpreply.awaitinguser.disabled = false;
  748. }
  749. }
  750. </script>
  751. <?php
  752. if ($user['signature']) {
  753. $user['signature'] = "nn--n$user[signature]";
  754. }
  755. $help = thelp('Tickets - Viewing and Responding', 'Reply Actions and Options');
  756. $table_reply[] = "
  757. <table cellpadding="3" width="00%" cellspacing="1"><tr valign="top">
  758. <td valign="top"><br />
  759. <table cellpadding="2" cellspacing="0">
  760. <tr><td align="center">" . html_image('tech/bul098.gif') . "</td><td><a href="javascript:openWindow('./faqpop.php', 700, 600, 'faq')">FAQ</a></td></tr>
  761. <tr><td align="center"><br />" . html_image('tech/bul087.gif') . "</td><td><br /><a href="javascript:openWindow('./popupactions.php?do=largeedit', 700, 600, 'big')">Large&nbsp;Edit</a></td></tr>
  762. <tr><td align="center"><br />" . html_image('tech/bul099.gif') . "</td><td><br />
  763. <DIV ID="newattachments">
  764. <a href="javascript:openWindow('./addattachments.php?id=$ticket[id]', 350, 300, 'attachment')">Add Attach</a>
  765. </DIV></td></tr></table>
  766. </td><td>" . 
  767.  
  768. form_hidden('viewed', mktime()) . "
  769. <TEXTAREA NAME="reply" ROWS="10" COLS="70"
  770. ONSELECT="top.empty.storeCaret(this);"
  771.     ONCLICK="top.empty.storeCaret(this);"
  772.     ONKEYUP="top.empty.storeCaret(this);">$user[signature]
  773. </TEXTAREA>
  774. </td><td><br />".
  775. form_checkbox_single('mail_cc', 'cc', 0) . " Cc: only this reply <BR>" .
  776. form_checkbox_single('mail_digest', 'digest', 0) . " Mail a digest of this ticket <BR>" .
  777. '<table><tr><td>To:</td><td>'. form_input('cc', NULL, '20') . '</td></tr><td colspan="2"><br></td></tr></table>
  778. <center>'.thelp('Tickets - Viewing and Responding', "Cc's and Digests") . '</center>
  779. </td><td rowspan="2"><center>
  780. <select name="drop" style="width:150" onchange="top.empty.showdata(dpreply.drop.value)"></select><br /><br />
  781. <select size="10" name="list3" style="width:150"></select>
  782. <input type="hidden" name="category" value="1"><br /><br />
  783. <input type="button" onClick="top.empty.godeep(dpreply.list3.value,dpreply.category.value)" value="Insert into Reply"><br /><br />
  784. ' . thelp('Quick Replies', 'Inserting into Tickets') . '
  785. </center></td></tr>
  786. <tr>
  787. <td><center>'.$help.'</center></td>
  788. <td colspan="2">
  789. <table><tr>' . "
  790. <td>" . form_checkbox_single('makefaq', '1', '') . " Create FAQ article from this ticket</td>
  791. <td>" . form_checkbox_single('close', '1', '') . " Close the ticket</td></tr><tr>
  792. <td>" . form_checkbox_single('emailuser', '1', '1') . " E-mail this reply to the user</td>
  793. <td>" . form_checkbox_single('awaitinguser', '1', '1') . " Set 'awaiting a user response'</td></tr><tr>
  794. <td><input type="checkbox" name="is_note" value="1" onclick="javascript:isnote()"> Message is a note (hidden from users)</td>
  795. <td>" . 
  796. iff ($ticket[tech] != $user[id], form_checkbox_single('ownership', 1, 1) . " Claim ownership of this ticket") . "</td></tr>" .
  797. iff ($settings['autostart_billing_timer'] AND feature_check('payments', 1) AND $settings['payments'], "<tr><td colspan="2">" . form_checkbox_single('ignorebilling', 1) . " Don't automatically apply billing timer to the ticket for this response.</td></tr>") . "
  798. </table></td></tr></table>" .
  799. form_hidden('charge', '') .
  800. form_hidden('hours', '') .
  801. form_hidden('minutes', '') .
  802. form_hidden('seconds', '') .
  803. form_hidden('userid', $ticket['userid']);
  804. ############################### DISPLAY PAGE ###############################
  805. echo "<table width="100%"><tr><td valign="top"><form method="post" action="ticketedit.php">" . form_hidden('id', $id);
  806. $ticket_title = "(Ticket ID: $id, Ticket REF: $ticket[ref])";
  807. table_header("Ticket Information $ticket_title");
  808. table_content('', $table_ticket_fields);
  809. if (p_ticket('edit')) {
  810. table_footer('', '', "<input type="button" value="Edit Ticket Data" onclick="oc('Ticket Information $ticket_title'); oc('Edit Fields $ticket_title'); return true">", 1);
  811. } else {
  812. table_footer();
  813. }
  814. if (p_ticket('edit')) {
  815. echo form_hidden('searchid', $_REQUEST['searchid']);
  816. echo form_hidden('num', $_REQUEST['num']);
  817. table_header("Edit Fields $ticket_title");
  818. table_content('', $table_ticket_fields2);
  819. table_footer('', '', "<input type="submit" name="Update Fields" value="Update Fields">" . "&nbsp;&nbsp;<input type="button" value="View Ticket Fields" onclick="oc('Ticket Information $ticket_title'); oc('Edit Fields $ticket_title'); return true">", 1);
  820. echo "<SCRIPT>oc('Edit Fields $ticket_title');</SCRIPT>";
  821. }
  822. echo "<br />";
  823. table_header("Ticket Owner Details (User ID: $ticket_user[id])");
  824. table_content('', $table_user);
  825. if ($ticket['userid']) {
  826. table_footer('', '', redirect_button('View / Edit User', "./../users/view.php?id=$ticket_user[id]"));
  827. }
  828. echo "<br />";
  829. echo "</td></form><td valign="top" align="right">";
  830. outline_table('Ticket Status', $ticket_status, '95%');
  831. echo "<br />";
  832. outline_table('Ticket Operations', $top_links, '95%');
  833. echo "</td></tr></table>";
  834. table_header($table_user_tickets_header);
  835. if (is_array($table_user_tickets)) {
  836. table_content(array('Ticket Subject', 'Status', 'Awaiting','Merge ' . thelp('Tickets - Viewing and Responding', 'Merging Tickets')), $table_user_tickets);
  837. } else {
  838. table_content('', array('User has no other tickets.'));
  839. }
  840. table_footer('', '', $table_user_tickets_footer);
  841. echo "<table width="100%"><tr><td valign="top">";
  842. table_header('Ticket Notes');
  843. table_content(array('Date Written', 'Tech Writer'), $table_notes, '', '', '', $table_notes_message);
  844. table_footer('', '', form_button('Add New Note', "onclick="openWindow('./popupactions.php?do=note&id=$ticket[id]', 450, 300, 'attachment')""));
  845. echo "</td><td valign="top">";
  846. table_header('Ticket Attachments');
  847. table_content(array('Filename', 'Size', 'Download', 'Delete'), $table_attachments);
  848. table_footer('', '', form_button('Add New Attachment(s)', "onclick="openWindow('./addattachments.php?id=$ticket[id]', 350, 300, 'attachment')""));
  849. echo "</td></tr></table>";
  850. echo "<table width="100%"><tr>";
  851. if ($settings['payments'] AND feature_check('payments', 1)) {
  852. echo "<form method="post" action="ticketedit.php" name="payment" id="payment"><td valign="top">";
  853. table_header('Payment Functions', '', '', !$settings['autostart_billing_timer']);
  854. table_content('', $table_payment, '', '');
  855. table_footer();
  856. }
  857. echo $timerjs;
  858. echo "</td></form><form method="post" action="ticketedit.php" name="calendar" id="calendar"><td valign="top">";
  859. if (count($table_calendar) > 2) {
  860. table_header('Calendar Functions', '', '', 0);
  861. table_content('', $table_calendar);
  862. table_footer();
  863. } else {
  864. table_header('Calendar Functions', '', '', 1);
  865. table_content('', $table_calendar);
  866. table_footer();
  867. }
  868. echo "</td></form><td valign="top">";
  869. echo "</td></tr></table>";
  870. if ($settings['payments'] AND feature_check('payments', 1)) {
  871. table_header(iff($billing, 'Billing Details', 'Billing Details (no items)'), '', '', (!$billing));
  872. table_content($table_billing_cols, $table_billing);
  873. table_footer();
  874. $copybilling = "copyBilling();";
  875. } else {
  876. $copybilling = NULL;
  877. }
  878. table_header('Ticket Messages');
  879. table_content('', $table_messages);
  880. table_footer();
  881. if (p_ticket('edit') AND $ticket['is_open']) {
  882. table_header("Reply to Ticket (#$ticket[id], Ref #$ticket[ref])", 'ticketreply.php', array('do' => 'reply', 'id' => $id, 'searchid' => $_REQUEST['searchid'], 'num' => $_REQUEST['num']), '', 'dpreply', 1);
  883. table_content('', $table_reply);
  884. table_footer('Send Reply', '', spellcheck_button('dpreply', 'reply'), '', iff($user['copy_to_clipboard'], "onClick="copyText(document.dpreply.reply); $copybilling; return validate();"", NULL), 'Submit');
  885. }
  886. $ticketlog_data = generate_ticketlog($id);
  887. $cols = array('Date', 'Action', 'Tech/User');
  888. table_header('Ticket Log', '', '', '');
  889. table_content($cols, $ticketlog_data[0], '', '', '', $ticketlog_data[1]);
  890. table_footer();
  891. ############################### END PAGE ###############################
  892. if ($settings['autostart_billing_timer'] AND $settings['payments'] AND feature_check('payments', 1)) {
  893. ?>
  894. <SCRIPT language="JavaScript">
  895. timer_Start();
  896. </SCRIPT>
  897. <?php
  898. }
  899. if ($ticket['is_open'] AND p_ticket('edit')) {
  900. ?>
  901. <SCRIPT language="javascript">
  902. top.empty.buildselect();
  903. top.empty.showdata('0');
  904. function copyText(text) {
  905. var agt=navigator.userAgent.toLowerCase();
  906. var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
  907. if (is_ie) {
  908. copied = text.createTextRange();
  909. copied.execCommand("Copy");
  910. }
  911. }
  912. function copyBilling() {
  913. document.dpreply.charge.value = document.payment.charge.value;
  914. document.dpreply.hours.value = document.payment.hours.value;
  915. document.dpreply.minutes.value = document.payment.minutes.value;
  916. document.dpreply.seconds.value = document.payment.seconds.value;
  917. }
  918. </SCRIPT>
  919. <?php
  920. };
  921. tech_footer();
  922. ?>