Added type attribute to adjustment reasons and fixed some bugs in manual EOB posting
[openemr.git] / interface / super / edit_list.php
blob7a937c1148ed50e859b8037d7eaf4750815d6b02
1 <?php
2 // Copyright (C) 2007-2010 Rod Roark <rod@sunsetsystems.com>
3 //
4 // This program is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU General Public License
6 // as published by the Free Software Foundation; either version 2
7 // of the License, or (at your option) any later version.
9 require_once("../globals.php");
10 require_once("$srcdir/acl.inc");
11 require_once("$srcdir/formdata.inc.php");
12 require_once("../../custom/code_types.inc.php");
14 $list_id = empty($_REQUEST['list_id']) ? 'language' : $_REQUEST['list_id'];
16 // Check authorization.
17 $thisauth = acl_check('admin', 'super');
18 if (!$thisauth) die(xl('Not authorized'));
20 // If we are saving, then save.
22 if ($_POST['formaction']=='save' && $list_id) {
23 $opt = $_POST['opt'];
24 if ($list_id == 'feesheet') {
25 // special case for the feesheet list
26 sqlStatement("DELETE FROM fee_sheet_options");
27 for ($lino = 1; isset($opt["$lino"]['category']); ++$lino) {
28 $iter = $opt["$lino"];
29 $category = formTrim($iter['category']);
30 $option = formTrim($iter['option']);
31 $codes = formTrim($iter['codes']);
32 if (strlen($category) > 0 && strlen($option) > 0) {
33 sqlInsert("INSERT INTO fee_sheet_options ( " .
34 "fs_category, fs_option, fs_codes " .
35 ") VALUES ( " .
36 "'$category', " .
37 "'$option', " .
38 "'$codes' " .
39 ")");
43 else if ($list_id == 'code_types') {
44 // special case for code types
45 sqlStatement("DELETE FROM code_types");
46 for ($lino = 1; isset($opt["$lino"]['ct_key']); ++$lino) {
47 $iter = $opt["$lino"];
48 $ct_key = formTrim($iter['ct_key']);
49 $ct_id = formTrim($iter['ct_id']) + 0;
50 $ct_seq = formTrim($iter['ct_seq']) + 0;
51 $ct_mod = formTrim($iter['ct_mod']) + 0;
52 $ct_just = formTrim($iter['ct_just']);
53 $ct_mask = formTrim($iter['ct_mask']);
54 $ct_fee = empty($iter['ct_fee' ]) ? 0 : 1;
55 $ct_rel = empty($iter['ct_rel' ]) ? 0 : 1;
56 $ct_nofs = empty($iter['ct_nofs']) ? 0 : 1;
57 $ct_diag = empty($iter['ct_diag']) ? 0 : 1;
58 if (strlen($ct_key) > 0 && $ct_id > 0) {
59 sqlInsert("INSERT INTO code_types ( " .
60 "ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_mask, ct_fee, ct_rel, ct_nofs, ct_diag " .
61 ") VALUES ( " .
62 "'$ct_key' , " .
63 "'$ct_id' , " .
64 "'$ct_seq' , " .
65 "'$ct_mod' , " .
66 "'$ct_just', " .
67 "'$ct_mask', " .
68 "'$ct_fee' , " .
69 "'$ct_rel' , " .
70 "'$ct_nofs', " .
71 "'$ct_diag' " .
72 ")");
76 else {
77 // all other lists
79 // erase lists options and recreate them from the submitted form data
80 sqlStatement("DELETE FROM list_options WHERE list_id = '$list_id'");
81 for ($lino = 1; isset($opt["$lino"]['id']); ++$lino) {
82 $iter = $opt["$lino"];
83 $value = empty($iter['value']) ? 0 : (formTrim($iter['value']) + 0);
84 $id = formTrim($iter['id']);
85 if (strlen($id) > 0) {
86 // Force List Based Form names to start with LBF.
87 if ($list_id == 'lbfnames' && substr($id,0,3) != 'LBF')
88 $id = "LBF$id";
89 sqlInsert("INSERT INTO list_options ( " .
90 "list_id, option_id, title, seq, is_default, option_value, mapping, notes " .
91 ") VALUES ( " .
92 "'$list_id', " .
93 "'" . $id . "', " .
94 "'" . formTrim($iter['title']) . "', " .
95 "'" . formTrim($iter['seq']) . "', " .
96 "'" . formTrim($iter['default']) . "', " .
97 "'" . $value . "', " .
98 "'" . formTrim($iter['mapping']) . "', " .
99 "'" . formTrim($iter['notes']) . "' " .
100 ")");
105 else if ($_POST['formaction']=='addlist') {
106 // make a new list ID from the new list name
107 $newlistID = $_POST['newlistname'];
108 $newlistID = preg_replace("/\W/", "_", $newlistID);
110 // determine the position of this new list
111 $row = sqlQuery("SELECT max(seq) as maxseq FROM list_options WHERE list_id= 'lists'");
113 // add the new list to the list-of-lists
114 sqlInsert("INSERT INTO list_options ( " .
115 "list_id, option_id, title, seq, is_default, option_value " .
116 ") VALUES ( " .
117 "'lists',". // the master list-of-lists
118 "'".$newlistID."',".
119 "'".$_POST['newlistname']."', ".
120 "'".($row['maxseq']+1)."',".
121 "'1', '0')"
124 else if ($_POST['formaction']=='deletelist') {
125 // delete the lists options
126 sqlStatement("DELETE FROM list_options WHERE list_id = '".$_POST['list_id']."'");
127 // delete the list from the master list-of-lists
128 sqlStatement("DELETE FROM list_options WHERE list_id = 'lists' and option_id='".$_POST['list_id']."'");
131 $opt_line_no = 0;
133 // Given a string of multiple instances of code_type|code|selector,
134 // make a description for each.
135 function getCodeDescriptions($codes) {
136 global $code_types;
137 $arrcodes = explode('~', $codes);
138 $s = '';
139 foreach ($arrcodes as $codestring) {
140 if ($codestring === '') continue;
141 $arrcode = explode('|', $codestring);
142 $code_type = $arrcode[0];
143 $code = $arrcode[1];
144 $selector = $arrcode[2];
145 $desc = '';
146 if ($code_type == 'PROD') {
147 $row = sqlQuery("SELECT name FROM drugs WHERE drug_id = '$code' ");
148 $desc = "$code:$selector " . $row['name'];
150 else {
151 $row = sqlQuery("SELECT code_text FROM codes WHERE " .
152 "code_type = '" . $code_types[$code_type]['id'] . "' AND " .
153 "code = '$code' ORDER BY modifier LIMIT 1");
154 $desc = "$code_type:$code " . ucfirst(strtolower($row['code_text']));
156 $desc = str_replace('~', ' ', $desc);
157 if ($s) $s .= '~';
158 $s .= $desc;
160 return $s;
163 // Write one option line to the form.
165 function writeOptionLine($option_id, $title, $seq, $default, $value, $mapping='', $notes='') {
166 global $opt_line_no, $list_id;
167 ++$opt_line_no;
168 $bgcolor = "#" . (($opt_line_no & 1) ? "ddddff" : "ffdddd");
169 $checked = $default ? " checked" : "";
171 echo " <tr bgcolor='$bgcolor'>\n";
173 echo " <td align='center' class='optcell'>";
174 echo "<input type='text' name='opt[$opt_line_no][id]' value='" .
175 htmlspecialchars($option_id, ENT_QUOTES) . "' size='12' maxlength='63' class='optin' />";
176 echo "</td>\n";
178 echo " <td align='center' class='optcell'>";
179 echo "<input type='text' name='opt[$opt_line_no][title]' value='" .
180 htmlspecialchars($title, ENT_QUOTES) . "' size='20' maxlength='63' class='optin' />";
181 echo "</td>\n";
183 // if not english and translating lists then show the translation
184 if ($GLOBALS['translate_lists'] && $_SESSION['language_choice'] > 1) {
185 echo " <td align='center' class='translation'>" . (htmlspecialchars( xl($title), ENT_QUOTES)) . "</td>\n";
188 echo " <td align='center' class='optcell'>";
189 echo "<input type='text' name='opt[$opt_line_no][seq]' value='" .
190 htmlspecialchars($seq, ENT_QUOTES) . "' size='4' maxlength='10' class='optin' />";
191 echo "</td>\n";
193 echo " <td align='center' class='optcell'>";
194 echo "<input type='checkbox' name='opt[$opt_line_no][default]' value='1' " .
195 "onclick='defClicked($opt_line_no)' class='optin'$checked />";
196 echo "</td>\n";
198 // Tax rates and contraceptive methods have an additional attribute.
200 if ($list_id == 'taxrate' || $list_id == 'contrameth') {
201 echo " <td align='center' class='optcell'>";
202 echo "<input type='text' name='opt[$opt_line_no][value]' value='" .
203 htmlspecialchars($value, ENT_QUOTES) . "' size='8' maxlength='15' class='optin' />";
204 echo "</td>\n";
207 // Adjustment reasons use option_value as a reason category. This is
208 // needed to distinguish between adjustments that change the invoice
209 // balance and those that just shift responsibility of payment or
210 // are used as comments.
212 else if ($list_id == 'adjreason') {
213 echo " <td align='center' class='optcell'>";
214 echo "<select name='opt[$opt_line_no][value]' class='optin'>";
215 foreach (array(
216 1 => xl('Charge adjustment'),
217 2 => xl('Coinsurance'),
218 3 => xl('Deductible'),
219 4 => xl('Other pt resp'),
220 5 => xl('Comment'),
221 ) as $key => $desc) {
222 echo "<option value='$key'";
223 if ($key == $value) echo " selected";
224 echo ">" . htmlspecialchars($desc) . "</option>";
226 echo "</select>";
227 echo "</td>\n";
230 // IPPF includes the ability to map each list item to a "master" identifier.
231 // Sports teams use this for some extra info for fitness levels.
233 if ($GLOBALS['ippf_specific'] || $list_id == 'fitness') {
234 echo " <td align='center' class='optcell'>";
235 echo "<input type='text' name='opt[$opt_line_no][mapping]' value='" .
236 htmlspecialchars($mapping, ENT_QUOTES) . "' size='12' maxlength='15' class='optin' />";
237 echo "</td>\n";
240 echo " <td align='center' class='optcell'>";
241 echo "<input type='text' name='opt[$opt_line_no][notes]' value='" .
242 htmlspecialchars($notes, ENT_QUOTES) . "' size='25' maxlength='255' class='optin' />";
243 echo "</td>\n";
245 echo " </tr>\n";
248 // Write a form line as above but for the special case of the Fee Sheet.
250 function writeFSLine($category, $option, $codes) {
251 global $opt_line_no;
253 ++$opt_line_no;
254 $bgcolor = "#" . (($opt_line_no & 1) ? "ddddff" : "ffdddd");
256 $descs = getCodeDescriptions($codes);
258 echo " <tr bgcolor='$bgcolor'>\n";
260 echo " <td align='center' class='optcell'>";
261 echo "<input type='text' name='opt[$opt_line_no][category]' value='" .
262 htmlspecialchars($category, ENT_QUOTES) . "' size='20' maxlength='63' class='optin' />";
263 echo "</td>\n";
265 echo " <td align='center' class='optcell'>";
266 echo "<input type='text' name='opt[$opt_line_no][option]' value='" .
267 htmlspecialchars($option, ENT_QUOTES) . "' size='20' maxlength='63' class='optin' />";
268 echo "</td>\n";
270 echo " <td align='left' class='optcell'>";
271 echo " <div id='codelist_$opt_line_no'>";
272 if (strlen($descs)) {
273 $arrdescs = explode('~', $descs);
274 $i = 0;
275 foreach ($arrdescs as $desc) {
276 echo "<a href='' onclick='return delete_code($opt_line_no,$i)' title='" . xl('Delete') . "'>";
277 echo "[x]&nbsp;</a>$desc<br />";
278 ++$i;
281 echo "</div>";
282 echo "<a href='' onclick='return select_code($opt_line_no)'>";
283 echo "[" . xl('Add') . "]</a>";
285 echo "<input type='hidden' name='opt[$opt_line_no][codes]' value='" .
286 htmlspecialchars($codes, ENT_QUOTES) . "' />";
287 echo "<input type='hidden' name='opt[$opt_line_no][descs]' value='" .
288 htmlspecialchars($descs, ENT_QUOTES) . "' />";
289 echo "</td>\n";
291 echo " </tr>\n";
294 // Helper functions for writeCTLine():
296 function ctGenCell($opt_line_no, $ct_array, $name, $size, $maxlength, $title='') {
297 $value = isset($ct_array[$name]) ? $ct_array[$name] : '';
298 $s = " <td align='center' class='optcell'";
299 if ($title) $s .= " title='" . addslashes($title) . "'";
300 $s .= ">";
301 $s .= "<input type='text' name='opt[$opt_line_no][$name]' value='";
302 $s .= htmlspecialchars($value, ENT_QUOTES);
303 $s .= "' size='$size' maxlength='$maxlength' class='optin' />";
304 $s .= "</td>\n";
305 return $s;
308 function ctGenCbox($opt_line_no, $ct_array, $name, $title='') {
309 $checked = empty($ct_array[$name]) ? '' : 'checked ';
310 $s = " <td align='center' class='optcell'";
311 if ($title) $s .= " title='" . addslashes($title) . "'";
312 $s .= ">";
313 $s .= "<input type='checkbox' name='opt[$opt_line_no][$name]' value='1' ";
314 $s .= "$checked/>";
315 $s .= "</td>\n";
316 return $s;
319 // Write a form line as above but for the special case of Code Types.
321 function writeCTLine($ct_array) {
322 global $opt_line_no;
324 ++$opt_line_no;
325 $bgcolor = "#" . (($opt_line_no & 1) ? "ddddff" : "ffdddd");
327 echo " <tr bgcolor='$bgcolor'>\n";
329 echo ctGenCell($opt_line_no, $ct_array, 'ct_key' , 4, 15,
330 xl('Unique human-readable identifier for this type'));
331 echo ctGenCell($opt_line_no, $ct_array, 'ct_id' , 2, 11,
332 xl('Unique numeric identifier for this type'));
333 echo ctGenCell($opt_line_no, $ct_array, 'ct_seq' , 2, 3,
334 xl('Numeric display order'));
335 echo ctGenCell($opt_line_no, $ct_array, 'ct_mod' , 1, 2,
336 xl('Length of modifier, 0 if none'));
337 echo ctGenCell($opt_line_no, $ct_array, 'ct_just', 4, 15,
338 xl('If billing justification is used enter the name of the diagnosis code type.'));
339 echo ctGenCell($opt_line_no, $ct_array, 'ct_mask', 6, 9,
340 xl('Specifies formatting for codes. # = digit, * = any character. Empty if not used.'));
341 echo ctGenCBox($opt_line_no, $ct_array, 'ct_fee',
342 xl('Are fees charged for this type?'));
343 echo ctGenCBox($opt_line_no, $ct_array, 'ct_rel',
344 xl('Does this type allow related codes?'));
345 echo ctGenCBox($opt_line_no, $ct_array, 'ct_nofs',
346 xl('Is this type hidden in the fee sheet?'));
347 echo ctGenCBox($opt_line_no, $ct_array, 'ct_diag',
348 xl('Is this a diagnosis type?'));
350 echo " </tr>\n";
353 <html>
355 <head>
356 <?php html_header_show();?>
358 <!-- supporting javascript code -->
359 <script type="text/javascript" src="<?php echo $GLOBALS['webroot'] ?>/library/js/jquery.js"></script>
361 <link rel="stylesheet" href='<?php echo $css_header ?>' type='text/css'>
362 <title><?php xl('List Editor','e'); ?></title>
364 <style>
365 tr.head { font-size:10pt; background-color:#cccccc; text-align:center; }
366 tr.detail { font-size:10pt; }
367 td { font-size:10pt; }
368 input { font-size:10pt; }
369 a, a:visited, a:hover { color:#0000cc; }
370 .optcell { }
371 .optin { background-color:transparent; }
372 .help { cursor:help; }
373 .translation { color:green; }
374 </style>
376 <script type="text/javascript" src="../../library/dialog.js"></script>
378 <script language="JavaScript">
380 var current_lino = 0;
382 // Helper function to set the contents of a div.
383 // This is for Fee Sheet administration.
384 function setDivContent(id, content) {
385 if (document.getElementById) {
386 var x = document.getElementById(id);
387 x.innerHTML = '';
388 x.innerHTML = content;
390 else if (document.all) {
391 var x = document.all[id];
392 x.innerHTML = content;
396 // Given a line number, redisplay its descriptive list of codes.
397 // This is for Fee Sheet administration.
398 function displayCodes(lino) {
399 var f = document.forms[0];
400 var s = '';
401 var descs = f['opt[' + lino + '][descs]'].value;
402 if (descs.length) {
403 var arrdescs = descs.split('~');
404 for (var i = 0; i < arrdescs.length; ++i) {
405 s += "<a href='' onclick='return delete_code(" + lino + "," + i + ")' title='<?php xl('Delete','e'); ?>'>";
406 s += "[x]&nbsp;</a>" + arrdescs[i] + "<br />";
409 setDivContent('codelist_' + lino, s);
412 // Helper function to remove a Fee Sheet code.
413 function dc_substring(s, i) {
414 var r = '';
415 var j = s.indexOf('~', i);
416 if (j < 0) { // deleting last segment
417 if (i > 0) r = s.substring(0, i-1); // omits trailing ~
419 else { // not last segment
420 r = s.substring(0, i) + s.substring(j + 1);
422 return r;
425 // Remove a generated Fee Sheet code.
426 function delete_code(lino, seqno) {
427 var f = document.forms[0];
428 var celem = f['opt[' + lino + '][codes]'];
429 var delem = f['opt[' + lino + '][descs]'];
430 var ci = 0;
431 var di = 0;
432 for (var i = 0; i < seqno; ++i) {
433 ci = celem.value.indexOf('~', ci) + 1;
434 di = delem.value.indexOf('~', di) + 1;
436 celem.value = dc_substring(celem.value, ci);
437 delem.value = dc_substring(delem.value, di);
438 displayCodes(lino);
439 return false;
442 // This invokes the find-code popup.
443 // For Fee Sheet administration.
444 function select_code(lino) {
445 current_lino = lino;
446 dlgopen('../patient_file/encounter/find_code_popup.php', '_blank', 700, 400);
447 return false;
450 // This is for callback by the find-code popup.
451 // For Fee Sheet administration.
452 function set_related(codetype, code, selector, codedesc) {
453 var f = document.forms[0];
454 var celem = f['opt[' + current_lino + '][codes]'];
455 var delem = f['opt[' + current_lino + '][descs]'];
456 var i = 0;
457 while ((i = codedesc.indexOf('~')) >= 0) {
458 codedesc = codedesc.substring(0, i) + ' ' + codedesc.substring(i+1);
460 if (code) {
461 if (celem.value) {
462 celem.value += '~';
463 delem.value += '~';
465 celem.value += codetype + '|' + code + '|' + selector;
466 if (codetype == 'PROD') delem.value += code + ':' + selector + ' ' + codedesc;
467 else delem.value += codetype + ':' + code + ' ' + codedesc;
468 } else {
469 celem.value = '';
470 delem.value = '';
472 displayCodes(current_lino);
475 // Called when a "default" checkbox is clicked. Clears all the others.
476 function defClicked(lino) {
477 var f = document.forms[0];
478 for (var i = 1; f['opt[' + i + '][default]']; ++i) {
479 if (i != lino) f['opt[' + i + '][default]'].checked = false;
483 // Form validation and submission.
484 // This needs more validation.
485 function mysubmit() {
486 var f = document.forms[0];
487 if (f.list_id.value == 'code_types') {
488 for (var i = 1; f['opt[' + i + '][ct_key]'].value; ++i) {
489 var ikey = 'opt[' + i + ']';
490 for (var j = i+1; f['opt[' + j + '][ct_key]'].value; ++j) {
491 var jkey = 'opt[' + j + ']';
492 if (f[ikey+'[ct_key]'].value == f[jkey+'[ct_key]'].value) {
493 alert('<?php echo xl('Error: duplicated name on line') ?>' + ' ' + j);
494 return;
496 if (parseInt(f[ikey+'[ct_id]'].value) == parseInt(f[jkey+'[ct_id]'].value)) {
497 alert('<?php echo xl('Error: duplicated ID on line') ?>' + ' ' + j);
498 return;
503 f.submit();
506 </script>
508 </head>
510 <body class="body_top">
512 <form method='post' name='theform' id='theform' action='edit_list.php'>
513 <input type="hidden" name="formaction" id="formaction">
515 <p><b><?php xl('Edit list','e'); ?>:</b>&nbsp;
516 <select name='list_id' id="list_id">
517 <?php
519 // List order depends on language translation options.
520 $lang_id = empty($_SESSION['language_choice']) ? '1' : $_SESSION['language_choice'];
522 if (($lang_id == '1' && !empty($GLOBALS['skip_english_translation'])) ||
523 !$GLOBALS['translate_lists'])
525 $res = sqlStatement("SELECT option_id, title FROM list_options WHERE " .
526 "list_id = 'lists' ORDER BY title, seq");
528 else {
529 // Use and sort by the translated list name.
530 $res = sqlStatement("SELECT lo.option_id, " .
531 "IF(LENGTH(ld.definition),ld.definition,lo.title) AS title " .
532 "FROM list_options AS lo " .
533 "LEFT JOIN lang_constants AS lc ON lc.constant_name = lo.title " .
534 "LEFT JOIN lang_definitions AS ld ON ld.cons_id = lc.cons_id AND " .
535 "ld.lang_id = '$lang_id' " .
536 "WHERE lo.list_id = 'lists' " .
537 "ORDER BY IF(LENGTH(ld.definition),ld.definition,lo.title), lo.seq");
540 while ($row = sqlFetchArray($res)) {
541 $key = $row['option_id'];
542 echo "<option value='$key'";
543 if ($key == $list_id) echo " selected";
544 echo ">" . $row['title'] . "</option>\n";
548 </select>
549 <input type="button" id="<?php echo $list_id; ?>" class="deletelist" value=<?php xl('Delete List','e','\'','\''); ?>>
550 <input type="button" id="newlist" class="newlist" value=<?php xl('New List','e','\'','\''); ?>>
551 </p>
553 <center>
555 <table cellpadding='2' cellspacing='0'>
556 <tr class='head'>
557 <?php if ($list_id == 'feesheet') { ?>
558 <td><b><?php xl('Group' ,'e'); ?></b></td>
559 <td><b><?php xl('Option' ,'e'); ?></b></td>
560 <td><b><?php xl('Generates','e'); ?></b></td>
561 <?php } else if ($list_id == 'code_types') { ?>
562 <td><b><?php xl('Name' ,'e'); ?></b></td>
563 <td><b><?php xl('ID' ,'e'); ?></b></td>
564 <td><b><?php xl('Seq' ,'e'); ?></b></td>
565 <td><b><?php xl('ModLength' ,'e'); ?></b></td>
566 <td><b><?php xl('Justify' ,'e'); ?></b></td>
567 <td><b><?php xl('Mask' ,'e'); ?></b></td>
568 <td><b><?php xl('Fees' ,'e'); ?></b></td>
569 <td><b><?php xl('Relations' ,'e'); ?></b></td>
570 <td><b><?php xl('Hide' ,'e'); ?></b></td>
571 <td><b><?php xl('Diagnosis' ,'e'); ?></b></td>
572 <?php } else { ?>
573 <td title=<?php xl('Click to edit','e','\'','\''); ?>><b><?php xl('ID','e'); ?></b></td>
574 <td><b><?php xl('Title' ,'e'); ?></b></td>
575 <?php //show translation column if not english and the translation lists flag is set
576 if ($GLOBALS['translate_lists'] && $_SESSION['language_choice'] > 1) {
577 echo "<td><b>".xl('Translation')."</b><span class='help' title='".xl('The translated Title that will appear in current language')."'> (?)</span></td>";
578 } ?>
579 <td><b><?php xl('Order' ,'e'); ?></b></td>
580 <td><b><?php xl('Default','e'); ?></b></td>
581 <?php if ($list_id == 'taxrate') { ?>
582 <td><b><?php xl('Rate' ,'e'); ?></b></td>
583 <?php } else if ($list_id == 'contrameth') { ?>
584 <td><b><?php xl('Effectiveness','e'); ?></b></td>
585 <?php } else if ($list_id == 'fitness') { ?>
586 <td><b><?php xl('Color:Abbr','e'); ?></b></td>
587 <?php } else if ($list_id == 'adjreason') { ?>
588 <td><b><?php xl('Type','e'); ?></b></td>
589 <?php } if ($GLOBALS['ippf_specific']) { ?>
590 <td><b><?php xl('Global ID','e'); ?></b></td>
591 <?php } ?>
592 <td><b><?php xl('Notes','e'); ?></b></td>
593 <?php } // end not fee sheet ?>
594 </tr>
596 <?php
597 // Get the selected list's elements.
598 if ($list_id) {
599 if ($list_id == 'feesheet') {
600 $res = sqlStatement("SELECT * FROM fee_sheet_options " .
601 "ORDER BY fs_category, fs_option");
602 while ($row = sqlFetchArray($res)) {
603 writeFSLine($row['fs_category'], $row['fs_option'], $row['fs_codes']);
605 for ($i = 0; $i < 3; ++$i) {
606 writeFSLine('', '', '');
609 else if ($list_id == 'code_types') {
610 $res = sqlStatement("SELECT * FROM code_types " .
611 "ORDER BY ct_seq, ct_key");
612 while ($row = sqlFetchArray($res)) {
613 writeCTLine($row);
615 for ($i = 0; $i < 3; ++$i) {
616 writeCTLine(array());
619 else {
620 $res = sqlStatement("SELECT * FROM list_options WHERE " .
621 "list_id = '$list_id' ORDER BY seq,title");
622 while ($row = sqlFetchArray($res)) {
623 writeOptionLine($row['option_id'], $row['title'], $row['seq'],
624 $row['is_default'], $row['option_value'], $row['mapping'],
625 $row['notes']);
627 for ($i = 0; $i < 3; ++$i) {
628 writeOptionLine('', '', '', '', 0);
634 </table>
637 <input type='button' name='form_save' id='form_save' value='<?php xl('Save','e'); ?>' />
638 </p>
639 </center>
641 </form>
643 <!-- template DIV that appears when user chooses to make a new list -->
644 <div id="newlistdetail" style="border: 1px solid black; padding: 3px; display: none; visibility: hidden; background-color: lightgrey;">
645 <?php xl('List Name','e'); ?>: <input type="textbox" size="20" maxlength="30" name="newlistname" id="newlistname">
646 <br>
647 <input type="button" class="savenewlist" value=<?php xl('Save New List','e','\'','\''); ?>>
648 <input type="button" class="cancelnewlist" value=<?php xl('Cancel','e','\'','\''); ?>>
649 </div>
650 </body>
651 <script language="javascript">
652 // jQuery stuff to make the page a little easier to use
654 $(document).ready(function(){
655 $("#form_save").click(function() { SaveChanges(); });
656 $("#list_id").change(function() { $('#theform').submit(); });
658 $(".newlist").click(function() { NewList(this); });
659 $(".savenewlist").click(function() { SaveNewList(this); });
660 $(".deletelist").click(function() { DeleteList(this); });
661 $(".cancelnewlist").click(function() { CancelNewList(this); });
663 var SaveChanges = function() {
664 $("#formaction").val("save");
665 // $('#theform').submit();
666 mysubmit();
669 // show the DIV to create a new list
670 var NewList = function(btnObj) {
671 // show the field details DIV
672 $('#newlistdetail').css('visibility', 'visible');
673 $('#newlistdetail').css('display', 'block');
674 $(btnObj).parent().append($("#newlistdetail"));
675 $('#newlistdetail > #newlistname').focus();
677 // save the new list
678 var SaveNewList = function() {
679 // the list name can only have letters, numbers, spaces and underscores
680 // AND it cannot start with a number
681 if ($("#newlistname").val().match(/^\d+/)) {
682 alert("<?php xl('List names cannot start with numbers.','e'); ?>");
683 return false;
685 var validname = $("#newlistname").val().replace(/[^A-za-z0-9 -]/g, "_"); // match any non-word characters and replace them
686 if (validname != $("#newlistname").val()) {
687 if (! confirm("<?php xl('Your list name has been changed to meet naming requirements.','e','','\n') . xl('Please compare the new name','e','',', \''); ?>"+validname+"<?php xl('with the old name','e','\' ',', \''); ?>"+$("#newlistname").val()+"<?php xl('Do you wish to continue with the new name?','e','\'.\n',''); ?>"))
689 return false;
692 $("#newlistname").val(validname);
694 // submit the form to add a new field to a specific group
695 $("#formaction").val("addlist");
696 $("#theform").submit();
698 // actually delete an entire list from the database
699 var DeleteList = function(btnObj) {
700 var listid = $(btnObj).attr("id");
701 if (confirm("<?php xl('WARNING','e','',' - ') . xl('This action cannot be undone.','e','','\n') . xl('Are you sure you wish to delete the entire list','e',' ','('); ?>"+listid+")?")) {
702 // submit the form to add a new field to a specific group
703 $("#formaction").val("deletelist");
704 $("#deletelistname").val(listid);
705 $("#theform").submit();
709 // just hide the new list DIV
710 var CancelNewList = function(btnObj) {
711 // hide the list details DIV
712 $('#newlistdetail').css('visibility', 'hidden');
713 $('#newlistdetail').css('display', 'none');
714 // reset the new group values to a default
715 $('#newlistdetail > #newlistname').val("");
719 </script>
721 </html>