source: extensions/net.sf.basedb.reggie/branches/2.13-stable/resources/personal/bloodfollowupform.jsp @ 2139

Last change on this file since 2139 was 2139, checked in by olle, 9 years ago

Refs #519. Refs #449. The two blood registration wizards updated to allow 6-digit dates to be used:

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