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

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

Fixes #308: Move common style definitions and javascript functions to separate files

File size: 28.8 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 = false;
39var rnaLaterDateIsValid = false;
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    if (!Dates.isDate(samplingDate, 'yyyy-MM-dd'))
307    {
308      setInputStatus('samplingDate', 'Not a valid date', 'invalid');
309      return;
310    }
311    if (frm.rnaLaterDate.value == '') frm.rnaLaterDate.value = samplingDate;
312   
313    if (!Dates.isDate(samplingDate + ' ' + samplingTime, 'yyyy-MM-dd HH:mm'))
314    {
315      if (samplingDate != '') setInputStatus('samplingDate', 'Not a valid time', 'invalid');
316      return;
317    }
318    setInputStatus('samplingDate', '', 'valid');
319  }
320  samplingDateIsValid = true;
321}
322
323function rnaLaterDateTimeOnChange()
324{
325  var frm = document.forms['reggie'];
326  rnaLaterDateIsValid = false;
327  setInputStatus('rnaLaterDate', '', '');
328 
329  var rnaLaterDate = frm.rnaLaterDate.value;
330  var rnaLaterTime = frm.rnaLaterTime.value;
331  var rnaLaterTimestamp;
332 
333  if (rnaLaterDate != '' || rnaLaterTime != '')
334  {
335    if (!Dates.isDate(rnaLaterDate, 'yyyy-MM-dd'))
336    {
337      setInputStatus('rnaLaterDate', 'Not a valid date', 'invalid');
338      return;
339    }
340    rnaLaterTimestamp = Dates.parseString(rnaLaterDate + ' ' + rnaLaterTime, 'yyyy-MM-dd HH:mm');
341    if (rnaLaterTimestamp == null)
342    {
343      if (rnaLaterDate != '') setInputStatus('rnaLaterDate', 'Not a valid time', 'invalid');
344      return;
345    }
346    setInputStatus('rnaLaterDate', '', 'valid');
347  }
348 
349  rnaLaterDateIsValid = true;
350
351  if (samplingDateIsValid && rnaLaterTimestamp)
352  {
353    var samplingTimestamp = Dates.parseString(frm.samplingDate.value + ' ' + frm.samplingTime.value, 'yyyy-MM-dd HH:mm');
354    if (samplingTimestamp && rnaLaterTimestamp.getDate() != samplingTimestamp.getDate())
355    {
356      setInputStatus('rnaLaterDate', 'Sampling and RNA later dates are different', 'warning');
357    }
358  }
359}
360
361function getCaseInfo()
362{
363  // Check entered case and pnr with AJAX
364  var frm = document.forms['reggie'];
365  var caseName = frm.caseName.value;
366  var request = Ajax.getXmlHttpRequest();
367  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=GetCaseInfo';
368  url += '&caseName=' + caseName;
369  request.open("GET", url, false);
370  request.send(null);
371 
372  if (debug) Main.debug(request.responseText);
373
374  var response = JSON.parse(request.responseText);
375  if (response.status != 'ok')
376  {
377    setFatalError(response.message);
378    return false;
379  }
380 
381  // Get biosource information from the AJAX response
382  caseInfo = response.caseInfo;
383 
384  if (caseInfo && caseInfo.patient)
385  {
386    frm.personalNumber.value = caseInfo.patient.personalNumber;
387    gotoStep2();
388  }
389 
390}
391
392function gotoStep2()
393{
394  // Check entered case and pnr with AJAX
395  var frm = document.forms['reggie'];
396  frm.caseName.disabled = true;
397  frm.personalNumber.disabled = true;
398  currentStep = 2;
399 
400  var pnr = frm.personalNumber.value;
401  var request = Ajax.getXmlHttpRequest();
402  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=GetPatientInfo';
403  url += '&personalNumber=' + pnr;
404  url += '&pnrIsValid=' + pnrIsValid;
405  request.open("GET", url, false);
406  request.send(null);
407 
408  if (debug) Main.debug(request.responseText);
409 
410  var response = JSON.parse(request.responseText);
411  if (response.status != 'ok')
412  {
413    setFatalError(response.message);
414    return false;
415  }
416 
417  // Get patient information from the AJAX response
418  patientInfo = response.patientInfo;
419
420  Main.show('gocancel');
421 
422  if (!patientInfo.id)
423  {
424    Main.show('newPatientSection');
425    frm.patientCode.value=patientInfo.name;
426    setInnerHTML('new.dateOfBirth', patientInfo.dateOfBirth ? patientInfo.dateOfBirth : "---");
427    setInnerHTML('new.gender', patientInfo.gender ? patientInfo.gender : "---");
428    frm.familyName.focus();
429    if (!pnrIsValid)
430    {
431      setInputStatus('gender', 'Gender and DateOfBirth can\'t be automatically generated for non-standard Personal number', 'warning');
432    }
433  }
434  else
435  {
436    Main.show('existingPatientSection');
437    setInnerHTML('existing.patientCode', patientInfo.name);
438    setInnerHTML('existing.familyName', patientInfo.familyName);
439    setInnerHTML('existing.allFirstNames', patientInfo.allFirstNames);
440    if (patientInfo.dateOfBirth) setInnerHTML('existing.dateOfBirth', patientInfo.dateOfBirth);
441    if (patientInfo.gender) setInnerHTML('existing.gender', patientInfo.gender);
442    gotoStep3();
443  }
444}
445
446function gotoStep3()
447{
448  // Check entered case and pnr with AJAX
449  var frm = document.forms['reggie'];
450 
451  if (!patientInfo.id)
452  {
453    frm.patientCode.disabled = true;
454    frm.familyName.disabled = true;
455    frm.allFirstNames.disabled = true;
456    patientInfo.familyName = frm.familyName.value;
457    patientInfo.allFirstNames = frm.allFirstNames.value;
458  }
459  currentStep = 3;
460 
461  var updateMode = caseInfo.id;
462 
463  // Generate list of specimen tubes
464  var hasLeftSpecimen = false;
465  var hasRightSpecimen = false;
466  var hasUnknownSpecimen = false;
467  var thisCaseLaterality = caseInfo.laterality;
468  var hasSpecimen = caseInfo.specimen && caseInfo.specimen.length > 0;
469  var thisCasePAD = null;
470  var hasPAD = false;
471  var thisCaseSamplingDate = null;
472  var thisCaseRNALaterDate = null;
473 
474  if (hasSpecimen)
475  {
476    var specimenTubes = '';
477    Main.hide('reasonIfNoSpecimenSection');
478    for (var i = 0; i < caseInfo.specimen.length; i++)
479    {
480      var specimen = caseInfo.specimen[i];
481      specimenTubes += specimen.name;
482      if (specimen.pad && !hasPAD) 
483      {
484        hasPAD = true;
485        thisCasePAD = specimen.pad;
486      }
487      if (specimen.samplingDate && !thisCaseSamplingDate) 
488      {
489        thisCaseSamplingDate = specimen.samplingDate;
490      }
491      if (specimen.rnaLaterDate && !thisCaseRNALaterDate) 
492      {
493        thisCaseRNALaterDate = specimen.rnaLaterDate;
494      }
495      if (specimen.laterality) 
496      {
497        specimenTubes += ' ('+specimen.laterality + ')';
498        Forms.checkRadio(frm.laterality, specimen.laterality);
499        if (specimen.laterality == 'LEFT') hasLeftSpecimen = true;
500        if (specimen.laterality == 'RIGHT') hasRightSpecimen = true;
501        if (!thisCaseLaterality) thisCaseLaterality = specimen.laterality;
502      }
503      else
504      {
505        hasUnknownSpecimen = true;
506        specimenTubes += ' (<i>unknown laterality</i>)';
507      }
508      specimenTubes += '<br>';
509    }
510    setInnerHTML('specimenTubes', specimenTubes);
511   
512    // Check that all specimen tubes have the same laterality
513    var numLateralities = 0;
514    if (hasLeftSpecimen) numLateralities++;
515    if (hasRightSpecimen) numLateralities++;
516    if (hasUnknownSpecimen) numLateralities++;
517    if (numLateralities > 1)
518    {
519      setInputStatus('specimenTubes', 'Specimen tubes with different laterality', 'warning');
520      thisCaseLaterality = null;
521    }
522
523    // Show and populate 'Sampling date' and 'RNA Later date' fields
524    Main.show('samplingDateSection');
525    Main.show('rnaLaterDateSection');
526    if (thisCaseSamplingDate != null)
527    {
528      frm.samplingDate.value = thisCaseSamplingDate.substring(0, 10);
529      frm.samplingTime.value = thisCaseSamplingDate.substring(11, 16);
530      samplingDateTimeOnChange();
531    }
532    if (thisCaseRNALaterDate != null)
533    {
534      frm.rnaLaterDate.value = thisCaseRNALaterDate.substring(0, 10);
535      frm.rnaLaterTime.value = thisCaseRNALaterDate.substring(11, 16);
536      rnaLaterDateTimeOnChange();
537    }
538  }
539  else
540  {
541    // No specimen tubes... if there is only one PAD on the case... use that
542    if (caseInfo.pad && caseInfo.pad.length == 1)
543    {
544      hasPAD = true;
545      thisCasePAD = caseInfo.pad[0];
546    }
547   
548    // Hide 'Sampling date' and 'RNA Later date' fields
549    Main.hide('samplingDateSection');
550    Main.hide('rnaLaterDateSection');
551  }
552
553  frm.pad.value = thisCasePAD;
554  caseInfo.oldPad = thisCasePAD;
555  //Main.showHide('padSection', !hasPAD || updateMode);
556 
557 
558 
559  if (updateMode && !hasSpecimen)
560  {
561    // Try to find 'reasonIfNoSpecimen' annotation on the case
562    for (var i = 0; i < caseInfo.reasonIfNoSpecimen.length; i++)
563    {
564      var rns = caseInfo.reasonIfNoSpecimen[i];
565      if (rns.indexOf('['+caseInfo.originalName+']') == 0)
566      {
567        caseInfo.oldReasonIfNoSpecimen = rns;
568        frm.reasonIfNoSpecimen.value = rns.substring(rns.indexOf(']')+2);
569        i = 999;
570      }
571    }
572  }
573 
574  Main.show('caseSection');
575 
576  // Existing cases for this patient
577  var hasLeftCase = false;
578  var hasRightCase = false;
579  var hasUnknownCase = false;
580  if (patientInfo.cases && patientInfo.cases.length > 0)
581  {
582    var cases = '';
583    for (var i = 0; i < patientInfo.cases.length; i++)
584    {
585      var cc = patientInfo.cases[i];
586      if (cc.laterality == 'LEFT') 
587      {
588        if (hasLeftCase && !updateMode) setInputStatus('laterality', 'Two cases with laterality=LEFT', 'warning');
589        hasLeftCase = true;
590      }
591      else if (cc.laterality == 'RIGHT') 
592      {
593        if (hasRightCase && !updateMode) setInputStatus('laterality', 'Two cases with laterality=RIGHT', 'warning');
594        hasRightCase = true;
595      }
596      else
597      {
598        hasUnknownCase = true; 
599      }
600      if (!updateMode || cc.id == caseInfo.id)
601      {
602        cases += '<input type="radio" name="laterality" value="' + cc.id + '"';
603        if (cc.laterality == thisCaseLaterality) cases += ' checked';
604        cases += ' onclick="lateralityOnChange()">';
605        if (cc.laterality)
606        {
607          cases += cc.laterality;
608        }
609        else
610        {
611          cases += '<i>unknown laterality</i>';
612        }
613        if (!updateMode)
614        {
615          cases += ' [merge with ' + cc.name + ']';
616        }
617        cases += '<br>';
618      }
619    }
620   
621    if (patientInfo.cases.length == 1 || updateMode)
622    {
623      if (!hasLeftCase)
624      {
625        cases += '<input type="radio" name="laterality" value="LEFT" ';
626        if (thisCaseLaterality == 'LEFT') cases += ' checked';
627        cases += ' onclick="lateralityOnChange()">LEFT';
628        if (!updateMode) cases += ' [<i>new case</i>]';
629        cases += '<br>';
630      }
631      if (!hasRightCase)
632      {
633        cases += '<input type="radio" name="laterality" value="RIGHT"';
634        if (thisCaseLaterality == 'RIGHT') cases += ' checked';
635        cases += ' onclick="lateralityOnChange()">RIGHT';
636        if (!updateMode) cases += ' [<i>new case</i>]';
637        cases += '<br>';
638      }
639      if (!updateMode && !hasLeftCase && !hasRightCase)
640      {
641        cases += '<input type="radio" name="laterality" value=""';
642        if (thisCaseLaterality == null) cases += ' checked';
643        cases += ' onclick="lateralityOnChange()"><i>unknown laterality</i> [<i>new case</i>]<br>';
644      }
645    }
646   
647    if (updateMode)
648    {
649      if (caseInfo.merged)
650      {
651        setInnerHTML('step3.title', 'Update case \''+caseInfo.originalName+'\' (which is merged with case \'' + caseInfo.name + '\')');
652      }
653      else
654      {
655        setInnerHTML('step3.title', 'Update case \''+caseInfo.name+'\'');
656      }
657     
658    }
659    else if (patientInfo.cases.length == 2)
660    {
661      setInnerHTML('step3.title', 'Merge with existing case'); 
662    }
663    else if (patientInfo.cases.length > 0)
664    {
665      setInnerHTML('step3.title', 'Create new case or merge with existing case');
666    }
667   
668    setInnerHTML('laterality.input', cases);
669  }
670  lateralityOnChange();
671
672  Main.hide('gonext');
673  if (updateMode)
674  {
675    Main.show('goupdate');
676  }
677  else
678  {
679    Main.show('gocreate');
680  }
681 
682  if (lateralityIsValid) frm.pad.focus();
683}
684
685function goCreate()
686{
687  if (!step3IsValid()) return;
688 
689  Main.hide('gocreate');
690  Main.hide('gocancel');
691  Main.hide('goupdate');
692  var frm = document.forms['reggie'];
693
694  caseInfo.laterality = Forms.getCheckedRadio(frm.laterality).value;
695  caseInfo.reasonIfNoSpecimen = frm.reasonIfNoSpecimen.value;
696  caseInfo.pad = frm.pad.value;
697  caseInfo.samplingDate = Main.trimString(frm.samplingDate.value + ' ' + frm.samplingTime.value);
698  caseInfo.rnaLaterDate = Main.trimString(frm.rnaLaterDate.value + ' ' + frm.rnaLaterTime.value);
699
700  for (var i = 0; i < frm.laterality.length; i++)
701  {
702    frm.laterality[i].disabled = true;
703  }
704  frm.reasonIfNoSpecimen.disabled = true;
705  frm.pad.disabled = true;
706  frm.samplingDate.disabled = true;
707  frm.samplingTime.disabled = true;
708  frm.rnaLaterDate.disabled = true;
709  frm.rnaLaterTime.disabled = true;
710
711  var updateMode = caseInfo.id;
712  var submitInfo = new Object();
713  submitInfo.patientInfo = patientInfo;
714  submitInfo.caseInfo = caseInfo;
715
716  if (debug) Main.debug(JSON.stringify(submitInfo));
717 
718  var request = Ajax.getXmlHttpRequest();
719  var url = 'PersonalRegistration.servlet?ID=<%=ID%>&cmd=';
720  url += updateMode ? 'UpdateCase' : 'CreateCase';
721  request.open("POST", url, false);
722  request.setRequestHeader("Content-Type", "application/json");
723  request.send(JSON.stringify(submitInfo));
724
725  if (debug) Main.debug(request.responseText);
726
727  var response = JSON.parse(request.responseText);
728  if (response.status != 'ok')
729  {
730    setFatalError(response.message);
731    return false;
732  }
733 
734  var msg = '<ul>';
735  for (var i = 0; i < response.messages.length; i++)
736  {
737    msg += '<li>' + response.messages[i];
738  }
739  msg += '</ul>';
740  setInnerHTML('done', msg);
741  Main.show('done');
742  Main.show('gorestart');
743
744}
745</script>
746
747</base:head>
748<base:body onload="init()">
749
750  <p:path style="margin-top: 20px; margin-bottom: 10px;">
751    <p:pathelement title="Reggie" href="<%="index.jsp?ID="+ID%>" />
752    <p:pathelement title="Personal information registration" />
753  </p:path>
754
755  <%
756  if (sc.getActiveProjectId() == 0)
757  {
758    %>
759    <base:note type="warning" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
760      No project has been selected. You may proceed with the registration but
761      created items will not be shared.
762    </base:note>
763    <%
764  }
765  %>
766
767  <form name="reggie" onsubmit="return false;">
768 
769  <!-- 1. Case + Personal number -->
770  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
771  <tr>
772    <td rowspan="3" class="stepno">1</td>
773    <td class="steptitle">Enter Case Name and Personal Number</td>
774  </tr>
775  <tr>
776    <td class="stepfields">
777      <table border="0" cellspacing="0" cellpadding="0" width="100%">
778      <tr valign="top">
779        <td class="prompt">Case name</td>
780        <td class="input"><input type="text" name="caseName" 
781          size="18" maxlength="12" onblur="caseNameOnChange()" onkeypress="focusOnEnter(event, 'personalNumber')"></td>
782        <td class="status" id="case.status"></td>
783        <td class="help"><span id="case.message" class="message" style="display: none;"></span>The case (barcode) associated with this patient.</td>
784      </tr>
785      <tr>
786        <td class="prompt">Personal number</td>
787        <td class="input"><input type="text" name="personalNumber" 
788          size="18" maxlength="12" onkeyup="personalNumberOnChange()" onkeypress="doOnTabOrEnter(event, goNext)"></td>
789        <td class="status" id="pnr.status"></td>
790        <td class="help"><span id="pnr.message" class="message" style="display: none;"></span>(YYYYMMDDZZZZ)</td>
791      </tr>
792      </table>
793    </td>
794  </tr>
795  </table>
796
797  <!-- 2. New patient registration -->
798  <div id="newPatientSection" style="display: none;">
799  <p>
800  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
801  <tr>
802    <td rowspan="2" class="stepno">2</td>
803    <td class="steptitle">New patient: Enter all names</td>
804  </tr>
805  <tr>
806    <td class="stepfields">
807      <table border="0" cellspacing="0" cellpadding="0" width="100%">
808      <tr>
809        <td class="prompt">Patient code</td>
810        <td class="input"><input type="text" name="patientCode" 
811          value="" size="18" maxlength="12" 
812          onkeypress="focusOnEnter(event, 'familyName')"></td>
813        <td class="status" id="patientCode.status"></td>
814        <td class="help"><span id="patientCode.message" class="message" style="display: none;"></span></td>
815      </tr>
816      <tr valign="top">
817        <td class="prompt">Family name</td>
818        <td class="input"><input type="text" name="familyName" 
819          value="" size="35" maxlength="255"
820          onkeypress="focusOnEnter(event, 'allFirstNames')"></td>
821        <td class="status" id="familyName.status"></td>
822        <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>
823      </tr>
824      <tr valign="top">
825        <td class="prompt">All first names</td>
826        <td class="input"><input type="text" name="allFirstNames" 
827          size="35" maxlength="255" onkeypress="doOnTabOrEnter(event, goNext)"></td>
828        <td class="status" id="allFirstNames.status"></td>
829        <td class="help"><span id="allFirstNames.message" class="message" style="display: none;"></span>Type all names, see FamilyName comment on valid characters.</td>
830      </tr>
831      <tr>
832        <td class="prompt">Gender</td>
833        <td class="input" id="new.gender"></td>
834        <td class="status" id="gender.status" rowspan="2"></td>
835        <td class="help" rowspan="2"><span id="gender.message" class="message" style="display:none;"></span></td>
836      </tr>
837      <tr>
838        <td class="prompt">Date of birth</td>
839        <td class="input" id="new.dateOfBirth"></td>
840      </tr>
841      </table>
842    </td>
843  </tr>
844  </table>
845  </div>
846 
847  <!-- 2b. Existing patient -->
848  <div id="existingPatientSection" style="display: none;">
849  <p>
850  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
851  <tr>
852    <td rowspan="2" class="stepno">2</td>
853    <td class="steptitle">Existing patient: Verify names</td>
854  </tr>
855  <tr>
856    <td class="stepfields">
857      <table border="0" cellspacing="0" cellpadding="0" width="100%">
858      <tr>
859        <td class="prompt">Patient code</td>
860        <td class="input" id="existing.patientCode"></td>
861        <td class="status"></td>
862        <td class="help"></td>
863      </tr>
864      <tr>
865        <td class="prompt">Family name</td>
866        <td class="input" id="existing.familyName"></td>
867        <td class="status"></td>
868        <td class="help"></td>
869      </tr>
870      <tr>
871        <td class="prompt">All first names</td>
872        <td class="input" id="existing.allFirstNames"></td>
873        <td class="status"></td>
874        <td class="help"></td>
875      </tr>
876      <tr>
877        <td class="prompt">Gender</td>
878        <td class="input" id="existing.gender"></td>
879        <td class="status"></td>
880        <td class="help"></td>
881      </tr>
882      <tr>
883        <td class="prompt">Date of birth</td>
884        <td class="input" id="existing.dateOfBirth"></td>
885        <td class="status"></td>
886        <td class="help"></td>
887      </tr>
888      </table>
889    </td>
890  </tr>
891  </table>
892  </div>
893
894
895  <!-- 3. Case registration -->
896  <div id="caseSection" style="display: none;">
897  <p>
898  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
899  <tr>
900    <td rowspan="2" class="stepno">3</td>
901    <td class="steptitle" id="step3.title">Create new case</td>
902  </tr>
903  <tr>
904    <td class="stepfields">
905      <table border="0" cellspacing="0" cellpadding="0" width="100%">
906      <tr valign="top">
907        <td class="prompt" id="laterality.prompt">Laterality</td>
908        <td class="input" id="laterality.input">
909          <input type="radio" name="laterality" value="LEFT" onclick="lateralityOnChange()">LEFT<br>
910          <input type="radio" name="laterality" value="RIGHT" onclick="lateralityOnChange()">RIGHT<br>
911          <input type="radio" name="laterality" value="" checked onclick="lateralityOnChange()"><i>unknown</i>
912        </td>
913        <td class="status" id="laterality.status"></td>
914        <td class="help"><span id="laterality.message" class="message" style="display: none;"></span></td>
915      </tr>
916      <tr id="padSection" valign="top">
917        <td class="prompt">PAD</td>
918        <td class="input"><input type="text" name="pad" 
919          value="" size="18" maxlength="12" 
920          onkeypress="focusOnEnter(event, caseInfo.specimen && caseInfo.specimen.length > 0 ? 'samplingDate' : 'reasonIfNoSpecimen')"
921          onblur="padOnChange()"></td>
922        <td class="status" id="pad.status"></td>
923        <td class="help"><span id="pad.message" class="message" style="display: none;"></span></td>
924      </tr>
925      <tr valign="top">
926        <td class="prompt">Specimen tubes</td>
927        <td class="input" id="specimenTubes"><i>not found</i></td>
928        <td class="status" id="specimenTubes.status"></td>
929        <td class="help"><span id="specimenTubes.message" class="message" style="display: none;"></span>The specimen tube(s) associated with this case.</td>
930      </tr>
931      <tr id="samplingDateSection" valign="top">
932        <td class="subprompt">Sampling date</td>
933        <td class="input"><input type="text" name="samplingDate" value="" size="12" maxlength="10" 
934            onkeypress="focusOnEnter(event, 'samplingTime')" onblur="samplingDateTimeOnChange()">
935          Time <input type="text" name="samplingTime" value="" size="6" maxlength="5" 
936            onkeypress="focusOnEnter(event, 'rnaLaterDate')" onblur="samplingDateTimeOnChange()"></td>
937        <td class="status" id="samplingDate.status"></td>
938        <td class="help"><span id="samplingDate.message" class="message" style="display: none;"></span>Date+time of surgical removal (YYYY-MM-DD, HH:MM)</td>
939      </tr>
940      <tr id="rnaLaterDateSection" valign="top">
941        <td class="subprompt">RNA Later date</td>
942        <td class="input"><input type="text" name="rnaLaterDate" value="" size="12" maxlength="10"
943            onkeypress="focusOnEnter(event, 'rnaLaterTime')" onblur="rnaLaterDateTimeOnChange()">
944          Time <input type="text" name="rnaLaterTime" value="" size="6" maxlength="5"
945            onblur="rnaLaterDateTimeOnChange()"></td>
946        <td class="status" id="rnaLaterDate.status"></td>
947        <td class="help"><span id="rnaLaterDate.message" class="message" style="display: none;"></span>Date+time of pathology handling (YYYY-MM-DD, HH:MM)</td>
948      </tr>
949      <tr id="reasonIfNoSpecimenSection" valign="top">
950        <td class="subprompt">Reason if no specimen</td>
951        <td class="input"><textarea rows="3" cols="30" name="reasonIfNoSpecimen" value=""></textarea></td>
952        <td class="status"></td>
953        <td class="help">Comment why there was no specimen tubes in the delivery.</td>
954      </tr>
955      </table>
956    </td>
957  </tr>
958  </table>
959  </div>
960
961  <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>
962
963  <div id="done" class="success" style="display: none; width: 800px; margin-left: 20px; margin-top: 20px;"></div>
964
965  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
966  <tr>
967    <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
968    <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext(true)"/></td>
969    <td><base:button id="gocreate" title="Create" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
970    <td><base:button id="goupdate" title="Update" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
971    <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
972    <td id="gonext.message" class="message"></td>
973  </tr>
974  </table>
975  </form>
976 
977</base:body>
978</base:page>
979<%
980}
981finally
982{
983  if (dc != null) dc.close();
984}
985%>
Note: See TracBrowser for help on using the repository browser.