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

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

References #354: Changes related to new GUI in BASE 3.1

This should fix most of the issues related to the GUI differences between BASE 3.0 and 3.1. Reggie should display just fine in both versions. This is solved by:

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