extensions/net.sf.basedb.meludi/trunk/resources/personal/persinfo_alt_rec.js

Code
Comments
Other
Rev Date Author Line
4733 05 Apr 18 olle 1 var PersInfo = function()
4733 05 Apr 18 olle 2 {
4733 05 Apr 18 olle 3   var persinfo = {};
4733 05 Apr 18 olle 4   var debug = 0;
4733 05 Apr 18 olle 5   
4733 05 Apr 18 olle 6   var patientInfo = null;
4733 05 Apr 18 olle 7   var caseInfo = null;
4733 05 Apr 18 olle 8   var bloodInfo = null;
4733 05 Apr 18 olle 9
4733 05 Apr 18 olle 10   var pnrIsValid = false;
4733 05 Apr 18 olle 11   var pnrIsAcceptable = false;
4733 05 Apr 18 olle 12   var caseIsValid = false;
4733 05 Apr 18 olle 13
4733 05 Apr 18 olle 14   var sampleItemPrefix = '';
4733 05 Apr 18 olle 15   var sampleItemNumDigits = 5;
4733 05 Apr 18 olle 16   var nofTubesIsValid = false;
4733 05 Apr 18 olle 17   var samplingDateIsValid = true;
4733 05 Apr 18 olle 18   var viableTumourCellsPercentIsValid = true;
4733 05 Apr 18 olle 19   var usesSitePrefix = false;
4733 05 Apr 18 olle 20
4733 05 Apr 18 olle 21   // Well validation variable for input specimen, DNA, RNA
4733 05 Apr 18 olle 22   var wellIsValid = [];
4733 05 Apr 18 olle 23   // Well validation variables for extracts from specimen
4733 05 Apr 18 olle 24   var dnaWellIsValid = [];
4733 05 Apr 18 olle 25   var rnaWellIsValid = [];
4733 05 Apr 18 olle 26
4733 05 Apr 18 olle 27   persinfo.initPage = function()
4733 05 Apr 18 olle 28   {
4733 05 Apr 18 olle 29     
4733 05 Apr 18 olle 30     // Step 1
4733 05 Apr 18 olle 31     Events.addEventHandler('step-1', 'wizard-validate', persinfo.validateStep1);
4733 05 Apr 18 olle 32     Events.addEventHandler('caseName', 'keypress', Wizard.focusOnEnter);
4733 05 Apr 18 olle 33     Events.addEventHandler('caseName', 'blur', persinfo.caseNameOnChange);
4733 05 Apr 18 olle 34     Events.addEventHandler('personalNumber', 'keyup', persinfo.personalNumberOnChange);
4733 05 Apr 18 olle 35     Events.addEventHandler('personalNumber', 'keypress', Wizard.goNextOnTabOrEnter);
4733 05 Apr 18 olle 36     
4733 05 Apr 18 olle 37     // Step 2
4733 05 Apr 18 olle 38     Events.addEventHandler('step-2', 'wizard-initialize', persinfo.initializeStep2);
4733 05 Apr 18 olle 39     Events.addEventHandler('step-2', 'wizard-validate', persinfo.validateStep2);
4733 05 Apr 18 olle 40     Events.addEventHandler('familyName', 'blur', persinfo.nameOnChange);
4733 05 Apr 18 olle 41     Events.addEventHandler('allFirstNames', 'blur', persinfo.nameOnChange);
4733 05 Apr 18 olle 42     Events.addEventHandler('allFirstNames', 'keypress', Wizard.goNextOnTabOrEnter);
4733 05 Apr 18 olle 43
4733 05 Apr 18 olle 44     // Step 3
4733 05 Apr 18 olle 45     Events.addEventHandler('step-3', 'wizard-initialize', persinfo.initializeStep3);
4733 05 Apr 18 olle 46     Events.addEventHandler('step-3', 'wizard-validate', persinfo.validateStep3);
4733 05 Apr 18 olle 47     Events.addEventHandler('plNumber', 'blur', persinfo.plNumberOnChange);
4733 05 Apr 18 olle 48     Events.addEventHandler('pad', 'blur', persinfo.padOnChange);
4733 05 Apr 18 olle 49     Events.addEventHandler('nofTubes', 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 50     Events.addEventHandler('nofTubes', 'blur', persinfo.nofTubesOnChange);
4733 05 Apr 18 olle 51     Events.addEventHandler('arrivalDate', 'blur', Wizard.validateDate);
4733 05 Apr 18 olle 52     Events.addEventHandler('samplingDate', 'blur', persinfo.samplingDateOnChange);
4733 05 Apr 18 olle 53     Events.addEventHandler('projectFocus', 'change', persinfo.projectFocusOnChange);
4733 05 Apr 18 olle 54     Events.addEventHandler('site', 'change', persinfo.siteOnChange);
4733 05 Apr 18 olle 55     Events.addEventHandler('specimenType', 'change', persinfo.specimenTypeOnChange);
4733 05 Apr 18 olle 56     Events.addEventHandler('viableTumourCellsPercent', 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 57     Events.addEventHandler('viableTumourCellsPercent', 'blur', persinfo.viableTumourCellsPercentOnChange);
4733 05 Apr 18 olle 58     Events.addEventHandler('otherPathNote', 'keypress', Wizard.goNextOnTab);
4733 05 Apr 18 olle 59     Buttons.addClickHandler('selectAllMutationAnalysis', persinfo.mutationAnalysisSelectAll);
4733 05 Apr 18 olle 60     
4733 05 Apr 18 olle 61     // Step 4
4733 05 Apr 18 olle 62     Events.addEventHandler('step-4', 'wizard-initialize', persinfo.initializeStep4);
4733 05 Apr 18 olle 63     Events.addEventHandler('step-5', 'wizard-validate', persinfo.validateStep4);
4733 05 Apr 18 olle 64     
4733 05 Apr 18 olle 65     // Navigation
4733 05 Apr 18 olle 66     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
4733 05 Apr 18 olle 67     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
4733 05 Apr 18 olle 68     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
4733 05 Apr 18 olle 69     Buttons.addClickHandler('goregister', Wizard.goRegister);
4733 05 Apr 18 olle 70     Buttons.addClickHandler('goupdate', Wizard.goRegister);
4733 05 Apr 18 olle 71     
4733 05 Apr 18 olle 72     // Final registration
4733 05 Apr 18 olle 73     Events.addEventHandler('wizard', 'wizard-submit', persinfo.submit);
4733 05 Apr 18 olle 74     
4733 05 Apr 18 olle 75     // Load configuration
4733 05 Apr 18 olle 76     persinfo.loadConfiguration();
4733 05 Apr 18 olle 77   }
4733 05 Apr 18 olle 78   
4733 05 Apr 18 olle 79   persinfo.loadConfiguration = function()
4733 05 Apr 18 olle 80   {
4733 05 Apr 18 olle 81     var url = '../Session.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 82     url += '&cmd=GetConfiguration'
4733 05 Apr 18 olle 83     var request = Ajax.getXmlHttpRequest();
4733 05 Apr 18 olle 84     request.open("GET", url, true);
4733 05 Apr 18 olle 85     Ajax.setReadyStateHandler(request, persinfo.onConfiguration, persinfo.onConfiguration);
4733 05 Apr 18 olle 86     request.send(null);
4733 05 Apr 18 olle 87   }
4733 05 Apr 18 olle 88   
4733 05 Apr 18 olle 89   persinfo.onConfiguration = function(request)
4733 05 Apr 18 olle 90   {
4733 05 Apr 18 olle 91     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 92
4733 05 Apr 18 olle 93     if (debug)
4733 05 Apr 18 olle 94     {
4733 05 Apr 18 olle 95       App.debug(Strings.encodeTags(request.responseText));
4733 05 Apr 18 olle 96     }
4733 05 Apr 18 olle 97     
4733 05 Apr 18 olle 98     var response;
4733 05 Apr 18 olle 99     var error = false;
4733 05 Apr 18 olle 100     try
4733 05 Apr 18 olle 101     {
4733 05 Apr 18 olle 102       response = JSON.parse(request.responseText);
4733 05 Apr 18 olle 103       if (response.status != 'ok')
4733 05 Apr 18 olle 104       {
4733 05 Apr 18 olle 105         error = response.message || response.stacktrace || 'Unexpected error';
4733 05 Apr 18 olle 106       }
4733 05 Apr 18 olle 107     }
4733 05 Apr 18 olle 108     catch (ex)
4733 05 Apr 18 olle 109     {
4733 05 Apr 18 olle 110       error = ex;
4733 05 Apr 18 olle 111     }
4733 05 Apr 18 olle 112     if (error) App.debug(error);
4733 05 Apr 18 olle 113
4733 05 Apr 18 olle 114     // Get configuration result    
4733 05 Apr 18 olle 115     var conf = response.configuration;
4733 05 Apr 18 olle 116     // Check for uses site prefix flag
4733 05 Apr 18 olle 117     usesSitePrefix = conf.usesSitePrefix;
4733 05 Apr 18 olle 118     // Check for project focus default
4733 05 Apr 18 olle 119     var projectFocusDefault = conf.projectFocusDefault;
4733 05 Apr 18 olle 120     if (projectFocusDefault != null)
4733 05 Apr 18 olle 121     {
4733 05 Apr 18 olle 122       frm.projectFocus.value = projectFocusDefault;
4733 05 Apr 18 olle 123       persinfo.projectFocusOnChange();
4733 05 Apr 18 olle 124     }
4733 05 Apr 18 olle 125     // Check for specimen type default
4733 05 Apr 18 olle 126     var specimenTypeDefault = conf.specimenTypeDefault;
4733 05 Apr 18 olle 127     if (specimenTypeDefault != null)
4733 05 Apr 18 olle 128     {
4733 05 Apr 18 olle 129       frm.specimenType.value = specimenTypeDefault;
4733 05 Apr 18 olle 130     }
4733 05 Apr 18 olle 131     // Check for specimen input type default
4733 05 Apr 18 olle 132     var specimenInputTypeDefault = conf.specimenInputTypeDefault;
4733 05 Apr 18 olle 133     if (specimenInputTypeDefault != null)
4733 05 Apr 18 olle 134     {
4733 05 Apr 18 olle 135       frm.specimenInputType.value = specimenInputTypeDefault;
4733 05 Apr 18 olle 136     }
4733 05 Apr 18 olle 137     // Check for extracts from first specimen only default
4733 05 Apr 18 olle 138     var extractsFromFirstSpecimenOnlyDefault = conf.extractsFromFirstSpecimenOnlyDefault;
4733 05 Apr 18 olle 139     if (extractsFromFirstSpecimenOnlyDefault != null)
4733 05 Apr 18 olle 140     {
4733 05 Apr 18 olle 141       frm.extractsFromFirstSpecimenOnlyCB.checked = extractsFromFirstSpecimenOnlyDefault;
4733 05 Apr 18 olle 142     }
4733 05 Apr 18 olle 143
4733 05 Apr 18 olle 144     // Continue with initializing info for case
4733 05 Apr 18 olle 145     var url = '../LabelGeneration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 146     url += '&cmd=CountCases';
4733 05 Apr 18 olle 147     Wizard.showLoadingAnimation('Loading cases...');
4733 05 Apr 18 olle 148     Wizard.asyncJsonRequest(url, persinfo.caseInfoLoadedStep1);
4733 05 Apr 18 olle 149   }
4733 05 Apr 18 olle 150
4733 05 Apr 18 olle 151   persinfo.caseInfoLoadedStep1 = function(response)
4733 05 Apr 18 olle 152   {
4733 05 Apr 18 olle 153     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 154
4733 05 Apr 18 olle 155     sampleItemPrefix = response.sampleItemPrefix;
4733 05 Apr 18 olle 156     sampleItemNumDigits = response.sampleItemNumDigits;
4733 05 Apr 18 olle 157     var nofCases = response.count;
4733 05 Apr 18 olle 158     if (nofCases == null)
4733 05 Apr 18 olle 159     {
4733 05 Apr 18 olle 160       nofCases = 0;
4733 05 Apr 18 olle 161     }
4733 05 Apr 18 olle 162     var startNum = nofCases + 1;
4733 05 Apr 18 olle 163     // Pad number with leading zeros to get right number of digits
4733 05 Apr 18 olle 164     startNum = String('0000000000' + startNum).slice(-sampleItemNumDigits);
4733 05 Apr 18 olle 165     var startCase = sampleItemPrefix + startNum;
4733 05 Apr 18 olle 166     if (usesSitePrefix != null && usesSitePrefix)
4733 05 Apr 18 olle 167     {
4733 05 Apr 18 olle 168       startCase = '';
4733 05 Apr 18 olle 169     }
4733 05 Apr 18 olle 170     frm.caseName.value = startCase;
4733 05 Apr 18 olle 171     
4733 05 Apr 18 olle 172     Doc.show('step-1');
4733 05 Apr 18 olle 173     Doc.show('gonext');
4733 05 Apr 18 olle 174
4733 05 Apr 18 olle 175     // Ensure that flag 'caseIsValid' is set to 'true' or error reported
4733 05 Apr 18 olle 176     persinfo.caseNameOnChange();
4733 05 Apr 18 olle 177   }
4733 05 Apr 18 olle 178   
4733 05 Apr 18 olle 179   persinfo.caseNameOnChange = function()
4733 05 Apr 18 olle 180   {
4733 05 Apr 18 olle 181     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 182     var caseName = frm.caseName.value.toUpperCase();
4733 05 Apr 18 olle 183     caseIsValid = false;
4733 05 Apr 18 olle 184     if (caseName == '')
4733 05 Apr 18 olle 185     {
4733 05 Apr 18 olle 186       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
4733 05 Apr 18 olle 187       frm.caseName.focus();
4733 05 Apr 18 olle 188       return;
4733 05 Apr 18 olle 189     }
4733 05 Apr 18 olle 190     if (!Meludi.isValidCaseName2(caseName, sampleItemPrefix, sampleItemNumDigits))
4733 05 Apr 18 olle 191     {
4733 05 Apr 18 olle 192       Wizard.setInputStatus('caseName', 'invalid', 'Only "' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits is allowed.');
4733 05 Apr 18 olle 193       frm.caseName.focus();
4733 05 Apr 18 olle 194       return;
4733 05 Apr 18 olle 195     }
4733 05 Apr 18 olle 196
4733 05 Apr 18 olle 197     frm.caseName.value = caseName;
4733 05 Apr 18 olle 198     Wizard.setInputStatus('caseName', 'valid');
4733 05 Apr 18 olle 199     caseIsValid = true;
4733 05 Apr 18 olle 200     
4733 05 Apr 18 olle 201     var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 202     url += '&cmd=GetCaseInfo&caseName=' + encodeURIComponent(caseName);
4733 05 Apr 18 olle 203     Wizard.showLoadingAnimation('Loading information about case...');
4733 05 Apr 18 olle 204     Wizard.asyncJsonRequest(url, persinfo.onCaseInfoLoaded);
4733 05 Apr 18 olle 205   }
4733 05 Apr 18 olle 206
4733 05 Apr 18 olle 207   persinfo.onCaseInfoLoaded = function(response)
4733 05 Apr 18 olle 208   {
4733 05 Apr 18 olle 209     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 210     
4733 05 Apr 18 olle 211     // Get biosource information from the AJAX response
4733 05 Apr 18 olle 212     caseInfo = response.caseInfo;
4733 05 Apr 18 olle 213     
4733 05 Apr 18 olle 214     // If site determined by site prefix in case name, set site default value and disable site menu
4733 05 Apr 18 olle 215     //alert("persinfo.js:: persinfo.caseInfoLoaded: caseInfo.siteDefault = " + caseInfo.siteDefault);
4733 05 Apr 18 olle 216     if (caseInfo.siteDefault != null)
4733 05 Apr 18 olle 217     {
4733 05 Apr 18 olle 218       frm.site.value = caseInfo.siteDefault;
4733 05 Apr 18 olle 219       frm.site.disabled = true;
4733 05 Apr 18 olle 220     }
4733 05 Apr 18 olle 221
4733 05 Apr 18 olle 222     if (caseInfo && caseInfo.patient)
4733 05 Apr 18 olle 223     {
4733 05 Apr 18 olle 224       frm.personalNumber.value = caseInfo.patient.personalNumber;
4733 05 Apr 18 olle 225       persinfo.personalNumberOnChange();
4733 05 Apr 18 olle 226       Wizard.goNext(false);
4733 05 Apr 18 olle 227     }
4733 05 Apr 18 olle 228   }
4733 05 Apr 18 olle 229
4733 05 Apr 18 olle 230   persinfo.personalNumberOnChange = function()
4733 05 Apr 18 olle 231   {
4733 05 Apr 18 olle 232     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 233     var pnr = frm.personalNumber.value;
4733 05 Apr 18 olle 234     pnrIsValid = false;
4733 05 Apr 18 olle 235     pnrIsAcceptable = true;
4733 05 Apr 18 olle 236     
4733 05 Apr 18 olle 237     var pnrLen = pnr.length;
4733 05 Apr 18 olle 238     if (pnrLen != 12 && pnrLen != 10)
4733 05 Apr 18 olle 239     {
4733 05 Apr 18 olle 240       Wizard.setInputStatus('personalNumber', 'warning', pnrLen < 12 ? 'Too short' : 'Too long');
4733 05 Apr 18 olle 241       return;
4733 05 Apr 18 olle 242     }
4733 05 Apr 18 olle 243
4733 05 Apr 18 olle 244     if (!pnr.match(/^\d+$/))
4733 05 Apr 18 olle 245     {
4733 05 Apr 18 olle 246       Wizard.setInputStatus('personalNumber', 'warning', 'Non-standard personal number');
4733 05 Apr 18 olle 247       return;
4733 05 Apr 18 olle 248     }
4733 05 Apr 18 olle 249     
4733 05 Apr 18 olle 250     var datePart = pnr.substring(0, pnrLen - 4); // Remove last four digits
4733 05 Apr 18 olle 251     var dateFormat = pnrLen == 10 ? 'yyMMdd' : 'yyyyMMdd';
4733 05 Apr 18 olle 252     var isValidDate = Dates.isDate(datePart, dateFormat);
4733 05 Apr 18 olle 253     if (!isValidDate)
4733 05 Apr 18 olle 254     {
4733 05 Apr 18 olle 255       var dayInMonth = parseInt(datePart.substring(-2), 10); // Last two characters
4733 05 Apr 18 olle 256       if (dayInMonth > 60)
4733 05 Apr 18 olle 257       {
4733 05 Apr 18 olle 258         // 'Samordningsnummer' has day-in-month + 60; check this
4733 05 Apr 18 olle 259         dayInMonth -= 60;
4733 05 Apr 18 olle 260         var tmpPnr = pnr.substring(0, pnrLen - 6); // First 4 or 6 digits is year+month
4733 05 Apr 18 olle 261         if (dayInMonth < 10) tmpPnr += '0';
4733 05 Apr 18 olle 262         tmpPnr += dayInMonth;
4733 05 Apr 18 olle 263         isValidDate = Dates.isDate(tmpPnr, dateFormat);
4733 05 Apr 18 olle 264       }
4733 05 Apr 18 olle 265     }
4733 05 Apr 18 olle 266     if (!isValidDate)
4733 05 Apr 18 olle 267     {
4733 05 Apr 18 olle 268       Wizard.setInputStatus('personalNumber', 'warning', 'Not a valid date');
4733 05 Apr 18 olle 269       return;
4733 05 Apr 18 olle 270     }
4733 05 Apr 18 olle 271     
4733 05 Apr 18 olle 272     if (!Meludi.personalNumberControlDigitCheck(pnr.substr(pnrLen == 10 ? 0 : 2)))
4733 05 Apr 18 olle 273     {
4733 05 Apr 18 olle 274       Wizard.setInputStatus('personalNumber', 'warning', 'Invalid control digit');
4733 05 Apr 18 olle 275       return;
4733 05 Apr 18 olle 276     }
4733 05 Apr 18 olle 277
4733 05 Apr 18 olle 278     Wizard.setInputStatus('personalNumber', 'valid');
4733 05 Apr 18 olle 279     pnrIsValid = true;
4733 05 Apr 18 olle 280     Wizard.hideGoNextConfirmation();
4733 05 Apr 18 olle 281   }
4733 05 Apr 18 olle 282
4733 05 Apr 18 olle 283   persinfo.validateStep1 = function(event)
4733 05 Apr 18 olle 284   {
4733 05 Apr 18 olle 285     if (event.detail.auto)
4733 05 Apr 18 olle 286     {
4733 05 Apr 18 olle 287       if (!caseIsValid || !pnrIsValid) 
4733 05 Apr 18 olle 288       {
4733 05 Apr 18 olle 289         if (pnrIsAcceptable)
4733 05 Apr 18 olle 290         {
4733 05 Apr 18 olle 291           var frm = document.forms['meludi'];
4733 05 Apr 18 olle 292           frm.personalNumber.focus();
4733 05 Apr 18 olle 293           Wizard.showGoNextConfirmation(true, 'Check to verify registration of non-standard personal number.');
4733 05 Apr 18 olle 294         }
4733 05 Apr 18 olle 295         event.preventDefault();
4733 05 Apr 18 olle 296       }
4733 05 Apr 18 olle 297     }
4733 05 Apr 18 olle 298     else
4733 05 Apr 18 olle 299     {
4733 05 Apr 18 olle 300       if (!caseIsValid || !pnrIsAcceptable) event.preventDefault();
4733 05 Apr 18 olle 301     }
4733 05 Apr 18 olle 302   }
4733 05 Apr 18 olle 303
4733 05 Apr 18 olle 304   persinfo.initializeStep2 = function(event)
4733 05 Apr 18 olle 305   {
4733 05 Apr 18 olle 306     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 307     var pnr = frm.personalNumber.value;
4733 05 Apr 18 olle 308     if (pnr.length == 10 && pnrIsValid) 
4733 05 Apr 18 olle 309     {
4733 05 Apr 18 olle 310       var year = Meludi.fullYear(parseInt(pnr.substr(0, 2), 10));
4733 05 Apr 18 olle 311       pnr = year + pnr.substr(2);
4733 05 Apr 18 olle 312     }
4733 05 Apr 18 olle 313   
4733 05 Apr 18 olle 314     var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 315     url += '&cmd=GetPatientInfo';
4733 05 Apr 18 olle 316     url += '&personalNumber=' + encodeURIComponent(pnr);
4733 05 Apr 18 olle 317     url += '&pnrIsValid=' + pnrIsValid;
4733 05 Apr 18 olle 318
4733 05 Apr 18 olle 319     Wizard.showLoadingAnimation('Loading patient information...');
4733 05 Apr 18 olle 320     Wizard.asyncJsonRequest(url, persinfo.patientInfoLoaded);
4733 05 Apr 18 olle 321   }
4733 05 Apr 18 olle 322
4733 05 Apr 18 olle 323   
4733 05 Apr 18 olle 324   persinfo.patientInfoLoaded = function(response)
4733 05 Apr 18 olle 325   {
4733 05 Apr 18 olle 326     Wizard.setCurrentStep(2);
4733 05 Apr 18 olle 327     // Get patient information from the AJAX response
4733 05 Apr 18 olle 328     patientInfo = response.patientInfo;
4733 05 Apr 18 olle 329     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 330
4733 05 Apr 18 olle 331
4733 05 Apr 18 olle 332     frm.patientCode.value=patientInfo.name;
4733 05 Apr 18 olle 333     frm.familyName.value = patientInfo.familyName || '';
4733 05 Apr 18 olle 334     frm.allFirstNames.value = patientInfo.allFirstNames || '';
4733 05 Apr 18 olle 335     Doc.element('dateOfBirth').innerHTML = patientInfo.dateOfBirth ? Strings.encodeTags(patientInfo.dateOfBirth) : '---';
4733 05 Apr 18 olle 336     Doc.element('gender').innerHTML = patientInfo.gender ? Strings.encodeTags(patientInfo.gender) : '---';
4733 05 Apr 18 olle 337     frm.familyName.focus();
4733 05 Apr 18 olle 338
4733 05 Apr 18 olle 339     if (!patientInfo.id)
4733 05 Apr 18 olle 340     {
4733 05 Apr 18 olle 341       if (!pnrIsValid)
4733 05 Apr 18 olle 342       {
4733 05 Apr 18 olle 343         Wizard.setInputStatus('gender', 'warning', 'Gender and DateOfBirth can\'t be automatically generated for non-standard Personal number');
4733 05 Apr 18 olle 344       }
4733 05 Apr 18 olle 345     }
4733 05 Apr 18 olle 346     else
4733 05 Apr 18 olle 347     {
4733 05 Apr 18 olle 348       Doc.element('step-2-title').innerHTML = 'Existing patient: Verify names';
4733 05 Apr 18 olle 349       frm.patientCode.disabled = true;
4733 05 Apr 18 olle 350     }
4733 05 Apr 18 olle 351     
4733 05 Apr 18 olle 352     Doc.show('gonext');
4733 05 Apr 18 olle 353     Doc.show('gocancel');
4733 05 Apr 18 olle 354     
4733 05 Apr 18 olle 355   }
4733 05 Apr 18 olle 356   
4733 05 Apr 18 olle 357   persinfo.nameOnChange = function(event)
4733 05 Apr 18 olle 358   {
4733 05 Apr 18 olle 359     var field = event.target;
4733 05 Apr 18 olle 360     patientInfo[field.name] = field.value;
4733 05 Apr 18 olle 361     if (field.value == '')
4733 05 Apr 18 olle 362     {
4733 05 Apr 18 olle 363       Wizard.setInputStatus(field, 'warning', 'Missing');
4733 05 Apr 18 olle 364     }
4733 05 Apr 18 olle 365     else
4733 05 Apr 18 olle 366     {
4733 05 Apr 18 olle 367       Wizard.setInputStatus(field, 'valid');
4733 05 Apr 18 olle 368       Wizard.hideGoNextConfirmation();
4733 05 Apr 18 olle 369     }
4733 05 Apr 18 olle 370   }
4733 05 Apr 18 olle 371
4733 05 Apr 18 olle 372   persinfo.validateStep2 = function(event)
4733 05 Apr 18 olle 373   {
4733 05 Apr 18 olle 374     var valid = true;
4733 05 Apr 18 olle 375     var acceptable = true;
4733 05 Apr 18 olle 376     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 377
4733 05 Apr 18 olle 378     if (frm.allFirstNames.value == '')
4733 05 Apr 18 olle 379     {
4733 05 Apr 18 olle 380       Wizard.setInputStatus('allFirstNames', 'warning', 'Missing');
4733 05 Apr 18 olle 381       valid = false;
4733 05 Apr 18 olle 382     }
4733 05 Apr 18 olle 383     else
4733 05 Apr 18 olle 384     {
4733 05 Apr 18 olle 385       Wizard.setInputStatus('allFirstNames', 'valid');
4733 05 Apr 18 olle 386     }
4733 05 Apr 18 olle 387     
4733 05 Apr 18 olle 388     if (frm.familyName.value == '')
4733 05 Apr 18 olle 389     {
4733 05 Apr 18 olle 390       Wizard.setInputStatus('familyName', 'warning', 'Missing');
4733 05 Apr 18 olle 391       valid = false;
4733 05 Apr 18 olle 392     }
4733 05 Apr 18 olle 393     else
4733 05 Apr 18 olle 394     {
4733 05 Apr 18 olle 395       Wizard.setInputStatus('familyName', 'valid');
4733 05 Apr 18 olle 396     }
4733 05 Apr 18 olle 397
4733 05 Apr 18 olle 398     // New patient only
4733 05 Apr 18 olle 399     if (!patientInfo.id)
4733 05 Apr 18 olle 400     {
4733 05 Apr 18 olle 401       if (frm.patientCode.value == '')
4733 05 Apr 18 olle 402       {
4733 05 Apr 18 olle 403         Wizard.setInputStatus('patientCode', 'invalid', 'Missing');
4733 05 Apr 18 olle 404         frm.patientCode.focus();
4733 05 Apr 18 olle 405         valid = false;
4733 05 Apr 18 olle 406         acceptable = false;
4733 05 Apr 18 olle 407       }
4733 05 Apr 18 olle 408       else
4733 05 Apr 18 olle 409       {
4733 05 Apr 18 olle 410         Wizard.setInputStatus('patientCode', 'valid');
4733 05 Apr 18 olle 411         patientInfo.name = frm.patientCode.value;
4733 05 Apr 18 olle 412       }  
4733 05 Apr 18 olle 413     }
4733 05 Apr 18 olle 414     
4733 05 Apr 18 olle 415     if (event.detail.auto)
4733 05 Apr 18 olle 416     {
4733 05 Apr 18 olle 417       if (!valid)
4733 05 Apr 18 olle 418       {
4733 05 Apr 18 olle 419         Wizard.showGoNextConfirmation(true, 'Check to verify registration with missing name(s).');
4733 05 Apr 18 olle 420         event.preventDefault();
4733 05 Apr 18 olle 421       }
4733 05 Apr 18 olle 422     }
4733 05 Apr 18 olle 423     else
4733 05 Apr 18 olle 424     {
4733 05 Apr 18 olle 425       if (!acceptable) event.preventDefault();
4733 05 Apr 18 olle 426     }
4733 05 Apr 18 olle 427     
4733 05 Apr 18 olle 428   }
4733 05 Apr 18 olle 429   
4733 05 Apr 18 olle 430   persinfo.initializeStep3 = function()
4733 05 Apr 18 olle 431   {
4733 05 Apr 18 olle 432     // Check entered case and pnr with AJAX
4733 05 Apr 18 olle 433     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 434     var updateMode = caseInfo.id && caseInfo.patient;
4733 05 Apr 18 olle 435     
4733 05 Apr 18 olle 436     // Generate list of specimen tubes
4733 05 Apr 18 olle 437     var hasUnknownSpecimen = false;
4733 05 Apr 18 olle 438     var hasSpecimen = caseInfo.specimen && caseInfo.specimen.length > 0;
4733 05 Apr 18 olle 439     var hasDna = caseInfo.dna && caseInfo.dna.length > 0;
4733 05 Apr 18 olle 440     var hasRna = caseInfo.rna && caseInfo.rna.length > 0;
4733 05 Apr 18 olle 441     var thisCasePlNumber = null;
4733 05 Apr 18 olle 442     var hasPlNumber = false;
4733 05 Apr 18 olle 443     var thisCasePAD = null;
4733 05 Apr 18 olle 444     var hasPAD = false;
4733 05 Apr 18 olle 445     var thisCaseSamplingDate = null;
4733 05 Apr 18 olle 446     var thisCaseExtractionDate = null;
4733 05 Apr 18 olle 447     var thisCaseTubeContentType = caseInfo.tubeContentType;
4733 05 Apr 18 olle 448     var thisCaseSpecimenType = null;
4733 05 Apr 18 olle 449     var thisCaseSpecimenInputType = null;
4733 05 Apr 18 olle 450     var thisCaseViableTumourCellsPercent = null;
4733 05 Apr 18 olle 451
4733 05 Apr 18 olle 452     if (hasSpecimen)
4733 05 Apr 18 olle 453     {
4733 05 Apr 18 olle 454       var specimenTubes = '';
4733 05 Apr 18 olle 455       for (var i = 0; i < caseInfo.specimen.length; i++)
4733 05 Apr 18 olle 456       {
4733 05 Apr 18 olle 457         var specimen = caseInfo.specimen[i];
4733 05 Apr 18 olle 458         specimenTubes += Strings.encodeTags(specimen.name);
4733 05 Apr 18 olle 459         if (specimen.plNumber && !hasPlNumber) 
4733 05 Apr 18 olle 460         {
4733 05 Apr 18 olle 461           hasPlNumber = true;
4733 05 Apr 18 olle 462           thisCasePlNumber = specimen.plNumber;
4733 05 Apr 18 olle 463         }
4733 05 Apr 18 olle 464         if (specimen.pad && !hasPAD) 
4733 05 Apr 18 olle 465         {
4733 05 Apr 18 olle 466           hasPAD = true;
4733 05 Apr 18 olle 467           thisCasePAD = specimen.pad;
4733 05 Apr 18 olle 468         }
4733 05 Apr 18 olle 469         if (specimen.samplingDate && !thisCaseSamplingDate) 
4733 05 Apr 18 olle 470         {
4733 05 Apr 18 olle 471           thisCaseSamplingDate = specimen.samplingDate;
4733 05 Apr 18 olle 472         }
4733 05 Apr 18 olle 473         if (specimen.specimenType && !thisCaseSpecimenType) 
4733 05 Apr 18 olle 474         {
4733 05 Apr 18 olle 475           thisCaseSpecimenType = specimen.specimenType;
4733 05 Apr 18 olle 476         }
4733 05 Apr 18 olle 477         if (specimen.specimenInputType && !thisCaseSpecimenInputType) 
4733 05 Apr 18 olle 478         {
4733 05 Apr 18 olle 479           thisCaseSpecimenInputType = specimen.specimenInputType;
4733 05 Apr 18 olle 480         }
4733 05 Apr 18 olle 481         if (specimen.viableTumourCellsPercent && !thisCaseViableTumourCellsPercent) 
4733 05 Apr 18 olle 482         {
4733 05 Apr 18 olle 483           thisCaseViableTumourCellsPercent = specimen.viableTumourCellsPercent;
4733 05 Apr 18 olle 484         }
4733 05 Apr 18 olle 485         specimenTubes += '<br>';
4733 05 Apr 18 olle 486       }
4733 05 Apr 18 olle 487       Doc.element('tubeContentType').value = thisCaseTubeContentType;
4733 05 Apr 18 olle 488       Doc.element('specimenType').value = thisCaseSpecimenType;
4733 05 Apr 18 olle 489       Doc.element('specimenInputType').value = thisCaseSpecimenInputType;
4733 05 Apr 18 olle 490
4733 05 Apr 18 olle 491       Doc.show('specimenTubesSection');
4733 05 Apr 18 olle 492       Doc.element('specimenTubes').innerHTML = specimenTubes;
4733 05 Apr 18 olle 493
4733 05 Apr 18 olle 494       Doc.hide('nofTubesSection');
4733 05 Apr 18 olle 495       Doc.hide('arrivalDateSection');
4733 05 Apr 18 olle 496
4733 05 Apr 18 olle 497       Doc.show('specimenTubesSection');
4733 05 Apr 18 olle 498       Doc.show('samplingDateSection');
4733 05 Apr 18 olle 499       
4733 05 Apr 18 olle 500       Doc.hide('mutationAnalysisSection');
4733 05 Apr 18 olle 501       Doc.hide('siteSection');
4733 05 Apr 18 olle 502       Doc.hide('sampleTypeSection');
4733 05 Apr 18 olle 503       Doc.hide('projectFocusSection');
4733 05 Apr 18 olle 504       Doc.hide('metastasisSiteSection');
4733 05 Apr 18 olle 505       Doc.hide('otherPathNoteSection');
4733 05 Apr 18 olle 506
4733 05 Apr 18 olle 507       // Populate 'Sampling date' field
4733 05 Apr 18 olle 508       if (thisCaseSamplingDate != null)
4733 05 Apr 18 olle 509       {
4733 05 Apr 18 olle 510         frm.samplingDate.value = thisCaseSamplingDate.substring(0, 8);
4733 05 Apr 18 olle 511         persinfo.samplingDateOnChange();
4733 05 Apr 18 olle 512       }
4733 05 Apr 18 olle 513     
4733 05 Apr 18 olle 514       // Populate 'Viable tumour cells percent' field
4733 05 Apr 18 olle 515       if (thisCaseViableTumourCellsPercent != null)
4733 05 Apr 18 olle 516       {
4733 05 Apr 18 olle 517         frm.viableTumourCellsPercent.value = thisCaseViableTumourCellsPercent;
4733 05 Apr 18 olle 518         persinfo.viableTumourCellsPercentOnChange();
4733 05 Apr 18 olle 519       }
4733 05 Apr 18 olle 520     
4733 05 Apr 18 olle 521       frm.plNumber.value = thisCasePlNumber;
4733 05 Apr 18 olle 522       frm.pad.value = thisCasePAD;
4733 05 Apr 18 olle 523
4733 05 Apr 18 olle 524       if (caseInfo.id != null && typeof caseInfo.id != 'undefined')
4733 05 Apr 18 olle 525       {
4733 05 Apr 18 olle 526         frm.samplingDate.disabled = true;
4733 05 Apr 18 olle 527         frm.tubeContentType.disabled = true;
4733 05 Apr 18 olle 528         frm.specimenType.disabled = true;
4733 05 Apr 18 olle 529         frm.specimenInputType.disabled = true;
4733 05 Apr 18 olle 530         frm.viableTumourCellsPercent.disabled = true;
4733 05 Apr 18 olle 531       }
4733 05 Apr 18 olle 532
4733 05 Apr 18 olle 533       // Existing cases for this patient
4733 05 Apr 18 olle 534       var hasUnknownCase = false;
4733 05 Apr 18 olle 535       if (patientInfo.cases && patientInfo.cases.length > 0)
4733 05 Apr 18 olle 536       {
4733 05 Apr 18 olle 537         var cases = '';
4733 05 Apr 18 olle 538       
4733 05 Apr 18 olle 539         if (patientInfo.cases.length == 1 || updateMode)
4733 05 Apr 18 olle 540         {
4733 05 Apr 18 olle 541           if (!updateMode)
4733 05 Apr 18 olle 542           {
4733 05 Apr 18 olle 543             cases += '[<i>new case</i>]<br>';
4733 05 Apr 18 olle 544           }        
4733 05 Apr 18 olle 545         }
4733 05 Apr 18 olle 546       
4733 05 Apr 18 olle 547         if (updateMode)
4733 05 Apr 18 olle 548         {
4733 05 Apr 18 olle 549           if (caseInfo.merged)
4733 05 Apr 18 olle 550           {
4733 05 Apr 18 olle 551             Doc.element('step-3-title').innerHTML = 'Update case \''+Strings.encodeTags(caseInfo.originalName)+'\' (which is merged with case \'' + Strings.encodeTags(caseInfo.name) + '\')';
4733 05 Apr 18 olle 552           }
4733 05 Apr 18 olle 553           else
4733 05 Apr 18 olle 554           {
4733 05 Apr 18 olle 555             Doc.element('step-3-title').innerHTML = 'Update case \''+Strings.encodeTags(caseInfo.name)+'\'';
4733 05 Apr 18 olle 556           }
4733 05 Apr 18 olle 557         
4733 05 Apr 18 olle 558         }
4733 05 Apr 18 olle 559         else if (patientInfo.cases.length == 2)
4733 05 Apr 18 olle 560         {
4733 05 Apr 18 olle 561           Doc.element('step-3-title').innerHTML = 'Merge with existing case';  
4733 05 Apr 18 olle 562         }
4733 05 Apr 18 olle 563         else if (patientInfo.cases.length > 0)
4733 05 Apr 18 olle 564         {
4733 05 Apr 18 olle 565           Doc.element('step-3-title').innerHTML = 'Create new case or merge with existing case';
4733 05 Apr 18 olle 566         }
4733 05 Apr 18 olle 567       }
4733 05 Apr 18 olle 568
4733 05 Apr 18 olle 569       Wizard.setCurrentStep(3);
4733 05 Apr 18 olle 570       if (updateMode)
4733 05 Apr 18 olle 571       {
4733 05 Apr 18 olle 572         Doc.show('goupdate');
4733 05 Apr 18 olle 573       }
4733 05 Apr 18 olle 574       else
4733 05 Apr 18 olle 575       {
4733 05 Apr 18 olle 576         Doc.show('goregister');
4733 05 Apr 18 olle 577       }
4733 05 Apr 18 olle 578       Doc.show('gocancel');
4733 05 Apr 18 olle 579       frm.plNumber.focus();
4733 05 Apr 18 olle 580     }
4733 05 Apr 18 olle 581     else if (hasDna)
4733 05 Apr 18 olle 582     {
4733 05 Apr 18 olle 583       var dnaTubes = '';
4733 05 Apr 18 olle 584       for (var i = 0; i < caseInfo.dna.length; i++)
4733 05 Apr 18 olle 585       {
4733 05 Apr 18 olle 586         var dna = caseInfo.dna[i];
4733 05 Apr 18 olle 587         dnaTubes += Strings.encodeTags(dna.name);
4733 05 Apr 18 olle 588         if (dna.extractionDate && !thisCaseExtractionDate) 
4733 05 Apr 18 olle 589         {
4733 05 Apr 18 olle 590           thisCaseExtractionDate = dna.extractionDate;
4733 05 Apr 18 olle 591         }
4733 05 Apr 18 olle 592         dnaTubes += '<br>';
4733 05 Apr 18 olle 593       }
4733 05 Apr 18 olle 594       Doc.element('tubeContentType').value = thisCaseTubeContentType;
4733 05 Apr 18 olle 595
4733 05 Apr 18 olle 596       frm.plNumber.disabled = true;
4733 05 Apr 18 olle 597       Doc.element('plNumberMessageText').innerHTML = "No PL-number can be saved for case without specimen.";
4733 05 Apr 18 olle 598       frm.pad.disabled = true;
4733 05 Apr 18 olle 599       Doc.element('padMessageText').innerHTML = "No PAD/CL number can be saved for case without specimen.";
4733 05 Apr 18 olle 600
4733 05 Apr 18 olle 601       Doc.show('specimenTubesSection');
4733 05 Apr 18 olle 602       Doc.element('specimenTubesTitle').innerHTML = "DNA tubes";
4733 05 Apr 18 olle 603       Doc.element('specimenTubes').innerHTML = dnaTubes;
4733 05 Apr 18 olle 604       Doc.element('specimenTubesMessageText').innerHTML = "The DNA tube(s) associated with this case.";
4733 05 Apr 18 olle 605
4733 05 Apr 18 olle 606       Doc.hide('nofTubesSection');
4733 05 Apr 18 olle 607       Doc.hide('arrivalDateSection');
4733 05 Apr 18 olle 608
4733 05 Apr 18 olle 609       Doc.show('specimenTubesSection');
4733 05 Apr 18 olle 610       Doc.show('samplingDateSection');
4733 05 Apr 18 olle 611       
4733 05 Apr 18 olle 612       Doc.hide('mutationAnalysisSection');
4733 05 Apr 18 olle 613       Doc.hide('siteSection');
4733 05 Apr 18 olle 614       Doc.hide('sampleTypeSection');
4733 05 Apr 18 olle 615       Doc.hide('projectFocusSection');
4733 05 Apr 18 olle 616       Doc.hide('metastasisSiteSection');
4733 05 Apr 18 olle 617       Doc.hide('otherPathNoteSection');
4733 05 Apr 18 olle 618
4733 05 Apr 18 olle 619       thisCaseSamplingDate = thisCaseExtractionDate;
4733 05 Apr 18 olle 620       // Populate 'Sampling date' field
4733 05 Apr 18 olle 621       if (thisCaseSamplingDate != null)
4733 05 Apr 18 olle 622       {
4733 05 Apr 18 olle 623         frm.samplingDate.value = thisCaseSamplingDate.substring(0, 8);
4733 05 Apr 18 olle 624         persinfo.samplingDateOnChange();
4733 05 Apr 18 olle 625       }
4733 05 Apr 18 olle 626     
4733 05 Apr 18 olle 627       frm.plNumber.value = thisCasePlNumber;
4733 05 Apr 18 olle 628       frm.pad.value = thisCasePAD;
4733 05 Apr 18 olle 629
4733 05 Apr 18 olle 630       if (caseInfo.id != null && typeof caseInfo.id != 'undefined')
4733 05 Apr 18 olle 631       {
4733 05 Apr 18 olle 632         frm.samplingDate.disabled = true;
4733 05 Apr 18 olle 633         frm.tubeContentType.disabled = true;
4733 05 Apr 18 olle 634         frm.specimenType.disabled = true;
4733 05 Apr 18 olle 635         frm.specimenInputType.disabled = true;
4733 05 Apr 18 olle 636         frm.viableTumourCellsPercent.disabled = true;
4733 05 Apr 18 olle 637       }
4733 05 Apr 18 olle 638
4733 05 Apr 18 olle 639       Wizard.setCurrentStep(3);
4733 05 Apr 18 olle 640       if (updateMode)
4733 05 Apr 18 olle 641       {
4733 05 Apr 18 olle 642         Doc.show('goupdate');
4733 05 Apr 18 olle 643       }
4733 05 Apr 18 olle 644       else
4733 05 Apr 18 olle 645       {
4733 05 Apr 18 olle 646         Doc.show('goregister');
4733 05 Apr 18 olle 647       }
4733 05 Apr 18 olle 648       Doc.show('gocancel');
4733 05 Apr 18 olle 649       frm.plNumber.focus();
4733 05 Apr 18 olle 650     }
4733 05 Apr 18 olle 651     else if (hasRna)
4733 05 Apr 18 olle 652     {
4733 05 Apr 18 olle 653       var rnaTubes = '';
4733 05 Apr 18 olle 654       for (var i = 0; i < caseInfo.rna.length; i++)
4733 05 Apr 18 olle 655       {
4733 05 Apr 18 olle 656         var rna = caseInfo.rna[i];
4733 05 Apr 18 olle 657         rnaTubes += Strings.encodeTags(rna.name);
4733 05 Apr 18 olle 658         if (rna.extractionDate && !thisCaseExtractionDate) 
4733 05 Apr 18 olle 659         {
4733 05 Apr 18 olle 660           thisCaseExtractionDate = rna.extractionDate;
4733 05 Apr 18 olle 661         }
4733 05 Apr 18 olle 662         rnaTubes += '<br>';
4733 05 Apr 18 olle 663       }
4733 05 Apr 18 olle 664       Doc.element('tubeContentType').value = thisCaseTubeContentType;
4733 05 Apr 18 olle 665
4733 05 Apr 18 olle 666       frm.plNumber.disabled = true;
4733 05 Apr 18 olle 667       Doc.element('plNumberMessageText').innerHTML = "No PL-number can be saved for case without specimen.";
4733 05 Apr 18 olle 668       frm.pad.disabled = true;
4733 05 Apr 18 olle 669       Doc.element('padMessageText').innerHTML = "No PAD/CL number can be saved for case without specimen.";
4733 05 Apr 18 olle 670
4733 05 Apr 18 olle 671       Doc.show('specimenTubesSection');
4733 05 Apr 18 olle 672       Doc.element('specimenTubesTitle').innerHTML = "RNA tubes";
4733 05 Apr 18 olle 673       Doc.element('specimenTubes').innerHTML = rnaTubes;
4733 05 Apr 18 olle 674       Doc.element('specimenTubesMessageText').innerHTML = "The RNA tube(s) associated with this case.";
4733 05 Apr 18 olle 675
4733 05 Apr 18 olle 676       Doc.hide('nofTubesSection');
4733 05 Apr 18 olle 677       Doc.hide('arrivalDateSection');
4733 05 Apr 18 olle 678
4733 05 Apr 18 olle 679       Doc.show('specimenTubesSection');
4733 05 Apr 18 olle 680       Doc.show('samplingDateSection');
4733 05 Apr 18 olle 681       
4733 05 Apr 18 olle 682       Doc.hide('mutationAnalysisSection');
4733 05 Apr 18 olle 683       Doc.hide('siteSection');
4733 05 Apr 18 olle 684       Doc.hide('sampleTypeSection');
4733 05 Apr 18 olle 685       Doc.hide('projectFocusSection');
4733 05 Apr 18 olle 686       Doc.hide('metastasisSiteSection');
4733 05 Apr 18 olle 687       Doc.hide('otherPathNoteSection');
4733 05 Apr 18 olle 688
4733 05 Apr 18 olle 689       thisCaseSamplingDate = thisCaseExtractionDate;
4733 05 Apr 18 olle 690       // Populate 'Sampling date' field
4733 05 Apr 18 olle 691       if (thisCaseSamplingDate != null)
4733 05 Apr 18 olle 692       {
4733 05 Apr 18 olle 693         frm.samplingDate.value = thisCaseSamplingDate.substring(0, 8);
4733 05 Apr 18 olle 694         persinfo.samplingDateOnChange();
4733 05 Apr 18 olle 695       }
4733 05 Apr 18 olle 696     
4733 05 Apr 18 olle 697       frm.plNumber.value = thisCasePlNumber;
4733 05 Apr 18 olle 698       frm.pad.value = thisCasePAD;
4733 05 Apr 18 olle 699
4733 05 Apr 18 olle 700       if (caseInfo.id != null && typeof caseInfo.id != 'undefined')
4733 05 Apr 18 olle 701       {
4733 05 Apr 18 olle 702         frm.samplingDate.disabled = true;
4733 05 Apr 18 olle 703         frm.tubeContentType.disabled = true;
4733 05 Apr 18 olle 704         frm.specimenType.disabled = true;
4733 05 Apr 18 olle 705         frm.specimenInputType.disabled = true;
4733 05 Apr 18 olle 706         frm.viableTumourCellsPercent.disabled = true;
4733 05 Apr 18 olle 707       }
4733 05 Apr 18 olle 708
4733 05 Apr 18 olle 709       Wizard.setCurrentStep(3);
4733 05 Apr 18 olle 710       if (updateMode)
4733 05 Apr 18 olle 711       {
4733 05 Apr 18 olle 712         Doc.show('goupdate');
4733 05 Apr 18 olle 713       }
4733 05 Apr 18 olle 714       else
4733 05 Apr 18 olle 715       {
4733 05 Apr 18 olle 716         Doc.show('goregister');
4733 05 Apr 18 olle 717       }
4733 05 Apr 18 olle 718       Doc.show('gocancel');
4733 05 Apr 18 olle 719       frm.plNumber.focus();
4733 05 Apr 18 olle 720     }
4733 05 Apr 18 olle 721     else
4733 05 Apr 18 olle 722     {
4733 05 Apr 18 olle 723       Doc.hide('specimenTubesSection');  
4733 05 Apr 18 olle 724       Wizard.setCurrentStep(3);
4733 05 Apr 18 olle 725       Doc.show('gocancel');
4733 05 Apr 18 olle 726       Doc.show('gonext');
4733 05 Apr 18 olle 727     
4733 05 Apr 18 olle 728       frm.arrivalDate.value = Dates.formatDate(new Date(), 'yyyyMMdd');
4733 05 Apr 18 olle 729
4733 05 Apr 18 olle 730       frm.plNumber.focus();
4733 05 Apr 18 olle 731       frm.nofTubes.setSelectionRange(0,1);
4734 05 Apr 18 olle 732       frm.mutationAnalysisTst170.checked = true;
4733 05 Apr 18 olle 733     }
4733 05 Apr 18 olle 734   }
4733 05 Apr 18 olle 735
4733 05 Apr 18 olle 736   persinfo.plNumberOnChange = function()
4733 05 Apr 18 olle 737   {
4733 05 Apr 18 olle 738     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 739     var plNumber = frm.plNumber.value;
4733 05 Apr 18 olle 740     if (plNumber == '')
4733 05 Apr 18 olle 741     {
4733 05 Apr 18 olle 742       Wizard.setInputStatus('plNumber', 'warning', 'Missing');
4733 05 Apr 18 olle 743       return;
4733 05 Apr 18 olle 744     }
4733 05 Apr 18 olle 745     frm.plNumber.value = plNumber.replace(/\+/, '-');
4733 05 Apr 18 olle 746     Wizard.setInputStatus('plNumber', 'valid');
4733 05 Apr 18 olle 747   }
4733 05 Apr 18 olle 748
4733 05 Apr 18 olle 749   persinfo.padOnChange = function()
4733 05 Apr 18 olle 750   {
4733 05 Apr 18 olle 751     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 752     var PAD = frm.pad.value;
4733 05 Apr 18 olle 753     if (PAD == '')
4733 05 Apr 18 olle 754     {
4733 05 Apr 18 olle 755       Wizard.setInputStatus('pad', 'warning', 'Missing');
4733 05 Apr 18 olle 756       return;
4733 05 Apr 18 olle 757     }
4733 05 Apr 18 olle 758     frm.pad.value = PAD.replace(/\+/, '-');
4733 05 Apr 18 olle 759     Wizard.setInputStatus('pad', 'valid');
4733 05 Apr 18 olle 760   }
4733 05 Apr 18 olle 761
4733 05 Apr 18 olle 762   persinfo.samplingDateTimeFocus = function(event)
4733 05 Apr 18 olle 763   {
4733 05 Apr 18 olle 764     if (event.keyCode == 13)
4733 05 Apr 18 olle 765     {
4733 05 Apr 18 olle 766       var focusTo = caseInfo.specimen && caseInfo.specimen.length > 0 ? 'mutationAnalysis' : 'reasonIfNoSpecimen'
4733 05 Apr 18 olle 767       Doc.element(focusTo).focus();
4733 05 Apr 18 olle 768     }
4733 05 Apr 18 olle 769   }
4733 05 Apr 18 olle 770   
4733 05 Apr 18 olle 771   persinfo.nofTubesOnChange = function()
4733 05 Apr 18 olle 772   {
4733 05 Apr 18 olle 773     nofTubesIsValid = false;
4733 05 Apr 18 olle 774
4733 05 Apr 18 olle 775     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 776     var nofTubes = frm.nofTubes.value;
4733 05 Apr 18 olle 777     
4733 05 Apr 18 olle 778     if (nofTubes == '')
4733 05 Apr 18 olle 779     {
4733 05 Apr 18 olle 780       Wizard.setInputStatus('nofTubes', 'invalid', 'Missing');
4733 05 Apr 18 olle 781       return;
4733 05 Apr 18 olle 782     }
4733 05 Apr 18 olle 783     if (parseInt(nofTubes) < 1)
4733 05 Apr 18 olle 784     {
4733 05 Apr 18 olle 785       Wizard.setInputStatus('nofTubes', 'invalid', 'Must be at least 1');
4733 05 Apr 18 olle 786       return;    
4733 05 Apr 18 olle 787     }
4733 05 Apr 18 olle 788     Wizard.setInputStatus('nofTubes', 'valid');
4733 05 Apr 18 olle 789     nofTubesIsValid = true; 
4733 05 Apr 18 olle 790   }
4733 05 Apr 18 olle 791
4733 05 Apr 18 olle 792   persinfo.samplingDateOnChange = function()
4733 05 Apr 18 olle 793   {
4733 05 Apr 18 olle 794     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 795     samplingDateIsValid = false;
4733 05 Apr 18 olle 796     Wizard.setInputStatus('samplingDate');
4733 05 Apr 18 olle 797     
4733 05 Apr 18 olle 798     var samplingDate = frm.samplingDate.value;
4733 05 Apr 18 olle 799     
4733 05 Apr 18 olle 800     if (samplingDate == '')
4733 05 Apr 18 olle 801     {
4733 05 Apr 18 olle 802       Wizard.setInputStatus('samplingDate', 'warning', 'Missing date');
4733 05 Apr 18 olle 803     }
4733 05 Apr 18 olle 804     else
4733 05 Apr 18 olle 805     {
4733 05 Apr 18 olle 806       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
4733 05 Apr 18 olle 807       samplingDate = Meludi.autoFillDate(samplingDate, true);
4733 05 Apr 18 olle 808       frm.samplingDate.value = samplingDate;
4733 05 Apr 18 olle 809
4733 05 Apr 18 olle 810       if (samplingDate != '' && !Dates.isDate(samplingDate, 'yyyyMMdd'))
4733 05 Apr 18 olle 811       {
4733 05 Apr 18 olle 812         Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid date');
4733 05 Apr 18 olle 813         return;
4733 05 Apr 18 olle 814       }
4733 05 Apr 18 olle 815
4733 05 Apr 18 olle 816       var arrivalDate = frm.arrivalDate.value;
4733 05 Apr 18 olle 817       if (arrivalDate != '' && arrivalDate < samplingDate)
4733 05 Apr 18 olle 818       {
4733 05 Apr 18 olle 819         Wizard.setInputStatus('samplingDate', 'invalid', 'Arrival date is before sampling date');
4733 05 Apr 18 olle 820         return;
4733 05 Apr 18 olle 821       }
4733 05 Apr 18 olle 822
4733 05 Apr 18 olle 823       Wizard.setInputStatus('samplingDate', 'valid');
4733 05 Apr 18 olle 824     }
4733 05 Apr 18 olle 825     samplingDateIsValid = true;
4733 05 Apr 18 olle 826   }
4733 05 Apr 18 olle 827
4733 05 Apr 18 olle 828   persinfo.projectFocusOnChange = function()
4733 05 Apr 18 olle 829   {
4733 05 Apr 18 olle 830     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 831     var projectFocus = frm.projectFocus.value;
4733 05 Apr 18 olle 832
4733 05 Apr 18 olle 833     persinfo.mutationAnalysisReset();
4733 05 Apr 18 olle 834     
4734 05 Apr 18 olle 835 /*
4733 05 Apr 18 olle 836     if (projectFocus == 'melanoma')
4733 05 Apr 18 olle 837     {
4733 05 Apr 18 olle 838       frm.mutationAnalysisNras.checked = true;
4733 05 Apr 18 olle 839       frm.mutationAnalysisBraf.checked = true;
4733 05 Apr 18 olle 840       frm.mutationAnalysisKit.checked = true;
4733 05 Apr 18 olle 841       return;
4733 05 Apr 18 olle 842     }
4733 05 Apr 18 olle 843     if (projectFocus == 'lungcancer')
4733 05 Apr 18 olle 844     {
4733 05 Apr 18 olle 845       frm.mutationAnalysisKras.checked = true;
4733 05 Apr 18 olle 846       frm.mutationAnalysisEgfr.checked = true;
4733 05 Apr 18 olle 847       return;
4733 05 Apr 18 olle 848     }
4733 05 Apr 18 olle 849     if (projectFocus == 'coloncancer')
4733 05 Apr 18 olle 850     {
4733 05 Apr 18 olle 851       frm.mutationAnalysisKras.checked = true;
4733 05 Apr 18 olle 852       frm.mutationAnalysisNras.checked = true;
4733 05 Apr 18 olle 853       frm.mutationAnalysisBraf.checked = true;
4733 05 Apr 18 olle 854       return;
4733 05 Apr 18 olle 855     }
4733 05 Apr 18 olle 856     if (projectFocus == 'GIST')
4733 05 Apr 18 olle 857     {
4733 05 Apr 18 olle 858       frm.mutationAnalysisPdgfra.checked = true;
4733 05 Apr 18 olle 859       frm.mutationAnalysisKit.checked = true;
4733 05 Apr 18 olle 860       return;
4733 05 Apr 18 olle 861     }
4734 05 Apr 18 olle 862 */
4734 05 Apr 18 olle 863     frm.mutationAnalysisTst170.checked = true;
4733 05 Apr 18 olle 864   }
4733 05 Apr 18 olle 865
4733 05 Apr 18 olle 866   persinfo.mutationAnalysisReset = function()
4733 05 Apr 18 olle 867   {
4733 05 Apr 18 olle 868     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 869
4779 20 Apr 18 olle 870 /*
4733 05 Apr 18 olle 871     frm.mutationAnalysisKras.checked = false;
4733 05 Apr 18 olle 872     frm.mutationAnalysisNras.checked = false;
4733 05 Apr 18 olle 873     frm.mutationAnalysisBraf.checked = false;
4733 05 Apr 18 olle 874     frm.mutationAnalysisEgfr.checked = false;
4733 05 Apr 18 olle 875     frm.mutationAnalysisAlkEml4.checked = false;
4733 05 Apr 18 olle 876     frm.mutationAnalysisPdgfra.checked = false;
4733 05 Apr 18 olle 877     frm.mutationAnalysisKit.checked = false;
4779 20 Apr 18 olle 878 */
4733 05 Apr 18 olle 879     frm.mutationAnalysisTst170.checked = false;
4733 05 Apr 18 olle 880     frm.mutationAnalysisOther.checked = false;
4733 05 Apr 18 olle 881   }
4733 05 Apr 18 olle 882
4733 05 Apr 18 olle 883   persinfo.mutationAnalysisSelectAll = function()
4733 05 Apr 18 olle 884   {
4733 05 Apr 18 olle 885     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 886
4779 20 Apr 18 olle 887 /*
4733 05 Apr 18 olle 888     frm.mutationAnalysisKras.checked = true;
4733 05 Apr 18 olle 889     frm.mutationAnalysisNras.checked = true;
4733 05 Apr 18 olle 890     frm.mutationAnalysisBraf.checked = true;
4733 05 Apr 18 olle 891     frm.mutationAnalysisEgfr.checked = true;
4733 05 Apr 18 olle 892     frm.mutationAnalysisAlkEml4.checked = true;
4733 05 Apr 18 olle 893     frm.mutationAnalysisPdgfra.checked = true;
4733 05 Apr 18 olle 894     frm.mutationAnalysisKit.checked = true;
4779 20 Apr 18 olle 895 */
4733 05 Apr 18 olle 896     //frm.mutationAnalysisTst170.checked = true;
4733 05 Apr 18 olle 897     //frm.mutationAnalysisOther.checked = true;
4733 05 Apr 18 olle 898   }
4733 05 Apr 18 olle 899
4733 05 Apr 18 olle 900   persinfo.viableTumourCellsPercentOnChange = function()
4733 05 Apr 18 olle 901   {
4733 05 Apr 18 olle 902     viableTumourCellsPercentIsValid = false;
4733 05 Apr 18 olle 903
4733 05 Apr 18 olle 904     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 905     var viableTumourCellsPercent = frm.viableTumourCellsPercent.value;
4733 05 Apr 18 olle 906     
4733 05 Apr 18 olle 907     if (viableTumourCellsPercent != null)
4733 05 Apr 18 olle 908     {
4733 05 Apr 18 olle 909       if (parseInt(viableTumourCellsPercent) < 0)
4733 05 Apr 18 olle 910       {
4733 05 Apr 18 olle 911         Wizard.setInputStatus('viableTumourCellsPercent', 'invalid', 'Must be at least 0');
4733 05 Apr 18 olle 912         return;    
4733 05 Apr 18 olle 913       }
4733 05 Apr 18 olle 914       if (parseInt(viableTumourCellsPercent) > 100)
4733 05 Apr 18 olle 915       {
4733 05 Apr 18 olle 916         Wizard.setInputStatus('viableTumourCellsPercent', 'invalid', 'Must be at most 100');
4733 05 Apr 18 olle 917         return;    
4733 05 Apr 18 olle 918       }
4733 05 Apr 18 olle 919     }
4733 05 Apr 18 olle 920     Wizard.setInputStatus('viableTumourCellsPercent', 'valid');
4733 05 Apr 18 olle 921     viableTumourCellsPercentIsValid = true; 
4733 05 Apr 18 olle 922   }
4733 05 Apr 18 olle 923
4733 05 Apr 18 olle 924   persinfo.validateStep3 = function(event)
4733 05 Apr 18 olle 925   {
4733 05 Apr 18 olle 926     var isValid = samplingDateIsValid;
4733 05 Apr 18 olle 927     var hasSpecimen = caseInfo.specimen && caseInfo.specimen.length > 0;
4733 05 Apr 18 olle 928     if (hasSpecimen)
4733 05 Apr 18 olle 929     {
4733 05 Apr 18 olle 930       isValid &= viableTumourCellsPercentIsValid;
4733 05 Apr 18 olle 931     }
4733 05 Apr 18 olle 932     if (!isValid) event.preventDefault();
4733 05 Apr 18 olle 933   }
4733 05 Apr 18 olle 934
4733 05 Apr 18 olle 935   persinfo.initializeStep4 = function()
4733 05 Apr 18 olle 936   {
4733 05 Apr 18 olle 937     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 938     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 939     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 940     nofTubes = persinfo.fixNofTubes(tubeContentType, nofTubes);
4733 05 Apr 18 olle 941     frm.nofTubes.value = nofTubes;
4733 05 Apr 18 olle 942     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
4733 05 Apr 18 olle 943     var storageBoxSuffix = persinfo.fetchStorageBoxSuffix(tubeContentType);
4733 05 Apr 18 olle 944     if (nofTubes > 2) Doc.addClass('step-2', 'auto-hide');
4733 05 Apr 18 olle 945     
4733 05 Apr 18 olle 946     var html = '';
4733 05 Apr 18 olle 947
4733 05 Apr 18 olle 948     // Add buttons for adding standard comments for all specimens/RNA/DNA
4733 05 Apr 18 olle 949     html += '<tr class="section-header">';
4733 05 Apr 18 olle 950     html += '<td colspan="4">Standard comments</td>';
4733 05 Apr 18 olle 951     html += '</tr>';
4733 05 Apr 18 olle 952
4733 05 Apr 18 olle 953     html += '<tr class="align-top">';
4733 05 Apr 18 olle 954     html += '<td class="subprompt"></td>';
4733 05 Apr 18 olle 955     html += '<td><div class="button basicbutton interactable" id="addCarvedOutComment" style="font-weight: normal;">Add &quot;Utkarvad&quot; (Carved out)</div></td>';
4733 05 Apr 18 olle 956     html += '<td class="status" id="addCarvedOutComment.status"></td>';
4733 05 Apr 18 olle 957     html += '<td class="help"><span id="addCarvedOutComment.message" class="message"></span>Click button to add standard comment for all items.</td>';    
4733 05 Apr 18 olle 958     html += '</tr>';
4733 05 Apr 18 olle 959
4733 05 Apr 18 olle 960     html += '<tr class="align-top">';
4733 05 Apr 18 olle 961     html += '<td class="subprompt"></td>';
4733 05 Apr 18 olle 962     html += '<td><div class="button basicbutton interactable" id="addMnbComment" style="font-weight: normal;">Add &quot;MNB&quot; (Medium needle biopsy)</div></td>';
4733 05 Apr 18 olle 963     html += '<td class="status" id="addMnbComment.status"></td>';
4733 05 Apr 18 olle 964     html += '<td class="help"><span id="addMnbComment.message" class="message"></span>Click button to add standard comment for all items.</td>';    
4733 05 Apr 18 olle 965     html += '</tr>';
4733 05 Apr 18 olle 966
4733 05 Apr 18 olle 967     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 968     {
4733 05 Apr 18 olle 969       var tubeContentTypeName = persinfo.fetchTubeContentTypeName(tubeContentType, i);
4733 05 Apr 18 olle 970       var tubeContentTypeNameInternal = persinfo.fetchTubeContentTypeNameInternal(tubeContentType, tubeContentTypeName);
4733 05 Apr 18 olle 971       var tubeName = persinfo.fetchTubeName(tubeContentType, caseInfo, i);
4733 05 Apr 18 olle 972       var tubeNo = i+caseInfo.specimenFirstIndex;
4733 05 Apr 18 olle 973       var tubeIdentifier = persinfo.fetchTubeIdentifier(tubeContentType, caseInfo, i);
4733 05 Apr 18 olle 974       html += '<tr class="section-header">';
4733 05 Apr 18 olle 975       html += '<td colspan="4">'+tubeContentTypeName+' Tube '+tubeName+'</td>';
4733 05 Apr 18 olle 976       html += '</tr>';
4733 05 Apr 18 olle 977
4733 05 Apr 18 olle 978 /*
4733 05 Apr 18 olle 979       var boxMsg = 'Box-number where the '+tubeContentTypeNameInternal+' tube is located in.';
4733 05 Apr 18 olle 980 */
4733 05 Apr 18 olle 981       var boxMsg = 'Box-number and position where the '+tubeContentTypeNameInternal+' tube is located.';
4733 05 Apr 18 olle 982       var dnaBoxMsg = 'Box-number and position where the DNA extract will be located.';
4733 05 Apr 18 olle 983       var rnaBoxMsg = 'Box-number and position where the RNA extract will be located.';
4733 05 Apr 18 olle 984       var disabledAttribute = '';
4733 05 Apr 18 olle 985       if (i == 0 && tubeContentType == 'Specimen')
4733 05 Apr 18 olle 986       {
4733 05 Apr 18 olle 987         boxMsg = 'No storage space allocated for first '+tubeContentTypeNameInternal+'; all amount expected to be used.';
4733 05 Apr 18 olle 988         disabledAttribute = ' disabled';
4733 05 Apr 18 olle 989       }  
4733 05 Apr 18 olle 990       html += '<tr>';
4733 05 Apr 18 olle 991       html += '<td class="subprompt">'+tubeContentTypeName+'&nbsp;'+tubeName+'&nbsp;&nbsp;&nbsp;'+'Box</td>';
4733 05 Apr 18 olle 992       html += '<td class="input">';
4733 05 Apr 18 olle 993 /*
4733 05 Apr 18 olle 994       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'></td>';
4733 05 Apr 18 olle 995 */
4733 05 Apr 18 olle 996       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4733 05 Apr 18 olle 997       html += '&nbsp;Row<input type="text" name="row.'+i+'" id="row.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 998       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 999       html += '</td>';
4733 05 Apr 18 olle 1000       html += '<td class="status" id="box.'+i+'.status"></td>';
4733 05 Apr 18 olle 1001       html += '<td class="help"><span id="box.'+i+'.message" class="message"></span>'+boxMsg+'<span id="position.'+i+'.message" class="message"></span></td>';
4733 05 Apr 18 olle 1002       html += '</tr>';
4733 05 Apr 18 olle 1003 /*      
4733 05 Apr 18 olle 1004       html += '<tr>';
4733 05 Apr 18 olle 1005       html += '<td class="subprompt">Row</td>';
4733 05 Apr 18 olle 1006       html += '<td class="input">';
4733 05 Apr 18 olle 1007       html += '<input type="text" name="row.'+i+'" id="row.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1008       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1009       html += '</td>';
4733 05 Apr 18 olle 1010       html += '<td class="status" id="position.'+i+'.status"></td>';
4733 05 Apr 18 olle 1011       html += '<td class="help"><span id="position.'+i+'.message" class="message"></span></td>';    
4733 05 Apr 18 olle 1012       html += '</tr>';
4733 05 Apr 18 olle 1013 */
4733 05 Apr 18 olle 1014
4733 05 Apr 18 olle 1015       if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1016       {
4733 05 Apr 18 olle 1017         disabledAttribute = '';
4733 05 Apr 18 olle 1018         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 1019         {
4733 05 Apr 18 olle 1020           html += '<tr>';
4733 05 Apr 18 olle 1021           html += '<td class="subprompt">DNA extract'+'&nbsp;'+tubeName+'.d&nbsp;&nbsp;&nbsp;'+'Box</td>';
4733 05 Apr 18 olle 1022           html += '<td class="input">';
4733 05 Apr 18 olle 1023           html += '<input type="text" name="dnaBox.'+i+'" id="dnaBox.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1024           html += '&nbsp;Row<input type="text" name="dnaRow.'+i+'" id="dnaRow.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1025           html += '&nbsp;Column<input type="text" name="dnaColumn.'+i+'" id="dnaColumn.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1026           html += '</td>';
4733 05 Apr 18 olle 1027           html += '<td class="status" id="dnaBox.'+i+'.status"></td>';
4733 05 Apr 18 olle 1028           html += '<td class="help"><span id="dnaBox.'+i+'.message" class="message"></span>'+dnaBoxMsg+'<span id="dnaPosition.'+i+'.message" class="message"></span></td>';
4733 05 Apr 18 olle 1029           html += '</tr>';
4733 05 Apr 18 olle 1030
4733 05 Apr 18 olle 1031           html += '<tr>';
4733 05 Apr 18 olle 1032           html += '<td class="subprompt">RNA extract'+'&nbsp;'+tubeName+'.r&nbsp;&nbsp;&nbsp;'+'Box</td>';
4733 05 Apr 18 olle 1033           html += '<td class="input">';
4733 05 Apr 18 olle 1034           html += '<input type="text" name="rnaBox.'+i+'" id="rnaBox.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1035           html += '&nbsp;Row<input type="text" name="rnaRow.'+i+'" id="rnaRow.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1036           html += '&nbsp;Column<input type="text" name="rnaColumn.'+i+'" id="rnaColumn.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 1037           html += '</td>';
4733 05 Apr 18 olle 1038           html += '<td class="status" id="rnaBox.'+i+'.status"></td>';
4733 05 Apr 18 olle 1039           html += '<td class="help"><span id="rnaBox.'+i+'.message" class="message"></span>'+rnaBoxMsg+'<span id="rnaPosition.'+i+'.message" class="message"></span></td>';
4733 05 Apr 18 olle 1040           html += '</tr>';
4733 05 Apr 18 olle 1041         }
4733 05 Apr 18 olle 1042
4733 05 Apr 18 olle 1043         html += '<tr>';
4733 05 Apr 18 olle 1044         html += '<td class="subprompt">Number of sections</td>';
4733 05 Apr 18 olle 1045         html += '<td class="input">';
4733 05 Apr 18 olle 1046         html += '<input type="text" name="nofSections.'+i+'" id="nofSections.'+i+'" style="width: 3em;" maxlength="2" value="1">';
4733 05 Apr 18 olle 1047         html += '</td>';
4733 05 Apr 18 olle 1048         html += '<td class="status" id="nofSections.'+i+'.status"></td>';
4733 05 Apr 18 olle 1049         html += '<td class="help"><span id="nofSections.'+i+'.message" class="message"></span>Number of sections (slices) in FFPE block.</td>';    
4733 05 Apr 18 olle 1050         html += '</tr>';
4733 05 Apr 18 olle 1051       }
4733 05 Apr 18 olle 1052
4733 05 Apr 18 olle 1053       html += '<tr class="align-top">';
4733 05 Apr 18 olle 1054       html += '<td class="subprompt">Operator delivery comment</td>';
4733 05 Apr 18 olle 1055       html += '<td class="input"><textarea rows="3" name="comment.'+i+'" id="comment.'+i+'"></textarea></td>';
4733 05 Apr 18 olle 1056       html += '<td class="status" id="comment.'+i+'.status"></td>';
4733 05 Apr 18 olle 1057       html += '<td class="help"><span id="comment.'+i+'.message" class="message"></span>In this field, enter information specific for '+tubeContentTypeNameInternal+' tube ' +tubeIdentifier+'.</td>';    
4733 05 Apr 18 olle 1058       html += '</tr>';
4733 05 Apr 18 olle 1059     }
4733 05 Apr 18 olle 1060     Doc.element('specimen-tubes').innerHTML = html;
4733 05 Apr 18 olle 1061
4733 05 Apr 18 olle 1062     // Add click handlers for buttons for adding standard comments for all specimens/RNA/DNA
4733 05 Apr 18 olle 1063     var addCarvedOutCommentGeneralButton = Doc.element('addCarvedOutComment');
4733 05 Apr 18 olle 1064     Buttons.addClickHandler(addCarvedOutCommentGeneralButton, persinfo.addCommentGeneral, {'nofTubes': nofTubes, 'text-field': 'comment.', 'text': 'Utkarvad.'});
4733 05 Apr 18 olle 1065     var addMnbCommentGeneralButton = Doc.element('addMnbComment');
4733 05 Apr 18 olle 1066     Buttons.addClickHandler(addMnbCommentGeneralButton, persinfo.addCommentGeneral, {'nofTubes': nofTubes, 'text-field': 'comment.', 'text': 'MNB.'});
4733 05 Apr 18 olle 1067
4733 05 Apr 18 olle 1068     Wizard.setCurrentStep(4);
4733 05 Apr 18 olle 1069     Doc.show('goregister');
4733 05 Apr 18 olle 1070     Doc.show('gocancel');
4733 05 Apr 18 olle 1071     frm['comment.0'].focus();
4733 05 Apr 18 olle 1072     
4733 05 Apr 18 olle 1073     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 1074     url += '&cmd=FindStoragePositions';  
4733 05 Apr 18 olle 1075     url += '&nofTubes='+frm.nofTubes.value;
4733 05 Apr 18 olle 1076     url += '&storageBoxSuffix='+storageBoxSuffix;
4733 05 Apr 18 olle 1077     url += '&extractsFromFirstSpecimenOnly='+extractsFromFirstSpecimenOnly;
4733 05 Apr 18 olle 1078     
4733 05 Apr 18 olle 1079     Wizard.showLoadingAnimation('Looking for empty box positions...');
4733 05 Apr 18 olle 1080     Wizard.asyncJsonRequest(url, persinfo.storagePositionsLoaded);
4733 05 Apr 18 olle 1081   }
4733 05 Apr 18 olle 1082   
4733 05 Apr 18 olle 1083   persinfo.addCommentGeneral = function(event)
4733 05 Apr 18 olle 1084   {
4733 05 Apr 18 olle 1085     var nofTubes = Data.get(event.currentTarget, 'nofTubes', event.currentTarget.id);
4733 05 Apr 18 olle 1086     var textFieldBase = Data.get(event.currentTarget, 'text-field', event.currentTarget.id);
4733 05 Apr 18 olle 1087     var text = Data.get(event.currentTarget, 'text', event.currentTarget.id);
4733 05 Apr 18 olle 1088     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 1089     {
4733 05 Apr 18 olle 1090       var textField = Doc.element(textFieldBase+i);
4733 05 Apr 18 olle 1091       if (textField)
4733 05 Apr 18 olle 1092       {
4733 05 Apr 18 olle 1093         if (text && text != '')
4733 05 Apr 18 olle 1094         {
4733 05 Apr 18 olle 1095           if (textField.value != '')
4733 05 Apr 18 olle 1096           {
4733 05 Apr 18 olle 1097             textField.value += ' ';
4733 05 Apr 18 olle 1098           }
4733 05 Apr 18 olle 1099           textField.value += text;
4733 05 Apr 18 olle 1100         }
4733 05 Apr 18 olle 1101       }
4733 05 Apr 18 olle 1102     }
4733 05 Apr 18 olle 1103     persinfo.setNumberOfSectionsFromComment(event);
4733 05 Apr 18 olle 1104   }
4733 05 Apr 18 olle 1105   
4733 05 Apr 18 olle 1106   persinfo.addComment = function(event)
4733 05 Apr 18 olle 1107   {
4733 05 Apr 18 olle 1108     var textField = Doc.element(Data.get(event.currentTarget, 'text-field', event.currentTarget.id));
4733 05 Apr 18 olle 1109     var text = Data.get(event.currentTarget, 'text', event.currentTarget.id);
4733 05 Apr 18 olle 1110     if (textField)
4733 05 Apr 18 olle 1111     {
4733 05 Apr 18 olle 1112       if (text && text != '')
4733 05 Apr 18 olle 1113       {
4733 05 Apr 18 olle 1114         if (textField.value != '')
4733 05 Apr 18 olle 1115         {
4733 05 Apr 18 olle 1116           textField.value += ' ';
4733 05 Apr 18 olle 1117         }
4733 05 Apr 18 olle 1118         textField.value += text;
4733 05 Apr 18 olle 1119       }
4733 05 Apr 18 olle 1120     }
4733 05 Apr 18 olle 1121     persinfo.setNumberOfSectionsFromComment(event);
4733 05 Apr 18 olle 1122   }
4733 05 Apr 18 olle 1123   
4733 05 Apr 18 olle 1124   persinfo.setNumberOfSectionsFromComment = function(event)
4733 05 Apr 18 olle 1125   {
4733 05 Apr 18 olle 1126     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1127     var nofTubes = Data.get(event.currentTarget, 'nofTubes', event.currentTarget.id);
4733 05 Apr 18 olle 1128     var textFieldBase = Data.get(event.currentTarget, 'text-field', event.currentTarget.id);
4733 05 Apr 18 olle 1129     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 1130     {
4733 05 Apr 18 olle 1131       var numSections = 1;
4733 05 Apr 18 olle 1132       var textField = Doc.element(textFieldBase+i);
4733 05 Apr 18 olle 1133       if (textField)
4733 05 Apr 18 olle 1134       {
4733 05 Apr 18 olle 1135         var text = textField.value;
4733 05 Apr 18 olle 1136         if (text && text != '')
4733 05 Apr 18 olle 1137         {
4733 05 Apr 18 olle 1138           // If comment "Utkarvad." and not "MNB." => number of sections set to 0
4733 05 Apr 18 olle 1139           if (text.indexOf('Utkarvad.') >= 0 && text.indexOf('MNB.') < 0)
4733 05 Apr 18 olle 1140           {
4733 05 Apr 18 olle 1141             numSections = 0;
4733 05 Apr 18 olle 1142           }
4733 05 Apr 18 olle 1143         }
4733 05 Apr 18 olle 1144       }
4733 05 Apr 18 olle 1145       frm['nofSections.'+i].value = numSections;
4733 05 Apr 18 olle 1146     }
4733 05 Apr 18 olle 1147   }
4733 05 Apr 18 olle 1148   
4733 05 Apr 18 olle 1149   persinfo.storagePositionsLoaded = function(response)
4733 05 Apr 18 olle 1150   {
4733 05 Apr 18 olle 1151     var freeWells = response.wells;
4733 05 Apr 18 olle 1152     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1153     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 1154     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 1155     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
4733 05 Apr 18 olle 1156
4733 05 Apr 18 olle 1157     // No storage space is allocated for first specimen,
4733 05 Apr 18 olle 1158     // since all amount is expected to be used for analysis.
4733 05 Apr 18 olle 1159     // Specimen tube with i == 0 is therefore skipped.
4733 05 Apr 18 olle 1160     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1161     {
4733 05 Apr 18 olle 1162       for (var i = 0; i < nofTubes; i++)
4733 05 Apr 18 olle 1163       {
4733 05 Apr 18 olle 1164         wellIndex = 3*i;
4733 05 Apr 18 olle 1165         var specWell = null;
4733 05 Apr 18 olle 1166         if (i > 0)
4733 05 Apr 18 olle 1167         {
4733 05 Apr 18 olle 1168           specWell = freeWells[wellIndex];
4733 05 Apr 18 olle 1169           if (!specWell || specWell == '') 
4733 05 Apr 18 olle 1170           {
4733 05 Apr 18 olle 1171             Wizard.setInputStatus('box.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 1172             return;
4733 05 Apr 18 olle 1173           }
4733 05 Apr 18 olle 1174         }
4733 05 Apr 18 olle 1175         var dnaWell = null;
4733 05 Apr 18 olle 1176         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 1177         {
4733 05 Apr 18 olle 1178           dnaWell = freeWells[wellIndex+1];
4733 05 Apr 18 olle 1179           if (!dnaWell || dnaWell == '') 
4733 05 Apr 18 olle 1180           {
4733 05 Apr 18 olle 1181             Wizard.setInputStatus('dnaBox.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 1182             return;
4733 05 Apr 18 olle 1183           }
4733 05 Apr 18 olle 1184         }
4733 05 Apr 18 olle 1185         var rnaWell = null;
4733 05 Apr 18 olle 1186         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 1187         {
4733 05 Apr 18 olle 1188           rnaWell = freeWells[wellIndex+2];
4733 05 Apr 18 olle 1189           if (!rnaWell || rnaWell == '') 
4733 05 Apr 18 olle 1190           {
4733 05 Apr 18 olle 1191             Wizard.setInputStatus('rnaBox.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 1192             return;
4733 05 Apr 18 olle 1193           }
4733 05 Apr 18 olle 1194         }
4733 05 Apr 18 olle 1195
4733 05 Apr 18 olle 1196         // Update form fields for storage plates
4733 05 Apr 18 olle 1197         if (specWell)
4733 05 Apr 18 olle 1198         {
4733 05 Apr 18 olle 1199           frm['box.'+i].value = specWell.bioPlate.name;
4733 05 Apr 18 olle 1200           frm['row.'+i].value = Meludi.wellToAlpha(specWell.row);
4733 05 Apr 18 olle 1201           frm['column.'+i].value = specWell.column+1;
4733 05 Apr 18 olle 1202         }
4733 05 Apr 18 olle 1203       
4733 05 Apr 18 olle 1204         if (dnaWell)
4733 05 Apr 18 olle 1205         {
4733 05 Apr 18 olle 1206           frm['dnaBox.'+i].value = dnaWell.bioPlate.name;
4733 05 Apr 18 olle 1207           frm['dnaRow.'+i].value = Meludi.wellToAlpha(dnaWell.row);
4733 05 Apr 18 olle 1208           frm['dnaColumn.'+i].value = dnaWell.column+1;
4733 05 Apr 18 olle 1209         }
4733 05 Apr 18 olle 1210
4733 05 Apr 18 olle 1211         if (rnaWell)
4733 05 Apr 18 olle 1212         {
4733 05 Apr 18 olle 1213           frm['rnaBox.'+i].value = rnaWell.bioPlate.name;
4733 05 Apr 18 olle 1214           frm['rnaRow.'+i].value = Meludi.wellToAlpha(rnaWell.row);
4733 05 Apr 18 olle 1215           frm['rnaColumn.'+i].value = rnaWell.column+1;
4733 05 Apr 18 olle 1216         }
4733 05 Apr 18 olle 1217
4733 05 Apr 18 olle 1218         // Move focus to next field
4733 05 Apr 18 olle 1219         Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
4733 05 Apr 18 olle 1220         Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
4733 05 Apr 18 olle 1221         Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaBox.'+i });
4733 05 Apr 18 olle 1222
4733 05 Apr 18 olle 1223         Events.addEventHandler('dnaBox.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaRow.'+i });
4733 05 Apr 18 olle 1224         Events.addEventHandler('dnaRow.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaColumn.'+i });
4733 05 Apr 18 olle 1225         Events.addEventHandler('dnaColumn.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaBox.'+i });
4733 05 Apr 18 olle 1226
4733 05 Apr 18 olle 1227         Events.addEventHandler('rnaBox.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaRow.'+i });
4733 05 Apr 18 olle 1228         Events.addEventHandler('rnaRow.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaColumn.'+i });
4733 05 Apr 18 olle 1229         Events.addEventHandler('rnaColumn.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'nofSections.'+i });
4733 05 Apr 18 olle 1230
4733 05 Apr 18 olle 1231         Events.addEventHandler('nofSections.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
4733 05 Apr 18 olle 1232       
4733 05 Apr 18 olle 1233         // Form validation
4733 05 Apr 18 olle 1234         Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 1235         Events.addEventHandler('box.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
4733 05 Apr 18 olle 1236         Events.addEventHandler('row.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
4733 05 Apr 18 olle 1237         Events.addEventHandler('column.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
4733 05 Apr 18 olle 1238         Events.addEventHandler('box.'+i, 'keyup', persinfo.boxOnKeyUp, { 'boxtype': 'Specimen'});
4733 05 Apr 18 olle 1239
4733 05 Apr 18 olle 1240         Events.addEventHandler('dnaColumn.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 1241         Events.addEventHandler('dnaBox.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'DNA', 'index': i });
4733 05 Apr 18 olle 1242         Events.addEventHandler('dnaRow.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'DNA', 'index': i });
4733 05 Apr 18 olle 1243         Events.addEventHandler('dnaColumn.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'DNA', 'index': i });
4733 05 Apr 18 olle 1244         Events.addEventHandler('dnaBox.'+i, 'keyup', persinfo.boxOnKeyUp, { 'boxtype': 'DNA'});
4733 05 Apr 18 olle 1245
4733 05 Apr 18 olle 1246         Events.addEventHandler('rnaColumn.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 1247         Events.addEventHandler('rnaBox.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'RNA', 'index': i });
4733 05 Apr 18 olle 1248         Events.addEventHandler('rnaRow.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'RNA', 'index': i });
4733 05 Apr 18 olle 1249         Events.addEventHandler('rnaColumn.'+i, 'change', persinfo.wellOnChange, { 'boxtype': 'RNA', 'index': i });
4733 05 Apr 18 olle 1250         Events.addEventHandler('rnaBox.'+i, 'keyup', persinfo.boxOnKeyUp, { 'boxtype': 'RNA'});
4733 05 Apr 18 olle 1251
4733 05 Apr 18 olle 1252         Events.addEventHandler('nofSections.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 1253         Events.addEventHandler('nofSections.'+i, 'change', persinfo.nofSectionsOnChange, { 'index': i });
4733 05 Apr 18 olle 1254       
4733 05 Apr 18 olle 1255         wellIsValid[i] = true;
4733 05 Apr 18 olle 1256         dnaWellIsValid[i] = true;
4733 05 Apr 18 olle 1257         rnaWellIsValid[i] = true;
4733 05 Apr 18 olle 1258 /*
4733 05 Apr 18 olle 1259         Wizard.setInputStatus('position.'+i, 'valid');
4733 05 Apr 18 olle 1260 */
4733 05 Apr 18 olle 1261         Wizard.setInputStatus('box.'+i, 'valid');
4733 05 Apr 18 olle 1262         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 1263         {
4733 05 Apr 18 olle 1264           Wizard.setInputStatus('dnaBox.'+i, 'valid');
4733 05 Apr 18 olle 1265           Wizard.setInputStatus('rnaBox.'+i, 'valid');
4733 05 Apr 18 olle 1266         }
4733 05 Apr 18 olle 1267         if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1268         {
4733 05 Apr 18 olle 1269           Wizard.setInputStatus('nofSections.'+i, 'valid');
4733 05 Apr 18 olle 1270         }
4733 05 Apr 18 olle 1271       }
4733 05 Apr 18 olle 1272     }
4733 05 Apr 18 olle 1273     else if (tubeContentType == 'DNA' || tubeContentType == 'RNA' || tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 1274     {
4733 05 Apr 18 olle 1275       for (var i = 0; i < nofTubes; i++)
4733 05 Apr 18 olle 1276       {
4733 05 Apr 18 olle 1277         var wellIndex = i;
4733 05 Apr 18 olle 1278         var well = freeWells[wellIndex];
4733 05 Apr 18 olle 1279         if (!well || well == '') 
4733 05 Apr 18 olle 1280         {
4733 05 Apr 18 olle 1281           Wizard.setInputStatus('box.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 1282           return;
4733 05 Apr 18 olle 1283         }
4733 05 Apr 18 olle 1284         frm['box.'+i].value = well.bioPlate.name;
4733 05 Apr 18 olle 1285         frm['row.'+i].value = Meludi.wellToAlpha(well.row);
4733 05 Apr 18 olle 1286         frm['column.'+i].value = well.column+1;
4733 05 Apr 18 olle 1287       
4733 05 Apr 18 olle 1288         // Move focus to next field
4733 05 Apr 18 olle 1289         Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
4733 05 Apr 18 olle 1290         Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
4733 05 Apr 18 olle 1291         Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'nofSections.'+i });
4733 05 Apr 18 olle 1292         Events.addEventHandler('nofSections.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
4733 05 Apr 18 olle 1293       
4733 05 Apr 18 olle 1294         // Form validation
4733 05 Apr 18 olle 1295         Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 1296         Events.addEventHandler('box.'+i, 'change', persinfo.wellOnChange, { 'index': i });
4733 05 Apr 18 olle 1297         Events.addEventHandler('row.'+i, 'change', persinfo.wellOnChange, { 'index': i });
4733 05 Apr 18 olle 1298         Events.addEventHandler('column.'+i, 'change', persinfo.wellOnChange, { 'index': i });
4733 05 Apr 18 olle 1299         Events.addEventHandler('box.'+i, 'keyup', persinfo.boxOnKeyUp);
4733 05 Apr 18 olle 1300         Events.addEventHandler('nofSections.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 1301         Events.addEventHandler('nofSections.'+i, 'change', persinfo.nofSectionsOnChange, { 'index': i });
4733 05 Apr 18 olle 1302       
4733 05 Apr 18 olle 1303         wellIsValid[i] = true;
4733 05 Apr 18 olle 1304 /*
4733 05 Apr 18 olle 1305         Wizard.setInputStatus('position.'+i, 'valid');
4733 05 Apr 18 olle 1306 */
4733 05 Apr 18 olle 1307         Wizard.setInputStatus('box.'+i, 'valid');
4733 05 Apr 18 olle 1308         if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1309         {
4733 05 Apr 18 olle 1310           Wizard.setInputStatus('nofSections.'+i, 'valid');
4733 05 Apr 18 olle 1311         }
4733 05 Apr 18 olle 1312       }
4733 05 Apr 18 olle 1313     }
4733 05 Apr 18 olle 1314   }
4733 05 Apr 18 olle 1315
4733 05 Apr 18 olle 1316   persinfo.fixNofTubes = function(tubeContentType, nofTubes)
4733 05 Apr 18 olle 1317   {
4733 05 Apr 18 olle 1318     if (tubeContentType == 'DNA')
4733 05 Apr 18 olle 1319     {
4733 05 Apr 18 olle 1320       nofTubes = 1;
4733 05 Apr 18 olle 1321     }
4733 05 Apr 18 olle 1322     else if (tubeContentType == 'RNA')
4733 05 Apr 18 olle 1323     {
4733 05 Apr 18 olle 1324       nofTubes = 1;
4733 05 Apr 18 olle 1325     }
4733 05 Apr 18 olle 1326     else if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 1327     {
4733 05 Apr 18 olle 1328       nofTubes = 2;
4733 05 Apr 18 olle 1329     }
4733 05 Apr 18 olle 1330     return nofTubes;
4733 05 Apr 18 olle 1331   }
4733 05 Apr 18 olle 1332   
4733 05 Apr 18 olle 1333   persinfo.fetchStorageBoxSuffix = function(tubeContentType)
4733 05 Apr 18 olle 1334   {
4733 05 Apr 18 olle 1335     var storageBoxSuffix = null;
4733 05 Apr 18 olle 1336     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1337     {
4733 05 Apr 18 olle 1338       storageBoxSuffix = '_sp';
4733 05 Apr 18 olle 1339     }
4733 05 Apr 18 olle 1340     else if (tubeContentType == 'DNA')
4733 05 Apr 18 olle 1341     {
4733 05 Apr 18 olle 1342       storageBoxSuffix = '_dna';
4733 05 Apr 18 olle 1343     }
4733 05 Apr 18 olle 1344     else if (tubeContentType == 'RNA')
4733 05 Apr 18 olle 1345     {
4733 05 Apr 18 olle 1346       storageBoxSuffix = '_rna';
4733 05 Apr 18 olle 1347     }
4733 05 Apr 18 olle 1348     else if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 1349     {
4733 05 Apr 18 olle 1350       storageBoxSuffix = '_dna_rna';
4733 05 Apr 18 olle 1351     }
4733 05 Apr 18 olle 1352     return storageBoxSuffix;
4733 05 Apr 18 olle 1353   }
4733 05 Apr 18 olle 1354   
4733 05 Apr 18 olle 1355   persinfo.fetchTubeContentTypeName = function(tubeContentType, tubeIndex)
4733 05 Apr 18 olle 1356   {
4733 05 Apr 18 olle 1357     var tubeContentTypeName = tubeContentType;
4733 05 Apr 18 olle 1358     if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 1359     {
4733 05 Apr 18 olle 1360       if (tubeIndex == 0)
4733 05 Apr 18 olle 1361       {
4733 05 Apr 18 olle 1362         tubeContentTypeName = 'DNA';
4733 05 Apr 18 olle 1363       }
4733 05 Apr 18 olle 1364       else if (tubeIndex == 1)
4733 05 Apr 18 olle 1365       {
4733 05 Apr 18 olle 1366         tubeContentTypeName = 'RNA';
4733 05 Apr 18 olle 1367       }
4733 05 Apr 18 olle 1368     }
4733 05 Apr 18 olle 1369     return tubeContentTypeName;
4733 05 Apr 18 olle 1370   }
4733 05 Apr 18 olle 1371   
4733 05 Apr 18 olle 1372   persinfo.fetchTubeContentTypeNameInternal = function(tubeContentType, tubeContentTypeName)
4733 05 Apr 18 olle 1373   {
4733 05 Apr 18 olle 1374     var tubeContentTypeNameInternal = tubeContentTypeName;
4733 05 Apr 18 olle 1375     // Convert all names except abbreviations to all lower case
4733 05 Apr 18 olle 1376     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1377     {
4733 05 Apr 18 olle 1378       tubeContentTypeNameInternal = tubeContentTypeName.toLowerCase();
4733 05 Apr 18 olle 1379     }
4733 05 Apr 18 olle 1380     return tubeContentTypeNameInternal;
4733 05 Apr 18 olle 1381   }
4733 05 Apr 18 olle 1382   
4733 05 Apr 18 olle 1383   persinfo.fetchTubeName = function(tubeContentType, caseInfo, tubeIndex)
4733 05 Apr 18 olle 1384   {
4733 05 Apr 18 olle 1385     var tubeName = Strings.encodeTags(caseInfo.originalName);
4733 05 Apr 18 olle 1386     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1387     {
4733 05 Apr 18 olle 1388       var tubeNo = tubeIndex + caseInfo.specimenFirstIndex;
4733 05 Apr 18 olle 1389       tubeName = tubeName+'.'+tubeNo;
4733 05 Apr 18 olle 1390     }
4733 05 Apr 18 olle 1391     else if (tubeContentType == 'DNA')
4733 05 Apr 18 olle 1392     {
4733 05 Apr 18 olle 1393       tubeName = tubeName+'.d';
4733 05 Apr 18 olle 1394     }
4733 05 Apr 18 olle 1395     else if (tubeContentType == 'RNA')
4733 05 Apr 18 olle 1396     {
4733 05 Apr 18 olle 1397       tubeName = tubeName+'.r';
4733 05 Apr 18 olle 1398     }
4733 05 Apr 18 olle 1399     else if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 1400     {
4733 05 Apr 18 olle 1401       if (tubeIndex == 0)
4733 05 Apr 18 olle 1402       {
4733 05 Apr 18 olle 1403         tubeName = tubeName+'.d';
4733 05 Apr 18 olle 1404       }
4733 05 Apr 18 olle 1405       else if (tubeIndex == 1)
4733 05 Apr 18 olle 1406       {
4733 05 Apr 18 olle 1407         tubeName = tubeName+'.r';
4733 05 Apr 18 olle 1408       }
4733 05 Apr 18 olle 1409     }
4733 05 Apr 18 olle 1410     return tubeName;
4733 05 Apr 18 olle 1411   }
4733 05 Apr 18 olle 1412   
4733 05 Apr 18 olle 1413   persinfo.fetchTubeIdentifier = function(tubeContentType, tubeName, tubeNo)
4733 05 Apr 18 olle 1414   {
4733 05 Apr 18 olle 1415     var tubeIdentifier = tubeName;
4733 05 Apr 18 olle 1416     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1417     {
4733 05 Apr 18 olle 1418       tubeIdentifier = tubeNo;
4733 05 Apr 18 olle 1419     }
4733 05 Apr 18 olle 1420     return tubeIdentifier;
4733 05 Apr 18 olle 1421   }
4733 05 Apr 18 olle 1422   
4733 05 Apr 18 olle 1423   persinfo.boxOnKeyUp = function(event)
4733 05 Apr 18 olle 1424   {
4733 05 Apr 18 olle 1425     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1426     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 1427     
4733 05 Apr 18 olle 1428     var boxType = Data.get(event.currentTarget, 'boxtype');
4733 05 Apr 18 olle 1429     var index = Data.int(event.currentTarget, 'index');
4733 05 Apr 18 olle 1430
4733 05 Apr 18 olle 1431     // Get box prefix, default is for input tubes
4733 05 Apr 18 olle 1432     var boxPrefix = 'box.';
4733 05 Apr 18 olle 1433     if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1434     {
4733 05 Apr 18 olle 1435       boxPrefix = 'dnaBox.';
4733 05 Apr 18 olle 1436     }
4733 05 Apr 18 olle 1437     if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1438     {
4733 05 Apr 18 olle 1439       boxPrefix = 'rnaBox.';
4733 05 Apr 18 olle 1440     }
4733 05 Apr 18 olle 1441
4733 05 Apr 18 olle 1442     // Check box name
4733 05 Apr 18 olle 1443     var boxIsValid = true;
4733 05 Apr 18 olle 1444     var box = frm[boxPrefix+index].value;
4733 05 Apr 18 olle 1445     Wizard.setInputStatus(boxPrefix+index);
4733 05 Apr 18 olle 1446     // Check for prefix "ML_"
4733 05 Apr 18 olle 1447     if (box.indexOf('ML_') != 0)
4733 05 Apr 18 olle 1448     {
4733 05 Apr 18 olle 1449       boxIsValid = false;
4733 05 Apr 18 olle 1450     }
4733 05 Apr 18 olle 1451     var suffix = '_sp';
4733 05 Apr 18 olle 1452     if (tubeContentType == 'DNA' || (boxType && boxType == 'DNA'))
4733 05 Apr 18 olle 1453     {
4733 05 Apr 18 olle 1454       suffix = '_dna';
4733 05 Apr 18 olle 1455     }
4733 05 Apr 18 olle 1456     else if (tubeContentType == 'RNA' || (boxType && boxType == 'RNA'))
4733 05 Apr 18 olle 1457     {
4733 05 Apr 18 olle 1458       suffix = '_rna';
4733 05 Apr 18 olle 1459     }
4733 05 Apr 18 olle 1460     // Check for suffix
4733 05 Apr 18 olle 1461     if (box.indexOf(suffix) != (box.length - suffix.length))
4733 05 Apr 18 olle 1462     {
4733 05 Apr 18 olle 1463       boxIsValid = false;
4733 05 Apr 18 olle 1464     }
4733 05 Apr 18 olle 1465     
4733 05 Apr 18 olle 1466     if (!boxIsValid)
4733 05 Apr 18 olle 1467     {
4733 05 Apr 18 olle 1468       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Box name must start with "ML_" and end with "'+suffix+'"');
4733 05 Apr 18 olle 1469       return;
4733 05 Apr 18 olle 1470     }
4733 05 Apr 18 olle 1471   }
4733 05 Apr 18 olle 1472   
4733 05 Apr 18 olle 1473   persinfo.wellOnChange = function(event)
4733 05 Apr 18 olle 1474   {
4733 05 Apr 18 olle 1475     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1476     var target = event.currentTarget;
4733 05 Apr 18 olle 1477
4733 05 Apr 18 olle 1478     var boxType = Data.get(target, 'boxtype');
4733 05 Apr 18 olle 1479     var index = Data.int(target, 'index');
4733 05 Apr 18 olle 1480
4733 05 Apr 18 olle 1481     // Get well position prefixes, default is for input tubes
4733 05 Apr 18 olle 1482     var boxPrefix = 'box.';
4733 05 Apr 18 olle 1483     var rowPrefix = 'row.';
4733 05 Apr 18 olle 1484     var columnPrefix = 'column.';
4733 05 Apr 18 olle 1485     if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1486     {
4733 05 Apr 18 olle 1487       boxPrefix = 'dnaBox.';
4733 05 Apr 18 olle 1488       rowPrefix = 'dnaRow.';
4733 05 Apr 18 olle 1489       columnPrefix = 'dnaColumn.';
4733 05 Apr 18 olle 1490     }
4733 05 Apr 18 olle 1491     if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1492     {
4733 05 Apr 18 olle 1493       boxPrefix = 'rnaBox.';
4733 05 Apr 18 olle 1494       rowPrefix = 'rnaRow.';
4733 05 Apr 18 olle 1495       columnPrefix = 'rnaColumn.';
4733 05 Apr 18 olle 1496     }
4733 05 Apr 18 olle 1497     var box = frm[boxPrefix+index].value;
4733 05 Apr 18 olle 1498     var row = frm[rowPrefix+index].value;
4733 05 Apr 18 olle 1499     var column = frm[columnPrefix+index].value;
4733 05 Apr 18 olle 1500     
4733 05 Apr 18 olle 1501     //wellIsValid[index] = true;
4733 05 Apr 18 olle 1502     if (!boxType || boxType == 'Specimen')
4733 05 Apr 18 olle 1503     {
4733 05 Apr 18 olle 1504       wellIsValid[index] = false;
4733 05 Apr 18 olle 1505     }
4733 05 Apr 18 olle 1506     else if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1507     {
4733 05 Apr 18 olle 1508       dnaWellIsValid[index] = false;
4733 05 Apr 18 olle 1509     }
4733 05 Apr 18 olle 1510     else if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1511     {
4733 05 Apr 18 olle 1512       rnaWellIsValid[index] = false;
4733 05 Apr 18 olle 1513     }
4733 05 Apr 18 olle 1514     else
4733 05 Apr 18 olle 1515     {
4733 05 Apr 18 olle 1516       wellIsValid[index] = false;
4733 05 Apr 18 olle 1517     }
4733 05 Apr 18 olle 1518     Wizard.setInputStatus(boxPrefix+index);
4733 05 Apr 18 olle 1519 /*
4733 05 Apr 18 olle 1520     Wizard.setInputStatus('position.'+index);
4733 05 Apr 18 olle 1521 */
4733 05 Apr 18 olle 1522     
4733 05 Apr 18 olle 1523     if (box == '') 
4733 05 Apr 18 olle 1524     {
4733 05 Apr 18 olle 1525       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing box');
4733 05 Apr 18 olle 1526       return;
4733 05 Apr 18 olle 1527     }
4733 05 Apr 18 olle 1528     
4733 05 Apr 18 olle 1529     // Position errors are reported on box message line    
4733 05 Apr 18 olle 1530     if (row == '')
4733 05 Apr 18 olle 1531     {
4733 05 Apr 18 olle 1532       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing row');
4733 05 Apr 18 olle 1533       return;
4733 05 Apr 18 olle 1534     }
4733 05 Apr 18 olle 1535
4733 05 Apr 18 olle 1536     if (column == '')
4733 05 Apr 18 olle 1537     {
4733 05 Apr 18 olle 1538       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing column');
4733 05 Apr 18 olle 1539       return;
4733 05 Apr 18 olle 1540     }
4733 05 Apr 18 olle 1541     
4733 05 Apr 18 olle 1542     // Check for duplicates
4733 05 Apr 18 olle 1543     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 1544     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 1545     {    
4733 05 Apr 18 olle 1546       if (i != index)
4733 05 Apr 18 olle 1547       {
4733 05 Apr 18 olle 1548         if (box == frm.elements[boxPrefix+i].value && row == frm[rowPrefix+i].value && column == frm[columnPrefix+i].value)
4733 05 Apr 18 olle 1549         {
4733 05 Apr 18 olle 1550           Wizard.setInputStatus(boxPrefix+index, 'invalid', 'The position is already used once in this wizard');        
4733 05 Apr 18 olle 1551           return;
4733 05 Apr 18 olle 1552         }
4733 05 Apr 18 olle 1553       }
4733 05 Apr 18 olle 1554     }
4733 05 Apr 18 olle 1555
4733 05 Apr 18 olle 1556     //Wizard.setInputStatus('position.'+index, 'checking', 'Checking...');
4733 05 Apr 18 olle 1557     Wizard.setInputStatus(boxPrefix+index, 'checking', 'Checking...');
4733 05 Apr 18 olle 1558     
4733 05 Apr 18 olle 1559     // Seems to be ok -- check if used by another sample
4733 05 Apr 18 olle 1560     var request = Ajax.getXmlHttpRequest();
4733 05 Apr 18 olle 1561     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 1562     url += '&cmd=ValidateWell';
4733 05 Apr 18 olle 1563     url += '&box=' + encodeURIComponent(box);  
4733 05 Apr 18 olle 1564     url += '&row=' + encodeURIComponent(row);
4733 05 Apr 18 olle 1565     url += '&column=' + encodeURIComponent(column);
4733 05 Apr 18 olle 1566     
4733 05 Apr 18 olle 1567     Wizard.asyncJsonRequest(url, function(response) { persinfo.onBoxValidated(response, boxType, index) } );
4733 05 Apr 18 olle 1568   }
4733 05 Apr 18 olle 1569   
4733 05 Apr 18 olle 1570   persinfo.onBoxValidated = function(response, boxType, index)
4733 05 Apr 18 olle 1571   {
4733 05 Apr 18 olle 1572     // Get well position prefixes, default is for input tubes
4733 05 Apr 18 olle 1573     var boxPrefix = 'box.';
4733 05 Apr 18 olle 1574     if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1575     {
4733 05 Apr 18 olle 1576       boxPrefix = 'dnaBox.';
4733 05 Apr 18 olle 1577     }
4733 05 Apr 18 olle 1578     if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1579     {
4733 05 Apr 18 olle 1580       boxPrefix = 'rnaBox.';
4733 05 Apr 18 olle 1581     }
4733 05 Apr 18 olle 1582
4733 05 Apr 18 olle 1583     //Wizard.setInputStatus('position.'+index);
4733 05 Apr 18 olle 1584     Wizard.setInputStatus(boxPrefix+index);
4733 05 Apr 18 olle 1585     if (response.message)
4733 05 Apr 18 olle 1586     {
4733 05 Apr 18 olle 1587       //Wizard.setInputStatus(response.box ? 'box.'+index : 'position.'+index, 'invalid', Strings.encodeTags(response.message));
4733 05 Apr 18 olle 1588       Wizard.setInputStatus(boxPrefix+index, 'invalid', Strings.encodeTags(response.message));
4733 05 Apr 18 olle 1589       return;
4733 05 Apr 18 olle 1590     }
4733 05 Apr 18 olle 1591     
4733 05 Apr 18 olle 1592     //wellIsValid[index] = true;
4733 05 Apr 18 olle 1593     if (!boxType || boxType == 'Specimen')
4733 05 Apr 18 olle 1594     {
4733 05 Apr 18 olle 1595       wellIsValid[index] = true;
4733 05 Apr 18 olle 1596     }
4733 05 Apr 18 olle 1597     else if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1598     {
4733 05 Apr 18 olle 1599       dnaWellIsValid[index] = true;
4733 05 Apr 18 olle 1600     }
4733 05 Apr 18 olle 1601     else if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1602     {
4733 05 Apr 18 olle 1603       rnaWellIsValid[index] = true;
4733 05 Apr 18 olle 1604     }
4733 05 Apr 18 olle 1605     else
4733 05 Apr 18 olle 1606     {
4733 05 Apr 18 olle 1607       wellIsValid[index] = true;
4733 05 Apr 18 olle 1608     }
4733 05 Apr 18 olle 1609     Wizard.setInputStatus(boxPrefix+index, 'valid');
4733 05 Apr 18 olle 1610 /*
4733 05 Apr 18 olle 1611     Wizard.setInputStatus('position.'+index, 'valid');
4733 05 Apr 18 olle 1612 */
4733 05 Apr 18 olle 1613   }
4733 05 Apr 18 olle 1614
4733 05 Apr 18 olle 1615   persinfo.nofSectionsOnChange = function(event)
4733 05 Apr 18 olle 1616   {
4733 05 Apr 18 olle 1617     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1618     var target = event.currentTarget;
4733 05 Apr 18 olle 1619
4733 05 Apr 18 olle 1620     var index = Data.int(target, 'index');
4733 05 Apr 18 olle 1621     var nofSections = frm['nofSections.'+index].value;
4733 05 Apr 18 olle 1622
4733 05 Apr 18 olle 1623     Wizard.setInputStatus('nofSections.'+index);
4733 05 Apr 18 olle 1624
4733 05 Apr 18 olle 1625     if (nofSections == '')
4733 05 Apr 18 olle 1626     {
4733 05 Apr 18 olle 1627       Wizard.setInputStatus('nofSections'+index, 'invalid', 'Missing');
4733 05 Apr 18 olle 1628       return;
4733 05 Apr 18 olle 1629     }
4733 05 Apr 18 olle 1630     if (parseInt(nofSections) < 1)
4733 05 Apr 18 olle 1631     {
4733 05 Apr 18 olle 1632       Wizard.setInputStatus('nofSections'+index, 'invalid', 'Must be at least 1');
4733 05 Apr 18 olle 1633       return;    
4733 05 Apr 18 olle 1634     }
4733 05 Apr 18 olle 1635     Wizard.setInputStatus('nofSections'+index, 'valid');
4733 05 Apr 18 olle 1636   }
4733 05 Apr 18 olle 1637
4733 05 Apr 18 olle 1638   persinfo.validateStep4 = function(event)
4733 05 Apr 18 olle 1639   {
4733 05 Apr 18 olle 1640     var valid = false;
4733 05 Apr 18 olle 1641
4733 05 Apr 18 olle 1642     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1643     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 1644     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1645     {
4733 05 Apr 18 olle 1646       for (var i = 0; i < wellIsValid.length; i++)
4733 05 Apr 18 olle 1647       {
4733 05 Apr 18 olle 1648         // No storage space is allocated for first specimen,
4733 05 Apr 18 olle 1649         // since all amount is expected to be used for analysis.
4733 05 Apr 18 olle 1650         // Specimen tube with i == 0 is therefore skipped.
4733 05 Apr 18 olle 1651         if (i > 0)
4733 05 Apr 18 olle 1652         {
4733 05 Apr 18 olle 1653           if (!wellIsValid[i])
4733 05 Apr 18 olle 1654           {
4733 05 Apr 18 olle 1655             event.preventDefault();
4733 05 Apr 18 olle 1656             return;
4733 05 Apr 18 olle 1657           }
4733 05 Apr 18 olle 1658         }
4733 05 Apr 18 olle 1659         if (!dnaWellIsValid[i])
4733 05 Apr 18 olle 1660         {
4733 05 Apr 18 olle 1661           event.preventDefault();
4733 05 Apr 18 olle 1662           return;
4733 05 Apr 18 olle 1663         }
4733 05 Apr 18 olle 1664         if (!rnaWellIsValid[i])
4733 05 Apr 18 olle 1665         {
4733 05 Apr 18 olle 1666           event.preventDefault();
4733 05 Apr 18 olle 1667           return;
4733 05 Apr 18 olle 1668         }
4733 05 Apr 18 olle 1669       }
4733 05 Apr 18 olle 1670     }
4733 05 Apr 18 olle 1671     else
4733 05 Apr 18 olle 1672     {
4733 05 Apr 18 olle 1673       // Input DNA, RNA, or DNA + RNA
4733 05 Apr 18 olle 1674       for (var i = 0; i < wellIsValid.length; i++)
4733 05 Apr 18 olle 1675       {
4733 05 Apr 18 olle 1676         if (!wellIsValid[i])
4733 05 Apr 18 olle 1677         {
4733 05 Apr 18 olle 1678           event.preventDefault();
4733 05 Apr 18 olle 1679           return;
4733 05 Apr 18 olle 1680         }
4733 05 Apr 18 olle 1681       }
4733 05 Apr 18 olle 1682     }
4733 05 Apr 18 olle 1683   }
4733 05 Apr 18 olle 1684
4733 05 Apr 18 olle 1685   persinfo.submit = function()
4733 05 Apr 18 olle 1686   {
4733 05 Apr 18 olle 1687     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1688     var updateMode = caseInfo.id;
4733 05 Apr 18 olle 1689
4733 05 Apr 18 olle 1690     caseInfo.plNumber = frm.plNumber.value;
4733 05 Apr 18 olle 1691     caseInfo.pad = frm.pad.value;
4733 05 Apr 18 olle 1692     caseInfo.samplingDate = Strings.trim(frm.samplingDate.value);
4733 05 Apr 18 olle 1693     caseInfo.tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 1694     if (!updateMode)
4733 05 Apr 18 olle 1695     {
4733 05 Apr 18 olle 1696       caseInfo.arrivalDate = Strings.trim(frm.arrivalDate.value);
4779 20 Apr 18 olle 1697 /*
4733 05 Apr 18 olle 1698       caseInfo.mutationAnalysisKras = frm.mutationAnalysisKras.checked;
4733 05 Apr 18 olle 1699       caseInfo.mutationAnalysisNras = frm.mutationAnalysisNras.checked;
4733 05 Apr 18 olle 1700       caseInfo.mutationAnalysisBraf = frm.mutationAnalysisBraf.checked;
4733 05 Apr 18 olle 1701       caseInfo.mutationAnalysisEgfr = frm.mutationAnalysisEgfr.checked;
4733 05 Apr 18 olle 1702       caseInfo.mutationAnalysisAlkEml4 = frm.mutationAnalysisAlkEml4.checked;
4733 05 Apr 18 olle 1703       caseInfo.mutationAnalysisPdgfra = frm.mutationAnalysisPdgfra.checked;
4733 05 Apr 18 olle 1704       caseInfo.mutationAnalysisKit = frm.mutationAnalysisKit.checked;
4779 20 Apr 18 olle 1705 */
4733 05 Apr 18 olle 1706       caseInfo.mutationAnalysisTst170 = frm.mutationAnalysisTst170.checked;
4733 05 Apr 18 olle 1707       caseInfo.mutationAnalysisOther = frm.mutationAnalysisOther.checked;
4733 05 Apr 18 olle 1708       caseInfo.site = frm.site.value;
4733 05 Apr 18 olle 1709       caseInfo.specimenType = frm.specimenType.value;
4733 05 Apr 18 olle 1710       caseInfo.specimenInputType = frm.specimenInputType.value;
4733 05 Apr 18 olle 1711       caseInfo.projectFocus = frm.projectFocus.value;
4733 05 Apr 18 olle 1712       caseInfo.metastasisSite = frm.metastasisSite.value;
4733 05 Apr 18 olle 1713       caseInfo.viableTumourCellsPercent = frm.viableTumourCellsPercent.value;
4733 05 Apr 18 olle 1714       caseInfo.otherPathNote = frm.otherPathNote.value;
4733 05 Apr 18 olle 1715       caseInfo.extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
4733 05 Apr 18 olle 1716     
4733 05 Apr 18 olle 1717       var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 1718       caseInfo.specimen = [];
4733 05 Apr 18 olle 1719       for (var i = 0; i < nofTubes; i++)
4733 05 Apr 18 olle 1720       {
4733 05 Apr 18 olle 1721         var specimenTube ={};
4733 05 Apr 18 olle 1722         specimenTube.name = persinfo.fetchTubeName(caseInfo.tubeContentType, caseInfo, i);
4733 05 Apr 18 olle 1723
4733 05 Apr 18 olle 1724         specimenTube.box = frm['box.'+i].value;
4733 05 Apr 18 olle 1725         specimenTube.row = frm['row.'+i].value;
4733 05 Apr 18 olle 1726         specimenTube.column = frm['column.'+i].value;
4733 05 Apr 18 olle 1727         var nofSections = null;
4733 05 Apr 18 olle 1728         if (caseInfo.tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1729         {
4733 05 Apr 18 olle 1730           if (i == 0 || !caseInfo.extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 1731           {
4733 05 Apr 18 olle 1732             // Storage position for DNA extract from specimen
4733 05 Apr 18 olle 1733             specimenTube.dnaBox = frm['dnaBox.'+i].value;
4733 05 Apr 18 olle 1734             specimenTube.dnaRow = frm['dnaRow.'+i].value;
4733 05 Apr 18 olle 1735             specimenTube.dnaColumn = frm['dnaColumn.'+i].value;
4733 05 Apr 18 olle 1736
4733 05 Apr 18 olle 1737             // Storage position for RNA extract from specimen        
4733 05 Apr 18 olle 1738             specimenTube.rnaBox = frm['rnaBox.'+i].value;
4733 05 Apr 18 olle 1739             specimenTube.rnaRow = frm['rnaRow.'+i].value;
4733 05 Apr 18 olle 1740             specimenTube.rnaColumn = frm['rnaColumn.'+i].value;
4733 05 Apr 18 olle 1741           }
4733 05 Apr 18 olle 1742         
4733 05 Apr 18 olle 1743           nofSections = frm['nofSections.'+i].value;
4733 05 Apr 18 olle 1744         }
4733 05 Apr 18 olle 1745         specimenTube.nofSections = nofSections;
4733 05 Apr 18 olle 1746         specimenTube.comment = frm['comment.'+i].value;
4733 05 Apr 18 olle 1747         specimenTube.specimenType = frm.specimenType.value;
4733 05 Apr 18 olle 1748         specimenTube.specimenInputType = frm.specimenInputType.value;
4733 05 Apr 18 olle 1749         caseInfo.specimen[i] = specimenTube;
4733 05 Apr 18 olle 1750       }
4733 05 Apr 18 olle 1751     }
4733 05 Apr 18 olle 1752     var submitInfo = {};
4733 05 Apr 18 olle 1753     submitInfo.patientInfo = patientInfo;
4733 05 Apr 18 olle 1754     submitInfo.caseInfo = caseInfo;
4733 05 Apr 18 olle 1755
4733 05 Apr 18 olle 1756     var url = '../PersonalRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 1757     url += '&cmd=' + (updateMode ? 'UpdateCase' : 'CreateCase');
4733 05 Apr 18 olle 1758     Wizard.showLoadingAnimation('Registering case...');
4733 05 Apr 18 olle 1759     Wizard.asyncJsonRequest(url, persinfo.submissionResults, 'POST', JSON.stringify(submitInfo));
4733 05 Apr 18 olle 1760   }
4733 05 Apr 18 olle 1761   
4733 05 Apr 18 olle 1762   persinfo.submissionResults = function(response)
4733 05 Apr 18 olle 1763   {
4733 05 Apr 18 olle 1764     Wizard.showFinalMessage(response.messages);
4733 05 Apr 18 olle 1765     Doc.show('gorestart');
4733 05 Apr 18 olle 1766   }
4733 05 Apr 18 olle 1767
4733 05 Apr 18 olle 1768   return persinfo;
4733 05 Apr 18 olle 1769 }();
4733 05 Apr 18 olle 1770
4733 05 Apr 18 olle 1771 Doc.onLoad(PersInfo.initPage);
4733 05 Apr 18 olle 1772