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

电子政务应用

开发平台:

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: payment.php,v $
  15. // | $Date: 2004/02/10 01:34:25 $
  16. // | $Revision: 1.31 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Billables/payables report generator (administration interface)
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL & ~E_NOTICE);
  22. require_once('./global.php');
  23. //Nullify WTN-WDYL Team
  24. include('./settings_include.php');
  25. feature_check('payments');
  26. ############################### UPDATE SETTINGS ###############################
  27. if ($_REQUEST['do'] == "update") {
  28. update_settings();
  29. $_REQUEST['do'] = "settings";
  30. }
  31. ############################### DISPLAY SETTINGS ###############################
  32. if ($_REQUEST['do'] == "settings") {
  33. admin_header('Payment Functions', 'Payment Settings');
  34. show_settings('payment.php', array('Payment Settings'), false);
  35. exit;
  36. }
  37. ############################### RUN PAYMENT REPORTS ###############################
  38. admin_header('Payment Functions', 'Run Payment Reports');
  39. if ($_REQUEST['submit'] AND $_REQUEST['ids']) {
  40. $ids = explode(',',$_REQUEST['ids']);
  41. $queries = 0;
  42. if (is_array($_REQUEST['isbillable'])) {
  43. $sql_billable = array_intersect($ids, $_REQUEST['isbillable']);
  44. $sql_unbillable = array_diff($ids, $_REQUEST['isbillable']);
  45. } else {
  46. $sql_unbillable = $ids;
  47. }
  48. if (is_array($_REQUEST['ispaid'])) {
  49. $sql_paid = array_intersect($ids, $_REQUEST['ispaid']);
  50. $sql_unpaid = array_diff($ids, $_REQUEST['ispaid']);
  51. } else {
  52. $sql_unpaid = $ids;
  53. }
  54. if (is_array($sql_billable)) {
  55. if (count($sql_billable)) {
  56. $db->query('UPDATE user_bill SET billable = 1 WHERE id IN ' . array2sql($sql_billable));
  57. $queries++;
  58. }
  59. }
  60. if (is_array($sql_unbillable)) {
  61. if (count($sql_unbillable)) {
  62. $db->query('UPDATE user_bill SET billable = 0 WHERE id IN ' . array2sql($sql_unbillable));
  63. $queries++;
  64. }
  65. }
  66. if (is_array($sql_paid)) {
  67. if (count($sql_paid)) {
  68. $db->query('UPDATE user_bill SET paid = 1 WHERE id IN ' . array2sql($sql_paid));
  69. $queries++;
  70. }
  71. }
  72. if (is_array($sql_unpaid)) {
  73. if (count($sql_unpaid)) {
  74. $db->query('UPDATE user_bill SET paid = 0 WHERE id IN ' . array2sql($sql_unpaid));
  75. $queries++;
  76. }
  77. }
  78. }
  79. $ids = array();
  80. $ticketid = (int)$_REQUEST['ticketid'];
  81. $paid = (int)$_REQUEST['paid'];
  82. if ($_REQUEST['bytech']) {
  83. $group = 'techname';
  84. } else {
  85. $group = 'username';
  86. }
  87. if (!(int)$_REQUEST['billable']) {
  88. $billable = 1;
  89. } else {
  90. $billable = (int)$_REQUEST['billable'];
  91. }
  92. $detail = (int)$_REQUEST['detail'];
  93. if ($ticketid) { // If a specific ticket is requested, we're doing a detailed view
  94. $detail = 1;
  95. }
  96. $ystart = (int)$_REQUEST['ystart'];
  97. $mstart = (int)$_REQUEST['mstart'];
  98. $dstart = (int)$_REQUEST['dstart'];
  99. $yend = (int)$_REQUEST['yend'];
  100. $mend = (int)$_REQUEST['mend'];
  101. $dend = (int)$_REQUEST['dend'];
  102. $start = validate_ymd("$ystart-$mstart-$dstart");
  103. $end   = validate_ymd("$yend-$mend-$dend");
  104. $stamp = time();
  105. $now = split('-', date('Y-m-d', $stamp));
  106. if (!$start) { // Default to starting at the beginning of the current month
  107. $start = strtotime("$now[0]-$now[1]-01");
  108. } else {
  109. $start = strtotime($start);
  110. }
  111. if (!$end OR $_REQUEST['alldates']) { // Default to ending right now
  112. $end = $stamp;
  113. } else {
  114. $end = strtotime($end) + ((60 * 60 * 24) - 1);
  115. }
  116. if ($_REQUEST['alldates']) { // If we've been asked to do everything, start should be zero
  117. $start = 0;
  118. }
  119. if ($settings['log_to_billing']) {
  120. $notes[] = '<B>Note:</B> Automatic billing is <I>not</I> enabled; results may be incomplete.';
  121. }
  122. if ($settings['payments']) {
  123. $notes[] = '<B>Warning:</B> Payments are not currently enabled; results may be incomplete.';
  124. }
  125. if (is_array($notes)) {
  126. $notes = join('<BR>', $notes);
  127. }
  128. if (is_array($_REQUEST['userid'])) {
  129. if (!in_array(0, $_REQUEST['userid'])) {
  130. $db->query('SELECT id FROM user WHERE id IN ' . array2sql($_REQUEST['userid']));
  131. while ($res = $db->row_array()) {
  132. $validusers[] = $res['id'];
  133. }
  134. $invalidusers = array_diff($_REQUEST['userid'], $validusers);
  135. if (count($invalidusers)) {
  136. $warnings[] = 'User(s) not valid: ' . join(', ', $invalidusers);
  137. }
  138. $terms[] = 'user_bill.userid in ' . array2sql($_REQUEST['userid']);
  139. if (count($validuser)) {
  140. $criteria[] = 'user ID(s) ' . join(', ', $validusers);
  141. }
  142. }
  143. }
  144. if (is_array($_REQUEST['techid'])) {
  145. if (!in_array(0, $_REQUEST['techid'])) {
  146. $db->query('SELECT id FROM tech WHERE id IN ' . array2sql($_REQUEST['techid']));
  147. while ($res = $db->row_array()) {
  148. $validtechs[] = $res['id'];
  149. }
  150. $invalidtechs = array_diff($_REQUEST['techid'], $validtechs);
  151. if (count($invalidtechs)) {
  152. $warnings[] = 'Tech(s) not valid: ' . join(', ', $invalidtechs);
  153. }
  154. $terms[] = 'user_bill.techid in ' . array2sql($_REQUEST['techid']);
  155. $criteria[] = 'technician ID(s) ' . join(', ', $validtechs);
  156. }
  157. }
  158. if ($ticketid) {
  159. $db->query("SELECT id FROM ticket WHERE id = $ticketid");
  160. if ($db->num_rows()) {
  161. $terms[] = "user_bill.ticketid = $ticketid";
  162. $criteria[] = "ticket #$ticketid";
  163. } else {
  164. $warnings[] = "Ticket $ticketid couldn't be found.";
  165. }
  166. }
  167. if ($billable == 1) { // Billable = 0, show non-billable. Billable = 1, show billable. Billable = anything else, show both
  168. $terms[] = 'billable';
  169. $criteria[] = 'billable';
  170. } elseif ($billable == 0) {
  171. $terms[] = '!billable';
  172. $criteria[] = 'non-billable';
  173. } else {
  174. $billable = 2;
  175. $criteria[] = 'billable and non-billable';
  176. }
  177. if ($paid == 1) { // Paid = 0, show unpaid. Paid = 1, show paid. Paid = anything else, show all
  178. $terms[] = 'paid';
  179. $criteria[] = 'paid';
  180. } elseif ($paid == 0) {
  181. $terms[] = '!paid';
  182. $criteria[] = 'unpaid';
  183. } else {
  184. $paid = 2;
  185. $criteria[] = 'paid and unpaid';
  186. }
  187. $terms[] = "stamp >= $start";
  188. $terms[] = "stamp <= $end";
  189. if ($start) {
  190. $criteria[] = date('F jS Y', $start) . ' to ' . date('F jS Y', $end);
  191. } else {
  192. $criteria[] = 'all dates';
  193. }
  194. if (is_array($terms)) {
  195. $where = join(' AND ', $terms);
  196. }
  197. if ($detail) {
  198. $criteria[] = '<I>detail view</I>';
  199. $query = "SELECT user_bill.id, time, charge, user.username, user.id AS userid, tech.username AS techname, tech.id AS techid, ticket.id as ticketid, stamp, paid, billable
  200. FROM user_bill
  201. LEFT JOIN user ON user_bill.userid = user.id
  202. LEFT JOIN ticket ON user_bill.ticketid = ticket.id
  203. LEFT JOIN tech ON user_bill.techid = tech.id
  204. WHERE $where
  205. ORDER BY username, stamp";
  206. } else {
  207. $criteria[] = '<I>summary view</I>';
  208. $query = "SELECT SUM(time) AS time, SUM(charge) AS charge, user.username, user.id AS userid, tech.username AS techname, tech.id AS techid, ticket.id as ticketid, stamp, paid, billable, ticketid
  209. FROM user_bill
  210. LEFT JOIN user ON user_bill.userid = user.id
  211. LEFT JOIN ticket ON user_bill.ticketid = ticket.id
  212. LEFT JOIN tech ON user_bill.techid = tech.id
  213. WHERE $where
  214. GROUP BY $group
  215. ORDER BY username, stamp";
  216. }
  217. $db->query($query);
  218. $total = 0;
  219. if ($detail) {
  220. if ($db->num_rows()) {
  221. $paid_js = ' (<A HREF="javascript:checkall(document.forms['res'].elements['ispaid[]']);">All</A> <A HREF="javascript:uncheckall(document.res.elements['ispaid[]']);">None</A>)';
  222. $bill_js = ' (<A HREF="javascript:checkall(document.forms['res'].elements['isbillable[]']);">All</A> <A HREF="javascript:uncheckall(document.res.elements['isbillable[]']);">None</A>)';
  223. } else {
  224. $paid_js = ''; 
  225. $bill_js = '';
  226. $no_update = 1;
  227. }
  228. $cols = array(
  229. 'User', 
  230. 'Technician', 
  231. 'Ticket ID',
  232. 'Time', 
  233. 'Charge', 
  234. "Paid $paid_js",
  235. "Billable $bill_js",
  236. 'Date/Time'
  237. );
  238. } else {
  239. $cols = array(
  240. iff($_REQUEST['bytech'], 'Technician', 'User'),
  241. 'Time', 
  242. 'Charge'
  243. );
  244. }
  245. $total_users = array();
  246. $total_techs = array();
  247. $total_tickets = array();
  248. $total_time = 0;
  249. $total_charge = 0;
  250. $total_billable = 0;
  251. $total_unbillable = 0;
  252. $total_paid = 0;
  253. $total_unpaid = 0;
  254. while ($res = $db->row_array()) {
  255. if ($_REQUEST['daily_tech']) {
  256. $daily_tech[date('Y-m-d', $res['stamp'])][$res['techid']]['charge'] += $res['charge'];
  257. $daily_tech[date('Y-m-d', $res['stamp'])][$res['techid']]['time'] += $res['time'];
  258. }
  259. if ($_REQUEST['daily_user']) {
  260. $daily_user[date('Y-m-d', $res['stamp'])][$res['userid']]['charge'] += $res['charge'];
  261. $daily_user[date('Y-m-d', $res['stamp'])][$res['userid']]['time'] += $res['time'];
  262. }
  263. if ($detail) {
  264. $rows[] = array(
  265. $res['username'], 
  266. $res['techname'], 
  267. $res['ticketid'], 
  268. clean_time($res['time']), 
  269. sprintf('%01.2f', $res['charge']), 
  270. form_checkbox_single('ispaid[]', $res['id'], iff($res['paid'], 1, 0)), 
  271. form_checkbox_single('isbillable[]', $res['id'], iff($res['billable'], 1, 0)),
  272. date('r', $res['stamp'])
  273. );
  274. $ids[] = $res['id'];
  275. } else {
  276. $rows[] = array(
  277. iff($_REQUEST['bytech'], $res['techname'], $res['username']), 
  278. clean_time($res['time']), 
  279. sprintf('%01.2f', $res['charge'])
  280. );
  281. }
  282. $total_users[$res['userid']]++;
  283. $total_techs[$res['techid']]++;
  284. $total_tickets[$res['ticketid']]++;
  285. $total_time += $res['time'];
  286. $total_charge += $res['charge'];
  287. $total_billable += (iff($res['billable'], 1, 0));
  288. $total_unbillable += (iff(!$res['billable'], 1, 0));
  289. $total_paid += (iff($res['paid'], 1, 0));
  290. $total_unpaid += (iff(!$res['paid'], 1, 0));
  291. if ($total_earliest) {
  292. $total_earliest = (iff(($res['stamp'] < $total_earliest), $res['stamp'], $total_earliest));
  293. } else {
  294. $total_earliest = $res['stamp'];
  295. }
  296. $total_latest = (iff(($res['stamp'] > $total_latest), $res['stamp'], $total_latest));
  297. }
  298. if (count($rows) > 0) {
  299. if ($detail) {
  300. $rows[] = array(
  301. '<HR><B>' . count($total_users) . '</B> user(s)<BR>&nbsp;',
  302. '<HR><B>' . count($total_techs) . '</B> tech(s)<BR>&nbsp;',
  303. '<HR><B>' . count($total_tickets) . '</B> ticket(s)<BR>&nbsp;',
  304. '<HR><B>' . clean_time($total_time) . '</B><BR>&nbsp;',
  305. '<HR><B>' . sprintf('%01.2f', $total_charge) . '</B><BR>&nbsp;',
  306. "<HR><B>$total_paid</B> paid<BR><B>$total_unpaid</B> unpaid",
  307. "<HR><B>$total_billable</B> billable<BR><B>$total_unbillable</B> unbillable",
  308. '<HR><B>' . date('D M jS Y g:i:sa', $total_earliest) . '</B> to<BR><B>' . date('D M jS Y g:i:sa', $total_latest) . '</B>'
  309. );
  310. } else {
  311. $rows[] = array(
  312. '<HR><B>' . count($total_users) . '</B>' . iff($_REQUEST['bytech'], ' tech(s)', ' user(s)') . '<BR>&nbsp;',
  313. '<HR><B>' . clean_time($total_time) . '</B><BR>&nbsp;',
  314. '<HR><B>' . sprintf('%01.2f', $total_charge) . '</B><BR>&nbsp;'
  315. );
  316. }
  317. } else {
  318. $rows[] = array('<B>No items found.</B>');
  319. }
  320. $db->query("SELECT username, id FROM tech ORDER BY username");
  321. $techs[0] = 'Include All Techs';
  322. while ($result = $db->row_array()) {
  323. $techs[$result[id]] = $result[username];
  324. }
  325. $db->query("SELECT username, id FROM user ORDER BY username");
  326. $users[0] = 'Include All Users';
  327. while ($result = $db->row_array()) {
  328. $users[$result[id]] = $result[username];
  329. }
  330. $form[] = array('<FORM METHOD="post" ACTION="payment.php"><B>Limit report to:</B>', 
  331. '<TABLE><TR><TD>Techs:</TD><TD>Users:</TD></TR>
  332. <TR><TD>'. form_select('techid', $techs, '', $_REQUEST['techid'], 0, '', 4) . '</TD><TD>' .
  333. form_select('userid', $users, '', $_REQUEST['userid'], 0, '', 4) . '</TD></TR></TABLE>');
  334. $form[] = array('<B>Show Items Occuring in Range:</B>',
  335. form_date('start', '', '', '', '', date('Y-m-d', $start)) . ' to ' . 
  336. form_date('end', '', '', '', '', date('Y-m-d', $end)));
  337. $form[] = array('<B>Show Detailed View:</B>',
  338. form_checkbox_single('detail', 1, $detail) . 'Detail View');
  339. $form[] = array('<B>Search Entry Types:</B>',
  340. '<TABLE><TR><TD><B>Billable</B>' .
  341. form_radio_single('billable', '0', iff(($billable == 0), 1, 0)) . 'Non-billable only<BR>' .
  342. form_radio_single('billable', '1', iff(($billable == 1), 1, 0)) . 'Billable only<BR>' .
  343. form_radio_single('billable', '2', iff(($billable == 2), 1, 0)) . 'Both' .
  344. '</TD><TD><B>Paid</B>' .
  345. form_radio_single('paid', '0', iff(($paid == 0), 1, 0)) . 'Unpaid only<BR>' .
  346. form_radio_single('paid', '1', iff(($paid == 1), 1, 0)) . 'Paid only<BR>' .
  347. form_radio_single('paid', '2', iff(($paid == 2), 1, 0)) . 'Both' .
  348. '</TD></TR></TABLE>'
  349. );
  350. $form[] = array('<B>Show Details for Ticket:</B>',
  351. 'Ticket # ' . form_input('ticketid', iff($ticketid, $ticketid, ''), 10)
  352. );
  353. $form[] = array('<B>Summarize By:</B><BR><I>Summary views only; ignored in detail views</I>',
  354. form_radio_single('bytech', '0', iff($_REQUEST['bytech'], 0, 1)) . ' by User ' .
  355. form_radio_single('bytech', '1', iff($_REQUEST['bytech'], 1, 0)) . ' by Technician '
  356. );
  357. $form[] = array('<B>Show Daily Totals by Tech</B>',
  358. form_radio_yn('daily_tech', '', $_REQUEST['daily_tech']));
  359. $form[] = array('<B>Show Daily Totals by User</B>',
  360. form_radio_yn('daily_user', '', $_REQUEST['daily_user']));
  361. $form[] = array('<B>Update View</B>', form_submit('Update'));
  362. $this_month_start = strtotime("$now[0]-$now[1]-01");
  363. $last_month_start = explode('-', date('Y-m', strtotime(date('Y-m-d', $this_month_start) . ' -1 month')));
  364. $last_month_end = explode('-', date('Y-m-d', strtotime(date('Y-m-d', $this_month_start) . ' -1 second')));
  365. $summaries_bu[] = '<A HREF="payment.php?billable=1">All Billable (this month)</A>';
  366. $summaries_bu[] = '<A HREF="payment.php?paid=0&billable=1">Unpaid Billable (this month)</A>';
  367. $summaries_bu[] = "<A HREF="payment.php?paid=0&billable=1&ystart=$last_month_start[0]&mstart=$last_month_start[1]&dstart=1&yend=$last_month_end[0]&mend=$last_month_end[1]&dend=$last_month_end[2]">Unpaid Billable (last month)</A>";
  368. $summaries_bu[] = '<A HREF="payment.php?paid=0&billable=1&alldates=1">Unpaid Billable (all)</A>';
  369. $summaries_bt[] = '<A HREF="payment.php?bytech=1&billable=1">All Billable (this month)</A>';
  370. $summaries_bt[] = '<A HREF="payment.php?paid=0&billable=1&bytech=1">Unpaid Billable (this month)</A>';
  371. $summaries_bt[] = "<A HREF="payment.php?paid=0&billable=1&bytech=1&ystart=$last_month_start[0]&mstart=$last_month_start[1]&dstart=1&yend=$last_month_end[0]&mend=$last_month_end[1]&dend=$last_month_end[2]">Unpaid Billable (last month)</A>";
  372. $summaries_bt[] = '<A HREF="payment.php?paid=0&billable=1&alldates=1&bytech=1">Unpaid Billable (all)</A>';
  373. $details[] = '<A HREF="payment.php?billable=1&detail=1">All Billable (this month)</A>';
  374. $details[] = '<A HREF="payment.php?paid=0&billable=1&detail=1">Unpaid Billable (this month)</A>';
  375. $details[] = "<A HREF="payment.php?paid=0&billable=1&detail=1&ystart=$last_month_start[0]&mstart=$last_month_start[1]&dstart=1&yend=$last_month_end[0]&mend=$last_month_end[1]&dend=$last_month_end[2]">Unpaid Billable (last month)</A>";
  376. $details[] = '<A HREF="payment.php?paid=0&billable=1&detail=1&alldates=1">Unpaid Billable (all)</A>';
  377. $prebuilds = array(
  378. '<TABLE><TR><TD><B><U>Summaries (by User):</U></B><BR>' . join('<BR>', $summaries_bu) . '</TD><TD>&nbsp</TD>' .
  379. '<TD><B><U>Summaries (by Technician):</U></B><BR>' . join('<BR>', $summaries_bt) . '</TD><TD>&nbsp;</TD>' .
  380. '<TD><B><U>Detail Views:</U></B><BR>' . join('<BR>', $details) . '</TD></TR></TABLE>'
  381. );
  382. if ($queries) {
  383. print '<B>Item(s) updated.</B><BR>';
  384. }
  385. print '<B>Showing: </B>' . join('; ', $criteria) . '<BR>';
  386. if ($warnings) {
  387. print '<B>Warnings: </B>' . join('; ', $warnings) . '<BR>';
  388. }
  389. print '<BR>';
  390. ?>
  391. <?
  392. if ($daily_tech) {
  393. $d_rows = array();
  394. $techs = $db->query_return_array_id("SELECT username, id FROM tech", 'username');
  395. foreach ($daily_tech AS $date => $val) {
  396. $d_rows[] = array('<B>'.our_date(strtotime($date), 'day').'</B>');
  397. foreach ($val AS $tech => $data) {
  398. $d_rows[] = array($techs[$tech], sprintf('%01.2f', $data['charge']), clean_time($data['time']));
  399. }
  400. }
  401. $d_cols = array('Technician', 'Charge', 'Time');
  402. table_header('Daily Totals by Technician');
  403. table_content($d_cols, $d_rows);
  404. table_footer();
  405. }
  406. if ($daily_user) {
  407. $d_rows = array();
  408. $users = $db->query_return_array_id("SELECT username, id FROM user", 'username');
  409. foreach ($daily_user AS $date => $val) {
  410. $d_rows[] = array('<B>'.our_date(strtotime($date), 'day').'</B>');
  411. foreach ($val AS $usr => $data) {
  412. $d_rows[] = array($users[$usr], sprintf('%01.2f', $data['charge']), clean_time($data['time']));
  413. }
  414. }
  415. $d_cols = array('User', 'Charge', 'Time');
  416. table_header('Daily Totals by User');
  417. table_content($d_cols, $d_rows);
  418. table_footer();
  419. }
  420. print "</FORM>";
  421. print '<FORM METHOD="POST" ACTION="payment.php" NAME="res" ID="res">';
  422. table_header('Results');
  423. table_content($cols, $rows);
  424. table_footer();
  425. print form_hidden('techid', $_REQUEST['techid']);
  426. print form_hidden('userid', $_REQUEST['userid']);
  427. print form_hidden('ystart', $_REQUEST['ystart']);
  428. print form_hidden('mstart', $_REQUEST['mstart']);
  429. print form_hidden('dstart', $_REQUEST['dstart']);
  430. print form_hidden('yend', $_REQUEST['yend']);
  431. print form_hidden('mend', $_REQUEST['mend']);
  432. print form_hidden('dend', $_REQUEST['dend']);
  433. print form_hidden('detail', $_REQUEST['detail']);
  434. print form_hidden('billable', $_REQUEST['billable']);
  435. print form_hidden('paid', $_REQUEST['paid']);
  436. print form_hidden('ticketid', $_REQUEST['ticketid']);
  437. print form_hidden('bytech', $_REQUEST['bytech']);
  438. if (is_array($ids)) {
  439. print form_hidden('ids', join(',', $ids));
  440. }
  441. if (!$no_update) {
  442. print form_submit('Update Items') . '</FORM><BR>';
  443. }
  444. table_header('Quick Reports');
  445. table_content('', $prebuilds);
  446. table_footer();
  447. table_header('Report Options');
  448. table_content('', $form);
  449. table_footer();
  450. ?>
  451. </FORM>
  452. <SCRIPT LANGUAGE="JavaScript">
  453. function checkall(field) {
  454. field.checked = true;
  455. for (var i = 0; i < field.length; i++) 
  456. field[i].checked = true ;
  457. }
  458. function uncheckall(field) {
  459. field.checked = false;
  460. for (var i = 0; i < field.length; i++) 
  461. field[i].checked = false;
  462. }
  463. </SCRIPT>