extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/extraction_registration.js

Code
Comments
Other
Rev Date Author Line
2688 23 Sep 14 nicklas 1 var ExtractionReg = function()
2688 23 Sep 14 nicklas 2 {
2688 23 Sep 14 nicklas 3   var exreg = {};
5607 16 Sep 19 nicklas 4   var debug = 0;
2688 23 Sep 14 nicklas 5   
3468 26 Aug 15 nicklas 6   // QIAcube positions to be used for a given number of samples
3468 26 Aug 15 nicklas 7   // Ordered from 1 to 12 samples
3468 26 Aug 15 nicklas 8   var QIACUBE_POS = [
3468 26 Aug 15 nicklas 9     [1],
3468 26 Aug 15 nicklas 10     [1, 7],
3468 26 Aug 15 nicklas 11     [1, 5, 9],
3468 26 Aug 15 nicklas 12     [1, 2, 7, 8],
3468 26 Aug 15 nicklas 13     [1, 2, 5, 8, 9],
3468 26 Aug 15 nicklas 14     [1, 2, 3, 7, 8, 9],
3468 26 Aug 15 nicklas 15     [1, 2, 3, 6, 7, 9, 10],
3468 26 Aug 15 nicklas 16     [1, 2, 3, 4, 7, 8, 9, 10],
3468 26 Aug 15 nicklas 17     [1, 2, 3, 5, 6, 7, 9, 10, 11],
3468 26 Aug 15 nicklas 18     [1, 2, 3, 4, 5, 7, 8, 9, 10, 11],
3468 26 Aug 15 nicklas 19     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
3468 26 Aug 15 nicklas 20     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
3468 26 Aug 15 nicklas 21   ];
3468 26 Aug 15 nicklas 22   
3468 26 Aug 15 nicklas 23   var selectedLysates;
4094 12 Sep 16 nicklas 24   var allLysatesAreReExtraction;
3468 26 Aug 15 nicklas 25   
3168 05 Mar 15 nicklas 26   var latestRna;
3168 05 Mar 15 nicklas 27   var latestLysate;
3168 05 Mar 15 nicklas 28   
2690 24 Sep 14 nicklas 29   exreg.REAGENTS = [
2690 24 Sep 14 nicklas 30     'rltPlusBuffer', 'betaMercaptoetanol', 'reagentDx', 'qiaShredderColumn',
2690 24 Sep 14 nicklas 31     'allPrepMiniKit', 'etoh70', 'bufferRw1', 'bufferRpe', 'bufferAw1', 
2690 24 Sep 14 nicklas 32     'bufferAw2', 'bufferEb', 'rnaseFreeWater', 'allPrepDnaColumn', 'rneasyColumn' 
2690 24 Sep 14 nicklas 33     ];
2690 24 Sep 14 nicklas 34
2690 24 Sep 14 nicklas 35   
2688 23 Sep 14 nicklas 36   var DEFAULT_LYSATE_VOLUME = 700;
2688 23 Sep 14 nicklas 37   var DEFAULT_LYSATE_USED = 350;
2688 23 Sep 14 nicklas 38   var DEFAULT_DNA_VOLUME = 95;
3545 16 Oct 15 nicklas 39   var DEFAULT_RNA_VOLUME = 53;
2688 23 Sep 14 nicklas 40   var DEFAULT_FT_VOLUME = 550;
5356 12 Apr 19 nicklas 41   var MINIMAL_PRE_NORMALIZE_QUANTITY_RNA = 0; // µg, =0 since we no longer handle NotEnoughQuantity in this wizard
5356 12 Apr 19 nicklas 42   var MINIMAL_PRE_NORMALIZE_QUANTITY_DNA = 0; // µg, =0 since we no longer handle NotEnoughQuantity in this wizard
2688 23 Sep 14 nicklas 43
5591 04 Sep 19 nicklas 44   var ENABLE_DNA_PRENORMALIZE = false; // Changed to TRUE if we find at least one protocol with subtype DNANormalization
5591 04 Sep 19 nicklas 45   var ENABLE_RNA_PRENORMALIZE = false; // Changed to TRUE if we find at least one protocol with subtype RNANormalization
5591 04 Sep 19 nicklas 46   
2688 23 Sep 14 nicklas 47   var lysatesIsValid = false;
2688 23 Sep 14 nicklas 48   var qiacubeDateIsAfterLysisDate = true;
2688 23 Sep 14 nicklas 49   var qiacubeRunNoIsValid = false;
2688 23 Sep 14 nicklas 50   var qiacubePositionsAreValid = false;
2688 23 Sep 14 nicklas 51   var nanoDropFileIsValid = false;
2688 23 Sep 14 nicklas 52   var createdRna = [];
2688 23 Sep 14 nicklas 53   
2688 23 Sep 14 nicklas 54   // Page initialization
2688 23 Sep 14 nicklas 55   exreg.initPage = function()
2688 23 Sep 14 nicklas 56   {
2688 23 Sep 14 nicklas 57     // Step 1
2688 23 Sep 14 nicklas 58     Events.addEventHandler('step-1', 'wizard-validate', exreg.validateStep1);
2688 23 Sep 14 nicklas 59     Events.addEventHandler('lysates', 'change', exreg.lysatesOnChange);
4099 14 Sep 16 nicklas 60     Events.addEventHandler('reextraction', 'change', exreg.lysatesOnChange);
5304 15 Feb 19 nicklas 61     Buttons.addClickHandler('downloadLabelsCsv', exreg.downloadLabels);
5304 15 Feb 19 nicklas 62     Buttons.addClickHandler('downloadLabelsXlsx', exreg.downloadLabels);
2688 23 Sep 14 nicklas 63     
2688 23 Sep 14 nicklas 64     // Step 2
2688 23 Sep 14 nicklas 65     Events.addEventHandler('step-2', 'wizard-initialize', exreg.initializeStep2);
2688 23 Sep 14 nicklas 66     Events.addEventHandler('step-2', 'wizard-validate', exreg.validateStep2);
2688 23 Sep 14 nicklas 67     
2688 23 Sep 14 nicklas 68     Events.addEventHandler('lysisDate', 'change', Wizard.validateDate);
2688 23 Sep 14 nicklas 69     Events.addEventHandler('qiacubeDate', 'change', Wizard.validateDate);
2688 23 Sep 14 nicklas 70     Events.addEventHandler('lysisDate', 'change', exreg.qiacubeDateOnChange);
2688 23 Sep 14 nicklas 71     Events.addEventHandler('qiacubeDate', 'change', exreg.qiacubeDateOnChange);
2688 23 Sep 14 nicklas 72     Events.addEventHandler('qiacubeRunNo', 'change', exreg.qiacubeRunNoOnChange);
2688 23 Sep 14 nicklas 73     
3168 05 Mar 15 nicklas 74     Buttons.addClickHandler('btnUseLatestLysateReagents', exreg.useLatestReagents);
3168 05 Mar 15 nicklas 75     Buttons.addClickHandler('btnUseLatestRnaReagents', exreg.useLatestReagents);
3168 05 Mar 15 nicklas 76     
2688 23 Sep 14 nicklas 77     // Step 3
2688 23 Sep 14 nicklas 78     Events.addEventHandler('step-3', 'wizard-initialize', exreg.initializeStep3);
2688 23 Sep 14 nicklas 79     Events.addEventHandler('step-3', 'wizard-validate', exreg.validateStep3);
2688 23 Sep 14 nicklas 80   
2688 23 Sep 14 nicklas 81     Buttons.addClickHandler('downloadSampleIdFile', exreg.downloadSampleIdFile);
2688 23 Sep 14 nicklas 82     Buttons.addClickHandler('btnFakeNanoFropFile', exreg.generateFakeNanoDropFile);
2688 23 Sep 14 nicklas 83     Events.addEventHandler('nanoDropFile', 'change', exreg.nanoDropFileOnChange);
2688 23 Sep 14 nicklas 84     
2688 23 Sep 14 nicklas 85     // Navigation
2688 23 Sep 14 nicklas 86     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2688 23 Sep 14 nicklas 87     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2688 23 Sep 14 nicklas 88     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2688 23 Sep 14 nicklas 89     Buttons.addClickHandler('goregister', Wizard.goRegister);
2688 23 Sep 14 nicklas 90     Buttons.addClickHandler('rnaQcWizard', exreg.goRnaQc);
2688 23 Sep 14 nicklas 91     
2688 23 Sep 14 nicklas 92     // Final registration
2688 23 Sep 14 nicklas 93     Events.addEventHandler('wizard', 'wizard-submit', exreg.submit);
2688 23 Sep 14 nicklas 94
2688 23 Sep 14 nicklas 95     var url = '../Extraction.servlet?ID='+App.getSessionId();
4094 12 Sep 16 nicklas 96     url += '&cmd=GetUnprocessedLysates&includeReprocess=1';    
2688 23 Sep 14 nicklas 97     Wizard.showLoadingAnimation('Loading Lysate extracts...');
2688 23 Sep 14 nicklas 98     Wizard.asyncJsonRequest(url, exreg.initializeStep1);
2688 23 Sep 14 nicklas 99   }
2688 23 Sep 14 nicklas 100   
2688 23 Sep 14 nicklas 101   exreg.initializeStep1 = function(response)
2688 23 Sep 14 nicklas 102   {
2688 23 Sep 14 nicklas 103     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 104     var lysates = response.lysates;
2688 23 Sep 14 nicklas 105     
2688 23 Sep 14 nicklas 106     var lysateList = frm.lysates;
4099 14 Sep 16 nicklas 107     var reextractList = frm.reextraction;
2688 23 Sep 14 nicklas 108     if (lysates.length > 0)
2688 23 Sep 14 nicklas 109     {
3469 27 Aug 15 nicklas 110       // Check if we have any lysate reserved by the current user
3740 11 Feb 16 nicklas 111       // and count the number of YellowLabel specimen
3469 27 Aug 15 nicklas 112       var currentUser = Data.get(lysateList, 'current-user');
3469 27 Aug 15 nicklas 113       var hasReserved = false;
3740 11 Feb 16 nicklas 114       var numYellow = 0;
2688 23 Sep 14 nicklas 115       for (var i=0; i < lysates.length; i++)
2688 23 Sep 14 nicklas 116       {
3740 11 Feb 16 nicklas 117         var lysate = lysates[i];
3740 11 Feb 16 nicklas 118         if (lysate.ReservedBy == currentUser) hasReserved = true;
3740 11 Feb 16 nicklas 119         if (lysate.specimen.YellowLabel != null) numYellow++;
4094 12 Sep 16 nicklas 120         lysate.isReProcess = lysate.AutoProcessing == 'ReProcess';
3469 27 Aug 15 nicklas 121       }
3469 27 Aug 15 nicklas 122
3469 27 Aug 15 nicklas 123       var numSelected = 0;
3740 11 Feb 16 nicklas 124       var maxNonYellow = 12-numYellow;
3469 27 Aug 15 nicklas 125       for (var i=0; i < lysates.length; i++)
3469 27 Aug 15 nicklas 126       {
2688 23 Sep 14 nicklas 127         var lysate = lysates[i];
3740 11 Feb 16 nicklas 128         var isYellow = lysate.specimen.YellowLabel != null;
2688 23 Sep 14 nicklas 129         var name = (i+1) + ': ' + Strings.encodeTags(lysate.name);
2688 23 Sep 14 nicklas 130         if (lysate.bioWell)
2688 23 Sep 14 nicklas 131         {
2688 23 Sep 14 nicklas 132           name += ' -- ' + Strings.encodeTags(lysate.bioWell.bioPlate.name + ' (' + lysate.bioWell.location+')');
2688 23 Sep 14 nicklas 133         }
3469 27 Aug 15 nicklas 134         if (lysate.ReservedBy)
3469 27 Aug 15 nicklas 135         {
3469 27 Aug 15 nicklas 136           name += ' ['+lysate.ReservedBy+']';
3469 27 Aug 15 nicklas 137         }
3469 27 Aug 15 nicklas 138         
3469 27 Aug 15 nicklas 139         // We only auto-select items reserved by the current user (if it has any)
3469 27 Aug 15 nicklas 140         // and never any items reserved by other users
3469 27 Aug 15 nicklas 141         var selected = false;
3469 27 Aug 15 nicklas 142         if (numSelected < 12)
3469 27 Aug 15 nicklas 143         {
3740 11 Feb 16 nicklas 144           if (hasReserved)
3740 11 Feb 16 nicklas 145           {
3740 11 Feb 16 nicklas 146             selected = lysate.ReservedBy == currentUser;
3740 11 Feb 16 nicklas 147           }
3740 11 Feb 16 nicklas 148           else
3740 11 Feb 16 nicklas 149           {
3740 11 Feb 16 nicklas 150             selected = isYellow || maxNonYellow > 0;
3740 11 Feb 16 nicklas 151           }
3740 11 Feb 16 nicklas 152           if (selected) 
3740 11 Feb 16 nicklas 153           {
3740 11 Feb 16 nicklas 154             numSelected++;
3740 11 Feb 16 nicklas 155             if (!isYellow) maxNonYellow--;
3740 11 Feb 16 nicklas 156           }
3469 27 Aug 15 nicklas 157         }
3469 27 Aug 15 nicklas 158         
2688 23 Sep 14 nicklas 159         var option = new Option(name, lysate.id, selected, selected);
3740 11 Feb 16 nicklas 160         if (isYellow) option.className = 'yellow';
2688 23 Sep 14 nicklas 161         option.lysate = lysate;
4099 14 Sep 16 nicklas 162         if (lysate.isReProcess)
4099 14 Sep 16 nicklas 163         {
4099 14 Sep 16 nicklas 164           reextractList.options[reextractList.length] = option;
4099 14 Sep 16 nicklas 165         }
4099 14 Sep 16 nicklas 166         else
4099 14 Sep 16 nicklas 167         {
4099 14 Sep 16 nicklas 168           lysateList.options[lysateList.length] = option;
4099 14 Sep 16 nicklas 169         }
2688 23 Sep 14 nicklas 170       }
4099 14 Sep 16 nicklas 171       if (lysateList.length == 0) Doc.hide('regularFlowRow');
4099 14 Sep 16 nicklas 172       if (reextractList.length > 0) Doc.show('reExtractionRow');
2688 23 Sep 14 nicklas 173       exreg.lysatesOnChange();
2688 23 Sep 14 nicklas 174     }
2688 23 Sep 14 nicklas 175     else
2688 23 Sep 14 nicklas 176     {
2688 23 Sep 14 nicklas 177       Wizard.setFatalError('No Lysate available for processing.');
2688 23 Sep 14 nicklas 178       return;
2688 23 Sep 14 nicklas 179     }
2688 23 Sep 14 nicklas 180
2688 23 Sep 14 nicklas 181     Doc.show('step-1');
2688 23 Sep 14 nicklas 182     Doc.show('gonext');
2688 23 Sep 14 nicklas 183   }
2688 23 Sep 14 nicklas 184
2688 23 Sep 14 nicklas 185   
2688 23 Sep 14 nicklas 186   exreg.lysatesOnChange = function()
2688 23 Sep 14 nicklas 187   {
2688 23 Sep 14 nicklas 188     lysatesIsValid = false;
2688 23 Sep 14 nicklas 189     Wizard.setInputStatus('lysates');
4099 14 Sep 16 nicklas 190     Wizard.setInputStatus('reextraction');
2688 23 Sep 14 nicklas 191     
2688 23 Sep 14 nicklas 192     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 193     
4099 14 Sep 16 nicklas 194     var numLysates = 0;
4099 14 Sep 16 nicklas 195     var numReextraction = 0;
4099 14 Sep 16 nicklas 196     for (var i = 0; i < frm.lysates.length; i++)
2688 23 Sep 14 nicklas 197     {
4099 14 Sep 16 nicklas 198       if (frm.lysates[i].selected) numLysates++;
2688 23 Sep 14 nicklas 199     }
4099 14 Sep 16 nicklas 200     for (var i = 0; i < frm.reextraction.length; i++)
4099 14 Sep 16 nicklas 201     {
4099 14 Sep 16 nicklas 202       if (frm.reextraction[i].selected) numReextraction++;
4099 14 Sep 16 nicklas 203     }
3468 26 Aug 15 nicklas 204
4907 11 Jul 18 nicklas 205     if (numReextraction > 0)
4907 11 Jul 18 nicklas 206     {
5304 15 Feb 19 nicklas 207       Doc.removeClass('downloadLabelsCsv', 'disabled');
5304 15 Feb 19 nicklas 208       Doc.removeClass('downloadLabelsXlsx', 'disabled');
4907 11 Jul 18 nicklas 209     }
4907 11 Jul 18 nicklas 210     else
4907 11 Jul 18 nicklas 211     {
5304 15 Feb 19 nicklas 212       Doc.addClass('downloadLabelsCsv', 'disabled');
5304 15 Feb 19 nicklas 213       Doc.addClass('downloadLabelsXlsx', 'disabled');
4907 11 Jul 18 nicklas 214     }
4907 11 Jul 18 nicklas 215     
4099 14 Sep 16 nicklas 216     if (numReextraction == 0 && numLysates == 0)
2688 23 Sep 14 nicklas 217     {
4099 14 Sep 16 nicklas 218       Wizard.setInputStatus('lysates', 'invalid', 'At least one lysate must be selected');
4099 14 Sep 16 nicklas 219       Wizard.setInputStatus('reextraction', 'invalid', 'At least one lysate must be selected');
2688 23 Sep 14 nicklas 220       return;
2688 23 Sep 14 nicklas 221     }
4099 14 Sep 16 nicklas 222
4099 14 Sep 16 nicklas 223     if (numReextraction+numLysates > 12)
3468 26 Aug 15 nicklas 224     {
4099 14 Sep 16 nicklas 225       if (numLysates > 0) Wizard.setInputStatus('lysates', 'invalid', 'Must not select more than 12 items.');
4099 14 Sep 16 nicklas 226       if (numReextraction > 0) Wizard.setInputStatus('reextraction', 'invalid', 'Must not select more than 12 items.');
3468 26 Aug 15 nicklas 227       return;
3468 26 Aug 15 nicklas 228     }
2688 23 Sep 14 nicklas 229     
2688 23 Sep 14 nicklas 230     lysatesIsValid = true;
2688 23 Sep 14 nicklas 231     Wizard.setInputStatus('lysates', 'valid');
4099 14 Sep 16 nicklas 232     Wizard.setInputStatus('reextraction', 'valid');
2688 23 Sep 14 nicklas 233   }
2688 23 Sep 14 nicklas 234
5304 15 Feb 19 nicklas 235   exreg.downloadLabels = function(event)
4907 11 Jul 18 nicklas 236   {
4907 11 Jul 18 nicklas 237     var frm = document.forms['reggie'];
5304 15 Feb 19 nicklas 238     var format = Data.get(event.currentTarget, 'format');
4907 11 Jul 18 nicklas 239     var lysates = [];
4907 11 Jul 18 nicklas 240     for (var i = 0; i < frm.reextraction.length; i++)
4907 11 Jul 18 nicklas 241     {
4907 11 Jul 18 nicklas 242       var lysate = frm.reextraction[i].lysate;
4907 11 Jul 18 nicklas 243       if (frm.reextraction[i].selected)
4907 11 Jul 18 nicklas 244       {
4907 11 Jul 18 nicklas 245         lysates[lysates.length] = lysate.id;
4907 11 Jul 18 nicklas 246       }
4907 11 Jul 18 nicklas 247     }
4907 11 Jul 18 nicklas 248     
4907 11 Jul 18 nicklas 249     var frm = document.forms['reggie'];
4907 11 Jul 18 nicklas 250     var url = '../Extraction.servlet?ID='+App.getSessionId();
4907 11 Jul 18 nicklas 251     url += '&cmd=DownloadLabelFile';
4907 11 Jul 18 nicklas 252     url += '&lysates=' + encodeURIComponent(lysates.join(','));
5304 15 Feb 19 nicklas 253     url += '&format='+encodeURIComponent(format);
4907 11 Jul 18 nicklas 254     window.open(url);
4907 11 Jul 18 nicklas 255   }
2688 23 Sep 14 nicklas 256   
2688 23 Sep 14 nicklas 257   exreg.validateStep1 = function(event)
2688 23 Sep 14 nicklas 258   {
2688 23 Sep 14 nicklas 259     if (!lysatesIsValid)
2688 23 Sep 14 nicklas 260     {
2688 23 Sep 14 nicklas 261       event.preventDefault();
2688 23 Sep 14 nicklas 262     }
2688 23 Sep 14 nicklas 263   }
2688 23 Sep 14 nicklas 264   
2688 23 Sep 14 nicklas 265   exreg.initializeStep2 = function()
2688 23 Sep 14 nicklas 266   {
2688 23 Sep 14 nicklas 267     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 268     frm.lysates.disabled = true;
2688 23 Sep 14 nicklas 269     
4094 12 Sep 16 nicklas 270     selectedLysates = [];
4094 12 Sep 16 nicklas 271     allLysatesAreReExtraction = true;
4095 13 Sep 16 nicklas 272     var lysateIds = [];
4094 12 Sep 16 nicklas 273     for (var i = 0; i < frm.lysates.length; i++)
4094 12 Sep 16 nicklas 274     {
4094 12 Sep 16 nicklas 275       if (frm.lysates[i].selected) 
4094 12 Sep 16 nicklas 276       {
4094 12 Sep 16 nicklas 277         var lys = frm.lysates[i].lysate;
4094 12 Sep 16 nicklas 278         selectedLysates[selectedLysates.length] = lys;
4095 13 Sep 16 nicklas 279         lysateIds[lysateIds.length] = lys.id;
4099 14 Sep 16 nicklas 280         allLysatesAreReExtraction = false;
4094 12 Sep 16 nicklas 281       }
4094 12 Sep 16 nicklas 282     }
4099 14 Sep 16 nicklas 283     for (var i = 0; i < frm.reextraction.length; i++)
4099 14 Sep 16 nicklas 284     {
4099 14 Sep 16 nicklas 285       if (frm.reextraction[i].selected) 
4099 14 Sep 16 nicklas 286       {
4099 14 Sep 16 nicklas 287         var lys = frm.reextraction[i].lysate;
4099 14 Sep 16 nicklas 288         selectedLysates[selectedLysates.length] = lys;
4099 14 Sep 16 nicklas 289         lysateIds[lysateIds.length] = lys.id;
4099 14 Sep 16 nicklas 290       }
4099 14 Sep 16 nicklas 291     }
4095 13 Sep 16 nicklas 292     
4095 13 Sep 16 nicklas 293     var url = '../Extraction.servlet?ID='+App.getSessionId();
4095 13 Sep 16 nicklas 294     url += '&cmd=GetChildItemNames';
4095 13 Sep 16 nicklas 295     url += '&lysates='+lysateIds.join(',');
4095 13 Sep 16 nicklas 296     Wizard.showLoadingAnimation('Loading child item names...');
4095 13 Sep 16 nicklas 297     Wizard.asyncJsonRequest(url, exreg.childNamesLoaded);
4095 13 Sep 16 nicklas 298     
4095 13 Sep 16 nicklas 299   }
4095 13 Sep 16 nicklas 300     
4095 13 Sep 16 nicklas 301   exreg.childNamesLoaded = function(response)
4095 13 Sep 16 nicklas 302   {
4095 13 Sep 16 nicklas 303     var frm = document.forms['reggie'];
4095 13 Sep 16 nicklas 304     var childNames = response.childNames;
4095 13 Sep 16 nicklas 305     
4095 13 Sep 16 nicklas 306     // Create child RNA/DNA/FlowThrough items
4095 13 Sep 16 nicklas 307     for (var i = 0; i < selectedLysates.length; i++)
4095 13 Sep 16 nicklas 308     {
4095 13 Sep 16 nicklas 309       var lysate = selectedLysates[i];
4095 13 Sep 16 nicklas 310         
4095 13 Sep 16 nicklas 311       var rna = {};
4095 13 Sep 16 nicklas 312       var dna = {};
4095 13 Sep 16 nicklas 313       var ft = {};
4095 13 Sep 16 nicklas 314       // DNA
4095 13 Sep 16 nicklas 315       dna.name = childNames[i].dna;
4095 13 Sep 16 nicklas 316       dna.volume = DEFAULT_DNA_VOLUME;
4095 13 Sep 16 nicklas 317         
4095 13 Sep 16 nicklas 318       // RNA
4095 13 Sep 16 nicklas 319       rna.name = childNames[i].rna;
4095 13 Sep 16 nicklas 320       rna.volume = DEFAULT_RNA_VOLUME;
4095 13 Sep 16 nicklas 321         
4095 13 Sep 16 nicklas 322       // FlowThrough
4095 13 Sep 16 nicklas 323       ft.name = childNames[i].ft;
4095 13 Sep 16 nicklas 324       ft.volume = DEFAULT_FT_VOLUME;
4095 13 Sep 16 nicklas 325       
4095 13 Sep 16 nicklas 326       lysate.rna = rna;
4095 13 Sep 16 nicklas 327       lysate.dna = dna;
4095 13 Sep 16 nicklas 328       lysate.ft = ft;
4095 13 Sep 16 nicklas 329     }
4095 13 Sep 16 nicklas 330     
2688 23 Sep 14 nicklas 331     Wizard.setCurrentStep(2);
2688 23 Sep 14 nicklas 332     Doc.show('gocancel');
2688 23 Sep 14 nicklas 333     Doc.show('gonext');
2688 23 Sep 14 nicklas 334     
4094 12 Sep 16 nicklas 335     if (!allLysatesAreReExtraction)
4094 12 Sep 16 nicklas 336     {
4094 12 Sep 16 nicklas 337       Reggie.loadProtocols('SAMPLE_HANDLING_PROTOCOL', 'lysisProtocol');
4094 12 Sep 16 nicklas 338     }
2688 23 Sep 14 nicklas 339     Doc.addClass('dnaProtocol', 'list-loading');
2688 23 Sep 14 nicklas 340     frm.dnaProtocol[0] = new Option('loading...', '');
2688 23 Sep 14 nicklas 341     Doc.addClass('rnaProtocol', 'list-loading');
2688 23 Sep 14 nicklas 342     frm.rnaProtocol[0] = new Option('loading...', '');
2688 23 Sep 14 nicklas 343     Doc.addClass('ftProtocol', 'list-loading');
2688 23 Sep 14 nicklas 344     frm.ftProtocol[0] = new Option('loading...', '');
2688 23 Sep 14 nicklas 345     var url = '../Protocol.servlet?ID='+App.getSessionId();
2688 23 Sep 14 nicklas 346     url += '&cmd=GetProtocols&subtype=EXTRACTION_PROTOCOL';
2688 23 Sep 14 nicklas 347     Wizard.asyncJsonRequest(url, exreg.protocolsLoaded);
2688 23 Sep 14 nicklas 348
4094 12 Sep 16 nicklas 349     if (allLysatesAreReExtraction)
4094 12 Sep 16 nicklas 350     {
4094 12 Sep 16 nicklas 351       Doc.element('only-re-extraction').innerHTML = '(Disabled since all selected lysates are for re-extraction)';
4094 12 Sep 16 nicklas 352       frm.lysisDate.value = '';
4094 12 Sep 16 nicklas 353       frm.lysisDate.disabled = true;
4094 12 Sep 16 nicklas 354       frm.lysisProtocol.disabled = true;
4094 12 Sep 16 nicklas 355       frm.rltPlusBuffer.disabled = true;
4094 12 Sep 16 nicklas 356       frm.betaMercaptoetanol.disabled = true;
4094 12 Sep 16 nicklas 357       frm.reagentDx.disabled = true;
4094 12 Sep 16 nicklas 358       frm.qiaShredderColumn.disabled = true;
4094 12 Sep 16 nicklas 359       frm.qiacubeDate.focus();
4094 12 Sep 16 nicklas 360     }
4094 12 Sep 16 nicklas 361     else
4094 12 Sep 16 nicklas 362     {
4094 12 Sep 16 nicklas 363       frm.lysisDate.focus();
4094 12 Sep 16 nicklas 364       Events.sendChangeEvent('lysisDate');
4094 12 Sep 16 nicklas 365     }
2688 23 Sep 14 nicklas 366     Events.sendChangeEvent('qiacubeDate');
3168 05 Mar 15 nicklas 367     
3168 05 Mar 15 nicklas 368     var url = '../Extraction.servlet?ID='+App.getSessionId();
3168 05 Mar 15 nicklas 369     url += '&cmd=GetLatestReagentLotNumbers';    
3168 05 Mar 15 nicklas 370     Wizard.showLoadingAnimation('Loading recent reagent lot numbers...');
3168 05 Mar 15 nicklas 371     Wizard.asyncJsonRequest(url, exreg.reagentsLoaded);
2688 23 Sep 14 nicklas 372   }
2688 23 Sep 14 nicklas 373   
2688 23 Sep 14 nicklas 374   exreg.protocolsLoaded = function(response)
2688 23 Sep 14 nicklas 375   {
2688 23 Sep 14 nicklas 376     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 377     var protocols = response.protocols;
2688 23 Sep 14 nicklas 378
2688 23 Sep 14 nicklas 379     Doc.removeClass('dnaProtocol', 'list-loading');
2688 23 Sep 14 nicklas 380     Doc.removeClass('rnaProtocol', 'list-loading');
2688 23 Sep 14 nicklas 381     Doc.removeClass('ftProtocol', 'list-loading');
2688 23 Sep 14 nicklas 382     frm.dnaProtocol.length = 0;
2688 23 Sep 14 nicklas 383     frm.rnaProtocol.length = 0;
2688 23 Sep 14 nicklas 384     frm.ftProtocol.length = 0;
2688 23 Sep 14 nicklas 385     for (var i = 0; i < protocols.length; i++)
2688 23 Sep 14 nicklas 386     {
2688 23 Sep 14 nicklas 387       var name = protocols[i].name;
2688 23 Sep 14 nicklas 388       var id = protocols[i].id;
2688 23 Sep 14 nicklas 389       frm.dnaProtocol[frm.dnaProtocol.length] = new Option(name, id, false, name == 'AllprepCustomPartA');
2688 23 Sep 14 nicklas 390       frm.rnaProtocol[frm.rnaProtocol.length] = new Option(name, id, false, name == 'AllprepMod1partC');
2688 23 Sep 14 nicklas 391       frm.ftProtocol[frm.ftProtocol.length] = new Option(name, id, false, name == 'AllprepMod1partB');
2688 23 Sep 14 nicklas 392     }
2688 23 Sep 14 nicklas 393     
2688 23 Sep 14 nicklas 394     frm.dnaProtocol[frm.dnaProtocol.length] = new Option('- none -', '');
2688 23 Sep 14 nicklas 395     frm.rnaProtocol[frm.rnaProtocol.length] = new Option('- none -', '');
2688 23 Sep 14 nicklas 396     frm.ftProtocol[frm.ftProtocol.length] = new Option('- none -', '');
2688 23 Sep 14 nicklas 397   }
2688 23 Sep 14 nicklas 398   
3168 05 Mar 15 nicklas 399   exreg.reagentsLoaded = function(response)
3168 05 Mar 15 nicklas 400   {
3168 05 Mar 15 nicklas 401     latestRna = response.rna;
6892 24 Nov 22 nicklas 402     latestLysate = response.lysate || {};
3168 05 Mar 15 nicklas 403     
3168 05 Mar 15 nicklas 404     if (!latestRna) return;
3168 05 Mar 15 nicklas 405     
3168 05 Mar 15 nicklas 406     var haveLatestLysateReagents = false;
3168 05 Mar 15 nicklas 407     var haveLatestRnaReagents = false;
3168 05 Mar 15 nicklas 408     for (var rgNo = 0; rgNo < exreg.REAGENTS.length; rgNo++)
3168 05 Mar 15 nicklas 409     {
3168 05 Mar 15 nicklas 410       var rg = exreg.REAGENTS[rgNo];
3168 05 Mar 15 nicklas 411       if (latestLysate[rg])
3168 05 Mar 15 nicklas 412       {
3168 05 Mar 15 nicklas 413         haveLatestLysateReagents = true;
3168 05 Mar 15 nicklas 414       }
3168 05 Mar 15 nicklas 415       if (latestRna[rg])
3168 05 Mar 15 nicklas 416       {
3168 05 Mar 15 nicklas 417         haveLatestRnaReagents = true;
3168 05 Mar 15 nicklas 418       }
3168 05 Mar 15 nicklas 419     }
3168 05 Mar 15 nicklas 420     
4094 12 Sep 16 nicklas 421     if (!allLysatesAreReExtraction && haveLatestLysateReagents)
3168 05 Mar 15 nicklas 422     {
3168 05 Mar 15 nicklas 423       Doc.show('useLatestLysateReagents');
3168 05 Mar 15 nicklas 424       Doc.element('latestLysisDate').innerHTML = '(Lysis date ' + Reggie.reformatDate(latestLysate.lysisDate) + ')';
3168 05 Mar 15 nicklas 425     }
3168 05 Mar 15 nicklas 426     else
3168 05 Mar 15 nicklas 427     {
3168 05 Mar 15 nicklas 428       latestLysate = null;
3168 05 Mar 15 nicklas 429     }
3168 05 Mar 15 nicklas 430     
3168 05 Mar 15 nicklas 431     if (haveLatestRnaReagents)
3168 05 Mar 15 nicklas 432     {
3168 05 Mar 15 nicklas 433       Doc.show('useLatestRnaReagents');
3168 05 Mar 15 nicklas 434       Doc.element('latestQiacubeDate').innerHTML = '(QiaCube run ' + Reggie.reformatDate(latestRna.QiaCubeDate) + ')';
3168 05 Mar 15 nicklas 435     }
3168 05 Mar 15 nicklas 436     else
3168 05 Mar 15 nicklas 437     {
3168 05 Mar 15 nicklas 438       latestRna = null;
3168 05 Mar 15 nicklas 439     }
3168 05 Mar 15 nicklas 440   }
3168 05 Mar 15 nicklas 441   
3168 05 Mar 15 nicklas 442   exreg.useLatestReagents = function(event)
3168 05 Mar 15 nicklas 443   {
3168 05 Mar 15 nicklas 444     var which = Data.get(event.currentTarget, 'which');
3168 05 Mar 15 nicklas 445     
3168 05 Mar 15 nicklas 446     var latestItem = which == 'rna' ? latestRna : latestLysate;
3168 05 Mar 15 nicklas 447     if (!latestItem) return;
3168 05 Mar 15 nicklas 448     
3168 05 Mar 15 nicklas 449     var frm = document.forms['reggie'];
3168 05 Mar 15 nicklas 450     for (var rgNo = 0; rgNo < exreg.REAGENTS.length; rgNo++)
3168 05 Mar 15 nicklas 451     {
3168 05 Mar 15 nicklas 452       var rg = exreg.REAGENTS[rgNo];
3168 05 Mar 15 nicklas 453       if (latestItem[rg])
3168 05 Mar 15 nicklas 454       {
3168 05 Mar 15 nicklas 455         frm[rg].value = latestItem[rg];
3168 05 Mar 15 nicklas 456       }
3168 05 Mar 15 nicklas 457     }
3168 05 Mar 15 nicklas 458   }
3168 05 Mar 15 nicklas 459   
5785 12 Dec 19 nicklas 460   exreg.qiacubeDateOnChange = function(event)
2688 23 Sep 14 nicklas 461   {
2688 23 Sep 14 nicklas 462     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 463     
2688 23 Sep 14 nicklas 464     var lysisDateIsValid = Wizard.isValid('lysisDate');
2688 23 Sep 14 nicklas 465     var qiacubeDateIsValid = Wizard.isValid('qiacubeDate');
2688 23 Sep 14 nicklas 466     
2688 23 Sep 14 nicklas 467     if (!lysisDateIsValid || !qiacubeDateIsValid) return;
2688 23 Sep 14 nicklas 468
2688 23 Sep 14 nicklas 469     var lysisDate = Dates.parseString(frm.lysisDate.value, 'yyyyMMdd');
2688 23 Sep 14 nicklas 470     var qiacubeDate = Dates.parseString(frm.qiacubeDate.value, 'yyyyMMdd');
2688 23 Sep 14 nicklas 471     if (lysisDate > qiacubeDate)
2688 23 Sep 14 nicklas 472     {
2688 23 Sep 14 nicklas 473       Wizard.setInputStatus('qiacubeDate', 'invalid', 'Qiacube date is before Lysis date');
2688 23 Sep 14 nicklas 474       qiacubeDateIsAfterLysisDate = false;
2688 23 Sep 14 nicklas 475       return;
2688 23 Sep 14 nicklas 476     }
2688 23 Sep 14 nicklas 477
2688 23 Sep 14 nicklas 478     qiacubeDateIsAfterLysisDate = true;
5785 12 Dec 19 nicklas 479     Wizard.setInputStatus('qiacubeDate', 'valid');
2688 23 Sep 14 nicklas 480     
5785 12 Dec 19 nicklas 481     if (event.target.id == 'qiacubeDate')
5785 12 Dec 19 nicklas 482     {
5785 12 Dec 19 nicklas 483       var url = '../Extraction.servlet?ID='+App.getSessionId();
5785 12 Dec 19 nicklas 484       url += '&cmd=GetNextQiacubeRunNo&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
5785 12 Dec 19 nicklas 485       Wizard.showLoadingAnimation('Loading Qiacube run number...');
5785 12 Dec 19 nicklas 486       Wizard.asyncJsonRequest(url, exreg.gotNextRunNumber);
5785 12 Dec 19 nicklas 487     }
2688 23 Sep 14 nicklas 488   }
2688 23 Sep 14 nicklas 489
2688 23 Sep 14 nicklas 490   exreg.gotNextRunNumber = function(response)
2688 23 Sep 14 nicklas 491   {
2688 23 Sep 14 nicklas 492     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 493     frm.qiacubeRunNo.value = response.nextQiacubeRunNo;
2688 23 Sep 14 nicklas 494     Events.sendChangeEvent('qiacubeRunNo');
2688 23 Sep 14 nicklas 495   }
2688 23 Sep 14 nicklas 496
2688 23 Sep 14 nicklas 497   exreg.qiacubeRunNoOnChange = function()
2688 23 Sep 14 nicklas 498   {
2688 23 Sep 14 nicklas 499     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 500     var runNumber = frm.qiacubeRunNo.value;
2688 23 Sep 14 nicklas 501     qiacubeRunNoIsValid = false;
2688 23 Sep 14 nicklas 502
2688 23 Sep 14 nicklas 503     if (runNumber == '')
2688 23 Sep 14 nicklas 504     {
2688 23 Sep 14 nicklas 505       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Missing');
2688 23 Sep 14 nicklas 506       return;
2688 23 Sep 14 nicklas 507     }
2688 23 Sep 14 nicklas 508     if (!(parseInt(runNumber, 10) >= 1))
2688 23 Sep 14 nicklas 509     {
2688 23 Sep 14 nicklas 510       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Must be at least 1');
2688 23 Sep 14 nicklas 511       return;    
2688 23 Sep 14 nicklas 512     }
2688 23 Sep 14 nicklas 513     
2688 23 Sep 14 nicklas 514     Wizard.setInputStatus('qiacubeRunNo', 'valid');
2688 23 Sep 14 nicklas 515     qiacubeRunNoIsValid = true;
2688 23 Sep 14 nicklas 516   }
2688 23 Sep 14 nicklas 517
2688 23 Sep 14 nicklas 518   
2688 23 Sep 14 nicklas 519   exreg.validateStep2 = function(event)
2688 23 Sep 14 nicklas 520   {
2688 23 Sep 14 nicklas 521     var valid = true;
2688 23 Sep 14 nicklas 522     valid &= Wizard.isValid('lysisDate');
2688 23 Sep 14 nicklas 523     valid &= Wizard.isValid('qiacubeDate');
2688 23 Sep 14 nicklas 524     valid &= qiacubeRunNoIsValid;
2688 23 Sep 14 nicklas 525     
2688 23 Sep 14 nicklas 526     if (!valid) event.preventDefault();
2688 23 Sep 14 nicklas 527   }
2688 23 Sep 14 nicklas 528
2688 23 Sep 14 nicklas 529   
2688 23 Sep 14 nicklas 530   exreg.initializeStep3 = function()
2688 23 Sep 14 nicklas 531   {
2900 05 Nov 14 nicklas 532     var html = '<table id="detailsTable" class="step-form">';
2688 23 Sep 14 nicklas 533     // First header row
2688 23 Sep 14 nicklas 534     html += '<thead>';
2688 23 Sep 14 nicklas 535     html += '<tr>';
2688 23 Sep 14 nicklas 536     html += '<th>Specimen</th>';
6725 04 May 22 nicklas 537     html += '<th class="label">Label¹</th>'
3468 26 Aug 15 nicklas 538     html += '<th class="dottedleft">QIAcube</th>';
2688 23 Sep 14 nicklas 539     html += '<th colspan="3" class="dottedleft">Lysate</th>';
5356 12 Apr 19 nicklas 540     html += '<th colspan="5" class="dottedleft">DNA</th>';
2900 05 Nov 14 nicklas 541     html += '<th colspan="5" class="dottedleft">RNA</th>';
2688 23 Sep 14 nicklas 542     html += '<th class="dottedleft">FT</th>';
2688 23 Sep 14 nicklas 543     html += '<th class="dottedleft comment">Comment</th>';
2688 23 Sep 14 nicklas 544     html += '<th></th>';
2688 23 Sep 14 nicklas 545     html += '</tr>';
2688 23 Sep 14 nicklas 546     // Second header row
2688 23 Sep 14 nicklas 547     html += '<tr>';
2688 23 Sep 14 nicklas 548     html += '<th></th>';
6725 04 May 22 nicklas 549     html += '<th class="label"></th>';
2688 23 Sep 14 nicklas 550     html += '<th class="dottedleft">position</th>';
2688 23 Sep 14 nicklas 551     html += '<td class="dottedleft">Storage</td><td>Total</td><td>Used</td>';
5356 12 Apr 19 nicklas 552     html += '<td class="dottedleft">NanoDrop</td><td>Vol.</td><td>Conc.</td><td>Quantity</td><td><span id="toggle-normalize-dna-1" data-prefix="dna" class="link" title="Toggle all">Pre-</span></td>';
5356 12 Apr 19 nicklas 553     html += '<td class="dottedleft">NanoDrop</td><td>Vol.</td><td>Conc.</td><td>Quantity</td><td><span id="toggle-normalize-rna-1" data-prefix="rna" class="link" title="Toggle all">Pre-</span></td>';
2688 23 Sep 14 nicklas 554     html += '<td class="dottedleft">Vol.</td>';
2688 23 Sep 14 nicklas 555     html += '<td class="dottedleft comment"></td>';
2688 23 Sep 14 nicklas 556     html += '<td></td>';
2688 23 Sep 14 nicklas 557     html += '</tr>';
2688 23 Sep 14 nicklas 558     // Third header row
2688 23 Sep 14 nicklas 559     html += '<tr>';
2688 23 Sep 14 nicklas 560     html += '<th></th>';
6725 04 May 22 nicklas 561     html += '<th class="label"></th>';
2688 23 Sep 14 nicklas 562     html += '<th class="dottedleft"></th>';
2688 23 Sep 14 nicklas 563     html += '<td class="dottedleft">box</td><td>(µl)</td><td>(µl)</td>';
5356 12 Apr 19 nicklas 564     html += '<td class="dottedleft">pos</td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td><td><span id="toggle-normalize-dna-2" data-prefix="dna" class="link" title="Toggle all">normalize</span></td>';
5356 12 Apr 19 nicklas 565     html += '<td class="dottedleft">pos</td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td><td><span id="toggle-normalize-rna-2" data-prefix="rna" class="link" title="Toggle all">normalize</span></td>';
2688 23 Sep 14 nicklas 566     html += '<td class="dottedleft">(µl)</td>';
2688 23 Sep 14 nicklas 567     html += '<td class="dottedleft comment"></td>';
2688 23 Sep 14 nicklas 568     html += '<td></td>';
2688 23 Sep 14 nicklas 569     html += '</tr>';
2688 23 Sep 14 nicklas 570     html += '</thead>';
2688 23 Sep 14 nicklas 571     html += '<tbody>';
2688 23 Sep 14 nicklas 572     
3468 26 Aug 15 nicklas 573     // Set default values for DNA/RNA extraction
3468 26 Aug 15 nicklas 574     var QPOS = QIACUBE_POS[selectedLysates.length-1];
6725 04 May 22 nicklas 575     var numWithLabel = 0;
3468 26 Aug 15 nicklas 576     for (var i = 0; i < selectedLysates.length; i++)
3468 26 Aug 15 nicklas 577     {
3468 26 Aug 15 nicklas 578       var lysate = selectedLysates[i];
3740 11 Feb 16 nicklas 579       var specimen = lysate.specimen;
3740 11 Feb 16 nicklas 580       var isYellow = specimen.YellowLabel != null;
3468 26 Aug 15 nicklas 581       var id = lysate.id;
4094 12 Sep 16 nicklas 582       if (!lysate.isReProcess)
4094 12 Sep 16 nicklas 583       {
4094 12 Sep 16 nicklas 584         lysate.originalQuantity = DEFAULT_LYSATE_VOLUME;
4094 12 Sep 16 nicklas 585       }
3468 26 Aug 15 nicklas 586       lysate.processedQuantity = DEFAULT_LYSATE_USED;
3468 26 Aug 15 nicklas 587       lysate.qiacubePosition = QPOS[i];
3468 26 Aug 15 nicklas 588       lysate.originalQiacubePosition = QPOS[i];
6725 04 May 22 nicklas 589       if (lysate.label) numWithLabel++;
6725 04 May 22 nicklas 590       
3740 11 Feb 16 nicklas 591       var img = isYellow ? '<img src="../images/yellow-label.png">' : '';
3740 11 Feb 16 nicklas 592       html += '<tr class="highlight'+(isYellow ? ' yellow-specimen' : '')+'">';
3741 12 Feb 16 nicklas 593       html += '<th class="specimen if-yellow">'+img+Strings.encodeTags(specimen.name) + '</th>';
6725 04 May 22 nicklas 594       html += '<th class="label if-yellow">'+Strings.encodeTags(lysate.label)+'</th>';
3468 26 Aug 15 nicklas 595       html += '<td id="qiacubePosition'+id+'" class="dottedleft"></td>';
3468 26 Aug 15 nicklas 596       html += '<td class="dottedleft">'+Strings.encodeTags(lysate.bioWell.bioPlate.name + '[' + lysate.bioWell.location)+']</td>';
3468 26 Aug 15 nicklas 597       html += '<td id="lysateTotal'+id+'"></td>';
3468 26 Aug 15 nicklas 598       html += '<td id="lysateUsed'+id+'"></td>';
3468 26 Aug 15 nicklas 599       html += '<td id="dnaPos'+id+'" class="dottedleft"></td>';
3468 26 Aug 15 nicklas 600       html += '<td id="dnaVol'+id+'"></td>';
3468 26 Aug 15 nicklas 601       html += '<td id="dnaConc'+id+'" class="bg-filled-50 italic"></td>';
5356 12 Apr 19 nicklas 602       html += '<td id="dnaQuantity'+id+'" class="bg-filled-50 italic"></td>';
5356 12 Apr 19 nicklas 603       html += '<td><input type="checkbox" name="dnaPreNormalize'+id+'" id="dnaPreNormalize'+id+'" disabled>';
3468 26 Aug 15 nicklas 604       html += '<td id="rnaPos'+id+'" class="dottedleft"></td>';
3468 26 Aug 15 nicklas 605       html += '<td id="rnaVol'+id+'"></td>';
3468 26 Aug 15 nicklas 606       html += '<td id="rnaConc'+id+'" class="bg-filled-50 italic"></td>';
3468 26 Aug 15 nicklas 607       html += '<td id="rnaQuantity'+id+'" class="bg-filled-50 italic"></td>';
3468 26 Aug 15 nicklas 608       html += '<td><input type="checkbox" name="rnaPreNormalize'+id+'" id="rnaPreNormalize'+id+'" disabled>';
3468 26 Aug 15 nicklas 609       html += '<span id="rnaPreNormalize'+id+'.status" class="status">&nbsp;</span></td>';
3468 26 Aug 15 nicklas 610       html += '<td id="ftVol'+id+'" class="dottedleft"></td>';
3468 26 Aug 15 nicklas 611       html += '<td id="comments'+id+'" class="dottedleft comment"></td>';
3468 26 Aug 15 nicklas 612       html += '<td><div class="button basicbutton interactable edit-details" style="width: 5em;" data-lysate-id="'+id+'">Edit&hellip;</div></td>';
3468 26 Aug 15 nicklas 613       html += '</tr>';
2688 23 Sep 14 nicklas 614     }
2688 23 Sep 14 nicklas 615     html += '</tbody>';
2688 23 Sep 14 nicklas 616     html += '</table>';
2688 23 Sep 14 nicklas 617     Doc.element('detailsSection').innerHTML = html;
6725 04 May 22 nicklas 618     if (numWithLabel > 0) 
6725 04 May 22 nicklas 619     {
6725 04 May 22 nicklas 620       Doc.removeClass('detailsSection', 'nolabels');
6725 04 May 22 nicklas 621       Doc.show('label-info');
6725 04 May 22 nicklas 622     }
2688 23 Sep 14 nicklas 623     var buttons = Doc.element('detailsSection').getElementsByClassName('edit-details');
2688 23 Sep 14 nicklas 624     for (var i = 0; i < buttons.length; i++)
2688 23 Sep 14 nicklas 625     {
2688 23 Sep 14 nicklas 626       Buttons.addClickHandler(buttons[i], exreg.editDnaRnaDetails);
2688 23 Sep 14 nicklas 627     }
2688 23 Sep 14 nicklas 628     
5356 12 Apr 19 nicklas 629     Events.addEventHandler('toggle-normalize-rna-1', 'click', exreg.toggleNormalize);
5356 12 Apr 19 nicklas 630     Events.addEventHandler('toggle-normalize-rna-2', 'click', exreg.toggleNormalize);
5356 12 Apr 19 nicklas 631     Events.addEventHandler('toggle-normalize-dna-1', 'click', exreg.toggleNormalize);
5356 12 Apr 19 nicklas 632     Events.addEventHandler('toggle-normalize-dna-2', 'click', exreg.toggleNormalize);
2923 12 Nov 14 nicklas 633     
2688 23 Sep 14 nicklas 634     exreg.updateDetailsTable();
2688 23 Sep 14 nicklas 635     
2688 23 Sep 14 nicklas 636     Wizard.setCurrentStep(3);
2688 23 Sep 14 nicklas 637     Doc.show('gocancel');
2688 23 Sep 14 nicklas 638     Doc.show('goregister');
2688 23 Sep 14 nicklas 639     
2688 23 Sep 14 nicklas 640     Wizard.setInputStatus('nanoDropFile', 'invalid', 'No file selected');
2691 24 Sep 14 nicklas 641     Wizard.keepSessionAlive();
2688 23 Sep 14 nicklas 642     
2688 23 Sep 14 nicklas 643     if (debug && location.protocol != 'https:') 
2688 23 Sep 14 nicklas 644     {
2924 13 Nov 14 nicklas 645       Wizard.showDebugTools();
2688 23 Sep 14 nicklas 646     }
5591 04 Sep 19 nicklas 647     
5591 04 Sep 19 nicklas 648     var url = '../Protocol.servlet?ID='+App.getSessionId();
5591 04 Sep 19 nicklas 649     url += '&cmd=CountProtocols&subtype=DNA_NORMALIZATION_PROTOCOL,RNA_NORMALIZATION_PROTOCOL';
5591 04 Sep 19 nicklas 650     Wizard.asyncJsonRequest(url, exreg.protocolsCounted);
2688 23 Sep 14 nicklas 651   }
2688 23 Sep 14 nicklas 652   
5591 04 Sep 19 nicklas 653   // This controls the default "checked" status of the Prenormalize checkboxes
5591 04 Sep 19 nicklas 654   exreg.protocolsCounted = function(response)
5591 04 Sep 19 nicklas 655   {
5591 04 Sep 19 nicklas 656     ENABLE_DNA_PRENORMALIZE = response.DNA_NORMALIZATION_PROTOCOL > 0;
5591 04 Sep 19 nicklas 657     ENABLE_RNA_PRENORMALIZE = response.RNA_NORMALIZATION_PROTOCOL > 0;
5591 04 Sep 19 nicklas 658   }
5591 04 Sep 19 nicklas 659   
5356 12 Apr 19 nicklas 660   exreg.toggleNormalize = function(event)
2923 12 Nov 14 nicklas 661   {
5356 12 Apr 19 nicklas 662     var prefix = Data.get(event.currentTarget, 'prefix'); // prefix is 'dna' or 'rna'
2923 12 Nov 14 nicklas 663     var frm = document.forms['reggie'];
2923 12 Nov 14 nicklas 664     var check = null;
3468 26 Aug 15 nicklas 665     for (var i = 0; i < selectedLysates.length; i++)
2923 12 Nov 14 nicklas 666     {
3468 26 Aug 15 nicklas 667       var id = selectedLysates[i].id;
5356 12 Apr 19 nicklas 668       if (!frm[prefix+'PreNormalize'+id].disabled)
2923 12 Nov 14 nicklas 669       {
5356 12 Apr 19 nicklas 670         if (check == null) check = !frm[prefix+'PreNormalize'+id].checked;
5356 12 Apr 19 nicklas 671         frm[prefix+'PreNormalize'+id].checked = check;
2923 12 Nov 14 nicklas 672       }
2923 12 Nov 14 nicklas 673     }
2923 12 Nov 14 nicklas 674   }
2688 23 Sep 14 nicklas 675   
3468 26 Aug 15 nicklas 676   exreg.calculateNanoDropPositions = function()
3468 26 Aug 15 nicklas 677   {
3468 26 Aug 15 nicklas 678     var tmp = [];
3468 26 Aug 15 nicklas 679     for (var i = 0; i < selectedLysates.length; i++)
3468 26 Aug 15 nicklas 680     {
3468 26 Aug 15 nicklas 681       var o = {};
3468 26 Aug 15 nicklas 682       o.index = i;
3468 26 Aug 15 nicklas 683       o.qiapos = selectedLysates[i].qiacubePosition;
3468 26 Aug 15 nicklas 684       tmp[tmp.length] = o;
3468 26 Aug 15 nicklas 685     }
3468 26 Aug 15 nicklas 686     tmp.sort(exreg.sortByQiaCubePosition);
3468 26 Aug 15 nicklas 687     
3468 26 Aug 15 nicklas 688     var ndCol = 1;
3468 26 Aug 15 nicklas 689     var ndRow = 0;
3468 26 Aug 15 nicklas 690     var rnaOffset = selectedLysates.length > 7 ? 2 : 1;
3468 26 Aug 15 nicklas 691
3468 26 Aug 15 nicklas 692     for (var i = 0; i < tmp.length; i++)
3468 26 Aug 15 nicklas 693     {
3468 26 Aug 15 nicklas 694       var lysate = selectedLysates[tmp[i].index];
3468 26 Aug 15 nicklas 695       lysate.nanoDropOrder = i;
3468 26 Aug 15 nicklas 696       lysate.dna.well = Reggie.wellToAlpha(ndRow) + ndCol;
3468 26 Aug 15 nicklas 697       lysate.rna.well = Reggie.wellToAlpha(ndRow) + (ndCol+rnaOffset);
3468 26 Aug 15 nicklas 698       ndRow++;
3468 26 Aug 15 nicklas 699       if (ndRow == 8)
3468 26 Aug 15 nicklas 700       {
3468 26 Aug 15 nicklas 701         ndRow = 0;
3468 26 Aug 15 nicklas 702         ndCol++;
3468 26 Aug 15 nicklas 703       }
3468 26 Aug 15 nicklas 704     }
3468 26 Aug 15 nicklas 705   }
3468 26 Aug 15 nicklas 706   
3468 26 Aug 15 nicklas 707   exreg.sortByQiaCubePosition = function(a, b)
3468 26 Aug 15 nicklas 708   {
3468 26 Aug 15 nicklas 709     return a.qiapos == b.qiapos ? a.index - b.index : a.qiapos - b.qiapos;
3468 26 Aug 15 nicklas 710   }
3468 26 Aug 15 nicklas 711   
2688 23 Sep 14 nicklas 712   exreg.updateDetailsTable = function()
2688 23 Sep 14 nicklas 713   {
2688 23 Sep 14 nicklas 714     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 715     var hasQiacubePosition = [];
2688 23 Sep 14 nicklas 716     var duplicatePosition = 0;
2688 23 Sep 14 nicklas 717     
3468 26 Aug 15 nicklas 718     exreg.calculateNanoDropPositions();
3468 26 Aug 15 nicklas 719     
3468 26 Aug 15 nicklas 720     for (var i = 0; i < selectedLysates.length; i++)
2688 23 Sep 14 nicklas 721     {
3468 26 Aug 15 nicklas 722       var lysate = selectedLysates[i];
3468 26 Aug 15 nicklas 723       var id = lysate.id;
3468 26 Aug 15 nicklas 724       Doc.element('qiacubePosition'+id).innerHTML = lysate.qiacubePosition;
3468 26 Aug 15 nicklas 725       Doc.addOrRemoveClass('qiacubePosition'+id, 'nondefault', lysate.qiacubePosition != lysate.originalQiacubePosition);
3468 26 Aug 15 nicklas 726       
3468 26 Aug 15 nicklas 727       if (hasQiacubePosition[lysate.qiacubePosition])
2688 23 Sep 14 nicklas 728       {
3468 26 Aug 15 nicklas 729         duplicatePosition = lysate.qiacubePosition;
3468 26 Aug 15 nicklas 730       }
3468 26 Aug 15 nicklas 731       else
3468 26 Aug 15 nicklas 732       {
3468 26 Aug 15 nicklas 733         hasQiacubePosition[lysate.qiacubePosition] = true;
3468 26 Aug 15 nicklas 734       }
2688 23 Sep 14 nicklas 735       
4094 12 Sep 16 nicklas 736       Doc.element('lysateTotal'+id).innerHTML = Numbers.formatNumber(lysate.originalQuantity || lysate.remainingQuantity, 0);
4094 12 Sep 16 nicklas 737       Doc.addOrRemoveClass('lysateTotal'+id, 'nondefault', !lysate.isReProcess && lysate.originalQuantity != DEFAULT_LYSATE_VOLUME);
3468 26 Aug 15 nicklas 738
3468 26 Aug 15 nicklas 739       Doc.element('lysateUsed'+id).innerHTML = lysate.processedQuantity;
3468 26 Aug 15 nicklas 740       Doc.addOrRemoveClass('lysateUsed'+id, 'nondefault', lysate.processedQuantity != DEFAULT_LYSATE_USED);
3468 26 Aug 15 nicklas 741     
3468 26 Aug 15 nicklas 742       Doc.element('dnaPos'+id).innerHTML = lysate.dna.well;
3468 26 Aug 15 nicklas 743       Doc.addOrRemoveClass('dnaPos'+id, 'nondefault', lysate.qiacubePosition != lysate.originalQiacubePosition);
3468 26 Aug 15 nicklas 744       Doc.element('dnaVol'+id).innerHTML = lysate.dna.volume;
3468 26 Aug 15 nicklas 745       Doc.addOrRemoveClass('dnaVol'+id, 'nondefault', lysate.dna.volume != DEFAULT_DNA_VOLUME);
3468 26 Aug 15 nicklas 746       var dnaConc = Doc.element('dnaConc'+id);
3468 26 Aug 15 nicklas 747       dnaConc.innerHTML = Reggie.formatNumber(lysate.dna.ndConc) || '-';
3470 27 Aug 15 nicklas 748       Doc.addOrRemoveClass(dnaConc, 'low-conc', lysate.dna.ndConc < 1);
3468 26 Aug 15 nicklas 749       dnaConc.title = '260/280=' + lysate.dna.nd260by280 + '\n260/230=' + lysate.dna.nd260by230;
3468 26 Aug 15 nicklas 750     
5356 12 Apr 19 nicklas 751       lysate.dna.quantity = Math.max(0, lysate.dna.ndConc * lysate.dna.volume / 1000);
5356 12 Apr 19 nicklas 752       var enoughQuantity = lysate.dna.quantity > MINIMAL_PRE_NORMALIZE_QUANTITY_DNA;
5356 12 Apr 19 nicklas 753       lysate.dna.flag = enoughQuantity ? null : 'NotEnoughRemainingQuantity';
5356 12 Apr 19 nicklas 754       frm['dnaPreNormalize'+id].disabled = !enoughQuantity;
5356 12 Apr 19 nicklas 755       Doc.element('dnaQuantity'+id).innerHTML = Reggie.formatNumber(lysate.dna.quantity || null, null, 2) || '-';
5785 12 Dec 19 nicklas 756       frm['dnaPreNormalize'+id].checked = enoughQuantity && ENABLE_DNA_PRENORMALIZE && !Reggie.isExternal(lysate.name);
5356 12 Apr 19 nicklas 757       var warning = lysate.dna.quantity && !enoughQuantity;
5356 12 Apr 19 nicklas 758       Wizard.setInputStatus('dnaPreNormalize'+id, warning ? 'flag' : '', warning ? 'Not enough quantity' : '');
5356 12 Apr 19 nicklas 759
3468 26 Aug 15 nicklas 760       Doc.element('rnaPos'+id).innerHTML =  lysate.rna.well;
3468 26 Aug 15 nicklas 761       Doc.addOrRemoveClass('rnaPos'+id, 'nondefault', lysate.qiacubePosition != lysate.originalQiacubePosition);
3468 26 Aug 15 nicklas 762       Doc.element('rnaVol'+id).innerHTML = lysate.rna.volume;
3468 26 Aug 15 nicklas 763       Doc.addOrRemoveClass('rnaVol'+id, 'nondefault', lysate.rna.volume != DEFAULT_RNA_VOLUME);
3468 26 Aug 15 nicklas 764       var rnaConc = Doc.element('rnaConc'+id);
3468 26 Aug 15 nicklas 765       rnaConc.innerHTML = Reggie.formatNumber(lysate.rna.ndConc) || '-';
3470 27 Aug 15 nicklas 766       Doc.addOrRemoveClass(rnaConc, 'low-conc', lysate.rna.ndConc < 1);
3468 26 Aug 15 nicklas 767       rnaConc.title = '260/280=' + lysate.rna.nd260by280 + '\n260/230=' + lysate.rna.nd260by230;
2688 23 Sep 14 nicklas 768       
3470 27 Aug 15 nicklas 769       lysate.rna.quantity = Math.max(0, lysate.rna.ndConc * lysate.rna.volume / 1000);
5356 12 Apr 19 nicklas 770       var enoughQuantity = lysate.rna.quantity > MINIMAL_PRE_NORMALIZE_QUANTITY_RNA;
3468 26 Aug 15 nicklas 771       lysate.rna.flag = enoughQuantity ? null : 'NotEnoughRemainingQuantity';
3468 26 Aug 15 nicklas 772       frm['rnaPreNormalize'+id].disabled = !enoughQuantity;
3468 26 Aug 15 nicklas 773       Doc.element('rnaQuantity'+id).innerHTML = Reggie.formatNumber(lysate.rna.quantity || null, null, 2) || '-';
5591 04 Sep 19 nicklas 774       frm['rnaPreNormalize'+id].checked = enoughQuantity && ENABLE_RNA_PRENORMALIZE;
3468 26 Aug 15 nicklas 775       var warning = lysate.rna.quantity && !enoughQuantity;
3468 26 Aug 15 nicklas 776       Wizard.setInputStatus('rnaPreNormalize'+id, warning ? 'flag' : '', warning ? 'Not enough quantity' : '');
2688 23 Sep 14 nicklas 777       
3468 26 Aug 15 nicklas 778       Doc.element('ftVol'+id).innerHTML = lysate.ft.volume;
3468 26 Aug 15 nicklas 779       Doc.addOrRemoveClass('ftVol'+id, 'nondefault', lysate.ft.volume != DEFAULT_FT_VOLUME);
3468 26 Aug 15 nicklas 780     
3468 26 Aug 15 nicklas 781       var cmnt = Doc.element('comments'+id);
3468 26 Aug 15 nicklas 782       var tooltip = [];
3468 26 Aug 15 nicklas 783       var comment = [];
3468 26 Aug 15 nicklas 784       if (lysate.comment || lysate.dna.comment || lysate.rna.comment || lysate.ft.comment)
3468 26 Aug 15 nicklas 785       {
3468 26 Aug 15 nicklas 786         comment[0] = 'Yes';
3468 26 Aug 15 nicklas 787         if (lysate.comment) tooltip[tooltip.length] = 'Lysate: ' + lysate.comment;
3468 26 Aug 15 nicklas 788         if (lysate.dna.comment) tooltip[tooltip.length] = 'DNA: ' + lysate.dna.comment;
3468 26 Aug 15 nicklas 789         if (lysate.rna.comment) tooltip[tooltip.length] = 'RNA: ' + lysate.rna.comment;
3468 26 Aug 15 nicklas 790         if (lysate.ft.comment) tooltip[tooltip.length] = 'FlowThrough: ' + lysate.ft.comment;
3468 26 Aug 15 nicklas 791       }
2688 23 Sep 14 nicklas 792       
3468 26 Aug 15 nicklas 793       var modifiedReagents = false;
3468 26 Aug 15 nicklas 794       for (var rgNo = 0; rgNo < exreg.REAGENTS.length; rgNo++)
3468 26 Aug 15 nicklas 795       {
3468 26 Aug 15 nicklas 796         var rg = exreg.REAGENTS[rgNo];
3468 26 Aug 15 nicklas 797         if (lysate[rg]) 
2688 23 Sep 14 nicklas 798         {
3468 26 Aug 15 nicklas 799           tooltip[tooltip.length] = Doc.element(rg+'.title').innerHTML + ': ' + Strings.encodeTags(lysate[rg]);
3468 26 Aug 15 nicklas 800           modifiedReagents = true;
2690 24 Sep 14 nicklas 801         }
2688 23 Sep 14 nicklas 802       }
3468 26 Aug 15 nicklas 803       if (modifiedReagents)
3468 26 Aug 15 nicklas 804       {
3468 26 Aug 15 nicklas 805         comment[comment.length] = 'Reagents';
3468 26 Aug 15 nicklas 806       }
3468 26 Aug 15 nicklas 807       
3468 26 Aug 15 nicklas 808       if (tooltip.length > 0)
3468 26 Aug 15 nicklas 809       {
3468 26 Aug 15 nicklas 810         cmnt.innerHTML = comment.join(', ');
3468 26 Aug 15 nicklas 811         Doc.addClass(cmnt, 'nondefault');
3468 26 Aug 15 nicklas 812         cmnt.title = tooltip.join('\n');
3468 26 Aug 15 nicklas 813       }
3468 26 Aug 15 nicklas 814       else
3468 26 Aug 15 nicklas 815       {
3468 26 Aug 15 nicklas 816         cmnt.innerHTML = '';
3468 26 Aug 15 nicklas 817         Doc.removeClass(cmnt, 'nondefault');
3468 26 Aug 15 nicklas 818         cmnt.title = null;
3468 26 Aug 15 nicklas 819       }
2688 23 Sep 14 nicklas 820     }
2688 23 Sep 14 nicklas 821     
2688 23 Sep 14 nicklas 822     if (duplicatePosition)
2688 23 Sep 14 nicklas 823     {
2688 23 Sep 14 nicklas 824       Wizard.setInputStatus('downloadSampleIdFile', 'invalid', 'Duplicate Qiacube position: ' + duplicatePosition);
2688 23 Sep 14 nicklas 825       qiacubePositionsAreValid = false;
2688 23 Sep 14 nicklas 826     }
2688 23 Sep 14 nicklas 827     else
2688 23 Sep 14 nicklas 828     {
2688 23 Sep 14 nicklas 829       Wizard.setInputStatus('downloadSampleIdFile');
2688 23 Sep 14 nicklas 830       qiacubePositionsAreValid = true;
2688 23 Sep 14 nicklas 831     }
2688 23 Sep 14 nicklas 832   }
2688 23 Sep 14 nicklas 833
2688 23 Sep 14 nicklas 834   exreg.editDnaRnaDetails = function(event)
2688 23 Sep 14 nicklas 835   {
3468 26 Aug 15 nicklas 836     var lysateId = Data.int(event.currentTarget, 'lysate-id');
3468 26 Aug 15 nicklas 837     var index = -1;
3468 26 Aug 15 nicklas 838     for (var i = 0; i < selectedLysates.length; i++)
3468 26 Aug 15 nicklas 839     {
3468 26 Aug 15 nicklas 840       if (selectedLysates[i].id == lysateId)
3468 26 Aug 15 nicklas 841       {
3468 26 Aug 15 nicklas 842         index = i;
3468 26 Aug 15 nicklas 843         break;
3468 26 Aug 15 nicklas 844       }
3468 26 Aug 15 nicklas 845     }
3468 26 Aug 15 nicklas 846     
2688 23 Sep 14 nicklas 847     var url = 'edit_dnarna_details.jsp?ID='+App.getSessionId();
2688 23 Sep 14 nicklas 848     url += '&index='+index;
3468 26 Aug 15 nicklas 849     url += '&lysate=' + encodeURIComponent(selectedLysates[index].name);
2690 24 Sep 14 nicklas 850     Dialogs.openPopup(url, 'EditDnaRnaDetails'+index, 750, 500);  
2688 23 Sep 14 nicklas 851   }
2688 23 Sep 14 nicklas 852   
3468 26 Aug 15 nicklas 853   exreg.getSelectedLysate = function(index)
3468 26 Aug 15 nicklas 854   {
3468 26 Aug 15 nicklas 855     return selectedLysates[index];
3468 26 Aug 15 nicklas 856   }
3468 26 Aug 15 nicklas 857   
2688 23 Sep 14 nicklas 858   exreg.downloadSampleIdFile = function()
2688 23 Sep 14 nicklas 859   {
2688 23 Sep 14 nicklas 860     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 861
2688 23 Sep 14 nicklas 862     if (!qiacubePositionsAreValid)
2688 23 Sep 14 nicklas 863     {
3468 26 Aug 15 nicklas 864       Forms.showNotification('downloadSampleIdFile', 'QIAcube positions are not valid. Please fix before downloading the file.');
2688 23 Sep 14 nicklas 865       return;
2688 23 Sep 14 nicklas 866     }
2688 23 Sep 14 nicklas 867     
4095 13 Sep 16 nicklas 868     var rnaNames = [];
4095 13 Sep 16 nicklas 869     var dnaNames = [];
2688 23 Sep 14 nicklas 870     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 871     var url = '../Extraction.servlet?ID='+App.getSessionId();
2688 23 Sep 14 nicklas 872     url += '&cmd=DownloadNanoDropSampleIdFile';
2688 23 Sep 14 nicklas 873     url += '&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
2688 23 Sep 14 nicklas 874     url += '&qiacubeRunNo='+encodeURIComponent(frm.qiacubeRunNo.value);
2688 23 Sep 14 nicklas 875     
3468 26 Aug 15 nicklas 876     var selected = [];
3468 26 Aug 15 nicklas 877     for (var i = 0; i < selectedLysates.length; i++)
2688 23 Sep 14 nicklas 878     {
3468 26 Aug 15 nicklas 879       var lysate = selectedLysates[i];
4095 13 Sep 16 nicklas 880       dnaNames[lysate.nanoDropOrder] = lysate.dna.name;
4095 13 Sep 16 nicklas 881       rnaNames[lysate.nanoDropOrder] = lysate.rna.name;
2688 23 Sep 14 nicklas 882     }
4095 13 Sep 16 nicklas 883     url += '&rnaNames=' + encodeURIComponent(rnaNames.join(','));
4095 13 Sep 16 nicklas 884     url += '&dnaNames=' + encodeURIComponent(dnaNames.join(','));
2688 23 Sep 14 nicklas 885     window.open(url);
2688 23 Sep 14 nicklas 886   }
2688 23 Sep 14 nicklas 887
2688 23 Sep 14 nicklas 888   exreg.nanoDropFileOnChange = function()
2688 23 Sep 14 nicklas 889   {
2688 23 Sep 14 nicklas 890     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 891     var file = frm.nanoDropFile.files[0];
2688 23 Sep 14 nicklas 892     
2688 23 Sep 14 nicklas 893     var reader = new FileReader();
2688 23 Sep 14 nicklas 894     reader.onload = exreg.nanoDropFileLoaded;
2688 23 Sep 14 nicklas 895     reader.readAsText(file);
2688 23 Sep 14 nicklas 896   }
2688 23 Sep 14 nicklas 897
2688 23 Sep 14 nicklas 898   exreg.nanoDropFileLoaded = function(event)
2688 23 Sep 14 nicklas 899   {
2688 23 Sep 14 nicklas 900     exreg.parseNanoDropFile(event.target.result);
2688 23 Sep 14 nicklas 901   }
2688 23 Sep 14 nicklas 902
2688 23 Sep 14 nicklas 903
2688 23 Sep 14 nicklas 904   exreg.parseNanoDropFile = function(data)
2688 23 Sep 14 nicklas 905   {
2688 23 Sep 14 nicklas 906     nanoDropFileIsValid = false;
2688 23 Sep 14 nicklas 907
2688 23 Sep 14 nicklas 908     try
2688 23 Sep 14 nicklas 909     {
2688 23 Sep 14 nicklas 910       // Reset the existing values
3468 26 Aug 15 nicklas 911       for (var i = 0; i < selectedLysates.length; i++)
2688 23 Sep 14 nicklas 912       {
3468 26 Aug 15 nicklas 913         var lysate = selectedLysates[i];
3468 26 Aug 15 nicklas 914         lysate.dna.ndConc = null;
3468 26 Aug 15 nicklas 915         lysate.dna.nd260by280 = null;
3468 26 Aug 15 nicklas 916         lysate.dna.nd260by230 = null;
3468 26 Aug 15 nicklas 917         lysate.rna.ndConc = null;
3468 26 Aug 15 nicklas 918         lysate.rna.nd260by280 = null;
3468 26 Aug 15 nicklas 919         lysate.rna.nd260by230 = null;
2688 23 Sep 14 nicklas 920       }
2688 23 Sep 14 nicklas 921       
2688 23 Sep 14 nicklas 922       var lines = data.split(/[\n\r]+/);
2688 23 Sep 14 nicklas 923       var columns = lines[0].split(/ *\t */);
2688 23 Sep 14 nicklas 924       
2688 23 Sep 14 nicklas 925       var sampleIndex = exreg.findColumn(columns, 'Sample ID');
2688 23 Sep 14 nicklas 926       if (sampleIndex == -1) return;
2688 23 Sep 14 nicklas 927       
2688 23 Sep 14 nicklas 928       var wellIndex = exreg.findColumn(columns, 'Well');
2688 23 Sep 14 nicklas 929       if (wellIndex == -1) return;
2688 23 Sep 14 nicklas 930       
2688 23 Sep 14 nicklas 931       var ndConcIndex = exreg.findColumn(columns, 'Conc.');
2688 23 Sep 14 nicklas 932       if (ndConcIndex == -1) return;
2688 23 Sep 14 nicklas 933       
2688 23 Sep 14 nicklas 934       var nd260by280Index = exreg.findColumn(columns, '260/280');
2688 23 Sep 14 nicklas 935       if (nd260by280Index == -1) return;
2688 23 Sep 14 nicklas 936       
2688 23 Sep 14 nicklas 937       var nd260by230Index = exreg.findColumn(columns, '260/230');
2688 23 Sep 14 nicklas 938       if (nd260by230Index == -1) return;
2688 23 Sep 14 nicklas 939     
2688 23 Sep 14 nicklas 940       var numImported = 0;    
2688 23 Sep 14 nicklas 941       for (var i = 1; i < lines.length; i++)
2688 23 Sep 14 nicklas 942       {
2688 23 Sep 14 nicklas 943         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
2688 23 Sep 14 nicklas 944         
2688 23 Sep 14 nicklas 945         var row = lines[i].split(/ *\t */);
2688 23 Sep 14 nicklas 946         if (row.length != columns.length) 
2688 23 Sep 14 nicklas 947         {
2688 23 Sep 14 nicklas 948           Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; Unexpected number of columns: ' + row.length);
2688 23 Sep 14 nicklas 949           return;
2688 23 Sep 14 nicklas 950         }
2688 23 Sep 14 nicklas 951         
2688 23 Sep 14 nicklas 952         var sampleId = row[sampleIndex];
2688 23 Sep 14 nicklas 953         if (!sampleId || sampleId == 'blank') continue; // with the next line
2688 23 Sep 14 nicklas 954     
2688 23 Sep 14 nicklas 955         var rnaOrDna = exreg.findRnaOrDna(sampleId, i+1);
2688 23 Sep 14 nicklas 956         if (!rnaOrDna) return;  // This is an error condition
2688 23 Sep 14 nicklas 957         
2688 23 Sep 14 nicklas 958         if (rnaOrDna.well != row[wellIndex])
2688 23 Sep 14 nicklas 959         {
2688 23 Sep 14 nicklas 960           Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; Expected to find "' + sampleId + '" in well [' + rnaOrDna.well + '] not ['  + row[wellIndex] + ']');
2688 23 Sep 14 nicklas 961           return;
2688 23 Sep 14 nicklas 962         }
2688 23 Sep 14 nicklas 963         
2688 23 Sep 14 nicklas 964         var ndConc = exreg.getNumber(row[ndConcIndex]);
2688 23 Sep 14 nicklas 965         if (isNaN(ndConc))
2688 23 Sep 14 nicklas 966         {
2688 23 Sep 14 nicklas 967           Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; No valid NDConc value for "' + sampleId + '": ' + row[ndConcIndex]);
2688 23 Sep 14 nicklas 968           return;
2688 23 Sep 14 nicklas 969         }
2688 23 Sep 14 nicklas 970         
2688 23 Sep 14 nicklas 971         // If there are multiple entries for the same item, keep the largest NDConc
2688 23 Sep 14 nicklas 972         var isFirstValue = rnaOrDna.ndConc == null;
2688 23 Sep 14 nicklas 973         if (isFirstValue || ndConc > rnaOrDna.ndConc)
2688 23 Sep 14 nicklas 974         {
2688 23 Sep 14 nicklas 975           var nd260by280 = exreg.getNumber(row[nd260by280Index]);
2688 23 Sep 14 nicklas 976           if (isNaN(nd260by280))
2688 23 Sep 14 nicklas 977           {
2688 23 Sep 14 nicklas 978             Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; No valid 260/280 value for "' + sampleId + '": ' + row[nd260by280Index]);
2688 23 Sep 14 nicklas 979             return;
2688 23 Sep 14 nicklas 980           }
2688 23 Sep 14 nicklas 981           
2688 23 Sep 14 nicklas 982           var nd260by230 = exreg.getNumber(row[nd260by230Index]);
2688 23 Sep 14 nicklas 983           if (isNaN(nd260by230))
2688 23 Sep 14 nicklas 984           {
2688 23 Sep 14 nicklas 985             Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; No valid 260/230 value for "' + sampleId + '": '+row[nd260by230Index]);
2688 23 Sep 14 nicklas 986             return;
2688 23 Sep 14 nicklas 987           }
2688 23 Sep 14 nicklas 988           
2688 23 Sep 14 nicklas 989           // Store values
2688 23 Sep 14 nicklas 990           rnaOrDna.ndConc = ndConc;
2688 23 Sep 14 nicklas 991           rnaOrDna.nd260by280 = nd260by280;
2688 23 Sep 14 nicklas 992           rnaOrDna.nd260by230 = nd260by230;
2688 23 Sep 14 nicklas 993
2688 23 Sep 14 nicklas 994           // Only update counter for the first value (not when replacing a lower value)
2688 23 Sep 14 nicklas 995           if (isFirstValue)
2688 23 Sep 14 nicklas 996           {
2688 23 Sep 14 nicklas 997             numImported++;
2688 23 Sep 14 nicklas 998           }
2688 23 Sep 14 nicklas 999         }
2688 23 Sep 14 nicklas 1000         
2688 23 Sep 14 nicklas 1001       }
2688 23 Sep 14 nicklas 1002     
3468 26 Aug 15 nicklas 1003       if (numImported != selectedLysates.length*2)
2688 23 Sep 14 nicklas 1004       {
3468 26 Aug 15 nicklas 1005         Wizard.setInputStatus('nanoDropFile', 'invalid', 'Could not find values for all '+(selectedLysates.length*2)+' DNA/RNA samples: ' + numImported);
2688 23 Sep 14 nicklas 1006         return;
2688 23 Sep 14 nicklas 1007       }
2688 23 Sep 14 nicklas 1008
2688 23 Sep 14 nicklas 1009       Wizard.setInputStatus('nanoDropFile', 'valid');
2688 23 Sep 14 nicklas 1010       nanoDropFileIsValid = true;
2688 23 Sep 14 nicklas 1011     }
2688 23 Sep 14 nicklas 1012     finally
2688 23 Sep 14 nicklas 1013     {
2688 23 Sep 14 nicklas 1014       exreg.updateDetailsTable();
2688 23 Sep 14 nicklas 1015     }
2688 23 Sep 14 nicklas 1016     
2688 23 Sep 14 nicklas 1017   }
2688 23 Sep 14 nicklas 1018
2688 23 Sep 14 nicklas 1019   exreg.findColumn = function(columns, col)
2688 23 Sep 14 nicklas 1020   {
2688 23 Sep 14 nicklas 1021     var colIndex = columns.indexOf(col);
2688 23 Sep 14 nicklas 1022     if (colIndex == -1)
2688 23 Sep 14 nicklas 1023     {
2688 23 Sep 14 nicklas 1024       Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line 1; Can\'t find "' + col + '" column');
2688 23 Sep 14 nicklas 1025     }
2688 23 Sep 14 nicklas 1026     return colIndex;
2688 23 Sep 14 nicklas 1027   }
2688 23 Sep 14 nicklas 1028   
2688 23 Sep 14 nicklas 1029   exreg.getNumber = function(sValue)
2688 23 Sep 14 nicklas 1030   {
2688 23 Sep 14 nicklas 1031     return parseFloat(sValue.replace(/,/, '.'));
2688 23 Sep 14 nicklas 1032   }
2688 23 Sep 14 nicklas 1033
2688 23 Sep 14 nicklas 1034   exreg.findRnaOrDna = function(sampleId, lineNo)
2688 23 Sep 14 nicklas 1035   {
3468 26 Aug 15 nicklas 1036     for (var i = 0; i < selectedLysates.length; i++)
2688 23 Sep 14 nicklas 1037     {
3468 26 Aug 15 nicklas 1038       var lysate = selectedLysates[i];
3468 26 Aug 15 nicklas 1039       if (lysate.rna.name == sampleId)
2688 23 Sep 14 nicklas 1040       {
3468 26 Aug 15 nicklas 1041         return lysate.rna;
2688 23 Sep 14 nicklas 1042       }
3468 26 Aug 15 nicklas 1043       else if (lysate.dna.name == sampleId)
3468 26 Aug 15 nicklas 1044       {
3468 26 Aug 15 nicklas 1045         return lysate.dna;
3468 26 Aug 15 nicklas 1046       }
2688 23 Sep 14 nicklas 1047     }
2688 23 Sep 14 nicklas 1048     
2688 23 Sep 14 nicklas 1049     Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + lineNo + '; Can\'t find RNA/DNA with name "' + sampleId + '"');
2688 23 Sep 14 nicklas 1050     return null;
2688 23 Sep 14 nicklas 1051   }
2688 23 Sep 14 nicklas 1052   
2688 23 Sep 14 nicklas 1053   
2688 23 Sep 14 nicklas 1054   exreg.generateFakeNanoDropFile = function()
2688 23 Sep 14 nicklas 1055   {
2688 23 Sep 14 nicklas 1056     if (location.protocol == 'https:')
2688 23 Sep 14 nicklas 1057     {
2688 23 Sep 14 nicklas 1058       Forms.showNotification('btnFakeNanoFropFile', 'For security reasons, this function can\'t be used on HTTPS servers.');
2688 23 Sep 14 nicklas 1059       return;
2688 23 Sep 14 nicklas 1060     }
2688 23 Sep 14 nicklas 1061     
2688 23 Sep 14 nicklas 1062     var FILE_HEADER = ['Well', 'Sample ID', 'Conc.', '260/280', '260/230'];
2688 23 Sep 14 nicklas 1063     var data = FILE_HEADER.join('\t')+'\n';
2688 23 Sep 14 nicklas 1064     
3468 26 Aug 15 nicklas 1065     for (var i = 0; i < selectedLysates.length; i++)
2688 23 Sep 14 nicklas 1066     {
3468 26 Aug 15 nicklas 1067       var lysate = selectedLysates[i];
3468 26 Aug 15 nicklas 1068       var line = [];
3468 26 Aug 15 nicklas 1069       // DNA 
3468 26 Aug 15 nicklas 1070       line[0] = lysate.dna.well;
3468 26 Aug 15 nicklas 1071       line[1] = lysate.dna.name;
3470 27 Aug 15 nicklas 1072       line[2] = Numbers.formatNumber(Math.random() > 0.9 ? -Math.random() : Math.random()*200+5, 2);
3468 26 Aug 15 nicklas 1073       line[3] = Numbers.formatNumber(Math.random()*.5+2, 2);
3468 26 Aug 15 nicklas 1074       line[4] = Numbers.formatNumber(Math.random()+1, 2);
3468 26 Aug 15 nicklas 1075       data += line.join('\t') + '\n';
3468 26 Aug 15 nicklas 1076       // RNA
3468 26 Aug 15 nicklas 1077       line[0] = lysate.rna.well;
3468 26 Aug 15 nicklas 1078       line[1] = lysate.rna.name;
3470 27 Aug 15 nicklas 1079       line[2] = Numbers.formatNumber(Math.random() > 0.9 ? -Math.random() : Math.random()*200+5, 2);
3468 26 Aug 15 nicklas 1080       line[3] = Numbers.formatNumber(Math.random()*.5+2, 2);
3468 26 Aug 15 nicklas 1081       line[4] = Numbers.formatNumber(Math.random()+1, 2);
3468 26 Aug 15 nicklas 1082       data += line.join('\t') + '\n';
2688 23 Sep 14 nicklas 1083     }
2688 23 Sep 14 nicklas 1084     exreg.parseNanoDropFile(data);
2688 23 Sep 14 nicklas 1085   }
2688 23 Sep 14 nicklas 1086
2688 23 Sep 14 nicklas 1087   exreg.validateStep3 = function(event)
2688 23 Sep 14 nicklas 1088   {
2688 23 Sep 14 nicklas 1089     var valid = true;
2688 23 Sep 14 nicklas 1090     valid &= nanoDropFileIsValid;
2688 23 Sep 14 nicklas 1091     valid &= qiacubePositionsAreValid;
2688 23 Sep 14 nicklas 1092     
2688 23 Sep 14 nicklas 1093     if (!valid) event.preventDefault();
2688 23 Sep 14 nicklas 1094   }
2688 23 Sep 14 nicklas 1095
2688 23 Sep 14 nicklas 1096
2688 23 Sep 14 nicklas 1097   exreg.submit = function()
2688 23 Sep 14 nicklas 1098   {
2688 23 Sep 14 nicklas 1099     var frm = document.forms['reggie'];
2688 23 Sep 14 nicklas 1100     
2688 23 Sep 14 nicklas 1101     var submitInfo = {};
2688 23 Sep 14 nicklas 1102     submitInfo.lysates = [];
2688 23 Sep 14 nicklas 1103     
3468 26 Aug 15 nicklas 1104     for (var i = 0; i < selectedLysates.length; i++)
2688 23 Sep 14 nicklas 1105     {
3468 26 Aug 15 nicklas 1106       var lysate = selectedLysates[i];
3470 27 Aug 15 nicklas 1107       lysate.rna.preNormalize = frm['rnaPreNormalize'+lysate.id].checked;
5356 12 Apr 19 nicklas 1108       lysate.dna.preNormalize = frm['dnaPreNormalize'+lysate.id].checked;
3470 27 Aug 15 nicklas 1109       submitInfo.lysates[submitInfo.lysates.length] = lysate;
2688 23 Sep 14 nicklas 1110     }
2688 23 Sep 14 nicklas 1111     
2690 24 Sep 14 nicklas 1112     // Lysis
2688 23 Sep 14 nicklas 1113     submitInfo.lysisDate = frm.lysisDate.value;
2688 23 Sep 14 nicklas 1114     submitInfo.lysisProtocol = parseInt(frm.lysisProtocol.value, 10);
2690 24 Sep 14 nicklas 1115     
2690 24 Sep 14 nicklas 1116     // Qiacube
2688 23 Sep 14 nicklas 1117     submitInfo.qiacubeDate = frm.qiacubeDate.value;
2688 23 Sep 14 nicklas 1118     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
2688 23 Sep 14 nicklas 1119     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
2688 23 Sep 14 nicklas 1120     submitInfo.dnaProtocol = parseInt(frm.dnaProtocol.value, 10);
2688 23 Sep 14 nicklas 1121     submitInfo.rnaProtocol = parseInt(frm.rnaProtocol.value, 10);
2688 23 Sep 14 nicklas 1122     submitInfo.ftProtocol = parseInt(frm.ftProtocol.value, 10);
2688 23 Sep 14 nicklas 1123
2690 24 Sep 14 nicklas 1124     // Reagents
2690 24 Sep 14 nicklas 1125     for (var i = 0; i < exreg.REAGENTS.length; i++)
2690 24 Sep 14 nicklas 1126     {
2690 24 Sep 14 nicklas 1127       var rg = exreg.REAGENTS[i];
2690 24 Sep 14 nicklas 1128       submitInfo[rg] = frm[rg].value;
2690 24 Sep 14 nicklas 1129     }
2688 23 Sep 14 nicklas 1130     
2688 23 Sep 14 nicklas 1131     var url = '../Extraction.servlet?ID='+App.getSessionId();
2688 23 Sep 14 nicklas 1132     url += '&cmd=RegisterDnaRnaFt';
2688 23 Sep 14 nicklas 1133     Wizard.showLoadingAnimation('Performing registration...');
2688 23 Sep 14 nicklas 1134     Wizard.asyncJsonRequest(url, exreg.submissionResults, 'POST', JSON.stringify(submitInfo));
2688 23 Sep 14 nicklas 1135   }
2688 23 Sep 14 nicklas 1136   
2688 23 Sep 14 nicklas 1137   exreg.submissionResults = function(response)
2688 23 Sep 14 nicklas 1138   {
2688 23 Sep 14 nicklas 1139     Wizard.showFinalMessage(response.messages);
2688 23 Sep 14 nicklas 1140     Doc.show('gorestart');
2688 23 Sep 14 nicklas 1141     if (response.createdRna && response.createdRna.length > 0)
2688 23 Sep 14 nicklas 1142     {
2688 23 Sep 14 nicklas 1143       createdRna = response.createdRna;
2688 23 Sep 14 nicklas 1144       Doc.show('rnaQcWizard');  
2688 23 Sep 14 nicklas 1145     }
2688 23 Sep 14 nicklas 1146   }
2688 23 Sep 14 nicklas 1147
2688 23 Sep 14 nicklas 1148   exreg.goRnaQc = function()
2688 23 Sep 14 nicklas 1149   {
2688 23 Sep 14 nicklas 1150     var url = 'rnaqc_aliquot.jsp?ID='+App.getSessionId();
2688 23 Sep 14 nicklas 1151     for (var i = 0; i < createdRna.length; i++)
2688 23 Sep 14 nicklas 1152     {
2688 23 Sep 14 nicklas 1153       url += '&rna='+createdRna[i];
2688 23 Sep 14 nicklas 1154     }
2688 23 Sep 14 nicklas 1155     location.href = url;
2688 23 Sep 14 nicklas 1156   }
2688 23 Sep 14 nicklas 1157
2688 23 Sep 14 nicklas 1158   
2688 23 Sep 14 nicklas 1159   return exreg;
2688 23 Sep 14 nicklas 1160 }();
2688 23 Sep 14 nicklas 1161
2688 23 Sep 14 nicklas 1162 Doc.onLoad(ExtractionReg.initPage);
2688 23 Sep 14 nicklas 1163