extensions/net.sf.basedb.meludi/trunk/resources/sampleproc/specimentube.js

Code
Comments
Other
Rev Date Author Line
2933 14 Nov 14 olle 1 var SpecimenTubeReg = function()
2933 14 Nov 14 olle 2 {
2933 14 Nov 14 olle 3   var streg = {};
2933 14 Nov 14 olle 4   var debug = 0;
4198 31 Oct 16 olle 5   var myPermissions = {};
2933 14 Nov 14 olle 6   
2933 14 Nov 14 olle 7   var caseInfo;
2933 14 Nov 14 olle 8   
4147 03 Oct 16 olle 9   var sampleItemPrefix = '';
4224 09 Nov 16 olle 10   var sampleItemNumDigits = 5;
2933 14 Nov 14 olle 11   var nofTubesIsValid = false;
2933 14 Nov 14 olle 12   var samplingDateIsValid = true;
3106 26 Jan 15 olle 13   var viableTumourCellsPercentIsValid = true;
4723 29 Mar 18 olle 14   var usesSitePrefix = false;
2933 14 Nov 14 olle 15
3276 29 Apr 15 olle 16   // Well validation variable for input specimen, DNA, RNA
2933 14 Nov 14 olle 17   var wellIsValid = [];
3276 29 Apr 15 olle 18   // Well validation variables for extracts from specimen
3276 29 Apr 15 olle 19   var dnaWellIsValid = [];
3276 29 Apr 15 olle 20   var rnaWellIsValid = [];
2933 14 Nov 14 olle 21   
2933 14 Nov 14 olle 22   var restartTimer;
2933 14 Nov 14 olle 23   var restartAt;
2933 14 Nov 14 olle 24   
2933 14 Nov 14 olle 25   // Page initialization
2933 14 Nov 14 olle 26   streg.initPage = function()
2933 14 Nov 14 olle 27   {
2933 14 Nov 14 olle 28     // Step 1
2933 14 Nov 14 olle 29     Events.addEventHandler('step-1', 'wizard-validate', streg.validateStep1);
2933 14 Nov 14 olle 30     Events.addEventHandler('caseName', 'keypress', Wizard.goNextOnTabOrEnter);
2933 14 Nov 14 olle 31     
2933 14 Nov 14 olle 32     // Step 2
2933 14 Nov 14 olle 33     Events.addEventHandler('step-2', 'wizard-initialize', streg.initializeStep2);
2933 14 Nov 14 olle 34     Events.addEventHandler('step-2', 'wizard-validate', streg.validateStep2);
4198 31 Oct 16 olle 35     Events.addEventHandler('pad', 'blur', streg.padOnChange);
2933 14 Nov 14 olle 36     Events.addEventHandler('nofTubes', 'keypress', Events.integerOnly);
2933 14 Nov 14 olle 37     Events.addEventHandler('nofTubes', 'blur', streg.nofTubesOnChange);
2933 14 Nov 14 olle 38     Events.addEventHandler('arrivalDate', 'blur', Wizard.validateDate);
2933 14 Nov 14 olle 39     Events.addEventHandler('samplingDate', 'blur', streg.samplingDateOnChange);
3232 08 Apr 15 olle 40     Events.addEventHandler('projectFocus', 'change', streg.projectFocusOnChange);
2933 14 Nov 14 olle 41     Events.addEventHandler('site', 'change', streg.siteOnChange);
3028 11 Dec 14 olle 42     Events.addEventHandler('specimenType', 'change', streg.specimenTypeOnChange);
3067 08 Jan 15 olle 43     Events.addEventHandler('viableTumourCellsPercent', 'keypress', Events.integerOnly);
3067 08 Jan 15 olle 44     Events.addEventHandler('viableTumourCellsPercent', 'blur', streg.viableTumourCellsPercentOnChange);
2933 14 Nov 14 olle 45     Events.addEventHandler('otherPathNote', 'keypress', Wizard.goNextOnTab);
3249 14 Apr 15 olle 46     Buttons.addClickHandler('selectAllMutationAnalysis', streg.mutationAnalysisSelectAll);
2933 14 Nov 14 olle 47
2933 14 Nov 14 olle 48     // Step 3
2933 14 Nov 14 olle 49     Events.addEventHandler('step-3', 'wizard-initialize', streg.initializeStep3);
2933 14 Nov 14 olle 50     Events.addEventHandler('step-3', 'wizard-validate', streg.validateStep3);
2933 14 Nov 14 olle 51     
2933 14 Nov 14 olle 52     // Navigation
2933 14 Nov 14 olle 53     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2933 14 Nov 14 olle 54     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2933 14 Nov 14 olle 55     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2933 14 Nov 14 olle 56     Buttons.addClickHandler('goregister', Wizard.goRegister);
2933 14 Nov 14 olle 57     Buttons.addClickHandler('gostop', streg.stopAutoRestart);
2933 14 Nov 14 olle 58     
2933 14 Nov 14 olle 59     // Final registration
2933 14 Nov 14 olle 60     Events.addEventHandler('wizard', 'wizard-submit', streg.submit);
2933 14 Nov 14 olle 61
4198 31 Oct 16 olle 62     // Load permissions
4198 31 Oct 16 olle 63     streg.initPermissions();
4161 18 Oct 16 olle 64     // Load configuration
4161 18 Oct 16 olle 65     streg.loadConfiguration();
4161 18 Oct 16 olle 66   }
4161 18 Oct 16 olle 67   
4198 31 Oct 16 olle 68   streg.initPermissions = function()
4198 31 Oct 16 olle 69   {
4198 31 Oct 16 olle 70     // Get permission information
4198 31 Oct 16 olle 71     var url = '../Install.servlet?ID='+App.getSessionId();
4198 31 Oct 16 olle 72     url += '&cmd=GetPermissions';
4198 31 Oct 16 olle 73     var request = Ajax.getXmlHttpRequest();
4198 31 Oct 16 olle 74     request.open("GET", url, true);
4198 31 Oct 16 olle 75     Ajax.setReadyStateHandler(request, streg.onPermissionsLoaded, streg.onPermissionsLoaded);
4198 31 Oct 16 olle 76     request.send(null);
4198 31 Oct 16 olle 77   }
4198 31 Oct 16 olle 78   
4198 31 Oct 16 olle 79   // Callback when permission information is ready
4198 31 Oct 16 olle 80   streg.onPermissionsLoaded = function(request)
4198 31 Oct 16 olle 81   {
4198 31 Oct 16 olle 82     if (debug) App.debug(Strings.encodeTags(request.responseText));
4198 31 Oct 16 olle 83     var response;
4198 31 Oct 16 olle 84     var error = false;
4198 31 Oct 16 olle 85     try
4198 31 Oct 16 olle 86     {
4198 31 Oct 16 olle 87       response = JSON.parse(request.responseText);
4198 31 Oct 16 olle 88       if (response.status != 'ok')
4198 31 Oct 16 olle 89       {
4198 31 Oct 16 olle 90         error = response.message || response.stacktrace || 'Unexpected error';
4198 31 Oct 16 olle 91       }
4198 31 Oct 16 olle 92     }
4198 31 Oct 16 olle 93     catch (ex)
4198 31 Oct 16 olle 94     {
4198 31 Oct 16 olle 95       error = ex;
4198 31 Oct 16 olle 96     }
4198 31 Oct 16 olle 97     
4198 31 Oct 16 olle 98     if (error)
4198 31 Oct 16 olle 99     {
4198 31 Oct 16 olle 100       alert(error);
4198 31 Oct 16 olle 101       return;
4198 31 Oct 16 olle 102     }
4198 31 Oct 16 olle 103     
4198 31 Oct 16 olle 104     myPermissions = response.permissions;
4198 31 Oct 16 olle 105     //var isAdmin = myPermissions['Administrator'] == 1;
4198 31 Oct 16 olle 106     //var noProjectIsActive = !App.getActiveProjectId();
4198 31 Oct 16 olle 107   }
4198 31 Oct 16 olle 108
4161 18 Oct 16 olle 109   streg.loadConfiguration = function()
4161 18 Oct 16 olle 110   {
4161 18 Oct 16 olle 111     var url = '../Session.servlet?ID='+App.getSessionId();
4161 18 Oct 16 olle 112     url += '&cmd=GetConfiguration'
4161 18 Oct 16 olle 113     var request = Ajax.getXmlHttpRequest();
4161 18 Oct 16 olle 114     request.open("GET", url, true);
4161 18 Oct 16 olle 115     Ajax.setReadyStateHandler(request, streg.onConfiguration, streg.onConfiguration);
4161 18 Oct 16 olle 116     request.send(null);
4161 18 Oct 16 olle 117   }
4161 18 Oct 16 olle 118   
4161 18 Oct 16 olle 119   streg.onConfiguration = function(request)
4161 18 Oct 16 olle 120   {
4161 18 Oct 16 olle 121     var frm = document.forms['meludi'];  
4161 18 Oct 16 olle 122
4161 18 Oct 16 olle 123     if (debug)
4161 18 Oct 16 olle 124     {
4161 18 Oct 16 olle 125       App.debug(Strings.encodeTags(request.responseText));
4161 18 Oct 16 olle 126     }
4161 18 Oct 16 olle 127     
4161 18 Oct 16 olle 128     var response;
4161 18 Oct 16 olle 129     var error = false;
4161 18 Oct 16 olle 130     try
4161 18 Oct 16 olle 131     {
4161 18 Oct 16 olle 132       response = JSON.parse(request.responseText);
4161 18 Oct 16 olle 133       if (response.status != 'ok')
4161 18 Oct 16 olle 134       {
4161 18 Oct 16 olle 135         error = response.message || response.stacktrace || 'Unexpected error';
4161 18 Oct 16 olle 136       }
4161 18 Oct 16 olle 137     }
4161 18 Oct 16 olle 138     catch (ex)
4161 18 Oct 16 olle 139     {
4161 18 Oct 16 olle 140       error = ex;
4161 18 Oct 16 olle 141     }
4161 18 Oct 16 olle 142     if (error) App.debug(error);
4161 18 Oct 16 olle 143
4161 18 Oct 16 olle 144     // Get configuration result    
4161 18 Oct 16 olle 145     var conf = response.configuration;
4723 29 Mar 18 olle 146     // Check for uses site prefix flag
4723 29 Mar 18 olle 147     usesSitePrefix = conf.usesSitePrefix;
4161 18 Oct 16 olle 148     // Check for project focus default
4161 18 Oct 16 olle 149     var projectFocusDefault = conf.projectFocusDefault;
4161 18 Oct 16 olle 150     if (projectFocusDefault != null)
4161 18 Oct 16 olle 151     {
4161 18 Oct 16 olle 152       frm.projectFocus.value = projectFocusDefault;
4161 18 Oct 16 olle 153       streg.projectFocusOnChange();
4161 18 Oct 16 olle 154     }
4195 31 Oct 16 olle 155     // Check for specimen type default
4161 18 Oct 16 olle 156     var specimenTypeDefault = conf.specimenTypeDefault;
4161 18 Oct 16 olle 157     if (specimenTypeDefault != null)
4161 18 Oct 16 olle 158     {
4161 18 Oct 16 olle 159       frm.specimenType.value = specimenTypeDefault;
4161 18 Oct 16 olle 160     }
4195 31 Oct 16 olle 161     // Check for specimen input type default
4195 31 Oct 16 olle 162     var specimenInputTypeDefault = conf.specimenInputTypeDefault;
4195 31 Oct 16 olle 163     if (specimenInputTypeDefault != null)
4195 31 Oct 16 olle 164     {
4195 31 Oct 16 olle 165       frm.specimenInputType.value = specimenInputTypeDefault;
4195 31 Oct 16 olle 166     }
4248 22 Nov 16 olle 167     // Check for extracts from first specimen only default
4248 22 Nov 16 olle 168     var extractsFromFirstSpecimenOnlyDefault = conf.extractsFromFirstSpecimenOnlyDefault;
4248 22 Nov 16 olle 169     if (extractsFromFirstSpecimenOnlyDefault != null)
4248 22 Nov 16 olle 170     {
4248 22 Nov 16 olle 171       frm.extractsFromFirstSpecimenOnlyCB.checked = extractsFromFirstSpecimenOnlyDefault;
4248 22 Nov 16 olle 172     }
4161 18 Oct 16 olle 173
4161 18 Oct 16 olle 174     // Continue with initializing info for case
3148 26 Feb 15 olle 175     var url = '../LabelGeneration.servlet?ID='+App.getSessionId();
3148 26 Feb 15 olle 176     url += '&cmd=CountCases';
3148 26 Feb 15 olle 177     Wizard.showLoadingAnimation('Loading cases...');
3148 26 Feb 15 olle 178     Wizard.asyncJsonRequest(url, streg.caseInfoLoadedStep1);
3148 26 Feb 15 olle 179   }
3148 26 Feb 15 olle 180
3148 26 Feb 15 olle 181   streg.caseInfoLoadedStep1 = function(response)
3148 26 Feb 15 olle 182   {
3148 26 Feb 15 olle 183     var frm = document.forms['meludi'];  
3148 26 Feb 15 olle 184
4198 31 Oct 16 olle 185     // Disable PAD/CL input field if not Administrator or PatientCurator
4198 31 Oct 16 olle 186     var isAdmin = myPermissions['Administrator'] == 1;
4198 31 Oct 16 olle 187     var isPatCur = myPermissions['PatientCurator'] == 1;
4198 31 Oct 16 olle 188     if (!isAdmin && !isPatCur)
4198 31 Oct 16 olle 189     {
4198 31 Oct 16 olle 190       frm.pad.disabled = true;
4198 31 Oct 16 olle 191     }
4198 31 Oct 16 olle 192
4147 03 Oct 16 olle 193     sampleItemPrefix = response.sampleItemPrefix;
4224 09 Nov 16 olle 194     sampleItemNumDigits = response.sampleItemNumDigits;
3148 26 Feb 15 olle 195     var nofCases = response.count;
3148 26 Feb 15 olle 196     if (nofCases == null)
3148 26 Feb 15 olle 197     {
3148 26 Feb 15 olle 198       nofCases = 0;
3148 26 Feb 15 olle 199     }
3148 26 Feb 15 olle 200     var startNum = nofCases + 1;
4224 09 Nov 16 olle 201     // Pad number with leading zeros to get right number of digits
4224 09 Nov 16 olle 202     startNum = String('0000000000' + startNum).slice(-sampleItemNumDigits);
4147 03 Oct 16 olle 203     var startCase = sampleItemPrefix + startNum;
4723 29 Mar 18 olle 204     if (usesSitePrefix != null && usesSitePrefix)
4723 29 Mar 18 olle 205     {
4723 29 Mar 18 olle 206       startCase = '';
4723 29 Mar 18 olle 207     }
3148 26 Feb 15 olle 208     frm.caseName.value = startCase;
4224 09 Nov 16 olle 209     Doc.element('caseNameText').innerHTML = 'The case name (barcode) associated with this specimen tube ("' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits).';
3148 26 Feb 15 olle 210     
2933 14 Nov 14 olle 211     Doc.show('step-1');
2933 14 Nov 14 olle 212     Doc.show('gonext');
2933 14 Nov 14 olle 213   }
2933 14 Nov 14 olle 214
2933 14 Nov 14 olle 215   streg.validateStep1 = function(event)
2933 14 Nov 14 olle 216   {
2933 14 Nov 14 olle 217     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 218     
2933 14 Nov 14 olle 219     var caseName = frm.caseName.value;
2933 14 Nov 14 olle 220     var caseIsValid = false;
2933 14 Nov 14 olle 221     Wizard.setInputStatus('caseName');
2933 14 Nov 14 olle 222     if (caseName == '')
2933 14 Nov 14 olle 223     {
2933 14 Nov 14 olle 224       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
2933 14 Nov 14 olle 225       frm.caseName.focus();
2933 14 Nov 14 olle 226     }
4224 09 Nov 16 olle 227     else if (!Meludi.isValidCaseName2(caseName, sampleItemPrefix, sampleItemNumDigits))
2933 14 Nov 14 olle 228     {
4224 09 Nov 16 olle 229       Wizard.setInputStatus('caseName', 'invalid', 'Only name = "' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits is allowed.');
2933 14 Nov 14 olle 230       frm.caseName.focus();
2933 14 Nov 14 olle 231     }
2933 14 Nov 14 olle 232     else
2933 14 Nov 14 olle 233     {
2933 14 Nov 14 olle 234       Wizard.setInputStatus('caseName', 'valid');
2933 14 Nov 14 olle 235       caseIsValid = true;
2933 14 Nov 14 olle 236     }
2933 14 Nov 14 olle 237     
2933 14 Nov 14 olle 238     // If not valid, we prevent the wizard from moving to the next step
2933 14 Nov 14 olle 239     if (!caseIsValid) event.preventDefault();
2933 14 Nov 14 olle 240   }
2933 14 Nov 14 olle 241   
2933 14 Nov 14 olle 242   streg.initializeStep2 = function()
2933 14 Nov 14 olle 243   {
2933 14 Nov 14 olle 244     var frm = document.forms['meludi'];  
2933 14 Nov 14 olle 245     var caseName = frm.caseName.value;
2933 14 Nov 14 olle 246     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2933 14 Nov 14 olle 247     url += '&cmd=GetCaseInfo';
2933 14 Nov 14 olle 248     url += '&caseName=' + encodeURIComponent(caseName);
2933 14 Nov 14 olle 249     
2933 14 Nov 14 olle 250     Wizard.showLoadingAnimation('Loading information about case...');
2933 14 Nov 14 olle 251     Wizard.asyncJsonRequest(url, streg.caseInfoLoaded);
2933 14 Nov 14 olle 252   }
3250 15 Apr 15 olle 253
2933 14 Nov 14 olle 254   streg.caseInfoLoaded = function(response)
2933 14 Nov 14 olle 255   {
2933 14 Nov 14 olle 256     var frm = document.forms['meludi'];  
2933 14 Nov 14 olle 257     caseInfo = response.caseInfo;
2933 14 Nov 14 olle 258     
2933 14 Nov 14 olle 259     Wizard.setCurrentStep(2);
2933 14 Nov 14 olle 260     Doc.show('gocancel');
2933 14 Nov 14 olle 261     Doc.show('gonext');
2933 14 Nov 14 olle 262     
2933 14 Nov 14 olle 263     frm.arrivalDate.value = Dates.formatDate(new Date(), 'yyyyMMdd');
2933 14 Nov 14 olle 264
4723 29 Mar 18 olle 265     // If site determined by site prefix in case name, set site default value and disable site menu
4723 29 Mar 18 olle 266     //alert("specimentube.js:: streg.caseInfoLoaded: caseInfo.siteDefault = " + caseInfo.siteDefault);
4723 29 Mar 18 olle 267     if (caseInfo.siteDefault != null)
4723 29 Mar 18 olle 268     {
4723 29 Mar 18 olle 269       frm.site.value = caseInfo.siteDefault;
4723 29 Mar 18 olle 270       frm.site.disabled = true;
4723 29 Mar 18 olle 271     }
4723 29 Mar 18 olle 272
2933 14 Nov 14 olle 273     frm.nofTubes.focus();
2933 14 Nov 14 olle 274     frm.nofTubes.setSelectionRange(0,1);
2933 14 Nov 14 olle 275   }
2933 14 Nov 14 olle 276   
4198 31 Oct 16 olle 277   streg.padOnChange = function()
4198 31 Oct 16 olle 278   {
4198 31 Oct 16 olle 279     var frm = document.forms['meludi'];
4198 31 Oct 16 olle 280     var PAD = frm.pad.value;
4198 31 Oct 16 olle 281     if (PAD == '')
4198 31 Oct 16 olle 282     {
4198 31 Oct 16 olle 283       Wizard.setInputStatus('pad', 'warning', 'Missing');
4198 31 Oct 16 olle 284       return;
4198 31 Oct 16 olle 285     }
4198 31 Oct 16 olle 286     frm.pad.value = PAD.replace(/\+/, '-');
4198 31 Oct 16 olle 287     Wizard.setInputStatus('pad', 'valid');
4198 31 Oct 16 olle 288   }
4198 31 Oct 16 olle 289
2933 14 Nov 14 olle 290   streg.nofTubesOnChange = function()
2933 14 Nov 14 olle 291   {
2933 14 Nov 14 olle 292     nofTubesIsValid = false;
2933 14 Nov 14 olle 293
2933 14 Nov 14 olle 294     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 295     var nofTubes = frm.nofTubes.value;
2933 14 Nov 14 olle 296     
2933 14 Nov 14 olle 297     if (nofTubes == '')
2933 14 Nov 14 olle 298     {
2933 14 Nov 14 olle 299       Wizard.setInputStatus('nofTubes', 'invalid', 'Missing');
2933 14 Nov 14 olle 300       return;
2933 14 Nov 14 olle 301     }
2933 14 Nov 14 olle 302     if (parseInt(nofTubes) < 1)
2933 14 Nov 14 olle 303     {
2933 14 Nov 14 olle 304       Wizard.setInputStatus('nofTubes', 'invalid', 'Must be at least 1');
2933 14 Nov 14 olle 305       return;    
2933 14 Nov 14 olle 306     }
2933 14 Nov 14 olle 307     Wizard.setInputStatus('nofTubes', 'valid');
2933 14 Nov 14 olle 308     nofTubesIsValid = true; 
2933 14 Nov 14 olle 309   }
2933 14 Nov 14 olle 310
2933 14 Nov 14 olle 311   streg.samplingDateOnChange = function()
2933 14 Nov 14 olle 312   {
2933 14 Nov 14 olle 313     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 314     
2933 14 Nov 14 olle 315     samplingDateIsValid = false;
2933 14 Nov 14 olle 316     Wizard.setInputStatus('samplingDate');
2933 14 Nov 14 olle 317     
2933 14 Nov 14 olle 318     var samplingDate = frm.samplingDate.value;
2933 14 Nov 14 olle 319
2933 14 Nov 14 olle 320     if (samplingDate != '')
2933 14 Nov 14 olle 321     {
2933 14 Nov 14 olle 322       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2933 14 Nov 14 olle 323       samplingDate = Meludi.autoFillDate(samplingDate);
2933 14 Nov 14 olle 324       frm.samplingDate.value = samplingDate;
2933 14 Nov 14 olle 325     
2933 14 Nov 14 olle 326       var d = Dates.parseString(samplingDate, 'yyyyMMdd');
2933 14 Nov 14 olle 327       if (d == null)
2933 14 Nov 14 olle 328       {
2933 14 Nov 14 olle 329         Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid date');
2933 14 Nov 14 olle 330         return;
2933 14 Nov 14 olle 331       }
2933 14 Nov 14 olle 332       
2933 14 Nov 14 olle 333       var today = new Date();
2933 14 Nov 14 olle 334       if (d.getTime() > today.getTime())
2933 14 Nov 14 olle 335       {
2933 14 Nov 14 olle 336         Wizard.setInputStatus('samplingDate', 'invalid', 'Future date is not valid');
2933 14 Nov 14 olle 337         return;
2933 14 Nov 14 olle 338       }
3159 04 Mar 15 olle 339
3159 04 Mar 15 olle 340       var arrivalDate = frm.arrivalDate.value;
3159 04 Mar 15 olle 341       if (arrivalDate != '' && arrivalDate < samplingDate)
3159 04 Mar 15 olle 342       {
3159 04 Mar 15 olle 343         Wizard.setInputStatus('samplingDate', 'invalid', 'Arrival date is before sampling date');
3159 04 Mar 15 olle 344         return;
3159 04 Mar 15 olle 345       }
3159 04 Mar 15 olle 346
2933 14 Nov 14 olle 347       Wizard.setInputStatus('samplingDate', 'valid');
2933 14 Nov 14 olle 348     }
2933 14 Nov 14 olle 349     samplingDateIsValid = true;
2933 14 Nov 14 olle 350   }
2933 14 Nov 14 olle 351   
3232 08 Apr 15 olle 352   streg.projectFocusOnChange = function()
3232 08 Apr 15 olle 353   {
3232 08 Apr 15 olle 354     var frm = document.forms['meludi'];
3232 08 Apr 15 olle 355     var projectFocus = frm.projectFocus.value;
3232 08 Apr 15 olle 356
3232 08 Apr 15 olle 357     streg.mutationAnalysisReset();
3232 08 Apr 15 olle 358     
3232 08 Apr 15 olle 359     if (projectFocus == 'melanoma')
3232 08 Apr 15 olle 360     {
3232 08 Apr 15 olle 361       frm.mutationAnalysisNras.checked = true;
3232 08 Apr 15 olle 362       frm.mutationAnalysisBraf.checked = true;
3232 08 Apr 15 olle 363       frm.mutationAnalysisKit.checked = true;
3232 08 Apr 15 olle 364       return;
3232 08 Apr 15 olle 365     }
3232 08 Apr 15 olle 366     if (projectFocus == 'lungcancer')
3232 08 Apr 15 olle 367     {
3232 08 Apr 15 olle 368       frm.mutationAnalysisKras.checked = true;
3232 08 Apr 15 olle 369       frm.mutationAnalysisEgfr.checked = true;
3232 08 Apr 15 olle 370       return;
3232 08 Apr 15 olle 371     }
3232 08 Apr 15 olle 372     if (projectFocus == 'coloncancer')
3232 08 Apr 15 olle 373     {
3232 08 Apr 15 olle 374       frm.mutationAnalysisKras.checked = true;
3232 08 Apr 15 olle 375       frm.mutationAnalysisNras.checked = true;
3232 08 Apr 15 olle 376       frm.mutationAnalysisBraf.checked = true;
3232 08 Apr 15 olle 377       return;
3232 08 Apr 15 olle 378     }
3232 08 Apr 15 olle 379     if (projectFocus == 'GIST')
3232 08 Apr 15 olle 380     {
3232 08 Apr 15 olle 381       frm.mutationAnalysisPdgfra.checked = true;
3232 08 Apr 15 olle 382       frm.mutationAnalysisKit.checked = true;
3232 08 Apr 15 olle 383       return;
3232 08 Apr 15 olle 384     }
3232 08 Apr 15 olle 385   }
3232 08 Apr 15 olle 386
3232 08 Apr 15 olle 387   streg.mutationAnalysisReset = function()
3232 08 Apr 15 olle 388   {
3232 08 Apr 15 olle 389     var frm = document.forms['meludi'];
3232 08 Apr 15 olle 390
3232 08 Apr 15 olle 391     frm.mutationAnalysisKras.checked = false;
3232 08 Apr 15 olle 392     frm.mutationAnalysisNras.checked = false;
3232 08 Apr 15 olle 393     frm.mutationAnalysisBraf.checked = false;
3232 08 Apr 15 olle 394     frm.mutationAnalysisEgfr.checked = false;
3232 08 Apr 15 olle 395     frm.mutationAnalysisAlkEml4.checked = false;
3232 08 Apr 15 olle 396     frm.mutationAnalysisPdgfra.checked = false;
3232 08 Apr 15 olle 397     frm.mutationAnalysisKit.checked = false;
4730 04 Apr 18 olle 398     frm.mutationAnalysisTst170.checked = false;
3232 08 Apr 15 olle 399     frm.mutationAnalysisOther.checked = false;
3232 08 Apr 15 olle 400   }
3232 08 Apr 15 olle 401
3249 14 Apr 15 olle 402   streg.mutationAnalysisSelectAll = function()
3249 14 Apr 15 olle 403   {
3249 14 Apr 15 olle 404     var frm = document.forms['meludi'];
3249 14 Apr 15 olle 405
3249 14 Apr 15 olle 406     frm.mutationAnalysisKras.checked = true;
3249 14 Apr 15 olle 407     frm.mutationAnalysisNras.checked = true;
3249 14 Apr 15 olle 408     frm.mutationAnalysisBraf.checked = true;
3249 14 Apr 15 olle 409     frm.mutationAnalysisEgfr.checked = true;
3249 14 Apr 15 olle 410     frm.mutationAnalysisAlkEml4.checked = true;
3249 14 Apr 15 olle 411     frm.mutationAnalysisPdgfra.checked = true;
3249 14 Apr 15 olle 412     frm.mutationAnalysisKit.checked = true;
4730 04 Apr 18 olle 413     //frm.mutationAnalysisTst170.checked = true;
3249 14 Apr 15 olle 414     //frm.mutationAnalysisOther.checked = true;
3249 14 Apr 15 olle 415   }
3249 14 Apr 15 olle 416
3067 08 Jan 15 olle 417   streg.viableTumourCellsPercentOnChange = function()
3067 08 Jan 15 olle 418   {
3067 08 Jan 15 olle 419     viableTumourCellsPercentIsValid = false;
3067 08 Jan 15 olle 420
3067 08 Jan 15 olle 421     var frm = document.forms['meludi'];
3067 08 Jan 15 olle 422     var viableTumourCellsPercent = frm.viableTumourCellsPercent.value;
3067 08 Jan 15 olle 423     
3106 26 Jan 15 olle 424     if (viableTumourCellsPercent != null)
3067 08 Jan 15 olle 425     {
3106 26 Jan 15 olle 426       if (parseInt(viableTumourCellsPercent) < 0)
3106 26 Jan 15 olle 427       {
3106 26 Jan 15 olle 428         Wizard.setInputStatus('viableTumourCellsPercent', 'invalid', 'Must be at least 0');
3106 26 Jan 15 olle 429         return;    
3106 26 Jan 15 olle 430       }
3106 26 Jan 15 olle 431       if (parseInt(viableTumourCellsPercent) > 100)
3106 26 Jan 15 olle 432       {
3106 26 Jan 15 olle 433         Wizard.setInputStatus('viableTumourCellsPercent', 'invalid', 'Must be at most 100');
3106 26 Jan 15 olle 434         return;    
3106 26 Jan 15 olle 435       }
3067 08 Jan 15 olle 436     }
3067 08 Jan 15 olle 437     Wizard.setInputStatus('viableTumourCellsPercent', 'valid');
3067 08 Jan 15 olle 438     viableTumourCellsPercentIsValid = true; 
3067 08 Jan 15 olle 439   }
3067 08 Jan 15 olle 440
2933 14 Nov 14 olle 441   streg.validateStep2 = function(event)
2933 14 Nov 14 olle 442   {
2933 14 Nov 14 olle 443     var valid = true;
2933 14 Nov 14 olle 444     var frm = document.forms['meludi'];  
2933 14 Nov 14 olle 445
2933 14 Nov 14 olle 446     valid &= nofTubesIsValid;
2933 14 Nov 14 olle 447     valid &= Wizard.isValid('arrivalDate');
2933 14 Nov 14 olle 448     valid &= samplingDateIsValid;
3067 08 Jan 15 olle 449     valid &= viableTumourCellsPercentIsValid;
2933 14 Nov 14 olle 450     
2933 14 Nov 14 olle 451     if (!valid) event.preventDefault();
2933 14 Nov 14 olle 452   }
2933 14 Nov 14 olle 453
2933 14 Nov 14 olle 454   streg.initializeStep3 = function()
2933 14 Nov 14 olle 455   {
2933 14 Nov 14 olle 456     var frm = document.forms['meludi'];
3028 11 Dec 14 olle 457     var tubeContentType = frm.tubeContentType.value;
2933 14 Nov 14 olle 458     var nofTubes = parseInt(frm.nofTubes.value);
3028 11 Dec 14 olle 459     nofTubes = streg.fixNofTubes(tubeContentType, nofTubes);
3028 11 Dec 14 olle 460     frm.nofTubes.value = nofTubes;
4246 21 Nov 16 olle 461     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
3028 11 Dec 14 olle 462     var storageBoxSuffix = streg.fetchStorageBoxSuffix(tubeContentType);
2933 14 Nov 14 olle 463     if (nofTubes > 2) Doc.addClass('step-2', 'auto-hide');
2933 14 Nov 14 olle 464     
2933 14 Nov 14 olle 465     var html = '';
3252 16 Apr 15 olle 466
3252 16 Apr 15 olle 467     // Add buttons for adding standard comments for all specimens/RNA/DNA
3252 16 Apr 15 olle 468     html += '<tr class="section-header">';
3252 16 Apr 15 olle 469     html += '<td colspan="4">Standard comments</td>';
3252 16 Apr 15 olle 470     html += '</tr>';
3252 16 Apr 15 olle 471
3252 16 Apr 15 olle 472     html += '<tr class="align-top">';
3252 16 Apr 15 olle 473     html += '<td class="subprompt"></td>';
3252 16 Apr 15 olle 474     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 475     html += '<td class="status" id="addCarvedOutComment.status"></td>';
3252 16 Apr 15 olle 476     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 477     html += '</tr>';
3252 16 Apr 15 olle 478
3252 16 Apr 15 olle 479     html += '<tr class="align-top">';
3252 16 Apr 15 olle 480     html += '<td class="subprompt"></td>';
3252 16 Apr 15 olle 481     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 482     html += '<td class="status" id="addMnbComment.status"></td>';
3252 16 Apr 15 olle 483     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 484     html += '</tr>';
3252 16 Apr 15 olle 485
2933 14 Nov 14 olle 486     for (var i=0; i < nofTubes; i++)
2933 14 Nov 14 olle 487     {
3028 11 Dec 14 olle 488       var tubeContentTypeName = streg.fetchTubeContentTypeName(tubeContentType, i);
3028 11 Dec 14 olle 489       var tubeContentTypeNameInternal = streg.fetchTubeContentTypeNameInternal(tubeContentType, tubeContentTypeName);
3028 11 Dec 14 olle 490       var tubeName = streg.fetchTubeName(tubeContentType, caseInfo, i);
2933 14 Nov 14 olle 491       var tubeNo = i+caseInfo.specimenFirstIndex;
3028 11 Dec 14 olle 492       var tubeIdentifier = streg.fetchTubeIdentifier(tubeContentType, tubeName, tubeNo);
2933 14 Nov 14 olle 493       html += '<tr class="section-header">';
3028 11 Dec 14 olle 494       html += '<td colspan="4">'+tubeContentTypeName+' Tube '+tubeName+'</td>';
2933 14 Nov 14 olle 495       html += '</tr>';
2933 14 Nov 14 olle 496
3276 29 Apr 15 olle 497 /*
3028 11 Dec 14 olle 498       var boxMsg = 'Box-number where the '+tubeContentTypeNameInternal+' tube is located in.';
3276 29 Apr 15 olle 499 */
3276 29 Apr 15 olle 500       var boxMsg = 'Box-number and position where the '+tubeContentTypeNameInternal+' tube is located.';
3276 29 Apr 15 olle 501       var dnaBoxMsg = 'Box-number and position where the DNA extract will be located.';
3276 29 Apr 15 olle 502       var rnaBoxMsg = 'Box-number and position where the RNA extract will be located.';
2933 14 Nov 14 olle 503       var disabledAttribute = '';
3253 17 Apr 15 olle 504       if (i == 0 && tubeContentType == 'Specimen')
2933 14 Nov 14 olle 505       {
3276 29 Apr 15 olle 506         boxMsg = 'No storage space allocated for first '+tubeContentTypeNameInternal+'; all amount expected to be used.';
2933 14 Nov 14 olle 507         disabledAttribute = ' disabled';
2933 14 Nov 14 olle 508       }  
2933 14 Nov 14 olle 509       html += '<tr>';
3276 29 Apr 15 olle 510       html += '<td class="subprompt">'+tubeContentTypeName+'&nbsp;'+tubeName+'&nbsp;&nbsp;&nbsp;'+'Box</td>';
2933 14 Nov 14 olle 511       html += '<td class="input">';
3276 29 Apr 15 olle 512 /*
2933 14 Nov 14 olle 513       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'></td>';
3276 29 Apr 15 olle 514 */
3276 29 Apr 15 olle 515       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
3276 29 Apr 15 olle 516       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 517       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
3276 29 Apr 15 olle 518       html += '</td>';
2933 14 Nov 14 olle 519       html += '<td class="status" id="box.'+i+'.status"></td>';
3276 29 Apr 15 olle 520       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 521       html += '</tr>';
3276 29 Apr 15 olle 522 /*      
2933 14 Nov 14 olle 523       html += '<tr>';
2933 14 Nov 14 olle 524       html += '<td class="subprompt">Row</td>';
2933 14 Nov 14 olle 525       html += '<td class="input">';
2933 14 Nov 14 olle 526       html += '<input type="text" name="row.'+i+'" id="row.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
2933 14 Nov 14 olle 527       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
2933 14 Nov 14 olle 528       html += '</td>';
2933 14 Nov 14 olle 529       html += '<td class="status" id="position.'+i+'.status"></td>';
2933 14 Nov 14 olle 530       html += '<td class="help"><span id="position.'+i+'.message" class="message"></span></td>';    
2933 14 Nov 14 olle 531       html += '</tr>';
3276 29 Apr 15 olle 532 */
2933 14 Nov 14 olle 533
3028 11 Dec 14 olle 534       if (tubeContentType == 'Specimen')
3028 11 Dec 14 olle 535       {
3276 29 Apr 15 olle 536         disabledAttribute = '';
4246 21 Nov 16 olle 537         if (i == 0 || !extractsFromFirstSpecimenOnly)
4246 21 Nov 16 olle 538         {
4246 21 Nov 16 olle 539           html += '<tr>';
4246 21 Nov 16 olle 540           html += '<td class="subprompt">DNA extract'+'&nbsp;'+tubeName+'.d&nbsp;&nbsp;&nbsp;'+'Box</td>';
4246 21 Nov 16 olle 541           html += '<td class="input">';
4246 21 Nov 16 olle 542           html += '<input type="text" name="dnaBox.'+i+'" id="dnaBox.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4246 21 Nov 16 olle 543           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 544           html += '&nbsp;Column<input type="text" name="dnaColumn.'+i+'" id="dnaColumn.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4246 21 Nov 16 olle 545           html += '</td>';
4246 21 Nov 16 olle 546           html += '<td class="status" id="dnaBox.'+i+'.status"></td>';
4246 21 Nov 16 olle 547           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 548           html += '</tr>';
3276 29 Apr 15 olle 549
4246 21 Nov 16 olle 550           html += '<tr>';
4246 21 Nov 16 olle 551           html += '<td class="subprompt">RNA extract'+'&nbsp;'+tubeName+'.r&nbsp;&nbsp;&nbsp;'+'Box</td>';
4246 21 Nov 16 olle 552           html += '<td class="input">';
4246 21 Nov 16 olle 553           html += '<input type="text" name="rnaBox.'+i+'" id="rnaBox.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4246 21 Nov 16 olle 554           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 555           html += '&nbsp;Column<input type="text" name="rnaColumn.'+i+'" id="rnaColumn.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4246 21 Nov 16 olle 556           html += '</td>';
4246 21 Nov 16 olle 557           html += '<td class="status" id="rnaBox.'+i+'.status"></td>';
4246 21 Nov 16 olle 558           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 559           html += '</tr>';
4246 21 Nov 16 olle 560         }
3276 29 Apr 15 olle 561
3276 29 Apr 15 olle 562         html += '<tr>';
3028 11 Dec 14 olle 563         html += '<td class="subprompt">Number of sections</td>';
3028 11 Dec 14 olle 564         html += '<td class="input">';
3028 11 Dec 14 olle 565         html += '<input type="text" name="nofSections.'+i+'" id="nofSections.'+i+'" style="width: 3em;" maxlength="2" value="1">';
3028 11 Dec 14 olle 566         html += '</td>';
3028 11 Dec 14 olle 567         html += '<td class="status" id="nofSections.'+i+'.status"></td>';
3028 11 Dec 14 olle 568         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 569         html += '</tr>';
3028 11 Dec 14 olle 570       }
3028 11 Dec 14 olle 571
2933 14 Nov 14 olle 572       html += '<tr class="align-top">';
2933 14 Nov 14 olle 573       html += '<td class="subprompt">Operator delivery comment</td>';
2933 14 Nov 14 olle 574       html += '<td class="input"><textarea rows="3" name="comment.'+i+'" id="comment.'+i+'"></textarea></td>';
2933 14 Nov 14 olle 575       html += '<td class="status" id="comment.'+i+'.status"></td>';
3028 11 Dec 14 olle 576       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 577       html += '</tr>';
2933 14 Nov 14 olle 578     }
2933 14 Nov 14 olle 579     Doc.element('specimen-tubes').innerHTML = html;
2933 14 Nov 14 olle 580
3252 16 Apr 15 olle 581     // Add click handlers for buttons for adding standard comments for all specimens/RNA/DNA
3252 16 Apr 15 olle 582     var addCarvedOutCommentGeneralButton = Doc.element('addCarvedOutComment');
3252 16 Apr 15 olle 583     Buttons.addClickHandler(addCarvedOutCommentGeneralButton, streg.addCommentGeneral, {'nofTubes': nofTubes, 'text-field': 'comment.', 'text': 'Utkarvad.'});
3252 16 Apr 15 olle 584     var addMnbCommentGeneralButton = Doc.element('addMnbComment');
3252 16 Apr 15 olle 585     Buttons.addClickHandler(addMnbCommentGeneralButton, streg.addCommentGeneral, {'nofTubes': nofTubes, 'text-field': 'comment.', 'text': 'MNB.'});
3250 15 Apr 15 olle 586
2933 14 Nov 14 olle 587     Wizard.setCurrentStep(3);
2933 14 Nov 14 olle 588     Doc.show('goregister');
2933 14 Nov 14 olle 589     Doc.show('gocancel');
2933 14 Nov 14 olle 590     frm['comment.0'].focus();
2933 14 Nov 14 olle 591     
2933 14 Nov 14 olle 592     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2933 14 Nov 14 olle 593     url += '&cmd=FindStoragePositions';  
2933 14 Nov 14 olle 594     url += '&nofTubes='+frm.nofTubes.value;
3028 11 Dec 14 olle 595     url += '&storageBoxSuffix='+storageBoxSuffix;
4246 21 Nov 16 olle 596     url += '&extractsFromFirstSpecimenOnly='+extractsFromFirstSpecimenOnly;
2933 14 Nov 14 olle 597     
2933 14 Nov 14 olle 598     Wizard.showLoadingAnimation('Looking for empty box positions...');
2933 14 Nov 14 olle 599     Wizard.asyncJsonRequest(url, streg.storagePositionsLoaded);
2933 14 Nov 14 olle 600   }
3250 15 Apr 15 olle 601
3252 16 Apr 15 olle 602   streg.addCommentGeneral = function(event)
3252 16 Apr 15 olle 603   {
3252 16 Apr 15 olle 604     var nofTubes = Data.get(event.currentTarget, 'nofTubes', event.currentTarget.id);
3252 16 Apr 15 olle 605     var textFieldBase = Data.get(event.currentTarget, 'text-field', event.currentTarget.id);
3252 16 Apr 15 olle 606     var text = Data.get(event.currentTarget, 'text', event.currentTarget.id);
3252 16 Apr 15 olle 607     for (var i=0; i < nofTubes; i++)
3252 16 Apr 15 olle 608     {
3252 16 Apr 15 olle 609       var textField = Doc.element(textFieldBase+i);
3252 16 Apr 15 olle 610       if (textField)
3252 16 Apr 15 olle 611       {
3252 16 Apr 15 olle 612         if (text && text != '')
3252 16 Apr 15 olle 613         {
3252 16 Apr 15 olle 614           if (textField.value != '')
3252 16 Apr 15 olle 615           {
3252 16 Apr 15 olle 616             textField.value += ' ';
3252 16 Apr 15 olle 617           }
3252 16 Apr 15 olle 618           textField.value += text;
3252 16 Apr 15 olle 619         }
3252 16 Apr 15 olle 620       }
3252 16 Apr 15 olle 621     }
3670 17 Dec 15 olle 622     streg.setNumberOfSectionsFromComment(event);
3252 16 Apr 15 olle 623   }
3252 16 Apr 15 olle 624   
3250 15 Apr 15 olle 625   streg.addComment = function(event)
3250 15 Apr 15 olle 626   {
3250 15 Apr 15 olle 627     var textField = Doc.element(Data.get(event.currentTarget, 'text-field', event.currentTarget.id));
3250 15 Apr 15 olle 628     var text = Data.get(event.currentTarget, 'text', event.currentTarget.id);
3250 15 Apr 15 olle 629     if (textField)
3250 15 Apr 15 olle 630     {
3250 15 Apr 15 olle 631       if (text && text != '')
3250 15 Apr 15 olle 632       {
3250 15 Apr 15 olle 633         if (textField.value != '')
3250 15 Apr 15 olle 634         {
3250 15 Apr 15 olle 635           textField.value += ' ';
3250 15 Apr 15 olle 636         }
3250 15 Apr 15 olle 637         textField.value += text;
3250 15 Apr 15 olle 638       }
3250 15 Apr 15 olle 639     }
3670 17 Dec 15 olle 640     streg.setNumberOfSectionsFromComment(event);
3250 15 Apr 15 olle 641   }
3670 17 Dec 15 olle 642
3670 17 Dec 15 olle 643   streg.setNumberOfSectionsFromComment = function(event)
3670 17 Dec 15 olle 644   {
3670 17 Dec 15 olle 645     var frm = document.forms['meludi'];
3670 17 Dec 15 olle 646     var nofTubes = Data.get(event.currentTarget, 'nofTubes', event.currentTarget.id);
3670 17 Dec 15 olle 647     var textFieldBase = Data.get(event.currentTarget, 'text-field', event.currentTarget.id);
3670 17 Dec 15 olle 648     for (var i=0; i < nofTubes; i++)
3670 17 Dec 15 olle 649     {
3670 17 Dec 15 olle 650       var numSections = 1;
3670 17 Dec 15 olle 651       var textField = Doc.element(textFieldBase+i);
3670 17 Dec 15 olle 652       if (textField)
3670 17 Dec 15 olle 653       {
3670 17 Dec 15 olle 654         var text = textField.value;
3670 17 Dec 15 olle 655         if (text && text != '')
3670 17 Dec 15 olle 656         {
3670 17 Dec 15 olle 657           // If comment "Utkarvad." and not "MNB." => number of sections set to 0
3670 17 Dec 15 olle 658           if (text.indexOf('Utkarvad.') >= 0 && text.indexOf('MNB.') < 0)
3670 17 Dec 15 olle 659           {
3670 17 Dec 15 olle 660             numSections = 0;
3670 17 Dec 15 olle 661           }
3670 17 Dec 15 olle 662         }
3670 17 Dec 15 olle 663       }
3670 17 Dec 15 olle 664       frm['nofSections.'+i].value = numSections;
3670 17 Dec 15 olle 665     }
3670 17 Dec 15 olle 666   }
2933 14 Nov 14 olle 667   
2933 14 Nov 14 olle 668   streg.storagePositionsLoaded = function(response)
2933 14 Nov 14 olle 669   {
2933 14 Nov 14 olle 670     var freeWells = response.wells;
2933 14 Nov 14 olle 671     var frm = document.forms['meludi'];
3028 11 Dec 14 olle 672     var tubeContentType = frm.tubeContentType.value;
2933 14 Nov 14 olle 673     var nofTubes = parseInt(frm.nofTubes.value);
4246 21 Nov 16 olle 674     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
2933 14 Nov 14 olle 675
2933 14 Nov 14 olle 676     // No storage space is allocated for first specimen,
2933 14 Nov 14 olle 677     // since all amount is expected to be used for analysis.
2933 14 Nov 14 olle 678     // Specimen tube with i == 0 is therefore skipped.
3276 29 Apr 15 olle 679     if (tubeContentType == 'Specimen')
2933 14 Nov 14 olle 680     {
3276 29 Apr 15 olle 681       for (var i = 0; i < nofTubes; i++)
3276 29 Apr 15 olle 682       {
3276 29 Apr 15 olle 683         wellIndex = 3*i;
3276 29 Apr 15 olle 684         var specWell = null;
3276 29 Apr 15 olle 685         if (i > 0)
3276 29 Apr 15 olle 686         {
3276 29 Apr 15 olle 687           specWell = freeWells[wellIndex];
3276 29 Apr 15 olle 688           if (!specWell || specWell == '') 
3276 29 Apr 15 olle 689           {
3276 29 Apr 15 olle 690             Wizard.setInputStatus('box.'+i, 'invalid', 'Missing box');
3276 29 Apr 15 olle 691             return;
3276 29 Apr 15 olle 692           }
3276 29 Apr 15 olle 693         }
4246 21 Nov 16 olle 694         var dnaWell = null;
4246 21 Nov 16 olle 695         if (i == 0 || !extractsFromFirstSpecimenOnly)
3276 29 Apr 15 olle 696         {
4246 21 Nov 16 olle 697           dnaWell = freeWells[wellIndex+1];
4246 21 Nov 16 olle 698           if (!dnaWell || dnaWell == '') 
4246 21 Nov 16 olle 699           {
4246 21 Nov 16 olle 700             Wizard.setInputStatus('dnaBox.'+i, 'invalid', 'Missing box');
4246 21 Nov 16 olle 701             return;
4246 21 Nov 16 olle 702           }
3276 29 Apr 15 olle 703         }
4246 21 Nov 16 olle 704         var rnaWell = null;
4246 21 Nov 16 olle 705         if (i == 0 || !extractsFromFirstSpecimenOnly)
3276 29 Apr 15 olle 706         {
4246 21 Nov 16 olle 707           rnaWell = freeWells[wellIndex+2];
4246 21 Nov 16 olle 708           if (!rnaWell || rnaWell == '') 
4246 21 Nov 16 olle 709           {
4246 21 Nov 16 olle 710             Wizard.setInputStatus('rnaBox.'+i, 'invalid', 'Missing box');
4246 21 Nov 16 olle 711             return;
4246 21 Nov 16 olle 712           }
3276 29 Apr 15 olle 713         }
3276 29 Apr 15 olle 714
3276 29 Apr 15 olle 715         // Update form fields for storage plates
3276 29 Apr 15 olle 716         if (specWell)
3276 29 Apr 15 olle 717         {
3276 29 Apr 15 olle 718           frm['box.'+i].value = specWell.bioPlate.name;
3276 29 Apr 15 olle 719           frm['row.'+i].value = Meludi.wellToAlpha(specWell.row);
3276 29 Apr 15 olle 720           frm['column.'+i].value = specWell.column+1;
3276 29 Apr 15 olle 721         }
3276 29 Apr 15 olle 722       
3276 29 Apr 15 olle 723         if (dnaWell)
3276 29 Apr 15 olle 724         {
3276 29 Apr 15 olle 725           frm['dnaBox.'+i].value = dnaWell.bioPlate.name;
3276 29 Apr 15 olle 726           frm['dnaRow.'+i].value = Meludi.wellToAlpha(dnaWell.row);
3276 29 Apr 15 olle 727           frm['dnaColumn.'+i].value = dnaWell.column+1;
3276 29 Apr 15 olle 728         }
3276 29 Apr 15 olle 729
3276 29 Apr 15 olle 730         if (rnaWell)
3276 29 Apr 15 olle 731         {
3276 29 Apr 15 olle 732           frm['rnaBox.'+i].value = rnaWell.bioPlate.name;
3276 29 Apr 15 olle 733           frm['rnaRow.'+i].value = Meludi.wellToAlpha(rnaWell.row);
3276 29 Apr 15 olle 734           frm['rnaColumn.'+i].value = rnaWell.column+1;
3276 29 Apr 15 olle 735         }
3276 29 Apr 15 olle 736
3276 29 Apr 15 olle 737         // Move focus to next field
3276 29 Apr 15 olle 738         Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
3276 29 Apr 15 olle 739         Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
3276 29 Apr 15 olle 740         Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaBox.'+i });
3276 29 Apr 15 olle 741
3276 29 Apr 15 olle 742         Events.addEventHandler('dnaBox.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaRow.'+i });
3276 29 Apr 15 olle 743         Events.addEventHandler('dnaRow.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaColumn.'+i });
3276 29 Apr 15 olle 744         Events.addEventHandler('dnaColumn.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaBox.'+i });
3276 29 Apr 15 olle 745
3276 29 Apr 15 olle 746         Events.addEventHandler('rnaBox.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaRow.'+i });
3276 29 Apr 15 olle 747         Events.addEventHandler('rnaRow.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaColumn.'+i });
3276 29 Apr 15 olle 748         Events.addEventHandler('rnaColumn.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'nofSections.'+i });
3276 29 Apr 15 olle 749
3276 29 Apr 15 olle 750         Events.addEventHandler('nofSections.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
3276 29 Apr 15 olle 751       
3276 29 Apr 15 olle 752         // Form validation
3276 29 Apr 15 olle 753         Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
3276 29 Apr 15 olle 754         Events.addEventHandler('box.'+i, 'change', streg.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
3276 29 Apr 15 olle 755         Events.addEventHandler('row.'+i, 'change', streg.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
3276 29 Apr 15 olle 756         Events.addEventHandler('column.'+i, 'change', streg.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
3276 29 Apr 15 olle 757         Events.addEventHandler('box.'+i, 'keyup', streg.boxOnKeyUp, { 'boxtype': 'Specimen'});
3276 29 Apr 15 olle 758
3276 29 Apr 15 olle 759         Events.addEventHandler('dnaColumn.'+i, 'keypress', Events.integerOnly);
3276 29 Apr 15 olle 760         Events.addEventHandler('dnaBox.'+i, 'change', streg.wellOnChange, { 'boxtype': 'DNA', 'index': i });
3276 29 Apr 15 olle 761         Events.addEventHandler('dnaRow.'+i, 'change', streg.wellOnChange, { 'boxtype': 'DNA', 'index': i });
3276 29 Apr 15 olle 762         Events.addEventHandler('dnaColumn.'+i, 'change', streg.wellOnChange, { 'boxtype': 'DNA', 'index': i });
3276 29 Apr 15 olle 763         Events.addEventHandler('dnaBox.'+i, 'keyup', streg.boxOnKeyUp, { 'boxtype': 'DNA'});
3276 29 Apr 15 olle 764
3276 29 Apr 15 olle 765         Events.addEventHandler('rnaColumn.'+i, 'keypress', Events.integerOnly);
3276 29 Apr 15 olle 766         Events.addEventHandler('rnaBox.'+i, 'change', streg.wellOnChange, { 'boxtype': 'RNA', 'index': i });
3276 29 Apr 15 olle 767         Events.addEventHandler('rnaRow.'+i, 'change', streg.wellOnChange, { 'boxtype': 'RNA', 'index': i });
3276 29 Apr 15 olle 768         Events.addEventHandler('rnaColumn.'+i, 'change', streg.wellOnChange, { 'boxtype': 'RNA', 'index': i });
3276 29 Apr 15 olle 769         Events.addEventHandler('rnaBox.'+i, 'keyup', streg.boxOnKeyUp, { 'boxtype': 'RNA'});
3276 29 Apr 15 olle 770
3276 29 Apr 15 olle 771         Events.addEventHandler('nofSections.'+i, 'keypress', Events.integerOnly);
3276 29 Apr 15 olle 772         Events.addEventHandler('nofSections.'+i, 'change', streg.nofSectionsOnChange, { 'index': i });
3276 29 Apr 15 olle 773       
3276 29 Apr 15 olle 774         wellIsValid[i] = true;
3276 29 Apr 15 olle 775         dnaWellIsValid[i] = true;
3276 29 Apr 15 olle 776         rnaWellIsValid[i] = true;
3276 29 Apr 15 olle 777 /*
3276 29 Apr 15 olle 778         Wizard.setInputStatus('position.'+i, 'valid');
3276 29 Apr 15 olle 779 */
3276 29 Apr 15 olle 780         Wizard.setInputStatus('box.'+i, 'valid');
4246 21 Nov 16 olle 781         if (i == 0 || !extractsFromFirstSpecimenOnly)
4246 21 Nov 16 olle 782         {
4246 21 Nov 16 olle 783           Wizard.setInputStatus('dnaBox.'+i, 'valid');
4246 21 Nov 16 olle 784           Wizard.setInputStatus('rnaBox.'+i, 'valid');
4246 21 Nov 16 olle 785         }
3276 29 Apr 15 olle 786         if (tubeContentType == 'Specimen')
3276 29 Apr 15 olle 787         {
3276 29 Apr 15 olle 788           Wizard.setInputStatus('nofSections.'+i, 'valid');
3276 29 Apr 15 olle 789         }
3276 29 Apr 15 olle 790       }
3028 11 Dec 14 olle 791     }
3276 29 Apr 15 olle 792     else if (tubeContentType == 'DNA' || tubeContentType == 'RNA' || tubeContentType == 'DNA_RNA')
3028 11 Dec 14 olle 793     {
3276 29 Apr 15 olle 794       for (var i = 0; i < nofTubes; i++)
3028 11 Dec 14 olle 795       {
3276 29 Apr 15 olle 796         var wellIndex = i;
3276 29 Apr 15 olle 797         var well = freeWells[wellIndex];
3276 29 Apr 15 olle 798         if (!well || well == '') 
3276 29 Apr 15 olle 799         {
3276 29 Apr 15 olle 800           Wizard.setInputStatus('box.'+i, 'invalid', 'Missing box');
3276 29 Apr 15 olle 801           return;
3276 29 Apr 15 olle 802         }
3276 29 Apr 15 olle 803         frm['box.'+i].value = well.bioPlate.name;
3276 29 Apr 15 olle 804         frm['row.'+i].value = Meludi.wellToAlpha(well.row);
3276 29 Apr 15 olle 805         frm['column.'+i].value = well.column+1;
2933 14 Nov 14 olle 806       
3276 29 Apr 15 olle 807         // Move focus to next field
3276 29 Apr 15 olle 808         Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
3276 29 Apr 15 olle 809         Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
3276 29 Apr 15 olle 810         Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'nofSections.'+i });
3276 29 Apr 15 olle 811         Events.addEventHandler('nofSections.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
2933 14 Nov 14 olle 812       
3276 29 Apr 15 olle 813         // Form validation
3276 29 Apr 15 olle 814         Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
3276 29 Apr 15 olle 815         Events.addEventHandler('box.'+i, 'change', streg.wellOnChange, { 'index': i });
3276 29 Apr 15 olle 816         Events.addEventHandler('row.'+i, 'change', streg.wellOnChange, { 'index': i });
3276 29 Apr 15 olle 817         Events.addEventHandler('column.'+i, 'change', streg.wellOnChange, { 'index': i });
3276 29 Apr 15 olle 818         Events.addEventHandler('box.'+i, 'keyup', streg.boxOnKeyUp);
3276 29 Apr 15 olle 819         Events.addEventHandler('nofSections.'+i, 'keypress', Events.integerOnly);
3276 29 Apr 15 olle 820         Events.addEventHandler('nofSections.'+i, 'change', streg.nofSectionsOnChange, { 'index': i });
2933 14 Nov 14 olle 821       
3276 29 Apr 15 olle 822         wellIsValid[i] = true;
3276 29 Apr 15 olle 823 /*
3276 29 Apr 15 olle 824         Wizard.setInputStatus('position.'+i, 'valid');
3276 29 Apr 15 olle 825 */
3276 29 Apr 15 olle 826         Wizard.setInputStatus('box.'+i, 'valid');
3276 29 Apr 15 olle 827         if (tubeContentType == 'Specimen')
3276 29 Apr 15 olle 828         {
3276 29 Apr 15 olle 829           Wizard.setInputStatus('nofSections.'+i, 'valid');
3276 29 Apr 15 olle 830         }
3028 11 Dec 14 olle 831       }
2933 14 Nov 14 olle 832     }
2933 14 Nov 14 olle 833   }
3028 11 Dec 14 olle 834
3028 11 Dec 14 olle 835   streg.fixNofTubes = function(tubeContentType, nofTubes)
3028 11 Dec 14 olle 836   {
3028 11 Dec 14 olle 837     if (tubeContentType == 'DNA')
3028 11 Dec 14 olle 838     {
3028 11 Dec 14 olle 839       nofTubes = 1;
3028 11 Dec 14 olle 840     }
3028 11 Dec 14 olle 841     else if (tubeContentType == 'RNA')
3028 11 Dec 14 olle 842     {
3028 11 Dec 14 olle 843       nofTubes = 1;
3028 11 Dec 14 olle 844     }
3028 11 Dec 14 olle 845     else if (tubeContentType == 'DNA_RNA')
3028 11 Dec 14 olle 846     {
3028 11 Dec 14 olle 847       nofTubes = 2;
3028 11 Dec 14 olle 848     }
3028 11 Dec 14 olle 849     return nofTubes;
3028 11 Dec 14 olle 850   }
2933 14 Nov 14 olle 851   
3028 11 Dec 14 olle 852   streg.fetchStorageBoxSuffix = function(tubeContentType)
3028 11 Dec 14 olle 853   {
3028 11 Dec 14 olle 854     var storageBoxSuffix = null;
3028 11 Dec 14 olle 855     if (tubeContentType == 'Specimen')
3028 11 Dec 14 olle 856     {
3028 11 Dec 14 olle 857       storageBoxSuffix = '_sp';
3028 11 Dec 14 olle 858     }
3028 11 Dec 14 olle 859     else if (tubeContentType == 'DNA')
3028 11 Dec 14 olle 860     {
3253 17 Apr 15 olle 861       storageBoxSuffix = '_dna';
3028 11 Dec 14 olle 862     }
3028 11 Dec 14 olle 863     else if (tubeContentType == 'RNA')
3028 11 Dec 14 olle 864     {
3028 11 Dec 14 olle 865       storageBoxSuffix = '_rna';
3028 11 Dec 14 olle 866     }
3028 11 Dec 14 olle 867     else if (tubeContentType == 'DNA_RNA')
3028 11 Dec 14 olle 868     {
3253 17 Apr 15 olle 869       storageBoxSuffix = '_dna_rna';
3028 11 Dec 14 olle 870     }
3028 11 Dec 14 olle 871     return storageBoxSuffix;
3028 11 Dec 14 olle 872   }
3028 11 Dec 14 olle 873   
3028 11 Dec 14 olle 874   streg.fetchTubeContentTypeName = function(tubeContentType, tubeIndex)
3028 11 Dec 14 olle 875   {
3028 11 Dec 14 olle 876     var tubeContentTypeName = tubeContentType;
3028 11 Dec 14 olle 877     if (tubeContentType == 'DNA_RNA')
3028 11 Dec 14 olle 878     {
3028 11 Dec 14 olle 879       if (tubeIndex == 0)
3028 11 Dec 14 olle 880       {
3028 11 Dec 14 olle 881         tubeContentTypeName = 'DNA';
3028 11 Dec 14 olle 882       }
3028 11 Dec 14 olle 883       else if (tubeIndex == 1)
3028 11 Dec 14 olle 884       {
3028 11 Dec 14 olle 885         tubeContentTypeName = 'RNA';
3028 11 Dec 14 olle 886       }
3028 11 Dec 14 olle 887     }
3028 11 Dec 14 olle 888     return tubeContentTypeName;
3028 11 Dec 14 olle 889   }
3028 11 Dec 14 olle 890   
3028 11 Dec 14 olle 891   streg.fetchTubeContentTypeNameInternal = function(tubeContentType, tubeContentTypeName)
3028 11 Dec 14 olle 892   {
3028 11 Dec 14 olle 893     var tubeContentTypeNameInternal = tubeContentTypeName;
3028 11 Dec 14 olle 894     // Convert all names except abbreviations to all lower case
3028 11 Dec 14 olle 895     if (tubeContentType == 'Specimen')
3028 11 Dec 14 olle 896     {
3028 11 Dec 14 olle 897       tubeContentTypeNameInternal = tubeContentTypeName.toLowerCase();
3028 11 Dec 14 olle 898     }
3028 11 Dec 14 olle 899     return tubeContentTypeNameInternal;
3028 11 Dec 14 olle 900   }
3028 11 Dec 14 olle 901   
3028 11 Dec 14 olle 902   streg.fetchTubeName = function(tubeContentType, caseInfo, tubeIndex)
3028 11 Dec 14 olle 903   {
3028 11 Dec 14 olle 904     var tubeName = Strings.encodeTags(caseInfo.originalName);
3028 11 Dec 14 olle 905     if (tubeContentType == 'Specimen')
3028 11 Dec 14 olle 906     {
3028 11 Dec 14 olle 907       var tubeNo = tubeIndex + caseInfo.specimenFirstIndex;
3028 11 Dec 14 olle 908       tubeName = tubeName+'.'+tubeNo;
3028 11 Dec 14 olle 909     }
3028 11 Dec 14 olle 910     else if (tubeContentType == 'DNA')
3028 11 Dec 14 olle 911     {
3028 11 Dec 14 olle 912       tubeName = tubeName+'.d';
3028 11 Dec 14 olle 913     }
3028 11 Dec 14 olle 914     else if (tubeContentType == 'RNA')
3028 11 Dec 14 olle 915     {
3028 11 Dec 14 olle 916       tubeName = tubeName+'.r';
3028 11 Dec 14 olle 917     }
3028 11 Dec 14 olle 918     else if (tubeContentType == 'DNA_RNA')
3028 11 Dec 14 olle 919     {
3028 11 Dec 14 olle 920       if (tubeIndex == 0)
3028 11 Dec 14 olle 921       {
3028 11 Dec 14 olle 922         tubeName = tubeName+'.d';
3028 11 Dec 14 olle 923       }
3028 11 Dec 14 olle 924       else if (tubeIndex == 1)
3028 11 Dec 14 olle 925       {
3028 11 Dec 14 olle 926         tubeName = tubeName+'.r';
3028 11 Dec 14 olle 927       }
3028 11 Dec 14 olle 928     }
3028 11 Dec 14 olle 929     return tubeName;
3028 11 Dec 14 olle 930   }
3028 11 Dec 14 olle 931   
3028 11 Dec 14 olle 932   streg.fetchTubeIdentifier = function(tubeContentType, tubeName, tubeNo)
3028 11 Dec 14 olle 933   {
3028 11 Dec 14 olle 934     var tubeIdentifier = tubeName;
3028 11 Dec 14 olle 935     if (tubeContentType == 'Specimen')
3028 11 Dec 14 olle 936     {
3028 11 Dec 14 olle 937       tubeIdentifier = tubeNo;
3028 11 Dec 14 olle 938     }
3028 11 Dec 14 olle 939     return tubeIdentifier;
3028 11 Dec 14 olle 940   }
3028 11 Dec 14 olle 941   
2933 14 Nov 14 olle 942   streg.boxOnKeyUp = function(event)
2933 14 Nov 14 olle 943   {
2933 14 Nov 14 olle 944     var frm = document.forms['meludi'];
3028 11 Dec 14 olle 945     var tubeContentType = frm.tubeContentType.value;
2933 14 Nov 14 olle 946     
3276 29 Apr 15 olle 947     var boxType = Data.get(event.currentTarget, 'boxtype');
2933 14 Nov 14 olle 948     var index = Data.int(event.currentTarget, 'index');
2933 14 Nov 14 olle 949
3276 29 Apr 15 olle 950     // Get box prefix, default is for input tubes
3276 29 Apr 15 olle 951     var boxPrefix = 'box.';
3276 29 Apr 15 olle 952     if (boxType && boxType == 'DNA')
3276 29 Apr 15 olle 953     {
3276 29 Apr 15 olle 954       boxPrefix = 'dnaBox.';
3276 29 Apr 15 olle 955     }
3276 29 Apr 15 olle 956     if (boxType && boxType == 'RNA')
3276 29 Apr 15 olle 957     {
3276 29 Apr 15 olle 958       boxPrefix = 'rnaBox.';
3276 29 Apr 15 olle 959     }
3276 29 Apr 15 olle 960
3028 11 Dec 14 olle 961     // Check box name
3028 11 Dec 14 olle 962     var boxIsValid = true;
3276 29 Apr 15 olle 963     var box = frm[boxPrefix+index].value;
3276 29 Apr 15 olle 964     Wizard.setInputStatus(boxPrefix+index);
3028 11 Dec 14 olle 965     // Check for prefix "ML_"
3028 11 Dec 14 olle 966     if (box.indexOf('ML_') != 0)
2933 14 Nov 14 olle 967     {
3028 11 Dec 14 olle 968       boxIsValid = false;
2933 14 Nov 14 olle 969     }
3028 11 Dec 14 olle 970     var suffix = '_sp';
3276 29 Apr 15 olle 971     if (tubeContentType == 'DNA' || (boxType && boxType == 'DNA'))
3028 11 Dec 14 olle 972     {
3253 17 Apr 15 olle 973       suffix = '_dna';
3253 17 Apr 15 olle 974     }
3276 29 Apr 15 olle 975     else if (tubeContentType == 'RNA' || (boxType && boxType == 'RNA'))
3253 17 Apr 15 olle 976     {
3028 11 Dec 14 olle 977       suffix = '_rna';
3028 11 Dec 14 olle 978     }
3028 11 Dec 14 olle 979     // Check for suffix
3028 11 Dec 14 olle 980     if (box.indexOf(suffix) != (box.length - suffix.length))
3028 11 Dec 14 olle 981     {
3028 11 Dec 14 olle 982       boxIsValid = false;
3028 11 Dec 14 olle 983     }
3028 11 Dec 14 olle 984     
3028 11 Dec 14 olle 985     if (!boxIsValid)
3028 11 Dec 14 olle 986     {
3276 29 Apr 15 olle 987       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Box name must start with "ML_" and end with "'+suffix+'"');
3028 11 Dec 14 olle 988       return;
3028 11 Dec 14 olle 989     }
2933 14 Nov 14 olle 990   }
2933 14 Nov 14 olle 991   
2933 14 Nov 14 olle 992   streg.wellOnChange = function(event)
2933 14 Nov 14 olle 993   {
2933 14 Nov 14 olle 994     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 995     var target = event.currentTarget;
2933 14 Nov 14 olle 996
3276 29 Apr 15 olle 997     var boxType = Data.get(target, 'boxtype');
2933 14 Nov 14 olle 998     var index = Data.int(target, 'index');
3276 29 Apr 15 olle 999
3276 29 Apr 15 olle 1000     // Get well position prefixes, default is for input tubes
3276 29 Apr 15 olle 1001     var boxPrefix = 'box.';
3276 29 Apr 15 olle 1002     var rowPrefix = 'row.';
3276 29 Apr 15 olle 1003     var columnPrefix = 'column.';
3276 29 Apr 15 olle 1004     if (boxType && boxType == 'DNA')
3276 29 Apr 15 olle 1005     {
3276 29 Apr 15 olle 1006       boxPrefix = 'dnaBox.';
3276 29 Apr 15 olle 1007       rowPrefix = 'dnaRow.';
3276 29 Apr 15 olle 1008       columnPrefix = 'dnaColumn.';
3276 29 Apr 15 olle 1009     }
3276 29 Apr 15 olle 1010     if (boxType && boxType == 'RNA')
3276 29 Apr 15 olle 1011     {
3276 29 Apr 15 olle 1012       boxPrefix = 'rnaBox.';
3276 29 Apr 15 olle 1013       rowPrefix = 'rnaRow.';
3276 29 Apr 15 olle 1014       columnPrefix = 'rnaColumn.';
3276 29 Apr 15 olle 1015     }
3276 29 Apr 15 olle 1016     var box = frm[boxPrefix+index].value;
3276 29 Apr 15 olle 1017     var row = frm[rowPrefix+index].value;
3276 29 Apr 15 olle 1018     var column = frm[columnPrefix+index].value;
2933 14 Nov 14 olle 1019     
3276 29 Apr 15 olle 1020     //wellIsValid[index] = true;
3276 29 Apr 15 olle 1021     if (!boxType || boxType == 'Specimen')
3276 29 Apr 15 olle 1022     {
3276 29 Apr 15 olle 1023       wellIsValid[index] = false;
3276 29 Apr 15 olle 1024     }
3276 29 Apr 15 olle 1025     else if (boxType && boxType == 'DNA')
3276 29 Apr 15 olle 1026     {
3276 29 Apr 15 olle 1027       dnaWellIsValid[index] = false;
3276 29 Apr 15 olle 1028     }
3276 29 Apr 15 olle 1029     else if (boxType && boxType == 'RNA')
3276 29 Apr 15 olle 1030     {
3276 29 Apr 15 olle 1031       rnaWellIsValid[index] = false;
3276 29 Apr 15 olle 1032     }
3276 29 Apr 15 olle 1033     else
3276 29 Apr 15 olle 1034     {
3276 29 Apr 15 olle 1035       wellIsValid[index] = false;
3276 29 Apr 15 olle 1036     }
3276 29 Apr 15 olle 1037     Wizard.setInputStatus(boxPrefix+index);
3276 29 Apr 15 olle 1038 /*
2933 14 Nov 14 olle 1039     Wizard.setInputStatus('position.'+index);
3276 29 Apr 15 olle 1040 */
2933 14 Nov 14 olle 1041     
2933 14 Nov 14 olle 1042     if (box == '') 
2933 14 Nov 14 olle 1043     {
3276 29 Apr 15 olle 1044       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing box');
2933 14 Nov 14 olle 1045       return;
2933 14 Nov 14 olle 1046     }
3276 29 Apr 15 olle 1047
3276 29 Apr 15 olle 1048     // Position errors are reported on box message line    
2933 14 Nov 14 olle 1049     if (row == '')
2933 14 Nov 14 olle 1050     {
3276 29 Apr 15 olle 1051       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing row');
2933 14 Nov 14 olle 1052       return;
2933 14 Nov 14 olle 1053     }
2933 14 Nov 14 olle 1054
2933 14 Nov 14 olle 1055     if (column == '')
2933 14 Nov 14 olle 1056     {
3276 29 Apr 15 olle 1057       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing column');
2933 14 Nov 14 olle 1058       return;
2933 14 Nov 14 olle 1059     }
2933 14 Nov 14 olle 1060     
2933 14 Nov 14 olle 1061     // Check for duplicates
2933 14 Nov 14 olle 1062     var nofTubes = parseInt(frm.nofTubes.value);
2933 14 Nov 14 olle 1063     for (var i=0; i < nofTubes; i++)
2933 14 Nov 14 olle 1064     {    
2933 14 Nov 14 olle 1065       if (i != index)
2933 14 Nov 14 olle 1066       {
3276 29 Apr 15 olle 1067         if (box == frm.elements[boxPrefix+i].value && row == frm[rowPrefix+i].value && column == frm[columnPrefix+i].value)
2933 14 Nov 14 olle 1068         {
3276 29 Apr 15 olle 1069           Wizard.setInputStatus(boxPrefix+index, 'invalid', 'The position is already used once in this wizard');        
2933 14 Nov 14 olle 1070           return;
2933 14 Nov 14 olle 1071         }
2933 14 Nov 14 olle 1072       }
2933 14 Nov 14 olle 1073     }
2933 14 Nov 14 olle 1074
3276 29 Apr 15 olle 1075     //Wizard.setInputStatus('position.'+index, 'checking', 'Checking...');
3276 29 Apr 15 olle 1076     Wizard.setInputStatus(boxPrefix+index, 'checking', 'Checking...');
2933 14 Nov 14 olle 1077     
2933 14 Nov 14 olle 1078     // Seems to be ok -- check if used by another sample
2933 14 Nov 14 olle 1079     var request = Ajax.getXmlHttpRequest();
2933 14 Nov 14 olle 1080     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2933 14 Nov 14 olle 1081     url += '&cmd=ValidateWell';
2933 14 Nov 14 olle 1082     url += '&box=' + encodeURIComponent(box);  
2933 14 Nov 14 olle 1083     url += '&row=' + encodeURIComponent(row);
2933 14 Nov 14 olle 1084     url += '&column=' + encodeURIComponent(column);
2933 14 Nov 14 olle 1085     
3276 29 Apr 15 olle 1086     Wizard.asyncJsonRequest(url, function(response) { streg.onBoxValidated(response, boxType, index) } );
2933 14 Nov 14 olle 1087   }
2933 14 Nov 14 olle 1088   
3276 29 Apr 15 olle 1089   streg.onBoxValidated = function(response, boxType, index)
2933 14 Nov 14 olle 1090   {
3276 29 Apr 15 olle 1091     // Get well position prefixes, default is for input tubes
3276 29 Apr 15 olle 1092     var boxPrefix = 'box.';
3276 29 Apr 15 olle 1093     if (boxType && boxType == 'DNA')
3276 29 Apr 15 olle 1094     {
3276 29 Apr 15 olle 1095       boxPrefix = 'dnaBox.';
3276 29 Apr 15 olle 1096     }
3276 29 Apr 15 olle 1097     if (boxType && boxType == 'RNA')
3276 29 Apr 15 olle 1098     {
3276 29 Apr 15 olle 1099       boxPrefix = 'rnaBox.';
3276 29 Apr 15 olle 1100     }
3276 29 Apr 15 olle 1101
3276 29 Apr 15 olle 1102     //Wizard.setInputStatus('position.'+index);
3276 29 Apr 15 olle 1103     Wizard.setInputStatus(boxPrefix+index);
2933 14 Nov 14 olle 1104     if (response.message)
2933 14 Nov 14 olle 1105     {
3276 29 Apr 15 olle 1106       //Wizard.setInputStatus(response.box ? 'box.'+index : 'position.'+index, 'invalid', Strings.encodeTags(response.message));
3276 29 Apr 15 olle 1107       Wizard.setInputStatus(boxPrefix+index, 'invalid', Strings.encodeTags(response.message));
2933 14 Nov 14 olle 1108       return;
2933 14 Nov 14 olle 1109     }
2933 14 Nov 14 olle 1110     
3276 29 Apr 15 olle 1111     //wellIsValid[index] = true;
3276 29 Apr 15 olle 1112     if (!boxType || boxType == 'Specimen')
3276 29 Apr 15 olle 1113     {
3276 29 Apr 15 olle 1114       wellIsValid[index] = true;
3276 29 Apr 15 olle 1115     }
3276 29 Apr 15 olle 1116     else if (boxType && boxType == 'DNA')
3276 29 Apr 15 olle 1117     {
3276 29 Apr 15 olle 1118       dnaWellIsValid[index] = true;
3276 29 Apr 15 olle 1119     }
3276 29 Apr 15 olle 1120     else if (boxType && boxType == 'RNA')
3276 29 Apr 15 olle 1121     {
3276 29 Apr 15 olle 1122       rnaWellIsValid[index] = true;
3276 29 Apr 15 olle 1123     }
3276 29 Apr 15 olle 1124     else
3276 29 Apr 15 olle 1125     {
3276 29 Apr 15 olle 1126       wellIsValid[index] = true;
3276 29 Apr 15 olle 1127     }
3276 29 Apr 15 olle 1128     Wizard.setInputStatus(boxPrefix+index, 'valid');
3276 29 Apr 15 olle 1129 /*
2933 14 Nov 14 olle 1130     Wizard.setInputStatus('position.'+index, 'valid');
3276 29 Apr 15 olle 1131 */
2933 14 Nov 14 olle 1132   }
2933 14 Nov 14 olle 1133
2933 14 Nov 14 olle 1134   
3028 11 Dec 14 olle 1135   streg.nofSectionsOnChange = function(event)
3028 11 Dec 14 olle 1136   {
3028 11 Dec 14 olle 1137     var frm = document.forms['meludi'];
3028 11 Dec 14 olle 1138     var target = event.currentTarget;
3028 11 Dec 14 olle 1139
3028 11 Dec 14 olle 1140     var index = Data.int(target, 'index');
3028 11 Dec 14 olle 1141     var nofSections = frm['nofSections.'+index].value;
3028 11 Dec 14 olle 1142
3028 11 Dec 14 olle 1143     Wizard.setInputStatus('nofSections.'+index);
3028 11 Dec 14 olle 1144
3028 11 Dec 14 olle 1145     if (nofSections == '')
3028 11 Dec 14 olle 1146     {
3028 11 Dec 14 olle 1147       Wizard.setInputStatus('nofSections'+index, 'invalid', 'Missing');
3028 11 Dec 14 olle 1148       return;
3028 11 Dec 14 olle 1149     }
3028 11 Dec 14 olle 1150     if (parseInt(nofSections) < 1)
3028 11 Dec 14 olle 1151     {
3028 11 Dec 14 olle 1152       Wizard.setInputStatus('nofSections'+index, 'invalid', 'Must be at least 1');
3028 11 Dec 14 olle 1153       return;    
3028 11 Dec 14 olle 1154     }
3028 11 Dec 14 olle 1155     Wizard.setInputStatus('nofSections'+index, 'valid');
3028 11 Dec 14 olle 1156   }
3028 11 Dec 14 olle 1157
2933 14 Nov 14 olle 1158   streg.validateStep3 = function(event)
2933 14 Nov 14 olle 1159   {
2933 14 Nov 14 olle 1160     var valid = false;
2933 14 Nov 14 olle 1161
3276 29 Apr 15 olle 1162     var frm = document.forms['meludi'];
3276 29 Apr 15 olle 1163     var tubeContentType = frm.tubeContentType.value;
3276 29 Apr 15 olle 1164     if (tubeContentType == 'Specimen')
2933 14 Nov 14 olle 1165     {
3276 29 Apr 15 olle 1166       for (var i = 0; i < wellIsValid.length; i++)
2933 14 Nov 14 olle 1167       {
3276 29 Apr 15 olle 1168         // No storage space is allocated for first specimen,
3276 29 Apr 15 olle 1169         // since all amount is expected to be used for analysis.
3276 29 Apr 15 olle 1170         // Specimen tube with i == 0 is therefore skipped.
3276 29 Apr 15 olle 1171         if (i > 0)
3276 29 Apr 15 olle 1172         {
3276 29 Apr 15 olle 1173           if (!wellIsValid[i])
3276 29 Apr 15 olle 1174           {
3276 29 Apr 15 olle 1175             event.preventDefault();
3276 29 Apr 15 olle 1176             return;
3276 29 Apr 15 olle 1177           }
3276 29 Apr 15 olle 1178         }
3276 29 Apr 15 olle 1179         if (!dnaWellIsValid[i])
3276 29 Apr 15 olle 1180         {
3276 29 Apr 15 olle 1181           event.preventDefault();
3276 29 Apr 15 olle 1182           return;
3276 29 Apr 15 olle 1183         }
3276 29 Apr 15 olle 1184         if (!rnaWellIsValid[i])
3276 29 Apr 15 olle 1185         {
3276 29 Apr 15 olle 1186           event.preventDefault();
3276 29 Apr 15 olle 1187           return;
3276 29 Apr 15 olle 1188         }
2933 14 Nov 14 olle 1189       }
2933 14 Nov 14 olle 1190     }
3276 29 Apr 15 olle 1191     else
3276 29 Apr 15 olle 1192     {
3276 29 Apr 15 olle 1193       // Input DNA, RNA, or DNA + RNA
3276 29 Apr 15 olle 1194       for (var i = 0; i < wellIsValid.length; i++)
3276 29 Apr 15 olle 1195       {
3276 29 Apr 15 olle 1196         if (!wellIsValid[i])
3276 29 Apr 15 olle 1197         {
3276 29 Apr 15 olle 1198           event.preventDefault();
3276 29 Apr 15 olle 1199           return;
3276 29 Apr 15 olle 1200         }
3276 29 Apr 15 olle 1201       }
3276 29 Apr 15 olle 1202     }
2933 14 Nov 14 olle 1203   }
2933 14 Nov 14 olle 1204
2933 14 Nov 14 olle 1205   
2933 14 Nov 14 olle 1206   streg.submit = function()
2933 14 Nov 14 olle 1207   {
2933 14 Nov 14 olle 1208     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 1209
4198 31 Oct 16 olle 1210     caseInfo.pad = frm.pad.value;
2933 14 Nov 14 olle 1211     caseInfo.arrivalDate = Strings.trim(frm.arrivalDate.value);
2933 14 Nov 14 olle 1212     caseInfo.samplingDate = Strings.trim(frm.samplingDate.value);
3123 09 Feb 15 olle 1213     caseInfo.mutationAnalysisKras = frm.mutationAnalysisKras.checked;
3123 09 Feb 15 olle 1214     caseInfo.mutationAnalysisNras = frm.mutationAnalysisNras.checked;
2933 14 Nov 14 olle 1215     caseInfo.mutationAnalysisBraf = frm.mutationAnalysisBraf.checked;
2933 14 Nov 14 olle 1216     caseInfo.mutationAnalysisEgfr = frm.mutationAnalysisEgfr.checked;
3123 09 Feb 15 olle 1217     caseInfo.mutationAnalysisAlkEml4 = frm.mutationAnalysisAlkEml4.checked;
3123 09 Feb 15 olle 1218     caseInfo.mutationAnalysisPdgfra = frm.mutationAnalysisPdgfra.checked;
3123 09 Feb 15 olle 1219     caseInfo.mutationAnalysisKit = frm.mutationAnalysisKit.checked;
4730 04 Apr 18 olle 1220     caseInfo.mutationAnalysisTst170 = frm.mutationAnalysisTst170.checked;
3123 09 Feb 15 olle 1221     caseInfo.mutationAnalysisOther = frm.mutationAnalysisOther.checked;
2933 14 Nov 14 olle 1222     caseInfo.site = frm.site.value;
3028 11 Dec 14 olle 1223     caseInfo.tubeContentType = frm.tubeContentType.value;
3028 11 Dec 14 olle 1224     caseInfo.specimenType = frm.specimenType.value;
4195 31 Oct 16 olle 1225     caseInfo.specimenInputType = frm.specimenInputType.value;
2933 14 Nov 14 olle 1226     caseInfo.projectFocus = frm.projectFocus.value;
4732 04 Apr 18 olle 1227     caseInfo.metastasisSite = frm.metastasisSite.value;
3067 08 Jan 15 olle 1228     caseInfo.viableTumourCellsPercent = frm.viableTumourCellsPercent.value;
2933 14 Nov 14 olle 1229     caseInfo.otherPathNote = frm.otherPathNote.value;
4246 21 Nov 16 olle 1230     caseInfo.extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
2933 14 Nov 14 olle 1231     
2933 14 Nov 14 olle 1232     var nofTubes = parseInt(frm.nofTubes.value);
2933 14 Nov 14 olle 1233     caseInfo.specimen = [];
2933 14 Nov 14 olle 1234     for (var i = 0; i < nofTubes; i++)
2933 14 Nov 14 olle 1235     {
2933 14 Nov 14 olle 1236       var specimenTube ={};
3028 11 Dec 14 olle 1237       specimenTube.name = streg.fetchTubeName(caseInfo.tubeContentType, caseInfo, i);
2933 14 Nov 14 olle 1238       specimenTube.box = frm['box.'+i].value;
2933 14 Nov 14 olle 1239       specimenTube.row = frm['row.'+i].value;
2933 14 Nov 14 olle 1240       specimenTube.column = frm['column.'+i].value;
3028 11 Dec 14 olle 1241       var nofSections = null;
3028 11 Dec 14 olle 1242       if (caseInfo.tubeContentType == 'Specimen')
3028 11 Dec 14 olle 1243       {
4246 21 Nov 16 olle 1244         if (i == 0 || !caseInfo.extractsFromFirstSpecimenOnly)
4246 21 Nov 16 olle 1245         {
4246 21 Nov 16 olle 1246           // Storage position for DNA extract from specimen
4246 21 Nov 16 olle 1247           specimenTube.dnaBox = frm['dnaBox.'+i].value;
4246 21 Nov 16 olle 1248           specimenTube.dnaRow = frm['dnaRow.'+i].value;
4246 21 Nov 16 olle 1249           specimenTube.dnaColumn = frm['dnaColumn.'+i].value;
3276 29 Apr 15 olle 1250
4246 21 Nov 16 olle 1251           // Storage position for RNA extract from specimen        
4246 21 Nov 16 olle 1252           specimenTube.rnaBox = frm['rnaBox.'+i].value;
4246 21 Nov 16 olle 1253           specimenTube.rnaRow = frm['rnaRow.'+i].value;
4246 21 Nov 16 olle 1254           specimenTube.rnaColumn = frm['rnaColumn.'+i].value;
4246 21 Nov 16 olle 1255         }
3276 29 Apr 15 olle 1256         
3028 11 Dec 14 olle 1257         nofSections = frm['nofSections.'+i].value;
3028 11 Dec 14 olle 1258       }
3028 11 Dec 14 olle 1259       specimenTube.nofSections = nofSections;
2933 14 Nov 14 olle 1260       specimenTube.comment = frm['comment.'+i].value;
3028 11 Dec 14 olle 1261       specimenTube.specimenType = frm.specimenType.value;
4195 31 Oct 16 olle 1262       specimenTube.specimenInputType = frm.specimenInputType.value;
2933 14 Nov 14 olle 1263       caseInfo.specimen[i] = specimenTube;
2933 14 Nov 14 olle 1264     }
2933 14 Nov 14 olle 1265
2933 14 Nov 14 olle 1266     var submitInfo = {};
2933 14 Nov 14 olle 1267     submitInfo.caseInfo = caseInfo;
2933 14 Nov 14 olle 1268
2933 14 Nov 14 olle 1269     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2933 14 Nov 14 olle 1270     url += '&cmd=CreateSpecimenTubes';
2933 14 Nov 14 olle 1271     Wizard.showLoadingAnimation('Performing registration...');
2933 14 Nov 14 olle 1272     Wizard.asyncJsonRequest(url, streg.submissionResults, 'POST', JSON.stringify(submitInfo));
2933 14 Nov 14 olle 1273   }
2933 14 Nov 14 olle 1274   
2933 14 Nov 14 olle 1275   streg.submissionResults = function(response)
2933 14 Nov 14 olle 1276   {
2933 14 Nov 14 olle 1277     Wizard.showFinalMessage(response.messages);
2933 14 Nov 14 olle 1278     Doc.show('gorestart');
2933 14 Nov 14 olle 1279     Doc.show('gonext-message');
2933 14 Nov 14 olle 1280   }
2933 14 Nov 14 olle 1281
2933 14 Nov 14 olle 1282   streg.countDownToRestart = function()
2933 14 Nov 14 olle 1283   {
2933 14 Nov 14 olle 1284     var time = restartAt - (new Date()).getTime();
2933 14 Nov 14 olle 1285     if (time < 0)
2933 14 Nov 14 olle 1286     {
2933 14 Nov 14 olle 1287       Wizard.restartWizard();
2933 14 Nov 14 olle 1288     }
2933 14 Nov 14 olle 1289     else
2933 14 Nov 14 olle 1290     {
2933 14 Nov 14 olle 1291       Doc.element('gonext-message').innerHTML = '<i>Wizard will restart automatically in ' + Math.ceil(time/1000) + ' seconds...</i>';
2933 14 Nov 14 olle 1292     }
2933 14 Nov 14 olle 1293   }
2933 14 Nov 14 olle 1294   
2933 14 Nov 14 olle 1295   streg.stopAutoRestart = function()
2933 14 Nov 14 olle 1296   {
2933 14 Nov 14 olle 1297     clearTimeout(restartTimer);
2933 14 Nov 14 olle 1298     Doc.hide('gonext-message');
2933 14 Nov 14 olle 1299     Doc.hide('gostop');
2933 14 Nov 14 olle 1300   }
2933 14 Nov 14 olle 1301
2933 14 Nov 14 olle 1302   streg.getCheckboxStatus = function(checkbox)
2933 14 Nov 14 olle 1303   {
2933 14 Nov 14 olle 1304     return checkbox.checked;
2933 14 Nov 14 olle 1305   }
2933 14 Nov 14 olle 1306   
2933 14 Nov 14 olle 1307   return streg;
2933 14 Nov 14 olle 1308 }();
2933 14 Nov 14 olle 1309
2933 14 Nov 14 olle 1310 Doc.onLoad(SpecimenTubeReg.initPage);
2933 14 Nov 14 olle 1311