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

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

Fixes #300: Allow non-standard personal numbers

This should now handle the 3 cases mentioned in comment 3.

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