source: extensions/net.sf.basedb.reggie/trunk/resources/persinfo.jsp @ 1318

Last change on this file since 1318 was 1318, checked in by Nicklas Nordborg, 11 years ago

Fixes #299: Add field for PAD when no specimen tubes exists for a case

Added code that replaces '+' with '-'.

File size: 22.3 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.Application"
5  import="net.sf.basedb.core.User"
6  import="net.sf.basedb.core.DbControl"
7  import="net.sf.basedb.core.SessionControl"
8  import="net.sf.basedb.clients.web.Base"
9  import="net.sf.basedb.clients.web.util.HTML"
10  import="net.sf.basedb.util.Values"
11%>
12<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
13<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
14<%
15final SessionControl sc = Base.getExistingSessionControl(request, true);
16final String ID = sc.getId();
17final float scale = Base.getScale(sc);
18DbControl dc = null;
19try
20{
21  dc = sc.newDbControl();
22  final User user = User.getById(dc, sc.getLoggedInUserId());
23%>
24<base:page type="default" >
25<base:head scripts="ajax.js" styles="path.css">
26<script language="JavaScript">
27
28var currentStep = 1;
29var pnrIsValid = false;
30var caseIsValid = false;
31var lateralityIsValid = false;
32
33var patientInfo = null;
34var caseInfo = null;
35
36function init()
37{
38  var frm = document.forms['reggie'];
39  frm.caseName.focus();
40}
41
42function step1IsValid()
43{
44  return pnrIsValid && caseIsValid;
45}
46
47function step2IsValid()
48{
49  var formOk = true;
50  var frm = document.forms['reggie'];
51
52  // New patient only
53  if (!patientInfo.id)
54  {
55    // Validate 'New patient' form
56    if (frm.allFirstNames.value == '')
57    {
58      setInputStatus('allFirstNames', 'Missing', 'invalid');
59      frm.allFirstNames.focus();
60      formOk = false;
61    }
62    else
63    {
64      setInputStatus('allFirstNames', '', 'valid');
65    }
66   
67    if (frm.familyName.value == '')
68    {
69      setInputStatus('familyName', 'Missing', 'invalid');
70      frm.familyName.focus();
71      formOk = false;
72    }
73    else
74    {
75      setInputStatus('familyName', '', 'valid');
76    }
77
78    if (frm.patientCode.value == '')
79    {
80      setInputStatus('patientCode', 'Missing', 'invalid');
81      frm.patientCode.focus();
82      formOk = false;
83    }
84    else
85    {
86      setInputStatus('patientCode', '', 'valid');
87    }
88  }
89  return formOk;
90}
91
92function step3IsValid()
93{
94  return lateralityIsValid;
95}
96
97function goNext()
98{
99  if (currentStep == 1)
100  {
101    if (step1IsValid()) gotoStep2();
102  }
103  else if (currentStep == 2)
104  {
105    if (step2IsValid()) gotoStep3();
106  }
107}
108
109function caseNameOnChange()
110{
111  var frm = document.forms['reggie'];
112  var caseName = frm.caseName.value;
113  if (caseName == '')
114  {
115    setInputStatus('case', 'Missing', 'invalid');
116    return;
117  }
118  setInputStatus('case', '', 'valid');
119  caseIsValid = true;
120}
121
122function personalNumberOnChange()
123{
124  var frm = document.forms['reggie'];
125  var pnr = frm.personalNumber.value;
126  pnrIsValid = false;
127 
128  if (pnr.length < 12)
129  {
130    setInputStatus('pnr', 'Too short', 'invalid');
131    return;
132  }
133 
134  if (!Dates.isDate(pnr.substring(0, 8), 'yyyyMMdd'))
135  {
136    setInputStatus('pnr', 'Not a valid date', 'invalid');
137    return;
138  }
139 
140  var sum = 0;
141  var factor = 2;
142  var x = '';
143  for (var i = 2; i < 11; i++)
144  {
145    var digit = parseInt(pnr.substr(i, 1));
146    var tmp = factor * digit;
147    x += '(' + factor + '*' + digit+')';
148    sum += tmp >= 10 ? tmp - 9: tmp;
149    factor = factor == 2 ? 1 : 2;
150  }
151 
152  var control = 10 - (sum % 10);
153  if (control == 10) control = 0;
154  if (control != parseInt(pnr.substr(11, 1)))
155  {
156    setInputStatus('pnr', 'Invalid control digit', 'invalid');
157    return;
158  }
159 
160  setInputStatus('pnr', '', 'valid');
161  pnrIsValid = true;
162}
163
164function lateralityOnChange()
165{
166  lateralityIsValid = false;
167 
168  // Check selected laterality against specimen tubes
169  var frm = document.forms['reggie'];
170  var selectedLaterality = Forms.getCheckedRadio(frm.laterality);
171 
172  // No laterality/case selected
173  if (selectedLaterality == null)
174  {
175    setInputStatus('laterality', 'Not selected', 'invalid');
176    return;
177  }
178  setInputStatus('laterality', '', 'valid');
179  lateralityIsValid = true;
180 
181  var laterality = selectedLaterality.value;
182  if (laterality.match(/\d+/))
183  {
184    // It is the ID of an existing case
185    for (var i = 0; i < patientInfo.cases.length; i++)
186    {
187      var cse = patientInfo.cases[i];
188      if (cse.id == laterality)
189      {
190        laterality = cse.laterality;
191        break;
192      }
193    }
194  }
195  else if (laterality == '') 
196  {
197    laterality = null;
198  }
199   
200  // No specimen tubes?
201  if (!caseInfo.specimen || caseInfo.specimen.length == 0) return;
202 
203  for (var i = 0; i < caseInfo.specimen.length; i++)
204  {
205    var specimen = caseInfo.specimen[i];
206    if (specimen.laterality != laterality)
207    {
208      if (specimen.laterality == null)
209      {
210        setInputStatus('laterality', 'Specimen tubes are updated to: ' + laterality, 'valid')
211      }
212      else
213      {
214        setInputStatus('laterality', 'Not same laterality as specimen tubes', 'warning');
215      }
216      return;
217    }
218  }
219}
220
221function padOnChange()
222{
223  var frm = document.forms['reggie'];
224  var PAD = frm.pad.value;
225  if (PAD == '')
226  {
227    setInputStatus('pad', 'Missing', 'warning');
228    return;
229  }
230  frm.pad.value = PAD.replace(/\+/, '-');
231  setInputStatus('pad', '', 'valid');
232
233}
234
235function goNextOnTab(event)
236{
237  if (event.keyCode == 9) setTimeout('goNext()', 200);
238  return true;
239}
240
241function goNextOnTabOrEnter(event)
242{
243  if (event.keyCode == 9 || event.keyCode == 13) setTimeout('goNext()', 200);
244  return true;
245}
246
247function focusOnEnter(event, inputField)
248{
249  if (event.keyCode == 13) setTimeout("document.forms['reggie']."+inputField+".focus()", 200);
250  return true;
251}
252
253function gotoStep2()
254{
255  // Check entered case and pnr with AJAX
256  var frm = document.forms['reggie'];
257  frm.caseName.disabled = true;
258  frm.personalNumber.disabled = true;
259  currentStep = 2;
260 
261  var pnr = frm.personalNumber.value;
262  var caseName = frm.caseName.value;
263  var request = Ajax.getXmlHttpRequest();
264  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=CheckPersonalNumberAndCaseName';
265  url += '&personalNumber=' + pnr;
266  url += '&caseName=' + caseName;
267  request.open("GET", url, false);
268  request.send(null);
269 
270  //setInnerHTML('debug', request.responseText);
271 
272  var response = JSON.parse(request.responseText);
273  if (response.status != 'ok')
274  {
275    setFatalError(response.message);
276    return false;
277  }
278 
279  Main.show('gocancel');
280 
281  // Get biosource information from the AJAX response
282  patientInfo = response.patientInfo;
283  caseInfo = response.caseInfo;
284 
285  if (!patientInfo.id)
286  {
287    Main.show('newPatientSection');
288    frm.patientCode.value=patientInfo.name;
289    setInnerHTML('new.dateOfBirth', patientInfo.dateOfBirth);
290    setInnerHTML('new.gender', patientInfo.gender);
291    frm.familyName.focus();
292  }
293  else
294  {
295    Main.show('existingPatientSection');
296    setInnerHTML('existing.patientCode', patientInfo.name);
297    setInnerHTML('existing.familyName', patientInfo.familyName);
298    setInnerHTML('existing.allFirstNames', patientInfo.allFirstNames);
299    setInnerHTML('existing.dateOfBirth', patientInfo.dateOfBirth);
300    setInnerHTML('existing.gender', patientInfo.gender);
301    gotoStep3();
302  }
303}
304
305function gotoStep3()
306{
307  // Check entered case and pnr with AJAX
308  var frm = document.forms['reggie'];
309 
310  if (!patientInfo.id)
311  {
312    frm.patientCode.disabled = true;
313    frm.familyName.disabled = true;
314    frm.allFirstNames.disabled = true;
315    patientInfo.familyName = frm.familyName.value;
316    patientInfo.allFirstNames = frm.allFirstNames.value;
317  }
318  currentStep = 3;
319 
320  // Generate list of specimen tubes
321  var hasLeftSpecimen = false;
322  var hasRightSpecimen = false;
323  var hasUnknownSpecimen = false;
324  var thisCaseLaterality = null;
325  var hasPAD = false;
326  if (caseInfo.specimen && caseInfo.specimen.length > 0)
327  {
328    var specimenTubes = '';
329    Main.hide('reasonIfNoSpecimenSection');
330    for (var i = 0; i < caseInfo.specimen.length; i++)
331    {
332      var specimen = caseInfo.specimen[i];
333      specimenTubes += specimen.name;
334      if (specimen.pad) hasPAD = true;
335      if (specimen.laterality) 
336      {
337        specimenTubes += ' ('+specimen.laterality + ')';
338        Forms.checkRadio(frm.laterality, specimen.laterality);
339        if (specimen.laterality == 'LEFT') hasLeftSpecimen = true;
340        if (specimen.laterality == 'RIGHT') hasRightSpecimen = true;
341        thisCaseLaterality = specimen.laterality;
342      }
343      else
344      {
345        hasUnknownSpecimen = true;
346        specimenTubes += ' (<i>unknown laterality</i>)';
347      }
348      specimenTubes += '<br>';
349    }
350    setInnerHTML('specimenTubes', specimenTubes);
351   
352    // Check that all specimen tubes have the same laterality
353    var numLateralities = 0;
354    if (hasLeftSpecimen) numLateralities++;
355    if (hasRightSpecimen) numLateralities++;
356    if (hasUnknownSpecimen) numLateralities++;
357    if (numLateralities > 1)
358    {
359      setInputStatus('specimenTubes', 'Specimen tubes with different laterality', 'warning');
360      thisCaseLaterality = null;
361    }
362  }
363
364  Main.showHide('padSection', !hasPAD);
365 
366  Main.show('caseSection');
367 
368  // Existing cases for this patient
369  var hasLeftCase = false;
370  var hasRightCase = false;
371  var hasUnknownCase = false;
372  if (patientInfo.cases && patientInfo.cases.length > 0)
373  {
374    var cases = '';
375    for (var i = 0; i < patientInfo.cases.length; i++)
376    {
377      var cc = patientInfo.cases[i];
378      cases += '<input type="radio" name="laterality" value="' + cc.id + '"';
379      if (cc.laterality == 'LEFT') 
380      {
381        if (hasLeftCase) setInputStatus('laterality', 'Two cases with laterality=LEFT', 'warning');
382        hasLeftCase = true;
383      }
384      else if (cc.laterality == 'RIGHT') 
385      {
386        if (hasRightCase) setInputStatus('laterality', 'Two cases with laterality=RIGHT', 'warning');
387        hasRightCase = true;
388      }
389      else
390      {
391        hasUnknownCase = true; 
392      }
393      if (cc.laterality == thisCaseLaterality) cases += ' checked';
394      cases += ' onclick="lateralityOnChange()">' + cc.name;
395      if (cc.laterality)
396      {
397        cases += ' (' + cc.laterality + ')<br>';
398      }
399      else
400      {
401        cases += ' (<i>unknown laterality</i>)<br>';
402      }
403    }
404   
405    if (patientInfo.cases.length == 1)
406    {
407      if (!hasLeftCase)
408      {
409        cases += '<input type="radio" name="laterality" value="LEFT" ';
410        if (thisCaseLaterality == 'LEFT') cases += ' checked';
411        cases += ' onclick="lateralityOnChange()"><i>new case</i> (LEFT)<br>';
412      }
413      if (!hasRightCase)
414      {
415        cases += '<input type="radio" name="laterality" value="RIGHT"';
416        if (thisCaseLaterality == 'RIGHT') cases += ' checked';
417        cases += ' onclick="lateralityOnChange()"><i>new case</i> (RIGHT)<br>';
418      }
419      cases += '<input type="radio" name="laterality" value=""';
420      if (thisCaseLaterality == null) cases += ' checked';
421      cases += ' onclick="lateralityOnChange()"><i>new case</i> (<i>unknown laterality</i>)<br>';
422    }
423   
424    if (patientInfo.cases.length == 2)
425    {
426      setInnerHTML('laterality.prompt', 'Merge with case');
427    }
428    else
429    {
430      setInnerHTML('laterality.prompt', 'Merge/create new case');
431    }
432   
433    setInnerHTML('laterality.input', cases);
434  }
435  lateralityOnChange();
436
437  Main.hide('gonext');
438  Main.show('gocreate');
439 
440  if (!hasPAD && lateralityIsValid) frm.pad.focus();
441}
442
443function goCreate()
444{
445  if (!step3IsValid()) return;
446 
447  Main.hide('gocreate');
448  Main.hide('gocancel');
449  var frm = document.forms['reggie'];
450
451  caseInfo.laterality = Forms.getCheckedRadio(frm.laterality).value;
452  caseInfo.reasonIfNoSpecimen = frm.reasonIfNoSpecimen.value;
453  caseInfo.pad = frm.pad.value;
454
455  for (var i = 0; i < frm.laterality.length; i++)
456  {
457    frm.laterality[i].disabled = true;
458  }
459  frm.reasonIfNoSpecimen.disabled = true;
460  frm.pad.disabled = true;
461
462  var submitInfo = new Object();
463  submitInfo.patientInfo = patientInfo;
464  submitInfo.caseInfo = caseInfo;
465
466  //setInnerHTML('debug', JSON.stringify(submitInfo));
467 
468  var request = Ajax.getXmlHttpRequest();
469  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=Create';
470  request.open("POST", url, false);
471  request.setRequestHeader("Content-Type", "application/json");
472  request.send(JSON.stringify(submitInfo));
473
474  //setInnerHTML('debug', request.responseText);
475 
476  var response = JSON.parse(request.responseText);
477  if (response.status != 'ok')
478  {
479    setFatalError(response.message);
480    return false;
481  }
482 
483  var msg = '<ul>';
484  for (var i = 0; i < response.messages.length; i++)
485  {
486    msg += '<li>' + response.messages[i];
487  }
488  msg += '</ul>';
489  setInnerHTML('done', msg);
490  Main.show('done');
491  Main.show('gorestart');
492
493}
494
495
496function setInnerHTML(id, html)
497{
498  var tag = document.getElementById(id);
499  if (!tag) alert('No tag with id='+id);
500  tag.innerHTML = html;
501}
502
503function setInputStatus(prefix, message, clazz)
504{
505  var tag = document.getElementById(prefix + '.status');
506  tag.className = 'status ' + clazz;
507 
508  setInnerHTML(prefix + '.message', message);
509  if (message)
510  {
511    Main.showInline(prefix + '.message');
512  }
513  else
514  {
515    Main.hide(prefix + '.message');
516  }
517}
518
519function setFatalError(message)
520{
521  setInnerHTML('errorMessage', message);
522  Main.show('errorMessage');
523  Main.hide('gonext');
524  Main.hide('gocancel');
525  Main.show('gorestart');
526}
527
528function goRestart(force)
529{
530  if (!force && !confirm('Cancel this registration?')) return;
531  location.href = location.href;
532}
533</script>
534<style>
535
536.stepform
537{
538  margin-left: 20px;
539  border: 1px solid #999999;
540  width: 800px;
541  table-layout: fixed;
542}
543
544.stepno
545{
546  width: 20px;
547  font-size: 20px;
548  font-weight: bold;
549  color: #E0E0E0;
550  background: #555577;
551  vertical-align: top;
552  text-align: center;
553}
554
555.steptitle
556{
557  width: 780px;
558  color: #333377;
559  background: #E0E0E0;
560  font-weight: bold;
561  padding: 1px 4px 1px 4px;
562  border-bottom: 1px solid #999999;
563}
564
565.nextstep
566{
567  width: 780px;
568  color: #333377;
569  background: #E0E0E0;
570  font-weight: bold;
571  padding: 1px 4px 1px 4px;
572  border-top: 1px solid #999999;
573}
574
575.stepfields
576{
577  width: 780px;
578}
579
580.stepfields .prompt
581{
582  width: 150px;
583  font-weight: bold;
584  padding: 1px 2px 1px 2px;
585}
586
587.stepfields .input
588{
589  width: 250px;
590  padding: 1px 2px 1px 2px;
591}
592
593.stepfields .status
594{
595  width: 30px;
596  padding: 1px 2px 1px 2px;
597}
598
599.stepfields .help
600{
601  background: #e0e0e0;
602  width: 350px;
603  font-style: italic;
604  padding: 1px 2px 1px 2px;
605}
606
607.stepfields .message
608{
609  color: #cc0000;
610  font-weight: bold;
611  padding-right: 6px;
612}
613
614.status.invalid:before
615{
616  content: url('../../images/error.gif');
617}
618.status.warning:before
619{
620  content: url('../../images/warning.gif');
621}
622.status.valid:before
623{
624  content: url('../../images/ok.gif');
625}
626.success ul
627{
628  list-style-image: url('../../images/ok.gif');
629}
630</style>
631</base:head>
632<base:body onload="init()">
633
634  <p:path style="margin-top: 20px; margin-bottom: 10px;">
635    <p:pathelement title="Reggie" href="<%="index.jsp?ID="+ID%>" />
636    <p:pathelement title="Personal information registration" />
637  </p:path>
638
639  <%
640  if (sc.getActiveProjectId() == 0)
641  {
642    %>
643    <base:note type="warning" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
644      No project has been selected. You may proceed with the registration but
645      created items will not be shared.
646    </base:note>
647    <%
648  }
649  %>
650
651  <form name="reggie" onsubmit="return false;">
652 
653  <!-- 1. Case + Personal number -->
654  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
655  <tr>
656    <td rowspan="3" class="stepno">1</td>
657    <td class="steptitle">Enter Case Name and Personal Number</td>
658  </tr>
659  <tr>
660    <td class="stepfields">
661      <table border="0" cellspacing="0" cellpadding="0" width="100%">
662      <tr valign="top">
663        <td class="prompt">Case name</td>
664        <td class="input"><input type="text" name="caseName" 
665          size="18" maxlength="12" onblur="caseNameOnChange()" onkeypress="focusOnEnter(event, 'personalNumber')"></td>
666        <td class="status" id="case.status"></td>
667        <td class="help"><span id="case.message" class="message" style="display: none;"></span>The case (barcode) associated with this patient.</td>
668      </tr>
669      <tr>
670        <td class="prompt">Personal number</td>
671        <td class="input"><input type="text" name="personalNumber" 
672          size="18" maxlength="12" onkeyup="personalNumberOnChange()" onkeypress="goNextOnTabOrEnter(event)"></td>
673        <td class="status" id="pnr.status"></td>
674        <td class="help"><span id="pnr.message" class="message" style="display: none;"></span>(YYYYMMDDZZZZ)</td>
675      </tr>
676      </table>
677    </td>
678  </tr>
679  </table>
680
681  <!-- 2. New patient registration -->
682  <div id="newPatientSection" style="display: none;">
683  <p>
684  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
685  <tr>
686    <td rowspan="2" class="stepno">2</td>
687    <td class="steptitle">New patient: Enter all names</td>
688  </tr>
689  <tr>
690    <td class="stepfields">
691      <table border="0" cellspacing="0" cellpadding="0" width="100%">
692      <tr>
693        <td class="prompt">Patient code</td>
694        <td class="input"><input type="text" name="patientCode" 
695          value="" size="18" maxlength="12" 
696          onkeypress="focusOnEnter(event, 'familyName')"></td>
697        <td class="status" id="patientCode.status"></td>
698        <td class="help"><span id="patientCode.message" class="message" style="display: none;"></span></td>
699      </tr>
700      <tr valign="top">
701        <td class="prompt">Family name</td>
702        <td class="input"><input type="text" name="familyName" 
703          value="" size="35" maxlength="255"
704          onkeypress="focusOnEnter(event, 'allFirstNames')"></td>
705        <td class="status" id="familyName.status"></td>
706        <td class="help"><span id="familyName.message" class="message" style="display: none;"></span>Keep hyphens, keep åäö, replace all special accented letters [e.g. éèü etc] with standard alphabet character.</td>
707      </tr>
708      <tr valign="top">
709        <td class="prompt">All first names</td>
710        <td class="input"><input type="text" name="allFirstNames" 
711          size="35" maxlength="255" onkeypress="goNextOnTabOrEnter(event)"></td>
712        <td class="status" id="allFirstNames.status"></td>
713        <td class="help"><span id="allFirstNames.message" class="message" style="display: none;"></span>Type all names, see FamilyName comment on valid characters.</td>
714      </tr>
715      <tr>
716        <td class="prompt">Gender</td>
717        <td class="input" id="new.gender"></td>
718        <td class="status"></td>
719        <td class="help"></td>
720      </tr>
721      <tr>
722        <td class="prompt">Date of birth</td>
723        <td class="input" id="new.dateOfBirth"></td>
724        <td class="status"></td>
725        <td class="help"></td>
726      </tr>
727      </table>
728    </td>
729  </tr>
730  </table>
731  </div>
732 
733  <!-- 2b. Existing patient -->
734  <div id="existingPatientSection" style="display: none;">
735  <p>
736  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
737  <tr>
738    <td rowspan="2" class="stepno">2</td>
739    <td class="steptitle">Existing patient: Verify names</td>
740  </tr>
741  <tr>
742    <td class="stepfields">
743      <table border="0" cellspacing="0" cellpadding="0" width="100%">
744      <tr>
745        <td class="prompt">Patient code</td>
746        <td class="input" id="existing.patientCode"></td>
747        <td class="status"></td>
748        <td class="help"></td>
749      </tr>
750      <tr>
751        <td class="prompt">Family name</td>
752        <td class="input" id="existing.familyName"></td>
753        <td class="status"></td>
754        <td class="help"></td>
755      </tr>
756      <tr>
757        <td class="prompt">All first names</td>
758        <td class="input" id="existing.allFirstNames"></td>
759        <td class="status"></td>
760        <td class="help"></td>
761      </tr>
762      <tr>
763        <td class="prompt">Gender</td>
764        <td class="input" id="existing.gender"></td>
765        <td class="status"></td>
766        <td class="help"></td>
767      </tr>
768      <tr>
769        <td class="prompt">Date of birth</td>
770        <td class="input" id="existing.dateOfBirth"></td>
771        <td class="status"></td>
772        <td class="help"></td>
773      </tr>
774      </table>
775    </td>
776  </tr>
777  </table>
778  </div>
779
780
781  <!-- 3. Case registration -->
782  <div id="caseSection" style="display: none;">
783  <p>
784  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
785  <tr>
786    <td rowspan="2" class="stepno">3</td>
787    <td class="steptitle">About this case</td>
788  </tr>
789  <tr>
790    <td class="stepfields">
791      <table border="0" cellspacing="0" cellpadding="0" width="100%">
792      <tr valign="top">
793        <td class="prompt" id="laterality.prompt">Laterality</td>
794        <td class="input" id="laterality.input">
795          <input type="radio" name="laterality" value="LEFT" onclick="lateralityOnChange()">LEFT<br>
796          <input type="radio" name="laterality" value="RIGHT" onclick="lateralityOnChange()">RIGHT<br>
797          <input type="radio" name="laterality" value="" checked onclick="lateralityOnChange()"><i>unknown</i>
798        </td>
799        <td class="status" id="laterality.status"></td>
800        <td class="help"><span id="laterality.message" class="message" style="display: none;"></span></td>
801      </tr>
802      <tr valign="top">
803        <td class="prompt">Specimen tubes</td>
804        <td class="input" id="specimenTubes"><i>not found</i></td>
805        <td class="status" id="specimenTubes.status"></td>
806        <td class="help"><span id="specimenTubes.message" class="message" style="display: none;"></span>The specimen tube(s) associated with this case.</td>
807      </tr>
808      <tr id="padSection" valign="top">
809        <td class="prompt">PAD</td>
810        <td class="input"><input type="text" name="pad" 
811          value="" size="18" maxlength="12" 
812          onkeypress="focusOnEnter(event, 'reasonIfNoSpecimen')"
813          onblur="padOnChange()"></td>
814        <td class="status" id="pad.status"></td>
815        <td class="help"><span id="pad.message" class="message" style="display: none;"></span>PAD should be entered when no specimen tubes have been registered</td>
816      </tr>
817      <tr id="reasonIfNoSpecimenSection" valign="top">
818        <td class="prompt">Reason if no specimen</td>
819        <td class="input"><textarea rows="3" cols="30" name="reasonIfNoSpecimen" value=""></textarea></td>
820        <td class="status"></td>
821        <td class="help">Comment why there was no specimen tubes in the delivery.</td>
822      </tr>
823      </table>
824    </td>
825  </tr>
826  </table>
827  </div>
828
829  <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>
830
831  <div id="done" class="success" style="display: none; width: 800px; margin-left: 20px; margin-top: 20px;"></div>
832
833  <table style="margin-left: 20px; margin-top: 10px;">
834  <tr>
835    <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
836    <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext()"/></td>
837    <td><base:button id="gocreate" title="Create" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
838    <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
839  </tr>
840  </table>
841  </form>
842
843  <pre>
844  <div id="debug"></div>
845  </pre>
846 
847</base:body>
848</base:page>
849<%
850}
851finally
852{
853  if (dc != null) dc.close();
854}
855%>
Note: See TracBrowser for help on using the repository browser.