extensions/net.sf.basedb.reggie/trunk/resources/personal/persinfo.js

Code
Comments
Other
Rev Date Author Line
2617 01 Sep 14 nicklas 1 var PersInfo = function()
2617 01 Sep 14 nicklas 2 {
2617 01 Sep 14 nicklas 3   var persinfo = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2617 01 Sep 14 nicklas 5   
2617 01 Sep 14 nicklas 6   var patientInfo = null;
2617 01 Sep 14 nicklas 7   var caseInfo = null;
2617 01 Sep 14 nicklas 8   var bloodInfo = null;
2617 01 Sep 14 nicklas 9
6510 03 Dec 21 nicklas 10   var pnrIsTested = false;
2617 01 Sep 14 nicklas 11   var pnrIsValid = false;
2617 01 Sep 14 nicklas 12   var pnrIsAcceptable = false;
2617 01 Sep 14 nicklas 13   var caseIsValid = false;
2617 01 Sep 14 nicklas 14
2617 01 Sep 14 nicklas 15   var lateralityIsValid = false;
2617 01 Sep 14 nicklas 16   var samplingDateIsValid = true;
2617 01 Sep 14 nicklas 17   var rnaLaterDateIsValid = true;
2617 01 Sep 14 nicklas 18   var copyConsentEnabled = false;
2617 01 Sep 14 nicklas 19
2617 01 Sep 14 nicklas 20   persinfo.initPage = function()
2617 01 Sep 14 nicklas 21   {
2617 01 Sep 14 nicklas 22     
2617 01 Sep 14 nicklas 23     // Step 1
2617 01 Sep 14 nicklas 24     Events.addEventHandler('step-1', 'wizard-validate', persinfo.validateStep1);
2617 01 Sep 14 nicklas 25     Events.addEventHandler('caseName', 'keypress', Wizard.focusOnEnter);
2617 01 Sep 14 nicklas 26     Events.addEventHandler('caseName', 'blur', persinfo.caseNameOnChange);
2617 01 Sep 14 nicklas 27     Events.addEventHandler('personalNumber', 'keyup', persinfo.personalNumberOnChange);
2617 01 Sep 14 nicklas 28     Events.addEventHandler('personalNumber', 'keypress', Wizard.goNextOnTabOrEnter);
6510 03 Dec 21 nicklas 29     Events.addEventHandler('select-waiting-case', 'click', persinfo.showCaseSelection);
6510 03 Dec 21 nicklas 30     Events.addEventHandler('select-case', 'click', persinfo.caseSelected);
6510 03 Dec 21 nicklas 31     Events.addEventHandler(document.body, 'click', persinfo.hideCaseSelection);
2617 01 Sep 14 nicklas 32     
2617 01 Sep 14 nicklas 33     // Step 2
2617 01 Sep 14 nicklas 34     Events.addEventHandler('step-2', 'wizard-initialize', persinfo.initializeStep2);
2617 01 Sep 14 nicklas 35     Events.addEventHandler('step-2', 'wizard-validate', persinfo.validateStep2);
2617 01 Sep 14 nicklas 36     Events.addEventHandler('familyName', 'blur', persinfo.nameOnChange);
2617 01 Sep 14 nicklas 37     Events.addEventHandler('allFirstNames', 'blur', persinfo.nameOnChange);
2617 01 Sep 14 nicklas 38     Events.addEventHandler('allFirstNames', 'keypress', Wizard.goNextOnTabOrEnter);
2617 01 Sep 14 nicklas 39
2617 01 Sep 14 nicklas 40     // Step 3
2617 01 Sep 14 nicklas 41     Events.addEventHandler('step-3', 'wizard-initialize', persinfo.initializeStep3);
2617 01 Sep 14 nicklas 42     Events.addEventHandler('step-3', 'wizard-validate', persinfo.validateStep3);
2617 01 Sep 14 nicklas 43     Events.addEventHandler('pad', 'blur', persinfo.padOnChange);
6574 08 Feb 22 nicklas 44     Events.addEventHandler('externalSpecimenExists', 'change', persinfo.externalSpecimenExistsOnChange);
2617 01 Sep 14 nicklas 45     Events.addEventHandler('samplingDate', 'blur', persinfo.samplingDateTimeOnChange);
2617 01 Sep 14 nicklas 46     Events.addEventHandler('samplingTime', 'blur', persinfo.samplingDateTimeOnChange);
2617 01 Sep 14 nicklas 47     Events.addEventHandler('samplingDate', 'keypress', persinfo.samplingDateTimeFocus);
2617 01 Sep 14 nicklas 48     Events.addEventHandler('samplingTime', 'keypress', persinfo.samplingDateTimeFocus);
2617 01 Sep 14 nicklas 49     Events.addEventHandler('rnaLaterDate', 'blur', persinfo.rnaLaterDateTimeOnChange);
2801 13 Oct 14 nicklas 50     Events.addEventHandler('rnaLaterTime', 'blur', persinfo.rnaLaterDateTimeOnChange);
5318 28 Feb 19 nicklas 51     Events.addEventHandler('noReferralForm', 'change', persinfo.noReferralFormOnChange);
6991 19 Jan 23 nicklas 52     Buttons.addClickHandler('swapPad', persinfo.swapPad);
2617 01 Sep 14 nicklas 53     
2617 01 Sep 14 nicklas 54     // Navigation
2617 01 Sep 14 nicklas 55     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2617 01 Sep 14 nicklas 56     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2617 01 Sep 14 nicklas 57     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2617 01 Sep 14 nicklas 58     Buttons.addClickHandler('goregister', Wizard.goRegister);
2617 01 Sep 14 nicklas 59     Buttons.addClickHandler('goupdate', Wizard.goRegister);
2617 01 Sep 14 nicklas 60     
2617 01 Sep 14 nicklas 61     // Final registration
2617 01 Sep 14 nicklas 62     Events.addEventHandler('wizard', 'wizard-submit', persinfo.submit);
2617 01 Sep 14 nicklas 63     
2617 01 Sep 14 nicklas 64     Doc.show('step-1');
2617 01 Sep 14 nicklas 65     Doc.show('gonext');
6510 03 Dec 21 nicklas 66     
6510 03 Dec 21 nicklas 67     var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
6510 03 Dec 21 nicklas 68     url += '&cmd=GetSpecimenWithoutCase';
6510 03 Dec 21 nicklas 69     Wizard.showLoadingAnimation('Loading information about specimen tubes...');
6510 03 Dec 21 nicklas 70     Wizard.asyncJsonRequest(url, persinfo.onSpecimenTubesLoaded);
2617 01 Sep 14 nicklas 71   }
2617 01 Sep 14 nicklas 72   
6510 03 Dec 21 nicklas 73   persinfo.onSpecimenTubesLoaded = function(response)
6510 03 Dec 21 nicklas 74   {
6510 03 Dec 21 nicklas 75     var specimenTubes = response.specimenTubes;
6510 03 Dec 21 nicklas 76     if (specimenTubes.length == 0) return;
6510 03 Dec 21 nicklas 77     
6510 03 Dec 21 nicklas 78     var html = '';
6510 03 Dec 21 nicklas 79     var lastPrefix = null;
6510 03 Dec 21 nicklas 80     for (var spNo = 0; spNo < specimenTubes.length; spNo++)
6510 03 Dec 21 nicklas 81     {
6510 03 Dec 21 nicklas 82       var sp = specimenTubes[spNo];
6510 03 Dec 21 nicklas 83       var prefix = sp.name.substr(0, 2);
6510 03 Dec 21 nicklas 84       if (lastPrefix && prefix != lastPrefix)
6510 03 Dec 21 nicklas 85       {
6510 03 Dec 21 nicklas 86         html += '<div class="menuseparator"></div>';
6510 03 Dec 21 nicklas 87       }
6510 03 Dec 21 nicklas 88       lastPrefix = prefix;
6510 03 Dec 21 nicklas 89       html += '<div class="menuitem interactable enabled" id="sp-'+sp.id+'" data-case-name="'+Strings.encodeTags(sp.name)+'">';
6510 03 Dec 21 nicklas 90       html += Strings.encodeTags(sp.name);
6510 03 Dec 21 nicklas 91       if (sp.numSpecimen > 1) html += ' ('+sp.numSpecimen+')';
6510 03 Dec 21 nicklas 92       if (sp.externalRef) html += ' – '+Strings.encodeTags(sp.externalRef);
6510 03 Dec 21 nicklas 93       html += '</div>';
6510 03 Dec 21 nicklas 94     }
6510 03 Dec 21 nicklas 95     Doc.element('select-case-all').innerHTML = html;
6510 03 Dec 21 nicklas 96     Doc.element('num-waiting-cases').innerHTML = specimenTubes.length+(specimenTubes.length == 1 ? ' case':' cases')+' waiting for registration';
6510 03 Dec 21 nicklas 97     Doc.show('waitingCasesSection');
6510 03 Dec 21 nicklas 98   }
6510 03 Dec 21 nicklas 99   
6510 03 Dec 21 nicklas 100   persinfo.showCaseSelection = function(event)
6510 03 Dec 21 nicklas 101   {
6510 03 Dec 21 nicklas 102     var menu = Doc.element('select-case');
6510 03 Dec 21 nicklas 103     menu.style.display = 'block';
6510 03 Dec 21 nicklas 104     var x = event.clientX+1;
6510 03 Dec 21 nicklas 105     var y = event.clientY;
6510 03 Dec 21 nicklas 106     menu.style.left = (x)+'px';
6510 03 Dec 21 nicklas 107     menu.style.top = (y)+'px';
6510 03 Dec 21 nicklas 108     event.stopPropagation();
6510 03 Dec 21 nicklas 109   }
6510 03 Dec 21 nicklas 110   
6510 03 Dec 21 nicklas 111   persinfo.hideCaseSelection = function()
6510 03 Dec 21 nicklas 112   {
6510 03 Dec 21 nicklas 113     Doc.hide('select-case');
6510 03 Dec 21 nicklas 114   }
6510 03 Dec 21 nicklas 115   
6510 03 Dec 21 nicklas 116   persinfo.caseSelected = function(event)
6510 03 Dec 21 nicklas 117   {
6510 03 Dec 21 nicklas 118     var frm = document.forms['reggie'];
6510 03 Dec 21 nicklas 119     var name = Data.get(event.target, 'case-name');
6510 03 Dec 21 nicklas 120     frm.caseName.value = name;
6510 03 Dec 21 nicklas 121     frm.personalNumber.focus();
6510 03 Dec 21 nicklas 122     persinfo.caseNameOnChange();
6510 03 Dec 21 nicklas 123   }
6510 03 Dec 21 nicklas 124
6510 03 Dec 21 nicklas 125   
2617 01 Sep 14 nicklas 126   persinfo.caseNameOnChange = function()
2617 01 Sep 14 nicklas 127   {
2617 01 Sep 14 nicklas 128     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 129     var caseName = frm.caseName.value.toUpperCase();
2617 01 Sep 14 nicklas 130     caseIsValid = false;
6510 03 Dec 21 nicklas 131     Doc.element('numSpecimenTubes').innerHTML = '';
2617 01 Sep 14 nicklas 132     if (caseName == '')
2617 01 Sep 14 nicklas 133     {
2617 01 Sep 14 nicklas 134       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
2617 01 Sep 14 nicklas 135       frm.caseName.focus();
2617 01 Sep 14 nicklas 136       return;
2617 01 Sep 14 nicklas 137     }
2840 20 Oct 14 nicklas 138     if (!Reggie.isValidCaseName(caseName, true)) // Allow C/D suffix to be used
2617 01 Sep 14 nicklas 139     {
2840 20 Oct 14 nicklas 140       Wizard.setInputStatus('caseName', 'invalid', 'Only 7-digits name + optional \'C\' or \'D\' is allowed.');
2617 01 Sep 14 nicklas 141       frm.caseName.focus();
2617 01 Sep 14 nicklas 142       return;
2617 01 Sep 14 nicklas 143     }
2617 01 Sep 14 nicklas 144
2617 01 Sep 14 nicklas 145     frm.caseName.value = caseName;
2617 01 Sep 14 nicklas 146     Wizard.setInputStatus('caseName', 'valid');
2617 01 Sep 14 nicklas 147     caseIsValid = true;
2617 01 Sep 14 nicklas 148     
2617 01 Sep 14 nicklas 149     var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
2617 01 Sep 14 nicklas 150     url += '&cmd=GetCaseInfo&caseName=' + encodeURIComponent(caseName);
2617 01 Sep 14 nicklas 151     Wizard.showLoadingAnimation('Loading information about case...');
2617 01 Sep 14 nicklas 152     Wizard.asyncJsonRequest(url, persinfo.onCaseInfoLoaded);
2617 01 Sep 14 nicklas 153   }
2617 01 Sep 14 nicklas 154
2617 01 Sep 14 nicklas 155   persinfo.onCaseInfoLoaded = function(response)
2617 01 Sep 14 nicklas 156   {
2617 01 Sep 14 nicklas 157     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 158     
2617 01 Sep 14 nicklas 159     // Get biosource information from the AJAX response
2617 01 Sep 14 nicklas 160     caseInfo = response.caseInfo;
2617 01 Sep 14 nicklas 161     bloodInfo = response.bloodInfo;
6510 03 Dec 21 nicklas 162     var numSpecimenTubes = caseInfo.specimen ? caseInfo.specimen.length : 0;
6510 03 Dec 21 nicklas 163     Doc.element('numSpecimenTubes').innerHTML = '<i>('+(numSpecimenTubes || 'no')+' existing specimen '+(numSpecimenTubes==1?'item':'items')+')</i>';
2617 01 Sep 14 nicklas 164     
2617 01 Sep 14 nicklas 165     if (caseInfo && caseInfo.patient)
2617 01 Sep 14 nicklas 166     {
6575 09 Feb 22 nicklas 167       patientInfo = caseInfo.patient;
6575 09 Feb 22 nicklas 168       frm.personalNumber.value = patientInfo.personalNumber;
2617 01 Sep 14 nicklas 169       persinfo.personalNumberOnChange();
6575 09 Feb 22 nicklas 170       pnrIsValid = true;
6574 08 Feb 22 nicklas 171       Wizard.goNext(true);
2617 01 Sep 14 nicklas 172     }
2617 01 Sep 14 nicklas 173     else if (bloodInfo && bloodInfo.patient)
2617 01 Sep 14 nicklas 174     {
6575 09 Feb 22 nicklas 175       patientInfo = bloodInfo.patient;
6575 09 Feb 22 nicklas 176       frm.personalNumber.value = patientInfo.personalNumber;
2617 01 Sep 14 nicklas 177       persinfo.personalNumberOnChange();
6575 09 Feb 22 nicklas 178       pnrIsValid = true;
6574 08 Feb 22 nicklas 179       Wizard.goNext(true);
2617 01 Sep 14 nicklas 180     }
2617 01 Sep 14 nicklas 181   }
2617 01 Sep 14 nicklas 182
2617 01 Sep 14 nicklas 183   persinfo.personalNumberOnChange = function()
2617 01 Sep 14 nicklas 184   {
2617 01 Sep 14 nicklas 185     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 186     var pnr = frm.personalNumber.value;
2617 01 Sep 14 nicklas 187     pnrIsValid = false;
6510 03 Dec 21 nicklas 188     pnrIsAcceptable = false;
6510 03 Dec 21 nicklas 189     pnrIsTested = true;
2617 01 Sep 14 nicklas 190     
2617 01 Sep 14 nicklas 191     var pnrLen = pnr.length;
6510 03 Dec 21 nicklas 192     if (pnrLen == 0)
6510 03 Dec 21 nicklas 193     {
6510 03 Dec 21 nicklas 194       Wizard.setInputStatus('personalNumber', 'invalid', 'A personal number is required');
6510 03 Dec 21 nicklas 195       return;
6510 03 Dec 21 nicklas 196     }
6510 03 Dec 21 nicklas 197     
6510 03 Dec 21 nicklas 198     pnrIsAcceptable = true;
2617 01 Sep 14 nicklas 199     if (pnrLen != 12 && pnrLen != 10)
2617 01 Sep 14 nicklas 200     {
2617 01 Sep 14 nicklas 201       Wizard.setInputStatus('personalNumber', 'warning', pnrLen < 12 ? 'Too short' : 'Too long');
2617 01 Sep 14 nicklas 202       return;
2617 01 Sep 14 nicklas 203     }
2617 01 Sep 14 nicklas 204
2617 01 Sep 14 nicklas 205     if (!pnr.match(/^\d+$/))
2617 01 Sep 14 nicklas 206     {
2617 01 Sep 14 nicklas 207       Wizard.setInputStatus('personalNumber', 'warning', 'Non-standard personal number');
2617 01 Sep 14 nicklas 208       return;
2617 01 Sep 14 nicklas 209     }
2617 01 Sep 14 nicklas 210     
2617 01 Sep 14 nicklas 211     var datePart = pnr.substring(0, pnrLen - 4); // Remove last four digits
2617 01 Sep 14 nicklas 212     var dateFormat = pnrLen == 10 ? 'yyMMdd' : 'yyyyMMdd';
2617 01 Sep 14 nicklas 213     var isValidDate = Dates.isDate(datePart, dateFormat);
2617 01 Sep 14 nicklas 214     if (!isValidDate)
2617 01 Sep 14 nicklas 215     {
2617 01 Sep 14 nicklas 216       var dayInMonth = parseInt(datePart.substring(-2), 10); // Last two characters
2617 01 Sep 14 nicklas 217       if (dayInMonth > 60)
2617 01 Sep 14 nicklas 218       {
2617 01 Sep 14 nicklas 219         // 'Samordningsnummer' has day-in-month + 60; check this
2617 01 Sep 14 nicklas 220         dayInMonth -= 60;
2617 01 Sep 14 nicklas 221         var tmpPnr = pnr.substring(0, pnrLen - 6); // First 4 or 6 digits is year+month
2617 01 Sep 14 nicklas 222         if (dayInMonth < 10) tmpPnr += '0';
2617 01 Sep 14 nicklas 223         tmpPnr += dayInMonth;
2617 01 Sep 14 nicklas 224         isValidDate = Dates.isDate(tmpPnr, dateFormat);
2617 01 Sep 14 nicklas 225       }
2617 01 Sep 14 nicklas 226     }
2617 01 Sep 14 nicklas 227     if (!isValidDate)
2617 01 Sep 14 nicklas 228     {
2617 01 Sep 14 nicklas 229       Wizard.setInputStatus('personalNumber', 'warning', 'Not a valid date');
2617 01 Sep 14 nicklas 230       return;
2617 01 Sep 14 nicklas 231     }
2617 01 Sep 14 nicklas 232     
2617 01 Sep 14 nicklas 233     if (!Reggie.personalNumberControlDigitCheck(pnr.substr(pnrLen == 10 ? 0 : 2)))
2617 01 Sep 14 nicklas 234     {
2617 01 Sep 14 nicklas 235       Wizard.setInputStatus('personalNumber', 'warning', 'Invalid control digit');
2617 01 Sep 14 nicklas 236       return;
2617 01 Sep 14 nicklas 237     }
2617 01 Sep 14 nicklas 238
2617 01 Sep 14 nicklas 239     Wizard.setInputStatus('personalNumber', 'valid');
2617 01 Sep 14 nicklas 240     pnrIsValid = true;
2617 01 Sep 14 nicklas 241     Wizard.hideGoNextConfirmation();
2617 01 Sep 14 nicklas 242   }
2617 01 Sep 14 nicklas 243
2617 01 Sep 14 nicklas 244   persinfo.validateStep1 = function(event)
2617 01 Sep 14 nicklas 245   {
6510 03 Dec 21 nicklas 246     if (!pnrIsTested) persinfo.personalNumberOnChange();
6510 03 Dec 21 nicklas 247     if (!caseIsValid || !pnrIsValid) 
2617 01 Sep 14 nicklas 248     {
6510 03 Dec 21 nicklas 249       if (!pnrIsAcceptable)
2617 01 Sep 14 nicklas 250       {
2617 01 Sep 14 nicklas 251         event.preventDefault();
6510 03 Dec 21 nicklas 252         return;
2617 01 Sep 14 nicklas 253       }
6510 03 Dec 21 nicklas 254       var frm = document.forms['reggie'];
6575 09 Feb 22 nicklas 255       if (!frm.verifyGoNext)
6510 03 Dec 21 nicklas 256       {
6510 03 Dec 21 nicklas 257         frm.personalNumber.focus();
6510 03 Dec 21 nicklas 258         Wizard.showGoNextConfirmation(true, 'Check to verify registration of non-standard personal number.');
6510 03 Dec 21 nicklas 259         event.preventDefault();
6510 03 Dec 21 nicklas 260       }
2617 01 Sep 14 nicklas 261     }
2617 01 Sep 14 nicklas 262   }
2617 01 Sep 14 nicklas 263
2617 01 Sep 14 nicklas 264   persinfo.initializeStep2 = function(event)
2617 01 Sep 14 nicklas 265   {
2617 01 Sep 14 nicklas 266     var frm = document.forms['reggie'];
6575 09 Feb 22 nicklas 267     if (!patientInfo)
2617 01 Sep 14 nicklas 268     {
6575 09 Feb 22 nicklas 269       var pnr = frm.personalNumber.value;
6575 09 Feb 22 nicklas 270       if (pnr.length == 10 && pnrIsValid) 
6575 09 Feb 22 nicklas 271       {
6575 09 Feb 22 nicklas 272         var year = Reggie.fullYear(parseInt(pnr.substr(0, 2), 10));
6575 09 Feb 22 nicklas 273         pnr = year + pnr.substr(2);
6575 09 Feb 22 nicklas 274       }
6575 09 Feb 22 nicklas 275     
6575 09 Feb 22 nicklas 276       var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
6575 09 Feb 22 nicklas 277       url += '&cmd=GetPatientInfo';
6575 09 Feb 22 nicklas 278       url += '&personalNumber=' + encodeURIComponent(pnr);
6575 09 Feb 22 nicklas 279       url += '&pnrIsValid=' + pnrIsValid;
6575 09 Feb 22 nicklas 280   
6575 09 Feb 22 nicklas 281       Wizard.showLoadingAnimation('Loading patient information...');
6575 09 Feb 22 nicklas 282       Wizard.asyncJsonRequest(url, persinfo.patientInfoLoaded);
2617 01 Sep 14 nicklas 283     }
6575 09 Feb 22 nicklas 284     else
6575 09 Feb 22 nicklas 285     {
6575 09 Feb 22 nicklas 286       persinfo.patientInfoLoaded();
6575 09 Feb 22 nicklas 287     }
2617 01 Sep 14 nicklas 288   }
2617 01 Sep 14 nicklas 289
2617 01 Sep 14 nicklas 290   
2617 01 Sep 14 nicklas 291   persinfo.patientInfoLoaded = function(response)
2617 01 Sep 14 nicklas 292   {
2617 01 Sep 14 nicklas 293     Wizard.setCurrentStep(2);
2617 01 Sep 14 nicklas 294     // Get patient information from the AJAX response
6575 09 Feb 22 nicklas 295     if (response) patientInfo = response.patientInfo;
2617 01 Sep 14 nicklas 296     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 297
2617 01 Sep 14 nicklas 298     frm.patientCode.value=patientInfo.name;
2617 01 Sep 14 nicklas 299     frm.familyName.value = patientInfo.familyName || '';
2617 01 Sep 14 nicklas 300     frm.allFirstNames.value = patientInfo.allFirstNames || '';
2617 01 Sep 14 nicklas 301     Doc.element('dateOfBirth').innerHTML = patientInfo.dateOfBirth ? Strings.encodeTags(patientInfo.dateOfBirth) : '---';
2617 01 Sep 14 nicklas 302     Doc.element('gender').innerHTML = patientInfo.gender ? Strings.encodeTags(patientInfo.gender) : '---';
2617 01 Sep 14 nicklas 303     frm.familyName.focus();
2617 01 Sep 14 nicklas 304
2617 01 Sep 14 nicklas 305     if (!patientInfo.id)
2617 01 Sep 14 nicklas 306     {
2617 01 Sep 14 nicklas 307       if (!pnrIsValid)
2617 01 Sep 14 nicklas 308       {
2617 01 Sep 14 nicklas 309         Wizard.setInputStatus('gender', 'warning', 'Gender and DateOfBirth can\'t be automatically generated for non-standard Personal number');
2617 01 Sep 14 nicklas 310       }
2617 01 Sep 14 nicklas 311     }
2617 01 Sep 14 nicklas 312     else
2617 01 Sep 14 nicklas 313     {
2617 01 Sep 14 nicklas 314       Doc.element('step-2-title').innerHTML = 'Existing patient: Verify names';
2617 01 Sep 14 nicklas 315       frm.patientCode.disabled = true;
2617 01 Sep 14 nicklas 316     }
2617 01 Sep 14 nicklas 317     
2617 01 Sep 14 nicklas 318     Doc.show('gonext');
2617 01 Sep 14 nicklas 319     Doc.show('gocancel');
2617 01 Sep 14 nicklas 320     
2617 01 Sep 14 nicklas 321   }
2617 01 Sep 14 nicklas 322   
2617 01 Sep 14 nicklas 323   persinfo.nameOnChange = function(event)
2617 01 Sep 14 nicklas 324   {
2617 01 Sep 14 nicklas 325     var field = event.target;
2617 01 Sep 14 nicklas 326     if (field.value == '')
2617 01 Sep 14 nicklas 327     {
2617 01 Sep 14 nicklas 328       Wizard.setInputStatus(field, 'warning', 'Missing');
2617 01 Sep 14 nicklas 329     }
2617 01 Sep 14 nicklas 330     else
2617 01 Sep 14 nicklas 331     {
2617 01 Sep 14 nicklas 332       Wizard.setInputStatus(field, 'valid');
2617 01 Sep 14 nicklas 333       Wizard.hideGoNextConfirmation();
2617 01 Sep 14 nicklas 334     }
2617 01 Sep 14 nicklas 335   }
2617 01 Sep 14 nicklas 336
2617 01 Sep 14 nicklas 337   persinfo.validateStep2 = function(event)
2617 01 Sep 14 nicklas 338   {
2617 01 Sep 14 nicklas 339     var valid = true;
2617 01 Sep 14 nicklas 340     var acceptable = true;
2617 01 Sep 14 nicklas 341     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 342
2617 01 Sep 14 nicklas 343     if (frm.allFirstNames.value == '')
2617 01 Sep 14 nicklas 344     {
2617 01 Sep 14 nicklas 345       Wizard.setInputStatus('allFirstNames', 'warning', 'Missing');
2617 01 Sep 14 nicklas 346       valid = false;
2617 01 Sep 14 nicklas 347     }
2617 01 Sep 14 nicklas 348     else
2617 01 Sep 14 nicklas 349     {
2617 01 Sep 14 nicklas 350       Wizard.setInputStatus('allFirstNames', 'valid');
2617 01 Sep 14 nicklas 351     }
6997 20 Jan 23 nicklas 352     patientInfo.allFirstNames = frm.allFirstNames.value;
2617 01 Sep 14 nicklas 353     
2617 01 Sep 14 nicklas 354     if (frm.familyName.value == '')
2617 01 Sep 14 nicklas 355     {
2617 01 Sep 14 nicklas 356       Wizard.setInputStatus('familyName', 'warning', 'Missing');
2617 01 Sep 14 nicklas 357       valid = false;
2617 01 Sep 14 nicklas 358     }
2617 01 Sep 14 nicklas 359     else
2617 01 Sep 14 nicklas 360     {
2617 01 Sep 14 nicklas 361       Wizard.setInputStatus('familyName', 'valid');
2617 01 Sep 14 nicklas 362     }
6997 20 Jan 23 nicklas 363     patientInfo.familyName = frm.familyName.value;
2617 01 Sep 14 nicklas 364
2617 01 Sep 14 nicklas 365     // New patient only
2617 01 Sep 14 nicklas 366     if (!patientInfo.id)
2617 01 Sep 14 nicklas 367     {
2617 01 Sep 14 nicklas 368       if (frm.patientCode.value == '')
2617 01 Sep 14 nicklas 369       {
2617 01 Sep 14 nicklas 370         Wizard.setInputStatus('patientCode', 'invalid', 'Missing');
2617 01 Sep 14 nicklas 371         frm.patientCode.focus();
2617 01 Sep 14 nicklas 372         valid = false;
2617 01 Sep 14 nicklas 373         acceptable = false;
2617 01 Sep 14 nicklas 374       }
2617 01 Sep 14 nicklas 375       else
2617 01 Sep 14 nicklas 376       {
2617 01 Sep 14 nicklas 377         Wizard.setInputStatus('patientCode', 'valid');
2617 01 Sep 14 nicklas 378         patientInfo.name = frm.patientCode.value;
2617 01 Sep 14 nicklas 379       }  
2617 01 Sep 14 nicklas 380     }
2617 01 Sep 14 nicklas 381     
2617 01 Sep 14 nicklas 382     if (event.detail.auto)
2617 01 Sep 14 nicklas 383     {
2617 01 Sep 14 nicklas 384       if (!valid)
2617 01 Sep 14 nicklas 385       {
2617 01 Sep 14 nicklas 386         Wizard.showGoNextConfirmation(true, 'Check to verify registration with missing name(s).');
2617 01 Sep 14 nicklas 387         event.preventDefault();
2617 01 Sep 14 nicklas 388       }
2617 01 Sep 14 nicklas 389     }
2617 01 Sep 14 nicklas 390     else
2617 01 Sep 14 nicklas 391     {
2617 01 Sep 14 nicklas 392       if (!acceptable) event.preventDefault();
2617 01 Sep 14 nicklas 393     }
2617 01 Sep 14 nicklas 394     
2617 01 Sep 14 nicklas 395   }
2617 01 Sep 14 nicklas 396   
2617 01 Sep 14 nicklas 397   persinfo.initializeStep3 = function()
2617 01 Sep 14 nicklas 398   {
2617 01 Sep 14 nicklas 399     // Check entered case and pnr with AJAX
2617 01 Sep 14 nicklas 400     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 401     var updateMode = caseInfo.id && caseInfo.patient;
5277 05 Feb 19 nicklas 402     var isPreCase = caseInfo.id && !caseInfo.patient && caseInfo.consent; // The case is a pre-registered consent
2617 01 Sep 14 nicklas 403     
2617 01 Sep 14 nicklas 404     // Generate list of specimen tubes
2617 01 Sep 14 nicklas 405     var hasLeftSpecimen = false;
2617 01 Sep 14 nicklas 406     var hasRightSpecimen = false;
2617 01 Sep 14 nicklas 407     var hasUnknownSpecimen = false;
2617 01 Sep 14 nicklas 408     var thisCaseLaterality = caseInfo.laterality;
2617 01 Sep 14 nicklas 409     var hasSpecimen = caseInfo.specimen && caseInfo.specimen.length > 0;
2617 01 Sep 14 nicklas 410     var thisCasePAD = null;
6991 19 Jan 23 nicklas 411     var thisCaseAlternatePAD = null;
6996 20 Jan 23 nicklas 412     var thisCaseExternalOperator = null;
2617 01 Sep 14 nicklas 413     var hasPAD = false;
2617 01 Sep 14 nicklas 414     var thisCaseSamplingDate = null;
2617 01 Sep 14 nicklas 415     var thisCaseRNALaterDate = null;
2617 01 Sep 14 nicklas 416     
2617 01 Sep 14 nicklas 417     if (hasSpecimen)
2617 01 Sep 14 nicklas 418     {
6510 03 Dec 21 nicklas 419       Doc.element('specimenTubes').innerHTML = persinfo.createSpecimenHtml();
3726 28 Jan 16 nicklas 420       
6998 20 Jan 23 nicklas 421       var downloadable = Doc.element('specimenTubes').getElementsByClassName('download-file');
6998 20 Jan 23 nicklas 422       for (var fileNo = 0; fileNo < downloadable.length; fileNo++)
6998 20 Jan 23 nicklas 423       {
6998 20 Jan 23 nicklas 424         Events.addEventHandler(downloadable[fileNo], 'click', persinfo.downloadJsonFile);
6998 20 Jan 23 nicklas 425       }
6998 20 Jan 23 nicklas 426       
2617 01 Sep 14 nicklas 427       for (var i = 0; i < caseInfo.specimen.length; i++)
2617 01 Sep 14 nicklas 428       {
2617 01 Sep 14 nicklas 429         var specimen = caseInfo.specimen[i];
3726 28 Jan 16 nicklas 430         var isYellow = specimen.YellowLabel != null;
3726 28 Jan 16 nicklas 431         specimen.YellowLabelOriginal = specimen.YellowLabel;
6510 03 Dec 21 nicklas 432   
6510 03 Dec 21 nicklas 433         frm['yellow.'+specimen.id].checked = isYellow;
6510 03 Dec 21 nicklas 434         Forms.selectListOption(frm['specimenType.'+specimen.id], specimen.specimenType);
6510 03 Dec 21 nicklas 435         Forms.selectListOption(frm['biopsyType.'+specimen.id], specimen.biopsyType);
6510 03 Dec 21 nicklas 436         frm['comment.'+specimen.id].value = specimen.operatorDeliveryComment;
6510 03 Dec 21 nicklas 437         frm['otherPathNote.'+specimen.id].value = specimen.otherPathNote;
6510 03 Dec 21 nicklas 438         Events.addEventHandler('yellow.'+specimen.id, 'click', persinfo.yellowOnChange);
6510 03 Dec 21 nicklas 439
2617 01 Sep 14 nicklas 440         if (specimen.pad && !hasPAD) 
2617 01 Sep 14 nicklas 441         {
2617 01 Sep 14 nicklas 442           hasPAD = true;
2617 01 Sep 14 nicklas 443           thisCasePAD = specimen.pad;
2617 01 Sep 14 nicklas 444         }
6991 19 Jan 23 nicklas 445         if (specimen.alternatePad && thisCaseAlternatePAD == null)
6991 19 Jan 23 nicklas 446         {
6991 19 Jan 23 nicklas 447           thisCaseAlternatePAD = specimen.alternatePad;
6991 19 Jan 23 nicklas 448         }
6996 20 Jan 23 nicklas 449         if (specimen.externalOperator && thisCaseExternalOperator == null)
6996 20 Jan 23 nicklas 450         {
6996 20 Jan 23 nicklas 451           thisCaseExternalOperator = specimen.externalOperator;
6996 20 Jan 23 nicklas 452         }
2617 01 Sep 14 nicklas 453         if (specimen.samplingDate && !thisCaseSamplingDate) 
2617 01 Sep 14 nicklas 454         {
2617 01 Sep 14 nicklas 455           thisCaseSamplingDate = specimen.samplingDate;
2617 01 Sep 14 nicklas 456         }
2617 01 Sep 14 nicklas 457         if (specimen.rnaLaterDate && !thisCaseRNALaterDate) 
2617 01 Sep 14 nicklas 458         {
2617 01 Sep 14 nicklas 459           thisCaseRNALaterDate = specimen.rnaLaterDate;
2617 01 Sep 14 nicklas 460         }
2617 01 Sep 14 nicklas 461         if (specimen.laterality) 
2617 01 Sep 14 nicklas 462         {
2617 01 Sep 14 nicklas 463           Forms.checkRadio(frm.laterality, specimen.laterality);
2617 01 Sep 14 nicklas 464           if (specimen.laterality == 'LEFT') hasLeftSpecimen = true;
2617 01 Sep 14 nicklas 465           if (specimen.laterality == 'RIGHT') hasRightSpecimen = true;
2617 01 Sep 14 nicklas 466           if (!thisCaseLaterality) thisCaseLaterality = specimen.laterality;
2617 01 Sep 14 nicklas 467         }
2617 01 Sep 14 nicklas 468         else
2617 01 Sep 14 nicklas 469         {
2617 01 Sep 14 nicklas 470           hasUnknownSpecimen = true;
2617 01 Sep 14 nicklas 471         }
2617 01 Sep 14 nicklas 472       }
2617 01 Sep 14 nicklas 473       
2617 01 Sep 14 nicklas 474       // Check that all specimen tubes have the same laterality
2617 01 Sep 14 nicklas 475       var numLateralities = 0;
2617 01 Sep 14 nicklas 476       if (hasLeftSpecimen) numLateralities++;
2617 01 Sep 14 nicklas 477       if (hasRightSpecimen) numLateralities++;
2617 01 Sep 14 nicklas 478       if (hasUnknownSpecimen) numLateralities++;
2617 01 Sep 14 nicklas 479       if (numLateralities > 1)
2617 01 Sep 14 nicklas 480       {
6510 03 Dec 21 nicklas 481         Wizard.setInputStatus('laterality', 'warning', 'Specimen tubes with different laterality');
2617 01 Sep 14 nicklas 482         thisCaseLaterality = null;
2617 01 Sep 14 nicklas 483       }
2617 01 Sep 14 nicklas 484       
7002 23 Jan 23 nicklas 485       if (thisCaseExternalOperator != null || thisCaseAlternatePAD != null)
6996 20 Jan 23 nicklas 486       {
6996 20 Jan 23 nicklas 487         Doc.show('externalSpecimenExistsSection');
6996 20 Jan 23 nicklas 488         Doc.show('externalOperatorSection');
6996 20 Jan 23 nicklas 489         Doc.show('alternatePadSection');
6996 20 Jan 23 nicklas 490       }
6996 20 Jan 23 nicklas 491       
2617 01 Sep 14 nicklas 492       Doc.show('samplingDateSection');
2617 01 Sep 14 nicklas 493       Doc.show('rnaLaterDateSection');
6510 03 Dec 21 nicklas 494       Doc.show('specimenTubes');
2617 01 Sep 14 nicklas 495     }
2617 01 Sep 14 nicklas 496     else
2617 01 Sep 14 nicklas 497     {
2617 01 Sep 14 nicklas 498       if (caseInfo.noSpecimen)
2617 01 Sep 14 nicklas 499       {
6574 08 Feb 22 nicklas 500         var noSpecimen = caseInfo.noSpecimen;
2617 01 Sep 14 nicklas 501         // This case is registered with 'NoSpecimen'
6574 08 Feb 22 nicklas 502         thisCasePAD = noSpecimen.pad;
6991 19 Jan 23 nicklas 503         thisCaseAlternatePAD = noSpecimen.alternatePad;
6996 20 Jan 23 nicklas 504         thisCaseExternalOperator = noSpecimen.externalOperator;
6574 08 Feb 22 nicklas 505         thisCaseSamplingDate = noSpecimen.samplingDate;
6574 08 Feb 22 nicklas 506         thisCaseRNALaterDate = noSpecimen.rnaLaterDate;
6574 08 Feb 22 nicklas 507         frm.reasonIfNoSpecimen.value = noSpecimen.reasonIfNoSpecimen;
6574 08 Feb 22 nicklas 508         Doc.element('noSpecimenTubes').innerHTML = '<i>Not found – NoSpecimen item already exists and can be updated</i>';
6574 08 Feb 22 nicklas 509         Doc.element('existingItemName').innerHTML = Strings.encodeTags(noSpecimen.name);
6151 26 Feb 21 nicklas 510         Doc.show('existingItemNameSection');
6574 08 Feb 22 nicklas 511         
6574 08 Feb 22 nicklas 512         frm.externalSpecimenExists.checked = noSpecimen.externalSpecimenExists == 'Yes';
6574 08 Feb 22 nicklas 513         frm.otherPathNote.value = noSpecimen.otherPathNote;
6574 08 Feb 22 nicklas 514         frm.liasonComment.value = noSpecimen.liasonComment;
2617 01 Sep 14 nicklas 515       }
2617 01 Sep 14 nicklas 516       else
2617 01 Sep 14 nicklas 517       {
6574 08 Feb 22 nicklas 518         Doc.element('noSpecimenTubes').innerHTML = '<i>Not found – NoSpecimen item will be created</i>';
6574 08 Feb 22 nicklas 519         Forms.selectListOption(frm.externalOperator, 'CMD');
2617 01 Sep 14 nicklas 520       }
6574 08 Feb 22 nicklas 521       Doc.show('noSpecimenSection');
6574 08 Feb 22 nicklas 522       persinfo.externalSpecimenExistsOnChange();
2617 01 Sep 14 nicklas 523     }
2617 01 Sep 14 nicklas 524
6996 20 Jan 23 nicklas 525     if (thisCaseExternalOperator)
6996 20 Jan 23 nicklas 526     {
6996 20 Jan 23 nicklas 527       Forms.selectListOption(frm.externalOperator, thisCaseExternalOperator);
6996 20 Jan 23 nicklas 528       if (frm.externalOperator.selectedIndex == 0)
6996 20 Jan 23 nicklas 529       {
6996 20 Jan 23 nicklas 530         frm.externalOperator[frm.externalOperator.length] = new Option(thisCaseExternalOperator, thisCaseExternalOperator, true, true);
6996 20 Jan 23 nicklas 531       }
6996 20 Jan 23 nicklas 532     }
6996 20 Jan 23 nicklas 533
2617 01 Sep 14 nicklas 534     if (caseInfo.coreBiopsies && caseInfo.coreBiopsies.length)
2617 01 Sep 14 nicklas 535     {
2617 01 Sep 14 nicklas 536       var html = '<i>';
2617 01 Sep 14 nicklas 537       for (var i = 0; i < caseInfo.coreBiopsies.length; i++)
2617 01 Sep 14 nicklas 538       {
2617 01 Sep 14 nicklas 539         var cb = caseInfo.coreBiopsies[i];
2617 01 Sep 14 nicklas 540         html += Strings.encodeTags(cb.name+' ('+cb.laterality) + ')<br>';
2617 01 Sep 14 nicklas 541       }
2617 01 Sep 14 nicklas 542       html += '</i>';
2617 01 Sep 14 nicklas 543       Doc.element('coreBiopsies').innerHTML = html;
2617 01 Sep 14 nicklas 544       Doc.show('coreBiopsiesSection');
2617 01 Sep 14 nicklas 545     }
2617 01 Sep 14 nicklas 546     
2617 01 Sep 14 nicklas 547     // Populate 'Sampling date' and 'RNA Later date' fields
2617 01 Sep 14 nicklas 548     if (thisCaseSamplingDate != null)
2617 01 Sep 14 nicklas 549     {
2617 01 Sep 14 nicklas 550       frm.samplingDate.value = thisCaseSamplingDate.substring(0, 8);
6574 08 Feb 22 nicklas 551       frm.samplingTime.value = thisCaseSamplingDate.substring(9, 13);
2617 01 Sep 14 nicklas 552     }
6574 08 Feb 22 nicklas 553     persinfo.samplingDateTimeOnChange();
2617 01 Sep 14 nicklas 554     if (thisCaseRNALaterDate != null)
2617 01 Sep 14 nicklas 555     {
2617 01 Sep 14 nicklas 556       frm.rnaLaterDate.value = thisCaseRNALaterDate.substring(0, 8);
2617 01 Sep 14 nicklas 557       frm.rnaLaterTime.value = thisCaseRNALaterDate.substring(9, 13);
2617 01 Sep 14 nicklas 558     }
6574 08 Feb 22 nicklas 559     persinfo.rnaLaterDateTimeOnChange();
2617 01 Sep 14 nicklas 560     
2617 01 Sep 14 nicklas 561     frm.pad.value = thisCasePAD;
6991 19 Jan 23 nicklas 562     frm.alternatePad.value = thisCaseAlternatePAD;
2617 01 Sep 14 nicklas 563     
2617 01 Sep 14 nicklas 564     Doc.show('caseSection');
2617 01 Sep 14 nicklas 565     
4930 22 Aug 18 nicklas 566     // Check the blood registration for consent information
5277 05 Feb 19 nicklas 567     if (!isPreCase && !copyConsentEnabled && bloodInfo && bloodInfo.consent)
4930 22 Aug 18 nicklas 568     {
4930 22 Aug 18 nicklas 569       var html = "From blood '" + Strings.encodeTags(bloodInfo.name);
4930 22 Aug 18 nicklas 570       html += "' (" + bloodInfo.consent;
4930 22 Aug 18 nicklas 571       if (bloodInfo.consentDate) html += '; ' + Reggie.reformatDate(bloodInfo.consentDate);
4930 22 Aug 18 nicklas 572       html += ')';
4930 22 Aug 18 nicklas 573       Doc.element('copyConsent.text').innerHTML = html;
4930 22 Aug 18 nicklas 574       frm.copyConsent.value = bloodInfo.id;
4930 22 Aug 18 nicklas 575       copyConsentEnabled = true;
4930 22 Aug 18 nicklas 576     }
4930 22 Aug 18 nicklas 577     
2617 01 Sep 14 nicklas 578     // Existing cases for this patient
2617 01 Sep 14 nicklas 579     var hasLeftCase = false;
2617 01 Sep 14 nicklas 580     var hasRightCase = false;
2617 01 Sep 14 nicklas 581     var hasUnknownCase = false;
2617 01 Sep 14 nicklas 582     if (patientInfo.cases && patientInfo.cases.length > 0)
2617 01 Sep 14 nicklas 583     {
2617 01 Sep 14 nicklas 584       var cases = '';
2617 01 Sep 14 nicklas 585       for (var i = 0; i < patientInfo.cases.length; i++)
2617 01 Sep 14 nicklas 586       {
2617 01 Sep 14 nicklas 587         var cc = patientInfo.cases[i];
2617 01 Sep 14 nicklas 588         if (cc.laterality == 'LEFT') 
2617 01 Sep 14 nicklas 589         {
2617 01 Sep 14 nicklas 590           if (hasLeftCase && !updateMode) 
2617 01 Sep 14 nicklas 591           {
2617 01 Sep 14 nicklas 592             Wizard.setInputStatus('laterality', 'warning', 'Two cases with laterality=LEFT');
2617 01 Sep 14 nicklas 593           }
2617 01 Sep 14 nicklas 594           hasLeftCase = true;
2617 01 Sep 14 nicklas 595         }
2617 01 Sep 14 nicklas 596         else if (cc.laterality == 'RIGHT') 
2617 01 Sep 14 nicklas 597         {
2617 01 Sep 14 nicklas 598           if (hasRightCase && !updateMode) 
2617 01 Sep 14 nicklas 599           {
2617 01 Sep 14 nicklas 600             Wizard.setInputStatus('laterality', 'warning', 'Two cases with laterality=RIGHT');
2617 01 Sep 14 nicklas 601           }
2617 01 Sep 14 nicklas 602           hasRightCase = true;
2617 01 Sep 14 nicklas 603         }
2617 01 Sep 14 nicklas 604         else
2617 01 Sep 14 nicklas 605         {
2617 01 Sep 14 nicklas 606           hasUnknownCase = true;  
2617 01 Sep 14 nicklas 607         }
2617 01 Sep 14 nicklas 608         if (!updateMode || cc.id == caseInfo.id)
2617 01 Sep 14 nicklas 609         {
6646 17 Mar 22 nicklas 610           cases += '<label><input type="radio" name="laterality" value="' + (updateMode ? cc.laterality || cc.id : cc.id) + '" id="laterality'+cc.id+'"';
2617 01 Sep 14 nicklas 611           if (cc.laterality == thisCaseLaterality) cases += ' checked';
2617 01 Sep 14 nicklas 612           cases += '>';
2617 01 Sep 14 nicklas 613           if (cc.laterality) 
2617 01 Sep 14 nicklas 614           {
2617 01 Sep 14 nicklas 615             cases += cc.laterality;
2617 01 Sep 14 nicklas 616           }
2617 01 Sep 14 nicklas 617           else
2617 01 Sep 14 nicklas 618           {
2617 01 Sep 14 nicklas 619             cases += '<i>unknown laterality</i>';
2617 01 Sep 14 nicklas 620           }
5277 05 Feb 19 nicklas 621           cases += '</label>';
2617 01 Sep 14 nicklas 622           if (!updateMode)
2617 01 Sep 14 nicklas 623           {
2617 01 Sep 14 nicklas 624             cases += ' [merge with ' + Strings.encodeTags(cc.name) + ']';
2617 01 Sep 14 nicklas 625           }
5277 05 Feb 19 nicklas 626           cases += '<br>';
2617 01 Sep 14 nicklas 627         }
2617 01 Sep 14 nicklas 628       }
2617 01 Sep 14 nicklas 629       
6646 17 Mar 22 nicklas 630       // Create the 'new case' option (which may also be an existing pre-registered consent)
6646 17 Mar 22 nicklas 631       var newCaseText = isPreCase ? ' [<i>pre-registered consent: ' + persinfo.toConsentString(caseInfo) + '</i>]' : ' [<i>new case</i>]';
6646 17 Mar 22 nicklas 632       if (!hasLeftCase)
2617 01 Sep 14 nicklas 633       {
6646 17 Mar 22 nicklas 634         cases += '<label><input type="radio" name="laterality" value="LEFT" id="lateralityLeft"';
6646 17 Mar 22 nicklas 635         if (thisCaseLaterality == 'LEFT') cases += ' checked';
6646 17 Mar 22 nicklas 636         cases += '>LEFT</label>';
6646 17 Mar 22 nicklas 637         if (!updateMode) cases += newCaseText;
6646 17 Mar 22 nicklas 638         cases += '<br>';
2617 01 Sep 14 nicklas 639       }
6646 17 Mar 22 nicklas 640       if (!hasRightCase)
6646 17 Mar 22 nicklas 641       {
6646 17 Mar 22 nicklas 642         cases += '<label><input type="radio" name="laterality" value="RIGHT" id="lateralityRight"';
6646 17 Mar 22 nicklas 643         if (thisCaseLaterality == 'RIGHT') cases += ' checked';
6646 17 Mar 22 nicklas 644         cases += '>RIGHT</label>';
6646 17 Mar 22 nicklas 645         if (!updateMode) cases += newCaseText;
6646 17 Mar 22 nicklas 646         cases += '<br>';
6646 17 Mar 22 nicklas 647       }
6646 17 Mar 22 nicklas 648       if (!updateMode && !hasLeftCase && !hasRightCase)
6646 17 Mar 22 nicklas 649       {
6646 17 Mar 22 nicklas 650         cases += '<label><input type="radio" name="laterality" value="" id="lateralityUnknown"';
6646 17 Mar 22 nicklas 651         if (thisCaseLaterality == null) cases += ' checked';
6646 17 Mar 22 nicklas 652         cases += '><i>unknown laterality</i></label>' + newCaseText;
6646 17 Mar 22 nicklas 653         cases += '<br>'
6646 17 Mar 22 nicklas 654       }
2617 01 Sep 14 nicklas 655       
6646 17 Mar 22 nicklas 656       if (!isPreCase && !updateMode && !copyConsentEnabled && patientInfo.cases[0].consent)
6646 17 Mar 22 nicklas 657       {
6646 17 Mar 22 nicklas 658         var c = patientInfo.cases[0];
6646 17 Mar 22 nicklas 659         var html = "From case '" + Strings.encodeTags(c.name);
6646 17 Mar 22 nicklas 660         html += "' (" + persinfo.toConsentString(c) + ')';
6646 17 Mar 22 nicklas 661         Doc.element('copyConsent.text').innerHTML = html;
6646 17 Mar 22 nicklas 662         frm.copyConsent.value = patientInfo.cases[0].id;
6646 17 Mar 22 nicklas 663         copyConsentEnabled = true;
6646 17 Mar 22 nicklas 664       }
6646 17 Mar 22 nicklas 665       
2617 01 Sep 14 nicklas 666       if (updateMode)
2617 01 Sep 14 nicklas 667       {
2617 01 Sep 14 nicklas 668         if (caseInfo.merged)
2617 01 Sep 14 nicklas 669         {
2617 01 Sep 14 nicklas 670           Doc.element('step-3-title').innerHTML = 'Update case \''+Strings.encodeTags(caseInfo.originalName)+'\' (which is merged with case \'' + Strings.encodeTags(caseInfo.name) + '\')';
2617 01 Sep 14 nicklas 671         }
2617 01 Sep 14 nicklas 672         else
2617 01 Sep 14 nicklas 673         {
2617 01 Sep 14 nicklas 674           Doc.element('step-3-title').innerHTML = 'Update case \''+Strings.encodeTags(caseInfo.name)+'\'';
2617 01 Sep 14 nicklas 675         }
2617 01 Sep 14 nicklas 676         
2617 01 Sep 14 nicklas 677       }
2617 01 Sep 14 nicklas 678       else if (patientInfo.cases.length == 2)
2617 01 Sep 14 nicklas 679       {
2617 01 Sep 14 nicklas 680         Doc.element('step-3-title').innerHTML = 'Merge with existing case';  
2617 01 Sep 14 nicklas 681       }
2617 01 Sep 14 nicklas 682       else if (patientInfo.cases.length > 0)
2617 01 Sep 14 nicklas 683       {
2617 01 Sep 14 nicklas 684         Doc.element('step-3-title').innerHTML = 'Create new case or merge with existing case';
2617 01 Sep 14 nicklas 685       }
2617 01 Sep 14 nicklas 686       
2617 01 Sep 14 nicklas 687       Doc.element('laterality.input').innerHTML = cases;
2617 01 Sep 14 nicklas 688     }
2617 01 Sep 14 nicklas 689     
2617 01 Sep 14 nicklas 690     for (var i = 0; i < frm.laterality.length; i++)
2617 01 Sep 14 nicklas 691     {
2617 01 Sep 14 nicklas 692       Events.addEventHandler(frm.laterality[i], 'click', persinfo.lateralityOnChange);
2617 01 Sep 14 nicklas 693     }
2617 01 Sep 14 nicklas 694     persinfo.lateralityOnChange();
2617 01 Sep 14 nicklas 695
2617 01 Sep 14 nicklas 696     Wizard.setCurrentStep(3);
2617 01 Sep 14 nicklas 697     if (updateMode)
2617 01 Sep 14 nicklas 698     {
2617 01 Sep 14 nicklas 699       Doc.show('goupdate');
2617 01 Sep 14 nicklas 700     }
2617 01 Sep 14 nicklas 701     else
2617 01 Sep 14 nicklas 702     {
2617 01 Sep 14 nicklas 703       Doc.show('goregister');
2617 01 Sep 14 nicklas 704     }
2617 01 Sep 14 nicklas 705     Doc.show('gocancel');
2617 01 Sep 14 nicklas 706     if (lateralityIsValid) frm.pad.focus();
2617 01 Sep 14 nicklas 707   }
2617 01 Sep 14 nicklas 708   
6824 30 Aug 22 nicklas 709   persinfo.externalSpecimenExistsOnChange = function()
6574 08 Feb 22 nicklas 710   {
6574 08 Feb 22 nicklas 711     var frm = document.forms['reggie'];
6574 08 Feb 22 nicklas 712     persinfo.externalSpecimenExists(frm.externalSpecimenExists.checked);
6574 08 Feb 22 nicklas 713     frm.samplingDate.focus();
6574 08 Feb 22 nicklas 714   }
6574 08 Feb 22 nicklas 715   
6574 08 Feb 22 nicklas 716   persinfo.externalSpecimenExists = function(enabled)
6574 08 Feb 22 nicklas 717   {
6574 08 Feb 22 nicklas 718     var frm = document.forms['reggie'];
6574 08 Feb 22 nicklas 719     if (enabled)
6574 08 Feb 22 nicklas 720     {
6574 08 Feb 22 nicklas 721       Doc.show('samplingTimeField', 'inline');
6574 08 Feb 22 nicklas 722       frm.samplingTime.disabled = false;
6574 08 Feb 22 nicklas 723       Doc.show('rnaLaterDateSection');
6574 08 Feb 22 nicklas 724       Doc.hide('reasonIfNoSpecimenSection');
6574 08 Feb 22 nicklas 725       Doc.show('otherPathNoteSection');
6574 08 Feb 22 nicklas 726       Doc.show('externalOperatorSection');
6991 19 Jan 23 nicklas 727       Doc.show('alternatePadSection');
6574 08 Feb 22 nicklas 728       Doc.show('liasonCommentSection');
6574 08 Feb 22 nicklas 729     }
6574 08 Feb 22 nicklas 730     else
6574 08 Feb 22 nicklas 731     {
6574 08 Feb 22 nicklas 732       Doc.hide('samplingTimeField');
6574 08 Feb 22 nicklas 733       frm.samplingTime.disabled = true;
6574 08 Feb 22 nicklas 734       Doc.hide('rnaLaterDateSection');
6574 08 Feb 22 nicklas 735       Doc.show('reasonIfNoSpecimenSection');
6574 08 Feb 22 nicklas 736       Doc.hide('otherPathNoteSection');
6574 08 Feb 22 nicklas 737       Doc.hide('externalOperatorSection');
6991 19 Jan 23 nicklas 738       Doc.hide('alternatePadSection');
6574 08 Feb 22 nicklas 739       Doc.hide('liasonCommentSection');
6574 08 Feb 22 nicklas 740     }
6574 08 Feb 22 nicklas 741   }
6574 08 Feb 22 nicklas 742   
6998 20 Jan 23 nicklas 743   persinfo.downloadJsonFile = function(event)
6998 20 Jan 23 nicklas 744   {
6998 20 Jan 23 nicklas 745     var fileId = Data.get(event.currentTarget, 'file-id');
6998 20 Jan 23 nicklas 746     var fileName = Data.get(event.currentTarget, 'file-name');
6998 20 Jan 23 nicklas 747
6998 20 Jan 23 nicklas 748     var url = '../ExternalSpecimen.servlet?ID='+App.getSessionId();
6998 20 Jan 23 nicklas 749     url += '&cmd=DownloadJsonFile';
6998 20 Jan 23 nicklas 750     url += '&fileId='+fileId;
6998 20 Jan 23 nicklas 751     
6998 20 Jan 23 nicklas 752     Dialogs.openPopup(url, fileName, 800, 800);
6998 20 Jan 23 nicklas 753   }
6998 20 Jan 23 nicklas 754
6998 20 Jan 23 nicklas 755   
6510 03 Dec 21 nicklas 756   persinfo.createSpecimenHtml = function()
6151 26 Feb 21 nicklas 757   {
6510 03 Dec 21 nicklas 758     var html = '';
6510 03 Dec 21 nicklas 759     for (var i = 0; i < caseInfo.specimen.length; i++)
6151 26 Feb 21 nicklas 760     {
6510 03 Dec 21 nicklas 761       var specimen = caseInfo.specimen[i];
6510 03 Dec 21 nicklas 762       var isYellow = specimen.YellowLabel != null;
6510 03 Dec 21 nicklas 763       var isPaused = specimen.bioWell && specimen.bioWell.bioPlate.name.indexOf('PSp') == 0;
6510 03 Dec 21 nicklas 764       specimen.YellowLabelOriginal = specimen.YellowLabel;
6510 03 Dec 21 nicklas 765
6510 03 Dec 21 nicklas 766       html += '<tr class="section-header">';
6510 03 Dec 21 nicklas 767       html += '<td colspan="4">Specimen Tube '+Strings.encodeTags(specimen.name)+'</td>';
6510 03 Dec 21 nicklas 768       html += '</tr>';
6510 03 Dec 21 nicklas 769       
6510 03 Dec 21 nicklas 770       html += '<tr>';
6510 03 Dec 21 nicklas 771       html += '<td class="subprompt">Laterality</td>';
6510 03 Dec 21 nicklas 772       html += '<td class="input">'+Strings.encodeTags(specimen.laterality || 'unknown')+'</td>';
6510 03 Dec 21 nicklas 773       html += '<td class="status" id="laterality.'+specimen.id+'.status"></td>';
6510 03 Dec 21 nicklas 774       html += '<td class="help"><span id="laterality.'+specimen.id+'.message" class="message"></span></td>';    
6510 03 Dec 21 nicklas 775       html += '</tr>';
6998 20 Jan 23 nicklas 776       
6998 20 Jan 23 nicklas 777       if (specimen.externalRef)
6998 20 Jan 23 nicklas 778       {
6998 20 Jan 23 nicklas 779         html += '<tr>';
6998 20 Jan 23 nicklas 780         html += '<td class="subprompt">External reference</td>';
6998 20 Jan 23 nicklas 781         html += '<td class="input" colspan="2" style="background-color: #f0f080; padding: 4px;">';
6998 20 Jan 23 nicklas 782         html += Strings.encodeTags(specimen.externalRef);
6998 20 Jan 23 nicklas 783         if (specimen.importedFrom)
6998 20 Jan 23 nicklas 784         {
6998 20 Jan 23 nicklas 785           var file = specimen.importedFrom;
6998 20 Jan 23 nicklas 786           html += ' <span class="link download-file" data-file-id="'+file.id+'" data-file-name="'+file.name+'"' +
6998 20 Jan 23 nicklas 787             ' title="View the raw data from the JSON file that was imported"><img src="../images/download.png"></span>';
6998 20 Jan 23 nicklas 788         }
6998 20 Jan 23 nicklas 789         html += '</td>';
6998 20 Jan 23 nicklas 790         html += '<td class="help">The JSON file that was imported to this specimen.</td>';    
6998 20 Jan 23 nicklas 791         html += '</tr>';
6998 20 Jan 23 nicklas 792       }
6510 03 Dec 21 nicklas 793
6510 03 Dec 21 nicklas 794       html += '<tr id="specimen-row.'+specimen.id+'" class="specimen-tube'+(isYellow?' yellow':'')+(isPaused?' paused':'')+'">';
6510 03 Dec 21 nicklas 795       html += '<td class="subprompt yellow-tag"><label for="yellow.'+specimen.id+'">Yellow label</label></td>';
6510 03 Dec 21 nicklas 796       html += '<td class="input">';
6510 03 Dec 21 nicklas 797       html += '<input type="checkbox" name="yellow.'+specimen.id+'" id="yellow.'+specimen.id+'"';
6510 03 Dec 21 nicklas 798       html += ' data-specimen-id="'+specimen.id+'"';
6510 03 Dec 21 nicklas 799       html += '></td>';
6510 03 Dec 21 nicklas 800       html += '<td class="status"></td>';
6510 03 Dec 21 nicklas 801       html += '<td class="help"></td>';    
6510 03 Dec 21 nicklas 802       html += '</tr>';
6510 03 Dec 21 nicklas 803
6510 03 Dec 21 nicklas 804       html += '<tr>'
6510 03 Dec 21 nicklas 805       html += '<td class="subprompt">Biopsy type</td>';
6510 03 Dec 21 nicklas 806       html += '<td class="input">';
6510 03 Dec 21 nicklas 807       html += '<select name="biopsyType.'+specimen.id+'" id="biopsyType.'+specimen.id+'">';
6510 03 Dec 21 nicklas 808       html += '<option selected value="">unknown';
6510 03 Dec 21 nicklas 809       html += '<option value="SpecimenSurgery">SpecimenSurgery';
6510 03 Dec 21 nicklas 810       html += '<option value="SpecimenCoreBiopsy">SpecimenCoreBiopsy';
6510 03 Dec 21 nicklas 811       html += '<option value="SpecimenCoreBiopsy2nd">SpecimenCoreBiopsy2nd';
6510 03 Dec 21 nicklas 812       html += '<option value="SpecimenFineNeedleAspiration">SpecimenFineNeedleAspiration';
6510 03 Dec 21 nicklas 813       html += '</select>';
6510 03 Dec 21 nicklas 814       html += '</td>';
6510 03 Dec 21 nicklas 815       html += '<td class="status" id="biopsyType.'+specimen.id+'.status"></td>';
6510 03 Dec 21 nicklas 816       html += '<td class="help"><span id="biopsyType.'+specimen.id+'.message" class="message"></span></td>';    
6510 03 Dec 21 nicklas 817       html += '</tr>';
6510 03 Dec 21 nicklas 818
6510 03 Dec 21 nicklas 819       
6510 03 Dec 21 nicklas 820       html += '<tr>'
6510 03 Dec 21 nicklas 821       html += '<td class="subprompt">Specimen type</td>';
6510 03 Dec 21 nicklas 822       html += '<td class="input">';
6510 03 Dec 21 nicklas 823       html += '<select name="specimenType.'+specimen.id+'" id="specimenType.'+specimen.id+'">';
6510 03 Dec 21 nicklas 824       html += '<option selected value="">unknown';
6510 03 Dec 21 nicklas 825       html += '<option value="Primary">Primary';
6510 03 Dec 21 nicklas 826       html += '<option value="LymphnodeRegional">LymphnodeRegional';        
6510 03 Dec 21 nicklas 827       html += '<option value="MetastasisDistant">MetastasisDistant';
6510 03 Dec 21 nicklas 828       html += '<option value="RecurrenceLocal">RecurrenceLocal';
6510 03 Dec 21 nicklas 829       html += '<option value="RecurrenceRegional">RecurrenceRegional';
6510 03 Dec 21 nicklas 830       html += '<option value="Normal">Normal';
6510 03 Dec 21 nicklas 831       html += '<option value="Uncertain">Uncertain';
6510 03 Dec 21 nicklas 832       html += '</select>';
6510 03 Dec 21 nicklas 833       html += '</td>';
6510 03 Dec 21 nicklas 834       html += '<td class="status" id="specimenType.'+specimen.id+'.status"></td>';
6510 03 Dec 21 nicklas 835       html += '<td class="help"><span id="specimenType.'+specimen.id+'.message" class="message"></span></td>';    
6510 03 Dec 21 nicklas 836       html += '</tr>';
6510 03 Dec 21 nicklas 837
6510 03 Dec 21 nicklas 838       html += '<tr class="align-top">';
6510 03 Dec 21 nicklas 839       html += '<td class="subprompt">Other path note</td>';
6510 03 Dec 21 nicklas 840       html += '<td class="input"><textarea rows="3" name="otherPathNote.'+specimen.id+'" id="otherPathNote.'+specimen.id+'"></textarea></td>';
6510 03 Dec 21 nicklas 841       html += '<td class="status" id="otherPathNote.'+specimen.id+'.status"></td>';
6510 03 Dec 21 nicklas 842       html += '<td class="help"><span id="otherPathNote.'+specimen.id+'.message" class="message"></span>In this field, enter ALL text noted on the referral form by the pathologist.</td>';    
6510 03 Dec 21 nicklas 843       html += '</tr>';
6510 03 Dec 21 nicklas 844       
6510 03 Dec 21 nicklas 845       html += '<tr class="align-top">';
6510 03 Dec 21 nicklas 846       html += '<td class="subprompt">Operator delivery comment</td>';
6510 03 Dec 21 nicklas 847       html += '<td class="input"><textarea rows="3" name="comment.'+specimen.id+'" id="comment.'+specimen.id+'"></textarea></td>';
6510 03 Dec 21 nicklas 848       html += '<td class="status" id="comment.'+specimen.id+'.status"></td>';
6510 03 Dec 21 nicklas 849       html += '<td class="help"><span id="comment.'+specimen.id+'.message" class="message"></span>In this field, enter information specific for the specimen tube.</td>';    
6510 03 Dec 21 nicklas 850       html += '</tr>';
6151 26 Feb 21 nicklas 851     }
6510 03 Dec 21 nicklas 852     return html;
6151 26 Feb 21 nicklas 853   }
6151 26 Feb 21 nicklas 854   
5277 05 Feb 19 nicklas 855   persinfo.toConsentString = function(item)
5277 05 Feb 19 nicklas 856   {
5277 05 Feb 19 nicklas 857     var s = item.consent;
5277 05 Feb 19 nicklas 858     if (item.consentDate) 
5277 05 Feb 19 nicklas 859     {
5277 05 Feb 19 nicklas 860       s += '; ' + Reggie.reformatDate(item.consentDate);
5277 05 Feb 19 nicklas 861     }
5277 05 Feb 19 nicklas 862     return s;
5277 05 Feb 19 nicklas 863   }
2617 01 Sep 14 nicklas 864   
3726 28 Jan 16 nicklas 865   persinfo.yellowOnChange = function(event)
3726 28 Jan 16 nicklas 866   {
3726 28 Jan 16 nicklas 867     var spId = Data.get(event.currentTarget, 'specimen-id');
3726 28 Jan 16 nicklas 868     Doc.addOrRemoveClass('specimen-row.'+spId, 'yellow', event.currentTarget.checked);
3726 28 Jan 16 nicklas 869   }
3726 28 Jan 16 nicklas 870   
2617 01 Sep 14 nicklas 871   persinfo.lateralityOnChange = function()
2617 01 Sep 14 nicklas 872   {
2617 01 Sep 14 nicklas 873     lateralityIsValid = false;
2617 01 Sep 14 nicklas 874     var updateMode = caseInfo.id;
2617 01 Sep 14 nicklas 875     
2617 01 Sep 14 nicklas 876     // Check selected laterality against specimen tubes
2617 01 Sep 14 nicklas 877     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 878     var selectedLaterality = Forms.getCheckedRadio(frm.laterality);
2617 01 Sep 14 nicklas 879     
2617 01 Sep 14 nicklas 880     // No laterality/case selected
2617 01 Sep 14 nicklas 881     if (selectedLaterality == null) 
2617 01 Sep 14 nicklas 882     {
2617 01 Sep 14 nicklas 883       Wizard.setInputStatus('laterality', 'invalid', 'Not selected');
2617 01 Sep 14 nicklas 884       return;
2617 01 Sep 14 nicklas 885     }
2617 01 Sep 14 nicklas 886     
2617 01 Sep 14 nicklas 887     var numCases = patientInfo.cases ? patientInfo.cases.length : 0;
2617 01 Sep 14 nicklas 888     Wizard.setInputStatus('laterality', 'valid', updateMode && numCases > 1 ? 'NOTE! Some alternatives may be missing if there is another case for the patient.' : '');
2617 01 Sep 14 nicklas 889     lateralityIsValid = true;
2617 01 Sep 14 nicklas 890       
2617 01 Sep 14 nicklas 891     var laterality = selectedLaterality.value;
4930 22 Aug 18 nicklas 892     var mergeWithCase = laterality.match(/\d+/);
4930 22 Aug 18 nicklas 893     if (mergeWithCase)
2617 01 Sep 14 nicklas 894     {
4930 22 Aug 18 nicklas 895       // 'laterality' is the ID of an existing case
2617 01 Sep 14 nicklas 896       for (var i = 0; i < patientInfo.cases.length; i++)
2617 01 Sep 14 nicklas 897       {
2617 01 Sep 14 nicklas 898         var cse = patientInfo.cases[i];
2617 01 Sep 14 nicklas 899         if (cse.id == laterality)
2617 01 Sep 14 nicklas 900         {
2617 01 Sep 14 nicklas 901           laterality = cse.laterality;
2617 01 Sep 14 nicklas 902           break;
2617 01 Sep 14 nicklas 903         }
2617 01 Sep 14 nicklas 904       }
2617 01 Sep 14 nicklas 905     }
2617 01 Sep 14 nicklas 906     else if (laterality == '') 
2617 01 Sep 14 nicklas 907     {
2617 01 Sep 14 nicklas 908       laterality = null;
2617 01 Sep 14 nicklas 909     }
2617 01 Sep 14 nicklas 910     
4930 22 Aug 18 nicklas 911     // If the selected laterality/case is a new case it is possible to copy consent
4930 22 Aug 18 nicklas 912     Doc.showHide('copyConsentSection', copyConsentEnabled && !mergeWithCase);
2617 01 Sep 14 nicklas 913       
2617 01 Sep 14 nicklas 914     // No specimen tubes?
2617 01 Sep 14 nicklas 915     if (caseInfo.specimen)
2617 01 Sep 14 nicklas 916     {
2617 01 Sep 14 nicklas 917       for (var i = 0; i < caseInfo.specimen.length; i++)
2617 01 Sep 14 nicklas 918       {
2617 01 Sep 14 nicklas 919         var specimen = caseInfo.specimen[i];
2617 01 Sep 14 nicklas 920         if (specimen.laterality != laterality)
2617 01 Sep 14 nicklas 921         {
6646 17 Mar 22 nicklas 922           Wizard.setInputStatus('laterality', 'valid', 'Specimen tubes are updated to: ' + laterality)
2617 01 Sep 14 nicklas 923           return;
2617 01 Sep 14 nicklas 924         }
2617 01 Sep 14 nicklas 925       }
2617 01 Sep 14 nicklas 926     }
2617 01 Sep 14 nicklas 927     
2617 01 Sep 14 nicklas 928     if (caseInfo.coreBiopsies)
2617 01 Sep 14 nicklas 929     {
2617 01 Sep 14 nicklas 930       for (var i = 0; i < caseInfo.coreBiopsies.length; i++)
2617 01 Sep 14 nicklas 931       {
2617 01 Sep 14 nicklas 932         var cb = caseInfo.coreBiopsies[i];
2617 01 Sep 14 nicklas 933         if (cb.laterality != laterality)
2617 01 Sep 14 nicklas 934         {
6646 17 Mar 22 nicklas 935           Wizard.setInputStatus('laterality', 'valid', 'Core biopsies are updated to: ' + laterality);
2617 01 Sep 14 nicklas 936           return;
2617 01 Sep 14 nicklas 937         }
2617 01 Sep 14 nicklas 938       }
2617 01 Sep 14 nicklas 939     }
2617 01 Sep 14 nicklas 940     
2617 01 Sep 14 nicklas 941   }
2617 01 Sep 14 nicklas 942
2617 01 Sep 14 nicklas 943   persinfo.padOnChange = function()
2617 01 Sep 14 nicklas 944   {
2617 01 Sep 14 nicklas 945     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 946     var PAD = frm.pad.value;
2617 01 Sep 14 nicklas 947     if (PAD == '')
2617 01 Sep 14 nicklas 948     {
2617 01 Sep 14 nicklas 949       Wizard.setInputStatus('pad', 'warning', 'Missing');
2617 01 Sep 14 nicklas 950       return;
2617 01 Sep 14 nicklas 951     }
2617 01 Sep 14 nicklas 952     frm.pad.value = PAD.replace(/\+/, '-');
2617 01 Sep 14 nicklas 953     Wizard.setInputStatus('pad', 'valid');
2617 01 Sep 14 nicklas 954   }
2617 01 Sep 14 nicklas 955
2617 01 Sep 14 nicklas 956   persinfo.samplingDateTimeFocus = function(event)
2617 01 Sep 14 nicklas 957   {
2617 01 Sep 14 nicklas 958     if (event.keyCode == 13)
2617 01 Sep 14 nicklas 959     {
2617 01 Sep 14 nicklas 960       var focusTo = caseInfo.specimen && caseInfo.specimen.length > 0 ? 'rnaLaterDate' : 'reasonIfNoSpecimen'
2617 01 Sep 14 nicklas 961       Doc.element(focusTo).focus();
2617 01 Sep 14 nicklas 962     }
2617 01 Sep 14 nicklas 963   }
2617 01 Sep 14 nicklas 964   
2617 01 Sep 14 nicklas 965   persinfo.samplingDateTimeOnChange = function()
2617 01 Sep 14 nicklas 966   {
2617 01 Sep 14 nicklas 967     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 968     samplingDateIsValid = false;
2617 01 Sep 14 nicklas 969     Wizard.setInputStatus('samplingDate');
2617 01 Sep 14 nicklas 970     
2617 01 Sep 14 nicklas 971     var samplingDate = frm.samplingDate.value;
2617 01 Sep 14 nicklas 972     var samplingTime = frm.samplingTime.disabled ? null : frm.samplingTime.value;
2617 01 Sep 14 nicklas 973     
2617 01 Sep 14 nicklas 974     if (samplingDate == '')
2617 01 Sep 14 nicklas 975     {
2617 01 Sep 14 nicklas 976       Wizard.setInputStatus('samplingDate', 'warning', 'Missing date');
2617 01 Sep 14 nicklas 977     }
2617 01 Sep 14 nicklas 978     else
2617 01 Sep 14 nicklas 979     {
2617 01 Sep 14 nicklas 980       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2617 01 Sep 14 nicklas 981       samplingDate = Reggie.autoFillDate(samplingDate, true);
2617 01 Sep 14 nicklas 982       frm.samplingDate.value = samplingDate;
2617 01 Sep 14 nicklas 983
2617 01 Sep 14 nicklas 984       if (!frm.samplingTime.disabled)
2617 01 Sep 14 nicklas 985       {
2617 01 Sep 14 nicklas 986         samplingTime = Reggie.autoFillTime(samplingTime);
2617 01 Sep 14 nicklas 987         frm.samplingTime.value = samplingTime;
2617 01 Sep 14 nicklas 988       }
2617 01 Sep 14 nicklas 989       
2617 01 Sep 14 nicklas 990       if (samplingDate != '' && !Dates.isDate(samplingDate, 'yyyyMMdd'))
2617 01 Sep 14 nicklas 991       {
2617 01 Sep 14 nicklas 992         Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid date');
2617 01 Sep 14 nicklas 993         return;
2617 01 Sep 14 nicklas 994       }
2617 01 Sep 14 nicklas 995       if (frm.rnaLaterDate.value == '') frm.rnaLaterDate.value = samplingDate;
2617 01 Sep 14 nicklas 996       
2617 01 Sep 14 nicklas 997       if (!frm.samplingTime.disabled)
2617 01 Sep 14 nicklas 998       {
2617 01 Sep 14 nicklas 999         if (!Dates.isDate(samplingDate + ' ' + samplingTime, 'yyyyMMdd HHmm'))
2617 01 Sep 14 nicklas 1000         {
2617 01 Sep 14 nicklas 1001           if (samplingDate != '') 
2617 01 Sep 14 nicklas 1002           {
2617 01 Sep 14 nicklas 1003             Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid time');
2617 01 Sep 14 nicklas 1004           }
2617 01 Sep 14 nicklas 1005           return;
2617 01 Sep 14 nicklas 1006         }
2617 01 Sep 14 nicklas 1007       }
2617 01 Sep 14 nicklas 1008       Wizard.setInputStatus('samplingDate', 'valid');
2617 01 Sep 14 nicklas 1009     }
2617 01 Sep 14 nicklas 1010     samplingDateIsValid = true;
2617 01 Sep 14 nicklas 1011   }
2617 01 Sep 14 nicklas 1012
2617 01 Sep 14 nicklas 1013   persinfo.rnaLaterDateTimeOnChange = function()
2617 01 Sep 14 nicklas 1014   {
2617 01 Sep 14 nicklas 1015     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 1016     rnaLaterDateIsValid = false;
2617 01 Sep 14 nicklas 1017     Wizard.setInputStatus('rnaLaterDate');
2617 01 Sep 14 nicklas 1018     
2617 01 Sep 14 nicklas 1019     var rnaLaterDate = frm.rnaLaterDate.value;
2617 01 Sep 14 nicklas 1020     var rnaLaterTime = frm.rnaLaterTime.value;
2617 01 Sep 14 nicklas 1021     var rnaLaterTimestamp;
2617 01 Sep 14 nicklas 1022     
2617 01 Sep 14 nicklas 1023     if (rnaLaterDate != '' || rnaLaterTime != '')
2617 01 Sep 14 nicklas 1024     {
2617 01 Sep 14 nicklas 1025       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2617 01 Sep 14 nicklas 1026       rnaLaterDate = Reggie.autoFillDate(rnaLaterDate, true);
2617 01 Sep 14 nicklas 1027       frm.rnaLaterDate.value = rnaLaterDate;
2617 01 Sep 14 nicklas 1028
2617 01 Sep 14 nicklas 1029       rnaLaterTime = Reggie.autoFillTime(rnaLaterTime);
2617 01 Sep 14 nicklas 1030       frm.rnaLaterTime.value = rnaLaterTime;
2617 01 Sep 14 nicklas 1031       
2617 01 Sep 14 nicklas 1032       if (!Dates.isDate(rnaLaterDate, 'yyyyMMdd'))
2617 01 Sep 14 nicklas 1033       {
2617 01 Sep 14 nicklas 1034         Wizard.setInputStatus('rnaLaterDate', 'invalid', 'Not a valid date');
2617 01 Sep 14 nicklas 1035         return;
2617 01 Sep 14 nicklas 1036       }
2617 01 Sep 14 nicklas 1037       rnaLaterTimestamp = Dates.parseString(rnaLaterDate + ' ' + rnaLaterTime, 'yyyyMMdd HHmm');
2617 01 Sep 14 nicklas 1038       if (rnaLaterTimestamp == null)
2617 01 Sep 14 nicklas 1039       {
2617 01 Sep 14 nicklas 1040         if (rnaLaterDate != '') 
2617 01 Sep 14 nicklas 1041         {
2801 13 Oct 14 nicklas 1042           Wizard.setInputStatus('rnaLaterDate', 'invalid', 'Not a valid time');
2617 01 Sep 14 nicklas 1043         }
2617 01 Sep 14 nicklas 1044         return;
2617 01 Sep 14 nicklas 1045       }
2617 01 Sep 14 nicklas 1046       Wizard.setInputStatus('rnaLaterDate', 'valid');
2617 01 Sep 14 nicklas 1047     }
2617 01 Sep 14 nicklas 1048     
2617 01 Sep 14 nicklas 1049     rnaLaterDateIsValid = true;
2617 01 Sep 14 nicklas 1050
2617 01 Sep 14 nicklas 1051     if (samplingDateIsValid && rnaLaterTimestamp && !frm.samplingTime.disabled)
2617 01 Sep 14 nicklas 1052     {
2617 01 Sep 14 nicklas 1053       var samplingTimestamp = Dates.parseString(frm.samplingDate.value + ' ' + frm.samplingTime.value, 'yyyyMMdd Hmm');
2617 01 Sep 14 nicklas 1054       if (samplingTimestamp)
2617 01 Sep 14 nicklas 1055       {
2617 01 Sep 14 nicklas 1056         if (rnaLaterTimestamp.getDate() != samplingTimestamp.getDate())
2617 01 Sep 14 nicklas 1057         {
2617 01 Sep 14 nicklas 1058           Wizard.setInputStatus('rnaLaterDate', 'warning', 'Sampling and RNA later dates are different');
2617 01 Sep 14 nicklas 1059         }
2617 01 Sep 14 nicklas 1060         else if (rnaLaterTimestamp.getTime() < samplingTimestamp.getTime())
2617 01 Sep 14 nicklas 1061         {
2617 01 Sep 14 nicklas 1062           Wizard.setInputStatus('rnaLaterDate', 'warning', 'RNA later time is before Sampling time');
2617 01 Sep 14 nicklas 1063         }
2617 01 Sep 14 nicklas 1064       }
2617 01 Sep 14 nicklas 1065     }
2617 01 Sep 14 nicklas 1066   }
2617 01 Sep 14 nicklas 1067
5318 28 Feb 19 nicklas 1068   persinfo.noReferralFormOnChange = function()
5318 28 Feb 19 nicklas 1069   {
5318 28 Feb 19 nicklas 1070     var frm = document.forms['reggie'];
5318 28 Feb 19 nicklas 1071     if (frm.noReferralForm.checked)
5318 28 Feb 19 nicklas 1072     {
5318 28 Feb 19 nicklas 1073       frm.reasonIfNoSpecimen.disabled = true;
5318 28 Feb 19 nicklas 1074       frm.reasonIfNoSpecimen.oldValue = frm.reasonIfNoSpecimen.value;
5318 28 Feb 19 nicklas 1075       frm.reasonIfNoSpecimen.value = 'no_referral_form';
5318 28 Feb 19 nicklas 1076     }
5318 28 Feb 19 nicklas 1077     else
5318 28 Feb 19 nicklas 1078     {
5318 28 Feb 19 nicklas 1079       frm.reasonIfNoSpecimen.disabled = false;
5318 28 Feb 19 nicklas 1080       frm.reasonIfNoSpecimen.value = frm.reasonIfNoSpecimen.oldValue || '';
5318 28 Feb 19 nicklas 1081     }
5318 28 Feb 19 nicklas 1082   }
5318 28 Feb 19 nicklas 1083   
6991 19 Jan 23 nicklas 1084   persinfo.swapPad = function()
6991 19 Jan 23 nicklas 1085   {
6991 19 Jan 23 nicklas 1086     var frm = document.forms['reggie'];
6991 19 Jan 23 nicklas 1087     var pad = frm.pad.value;
6991 19 Jan 23 nicklas 1088     var alternatePad = frm.alternatePad.value;
6991 19 Jan 23 nicklas 1089     frm.pad.value = alternatePad;
6991 19 Jan 23 nicklas 1090     frm.alternatePad.value = pad;
6991 19 Jan 23 nicklas 1091     persinfo.padOnChange();
6991 19 Jan 23 nicklas 1092   }
6991 19 Jan 23 nicklas 1093   
2617 01 Sep 14 nicklas 1094   persinfo.validateStep3 = function(event)
2617 01 Sep 14 nicklas 1095   {
6574 08 Feb 22 nicklas 1096     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 1097     var isValid = lateralityIsValid && samplingDateIsValid;
2617 01 Sep 14 nicklas 1098     if (caseInfo.specimen && caseInfo.specimen.length > 0)
2617 01 Sep 14 nicklas 1099     {
2617 01 Sep 14 nicklas 1100       isValid = isValid && rnaLaterDateIsValid;
2617 01 Sep 14 nicklas 1101     }
6574 08 Feb 22 nicklas 1102     if (frm.externalSpecimenExists.checked)
6574 08 Feb 22 nicklas 1103     {
6574 08 Feb 22 nicklas 1104       isValid = isValid && rnaLaterDateIsValid;
6574 08 Feb 22 nicklas 1105     }
2617 01 Sep 14 nicklas 1106     if (!isValid) event.preventDefault();
2617 01 Sep 14 nicklas 1107   }
2617 01 Sep 14 nicklas 1108
2617 01 Sep 14 nicklas 1109   persinfo.submit = function()
2617 01 Sep 14 nicklas 1110   {
2617 01 Sep 14 nicklas 1111     var frm = document.forms['reggie'];
2617 01 Sep 14 nicklas 1112
2617 01 Sep 14 nicklas 1113     caseInfo.laterality = Forms.getCheckedRadio(frm.laterality).value;
2617 01 Sep 14 nicklas 1114     caseInfo.reasonIfNoSpecimen = frm.reasonIfNoSpecimen.value;
2617 01 Sep 14 nicklas 1115     caseInfo.pad = frm.pad.value;
6991 19 Jan 23 nicklas 1116     caseInfo.alternatePad = frm.alternatePad.value;
2617 01 Sep 14 nicklas 1117     
2617 01 Sep 14 nicklas 1118     var caseName = frm.caseName.value;
2840 20 Oct 14 nicklas 1119     var suffix = caseName.length > 7 ? caseName.substring(7, 8) : null;
2840 20 Oct 14 nicklas 1120     if (suffix != null)
2617 01 Sep 14 nicklas 1121     {
2840 20 Oct 14 nicklas 1122       if (suffix == 'C')
2840 20 Oct 14 nicklas 1123       {
2840 20 Oct 14 nicklas 1124         // 'C' suffix is only for 'SpecimenCoreBiopsy' items
2840 20 Oct 14 nicklas 1125         caseInfo.biopsyType = 'SpecimenCoreBiopsy';
2840 20 Oct 14 nicklas 1126       }
2840 20 Oct 14 nicklas 1127       if (suffix == 'D')
2840 20 Oct 14 nicklas 1128       {
2840 20 Oct 14 nicklas 1129         // 'D' suffix is only for 'SpecimenCoreBiopsy2nd' items
2840 20 Oct 14 nicklas 1130         caseInfo.biopsyType = 'SpecimenCoreBiopsy2nd';
2840 20 Oct 14 nicklas 1131       }
2617 01 Sep 14 nicklas 1132     }
6574 08 Feb 22 nicklas 1133     caseInfo.externalSpecimenExists = frm.externalSpecimenExists.checked;
6574 08 Feb 22 nicklas 1134     caseInfo.externalOperator = frm.externalOperator.value;
6574 08 Feb 22 nicklas 1135     caseInfo.liasonComment = frm.liasonComment.value;
2617 01 Sep 14 nicklas 1136     caseInfo.samplingDate = Strings.trim(frm.samplingDate.value + ' ' + frm.samplingTime.value);
2617 01 Sep 14 nicklas 1137     caseInfo.rnaLaterDate = Strings.trim(frm.rnaLaterDate.value + ' ' + frm.rnaLaterTime.value);
6574 08 Feb 22 nicklas 1138     caseInfo.otherPathNote = frm.otherPathNote.value;
2617 01 Sep 14 nicklas 1139     if (frm.copyConsent.checked && frm.copyConsent.value)
2617 01 Sep 14 nicklas 1140     {
2617 01 Sep 14 nicklas 1141       caseInfo.copyConsent = parseInt(frm.copyConsent.value, 10);
2617 01 Sep 14 nicklas 1142     }
2617 01 Sep 14 nicklas 1143
6510 03 Dec 21 nicklas 1144     if (caseInfo.specimen && caseInfo.specimen.length > 0)
6510 03 Dec 21 nicklas 1145     {
6510 03 Dec 21 nicklas 1146       for (var i = 0; i < caseInfo.specimen.length; i++)
6510 03 Dec 21 nicklas 1147       {
6510 03 Dec 21 nicklas 1148         var specimen = caseInfo.specimen[i];
6510 03 Dec 21 nicklas 1149         specimen.YellowLabel = frm['yellow.'+specimen.id].checked ? 'yellow' : null;
6510 03 Dec 21 nicklas 1150         specimen.specimenType = frm['specimenType.'+specimen.id].value;
6510 03 Dec 21 nicklas 1151         specimen.biopsyType = frm['biopsyType.'+specimen.id].value;
6510 03 Dec 21 nicklas 1152         specimen.otherPathNote = frm['otherPathNote.'+specimen.id].value;
6510 03 Dec 21 nicklas 1153         specimen.operatorDeliveryComment = frm['comment.'+specimen.id].value;
6510 03 Dec 21 nicklas 1154       }
6510 03 Dec 21 nicklas 1155     }
6510 03 Dec 21 nicklas 1156
2617 01 Sep 14 nicklas 1157     var updateMode = caseInfo.id && caseInfo.patient;
2617 01 Sep 14 nicklas 1158     var submitInfo = {};
2617 01 Sep 14 nicklas 1159     submitInfo.patientInfo = patientInfo;
2617 01 Sep 14 nicklas 1160     submitInfo.caseInfo = caseInfo;
3726 28 Jan 16 nicklas 1161     
2617 01 Sep 14 nicklas 1162     var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
2617 01 Sep 14 nicklas 1163     url += '&cmd=' + (updateMode ? 'UpdateCase' : 'CreateCase');
2617 01 Sep 14 nicklas 1164     Wizard.showLoadingAnimation('Registering case...');
2617 01 Sep 14 nicklas 1165     Wizard.asyncJsonRequest(url, persinfo.submissionResults, 'POST', JSON.stringify(submitInfo));
2617 01 Sep 14 nicklas 1166   }
2617 01 Sep 14 nicklas 1167   
2617 01 Sep 14 nicklas 1168   persinfo.submissionResults = function(response)
2617 01 Sep 14 nicklas 1169   {
2617 01 Sep 14 nicklas 1170     Wizard.showFinalMessage(response.messages);
2617 01 Sep 14 nicklas 1171     Doc.show('gorestart');
2617 01 Sep 14 nicklas 1172   }
2617 01 Sep 14 nicklas 1173
2617 01 Sep 14 nicklas 1174   return persinfo;
2617 01 Sep 14 nicklas 1175 }();
2617 01 Sep 14 nicklas 1176
2617 01 Sep 14 nicklas 1177 Doc.onLoad(PersInfo.initPage);
2617 01 Sep 14 nicklas 1178