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

Code
Comments
Other
Rev Date Author Line
2602 27 Aug 14 nicklas 1 var Blood = function()
2602 27 Aug 14 nicklas 2 {
2602 27 Aug 14 nicklas 3   var blood = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2602 27 Aug 14 nicklas 5   
2602 27 Aug 14 nicklas 6   var patientInfo = null;
2602 27 Aug 14 nicklas 7   var bloodInfo = null;
2602 27 Aug 14 nicklas 8   var siteInfo = null;
2602 27 Aug 14 nicklas 9   var consentInfo = null;
2602 27 Aug 14 nicklas 10
2602 27 Aug 14 nicklas 11   var caseIsValid = false;
6510 03 Dec 21 nicklas 12   var pnrIsTested = false;
2602 27 Aug 14 nicklas 13   var pnrIsValid = false;
2602 27 Aug 14 nicklas 14   var pnrIsAcceptable = false;
2602 27 Aug 14 nicklas 15   
2602 27 Aug 14 nicklas 16   var samplingDateIsValid = true;
2602 27 Aug 14 nicklas 17   var freezerDateIsValid = true;
2602 27 Aug 14 nicklas 18   
2602 27 Aug 14 nicklas 19   blood.initPage = function()
2602 27 Aug 14 nicklas 20   {
2602 27 Aug 14 nicklas 21     // Step 1
2602 27 Aug 14 nicklas 22     Events.addEventHandler('step-1', 'wizard-validate', blood.validateStep1);
2602 27 Aug 14 nicklas 23     Events.addEventHandler('caseName', 'keypress', Wizard.focusOnEnter);
2602 27 Aug 14 nicklas 24     Events.addEventHandler('caseName', 'blur', blood.caseNameOnChange);
2602 27 Aug 14 nicklas 25     Events.addEventHandler('personalNumber', 'keyup', blood.personalNumberOnChange);
2602 27 Aug 14 nicklas 26     Events.addEventHandler('personalNumber', 'keypress', Wizard.goNextOnTabOrEnter);
2602 27 Aug 14 nicklas 27     
2602 27 Aug 14 nicklas 28     // Step 2
2602 27 Aug 14 nicklas 29     Events.addEventHandler('step-2', 'wizard-initialize', blood.initializeStep2);
2602 27 Aug 14 nicklas 30     Events.addEventHandler('step-2', 'wizard-validate', blood.validateStep2);
2602 27 Aug 14 nicklas 31     Events.addEventHandler('familyName', 'blur', blood.nameOnChange);
2602 27 Aug 14 nicklas 32     Events.addEventHandler('allFirstNames', 'blur', blood.nameOnChange);
2602 27 Aug 14 nicklas 33     Events.addEventHandler('allFirstNames', 'keypress', Wizard.goNextOnTabOrEnter);
2602 27 Aug 14 nicklas 34     
2602 27 Aug 14 nicklas 35     // Step 3
2602 27 Aug 14 nicklas 36     Events.addEventHandler('step-3', 'wizard-initialize', blood.initializeStep3);
2602 27 Aug 14 nicklas 37     Events.addEventHandler('step-3', 'wizard-validate', blood.validateStep3);
2602 27 Aug 14 nicklas 38     Events.addEventHandler('samplingDate', 'blur', blood.samplingDateTimeOnChange);
2602 27 Aug 14 nicklas 39     Events.addEventHandler('samplingTime', 'blur', blood.samplingDateTimeOnChange);
2602 27 Aug 14 nicklas 40     Events.addEventHandler('freezerDate', 'blur', blood.freezerDateTimeOnChange);
2602 27 Aug 14 nicklas 41     Events.addEventHandler('freezerTime', 'blur', blood.freezerDateTimeOnChange);
2602 27 Aug 14 nicklas 42     
2602 27 Aug 14 nicklas 43     // Navigation
2602 27 Aug 14 nicklas 44     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2602 27 Aug 14 nicklas 45     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2602 27 Aug 14 nicklas 46     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2602 27 Aug 14 nicklas 47     Buttons.addClickHandler('goregister', Wizard.goRegister);
2602 27 Aug 14 nicklas 48     Buttons.addClickHandler('goupdate', Wizard.goRegister);
2602 27 Aug 14 nicklas 49     
2602 27 Aug 14 nicklas 50     // Final registration
2602 27 Aug 14 nicklas 51     Events.addEventHandler('wizard', 'wizard-submit', blood.submit);
2602 27 Aug 14 nicklas 52     
2602 27 Aug 14 nicklas 53     Doc.show('step-1');
2602 27 Aug 14 nicklas 54     Doc.show('gonext');
2602 27 Aug 14 nicklas 55   }
2602 27 Aug 14 nicklas 56   
2602 27 Aug 14 nicklas 57   blood.caseNameOnChange = function()
2602 27 Aug 14 nicklas 58   {
2602 27 Aug 14 nicklas 59     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 60     Wizard.setInputStatus('caseName');
2602 27 Aug 14 nicklas 61     var caseName = frm.caseName.value.toUpperCase();
2602 27 Aug 14 nicklas 62     caseIsValid = false;
2602 27 Aug 14 nicklas 63     if (caseName == '')
2602 27 Aug 14 nicklas 64     {
2602 27 Aug 14 nicklas 65       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
2602 27 Aug 14 nicklas 66       frm.caseName.focus();
2602 27 Aug 14 nicklas 67       return;
2602 27 Aug 14 nicklas 68     }
6277 03 Jun 21 nicklas 69     if (!Reggie.checkValidCaseName(caseName, 'K?', 'C?')) // Allow 'K'-prefix and/or 'C' suffix to be used
2602 27 Aug 14 nicklas 70     {
6277 03 Jun 21 nicklas 71       Wizard.setInputStatus('caseName', 'invalid', 'Expected 7-digits + optional \'K\' prefix or \'C\' suffix.');
2602 27 Aug 14 nicklas 72       frm.caseName.focus();
2602 27 Aug 14 nicklas 73       return;
2602 27 Aug 14 nicklas 74     }
2602 27 Aug 14 nicklas 75
2602 27 Aug 14 nicklas 76     frm.caseName.value = caseName;
2602 27 Aug 14 nicklas 77     Wizard.setInputStatus('caseName', 'valid');
2602 27 Aug 14 nicklas 78     caseIsValid = true;
2602 27 Aug 14 nicklas 79     
2602 27 Aug 14 nicklas 80     var url = '../BloodRegistration.servlet?ID='+App.getSessionId();
2602 27 Aug 14 nicklas 81     url += '&cmd=GetBloodInfo&caseName=' + encodeURIComponent(caseName);
2602 27 Aug 14 nicklas 82     Wizard.showLoadingAnimation('Loading information about case...');
2602 27 Aug 14 nicklas 83     Wizard.asyncJsonRequest(url, blood.onBloodInfoLoaded);
2602 27 Aug 14 nicklas 84   }
2602 27 Aug 14 nicklas 85
2602 27 Aug 14 nicklas 86   
2602 27 Aug 14 nicklas 87   blood.onBloodInfoLoaded = function(response)
2602 27 Aug 14 nicklas 88   {
2602 27 Aug 14 nicklas 89     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 90     
2602 27 Aug 14 nicklas 91     // Get biosource information from the AJAX response
2602 27 Aug 14 nicklas 92     bloodInfo = response.bloodInfo;
2602 27 Aug 14 nicklas 93     patientInfo = response.patientInfo;
2602 27 Aug 14 nicklas 94     consentInfo = response.consentInfo;
2602 27 Aug 14 nicklas 95     siteInfo = response.siteInfo;
2602 27 Aug 14 nicklas 96     
2602 27 Aug 14 nicklas 97     if (patientInfo)
2602 27 Aug 14 nicklas 98     {
2602 27 Aug 14 nicklas 99       frm.personalNumber.value = patientInfo.personalNumber;
2602 27 Aug 14 nicklas 100       blood.personalNumberOnChange();
6510 03 Dec 21 nicklas 101       pnrIsValid = true;
2602 27 Aug 14 nicklas 102       Wizard.goNext(false);
2602 27 Aug 14 nicklas 103     }
2602 27 Aug 14 nicklas 104     
2602 27 Aug 14 nicklas 105   }
2602 27 Aug 14 nicklas 106
2602 27 Aug 14 nicklas 107   blood.personalNumberOnChange = function()
2602 27 Aug 14 nicklas 108   {
2602 27 Aug 14 nicklas 109     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 110     var pnr = frm.personalNumber.value;
6510 03 Dec 21 nicklas 111     
2602 27 Aug 14 nicklas 112     pnrIsValid = false;
6510 03 Dec 21 nicklas 113     pnrIsAcceptable = false;
6510 03 Dec 21 nicklas 114     pnrIsTested = true;
6510 03 Dec 21 nicklas 115     
6510 03 Dec 21 nicklas 116     var pnrLen = pnr.length;
6510 03 Dec 21 nicklas 117     if (pnrLen == 0)
6510 03 Dec 21 nicklas 118     {
6510 03 Dec 21 nicklas 119       Wizard.setInputStatus('personalNumber', 'invalid', 'A personal number is required');
6510 03 Dec 21 nicklas 120       return;
6510 03 Dec 21 nicklas 121     }
6510 03 Dec 21 nicklas 122     
2602 27 Aug 14 nicklas 123     pnrIsAcceptable = true;
2602 27 Aug 14 nicklas 124     if (pnrLen != 12 && pnrLen != 10)
2602 27 Aug 14 nicklas 125     {
2602 27 Aug 14 nicklas 126       Wizard.setInputStatus('personalNumber', 'warning', pnrLen < 12 ? 'Too short' : 'Too long');
2602 27 Aug 14 nicklas 127       return;
2602 27 Aug 14 nicklas 128     }
2602 27 Aug 14 nicklas 129
2602 27 Aug 14 nicklas 130     if (!pnr.match(/^\d+$/))
2602 27 Aug 14 nicklas 131     {
2602 27 Aug 14 nicklas 132       Wizard.setInputStatus('personalNumber', 'warning', 'Non-standard personal number');
2602 27 Aug 14 nicklas 133       return;
2602 27 Aug 14 nicklas 134     }
2602 27 Aug 14 nicklas 135       
2602 27 Aug 14 nicklas 136     var datePart = pnr.substring(0, pnrLen - 4); // Remove last four digits
2602 27 Aug 14 nicklas 137     var dateFormat = pnrLen == 10 ? 'yyMMdd' : 'yyyyMMdd';
2602 27 Aug 14 nicklas 138     var isValidDate = Dates.isDate(datePart, dateFormat);
2602 27 Aug 14 nicklas 139     if (!isValidDate)
2602 27 Aug 14 nicklas 140     {
2602 27 Aug 14 nicklas 141       var dayInMonth = parseInt(datePart.substring(-2), 10); // Last two characters
2602 27 Aug 14 nicklas 142       if (dayInMonth > 60)
2602 27 Aug 14 nicklas 143       {
2602 27 Aug 14 nicklas 144         // 'Samordningsnummer' has day-in-month + 60; check this
2602 27 Aug 14 nicklas 145         dayInMonth -= 60;
2602 27 Aug 14 nicklas 146         var tmpPnr = pnr.substring(0, pnrLen - 6); // First 4 or 6 digits is year+month
2602 27 Aug 14 nicklas 147         if (dayInMonth < 10) tmpPnr += '0';
2602 27 Aug 14 nicklas 148         tmpPnr += dayInMonth;
2602 27 Aug 14 nicklas 149         isValidDate = Dates.isDate(tmpPnr, dateFormat);
2602 27 Aug 14 nicklas 150       }
2602 27 Aug 14 nicklas 151     }
2602 27 Aug 14 nicklas 152     if (!isValidDate)
2602 27 Aug 14 nicklas 153     {
2602 27 Aug 14 nicklas 154       Wizard.setInputStatus('personalNumber', 'warning', 'Not a valid date');
2602 27 Aug 14 nicklas 155       return;
2602 27 Aug 14 nicklas 156     }
2602 27 Aug 14 nicklas 157       
2602 27 Aug 14 nicklas 158     if (!Reggie.personalNumberControlDigitCheck(pnr.substr(pnrLen == 10 ? 0 : 2)))
2602 27 Aug 14 nicklas 159     {
2602 27 Aug 14 nicklas 160       Wizard.setInputStatus('personalNumber', 'warning', 'Invalid control digit');
2602 27 Aug 14 nicklas 161       return;
2602 27 Aug 14 nicklas 162     }
2602 27 Aug 14 nicklas 163       
2602 27 Aug 14 nicklas 164     Wizard.setInputStatus('personalNumber', 'valid');
2602 27 Aug 14 nicklas 165     pnrIsValid = true;
2602 27 Aug 14 nicklas 166     Wizard.hideGoNextConfirmation();
2602 27 Aug 14 nicklas 167   }
2602 27 Aug 14 nicklas 168
2602 27 Aug 14 nicklas 169   blood.validateStep1 = function(event)
2602 27 Aug 14 nicklas 170   {
6510 03 Dec 21 nicklas 171     if (!pnrIsTested) persinfo.personalNumberOnChange();
6510 03 Dec 21 nicklas 172     if (!caseIsValid || !pnrIsValid) 
2602 27 Aug 14 nicklas 173     {
6510 03 Dec 21 nicklas 174       if (!pnrIsAcceptable)
2602 27 Aug 14 nicklas 175       {
2602 27 Aug 14 nicklas 176         event.preventDefault();
6510 03 Dec 21 nicklas 177         return;
2602 27 Aug 14 nicklas 178       }
6510 03 Dec 21 nicklas 179       var frm = document.forms['reggie'];
6510 03 Dec 21 nicklas 180       if (!frm.verifyGoNext)
6510 03 Dec 21 nicklas 181       {
6510 03 Dec 21 nicklas 182         frm.personalNumber.focus();
6510 03 Dec 21 nicklas 183         Wizard.showGoNextConfirmation(true, 'Check to verify registration of non-standard personal number.');
6510 03 Dec 21 nicklas 184         event.preventDefault();
6510 03 Dec 21 nicklas 185       }
2602 27 Aug 14 nicklas 186     }
2602 27 Aug 14 nicklas 187   }
2602 27 Aug 14 nicklas 188   
6824 30 Aug 22 nicklas 189   blood.initializeStep2 = function()
2602 27 Aug 14 nicklas 190   {
2602 27 Aug 14 nicklas 191     if (!patientInfo)
2602 27 Aug 14 nicklas 192     {
2602 27 Aug 14 nicklas 193       var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 194       var pnr = frm.personalNumber.value;
2602 27 Aug 14 nicklas 195       if (pnr.length == 10 && pnrIsValid) 
2602 27 Aug 14 nicklas 196       {
2602 27 Aug 14 nicklas 197         var year = Reggie.fullYear(parseInt(pnr.substr(0, 2), 10));
2602 27 Aug 14 nicklas 198         pnr = year + pnr.substr(2);
2602 27 Aug 14 nicklas 199       }
2602 27 Aug 14 nicklas 200
2602 27 Aug 14 nicklas 201       var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
2602 27 Aug 14 nicklas 202       url += '&cmd=GetPatientInfo';
2602 27 Aug 14 nicklas 203       url += '&personalNumber=' + encodeURIComponent(pnr);
2602 27 Aug 14 nicklas 204       url += '&pnrIsValid=' + pnrIsValid;
2602 27 Aug 14 nicklas 205
2602 27 Aug 14 nicklas 206       Wizard.showLoadingAnimation('Loading patient information...');
2602 27 Aug 14 nicklas 207       Wizard.asyncJsonRequest(url, blood.patientInfoLoaded);
2602 27 Aug 14 nicklas 208     }
2602 27 Aug 14 nicklas 209     else
2602 27 Aug 14 nicklas 210     {
2602 27 Aug 14 nicklas 211       blood.patientInfoLoaded();
2602 27 Aug 14 nicklas 212     }
2602 27 Aug 14 nicklas 213   }
2602 27 Aug 14 nicklas 214   
2602 27 Aug 14 nicklas 215   blood.patientInfoLoaded = function(response)
2602 27 Aug 14 nicklas 216   {
2602 27 Aug 14 nicklas 217     Wizard.setCurrentStep(2);
2602 27 Aug 14 nicklas 218     if (response) patientInfo = response.patientInfo;
2602 27 Aug 14 nicklas 219     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 220     
2602 27 Aug 14 nicklas 221     if (!patientInfo.id)
2602 27 Aug 14 nicklas 222     {
2602 27 Aug 14 nicklas 223       Doc.show('new-patient');
2602 27 Aug 14 nicklas 224       frm.patientCode.value = patientInfo.name;
2602 27 Aug 14 nicklas 225       Doc.element('new.dateOfBirth').innerHTML = patientInfo.dateOfBirth ? patientInfo.dateOfBirth : "---";
2602 27 Aug 14 nicklas 226       Doc.element('new.gender').innerHTML = patientInfo.gender ? patientInfo.gender : "---";
2602 27 Aug 14 nicklas 227       frm.familyName.focus();
2602 27 Aug 14 nicklas 228       if (!pnrIsValid)
2602 27 Aug 14 nicklas 229       {
2602 27 Aug 14 nicklas 230         Wizard.setInputStatus('gender', 'warning', 'Gender and DateOfBirth can\'t be automatically generated for non-standard Personal number');
2602 27 Aug 14 nicklas 231       }
2602 27 Aug 14 nicklas 232       Doc.show('gonext');
2602 27 Aug 14 nicklas 233       Doc.show('gocancel');
2602 27 Aug 14 nicklas 234     }
2602 27 Aug 14 nicklas 235     else
2602 27 Aug 14 nicklas 236     {
2602 27 Aug 14 nicklas 237       Doc.show('existing-patient');
2602 27 Aug 14 nicklas 238       Doc.element('step-2-title').innerHTML = 'Existing patient: Verify names';
2602 27 Aug 14 nicklas 239       Doc.element('existing.patientCode').innerHTML = Strings.encodeTags(patientInfo.name);
2602 27 Aug 14 nicklas 240       Doc.element('existing.familyName').innerHTML = Strings.encodeTags(patientInfo.familyName);
2602 27 Aug 14 nicklas 241       Doc.element('existing.allFirstNames').innerHTML = Strings.encodeTags(patientInfo.allFirstNames);
2602 27 Aug 14 nicklas 242       if (patientInfo.dateOfBirth) Doc.element('existing.dateOfBirth').innerHTML = Strings.encodeTags(patientInfo.dateOfBirth);
2602 27 Aug 14 nicklas 243       if (patientInfo.gender) Doc.element('existing.gender').innerHTML = Strings.encodeTags(patientInfo.gender);
2602 27 Aug 14 nicklas 244       Wizard.goNext(true);  
2602 27 Aug 14 nicklas 245     }
2602 27 Aug 14 nicklas 246   }
2602 27 Aug 14 nicklas 247   
2602 27 Aug 14 nicklas 248   blood.validateStep2 = function(event)
2602 27 Aug 14 nicklas 249   {
2602 27 Aug 14 nicklas 250     var valid = true;
2602 27 Aug 14 nicklas 251     var acceptable = true;
2602 27 Aug 14 nicklas 252     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 253
2602 27 Aug 14 nicklas 254     // New patient only
2602 27 Aug 14 nicklas 255     if (!patientInfo.id)
2602 27 Aug 14 nicklas 256     {
2602 27 Aug 14 nicklas 257       // Validate 'New patient' form
2602 27 Aug 14 nicklas 258       if (frm.allFirstNames.value == '')
2602 27 Aug 14 nicklas 259       {
2602 27 Aug 14 nicklas 260         Wizard.setInputStatus('allFirstNames', 'warning', 'Missing');
2602 27 Aug 14 nicklas 261         valid = false;
2602 27 Aug 14 nicklas 262       }
2602 27 Aug 14 nicklas 263       else
2602 27 Aug 14 nicklas 264       {
2602 27 Aug 14 nicklas 265         Wizard.setInputStatus('allFirstNames', 'valid');
2602 27 Aug 14 nicklas 266       }
2602 27 Aug 14 nicklas 267       
2602 27 Aug 14 nicklas 268       if (frm.familyName.value == '')
2602 27 Aug 14 nicklas 269       {
2602 27 Aug 14 nicklas 270         Wizard.setInputStatus('familyName', 'warning', 'Missing');
2602 27 Aug 14 nicklas 271         valid = false;
2602 27 Aug 14 nicklas 272       }
2602 27 Aug 14 nicklas 273       else
2602 27 Aug 14 nicklas 274       {
2602 27 Aug 14 nicklas 275         Wizard.setInputStatus('familyName', 'valid');
2602 27 Aug 14 nicklas 276       }
2602 27 Aug 14 nicklas 277       if (frm.patientCode.value == '')
2602 27 Aug 14 nicklas 278       {
2602 27 Aug 14 nicklas 279         Wizard.setInputStatus('patientCode', 'invalid', 'Missing');
2602 27 Aug 14 nicklas 280         frm.patientCode.focus();
2602 27 Aug 14 nicklas 281         valid = false;
2602 27 Aug 14 nicklas 282         acceptable = false;
2602 27 Aug 14 nicklas 283       }
2602 27 Aug 14 nicklas 284       else
2602 27 Aug 14 nicklas 285       {
2602 27 Aug 14 nicklas 286         Wizard.setInputStatus('patientCode', 'valid');
2613 29 Aug 14 nicklas 287         patientInfo.name = frm.patientCode.value;
2602 27 Aug 14 nicklas 288       }
2602 27 Aug 14 nicklas 289       
2602 27 Aug 14 nicklas 290       if (event.detail.auto)
2602 27 Aug 14 nicklas 291       {
2602 27 Aug 14 nicklas 292         if (!valid)
2602 27 Aug 14 nicklas 293         {
2602 27 Aug 14 nicklas 294           Wizard.showGoNextConfirmation(true, 'Check to verify registration with missing name(s).');
2602 27 Aug 14 nicklas 295           event.preventDefault();
2602 27 Aug 14 nicklas 296         }
2602 27 Aug 14 nicklas 297       }
2602 27 Aug 14 nicklas 298       else
2602 27 Aug 14 nicklas 299       {
2602 27 Aug 14 nicklas 300         if (!acceptable) event.preventDefault();
2602 27 Aug 14 nicklas 301       }
2602 27 Aug 14 nicklas 302     }
2602 27 Aug 14 nicklas 303   }
2602 27 Aug 14 nicklas 304   
2602 27 Aug 14 nicklas 305   blood.nameOnChange = function(event)
2602 27 Aug 14 nicklas 306   {
2602 27 Aug 14 nicklas 307     var field = event.target;
2617 01 Sep 14 nicklas 308     patientInfo[field.name] = field.value;
2602 27 Aug 14 nicklas 309     if (field.value == '')
2602 27 Aug 14 nicklas 310     {
2602 27 Aug 14 nicklas 311       Wizard.setInputStatus(field, 'warning', 'Missing');
2602 27 Aug 14 nicklas 312     }
2602 27 Aug 14 nicklas 313     else
2602 27 Aug 14 nicklas 314     {
2602 27 Aug 14 nicklas 315       Wizard.setInputStatus(field, 'valid');
2602 27 Aug 14 nicklas 316       Wizard.hideGoNextConfirmation();
2602 27 Aug 14 nicklas 317     }
2602 27 Aug 14 nicklas 318   }
2602 27 Aug 14 nicklas 319   
2602 27 Aug 14 nicklas 320   
6824 30 Aug 22 nicklas 321   blood.initializeStep3 = function()
2602 27 Aug 14 nicklas 322   {
2602 27 Aug 14 nicklas 323     var updateMode = bloodInfo.id;
2602 27 Aug 14 nicklas 324     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 325
2602 27 Aug 14 nicklas 326     if (updateMode)
2602 27 Aug 14 nicklas 327     {
2602 27 Aug 14 nicklas 328       Doc.element('step-3-title').innerHTML = 'Update blood \''+Strings.encodeTags(bloodInfo.name)+'\'';
2602 27 Aug 14 nicklas 329       if (bloodInfo.samplingDate != null)
2602 27 Aug 14 nicklas 330       {
2602 27 Aug 14 nicklas 331         frm.samplingDate.value = bloodInfo.samplingDate.substring(0, 8);
2602 27 Aug 14 nicklas 332         frm.samplingTime.value = bloodInfo.samplingDate.substring(9, 13);
2602 27 Aug 14 nicklas 333         blood.samplingDateTimeOnChange();
2602 27 Aug 14 nicklas 334       }
2602 27 Aug 14 nicklas 335       if (bloodInfo.freezerDate != null)
2602 27 Aug 14 nicklas 336       {
2602 27 Aug 14 nicklas 337         frm.freezerDate.value = bloodInfo.freezerDate.substring(0, 8);
2602 27 Aug 14 nicklas 338         frm.freezerTime.value = bloodInfo.freezerDate.substring(9, 13);
2602 27 Aug 14 nicklas 339         blood.freezerDateTimeOnChange();
2602 27 Aug 14 nicklas 340       }
2602 27 Aug 14 nicklas 341       frm.serum.checked = bloodInfo.serum == 'Yes';
2602 27 Aug 14 nicklas 342       if (bloodInfo.bloodSample)
2602 27 Aug 14 nicklas 343       {
2602 27 Aug 14 nicklas 344         Forms.selectListOption(frm.bloodSample, bloodInfo.bloodSample);
2602 27 Aug 14 nicklas 345       }
2602 27 Aug 14 nicklas 346       if (bloodInfo.otherPathNote)
2602 27 Aug 14 nicklas 347       {
2602 27 Aug 14 nicklas 348         frm.otherPathNote.value = bloodInfo.otherPathNote;
2602 27 Aug 14 nicklas 349       }
2602 27 Aug 14 nicklas 350     }
2602 27 Aug 14 nicklas 351     else
2602 27 Aug 14 nicklas 352     {
2602 27 Aug 14 nicklas 353       // Select 'PreNeo' if case name has 'C' suffix
2602 27 Aug 14 nicklas 354       var caseName = frm.caseName.value;
6277 03 Jun 21 nicklas 355       var cLength = caseName.length;
6277 03 Jun 21 nicklas 356       if (cLength > 7 && caseName.substr(cLength-1, 1) == 'C')
2602 27 Aug 14 nicklas 357       {
2602 27 Aug 14 nicklas 358         Forms.selectListOption(frm.bloodSample, 'PreNeo');
2602 27 Aug 14 nicklas 359       }
2602 27 Aug 14 nicklas 360       if (consentInfo && consentInfo.consent)
2602 27 Aug 14 nicklas 361       {
2602 27 Aug 14 nicklas 362         frm.copyConsent.value = consentInfo.id;
2602 27 Aug 14 nicklas 363         var html = "From '" + Strings.encodeTags(consentInfo.name) + "' (" + consentInfo.consent;
2602 27 Aug 14 nicklas 364         if (consentInfo.consentDate) html += '; ' + consentInfo.consentDate;
2602 27 Aug 14 nicklas 365         html += ')';
2602 27 Aug 14 nicklas 366         Doc.element('copyConsent.text').innerHTML = html;
2602 27 Aug 14 nicklas 367         Doc.show("copyConsentSection");
2602 27 Aug 14 nicklas 368       }
2602 27 Aug 14 nicklas 369     }
2602 27 Aug 14 nicklas 370     
6610 25 Feb 22 nicklas 371     // Plasm/serum check box should not be selected
6610 25 Feb 22 nicklas 372     frm.serum.checked = siteInfo && siteInfo.usePlasmaSerum;
2602 27 Aug 14 nicklas 373     
2602 27 Aug 14 nicklas 374     if (updateMode)
2602 27 Aug 14 nicklas 375     {
2602 27 Aug 14 nicklas 376       Doc.show('goupdate');
2602 27 Aug 14 nicklas 377     }
2602 27 Aug 14 nicklas 378     else
2602 27 Aug 14 nicklas 379     {
2602 27 Aug 14 nicklas 380       Doc.show('goregister');
2602 27 Aug 14 nicklas 381     }
2602 27 Aug 14 nicklas 382     Doc.show('gocancel');
2602 27 Aug 14 nicklas 383
2602 27 Aug 14 nicklas 384     Wizard.setCurrentStep(3);
2602 27 Aug 14 nicklas 385     frm.samplingDate.focus();
2602 27 Aug 14 nicklas 386   }
2602 27 Aug 14 nicklas 387   
2602 27 Aug 14 nicklas 388   blood.validateStep3 = function(event)
2602 27 Aug 14 nicklas 389   {
2602 27 Aug 14 nicklas 390     if (!samplingDateIsValid || !freezerDateIsValid)
2602 27 Aug 14 nicklas 391     {
2602 27 Aug 14 nicklas 392       event.preventDefault();
2602 27 Aug 14 nicklas 393     }
2602 27 Aug 14 nicklas 394   }
2602 27 Aug 14 nicklas 395
2602 27 Aug 14 nicklas 396   blood.samplingDateTimeOnChange = function()
2602 27 Aug 14 nicklas 397   {
2602 27 Aug 14 nicklas 398     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 399     samplingDateIsValid = false;
2602 27 Aug 14 nicklas 400     Wizard.setInputStatus('samplingDate');
2602 27 Aug 14 nicklas 401     
2602 27 Aug 14 nicklas 402     var samplingDate = frm.samplingDate.value;
2602 27 Aug 14 nicklas 403     var samplingTime = frm.samplingTime.value;
2602 27 Aug 14 nicklas 404     
2602 27 Aug 14 nicklas 405     var isUppsala = siteInfo && siteInfo.prefix == '88';
2602 27 Aug 14 nicklas 406     
2602 27 Aug 14 nicklas 407     if (samplingDate != '' || samplingTime != '')
2602 27 Aug 14 nicklas 408     {
2602 27 Aug 14 nicklas 409       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2602 27 Aug 14 nicklas 410       samplingDate = Reggie.autoFillDate(samplingDate, true);
2602 27 Aug 14 nicklas 411       frm.samplingDate.value = samplingDate;
2602 27 Aug 14 nicklas 412
2602 27 Aug 14 nicklas 413       samplingTime = Reggie.autoFillTime(samplingTime);
2602 27 Aug 14 nicklas 414       // Set sampling time to 0000 for Uppsala since it is not known
2602 27 Aug 14 nicklas 415       if (!samplingTime && isUppsala) samplingTime = '0000';
2602 27 Aug 14 nicklas 416       frm.samplingTime.value = samplingTime;
2602 27 Aug 14 nicklas 417       
2602 27 Aug 14 nicklas 418       if (!Dates.isDate(samplingDate, 'yyyyMMdd'))
2602 27 Aug 14 nicklas 419       {
2602 27 Aug 14 nicklas 420         Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid date');
2602 27 Aug 14 nicklas 421         return;
2602 27 Aug 14 nicklas 422       }
2602 27 Aug 14 nicklas 423       
2602 27 Aug 14 nicklas 424       // Automatically fill in freezer date except for Uppsala since it is not known
2602 27 Aug 14 nicklas 425       if (frm.freezerDate.value == '' && !isUppsala)
2602 27 Aug 14 nicklas 426       {
2602 27 Aug 14 nicklas 427         frm.freezerDate.value = samplingDate;
2602 27 Aug 14 nicklas 428       }
2602 27 Aug 14 nicklas 429       
2602 27 Aug 14 nicklas 430       if (!Dates.isDate(samplingDate + ' ' + samplingTime, 'yyyyMMdd HHmm'))
2602 27 Aug 14 nicklas 431       {
2602 27 Aug 14 nicklas 432         if (samplingDate != '') 
2602 27 Aug 14 nicklas 433         {
2602 27 Aug 14 nicklas 434           Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid time');
2602 27 Aug 14 nicklas 435         }
2602 27 Aug 14 nicklas 436         return;
2602 27 Aug 14 nicklas 437       }
2602 27 Aug 14 nicklas 438       Wizard.setInputStatus('samplingDate', 'valid');
2602 27 Aug 14 nicklas 439     }
2602 27 Aug 14 nicklas 440     samplingDateIsValid = true;
2602 27 Aug 14 nicklas 441   }
2602 27 Aug 14 nicklas 442
2602 27 Aug 14 nicklas 443   blood.freezerDateTimeOnChange = function()
2602 27 Aug 14 nicklas 444   {
2602 27 Aug 14 nicklas 445     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 446     freezerDateIsValid = false;
2602 27 Aug 14 nicklas 447     Wizard.setInputStatus('freezerDate');
2602 27 Aug 14 nicklas 448     
2602 27 Aug 14 nicklas 449     var freezerDate = frm.freezerDate.value;
2602 27 Aug 14 nicklas 450     var freezerTime = frm.freezerTime.value;
2602 27 Aug 14 nicklas 451     var freezerTimestamp;
2602 27 Aug 14 nicklas 452     
2602 27 Aug 14 nicklas 453     if (freezerDate != '' || freezerTime != '')
2602 27 Aug 14 nicklas 454     {
2602 27 Aug 14 nicklas 455       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2602 27 Aug 14 nicklas 456       freezerDate = Reggie.autoFillDate(freezerDate, true);
2602 27 Aug 14 nicklas 457       frm.freezerDate.value = freezerDate;
2602 27 Aug 14 nicklas 458
2602 27 Aug 14 nicklas 459       freezerTime = Reggie.autoFillTime(freezerTime);
2602 27 Aug 14 nicklas 460       frm.freezerTime.value = freezerTime;
2602 27 Aug 14 nicklas 461       
2602 27 Aug 14 nicklas 462       if (!Dates.isDate(freezerDate, 'yyyyMMdd'))
2602 27 Aug 14 nicklas 463       {
2602 27 Aug 14 nicklas 464         Wizard.setInputStatus('freezerDate', 'invalid', 'Not a valid date');
2602 27 Aug 14 nicklas 465         return;
2602 27 Aug 14 nicklas 466       }
2602 27 Aug 14 nicklas 467       freezerTimestamp = Dates.parseString(freezerDate + ' ' + freezerTime, 'yyyyMMdd HHmm');
2602 27 Aug 14 nicklas 468       if (freezerTimestamp == null)
2602 27 Aug 14 nicklas 469       {
2602 27 Aug 14 nicklas 470         if (freezerDate != '') 
2602 27 Aug 14 nicklas 471         {
2602 27 Aug 14 nicklas 472           Wizard.setInputStatus('freezerDate', 'invalid', 'Not a valid time');
2602 27 Aug 14 nicklas 473         }
2602 27 Aug 14 nicklas 474         return;
2602 27 Aug 14 nicklas 475       }
2602 27 Aug 14 nicklas 476       
2602 27 Aug 14 nicklas 477       Wizard.setInputStatus('freezerDate', 'valid');
2602 27 Aug 14 nicklas 478     }
2602 27 Aug 14 nicklas 479     
2602 27 Aug 14 nicklas 480     freezerDateIsValid = true;
2602 27 Aug 14 nicklas 481
2602 27 Aug 14 nicklas 482     if (samplingDateIsValid && freezerTimestamp)
2602 27 Aug 14 nicklas 483     {
2602 27 Aug 14 nicklas 484       var samplingTimestamp = Dates.parseString(frm.samplingDate.value + ' ' + frm.samplingTime.value, 'yyyyMMdd Hmm');
2602 27 Aug 14 nicklas 485       if (samplingTimestamp && samplingTimestamp.getDate() != freezerTimestamp.getDate())
2602 27 Aug 14 nicklas 486       {
2602 27 Aug 14 nicklas 487         Wizard.setInputStatus('freezerDate', 'warning', 'Sampling and freezer dates are different');
2602 27 Aug 14 nicklas 488       }
2602 27 Aug 14 nicklas 489     }
2602 27 Aug 14 nicklas 490   }
2602 27 Aug 14 nicklas 491
2602 27 Aug 14 nicklas 492   blood.submit = function()
2602 27 Aug 14 nicklas 493   {
2602 27 Aug 14 nicklas 494     var frm = document.forms['reggie'];
2602 27 Aug 14 nicklas 495
2602 27 Aug 14 nicklas 496     bloodInfo.samplingDate = Strings.trim(frm.samplingDate.value + ' ' + frm.samplingTime.value);
2602 27 Aug 14 nicklas 497     bloodInfo.freezerDate = Strings.trim(frm.freezerDate.value + ' ' + frm.freezerTime.value);
2602 27 Aug 14 nicklas 498     bloodInfo.serum = frm.serum.checked ? "Yes" : "No";
2602 27 Aug 14 nicklas 499     bloodInfo.bloodSample = frm.bloodSample.value;
2602 27 Aug 14 nicklas 500     bloodInfo.otherPathNote = frm.otherPathNote.value;
2602 27 Aug 14 nicklas 501     if (frm.copyConsent.checked && frm.copyConsent.value)
2602 27 Aug 14 nicklas 502     {
2602 27 Aug 14 nicklas 503       bloodInfo.copyConsent = parseInt(frm.copyConsent.value, 10);
2602 27 Aug 14 nicklas 504     }
2602 27 Aug 14 nicklas 505
2602 27 Aug 14 nicklas 506     var updateMode = bloodInfo.id;
2602 27 Aug 14 nicklas 507     var submitInfo = {};
2602 27 Aug 14 nicklas 508     submitInfo.patientInfo = patientInfo;
2602 27 Aug 14 nicklas 509     submitInfo.bloodInfo = bloodInfo;
2602 27 Aug 14 nicklas 510
2602 27 Aug 14 nicklas 511     var url = '../BloodRegistration.servlet?ID='+App.getSessionId();
2602 27 Aug 14 nicklas 512     url += '&cmd=' + (updateMode ? 'UpdateBlood' : 'CreateBlood');
2602 27 Aug 14 nicklas 513     
2602 27 Aug 14 nicklas 514     Wizard.showLoadingAnimation('Registering blood information...');
2602 27 Aug 14 nicklas 515     Wizard.asyncJsonRequest(url, blood.submissionResults, 'POST', JSON.stringify(submitInfo));
2602 27 Aug 14 nicklas 516
2602 27 Aug 14 nicklas 517   }
2602 27 Aug 14 nicklas 518   
2602 27 Aug 14 nicklas 519   blood.submissionResults = function(response)
2602 27 Aug 14 nicklas 520   {
2602 27 Aug 14 nicklas 521     Wizard.showFinalMessage(response.messages);
2602 27 Aug 14 nicklas 522     Doc.show('gorestart');
2602 27 Aug 14 nicklas 523   }
2602 27 Aug 14 nicklas 524
2602 27 Aug 14 nicklas 525   
2602 27 Aug 14 nicklas 526   return blood;
2602 27 Aug 14 nicklas 527 }();
2602 27 Aug 14 nicklas 528
2602 27 Aug 14 nicklas 529 Doc.onLoad(Blood.initPage);
2602 27 Aug 14 nicklas 530