2 // Copyright (C) 2007-2011 Rod Roark <rod@sunsetsystems.com>
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) {
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 " .
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 " .
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')
89 sqlInsert("INSERT INTO list_options ( " .
90 "list_id, option_id, title, seq, is_default, option_value, mapping, notes " .
94 "'" . formTrim($iter['title']) . "', " .
95 "'" . formTrim($iter['seq']) . "', " .
96 "'" . formTrim($iter['default']) . "', " .
97 "'" . $value . "', " .
98 "'" . formTrim($iter['mapping']) . "', " .
99 "'" . formTrim($iter['notes']) . "' " .
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 " .
117 "'lists',". // the master list-of-lists
119 "'".$_POST['newlistname']."', ".
120 "'".($row['maxseq']+
1)."',".
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']."'");
133 // Given a string of multiple instances of code_type|code|selector,
134 // make a description for each.
135 function getCodeDescriptions($codes) {
137 $arrcodes = explode('~', $codes);
139 foreach ($arrcodes as $codestring) {
140 if ($codestring === '') continue;
141 $arrcode = explode('|', $codestring);
142 $code_type = $arrcode[0];
144 $selector = $arrcode[2];
146 if ($code_type == 'PROD') {
147 $row = sqlQuery("SELECT name FROM drugs WHERE drug_id = '$code' ");
148 $desc = "$code:$selector " . $row['name'];
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);
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;
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' />";
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' />";
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' />";
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 />";
198 // Tax rates, contraceptive methods and LBF names have an additional attribute.
200 if ($list_id == 'taxrate' ||
$list_id == 'contrameth' ||
$list_id == 'lbfnames') {
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' />";
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'>";
216 1 => xl('Charge adjustment'),
217 2 => xl('Coinsurance'),
218 3 => xl('Deductible'),
219 4 => xl('Other pt resp'),
221 ) as $key => $desc) {
222 echo "<option value='$key'";
223 if ($key == $value) echo " selected";
224 echo ">" . htmlspecialchars($desc) . "</option>";
230 // Address book categories use option_value to flag category as a
231 // person-centric vs company-centric vs indifferent.
233 else if ($list_id == 'abook_type') {
234 echo " <td align='center' class='optcell'>";
235 echo "<select name='opt[$opt_line_no][value]' class='optin'>";
237 1 => xl('Unassigned'),
240 ) as $key => $desc) {
241 echo "<option value='$key'";
242 if ($key == $value) echo " selected";
243 echo ">" . htmlspecialchars($desc) . "</option>";
249 // IPPF includes the ability to map each list item to a "master" identifier.
250 // Sports teams use this for some extra info for fitness levels.
252 if ($GLOBALS['ippf_specific'] ||
$list_id == 'fitness') {
253 echo " <td align='center' class='optcell'>";
254 echo "<input type='text' name='opt[$opt_line_no][mapping]' value='" .
255 htmlspecialchars($mapping, ENT_QUOTES
) . "' size='12' maxlength='15' class='optin' />";
259 echo " <td align='center' class='optcell'>";
260 echo "<input type='text' name='opt[$opt_line_no][notes]' value='" .
261 htmlspecialchars($notes, ENT_QUOTES
) . "' size='25' maxlength='255' class='optin' />";
267 // Write a form line as above but for the special case of the Fee Sheet.
269 function writeFSLine($category, $option, $codes) {
273 $bgcolor = "#" . (($opt_line_no & 1) ?
"ddddff" : "ffdddd");
275 $descs = getCodeDescriptions($codes);
277 echo " <tr bgcolor='$bgcolor'>\n";
279 echo " <td align='center' class='optcell'>";
280 echo "<input type='text' name='opt[$opt_line_no][category]' value='" .
281 htmlspecialchars($category, ENT_QUOTES
) . "' size='20' maxlength='63' class='optin' />";
284 echo " <td align='center' class='optcell'>";
285 echo "<input type='text' name='opt[$opt_line_no][option]' value='" .
286 htmlspecialchars($option, ENT_QUOTES
) . "' size='20' maxlength='63' class='optin' />";
289 echo " <td align='left' class='optcell'>";
290 echo " <div id='codelist_$opt_line_no'>";
291 if (strlen($descs)) {
292 $arrdescs = explode('~', $descs);
294 foreach ($arrdescs as $desc) {
295 echo "<a href='' onclick='return delete_code($opt_line_no,$i)' title='" . xl('Delete') . "'>";
296 echo "[x] </a>$desc<br />";
301 echo "<a href='' onclick='return select_code($opt_line_no)'>";
302 echo "[" . xl('Add') . "]</a>";
304 echo "<input type='hidden' name='opt[$opt_line_no][codes]' value='" .
305 htmlspecialchars($codes, ENT_QUOTES
) . "' />";
306 echo "<input type='hidden' name='opt[$opt_line_no][descs]' value='" .
307 htmlspecialchars($descs, ENT_QUOTES
) . "' />";
313 // Helper functions for writeCTLine():
315 function ctGenCell($opt_line_no, $ct_array, $name, $size, $maxlength, $title='') {
316 $value = isset($ct_array[$name]) ?
$ct_array[$name] : '';
317 $s = " <td align='center' class='optcell'";
318 if ($title) $s .= " title='" . addslashes($title) . "'";
320 $s .= "<input type='text' name='opt[$opt_line_no][$name]' value='";
321 $s .= htmlspecialchars($value, ENT_QUOTES
);
322 $s .= "' size='$size' maxlength='$maxlength' class='optin' />";
327 function ctGenCbox($opt_line_no, $ct_array, $name, $title='') {
328 $checked = empty($ct_array[$name]) ?
'' : 'checked ';
329 $s = " <td align='center' class='optcell'";
330 if ($title) $s .= " title='" . addslashes($title) . "'";
332 $s .= "<input type='checkbox' name='opt[$opt_line_no][$name]' value='1' ";
338 // Write a form line as above but for the special case of Code Types.
340 function writeCTLine($ct_array) {
344 $bgcolor = "#" . (($opt_line_no & 1) ?
"ddddff" : "ffdddd");
346 echo " <tr bgcolor='$bgcolor'>\n";
348 echo ctGenCell($opt_line_no, $ct_array, 'ct_key' , 4, 15,
349 xl('Unique human-readable identifier for this type'));
350 echo ctGenCell($opt_line_no, $ct_array, 'ct_id' , 2, 11,
351 xl('Unique numeric identifier for this type'));
352 echo ctGenCell($opt_line_no, $ct_array, 'ct_seq' , 2, 3,
353 xl('Numeric display order'));
354 echo ctGenCell($opt_line_no, $ct_array, 'ct_mod' , 1, 2,
355 xl('Length of modifier, 0 if none'));
356 echo ctGenCell($opt_line_no, $ct_array, 'ct_just', 4, 15,
357 xl('If billing justification is used enter the name of the diagnosis code type.'));
358 echo ctGenCell($opt_line_no, $ct_array, 'ct_mask', 6, 9,
359 xl('Specifies formatting for codes. # = digit, @ = alpha, * = any character. Empty if not used.'));
360 echo ctGenCBox($opt_line_no, $ct_array, 'ct_fee',
361 xl('Are fees charged for this type?'));
362 echo ctGenCBox($opt_line_no, $ct_array, 'ct_rel',
363 xl('Does this type allow related codes?'));
364 echo ctGenCBox($opt_line_no, $ct_array, 'ct_nofs',
365 xl('Is this type hidden in the fee sheet?'));
366 echo ctGenCBox($opt_line_no, $ct_array, 'ct_diag',
367 xl('Is this a diagnosis type?'));
375 <?php
html_header_show();?
>
377 <!-- supporting javascript code
-->
378 <script type
="text/javascript" src
="<?php echo $GLOBALS['webroot'] ?>/library/js/jquery.js"></script
>
380 <link rel
="stylesheet" href
='<?php echo $css_header ?>' type
='text/css'>
381 <title
><?php
xl('List Editor','e'); ?
></title
>
384 tr
.head
{ font
-size
:10pt
; background
-color
:#cccccc; text-align:center; }
385 tr
.detail
{ font
-size
:10pt
; }
386 td
{ font
-size
:10pt
; }
387 input
{ font
-size
:10pt
; }
388 a
, a
:visited
, a
:hover
{ color
:#0000cc; }
390 .optin
{ background
-color
:transparent
; }
391 .help
{ cursor
:help
; }
392 .translation
{ color
:green
; }
395 <script type
="text/javascript" src
="../../library/dialog.js"></script
>
397 <script language
="JavaScript">
399 var current_lino
= 0;
401 // Helper function to set the contents of a div.
402 // This is for Fee Sheet administration.
403 function setDivContent(id
, content
) {
404 if (document
.getElementById
) {
405 var x
= document
.getElementById(id
);
407 x
.innerHTML
= content
;
409 else if (document
.all
) {
410 var x
= document
.all
[id
];
411 x
.innerHTML
= content
;
415 // Given a line number, redisplay its descriptive list of codes.
416 // This is for Fee Sheet administration.
417 function displayCodes(lino
) {
418 var f
= document
.forms
[0];
420 var descs
= f
['opt[' + lino +
'][descs]'].value
;
422 var arrdescs
= descs
.split('~');
423 for (var i
= 0; i
< arrdescs
.length
; ++i
) {
424 s +
= "<a href='' onclick='return delete_code(" + lino +
"," + i +
")' title='<?php xl('Delete','e'); ?>'>";
425 s +
= "[x] </a>" + arrdescs
[i
] +
"<br />";
428 setDivContent('codelist_' + lino
, s
);
431 // Helper function to remove a Fee Sheet code.
432 function dc_substring(s
, i
) {
434 var j
= s
.indexOf('~', i
);
435 if (j
< 0) { // deleting last segment
436 if (i
> 0) r
= s
.substring(0, i
-1); // omits trailing ~
438 else { // not last segment
439 r
= s
.substring(0, i
) + s
.substring(j +
1);
444 // Remove a generated Fee Sheet code.
445 function delete_code(lino
, seqno
) {
446 var f
= document
.forms
[0];
447 var celem
= f
['opt[' + lino +
'][codes]'];
448 var delem
= f
['opt[' + lino +
'][descs]'];
451 for (var i
= 0; i
< seqno
; ++i
) {
452 ci
= celem
.value
.indexOf('~', ci
) +
1;
453 di
= delem
.value
.indexOf('~', di
) +
1;
455 celem
.value
= dc_substring(celem
.value
, ci
);
456 delem
.value
= dc_substring(delem
.value
, di
);
461 // This invokes the find-code popup.
462 // For Fee Sheet administration.
463 function select_code(lino
) {
465 dlgopen('../patient_file/encounter/find_code_popup.php', '_blank', 700, 400);
469 // This is for callback by the find-code popup.
470 // For Fee Sheet administration.
471 function set_related(codetype
, code
, selector
, codedesc
) {
472 var f
= document
.forms
[0];
473 var celem
= f
['opt[' + current_lino +
'][codes]'];
474 var delem
= f
['opt[' + current_lino +
'][descs]'];
476 while ((i
= codedesc
.indexOf('~')) >= 0) {
477 codedesc
= codedesc
.substring(0, i
) +
' ' + codedesc
.substring(i+
1);
484 celem
.value +
= codetype +
'|' + code +
'|' + selector
;
485 if (codetype
== 'PROD') delem
.value +
= code +
':' + selector +
' ' + codedesc
;
486 else delem
.value +
= codetype +
':' + code +
' ' + codedesc
;
491 displayCodes(current_lino
);
494 // Called when a "default" checkbox is clicked. Clears all the others.
495 function defClicked(lino
) {
496 var f
= document
.forms
[0];
497 for (var i
= 1; f
['opt[' + i +
'][default]']; ++i
) {
498 if (i
!= lino
) f
['opt[' + i +
'][default]'].checked
= false;
502 // Form validation and submission.
503 // This needs more validation.
504 function mysubmit() {
505 var f
= document
.forms
[0];
506 if (f
.list_id
.value
== 'code_types') {
507 for (var i
= 1; f
['opt[' + i +
'][ct_key]'].value
; ++i
) {
508 var ikey
= 'opt[' + i +
']';
509 for (var j
= i+
1; f
['opt[' + j +
'][ct_key]'].value
; ++j
) {
510 var jkey
= 'opt[' + j +
']';
511 if (f
[ikey+
'[ct_key]'].value
== f
[jkey+
'[ct_key]'].value
) {
512 alert('<?php echo xl('Error
: duplicated name on line
') ?>' +
' ' + j
);
515 if (parseInt(f
[ikey+
'[ct_id]'].value
) == parseInt(f
[jkey+
'[ct_id]'].value
)) {
516 alert('<?php echo xl('Error
: duplicated ID on line
') ?>' +
' ' + j
);
529 <body
class="body_top">
531 <form method
='post' name
='theform' id
='theform' action
='edit_list.php'>
532 <input type
="hidden" name
="formaction" id
="formaction">
534 <p
><b
><?php
xl('Edit list','e'); ?
>:</b
> 
;
535 <select name
='list_id' id
="list_id">
538 // List order depends on language translation options.
539 $lang_id = empty($_SESSION['language_choice']) ?
'1' : $_SESSION['language_choice'];
541 if (($lang_id == '1' && !empty($GLOBALS['skip_english_translation'])) ||
542 !$GLOBALS['translate_lists'])
544 $res = sqlStatement("SELECT option_id, title FROM list_options WHERE " .
545 "list_id = 'lists' ORDER BY title, seq");
548 // Use and sort by the translated list name.
549 $res = sqlStatement("SELECT lo.option_id, " .
550 "IF(LENGTH(ld.definition),ld.definition,lo.title) AS title " .
551 "FROM list_options AS lo " .
552 "LEFT JOIN lang_constants AS lc ON lc.constant_name = lo.title " .
553 "LEFT JOIN lang_definitions AS ld ON ld.cons_id = lc.cons_id AND " .
554 "ld.lang_id = '$lang_id' " .
555 "WHERE lo.list_id = 'lists' " .
556 "ORDER BY IF(LENGTH(ld.definition),ld.definition,lo.title), lo.seq");
559 while ($row = sqlFetchArray($res)) {
560 $key = $row['option_id'];
561 echo "<option value='$key'";
562 if ($key == $list_id) echo " selected";
563 echo ">" . $row['title'] . "</option>\n";
568 <input type
="button" id
="<?php echo $list_id; ?>" class="deletelist" value
=<?php
xl('Delete List','e','\'','\''); ?
>>
569 <input type
="button" id
="newlist" class="newlist" value
=<?php
xl('New List','e','\'','\''); ?
>>
574 <table cellpadding
='2' cellspacing
='0'>
576 <?php
if ($list_id == 'feesheet') { ?
>
577 <td
><b
><?php
xl('Group' ,'e'); ?
></b
></td
>
578 <td
><b
><?php
xl('Option' ,'e'); ?
></b
></td
>
579 <td
><b
><?php
xl('Generates','e'); ?
></b
></td
>
580 <?php
} else if ($list_id == 'code_types') { ?
>
581 <td
><b
><?php
xl('Name' ,'e'); ?
></b
></td
>
582 <td
><b
><?php
xl('ID' ,'e'); ?
></b
></td
>
583 <td
><b
><?php
xl('Seq' ,'e'); ?
></b
></td
>
584 <td
><b
><?php
xl('ModLength' ,'e'); ?
></b
></td
>
585 <td
><b
><?php
xl('Justify' ,'e'); ?
></b
></td
>
586 <td
><b
><?php
xl('Mask' ,'e'); ?
></b
></td
>
587 <td
><b
><?php
xl('Fees' ,'e'); ?
></b
></td
>
588 <td
><b
><?php
xl('Relations' ,'e'); ?
></b
></td
>
589 <td
><b
><?php
xl('Hide' ,'e'); ?
></b
></td
>
590 <td
><b
><?php
xl('Diagnosis' ,'e'); ?
></b
></td
>
592 <td title
=<?php
xl('Click to edit','e','\'','\''); ?
>><b
><?php
xl('ID','e'); ?
></b
></td
>
593 <td
><b
><?php
xl('Title' ,'e'); ?
></b
></td
>
594 <?php
//show translation column if not english and the translation lists flag is set
595 if ($GLOBALS['translate_lists'] && $_SESSION['language_choice'] > 1) {
596 echo "<td><b>".xl('Translation')."</b><span class='help' title='".xl('The translated Title that will appear in current language')."'> (?)</span></td>";
598 <td
><b
><?php
xl('Order' ,'e'); ?
></b
></td
>
599 <td
><b
><?php
xl('Default','e'); ?
></b
></td
>
600 <?php
if ($list_id == 'taxrate') { ?
>
601 <td
><b
><?php
xl('Rate' ,'e'); ?
></b
></td
>
602 <?php
} else if ($list_id == 'contrameth') { ?
>
603 <td
><b
><?php
xl('Effectiveness','e'); ?
></b
></td
>
604 <?php
} else if ($list_id == 'lbfnames') { ?
>
605 <td title
='<?php xl('Number of past history columns
','e
'); ?>'><b
><?php
xl('Repeats','e'); ?
></b
></td
>
606 <?php
} else if ($list_id == 'fitness') { ?
>
607 <td
><b
><?php
xl('Color:Abbr','e'); ?
></b
></td
>
608 <?php
} else if ($list_id == 'adjreason' ||
$list_id == 'abook_type') { ?
>
609 <td
><b
><?php
xl('Type','e'); ?
></b
></td
>
610 <?php
} if ($GLOBALS['ippf_specific']) { ?
>
611 <td
><b
><?php
xl('Global ID','e'); ?
></b
></td
>
613 <td
><b
><?php
xl('Notes','e'); ?
></b
></td
>
614 <?php
} // end not fee sheet ?>
618 // Get the selected list's elements.
620 if ($list_id == 'feesheet') {
621 $res = sqlStatement("SELECT * FROM fee_sheet_options " .
622 "ORDER BY fs_category, fs_option");
623 while ($row = sqlFetchArray($res)) {
624 writeFSLine($row['fs_category'], $row['fs_option'], $row['fs_codes']);
626 for ($i = 0; $i < 3; ++
$i) {
627 writeFSLine('', '', '');
630 else if ($list_id == 'code_types') {
631 $res = sqlStatement("SELECT * FROM code_types " .
632 "ORDER BY ct_seq, ct_key");
633 while ($row = sqlFetchArray($res)) {
636 for ($i = 0; $i < 3; ++
$i) {
637 writeCTLine(array());
641 $res = sqlStatement("SELECT * FROM list_options WHERE " .
642 "list_id = '$list_id' ORDER BY seq,title");
643 while ($row = sqlFetchArray($res)) {
644 writeOptionLine($row['option_id'], $row['title'], $row['seq'],
645 $row['is_default'], $row['option_value'], $row['mapping'],
648 for ($i = 0; $i < 3; ++
$i) {
649 writeOptionLine('', '', '', '', 0);
658 <input type
='button' name
='form_save' id
='form_save' value
='<?php xl('Save
','e
'); ?>' />
664 <!-- template DIV that appears when user chooses to make a
new list -->
665 <div id
="newlistdetail" style
="border: 1px solid black; padding: 3px; display: none; visibility: hidden; background-color: lightgrey;">
666 <?php
xl('List Name','e'); ?
>: <input type
="textbox" size
="20" maxlength
="30" name
="newlistname" id
="newlistname">
668 <input type
="button" class="savenewlist" value
=<?php
xl('Save New List','e','\'','\''); ?
>>
669 <input type
="button" class="cancelnewlist" value
=<?php
xl('Cancel','e','\'','\''); ?
>>
672 <script language
="javascript">
673 // jQuery stuff to make the page a little easier to use
675 $
(document
).ready(function(){
676 $
("#form_save").click(function() { SaveChanges(); });
677 $
("#list_id").change(function() { $
('#theform').submit(); });
679 $
(".newlist").click(function() { NewList(this
); });
680 $
(".savenewlist").click(function() { SaveNewList(this
); });
681 $
(".deletelist").click(function() { DeleteList(this
); });
682 $
(".cancelnewlist").click(function() { CancelNewList(this
); });
684 var SaveChanges
= function() {
685 $
("#formaction").val("save");
686 // $('#theform').submit();
690 // show the DIV to create a new list
691 var NewList
= function(btnObj
) {
692 // show the field details DIV
693 $
('#newlistdetail').css('visibility', 'visible');
694 $
('#newlistdetail').css('display', 'block');
695 $
(btnObj
).parent().append($
("#newlistdetail"));
696 $
('#newlistdetail > #newlistname').focus();
699 var SaveNewList
= function() {
700 // the list name can only have letters, numbers, spaces and underscores
701 // AND it cannot start with a number
702 if ($
("#newlistname").val().match(/^\d+
/)) {
703 alert("<?php xl('List names cannot start with numbers.','e'); ?>");
706 var validname
= $
("#newlistname").val().replace(/[^A
-za
-z0
-9 -]/g
, "_"); // match any non-word characters and replace them
707 if (validname
!= $
("#newlistname").val()) {
708 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',''); ?>"))
713 $
("#newlistname").val(validname
);
715 // submit the form to add a new field to a specific group
716 $
("#formaction").val("addlist");
717 $
("#theform").submit();
719 // actually delete an entire list from the database
720 var DeleteList
= function(btnObj
) {
721 var listid
= $
(btnObj
).attr("id");
722 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+
")?")) {
723 // submit the form to add a new field to a specific group
724 $
("#formaction").val("deletelist");
725 $
("#deletelistname").val(listid
);
726 $
("#theform").submit();
730 // just hide the new list DIV
731 var CancelNewList
= function(btnObj
) {
732 // hide the list details DIV
733 $
('#newlistdetail').css('visibility', 'hidden');
734 $
('#newlistdetail').css('display', 'none');
735 // reset the new group values to a default
736 $
('#newlistdetail > #newlistname').val("");