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

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

Fixes #418: Dates are not parsed correctly by the sample report generator

Hope this doesn't break some other wizard...

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