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

Last change on this file since 1326 was 1326, checked in by Nicklas Nordborg, 12 years ago

References #302: Update functionality in the Personal information registration

Restructured the code which should make it easier to keep track of related reggie items (patient/case/specimen tube). It is also easier to make sure that JSON representations are consistent if more functions are needed in the future.

The wizard now recognises 3 variants of existing cases:

  1. Match by exact name
  2. Match by name of specimen tubes that have been merged with a different case
  3. Match by [prefix] of ResonIfNoSpecimen? comment for a merged case without specimen tubes.

If an existing case is found, the wizard loads patient information, etc. and proceeds immediately to step 3 in "Update mode". Currently, only the laterality value can be updated. PAD, the various timestamps, comments, etc. are not yet supported.

Hopefully this has been done without breaking any of the functions for registering a new case...

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