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

Last change on this file since 1572 was 1572, checked in by Nicklas Nordborg, 10 years ago

Fixes #369: Update names for an existing patient

File size: 33.7 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.clients.web.extensions.ExtensionsControl"
11  import="net.sf.basedb.util.Values"
12%>
13<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
14<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
15<%
16final SessionControl sc = Base.getExistingSessionControl(request, true);
17final String ID = sc.getId();
18final float scale = Base.getScale(sc);
19final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
20DbControl dc = null;
21try
22{
23  dc = sc.newDbControl();
24  final User user = User.getById(dc, sc.getLoggedInUserId());
25%>
26<base:page type="default" >
27<base:head scripts="ajax.js" styles="path.css">
28  <link rel="stylesheet" type="text/css" href="css/reggie.css">
29  <%
30  if (Application.getMajorVersion() == 3 && Application.getMinorVersion() == 0)
31  {
32    %>
33    <link rel="stylesheet" type="text/css" href="css/base30.css">
34    <%
35  }
36  %>
37  <script language="JavaScript" src="reggie.js" type="text/javascript" charset="UTF-8"></script>
38 
39 
40<script language="JavaScript">
41
42var debug = false;
43var currentStep = 1;
44var pnrIsValid = false;
45var pnrIsAcceptable = false;
46var caseIsValid = false;
47var lateralityIsValid = false;
48var samplingDateIsValid = true;
49var rnaLaterDateIsValid = true;
50
51var patientInfo = null;
52var caseInfo = null;
53var bloodInfo = null;
54
55var copyConsentEnabled = false;
56
57function init()
58{
59  var frm = document.forms['reggie'];
60  frm.caseName.focus();
61}
62
63function step1IsValid()
64{
65  return pnrIsValid && caseIsValid;
66}
67
68function step1IsAcceptable()
69{
70  return pnrIsAcceptable && caseIsValid;
71}
72
73function step2IsValid()
74{
75  var formOk = true;
76  var frm = document.forms['reggie'];
77
78  // New patient only
79  if (!patientInfo.id)
80  {
81    // Validate 'New patient' form
82    if (frm.allFirstNames.value == '')
83    {
84      setInputStatus('allFirstNames', 'Missing', 'invalid');
85      frm.allFirstNames.focus();
86      formOk = false;
87    }
88    else
89    {
90      setInputStatus('allFirstNames', '', 'valid');
91    }
92   
93    if (frm.familyName.value == '')
94    {
95      setInputStatus('familyName', 'Missing', 'invalid');
96      frm.familyName.focus();
97      formOk = false;
98    }
99    else
100    {
101      setInputStatus('familyName', '', 'valid');
102    }
103
104    if (frm.patientCode.value == '')
105    {
106      setInputStatus('patientCode', 'Missing', 'invalid');
107      frm.patientCode.focus();
108      formOk = false;
109    }
110    else
111    {
112      setInputStatus('patientCode', '', 'valid');
113    }
114  }
115  else // existing patient
116  {
117    if (frm.existingAllFirstNames.value == '')
118    {
119      setInputStatus('existingAllFirstNames', 'Missing', 'invalid');
120      frm.existingAllFirstNames.focus();
121      formOk = false;
122    }
123    else
124    {
125      setInputStatus('existingAllFirstNames', '', 'valid');
126    }
127   
128    if (frm.existingFamilyName.value == '')
129    {
130      setInputStatus('existingFamilyName', 'Missing', 'invalid');
131      frm.existingFamilyName.focus();
132      formOk = false;
133    }
134    else
135    {
136      setInputStatus('existingFamilyName', '', 'valid');
137    }
138   
139  }
140  return formOk;
141}
142
143function step3IsValid()
144{
145  var isValid = lateralityIsValid;
146  if (caseInfo.specimen && caseInfo.specimen.length > 0)
147  {
148    isValid = isValid && samplingDateIsValid && rnaLaterDateIsValid;
149  }
150  return isValid;
151}
152
153function goNextAuto()
154{
155  goNext(false);
156}
157
158function goNext(manual)
159{
160  var frm = document.forms['reggie'];
161  setInnerHTML('gonext.message', '');
162  if (currentStep == 1)
163  {
164    if (step1IsValid())
165    {
166      gotoStep2();
167    }
168    else if (step1IsAcceptable())
169    {
170      if (manual)
171      {
172        gotoStep2();
173      }
174      else
175      {
176        frm.personalNumber.focus();
177        setInnerHTML('gonext.message', 'Personal number is non-standard. Click \'Next\' to continue registration.');
178      }
179    }
180  }
181  else if (currentStep == 2)
182  {
183    if (step2IsValid()) gotoStep3();
184  }
185}
186
187function caseNameOnChange()
188{
189  var frm = document.forms['reggie'];
190  var caseName = frm.caseName.value;
191  caseIsValid = false;
192  if (caseName == '')
193  {
194    setInputStatus('case', 'Missing', 'invalid');
195    frm.caseName.focus();
196    return;
197  }
198  if (!isValidCaseName(caseName))
199  {
200    setInputStatus('case', 'Only 7-digits name is allowed .', 'invalid');
201    frm.caseName.focus();
202    return;
203  }
204
205  setInputStatus('case', '', 'valid');
206  caseIsValid = true;
207 
208  getCaseInfo();
209}
210
211function personalNumberOnChange()
212{
213  var frm = document.forms['reggie'];
214  var pnr = frm.personalNumber.value;
215  pnrIsValid = false;
216  pnrIsAcceptable = true;
217 
218  var pnrLen = pnr.length;
219  if (pnrLen != 12 && pnrLen != 10)
220  {
221    setInputStatus('pnr', pnrLen < 12 ? 'Too short' : 'Too long', 'warning');
222    return;
223  }
224
225  if (!pnr.match(/^\d+$/))
226  {
227    setInputStatus('pnr', 'Non-standard personal number', 'warning');
228    return;
229  }
230 
231  var datePart = pnr.substring(0, pnrLen - 4); // Remove last four digits
232  var dateFormat = pnrLen == 10 ? 'yyMMdd' : 'yyyyMMdd';
233  var isValidDate = Dates.isDate(datePart, dateFormat);
234  if (!isValidDate)
235  {
236    var dayInMonth = parseInt(datePart.substring(-2)); // Last two characters
237    if (dayInMonth > 60)
238    {
239      // 'Samordningsnummer' has day-in-month + 60; check this
240      dayInMonth -= 60;
241      var tmpPnr = pnr.substring(0, pnrLen - 6); // First 4 or 6 digits is year+month
242      if (dayInMonth < 10) tmpPnr += '0';
243      tmpPnr += dayInMonth;
244      isValidDate = Dates.isDate(tmpPnr, dateFormat);
245    }
246  }
247  if (!isValidDate)
248  {
249    setInputStatus('pnr', 'Not a valid date', 'warning');
250    return;
251  }
252 
253  if (!personalNumberControlDigitCheck(pnr.substr(pnrLen == 10 ? 0 : 2)))
254  {
255    setInputStatus('pnr', 'Invalid control digit', 'warning');
256    return;
257  }
258
259  setInputStatus('pnr', '', 'valid');
260  pnrIsValid = true;
261}
262
263function lateralityOnChange()
264{
265  lateralityIsValid = false;
266  var updateMode = caseInfo.id;
267 
268  // Check selected laterality against specimen tubes
269  var frm = document.forms['reggie'];
270  var selectedLaterality = Forms.getCheckedRadio(frm.laterality);
271 
272  // No laterality/case selected
273  if (selectedLaterality == null) 
274  {
275    setInputStatus('laterality', 'Not selected', 'invalid');
276    return;
277  }
278 
279  var numCases = patientInfo.cases ? patientInfo.cases.length : 0;
280  setInputStatus('laterality', updateMode && numCases > 1 ? 'NOTE! Some alternatives may be missing if there is another case for the patient.' : '', 'valid');
281  lateralityIsValid = true;
282   
283  var laterality = selectedLaterality.value;
284  if (laterality.match(/\d+/))
285  {
286    // It is the ID of an existing case
287    for (var i = 0; i < patientInfo.cases.length; i++)
288    {
289      var cse = patientInfo.cases[i];
290      if (cse.id == laterality)
291      {
292        laterality = cse.laterality;
293        break;
294      }
295    }
296  }
297  else if (laterality == '') 
298  {
299    laterality = null;
300  }
301 
302  // If the selected laterality/case is not the same as the other case with consent enable the copy consent option
303  Main.showHide('copyConsentSection', copyConsentEnabled && selectedLaterality.value != frm.copyConsent.value);
304   
305  // No specimen tubes?
306  if (!caseInfo.specimen || caseInfo.specimen.length == 0) return;
307 
308  for (var i = 0; i < caseInfo.specimen.length; i++)
309  {
310    var specimen = caseInfo.specimen[i];
311    if (specimen.laterality != laterality)
312    {
313      if (specimen.laterality == null || updateMode)
314      {
315        setInputStatus('laterality', 'Specimen tubes are updated to: ' + laterality, 'valid')
316      }
317      else
318      {
319        setInputStatus('laterality', 'Not same laterality as specimen tubes', 'warning');
320      }
321      return;
322    }
323  }
324 
325}
326
327function padOnChange()
328{
329  var frm = document.forms['reggie'];
330  var PAD = frm.pad.value;
331  if (PAD == '')
332  {
333    setInputStatus('pad', 'Missing', 'warning');
334    return;
335  }
336  frm.pad.value = PAD.replace(/\+/, '-');
337  setInputStatus('pad', '', 'valid');
338}
339
340function samplingDateTimeOnChange()
341{
342  var frm = document.forms['reggie'];
343  samplingDateIsValid = false;
344  setInputStatus('samplingDate', '', '');
345 
346  var samplingDate = frm.samplingDate.value;
347  var samplingTime = frm.samplingTime.value;
348 
349  if (samplingDate != '' || samplingTime != '')
350  {
351    // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
352    samplingDate = autoFillDate(samplingDate);
353    frm.samplingDate.value = samplingDate;
354
355    samplingTime = autoFillTime(samplingTime);
356    frm.samplingTime.value = samplingTime;
357   
358    if (!Dates.isDate(samplingDate, 'yyyyMMdd'))
359    {
360      setInputStatus('samplingDate', 'Not a valid date', 'invalid');
361      return;
362    }
363    if (frm.rnaLaterDate.value == '') frm.rnaLaterDate.value = samplingDate;
364   
365    if (!Dates.isDate(samplingDate + ' ' + samplingTime, 'yyyyMMdd HHmm'))
366    {
367      if (samplingDate != '') setInputStatus('samplingDate', 'Not a valid time', 'invalid');
368      return;
369    }
370    setInputStatus('samplingDate', '', 'valid');
371  }
372  samplingDateIsValid = true;
373}
374
375function rnaLaterDateTimeOnChange()
376{
377  var frm = document.forms['reggie'];
378  rnaLaterDateIsValid = false;
379  setInputStatus('rnaLaterDate', '', '');
380 
381  var rnaLaterDate = frm.rnaLaterDate.value;
382  var rnaLaterTime = frm.rnaLaterTime.value;
383  var rnaLaterTimestamp;
384 
385  if (rnaLaterDate != '' || rnaLaterTime != '')
386  {
387    // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
388    rnaLaterDate = autoFillDate(rnaLaterDate);
389    frm.rnaLaterDate.value = rnaLaterDate;
390
391    rnaLaterTime = autoFillTime(rnaLaterTime);
392    frm.rnaLaterTime.value = rnaLaterTime;
393   
394    if (!Dates.isDate(rnaLaterDate, 'yyyyMMdd'))
395    {
396      setInputStatus('rnaLaterDate', 'Not a valid date', 'invalid');
397      return;
398    }
399    rnaLaterTimestamp = Dates.parseString(rnaLaterDate + ' ' + rnaLaterTime, 'yyyyMMdd HHmm');
400    if (rnaLaterTimestamp == null)
401    {
402      if (rnaLaterDate != '') setInputStatus('rnaLaterDate', 'Not a valid time', 'invalid');
403      return;
404    }
405    setInputStatus('rnaLaterDate', '', 'valid');
406  }
407 
408  rnaLaterDateIsValid = true;
409
410  if (samplingDateIsValid && rnaLaterTimestamp)
411  {
412    var samplingTimestamp = Dates.parseString(frm.samplingDate.value + ' ' + frm.samplingTime.value, 'yyyyMMdd Hmm');
413    if (samplingTimestamp && rnaLaterTimestamp.getDate() != samplingTimestamp.getDate())
414    {
415      setInputStatus('rnaLaterDate', 'Sampling and RNA later dates are different', 'warning');
416    }
417  }
418}
419
420function getCaseInfo()
421{
422  // Check entered case and pnr with AJAX
423  var frm = document.forms['reggie'];
424  var caseName = frm.caseName.value;
425  var request = Ajax.getXmlHttpRequest();
426  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=GetCaseInfo';
427  url += '&caseName=' + caseName;
428  request.open("GET", url, false);
429  request.send(null);
430 
431  if (debug) Main.debug(request.responseText);
432
433  var response = JSON.parse(request.responseText);
434  if (response.status != 'ok')
435  {
436    setFatalError(response.message);
437    return false;
438  }
439 
440  // Get biosource information from the AJAX response
441  caseInfo = response.caseInfo;
442  bloodInfo = response.bloodInfo;
443 
444  if (caseInfo && caseInfo.patient)
445  {
446    frm.personalNumber.value = caseInfo.patient.personalNumber;
447    gotoStep2();
448  }
449  else if (bloodInfo && bloodInfo.patient)
450  {
451    frm.personalNumber.value = bloodInfo.patient.personalNumber;
452    gotoStep2();
453  }
454}
455
456function gotoStep2()
457{
458  // Check entered case and pnr with AJAX
459  var frm = document.forms['reggie'];
460  frm.caseName.disabled = true;
461  frm.personalNumber.disabled = true;
462  currentStep = 2;
463 
464  var pnr = frm.personalNumber.value;
465  if (pnr.length == 10 && pnrIsValid) 
466  {
467    var year = fullYear(parseInt(pnr.substr(0, 2)));
468    pnr = year + pnr.substr(2);
469  }
470  var request = Ajax.getXmlHttpRequest();
471  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=GetPatientInfo';
472  url += '&personalNumber=' + pnr;
473  url += '&pnrIsValid=' + pnrIsValid;
474  request.open("GET", url, false);
475  request.send(null);
476 
477  if (debug) Main.debug(request.responseText);
478 
479  var response = JSON.parse(request.responseText);
480  if (response.status != 'ok')
481  {
482    setFatalError(response.message);
483    return false;
484  }
485 
486  // Get patient information from the AJAX response
487  patientInfo = response.patientInfo;
488
489  Main.show('gocancel');
490 
491  if (!patientInfo.id)
492  {
493    Main.show('newPatientSection');
494    frm.patientCode.value=patientInfo.name;
495    setInnerHTML('new.dateOfBirth', patientInfo.dateOfBirth ? patientInfo.dateOfBirth : "---");
496    setInnerHTML('new.gender', patientInfo.gender ? patientInfo.gender : "---");
497    frm.familyName.focus();
498    if (!pnrIsValid)
499    {
500      setInputStatus('gender', 'Gender and DateOfBirth can\'t be automatically generated for non-standard Personal number', 'warning');
501    }
502  }
503  else
504  {
505    Main.show('existingPatientSection');
506    setInnerHTML('existing.patientCode', patientInfo.name);
507    frm.existingFamilyName.value = patientInfo.familyName;
508    frm.existingAllFirstNames.value = patientInfo.allFirstNames;
509    if (patientInfo.dateOfBirth) setInnerHTML('existing.dateOfBirth', patientInfo.dateOfBirth);
510    if (patientInfo.gender) setInnerHTML('existing.gender', patientInfo.gender);
511    frm.existingFamilyName.focus();
512  }
513}
514
515function gotoStep3()
516{
517  // Check entered case and pnr with AJAX
518  var frm = document.forms['reggie'];
519 
520  if (!patientInfo.id) // new patient
521  {
522    frm.patientCode.disabled = true;
523    frm.familyName.disabled = true;
524    frm.allFirstNames.disabled = true;
525    patientInfo.familyName = frm.familyName.value;
526    patientInfo.allFirstNames = frm.allFirstNames.value;
527  }
528  else // existing patient
529  {
530    frm.existingFamilyName.disabled = true;
531    frm.existingAllFirstNames.disabled = true;
532    patientInfo.familyName = frm.existingFamilyName.value;
533    patientInfo.allFirstNames = frm.existingAllFirstNames.value;
534  }
535  currentStep = 3;
536 
537  var updateMode = caseInfo.id && caseInfo.patient;
538 
539  // Generate list of specimen tubes
540  var hasLeftSpecimen = false;
541  var hasRightSpecimen = false;
542  var hasUnknownSpecimen = false;
543  var thisCaseLaterality = caseInfo.laterality;
544  var hasSpecimen = caseInfo.specimen && caseInfo.specimen.length > 0;
545  var thisCasePAD = null;
546  var hasPAD = false;
547  var thisCaseSamplingDate = null;
548  var thisCaseRNALaterDate = null;
549 
550  if (hasSpecimen)
551  {
552    var specimenTubes = '';
553    Main.hide('reasonIfNoSpecimenSection');
554    for (var i = 0; i < caseInfo.specimen.length; i++)
555    {
556      var specimen = caseInfo.specimen[i];
557      specimenTubes += specimen.name;
558      if (specimen.pad && !hasPAD) 
559      {
560        hasPAD = true;
561        thisCasePAD = specimen.pad;
562      }
563      if (specimen.samplingDate && !thisCaseSamplingDate) 
564      {
565        thisCaseSamplingDate = specimen.samplingDate;
566      }
567      if (specimen.rnaLaterDate && !thisCaseRNALaterDate) 
568      {
569        thisCaseRNALaterDate = specimen.rnaLaterDate;
570      }
571      if (specimen.laterality) 
572      {
573        specimenTubes += ' ('+specimen.laterality + ')';
574        Forms.checkRadio(frm.laterality, specimen.laterality);
575        if (specimen.laterality == 'LEFT') hasLeftSpecimen = true;
576        if (specimen.laterality == 'RIGHT') hasRightSpecimen = true;
577        if (!thisCaseLaterality) thisCaseLaterality = specimen.laterality;
578      }
579      else
580      {
581        hasUnknownSpecimen = true;
582        specimenTubes += ' (<i>unknown laterality</i>)';
583      }
584      specimenTubes += '<br>';
585    }
586    setInnerHTML('specimenTubes', specimenTubes);
587   
588    // Check that all specimen tubes have the same laterality
589    var numLateralities = 0;
590    if (hasLeftSpecimen) numLateralities++;
591    if (hasRightSpecimen) numLateralities++;
592    if (hasUnknownSpecimen) numLateralities++;
593    if (numLateralities > 1)
594    {
595      setInputStatus('specimenTubes', 'Specimen tubes with different laterality', 'warning');
596      thisCaseLaterality = null;
597    }
598
599    // Show and populate 'Sampling date' and 'RNA Later date' fields
600    Main.show('samplingDateSection');
601    Main.show('rnaLaterDateSection');
602    if (thisCaseSamplingDate != null)
603    {
604      frm.samplingDate.value = thisCaseSamplingDate.substring(0, 8);
605      frm.samplingTime.value = thisCaseSamplingDate.substring(9, 13);
606      samplingDateTimeOnChange();
607    }
608    if (thisCaseRNALaterDate != null)
609    {
610      frm.rnaLaterDate.value = thisCaseRNALaterDate.substring(0, 8);
611      frm.rnaLaterTime.value = thisCaseRNALaterDate.substring(9, 13);
612      rnaLaterDateTimeOnChange();
613    }
614  }
615  else
616  {
617    // No specimen tubes... if there is only one PAD on the case... use that
618    if (caseInfo.pad && caseInfo.pad.length == 1)
619    {
620      hasPAD = true;
621      thisCasePAD = caseInfo.pad[0];
622    }
623   
624    // Hide 'Sampling date' and 'RNA Later date' fields
625    Main.hide('samplingDateSection');
626    Main.hide('rnaLaterDateSection');
627  }
628
629  frm.pad.value = thisCasePAD;
630  caseInfo.oldPad = thisCasePAD;
631  //Main.showHide('padSection', !hasPAD || updateMode);
632 
633 
634 
635  if (updateMode && !hasSpecimen)
636  {
637    // Try to find 'reasonIfNoSpecimen' annotation on the case
638    for (var i = 0; i < caseInfo.reasonIfNoSpecimen.length; i++)
639    {
640      var rns = caseInfo.reasonIfNoSpecimen[i];
641      if (rns.indexOf('['+caseInfo.originalName+']') == 0)
642      {
643        caseInfo.oldReasonIfNoSpecimen = rns;
644        frm.reasonIfNoSpecimen.value = rns.substring(rns.indexOf(']')+2);
645        i = 999;
646      }
647    }
648  }
649 
650  Main.show('caseSection');
651 
652  // Existing cases for this patient
653  var hasLeftCase = false;
654  var hasRightCase = false;
655  var hasUnknownCase = false;
656  if (patientInfo.cases && patientInfo.cases.length > 0)
657  {
658    var cases = '';
659    for (var i = 0; i < patientInfo.cases.length; i++)
660    {
661      var cc = patientInfo.cases[i];
662      if (cc.laterality == 'LEFT') 
663      {
664        if (hasLeftCase && !updateMode) setInputStatus('laterality', 'Two cases with laterality=LEFT', 'warning');
665        hasLeftCase = true;
666      }
667      else if (cc.laterality == 'RIGHT') 
668      {
669        if (hasRightCase && !updateMode) setInputStatus('laterality', 'Two cases with laterality=RIGHT', 'warning');
670        hasRightCase = true;
671      }
672      else
673      {
674        hasUnknownCase = true; 
675      }
676      if (!updateMode || cc.id == caseInfo.id)
677      {
678        cases += '<input type="radio" name="laterality" value="' + cc.id + '" id="laterality'+cc.id+'"';
679        if (cc.laterality == thisCaseLaterality) cases += ' checked';
680        cases += ' onclick="lateralityOnChange()"><label for="laterality' + cc.id + '">';
681        if (cc.laterality)
682        {
683          cases += cc.laterality;
684        }
685        else
686        {
687          cases += '<i>unknown laterality</i>';
688        }
689        if (!updateMode)
690        {
691          cases += ' [merge with ' + cc.name + ']';
692        }
693        cases += '</label><br>';
694      }
695    }
696   
697    if (patientInfo.cases.length == 1 || updateMode)
698    {
699      if (!hasLeftCase)
700      {
701        cases += '<input type="radio" name="laterality" value="LEFT" id="lateralityLeft"';
702        if (thisCaseLaterality == 'LEFT') cases += ' checked';
703        cases += ' onclick="lateralityOnChange()"><label for="lateralityLeft">LEFT';
704        if (!updateMode) cases += ' [<i>new case</i>]</label>';
705        cases += '<br>';
706      }
707      if (!hasRightCase)
708      {
709        cases += '<input type="radio" name="laterality" value="RIGHT" id="lateralityRight"';
710        if (thisCaseLaterality == 'RIGHT') cases += ' checked';
711        cases += ' onclick="lateralityOnChange()"><label for="lateralityRight">RIGHT';
712        if (!updateMode) cases += ' [<i>new case</i>]</label>';
713        cases += '<br>';
714      }
715      if (!updateMode && !hasLeftCase && !hasRightCase)
716      {
717        cases += '<input type="radio" name="laterality" value="" id="lateralityUnknown"';
718        if (thisCaseLaterality == null) cases += ' checked';
719        cases += ' onclick="lateralityOnChange()"><label for="lateralityUnknown"><i>unknown laterality</i> [<i>new case</i>]</label><br>';
720      }
721     
722      if (!updateMode && patientInfo.cases[0].consent)
723      {
724        var c = patientInfo.cases[0];
725        var html = "From case '" + c.name;
726        html += "' (" + c.consent;
727        if (c.consentDate) html += '; ' + c.consentDate;
728        html += ')';
729        setInnerHTML('copyConsent.text', html);
730        frm.copyConsent.value = patientInfo.cases[0].id;
731        copyConsentEnabled = true;
732      }
733     
734    }
735   
736    if (updateMode)
737    {
738      if (caseInfo.merged)
739      {
740        setInnerHTML('step3.title', 'Update case \''+caseInfo.originalName+'\' (which is merged with case \'' + caseInfo.name + '\')');
741      }
742      else
743      {
744        setInnerHTML('step3.title', 'Update case \''+caseInfo.name+'\'');
745      }
746     
747    }
748    else if (patientInfo.cases.length == 2)
749    {
750      setInnerHTML('step3.title', 'Merge with existing case'); 
751    }
752    else if (patientInfo.cases.length > 0)
753    {
754      setInnerHTML('step3.title', 'Create new case or merge with existing case');
755    }
756   
757    setInnerHTML('laterality.input', cases);
758  }
759 
760  // Check the blood registration for consent information
761  if (!copyConsentEnabled && bloodInfo && bloodInfo.consent)
762  {
763    var html = "From blood '" + bloodInfo.name;
764    html += "' (" + bloodInfo.consent;
765    if (bloodInfo.consentDate) html += '; ' + bloodInfo.consentDate;
766    html += ')';
767    setInnerHTML('copyConsent.text', html);
768    frm.copyConsent.value = bloodInfo.id;
769    copyConsentEnabled = true;
770  }
771
772 
773  lateralityOnChange();
774
775  Main.hide('gonext');
776  if (updateMode)
777  {
778    Main.show('goupdate');
779  }
780  else
781  {
782    Main.show('gocreate');
783  }
784 
785  if (lateralityIsValid) frm.pad.focus();
786}
787
788function goCreate()
789{
790  if (!step3IsValid()) return;
791 
792  Main.hide('gocreate');
793  Main.hide('gocancel');
794  Main.hide('goupdate');
795  var frm = document.forms['reggie'];
796
797  caseInfo.laterality = Forms.getCheckedRadio(frm.laterality).value;
798  caseInfo.reasonIfNoSpecimen = frm.reasonIfNoSpecimen.value;
799  caseInfo.pad = frm.pad.value;
800  caseInfo.samplingDate = Main.trimString(frm.samplingDate.value + ' ' + frm.samplingTime.value);
801  caseInfo.rnaLaterDate = Main.trimString(frm.rnaLaterDate.value + ' ' + frm.rnaLaterTime.value);
802  if (frm.copyConsent.checked && frm.copyConsent.value)
803  {
804    caseInfo.copyConsent = parseInt(frm.copyConsent.value);
805  }
806
807  for (var i = 0; i < frm.laterality.length; i++)
808  {
809    frm.laterality[i].disabled = true;
810  }
811  frm.reasonIfNoSpecimen.disabled = true;
812  frm.pad.disabled = true;
813  frm.samplingDate.disabled = true;
814  frm.samplingTime.disabled = true;
815  frm.rnaLaterDate.disabled = true;
816  frm.rnaLaterTime.disabled = true;
817  frm.copyConsent.disabled = true;
818
819  var updateMode = caseInfo.id && caseInfo.patient;
820  var submitInfo = new Object();
821  submitInfo.patientInfo = patientInfo;
822  submitInfo.caseInfo = caseInfo;
823
824  if (debug) Main.debug(JSON.stringify(submitInfo));
825 
826  var request = Ajax.getXmlHttpRequest();
827  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=';
828  url += updateMode ? 'UpdateCase' : 'CreateCase';
829  request.open("POST", url, false);
830  request.setRequestHeader("Content-Type", "application/json");
831  request.send(JSON.stringify(submitInfo));
832
833  if (debug) Main.debug(request.responseText);
834
835  var response = JSON.parse(request.responseText);
836  if (response.status != 'ok')
837  {
838    setFatalError(response.message);
839    return false;
840  }
841 
842  var msg = '<ul>';
843  for (var i = 0; i < response.messages.length; i++)
844  {
845    msg += '<li>' + response.messages[i];
846  }
847  msg += '</ul>';
848  setInnerHTML('done', msg);
849  Main.show('done');
850  Main.show('gorestart');
851
852}
853</script>
854
855</base:head>
856<base:body onload="init()">
857
858  <p:path><p:pathelement
859    title="Reggie" href="<%="index.jsp?ID="+ID%>" 
860    /><p:pathelement title="Personal information registration" 
861    /></p:path>
862
863  <div class="content">
864  <%
865  if (sc.getActiveProjectId() == 0)
866  {
867    %>
868    <div class="messagecontainer note" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
869      No project has been selected. You may proceed with the registration but
870      created items will not be shared.
871    </div>
872    <%
873  }
874  %>
875
876  <form name="reggie" onsubmit="return false;">
877 
878  <!-- 1. Case + Personal number -->
879  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
880  <tr>
881    <td rowspan="3" class="stepno">1</td>
882    <td class="steptitle">Enter Case Name and Personal Number</td>
883  </tr>
884  <tr>
885    <td class="stepfields">
886      <table border="0" cellspacing="0" cellpadding="0" width="100%">
887      <tr valign="top">
888        <td class="prompt">Case name</td>
889        <td class="input"><input type="text" name="caseName" 
890          size="18" maxlength="12" onblur="caseNameOnChange()" onkeypress="focusOnEnter(event, 'personalNumber')"></td>
891        <td class="status" id="case.status"></td>
892        <td class="help"><span id="case.message" class="message" style="display: none;"></span>The case (barcode) associated with this patient.</td>
893      </tr>
894      <tr>
895        <td class="prompt">Personal number</td>
896        <td class="input"><input type="text" name="personalNumber" 
897          size="18" maxlength="12" onkeyup="personalNumberOnChange()" onkeypress="doOnTabOrEnter(event, goNextAuto)"></td>
898        <td class="status" id="pnr.status"></td>
899        <td class="help"><span id="pnr.message" class="message" style="display: none;"></span>([YY]YYMMDDZZZZ)</td>
900      </tr>
901      </table>
902    </td>
903  </tr>
904  </table>
905
906  <!-- 2. New patient registration -->
907  <div id="newPatientSection" style="display: none;">
908  <p>
909  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
910  <tr>
911    <td rowspan="2" class="stepno">2</td>
912    <td class="steptitle">New patient: Enter all names</td>
913  </tr>
914  <tr>
915    <td class="stepfields">
916      <table border="0" cellspacing="0" cellpadding="0" width="100%">
917      <tr>
918        <td class="prompt">Patient code</td>
919        <td class="input"><input type="text" name="patientCode" 
920          value="" size="18" maxlength="12" 
921          onkeypress="focusOnEnter(event, 'familyName')"></td>
922        <td class="status" id="patientCode.status"></td>
923        <td class="help"><span id="patientCode.message" class="message" style="display: none;"></span></td>
924      </tr>
925      <tr valign="top">
926        <td class="prompt">Family name</td>
927        <td class="input"><input type="text" name="familyName" 
928          value="" size="35" maxlength="255"
929          onkeypress="focusOnEnter(event, 'allFirstNames')"></td>
930        <td class="status" id="familyName.status"></td>
931        <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>
932      </tr>
933      <tr valign="top">
934        <td class="prompt">All first names</td>
935        <td class="input"><input type="text" name="allFirstNames" 
936          size="35" maxlength="255" onkeypress="doOnTabOrEnter(event, goNextAuto)"></td>
937        <td class="status" id="allFirstNames.status"></td>
938        <td class="help"><span id="allFirstNames.message" class="message" style="display: none;"></span>Type all names, see FamilyName comment on valid characters.</td>
939      </tr>
940      <tr>
941        <td class="prompt">Gender</td>
942        <td class="input" id="new.gender"></td>
943        <td class="status" id="gender.status" rowspan="2"></td>
944        <td class="help" rowspan="2"><span id="gender.message" class="message" style="display:none;"></span></td>
945      </tr>
946      <tr>
947        <td class="prompt">Date of birth</td>
948        <td class="input" id="new.dateOfBirth"></td>
949      </tr>
950      </table>
951    </td>
952  </tr>
953  </table>
954  </div>
955 
956  <!-- 2b. Existing patient -->
957  <div id="existingPatientSection" style="display: none;">
958  <p>
959  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
960  <tr>
961    <td rowspan="2" class="stepno">2</td>
962    <td class="steptitle">Existing patient: Verify names</td>
963  </tr>
964  <tr>
965    <td class="stepfields">
966      <table border="0" cellspacing="0" cellpadding="0" width="100%">
967      <tr>
968        <td class="prompt">Patient code</td>
969        <td class="input" id="existing.patientCode"></td>
970        <td class="status"></td>
971        <td class="help"></td>
972      </tr>
973      <tr valign="top">
974        <td class="prompt">Family name</td>
975        <td class="input"><input type="text" name="existingFamilyName" 
976          value="" size="35" maxlength="255"
977          onkeypress="focusOnEnter(event, 'existingAllFirstNames')"></td>
978        <td class="status" id="existingFamilyName.status"></td>
979        <td class="help"><span id="existingFamilyName.message" class="message" style="display: none;"></span>Keep hyphens, keep åäö, replace all special accented letters [e.g. éèü etc] with standard alphabet character.</td>
980      </tr>
981      <tr valign="top">
982        <td class="prompt">All first names</td>
983        <td class="input"><input type="text" name="existingAllFirstNames" 
984          size="35" maxlength="255" onkeypress="doOnTabOrEnter(event, goNextAuto)"></td>
985        <td class="status" id="existingAllFirstNames.status"></td>
986        <td class="help"><span id="existingAllFirstNames.message" class="message" style="display: none;"></span>Type all names, see FamilyName comment on valid characters.</td>
987      </tr>
988      <tr>
989        <td class="prompt">Gender</td>
990        <td class="input" id="existing.gender"></td>
991        <td class="status"></td>
992        <td class="help"></td>
993      </tr>
994      <tr>
995        <td class="prompt">Date of birth</td>
996        <td class="input" id="existing.dateOfBirth"></td>
997        <td class="status"></td>
998        <td class="help"></td>
999      </tr>
1000      </table>
1001    </td>
1002  </tr>
1003  </table>
1004  </div>
1005
1006
1007  <!-- 3. Case registration -->
1008  <div id="caseSection" style="display: none;">
1009  <p>
1010  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1011  <tr>
1012    <td rowspan="2" class="stepno">3</td>
1013    <td class="steptitle" id="step3.title">Create new case</td>
1014  </tr>
1015  <tr>
1016    <td class="stepfields">
1017      <table border="0" cellspacing="0" cellpadding="0" width="100%">
1018      <tr valign="top">
1019        <td class="prompt" id="laterality.prompt">Laterality</td>
1020        <td class="input" id="laterality.input">
1021          <input type="radio" name="laterality" value="LEFT" id="lateralityLeft" onclick="lateralityOnChange()"><label for="lateralityLeft">LEFT</label><br>
1022          <input type="radio" name="laterality" value="RIGHT" id="lateralityRight" onclick="lateralityOnChange()"><label for="lateralityRight">RIGHT</label><br>
1023          <input type="radio" name="laterality" value="" checked id="lateralityUnknown" onclick="lateralityOnChange()"><i><label for="lateralityUnknown">unknown</label></i>
1024        </td>
1025        <td class="status" id="laterality.status"></td>
1026        <td class="help"><span id="laterality.message" class="message" style="display: none;"></span></td>
1027      </tr>
1028      <tr id="copyConsentSection" style="display: none;">
1029        <td class="prompt">Copy consent?</td>
1030        <td class="input">
1031          <input type="checkbox" name="copyConsent" id="copyConsent" value="" checked>
1032          <label for="copyConsent"><span id="copyConsent.text"></span></label>
1033        </td>
1034        <td class="status" id="copyConsent.status"></td>
1035        <td class="help"></td>
1036      </tr>
1037      <tr id="padSection" valign="top">
1038        <td class="prompt">PAD</td>
1039        <td class="input"><input type="text" name="pad" 
1040          value="" size="18" maxlength="12" 
1041          onkeypress="focusOnEnter(event, caseInfo.specimen && caseInfo.specimen.length > 0 ? 'samplingDate' : 'reasonIfNoSpecimen')"
1042          onblur="padOnChange()"></td>
1043        <td class="status" id="pad.status"></td>
1044        <td class="help"><span id="pad.message" class="message" style="display: none;"></span></td>
1045      </tr>
1046      <tr valign="top">
1047        <td class="prompt">Specimen tubes</td>
1048        <td class="input" id="specimenTubes"><i>not found</i></td>
1049        <td class="status" id="specimenTubes.status"></td>
1050        <td class="help"><span id="specimenTubes.message" class="message" style="display: none;"></span>The specimen tube(s) associated with this case.</td>
1051      </tr>
1052      <tr id="samplingDateSection" valign="top">
1053        <td class="subprompt">Sampling date</td>
1054        <td class="input"><input type="text" name="samplingDate" value="" size="12" maxlength="10" 
1055            onkeypress="focusOnEnter(event, 'samplingTime')" onblur="samplingDateTimeOnChange()">
1056          Time <input type="text" name="samplingTime" value="" size="6" maxlength="5" 
1057            onkeypress="focusOnEnter(event, 'rnaLaterDate')" onblur="samplingDateTimeOnChange()"></td>
1058        <td class="status" id="samplingDate.status"></td>
1059        <td class="help"><span id="samplingDate.message" class="message" style="display: none;"></span>Date+time of surgical removal (YYYYMMDD, HHMM)</td>
1060      </tr>
1061      <tr id="rnaLaterDateSection" valign="top">
1062        <td class="subprompt">RNA Later date</td>
1063        <td class="input"><input type="text" name="rnaLaterDate" value="" size="12" maxlength="10"
1064            onkeypress="focusOnEnter(event, 'rnaLaterTime')" onblur="rnaLaterDateTimeOnChange()">
1065          Time <input type="text" name="rnaLaterTime" value="" size="6" maxlength="5"
1066            onblur="rnaLaterDateTimeOnChange()"></td>
1067        <td class="status" id="rnaLaterDate.status"></td>
1068        <td class="help"><span id="rnaLaterDate.message" class="message" style="display: none;"></span>Date+time of pathology handling (YYYYMMDD, HHMM)</td>
1069      </tr>
1070      <tr id="reasonIfNoSpecimenSection" valign="top">
1071        <td class="subprompt">Reason if no specimen</td>
1072        <td class="input"><textarea rows="3" cols="30" name="reasonIfNoSpecimen" value=""></textarea></td>
1073        <td class="status"></td>
1074        <td class="help">Comment why there was no specimen tubes in the delivery.</td>
1075      </tr>
1076      </table>
1077    </td>
1078  </tr>
1079  </table>
1080  </div>
1081
1082  <div class="messagecontainer error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>
1083
1084  <div id="done" class="success" style="display: none; width: 800px; margin-left: 20px; margin-top: 20px;"></div>
1085
1086  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
1087  <tr>
1088    <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
1089    <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)"/></td>
1090    <td><base:button id="gocreate" title="Create" image="<%=home+"/images/gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>
1091    <td><base:button id="goupdate" title="Update" image="<%=home+"/images/gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>
1092    <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
1093    <td id="gonext.message" class="message"></td>
1094  </tr>
1095  </table>
1096  </form>
1097  </div>
1098 
1099</base:body>
1100</base:page>
1101<%
1102}
1103finally
1104{
1105  if (dc != null) dc.close();
1106}
1107%>
Note: See TracBrowser for help on using the repository browser.