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

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