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

Last change on this file since 1485 was 1367, checked in by Nicklas Nordborg, 11 years ago

Fixes #323: Cannot save "Personal information registration" form if no "Sampling date" or "RNA Later date" is entered

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