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

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