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

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

Removing debug flag.

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